From 267c6f2ac71f92999e969232431ba04678e7437e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 07:54:39 +0200 Subject: Adding upstream version 4:24.2.0. Signed-off-by: Daniel Baumann --- sd/AllLangMoTarget_sd.mk | 11 + sd/CppunitTest_sd_a11y.mk | 38 + sd/CppunitTest_sd_activex_controls_tests.mk | 72 + sd/CppunitTest_sd_dialogs_test.mk | 77 + sd/CppunitTest_sd_export_tests-ooxml1.mk | 14 + sd/CppunitTest_sd_export_tests-ooxml2.mk | 14 + sd/CppunitTest_sd_export_tests-ooxml3.mk | 17 + sd/CppunitTest_sd_export_tests-ooxml4.mk | 17 + sd/CppunitTest_sd_export_tests.mk | 15 + sd/CppunitTest_sd_filter_eppt.mk | 54 + sd/CppunitTest_sd_filters_test.mk | 78 + sd/CppunitTest_sd_html_export_tests.mk | 73 + sd/CppunitTest_sd_import_tests-smartart.mk | 18 + sd/CppunitTest_sd_import_tests.mk | 15 + sd/CppunitTest_sd_import_tests2.mk | 14 + sd/CppunitTest_sd_import_tests_skia.mk | 13 + sd/CppunitTest_sd_layout_tests.mk | 78 + sd/CppunitTest_sd_misc_tests.mk | 83 + sd/CppunitTest_sd_pdf_import_test.mk | 73 + sd/CppunitTest_sd_png_export_tests.mk | 73 + sd/CppunitTest_sd_shape_import_export_tests.mk | 80 + sd/CppunitTest_sd_svg_export_tests.mk | 73 + sd/CppunitTest_sd_textfitting_tests.mk | 79 + sd/CppunitTest_sd_theme_tests.mk | 78 + sd/CppunitTest_sd_tiledrendering.mk | 72 + sd/CppunitTest_sd_uiimpress.mk | 92 + sd/CppunitTest_sd_uimpress.mk | 114 + sd/IwyuFilter_sd.yaml | 564 + sd/JunitTest_sd_unoapi.mk | 14 + sd/Library_sd.mk | 606 + sd/Library_sdd.mk | 41 + sd/Library_sdui.mk | 134 + sd/Makefile | 14 + sd/Module_sd.mk | 81 + sd/Package_opengl.mk | 16 + sd/Package_xml.mk | 20 + sd/README.md | 45 + sd/README.vars | 1 + sd/README_REMOTE | 107 + sd/UIConfig_sdraw.mk | 128 + sd/UIConfig_simpress.mk | 176 + sd/UITest_impress_tests.mk | 20 + sd/UITest_impress_tests2.mk | 18 + sd/UITest_sd_findReplace.mk | 18 + sd/export_setup.mk | 89 + sd/import_setup.mk | 141 + sd/inc/Annotation.hxx | 164 + sd/inc/AnnotationEnumeration.hxx | 37 + sd/inc/CustomAnimationCloner.hxx | 33 + sd/inc/CustomAnimationEffect.hxx | 455 + sd/inc/CustomAnimationPreset.hxx | 143 + sd/inc/DocumentRenderer.hrc | 95 + sd/inc/EffectMigration.hxx | 75 + sd/inc/FactoryIds.hxx | 40 + sd/inc/Outliner.hxx | 535 + sd/inc/OutlinerIterator.hxx | 315 + sd/inc/SdShapeTypes.hxx | 51 + sd/inc/TransitionPreset.hxx | 78 + sd/inc/VectorGraphicSearchContext.hxx | 35 + sd/inc/animations.hxx | 51 + sd/inc/anminfo.hxx | 67 + sd/inc/app.hrc | 456 + sd/inc/bitmaps.hlst | 225 + sd/inc/createpresentation.hxx | 35 + sd/inc/createunocustomshow.hxx | 30 + sd/inc/createunopageimpl.hxx | 32 + sd/inc/cusshow.hxx | 65 + sd/inc/customshowlist.hxx | 89 + sd/inc/diadef.h | 30 + sd/inc/drawdoc.hxx | 720 + sd/inc/errhdl.hrc | 39 + sd/inc/family.hrc | 43 + sd/inc/glob.hxx | 55 + sd/inc/helper/simplereferencecomponent.hxx | 63 + sd/inc/helpids.h | 55 + sd/inc/misc/scopelock.hxx | 51 + sd/inc/notifydocumentevent.hxx | 32 + sd/inc/pageformatpanel.hrc | 53 + sd/inc/pch/precompiled_sd.cxx | 12 + sd/inc/pch/precompiled_sd.hxx | 631 + sd/inc/pch/precompiled_sdui.cxx | 12 + sd/inc/pch/precompiled_sdui.hxx | 530 + sd/inc/pglink.hxx | 40 + sd/inc/pres.hxx | 73 + sd/inc/prlayout.hxx | 46 + sd/inc/randomnode.hxx | 35 + sd/inc/resltn.hxx | 35 + sd/inc/sdabstdlg.hxx | 201 + sd/inc/sdattr.hrc | 128 + sd/inc/sdattr.hxx | 60 + sd/inc/sdcgmfilter.hxx | 37 + sd/inc/sdcommands.h | 26 + sd/inc/sddll.hxx | 54 + sd/inc/sddllapi.h | 30 + sd/inc/sdenumdef.hxx | 31 + sd/inc/sderror.hxx | 31 + sd/inc/sdfilter.hxx | 72 + sd/inc/sdgrffilter.hxx | 40 + sd/inc/sdhtmlfilter.hxx | 34 + sd/inc/sdiocmpt.hxx | 57 + sd/inc/sdmod.hxx | 186 + sd/inc/sdpage.hxx | 405 + sd/inc/sdpdffilter.hxx | 41 + sd/inc/sdpptwrp.hxx | 46 + sd/inc/sdresid.hxx | 29 + sd/inc/sdundo.hxx | 45 + sd/inc/sdxmlwrp.hxx | 52 + sd/inc/shapelist.hxx | 71 + sd/inc/stlfamily.hxx | 116 + sd/inc/stlpool.hxx | 142 + sd/inc/stlsheet.hxx | 186 + sd/inc/strings.hrc | 467 + sd/inc/strings.hxx | 23 + sd/inc/textapi.hxx | 55 + sd/inc/theme/ThemeColorChanger.hxx | 35 + sd/inc/undo/undofactory.hxx | 40 + sd/inc/undo/undomanager.hxx | 61 + sd/inc/undo/undoobjects.hxx | 175 + sd/inc/undoanim.hxx | 84 + sd/inc/viewopt.hxx | 34 + .../filter/eppt/data/custom-shape-bitmap-fill.pptx | Bin 0 -> 24802 bytes sd/qa/filter/eppt/data/video-loop.pptx | Bin 0 -> 46545 bytes sd/qa/filter/eppt/eppt.cxx | 135 + sd/qa/uitest/data/LibreOffice.jpg | Bin 0 -> 18218 bytes sd/qa/uitest/data/embedded.pptx | Bin 0 -> 55350 bytes sd/qa/uitest/data/findReplace.odp | Bin 0 -> 12804 bytes sd/qa/uitest/data/tdf119246.odp | Bin 0 -> 11548 bytes sd/qa/uitest/data/tdf127900.fodp | 778 + sd/qa/uitest/data/tdf144943.pptx | Bin 0 -> 33389 bytes sd/qa/uitest/data/tdf146019.jpg | Bin 0 -> 24014 bytes sd/qa/uitest/data/tdf155863.odp | Bin 0 -> 26566 bytes sd/qa/uitest/findReplace/findReplace.py | 105 + sd/qa/uitest/impress_tests/autocorrectOptions.py | 101 + sd/qa/uitest/impress_tests/customSlideShow.py | 74 + sd/qa/uitest/impress_tests/embedded.py | 37 + sd/qa/uitest/impress_tests/exportToPDF.py | 82 + sd/qa/uitest/impress_tests/insertSlide.py | 50 + sd/qa/uitest/impress_tests/masterElements.py | 44 + sd/qa/uitest/impress_tests/masterSlides.py | 47 + sd/qa/uitest/impress_tests/renameSlide.py | 47 + .../impress_tests/save_readonly_with_password.py | 103 + sd/qa/uitest/impress_tests/slideShowSettings.py | 60 + sd/qa/uitest/impress_tests/tdf119246.py | 48 + sd/qa/uitest/impress_tests/tdf134734.py | 101 + sd/qa/uitest/impress_tests/tdf137729.py | 51 + sd/qa/uitest/impress_tests/tdf152295.py | 54 + sd/qa/uitest/impress_tests/tdf155863.py | 34 + sd/qa/uitest/impress_tests/textColumnsDialog.py | 51 + sd/qa/uitest/impress_tests2/tdf106612.py | 47 + sd/qa/uitest/impress_tests2/tdf125449.py | 59 + sd/qa/uitest/impress_tests2/tdf127900.py | 43 + sd/qa/uitest/impress_tests2/tdf130440.py | 65 + sd/qa/uitest/impress_tests2/tdf133713.py | 58 + sd/qa/uitest/impress_tests2/tdf137637.py | 57 + sd/qa/uitest/impress_tests2/tdf139511.py | 51 + sd/qa/uitest/impress_tests2/tdf141297.py | 80 + sd/qa/uitest/impress_tests2/tdf141708.py | 33 + sd/qa/uitest/impress_tests2/tdf144943.py | 31 + sd/qa/uitest/impress_tests2/tdf146019.py | 36 + sd/qa/uitest/impress_tests2/tdf149787.py | 40 + sd/qa/uitest/impress_tests2/tdf82616.py | 70 + sd/qa/uitest/impress_tests2/tdf91762.py | 45 + sd/qa/unit/HtmlExportTest.cxx | 79 + sd/qa/unit/PNGExportTests.cxx | 891 + sd/qa/unit/SVGExportTests.cxx | 310 + sd/qa/unit/SdrPdfImportTest.cxx | 282 + sd/qa/unit/ShapeImportExportTest.cxx | 396 + sd/qa/unit/TextFittingTest.cxx | 123 + sd/qa/unit/ThemeTest.cxx | 155 + sd/qa/unit/a11y/data/tdf150064.fodp | 796 + sd/qa/unit/a11y/layout.cxx | 154 + sd/qa/unit/activex-controls-tests.cxx | 1174 ++ sd/qa/unit/data/AllTransitions.odp | Bin 0 -> 15719 bytes sd/qa/unit/data/HtmlExportTestDocument.odp | Bin 0 -> 25480 bytes sd/qa/unit/data/PdfWithAnnotation.pdf | Bin 0 -> 13789 bytes sd/qa/unit/data/README | 7 + sd/qa/unit/data/SimplePDF.pdf | Bin 0 -> 8136 bytes sd/qa/unit/data/TextDistancesInsets1.pptx | Bin 0 -> 60484 bytes sd/qa/unit/data/TextDistancesInsets2.pptx | Bin 0 -> 111830 bytes sd/qa/unit/data/TextDistancesInsets3.pptx | Bin 0 -> 60276 bytes sd/qa/unit/data/TextFitting.odp | Bin 0 -> 12191 bytes sd/qa/unit/data/bnc822347_EmptyBullet.odp | Bin 0 -> 11589 bytes sd/qa/unit/data/cgm/fail/.gitignore | 0 sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm | Bin 0 -> 12460 bytes sd/qa/unit/data/cgm/fail/ooo6420-1.cgm | 400 + sd/qa/unit/data/cgm/fail/recurse-1.cgm | Bin 0 -> 162 bytes sd/qa/unit/data/cgm/indeterminate/.gitignore | 0 sd/qa/unit/data/cgm/pass/.gitignore | 0 sd/qa/unit/data/cgm/pass/binary_corvette.cgm | Bin 0 -> 31788 bytes sd/qa/unit/data/cgm/pass/circles.cgm | Bin 0 -> 4400 bytes sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm | Bin 0 -> 56 bytes sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm | Bin 0 -> 12507 bytes sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm | Bin 0 -> 25558 bytes sd/qa/unit/data/dialogs-test.txt | 74 + sd/qa/unit/data/empty.fodp | 2 + sd/qa/unit/data/fdo47434.pptx | Bin 0 -> 32477 bytes sd/qa/unit/data/fdo64512.odp | Bin 0 -> 14699 bytes sd/qa/unit/data/fdo64586.ppt | Bin 0 -> 71680 bytes sd/qa/unit/data/fdo71075.odp | Bin 0 -> 15574 bytes sd/qa/unit/data/fdo71434.pptx | Bin 0 -> 155595 bytes sd/qa/unit/data/fdo71961.odp | Bin 0 -> 23506 bytes sd/qa/unit/data/fdo79731.odp | Bin 0 -> 11008 bytes sd/qa/unit/data/fdo84043.odp | Bin 0 -> 7718 bytes sd/qa/unit/data/fdo90607.pptx | Bin 0 -> 34719 bytes sd/qa/unit/data/fit-to-size.fodp | 724 + sd/qa/unit/data/media_embedding.odp | Bin 0 -> 228295 bytes sd/qa/unit/data/n593612.pptx | Bin 0 -> 23024 bytes sd/qa/unit/data/n758621.ppt | Bin 0 -> 115712 bytes sd/qa/unit/data/n759180.pptx | Bin 0 -> 39463 bytes sd/qa/unit/data/n762695.pptx | Bin 0 -> 46216 bytes sd/qa/unit/data/n819614.pptx | Bin 0 -> 138478 bytes sd/qa/unit/data/n820786.pptx | Bin 0 -> 43286 bytes sd/qa/unit/data/n828390_4.odp | Bin 0 -> 13928 bytes sd/qa/unit/data/n828390_5.odp | Bin 0 -> 9716 bytes sd/qa/unit/data/n902652.pptx | Bin 0 -> 39315 bytes sd/qa/unit/data/objectwithtext.fodg | 189 + sd/qa/unit/data/odg/FitToFrameText.odg | Bin 0 -> 11847 bytes sd/qa/unit/data/odg/diagonalLine.fodg | 39 + sd/qa/unit/data/odg/fail/.gitignore | 0 sd/qa/unit/data/odg/glow.odg | Bin 0 -> 8873 bytes sd/qa/unit/data/odg/gradient-angle.fodg | 211 + sd/qa/unit/data/odg/indeterminate/.gitignore | 0 sd/qa/unit/data/odg/ooo124143-1.odg | Bin 0 -> 14818 bytes sd/qa/unit/data/odg/pass/.gitignore | 0 sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg | Bin 0 -> 67721 bytes sd/qa/unit/data/odg/rhbz1870501.odg | Bin 0 -> 403275 bytes sd/qa/unit/data/odg/softedges.odg | Bin 0 -> 10130 bytes sd/qa/unit/data/odg/tablestyles.fodg | 56 + sd/qa/unit/data/odg/tb-rl-textbox.odg | Bin 0 -> 10002 bytes sd/qa/unit/data/odg/tdf114488.fodg | 365 + sd/qa/unit/data/odg/tdf126319.odg | Bin 0 -> 9327 bytes sd/qa/unit/data/odg/tdf147119.odg | Bin 0 -> 9591 bytes sd/qa/unit/data/odg/two_columns.odg | Bin 0 -> 14726 bytes sd/qa/unit/data/odp/BulletsAsImage.odp | Bin 0 -> 10754 bytes sd/qa/unit/data/odp/LineStylesOwn.odp | Bin 0 -> 15253 bytes sd/qa/unit/data/odp/SvgImageTest.odp | Bin 0 -> 15922 bytes sd/qa/unit/data/odp/Table_with_Cell_Fill.odp | Bin 0 -> 28869 bytes sd/qa/unit/data/odp/Tdf112594.fodp | 853 + sd/qa/unit/data/odp/Tdf62176.odp | Bin 0 -> 10358 bytes sd/qa/unit/data/odp/author_field.odp | Bin 0 -> 10518 bytes sd/qa/unit/data/odp/author_fixed.odp | Bin 0 -> 10680 bytes sd/qa/unit/data/odp/autofitted-textbox-indent.odp | Bin 0 -> 12486 bytes sd/qa/unit/data/odp/background.odp | Bin 0 -> 14126 bytes sd/qa/unit/data/odp/bnc822341.odp | Bin 0 -> 15983 bytes sd/qa/unit/data/odp/bulletCharAndFont.odp | Bin 0 -> 11279 bytes sd/qa/unit/data/odp/cellspan.odp | Bin 0 -> 13489 bytes sd/qa/unit/data/odp/closed-shapes.odp | Bin 0 -> 16370 bytes .../unit/data/odp/document_with_linked_graphic.odp | Bin 0 -> 49906 bytes sd/qa/unit/data/odp/document_with_two_images.odp | Bin 0 -> 202183 bytes sd/qa/unit/data/odp/embedded-pdf.odp | Bin 0 -> 25002 bytes sd/qa/unit/data/odp/extfile_field.odp | Bin 0 -> 10918 bytes sd/qa/unit/data/odp/fail/.gitignore | 0 sd/qa/unit/data/odp/fdo77027.odp | Bin 0 -> 13229 bytes sd/qa/unit/data/odp/fillbitmap2.odp | Bin 0 -> 11590 bytes sd/qa/unit/data/odp/group_rotation.odp | Bin 0 -> 10429 bytes sd/qa/unit/data/odp/image_transparency.odp | Bin 0 -> 24448 bytes sd/qa/unit/data/odp/images_with_special_IDs.odp | Bin 0 -> 169241 bytes sd/qa/unit/data/odp/indeterminate/.gitignore | 0 sd/qa/unit/data/odp/linked_graphic.jpg | Bin 0 -> 35738 bytes sd/qa/unit/data/odp/linked_ole.odp | Bin 0 -> 15351 bytes sd/qa/unit/data/odp/loopNoPause.odp | Bin 0 -> 10998 bytes sd/qa/unit/data/odp/loopPause10.odp | Bin 0 -> 10960 bytes sd/qa/unit/data/odp/masterpage_style_parent.odp | Bin 0 -> 17790 bytes sd/qa/unit/data/odp/math.odp | Bin 0 -> 12269 bytes sd/qa/unit/data/odp/numfmt.odp | Bin 0 -> 11438 bytes sd/qa/unit/data/odp/ole_icon.odp | Bin 0 -> 18926 bytes .../unit/data/odp/page_transparent_background.odp | Bin 0 -> 11508 bytes sd/qa/unit/data/odp/pass/.gitignore | 0 sd/qa/unit/data/odp/pass/EDB-26517-1.odp | Bin 0 -> 12752 bytes sd/qa/unit/data/odp/pass/ooo56974-1.odp | Bin 0 -> 11326 bytes sd/qa/unit/data/odp/pass/ooo72169-1.odp | Bin 0 -> 4740 bytes sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp | Bin 0 -> 2225735 bytes .../unit/data/odp/pass/test-slide-name-fields.odp | Bin 0 -> 10916 bytes .../data/odp/placeholder-box-textalignment.odp | Bin 0 -> 15853 bytes sd/qa/unit/data/odp/preset-shapes-export.odp | Bin 0 -> 21208 bytes sd/qa/unit/data/odp/repeatBitmapMode.odp | Bin 0 -> 19301 bytes sd/qa/unit/data/odp/rotate_flip.odp | Bin 0 -> 12254 bytes sd/qa/unit/data/odp/search-all-notes.odp | Bin 0 -> 12018 bytes sd/qa/unit/data/odp/shadow-blur.odp | Bin 0 -> 12837 bytes sd/qa/unit/data/odp/shapes-test.odp | Bin 0 -> 61333 bytes sd/qa/unit/data/odp/slide-bitmap-background.odp | Bin 0 -> 82326 bytes sd/qa/unit/data/odp/slide-custom-background.odp | Bin 0 -> 40023 bytes sd/qa/unit/data/odp/slide-tile-background.odp | Bin 0 -> 95650 bytes sd/qa/unit/data/odp/slide-video-thumbnail.odp | Bin 0 -> 38222 bytes sd/qa/unit/data/odp/slidecount_field.odp | Bin 0 -> 9918 bytes sd/qa/unit/data/odp/slidename_field.odp | Bin 0 -> 10089 bytes sd/qa/unit/data/odp/slidenum_field.odp | Bin 0 -> 9882 bytes .../data/odp/style-overflow-behavior-clip.fodp | 18 + .../unit/data/odp/svg-export-text-decorations.odp | Bin 0 -> 12407 bytes .../unit/data/odp/tdf100348_Fontwork2TextWarp.odp | Bin 0 -> 14788 bytes .../unit/data/odp/tdf100348_FontworkBitmapFill.odp | Bin 0 -> 17886 bytes .../data/odp/tdf100348_FontworkGradientGlow.odp | Bin 0 -> 20381 bytes sd/qa/unit/data/odp/tdf100387.odp | Bin 0 -> 10810 bytes sd/qa/unit/data/odp/tdf103567.odp | Bin 0 -> 62137 bytes sd/qa/unit/data/odp/tdf105362.odp | Bin 0 -> 13288 bytes sd/qa/unit/data/odp/tdf105998.odp | Bin 0 -> 11145 bytes sd/qa/unit/data/odp/tdf106026.odp | Bin 0 -> 10876 bytes sd/qa/unit/data/odp/tdf108925.odp | Bin 0 -> 11219 bytes sd/qa/unit/data/odp/tdf109169_Diamond.odp | Bin 0 -> 14664 bytes sd/qa/unit/data/odp/tdf109169_Octagon.odp | Bin 0 -> 13380 bytes sd/qa/unit/data/odp/tdf111785.odp | Bin 0 -> 11819 bytes sd/qa/unit/data/odp/tdf111798.odp | Bin 0 -> 11183 bytes sd/qa/unit/data/odp/tdf112552.odp | Bin 0 -> 11331 bytes sd/qa/unit/data/odp/tdf112557.odp | Bin 0 -> 12749 bytes sd/qa/unit/data/odp/tdf112647.odp | Bin 0 -> 11172 bytes sd/qa/unit/data/odp/tdf113197.odp | Bin 0 -> 56781 bytes sd/qa/unit/data/odp/tdf115005.odp | Bin 0 -> 51823 bytes .../unit/data/odp/tdf115005_no_fallback_images.odp | Bin 0 -> 21100 bytes sd/qa/unit/data/odp/tdf116266.odp | Bin 0 -> 43204 bytes sd/qa/unit/data/odp/tdf116266_chart.svg | 99 + sd/qa/unit/data/odp/tdf118045.odp | Bin 0 -> 12192 bytes sd/qa/unit/data/odp/tdf118768-brake.odp | Bin 0 -> 10742 bytes sd/qa/unit/data/odp/tdf118783.odp | Bin 0 -> 11644 bytes sd/qa/unit/data/odp/tdf118806.odp | Bin 0 -> 11999 bytes sd/qa/unit/data/odp/tdf118825-motionpath.odp | Bin 0 -> 12646 bytes sd/qa/unit/data/odp/tdf118835.odp | Bin 0 -> 11973 bytes sd/qa/unit/data/odp/tdf118836.odp | Bin 0 -> 11655 bytes sd/qa/unit/data/odp/tdf119223.odp | Bin 0 -> 18335 bytes .../data/odp/tdf123658_SearchAfterSlideChange.odp | Bin 0 -> 11749 bytes sd/qa/unit/data/odp/tdf124781.odp | Bin 0 -> 11833 bytes sd/qa/unit/data/odp/tdf127267DashOnHairline.odp | Bin 0 -> 11874 bytes sd/qa/unit/data/odp/tdf127372.odp | Bin 0 -> 13009 bytes sd/qa/unit/data/odp/tdf127379.odp | Bin 0 -> 19471 bytes sd/qa/unit/data/odp/tdf127901.odp | Bin 0 -> 53808 bytes sd/qa/unit/data/odp/tdf128049.odp | Bin 0 -> 18269 bytes sd/qa/unit/data/odp/tdf128096.odp | Bin 0 -> 10992 bytes .../data/odp/tdf128345_FullTransparentGradient.odp | Bin 0 -> 11244 bytes sd/qa/unit/data/odp/tdf128345_GradientAxial.odp | Bin 0 -> 12561 bytes sd/qa/unit/data/odp/tdf128345_GradientLinear.odp | Bin 0 -> 13384 bytes sd/qa/unit/data/odp/tdf128345_GradientRadial.odp | Bin 0 -> 14774 bytes sd/qa/unit/data/odp/tdf128985.odp | Bin 0 -> 14781 bytes sd/qa/unit/data/odp/tdf129430.odp | Bin 0 -> 10697 bytes sd/qa/unit/data/odp/tdf133502.odp | Bin 0 -> 13204 bytes .../odp/tdf134969_TransparencyOnColorGradient.odp | Bin 0 -> 17107 bytes sd/qa/unit/data/odp/tdf136949.odp | Bin 0 -> 12555 bytes sd/qa/unit/data/odp/tdf141269.odp | Bin 0 -> 196094 bytes sd/qa/unit/data/odp/tdf146876.odp | Bin 0 -> 11620 bytes sd/qa/unit/data/odp/tdf147919.odp | Bin 0 -> 14790 bytes .../data/odp/tdf147978_enhancedPath_viewBox.odp | Bin 0 -> 12728 bytes sd/qa/unit/data/odp/tdf148966-withflag.odp | Bin 0 -> 19074 bytes sd/qa/unit/data/odp/tdf148966-withoutflag.odp | Bin 0 -> 9395 bytes sd/qa/unit/data/odp/tdf149126.odp | Bin 0 -> 11886 bytes sd/qa/unit/data/odp/tdf149128.odp | Bin 0 -> 11816 bytes sd/qa/unit/data/odp/tdf149311.odp | Bin 0 -> 15388 bytes sd/qa/unit/data/odp/tdf149551_btlr.odp | Bin 0 -> 13183 bytes sd/qa/unit/data/odp/tdf149551_tbrl90.odp | Bin 0 -> 13234 bytes sd/qa/unit/data/odp/tdf150316.odp | Bin 0 -> 13467 bytes sd/qa/unit/data/odp/tdf150966_hugeInset.odp | Bin 0 -> 14837 bytes sd/qa/unit/data/odp/tdf151492.odp | Bin 0 -> 12618 bytes sd/qa/unit/data/odp/tdf153105.odp | Bin 0 -> 66806 bytes sd/qa/unit/data/odp/tdf153107.odp | Bin 0 -> 19505 bytes sd/qa/unit/data/odp/tdf153161_FlushToSave.odp | Bin 0 -> 37209 bytes sd/qa/unit/data/odp/tdf154754.odp | Bin 0 -> 22852 bytes sd/qa/unit/data/odp/tdf157652.odp | Bin 0 -> 14767 bytes sd/qa/unit/data/odp/tdf157795.odp | Bin 0 -> 42143 bytes sd/qa/unit/data/odp/tdf48735.odp | Bin 0 -> 15137 bytes sd/qa/unit/data/odp/tdf53970.odp | Bin 0 -> 30328 bytes sd/qa/unit/data/odp/tdf53970_linked.odp | Bin 0 -> 13158 bytes sd/qa/unit/data/odp/tdf59046.odp | Bin 0 -> 10800 bytes sd/qa/unit/data/odp/tdf66228.odp | Bin 0 -> 13283 bytes sd/qa/unit/data/odp/tdf68759.odp | Bin 0 -> 11250 bytes sd/qa/unit/data/odp/tdf74670.odp | Bin 0 -> 11786 bytes sd/qa/unit/data/odp/tdf80020.odp | Bin 0 -> 13068 bytes sd/qa/unit/data/odp/tdf80224.odp | Bin 0 -> 23894 bytes sd/qa/unit/data/odp/tdf90626.odp | Bin 0 -> 12363 bytes sd/qa/unit/data/odp/tdf90627.odp | Bin 0 -> 38499 bytes sd/qa/unit/data/odp/tdf92076.odp | Bin 0 -> 11185 bytes sd/qa/unit/data/odp/tdf93883.odp | Bin 0 -> 11057 bytes sd/qa/unit/data/odp/tdf94122_autocolor.odp | Bin 0 -> 13942 bytes sd/qa/unit/data/odp/tdf96206.odp | Bin 0 -> 12545 bytes sd/qa/unit/data/odp/tdf96708.odp | Bin 0 -> 7758 bytes sd/qa/unit/data/odp/tdf99213-target-missing.odp | Bin 0 -> 11088 bytes sd/qa/unit/data/odp/tdf99224.odp | Bin 0 -> 11212 bytes sd/qa/unit/data/odp/tdf99497_CircleKind.odp | Bin 0 -> 12196 bytes sd/qa/unit/data/odp/tdf99729-legacy.odp | Bin 0 -> 11064 bytes sd/qa/unit/data/odp/tdf99729-new.odp | Bin 0 -> 11149 bytes sd/qa/unit/data/odp/testLegacyShapeAutofit.odp | Bin 0 -> 13611 bytes sd/qa/unit/data/odp/testZeroIndent.odp | Bin 0 -> 15446 bytes sd/qa/unit/data/odp/text-fields.odp | Bin 0 -> 14035 bytes sd/qa/unit/data/odp/textbox-link-javascript.odp | Bin 0 -> 23573 bytes sd/qa/unit/data/odp/transparent_background.odp | Bin 0 -> 11687 bytes sd/qa/unit/data/pdf/multipage.pdf | Bin 0 -> 13155 bytes sd/qa/unit/data/pdf/txtpic.pdf | Bin 0 -> 21201 bytes sd/qa/unit/data/ppt/FillPatterns.ppt | Bin 0 -> 19968 bytes sd/qa/unit/data/ppt/crop.ppt | Bin 0 -> 147456 bytes sd/qa/unit/data/ppt/fail/.gitignore | 0 sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt | Bin 0 -> 3072 bytes sd/qa/unit/data/ppt/fdo68594.ppt | Bin 0 -> 100864 bytes sd/qa/unit/data/ppt/indeterminate/.gitignore | 0 sd/qa/unit/data/ppt/loopNoPause.ppt | Bin 0 -> 87552 bytes sd/qa/unit/data/ppt/pass/.gitignore | 0 sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt | Bin 0 -> 35840 bytes sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt | Bin 0 -> 35840 bytes sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt | Bin 0 -> 35840 bytes sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt | Bin 0 -> 8704 bytes sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt | Bin 0 -> 423424 bytes sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt | Bin 0 -> 259072 bytes sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt | Bin 0 -> 302080 bytes sd/qa/unit/data/ppt/pass/crash-1.ppt | Bin 0 -> 7677 bytes sd/qa/unit/data/ppt/pass/crash-2.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/crash-3.ppt | Bin 0 -> 7681 bytes sd/qa/unit/data/ppt/pass/hang-1.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-10.ppt | Bin 0 -> 7648 bytes sd/qa/unit/data/ppt/pass/hang-11.ppt | Bin 0 -> 7712 bytes sd/qa/unit/data/ppt/pass/hang-12.ppt | Bin 0 -> 7705 bytes sd/qa/unit/data/ppt/pass/hang-13.ppt | Bin 0 -> 7659 bytes sd/qa/unit/data/ppt/pass/hang-14.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-15.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-16.ppt | Bin 0 -> 7693 bytes sd/qa/unit/data/ppt/pass/hang-17.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-18.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-19.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-2.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-20.ppt | Bin 0 -> 7732 bytes sd/qa/unit/data/ppt/pass/hang-21.ppt | Bin 0 -> 7659 bytes sd/qa/unit/data/ppt/pass/hang-22.ppt | Bin 0 -> 15872 bytes sd/qa/unit/data/ppt/pass/hang-3.ppt | Bin 0 -> 7680 bytes sd/qa/unit/data/ppt/pass/hang-4.ppt | Bin 0 -> 7712 bytes sd/qa/unit/data/ppt/pass/hang-5.ppt | Bin 0 -> 7712 bytes sd/qa/unit/data/ppt/pass/hang-6.ppt | Bin 0 -> 7712 bytes sd/qa/unit/data/ppt/pass/hang-7.ppt | Bin 0 -> 7691 bytes sd/qa/unit/data/ppt/pass/hang-8.ppt | Bin 0 -> 7712 bytes sd/qa/unit/data/ppt/pass/hang-9.ppt | Bin 0 -> 7712 bytes sd/qa/unit/data/ppt/pass/ofz14989-1.ppt | Bin 0 -> 60108 bytes sd/qa/unit/data/ppt/pass/ofz21531-1.ppt | Bin 0 -> 35567 bytes sd/qa/unit/data/ppt/pass/ofz37370-1.ppt | Bin 0 -> 4341 bytes sd/qa/unit/data/ppt/pass/ofz43902-1.ppt | Bin 0 -> 43630 bytes sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt | Bin 0 -> 4341 bytes sd/qa/unit/data/ppt/placeholder-priority.pptx | Bin 0 -> 26091 bytes sd/qa/unit/data/ppt/tdf105150.ppt | Bin 0 -> 138752 bytes sd/qa/unit/data/ppt/tdf115394.ppt | Bin 0 -> 90112 bytes sd/qa/unit/data/ppt/tdf116899.ppt | Bin 0 -> 113152 bytes sd/qa/unit/data/ppt/tdf119629.ppt | Bin 0 -> 112128 bytes .../data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt | Bin 0 -> 8192 bytes sd/qa/unit/data/ppt/tdf126761.ppt | Bin 0 -> 100352 bytes sd/qa/unit/data/ppt/tdf136911.ppt | Bin 0 -> 56832 bytes .../data/ppt/tdf143315-WordartWithoutBullet.ppt | Bin 0 -> 68608 bytes sd/qa/unit/data/ppt/tdf157636.ppt | Bin 0 -> 300544 bytes sd/qa/unit/data/ppt/tdf48083.ppt | Bin 0 -> 18944 bytes sd/qa/unit/data/ppt/tdf49561.ppt | Bin 0 -> 14336 bytes sd/qa/unit/data/ppt/tdf49856.ppt | Bin 0 -> 125440 bytes sd/qa/unit/data/ppt/tdf77747.ppt | Bin 0 -> 147968 bytes sd/qa/unit/data/ppt/tdf79082.ppt | Bin 0 -> 72704 bytes sd/qa/unit/data/ppt/tdf93124.ppt | Bin 0 -> 85504 bytes sd/qa/unit/data/pptm/macro.pptm | Bin 0 -> 35129 bytes sd/qa/unit/data/pptx/3columns.pptx | Bin 0 -> 39915 bytes sd/qa/unit/data/pptx/LostPlaceholder.odp | Bin 0 -> 13206 bytes sd/qa/unit/data/pptx/LostPlaceholderFill.odp | Bin 0 -> 15000 bytes sd/qa/unit/data/pptx/Math.pptx | Bin 0 -> 35240 bytes sd/qa/unit/data/pptx/ShapeLineProperties.pptx | Bin 0 -> 25433 bytes sd/qa/unit/data/pptx/ShapePlusImage.pptx | Bin 0 -> 36088 bytes sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx | Bin 0 -> 32007 bytes sd/qa/unit/data/pptx/accent-color.pptx | Bin 0 -> 1079347 bytes sd/qa/unit/data/pptx/activex_checkbox.pptx | Bin 0 -> 39828 bytes sd/qa/unit/data/pptx/activex_combobox.pptx | Bin 0 -> 39414 bytes sd/qa/unit/data/pptx/activex_commandbutton.pptx | Bin 0 -> 39860 bytes sd/qa/unit/data/pptx/activex_fontproperties.pptx | Bin 0 -> 48562 bytes sd/qa/unit/data/pptx/activex_label.pptx | Bin 0 -> 39637 bytes sd/qa/unit/data/pptx/activex_listbox.pptx | Bin 0 -> 39370 bytes sd/qa/unit/data/pptx/activex_optionbutton.pptx | Bin 0 -> 39586 bytes sd/qa/unit/data/pptx/activex_picture.pptx | Bin 0 -> 236898 bytes sd/qa/unit/data/pptx/activex_scrollbar.pptx | Bin 0 -> 39882 bytes sd/qa/unit/data/pptx/activex_spinbutton.pptx | Bin 0 -> 40850 bytes sd/qa/unit/data/pptx/activex_textbox.pptx | Bin 0 -> 41657 bytes sd/qa/unit/data/pptx/activex_togglebutton.pptx | Bin 0 -> 39698 bytes sd/qa/unit/data/pptx/altdescription.pptx | Bin 0 -> 156788 bytes sd/qa/unit/data/pptx/arc-validiert.pptx | Bin 0 -> 14393 bytes sd/qa/unit/data/pptx/bnc480256-2.pptx | Bin 0 -> 23387 bytes sd/qa/unit/data/pptx/bnc480256.pptx | Bin 0 -> 35990 bytes sd/qa/unit/data/pptx/bnc584721_1_2.pptx | Bin 0 -> 15008 bytes sd/qa/unit/data/pptx/bnc584721_4.pptx | Bin 0 -> 34738 bytes sd/qa/unit/data/pptx/bnc591147.pptx | Bin 0 -> 34591 bytes sd/qa/unit/data/pptx/bnc862510_5.pptx | Bin 0 -> 63675 bytes sd/qa/unit/data/pptx/bnc862510_6.pptx | Bin 0 -> 48707 bytes sd/qa/unit/data/pptx/bnc862510_7.pptx | Bin 0 -> 24443 bytes sd/qa/unit/data/pptx/bnc870233_1.pptx | Bin 0 -> 34111 bytes sd/qa/unit/data/pptx/bnc870233_2.pptx | Bin 0 -> 55758 bytes sd/qa/unit/data/pptx/bnc870237.pptx | Bin 0 -> 40889 bytes sd/qa/unit/data/pptx/bnc880763.pptx | Bin 0 -> 45631 bytes sd/qa/unit/data/pptx/bnc887225.pptx | Bin 0 -> 32814 bytes sd/qa/unit/data/pptx/bnc887230.pptx | Bin 0 -> 25715 bytes sd/qa/unit/data/pptx/bnc904423.pptx | Bin 0 -> 25119 bytes sd/qa/unit/data/pptx/bnc910045.pptx | Bin 0 -> 37522 bytes sd/qa/unit/data/pptx/bulletColor.pptx | Bin 0 -> 32946 bytes sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx | Bin 0 -> 32905 bytes sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx | Bin 0 -> 31934 bytes sd/qa/unit/data/pptx/connectors.pptx | Bin 0 -> 24318 bytes sd/qa/unit/data/pptx/control_background_color.pptx | Bin 0 -> 85895 bytes sd/qa/unit/data/pptx/crop-position.pptx | Bin 0 -> 28479 bytes sd/qa/unit/data/pptx/crop-to-shape.pptx | Bin 0 -> 83338 bytes sd/qa/unit/data/pptx/croppedTo0.pptx | Bin 0 -> 12974 bytes sd/qa/unit/data/pptx/cshapes.pptx | Bin 0 -> 173125 bytes .../data/pptx/customshape-bitmapfill-srcrect.pptx | Bin 0 -> 34892 bytes sd/qa/unit/data/pptx/customxml.pptx | Bin 0 -> 44229 bytes sd/qa/unit/data/pptx/deftabstop.pptx | Bin 0 -> 26783 bytes sd/qa/unit/data/pptx/effectOrder.pptx | Bin 0 -> 30482 bytes sd/qa/unit/data/pptx/fail/.gitignore | 0 sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx | 1 + sd/qa/unit/data/pptx/fdo83751.pptx | Bin 0 -> 33818 bytes sd/qa/unit/data/pptx/fill-color-list.pptx | Bin 0 -> 42946 bytes sd/qa/unit/data/pptx/font-scale.pptx | Bin 0 -> 40239 bytes sd/qa/unit/data/pptx/formatting-bullet-indent.pptx | Bin 0 -> 35409 bytes sd/qa/unit/data/pptx/greysscale-graphic.pptx | Bin 0 -> 156595 bytes sd/qa/unit/data/pptx/group-rot.pptx | Bin 0 -> 39796 bytes sd/qa/unit/data/pptx/group.pptx | Bin 0 -> 50247 bytes sd/qa/unit/data/pptx/hyperlinkOnImage.pptx | Bin 0 -> 17576 bytes sd/qa/unit/data/pptx/hyperlinktest.pptx | Bin 0 -> 33633 bytes sd/qa/unit/data/pptx/indeterminate/.gitignore | 0 sd/qa/unit/data/pptx/lineStyle.pptx | Bin 0 -> 31446 bytes sd/qa/unit/data/pptx/loopNoPause.pptx | Bin 0 -> 32373 bytes sd/qa/unit/data/pptx/master-slides.pptx | Bin 0 -> 54445 bytes sd/qa/unit/data/pptx/mirrored-graphic.pptx | Bin 0 -> 173805 bytes sd/qa/unit/data/pptx/multicol.pptx | Bin 0 -> 25935 bytes sd/qa/unit/data/pptx/n778859.pptx | Bin 0 -> 32444 bytes sd/qa/unit/data/pptx/n80340.pptx | Bin 0 -> 83909 bytes sd/qa/unit/data/pptx/n821567.pptx | Bin 0 -> 179901 bytes sd/qa/unit/data/pptx/n828390.pptx | Bin 0 -> 32803 bytes sd/qa/unit/data/pptx/n828390_2.pptx | Bin 0 -> 32749 bytes sd/qa/unit/data/pptx/n828390_3.pptx | Bin 0 -> 34098 bytes sd/qa/unit/data/pptx/n83889.pptx | Bin 0 -> 33401 bytes sd/qa/unit/data/pptx/n862510_1.pptx | Bin 0 -> 34576 bytes sd/qa/unit/data/pptx/n862510_2.pptx | Bin 0 -> 48923 bytes sd/qa/unit/data/pptx/n862510_4.pptx | Bin 0 -> 32840 bytes sd/qa/unit/data/pptx/n90190.pptx | Bin 0 -> 33256 bytes sd/qa/unit/data/pptx/n90223.pptx | Bin 0 -> 83910 bytes sd/qa/unit/data/pptx/n90255.pptx | Bin 0 -> 32622 bytes .../unit/data/pptx/narration-non-media-shape.pptx | Bin 0 -> 30952 bytes sd/qa/unit/data/pptx/narration.pptx | Bin 0 -> 82099 bytes sd/qa/unit/data/pptx/numfmt.pptx | Bin 0 -> 44390 bytes sd/qa/unit/data/pptx/ole-emf_min.pptx | Bin 0 -> 36796 bytes sd/qa/unit/data/pptx/ole.pptx | Bin 0 -> 41588 bytes sd/qa/unit/data/pptx/ooxtheme.pptx | Bin 0 -> 44886 bytes sd/qa/unit/data/pptx/open-as-read-only.pptx | Bin 0 -> 21569 bytes sd/qa/unit/data/pptx/page_transparent_bitmap.pptx | Bin 0 -> 29823 bytes sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx | Bin 0 -> 32854 bytes sd/qa/unit/data/pptx/pass/.gitignore | 0 sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx | Bin 0 -> 109961 bytes sd/qa/unit/data/pptx/pass/ofz35597-1.pptx | Bin 0 -> 23316 bytes sd/qa/unit/data/pptx/pass/ofz46160-1.pptx | Bin 0 -> 21771 bytes sd/qa/unit/data/pptx/predefined-table-style.pptx | Bin 0 -> 36430 bytes sd/qa/unit/data/pptx/presetDashDot.pptx | Bin 0 -> 11273 bytes sd/qa/unit/data/pptx/rightToLeftParagraph.pptx | Bin 0 -> 31841 bytes sd/qa/unit/data/pptx/shape-blur-effect.pptx | Bin 0 -> 33285 bytes sd/qa/unit/data/pptx/shape-glow-effect.pptx | Bin 0 -> 13691 bytes sd/qa/unit/data/pptx/shape-soft-edges.pptx | Bin 0 -> 32995 bytes sd/qa/unit/data/pptx/shape-text-rotate.pptx | Bin 0 -> 33784 bytes sd/qa/unit/data/pptx/slidenum_field.pptx | Bin 0 -> 32715 bytes sd/qa/unit/data/pptx/smartart-accent-process.pptx | Bin 0 -> 46326 bytes sd/qa/unit/data/pptx/smartart-autoTxRot.pptx | Bin 0 -> 58937 bytes sd/qa/unit/data/pptx/smartart-autofit-sync.pptx | Bin 0 -> 41814 bytes .../smartart-background-drawingml-fallback.pptx | Bin 0 -> 40964 bytes sd/qa/unit/data/pptx/smartart-background.pptx | Bin 0 -> 50424 bytes sd/qa/unit/data/pptx/smartart-bullet-list.pptx | Bin 0 -> 40468 bytes sd/qa/unit/data/pptx/smartart-center-cycle.pptx | Bin 0 -> 44405 bytes sd/qa/unit/data/pptx/smartart-chevron.pptx | Bin 0 -> 34076 bytes sd/qa/unit/data/pptx/smartart-children.pptx | Bin 0 -> 53014 bytes sd/qa/unit/data/pptx/smartart-cnt.pptx | Bin 0 -> 47360 bytes .../data/pptx/smartart-composite-infer-right.pptx | Bin 0 -> 23250 bytes .../pptx/smartart-continuous-block-process.pptx | Bin 0 -> 46204 bytes sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx | Bin 0 -> 56986 bytes sd/qa/unit/data/pptx/smartart-cycle.pptx | Bin 0 -> 35322 bytes sd/qa/unit/data/pptx/smartart-data-follow.pptx | Bin 0 -> 56896 bytes sd/qa/unit/data/pptx/smartart-dir.pptx | Bin 0 -> 41593 bytes sd/qa/unit/data/pptx/smartart-font-size.pptx | Bin 0 -> 63915 bytes sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx | Bin 0 -> 39440 bytes .../unit/data/pptx/smartart-linear-rule-vert.pptx | Bin 0 -> 73085 bytes sd/qa/unit/data/pptx/smartart-linear-rule.pptx | Bin 0 -> 43743 bytes sd/qa/unit/data/pptx/smartart-maxdepth.pptx | Bin 0 -> 43256 bytes sd/qa/unit/data/pptx/smartart-missing-bullet.pptx | Bin 0 -> 30139 bytes .../unit/data/pptx/smartart-multidirectional.pptx | Bin 0 -> 43588 bytes sd/qa/unit/data/pptx/smartart-org-chart.pptx | Bin 0 -> 57764 bytes sd/qa/unit/data/pptx/smartart-org-chart2.pptx | Bin 0 -> 64524 bytes sd/qa/unit/data/pptx/smartart-picture-strip.pptx | Bin 0 -> 52395 bytes sd/qa/unit/data/pptx/smartart-preserve.pptx | Bin 0 -> 40598 bytes sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx | Bin 0 -> 40075 bytes sd/qa/unit/data/pptx/smartart-recursion.pptx | Bin 0 -> 52943 bytes .../data/pptx/smartart-rightoleftblockdiagram.pptx | Bin 0 -> 43399 bytes sd/qa/unit/data/pptx/smartart-rotation.pptx | Bin 0 -> 43886 bytes sd/qa/unit/data/pptx/smartart-rotation2.pptx | Bin 0 -> 43658 bytes sd/qa/unit/data/pptx/smartart-snake-rows.pptx | Bin 0 -> 52893 bytes sd/qa/unit/data/pptx/smartart-tdf134221.pptx | Bin 0 -> 49280 bytes sd/qa/unit/data/pptx/smartart-text.pptx | Bin 0 -> 38762 bytes .../data/pptx/smartart-vertical-block-list.pptx | Bin 0 -> 47533 bytes .../unit/data/pptx/smartart-vertical-box-list.pptx | Bin 0 -> 43018 bytes sd/qa/unit/data/pptx/smartart1.pptx | Bin 0 -> 43385 bytes sd/qa/unit/data/pptx/standardConnectors.pptx | Bin 0 -> 36923 bytes sd/qa/unit/data/pptx/table-list.pptx | Bin 0 -> 52249 bytes sd/qa/unit/data/pptx/tableBorderLineStyle.pptx | Bin 0 -> 51776 bytes sd/qa/unit/data/pptx/tablescale.pptx | Bin 0 -> 44606 bytes sd/qa/unit/data/pptx/tcPr-vert-roundtrip.pptx | Bin 0 -> 32277 bytes sd/qa/unit/data/pptx/tdf100065.pptx | Bin 0 -> 36317 bytes sd/qa/unit/data/pptx/tdf100926.pptx | Bin 0 -> 32382 bytes sd/qa/unit/data/pptx/tdf100926_ODP.pptx | Bin 0 -> 32382 bytes .../tdf102261_testParaTabStopDefaultDistance.pptx | Bin 0 -> 32892 bytes sd/qa/unit/data/pptx/tdf103347.pptx | Bin 0 -> 35161 bytes sd/qa/unit/data/pptx/tdf103473.pptx | Bin 0 -> 26752 bytes sd/qa/unit/data/pptx/tdf103477.pptx | Bin 0 -> 64312 bytes sd/qa/unit/data/pptx/tdf103792.pptx | Bin 0 -> 14273 bytes sd/qa/unit/data/pptx/tdf103800.pptx | Bin 0 -> 30131 bytes sd/qa/unit/data/pptx/tdf103876.pptx | Bin 0 -> 29585 bytes sd/qa/unit/data/pptx/tdf104015.pptx | Bin 0 -> 19185 bytes sd/qa/unit/data/pptx/tdf104201.pptx | Bin 0 -> 15979 bytes sd/qa/unit/data/pptx/tdf104445.pptx | Bin 0 -> 14291 bytes sd/qa/unit/data/pptx/tdf104722.pptx | Bin 0 -> 40497 bytes sd/qa/unit/data/pptx/tdf104786.pptx | Bin 0 -> 35818 bytes sd/qa/unit/data/pptx/tdf104788.pptx | Bin 0 -> 82873 bytes sd/qa/unit/data/pptx/tdf104789.pptx | Bin 0 -> 22544 bytes .../data/pptx/tdf104792-smart-art-animation.pptx | Bin 0 -> 41239 bytes sd/qa/unit/data/pptx/tdf105150.pptx | Bin 0 -> 31961 bytes sd/qa/unit/data/pptx/tdf105739.pptx | Bin 0 -> 30709 bytes sd/qa/unit/data/pptx/tdf106638.pptx | Bin 0 -> 447309 bytes sd/qa/unit/data/pptx/tdf106867.pptx | Bin 0 -> 52203 bytes sd/qa/unit/data/pptx/tdf107608.pptx | Bin 0 -> 31369 bytes sd/qa/unit/data/pptx/tdf108926.ppt | Bin 0 -> 164864 bytes sd/qa/unit/data/pptx/tdf109067.pptx | Bin 0 -> 20183 bytes sd/qa/unit/data/pptx/tdf109187.pptx | Bin 0 -> 34647 bytes sd/qa/unit/data/pptx/tdf111518.pptx | Bin 0 -> 30463 bytes sd/qa/unit/data/pptx/tdf111786.pptx | Bin 0 -> 24566 bytes sd/qa/unit/data/pptx/tdf111789.pptx | Bin 0 -> 33637 bytes sd/qa/unit/data/pptx/tdf111863.pptx | Bin 0 -> 30755 bytes sd/qa/unit/data/pptx/tdf111884.pptx | Bin 0 -> 30898 bytes sd/qa/unit/data/pptx/tdf112086.pptx | Bin 0 -> 30542 bytes sd/qa/unit/data/pptx/tdf112088.pptx | Bin 0 -> 30317 bytes sd/qa/unit/data/pptx/tdf112089.pptx | Bin 0 -> 46671 bytes sd/qa/unit/data/pptx/tdf112209.pptx | Bin 0 -> 28536 bytes sd/qa/unit/data/pptx/tdf112280.pptx | Bin 0 -> 30309 bytes sd/qa/unit/data/pptx/tdf112333.pptx | Bin 0 -> 30459 bytes sd/qa/unit/data/pptx/tdf112334.pptx | Bin 0 -> 30041 bytes sd/qa/unit/data/pptx/tdf112633.pptx | Bin 0 -> 33697 bytes sd/qa/unit/data/pptx/tdf113163.pptx | Bin 0 -> 44937 bytes sd/qa/unit/data/pptx/tdf113198.pptx | Bin 0 -> 13847 bytes sd/qa/unit/data/pptx/tdf113818-swivel.pptx | Bin 0 -> 33604 bytes sd/qa/unit/data/pptx/tdf113822underline.pptx | Bin 0 -> 34449 bytes sd/qa/unit/data/pptx/tdf114821.pptx | Bin 0 -> 50235 bytes sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx | Bin 0 -> 45018 bytes sd/qa/unit/data/pptx/tdf114848.pptx | Bin 0 -> 117854 bytes sd/qa/unit/data/pptx/tdf114913.pptx | Bin 0 -> 33238 bytes sd/qa/unit/data/pptx/tdf115394-zero.pptx | Bin 0 -> 34352 bytes sd/qa/unit/data/pptx/tdf115394.pptx | Bin 0 -> 31282 bytes sd/qa/unit/data/pptx/tdf116350-texteffects.pptx | Bin 0 -> 38333 bytes sd/qa/unit/data/pptx/tdf118776.pptx | Bin 0 -> 31591 bytes sd/qa/unit/data/pptx/tdf119015.pptx | Bin 0 -> 11652 bytes sd/qa/unit/data/pptx/tdf119087.pptx | Bin 0 -> 15035 bytes sd/qa/unit/data/pptx/tdf119118.pptx | Bin 0 -> 31815 bytes sd/qa/unit/data/pptx/tdf119187.pptx | Bin 0 -> 18886 bytes sd/qa/unit/data/pptx/tdf119649.pptx | Bin 0 -> 21228 bytes sd/qa/unit/data/pptx/tdf120028.pptx | Bin 0 -> 30465 bytes sd/qa/unit/data/pptx/tdf120573.pptx | Bin 0 -> 243853 bytes sd/qa/unit/data/pptx/tdf123090.pptx | Bin 0 -> 34570 bytes sd/qa/unit/data/pptx/tdf123684.pptx | Bin 0 -> 142961 bytes sd/qa/unit/data/pptx/tdf124457.pptx | Bin 0 -> 35132 bytes sd/qa/unit/data/pptx/tdf125071.pptx | Bin 0 -> 35409 bytes sd/qa/unit/data/pptx/tdf125346.pptx | Bin 0 -> 22079 bytes sd/qa/unit/data/pptx/tdf125346_2.pptx | Bin 0 -> 24482 bytes sd/qa/unit/data/pptx/tdf125360.pptx | Bin 0 -> 15379 bytes sd/qa/unit/data/pptx/tdf125360_1.pptx | Bin 0 -> 15480 bytes sd/qa/unit/data/pptx/tdf125360_2.pptx | Bin 0 -> 15213 bytes sd/qa/unit/data/pptx/tdf125551.pptx | Bin 0 -> 131374 bytes sd/qa/unit/data/pptx/tdf125554.pptx | Bin 0 -> 32967 bytes sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx | Bin 0 -> 35488 bytes sd/qa/unit/data/pptx/tdf126234.pptx | Bin 0 -> 34091 bytes sd/qa/unit/data/pptx/tdf126324.pptx | Bin 0 -> 30634 bytes sd/qa/unit/data/pptx/tdf126741.pptx | Bin 0 -> 32437 bytes sd/qa/unit/data/pptx/tdf127090.odp | Bin 0 -> 12415 bytes sd/qa/unit/data/pptx/tdf127129.pptx | Bin 0 -> 30143 bytes sd/qa/unit/data/pptx/tdf127237.pptx | Bin 0 -> 34180 bytes sd/qa/unit/data/pptx/tdf127964.pptx | Bin 0 -> 34018 bytes sd/qa/unit/data/pptx/tdf128212.pptx | Bin 0 -> 16921 bytes sd/qa/unit/data/pptx/tdf128213-shaperot.pptx | Bin 0 -> 16937 bytes sd/qa/unit/data/pptx/tdf128213.pptx | Bin 0 -> 16938 bytes sd/qa/unit/data/pptx/tdf128550.pptx | Bin 0 -> 30230 bytes sd/qa/unit/data/pptx/tdf128596.pptx | Bin 0 -> 29444 bytes sd/qa/unit/data/pptx/tdf128684.pptx | Bin 0 -> 58086 bytes sd/qa/unit/data/pptx/tdf128952.pptx | Bin 0 -> 25578 bytes sd/qa/unit/data/pptx/tdf129372.pptx | Bin 0 -> 33865 bytes sd/qa/unit/data/pptx/tdf129686.pptx | Bin 0 -> 35331 bytes sd/qa/unit/data/pptx/tdf130058.pptx | Bin 0 -> 40724 bytes sd/qa/unit/data/pptx/tdf131390.pptx | Bin 0 -> 35286 bytes sd/qa/unit/data/pptx/tdf131553.pptx | Bin 0 -> 70111 bytes sd/qa/unit/data/pptx/tdf131554.pptx | Bin 0 -> 21065 bytes sd/qa/unit/data/pptx/tdf131905.pptx | Bin 0 -> 35474 bytes sd/qa/unit/data/pptx/tdf132282.pptx | Bin 0 -> 56323 bytes .../data/pptx/tdf132302_SmartArt_rightArrow.pptx | Bin 0 -> 27526 bytes sd/qa/unit/data/pptx/tdf132472.pptx | Bin 0 -> 33439 bytes sd/qa/unit/data/pptx/tdf134053_dashdot.pptx | Bin 0 -> 14891 bytes sd/qa/unit/data/pptx/tdf134174.pptx | Bin 0 -> 186296 bytes sd/qa/unit/data/pptx/tdf134210.pptx | Bin 0 -> 125281 bytes sd/qa/unit/data/pptx/tdf134862.pptx | Bin 0 -> 32601 bytes sd/qa/unit/data/pptx/tdf135843.pptx | Bin 0 -> 22951 bytes sd/qa/unit/data/pptx/tdf135843_export.pptx | Bin 0 -> 32460 bytes sd/qa/unit/data/pptx/tdf135843_insideH.pptx | Bin 0 -> 33449 bytes .../data/pptx/tdf135953_SmartArt_textposition.pptx | Bin 0 -> 27056 bytes sd/qa/unit/data/pptx/tdf136830.pptx | Bin 0 -> 14105 bytes sd/qa/unit/data/pptx/tdf137367.pptx | Bin 0 -> 35083 bytes sd/qa/unit/data/pptx/tdf137675.pptx | Bin 0 -> 23802 bytes sd/qa/unit/data/pptx/tdf138148.pptx | Bin 0 -> 21629 bytes sd/qa/unit/data/pptx/tdf140714.pptx | Bin 0 -> 28384 bytes sd/qa/unit/data/pptx/tdf140852.pptx | Bin 0 -> 49776 bytes sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx | Bin 0 -> 17158 bytes sd/qa/unit/data/pptx/tdf141058-1.pptx | Bin 0 -> 62621 bytes sd/qa/unit/data/pptx/tdf141704.pptx | Bin 0 -> 25376 bytes sd/qa/unit/data/pptx/tdf142590.pptx | Bin 0 -> 35022 bytes sd/qa/unit/data/pptx/tdf142645.pptx | Bin 0 -> 32953 bytes sd/qa/unit/data/pptx/tdf142648.pptx | Bin 0 -> 36994 bytes sd/qa/unit/data/pptx/tdf142716.pptx | Bin 0 -> 23281 bytes sd/qa/unit/data/pptx/tdf142913.pptx | Bin 0 -> 35076 bytes sd/qa/unit/data/pptx/tdf142915.pptx | Bin 0 -> 34231 bytes sd/qa/unit/data/pptx/tdf143126.pptx | Bin 0 -> 35043 bytes sd/qa/unit/data/pptx/tdf143129.pptx | Bin 0 -> 31053 bytes sd/qa/unit/data/pptx/tdf143222.pptx | Bin 0 -> 53172 bytes sd/qa/unit/data/pptx/tdf143624.pptx | Bin 0 -> 33909 bytes .../data/pptx/tdf144092-emptyShapeTextProps.pptx | Bin 0 -> 35472 bytes sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx | Bin 0 -> 33114 bytes sd/qa/unit/data/pptx/tdf144616.pptx | Bin 0 -> 18503 bytes sd/qa/unit/data/pptx/tdf144917.pptx | Bin 0 -> 16033 bytes sd/qa/unit/data/pptx/tdf144918.pptx | Bin 0 -> 17564 bytes sd/qa/unit/data/pptx/tdf145162.pptx | Bin 0 -> 33770 bytes .../unit/data/pptx/tdf145528_SmartArt_Matrix.pptx | Bin 0 -> 26715 bytes sd/qa/unit/data/pptx/tdf146223.pptx | Bin 0 -> 37210 bytes sd/qa/unit/data/pptx/tdf146731.pptx | Bin 0 -> 33273 bytes sd/qa/unit/data/pptx/tdf147121.pptx | Bin 0 -> 32388 bytes sd/qa/unit/data/pptx/tdf147459.pptx | Bin 0 -> 13686 bytes sd/qa/unit/data/pptx/tdf147586.pptx | Bin 0 -> 54643 bytes sd/qa/unit/data/pptx/tdf148665.pptx | Bin 0 -> 33380 bytes sd/qa/unit/data/pptx/tdf148685.pptx | Bin 0 -> 23760 bytes sd/qa/unit/data/pptx/tdf148810_PARA_OUTLLEVEL.pptx | Bin 0 -> 21210 bytes sd/qa/unit/data/pptx/tdf148921.pptx | Bin 0 -> 39926 bytes sd/qa/unit/data/pptx/tdf148965.pptx | Bin 0 -> 19068 bytes sd/qa/unit/data/pptx/tdf148966.pptx | Bin 0 -> 35714 bytes sd/qa/unit/data/pptx/tdf149124.pptx | Bin 0 -> 33988 bytes sd/qa/unit/data/pptx/tdf149206.pptx | Bin 0 -> 89796 bytes sd/qa/unit/data/pptx/tdf149314.pptx | Bin 0 -> 18829 bytes sd/qa/unit/data/pptx/tdf149551_SmartArt_Gear.pptx | Bin 0 -> 25487 bytes sd/qa/unit/data/pptx/tdf149551_SmartArt_Pie.pptx | Bin 0 -> 26265 bytes .../unit/data/pptx/tdf149551_SmartArt_Pyramid.pptx | Bin 0 -> 24885 bytes sd/qa/unit/data/pptx/tdf149551_SmartArt_Venn.pptx | Bin 0 -> 26146 bytes .../data/pptx/tdf149588_transparentSolidFill.pptx | Bin 0 -> 65346 bytes sd/qa/unit/data/pptx/tdf149697.pptx | Bin 0 -> 16924 bytes sd/qa/unit/data/pptx/tdf149785.pptx | Bin 0 -> 35030 bytes sd/qa/unit/data/pptx/tdf149803.pptx | Bin 0 -> 20710 bytes .../data/pptx/tdf149961-autofitIndentation.pptx | Bin 0 -> 34123 bytes sd/qa/unit/data/pptx/tdf149985.pptx | Bin 0 -> 43600 bytes sd/qa/unit/data/pptx/tdf150719.pptx | Bin 0 -> 17666 bytes sd/qa/unit/data/pptx/tdf150770.pptx | Bin 0 -> 46047 bytes sd/qa/unit/data/pptx/tdf151134.odp | Bin 0 -> 88169 bytes .../pptx/tdf151547-transparent-white-text.pptx | Bin 0 -> 32731 bytes sd/qa/unit/data/pptx/tdf151767.pptx | Bin 0 -> 33448 bytes sd/qa/unit/data/pptx/tdf152070.pptx | Bin 0 -> 33151 bytes sd/qa/unit/data/pptx/tdf152186.pptx | Bin 0 -> 21456 bytes sd/qa/unit/data/pptx/tdf152335.pptx | Bin 0 -> 19965 bytes sd/qa/unit/data/pptx/tdf152434.pptx | Bin 0 -> 25819 bytes sd/qa/unit/data/pptx/tdf152606.pptx | Bin 0 -> 32273 bytes .../data/pptx/tdf153008-srcRect-smallNegBound.pptx | Bin 0 -> 23988 bytes .../data/pptx/tdf153036_resizedConnectorL.pptx | Bin 0 -> 33042 bytes sd/qa/unit/data/pptx/tdf153466.pptx | Bin 0 -> 35419 bytes sd/qa/unit/data/pptx/tdf154363.pptx | Bin 0 -> 33847 bytes sd/qa/unit/data/pptx/tdf156649.pptx | Bin 0 -> 32463 bytes sd/qa/unit/data/pptx/tdf156808.pptx | Bin 0 -> 19449 bytes sd/qa/unit/data/pptx/tdf156829.pptx | Bin 0 -> 20052 bytes sd/qa/unit/data/pptx/tdf156856.pptx | Bin 0 -> 59374 bytes sd/qa/unit/data/pptx/tdf157635.pptx | Bin 0 -> 34364 bytes sd/qa/unit/data/pptx/tdf157740.pptx | Bin 0 -> 16941 bytes sd/qa/unit/data/pptx/tdf157793.pptx | Bin 0 -> 42199 bytes sd/qa/unit/data/pptx/tdf44223.pptx | Bin 0 -> 63723 bytes sd/qa/unit/data/pptx/tdf50499.pptx | Bin 0 -> 40344 bytes sd/qa/unit/data/pptx/tdf51340.pptx | Bin 0 -> 16503 bytes sd/qa/unit/data/pptx/tdf54037.pptx | Bin 0 -> 34781 bytes sd/qa/unit/data/pptx/tdf59323.pptx | Bin 0 -> 39322 bytes sd/qa/unit/data/pptx/tdf62255.pptx | Bin 0 -> 31427 bytes sd/qa/unit/data/pptx/tdf65724.pptx | Bin 0 -> 34421 bytes sd/qa/unit/data/pptx/tdf79007.pptx | Bin 0 -> 46828 bytes sd/qa/unit/data/pptx/tdf79082.pptx | Bin 0 -> 24786 bytes sd/qa/unit/data/pptx/tdf84205.pptx | Bin 0 -> 45600 bytes sd/qa/unit/data/pptx/tdf89064.pptx | Bin 0 -> 24629 bytes sd/qa/unit/data/pptx/tdf89449.pptx | Bin 0 -> 14939 bytes sd/qa/unit/data/pptx/tdf89927.pptx | Bin 0 -> 417178 bytes .../pptx/tdf89928-blackWhiteEffectThreshold.pptx | Bin 0 -> 36640 bytes sd/qa/unit/data/pptx/tdf90626.pptx | Bin 0 -> 24027 bytes sd/qa/unit/data/pptx/tdf91060.pptx | Bin 0 -> 23274 bytes sd/qa/unit/data/pptx/tdf91378.pptx | Bin 0 -> 33866 bytes sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx | Bin 0 -> 21431 bytes sd/qa/unit/data/pptx/tdf92222.pptx | Bin 0 -> 21267 bytes sd/qa/unit/data/pptx/tdf93097.pptx | Bin 0 -> 29386 bytes sd/qa/unit/data/pptx/tdf93830.pptx | Bin 0 -> 64463 bytes sd/qa/unit/data/pptx/tdf93868.pptx | Bin 0 -> 69213 bytes sd/qa/unit/data/pptx/tdf94238.pptx | Bin 0 -> 35015 bytes sd/qa/unit/data/pptx/tdf95932.pptx | Bin 0 -> 66621 bytes sd/qa/unit/data/pptx/tdf96061.pptx | Bin 0 -> 21022 bytes sd/qa/unit/data/pptx/tdf98477grow.pptx | Bin 0 -> 30023 bytes sd/qa/unit/data/pptx/tdf98603.pptx | Bin 0 -> 46390 bytes sd/qa/unit/data/pptx/tdf99030.pptx | Bin 0 -> 59514 bytes sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx | Bin 0 -> 28072 bytes sd/qa/unit/data/pptx/tdt142291.pptx | Bin 0 -> 21484 bytes sd/qa/unit/data/pptx/testShapeAutofit.pptx | Bin 0 -> 35044 bytes sd/qa/unit/data/pptx/trigger.pptx | Bin 0 -> 32278 bytes sd/qa/unit/data/pptx/vertical-bracket-list.pptx | Bin 0 -> 42124 bytes sd/qa/unit/data/smoketest.pptx | Bin 0 -> 29956 bytes sd/qa/unit/data/strict_ooxml.pptx | Bin 0 -> 29966 bytes sd/qa/unit/data/svg/test.svg | 105 + sd/qa/unit/data/sxi/ooo41061-1.sxi | Bin 0 -> 42492 bytes sd/qa/unit/data/tdf100491.pptx | Bin 0 -> 30914 bytes sd/qa/unit/data/tdf101242_ODF.odg | Bin 0 -> 9140 bytes sd/qa/unit/data/tdf101242_settings.odg | Bin 0 -> 9233 bytes sd/qa/unit/data/tdf109317.pptx | Bin 0 -> 39405 bytes sd/qa/unit/data/tdf111522.odp | Bin 0 -> 10869 bytes sd/qa/unit/data/tdf112126.odg | Bin 0 -> 10382 bytes sd/qa/unit/data/tdf119392_InsertLayer.odg | Bin 0 -> 12765 bytes sd/qa/unit/data/tdf119956.odg | Bin 0 -> 11124 bytes sd/qa/unit/data/tdf120527.jpg | Bin 0 -> 1136 bytes sd/qa/unit/data/tdf123841.odg | Bin 0 -> 8590 bytes sd/qa/unit/data/tdf124708.ppt | Bin 0 -> 60928 bytes sd/qa/unit/data/tdf126197.odp | Bin 0 -> 10501 bytes sd/qa/unit/data/tdf128651_CustomShapeUndo.odp | Bin 0 -> 13504 bytes .../data/tdf129898_faulty_DrawnInSlideshow.odp | Bin 0 -> 12607 bytes sd/qa/unit/data/tdf130988_3D_create_lathe.odg | Bin 0 -> 8874 bytes sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg | Bin 0 -> 9744 bytes sd/qa/unit/data/tdf131269.ppt | Bin 0 -> 154112 bytes sd/qa/unit/data/tdf143412.svg | 10 + sd/qa/unit/data/tdf154989.odg | Bin 0 -> 69643 bytes sd/qa/unit/data/tdf67248.odg | Bin 0 -> 10302 bytes sd/qa/unit/data/tdf80194_defaultSubscripts.fodg | 407 + sd/qa/unit/data/tdf90338.odp | Bin 0 -> 12553 bytes sd/qa/unit/data/tdf90403.pptx | Bin 0 -> 39815 bytes sd/qa/unit/data/tdf92001.odp | Bin 0 -> 11063 bytes sd/qa/unit/data/tdf97808.fodp | 30 + sd/qa/unit/data/tdf98839_ShearVFlipH.odg | Bin 0 -> 9070 bytes sd/qa/unit/data/tdf99396.odp | Bin 0 -> 10956 bytes sd/qa/unit/data/theme.pptx | Bin 0 -> 30646 bytes sd/qa/unit/data/tolerance.xml | 3 + sd/qa/unit/data/transparent-text.fodg | 64 + sd/qa/unit/data/underline.fodp | 754 + sd/qa/unit/data/unknown-attribute.fodp | 26 + sd/qa/unit/data/xml/fdo47434_0.xml | 75 + sd/qa/unit/data/xml/fdo64586_0.xml | 31 + sd/qa/unit/data/xml/fdo71434_0.xml | 10 + sd/qa/unit/data/xml/n593612_0.xml | 65 + sd/qa/unit/data/xml/n758621_0.xml | 31 + sd/qa/unit/data/xml/n758621_1.xml | 31 + sd/qa/unit/data/xml/n762695_0.xml | 242 + sd/qa/unit/data/xml/n762695_1.xml | 632 + sd/qa/unit/data/xml/n819614_0.xml | 6613 ++++++ sd/qa/unit/data/xml/n820786_0.xml | 3216 +++ sd/qa/unit/data/xml/n902652_0.xml | 309 + sd/qa/unit/data/xml/shapes-test_page0.xml | 1666 ++ sd/qa/unit/data/xml/shapes-test_page1.xml | 2426 +++ sd/qa/unit/data/xml/shapes-test_page2.xml | 3104 +++ sd/qa/unit/data/xml/shapes-test_page3.xml | 714 + sd/qa/unit/data/xml/shapes-test_page4.xml | 611 + sd/qa/unit/data/xml/shapes-test_page5.xml | 664 + sd/qa/unit/data/xml/shapes-test_page6.xml | 5 + sd/qa/unit/data/xml/shapes-test_page7.xml | 10 + sd/qa/unit/data/xml/tdf100491_0.xml | 291 + sd/qa/unit/data/xml/tdf109317_0.xml | 498 + sd/qa/unit/data/xml/tdf90338_0.xml | 559 + sd/qa/unit/data/xml/tdf90403_0.xml | 4 + sd/qa/unit/data/xml/tdf92001_0.xml | 80 + sd/qa/unit/dialogs-test.cxx | 616 + sd/qa/unit/export-tests-ooxml1.cxx | 1708 ++ sd/qa/unit/export-tests-ooxml2.cxx | 1994 ++ sd/qa/unit/export-tests-ooxml3.cxx | 999 + sd/qa/unit/export-tests-ooxml4.cxx | 1104 + sd/qa/unit/export-tests.cxx | 1974 ++ sd/qa/unit/filters-test.cxx | 118 + sd/qa/unit/import-tests-smartart.cxx | 1765 ++ sd/qa/unit/import-tests.cxx | 1927 ++ sd/qa/unit/import-tests2.cxx | 1987 ++ sd/qa/unit/import-tests_skia.cxx | 36 + sd/qa/unit/layout-tests.cxx | 385 + sd/qa/unit/misc-tests.cxx | 962 + sd/qa/unit/sdmodeltestbase.hxx | 175 + sd/qa/unit/tiledrendering/CallbackRecorder.hxx | 152 + sd/qa/unit/tiledrendering/LOKitSearchTest.cxx | 948 + sd/qa/unit/tiledrendering/data/2slides.odp | Bin 0 -> 10984 bytes sd/qa/unit/tiledrendering/data/MixedTest1.odg | Bin 0 -> 25083 bytes sd/qa/unit/tiledrendering/data/MixedTest2.odg | Bin 0 -> 35616 bytes sd/qa/unit/tiledrendering/data/OnePDFObject.odg | Bin 0 -> 124632 bytes sd/qa/unit/tiledrendering/data/PDFSearch.pdf | Bin 0 -> 14334 bytes sd/qa/unit/tiledrendering/data/ReplaceTest.odp | Bin 0 -> 10854 bytes sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg | Bin 0 -> 10474 bytes .../tiledrendering/data/cut_selection_change.odp | Bin 0 -> 10983 bytes sd/qa/unit/tiledrendering/data/dummy.odg | Bin 0 -> 8183 bytes sd/qa/unit/tiledrendering/data/dummy.odp | Bin 0 -> 10763 bytes sd/qa/unit/tiledrendering/data/duplicate-undo.odp | Bin 0 -> 11346 bytes sd/qa/unit/tiledrendering/data/insert-delete.odp | Bin 0 -> 13178 bytes .../unit/tiledrendering/data/language-all-text.odp | Bin 0 -> 13083 bytes sd/qa/unit/tiledrendering/data/notes-view.odp | Bin 0 -> 11184 bytes sd/qa/unit/tiledrendering/data/paste-undo.fodp | 34 + .../tiledrendering/data/paste_text_onslide.odp | Bin 0 -> 10587 bytes .../tiledrendering/data/regenerate-diagram.pptx | Bin 0 -> 41813 bytes sd/qa/unit/tiledrendering/data/search-all.odp | Bin 0 -> 10974 bytes sd/qa/unit/tiledrendering/data/shape.odp | Bin 0 -> 10446 bytes sd/qa/unit/tiledrendering/data/table-column.odp | Bin 0 -> 10526 bytes sd/qa/unit/tiledrendering/data/table.odp | Bin 0 -> 10559 bytes sd/qa/unit/tiledrendering/data/tdf102223.odp | Bin 0 -> 17335 bytes sd/qa/unit/tiledrendering/data/tdf103083.fodp | 932 + sd/qa/unit/tiledrendering/data/tdf104405.fodp | 822 + sd/qa/unit/tiledrendering/data/tdf105502.odp | Bin 0 -> 11629 bytes sd/qa/unit/tiledrendering/data/tdf115783.fodp | 52 + .../unit/tiledrendering/data/tdf115873-group.fodp | 36 + sd/qa/unit/tiledrendering/data/tdf115873.fodp | 29 + sd/qa/unit/tiledrendering/data/tdf118354.odp | Bin 0 -> 14518 bytes sd/qa/unit/tiledrendering/data/tdf81754.pptx | Bin 0 -> 35503 bytes sd/qa/unit/tiledrendering/data/title-shape.odp | Bin 0 -> 11406 bytes sd/qa/unit/tiledrendering/tiledrendering.cxx | 2947 +++ sd/qa/unit/uiimpress.cxx | 1266 ++ sd/qa/unit/uimpress.cxx | 110 + sd/qa/unoapi/knownissues.xcl | 86 + sd/qa/unoapi/sd.sce | 41 + sd/sdi/SlideSorterController.sdi | 341 + sd/sdi/ViewShellBase.sdi | 152 + sd/sdi/_docsh.sdi | 93 + sd/sdi/_drvwsh.sdi | 2955 +++ sd/sdi/app.sdi | 93 + sd/sdi/docshell.sdi | 31 + sd/sdi/drbezob.sdi | 81 + sd/sdi/drgrfob.sdi | 138 + sd/sdi/drtxtob.sdi | 300 + sd/sdi/drviewsh.sdi | 223 + sd/sdi/grdocsh.sdi | 26 + sd/sdi/grviewsh.sdi | 82 + sd/sdi/mediaob.sdi | 26 + sd/sdi/outlnvsh.sdi | 552 + sd/sdi/sdgslots.sdi | 89 + sd/sdi/sdraw.sdi | 4706 +++++ sd/sdi/sdslots.hrc | 27 + sd/sdi/sdslots.sdi | 91 + sd/sdi/tables.sdi | 193 + sd/source/console/PresenterAccessibility.cxx | 1769 ++ sd/source/console/PresenterAccessibility.hxx | 115 + sd/source/console/PresenterBitmapContainer.cxx | 399 + sd/source/console/PresenterBitmapContainer.hxx | 146 + sd/source/console/PresenterButton.cxx | 448 + sd/source/console/PresenterButton.hxx | 138 + sd/source/console/PresenterCanvasHelper.cxx | 289 + sd/source/console/PresenterCanvasHelper.hxx | 107 + sd/source/console/PresenterConfigurationAccess.cxx | 274 + sd/source/console/PresenterConfigurationAccess.hxx | 178 + sd/source/console/PresenterController.cxx | 1183 ++ sd/source/console/PresenterController.hxx | 226 + .../console/PresenterCurrentSlideObserver.cxx | 132 + .../console/PresenterCurrentSlideObserver.hxx | 81 + sd/source/console/PresenterFrameworkObserver.cxx | 110 + sd/source/console/PresenterFrameworkObserver.hxx | 81 + sd/source/console/PresenterGeometryHelper.cxx | 262 + sd/source/console/PresenterGeometryHelper.hxx | 117 + sd/source/console/PresenterHelpView.cxx | 748 + sd/source/console/PresenterHelpView.hxx | 121 + sd/source/console/PresenterHelper.cxx | 56 + sd/source/console/PresenterHelper.hxx | 48 + sd/source/console/PresenterNotesView.cxx | 649 + sd/source/console/PresenterNotesView.hxx | 158 + sd/source/console/PresenterPaintManager.cxx | 142 + sd/source/console/PresenterPaintManager.hxx | 89 + sd/source/console/PresenterPane.cxx | 169 + sd/source/console/PresenterPane.hxx | 80 + sd/source/console/PresenterPaneBase.cxx | 343 + sd/source/console/PresenterPaneBase.hxx | 128 + sd/source/console/PresenterPaneBorderPainter.cxx | 883 + sd/source/console/PresenterPaneBorderPainter.hxx | 138 + sd/source/console/PresenterPaneContainer.cxx | 331 + sd/source/console/PresenterPaneContainer.hxx | 161 + sd/source/console/PresenterPaneFactory.cxx | 283 + sd/source/console/PresenterPaneFactory.hxx | 119 + sd/source/console/PresenterProtocolHandler.cxx | 830 + sd/source/console/PresenterProtocolHandler.hxx | 91 + sd/source/console/PresenterScreen.cxx | 824 + sd/source/console/PresenterScreen.hxx | 233 + sd/source/console/PresenterScrollBar.cxx | 825 + sd/source/console/PresenterScrollBar.hxx | 257 + sd/source/console/PresenterSlidePreview.cxx | 352 + sd/source/console/PresenterSlidePreview.hxx | 145 + sd/source/console/PresenterSlideShowView.cxx | 953 + sd/source/console/PresenterSlideShowView.hxx | 241 + sd/source/console/PresenterSlideSorter.cxx | 1928 ++ sd/source/console/PresenterSlideSorter.hxx | 189 + sd/source/console/PresenterSprite.cxx | 163 + sd/source/console/PresenterSprite.hxx | 73 + sd/source/console/PresenterSpritePane.cxx | 173 + sd/source/console/PresenterSpritePane.hxx | 79 + sd/source/console/PresenterTextView.cxx | 1193 ++ sd/source/console/PresenterTextView.hxx | 279 + sd/source/console/PresenterTheme.cxx | 1060 + sd/source/console/PresenterTheme.hxx | 134 + sd/source/console/PresenterTimer.cxx | 572 + sd/source/console/PresenterTimer.hxx | 122 + sd/source/console/PresenterToolBar.cxx | 2013 ++ sd/source/console/PresenterToolBar.hxx | 250 + sd/source/console/PresenterUIPainter.cxx | 241 + sd/source/console/PresenterUIPainter.hxx | 56 + sd/source/console/PresenterViewFactory.cxx | 503 + sd/source/console/PresenterViewFactory.hxx | 167 + sd/source/console/PresenterWindowManager.cxx | 1044 + sd/source/console/PresenterWindowManager.hxx | 208 + sd/source/console/presenter.component | 18 + sd/source/core/CustomAnimationCloner.cxx | 307 + sd/source/core/CustomAnimationEffect.cxx | 3560 ++++ sd/source/core/CustomAnimationPreset.cxx | 514 + sd/source/core/EffectMigration.cxx | 1439 ++ sd/source/core/PageListWatcher.cxx | 217 + sd/source/core/PageListWatcher.hxx | 87 + sd/source/core/ThemeColorChanger.cxx | 192 + sd/source/core/TransitionPreset.cxx | 385 + sd/source/core/anminfo.cxx | 128 + sd/source/core/annotations/Annotation.cxx | 479 + .../core/annotations/AnnotationEnumeration.cxx | 86 + sd/source/core/cusshow.cxx | 101 + sd/source/core/drawdoc.cxx | 1206 ++ sd/source/core/drawdoc2.cxx | 1380 ++ sd/source/core/drawdoc3.cxx | 1940 ++ sd/source/core/drawdoc4.cxx | 1298 ++ sd/source/core/drawdoc_animations.cxx | 54 + sd/source/core/pglink.cxx | 128 + sd/source/core/sdiocmpt.cxx | 117 + sd/source/core/sdpage.cxx | 3142 +++ sd/source/core/sdpage2.cxx | 645 + sd/source/core/sdpage_animations.cxx | 160 + sd/source/core/shapelist.cxx | 140 + sd/source/core/stlfamily.cxx | 514 + sd/source/core/stlpool.cxx | 1386 ++ sd/source/core/stlsheet.cxx | 1538 ++ sd/source/core/text/textapi.cxx | 277 + sd/source/core/typemap.cxx | 143 + sd/source/core/undo/undofactory.cxx | 55 + sd/source/core/undo/undomanager.cxx | 58 + sd/source/core/undo/undoobjects.cxx | 394 + sd/source/core/undoanim.cxx | 280 + sd/source/filter/cgm/sdcgmfilter.cxx | 107 + sd/source/filter/eppt/eppt.cxx | 1466 ++ sd/source/filter/eppt/eppt.hxx | 233 + sd/source/filter/eppt/epptbase.hxx | 413 + sd/source/filter/eppt/epptdef.hxx | 145 + sd/source/filter/eppt/epptooxml.hxx | 182 + sd/source/filter/eppt/epptso.cxx | 3362 +++ sd/source/filter/eppt/escherex.cxx | 266 + sd/source/filter/eppt/escherex.hxx | 64 + sd/source/filter/eppt/grouptable.hxx | 67 + sd/source/filter/eppt/pptexanimations.cxx | 2149 ++ sd/source/filter/eppt/pptexanimations.hxx | 135 + sd/source/filter/eppt/pptexsoundcollection.cxx | 214 + sd/source/filter/eppt/pptexsoundcollection.hxx | 71 + sd/source/filter/eppt/pptx-animations-cond.cxx | 105 + sd/source/filter/eppt/pptx-animations-cond.hxx | 31 + sd/source/filter/eppt/pptx-animations-nodectx.cxx | 231 + sd/source/filter/eppt/pptx-animations-nodectx.hxx | 66 + sd/source/filter/eppt/pptx-animations.cxx | 1254 ++ sd/source/filter/eppt/pptx-animations.hxx | 25 + sd/source/filter/eppt/pptx-epptbase.cxx | 1000 + sd/source/filter/eppt/pptx-epptooxml.cxx | 2301 +++ sd/source/filter/eppt/pptx-grouptable.cxx | 85 + sd/source/filter/eppt/pptx-stylesheet.cxx | 489 + sd/source/filter/eppt/pptx-text.cxx | 1400 ++ sd/source/filter/eppt/text.hxx | 254 + sd/source/filter/grf/sdgrffilter.cxx | 326 + sd/source/filter/html/htmlex.cxx | 855 + sd/source/filter/html/htmlex.hxx | 84 + sd/source/filter/html/htmlpublishmode.hxx | 31 + sd/source/filter/html/pubdlg.cxx | 315 + sd/source/filter/html/sdhtmlfilter.cxx | 44 + sd/source/filter/pdf/sdpdffilter.cxx | 204 + sd/source/filter/ppt/ppt97animations.cxx | 682 + sd/source/filter/ppt/ppt97animations.hxx | 156 + sd/source/filter/ppt/pptanimations.hxx | 209 + sd/source/filter/ppt/pptatom.cxx | 104 + sd/source/filter/ppt/pptatom.hxx | 106 + sd/source/filter/ppt/pptin.cxx | 2808 +++ sd/source/filter/ppt/pptin.hxx | 92 + sd/source/filter/ppt/pptinanimations.cxx | 3293 +++ sd/source/filter/ppt/pptinanimations.hxx | 115 + sd/source/filter/ppt/propread.cxx | 615 + sd/source/filter/ppt/propread.hxx | 151 + sd/source/filter/sdfilter.cxx | 64 + sd/source/filter/sdpptwrp.cxx | 329 + sd/source/filter/xml/sdtransform.cxx | 363 + sd/source/filter/xml/sdtransform.hxx | 28 + sd/source/filter/xml/sdxmlwrp.cxx | 1046 + sd/source/helper/simplereferencecomponent.cxx | 72 + .../accessibility/AccessibleDocumentViewBase.cxx | 777 + .../accessibility/AccessibleDrawDocumentView.cxx | 778 + .../accessibility/AccessibleOutlineEditSource.cxx | 199 + .../ui/accessibility/AccessibleOutlineView.cxx | 238 + sd/source/ui/accessibility/AccessiblePageShape.cxx | 262 + .../AccessiblePresentationGraphicShape.cxx | 76 + .../AccessiblePresentationOLEShape.cxx | 84 + .../accessibility/AccessiblePresentationShape.cxx | 146 + .../accessibility/AccessibleSlideSorterObject.cxx | 428 + .../ui/accessibility/AccessibleSlideSorterView.cxx | 962 + .../ui/accessibility/AccessibleViewForwarder.cxx | 104 + sd/source/ui/accessibility/SdShapeTypes.cxx | 132 + sd/source/ui/animations/CustomAnimationDialog.cxx | 2082 ++ sd/source/ui/animations/CustomAnimationDialog.hxx | 141 + sd/source/ui/animations/CustomAnimationList.cxx | 1232 ++ sd/source/ui/animations/CustomAnimationPane.cxx | 2578 +++ sd/source/ui/animations/STLPropertySet.cxx | 113 + sd/source/ui/animations/STLPropertySet.hxx | 74 + sd/source/ui/animations/SlideTransitionPane.cxx | 1153 ++ sd/source/ui/animations/motionpathtag.cxx | 1197 ++ sd/source/ui/animations/motionpathtag.hxx | 114 + sd/source/ui/annotations/annotationmanager.cxx | 1231 ++ sd/source/ui/annotations/annotationmanagerimpl.hxx | 141 + sd/source/ui/annotations/annotationtag.cxx | 671 + sd/source/ui/annotations/annotationtag.hxx | 89 + sd/source/ui/annotations/annotationwindow.cxx | 800 + sd/source/ui/annotations/annotationwindow.hxx | 143 + sd/source/ui/app/optsitem.cxx | 1399 ++ sd/source/ui/app/scalectrl.cxx | 114 + sd/source/ui/app/sddll.cxx | 280 + sd/source/ui/app/sdmod.cxx | 216 + sd/source/ui/app/sdmod1.cxx | 645 + sd/source/ui/app/sdmod2.cxx | 816 + sd/source/ui/app/sdpopup.cxx | 318 + sd/source/ui/app/sdxfer.cxx | 780 + sd/source/ui/app/tmplctrl.cxx | 111 + sd/source/ui/controller/displaymodecontroller.cxx | 264 + sd/source/ui/controller/slidelayoutcontroller.cxx | 380 + sd/source/ui/controller/slidelayoutcontroller.hxx | 47 + sd/source/ui/dlg/AnimationChildWindow.cxx | 50 + sd/source/ui/dlg/BulletAndPositionDlg.cxx | 1292 ++ sd/source/ui/dlg/LayerTabBar.cxx | 438 + sd/source/ui/dlg/NavigatorChildWindow.cxx | 101 + sd/source/ui/dlg/PaneChildWindows.cxx | 107 + sd/source/ui/dlg/PaneShells.cxx | 79 + sd/source/ui/dlg/PhotoAlbumDialog.cxx | 775 + sd/source/ui/dlg/PhotoAlbumDialog.hxx | 91 + sd/source/ui/dlg/RemoteDialog.cxx | 48 + sd/source/ui/dlg/RemoteDialog.hxx | 32 + sd/source/ui/dlg/RemoteDialogClientBox.cxx | 135 + sd/source/ui/dlg/RemoteDialogClientBox.hxx | 85 + sd/source/ui/dlg/SpellDialogChildWindow.cxx | 172 + sd/source/ui/dlg/TemplateScanner.cxx | 343 + sd/source/ui/dlg/UndoThemeChange.cxx | 55 + sd/source/ui/dlg/animobjs.cxx | 1125 + sd/source/ui/dlg/brkdlg.cxx | 156 + sd/source/ui/dlg/copydlg.cxx | 263 + sd/source/ui/dlg/custsdlg.cxx | 474 + sd/source/ui/dlg/diactrl.cxx | 186 + sd/source/ui/dlg/dlgchar.cxx | 70 + sd/source/ui/dlg/dlgfield.cxx | 302 + sd/source/ui/dlg/dlgolbul.cxx | 172 + sd/source/ui/dlg/dlgpage.cxx | 109 + sd/source/ui/dlg/dlgsnap.cxx | 185 + sd/source/ui/dlg/filedlg.cxx | 267 + sd/source/ui/dlg/gluectrl.cxx | 200 + sd/source/ui/dlg/headerfooterdlg.cxx | 759 + sd/source/ui/dlg/ins_paste.cxx | 34 + sd/source/ui/dlg/inspagob.cxx | 126 + sd/source/ui/dlg/layeroptionsdlg.cxx | 62 + sd/source/ui/dlg/masterlayoutdlg.cxx | 133 + sd/source/ui/dlg/morphdlg.cxx | 107 + sd/source/ui/dlg/navigatr.cxx | 890 + sd/source/ui/dlg/paragr.cxx | 169 + sd/source/ui/dlg/present.cxx | 404 + sd/source/ui/dlg/prltempl.cxx | 304 + sd/source/ui/dlg/prntopts.cxx | 351 + sd/source/ui/dlg/sdabstdlg.cxx | 55 + sd/source/ui/dlg/sddlgfact.cxx | 712 + sd/source/ui/dlg/sddlgfact.hxx | 429 + sd/source/ui/dlg/sdpreslt.cxx | 281 + sd/source/ui/dlg/sdtreelb.cxx | 1396 ++ sd/source/ui/dlg/sduiexp.cxx | 33 + sd/source/ui/dlg/tabtempl.cxx | 160 + sd/source/ui/dlg/titledockwin.cxx | 332 + sd/source/ui/dlg/tpaction.cxx | 801 + sd/source/ui/dlg/tpoption.cxx | 805 + sd/source/ui/dlg/unchss.cxx | 119 + sd/source/ui/dlg/vectdlg.cxx | 336 + sd/source/ui/docshell/docshel2.cxx | 421 + sd/source/ui/docshell/docshel3.cxx | 439 + sd/source/ui/docshell/docshel4.cxx | 994 + sd/source/ui/docshell/docshell.cxx | 507 + sd/source/ui/docshell/grdocsh.cxx | 61 + sd/source/ui/docshell/sdclient.cxx | 191 + .../framework/configuration/ChangeRequestQueue.cxx | 28 + .../framework/configuration/ChangeRequestQueue.hxx | 48 + .../configuration/ChangeRequestQueueProcessor.cxx | 181 + .../configuration/ChangeRequestQueueProcessor.hxx | 126 + .../ui/framework/configuration/Configuration.cxx | 285 + .../configuration/ConfigurationClassifier.cxx | 167 + .../configuration/ConfigurationClassifier.hxx | 165 + .../configuration/ConfigurationController.cxx | 522 + .../ConfigurationControllerBroadcaster.cxx | 192 + .../ConfigurationControllerBroadcaster.hxx | 138 + .../ConfigurationControllerResourceManager.cxx | 304 + .../ConfigurationControllerResourceManager.hxx | 141 + .../configuration/ConfigurationTracer.cxx | 73 + .../configuration/ConfigurationTracer.hxx | 58 + .../configuration/ConfigurationUpdater.cxx | 378 + .../configuration/ConfigurationUpdater.hxx | 212 + .../GenericConfigurationChangeRequest.cxx | 81 + .../GenericConfigurationChangeRequest.hxx | 98 + .../configuration/ResourceFactoryManager.cxx | 195 + .../configuration/ResourceFactoryManager.hxx | 121 + .../ui/framework/configuration/ResourceId.cxx | 502 + .../ui/framework/configuration/UpdateRequest.cxx | 47 + .../ui/framework/configuration/UpdateRequest.hxx | 70 + .../ui/framework/configuration/debugtrace.hxx | 15 + .../ui/framework/factories/BasicPaneFactory.cxx | 407 + .../ui/framework/factories/BasicToolBarFactory.cxx | 144 + .../ui/framework/factories/BasicViewFactory.cxx | 495 + .../ui/framework/factories/ChildWindowPane.cxx | 214 + .../ui/framework/factories/ChildWindowPane.hxx | 101 + .../ui/framework/factories/FrameWindowPane.cxx | 39 + .../ui/framework/factories/FrameWindowPane.hxx | 50 + .../ui/framework/factories/FullScreenPane.cxx | 235 + .../ui/framework/factories/FullScreenPane.hxx | 86 + sd/source/ui/framework/factories/Pane.cxx | 165 + .../ui/framework/factories/PresentationFactory.cxx | 150 + .../ui/framework/factories/ViewShellWrapper.cxx | 239 + .../ui/framework/module/CenterViewFocusModule.cxx | 149 + .../ui/framework/module/CenterViewFocusModule.hxx | 91 + sd/source/ui/framework/module/DrawModule.cxx | 42 + sd/source/ui/framework/module/ImpressModule.cxx | 52 + sd/source/ui/framework/module/ModuleController.cxx | 160 + .../ui/framework/module/PresentationModule.cxx | 36 + sd/source/ui/framework/module/ShellStackGuard.cxx | 147 + sd/source/ui/framework/module/ShellStackGuard.hxx | 96 + .../ui/framework/module/SlideSorterModule.cxx | 313 + .../ui/framework/module/SlideSorterModule.hxx | 99 + sd/source/ui/framework/module/ToolBarModule.cxx | 189 + sd/source/ui/framework/module/ToolBarModule.hxx | 83 + sd/source/ui/framework/module/ViewTabBarModule.cxx | 179 + sd/source/ui/framework/module/ViewTabBarModule.hxx | 85 + sd/source/ui/framework/tools/FrameworkHelper.cxx | 938 + sd/source/ui/func/bulmaper.cxx | 99 + sd/source/ui/func/fuarea.cxx | 99 + sd/source/ui/func/fubullet.cxx | 330 + sd/source/ui/func/fuchar.cxx | 139 + sd/source/ui/func/fucon3d.cxx | 477 + sd/source/ui/func/fuconarc.cxx | 257 + sd/source/ui/func/fuconbez.cxx | 559 + sd/source/ui/func/fuconcs.cxx | 264 + sd/source/ui/func/fuconnct.cxx | 71 + sd/source/ui/func/fuconrec.cxx | 1076 + sd/source/ui/func/fuconstr.cxx | 392 + sd/source/ui/func/fuconuno.cxx | 153 + sd/source/ui/func/fucopy.cxx | 288 + sd/source/ui/func/fucushow.cxx | 91 + sd/source/ui/func/fudraw.cxx | 820 + sd/source/ui/func/fudspord.cxx | 131 + sd/source/ui/func/fuediglu.cxx | 471 + sd/source/ui/func/fuexecuteinteraction.cxx | 238 + sd/source/ui/func/fuexpand.cxx | 256 + sd/source/ui/func/fuformatpaintbrush.cxx | 300 + sd/source/ui/func/fuhhconv.cxx | 256 + sd/source/ui/func/fuinsert.cxx | 778 + sd/source/ui/func/fuinsfil.cxx | 724 + sd/source/ui/func/fuline.cxx | 109 + sd/source/ui/func/fulinend.cxx | 154 + sd/source/ui/func/fulink.cxx | 78 + sd/source/ui/func/fumeasur.cxx | 72 + sd/source/ui/func/fumorph.cxx | 506 + sd/source/ui/func/funavig.cxx | 154 + sd/source/ui/func/fuoaprms.cxx | 799 + sd/source/ui/func/fuolbull.cxx | 340 + sd/source/ui/func/fuoltext.cxx | 305 + sd/source/ui/func/fupage.cxx | 625 + sd/source/ui/func/fuparagr.cxx | 162 + sd/source/ui/func/fupoor.cxx | 1135 + sd/source/ui/func/fuprlout.cxx | 277 + sd/source/ui/func/fuprobjs.cxx | 154 + sd/source/ui/func/fuscale.cxx | 179 + sd/source/ui/func/fusearch.cxx | 140 + sd/source/ui/func/fusel.cxx | 1331 ++ sd/source/ui/func/fusldlg.cxx | 226 + sd/source/ui/func/fusnapln.cxx | 195 + sd/source/ui/func/fusumry.cxx | 229 + sd/source/ui/func/futempl.cxx | 638 + sd/source/ui/func/futext.cxx | 1416 ++ sd/source/ui/func/futhes.cxx | 132 + sd/source/ui/func/futransf.cxx | 132 + sd/source/ui/func/futxtatt.cxx | 80 + sd/source/ui/func/fuvect.cxx | 87 + sd/source/ui/func/fuzoom.cxx | 219 + sd/source/ui/func/sdundogr.cxx | 66 + sd/source/ui/func/smarttag.cxx | 334 + sd/source/ui/func/undoback.cxx | 105 + sd/source/ui/func/undoheaderfooter.cxx | 54 + sd/source/ui/func/undolayer.cxx | 79 + sd/source/ui/func/undopage.cxx | 99 + sd/source/ui/func/unmovss.cxx | 95 + sd/source/ui/func/unoaprms.cxx | 96 + sd/source/ui/func/unprlout.cxx | 73 + sd/source/ui/inc/AccessibleDocumentViewBase.hxx | 324 + sd/source/ui/inc/AccessibleDrawDocumentView.hxx | 165 + sd/source/ui/inc/AccessibleOutlineEditSource.hxx | 90 + sd/source/ui/inc/AccessibleOutlineView.hxx | 119 + sd/source/ui/inc/AccessiblePageShape.hxx | 117 + .../ui/inc/AccessiblePresentationGraphicShape.hxx | 60 + .../ui/inc/AccessiblePresentationOLEShape.hxx | 57 + sd/source/ui/inc/AccessiblePresentationShape.hxx | 61 + sd/source/ui/inc/AccessibleSlideSorterObject.hxx | 189 + sd/source/ui/inc/AccessibleSlideSorterView.hxx | 253 + sd/source/ui/inc/AccessibleViewForwarder.hxx | 92 + sd/source/ui/inc/AnimationChildWindow.hxx | 45 + sd/source/ui/inc/BezierObjectBar.hxx | 51 + sd/source/ui/inc/BreakDlg.hxx | 64 + sd/source/ui/inc/BulletAndPositionDlg.hxx | 156 + sd/source/ui/inc/Client.hxx | 45 + sd/source/ui/inc/ClientView.hxx | 43 + sd/source/ui/inc/CustomAnimationList.hxx | 169 + sd/source/ui/inc/CustomAnimationPane.hxx | 179 + sd/source/ui/inc/DocumentRenderer.hxx | 63 + sd/source/ui/inc/DrawController.hxx | 320 + sd/source/ui/inc/DrawDocShell.hxx | 236 + sd/source/ui/inc/DrawSubController.hxx | 41 + sd/source/ui/inc/DrawViewShell.hxx | 505 + sd/source/ui/inc/EventMultiplexer.hxx | 172 + sd/source/ui/inc/FormShellManager.hxx | 142 + sd/source/ui/inc/FrameView.hxx | 213 + sd/source/ui/inc/GraphicDocShell.hxx | 54 + sd/source/ui/inc/GraphicObjectBar.hxx | 54 + sd/source/ui/inc/GraphicViewShell.hxx | 72 + sd/source/ui/inc/GraphicViewShellBase.hxx | 50 + sd/source/ui/inc/ImpressViewShellBase.hxx | 50 + sd/source/ui/inc/LayerTabBar.hxx | 108 + sd/source/ui/inc/MasterPageObserver.hxx | 119 + sd/source/ui/inc/MediaObjectBar.hxx | 56 + sd/source/ui/inc/NavigatorChildWindow.hxx | 40 + sd/source/ui/inc/OutlineBulletDlg.hxx | 51 + sd/source/ui/inc/OutlineView.hxx | 230 + sd/source/ui/inc/OutlineViewShell.hxx | 163 + sd/source/ui/inc/OutlineViewShellBase.hxx | 43 + sd/source/ui/inc/OutlinerIteratorImpl.hxx | 239 + sd/source/ui/inc/PaneChildWindows.hxx | 65 + sd/source/ui/inc/PaneShells.hxx | 63 + sd/source/ui/inc/PresentationViewShell.hxx | 70 + sd/source/ui/inc/PresentationViewShellBase.hxx | 46 + sd/source/ui/inc/PreviewRenderer.hxx | 141 + sd/source/ui/inc/RemoteServer.hxx | 98 + sd/source/ui/inc/Ruler.hxx | 62 + sd/source/ui/inc/SdUnoDrawView.hxx | 113 + sd/source/ui/inc/SdUnoOutlineView.hxx | 77 + sd/source/ui/inc/SdUnoSlideView.hxx | 80 + sd/source/ui/inc/ShellFactory.hxx | 52 + sd/source/ui/inc/SlideSorter.hxx | 208 + sd/source/ui/inc/SlideSorterViewShell.hxx | 232 + sd/source/ui/inc/SlideSorterViewShellBase.hxx | 43 + sd/source/ui/inc/SlideTransitionPane.hxx | 135 + sd/source/ui/inc/SpellDialogChildWindow.hxx | 86 + sd/source/ui/inc/TabControl.hxx | 107 + sd/source/ui/inc/TableDesignPane.hxx | 133 + sd/source/ui/inc/TemplateScanner.hxx | 176 + sd/source/ui/inc/TextObjectBar.hxx | 58 + sd/source/ui/inc/ToolBarManager.hxx | 274 + sd/source/ui/inc/UndoThemeChange.hxx | 39 + sd/source/ui/inc/View.hxx | 300 + sd/source/ui/inc/ViewClipboard.hxx | 78 + sd/source/ui/inc/ViewShell.hxx | 559 + sd/source/ui/inc/ViewShellBase.hxx | 252 + sd/source/ui/inc/ViewShellHint.hxx | 57 + sd/source/ui/inc/ViewShellImplementation.hxx | 150 + sd/source/ui/inc/ViewShellManager.hxx | 196 + sd/source/ui/inc/ViewTabBar.hxx | 177 + sd/source/ui/inc/Window.hxx | 207 + sd/source/ui/inc/WindowUpdater.hxx | 124 + sd/source/ui/inc/animobjs.hxx | 163 + sd/source/ui/inc/annotationmanager.hxx | 46 + sd/source/ui/inc/bulmaper.hxx | 37 + sd/source/ui/inc/copydlg.hxx | 67 + sd/source/ui/inc/createtableobjectbar.hxx | 37 + sd/source/ui/inc/custsdlg.hxx | 87 + sd/source/ui/inc/diactrl.hxx | 68 + sd/source/ui/inc/dlg_char.hxx | 41 + sd/source/ui/inc/dlgfield.hxx | 56 + sd/source/ui/inc/dlgpage.hxx | 48 + sd/source/ui/inc/dlgsnap.hxx | 66 + sd/source/ui/inc/drawview.hxx | 72 + sd/source/ui/inc/filedlg.hxx | 57 + sd/source/ui/inc/framework/Configuration.hxx | 174 + .../ui/inc/framework/ConfigurationController.hxx | 177 + sd/source/ui/inc/framework/DrawModule.hxx | 51 + sd/source/ui/inc/framework/FrameworkHelper.hxx | 342 + sd/source/ui/inc/framework/ImpressModule.hxx | 51 + sd/source/ui/inc/framework/ModuleController.hxx | 91 + sd/source/ui/inc/framework/Pane.hxx | 133 + sd/source/ui/inc/framework/PresentationFactory.hxx | 81 + sd/source/ui/inc/framework/PresentationModule.hxx | 51 + sd/source/ui/inc/framework/ResourceId.hxx | 213 + sd/source/ui/inc/framework/ViewShellWrapper.hxx | 123 + .../inc/framework/factories/BasicPaneFactory.hxx | 127 + .../framework/factories/BasicToolBarFactory.hxx | 80 + .../inc/framework/factories/BasicViewFactory.hxx | 125 + sd/source/ui/inc/fuarea.hxx | 48 + sd/source/ui/inc/fubullet.hxx | 54 + sd/source/ui/inc/fuchar.hxx | 49 + sd/source/ui/inc/fucon3d.hxx | 61 + sd/source/ui/inc/fuconarc.hxx | 54 + sd/source/ui/inc/fuconbez.hxx | 76 + sd/source/ui/inc/fuconcs.hxx | 64 + sd/source/ui/inc/fuconnct.hxx | 46 + sd/source/ui/inc/fuconrec.hxx | 71 + sd/source/ui/inc/fuconstr.hxx | 67 + sd/source/ui/inc/fuconuno.hxx | 64 + sd/source/ui/inc/fucopy.hxx | 47 + sd/source/ui/inc/fucushow.hxx | 45 + sd/source/ui/inc/fudraw.hxx | 85 + sd/source/ui/inc/fudspord.hxx | 62 + sd/source/ui/inc/fuediglu.hxx | 64 + sd/source/ui/inc/fuexecuteinteraction.hxx | 44 + sd/source/ui/inc/fuexpand.hxx | 45 + sd/source/ui/inc/fuformatpaintbrush.hxx | 61 + sd/source/ui/inc/fuhhconv.hxx | 58 + sd/source/ui/inc/fuinsert.hxx | 112 + sd/source/ui/inc/fuinsfil.hxx | 60 + sd/source/ui/inc/fuline.hxx | 49 + sd/source/ui/inc/fulinend.hxx | 49 + sd/source/ui/inc/fulink.hxx | 46 + sd/source/ui/inc/fumeasur.hxx | 46 + sd/source/ui/inc/fumorph.hxx | 90 + sd/source/ui/inc/funavig.hxx | 46 + sd/source/ui/inc/fuoaprms.hxx | 46 + sd/source/ui/inc/fuolbull.hxx | 62 + sd/source/ui/inc/fuoltext.hxx | 76 + sd/source/ui/inc/fupage.hxx | 73 + sd/source/ui/inc/fuparagr.hxx | 48 + sd/source/ui/inc/fupoor.hxx | 179 + sd/source/ui/inc/fuprlout.hxx | 51 + sd/source/ui/inc/fuprobjs.hxx | 51 + sd/source/ui/inc/fuscale.hxx | 45 + sd/source/ui/inc/fusearch.hxx | 56 + sd/source/ui/inc/fusel.hxx | 104 + sd/source/ui/inc/fusldlg.hxx | 45 + sd/source/ui/inc/fusnapln.hxx | 48 + sd/source/ui/inc/fusumry.hxx | 45 + sd/source/ui/inc/futempl.hxx | 48 + sd/source/ui/inc/futext.hxx | 96 + sd/source/ui/inc/futhes.hxx | 45 + sd/source/ui/inc/futransf.hxx | 45 + sd/source/ui/inc/futxtatt.hxx | 45 + sd/source/ui/inc/fuvect.hxx | 46 + sd/source/ui/inc/fuzoom.hxx | 64 + sd/source/ui/inc/gluectrl.hxx | 68 + sd/source/ui/inc/headerfooterdlg.hxx | 70 + sd/source/ui/inc/ins_paste.hxx | 37 + sd/source/ui/inc/inspagob.hxx | 57 + sd/source/ui/inc/layeroptionsdlg.hxx | 48 + sd/source/ui/inc/masterlayoutdlg.hxx | 61 + sd/source/ui/inc/morphdlg.hxx | 49 + sd/source/ui/inc/navigatr.hxx | 209 + sd/source/ui/inc/optsitem.hxx | 575 + sd/source/ui/inc/paragr.hxx | 36 + sd/source/ui/inc/pgjump.hxx | 31 + sd/source/ui/inc/present.hxx | 100 + sd/source/ui/inc/prltempl.hxx | 64 + sd/source/ui/inc/prntopts.hxx | 83 + sd/source/ui/inc/registerinterfaces.hxx | 30 + sd/source/ui/inc/scalectrl.hxx | 39 + sd/source/ui/inc/sdpopup.hxx | 47 + sd/source/ui/inc/sdpreslt.hxx | 71 + sd/source/ui/inc/sdtreelb.hxx | 455 + sd/source/ui/inc/sdundogr.hxx | 46 + sd/source/ui/inc/sdxfer.hxx | 145 + sd/source/ui/inc/slideshow.hxx | 216 + sd/source/ui/inc/smarttag.hxx | 170 + sd/source/ui/inc/tablefunction.hxx | 32 + sd/source/ui/inc/tabtempl.hxx | 57 + sd/source/ui/inc/titledockwin.hxx | 116 + sd/source/ui/inc/tmplctrl.hxx | 40 + sd/source/ui/inc/tools/AsynchronousCall.hxx | 77 + sd/source/ui/inc/tools/AsynchronousTask.hxx | 49 + sd/source/ui/inc/tools/ConfigurationAccess.hxx | 106 + sd/source/ui/inc/tools/GraphicSizeCheck.hxx | 116 + sd/source/ui/inc/tools/IconCache.hxx | 70 + sd/source/ui/inc/tools/IdleDetection.hxx | 89 + .../ui/inc/tools/SdGlobalResourceContainer.hxx | 105 + sd/source/ui/inc/tools/SlotStateListener.hxx | 138 + sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx | 89 + sd/source/ui/inc/tpaction.hxx | 104 + sd/source/ui/inc/tpoption.hxx | 159 + sd/source/ui/inc/uiobject.hxx | 35 + sd/source/ui/inc/unchss.hxx | 47 + sd/source/ui/inc/undoback.hxx | 58 + sd/source/ui/inc/undoheaderfooter.hxx | 45 + sd/source/ui/inc/undolayer.hxx | 56 + sd/source/ui/inc/undopage.hxx | 161 + sd/source/ui/inc/unmodpg.hxx | 102 + sd/source/ui/inc/unmovss.hxx | 44 + sd/source/ui/inc/unoaprms.hxx | 148 + sd/source/ui/inc/unokywds.hxx | 115 + sd/source/ui/inc/unomodel.hxx | 486 + sd/source/ui/inc/unopage.hxx | 302 + sd/source/ui/inc/unoprnms.hxx | 73 + sd/source/ui/inc/unosrch.hxx | 131 + sd/source/ui/inc/unprlout.hxx | 55 + sd/source/ui/inc/vectdlg.hxx | 81 + sd/source/ui/inc/view/viewoverlaymanager.hxx | 71 + sd/source/ui/inc/zoomlist.hxx | 50 + sd/source/ui/presenter/CanvasUpdateRequester.cxx | 131 + sd/source/ui/presenter/CanvasUpdateRequester.hxx | 72 + sd/source/ui/presenter/PresenterCanvas.cxx | 791 + sd/source/ui/presenter/PresenterCanvas.hxx | 320 + sd/source/ui/presenter/PresenterHelper.cxx | 479 + sd/source/ui/presenter/PresenterHelper.hxx | 99 + sd/source/ui/presenter/PresenterPreviewCache.cxx | 373 + sd/source/ui/presenter/PresenterPreviewCache.hxx | 103 + sd/source/ui/presenter/SlideRenderer.cxx | 201 + sd/source/ui/presenter/SlideRenderer.hxx | 94 + sd/source/ui/remotecontrol/AvahiNetworkService.cxx | 209 + sd/source/ui/remotecontrol/AvahiNetworkService.hxx | 25 + sd/source/ui/remotecontrol/BluetoothServer.cxx | 1535 ++ sd/source/ui/remotecontrol/BluetoothServer.hxx | 61 + sd/source/ui/remotecontrol/BluetoothServer.mm | 1 + .../ui/remotecontrol/BluetoothServiceRecord.hxx | 75 + .../ui/remotecontrol/BufferedStreamSocket.cxx | 130 + .../ui/remotecontrol/BufferedStreamSocket.hxx | 66 + sd/source/ui/remotecontrol/Communicator.cxx | 157 + sd/source/ui/remotecontrol/Communicator.hxx | 52 + sd/source/ui/remotecontrol/DiscoveryService.cxx | 186 + sd/source/ui/remotecontrol/DiscoveryService.hxx | 40 + sd/source/ui/remotecontrol/DiscoveryService.mm | 1 + sd/source/ui/remotecontrol/IBluetoothSocket.hxx | 42 + sd/source/ui/remotecontrol/ImagePreparer.cxx | 253 + sd/source/ui/remotecontrol/ImagePreparer.hxx | 44 + sd/source/ui/remotecontrol/Listener.cxx | 134 + sd/source/ui/remotecontrol/Listener.hxx | 62 + sd/source/ui/remotecontrol/OSXBluetooth.h | 30 + sd/source/ui/remotecontrol/OSXBluetooth.mm | 53 + sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx | 38 + sd/source/ui/remotecontrol/OSXNetworkService.h | 30 + sd/source/ui/remotecontrol/OSXNetworkService.hxx | 43 + sd/source/ui/remotecontrol/OSXNetworkService.mm | 43 + sd/source/ui/remotecontrol/Receiver.cxx | 228 + sd/source/ui/remotecontrol/Receiver.hxx | 37 + sd/source/ui/remotecontrol/Server.cxx | 379 + sd/source/ui/remotecontrol/Transmitter.cxx | 99 + sd/source/ui/remotecontrol/Transmitter.hxx | 55 + sd/source/ui/remotecontrol/WINNetworkService.cxx | 19 + sd/source/ui/remotecontrol/WINNetworkService.hxx | 23 + sd/source/ui/remotecontrol/ZeroconfService.hxx | 50 + sd/source/ui/sidebar/AllMasterPagesSelector.cxx | 180 + sd/source/ui/sidebar/AllMasterPagesSelector.hxx | 80 + .../ui/sidebar/CurrentMasterPagesSelector.cxx | 263 + .../ui/sidebar/CurrentMasterPagesSelector.hxx | 77 + sd/source/ui/sidebar/DocumentHelper.cxx | 536 + sd/source/ui/sidebar/DocumentHelper.hxx | 108 + sd/source/ui/sidebar/IDisposable.hxx | 31 + sd/source/ui/sidebar/ISidebarReceiver.hxx | 31 + sd/source/ui/sidebar/LayoutMenu.cxx | 721 + sd/source/ui/sidebar/LayoutMenu.hxx | 157 + sd/source/ui/sidebar/MasterPageContainer.cxx | 958 + sd/source/ui/sidebar/MasterPageContainer.hxx | 199 + sd/source/ui/sidebar/MasterPageContainerFiller.cxx | 168 + sd/source/ui/sidebar/MasterPageContainerFiller.hxx | 92 + .../ui/sidebar/MasterPageContainerProviders.cxx | 206 + .../ui/sidebar/MasterPageContainerProviders.hxx | 175 + sd/source/ui/sidebar/MasterPageContainerQueue.cxx | 264 + sd/source/ui/sidebar/MasterPageContainerQueue.hxx | 131 + sd/source/ui/sidebar/MasterPageDescriptor.cxx | 342 + sd/source/ui/sidebar/MasterPageDescriptor.hxx | 231 + sd/source/ui/sidebar/MasterPageObserver.cxx | 297 + sd/source/ui/sidebar/MasterPagesSelector.cxx | 620 + sd/source/ui/sidebar/MasterPagesSelector.hxx | 180 + sd/source/ui/sidebar/NavigatorWrapper.cxx | 49 + sd/source/ui/sidebar/NavigatorWrapper.hxx | 57 + sd/source/ui/sidebar/PageMarginUtils.hxx | 159 + sd/source/ui/sidebar/PanelFactory.cxx | 154 + sd/source/ui/sidebar/PanelFactory.hxx | 54 + sd/source/ui/sidebar/PreviewValueSet.cxx | 127 + sd/source/ui/sidebar/PreviewValueSet.hxx | 59 + sd/source/ui/sidebar/RecentMasterPagesSelector.cxx | 138 + sd/source/ui/sidebar/RecentMasterPagesSelector.hxx | 71 + sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx | 365 + sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx | 126 + sd/source/ui/sidebar/SlideBackground.cxx | 1314 ++ sd/source/ui/sidebar/SlideBackground.hxx | 185 + sd/source/ui/slideshow/PaneHider.cxx | 99 + sd/source/ui/slideshow/PaneHider.hxx | 66 + sd/source/ui/slideshow/SlideShowRestarter.cxx | 157 + sd/source/ui/slideshow/SlideShowRestarter.hxx | 87 + sd/source/ui/slideshow/showwin.cxx | 633 + sd/source/ui/slideshow/showwindow.hxx | 110 + sd/source/ui/slideshow/slideshow.cxx | 1189 ++ sd/source/ui/slideshow/slideshowimpl.cxx | 3619 ++++ sd/source/ui/slideshow/slideshowimpl.hxx | 355 + sd/source/ui/slideshow/slideshowviewimpl.cxx | 626 + sd/source/ui/slideshow/slideshowviewimpl.hxx | 182 + sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx | 562 + sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx | 214 + .../ui/slidesorter/cache/SlsBitmapCompressor.cxx | 197 + .../ui/slidesorter/cache/SlsBitmapCompressor.hxx | 138 + .../ui/slidesorter/cache/SlsBitmapFactory.cxx | 71 + .../ui/slidesorter/cache/SlsBitmapFactory.hxx | 46 + .../ui/slidesorter/cache/SlsCacheCompactor.cxx | 190 + .../ui/slidesorter/cache/SlsCacheCompactor.hxx | 87 + .../ui/slidesorter/cache/SlsCacheConfiguration.cxx | 144 + .../ui/slidesorter/cache/SlsCacheConfiguration.hxx | 68 + .../ui/slidesorter/cache/SlsGenericPageCache.cxx | 278 + .../ui/slidesorter/cache/SlsGenericPageCache.hxx | 152 + sd/source/ui/slidesorter/cache/SlsPageCache.cxx | 109 + .../ui/slidesorter/cache/SlsPageCacheManager.cxx | 424 + .../ui/slidesorter/cache/SlsQueueProcessor.cxx | 177 + .../ui/slidesorter/cache/SlsQueueProcessor.hxx | 98 + .../ui/slidesorter/cache/SlsRequestFactory.cxx | 50 + .../ui/slidesorter/cache/SlsRequestFactory.hxx | 36 + .../slidesorter/cache/SlsRequestPriorityClass.hxx | 44 + sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx | 276 + sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx | 122 + .../controller/SlideSorterController.cxx | 910 + .../controller/SlsAnimationFunction.cxx | 129 + .../ui/slidesorter/controller/SlsAnimator.cxx | 281 + .../ui/slidesorter/controller/SlsClipboard.cxx | 919 + .../controller/SlsCurrentSlideManager.cxx | 256 + .../controller/SlsDragAndDropContext.cxx | 117 + .../controller/SlsDragAndDropContext.hxx | 68 + .../ui/slidesorter/controller/SlsFocusManager.cxx | 245 + .../controller/SlsInsertionIndicatorHandler.cxx | 244 + .../ui/slidesorter/controller/SlsListener.cxx | 597 + .../ui/slidesorter/controller/SlsListener.hxx | 164 + .../ui/slidesorter/controller/SlsPageSelector.cxx | 386 + .../ui/slidesorter/controller/SlsProperties.cxx | 50 + .../slidesorter/controller/SlsScrollBarManager.cxx | 583 + .../controller/SlsSelectionFunction.cxx | 1476 ++ .../slidesorter/controller/SlsSelectionManager.cxx | 309 + .../controller/SlsSelectionObserver.cxx | 139 + .../ui/slidesorter/controller/SlsSlotManager.cxx | 1305 ++ .../slidesorter/controller/SlsTransferableData.cxx | 86 + .../controller/SlsVisibleAreaManager.cxx | 234 + .../ui/slidesorter/inc/cache/SlsCacheContext.hxx | 98 + .../ui/slidesorter/inc/cache/SlsPageCache.hxx | 141 + .../slidesorter/inc/cache/SlsPageCacheManager.hxx | 155 + .../inc/controller/SlideSorterController.hxx | 327 + .../inc/controller/SlsAnimationFunction.hxx | 77 + .../ui/slidesorter/inc/controller/SlsAnimator.hxx | 122 + .../ui/slidesorter/inc/controller/SlsClipboard.hxx | 208 + .../inc/controller/SlsCurrentSlideManager.hxx | 112 + .../slidesorter/inc/controller/SlsFocusManager.hxx | 214 + .../controller/SlsInsertionIndicatorHandler.hxx | 138 + .../slidesorter/inc/controller/SlsPageSelector.hxx | 219 + .../slidesorter/inc/controller/SlsProperties.hxx | 55 + .../inc/controller/SlsScrollBarManager.hxx | 242 + .../inc/controller/SlsSelectionFunction.hxx | 145 + .../inc/controller/SlsSelectionManager.hxx | 139 + .../inc/controller/SlsSelectionObserver.hxx | 77 + .../slidesorter/inc/controller/SlsSlotManager.hxx | 98 + .../inc/controller/SlsTransferableData.hxx | 78 + .../inc/controller/SlsVisibleAreaManager.hxx | 90 + .../ui/slidesorter/inc/model/SlideSorterModel.hxx | 227 + .../ui/slidesorter/inc/model/SlsEnumeration.hxx | 44 + .../ui/slidesorter/inc/model/SlsPageDescriptor.hxx | 144 + .../slidesorter/inc/model/SlsPageEnumeration.hxx | 95 + .../inc/model/SlsPageEnumerationProvider.hxx | 51 + .../inc/model/SlsSharedPageDescriptor.hxx | 32 + .../ui/slidesorter/inc/model/SlsVisualState.hxx | 47 + .../ui/slidesorter/inc/view/SlideSorterView.hxx | 225 + .../ui/slidesorter/inc/view/SlsILayerPainter.hxx | 53 + .../ui/slidesorter/inc/view/SlsInsertAnimator.hxx | 59 + .../inc/view/SlsInsertionIndicatorOverlay.hxx | 101 + sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx | 237 + .../slidesorter/inc/view/SlsPageObjectLayouter.hxx | 144 + .../slidesorter/inc/view/SlsPageObjectPainter.hxx | 119 + sd/source/ui/slidesorter/inc/view/SlsTheme.hxx | 135 + sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx | 75 + .../ui/slidesorter/model/SlideSorterModel.cxx | 676 + .../ui/slidesorter/model/SlsPageDescriptor.cxx | 226 + .../ui/slidesorter/model/SlsPageEnumeration.cxx | 202 + .../model/SlsPageEnumerationProvider.cxx | 81 + sd/source/ui/slidesorter/model/SlsVisualState.cxx | 40 + sd/source/ui/slidesorter/shell/SlideSorter.cxx | 318 + .../ui/slidesorter/shell/SlideSorterViewShell.cxx | 923 + sd/source/ui/slidesorter/view/SlideSorterView.cxx | 856 + sd/source/ui/slidesorter/view/SlsFramePainter.cxx | 225 + sd/source/ui/slidesorter/view/SlsFramePainter.hxx | 109 + .../ui/slidesorter/view/SlsInsertAnimator.cxx | 428 + .../view/SlsInsertionIndicatorOverlay.cxx | 360 + sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx | 492 + sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx | 84 + sd/source/ui/slidesorter/view/SlsLayouter.cxx | 1226 ++ .../ui/slidesorter/view/SlsPageObjectLayouter.cxx | 259 + .../ui/slidesorter/view/SlsPageObjectPainter.cxx | 442 + sd/source/ui/slidesorter/view/SlsTheme.cxx | 239 + sd/source/ui/slidesorter/view/SlsToolTip.cxx | 160 + .../ui/slidesorter/view/SlsViewCacheContext.cxx | 117 + .../ui/slidesorter/view/SlsViewCacheContext.hxx | 61 + sd/source/ui/table/TableDesignPane.cxx | 1077 + sd/source/ui/table/tablefunction.cxx | 293 + sd/source/ui/table/tableobjectbar.cxx | 224 + sd/source/ui/table/tableobjectbar.hxx | 56 + sd/source/ui/tools/AsynchronousCall.cxx | 56 + sd/source/ui/tools/ConfigurationAccess.cxx | 113 + sd/source/ui/tools/EventMultiplexer.cxx | 658 + sd/source/ui/tools/GraphicSizeCheck.cxx | 217 + sd/source/ui/tools/IconCache.cxx | 106 + sd/source/ui/tools/IdleDetection.cxx | 103 + sd/source/ui/tools/PreviewRenderer.cxx | 524 + sd/source/ui/tools/SdGlobalResourceContainer.cxx | 198 + sd/source/ui/tools/SlotStateListener.cxx | 153 + sd/source/ui/tools/TimerBasedTaskExecution.cxx | 131 + sd/source/ui/uitest/uiobject.cxx | 176 + sd/source/ui/unoidl/DrawController.cxx | 792 + sd/source/ui/unoidl/SdUnoDrawView.cxx | 547 + sd/source/ui/unoidl/SdUnoOutlineView.cxx | 151 + sd/source/ui/unoidl/SdUnoSlideView.cxx | 171 + sd/source/ui/unoidl/UnoDocumentSettings.cxx | 1431 ++ sd/source/ui/unoidl/UnoDocumentSettings.hxx | 37 + sd/source/ui/unoidl/randomnode.cxx | 569 + sd/source/ui/unoidl/sddetect.cxx | 160 + sd/source/ui/unoidl/sddetect.hxx | 48 + sd/source/ui/unoidl/unocpres.cxx | 451 + sd/source/ui/unoidl/unocpres.hxx | 142 + sd/source/ui/unoidl/unodoc.cxx | 73 + sd/source/ui/unoidl/unolayer.cxx | 702 + sd/source/ui/unoidl/unolayer.hxx | 161 + sd/source/ui/unoidl/unomodel.cxx | 3786 ++++ sd/source/ui/unoidl/unomodule.cxx | 132 + sd/source/ui/unoidl/unomodule.hxx | 57 + sd/source/ui/unoidl/unoobj.cxx | 1618 ++ sd/source/ui/unoidl/unoobj.hxx | 100 + sd/source/ui/unoidl/unopage.cxx | 3077 +++ sd/source/ui/unoidl/unopback.cxx | 407 + sd/source/ui/unoidl/unopback.hxx | 84 + sd/source/ui/unoidl/unopool.cxx | 89 + sd/source/ui/unoidl/unopool.hxx | 29 + sd/source/ui/unoidl/unosrch.cxx | 776 + sd/source/ui/unoidl/unowcntr.cxx | 99 + sd/source/ui/unoidl/unowcntr.hxx | 47 + sd/source/ui/view/DocumentRenderer.cxx | 2253 ++ sd/source/ui/view/FormShellManager.cxx | 324 + sd/source/ui/view/GraphicObjectBar.cxx | 141 + sd/source/ui/view/GraphicViewShellBase.cxx | 94 + sd/source/ui/view/ImpressViewShellBase.cxx | 97 + sd/source/ui/view/MediaObjectBar.cxx | 77 + sd/source/ui/view/OutlineViewShellBase.cxx | 66 + sd/source/ui/view/Outliner.cxx | 2066 ++ sd/source/ui/view/OutlinerIterator.cxx | 800 + sd/source/ui/view/PresentationViewShellBase.cxx | 94 + sd/source/ui/view/SlideSorterViewShellBase.cxx | 68 + sd/source/ui/view/ToolBarManager.cxx | 1381 ++ sd/source/ui/view/ViewClipboard.cxx | 240 + sd/source/ui/view/ViewShellBase.cxx | 1515 ++ sd/source/ui/view/ViewShellHint.cxx | 31 + sd/source/ui/view/ViewShellImplementation.cxx | 380 + sd/source/ui/view/ViewShellManager.cxx | 1168 ++ sd/source/ui/view/ViewTabBar.cxx | 536 + sd/source/ui/view/WindowUpdater.cxx | 130 + sd/source/ui/view/clview.cxx | 62 + sd/source/ui/view/drawview.cxx | 621 + sd/source/ui/view/drbezob.cxx | 320 + sd/source/ui/view/drtxtob.cxx | 627 + sd/source/ui/view/drtxtob1.cxx | 803 + sd/source/ui/view/drviews1.cxx | 1382 ++ sd/source/ui/view/drviews2.cxx | 4018 ++++ sd/source/ui/view/drviews3.cxx | 1106 + sd/source/ui/view/drviews4.cxx | 971 + sd/source/ui/view/drviews5.cxx | 653 + sd/source/ui/view/drviews6.cxx | 337 + sd/source/ui/view/drviews7.cxx | 1974 ++ sd/source/ui/view/drviews8.cxx | 135 + sd/source/ui/view/drviews9.cxx | 905 + sd/source/ui/view/drviewsa.cxx | 873 + sd/source/ui/view/drviewsb.cxx | 205 + sd/source/ui/view/drviewsc.cxx | 72 + sd/source/ui/view/drviewsd.cxx | 191 + sd/source/ui/view/drviewse.cxx | 1719 ++ sd/source/ui/view/drviewsf.cxx | 844 + sd/source/ui/view/drviewsg.cxx | 232 + sd/source/ui/view/drviewsh.cxx | 203 + sd/source/ui/view/drviewsi.cxx | 165 + sd/source/ui/view/drviewsj.cxx | 567 + sd/source/ui/view/drviewsk.cxx | 60 + sd/source/ui/view/drvwshrg.cxx | 110 + sd/source/ui/view/frmview.cxx | 919 + sd/source/ui/view/grviewsh.cxx | 88 + sd/source/ui/view/outlnvs2.cxx | 637 + sd/source/ui/view/outlnvsh.cxx | 1886 ++ sd/source/ui/view/outlview.cxx | 1713 ++ sd/source/ui/view/presvish.cxx | 172 + sd/source/ui/view/sdruler.cxx | 148 + sd/source/ui/view/sdview.cxx | 1397 ++ sd/source/ui/view/sdview2.cxx | 910 + sd/source/ui/view/sdview3.cxx | 1620 ++ sd/source/ui/view/sdview4.cxx | 641 + sd/source/ui/view/sdview5.cxx | 118 + sd/source/ui/view/sdwindow.cxx | 1058 + sd/source/ui/view/tabcontr.cxx | 358 + sd/source/ui/view/unmodpg.cxx | 274 + sd/source/ui/view/viewoverlaymanager.cxx | 545 + sd/source/ui/view/viewshe2.cxx | 949 + sd/source/ui/view/viewshe3.cxx | 386 + sd/source/ui/view/viewshel.cxx | 1659 ++ sd/source/ui/view/zoomlist.cxx | 94 + sd/uiconfig/sdraw/menubar/menubar.xml | 650 + sd/uiconfig/sdraw/popupmenu/3dobject.xml | 55 + sd/uiconfig/sdraw/popupmenu/3dscene.xml | 47 + sd/uiconfig/sdraw/popupmenu/3dscene2.xml | 48 + sd/uiconfig/sdraw/popupmenu/bezier.xml | 26 + sd/uiconfig/sdraw/popupmenu/connector.xml | 51 + sd/uiconfig/sdraw/popupmenu/curve.xml | 62 + sd/uiconfig/sdraw/popupmenu/draw.xml | 60 + sd/uiconfig/sdraw/popupmenu/drawtext.xml | 29 + sd/uiconfig/sdraw/popupmenu/form.xml | 42 + sd/uiconfig/sdraw/popupmenu/formrichtext.xml | 46 + sd/uiconfig/sdraw/popupmenu/gluepoint.xml | 27 + sd/uiconfig/sdraw/popupmenu/graphic.xml | 69 + sd/uiconfig/sdraw/popupmenu/group.xml | 56 + sd/uiconfig/sdraw/popupmenu/layertab.xml | 16 + sd/uiconfig/sdraw/popupmenu/line.xml | 55 + sd/uiconfig/sdraw/popupmenu/measure.xml | 62 + sd/uiconfig/sdraw/popupmenu/media.xml | 34 + sd/uiconfig/sdraw/popupmenu/multiselect.xml | 76 + sd/uiconfig/sdraw/popupmenu/notebookbar.xml | 24 + sd/uiconfig/sdraw/popupmenu/objectalign.xml | 18 + sd/uiconfig/sdraw/popupmenu/oleobject.xml | 57 + sd/uiconfig/sdraw/popupmenu/page.xml | 52 + sd/uiconfig/sdraw/popupmenu/pagepane.xml | 19 + sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml | 20 + sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml | 16 + .../sdraw/popupmenu/pagepanenoselmaster.xml | 16 + sd/uiconfig/sdraw/popupmenu/pagetab.xml | 18 + sd/uiconfig/sdraw/popupmenu/table.xml | 69 + sd/uiconfig/sdraw/popupmenu/textbox.xml | 54 + sd/uiconfig/sdraw/statusbar/statusbar.xml | 31 + sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml | 30 + sd/uiconfig/sdraw/toolbar/alignmentbar.xml | 28 + sd/uiconfig/sdraw/toolbar/arrowsbar.xml | 33 + sd/uiconfig/sdraw/toolbar/arrowshapes.xml | 51 + sd/uiconfig/sdraw/toolbar/basicshapes.xml | 48 + sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml | 37 + sd/uiconfig/sdraw/toolbar/calloutshapes.xml | 29 + sd/uiconfig/sdraw/toolbar/choosemodebar.xml | 30 + sd/uiconfig/sdraw/toolbar/colorbar.xml | 32 + sd/uiconfig/sdraw/toolbar/commentsbar.xml | 28 + sd/uiconfig/sdraw/toolbar/connectorsbar.xml | 55 + sd/uiconfig/sdraw/toolbar/distributebar.xml | 21 + sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml | 69 + sd/uiconfig/sdraw/toolbar/ellipsesbar.xml | 36 + sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml | 33 + sd/uiconfig/sdraw/toolbar/findbar.xml | 31 + sd/uiconfig/sdraw/toolbar/flowchartshapes.xml | 53 + sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml | 30 + sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml | 55 + sd/uiconfig/sdraw/toolbar/formcontrols.xml | 59 + sd/uiconfig/sdraw/toolbar/formdesign.xml | 46 + sd/uiconfig/sdraw/toolbar/formsfilterbar.xml | 25 + sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml | 50 + sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml | 45 + sd/uiconfig/sdraw/toolbar/fullscreenbar.xml | 22 + sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml | 37 + sd/uiconfig/sdraw/toolbar/graffilterbar.xml | 34 + sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml | 70 + sd/uiconfig/sdraw/toolbar/insertbar.xml | 32 + sd/uiconfig/sdraw/toolbar/linesbar.xml | 30 + sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml | 26 + sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml | 24 + sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml | 16 + sd/uiconfig/sdraw/toolbar/optimizetablebar.xml | 27 + sd/uiconfig/sdraw/toolbar/optionsbar.xml | 40 + sd/uiconfig/sdraw/toolbar/positionbar.xml | 30 + sd/uiconfig/sdraw/toolbar/rectanglesbar.xml | 30 + sd/uiconfig/sdraw/toolbar/redactedexportbar.xml | 23 + sd/uiconfig/sdraw/toolbar/redactionbar.xml | 27 + sd/uiconfig/sdraw/toolbar/standardbar.xml | 94 + sd/uiconfig/sdraw/toolbar/starshapes.xml | 34 + sd/uiconfig/sdraw/toolbar/symbolshapes.xml | 41 + sd/uiconfig/sdraw/toolbar/tableobjectbar.xml | 50 + sd/uiconfig/sdraw/toolbar/textbar.xml | 28 + sd/uiconfig/sdraw/toolbar/textobjectbar.xml | 78 + sd/uiconfig/sdraw/toolbar/toolbar.xml | 64 + sd/uiconfig/sdraw/toolbar/viewerbar.xml | 37 + sd/uiconfig/sdraw/toolbar/zoombar.xml | 34 + sd/uiconfig/sdraw/ui/breakdialog.ui | 140 + sd/uiconfig/sdraw/ui/bulletsandnumbering.ui | 210 + sd/uiconfig/sdraw/ui/copydlg.ui | 581 + sd/uiconfig/sdraw/ui/crossfadedialog.ui | 207 + sd/uiconfig/sdraw/ui/dlgsnap.ui | 344 + sd/uiconfig/sdraw/ui/drawchardialog.ui | 302 + sd/uiconfig/sdraw/ui/drawpagedialog.ui | 179 + sd/uiconfig/sdraw/ui/drawparadialog.ui | 351 + sd/uiconfig/sdraw/ui/drawprinteroptions.ui | 299 + sd/uiconfig/sdraw/ui/drawprtldialog.ui | 880 + sd/uiconfig/sdraw/ui/insertlayer.ui | 325 + sd/uiconfig/sdraw/ui/insertslidesdialog.ui | 195 + sd/uiconfig/sdraw/ui/namedesign.ui | 113 + sd/uiconfig/sdraw/ui/navigatorcontextmenu.ui | 17 + sd/uiconfig/sdraw/ui/notebookbar.ui | 18847 +++++++++++++++++ sd/uiconfig/sdraw/ui/notebookbar_compact.ui | 20531 +++++++++++++++++++ .../sdraw/ui/notebookbar_groupedbar_compact.ui | 14173 +++++++++++++ sd/uiconfig/sdraw/ui/notebookbar_online.ui | 67 + sd/uiconfig/sdraw/ui/notebookbar_single.ui | 11625 +++++++++++ sd/uiconfig/sdraw/ui/paranumberingtab.ui | 85 + sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui | 35 + sd/uiconfig/sdraw/ui/vectorize.ui | 376 + sd/uiconfig/simpress/menubar/menubar.xml | 681 + sd/uiconfig/simpress/popupmenu/3dobject.xml | 58 + sd/uiconfig/simpress/popupmenu/3dscene.xml | 51 + sd/uiconfig/simpress/popupmenu/3dscene2.xml | 52 + sd/uiconfig/simpress/popupmenu/bezier.xml | 26 + sd/uiconfig/simpress/popupmenu/connector.xml | 54 + sd/uiconfig/simpress/popupmenu/curve.xml | 65 + sd/uiconfig/simpress/popupmenu/draw.xml | 63 + sd/uiconfig/simpress/popupmenu/drawtext.xml | 31 + sd/uiconfig/simpress/popupmenu/form.xml | 42 + sd/uiconfig/simpress/popupmenu/formrichtext.xml | 46 + sd/uiconfig/simpress/popupmenu/gluepoint.xml | 27 + sd/uiconfig/simpress/popupmenu/graphic.xml | 72 + sd/uiconfig/simpress/popupmenu/group.xml | 59 + sd/uiconfig/simpress/popupmenu/line.xml | 58 + sd/uiconfig/simpress/popupmenu/measure.xml | 65 + sd/uiconfig/simpress/popupmenu/media.xml | 38 + sd/uiconfig/simpress/popupmenu/multiselect.xml | 78 + sd/uiconfig/simpress/popupmenu/notebookbar.xml | 24 + sd/uiconfig/simpress/popupmenu/objectalign.xml | 18 + sd/uiconfig/simpress/popupmenu/oleobject.xml | 60 + sd/uiconfig/simpress/popupmenu/outline.xml | 33 + sd/uiconfig/simpress/popupmenu/page.xml | 82 + sd/uiconfig/simpress/popupmenu/pagepane.xml | 62 + sd/uiconfig/simpress/popupmenu/pagepanemaster.xml | 18 + sd/uiconfig/simpress/popupmenu/pagepanenosel.xml | 16 + .../simpress/popupmenu/pagepanenoselmaster.xml | 16 + sd/uiconfig/simpress/popupmenu/pagetab.xml | 19 + sd/uiconfig/simpress/popupmenu/table.xml | 69 + sd/uiconfig/simpress/popupmenu/textbox.xml | 58 + sd/uiconfig/simpress/statusbar/statusbar.xml | 31 + sd/uiconfig/simpress/toolbar/3dobjectsbar.xml | 30 + sd/uiconfig/simpress/toolbar/alignmentbar.xml | 28 + sd/uiconfig/simpress/toolbar/arrowsbar.xml | 33 + sd/uiconfig/simpress/toolbar/arrowshapes.xml | 51 + sd/uiconfig/simpress/toolbar/basicshapes.xml | 48 + sd/uiconfig/simpress/toolbar/bezierobjectbar.xml | 37 + sd/uiconfig/simpress/toolbar/calloutshapes.xml | 29 + sd/uiconfig/simpress/toolbar/choosemodebar.xml | 30 + sd/uiconfig/simpress/toolbar/classificationbar.xml | 13 + sd/uiconfig/simpress/toolbar/colorbar.xml | 32 + sd/uiconfig/simpress/toolbar/commentsbar.xml | 28 + sd/uiconfig/simpress/toolbar/commontaskbar.xml | 39 + sd/uiconfig/simpress/toolbar/connectorsbar.xml | 55 + sd/uiconfig/simpress/toolbar/distributebar.xml | 21 + sd/uiconfig/simpress/toolbar/drawingobjectbar.xml | 71 + sd/uiconfig/simpress/toolbar/ellipsesbar.xml | 36 + .../simpress/toolbar/extrusionobjectbar.xml | 33 + sd/uiconfig/simpress/toolbar/findbar.xml | 31 + sd/uiconfig/simpress/toolbar/flowchartshapes.xml | 53 + sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml | 30 + sd/uiconfig/simpress/toolbar/fontworkshapetype.xml | 55 + sd/uiconfig/simpress/toolbar/formcontrols.xml | 59 + sd/uiconfig/simpress/toolbar/formdesign.xml | 46 + sd/uiconfig/simpress/toolbar/formsfilterbar.xml | 25 + .../simpress/toolbar/formsnavigationbar.xml | 50 + sd/uiconfig/simpress/toolbar/formtextobjectbar.xml | 45 + sd/uiconfig/simpress/toolbar/fullscreenbar.xml | 22 + .../simpress/toolbar/gluepointsobjectbar.xml | 37 + sd/uiconfig/simpress/toolbar/graffilterbar.xml | 34 + sd/uiconfig/simpress/toolbar/graphicobjectbar.xml | 72 + sd/uiconfig/simpress/toolbar/insertbar.xml | 32 + sd/uiconfig/simpress/toolbar/linesbar.xml | 30 + sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml | 26 + sd/uiconfig/simpress/toolbar/mediaobjectbar.xml | 24 + .../simpress/toolbar/notebookbarshortcuts.xml | 17 + sd/uiconfig/simpress/toolbar/optimizetablebar.xml | 27 + sd/uiconfig/simpress/toolbar/optionsbar.xml | 40 + sd/uiconfig/simpress/toolbar/outlinetoolbar.xml | 33 + sd/uiconfig/simpress/toolbar/positionbar.xml | 30 + sd/uiconfig/simpress/toolbar/rectanglesbar.xml | 30 + sd/uiconfig/simpress/toolbar/singlemode.xml | 87 + .../simpress/toolbar/slideviewobjectbar.xml | 27 + sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml | 24 + sd/uiconfig/simpress/toolbar/standardbar.xml | 79 + sd/uiconfig/simpress/toolbar/starshapes.xml | 34 + sd/uiconfig/simpress/toolbar/symbolshapes.xml | 41 + sd/uiconfig/simpress/toolbar/tableobjectbar.xml | 50 + sd/uiconfig/simpress/toolbar/textbar.xml | 28 + sd/uiconfig/simpress/toolbar/textobjectbar.xml | 78 + sd/uiconfig/simpress/toolbar/toolbar.xml | 70 + sd/uiconfig/simpress/toolbar/viewerbar.xml | 39 + sd/uiconfig/simpress/toolbar/zoombar.xml | 34 + sd/uiconfig/simpress/ui/annotation.ui | 169 + sd/uiconfig/simpress/ui/annotationtagmenu.ui | 47 + sd/uiconfig/simpress/ui/clientboxfragment.ui | 81 + sd/uiconfig/simpress/ui/currentmastermenu.ui | 69 + .../simpress/ui/customanimationeffecttab.ui | 439 + sd/uiconfig/simpress/ui/customanimationfragment.ui | 440 + .../simpress/ui/customanimationproperties.ui | 241 + sd/uiconfig/simpress/ui/customanimationspanel.ui | 696 + sd/uiconfig/simpress/ui/customanimationtexttab.ui | 151 + .../simpress/ui/customanimationtimingtab.ui | 283 + sd/uiconfig/simpress/ui/customslideshows.ui | 268 + sd/uiconfig/simpress/ui/definecustomslideshow.ui | 358 + sd/uiconfig/simpress/ui/displaywindow.ui | 123 + sd/uiconfig/simpress/ui/dlgfield.ui | 268 + sd/uiconfig/simpress/ui/dockinganimation.ui | 657 + sd/uiconfig/simpress/ui/effectmenu.ui | 69 + sd/uiconfig/simpress/ui/fieldmenu.ui | 9 + sd/uiconfig/simpress/ui/fontsizemenu.ui | 41 + sd/uiconfig/simpress/ui/fontstylemenu.ui | 33 + sd/uiconfig/simpress/ui/gluebox.ui | 23 + sd/uiconfig/simpress/ui/headerfooterdialog.ui | 223 + sd/uiconfig/simpress/ui/headerfootertab.ui | 519 + sd/uiconfig/simpress/ui/impressprinteroptions.ui | 441 + sd/uiconfig/simpress/ui/insertslides.ui | 156 + sd/uiconfig/simpress/ui/interactiondialog.ui | 89 + sd/uiconfig/simpress/ui/interactionpage.ui | 485 + sd/uiconfig/simpress/ui/layoutmenu.ui | 31 + sd/uiconfig/simpress/ui/layoutpanel.ui | 25 + sd/uiconfig/simpress/ui/layoutwindow.ui | 142 + sd/uiconfig/simpress/ui/masterlayoutdlg.ui | 220 + sd/uiconfig/simpress/ui/mastermenu.ui | 47 + sd/uiconfig/simpress/ui/masterpagemenu.ui | 9 + sd/uiconfig/simpress/ui/masterpagepanel.ui | 25 + sd/uiconfig/simpress/ui/masterpagepanelall.ui | 25 + sd/uiconfig/simpress/ui/masterpagepanelrecent.ui | 25 + sd/uiconfig/simpress/ui/navigatorpanel.ui | 314 + sd/uiconfig/simpress/ui/notebookbar.ui | 19833 ++++++++++++++++++ sd/uiconfig/simpress/ui/notebookbar_compact.ui | 20214 ++++++++++++++++++ .../simpress/ui/notebookbar_groupedbar_compact.ui | 14157 +++++++++++++ .../simpress/ui/notebookbar_groupedbar_full.ui | 12507 +++++++++++ sd/uiconfig/simpress/ui/notebookbar_groups.ui | 1900 ++ sd/uiconfig/simpress/ui/notebookbar_online.ui | 67 + sd/uiconfig/simpress/ui/notebookbar_single.ui | 11343 ++++++++++ sd/uiconfig/simpress/ui/optimpressgeneralpage.ui | 813 + sd/uiconfig/simpress/ui/pagesfieldbox.ui | 31 + sd/uiconfig/simpress/ui/photoalbum.ui | 416 + sd/uiconfig/simpress/ui/pmimagespage.ui | 202 + sd/uiconfig/simpress/ui/pminfodialog.ui | 46 + sd/uiconfig/simpress/ui/pmintropage.ui | 134 + sd/uiconfig/simpress/ui/pmobjectspage.ui | 120 + sd/uiconfig/simpress/ui/pmslidespage.ui | 129 + sd/uiconfig/simpress/ui/pmsummarypage.ui | 269 + sd/uiconfig/simpress/ui/presentationdialog.ui | 880 + sd/uiconfig/simpress/ui/prntopts.ui | 671 + sd/uiconfig/simpress/ui/remotedialog.ui | 167 + sd/uiconfig/simpress/ui/rotatemenu.ui | 63 + sd/uiconfig/simpress/ui/scalemenu.ui | 71 + sd/uiconfig/simpress/ui/sdviewpage.ui | 166 + sd/uiconfig/simpress/ui/sidebarslidebackground.ui | 367 + sd/uiconfig/simpress/ui/slidecontextmenu.ui | 165 + sd/uiconfig/simpress/ui/slidedesigndialog.ui | 216 + sd/uiconfig/simpress/ui/slidetransitionspanel.ui | 468 + sd/uiconfig/simpress/ui/snapmenu.ui | 9 + sd/uiconfig/simpress/ui/tabledesignpanel.ui | 263 + sd/uiconfig/simpress/ui/tabviewbar.ui | 47 + sd/uiconfig/simpress/ui/templatedialog.ui | 895 + sd/util/sd.component | 74 + sd/util/sdd.component | 26 + sd/workben/custompanel/ctp_panel.cxx | 215 + sd/workben/custompanel/ctp_panel.hxx | 82 + sd/workben/testdll/makefile | 91 + sd/xml/effects.xml | 2699 +++ sd/xml/layoutlist.xml | 86 + sd/xml/objectlist.xml | 41 + sd/xml/styles.xml | 196 + sd/xml/transitions-ogl.xml | 77 + sd/xml/transitions.xml | 251 + sd/xsl/effect.xsl | 580 + 2041 files changed, 534542 insertions(+) create mode 100644 sd/AllLangMoTarget_sd.mk create mode 100644 sd/CppunitTest_sd_a11y.mk create mode 100644 sd/CppunitTest_sd_activex_controls_tests.mk create mode 100644 sd/CppunitTest_sd_dialogs_test.mk create mode 100644 sd/CppunitTest_sd_export_tests-ooxml1.mk create mode 100644 sd/CppunitTest_sd_export_tests-ooxml2.mk create mode 100644 sd/CppunitTest_sd_export_tests-ooxml3.mk create mode 100644 sd/CppunitTest_sd_export_tests-ooxml4.mk create mode 100644 sd/CppunitTest_sd_export_tests.mk create mode 100644 sd/CppunitTest_sd_filter_eppt.mk create mode 100644 sd/CppunitTest_sd_filters_test.mk create mode 100644 sd/CppunitTest_sd_html_export_tests.mk create mode 100644 sd/CppunitTest_sd_import_tests-smartart.mk create mode 100644 sd/CppunitTest_sd_import_tests.mk create mode 100644 sd/CppunitTest_sd_import_tests2.mk create mode 100644 sd/CppunitTest_sd_import_tests_skia.mk create mode 100644 sd/CppunitTest_sd_layout_tests.mk create mode 100644 sd/CppunitTest_sd_misc_tests.mk create mode 100644 sd/CppunitTest_sd_pdf_import_test.mk create mode 100644 sd/CppunitTest_sd_png_export_tests.mk create mode 100644 sd/CppunitTest_sd_shape_import_export_tests.mk create mode 100644 sd/CppunitTest_sd_svg_export_tests.mk create mode 100644 sd/CppunitTest_sd_textfitting_tests.mk create mode 100644 sd/CppunitTest_sd_theme_tests.mk create mode 100644 sd/CppunitTest_sd_tiledrendering.mk create mode 100644 sd/CppunitTest_sd_uiimpress.mk create mode 100644 sd/CppunitTest_sd_uimpress.mk create mode 100644 sd/IwyuFilter_sd.yaml create mode 100644 sd/JunitTest_sd_unoapi.mk create mode 100644 sd/Library_sd.mk create mode 100644 sd/Library_sdd.mk create mode 100644 sd/Library_sdui.mk create mode 100644 sd/Makefile create mode 100644 sd/Module_sd.mk create mode 100644 sd/Package_opengl.mk create mode 100644 sd/Package_xml.mk create mode 100644 sd/README.md create mode 100644 sd/README.vars create mode 100644 sd/README_REMOTE create mode 100644 sd/UIConfig_sdraw.mk create mode 100644 sd/UIConfig_simpress.mk create mode 100644 sd/UITest_impress_tests.mk create mode 100644 sd/UITest_impress_tests2.mk create mode 100644 sd/UITest_sd_findReplace.mk create mode 100644 sd/export_setup.mk create mode 100644 sd/import_setup.mk create mode 100644 sd/inc/Annotation.hxx create mode 100644 sd/inc/AnnotationEnumeration.hxx create mode 100644 sd/inc/CustomAnimationCloner.hxx create mode 100644 sd/inc/CustomAnimationEffect.hxx create mode 100644 sd/inc/CustomAnimationPreset.hxx create mode 100644 sd/inc/DocumentRenderer.hrc create mode 100644 sd/inc/EffectMigration.hxx create mode 100644 sd/inc/FactoryIds.hxx create mode 100644 sd/inc/Outliner.hxx create mode 100644 sd/inc/OutlinerIterator.hxx create mode 100644 sd/inc/SdShapeTypes.hxx create mode 100644 sd/inc/TransitionPreset.hxx create mode 100644 sd/inc/VectorGraphicSearchContext.hxx create mode 100644 sd/inc/animations.hxx create mode 100644 sd/inc/anminfo.hxx create mode 100644 sd/inc/app.hrc create mode 100644 sd/inc/bitmaps.hlst create mode 100644 sd/inc/createpresentation.hxx create mode 100644 sd/inc/createunocustomshow.hxx create mode 100644 sd/inc/createunopageimpl.hxx create mode 100644 sd/inc/cusshow.hxx create mode 100644 sd/inc/customshowlist.hxx create mode 100644 sd/inc/diadef.h create mode 100644 sd/inc/drawdoc.hxx create mode 100644 sd/inc/errhdl.hrc create mode 100644 sd/inc/family.hrc create mode 100644 sd/inc/glob.hxx create mode 100644 sd/inc/helper/simplereferencecomponent.hxx create mode 100644 sd/inc/helpids.h create mode 100644 sd/inc/misc/scopelock.hxx create mode 100644 sd/inc/notifydocumentevent.hxx create mode 100644 sd/inc/pageformatpanel.hrc create mode 100644 sd/inc/pch/precompiled_sd.cxx create mode 100644 sd/inc/pch/precompiled_sd.hxx create mode 100644 sd/inc/pch/precompiled_sdui.cxx create mode 100644 sd/inc/pch/precompiled_sdui.hxx create mode 100644 sd/inc/pglink.hxx create mode 100644 sd/inc/pres.hxx create mode 100644 sd/inc/prlayout.hxx create mode 100644 sd/inc/randomnode.hxx create mode 100644 sd/inc/resltn.hxx create mode 100644 sd/inc/sdabstdlg.hxx create mode 100644 sd/inc/sdattr.hrc create mode 100644 sd/inc/sdattr.hxx create mode 100644 sd/inc/sdcgmfilter.hxx create mode 100644 sd/inc/sdcommands.h create mode 100644 sd/inc/sddll.hxx create mode 100644 sd/inc/sddllapi.h create mode 100644 sd/inc/sdenumdef.hxx create mode 100644 sd/inc/sderror.hxx create mode 100644 sd/inc/sdfilter.hxx create mode 100644 sd/inc/sdgrffilter.hxx create mode 100644 sd/inc/sdhtmlfilter.hxx create mode 100644 sd/inc/sdiocmpt.hxx create mode 100644 sd/inc/sdmod.hxx create mode 100644 sd/inc/sdpage.hxx create mode 100644 sd/inc/sdpdffilter.hxx create mode 100644 sd/inc/sdpptwrp.hxx create mode 100644 sd/inc/sdresid.hxx create mode 100644 sd/inc/sdundo.hxx create mode 100644 sd/inc/sdxmlwrp.hxx create mode 100644 sd/inc/shapelist.hxx create mode 100644 sd/inc/stlfamily.hxx create mode 100644 sd/inc/stlpool.hxx create mode 100644 sd/inc/stlsheet.hxx create mode 100644 sd/inc/strings.hrc create mode 100644 sd/inc/strings.hxx create mode 100644 sd/inc/textapi.hxx create mode 100644 sd/inc/theme/ThemeColorChanger.hxx create mode 100644 sd/inc/undo/undofactory.hxx create mode 100644 sd/inc/undo/undomanager.hxx create mode 100644 sd/inc/undo/undoobjects.hxx create mode 100644 sd/inc/undoanim.hxx create mode 100644 sd/inc/viewopt.hxx create mode 100644 sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx create mode 100644 sd/qa/filter/eppt/data/video-loop.pptx create mode 100644 sd/qa/filter/eppt/eppt.cxx create mode 100644 sd/qa/uitest/data/LibreOffice.jpg create mode 100644 sd/qa/uitest/data/embedded.pptx create mode 100644 sd/qa/uitest/data/findReplace.odp create mode 100644 sd/qa/uitest/data/tdf119246.odp create mode 100644 sd/qa/uitest/data/tdf127900.fodp create mode 100644 sd/qa/uitest/data/tdf144943.pptx create mode 100644 sd/qa/uitest/data/tdf146019.jpg create mode 100644 sd/qa/uitest/data/tdf155863.odp create mode 100644 sd/qa/uitest/findReplace/findReplace.py create mode 100644 sd/qa/uitest/impress_tests/autocorrectOptions.py create mode 100644 sd/qa/uitest/impress_tests/customSlideShow.py create mode 100644 sd/qa/uitest/impress_tests/embedded.py create mode 100644 sd/qa/uitest/impress_tests/exportToPDF.py create mode 100644 sd/qa/uitest/impress_tests/insertSlide.py create mode 100644 sd/qa/uitest/impress_tests/masterElements.py create mode 100644 sd/qa/uitest/impress_tests/masterSlides.py create mode 100644 sd/qa/uitest/impress_tests/renameSlide.py create mode 100644 sd/qa/uitest/impress_tests/save_readonly_with_password.py create mode 100644 sd/qa/uitest/impress_tests/slideShowSettings.py create mode 100644 sd/qa/uitest/impress_tests/tdf119246.py create mode 100644 sd/qa/uitest/impress_tests/tdf134734.py create mode 100644 sd/qa/uitest/impress_tests/tdf137729.py create mode 100644 sd/qa/uitest/impress_tests/tdf152295.py create mode 100644 sd/qa/uitest/impress_tests/tdf155863.py create mode 100644 sd/qa/uitest/impress_tests/textColumnsDialog.py create mode 100644 sd/qa/uitest/impress_tests2/tdf106612.py create mode 100644 sd/qa/uitest/impress_tests2/tdf125449.py create mode 100644 sd/qa/uitest/impress_tests2/tdf127900.py create mode 100644 sd/qa/uitest/impress_tests2/tdf130440.py create mode 100644 sd/qa/uitest/impress_tests2/tdf133713.py create mode 100644 sd/qa/uitest/impress_tests2/tdf137637.py create mode 100644 sd/qa/uitest/impress_tests2/tdf139511.py create mode 100644 sd/qa/uitest/impress_tests2/tdf141297.py create mode 100644 sd/qa/uitest/impress_tests2/tdf141708.py create mode 100644 sd/qa/uitest/impress_tests2/tdf144943.py create mode 100644 sd/qa/uitest/impress_tests2/tdf146019.py create mode 100644 sd/qa/uitest/impress_tests2/tdf149787.py create mode 100644 sd/qa/uitest/impress_tests2/tdf82616.py create mode 100644 sd/qa/uitest/impress_tests2/tdf91762.py create mode 100644 sd/qa/unit/HtmlExportTest.cxx create mode 100644 sd/qa/unit/PNGExportTests.cxx create mode 100644 sd/qa/unit/SVGExportTests.cxx create mode 100644 sd/qa/unit/SdrPdfImportTest.cxx create mode 100644 sd/qa/unit/ShapeImportExportTest.cxx create mode 100644 sd/qa/unit/TextFittingTest.cxx create mode 100644 sd/qa/unit/ThemeTest.cxx create mode 100644 sd/qa/unit/a11y/data/tdf150064.fodp create mode 100644 sd/qa/unit/a11y/layout.cxx create mode 100644 sd/qa/unit/activex-controls-tests.cxx create mode 100644 sd/qa/unit/data/AllTransitions.odp create mode 100644 sd/qa/unit/data/HtmlExportTestDocument.odp create mode 100644 sd/qa/unit/data/PdfWithAnnotation.pdf create mode 100644 sd/qa/unit/data/README create mode 100644 sd/qa/unit/data/SimplePDF.pdf create mode 100644 sd/qa/unit/data/TextDistancesInsets1.pptx create mode 100644 sd/qa/unit/data/TextDistancesInsets2.pptx create mode 100644 sd/qa/unit/data/TextDistancesInsets3.pptx create mode 100644 sd/qa/unit/data/TextFitting.odp create mode 100644 sd/qa/unit/data/bnc822347_EmptyBullet.odp create mode 100644 sd/qa/unit/data/cgm/fail/.gitignore create mode 100644 sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm create mode 100644 sd/qa/unit/data/cgm/fail/ooo6420-1.cgm create mode 100644 sd/qa/unit/data/cgm/fail/recurse-1.cgm create mode 100644 sd/qa/unit/data/cgm/indeterminate/.gitignore create mode 100644 sd/qa/unit/data/cgm/pass/.gitignore create mode 100644 sd/qa/unit/data/cgm/pass/binary_corvette.cgm create mode 100644 sd/qa/unit/data/cgm/pass/circles.cgm create mode 100644 sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm create mode 100644 sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm create mode 100644 sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm create mode 100644 sd/qa/unit/data/dialogs-test.txt create mode 100644 sd/qa/unit/data/empty.fodp create mode 100644 sd/qa/unit/data/fdo47434.pptx create mode 100644 sd/qa/unit/data/fdo64512.odp create mode 100644 sd/qa/unit/data/fdo64586.ppt create mode 100644 sd/qa/unit/data/fdo71075.odp create mode 100644 sd/qa/unit/data/fdo71434.pptx create mode 100644 sd/qa/unit/data/fdo71961.odp create mode 100644 sd/qa/unit/data/fdo79731.odp create mode 100644 sd/qa/unit/data/fdo84043.odp create mode 100644 sd/qa/unit/data/fdo90607.pptx create mode 100644 sd/qa/unit/data/fit-to-size.fodp create mode 100644 sd/qa/unit/data/media_embedding.odp create mode 100644 sd/qa/unit/data/n593612.pptx create mode 100644 sd/qa/unit/data/n758621.ppt create mode 100644 sd/qa/unit/data/n759180.pptx create mode 100644 sd/qa/unit/data/n762695.pptx create mode 100644 sd/qa/unit/data/n819614.pptx create mode 100644 sd/qa/unit/data/n820786.pptx create mode 100644 sd/qa/unit/data/n828390_4.odp create mode 100644 sd/qa/unit/data/n828390_5.odp create mode 100644 sd/qa/unit/data/n902652.pptx create mode 100644 sd/qa/unit/data/objectwithtext.fodg create mode 100644 sd/qa/unit/data/odg/FitToFrameText.odg create mode 100644 sd/qa/unit/data/odg/diagonalLine.fodg create mode 100644 sd/qa/unit/data/odg/fail/.gitignore create mode 100644 sd/qa/unit/data/odg/glow.odg create mode 100644 sd/qa/unit/data/odg/gradient-angle.fodg create mode 100644 sd/qa/unit/data/odg/indeterminate/.gitignore create mode 100644 sd/qa/unit/data/odg/ooo124143-1.odg create mode 100644 sd/qa/unit/data/odg/pass/.gitignore create mode 100644 sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg create mode 100644 sd/qa/unit/data/odg/rhbz1870501.odg create mode 100644 sd/qa/unit/data/odg/softedges.odg create mode 100644 sd/qa/unit/data/odg/tablestyles.fodg create mode 100644 sd/qa/unit/data/odg/tb-rl-textbox.odg create mode 100644 sd/qa/unit/data/odg/tdf114488.fodg create mode 100644 sd/qa/unit/data/odg/tdf126319.odg create mode 100644 sd/qa/unit/data/odg/tdf147119.odg create mode 100644 sd/qa/unit/data/odg/two_columns.odg create mode 100644 sd/qa/unit/data/odp/BulletsAsImage.odp create mode 100644 sd/qa/unit/data/odp/LineStylesOwn.odp create mode 100644 sd/qa/unit/data/odp/SvgImageTest.odp create mode 100644 sd/qa/unit/data/odp/Table_with_Cell_Fill.odp create mode 100644 sd/qa/unit/data/odp/Tdf112594.fodp create mode 100644 sd/qa/unit/data/odp/Tdf62176.odp create mode 100644 sd/qa/unit/data/odp/author_field.odp create mode 100644 sd/qa/unit/data/odp/author_fixed.odp create mode 100644 sd/qa/unit/data/odp/autofitted-textbox-indent.odp create mode 100644 sd/qa/unit/data/odp/background.odp create mode 100644 sd/qa/unit/data/odp/bnc822341.odp create mode 100644 sd/qa/unit/data/odp/bulletCharAndFont.odp create mode 100644 sd/qa/unit/data/odp/cellspan.odp create mode 100644 sd/qa/unit/data/odp/closed-shapes.odp create mode 100644 sd/qa/unit/data/odp/document_with_linked_graphic.odp create mode 100644 sd/qa/unit/data/odp/document_with_two_images.odp create mode 100644 sd/qa/unit/data/odp/embedded-pdf.odp create mode 100644 sd/qa/unit/data/odp/extfile_field.odp create mode 100644 sd/qa/unit/data/odp/fail/.gitignore create mode 100644 sd/qa/unit/data/odp/fdo77027.odp create mode 100644 sd/qa/unit/data/odp/fillbitmap2.odp create mode 100644 sd/qa/unit/data/odp/group_rotation.odp create mode 100644 sd/qa/unit/data/odp/image_transparency.odp create mode 100644 sd/qa/unit/data/odp/images_with_special_IDs.odp create mode 100644 sd/qa/unit/data/odp/indeterminate/.gitignore create mode 100644 sd/qa/unit/data/odp/linked_graphic.jpg create mode 100644 sd/qa/unit/data/odp/linked_ole.odp create mode 100644 sd/qa/unit/data/odp/loopNoPause.odp create mode 100644 sd/qa/unit/data/odp/loopPause10.odp create mode 100644 sd/qa/unit/data/odp/masterpage_style_parent.odp create mode 100644 sd/qa/unit/data/odp/math.odp create mode 100644 sd/qa/unit/data/odp/numfmt.odp create mode 100644 sd/qa/unit/data/odp/ole_icon.odp create mode 100644 sd/qa/unit/data/odp/page_transparent_background.odp create mode 100644 sd/qa/unit/data/odp/pass/.gitignore create mode 100644 sd/qa/unit/data/odp/pass/EDB-26517-1.odp create mode 100644 sd/qa/unit/data/odp/pass/ooo56974-1.odp create mode 100644 sd/qa/unit/data/odp/pass/ooo72169-1.odp create mode 100644 sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp create mode 100644 sd/qa/unit/data/odp/pass/test-slide-name-fields.odp create mode 100644 sd/qa/unit/data/odp/placeholder-box-textalignment.odp create mode 100644 sd/qa/unit/data/odp/preset-shapes-export.odp create mode 100644 sd/qa/unit/data/odp/repeatBitmapMode.odp create mode 100644 sd/qa/unit/data/odp/rotate_flip.odp create mode 100644 sd/qa/unit/data/odp/search-all-notes.odp create mode 100644 sd/qa/unit/data/odp/shadow-blur.odp create mode 100644 sd/qa/unit/data/odp/shapes-test.odp create mode 100644 sd/qa/unit/data/odp/slide-bitmap-background.odp create mode 100644 sd/qa/unit/data/odp/slide-custom-background.odp create mode 100644 sd/qa/unit/data/odp/slide-tile-background.odp create mode 100644 sd/qa/unit/data/odp/slide-video-thumbnail.odp create mode 100644 sd/qa/unit/data/odp/slidecount_field.odp create mode 100644 sd/qa/unit/data/odp/slidename_field.odp create mode 100644 sd/qa/unit/data/odp/slidenum_field.odp create mode 100644 sd/qa/unit/data/odp/style-overflow-behavior-clip.fodp create mode 100644 sd/qa/unit/data/odp/svg-export-text-decorations.odp create mode 100644 sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp create mode 100644 sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp create mode 100644 sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp create mode 100644 sd/qa/unit/data/odp/tdf100387.odp create mode 100644 sd/qa/unit/data/odp/tdf103567.odp create mode 100644 sd/qa/unit/data/odp/tdf105362.odp create mode 100644 sd/qa/unit/data/odp/tdf105998.odp create mode 100644 sd/qa/unit/data/odp/tdf106026.odp create mode 100644 sd/qa/unit/data/odp/tdf108925.odp create mode 100644 sd/qa/unit/data/odp/tdf109169_Diamond.odp create mode 100644 sd/qa/unit/data/odp/tdf109169_Octagon.odp create mode 100644 sd/qa/unit/data/odp/tdf111785.odp create mode 100644 sd/qa/unit/data/odp/tdf111798.odp create mode 100644 sd/qa/unit/data/odp/tdf112552.odp create mode 100644 sd/qa/unit/data/odp/tdf112557.odp create mode 100644 sd/qa/unit/data/odp/tdf112647.odp create mode 100644 sd/qa/unit/data/odp/tdf113197.odp create mode 100644 sd/qa/unit/data/odp/tdf115005.odp create mode 100644 sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp create mode 100644 sd/qa/unit/data/odp/tdf116266.odp create mode 100644 sd/qa/unit/data/odp/tdf116266_chart.svg create mode 100644 sd/qa/unit/data/odp/tdf118045.odp create mode 100644 sd/qa/unit/data/odp/tdf118768-brake.odp create mode 100644 sd/qa/unit/data/odp/tdf118783.odp create mode 100644 sd/qa/unit/data/odp/tdf118806.odp create mode 100644 sd/qa/unit/data/odp/tdf118825-motionpath.odp create mode 100644 sd/qa/unit/data/odp/tdf118835.odp create mode 100644 sd/qa/unit/data/odp/tdf118836.odp create mode 100644 sd/qa/unit/data/odp/tdf119223.odp create mode 100644 sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp create mode 100644 sd/qa/unit/data/odp/tdf124781.odp create mode 100644 sd/qa/unit/data/odp/tdf127267DashOnHairline.odp create mode 100644 sd/qa/unit/data/odp/tdf127372.odp create mode 100644 sd/qa/unit/data/odp/tdf127379.odp create mode 100644 sd/qa/unit/data/odp/tdf127901.odp create mode 100644 sd/qa/unit/data/odp/tdf128049.odp create mode 100644 sd/qa/unit/data/odp/tdf128096.odp create mode 100644 sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp create mode 100644 sd/qa/unit/data/odp/tdf128345_GradientAxial.odp create mode 100644 sd/qa/unit/data/odp/tdf128345_GradientLinear.odp create mode 100644 sd/qa/unit/data/odp/tdf128345_GradientRadial.odp create mode 100644 sd/qa/unit/data/odp/tdf128985.odp create mode 100644 sd/qa/unit/data/odp/tdf129430.odp create mode 100644 sd/qa/unit/data/odp/tdf133502.odp create mode 100644 sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp create mode 100644 sd/qa/unit/data/odp/tdf136949.odp create mode 100644 sd/qa/unit/data/odp/tdf141269.odp create mode 100644 sd/qa/unit/data/odp/tdf146876.odp create mode 100644 sd/qa/unit/data/odp/tdf147919.odp create mode 100644 sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp create mode 100644 sd/qa/unit/data/odp/tdf148966-withflag.odp create mode 100644 sd/qa/unit/data/odp/tdf148966-withoutflag.odp create mode 100644 sd/qa/unit/data/odp/tdf149126.odp create mode 100644 sd/qa/unit/data/odp/tdf149128.odp create mode 100644 sd/qa/unit/data/odp/tdf149311.odp create mode 100644 sd/qa/unit/data/odp/tdf149551_btlr.odp create mode 100644 sd/qa/unit/data/odp/tdf149551_tbrl90.odp create mode 100644 sd/qa/unit/data/odp/tdf150316.odp create mode 100644 sd/qa/unit/data/odp/tdf150966_hugeInset.odp create mode 100644 sd/qa/unit/data/odp/tdf151492.odp create mode 100644 sd/qa/unit/data/odp/tdf153105.odp create mode 100644 sd/qa/unit/data/odp/tdf153107.odp create mode 100644 sd/qa/unit/data/odp/tdf153161_FlushToSave.odp create mode 100644 sd/qa/unit/data/odp/tdf154754.odp create mode 100644 sd/qa/unit/data/odp/tdf157652.odp create mode 100644 sd/qa/unit/data/odp/tdf157795.odp create mode 100644 sd/qa/unit/data/odp/tdf48735.odp create mode 100644 sd/qa/unit/data/odp/tdf53970.odp create mode 100644 sd/qa/unit/data/odp/tdf53970_linked.odp create mode 100644 sd/qa/unit/data/odp/tdf59046.odp create mode 100644 sd/qa/unit/data/odp/tdf66228.odp create mode 100644 sd/qa/unit/data/odp/tdf68759.odp create mode 100644 sd/qa/unit/data/odp/tdf74670.odp create mode 100644 sd/qa/unit/data/odp/tdf80020.odp create mode 100644 sd/qa/unit/data/odp/tdf80224.odp create mode 100644 sd/qa/unit/data/odp/tdf90626.odp create mode 100644 sd/qa/unit/data/odp/tdf90627.odp create mode 100644 sd/qa/unit/data/odp/tdf92076.odp create mode 100644 sd/qa/unit/data/odp/tdf93883.odp create mode 100644 sd/qa/unit/data/odp/tdf94122_autocolor.odp create mode 100644 sd/qa/unit/data/odp/tdf96206.odp create mode 100644 sd/qa/unit/data/odp/tdf96708.odp create mode 100644 sd/qa/unit/data/odp/tdf99213-target-missing.odp create mode 100644 sd/qa/unit/data/odp/tdf99224.odp create mode 100644 sd/qa/unit/data/odp/tdf99497_CircleKind.odp create mode 100644 sd/qa/unit/data/odp/tdf99729-legacy.odp create mode 100644 sd/qa/unit/data/odp/tdf99729-new.odp create mode 100644 sd/qa/unit/data/odp/testLegacyShapeAutofit.odp create mode 100644 sd/qa/unit/data/odp/testZeroIndent.odp create mode 100644 sd/qa/unit/data/odp/text-fields.odp create mode 100644 sd/qa/unit/data/odp/textbox-link-javascript.odp create mode 100644 sd/qa/unit/data/odp/transparent_background.odp create mode 100644 sd/qa/unit/data/pdf/multipage.pdf create mode 100644 sd/qa/unit/data/pdf/txtpic.pdf create mode 100644 sd/qa/unit/data/ppt/FillPatterns.ppt create mode 100644 sd/qa/unit/data/ppt/crop.ppt create mode 100644 sd/qa/unit/data/ppt/fail/.gitignore create mode 100644 sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt create mode 100644 sd/qa/unit/data/ppt/fdo68594.ppt create mode 100644 sd/qa/unit/data/ppt/indeterminate/.gitignore create mode 100644 sd/qa/unit/data/ppt/loopNoPause.ppt create mode 100644 sd/qa/unit/data/ppt/pass/.gitignore create mode 100644 sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt create mode 100644 sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/crash-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/crash-2.ppt create mode 100644 sd/qa/unit/data/ppt/pass/crash-3.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-10.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-11.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-12.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-13.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-14.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-15.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-16.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-17.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-18.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-19.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-2.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-20.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-21.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-22.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-3.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-4.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-5.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-6.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-7.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-8.ppt create mode 100644 sd/qa/unit/data/ppt/pass/hang-9.ppt create mode 100644 sd/qa/unit/data/ppt/pass/ofz14989-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/ofz21531-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/ofz37370-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/ofz43902-1.ppt create mode 100644 sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt create mode 100644 sd/qa/unit/data/ppt/placeholder-priority.pptx create mode 100644 sd/qa/unit/data/ppt/tdf105150.ppt create mode 100644 sd/qa/unit/data/ppt/tdf115394.ppt create mode 100644 sd/qa/unit/data/ppt/tdf116899.ppt create mode 100644 sd/qa/unit/data/ppt/tdf119629.ppt create mode 100644 sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt create mode 100644 sd/qa/unit/data/ppt/tdf126761.ppt create mode 100644 sd/qa/unit/data/ppt/tdf136911.ppt create mode 100644 sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt create mode 100644 sd/qa/unit/data/ppt/tdf157636.ppt create mode 100644 sd/qa/unit/data/ppt/tdf48083.ppt create mode 100644 sd/qa/unit/data/ppt/tdf49561.ppt create mode 100644 sd/qa/unit/data/ppt/tdf49856.ppt create mode 100644 sd/qa/unit/data/ppt/tdf77747.ppt create mode 100644 sd/qa/unit/data/ppt/tdf79082.ppt create mode 100644 sd/qa/unit/data/ppt/tdf93124.ppt create mode 100644 sd/qa/unit/data/pptm/macro.pptm create mode 100644 sd/qa/unit/data/pptx/3columns.pptx create mode 100644 sd/qa/unit/data/pptx/LostPlaceholder.odp create mode 100644 sd/qa/unit/data/pptx/LostPlaceholderFill.odp create mode 100644 sd/qa/unit/data/pptx/Math.pptx create mode 100644 sd/qa/unit/data/pptx/ShapeLineProperties.pptx create mode 100644 sd/qa/unit/data/pptx/ShapePlusImage.pptx create mode 100644 sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx create mode 100644 sd/qa/unit/data/pptx/accent-color.pptx create mode 100644 sd/qa/unit/data/pptx/activex_checkbox.pptx create mode 100644 sd/qa/unit/data/pptx/activex_combobox.pptx create mode 100644 sd/qa/unit/data/pptx/activex_commandbutton.pptx create mode 100644 sd/qa/unit/data/pptx/activex_fontproperties.pptx create mode 100644 sd/qa/unit/data/pptx/activex_label.pptx create mode 100644 sd/qa/unit/data/pptx/activex_listbox.pptx create mode 100644 sd/qa/unit/data/pptx/activex_optionbutton.pptx create mode 100644 sd/qa/unit/data/pptx/activex_picture.pptx create mode 100644 sd/qa/unit/data/pptx/activex_scrollbar.pptx create mode 100644 sd/qa/unit/data/pptx/activex_spinbutton.pptx create mode 100644 sd/qa/unit/data/pptx/activex_textbox.pptx create mode 100644 sd/qa/unit/data/pptx/activex_togglebutton.pptx create mode 100644 sd/qa/unit/data/pptx/altdescription.pptx create mode 100644 sd/qa/unit/data/pptx/arc-validiert.pptx create mode 100644 sd/qa/unit/data/pptx/bnc480256-2.pptx create mode 100644 sd/qa/unit/data/pptx/bnc480256.pptx create mode 100644 sd/qa/unit/data/pptx/bnc584721_1_2.pptx create mode 100644 sd/qa/unit/data/pptx/bnc584721_4.pptx create mode 100644 sd/qa/unit/data/pptx/bnc591147.pptx create mode 100644 sd/qa/unit/data/pptx/bnc862510_5.pptx create mode 100644 sd/qa/unit/data/pptx/bnc862510_6.pptx create mode 100644 sd/qa/unit/data/pptx/bnc862510_7.pptx create mode 100644 sd/qa/unit/data/pptx/bnc870233_1.pptx create mode 100644 sd/qa/unit/data/pptx/bnc870233_2.pptx create mode 100644 sd/qa/unit/data/pptx/bnc870237.pptx create mode 100644 sd/qa/unit/data/pptx/bnc880763.pptx create mode 100644 sd/qa/unit/data/pptx/bnc887225.pptx create mode 100644 sd/qa/unit/data/pptx/bnc887230.pptx create mode 100644 sd/qa/unit/data/pptx/bnc904423.pptx create mode 100644 sd/qa/unit/data/pptx/bnc910045.pptx create mode 100644 sd/qa/unit/data/pptx/bulletColor.pptx create mode 100644 sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx create mode 100644 sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx create mode 100644 sd/qa/unit/data/pptx/connectors.pptx create mode 100644 sd/qa/unit/data/pptx/control_background_color.pptx create mode 100644 sd/qa/unit/data/pptx/crop-position.pptx create mode 100644 sd/qa/unit/data/pptx/crop-to-shape.pptx create mode 100644 sd/qa/unit/data/pptx/croppedTo0.pptx create mode 100644 sd/qa/unit/data/pptx/cshapes.pptx create mode 100644 sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx create mode 100644 sd/qa/unit/data/pptx/customxml.pptx create mode 100644 sd/qa/unit/data/pptx/deftabstop.pptx create mode 100644 sd/qa/unit/data/pptx/effectOrder.pptx create mode 100644 sd/qa/unit/data/pptx/fail/.gitignore create mode 100644 sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx create mode 100644 sd/qa/unit/data/pptx/fdo83751.pptx create mode 100644 sd/qa/unit/data/pptx/fill-color-list.pptx create mode 100644 sd/qa/unit/data/pptx/font-scale.pptx create mode 100644 sd/qa/unit/data/pptx/formatting-bullet-indent.pptx create mode 100644 sd/qa/unit/data/pptx/greysscale-graphic.pptx create mode 100644 sd/qa/unit/data/pptx/group-rot.pptx create mode 100644 sd/qa/unit/data/pptx/group.pptx create mode 100644 sd/qa/unit/data/pptx/hyperlinkOnImage.pptx create mode 100644 sd/qa/unit/data/pptx/hyperlinktest.pptx create mode 100644 sd/qa/unit/data/pptx/indeterminate/.gitignore create mode 100644 sd/qa/unit/data/pptx/lineStyle.pptx create mode 100644 sd/qa/unit/data/pptx/loopNoPause.pptx create mode 100644 sd/qa/unit/data/pptx/master-slides.pptx create mode 100644 sd/qa/unit/data/pptx/mirrored-graphic.pptx create mode 100644 sd/qa/unit/data/pptx/multicol.pptx create mode 100644 sd/qa/unit/data/pptx/n778859.pptx create mode 100644 sd/qa/unit/data/pptx/n80340.pptx create mode 100644 sd/qa/unit/data/pptx/n821567.pptx create mode 100644 sd/qa/unit/data/pptx/n828390.pptx create mode 100644 sd/qa/unit/data/pptx/n828390_2.pptx create mode 100644 sd/qa/unit/data/pptx/n828390_3.pptx create mode 100644 sd/qa/unit/data/pptx/n83889.pptx create mode 100644 sd/qa/unit/data/pptx/n862510_1.pptx create mode 100644 sd/qa/unit/data/pptx/n862510_2.pptx create mode 100644 sd/qa/unit/data/pptx/n862510_4.pptx create mode 100644 sd/qa/unit/data/pptx/n90190.pptx create mode 100644 sd/qa/unit/data/pptx/n90223.pptx create mode 100644 sd/qa/unit/data/pptx/n90255.pptx create mode 100644 sd/qa/unit/data/pptx/narration-non-media-shape.pptx create mode 100644 sd/qa/unit/data/pptx/narration.pptx create mode 100644 sd/qa/unit/data/pptx/numfmt.pptx create mode 100644 sd/qa/unit/data/pptx/ole-emf_min.pptx create mode 100644 sd/qa/unit/data/pptx/ole.pptx create mode 100644 sd/qa/unit/data/pptx/ooxtheme.pptx create mode 100644 sd/qa/unit/data/pptx/open-as-read-only.pptx create mode 100644 sd/qa/unit/data/pptx/page_transparent_bitmap.pptx create mode 100644 sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx create mode 100644 sd/qa/unit/data/pptx/pass/.gitignore create mode 100644 sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx create mode 100644 sd/qa/unit/data/pptx/pass/ofz35597-1.pptx create mode 100644 sd/qa/unit/data/pptx/pass/ofz46160-1.pptx create mode 100644 sd/qa/unit/data/pptx/predefined-table-style.pptx create mode 100644 sd/qa/unit/data/pptx/presetDashDot.pptx create mode 100644 sd/qa/unit/data/pptx/rightToLeftParagraph.pptx create mode 100644 sd/qa/unit/data/pptx/shape-blur-effect.pptx create mode 100644 sd/qa/unit/data/pptx/shape-glow-effect.pptx create mode 100644 sd/qa/unit/data/pptx/shape-soft-edges.pptx create mode 100644 sd/qa/unit/data/pptx/shape-text-rotate.pptx create mode 100644 sd/qa/unit/data/pptx/slidenum_field.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-accent-process.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-autoTxRot.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-autofit-sync.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-background.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-bullet-list.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-center-cycle.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-chevron.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-children.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-cnt.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-cycle.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-data-follow.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-dir.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-font-size.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-linear-rule.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-maxdepth.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-missing-bullet.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-multidirectional.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-org-chart.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-org-chart2.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-picture-strip.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-preserve.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-recursion.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-rotation.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-rotation2.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-snake-rows.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-tdf134221.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-text.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx create mode 100644 sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx create mode 100644 sd/qa/unit/data/pptx/smartart1.pptx create mode 100644 sd/qa/unit/data/pptx/standardConnectors.pptx create mode 100644 sd/qa/unit/data/pptx/table-list.pptx create mode 100644 sd/qa/unit/data/pptx/tableBorderLineStyle.pptx create mode 100644 sd/qa/unit/data/pptx/tablescale.pptx create mode 100644 sd/qa/unit/data/pptx/tcPr-vert-roundtrip.pptx create mode 100644 sd/qa/unit/data/pptx/tdf100065.pptx create mode 100644 sd/qa/unit/data/pptx/tdf100926.pptx create mode 100644 sd/qa/unit/data/pptx/tdf100926_ODP.pptx create mode 100644 sd/qa/unit/data/pptx/tdf102261_testParaTabStopDefaultDistance.pptx create mode 100644 sd/qa/unit/data/pptx/tdf103347.pptx create mode 100644 sd/qa/unit/data/pptx/tdf103473.pptx create mode 100644 sd/qa/unit/data/pptx/tdf103477.pptx create mode 100644 sd/qa/unit/data/pptx/tdf103792.pptx create mode 100644 sd/qa/unit/data/pptx/tdf103800.pptx create mode 100644 sd/qa/unit/data/pptx/tdf103876.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104015.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104201.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104445.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104722.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104786.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104788.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104789.pptx create mode 100644 sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx create mode 100644 sd/qa/unit/data/pptx/tdf105150.pptx create mode 100644 sd/qa/unit/data/pptx/tdf105739.pptx create mode 100644 sd/qa/unit/data/pptx/tdf106638.pptx create mode 100644 sd/qa/unit/data/pptx/tdf106867.pptx create mode 100644 sd/qa/unit/data/pptx/tdf107608.pptx create mode 100644 sd/qa/unit/data/pptx/tdf108926.ppt create mode 100644 sd/qa/unit/data/pptx/tdf109067.pptx create mode 100644 sd/qa/unit/data/pptx/tdf109187.pptx create mode 100644 sd/qa/unit/data/pptx/tdf111518.pptx create mode 100644 sd/qa/unit/data/pptx/tdf111786.pptx create mode 100644 sd/qa/unit/data/pptx/tdf111789.pptx create mode 100644 sd/qa/unit/data/pptx/tdf111863.pptx create mode 100644 sd/qa/unit/data/pptx/tdf111884.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112086.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112088.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112089.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112209.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112280.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112333.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112334.pptx create mode 100644 sd/qa/unit/data/pptx/tdf112633.pptx create mode 100644 sd/qa/unit/data/pptx/tdf113163.pptx create mode 100644 sd/qa/unit/data/pptx/tdf113198.pptx create mode 100644 sd/qa/unit/data/pptx/tdf113818-swivel.pptx create mode 100644 sd/qa/unit/data/pptx/tdf113822underline.pptx create mode 100644 sd/qa/unit/data/pptx/tdf114821.pptx create mode 100644 sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx create mode 100644 sd/qa/unit/data/pptx/tdf114848.pptx create mode 100644 sd/qa/unit/data/pptx/tdf114913.pptx create mode 100644 sd/qa/unit/data/pptx/tdf115394-zero.pptx create mode 100644 sd/qa/unit/data/pptx/tdf115394.pptx create mode 100644 sd/qa/unit/data/pptx/tdf116350-texteffects.pptx create mode 100644 sd/qa/unit/data/pptx/tdf118776.pptx create mode 100644 sd/qa/unit/data/pptx/tdf119015.pptx create mode 100644 sd/qa/unit/data/pptx/tdf119087.pptx create mode 100644 sd/qa/unit/data/pptx/tdf119118.pptx create mode 100644 sd/qa/unit/data/pptx/tdf119187.pptx create mode 100644 sd/qa/unit/data/pptx/tdf119649.pptx create mode 100644 sd/qa/unit/data/pptx/tdf120028.pptx create mode 100644 sd/qa/unit/data/pptx/tdf120573.pptx create mode 100644 sd/qa/unit/data/pptx/tdf123090.pptx create mode 100644 sd/qa/unit/data/pptx/tdf123684.pptx create mode 100644 sd/qa/unit/data/pptx/tdf124457.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125071.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125346.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125346_2.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125360.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125360_1.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125360_2.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125551.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125554.pptx create mode 100644 sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx create mode 100644 sd/qa/unit/data/pptx/tdf126234.pptx create mode 100644 sd/qa/unit/data/pptx/tdf126324.pptx create mode 100644 sd/qa/unit/data/pptx/tdf126741.pptx create mode 100644 sd/qa/unit/data/pptx/tdf127090.odp create mode 100644 sd/qa/unit/data/pptx/tdf127129.pptx create mode 100644 sd/qa/unit/data/pptx/tdf127237.pptx create mode 100644 sd/qa/unit/data/pptx/tdf127964.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128212.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128213-shaperot.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128213.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128550.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128596.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128684.pptx create mode 100644 sd/qa/unit/data/pptx/tdf128952.pptx create mode 100644 sd/qa/unit/data/pptx/tdf129372.pptx create mode 100644 sd/qa/unit/data/pptx/tdf129686.pptx create mode 100644 sd/qa/unit/data/pptx/tdf130058.pptx create mode 100644 sd/qa/unit/data/pptx/tdf131390.pptx create mode 100644 sd/qa/unit/data/pptx/tdf131553.pptx create mode 100644 sd/qa/unit/data/pptx/tdf131554.pptx create mode 100644 sd/qa/unit/data/pptx/tdf131905.pptx create mode 100644 sd/qa/unit/data/pptx/tdf132282.pptx create mode 100644 sd/qa/unit/data/pptx/tdf132302_SmartArt_rightArrow.pptx create mode 100644 sd/qa/unit/data/pptx/tdf132472.pptx create mode 100644 sd/qa/unit/data/pptx/tdf134053_dashdot.pptx create mode 100644 sd/qa/unit/data/pptx/tdf134174.pptx create mode 100644 sd/qa/unit/data/pptx/tdf134210.pptx create mode 100644 sd/qa/unit/data/pptx/tdf134862.pptx create mode 100644 sd/qa/unit/data/pptx/tdf135843.pptx create mode 100644 sd/qa/unit/data/pptx/tdf135843_export.pptx create mode 100644 sd/qa/unit/data/pptx/tdf135843_insideH.pptx create mode 100644 sd/qa/unit/data/pptx/tdf135953_SmartArt_textposition.pptx create mode 100644 sd/qa/unit/data/pptx/tdf136830.pptx create mode 100644 sd/qa/unit/data/pptx/tdf137367.pptx create mode 100644 sd/qa/unit/data/pptx/tdf137675.pptx create mode 100644 sd/qa/unit/data/pptx/tdf138148.pptx create mode 100644 sd/qa/unit/data/pptx/tdf140714.pptx create mode 100644 sd/qa/unit/data/pptx/tdf140852.pptx create mode 100644 sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx create mode 100644 sd/qa/unit/data/pptx/tdf141058-1.pptx create mode 100644 sd/qa/unit/data/pptx/tdf141704.pptx create mode 100644 sd/qa/unit/data/pptx/tdf142590.pptx create mode 100644 sd/qa/unit/data/pptx/tdf142645.pptx create mode 100644 sd/qa/unit/data/pptx/tdf142648.pptx create mode 100644 sd/qa/unit/data/pptx/tdf142716.pptx create mode 100644 sd/qa/unit/data/pptx/tdf142913.pptx create mode 100644 sd/qa/unit/data/pptx/tdf142915.pptx create mode 100644 sd/qa/unit/data/pptx/tdf143126.pptx create mode 100644 sd/qa/unit/data/pptx/tdf143129.pptx create mode 100644 sd/qa/unit/data/pptx/tdf143222.pptx create mode 100644 sd/qa/unit/data/pptx/tdf143624.pptx create mode 100644 sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx create mode 100644 sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx create mode 100644 sd/qa/unit/data/pptx/tdf144616.pptx create mode 100644 sd/qa/unit/data/pptx/tdf144917.pptx create mode 100644 sd/qa/unit/data/pptx/tdf144918.pptx create mode 100644 sd/qa/unit/data/pptx/tdf145162.pptx create mode 100644 sd/qa/unit/data/pptx/tdf145528_SmartArt_Matrix.pptx create mode 100644 sd/qa/unit/data/pptx/tdf146223.pptx create mode 100644 sd/qa/unit/data/pptx/tdf146731.pptx create mode 100644 sd/qa/unit/data/pptx/tdf147121.pptx create mode 100644 sd/qa/unit/data/pptx/tdf147459.pptx create mode 100644 sd/qa/unit/data/pptx/tdf147586.pptx create mode 100644 sd/qa/unit/data/pptx/tdf148665.pptx create mode 100644 sd/qa/unit/data/pptx/tdf148685.pptx create mode 100644 sd/qa/unit/data/pptx/tdf148810_PARA_OUTLLEVEL.pptx create mode 100644 sd/qa/unit/data/pptx/tdf148921.pptx create mode 100644 sd/qa/unit/data/pptx/tdf148965.pptx create mode 100644 sd/qa/unit/data/pptx/tdf148966.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149124.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149206.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149314.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149551_SmartArt_Gear.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149551_SmartArt_Pie.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149551_SmartArt_Pyramid.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149551_SmartArt_Venn.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149697.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149785.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149803.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx create mode 100644 sd/qa/unit/data/pptx/tdf149985.pptx create mode 100644 sd/qa/unit/data/pptx/tdf150719.pptx create mode 100644 sd/qa/unit/data/pptx/tdf150770.pptx create mode 100644 sd/qa/unit/data/pptx/tdf151134.odp create mode 100644 sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx create mode 100644 sd/qa/unit/data/pptx/tdf151767.pptx create mode 100644 sd/qa/unit/data/pptx/tdf152070.pptx create mode 100644 sd/qa/unit/data/pptx/tdf152186.pptx create mode 100644 sd/qa/unit/data/pptx/tdf152335.pptx create mode 100644 sd/qa/unit/data/pptx/tdf152434.pptx create mode 100644 sd/qa/unit/data/pptx/tdf152606.pptx create mode 100644 sd/qa/unit/data/pptx/tdf153008-srcRect-smallNegBound.pptx create mode 100644 sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx create mode 100644 sd/qa/unit/data/pptx/tdf153466.pptx create mode 100644 sd/qa/unit/data/pptx/tdf154363.pptx create mode 100644 sd/qa/unit/data/pptx/tdf156649.pptx create mode 100644 sd/qa/unit/data/pptx/tdf156808.pptx create mode 100644 sd/qa/unit/data/pptx/tdf156829.pptx create mode 100644 sd/qa/unit/data/pptx/tdf156856.pptx create mode 100644 sd/qa/unit/data/pptx/tdf157635.pptx create mode 100644 sd/qa/unit/data/pptx/tdf157740.pptx create mode 100644 sd/qa/unit/data/pptx/tdf157793.pptx create mode 100644 sd/qa/unit/data/pptx/tdf44223.pptx create mode 100644 sd/qa/unit/data/pptx/tdf50499.pptx create mode 100644 sd/qa/unit/data/pptx/tdf51340.pptx create mode 100644 sd/qa/unit/data/pptx/tdf54037.pptx create mode 100644 sd/qa/unit/data/pptx/tdf59323.pptx create mode 100644 sd/qa/unit/data/pptx/tdf62255.pptx create mode 100644 sd/qa/unit/data/pptx/tdf65724.pptx create mode 100644 sd/qa/unit/data/pptx/tdf79007.pptx create mode 100644 sd/qa/unit/data/pptx/tdf79082.pptx create mode 100644 sd/qa/unit/data/pptx/tdf84205.pptx create mode 100644 sd/qa/unit/data/pptx/tdf89064.pptx create mode 100644 sd/qa/unit/data/pptx/tdf89449.pptx create mode 100644 sd/qa/unit/data/pptx/tdf89927.pptx create mode 100644 sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx create mode 100644 sd/qa/unit/data/pptx/tdf90626.pptx create mode 100644 sd/qa/unit/data/pptx/tdf91060.pptx create mode 100644 sd/qa/unit/data/pptx/tdf91378.pptx create mode 100644 sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx create mode 100644 sd/qa/unit/data/pptx/tdf92222.pptx create mode 100644 sd/qa/unit/data/pptx/tdf93097.pptx create mode 100644 sd/qa/unit/data/pptx/tdf93830.pptx create mode 100644 sd/qa/unit/data/pptx/tdf93868.pptx create mode 100644 sd/qa/unit/data/pptx/tdf94238.pptx create mode 100644 sd/qa/unit/data/pptx/tdf95932.pptx create mode 100644 sd/qa/unit/data/pptx/tdf96061.pptx create mode 100644 sd/qa/unit/data/pptx/tdf98477grow.pptx create mode 100644 sd/qa/unit/data/pptx/tdf98603.pptx create mode 100644 sd/qa/unit/data/pptx/tdf99030.pptx create mode 100644 sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx create mode 100644 sd/qa/unit/data/pptx/tdt142291.pptx create mode 100644 sd/qa/unit/data/pptx/testShapeAutofit.pptx create mode 100644 sd/qa/unit/data/pptx/trigger.pptx create mode 100644 sd/qa/unit/data/pptx/vertical-bracket-list.pptx create mode 100644 sd/qa/unit/data/smoketest.pptx create mode 100644 sd/qa/unit/data/strict_ooxml.pptx create mode 100644 sd/qa/unit/data/svg/test.svg create mode 100644 sd/qa/unit/data/sxi/ooo41061-1.sxi create mode 100644 sd/qa/unit/data/tdf100491.pptx create mode 100644 sd/qa/unit/data/tdf101242_ODF.odg create mode 100644 sd/qa/unit/data/tdf101242_settings.odg create mode 100644 sd/qa/unit/data/tdf109317.pptx create mode 100644 sd/qa/unit/data/tdf111522.odp create mode 100644 sd/qa/unit/data/tdf112126.odg create mode 100644 sd/qa/unit/data/tdf119392_InsertLayer.odg create mode 100644 sd/qa/unit/data/tdf119956.odg create mode 100644 sd/qa/unit/data/tdf120527.jpg create mode 100644 sd/qa/unit/data/tdf123841.odg create mode 100644 sd/qa/unit/data/tdf124708.ppt create mode 100644 sd/qa/unit/data/tdf126197.odp create mode 100644 sd/qa/unit/data/tdf128651_CustomShapeUndo.odp create mode 100644 sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp create mode 100644 sd/qa/unit/data/tdf130988_3D_create_lathe.odg create mode 100644 sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg create mode 100644 sd/qa/unit/data/tdf131269.ppt create mode 100644 sd/qa/unit/data/tdf143412.svg create mode 100644 sd/qa/unit/data/tdf154989.odg create mode 100644 sd/qa/unit/data/tdf67248.odg create mode 100644 sd/qa/unit/data/tdf80194_defaultSubscripts.fodg create mode 100644 sd/qa/unit/data/tdf90338.odp create mode 100644 sd/qa/unit/data/tdf90403.pptx create mode 100644 sd/qa/unit/data/tdf92001.odp create mode 100644 sd/qa/unit/data/tdf97808.fodp create mode 100644 sd/qa/unit/data/tdf98839_ShearVFlipH.odg create mode 100644 sd/qa/unit/data/tdf99396.odp create mode 100644 sd/qa/unit/data/theme.pptx create mode 100644 sd/qa/unit/data/tolerance.xml create mode 100644 sd/qa/unit/data/transparent-text.fodg create mode 100644 sd/qa/unit/data/underline.fodp create mode 100644 sd/qa/unit/data/unknown-attribute.fodp create mode 100644 sd/qa/unit/data/xml/fdo47434_0.xml create mode 100644 sd/qa/unit/data/xml/fdo64586_0.xml create mode 100644 sd/qa/unit/data/xml/fdo71434_0.xml create mode 100644 sd/qa/unit/data/xml/n593612_0.xml create mode 100644 sd/qa/unit/data/xml/n758621_0.xml create mode 100644 sd/qa/unit/data/xml/n758621_1.xml create mode 100644 sd/qa/unit/data/xml/n762695_0.xml create mode 100644 sd/qa/unit/data/xml/n762695_1.xml create mode 100644 sd/qa/unit/data/xml/n819614_0.xml create mode 100644 sd/qa/unit/data/xml/n820786_0.xml create mode 100644 sd/qa/unit/data/xml/n902652_0.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page0.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page1.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page2.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page3.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page4.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page5.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page6.xml create mode 100644 sd/qa/unit/data/xml/shapes-test_page7.xml create mode 100644 sd/qa/unit/data/xml/tdf100491_0.xml create mode 100644 sd/qa/unit/data/xml/tdf109317_0.xml create mode 100644 sd/qa/unit/data/xml/tdf90338_0.xml create mode 100644 sd/qa/unit/data/xml/tdf90403_0.xml create mode 100644 sd/qa/unit/data/xml/tdf92001_0.xml create mode 100644 sd/qa/unit/dialogs-test.cxx create mode 100644 sd/qa/unit/export-tests-ooxml1.cxx create mode 100644 sd/qa/unit/export-tests-ooxml2.cxx create mode 100644 sd/qa/unit/export-tests-ooxml3.cxx create mode 100644 sd/qa/unit/export-tests-ooxml4.cxx create mode 100644 sd/qa/unit/export-tests.cxx create mode 100644 sd/qa/unit/filters-test.cxx create mode 100644 sd/qa/unit/import-tests-smartart.cxx create mode 100644 sd/qa/unit/import-tests.cxx create mode 100644 sd/qa/unit/import-tests2.cxx create mode 100644 sd/qa/unit/import-tests_skia.cxx create mode 100644 sd/qa/unit/layout-tests.cxx create mode 100644 sd/qa/unit/misc-tests.cxx create mode 100644 sd/qa/unit/sdmodeltestbase.hxx create mode 100644 sd/qa/unit/tiledrendering/CallbackRecorder.hxx create mode 100644 sd/qa/unit/tiledrendering/LOKitSearchTest.cxx create mode 100644 sd/qa/unit/tiledrendering/data/2slides.odp create mode 100644 sd/qa/unit/tiledrendering/data/MixedTest1.odg create mode 100644 sd/qa/unit/tiledrendering/data/MixedTest2.odg create mode 100644 sd/qa/unit/tiledrendering/data/OnePDFObject.odg create mode 100644 sd/qa/unit/tiledrendering/data/PDFSearch.pdf create mode 100644 sd/qa/unit/tiledrendering/data/ReplaceTest.odp create mode 100644 sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg create mode 100644 sd/qa/unit/tiledrendering/data/cut_selection_change.odp create mode 100644 sd/qa/unit/tiledrendering/data/dummy.odg create mode 100644 sd/qa/unit/tiledrendering/data/dummy.odp create mode 100644 sd/qa/unit/tiledrendering/data/duplicate-undo.odp create mode 100644 sd/qa/unit/tiledrendering/data/insert-delete.odp create mode 100644 sd/qa/unit/tiledrendering/data/language-all-text.odp create mode 100644 sd/qa/unit/tiledrendering/data/notes-view.odp create mode 100644 sd/qa/unit/tiledrendering/data/paste-undo.fodp create mode 100644 sd/qa/unit/tiledrendering/data/paste_text_onslide.odp create mode 100644 sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx create mode 100644 sd/qa/unit/tiledrendering/data/search-all.odp create mode 100644 sd/qa/unit/tiledrendering/data/shape.odp create mode 100644 sd/qa/unit/tiledrendering/data/table-column.odp create mode 100644 sd/qa/unit/tiledrendering/data/table.odp create mode 100644 sd/qa/unit/tiledrendering/data/tdf102223.odp create mode 100644 sd/qa/unit/tiledrendering/data/tdf103083.fodp create mode 100644 sd/qa/unit/tiledrendering/data/tdf104405.fodp create mode 100644 sd/qa/unit/tiledrendering/data/tdf105502.odp create mode 100644 sd/qa/unit/tiledrendering/data/tdf115783.fodp create mode 100644 sd/qa/unit/tiledrendering/data/tdf115873-group.fodp create mode 100644 sd/qa/unit/tiledrendering/data/tdf115873.fodp create mode 100644 sd/qa/unit/tiledrendering/data/tdf118354.odp create mode 100644 sd/qa/unit/tiledrendering/data/tdf81754.pptx create mode 100644 sd/qa/unit/tiledrendering/data/title-shape.odp create mode 100644 sd/qa/unit/tiledrendering/tiledrendering.cxx create mode 100644 sd/qa/unit/uiimpress.cxx create mode 100644 sd/qa/unit/uimpress.cxx create mode 100644 sd/qa/unoapi/knownissues.xcl create mode 100644 sd/qa/unoapi/sd.sce create mode 100644 sd/sdi/SlideSorterController.sdi create mode 100644 sd/sdi/ViewShellBase.sdi create mode 100644 sd/sdi/_docsh.sdi create mode 100644 sd/sdi/_drvwsh.sdi create mode 100644 sd/sdi/app.sdi create mode 100644 sd/sdi/docshell.sdi create mode 100644 sd/sdi/drbezob.sdi create mode 100644 sd/sdi/drgrfob.sdi create mode 100644 sd/sdi/drtxtob.sdi create mode 100644 sd/sdi/drviewsh.sdi create mode 100644 sd/sdi/grdocsh.sdi create mode 100644 sd/sdi/grviewsh.sdi create mode 100644 sd/sdi/mediaob.sdi create mode 100644 sd/sdi/outlnvsh.sdi create mode 100644 sd/sdi/sdgslots.sdi create mode 100644 sd/sdi/sdraw.sdi create mode 100644 sd/sdi/sdslots.hrc create mode 100644 sd/sdi/sdslots.sdi create mode 100644 sd/sdi/tables.sdi create mode 100644 sd/source/console/PresenterAccessibility.cxx create mode 100644 sd/source/console/PresenterAccessibility.hxx create mode 100644 sd/source/console/PresenterBitmapContainer.cxx create mode 100644 sd/source/console/PresenterBitmapContainer.hxx create mode 100644 sd/source/console/PresenterButton.cxx create mode 100644 sd/source/console/PresenterButton.hxx create mode 100644 sd/source/console/PresenterCanvasHelper.cxx create mode 100644 sd/source/console/PresenterCanvasHelper.hxx create mode 100644 sd/source/console/PresenterConfigurationAccess.cxx create mode 100644 sd/source/console/PresenterConfigurationAccess.hxx create mode 100644 sd/source/console/PresenterController.cxx create mode 100644 sd/source/console/PresenterController.hxx create mode 100644 sd/source/console/PresenterCurrentSlideObserver.cxx create mode 100644 sd/source/console/PresenterCurrentSlideObserver.hxx create mode 100644 sd/source/console/PresenterFrameworkObserver.cxx create mode 100644 sd/source/console/PresenterFrameworkObserver.hxx create mode 100644 sd/source/console/PresenterGeometryHelper.cxx create mode 100644 sd/source/console/PresenterGeometryHelper.hxx create mode 100644 sd/source/console/PresenterHelpView.cxx create mode 100644 sd/source/console/PresenterHelpView.hxx create mode 100644 sd/source/console/PresenterHelper.cxx create mode 100644 sd/source/console/PresenterHelper.hxx create mode 100644 sd/source/console/PresenterNotesView.cxx create mode 100644 sd/source/console/PresenterNotesView.hxx create mode 100644 sd/source/console/PresenterPaintManager.cxx create mode 100644 sd/source/console/PresenterPaintManager.hxx create mode 100644 sd/source/console/PresenterPane.cxx create mode 100644 sd/source/console/PresenterPane.hxx create mode 100644 sd/source/console/PresenterPaneBase.cxx create mode 100644 sd/source/console/PresenterPaneBase.hxx create mode 100644 sd/source/console/PresenterPaneBorderPainter.cxx create mode 100644 sd/source/console/PresenterPaneBorderPainter.hxx create mode 100644 sd/source/console/PresenterPaneContainer.cxx create mode 100644 sd/source/console/PresenterPaneContainer.hxx create mode 100644 sd/source/console/PresenterPaneFactory.cxx create mode 100644 sd/source/console/PresenterPaneFactory.hxx create mode 100644 sd/source/console/PresenterProtocolHandler.cxx create mode 100644 sd/source/console/PresenterProtocolHandler.hxx create mode 100644 sd/source/console/PresenterScreen.cxx create mode 100644 sd/source/console/PresenterScreen.hxx create mode 100644 sd/source/console/PresenterScrollBar.cxx create mode 100644 sd/source/console/PresenterScrollBar.hxx create mode 100644 sd/source/console/PresenterSlidePreview.cxx create mode 100644 sd/source/console/PresenterSlidePreview.hxx create mode 100644 sd/source/console/PresenterSlideShowView.cxx create mode 100644 sd/source/console/PresenterSlideShowView.hxx create mode 100644 sd/source/console/PresenterSlideSorter.cxx create mode 100644 sd/source/console/PresenterSlideSorter.hxx create mode 100644 sd/source/console/PresenterSprite.cxx create mode 100644 sd/source/console/PresenterSprite.hxx create mode 100644 sd/source/console/PresenterSpritePane.cxx create mode 100644 sd/source/console/PresenterSpritePane.hxx create mode 100644 sd/source/console/PresenterTextView.cxx create mode 100644 sd/source/console/PresenterTextView.hxx create mode 100644 sd/source/console/PresenterTheme.cxx create mode 100644 sd/source/console/PresenterTheme.hxx create mode 100644 sd/source/console/PresenterTimer.cxx create mode 100644 sd/source/console/PresenterTimer.hxx create mode 100644 sd/source/console/PresenterToolBar.cxx create mode 100644 sd/source/console/PresenterToolBar.hxx create mode 100644 sd/source/console/PresenterUIPainter.cxx create mode 100644 sd/source/console/PresenterUIPainter.hxx create mode 100644 sd/source/console/PresenterViewFactory.cxx create mode 100644 sd/source/console/PresenterViewFactory.hxx create mode 100644 sd/source/console/PresenterWindowManager.cxx create mode 100644 sd/source/console/PresenterWindowManager.hxx create mode 100644 sd/source/console/presenter.component create mode 100644 sd/source/core/CustomAnimationCloner.cxx create mode 100644 sd/source/core/CustomAnimationEffect.cxx create mode 100644 sd/source/core/CustomAnimationPreset.cxx create mode 100644 sd/source/core/EffectMigration.cxx create mode 100644 sd/source/core/PageListWatcher.cxx create mode 100644 sd/source/core/PageListWatcher.hxx create mode 100644 sd/source/core/ThemeColorChanger.cxx create mode 100644 sd/source/core/TransitionPreset.cxx create mode 100644 sd/source/core/anminfo.cxx create mode 100644 sd/source/core/annotations/Annotation.cxx create mode 100644 sd/source/core/annotations/AnnotationEnumeration.cxx create mode 100644 sd/source/core/cusshow.cxx create mode 100644 sd/source/core/drawdoc.cxx create mode 100644 sd/source/core/drawdoc2.cxx create mode 100644 sd/source/core/drawdoc3.cxx create mode 100644 sd/source/core/drawdoc4.cxx create mode 100644 sd/source/core/drawdoc_animations.cxx create mode 100644 sd/source/core/pglink.cxx create mode 100644 sd/source/core/sdiocmpt.cxx create mode 100644 sd/source/core/sdpage.cxx create mode 100644 sd/source/core/sdpage2.cxx create mode 100644 sd/source/core/sdpage_animations.cxx create mode 100644 sd/source/core/shapelist.cxx create mode 100644 sd/source/core/stlfamily.cxx create mode 100644 sd/source/core/stlpool.cxx create mode 100644 sd/source/core/stlsheet.cxx create mode 100644 sd/source/core/text/textapi.cxx create mode 100644 sd/source/core/typemap.cxx create mode 100644 sd/source/core/undo/undofactory.cxx create mode 100644 sd/source/core/undo/undomanager.cxx create mode 100644 sd/source/core/undo/undoobjects.cxx create mode 100644 sd/source/core/undoanim.cxx create mode 100644 sd/source/filter/cgm/sdcgmfilter.cxx create mode 100644 sd/source/filter/eppt/eppt.cxx create mode 100644 sd/source/filter/eppt/eppt.hxx create mode 100644 sd/source/filter/eppt/epptbase.hxx create mode 100644 sd/source/filter/eppt/epptdef.hxx create mode 100644 sd/source/filter/eppt/epptooxml.hxx create mode 100644 sd/source/filter/eppt/epptso.cxx create mode 100644 sd/source/filter/eppt/escherex.cxx create mode 100644 sd/source/filter/eppt/escherex.hxx create mode 100644 sd/source/filter/eppt/grouptable.hxx create mode 100644 sd/source/filter/eppt/pptexanimations.cxx create mode 100644 sd/source/filter/eppt/pptexanimations.hxx create mode 100644 sd/source/filter/eppt/pptexsoundcollection.cxx create mode 100644 sd/source/filter/eppt/pptexsoundcollection.hxx create mode 100644 sd/source/filter/eppt/pptx-animations-cond.cxx create mode 100644 sd/source/filter/eppt/pptx-animations-cond.hxx create mode 100644 sd/source/filter/eppt/pptx-animations-nodectx.cxx create mode 100644 sd/source/filter/eppt/pptx-animations-nodectx.hxx create mode 100644 sd/source/filter/eppt/pptx-animations.cxx create mode 100644 sd/source/filter/eppt/pptx-animations.hxx create mode 100644 sd/source/filter/eppt/pptx-epptbase.cxx create mode 100644 sd/source/filter/eppt/pptx-epptooxml.cxx create mode 100644 sd/source/filter/eppt/pptx-grouptable.cxx create mode 100644 sd/source/filter/eppt/pptx-stylesheet.cxx create mode 100644 sd/source/filter/eppt/pptx-text.cxx create mode 100644 sd/source/filter/eppt/text.hxx create mode 100644 sd/source/filter/grf/sdgrffilter.cxx create mode 100644 sd/source/filter/html/htmlex.cxx create mode 100644 sd/source/filter/html/htmlex.hxx create mode 100644 sd/source/filter/html/htmlpublishmode.hxx create mode 100644 sd/source/filter/html/pubdlg.cxx create mode 100644 sd/source/filter/html/sdhtmlfilter.cxx create mode 100644 sd/source/filter/pdf/sdpdffilter.cxx create mode 100644 sd/source/filter/ppt/ppt97animations.cxx create mode 100644 sd/source/filter/ppt/ppt97animations.hxx create mode 100644 sd/source/filter/ppt/pptanimations.hxx create mode 100644 sd/source/filter/ppt/pptatom.cxx create mode 100644 sd/source/filter/ppt/pptatom.hxx create mode 100644 sd/source/filter/ppt/pptin.cxx create mode 100644 sd/source/filter/ppt/pptin.hxx create mode 100644 sd/source/filter/ppt/pptinanimations.cxx create mode 100644 sd/source/filter/ppt/pptinanimations.hxx create mode 100644 sd/source/filter/ppt/propread.cxx create mode 100644 sd/source/filter/ppt/propread.hxx create mode 100644 sd/source/filter/sdfilter.cxx create mode 100644 sd/source/filter/sdpptwrp.cxx create mode 100644 sd/source/filter/xml/sdtransform.cxx create mode 100644 sd/source/filter/xml/sdtransform.hxx create mode 100644 sd/source/filter/xml/sdxmlwrp.cxx create mode 100644 sd/source/helper/simplereferencecomponent.cxx create mode 100644 sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx create mode 100644 sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx create mode 100644 sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx create mode 100644 sd/source/ui/accessibility/AccessibleOutlineView.cxx create mode 100644 sd/source/ui/accessibility/AccessiblePageShape.cxx create mode 100644 sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx create mode 100644 sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx create mode 100644 sd/source/ui/accessibility/AccessiblePresentationShape.cxx create mode 100644 sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx create mode 100644 sd/source/ui/accessibility/AccessibleSlideSorterView.cxx create mode 100644 sd/source/ui/accessibility/AccessibleViewForwarder.cxx create mode 100644 sd/source/ui/accessibility/SdShapeTypes.cxx create mode 100644 sd/source/ui/animations/CustomAnimationDialog.cxx create mode 100644 sd/source/ui/animations/CustomAnimationDialog.hxx create mode 100644 sd/source/ui/animations/CustomAnimationList.cxx create mode 100644 sd/source/ui/animations/CustomAnimationPane.cxx create mode 100644 sd/source/ui/animations/STLPropertySet.cxx create mode 100644 sd/source/ui/animations/STLPropertySet.hxx create mode 100644 sd/source/ui/animations/SlideTransitionPane.cxx create mode 100644 sd/source/ui/animations/motionpathtag.cxx create mode 100644 sd/source/ui/animations/motionpathtag.hxx create mode 100644 sd/source/ui/annotations/annotationmanager.cxx create mode 100644 sd/source/ui/annotations/annotationmanagerimpl.hxx create mode 100644 sd/source/ui/annotations/annotationtag.cxx create mode 100644 sd/source/ui/annotations/annotationtag.hxx create mode 100644 sd/source/ui/annotations/annotationwindow.cxx create mode 100644 sd/source/ui/annotations/annotationwindow.hxx create mode 100644 sd/source/ui/app/optsitem.cxx create mode 100644 sd/source/ui/app/scalectrl.cxx create mode 100644 sd/source/ui/app/sddll.cxx create mode 100644 sd/source/ui/app/sdmod.cxx create mode 100644 sd/source/ui/app/sdmod1.cxx create mode 100644 sd/source/ui/app/sdmod2.cxx create mode 100644 sd/source/ui/app/sdpopup.cxx create mode 100644 sd/source/ui/app/sdxfer.cxx create mode 100644 sd/source/ui/app/tmplctrl.cxx create mode 100644 sd/source/ui/controller/displaymodecontroller.cxx create mode 100644 sd/source/ui/controller/slidelayoutcontroller.cxx create mode 100644 sd/source/ui/controller/slidelayoutcontroller.hxx create mode 100644 sd/source/ui/dlg/AnimationChildWindow.cxx create mode 100644 sd/source/ui/dlg/BulletAndPositionDlg.cxx create mode 100644 sd/source/ui/dlg/LayerTabBar.cxx create mode 100644 sd/source/ui/dlg/NavigatorChildWindow.cxx create mode 100644 sd/source/ui/dlg/PaneChildWindows.cxx create mode 100644 sd/source/ui/dlg/PaneShells.cxx create mode 100644 sd/source/ui/dlg/PhotoAlbumDialog.cxx create mode 100644 sd/source/ui/dlg/PhotoAlbumDialog.hxx create mode 100644 sd/source/ui/dlg/RemoteDialog.cxx create mode 100644 sd/source/ui/dlg/RemoteDialog.hxx create mode 100644 sd/source/ui/dlg/RemoteDialogClientBox.cxx create mode 100644 sd/source/ui/dlg/RemoteDialogClientBox.hxx create mode 100644 sd/source/ui/dlg/SpellDialogChildWindow.cxx create mode 100644 sd/source/ui/dlg/TemplateScanner.cxx create mode 100644 sd/source/ui/dlg/UndoThemeChange.cxx create mode 100644 sd/source/ui/dlg/animobjs.cxx create mode 100644 sd/source/ui/dlg/brkdlg.cxx create mode 100644 sd/source/ui/dlg/copydlg.cxx create mode 100644 sd/source/ui/dlg/custsdlg.cxx create mode 100644 sd/source/ui/dlg/diactrl.cxx create mode 100644 sd/source/ui/dlg/dlgchar.cxx create mode 100644 sd/source/ui/dlg/dlgfield.cxx create mode 100644 sd/source/ui/dlg/dlgolbul.cxx create mode 100644 sd/source/ui/dlg/dlgpage.cxx create mode 100644 sd/source/ui/dlg/dlgsnap.cxx create mode 100644 sd/source/ui/dlg/filedlg.cxx create mode 100644 sd/source/ui/dlg/gluectrl.cxx create mode 100644 sd/source/ui/dlg/headerfooterdlg.cxx create mode 100644 sd/source/ui/dlg/ins_paste.cxx create mode 100644 sd/source/ui/dlg/inspagob.cxx create mode 100644 sd/source/ui/dlg/layeroptionsdlg.cxx create mode 100644 sd/source/ui/dlg/masterlayoutdlg.cxx create mode 100644 sd/source/ui/dlg/morphdlg.cxx create mode 100644 sd/source/ui/dlg/navigatr.cxx create mode 100644 sd/source/ui/dlg/paragr.cxx create mode 100644 sd/source/ui/dlg/present.cxx create mode 100644 sd/source/ui/dlg/prltempl.cxx create mode 100644 sd/source/ui/dlg/prntopts.cxx create mode 100644 sd/source/ui/dlg/sdabstdlg.cxx create mode 100644 sd/source/ui/dlg/sddlgfact.cxx create mode 100644 sd/source/ui/dlg/sddlgfact.hxx create mode 100644 sd/source/ui/dlg/sdpreslt.cxx create mode 100644 sd/source/ui/dlg/sdtreelb.cxx create mode 100644 sd/source/ui/dlg/sduiexp.cxx create mode 100644 sd/source/ui/dlg/tabtempl.cxx create mode 100644 sd/source/ui/dlg/titledockwin.cxx create mode 100644 sd/source/ui/dlg/tpaction.cxx create mode 100644 sd/source/ui/dlg/tpoption.cxx create mode 100644 sd/source/ui/dlg/unchss.cxx create mode 100644 sd/source/ui/dlg/vectdlg.cxx create mode 100644 sd/source/ui/docshell/docshel2.cxx create mode 100644 sd/source/ui/docshell/docshel3.cxx create mode 100644 sd/source/ui/docshell/docshel4.cxx create mode 100644 sd/source/ui/docshell/docshell.cxx create mode 100644 sd/source/ui/docshell/grdocsh.cxx create mode 100644 sd/source/ui/docshell/sdclient.cxx create mode 100644 sd/source/ui/framework/configuration/ChangeRequestQueue.cxx create mode 100644 sd/source/ui/framework/configuration/ChangeRequestQueue.hxx create mode 100644 sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx create mode 100644 sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx create mode 100644 sd/source/ui/framework/configuration/Configuration.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationClassifier.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationClassifier.hxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationController.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationTracer.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationTracer.hxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationUpdater.cxx create mode 100644 sd/source/ui/framework/configuration/ConfigurationUpdater.hxx create mode 100644 sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx create mode 100644 sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx create mode 100644 sd/source/ui/framework/configuration/ResourceFactoryManager.cxx create mode 100644 sd/source/ui/framework/configuration/ResourceFactoryManager.hxx create mode 100644 sd/source/ui/framework/configuration/ResourceId.cxx create mode 100644 sd/source/ui/framework/configuration/UpdateRequest.cxx create mode 100644 sd/source/ui/framework/configuration/UpdateRequest.hxx create mode 100644 sd/source/ui/framework/configuration/debugtrace.hxx create mode 100644 sd/source/ui/framework/factories/BasicPaneFactory.cxx create mode 100644 sd/source/ui/framework/factories/BasicToolBarFactory.cxx create mode 100644 sd/source/ui/framework/factories/BasicViewFactory.cxx create mode 100644 sd/source/ui/framework/factories/ChildWindowPane.cxx create mode 100644 sd/source/ui/framework/factories/ChildWindowPane.hxx create mode 100644 sd/source/ui/framework/factories/FrameWindowPane.cxx create mode 100644 sd/source/ui/framework/factories/FrameWindowPane.hxx create mode 100644 sd/source/ui/framework/factories/FullScreenPane.cxx create mode 100644 sd/source/ui/framework/factories/FullScreenPane.hxx create mode 100644 sd/source/ui/framework/factories/Pane.cxx create mode 100644 sd/source/ui/framework/factories/PresentationFactory.cxx create mode 100644 sd/source/ui/framework/factories/ViewShellWrapper.cxx create mode 100644 sd/source/ui/framework/module/CenterViewFocusModule.cxx create mode 100644 sd/source/ui/framework/module/CenterViewFocusModule.hxx create mode 100644 sd/source/ui/framework/module/DrawModule.cxx create mode 100644 sd/source/ui/framework/module/ImpressModule.cxx create mode 100644 sd/source/ui/framework/module/ModuleController.cxx create mode 100644 sd/source/ui/framework/module/PresentationModule.cxx create mode 100644 sd/source/ui/framework/module/ShellStackGuard.cxx create mode 100644 sd/source/ui/framework/module/ShellStackGuard.hxx create mode 100644 sd/source/ui/framework/module/SlideSorterModule.cxx create mode 100644 sd/source/ui/framework/module/SlideSorterModule.hxx create mode 100644 sd/source/ui/framework/module/ToolBarModule.cxx create mode 100644 sd/source/ui/framework/module/ToolBarModule.hxx create mode 100644 sd/source/ui/framework/module/ViewTabBarModule.cxx create mode 100644 sd/source/ui/framework/module/ViewTabBarModule.hxx create mode 100644 sd/source/ui/framework/tools/FrameworkHelper.cxx create mode 100644 sd/source/ui/func/bulmaper.cxx create mode 100644 sd/source/ui/func/fuarea.cxx create mode 100644 sd/source/ui/func/fubullet.cxx create mode 100644 sd/source/ui/func/fuchar.cxx create mode 100644 sd/source/ui/func/fucon3d.cxx create mode 100644 sd/source/ui/func/fuconarc.cxx create mode 100644 sd/source/ui/func/fuconbez.cxx create mode 100644 sd/source/ui/func/fuconcs.cxx create mode 100644 sd/source/ui/func/fuconnct.cxx create mode 100644 sd/source/ui/func/fuconrec.cxx create mode 100644 sd/source/ui/func/fuconstr.cxx create mode 100644 sd/source/ui/func/fuconuno.cxx create mode 100644 sd/source/ui/func/fucopy.cxx create mode 100644 sd/source/ui/func/fucushow.cxx create mode 100644 sd/source/ui/func/fudraw.cxx create mode 100644 sd/source/ui/func/fudspord.cxx create mode 100644 sd/source/ui/func/fuediglu.cxx create mode 100644 sd/source/ui/func/fuexecuteinteraction.cxx create mode 100644 sd/source/ui/func/fuexpand.cxx create mode 100644 sd/source/ui/func/fuformatpaintbrush.cxx create mode 100644 sd/source/ui/func/fuhhconv.cxx create mode 100644 sd/source/ui/func/fuinsert.cxx create mode 100644 sd/source/ui/func/fuinsfil.cxx create mode 100644 sd/source/ui/func/fuline.cxx create mode 100644 sd/source/ui/func/fulinend.cxx create mode 100644 sd/source/ui/func/fulink.cxx create mode 100644 sd/source/ui/func/fumeasur.cxx create mode 100644 sd/source/ui/func/fumorph.cxx create mode 100644 sd/source/ui/func/funavig.cxx create mode 100644 sd/source/ui/func/fuoaprms.cxx create mode 100644 sd/source/ui/func/fuolbull.cxx create mode 100644 sd/source/ui/func/fuoltext.cxx create mode 100644 sd/source/ui/func/fupage.cxx create mode 100644 sd/source/ui/func/fuparagr.cxx create mode 100644 sd/source/ui/func/fupoor.cxx create mode 100644 sd/source/ui/func/fuprlout.cxx create mode 100644 sd/source/ui/func/fuprobjs.cxx create mode 100644 sd/source/ui/func/fuscale.cxx create mode 100644 sd/source/ui/func/fusearch.cxx create mode 100644 sd/source/ui/func/fusel.cxx create mode 100644 sd/source/ui/func/fusldlg.cxx create mode 100644 sd/source/ui/func/fusnapln.cxx create mode 100644 sd/source/ui/func/fusumry.cxx create mode 100644 sd/source/ui/func/futempl.cxx create mode 100644 sd/source/ui/func/futext.cxx create mode 100644 sd/source/ui/func/futhes.cxx create mode 100644 sd/source/ui/func/futransf.cxx create mode 100644 sd/source/ui/func/futxtatt.cxx create mode 100644 sd/source/ui/func/fuvect.cxx create mode 100644 sd/source/ui/func/fuzoom.cxx create mode 100644 sd/source/ui/func/sdundogr.cxx create mode 100644 sd/source/ui/func/smarttag.cxx create mode 100644 sd/source/ui/func/undoback.cxx create mode 100644 sd/source/ui/func/undoheaderfooter.cxx create mode 100644 sd/source/ui/func/undolayer.cxx create mode 100644 sd/source/ui/func/undopage.cxx create mode 100644 sd/source/ui/func/unmovss.cxx create mode 100644 sd/source/ui/func/unoaprms.cxx create mode 100644 sd/source/ui/func/unprlout.cxx create mode 100644 sd/source/ui/inc/AccessibleDocumentViewBase.hxx create mode 100644 sd/source/ui/inc/AccessibleDrawDocumentView.hxx create mode 100644 sd/source/ui/inc/AccessibleOutlineEditSource.hxx create mode 100644 sd/source/ui/inc/AccessibleOutlineView.hxx create mode 100644 sd/source/ui/inc/AccessiblePageShape.hxx create mode 100644 sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx create mode 100644 sd/source/ui/inc/AccessiblePresentationOLEShape.hxx create mode 100644 sd/source/ui/inc/AccessiblePresentationShape.hxx create mode 100644 sd/source/ui/inc/AccessibleSlideSorterObject.hxx create mode 100644 sd/source/ui/inc/AccessibleSlideSorterView.hxx create mode 100644 sd/source/ui/inc/AccessibleViewForwarder.hxx create mode 100644 sd/source/ui/inc/AnimationChildWindow.hxx create mode 100644 sd/source/ui/inc/BezierObjectBar.hxx create mode 100644 sd/source/ui/inc/BreakDlg.hxx create mode 100644 sd/source/ui/inc/BulletAndPositionDlg.hxx create mode 100644 sd/source/ui/inc/Client.hxx create mode 100644 sd/source/ui/inc/ClientView.hxx create mode 100644 sd/source/ui/inc/CustomAnimationList.hxx create mode 100644 sd/source/ui/inc/CustomAnimationPane.hxx create mode 100644 sd/source/ui/inc/DocumentRenderer.hxx create mode 100644 sd/source/ui/inc/DrawController.hxx create mode 100644 sd/source/ui/inc/DrawDocShell.hxx create mode 100644 sd/source/ui/inc/DrawSubController.hxx create mode 100644 sd/source/ui/inc/DrawViewShell.hxx create mode 100644 sd/source/ui/inc/EventMultiplexer.hxx create mode 100644 sd/source/ui/inc/FormShellManager.hxx create mode 100644 sd/source/ui/inc/FrameView.hxx create mode 100644 sd/source/ui/inc/GraphicDocShell.hxx create mode 100644 sd/source/ui/inc/GraphicObjectBar.hxx create mode 100644 sd/source/ui/inc/GraphicViewShell.hxx create mode 100644 sd/source/ui/inc/GraphicViewShellBase.hxx create mode 100644 sd/source/ui/inc/ImpressViewShellBase.hxx create mode 100644 sd/source/ui/inc/LayerTabBar.hxx create mode 100644 sd/source/ui/inc/MasterPageObserver.hxx create mode 100644 sd/source/ui/inc/MediaObjectBar.hxx create mode 100644 sd/source/ui/inc/NavigatorChildWindow.hxx create mode 100644 sd/source/ui/inc/OutlineBulletDlg.hxx create mode 100644 sd/source/ui/inc/OutlineView.hxx create mode 100644 sd/source/ui/inc/OutlineViewShell.hxx create mode 100644 sd/source/ui/inc/OutlineViewShellBase.hxx create mode 100644 sd/source/ui/inc/OutlinerIteratorImpl.hxx create mode 100644 sd/source/ui/inc/PaneChildWindows.hxx create mode 100644 sd/source/ui/inc/PaneShells.hxx create mode 100644 sd/source/ui/inc/PresentationViewShell.hxx create mode 100644 sd/source/ui/inc/PresentationViewShellBase.hxx create mode 100644 sd/source/ui/inc/PreviewRenderer.hxx create mode 100644 sd/source/ui/inc/RemoteServer.hxx create mode 100644 sd/source/ui/inc/Ruler.hxx create mode 100644 sd/source/ui/inc/SdUnoDrawView.hxx create mode 100644 sd/source/ui/inc/SdUnoOutlineView.hxx create mode 100644 sd/source/ui/inc/SdUnoSlideView.hxx create mode 100644 sd/source/ui/inc/ShellFactory.hxx create mode 100644 sd/source/ui/inc/SlideSorter.hxx create mode 100644 sd/source/ui/inc/SlideSorterViewShell.hxx create mode 100644 sd/source/ui/inc/SlideSorterViewShellBase.hxx create mode 100644 sd/source/ui/inc/SlideTransitionPane.hxx create mode 100644 sd/source/ui/inc/SpellDialogChildWindow.hxx create mode 100644 sd/source/ui/inc/TabControl.hxx create mode 100644 sd/source/ui/inc/TableDesignPane.hxx create mode 100644 sd/source/ui/inc/TemplateScanner.hxx create mode 100644 sd/source/ui/inc/TextObjectBar.hxx create mode 100644 sd/source/ui/inc/ToolBarManager.hxx create mode 100644 sd/source/ui/inc/UndoThemeChange.hxx create mode 100644 sd/source/ui/inc/View.hxx create mode 100644 sd/source/ui/inc/ViewClipboard.hxx create mode 100644 sd/source/ui/inc/ViewShell.hxx create mode 100644 sd/source/ui/inc/ViewShellBase.hxx create mode 100644 sd/source/ui/inc/ViewShellHint.hxx create mode 100644 sd/source/ui/inc/ViewShellImplementation.hxx create mode 100644 sd/source/ui/inc/ViewShellManager.hxx create mode 100644 sd/source/ui/inc/ViewTabBar.hxx create mode 100644 sd/source/ui/inc/Window.hxx create mode 100644 sd/source/ui/inc/WindowUpdater.hxx create mode 100644 sd/source/ui/inc/animobjs.hxx create mode 100644 sd/source/ui/inc/annotationmanager.hxx create mode 100644 sd/source/ui/inc/bulmaper.hxx create mode 100644 sd/source/ui/inc/copydlg.hxx create mode 100644 sd/source/ui/inc/createtableobjectbar.hxx create mode 100644 sd/source/ui/inc/custsdlg.hxx create mode 100644 sd/source/ui/inc/diactrl.hxx create mode 100644 sd/source/ui/inc/dlg_char.hxx create mode 100644 sd/source/ui/inc/dlgfield.hxx create mode 100644 sd/source/ui/inc/dlgpage.hxx create mode 100644 sd/source/ui/inc/dlgsnap.hxx create mode 100644 sd/source/ui/inc/drawview.hxx create mode 100644 sd/source/ui/inc/filedlg.hxx create mode 100644 sd/source/ui/inc/framework/Configuration.hxx create mode 100644 sd/source/ui/inc/framework/ConfigurationController.hxx create mode 100644 sd/source/ui/inc/framework/DrawModule.hxx create mode 100644 sd/source/ui/inc/framework/FrameworkHelper.hxx create mode 100644 sd/source/ui/inc/framework/ImpressModule.hxx create mode 100644 sd/source/ui/inc/framework/ModuleController.hxx create mode 100644 sd/source/ui/inc/framework/Pane.hxx create mode 100644 sd/source/ui/inc/framework/PresentationFactory.hxx create mode 100644 sd/source/ui/inc/framework/PresentationModule.hxx create mode 100644 sd/source/ui/inc/framework/ResourceId.hxx create mode 100644 sd/source/ui/inc/framework/ViewShellWrapper.hxx create mode 100644 sd/source/ui/inc/framework/factories/BasicPaneFactory.hxx create mode 100644 sd/source/ui/inc/framework/factories/BasicToolBarFactory.hxx create mode 100644 sd/source/ui/inc/framework/factories/BasicViewFactory.hxx create mode 100644 sd/source/ui/inc/fuarea.hxx create mode 100644 sd/source/ui/inc/fubullet.hxx create mode 100644 sd/source/ui/inc/fuchar.hxx create mode 100644 sd/source/ui/inc/fucon3d.hxx create mode 100644 sd/source/ui/inc/fuconarc.hxx create mode 100644 sd/source/ui/inc/fuconbez.hxx create mode 100644 sd/source/ui/inc/fuconcs.hxx create mode 100644 sd/source/ui/inc/fuconnct.hxx create mode 100644 sd/source/ui/inc/fuconrec.hxx create mode 100644 sd/source/ui/inc/fuconstr.hxx create mode 100644 sd/source/ui/inc/fuconuno.hxx create mode 100644 sd/source/ui/inc/fucopy.hxx create mode 100644 sd/source/ui/inc/fucushow.hxx create mode 100644 sd/source/ui/inc/fudraw.hxx create mode 100644 sd/source/ui/inc/fudspord.hxx create mode 100644 sd/source/ui/inc/fuediglu.hxx create mode 100644 sd/source/ui/inc/fuexecuteinteraction.hxx create mode 100644 sd/source/ui/inc/fuexpand.hxx create mode 100644 sd/source/ui/inc/fuformatpaintbrush.hxx create mode 100644 sd/source/ui/inc/fuhhconv.hxx create mode 100644 sd/source/ui/inc/fuinsert.hxx create mode 100644 sd/source/ui/inc/fuinsfil.hxx create mode 100644 sd/source/ui/inc/fuline.hxx create mode 100644 sd/source/ui/inc/fulinend.hxx create mode 100644 sd/source/ui/inc/fulink.hxx create mode 100644 sd/source/ui/inc/fumeasur.hxx create mode 100644 sd/source/ui/inc/fumorph.hxx create mode 100644 sd/source/ui/inc/funavig.hxx create mode 100644 sd/source/ui/inc/fuoaprms.hxx create mode 100644 sd/source/ui/inc/fuolbull.hxx create mode 100644 sd/source/ui/inc/fuoltext.hxx create mode 100644 sd/source/ui/inc/fupage.hxx create mode 100644 sd/source/ui/inc/fuparagr.hxx create mode 100644 sd/source/ui/inc/fupoor.hxx create mode 100644 sd/source/ui/inc/fuprlout.hxx create mode 100644 sd/source/ui/inc/fuprobjs.hxx create mode 100644 sd/source/ui/inc/fuscale.hxx create mode 100644 sd/source/ui/inc/fusearch.hxx create mode 100644 sd/source/ui/inc/fusel.hxx create mode 100644 sd/source/ui/inc/fusldlg.hxx create mode 100644 sd/source/ui/inc/fusnapln.hxx create mode 100644 sd/source/ui/inc/fusumry.hxx create mode 100644 sd/source/ui/inc/futempl.hxx create mode 100644 sd/source/ui/inc/futext.hxx create mode 100644 sd/source/ui/inc/futhes.hxx create mode 100644 sd/source/ui/inc/futransf.hxx create mode 100644 sd/source/ui/inc/futxtatt.hxx create mode 100644 sd/source/ui/inc/fuvect.hxx create mode 100644 sd/source/ui/inc/fuzoom.hxx create mode 100644 sd/source/ui/inc/gluectrl.hxx create mode 100644 sd/source/ui/inc/headerfooterdlg.hxx create mode 100644 sd/source/ui/inc/ins_paste.hxx create mode 100644 sd/source/ui/inc/inspagob.hxx create mode 100644 sd/source/ui/inc/layeroptionsdlg.hxx create mode 100644 sd/source/ui/inc/masterlayoutdlg.hxx create mode 100644 sd/source/ui/inc/morphdlg.hxx create mode 100644 sd/source/ui/inc/navigatr.hxx create mode 100644 sd/source/ui/inc/optsitem.hxx create mode 100644 sd/source/ui/inc/paragr.hxx create mode 100644 sd/source/ui/inc/pgjump.hxx create mode 100644 sd/source/ui/inc/present.hxx create mode 100644 sd/source/ui/inc/prltempl.hxx create mode 100644 sd/source/ui/inc/prntopts.hxx create mode 100644 sd/source/ui/inc/registerinterfaces.hxx create mode 100644 sd/source/ui/inc/scalectrl.hxx create mode 100644 sd/source/ui/inc/sdpopup.hxx create mode 100644 sd/source/ui/inc/sdpreslt.hxx create mode 100644 sd/source/ui/inc/sdtreelb.hxx create mode 100644 sd/source/ui/inc/sdundogr.hxx create mode 100644 sd/source/ui/inc/sdxfer.hxx create mode 100644 sd/source/ui/inc/slideshow.hxx create mode 100644 sd/source/ui/inc/smarttag.hxx create mode 100644 sd/source/ui/inc/tablefunction.hxx create mode 100644 sd/source/ui/inc/tabtempl.hxx create mode 100644 sd/source/ui/inc/titledockwin.hxx create mode 100644 sd/source/ui/inc/tmplctrl.hxx create mode 100644 sd/source/ui/inc/tools/AsynchronousCall.hxx create mode 100644 sd/source/ui/inc/tools/AsynchronousTask.hxx create mode 100644 sd/source/ui/inc/tools/ConfigurationAccess.hxx create mode 100644 sd/source/ui/inc/tools/GraphicSizeCheck.hxx create mode 100644 sd/source/ui/inc/tools/IconCache.hxx create mode 100644 sd/source/ui/inc/tools/IdleDetection.hxx create mode 100644 sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx create mode 100644 sd/source/ui/inc/tools/SlotStateListener.hxx create mode 100644 sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx create mode 100644 sd/source/ui/inc/tpaction.hxx create mode 100644 sd/source/ui/inc/tpoption.hxx create mode 100644 sd/source/ui/inc/uiobject.hxx create mode 100644 sd/source/ui/inc/unchss.hxx create mode 100644 sd/source/ui/inc/undoback.hxx create mode 100644 sd/source/ui/inc/undoheaderfooter.hxx create mode 100644 sd/source/ui/inc/undolayer.hxx create mode 100644 sd/source/ui/inc/undopage.hxx create mode 100644 sd/source/ui/inc/unmodpg.hxx create mode 100644 sd/source/ui/inc/unmovss.hxx create mode 100644 sd/source/ui/inc/unoaprms.hxx create mode 100644 sd/source/ui/inc/unokywds.hxx create mode 100644 sd/source/ui/inc/unomodel.hxx create mode 100644 sd/source/ui/inc/unopage.hxx create mode 100644 sd/source/ui/inc/unoprnms.hxx create mode 100644 sd/source/ui/inc/unosrch.hxx create mode 100644 sd/source/ui/inc/unprlout.hxx create mode 100644 sd/source/ui/inc/vectdlg.hxx create mode 100644 sd/source/ui/inc/view/viewoverlaymanager.hxx create mode 100644 sd/source/ui/inc/zoomlist.hxx create mode 100644 sd/source/ui/presenter/CanvasUpdateRequester.cxx create mode 100644 sd/source/ui/presenter/CanvasUpdateRequester.hxx create mode 100644 sd/source/ui/presenter/PresenterCanvas.cxx create mode 100644 sd/source/ui/presenter/PresenterCanvas.hxx create mode 100644 sd/source/ui/presenter/PresenterHelper.cxx create mode 100644 sd/source/ui/presenter/PresenterHelper.hxx create mode 100644 sd/source/ui/presenter/PresenterPreviewCache.cxx create mode 100644 sd/source/ui/presenter/PresenterPreviewCache.hxx create mode 100644 sd/source/ui/presenter/SlideRenderer.cxx create mode 100644 sd/source/ui/presenter/SlideRenderer.hxx create mode 100644 sd/source/ui/remotecontrol/AvahiNetworkService.cxx create mode 100644 sd/source/ui/remotecontrol/AvahiNetworkService.hxx create mode 100644 sd/source/ui/remotecontrol/BluetoothServer.cxx create mode 100644 sd/source/ui/remotecontrol/BluetoothServer.hxx create mode 100644 sd/source/ui/remotecontrol/BluetoothServer.mm create mode 100644 sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx create mode 100644 sd/source/ui/remotecontrol/BufferedStreamSocket.cxx create mode 100644 sd/source/ui/remotecontrol/BufferedStreamSocket.hxx create mode 100644 sd/source/ui/remotecontrol/Communicator.cxx create mode 100644 sd/source/ui/remotecontrol/Communicator.hxx create mode 100644 sd/source/ui/remotecontrol/DiscoveryService.cxx create mode 100644 sd/source/ui/remotecontrol/DiscoveryService.hxx create mode 100644 sd/source/ui/remotecontrol/DiscoveryService.mm create mode 100644 sd/source/ui/remotecontrol/IBluetoothSocket.hxx create mode 100644 sd/source/ui/remotecontrol/ImagePreparer.cxx create mode 100644 sd/source/ui/remotecontrol/ImagePreparer.hxx create mode 100644 sd/source/ui/remotecontrol/Listener.cxx create mode 100644 sd/source/ui/remotecontrol/Listener.hxx create mode 100644 sd/source/ui/remotecontrol/OSXBluetooth.h create mode 100644 sd/source/ui/remotecontrol/OSXBluetooth.mm create mode 100644 sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx create mode 100644 sd/source/ui/remotecontrol/OSXNetworkService.h create mode 100644 sd/source/ui/remotecontrol/OSXNetworkService.hxx create mode 100644 sd/source/ui/remotecontrol/OSXNetworkService.mm create mode 100644 sd/source/ui/remotecontrol/Receiver.cxx create mode 100644 sd/source/ui/remotecontrol/Receiver.hxx create mode 100644 sd/source/ui/remotecontrol/Server.cxx create mode 100644 sd/source/ui/remotecontrol/Transmitter.cxx create mode 100644 sd/source/ui/remotecontrol/Transmitter.hxx create mode 100644 sd/source/ui/remotecontrol/WINNetworkService.cxx create mode 100644 sd/source/ui/remotecontrol/WINNetworkService.hxx create mode 100644 sd/source/ui/remotecontrol/ZeroconfService.hxx create mode 100644 sd/source/ui/sidebar/AllMasterPagesSelector.cxx create mode 100644 sd/source/ui/sidebar/AllMasterPagesSelector.hxx create mode 100644 sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx create mode 100644 sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx create mode 100644 sd/source/ui/sidebar/DocumentHelper.cxx create mode 100644 sd/source/ui/sidebar/DocumentHelper.hxx create mode 100644 sd/source/ui/sidebar/IDisposable.hxx create mode 100644 sd/source/ui/sidebar/ISidebarReceiver.hxx create mode 100644 sd/source/ui/sidebar/LayoutMenu.cxx create mode 100644 sd/source/ui/sidebar/LayoutMenu.hxx create mode 100644 sd/source/ui/sidebar/MasterPageContainer.cxx create mode 100644 sd/source/ui/sidebar/MasterPageContainer.hxx create mode 100644 sd/source/ui/sidebar/MasterPageContainerFiller.cxx create mode 100644 sd/source/ui/sidebar/MasterPageContainerFiller.hxx create mode 100644 sd/source/ui/sidebar/MasterPageContainerProviders.cxx create mode 100644 sd/source/ui/sidebar/MasterPageContainerProviders.hxx create mode 100644 sd/source/ui/sidebar/MasterPageContainerQueue.cxx create mode 100644 sd/source/ui/sidebar/MasterPageContainerQueue.hxx create mode 100644 sd/source/ui/sidebar/MasterPageDescriptor.cxx create mode 100644 sd/source/ui/sidebar/MasterPageDescriptor.hxx create mode 100644 sd/source/ui/sidebar/MasterPageObserver.cxx create mode 100644 sd/source/ui/sidebar/MasterPagesSelector.cxx create mode 100644 sd/source/ui/sidebar/MasterPagesSelector.hxx create mode 100644 sd/source/ui/sidebar/NavigatorWrapper.cxx create mode 100644 sd/source/ui/sidebar/NavigatorWrapper.hxx create mode 100644 sd/source/ui/sidebar/PageMarginUtils.hxx create mode 100644 sd/source/ui/sidebar/PanelFactory.cxx create mode 100644 sd/source/ui/sidebar/PanelFactory.hxx create mode 100644 sd/source/ui/sidebar/PreviewValueSet.cxx create mode 100644 sd/source/ui/sidebar/PreviewValueSet.hxx create mode 100644 sd/source/ui/sidebar/RecentMasterPagesSelector.cxx create mode 100644 sd/source/ui/sidebar/RecentMasterPagesSelector.hxx create mode 100644 sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx create mode 100644 sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx create mode 100644 sd/source/ui/sidebar/SlideBackground.cxx create mode 100644 sd/source/ui/sidebar/SlideBackground.hxx create mode 100644 sd/source/ui/slideshow/PaneHider.cxx create mode 100644 sd/source/ui/slideshow/PaneHider.hxx create mode 100644 sd/source/ui/slideshow/SlideShowRestarter.cxx create mode 100644 sd/source/ui/slideshow/SlideShowRestarter.hxx create mode 100644 sd/source/ui/slideshow/showwin.cxx create mode 100644 sd/source/ui/slideshow/showwindow.hxx create mode 100644 sd/source/ui/slideshow/slideshow.cxx create mode 100644 sd/source/ui/slideshow/slideshowimpl.cxx create mode 100644 sd/source/ui/slideshow/slideshowimpl.hxx create mode 100644 sd/source/ui/slideshow/slideshowviewimpl.cxx create mode 100644 sd/source/ui/slideshow/slideshowviewimpl.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsPageCache.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx create mode 100644 sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx create mode 100644 sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx create mode 100644 sd/source/ui/slidesorter/controller/SlideSorterController.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsAnimator.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsClipboard.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx create mode 100644 sd/source/ui/slidesorter/controller/SlsFocusManager.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsListener.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsListener.hxx create mode 100644 sd/source/ui/slidesorter/controller/SlsPageSelector.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsProperties.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsSlotManager.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsTransferableData.cxx create mode 100644 sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx create mode 100644 sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx create mode 100644 sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx create mode 100644 sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx create mode 100644 sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx create mode 100644 sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsTheme.hxx create mode 100644 sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx create mode 100644 sd/source/ui/slidesorter/model/SlideSorterModel.cxx create mode 100644 sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx create mode 100644 sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx create mode 100644 sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx create mode 100644 sd/source/ui/slidesorter/model/SlsVisualState.cxx create mode 100644 sd/source/ui/slidesorter/shell/SlideSorter.cxx create mode 100644 sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx create mode 100644 sd/source/ui/slidesorter/view/SlideSorterView.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsFramePainter.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsFramePainter.hxx create mode 100644 sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx create mode 100644 sd/source/ui/slidesorter/view/SlsLayouter.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsTheme.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsToolTip.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx create mode 100644 sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx create mode 100644 sd/source/ui/table/TableDesignPane.cxx create mode 100644 sd/source/ui/table/tablefunction.cxx create mode 100644 sd/source/ui/table/tableobjectbar.cxx create mode 100644 sd/source/ui/table/tableobjectbar.hxx create mode 100644 sd/source/ui/tools/AsynchronousCall.cxx create mode 100644 sd/source/ui/tools/ConfigurationAccess.cxx create mode 100644 sd/source/ui/tools/EventMultiplexer.cxx create mode 100644 sd/source/ui/tools/GraphicSizeCheck.cxx create mode 100644 sd/source/ui/tools/IconCache.cxx create mode 100644 sd/source/ui/tools/IdleDetection.cxx create mode 100644 sd/source/ui/tools/PreviewRenderer.cxx create mode 100644 sd/source/ui/tools/SdGlobalResourceContainer.cxx create mode 100644 sd/source/ui/tools/SlotStateListener.cxx create mode 100644 sd/source/ui/tools/TimerBasedTaskExecution.cxx create mode 100644 sd/source/ui/uitest/uiobject.cxx create mode 100644 sd/source/ui/unoidl/DrawController.cxx create mode 100644 sd/source/ui/unoidl/SdUnoDrawView.cxx create mode 100644 sd/source/ui/unoidl/SdUnoOutlineView.cxx create mode 100644 sd/source/ui/unoidl/SdUnoSlideView.cxx create mode 100644 sd/source/ui/unoidl/UnoDocumentSettings.cxx create mode 100644 sd/source/ui/unoidl/UnoDocumentSettings.hxx create mode 100644 sd/source/ui/unoidl/randomnode.cxx create mode 100644 sd/source/ui/unoidl/sddetect.cxx create mode 100644 sd/source/ui/unoidl/sddetect.hxx create mode 100644 sd/source/ui/unoidl/unocpres.cxx create mode 100644 sd/source/ui/unoidl/unocpres.hxx create mode 100644 sd/source/ui/unoidl/unodoc.cxx create mode 100644 sd/source/ui/unoidl/unolayer.cxx create mode 100644 sd/source/ui/unoidl/unolayer.hxx create mode 100644 sd/source/ui/unoidl/unomodel.cxx create mode 100644 sd/source/ui/unoidl/unomodule.cxx create mode 100644 sd/source/ui/unoidl/unomodule.hxx create mode 100644 sd/source/ui/unoidl/unoobj.cxx create mode 100644 sd/source/ui/unoidl/unoobj.hxx create mode 100644 sd/source/ui/unoidl/unopage.cxx create mode 100644 sd/source/ui/unoidl/unopback.cxx create mode 100644 sd/source/ui/unoidl/unopback.hxx create mode 100644 sd/source/ui/unoidl/unopool.cxx create mode 100644 sd/source/ui/unoidl/unopool.hxx create mode 100644 sd/source/ui/unoidl/unosrch.cxx create mode 100644 sd/source/ui/unoidl/unowcntr.cxx create mode 100644 sd/source/ui/unoidl/unowcntr.hxx create mode 100644 sd/source/ui/view/DocumentRenderer.cxx create mode 100644 sd/source/ui/view/FormShellManager.cxx create mode 100644 sd/source/ui/view/GraphicObjectBar.cxx create mode 100644 sd/source/ui/view/GraphicViewShellBase.cxx create mode 100644 sd/source/ui/view/ImpressViewShellBase.cxx create mode 100644 sd/source/ui/view/MediaObjectBar.cxx create mode 100644 sd/source/ui/view/OutlineViewShellBase.cxx create mode 100644 sd/source/ui/view/Outliner.cxx create mode 100644 sd/source/ui/view/OutlinerIterator.cxx create mode 100644 sd/source/ui/view/PresentationViewShellBase.cxx create mode 100644 sd/source/ui/view/SlideSorterViewShellBase.cxx create mode 100644 sd/source/ui/view/ToolBarManager.cxx create mode 100644 sd/source/ui/view/ViewClipboard.cxx create mode 100644 sd/source/ui/view/ViewShellBase.cxx create mode 100644 sd/source/ui/view/ViewShellHint.cxx create mode 100644 sd/source/ui/view/ViewShellImplementation.cxx create mode 100644 sd/source/ui/view/ViewShellManager.cxx create mode 100644 sd/source/ui/view/ViewTabBar.cxx create mode 100644 sd/source/ui/view/WindowUpdater.cxx create mode 100644 sd/source/ui/view/clview.cxx create mode 100644 sd/source/ui/view/drawview.cxx create mode 100644 sd/source/ui/view/drbezob.cxx create mode 100644 sd/source/ui/view/drtxtob.cxx create mode 100644 sd/source/ui/view/drtxtob1.cxx create mode 100644 sd/source/ui/view/drviews1.cxx create mode 100644 sd/source/ui/view/drviews2.cxx create mode 100644 sd/source/ui/view/drviews3.cxx create mode 100644 sd/source/ui/view/drviews4.cxx create mode 100644 sd/source/ui/view/drviews5.cxx create mode 100644 sd/source/ui/view/drviews6.cxx create mode 100644 sd/source/ui/view/drviews7.cxx create mode 100644 sd/source/ui/view/drviews8.cxx create mode 100644 sd/source/ui/view/drviews9.cxx create mode 100644 sd/source/ui/view/drviewsa.cxx create mode 100644 sd/source/ui/view/drviewsb.cxx create mode 100644 sd/source/ui/view/drviewsc.cxx create mode 100644 sd/source/ui/view/drviewsd.cxx create mode 100644 sd/source/ui/view/drviewse.cxx create mode 100644 sd/source/ui/view/drviewsf.cxx create mode 100644 sd/source/ui/view/drviewsg.cxx create mode 100644 sd/source/ui/view/drviewsh.cxx create mode 100644 sd/source/ui/view/drviewsi.cxx create mode 100644 sd/source/ui/view/drviewsj.cxx create mode 100644 sd/source/ui/view/drviewsk.cxx create mode 100644 sd/source/ui/view/drvwshrg.cxx create mode 100644 sd/source/ui/view/frmview.cxx create mode 100644 sd/source/ui/view/grviewsh.cxx create mode 100644 sd/source/ui/view/outlnvs2.cxx create mode 100644 sd/source/ui/view/outlnvsh.cxx create mode 100644 sd/source/ui/view/outlview.cxx create mode 100644 sd/source/ui/view/presvish.cxx create mode 100644 sd/source/ui/view/sdruler.cxx create mode 100644 sd/source/ui/view/sdview.cxx create mode 100644 sd/source/ui/view/sdview2.cxx create mode 100644 sd/source/ui/view/sdview3.cxx create mode 100644 sd/source/ui/view/sdview4.cxx create mode 100644 sd/source/ui/view/sdview5.cxx create mode 100644 sd/source/ui/view/sdwindow.cxx create mode 100644 sd/source/ui/view/tabcontr.cxx create mode 100644 sd/source/ui/view/unmodpg.cxx create mode 100644 sd/source/ui/view/viewoverlaymanager.cxx create mode 100644 sd/source/ui/view/viewshe2.cxx create mode 100644 sd/source/ui/view/viewshe3.cxx create mode 100644 sd/source/ui/view/viewshel.cxx create mode 100644 sd/source/ui/view/zoomlist.cxx create mode 100644 sd/uiconfig/sdraw/menubar/menubar.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/3dobject.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/3dscene.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/3dscene2.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/bezier.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/connector.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/curve.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/draw.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/drawtext.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/form.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/formrichtext.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/gluepoint.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/graphic.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/group.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/layertab.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/line.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/measure.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/media.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/multiselect.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/notebookbar.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/objectalign.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/oleobject.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/page.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/pagepane.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/pagetab.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/table.xml create mode 100644 sd/uiconfig/sdraw/popupmenu/textbox.xml create mode 100644 sd/uiconfig/sdraw/statusbar/statusbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/alignmentbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/arrowsbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/arrowshapes.xml create mode 100644 sd/uiconfig/sdraw/toolbar/basicshapes.xml create mode 100644 sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/calloutshapes.xml create mode 100644 sd/uiconfig/sdraw/toolbar/choosemodebar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/colorbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/commentsbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/connectorsbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/distributebar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/ellipsesbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/findbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/flowchartshapes.xml create mode 100644 sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml create mode 100644 sd/uiconfig/sdraw/toolbar/formcontrols.xml create mode 100644 sd/uiconfig/sdraw/toolbar/formdesign.xml create mode 100644 sd/uiconfig/sdraw/toolbar/formsfilterbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/fullscreenbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/graffilterbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/insertbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/linesbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml create mode 100644 sd/uiconfig/sdraw/toolbar/optimizetablebar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/optionsbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/positionbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/rectanglesbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/redactedexportbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/redactionbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/standardbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/starshapes.xml create mode 100644 sd/uiconfig/sdraw/toolbar/symbolshapes.xml create mode 100644 sd/uiconfig/sdraw/toolbar/tableobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/textbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/textobjectbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/toolbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/viewerbar.xml create mode 100644 sd/uiconfig/sdraw/toolbar/zoombar.xml create mode 100644 sd/uiconfig/sdraw/ui/breakdialog.ui create mode 100644 sd/uiconfig/sdraw/ui/bulletsandnumbering.ui create mode 100644 sd/uiconfig/sdraw/ui/copydlg.ui create mode 100644 sd/uiconfig/sdraw/ui/crossfadedialog.ui create mode 100644 sd/uiconfig/sdraw/ui/dlgsnap.ui create mode 100644 sd/uiconfig/sdraw/ui/drawchardialog.ui create mode 100644 sd/uiconfig/sdraw/ui/drawpagedialog.ui create mode 100644 sd/uiconfig/sdraw/ui/drawparadialog.ui create mode 100644 sd/uiconfig/sdraw/ui/drawprinteroptions.ui create mode 100644 sd/uiconfig/sdraw/ui/drawprtldialog.ui create mode 100644 sd/uiconfig/sdraw/ui/insertlayer.ui create mode 100644 sd/uiconfig/sdraw/ui/insertslidesdialog.ui create mode 100644 sd/uiconfig/sdraw/ui/namedesign.ui create mode 100644 sd/uiconfig/sdraw/ui/navigatorcontextmenu.ui create mode 100644 sd/uiconfig/sdraw/ui/notebookbar.ui create mode 100644 sd/uiconfig/sdraw/ui/notebookbar_compact.ui create mode 100644 sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui create mode 100644 sd/uiconfig/sdraw/ui/notebookbar_online.ui create mode 100644 sd/uiconfig/sdraw/ui/notebookbar_single.ui create mode 100644 sd/uiconfig/sdraw/ui/paranumberingtab.ui create mode 100644 sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui create mode 100644 sd/uiconfig/sdraw/ui/vectorize.ui create mode 100644 sd/uiconfig/simpress/menubar/menubar.xml create mode 100644 sd/uiconfig/simpress/popupmenu/3dobject.xml create mode 100644 sd/uiconfig/simpress/popupmenu/3dscene.xml create mode 100644 sd/uiconfig/simpress/popupmenu/3dscene2.xml create mode 100644 sd/uiconfig/simpress/popupmenu/bezier.xml create mode 100644 sd/uiconfig/simpress/popupmenu/connector.xml create mode 100644 sd/uiconfig/simpress/popupmenu/curve.xml create mode 100644 sd/uiconfig/simpress/popupmenu/draw.xml create mode 100644 sd/uiconfig/simpress/popupmenu/drawtext.xml create mode 100644 sd/uiconfig/simpress/popupmenu/form.xml create mode 100644 sd/uiconfig/simpress/popupmenu/formrichtext.xml create mode 100644 sd/uiconfig/simpress/popupmenu/gluepoint.xml create mode 100644 sd/uiconfig/simpress/popupmenu/graphic.xml create mode 100644 sd/uiconfig/simpress/popupmenu/group.xml create mode 100644 sd/uiconfig/simpress/popupmenu/line.xml create mode 100644 sd/uiconfig/simpress/popupmenu/measure.xml create mode 100644 sd/uiconfig/simpress/popupmenu/media.xml create mode 100644 sd/uiconfig/simpress/popupmenu/multiselect.xml create mode 100644 sd/uiconfig/simpress/popupmenu/notebookbar.xml create mode 100644 sd/uiconfig/simpress/popupmenu/objectalign.xml create mode 100644 sd/uiconfig/simpress/popupmenu/oleobject.xml create mode 100644 sd/uiconfig/simpress/popupmenu/outline.xml create mode 100644 sd/uiconfig/simpress/popupmenu/page.xml create mode 100644 sd/uiconfig/simpress/popupmenu/pagepane.xml create mode 100644 sd/uiconfig/simpress/popupmenu/pagepanemaster.xml create mode 100644 sd/uiconfig/simpress/popupmenu/pagepanenosel.xml create mode 100644 sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml create mode 100644 sd/uiconfig/simpress/popupmenu/pagetab.xml create mode 100644 sd/uiconfig/simpress/popupmenu/table.xml create mode 100644 sd/uiconfig/simpress/popupmenu/textbox.xml create mode 100644 sd/uiconfig/simpress/statusbar/statusbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/3dobjectsbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/alignmentbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/arrowsbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/arrowshapes.xml create mode 100644 sd/uiconfig/simpress/toolbar/basicshapes.xml create mode 100644 sd/uiconfig/simpress/toolbar/bezierobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/calloutshapes.xml create mode 100644 sd/uiconfig/simpress/toolbar/choosemodebar.xml create mode 100644 sd/uiconfig/simpress/toolbar/classificationbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/colorbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/commentsbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/commontaskbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/connectorsbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/distributebar.xml create mode 100644 sd/uiconfig/simpress/toolbar/drawingobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/ellipsesbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/findbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/flowchartshapes.xml create mode 100644 sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/fontworkshapetype.xml create mode 100644 sd/uiconfig/simpress/toolbar/formcontrols.xml create mode 100644 sd/uiconfig/simpress/toolbar/formdesign.xml create mode 100644 sd/uiconfig/simpress/toolbar/formsfilterbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/formsnavigationbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/formtextobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/fullscreenbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/graffilterbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/graphicobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/insertbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/linesbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/mediaobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml create mode 100644 sd/uiconfig/simpress/toolbar/optimizetablebar.xml create mode 100644 sd/uiconfig/simpress/toolbar/optionsbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/outlinetoolbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/positionbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/rectanglesbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/singlemode.xml create mode 100644 sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/standardbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/starshapes.xml create mode 100644 sd/uiconfig/simpress/toolbar/symbolshapes.xml create mode 100644 sd/uiconfig/simpress/toolbar/tableobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/textbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/textobjectbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/toolbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/viewerbar.xml create mode 100644 sd/uiconfig/simpress/toolbar/zoombar.xml create mode 100644 sd/uiconfig/simpress/ui/annotation.ui create mode 100644 sd/uiconfig/simpress/ui/annotationtagmenu.ui create mode 100644 sd/uiconfig/simpress/ui/clientboxfragment.ui create mode 100644 sd/uiconfig/simpress/ui/currentmastermenu.ui create mode 100644 sd/uiconfig/simpress/ui/customanimationeffecttab.ui create mode 100644 sd/uiconfig/simpress/ui/customanimationfragment.ui create mode 100644 sd/uiconfig/simpress/ui/customanimationproperties.ui create mode 100644 sd/uiconfig/simpress/ui/customanimationspanel.ui create mode 100644 sd/uiconfig/simpress/ui/customanimationtexttab.ui create mode 100644 sd/uiconfig/simpress/ui/customanimationtimingtab.ui create mode 100644 sd/uiconfig/simpress/ui/customslideshows.ui create mode 100644 sd/uiconfig/simpress/ui/definecustomslideshow.ui create mode 100644 sd/uiconfig/simpress/ui/displaywindow.ui create mode 100644 sd/uiconfig/simpress/ui/dlgfield.ui create mode 100644 sd/uiconfig/simpress/ui/dockinganimation.ui create mode 100644 sd/uiconfig/simpress/ui/effectmenu.ui create mode 100644 sd/uiconfig/simpress/ui/fieldmenu.ui create mode 100644 sd/uiconfig/simpress/ui/fontsizemenu.ui create mode 100644 sd/uiconfig/simpress/ui/fontstylemenu.ui create mode 100644 sd/uiconfig/simpress/ui/gluebox.ui create mode 100644 sd/uiconfig/simpress/ui/headerfooterdialog.ui create mode 100644 sd/uiconfig/simpress/ui/headerfootertab.ui create mode 100644 sd/uiconfig/simpress/ui/impressprinteroptions.ui create mode 100644 sd/uiconfig/simpress/ui/insertslides.ui create mode 100644 sd/uiconfig/simpress/ui/interactiondialog.ui create mode 100644 sd/uiconfig/simpress/ui/interactionpage.ui create mode 100644 sd/uiconfig/simpress/ui/layoutmenu.ui create mode 100644 sd/uiconfig/simpress/ui/layoutpanel.ui create mode 100644 sd/uiconfig/simpress/ui/layoutwindow.ui create mode 100644 sd/uiconfig/simpress/ui/masterlayoutdlg.ui create mode 100644 sd/uiconfig/simpress/ui/mastermenu.ui create mode 100644 sd/uiconfig/simpress/ui/masterpagemenu.ui create mode 100644 sd/uiconfig/simpress/ui/masterpagepanel.ui create mode 100644 sd/uiconfig/simpress/ui/masterpagepanelall.ui create mode 100644 sd/uiconfig/simpress/ui/masterpagepanelrecent.ui create mode 100644 sd/uiconfig/simpress/ui/navigatorpanel.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar_compact.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar_groups.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar_online.ui create mode 100644 sd/uiconfig/simpress/ui/notebookbar_single.ui create mode 100644 sd/uiconfig/simpress/ui/optimpressgeneralpage.ui create mode 100644 sd/uiconfig/simpress/ui/pagesfieldbox.ui create mode 100644 sd/uiconfig/simpress/ui/photoalbum.ui create mode 100644 sd/uiconfig/simpress/ui/pmimagespage.ui create mode 100644 sd/uiconfig/simpress/ui/pminfodialog.ui create mode 100644 sd/uiconfig/simpress/ui/pmintropage.ui create mode 100644 sd/uiconfig/simpress/ui/pmobjectspage.ui create mode 100644 sd/uiconfig/simpress/ui/pmslidespage.ui create mode 100644 sd/uiconfig/simpress/ui/pmsummarypage.ui create mode 100644 sd/uiconfig/simpress/ui/presentationdialog.ui create mode 100644 sd/uiconfig/simpress/ui/prntopts.ui create mode 100644 sd/uiconfig/simpress/ui/remotedialog.ui create mode 100644 sd/uiconfig/simpress/ui/rotatemenu.ui create mode 100644 sd/uiconfig/simpress/ui/scalemenu.ui create mode 100644 sd/uiconfig/simpress/ui/sdviewpage.ui create mode 100644 sd/uiconfig/simpress/ui/sidebarslidebackground.ui create mode 100644 sd/uiconfig/simpress/ui/slidecontextmenu.ui create mode 100644 sd/uiconfig/simpress/ui/slidedesigndialog.ui create mode 100644 sd/uiconfig/simpress/ui/slidetransitionspanel.ui create mode 100644 sd/uiconfig/simpress/ui/snapmenu.ui create mode 100644 sd/uiconfig/simpress/ui/tabledesignpanel.ui create mode 100644 sd/uiconfig/simpress/ui/tabviewbar.ui create mode 100644 sd/uiconfig/simpress/ui/templatedialog.ui create mode 100644 sd/util/sd.component create mode 100644 sd/util/sdd.component create mode 100644 sd/workben/custompanel/ctp_panel.cxx create mode 100644 sd/workben/custompanel/ctp_panel.hxx create mode 100644 sd/workben/testdll/makefile create mode 100644 sd/xml/effects.xml create mode 100644 sd/xml/layoutlist.xml create mode 100644 sd/xml/objectlist.xml create mode 100644 sd/xml/styles.xml create mode 100644 sd/xml/transitions-ogl.xml create mode 100644 sd/xml/transitions.xml create mode 100644 sd/xsl/effect.xsl (limited to 'sd') diff --git a/sd/AllLangMoTarget_sd.mk b/sd/AllLangMoTarget_sd.mk new file mode 100644 index 0000000000..7ea813e5fa --- /dev/null +++ b/sd/AllLangMoTarget_sd.mk @@ -0,0 +1,11 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +$(eval $(call gb_AllLangMoTarget_AllLangMoTarget,sd)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_a11y.mk b/sd/CppunitTest_sd_a11y.mk new file mode 100644 index 0000000000..6b0c228607 --- /dev/null +++ b/sd/CppunitTest_sd_a11y.mk @@ -0,0 +1,38 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,sd_a11y)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_a11y, \ + sd/qa/unit/a11y/layout \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_a11y, \ + sal \ + cppu \ + subsequenttest \ + test \ + unotest \ + vcl \ +)) + +$(eval $(call gb_CppunitTest_use_api,sd_a11y,\ + offapi \ + udkapi \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_a11y)) +$(eval $(call gb_CppunitTest_use_rdb,sd_a11y,services)) +$(eval $(call gb_CppunitTest_use_ure,sd_a11y)) +$(eval $(call gb_CppunitTest_use_vcl,sd_a11y)) + +$(eval $(call gb_CppunitTest_use_instdir_configuration,sd_a11y)) +$(eval $(call gb_CppunitTest_use_common_configuration,sd_a11y)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_activex_controls_tests.mk b/sd/CppunitTest_sd_activex_controls_tests.mk new file mode 100644 index 0000000000..8659a59021 --- /dev/null +++ b/sd/CppunitTest_sd_activex_controls_tests.mk @@ -0,0 +1,72 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,sd_activex_controls_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_activex_controls_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_activex_controls_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_activex_controls_tests, \ + sd/qa/unit/activex-controls-tests \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_activex_controls_tests, \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_activex_controls_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_activex_controls_tests)) + +$(eval $(call gb_CppunitTest_use_ure,sd_activex_controls_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_activex_controls_tests)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_activex_controls_tests,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_activex_controls_tests)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_dialogs_test.mk b/sd/CppunitTest_sd_dialogs_test.mk new file mode 100644 index 0000000000..839f702de7 --- /dev/null +++ b/sd/CppunitTest_sd_dialogs_test.mk @@ -0,0 +1,77 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitScreenShot,sd_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_dialogs_test)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_dialogs_test, \ + sd/qa/unit/dialogs-test \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_dialogs_test)) + +$(eval $(call gb_CppunitTest_set_include,sd_dialogs_test,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_dialogs_test, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + i18nlangtag \ + i18nutil \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sdui \ + sfx \ + sot \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_use_external,sd_dialogs_test,boost_headers)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_ure,sd_dialogs_test)) +$(eval $(call gb_CppunitTest_use_vcl_non_headless_with_windows,sd_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_dialogs_test,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_uiconfigs,sd_dialogs_test,\ + cui \ + modules/sdraw \ + modules/simpress \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_export_tests-ooxml1.mk b/sd/CppunitTest_sd_export_tests-ooxml1.mk new file mode 100644 index 0000000000..914ff8ec59 --- /dev/null +++ b/sd/CppunitTest_sd_export_tests-ooxml1.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sd_export_test,-ooxml1)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_export_tests-ooxml2.mk b/sd/CppunitTest_sd_export_tests-ooxml2.mk new file mode 100644 index 0000000000..44664f69aa --- /dev/null +++ b/sd/CppunitTest_sd_export_tests-ooxml2.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sd_export_test,-ooxml2)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_export_tests-ooxml3.mk b/sd/CppunitTest_sd_export_tests-ooxml3.mk new file mode 100644 index 0000000000..4e79f4ccd9 --- /dev/null +++ b/sd/CppunitTest_sd_export_tests-ooxml3.mk @@ -0,0 +1,17 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sd_export_test,-ooxml3)) + +$(call gb_CppunitTest_get_target,sd_export_tests-ooxml3): \ + $(call gb_Package_get_target,postprocess_images) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_export_tests-ooxml4.mk b/sd/CppunitTest_sd_export_tests-ooxml4.mk new file mode 100644 index 0000000000..273d426baa --- /dev/null +++ b/sd/CppunitTest_sd_export_tests-ooxml4.mk @@ -0,0 +1,17 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sd_export_test,-ooxml4)) + +$(call gb_CppunitTest_get_target,sd_export_tests-ooxml4): \ + $(call gb_Package_get_target,postprocess_images) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_export_tests.mk b/sd/CppunitTest_sd_export_tests.mk new file mode 100644 index 0000000000..20aea4da12 --- /dev/null +++ b/sd/CppunitTest_sd_export_tests.mk @@ -0,0 +1,15 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +# empty second argument (i.e. no 1) +$(eval $(call sd_export_test,)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_filter_eppt.mk b/sd/CppunitTest_sd_filter_eppt.mk new file mode 100644 index 0000000000..261fa3052e --- /dev/null +++ b/sd/CppunitTest_sd_filter_eppt.mk @@ -0,0 +1,54 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_filter_eppt)) + +$(eval $(call gb_CppunitTest_use_externals,sd_filter_eppt,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_filter_eppt, \ + sd/qa/filter/eppt/eppt \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_filter_eppt, \ + comphelper \ + cppu \ + cppuhelper \ + docmodel \ + sd \ + sal \ + subsequenttest \ + test \ + unotest \ + utl \ + tl \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_filter_eppt)) + +$(eval $(call gb_CppunitTest_use_ure,sd_filter_eppt)) +$(eval $(call gb_CppunitTest_use_vcl,sd_filter_eppt)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_filter_eppt,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_filter_eppt,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_filter_eppt)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_filter_eppt, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_filters_test.mk b/sd/CppunitTest_sd_filters_test.mk new file mode 100644 index 0000000000..0668683fa0 --- /dev/null +++ b/sd/CppunitTest_sd_filters_test.mk @@ -0,0 +1,78 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_filters_test)) + +$(eval $(call gb_CppunitTest_use_external,sd_filters_test,boost_headers)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_filters_test)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_filters_test, \ + sd/qa/unit/filters-test \ +)) + +ifeq ($(DISABLE_CVE_TESTS),TRUE) +$(eval $(call gb_CppunitTest_add_defs,sd_filters_test,\ + -DDISABLE_CVE_TESTS \ +)) +endif + +$(eval $(call gb_CppunitTest_use_libraries,sd_filters_test, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + i18nlangtag \ + i18nutil \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_filters_test,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_filters_test)) + +$(eval $(call gb_CppunitTest_use_ure,sd_filters_test)) +$(eval $(call gb_CppunitTest_use_vcl,sd_filters_test)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_filters_test,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_filters_test)) + +# sd dlopens libicg.so for cgm import, so ensure its built by now +$(call gb_CppunitTest_get_target,sd_filters_test) : | \ + $(call gb_Library_get_target,icg) \ + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_html_export_tests.mk b/sd/CppunitTest_sd_html_export_tests.mk new file mode 100644 index 0000000000..1d69688860 --- /dev/null +++ b/sd/CppunitTest_sd_html_export_tests.mk @@ -0,0 +1,73 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_html_export_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_html_export_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_html_export_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_html_export_tests, \ + sd/qa/unit/HtmlExportTest \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_html_export_tests, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_html_export_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_html_export_tests)) + +$(eval $(call gb_CppunitTest_use_ure,sd_html_export_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_html_export_tests)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_html_export_tests,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_html_export_tests)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_import_tests-smartart.mk b/sd/CppunitTest_sd_import_tests-smartart.mk new file mode 100644 index 0000000000..22ad3c4a5e --- /dev/null +++ b/sd/CppunitTest_sd_import_tests-smartart.mk @@ -0,0 +1,18 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sd_import_test,-smartart)) + +ifneq ($(filter MORE_FONTS,$(BUILD_TYPE)),) +$(eval $(call gb_CppunitTest_set_non_application_font_use,sd_import_tests-smartart,abort)) +endif + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_import_tests.mk b/sd/CppunitTest_sd_import_tests.mk new file mode 100644 index 0000000000..c75b571c2f --- /dev/null +++ b/sd/CppunitTest_sd_import_tests.mk @@ -0,0 +1,15 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +# empty second argument (i.e. no 1) +$(eval $(call sd_import_test,)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_import_tests2.mk b/sd/CppunitTest_sd_import_tests2.mk new file mode 100644 index 0000000000..102de14b4c --- /dev/null +++ b/sd/CppunitTest_sd_import_tests2.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sd_import_test,2)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_import_tests_skia.mk b/sd/CppunitTest_sd_import_tests_skia.mk new file mode 100644 index 0000000000..bb0d0ad2a3 --- /dev/null +++ b/sd/CppunitTest_sd_import_tests_skia.mk @@ -0,0 +1,13 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call sd_import_test,_skia)) +$(eval $(call gb_CppunitTest_use_vcl_non_headless,sd_import_tests_skia)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_layout_tests.mk b/sd/CppunitTest_sd_layout_tests.mk new file mode 100644 index 0000000000..364feaed98 --- /dev/null +++ b/sd/CppunitTest_sd_layout_tests.mk @@ -0,0 +1,78 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_layout_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_layout_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_layout_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_layout_tests, \ + sd/qa/unit/layout-tests \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_layout_tests, \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_layout_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_layout_tests)) + +$(eval $(call gb_CppunitTest_use_ure,sd_layout_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_layout_tests)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_layout_tests,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_layout_tests,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_layout_tests)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_misc_tests.mk b/sd/CppunitTest_sd_misc_tests.mk new file mode 100644 index 0000000000..f98f32a683 --- /dev/null +++ b/sd/CppunitTest_sd_misc_tests.mk @@ -0,0 +1,83 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_misc_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_misc_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_misc_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_misc_tests, \ + sd/qa/unit/misc-tests \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_misc_tests, \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + docmodel \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_misc_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_misc_tests)) + +$(eval $(call gb_CppunitTest_use_ure,sd_misc_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_misc_tests)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_misc_tests,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_misc_tests,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_misc_tests)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_misc_tests, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_pdf_import_test.mk b/sd/CppunitTest_sd_pdf_import_test.mk new file mode 100644 index 0000000000..eb3a6ecf93 --- /dev/null +++ b/sd/CppunitTest_sd_pdf_import_test.mk @@ -0,0 +1,73 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,sd_pdf_import_test)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_pdf_import_test, \ + sd/qa/unit/SdrPdfImportTest \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sd_pdf_import_test, \ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_pdf_import_test,\ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/source/ui/slidesorter/inc \ + -I$(SRCDIR)/svx/source/inc \ + -I$(SRCDIR)/svx/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_pdf_import_test, \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + canvastools \ + comphelper \ + cppcanvas \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + i18nutil \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sb \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_pdf_import_test)) +$(eval $(call gb_CppunitTest_use_ure,sd_pdf_import_test)) +$(eval $(call gb_CppunitTest_use_vcl,sd_pdf_import_test)) +$(eval $(call gb_CppunitTest_use_rdb,sd_pdf_import_test,services)) +$(eval $(call gb_CppunitTest_use_configuration,sd_pdf_import_test)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_png_export_tests.mk b/sd/CppunitTest_sd_png_export_tests.mk new file mode 100644 index 0000000000..d881fbaab5 --- /dev/null +++ b/sd/CppunitTest_sd_png_export_tests.mk @@ -0,0 +1,73 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_png_export_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_png_export_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_png_export_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_png_export_tests, \ + sd/qa/unit/PNGExportTests \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_png_export_tests, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_png_export_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_png_export_tests)) + +$(eval $(call gb_CppunitTest_use_ure,sd_png_export_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_png_export_tests)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_png_export_tests,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_png_export_tests)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_shape_import_export_tests.mk b/sd/CppunitTest_sd_shape_import_export_tests.mk new file mode 100644 index 0000000000..1172a82906 --- /dev/null +++ b/sd/CppunitTest_sd_shape_import_export_tests.mk @@ -0,0 +1,80 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_shape_import_export_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_shape_import_export_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_shape_import_export_tests, \ + sd/qa/unit/ShapeImportExportTest \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_shape_import_export_tests,\ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/source/ui/slidesorter/inc \ + -I$(SRCDIR)/svx/source/inc \ + -I$(SRCDIR)/svx/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_shape_import_export_tests, \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + canvastools \ + comphelper \ + cppcanvas \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + i18nutil \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sb \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_shape_import_export_tests)) +$(eval $(call gb_CppunitTest_use_ure,sd_shape_import_export_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_shape_import_export_tests)) +$(eval $(call gb_CppunitTest_use_rdb,sd_shape_import_export_tests,services)) +$(eval $(call gb_CppunitTest_use_configuration,sd_shape_import_export_tests)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_shape_import_export_tests, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_svg_export_tests.mk b/sd/CppunitTest_sd_svg_export_tests.mk new file mode 100644 index 0000000000..3614e4b8f2 --- /dev/null +++ b/sd/CppunitTest_sd_svg_export_tests.mk @@ -0,0 +1,73 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_svg_export_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_svg_export_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_svg_export_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_svg_export_tests, \ + sd/qa/unit/SVGExportTests \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_svg_export_tests, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_svg_export_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_svg_export_tests)) + +$(eval $(call gb_CppunitTest_use_ure,sd_svg_export_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_svg_export_tests)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_svg_export_tests,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_svg_export_tests)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_textfitting_tests.mk b/sd/CppunitTest_sd_textfitting_tests.mk new file mode 100644 index 0000000000..20e302d867 --- /dev/null +++ b/sd/CppunitTest_sd_textfitting_tests.mk @@ -0,0 +1,79 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_textfitting_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_textfitting_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_textfitting_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_textfitting_tests, \ + sd/qa/unit/TextFittingTest \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_textfitting_tests, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_textfitting_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_textfitting_tests)) +$(eval $(call gb_CppunitTest_use_ure,sd_textfitting_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_textfitting_tests)) +$(eval $(call gb_CppunitTest_use_rdb,sd_textfitting_tests,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_textfitting_tests,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_textfitting_tests)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_textfitting_tests, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_theme_tests.mk b/sd/CppunitTest_sd_theme_tests.mk new file mode 100644 index 0000000000..b5f70456dd --- /dev/null +++ b/sd/CppunitTest_sd_theme_tests.mk @@ -0,0 +1,78 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_theme_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_theme_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_theme_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_theme_tests, \ + sd/qa/unit/ThemeTest \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_theme_tests, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + docmodel \ + editeng \ + for \ + forui \ + i18nlangtag \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_theme_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_theme_tests)) +$(eval $(call gb_CppunitTest_use_ure,sd_theme_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_theme_tests)) +$(eval $(call gb_CppunitTest_use_rdb,sd_theme_tests,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_theme_tests,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_theme_tests)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_theme_tests, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_tiledrendering.mk b/sd/CppunitTest_sd_tiledrendering.mk new file mode 100644 index 0000000000..1fcfbf8812 --- /dev/null +++ b/sd/CppunitTest_sd_tiledrendering.mk @@ -0,0 +1,72 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_tiledrendering)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_tiledrendering)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_tiledrendering, \ + sd/qa/unit/tiledrendering/LOKitSearchTest \ + sd/qa/unit/tiledrendering/tiledrendering \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_tiledrendering, \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + sal \ + sfx \ + subsequenttest \ + svl \ + svt \ + svxcore \ + sd \ + test \ + unotest \ + vcl \ + tl \ + utl \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sd_tiledrendering,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_tiledrendering,\ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/qa/unit \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_tiledrendering)) + +$(eval $(call gb_CppunitTest_use_ure,sd_tiledrendering)) +$(eval $(call gb_CppunitTest_use_vcl,sd_tiledrendering)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_tiledrendering,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_tiledrendering)) + +$(eval $(call gb_CppunitTest_use_uiconfigs,sd_tiledrendering, \ + modules/simpress \ + svx \ +)) + + +$(eval $(call gb_CppunitTest_add_arguments,sd_tiledrendering, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_uiimpress.mk b/sd/CppunitTest_sd_uiimpress.mk new file mode 100644 index 0000000000..c2ba59be98 --- /dev/null +++ b/sd/CppunitTest_sd_uiimpress.mk @@ -0,0 +1,92 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_uiimpress)) + +$(eval $(call gb_CppunitTest_use_externals,sd_uiimpress,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_uiimpress)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_uiimpress, \ + sd/qa/unit/uiimpress \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_uiimpress, \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + canvastools \ + comphelper \ + cppcanvas \ + cppu \ + cppuhelper \ + docmodel \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + i18nutil \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sb \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_uiimpress,\ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/source/ui/slidesorter/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_uiimpress)) + +$(eval $(call gb_CppunitTest_use_externals,sd_uiimpress,\ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sd_uiimpress)) +$(eval $(call gb_CppunitTest_use_vcl,sd_uiimpress)) + +$(eval $(call gb_CppunitTest_use_rdb,sd_uiimpress,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_uiimpress,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_uiimpress)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_uiimpress, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/CppunitTest_sd_uimpress.mk b/sd/CppunitTest_sd_uimpress.mk new file mode 100644 index 0000000000..bff68b0386 --- /dev/null +++ b/sd/CppunitTest_sd_uimpress.mk @@ -0,0 +1,114 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,sd_uimpress)) + +$(eval $(call gb_CppunitTest_set_include,sd_uimpress,\ + $$(INCLUDE) \ + -I$(SRCDIR)/sd/inc \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_uimpress)) + +$(eval $(call gb_CppunitTest_use_library_objects,sd_uimpress,sd)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_uimpress,\ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + canvastools \ + comphelper \ + cppcanvas \ + cppu \ + cppuhelper \ + docmodel \ + drawinglayer \ + drawinglayercore \ + editeng \ + i18nlangtag \ + i18nutil \ + icg \ + msfilter \ + oox \ + sal \ + sax \ + salhelper \ + sb \ + sfx \ + sot \ + svl \ + svt \ + svxcore \ + svx \ + test \ + tk \ + tl \ + ucbhelper \ + utl \ + vcl \ + xo \ +)) + +ifeq ($(OS),WNT) +$(eval $(call gb_CppunitTest_use_system_win32_libs,sd_uimpress,\ + uuid \ + ws2_32 \ +)) +endif + +ifeq ($(OS),MACOSX) +$(eval $(call gb_CppunitTest_add_libs,sd_uimpress,\ + -lobjc \ +)) + +$(eval $(call gb_CppunitTest_use_system_darwin_frameworks,sd_uimpress,\ + Foundation \ + IOBluetooth \ +)) +endif + +$(eval $(call gb_CppunitTest_use_externals,sd_uimpress,\ + boost_headers \ + dbus \ + $(if $(ENABLE_AVAHI), \ + avahi \ + ) \ + $(if $(filter WNT,$(OS)),mDNSResponder) \ + libxml2 \ +)) + +ifneq ($(DBUS_HAVE_GLIB),) +$(eval $(call gb_CppunitTest_set_include,sd_uimpress,\ + $$(INCLUDE) \ + $(DBUS_GLIB_CFLAGS) \ +)) +$(eval $(call gb_CppunitTest_add_libs,sd_uimpress,\ + $(DBUS_GLIB_LIBS) \ +)) +endif + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_uimpress,\ + sd/qa/unit/uimpress \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sd_uimpress)) +$(eval $(call gb_CppunitTest_use_vcl,sd_uimpress)) + +$(eval $(call gb_CppunitTest_use_components,sd_uimpress,\ + configmgr/source/configmgr \ + framework/util/fwk \ + i18npool/util/i18npool \ + linguistic/source/lng \ + ucb/source/core/ucb1 \ + ucb/source/ucp/file/ucpfile1 \ + unoxml/source/service/unoxml \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_uimpress)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/IwyuFilter_sd.yaml b/sd/IwyuFilter_sd.yaml new file mode 100644 index 0000000000..650d975003 --- /dev/null +++ b/sd/IwyuFilter_sd.yaml @@ -0,0 +1,564 @@ +--- +assumeFilename: sd/source/core/drawdoc.cxx +excludelist: + sd/qa/unit/SdrPdfImportTest.cxx: + # Actually used + - comphelper/scopeguard.hxx + # Needed on WIN to compile + - prewin.h + - postwin.h + - fpdfview.h + sd/sdi/sdslots.hrc: + # Needed for sdi files to compile + - sfx2/sfxsids.hrc + - editeng/editids.hrc + - editeng/memberids.h + - svx/svxids.hrc + - svx/unomid.hxx + - app.hrc + - sdattr.hrc + sd/inc/CustomAnimationCloner.hxx: + # base class has to be a complete type + - com/sun/star/animations/XAnimationNode.hpp + sd/inc/CustomAnimationPreset.hxx: + # base class has to be a complete type + - com/sun/star/lang/XMultiServiceFactory.hpp + sd/inc/CustomAnimationEffect.hxx: + # base class has to be a complete type + - com/sun/star/animations/XAnimationNode.hpp + - com/sun/star/animations/XAudio.hpp + - com/sun/star/animations/XTimeContainer.hpp + - com/sun/star/drawing/XShape.hpp + - com/sun/star/util/XChangesListener.hpp + sd/inc/OutlinerIterator.hxx: + # base class has to be a complete type + - svx/svdobj.hxx + sd/inc/sderror.hxx: + # needed for defines + - comphelper/errcode.hxx + sd/inc/sdfilter.hxx: + # base class has to be a complete type + - com/sun/star/frame/XModel.hpp + - com/sun/star/task/XStatusIndicator.hpp + sd/inc/sdmod.hxx: + # base class has to be a complete type + - com/sun/star/beans/XPropertySetInfo.hpp + - sot/storage.hxx + # Needed for define + - sfx2/app.hxx + sd/inc/sdpage.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XDrawPage.hpp + - com/sun/star/office/XAnnotation.hpp + sd/inc/stlfamily.hxx: + # base class has to be a complete type + - com/sun/star/beans/XPropertySet.hpp + - com/sun/star/container/XIndexAccess.hpp + - com/sun/star/container/XNameContainer.hpp + - com/sun/star/lang/XComponent.hpp + - com/sun/star/container/XNamed.hpp + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/lang/XSingleServiceFactory.hpp + sd/inc/stlpool.hxx: + # base class has to be a complete type + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/container/XIndexAccess.hpp + - com/sun/star/lang/XComponent.hpp + sd/inc/stlsheet.hxx: + # base class has to be a complete type + - com/sun/star/beans/XPropertySet.hpp + - com/sun/star/beans/XPropertyState.hpp + - com/sun/star/lang/XComponent.hpp + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/style/XStyle.hpp + - com/sun/star/util/XModifyBroadcaster.hpp + sd/inc/textapi.hxx: + # base class has to be a complete type + - editeng/outliner.hxx + sd/inc/TransitionPreset.hxx: + # base class has to be a complete type + - com/sun/star/lang/XMultiServiceFactory.hpp + sd/inc/undoanim.hxx: + # base class has to be a complete type + - com/sun/star/animations/XAnimationNode.hpp + sd/inc/undo/undoobjects.hxx: + # base class has to be a complete type + - tools/weakbase.hxx + sd/source/filter/eppt/eppt.hxx: + # base class has to be a complete type + - escherex.hxx + sd/source/ui/annotations/annotationmanagerimpl.hxx: + # base class has to be a complete type + - annotationtag.hxx + - com/sun/star/document/XEventListener.hpp + sd/source/ui/annotations/annotationmanager.cxx: + # Needed for unique_ptr type + - editeng/outlobj.hxx + sd/source/ui/app/sdmod.cxx: + # Needed to inherit linker visibility from SdResId declaration + - sdresid.hxx + sd/source/ui/dlg/headerfooterdlg.cxx: + # Needed for unique_ptr type + - editeng/outlobj.hxx + sd/source/ui/dlg/prntopts.cxx: + # Needed on MACOSX + - svl/intitem.hxx + - app.hrc + sd/source/ui/dlg/sdtreelb.cxx: + # comphelper::ScopeGuard is actually used + - comphelper/scopeguard.hxx + sd/source/ui/framework/configuration/ConfigurationTracer.hxx: + # Needed for css shortcut + - sal/types.h + sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx: + # base class has to be a complete type + - com/sun/star/container/XNamed.hpp + - com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp + sd/source/ui/framework/configuration/UpdateRequest.hxx: + # base class has to be a complete type + - com/sun/star/container/XNamed.hpp + - com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp + sd/source/ui/framework/factories/BasicToolBarFactory.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XResourceFactory.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/framework/factories/BasicPaneFactory.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + - com/sun/star/drawing/framework/XResourceFactory.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/framework/factories/BasicViewFactory.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XResourceFactory.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/framework/factories/ChildWindowPane.hxx: + # base class has to be a complete type + - com/sun/star/lang/XEventListener.hpp + - framework/Pane.hxx + sd/source/ui/framework/module/CenterViewFocusModule.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + sd/source/ui/framework/module/ShellStackGuard.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + sd/source/ui/framework/module/ToolBarModule.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + sd/source/ui/framework/module/SlideSorterModule.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + sd/source/ui/framework/module/ViewTabBarModule.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + sd/source/ui/inc/AccessibleDocumentViewBase.hxx: + # base class has to be a complete type + - com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp + - com/sun/star/awt/XFocusListener.hpp + - com/sun/star/awt/XWindowListener.hpp + - com/sun/star/beans/XPropertyChangeListener.hpp + sd/source/ui/inc/AccessibleDrawDocumentView.hxx: + # base class has to be a complete type + - com/sun/star/accessibility/XAccessibleGroupPosition.hpp + sd/source/ui/inc/AccessibleSlideSorterObject.hxx: + # base class has to be a complete type + - com/sun/star/accessibility/XAccessible.hpp + - com/sun/star/accessibility/XAccessibleComponent.hpp + - com/sun/star/accessibility/XAccessibleContext.hpp + - com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp + - com/sun/star/lang/XServiceInfo.hpp + sd/source/ui/inc/AccessibleSlideSorterView.hxx: + # base class has to be a complete type + - com/sun/star/accessibility/XAccessible.hpp + - com/sun/star/accessibility/XAccessibleComponent.hpp + - com/sun/star/accessibility/XAccessibleContext.hpp + - com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp + - com/sun/star/accessibility/XAccessibleSelection.hpp + - com/sun/star/lang/XServiceInfo.hpp + sd/source/ui/inc/CustomAnimationPane.hxx: + # Needed for typedef + - motionpathtag.hxx + sd/source/ui/inc/DrawDocShell.hxx: + # base class has to be a complete type + - fupoor.hxx + sd/source/ui/inc/DocumentRenderer.hxx: + # base class has to be a complete type + - com/sun/star/view/XRenderable.hpp + sd/source/ui/inc/DrawController.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XDrawView.hpp + - com/sun/star/drawing/framework/XControllerManager.hpp + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/lang/XUnoTunnel.hpp + - com/sun/star/view/XFormLayerAccess.hpp + - com/sun/star/view/XSelectionSupplier.hpp + - sfx2/sfxbasecontroller.hxx + sd/source/ui/inc/fupage.hxx: + # base class has to be a complete type + - vcl/weld.hxx + sd/source/ui/inc/slideshow.hxx: + # typedef needs a complete type + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/presentation/XPresentation2.hpp + sd/source/ui/inc/unomodel.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XDrawPages.hpp + sd/source/ui/inc/unosrch.hxx: + # base class has to be a complete type + - com/sun/star/lang/XUnoTunnel.hpp + - com/sun/star/util/XReplaceDescriptor.hpp + sd/source/ui/inc/ViewTabBar.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + - com/sun/star/drawing/framework/XTabBar.hpp + - com/sun/star/drawing/framework/XToolBar.hpp + - com/sun/star/lang/XUnoTunnel.hpp + sd/source/ui/inc/framework/Configuration.hxx: + # base class has to be a complete type + - com/sun/star/container/XNamed.hpp + - com/sun/star/drawing/framework/XConfiguration.hpp + - com/sun/star/lang/XServiceInfo.hpp + sd/source/ui/inc/framework/ConfigurationController.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XConfigurationController.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/inc/framework/DrawModule.hxx: + # Needed for css shortcut + - sal/types.h + sd/source/ui/inc/framework/ImpressModule.hxx: + # Needed for css shortcut + - sal/types.h + sd/source/ui/inc/framework/ModuleController.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XModuleController.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/inc/framework/Pane.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XPane.hpp + - com/sun/star/drawing/framework/XPane2.hpp + - com/sun/star/lang/XUnoTunnel.hpp + sd/source/ui/inc/framework/PresentationModule.hxx: + # Needed for css shortcut + - sal/types.h + sd/source/ui/inc/framework/PresentationFactory.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XResourceFactory.hpp + - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp + sd/source/ui/inc/framework/ResourceId.hxx: + # base class has to be a complete type + - com/sun/star/drawing/framework/XResourceId.hpp + - com/sun/star/lang/XInitialization.hpp + - com/sun/star/lang/XServiceInfo.hpp + sd/source/ui/inc/framework/ViewShellWrapper.hxx: + # base class has to be a complete type + - com/sun/star/awt/XWindowListener.hpp + - com/sun/star/drawing/framework/XRelocatableResource.hpp + - com/sun/star/drawing/framework/XView.hpp + - com/sun/star/lang/XUnoTunnel.hpp + - com/sun/star/view/XSelectionSupplier.hpp + sd/source/ui/inc/tools/PropertySet.hxx: + # base class has to be a complete type + - com/sun/star/beans/XPropertySet.hpp + sd/source/ui/inc/tools/SlotStateListener.hxx: + # base class has to be a complete type + - com/sun/star/frame/XStatusListener.hpp + sd/source/ui/presenter/PresenterHelper.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XPresenterHelper.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/presenter/PresenterPreviewCache.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XSlidePreviewCache.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/presenter/PresenterCanvas.hxx: + # base class has to be a complete type + - com/sun/star/rendering/XSpriteCanvas.hpp + - com/sun/star/rendering/XBitmap.hpp + - com/sun/star/awt/XWindowListener.hpp + sd/source/ui/presenter/SlideRenderer.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XSlideRenderer.hpp + - com/sun/star/lang/XInitialization.hpp + - com/sun/star/lang/XServiceInfo.hpp + sd/source/ui/remotecontrol/Listener.hxx: + # base class has to be a complete type + - com/sun/star/presentation/XSlideShowListener.hpp + sd/source/ui/sidebar/PanelFactory.hxx: + # base class has to be a complete type + - com/sun/star/ui/XUIElementFactory.hpp + sd/source/ui/sidebar/PageMarginUtils.hxx: + # Needed for std::abs + - cmath + sd/source/ui/slideshow/slideshowimpl.hxx: + # base class has to be a complete type + - com/sun/star/presentation/XShapeEventListener.hpp + - com/sun/star/presentation/XSlideShowController.hpp + - com/sun/star/presentation/XSlideShowListener.hpp + sd/source/ui/slideshow/slideshowviewimpl.hxx: + # base class has to be a complete type + - com/sun/star/awt/XPaintListener.hpp + - com/sun/star/awt/XWindowListener.hpp + - com/sun/star/presentation/XSlideShowView.hpp + - com/sun/star/util/XModifyListener.hpp + sd/source/ui/slidesorter/controller/SlsListener.hxx: + # base class has to be a complete type + - com/sun/star/document/XEventListener.hpp + - com/sun/star/beans/XPropertyChangeListener.hpp + - com/sun/star/accessibility/XAccessibleEventListener.hpp + - com/sun/star/frame/XFrameActionListener.hpp + sd/source/ui/slidesorter/shell/SlideSorterService.hxx: + # base class has to be a complete type + - com/sun/star/awt/XWindowListener.hpp + - com/sun/star/drawing/XSlideSorterBase.hpp + - com/sun/star/lang/XInitialization.hpp + sd/source/ui/unoidl/sddetect.hxx: + # base class has to be a complete type + - com/sun/star/document/XExtendedFilterDetection.hpp + - com/sun/star/lang/XServiceInfo.hpp + sd/source/ui/unoidl/unolayer.hxx: + # base class has to be a complete type + - com/sun/star/drawing/XLayer.hpp + - com/sun/star/drawing/XLayerManager.hpp + sd/source/ui/unoidl/unocpres.hxx: + # base class has to be a complete type + - com/sun/star/container/XIndexContainer.hpp + - com/sun/star/container/XNameContainer.hpp + - com/sun/star/container/XNamed.hpp + - com/sun/star/lang/XComponent.hpp + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/lang/XSingleServiceFactory.hpp + - com/sun/star/lang/XUnoTunnel.hpp + sd/source/ui/unoidl/unopback.hxx: + # base class has to be a complete type + - com/sun/star/beans/XPropertySet.hpp + - com/sun/star/beans/XPropertyState.hpp + - com/sun/star/lang/XServiceInfo.hpp + - com/sun/star/lang/XUnoTunnel.hpp + sd/source/core/annotations/AnnotationEnumeration.cxx: + # Avoid loplugin:unreffun error + - AnnotationEnumeration.hxx + sd/source/core/CustomAnimationCloner.cxx: + # Avoid loplugin:unreffun error + - CustomAnimationCloner.hxx + sd/source/core/EffectMigration.cxx: + # Needed for UnoType + - com/sun/star/presentation/ParagraphTarget.hpp + sd/source/core/stlsheet.cxx: + # Needed for UnoType + - com/sun/star/table/BorderLine.hpp + # Needed for TypedWhichId macros + - svx/sdtaaitm.hxx + - svx/sdtacitm.hxx + - svx/sdtayitm.hxx + - svx/sdtaiitm.hxx + sd/source/core/typemap.cxx: + # Needed by sdslots.hxx to build + - config_options.h + - editeng/boxitem.hxx + - editeng/cmapitem.hxx + - editeng/colritem.hxx + - editeng/contouritem.hxx + - editeng/crossedoutitem.hxx + - editeng/fhgtitem.hxx + - editeng/fontitem.hxx + - editeng/kernitem.hxx + - editeng/langitem.hxx + - editeng/lineitem.hxx + - editeng/lrspitem.hxx + - editeng/lspcitem.hxx + - editeng/memberids.h + - editeng/postitem.hxx + - editeng/protitem.hxx + - editeng/shdditem.hxx + - editeng/sizeitem.hxx + - editeng/tstpitem.hxx + - editeng/udlnitem.hxx + - editeng/ulspitem.hxx + - editeng/wghtitem.hxx + - sfx2/frame.hxx + - sfx2/msg.hxx + - sfx2/tplpitem.hxx + - sfx2/zoomitem.hxx + - svl/globalnameitem.hxx + - svl/lckbitem.hxx + - svl/ptitem.hxx + - svl/rectitem.hxx + - svl/slstitm.hxx + - svl/srchitem.hxx + - svx/chrtitem.hxx + - svx/clipfmtitem.hxx + - svx/drawitem.hxx + - svx/galleryitem.hxx + - svx/hlnkitem.hxx + - svx/pageitem.hxx + - svx/postattr.hxx + - svx/rulritem.hxx + - svx/sdmetitm.hxx + - svx/sdooitm.hxx + - svx/sdprcitm.hxx + - svx/sdtfsitm.hxx + - svx/unomid.hxx + - svx/xbtmpit.hxx + - svx/xfillit0.hxx + - svx/xflclit.hxx + - svx/xflftrit.hxx + - svx/xflhtit.hxx + - svx/xftadit.hxx + - svx/xftdiit.hxx + - svx/xftmrit.hxx + - svx/xftouit.hxx + - svx/xftshcit.hxx + - svx/xftshit.hxx + - svx/xftshxy.hxx + - svx/xftstit.hxx + - svx/xlineit0.hxx + - svx/xlinjoit.hxx + - svx/xlncapit.hxx + - svx/xlnclit.hxx + - svx/xlndsit.hxx + - svx/xlnedit.hxx + - svx/xlnstit.hxx + - svx/xlnwtit.hxx + - svx/xtextit0.hxx + - svx/zoomslideritem.hxx + - svx/sdangitm.hxx + sd/source/core/drawdoc.cxx: + # Needed for template + - com/sun/star/frame/XModel.hpp + sd/source/core/text/textapi.cxx: + # Needed for macro defines + - editeng/unoprnms.hxx + sd/source/filter/eppt/epptso.cxx: + # Needed for direct member access + - com/sun/star/table/XTable.hpp + sd/source/filter/eppt/pptx-animations.hxx: + # Needed for typedef + - sax/fshelper.hxx + sd/source/filter/eppt/pptexanimations.cxx: + # Needed for template + - com/sun/star/drawing/XDrawPage.hpp + sd/source/filter/eppt/pptx-epptooxml.cxx: + # Needed for direct member access + - com/sun/star/task/XStatusIndicator.hpp + - com/sun/star/frame/XModel.hpp + sd/source/filter/eppt/pptx-text.cxx: + # Needed for direct member access + - com/sun/star/awt/XBitmap.hpp + - com/sun/star/beans/XPropertyState.hpp + - com/sun/star/style/TabStop.hpp + - com/sun/star/graphic/XGraphic.hpp + sd/source/filter/eppt/epptso.cxx: + # Needed for template + - com/sun/star/frame/XModel.hpp + sd/source/filter/ppt/pptinanimations.cxx: + # Needed for template + - com/sun/star/drawing/XDrawPage.hpp + sd/source/filter/xml/sdxmlwrp.cxx: + # Needed for implicit dtor + - editeng/outlobj.hxx + sd/source/filter/xml/sdtransform.cxx: + # Needed for implicit dtor + - editeng/outlobj.hxx + sd/source/ui/annotations/annotationtag.cxx: + # Needed for template + - com/sun/star/office/XAnnotation.hpp + sd/source/ui/animations/CustomAnimationList.cxx: + # Actually used + - comphelper/scopeguard.hxx + sd/source/ui/animations/CustomAnimationPane.cxx: + # Actually used + - comphelper/scopeguard.hxx + sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx: + # Needed for DEBUG_SD_CONFIGURATION_TRACE + - ConfigurationTracer.hxx + - com/sun/star/container/XNamed.hpp + sd/source/ui/framework/configuration/ConfigurationTracer.cxx: + # Needed for DEBUG mode + - sal/log.hxx + sd/source/ui/framework/configuration/ConfigurationUpdater.cxx: + # Needed for DEBUG_SD_CONFIGURATION_TRACE + - ConfigurationTracer.hxx + # comphelper::ScopeGuard is actually used + - comphelper/scopeguard.hxx + sd/source/ui/framework/configuration/ResourceFactoryManager.cxx: + # Needed for VERBOSE mode + - sal/log.hxx + sd/source/ui/framework/module/ModuleController.cxx: + # Needed for direct member access + - com/sun/star/frame/XController.hpp + sd/source/ui/func/fuconbez.cxx: + # Needed for virtual method parameter + - Window.hxx + sd/source/ui/func/fuhhconv.cxx: + # Needed for direct member access + - com/sun/star/awt/XWindow.hpp + sd/source/ui/dlg/RemoteDialogClientBox.cxx: + # Actually used + - vector + sd/source/ui/dlg/sdtreelb.cxx: + # Needed for template + - com/sun/star/embed/XEmbeddedObject.hpp + sd/source/ui/func/futempl.cxx: + # Needed for template + - com/sun/star/frame/XModel.hpp + sd/source/ui/presenter/PresenterHelper.cxx: + # Needed for template + - com/sun/star/awt/XWindowPeer.hpp + sd/source/ui/sidebar/MasterPageObserver.cxx: + # Actually used + - set + sd/source/ui/slideshow/PaneHider.cxx: + # Needed for template + - com/sun/star/frame/XController.hpp + sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx: + # Needed for instantiation of function template specialization + - Window.hxx + # Needed for rtl::math::round + - rtl/math.hxx + sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx: + # Needed for OSL_DEBUG_LEVEL >=2 + - sal/log.hxx + sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx: + # Needed for template + - com/sun/star/frame/XController.hpp + sd/source/ui/slidesorter/controller/SlsListener.cxx: + # Needed for template + - com/sun/star/frame/FrameActionEvent.hpp + sd/source/ui/unoidl/sddetect.cxx: + # Needed for template + - com/sun/star/beans/PropertyValue.hpp + sd/source/ui/unoidl/unoobj.cxx: + # Needed for template + - com/sun/star/beans/PropertyState.hpp + sd/source/ui/unoidl/unodoc.cxx: + # Needed for template + - com/sun/star/frame/XModel.hpp + sd/source/ui/view/GraphicObjectBar.cxx: + # Needed by a sdslots.hxx constant + - svx/svxids.hrc + sd/source/ui/view/Outliner.cxx: + # comphelper::ScopeGuard is actually used + - comphelper/scopeguard.hxx + sd/source/ui/view/PresentationViewShellBase.cxx: + # Needed for template + - com/sun/star/frame/XFrame.hpp + sd/source/ui/view/drviews1.cxx: + # comphelper::ScopeGuard is actually used + - comphelper/scopeguard.hxx + sd/source/ui/view/drviews2.cxx: + # comphelper::ScopeGuard is actually used + - comphelper/scopeguard.hxx + sd/source/ui/view/drviewsf.cxx: + # Needed for template + - svx/sdmetitm.hxx + sd/source/ui/view/drvwshrg.cxx: + # Needed by a sdslots.hxx constant + - app.hrc + sd/source/ui/view/MediaObjectBar.cxx: + # Needed by a sdslots.hxx constant + - sfx2/sfxsids.hrc + sd/source/ui/view/sdview2.cxx: + # Needed for template + - com/sun/star/embed/XEmbeddedObject.hpp + sd/source/ui/view/presvish.cxx: + # Needed by a sdslots.hxx constant + - svx/svxids.hrc diff --git a/sd/JunitTest_sd_unoapi.mk b/sd/JunitTest_sd_unoapi.mk new file mode 100644 index 0000000000..85f5f3d49c --- /dev/null +++ b/sd/JunitTest_sd_unoapi.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_JunitTest_JunitTest,sd_unoapi)) + +$(eval $(call gb_JunitTest_set_unoapi_test_defaults,sd_unoapi)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/Library_sd.mk b/sd/Library_sd.mk new file mode 100644 index 0000000000..01c546ad3d --- /dev/null +++ b/sd/Library_sd.mk @@ -0,0 +1,606 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Library_Library,sd)) + +$(eval $(call gb_Library_set_precompiled_header,sd,sd/inc/pch/precompiled_sd)) + +# runtime dependency for unit tests +$(eval $(call gb_Library_use_package,sd,sd_xml)) + +$(eval $(call gb_SdiTarget_SdiTarget,sd/sdi/sdslots,sd/sdi/sdslots)) + +$(eval $(call gb_SdiTarget_set_include,sd/sdi/sdslots,\ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/sdi \ + -I$(SRCDIR)/svx/sdi \ + -I$(SRCDIR)/sfx2/sdi \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_SdiTarget_SdiTarget,sd/sdi/sdgslots,sd/sdi/sdgslots)) + +$(eval $(call gb_SdiTarget_set_include,sd/sdi/sdgslots,\ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/sdi \ + -I$(SRCDIR)/svx/sdi \ + -I$(SRCDIR)/sfx2/sdi \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_Library_add_sdi_headers,sd,\ + sd/sdi/sdgslots \ + sd/sdi/sdslots \ +)) + +$(eval $(call gb_Library_set_include,sd,\ + $$(INCLUDE) \ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/source/ui/slidesorter/inc \ + -I$(WORKDIR)/SdiTarget/sd/sdi \ +)) + +$(eval $(call gb_Library_add_defs,sd,\ + -DSD_DLLIMPLEMENTATION \ + -DSDUI_DLL_NAME=\"$(call gb_Library_get_runtime_filename,$(call gb_Library__get_name,sdui))\" \ +)) + +ifneq ($(strip $(dbg_anim_log)$(DBG_ANIM_LOG)),) +$(eval $(call gb_Library_add_defs,sd,\ + $$(DEFS) \ + -DDBG_ANIM_LOG \ +)) +endif + +$(eval $(call gb_Library_use_custom_headers,sd,\ + officecfg/registry \ + oox/generated \ +)) + +$(eval $(call gb_Library_use_sdk_api,sd)) + +$(eval $(call gb_Library_use_libraries,sd,\ + avmedia \ + basegfx \ + canvastools \ + comphelper \ + cppcanvas \ + cppu \ + cppuhelper \ + docmodel \ + drawinglayercore \ + drawinglayer \ + editeng \ + i18nlangtag \ + i18nutil \ + icg \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sb \ + sfx \ + sot \ + svl \ + svt \ + svxcore \ + svx \ + tk \ + tl \ + ucbhelper \ + utl \ + vcl \ + $(if $(ENABLE_NSS),xmlsecurity) \ +)) + +$(eval $(call gb_Library_use_externals,sd,\ + boost_headers \ + libxml2 \ + dbus \ + $(if $(ENABLE_AVAHI), \ + avahi \ + ) \ + icu_headers \ + frozen \ +)) + +ifneq ($(DBUS_HAVE_GLIB),) +$(eval $(call gb_Library_set_include,sd,\ + $$(INCLUDE) \ + $(DBUS_GLIB_CFLAGS) \ +)) +$(eval $(call gb_Library_add_libs,sd,\ + $(DBUS_GLIB_LIBS) \ +)) +endif + +ifeq ($(OS),WNT) +$(eval $(call gb_Library_use_system_win32_libs,sd,\ + uuid \ + ws2_32 \ +)) +endif + +$(eval $(call gb_Library_set_componentfile,sd,sd/util/sd,services)) + +ifneq ($(ENABLE_WASM_STRIP_ACCESSIBILITY),TRUE) +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/accessibility/AccessibleDocumentViewBase \ + sd/source/ui/accessibility/AccessibleDrawDocumentView \ + sd/source/ui/accessibility/AccessibleOutlineEditSource \ + sd/source/ui/accessibility/AccessibleOutlineView \ + sd/source/ui/accessibility/AccessiblePageShape \ + sd/source/ui/accessibility/AccessiblePresentationGraphicShape \ + sd/source/ui/accessibility/AccessiblePresentationOLEShape \ + sd/source/ui/accessibility/AccessiblePresentationShape \ + sd/source/ui/accessibility/AccessibleSlideSorterObject \ + sd/source/ui/accessibility/AccessibleSlideSorterView \ + sd/source/ui/accessibility/AccessibleViewForwarder \ + sd/source/ui/accessibility/SdShapeTypes \ +)) +endif + +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/core/CustomAnimationCloner \ + sd/source/core/CustomAnimationEffect \ + sd/source/core/CustomAnimationPreset \ + sd/source/core/EffectMigration \ + sd/source/core/PageListWatcher \ + sd/source/core/TransitionPreset \ + sd/source/core/ThemeColorChanger \ + sd/source/core/anminfo \ + sd/source/core/annotations/Annotation \ + sd/source/core/annotations/AnnotationEnumeration \ + sd/source/core/cusshow \ + sd/source/core/drawdoc \ + sd/source/core/drawdoc2 \ + sd/source/core/drawdoc3 \ + sd/source/core/drawdoc4 \ + sd/source/core/drawdoc_animations \ + sd/source/core/pglink \ + sd/source/core/sdiocmpt \ + sd/source/core/sdpage \ + sd/source/core/sdpage2 \ + sd/source/core/sdpage_animations \ + sd/source/core/shapelist \ + sd/source/core/stlfamily \ + sd/source/core/stlpool \ + sd/source/core/stlsheet \ + sd/source/core/text/textapi \ + sd/source/core/typemap \ + sd/source/core/undo/undofactory \ + sd/source/core/undo/undomanager \ + sd/source/core/undo/undoobjects \ + sd/source/core/undoanim \ + sd/source/filter/cgm/sdcgmfilter \ + sd/source/filter/eppt/eppt \ + sd/source/filter/eppt/epptso \ + sd/source/filter/eppt/escherex \ + sd/source/filter/eppt/pptexanimations \ + sd/source/filter/eppt/pptexsoundcollection \ + sd/source/filter/eppt/pptx-epptbase \ + sd/source/filter/eppt/pptx-epptooxml \ + sd/source/filter/eppt/pptx-animations \ + sd/source/filter/eppt/pptx-animations-cond \ + sd/source/filter/eppt/pptx-animations-nodectx \ + sd/source/filter/eppt/pptx-grouptable \ + sd/source/filter/eppt/pptx-stylesheet \ + sd/source/filter/eppt/pptx-text \ + sd/source/filter/ppt/ppt97animations \ + sd/source/filter/ppt/pptatom \ + sd/source/filter/ppt/pptin \ + sd/source/filter/ppt/pptinanimations \ + sd/source/filter/ppt/propread \ + sd/source/filter/grf/sdgrffilter \ + sd/source/filter/html/htmlex \ + sd/source/filter/html/sdhtmlfilter \ + sd/source/filter/pdf/sdpdffilter \ + sd/source/filter/sdfilter \ + sd/source/filter/sdpptwrp \ + sd/source/filter/xml/sdtransform \ + sd/source/filter/xml/sdxmlwrp \ + sd/source/helper/simplereferencecomponent \ + sd/source/ui/animations/CustomAnimationDialog \ + sd/source/ui/animations/CustomAnimationList \ + sd/source/ui/animations/CustomAnimationPane \ + sd/source/ui/animations/STLPropertySet \ + sd/source/ui/animations/SlideTransitionPane \ + sd/source/ui/animations/motionpathtag \ + sd/source/ui/annotations/annotationmanager \ + sd/source/ui/annotations/annotationtag \ + sd/source/ui/annotations/annotationwindow \ + sd/source/ui/app/optsitem \ + sd/source/ui/app/sddll \ + sd/source/ui/app/sdmod \ + sd/source/ui/app/sdmod1 \ + sd/source/ui/app/sdmod2 \ + sd/source/ui/app/sdpopup \ + sd/source/ui/app/sdxfer \ + sd/source/ui/app/tmplctrl \ + sd/source/ui/app/scalectrl \ + sd/source/ui/controller/slidelayoutcontroller \ + sd/source/ui/controller/displaymodecontroller \ + sd/source/ui/dlg/AnimationChildWindow \ + sd/source/ui/dlg/LayerTabBar \ + sd/source/ui/dlg/NavigatorChildWindow \ + sd/source/ui/dlg/PaneChildWindows \ + sd/source/ui/dlg/PaneShells \ + sd/source/ui/dlg/SpellDialogChildWindow \ + sd/source/ui/dlg/TemplateScanner \ + sd/source/ui/dlg/animobjs \ + sd/source/ui/dlg/diactrl \ + sd/source/ui/dlg/filedlg \ + sd/source/ui/dlg/gluectrl \ + sd/source/ui/dlg/ins_paste \ + sd/source/ui/dlg/layeroptionsdlg \ + sd/source/ui/dlg/navigatr \ + sd/source/ui/dlg/sdabstdlg \ + sd/source/ui/dlg/sdtreelb \ + sd/source/ui/dlg/titledockwin \ + sd/source/ui/dlg/unchss \ + sd/source/ui/dlg/UndoThemeChange \ + sd/source/ui/docshell/docshel2 \ + sd/source/ui/docshell/docshel3 \ + sd/source/ui/docshell/docshel4 \ + sd/source/ui/docshell/docshell \ + sd/source/ui/docshell/grdocsh \ + sd/source/ui/docshell/sdclient \ + sd/source/ui/framework/configuration/ChangeRequestQueue \ + sd/source/ui/framework/configuration/ChangeRequestQueueProcessor \ + sd/source/ui/framework/configuration/Configuration \ + sd/source/ui/framework/configuration/ConfigurationClassifier \ + sd/source/ui/framework/configuration/ConfigurationController \ + sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster \ + sd/source/ui/framework/configuration/ConfigurationControllerResourceManager \ + sd/source/ui/framework/configuration/ConfigurationTracer \ + sd/source/ui/framework/configuration/ConfigurationUpdater \ + sd/source/ui/framework/configuration/GenericConfigurationChangeRequest \ + sd/source/ui/framework/configuration/ResourceFactoryManager \ + sd/source/ui/framework/configuration/ResourceId \ + sd/source/ui/framework/configuration/UpdateRequest \ + sd/source/ui/framework/factories/BasicPaneFactory \ + sd/source/ui/framework/factories/BasicToolBarFactory \ + sd/source/ui/framework/factories/BasicViewFactory \ + sd/source/ui/framework/factories/ChildWindowPane \ + sd/source/ui/framework/factories/FrameWindowPane \ + sd/source/ui/framework/factories/FullScreenPane \ + sd/source/ui/framework/factories/Pane \ + sd/source/ui/framework/factories/PresentationFactory \ + sd/source/ui/framework/factories/ViewShellWrapper \ + sd/source/ui/framework/module/CenterViewFocusModule \ + sd/source/ui/framework/module/DrawModule \ + sd/source/ui/framework/module/ImpressModule \ + sd/source/ui/framework/module/ModuleController \ + sd/source/ui/framework/module/PresentationModule \ + sd/source/ui/framework/module/ShellStackGuard \ + sd/source/ui/framework/module/SlideSorterModule \ + sd/source/ui/framework/module/ToolBarModule \ + sd/source/ui/framework/module/ViewTabBarModule \ + sd/source/ui/framework/tools/FrameworkHelper \ + sd/source/ui/func/bulmaper \ + sd/source/ui/func/fuarea \ + sd/source/ui/func/fubullet \ + sd/source/ui/func/fuchar \ + sd/source/ui/func/fucon3d \ + sd/source/ui/func/fuconarc \ + sd/source/ui/func/fuconbez \ + sd/source/ui/func/fuconcs \ + sd/source/ui/func/fuconnct \ + sd/source/ui/func/fuconrec \ + sd/source/ui/func/fuconstr \ + sd/source/ui/func/fuconuno \ + sd/source/ui/func/fucopy \ + sd/source/ui/func/fucushow \ + sd/source/ui/func/fudraw \ + sd/source/ui/func/fudspord \ + sd/source/ui/func/fuediglu \ + sd/source/ui/func/fuexecuteinteraction \ + sd/source/ui/func/fuexpand \ + sd/source/ui/func/fuformatpaintbrush \ + sd/source/ui/func/fuhhconv \ + sd/source/ui/func/fuinsert \ + sd/source/ui/func/fuinsfil \ + sd/source/ui/func/fuline \ + sd/source/ui/func/fulinend \ + sd/source/ui/func/fulink \ + sd/source/ui/func/fumeasur \ + sd/source/ui/func/fumorph \ + sd/source/ui/func/funavig \ + sd/source/ui/func/fuoaprms \ + sd/source/ui/func/fuolbull \ + sd/source/ui/func/fuoltext \ + sd/source/ui/func/fupage \ + sd/source/ui/func/fuparagr \ + sd/source/ui/func/fupoor \ + sd/source/ui/func/fuprlout \ + sd/source/ui/func/fuprobjs \ + sd/source/ui/func/fuscale \ + sd/source/ui/func/fusearch \ + sd/source/ui/func/fusel \ + sd/source/ui/func/fusldlg \ + sd/source/ui/func/fusnapln \ + sd/source/ui/func/fusumry \ + sd/source/ui/func/futempl \ + sd/source/ui/func/futext \ + sd/source/ui/func/futhes \ + sd/source/ui/func/futransf \ + sd/source/ui/func/futxtatt \ + sd/source/ui/func/fuvect \ + sd/source/ui/func/fuzoom \ + sd/source/ui/func/sdundogr \ + sd/source/ui/func/smarttag \ + sd/source/ui/func/undoback \ + sd/source/ui/func/undoheaderfooter \ + sd/source/ui/func/undolayer \ + sd/source/ui/func/undopage \ + sd/source/ui/func/unmovss \ + sd/source/ui/func/unoaprms \ + sd/source/ui/func/unprlout \ + sd/source/ui/presenter/CanvasUpdateRequester \ + sd/source/ui/presenter/PresenterCanvas \ + sd/source/ui/presenter/PresenterHelper \ + sd/source/ui/presenter/PresenterPreviewCache \ + sd/source/ui/presenter/SlideRenderer \ + sd/source/ui/sidebar/AllMasterPagesSelector \ + sd/source/ui/sidebar/CurrentMasterPagesSelector \ + sd/source/ui/sidebar/DocumentHelper \ + sd/source/ui/sidebar/LayoutMenu \ + sd/source/ui/sidebar/MasterPageContainer \ + sd/source/ui/sidebar/MasterPageContainerFiller \ + sd/source/ui/sidebar/MasterPageContainerProviders \ + sd/source/ui/sidebar/MasterPageContainerQueue \ + sd/source/ui/sidebar/MasterPageDescriptor \ + sd/source/ui/sidebar/MasterPageObserver \ + sd/source/ui/sidebar/MasterPagesSelector \ + sd/source/ui/sidebar/NavigatorWrapper \ + sd/source/ui/sidebar/PanelFactory \ + sd/source/ui/sidebar/PreviewValueSet \ + sd/source/ui/sidebar/RecentlyUsedMasterPages \ + sd/source/ui/sidebar/RecentMasterPagesSelector \ + sd/source/ui/sidebar/SlideBackground \ + sd/source/ui/slideshow/PaneHider \ + sd/source/ui/slideshow/SlideShowRestarter \ + sd/source/ui/slideshow/showwin \ + sd/source/ui/slideshow/slideshow \ + sd/source/ui/slideshow/slideshowimpl \ + sd/source/ui/slideshow/slideshowviewimpl \ + sd/source/ui/slidesorter/cache/SlsBitmapCache \ + sd/source/ui/slidesorter/cache/SlsBitmapCompressor \ + sd/source/ui/slidesorter/cache/SlsBitmapFactory \ + sd/source/ui/slidesorter/cache/SlsCacheCompactor \ + sd/source/ui/slidesorter/cache/SlsCacheConfiguration \ + sd/source/ui/slidesorter/cache/SlsGenericPageCache \ + sd/source/ui/slidesorter/cache/SlsPageCache \ + sd/source/ui/slidesorter/cache/SlsPageCacheManager \ + sd/source/ui/slidesorter/cache/SlsQueueProcessor \ + sd/source/ui/slidesorter/cache/SlsRequestFactory \ + sd/source/ui/slidesorter/cache/SlsRequestQueue \ + sd/source/ui/slidesorter/controller/SlideSorterController \ + sd/source/ui/slidesorter/controller/SlsAnimationFunction \ + sd/source/ui/slidesorter/controller/SlsAnimator \ + sd/source/ui/slidesorter/controller/SlsClipboard \ + sd/source/ui/slidesorter/controller/SlsCurrentSlideManager \ + sd/source/ui/slidesorter/controller/SlsDragAndDropContext \ + sd/source/ui/slidesorter/controller/SlsFocusManager \ + sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler \ + sd/source/ui/slidesorter/controller/SlsListener \ + sd/source/ui/slidesorter/controller/SlsPageSelector \ + sd/source/ui/slidesorter/controller/SlsProperties \ + sd/source/ui/slidesorter/controller/SlsScrollBarManager \ + sd/source/ui/slidesorter/controller/SlsSelectionFunction \ + sd/source/ui/slidesorter/controller/SlsSelectionManager \ + sd/source/ui/slidesorter/controller/SlsSelectionObserver \ + sd/source/ui/slidesorter/controller/SlsSlotManager \ + sd/source/ui/slidesorter/controller/SlsTransferableData \ + sd/source/ui/slidesorter/controller/SlsVisibleAreaManager \ + sd/source/ui/slidesorter/model/SlideSorterModel \ + sd/source/ui/slidesorter/model/SlsPageDescriptor \ + sd/source/ui/slidesorter/model/SlsPageEnumeration \ + sd/source/ui/slidesorter/model/SlsPageEnumerationProvider \ + sd/source/ui/slidesorter/model/SlsVisualState \ + sd/source/ui/slidesorter/shell/SlideSorter \ + sd/source/ui/slidesorter/shell/SlideSorterViewShell \ + sd/source/ui/slidesorter/view/SlideSorterView \ + sd/source/ui/slidesorter/view/SlsFramePainter \ + sd/source/ui/slidesorter/view/SlsInsertAnimator \ + sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay \ + sd/source/ui/slidesorter/view/SlsLayeredDevice \ + sd/source/ui/slidesorter/view/SlsLayouter \ + sd/source/ui/slidesorter/view/SlsPageObjectLayouter \ + sd/source/ui/slidesorter/view/SlsPageObjectPainter \ + sd/source/ui/slidesorter/view/SlsTheme \ + sd/source/ui/slidesorter/view/SlsToolTip \ + sd/source/ui/slidesorter/view/SlsViewCacheContext \ + sd/source/ui/table/TableDesignPane \ + sd/source/ui/table/tablefunction \ + sd/source/ui/table/tableobjectbar \ + sd/source/ui/tools/AsynchronousCall \ + sd/source/ui/tools/ConfigurationAccess \ + sd/source/ui/tools/EventMultiplexer \ + sd/source/ui/tools/GraphicSizeCheck \ + sd/source/ui/tools/IconCache \ + sd/source/ui/tools/IdleDetection \ + sd/source/ui/tools/PreviewRenderer \ + sd/source/ui/tools/SdGlobalResourceContainer \ + sd/source/ui/tools/SlotStateListener \ + sd/source/ui/tools/TimerBasedTaskExecution \ + sd/source/ui/uitest/uiobject \ + sd/source/ui/unoidl/DrawController \ + sd/source/ui/unoidl/SdUnoDrawView \ + sd/source/ui/unoidl/SdUnoOutlineView \ + sd/source/ui/unoidl/SdUnoSlideView \ + sd/source/ui/unoidl/UnoDocumentSettings \ + sd/source/ui/unoidl/randomnode \ + sd/source/ui/unoidl/unocpres \ + sd/source/ui/unoidl/unodoc \ + sd/source/ui/unoidl/unolayer \ + sd/source/ui/unoidl/unomodel \ + sd/source/ui/unoidl/unomodule \ + sd/source/ui/unoidl/unoobj \ + sd/source/ui/unoidl/unopage \ + sd/source/ui/unoidl/unopback \ + sd/source/ui/unoidl/unopool \ + sd/source/ui/unoidl/unosrch \ + sd/source/ui/unoidl/unowcntr \ + sd/source/ui/view/DocumentRenderer \ + sd/source/ui/view/FormShellManager \ + sd/source/ui/view/GraphicObjectBar \ + sd/source/ui/view/GraphicViewShellBase \ + sd/source/ui/view/ImpressViewShellBase \ + sd/source/ui/view/MediaObjectBar \ + sd/source/ui/view/OutlineViewShellBase \ + sd/source/ui/view/Outliner \ + sd/source/ui/view/OutlinerIterator \ + sd/source/ui/view/PresentationViewShellBase \ + sd/source/ui/view/SlideSorterViewShellBase \ + sd/source/ui/view/ToolBarManager \ + sd/source/ui/view/ViewClipboard \ + sd/source/ui/view/ViewShellBase \ + sd/source/ui/view/ViewShellHint \ + sd/source/ui/view/ViewShellImplementation \ + sd/source/ui/view/ViewShellManager \ + sd/source/ui/view/ViewTabBar \ + sd/source/ui/view/WindowUpdater \ + sd/source/ui/view/clview \ + sd/source/ui/view/drawview \ + sd/source/ui/view/drbezob \ + sd/source/ui/view/drtxtob \ + sd/source/ui/view/drtxtob1 \ + sd/source/ui/view/drviews1 \ + sd/source/ui/view/drviews2 \ + sd/source/ui/view/drviews3 \ + sd/source/ui/view/drviews4 \ + sd/source/ui/view/drviews5 \ + sd/source/ui/view/drviews6 \ + sd/source/ui/view/drviews7 \ + sd/source/ui/view/drviews8 \ + sd/source/ui/view/drviews9 \ + sd/source/ui/view/drviewsa \ + sd/source/ui/view/drviewsb \ + sd/source/ui/view/drviewsc \ + sd/source/ui/view/drviewsd \ + sd/source/ui/view/drviewse \ + sd/source/ui/view/drviewsf \ + sd/source/ui/view/drviewsg \ + sd/source/ui/view/drviewsh \ + sd/source/ui/view/drviewsi \ + sd/source/ui/view/drviewsj \ + sd/source/ui/view/drviewsk \ + sd/source/ui/view/drvwshrg \ + sd/source/ui/view/frmview \ + sd/source/ui/view/grviewsh \ + sd/source/ui/view/outlnvs2 \ + sd/source/ui/view/outlnvsh \ + sd/source/ui/view/outlview \ + sd/source/ui/view/presvish \ + sd/source/ui/view/sdruler \ + sd/source/ui/view/sdview \ + sd/source/ui/view/sdview2 \ + sd/source/ui/view/sdview3 \ + sd/source/ui/view/sdview4 \ + sd/source/ui/view/sdview5 \ + sd/source/ui/view/sdwindow \ + sd/source/ui/view/tabcontr \ + sd/source/ui/view/unmodpg \ + sd/source/ui/view/viewoverlaymanager \ + sd/source/ui/view/viewshe2 \ + sd/source/ui/view/viewshe3 \ + sd/source/ui/view/viewshel \ + sd/source/ui/view/zoomlist \ +)) + +ifeq ($(ENABLE_SDREMOTE),TRUE) +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/remotecontrol/BufferedStreamSocket \ + sd/source/ui/remotecontrol/Communicator \ + sd/source/ui/remotecontrol/ImagePreparer \ + sd/source/ui/remotecontrol/Server \ + sd/source/ui/remotecontrol/Receiver \ + sd/source/ui/remotecontrol/Listener \ + sd/source/ui/remotecontrol/Transmitter \ +)) + +ifeq ($(OS),MACOSX) +$(eval $(call gb_Library_add_objcxxobjects,sd,\ + sd/source/ui/remotecontrol/DiscoveryService \ + sd/source/ui/remotecontrol/OSXNetworkService \ +)) + +$(eval $(call gb_Library_use_system_darwin_frameworks,sd,\ + Foundation \ +)) + +else # OS!=MACSOX + +ifeq ($(ENABLE_AVAHI),TRUE) +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/remotecontrol/AvahiNetworkService \ +)) +endif # ENABLE_AVAHI=TRUE + +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/remotecontrol/DiscoveryService \ +)) + +ifeq ($(OS),WNT) + +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/remotecontrol/WINNetworkService \ +)) + +$(eval $(call gb_Library_use_external,sd,mDNSResponder)) + +endif # OS=WNT + +endif # OS!=MACOSX + +$(eval $(call gb_Library_add_defs,sd,\ + -DENABLE_SDREMOTE \ +)) + +ifeq ($(ENABLE_SDREMOTE_BLUETOOTH),TRUE) + +ifneq ($(OS),MACOSX) + +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/remotecontrol/BluetoothServer \ +)) + +else # OS!=MACOSX + +$(eval $(call gb_Library_add_objcxxobjects,sd,\ + sd/source/ui/remotecontrol/BluetoothServer \ + sd/source/ui/remotecontrol/OSXBluetooth \ +)) + +$(eval $(call gb_Library_add_libs,sd,\ + -lobjc \ +)) + +$(eval $(call gb_Library_use_system_darwin_frameworks,sd,\ + IOBluetooth \ +)) + +endif # OS!=MACOSX + +$(eval $(call gb_Library_add_defs,sd,\ + -DENABLE_SDREMOTE_BLUETOOTH \ +)) + +$(eval $(call gb_Library_use_externals,sd,\ + bluez_bluetooth_headers \ +)) + +endif # ENABLE_SDREMOTE_BLUETOOTH=TRUE + +endif # ENABLE_SDREMOTE=TRUE + +# vim: set noet sw=4 ts=4: diff --git a/sd/Library_sdd.mk b/sd/Library_sdd.mk new file mode 100644 index 0000000000..997556407d --- /dev/null +++ b/sd/Library_sdd.mk @@ -0,0 +1,41 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Library_Library,sdd)) + +$(eval $(call gb_Library_set_include,sdd,\ + $$(INCLUDE) \ + -I$(SRCDIR)/sd/inc \ +)) + +$(eval $(call gb_Library_use_external,sdd,boost_headers)) + +$(eval $(call gb_Library_use_sdk_api,sdd)) + +$(eval $(call gb_Library_use_libraries,sdd,\ + comphelper \ + cppu \ + cppuhelper \ + sal \ + sfx \ + sot \ + tl \ + utl \ + vcl \ +)) + +$(eval $(call gb_Library_set_componentfile,sdd,sd/util/sdd,services)) + +$(eval $(call gb_Library_use_common_precompiled_header,sdd)) + +$(eval $(call gb_Library_add_exception_objects,sdd,\ + sd/source/ui/unoidl/sddetect \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/Library_sdui.mk b/sd/Library_sdui.mk new file mode 100644 index 0000000000..1510242b07 --- /dev/null +++ b/sd/Library_sdui.mk @@ -0,0 +1,134 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Library_Library,sdui)) + +$(eval $(call gb_Library_set_plugin_for,sdui,sd)) + +$(eval $(call gb_Library_set_componentfile,sdui,sd/source/console/presenter,services)) + +$(eval $(call gb_Library_set_include,sdui,\ + $$(INCLUDE) \ + -I$(SRCDIR)/sd/inc \ + -I$(SRCDIR)/sd/source/ui/inc \ +)) + +ifeq ($(ENABLE_SDREMOTE),TRUE) +$(eval $(call gb_Library_add_defs,sdui,\ + -DENABLE_SDREMOTE \ +)) + +ifeq ($(ENABLE_SDREMOTE_BLUETOOTH),TRUE) +$(eval $(call gb_Library_add_defs,sdui,\ + -DENABLE_SDREMOTE_BLUETOOTH \ +)) +endif + +endif + +$(eval $(call gb_Library_use_custom_headers,sdui,\ + officecfg/registry \ +)) + +$(eval $(call gb_Library_set_precompiled_header,sdui,sd/inc/pch/precompiled_sdui)) + +$(eval $(call gb_Library_use_external,sdui,boost_headers)) + +$(eval $(call gb_Library_use_sdk_api,sdui)) + +$(eval $(call gb_Library_use_libraries,sdui,\ + basegfx \ + comphelper \ + cppcanvas \ + cppu \ + cppuhelper \ + editeng \ + i18nlangtag \ + fwk \ + sal \ + salhelper \ + sfx \ + sot \ + svl \ + svt \ + svxcore \ + svx \ + tl \ + utl \ + vcl \ + cui \ +)) + +$(eval $(call gb_Library_add_exception_objects,sdui,\ + sd/source/ui/dlg/brkdlg \ + sd/source/ui/dlg/copydlg \ + sd/source/ui/dlg/custsdlg \ + sd/source/ui/dlg/dlgchar \ + sd/source/ui/dlg/dlgfield \ + sd/source/ui/dlg/dlgolbul \ + sd/source/ui/dlg/dlgpage \ + sd/source/ui/dlg/dlgsnap \ + sd/source/ui/dlg/headerfooterdlg \ + sd/source/ui/dlg/inspagob \ + sd/source/ui/dlg/masterlayoutdlg \ + sd/source/ui/dlg/morphdlg \ + sd/source/ui/dlg/paragr \ + sd/source/ui/dlg/present \ + sd/source/ui/dlg/prltempl \ + sd/source/ui/dlg/prntopts \ + sd/source/ui/dlg/RemoteDialog \ + sd/source/ui/dlg/RemoteDialogClientBox \ + sd/source/ui/dlg/sddlgfact \ + sd/source/ui/dlg/sdpreslt \ + sd/source/ui/dlg/sduiexp \ + sd/source/ui/dlg/tabtempl \ + sd/source/ui/dlg/tpaction \ + sd/source/ui/dlg/tpoption \ + sd/source/ui/dlg/vectdlg \ + sd/source/ui/dlg/PhotoAlbumDialog \ + sd/source/ui/dlg/BulletAndPositionDlg \ + sd/source/console/PresenterAccessibility \ + sd/source/console/PresenterBitmapContainer \ + sd/source/console/PresenterButton \ + sd/source/console/PresenterCanvasHelper \ + sd/source/console/PresenterConfigurationAccess \ + sd/source/console/PresenterController \ + sd/source/console/PresenterCurrentSlideObserver \ + sd/source/console/PresenterFrameworkObserver \ + sd/source/console/PresenterGeometryHelper \ + sd/source/console/PresenterHelpView \ + sd/source/console/PresenterHelper \ + sd/source/console/PresenterNotesView \ + sd/source/console/PresenterPaintManager \ + sd/source/console/PresenterPane \ + sd/source/console/PresenterPaneBase \ + sd/source/console/PresenterPaneBorderPainter \ + sd/source/console/PresenterPaneContainer \ + sd/source/console/PresenterPaneFactory \ + sd/source/console/PresenterProtocolHandler \ + sd/source/console/PresenterScreen \ + sd/source/console/PresenterScrollBar \ + sd/source/console/PresenterSlidePreview \ + sd/source/console/PresenterSlideShowView \ + sd/source/console/PresenterSlideSorter \ + sd/source/console/PresenterSprite \ + sd/source/console/PresenterSpritePane \ + sd/source/console/PresenterTextView \ + sd/source/console/PresenterTheme \ + sd/source/console/PresenterTimer \ + sd/source/console/PresenterToolBar \ + sd/source/console/PresenterUIPainter \ + sd/source/console/PresenterViewFactory \ + sd/source/console/PresenterWindowManager \ +)) + +# $(WORKDIR)/inc/sd/sddll0.hxx : + # echo "#define" DLL_NAME \"$(if $(filter-out WNT,$(OS)),lib)sd$(DLLPOSTFIX)$(DLLPOST)\" > $@ + +# vim: set noet sw=4 ts=4: diff --git a/sd/Makefile b/sd/Makefile new file mode 100644 index 0000000000..0997e62848 --- /dev/null +++ b/sd/Makefile @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) + +include $(module_directory)/../solenv/gbuild/partial_build.mk + +# vim: set noet sw=4 ts=4: diff --git a/sd/Module_sd.mk b/sd/Module_sd.mk new file mode 100644 index 0000000000..b3a8252546 --- /dev/null +++ b/sd/Module_sd.mk @@ -0,0 +1,81 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +include $(SRCDIR)/sd/export_setup.mk +include $(SRCDIR)/sd/import_setup.mk + +$(eval $(call gb_Module_Module,sd)) + +$(eval $(call gb_Module_add_targets,sd,\ + Library_sd \ + Library_sdd \ + Library_sdui \ + Package_opengl \ + Package_xml \ + UIConfig_sdraw \ + UIConfig_simpress \ +)) + +$(eval $(call gb_Module_add_l10n_targets,sd,\ + AllLangMoTarget_sd \ +)) + +ifeq ($(filter DRAGONFLY FREEBSD,$(OS)),) +$(eval $(call gb_Module_add_slowcheck_targets,sd,\ + $(if $(and $(filter $(COM),MSC),$(MERGELIBS)),, \ + CppunitTest_sd_uimpress) \ + CppunitTest_sd_import_tests \ + CppunitTest_sd_import_tests2 \ + CppunitTest_sd_import_tests_skia \ + CppunitTest_sd_import_tests-smartart \ + CppunitTest_sd_export_tests-ooxml1 \ + CppunitTest_sd_export_tests-ooxml2 \ + CppunitTest_sd_export_tests-ooxml3 \ + CppunitTest_sd_export_tests-ooxml4 \ + CppunitTest_sd_export_tests \ + CppunitTest_sd_filters_test \ + CppunitTest_sd_layout_tests \ + CppunitTest_sd_misc_tests \ + CppunitTest_sd_uiimpress \ + CppunitTest_sd_html_export_tests \ + CppunitTest_sd_activex_controls_tests \ + CppunitTest_sd_pdf_import_test \ + CppunitTest_sd_png_export_tests \ + CppunitTest_sd_filter_eppt \ + CppunitTest_sd_shape_import_export_tests \ + CppunitTest_sd_a11y \ + CppunitTest_sd_textfitting_tests \ + CppunitTest_sd_theme_tests \ +)) +endif + +ifneq ($(DISABLE_GUI),TRUE) +ifeq ($(OS),LINUX) +$(eval $(call gb_Module_add_slowcheck_targets,sd,\ + CppunitTest_sd_svg_export_tests \ + CppunitTest_sd_tiledrendering \ +)) +endif +endif + +# screenshots +$(eval $(call gb_Module_add_screenshot_targets,sd, \ + CppunitTest_sd_dialogs_test \ +)) + +$(eval $(call gb_Module_add_subsequentcheck_targets,sd,\ + JunitTest_sd_unoapi \ +)) + +$(eval $(call gb_Module_add_uicheck_targets,sd,\ + UITest_impress_tests \ + UITest_impress_tests2 \ + UITest_sd_findReplace \ +)) +# vim: set noet sw=4 ts=4: diff --git a/sd/Package_opengl.mk b/sd/Package_opengl.mk new file mode 100644 index 0000000000..ef03ab08f2 --- /dev/null +++ b/sd/Package_opengl.mk @@ -0,0 +1,16 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Package_Package,sd_opengl,$(SRCDIR)/sd/xml)) + +$(eval $(call gb_Package_add_files,sd_opengl,$(LIBO_SHARE_FOLDER)/config/soffice.cfg/simpress,\ + transitions-ogl.xml \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/Package_xml.mk b/sd/Package_xml.mk new file mode 100644 index 0000000000..555d46021b --- /dev/null +++ b/sd/Package_xml.mk @@ -0,0 +1,20 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Package_Package,sd_xml,$(SRCDIR)/sd/xml)) + +$(eval $(call gb_Package_add_files,sd_xml,$(LIBO_SHARE_FOLDER)/config/soffice.cfg/simpress,\ + effects.xml \ + transitions.xml \ + layoutlist.xml \ + objectlist.xml \ + styles.xml \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/README.md b/sd/README.md new file mode 100644 index 0000000000..4413a07762 --- /dev/null +++ b/sd/README.md @@ -0,0 +1,45 @@ +# LibreOffice Impress / Draw Application + +The core directory for the impress/draw applications. + +Think of impress as a hack on top of draw. + +`sd` module contains impress/draw specific code, non-shared UI and part +of `ppt` and `pptx` filter, few other filters too. + +the slideshow UI lives here as well, the slideshow engine is in +`slideshow` module though (including the 3D transitions engine +`slideshow/source/engine/opengl`). + +the most used filters are ODF's `odp`, binary ppt and OOXML's +`pptx`. their locations are listed below: + + * `odp` import and export filters are in `xmloff` module (mostly `xmloff/source/draw`) + + * `ppt` import is in `sd/source/filter/ppt` (big shared chunks are also in `svx`) + * `ppt` export is in `sd/source/filter/eppt` (big shared chunks are also in `svx`) + + * `pptx` import is in `oox/source/ppt` (and uses a lot of + `oox/source/drawingml` and `oox/source/*`) + * `pptx` export is in `sd/source/filter/eppt` (mostly in `pptx-*` source + files) and shared part is in `oox/source/export` + +## PPTX Export / Import Filters + +PPTX export filter is split into 2 parts. Impress related part is in +`sd/source/filter/eppt/pptx-*` and the other part is in +`oox/source/export/` because it contains mostly code related to +`DrawingML`, which is shared with writer and calc ooxml export. + +The export filter was written in 2009 IIRC and was not much extended +feature-wise lately. + +## Future Works +Add custom shapes export (see below). enhance text +output, we don't write text style for indentation levels now, need to +export `a:lvl1pPr`, `a:lvl2pPr`, ... elements. + +`PPTX` import was written by Sun/Oracle and then extended in LibreOffice +a lot during bug fixing. It is located in `oox/source/ppt` and +`oox/source/drawingml`. The areas with most bugs (at least until today) +were shape placeholders and text style inheritance. diff --git a/sd/README.vars b/sd/README.vars new file mode 100644 index 0000000000..cef7a294fc --- /dev/null +++ b/sd/README.vars @@ -0,0 +1 @@ +SD_DEBUG - Dump document as XML when pressing F12 (check model.xml in workdir) diff --git a/sd/README_REMOTE b/sd/README_REMOTE new file mode 100644 index 0000000000..cc53c4d8a6 --- /dev/null +++ b/sd/README_REMOTE @@ -0,0 +1,107 @@ +LibreOffice Impress Remote Protocol Specification + +Communication is over a UTF-8 encoded character stream. +(Using RTL_TEXTENCODING_UTF8 in the LibreOffice portion.) + +TCP +--- + +More TCP-specific details on setup and initial handshake to be +written, but the actual message protocol is the same as for Bluetooth. + + +Bluetooth +--------- + +Bluetooth communication is over RFCOMM. + +For discovery use the "standard UUID for the Serial Port Profile" +I.e. the 16-bit SerialPort UUID 0x1101, +or if necessary inserted into the Bluetooth BASE_UUID: +00001101-0000-1000-8000-00805F9B34FB +See https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm + +Message Format +-------------- + +A message consists of one or more lines. The first line is the message description, +further lines can add any necessary data. An empty line concludes the message. + +I.e. "MESSAGE\n\n" or "MESSAGE\nDATA\nDATA2...\n\n" + +You must keep reading a message until an empty line (i.e. double +new-line) is reached to allow for future protocol extension. + +Initialisation +------------- + +Once connected the server sends "LO_SERVER_SERVER_PAIRED". +(I.e. "LO_SERVER_SERVER_PAIRED\n\n" is sent over the stream.) + +Subsequently the server will send either slideshow_started if a slideshow is running, +or slideshow_finished if no slideshow is running. (See below for details of.) + +The current server implementation then proceeds to send all slide notes and previews +to the client. (This should be changed to prevent memory issues, and a preview +request mechanism implemented.) + + +Commands (Client to Server) +--------------------------- + +The client should not assume that the state of the server has changed when a +command has been sent. All changes will be signalled back to the client. +(This is to allow for cases such as multiple clients requesting different changes, etc.) + +Any lines in [square brackets] are optional, and should be omitted if not needed. + +* transition_next +* transition_previous + +* goto_slide + slide_number + +* presentation_start +* presentation_stop + +* presentation_resume // Resumes after a presentation_blank_screen. +* presentation_blank_screen + [Colour String] // Colour the screen will show (default: black). Not + // implemented, and format hasn't yet been defined. + +# As of gsoc2013, these commands are extended to the existing protocol, since server-end are tolerant with unknown commands, these extensions doesn't break backward compatibility +* pointer_started // create a red dot on screen at initial position (x,y) + initial_x // This should be called when user first touch the screen + initial_y // note that x, y are in percentage (from 0.0 to 1.0) with respect to the slideshow size +* pointer_dismissed // This dismiss the pointer red dot on screen, should be called when user stop touching screen +* pointer_coordination // This update pointer's position to current (x,y) + current_x // note that x, y are in percentage (from 0.0 to 1.0) with respect to the slideshow size + current_y // unless screenupdater's performance is significantly improved, we should consider limit the update frequency on the + // remote-end + + + +Status/Data (Server to Client) +------------------------------ + +* slideshow_finished // (Also transmitted if no slideshow running when started.) + +* slideshow_started // (Also transmitted if a slideshow is running on startup.) + numberOfSlides + currentSlideNumber + +* slide_notes + slideNumber + [Notes] // The notes are an html document, and may also include \n newlines, + // i.e. the client should keep reading until a blank line is reached. + +* slide_updated // Slide on server has changed + currentSlideNumber + +* slide_preview // Supplies a preview image for a slide. + slideNumber + image // A Base 64 Encoded png image. + +# As of gsoc2013, these commands are extended to the existing protocol, since remote-end also ignore all unknown commands (which is the case of gsoc2012 android implementation), backward compatibility is kept. +* slideshow_info // once paired, the server-end will send back the title of the current presentation + Title diff --git a/sd/UIConfig_sdraw.mk b/sd/UIConfig_sdraw.mk new file mode 100644 index 0000000000..f6d42acba7 --- /dev/null +++ b/sd/UIConfig_sdraw.mk @@ -0,0 +1,128 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_UIConfig_UIConfig,modules/sdraw)) + +$(eval $(call gb_UIConfig_add_menubarfiles,modules/sdraw,\ + sd/uiconfig/sdraw/menubar/menubar \ +)) + +$(eval $(call gb_UIConfig_add_popupmenufiles,modules/sdraw,\ + sd/uiconfig/sdraw/popupmenu/3dobject \ + sd/uiconfig/sdraw/popupmenu/3dscene2 \ + sd/uiconfig/sdraw/popupmenu/3dscene \ + sd/uiconfig/sdraw/popupmenu/bezier \ + sd/uiconfig/sdraw/popupmenu/connector \ + sd/uiconfig/sdraw/popupmenu/curve \ + sd/uiconfig/sdraw/popupmenu/drawtext \ + sd/uiconfig/sdraw/popupmenu/draw \ + sd/uiconfig/sdraw/popupmenu/form \ + sd/uiconfig/sdraw/popupmenu/formrichtext \ + sd/uiconfig/sdraw/popupmenu/gluepoint \ + sd/uiconfig/sdraw/popupmenu/graphic \ + sd/uiconfig/sdraw/popupmenu/group \ + sd/uiconfig/sdraw/popupmenu/layertab \ + sd/uiconfig/sdraw/popupmenu/line \ + sd/uiconfig/sdraw/popupmenu/measure \ + sd/uiconfig/sdraw/popupmenu/media \ + sd/uiconfig/sdraw/popupmenu/multiselect \ + sd/uiconfig/sdraw/popupmenu/notebookbar \ + sd/uiconfig/sdraw/popupmenu/objectalign \ + sd/uiconfig/sdraw/popupmenu/oleobject \ + sd/uiconfig/sdraw/popupmenu/pagepanemaster \ + sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster \ + sd/uiconfig/sdraw/popupmenu/pagepanenosel \ + sd/uiconfig/sdraw/popupmenu/pagepane \ + sd/uiconfig/sdraw/popupmenu/pagetab \ + sd/uiconfig/sdraw/popupmenu/page \ + sd/uiconfig/sdraw/popupmenu/table \ + sd/uiconfig/sdraw/popupmenu/textbox \ +)) + +$(eval $(call gb_UIConfig_add_statusbarfiles,modules/sdraw,\ + sd/uiconfig/sdraw/statusbar/statusbar \ +)) + +$(eval $(call gb_UIConfig_add_toolbarfiles,modules/sdraw,\ + sd/uiconfig/sdraw/toolbar/3dobjectsbar \ + sd/uiconfig/sdraw/toolbar/alignmentbar \ + sd/uiconfig/sdraw/toolbar/arrowsbar \ + sd/uiconfig/sdraw/toolbar/arrowshapes \ + sd/uiconfig/sdraw/toolbar/basicshapes \ + sd/uiconfig/sdraw/toolbar/bezierobjectbar \ + sd/uiconfig/sdraw/toolbar/calloutshapes \ + sd/uiconfig/sdraw/toolbar/choosemodebar \ + sd/uiconfig/sdraw/toolbar/colorbar \ + sd/uiconfig/sdraw/toolbar/commentsbar \ + sd/uiconfig/sdraw/toolbar/connectorsbar \ + sd/uiconfig/sdraw/toolbar/drawingobjectbar \ + sd/uiconfig/sdraw/toolbar/distributebar \ + sd/uiconfig/sdraw/toolbar/ellipsesbar \ + sd/uiconfig/sdraw/toolbar/extrusionobjectbar \ + sd/uiconfig/sdraw/toolbar/findbar \ + sd/uiconfig/sdraw/toolbar/flowchartshapes \ + sd/uiconfig/sdraw/toolbar/fontworkobjectbar \ + sd/uiconfig/sdraw/toolbar/fontworkshapetype \ + sd/uiconfig/sdraw/toolbar/formcontrols \ + sd/uiconfig/sdraw/toolbar/formdesign \ + sd/uiconfig/sdraw/toolbar/formsfilterbar \ + sd/uiconfig/sdraw/toolbar/formsnavigationbar \ + sd/uiconfig/sdraw/toolbar/formtextobjectbar \ + sd/uiconfig/sdraw/toolbar/fullscreenbar \ + sd/uiconfig/sdraw/toolbar/gluepointsobjectbar \ + sd/uiconfig/sdraw/toolbar/graffilterbar \ + sd/uiconfig/sdraw/toolbar/graphicobjectbar \ + sd/uiconfig/sdraw/toolbar/insertbar \ + sd/uiconfig/sdraw/toolbar/linesbar \ + sd/uiconfig/sdraw/toolbar/masterviewtoolbar \ + sd/uiconfig/sdraw/toolbar/mediaobjectbar \ + sd/uiconfig/sdraw/toolbar/notebookbarshortcuts \ + sd/uiconfig/sdraw/toolbar/optimizetablebar \ + sd/uiconfig/sdraw/toolbar/optionsbar \ + sd/uiconfig/sdraw/toolbar/positionbar \ + sd/uiconfig/sdraw/toolbar/rectanglesbar \ + sd/uiconfig/sdraw/toolbar/redactedexportbar \ + sd/uiconfig/sdraw/toolbar/redactionbar \ + sd/uiconfig/sdraw/toolbar/standardbar \ + sd/uiconfig/sdraw/toolbar/starshapes \ + sd/uiconfig/sdraw/toolbar/symbolshapes \ + sd/uiconfig/sdraw/toolbar/tableobjectbar \ + sd/uiconfig/sdraw/toolbar/textbar \ + sd/uiconfig/sdraw/toolbar/textobjectbar \ + sd/uiconfig/sdraw/toolbar/toolbar \ + sd/uiconfig/sdraw/toolbar/viewerbar \ + sd/uiconfig/sdraw/toolbar/zoombar \ +)) + +$(eval $(call gb_UIConfig_add_uifiles,modules/sdraw,\ + sd/uiconfig/sdraw/ui/breakdialog \ + sd/uiconfig/sdraw/ui/bulletsandnumbering \ + sd/uiconfig/sdraw/ui/crossfadedialog \ + sd/uiconfig/sdraw/ui/dlgsnap \ + sd/uiconfig/sdraw/ui/copydlg \ + sd/uiconfig/sdraw/ui/drawchardialog \ + sd/uiconfig/sdraw/ui/drawprinteroptions \ + sd/uiconfig/sdraw/ui/drawparadialog \ + sd/uiconfig/sdraw/ui/drawpagedialog \ + sd/uiconfig/sdraw/ui/drawprtldialog \ + sd/uiconfig/sdraw/ui/insertlayer \ + sd/uiconfig/sdraw/ui/insertslidesdialog \ + sd/uiconfig/sdraw/ui/namedesign \ + sd/uiconfig/sdraw/ui/navigatorcontextmenu \ + sd/uiconfig/sdraw/ui/notebookbar \ + sd/uiconfig/sdraw/ui/notebookbar_compact \ + sd/uiconfig/sdraw/ui/notebookbar_single \ + sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact \ + sd/uiconfig/sdraw/ui/notebookbar_online \ + sd/uiconfig/sdraw/ui/paranumberingtab \ + sd/uiconfig/sdraw/ui/queryunlinkimagedialog \ + sd/uiconfig/sdraw/ui/vectorize \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/UIConfig_simpress.mk b/sd/UIConfig_simpress.mk new file mode 100644 index 0000000000..9d98d611de --- /dev/null +++ b/sd/UIConfig_simpress.mk @@ -0,0 +1,176 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_UIConfig_UIConfig,modules/simpress)) + +$(eval $(call gb_UIConfig_add_menubarfiles,modules/simpress,\ + sd/uiconfig/simpress/menubar/menubar \ +)) + +$(eval $(call gb_UIConfig_add_popupmenufiles,modules/simpress,\ + sd/uiconfig/simpress/popupmenu/3dobject \ + sd/uiconfig/simpress/popupmenu/3dscene2 \ + sd/uiconfig/simpress/popupmenu/3dscene \ + sd/uiconfig/simpress/popupmenu/bezier \ + sd/uiconfig/simpress/popupmenu/connector \ + sd/uiconfig/simpress/popupmenu/curve \ + sd/uiconfig/simpress/popupmenu/drawtext \ + sd/uiconfig/simpress/popupmenu/draw \ + sd/uiconfig/simpress/popupmenu/form \ + sd/uiconfig/simpress/popupmenu/formrichtext \ + sd/uiconfig/simpress/popupmenu/gluepoint \ + sd/uiconfig/simpress/popupmenu/graphic \ + sd/uiconfig/simpress/popupmenu/group \ + sd/uiconfig/simpress/popupmenu/line \ + sd/uiconfig/simpress/popupmenu/measure \ + sd/uiconfig/simpress/popupmenu/media \ + sd/uiconfig/simpress/popupmenu/multiselect \ + sd/uiconfig/simpress/popupmenu/notebookbar \ + sd/uiconfig/simpress/popupmenu/objectalign \ + sd/uiconfig/simpress/popupmenu/oleobject \ + sd/uiconfig/simpress/popupmenu/outline \ + sd/uiconfig/simpress/popupmenu/pagepanemaster \ + sd/uiconfig/simpress/popupmenu/pagepanenoselmaster \ + sd/uiconfig/simpress/popupmenu/pagepanenosel \ + sd/uiconfig/simpress/popupmenu/pagepane \ + sd/uiconfig/simpress/popupmenu/pagetab \ + sd/uiconfig/simpress/popupmenu/page \ + sd/uiconfig/simpress/popupmenu/table \ + sd/uiconfig/simpress/popupmenu/textbox \ +)) + +$(eval $(call gb_UIConfig_add_statusbarfiles,modules/simpress,\ + sd/uiconfig/simpress/statusbar/statusbar \ +)) + +$(eval $(call gb_UIConfig_add_toolbarfiles,modules/simpress,\ + sd/uiconfig/simpress/toolbar/3dobjectsbar \ + sd/uiconfig/simpress/toolbar/alignmentbar \ + sd/uiconfig/simpress/toolbar/arrowsbar \ + sd/uiconfig/simpress/toolbar/arrowshapes \ + sd/uiconfig/simpress/toolbar/basicshapes \ + sd/uiconfig/simpress/toolbar/bezierobjectbar \ + sd/uiconfig/simpress/toolbar/calloutshapes \ + sd/uiconfig/simpress/toolbar/choosemodebar \ + sd/uiconfig/simpress/toolbar/classificationbar \ + sd/uiconfig/simpress/toolbar/colorbar \ + sd/uiconfig/simpress/toolbar/commentsbar \ + sd/uiconfig/simpress/toolbar/commontaskbar \ + sd/uiconfig/simpress/toolbar/connectorsbar \ + sd/uiconfig/simpress/toolbar/drawingobjectbar \ + sd/uiconfig/simpress/toolbar/distributebar \ + sd/uiconfig/simpress/toolbar/ellipsesbar \ + sd/uiconfig/simpress/toolbar/extrusionobjectbar \ + sd/uiconfig/simpress/toolbar/findbar \ + sd/uiconfig/simpress/toolbar/flowchartshapes \ + sd/uiconfig/simpress/toolbar/fontworkobjectbar \ + sd/uiconfig/simpress/toolbar/fontworkshapetype \ + sd/uiconfig/simpress/toolbar/formcontrols \ + sd/uiconfig/simpress/toolbar/formdesign \ + sd/uiconfig/simpress/toolbar/formsfilterbar \ + sd/uiconfig/simpress/toolbar/formsnavigationbar \ + sd/uiconfig/simpress/toolbar/formtextobjectbar \ + sd/uiconfig/simpress/toolbar/fullscreenbar \ + sd/uiconfig/simpress/toolbar/gluepointsobjectbar \ + sd/uiconfig/simpress/toolbar/graffilterbar \ + sd/uiconfig/simpress/toolbar/graphicobjectbar \ + sd/uiconfig/simpress/toolbar/insertbar \ + sd/uiconfig/simpress/toolbar/linesbar \ + sd/uiconfig/simpress/toolbar/masterviewtoolbar \ + sd/uiconfig/simpress/toolbar/mediaobjectbar \ + sd/uiconfig/simpress/toolbar/notebookbarshortcuts \ + sd/uiconfig/simpress/toolbar/optimizetablebar \ + sd/uiconfig/simpress/toolbar/optionsbar \ + sd/uiconfig/simpress/toolbar/outlinetoolbar \ + sd/uiconfig/simpress/toolbar/positionbar \ + sd/uiconfig/simpress/toolbar/rectanglesbar \ + sd/uiconfig/simpress/toolbar/slideviewobjectbar \ + sd/uiconfig/simpress/toolbar/slideviewtoolbar \ + sd/uiconfig/simpress/toolbar/singlemode \ + sd/uiconfig/simpress/toolbar/standardbar \ + sd/uiconfig/simpress/toolbar/starshapes \ + sd/uiconfig/simpress/toolbar/symbolshapes \ + sd/uiconfig/simpress/toolbar/tableobjectbar \ + sd/uiconfig/simpress/toolbar/textbar \ + sd/uiconfig/simpress/toolbar/textobjectbar \ + sd/uiconfig/simpress/toolbar/toolbar \ + sd/uiconfig/simpress/toolbar/viewerbar \ + sd/uiconfig/simpress/toolbar/zoombar \ +)) + +$(eval $(call gb_UIConfig_add_uifiles,modules/simpress,\ + sd/uiconfig/simpress/ui/annotation \ + sd/uiconfig/simpress/ui/annotationtagmenu \ + sd/uiconfig/simpress/ui/clientboxfragment \ + sd/uiconfig/simpress/ui/currentmastermenu \ + sd/uiconfig/simpress/ui/customanimationspanel \ + sd/uiconfig/simpress/ui/customanimationproperties \ + sd/uiconfig/simpress/ui/customanimationeffecttab \ + sd/uiconfig/simpress/ui/customanimationfragment \ + sd/uiconfig/simpress/ui/customanimationtimingtab \ + sd/uiconfig/simpress/ui/customanimationtexttab \ + sd/uiconfig/simpress/ui/customslideshows \ + sd/uiconfig/simpress/ui/definecustomslideshow \ + sd/uiconfig/simpress/ui/displaywindow \ + sd/uiconfig/simpress/ui/dlgfield \ + sd/uiconfig/simpress/ui/dockinganimation \ + sd/uiconfig/simpress/ui/effectmenu \ + sd/uiconfig/simpress/ui/fieldmenu \ + sd/uiconfig/simpress/ui/fontsizemenu \ + sd/uiconfig/simpress/ui/fontstylemenu \ + sd/uiconfig/simpress/ui/gluebox \ + sd/uiconfig/simpress/ui/headerfooterdialog \ + sd/uiconfig/simpress/ui/headerfootertab \ + sd/uiconfig/simpress/ui/impressprinteroptions \ + sd/uiconfig/simpress/ui/insertslides \ + sd/uiconfig/simpress/ui/interactiondialog \ + sd/uiconfig/simpress/ui/interactionpage \ + sd/uiconfig/simpress/ui/layoutmenu \ + sd/uiconfig/simpress/ui/layoutpanel \ + sd/uiconfig/simpress/ui/layoutwindow \ + sd/uiconfig/simpress/ui/masterlayoutdlg \ + sd/uiconfig/simpress/ui/mastermenu \ + sd/uiconfig/simpress/ui/masterpagemenu \ + sd/uiconfig/simpress/ui/masterpagepanel \ + sd/uiconfig/simpress/ui/masterpagepanelall \ + sd/uiconfig/simpress/ui/masterpagepanelrecent \ + sd/uiconfig/simpress/ui/navigatorpanel \ + sd/uiconfig/simpress/ui/notebookbar \ + sd/uiconfig/simpress/ui/notebookbar_compact \ + sd/uiconfig/simpress/ui/notebookbar_single \ + sd/uiconfig/simpress/ui/notebookbar_groups \ + sd/uiconfig/simpress/ui/notebookbar_groupedbar_full \ + sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact \ + sd/uiconfig/simpress/ui/notebookbar_online \ + sd/uiconfig/simpress/ui/optimpressgeneralpage \ + sd/uiconfig/simpress/ui/pagesfieldbox \ + sd/uiconfig/simpress/ui/photoalbum \ + sd/uiconfig/simpress/ui/pmimagespage \ + sd/uiconfig/simpress/ui/pminfodialog \ + sd/uiconfig/simpress/ui/pmintropage \ + sd/uiconfig/simpress/ui/pmobjectspage \ + sd/uiconfig/simpress/ui/pmslidespage \ + sd/uiconfig/simpress/ui/pmsummarypage \ + sd/uiconfig/simpress/ui/presentationdialog \ + sd/uiconfig/simpress/ui/prntopts \ + sd/uiconfig/simpress/ui/remotedialog \ + sd/uiconfig/simpress/ui/rotatemenu \ + sd/uiconfig/simpress/ui/scalemenu \ + sd/uiconfig/simpress/ui/sdviewpage \ + sd/uiconfig/simpress/ui/sidebarslidebackground \ + sd/uiconfig/simpress/ui/slidecontextmenu \ + sd/uiconfig/simpress/ui/slidedesigndialog \ + sd/uiconfig/simpress/ui/slidetransitionspanel \ + sd/uiconfig/simpress/ui/snapmenu \ + sd/uiconfig/simpress/ui/tabviewbar \ + sd/uiconfig/simpress/ui/tabledesignpanel \ + sd/uiconfig/simpress/ui/templatedialog \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/UITest_impress_tests.mk b/sd/UITest_impress_tests.mk new file mode 100644 index 0000000000..f2c074fe52 --- /dev/null +++ b/sd/UITest_impress_tests.mk @@ -0,0 +1,20 @@ +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_UITest_UITest,impress_tests)) + +$(eval $(call gb_UITest_add_modules,impress_tests,$(SRCDIR)/sd/qa/uitest,\ + impress_tests/ \ +)) + +$(eval $(call gb_UITest_set_defs,impress_tests, \ + TDOC="$(SRCDIR)/sd/qa/uitest/data" \ +)) + +$(eval $(call gb_UITest_avoid_oneprocess,impress_tests)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/UITest_impress_tests2.mk b/sd/UITest_impress_tests2.mk new file mode 100644 index 0000000000..a181bedcc3 --- /dev/null +++ b/sd/UITest_impress_tests2.mk @@ -0,0 +1,18 @@ +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_UITest_UITest,impress_tests2)) + +$(eval $(call gb_UITest_add_modules,impress_tests2,$(SRCDIR)/sd/qa/uitest,\ + impress_tests2/ \ +)) + +$(eval $(call gb_UITest_set_defs,impress_tests2, \ + TDOC="$(SRCDIR)/sd/qa/uitest/data" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/UITest_sd_findReplace.mk b/sd/UITest_sd_findReplace.mk new file mode 100644 index 0000000000..8db50a5835 --- /dev/null +++ b/sd/UITest_sd_findReplace.mk @@ -0,0 +1,18 @@ +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_UITest_UITest,sd_findReplace)) + +$(eval $(call gb_UITest_add_modules,sd_findReplace,$(SRCDIR)/sd/qa/uitest,\ + findReplace/ \ +)) + +$(eval $(call gb_UITest_set_defs,sd_findReplace, \ + TDOC="$(SRCDIR)/sd/qa/uitest/data" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/export_setup.mk b/sd/export_setup.mk new file mode 100644 index 0000000000..e9b2a8a88b --- /dev/null +++ b/sd/export_setup.mk @@ -0,0 +1,89 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +# template for export tests +define sd_export_test + +$(eval $(call gb_CppunitTest_CppunitTest,sd_export_tests$(1))) + +$(eval $(call gb_CppunitTest_use_externals,sd_export_tests$(1),\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_export_tests$(1))) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_export_tests$(1), \ + sd/qa/unit/export-tests$(1) \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_export_tests$(1), \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + docmodel \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_export_tests$(1),\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_export_tests$(1))) + +$(eval $(call gb_CppunitTest_use_ure,sd_export_tests$(1))) +$(eval $(call gb_CppunitTest_use_vcl,sd_export_tests$(1))) + +$(eval $(call gb_CppunitTest_use_rdb,sd_export_tests$(1),services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_export_tests$(1),\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_export_tests$(1))) + +$(eval $(call gb_CppunitTest_add_arguments,sd_export_tests$(1),\ + -env:SVG_DISABLE_FONT_EMBEDDING= \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +endef + +# vim: set noet sw=4 ts=4: diff --git a/sd/import_setup.mk b/sd/import_setup.mk new file mode 100644 index 0000000000..f4788040d3 --- /dev/null +++ b/sd/import_setup.mk @@ -0,0 +1,141 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +# template for import tests +define sd_import_test + +$(eval $(call gb_CppunitTest_CppunitTest,sd_import_tests$(1))) + +$(eval $(call gb_CppunitTest_use_externals,sd_import_tests$(1),\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_import_tests$(1))) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_import_tests$(1), \ + sd/qa/unit/import-tests$(1) \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_import_tests$(1), \ + $(call gb_Helper_optional,AVMEDIA,avmedia) \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_import_tests$(1),\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_import_tests$(1))) + +$(eval $(call gb_CppunitTest_use_ure,sd_import_tests$(1))) +$(eval $(call gb_CppunitTest_use_vcl,sd_import_tests$(1))) + +$(eval $(call gb_CppunitTest_use_components,sd_import_tests$(1),\ + animations/source/animcore/animcore \ + basic/util/sb \ + chart2/source/chartcore \ + chart2/source/controller/chartcontroller \ + comphelper/util/comphelp \ + configmgr/source/configmgr \ + dbaccess/util/dba \ + desktop/source/deployment/deployment \ + drawinglayer/drawinglayer \ + embeddedobj/util/embobj \ + emfio/emfio \ + filter/source/config/cache/filterconfig1 \ + filter/source/odfflatxml/odfflatxml \ + filter/source/svg/svgfilter \ + filter/source/pdf/pdffilter \ + filter/source/xmlfilteradaptor/xmlfa \ + filter/source/xmlfilterdetect/xmlfd \ + filter/source/storagefilterdetect/storagefd \ + forms/util/frm \ + framework/util/fwk \ + i18npool/util/i18npool \ + linguistic/source/lng \ + oox/util/oox \ + package/source/xstor/xstor \ + package/util/package2 \ + sax/source/expatwrap/expwrap \ + sd/util/sd \ + sd/util/sdd \ + $(if $(ENABLE_POPPLER),sdext/source/pdfimport/pdfimport) \ + sfx2/util/sfx \ + sot/util/sot \ + svl/source/fsstor/fsstorage \ + svtools/util/svt \ + svx/util/svxcore \ + svgio/svgio \ + toolkit/util/tk \ + ucb/source/core/ucb1 \ + ucb/source/ucp/expand/ucpexpand1 \ + ucb/source/ucp/file/ucpfile1 \ + ucb/source/ucp/package/ucppkg1 \ + ucb/source/ucp/tdoc/ucptdoc1 \ + unotools/util/utl \ + unoxml/source/rdf/unordf \ + unoxml/source/service/unoxml \ + uui/util/uui \ + vcl/vcl.common \ + xmlscript/util/xmlscript \ + xmloff/util/xo \ + xmlsecurity/util/xmlsecurity \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_import_tests$(1))) + +$(eval $(call gb_CppunitTest_use_packages,sd_import_tests$(1),\ + oox_customshapes \ +)) + +ifneq ($(ENABLE_POPPLER),) +$(eval $(call gb_CppunitTest_use_executable,sd_import_tests$(1),xpdfimport)) +endif + +$(eval $(call gb_CppunitTest_add_arguments,sd_import_tests$(1), \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +endef + +# vim: set noet sw=4 ts=4: diff --git a/sd/inc/Annotation.hxx b/sd/inc/Annotation.hxx new file mode 100644 index 0000000000..c09f677032 --- /dev/null +++ b/sd/inc/Annotation.hxx @@ -0,0 +1,164 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +#include "sdpage.hxx" +#include "textapi.hxx" +#include "sddllapi.h" + +#include +#include + +class SdrUndoAction; + +namespace com::sun::star::office { + class XAnnotation; +} + +namespace com::sun::star::uno { template class Reference; } + +class SfxViewShell; + +namespace sd { + +enum class CommentNotificationType { Add, Modify, Remove }; + +void createAnnotation( rtl::Reference< Annotation >& xAnnotation, SdPage* pPage ); + +std::unique_ptr CreateUndoInsertOrRemoveAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation, bool bInsert ); + +void CreateChangeUndo(const css::uno::Reference< css::office::XAnnotation >& xAnnotation); + +sal_uInt32 getAnnotationId(const css::uno::Reference & xAnnotation); + +const SdPage* getAnnotationPage(const css::uno::Reference& xAnnotation); + +void LOKCommentNotify(CommentNotificationType nType, const SfxViewShell* pViewShell, + css::uno::Reference const & rxAnnotation); + +void LOKCommentNotifyAll(CommentNotificationType nType, + css::uno::Reference const & rxAnnotation); + +struct SD_DLLPUBLIC CustomAnnotationMarker +{ + Color maLineColor; + Color maFillColor; + float mnLineWidth; + std::vector maPolygons; +}; + +class SD_DLLPUBLIC Annotation final : private ::cppu::BaseMutex, + public ::cppu::WeakComponentImplHelper, + public ::cppu::PropertySetMixin +{ +public: + explicit Annotation( const css::uno::Reference& context, SdPage* pPage ); + Annotation(const Annotation&) = delete; + Annotation& operator=(const Annotation&) = delete; + + static sal_uInt32 m_nLastId; + + SdPage* GetPage() const { return mpPage; } + SdrModel* GetModel() { return (mpPage != nullptr) ? &mpPage->getSdrModelFromSdrPage() : nullptr; } + sal_uInt32 GetId() const { return m_nId; } + + // XInterface: + virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const & type) override; + virtual void SAL_CALL acquire() noexcept override { ::cppu::WeakComponentImplHelper::acquire(); } + virtual void SAL_CALL release() noexcept override { ::cppu::WeakComponentImplHelper::release(); } + + // css::beans::XPropertySet: + virtual css::uno::Reference SAL_CALL getPropertySetInfo() override; + virtual void SAL_CALL setPropertyValue(const OUString & aPropertyName, const css::uno::Any & aValue) override; + virtual css::uno::Any SAL_CALL getPropertyValue(const OUString & PropertyName) override; + virtual void SAL_CALL addPropertyChangeListener(const OUString & aPropertyName, const css::uno::Reference & xListener) override; + virtual void SAL_CALL removePropertyChangeListener(const OUString & aPropertyName, const css::uno::Reference & aListener) override; + virtual void SAL_CALL addVetoableChangeListener(const OUString & PropertyName, const css::uno::Reference & aListener) override; + virtual void SAL_CALL removeVetoableChangeListener(const OUString & PropertyName, const css::uno::Reference & aListener) override; + + // css::office::XAnnotation: + virtual css::uno::Any SAL_CALL getAnchor() override; + virtual css::geometry::RealPoint2D SAL_CALL getPosition() override; + virtual void SAL_CALL setPosition(const css::geometry::RealPoint2D & the_value) override; + virtual css::geometry::RealSize2D SAL_CALL getSize() override; + virtual void SAL_CALL setSize(const css::geometry::RealSize2D& _size) override; + virtual OUString SAL_CALL getAuthor() override; + virtual void SAL_CALL setAuthor(const OUString & the_value) override; + virtual OUString SAL_CALL getInitials() override; + virtual void SAL_CALL setInitials(const OUString & the_value) override; + virtual css::util::DateTime SAL_CALL getDateTime() override; + virtual void SAL_CALL setDateTime(const css::util::DateTime & the_value) override; + virtual css::uno::Reference SAL_CALL getTextRange() override; + + void createChangeUndo(); + + void createCustomAnnotationMarker() + { + m_pCustomAnnotationMarker = std::make_unique(); + } + + CustomAnnotationMarker& getCustomAnnotationMarker() + { + return *m_pCustomAnnotationMarker; + } + + bool hasCustomAnnotationMarker() const + { + return bool(m_pCustomAnnotationMarker); + } + + void setIsFreeText(bool value) { m_bIsFreeText = value; } + + bool isFreeText() const { return m_bIsFreeText; } + +private: + // destructor is private and will be called indirectly by the release call virtual ~Annotation() {} + + // override WeakComponentImplHelperBase::disposing() + // This function is called upon disposing the component, + // if your component needs special work when it becomes + // disposed, do it here. + virtual void SAL_CALL disposing() override; + + sal_uInt32 m_nId; + SdPage* mpPage; + css::geometry::RealPoint2D m_Position; + css::geometry::RealSize2D m_Size; + OUString m_Author; + OUString m_Initials; + css::util::DateTime m_DateTime; + rtl::Reference m_TextRange; + + std::unique_ptr m_pCustomAnnotationMarker; + bool m_bIsFreeText; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/AnnotationEnumeration.hxx b/sd/inc/AnnotationEnumeration.hxx new file mode 100644 index 0000000000..ed35b46b40 --- /dev/null +++ b/sd/inc/AnnotationEnumeration.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include "sdpage.hxx" + +namespace com::sun::star::office +{ +class XAnnotationEnumeration; +} + +namespace sd +{ +css::uno::Reference +createAnnotationEnumeration(AnnotationVector&&); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/CustomAnimationCloner.hxx b/sd/inc/CustomAnimationCloner.hxx new file mode 100644 index 0000000000..5cc71b0e69 --- /dev/null +++ b/sd/inc/CustomAnimationCloner.hxx @@ -0,0 +1,33 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdPage; + +namespace sd +{ +css::uno::Reference +Clone(const css::uno::Reference& xSourceNode, + const SdPage* pSource = nullptr, const SdPage* pTarget = nullptr); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/CustomAnimationEffect.hxx b/sd/inc/CustomAnimationEffect.hxx new file mode 100644 index 0000000000..e6d1530fb4 --- /dev/null +++ b/sd/inc/CustomAnimationEffect.hxx @@ -0,0 +1,455 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include "sddllapi.h" +#include +#include +#include +#include + +class SdrPathObj; +class SdrModel; + +namespace sd { + +enum class EValue { To, By }; + +class CustomAnimationEffect; + +class CustomAnimationPreset; +typedef std::shared_ptr< CustomAnimationPreset > CustomAnimationPresetPtr; + +typedef std::shared_ptr< CustomAnimationEffect > CustomAnimationEffectPtr; + +typedef std::list< CustomAnimationEffectPtr > EffectSequence; + +class EffectSequenceHelper; + +class SD_DLLPUBLIC CustomAnimationEffect final +{ + friend class MainSequence; + friend class EffectSequenceHelper; + +public: + CustomAnimationEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + ~CustomAnimationEffect(); + + SAL_DLLPRIVATE const css::uno::Reference< css::animations::XAnimationNode >& getNode() const { return mxNode; } + SAL_DLLPRIVATE void setNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + SAL_DLLPRIVATE void replaceNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + + SAL_DLLPRIVATE CustomAnimationEffectPtr clone() const; + + // attributes + SAL_DLLPRIVATE const OUString& getPresetId() const { return maPresetId; } + SAL_DLLPRIVATE const OUString& getPresetSubType() const { return maPresetSubType; } + SAL_DLLPRIVATE const OUString& getProperty() const { return maProperty; } + + SAL_DLLPRIVATE sal_Int16 getPresetClass() const { return mnPresetClass; } + SAL_DLLPRIVATE void setPresetClassAndId( sal_Int16 nPresetClass, const OUString& rPresetId ); + + SAL_DLLPRIVATE sal_Int16 getNodeType() const { return mnNodeType; } + void setNodeType( sal_Int16 nNodeType ); + + SAL_DLLPRIVATE css::uno::Any getRepeatCount() const; + SAL_DLLPRIVATE void setRepeatCount( const css::uno::Any& rRepeatCount ); + + SAL_DLLPRIVATE css::uno::Any getEnd() const; + SAL_DLLPRIVATE void setEnd( const css::uno::Any& rEnd ); + + SAL_DLLPRIVATE sal_Int16 getFill() const { return mnFill; } + SAL_DLLPRIVATE void setFill( sal_Int16 nFill ); + + SAL_DLLPRIVATE double getBegin() const { return mfBegin; } + void setBegin( double fBegin ); + + SAL_DLLPRIVATE double getDuration() const { return mfDuration; } + void setDuration( double fDuration ); + + SAL_DLLPRIVATE double getAbsoluteDuration() const { return mfAbsoluteDuration; } + + SAL_DLLPRIVATE sal_Int16 getIterateType() const { return mnIterateType; } + void setIterateType( sal_Int16 nIterateType ); + + SAL_DLLPRIVATE double getIterateInterval() const { return mfIterateInterval; } + void setIterateInterval( double fIterateInterval ); + + SAL_DLLPRIVATE const css::uno::Any& getTarget() const { return maTarget; } + void setTarget( const css::uno::Any& rTarget ); + + SAL_DLLPRIVATE bool hasAfterEffect() const { return mbHasAfterEffect; } + SAL_DLLPRIVATE void setHasAfterEffect( bool bHasAfterEffect ) { mbHasAfterEffect = bHasAfterEffect; } + + SAL_DLLPRIVATE const css::uno::Any& getDimColor() const { return maDimColor; } + SAL_DLLPRIVATE void setDimColor( const css::uno::Any& rDimColor ) { maDimColor = rDimColor; } + + SAL_DLLPRIVATE bool IsAfterEffectOnNext() const { return mbAfterEffectOnNextEffect; } + SAL_DLLPRIVATE void setAfterEffectOnNext( bool bOnNextEffect ) { mbAfterEffectOnNextEffect = bOnNextEffect; } + + SAL_DLLPRIVATE sal_Int32 getParaDepth() const { return mnParaDepth; } + + SAL_DLLPRIVATE bool hasText() const { return mbHasText; } + + SAL_DLLPRIVATE sal_Int16 getCommand() const { return mnCommand; } + + SAL_DLLPRIVATE double getAcceleration() const { return mfAcceleration; } + SAL_DLLPRIVATE void setAcceleration( double fAcceleration ); + + SAL_DLLPRIVATE double getDecelerate() const { return mfDecelerate; } + SAL_DLLPRIVATE void setDecelerate( double fDecelerate ); + + SAL_DLLPRIVATE bool getAutoReverse() const { return mbAutoReverse; } + SAL_DLLPRIVATE void setAutoReverse( bool bAutoReverse ); + + SAL_DLLPRIVATE css::uno::Any getProperty( sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue ); + SAL_DLLPRIVATE bool setProperty( sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue, const css::uno::Any& rValue ); + + SAL_DLLPRIVATE css::uno::Any getTransformationProperty( sal_Int32 nTransformType, EValue eValue ); + SAL_DLLPRIVATE bool setTransformationProperty( sal_Int32 nTransformType, EValue eValue, const css::uno::Any& rValue ); + + SAL_DLLPRIVATE css::uno::Any getColor( sal_Int32 nIndex ); + SAL_DLLPRIVATE void setColor( sal_Int32 nIndex, const css::uno::Any& rColor ); + + SAL_DLLPRIVATE sal_Int32 getGroupId() const { return mnGroupId; } + SAL_DLLPRIVATE void setGroupId( sal_Int32 nGroupId ); + + SAL_DLLPRIVATE sal_Int16 getTargetSubItem() const { return mnTargetSubItem; } + void setTargetSubItem( sal_Int16 nSubItem ); + + SAL_DLLPRIVATE OUString getPath() const; + SAL_DLLPRIVATE void setPath( const OUString& rPath ); + + SAL_DLLPRIVATE bool checkForText( const std::vector* paragraphNumberingLevel = nullptr ); + SAL_DLLPRIVATE bool calculateIterateDuration(); + + SAL_DLLPRIVATE void setAudio( const css::uno::Reference< css::animations::XAudio >& xAudio ); + SAL_DLLPRIVATE bool getStopAudio() const; + void setStopAudio(); + void createAudio( const css::uno::Any& rSource ); + SAL_DLLPRIVATE void removeAudio(); + SAL_DLLPRIVATE const css::uno::Reference< css::animations::XAudio >& getAudio() const { return mxAudio; } + + SAL_DLLPRIVATE EffectSequenceHelper* getEffectSequence() const { return mpEffectSequence; } + + // helper + /// @throws css::uno::Exception + SAL_DLLPRIVATE css::uno::Reference< css::animations::XAnimationNode > createAfterEffectNode() const; + SAL_DLLPRIVATE css::uno::Reference< css::drawing::XShape > getTargetShape() const; + + // static helpers + SAL_DLLPRIVATE static sal_Int32 get_node_type( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + SAL_DLLPRIVATE static sal_Int32 getNumberOfSubitems( const css::uno::Any& aTarget, sal_Int16 nIterateType ); + + SAL_DLLPRIVATE rtl::Reference createSdrPathObjFromPath(SdrModel& rTargetModel); + SAL_DLLPRIVATE void updateSdrPathObjFromPath( SdrPathObj& rPathObj ); + SAL_DLLPRIVATE void updatePathFromSdrPathObj( const SdrPathObj& rPathObj ); + +private: + SAL_DLLPRIVATE void setEffectSequence( EffectSequenceHelper* pSequence ) { mpEffectSequence = pSequence; } + + sal_Int16 mnNodeType; + OUString maPresetId; + OUString maPresetSubType; + OUString maProperty; + sal_Int16 mnPresetClass; + sal_Int16 mnFill; + double mfBegin; + double mfDuration; // this is the maximum duration of the subeffects + double mfAbsoluteDuration; // this is the maximum duration of the subeffects including possible iterations + sal_Int32 mnGroupId; + sal_Int16 mnIterateType; + double mfIterateInterval; + sal_Int32 mnParaDepth; + bool mbHasText; + double mfAcceleration; + double mfDecelerate; + bool mbAutoReverse; + sal_Int16 mnTargetSubItem; + sal_Int16 mnCommand; + + EffectSequenceHelper* mpEffectSequence; + + css::uno::Reference< css::animations::XAnimationNode > mxNode; + css::uno::Reference< css::animations::XAudio > mxAudio; + css::uno::Any maTarget; + + bool mbHasAfterEffect; + css::uno::Any maDimColor; + bool mbAfterEffectOnNextEffect; +}; + +struct stl_CustomAnimationEffect_search_node_predict +{ + stl_CustomAnimationEffect_search_node_predict( const css::uno::Reference< css::animations::XAnimationNode >& xSearchNode ); + bool operator()( const CustomAnimationEffectPtr& pEffect ) const; + const css::uno::Reference< css::animations::XAnimationNode >& mxSearchNode; +}; + +/** this listener is implemented by UI components to track changes in the animation core */ +class ISequenceListener +{ +public: + virtual void notify_change() = 0; + +protected: + ~ISequenceListener() {} +}; + +/** this class keeps track of a group of animations that build up + a text animation for a single shape */ +class CustomAnimationTextGroup +{ + friend class EffectSequenceHelper; + +public: + CustomAnimationTextGroup( const css::uno::Reference< css::drawing::XShape >& rTarget, sal_Int32 nGroupId ); + + void reset(); + void addEffect( CustomAnimationEffectPtr const & pEffect ); + + const EffectSequence& getEffects() const { return maEffects; } + + /* -1: as single object, 0: all at once, n > 0: by n Th paragraph */ + sal_Int32 getTextGrouping() const { return mnTextGrouping; } + + bool getAnimateForm() const { return mbAnimateForm; } + bool getTextReverse() const { return mbTextReverse; } + double getTextGroupingAuto() const { return mfGroupingAuto; } + +private: + EffectSequence maEffects; + css::uno::Reference< css::drawing::XShape > maTarget; + + enum { PARA_LEVELS = 5 }; + + sal_Int32 mnTextGrouping; + bool mbAnimateForm; + bool mbTextReverse; + double mfGroupingAuto; + sal_Int32 mnLastPara; + sal_Int8 mnDepthFlags[PARA_LEVELS]; + sal_Int32 mnGroupId; +}; + +typedef std::shared_ptr< CustomAnimationTextGroup > CustomAnimationTextGroupPtr; +typedef std::map< sal_Int32, CustomAnimationTextGroupPtr > CustomAnimationTextGroupMap; + +class SD_DLLPUBLIC EffectSequenceHelper +{ +friend class MainSequence; + +public: + SAL_DLLPRIVATE EffectSequenceHelper(); + SAL_DLLPRIVATE EffectSequenceHelper( css::uno::Reference< css::animations::XTimeContainer > xSequenceRoot ); + SAL_DLLPRIVATE virtual ~EffectSequenceHelper(); + + SAL_DLLPRIVATE virtual css::uno::Reference< css::animations::XAnimationNode > getRootNode(); + + SAL_DLLPRIVATE CustomAnimationEffectPtr append( const CustomAnimationPresetPtr& pDescriptor, const css::uno::Any& rTarget, double fDuration ); + SAL_DLLPRIVATE CustomAnimationEffectPtr append( const SdrPathObj& rPathObj, const css::uno::Any& rTarget, double fDuration, const OUString& rPresetId ); + void append( const CustomAnimationEffectPtr& pEffect ); + SAL_DLLPRIVATE void replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pDescriptor, double fDuration ); + SAL_DLLPRIVATE void replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pDescriptor, const OUString& rPresetSubType, double fDuration ); + SAL_DLLPRIVATE void remove( const CustomAnimationEffectPtr& pEffect ); + SAL_DLLPRIVATE void moveToBeforeEffect( const CustomAnimationEffectPtr& pEffect, const CustomAnimationEffectPtr& pInsertBefore); + + SAL_DLLPRIVATE void create( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + SAL_DLLPRIVATE void createEffectsequence( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + SAL_DLLPRIVATE void processAfterEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + SAL_DLLPRIVATE void createEffects( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + + SAL_DLLPRIVATE sal_Int32 getCount() const { return sal::static_int_cast< sal_Int32 >( maEffects.size() ); } + + SAL_DLLPRIVATE virtual CustomAnimationEffectPtr findEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const; + + SAL_DLLPRIVATE virtual bool disposeShape( const css::uno::Reference< css::drawing::XShape >& xShape ); + SAL_DLLPRIVATE virtual void insertTextRange( const css::uno::Any& aTarget ); + SAL_DLLPRIVATE virtual void disposeTextRange( const css::uno::Any& aTarget ); + SAL_DLLPRIVATE virtual bool hasEffect( const css::uno::Reference< css::drawing::XShape >& xShape ); + SAL_DLLPRIVATE virtual void onTextChanged( const css::uno::Reference< css::drawing::XShape >& xShape ); + + /** this method rebuilds the animation nodes */ + SAL_DLLPRIVATE virtual void rebuild(); + + SAL_DLLPRIVATE EffectSequence::iterator getBegin() { return maEffects.begin(); } + SAL_DLLPRIVATE EffectSequence::iterator getEnd() { return maEffects.end(); } + SAL_DLLPRIVATE EffectSequence::iterator find( const CustomAnimationEffectPtr& pEffect ); + + SAL_DLLPRIVATE EffectSequence& getSequence() { return maEffects; } + + SAL_DLLPRIVATE void addListener( ISequenceListener* pListener ); + SAL_DLLPRIVATE void removeListener( ISequenceListener* pListener ); + + // text group methods + + SAL_DLLPRIVATE CustomAnimationTextGroupPtr findGroup( sal_Int32 nGroupId ); + CustomAnimationTextGroupPtr createTextGroup(const CustomAnimationEffectPtr& pEffect, + sal_Int32 nTextGrouping, double fTextGroupingAuto, + bool bAnimateForm, bool bTextReverse); + SAL_DLLPRIVATE void setTextGrouping( const CustomAnimationTextGroupPtr& pTextGroup, sal_Int32 nTextGrouping ); + SAL_DLLPRIVATE void setAnimateForm( const CustomAnimationTextGroupPtr& pTextGroup, bool bAnimateForm ); + SAL_DLLPRIVATE void setTextGroupingAuto( const CustomAnimationTextGroupPtr& pTextGroup, double fTextGroupingAuto ); + SAL_DLLPRIVATE void setTextReverse( const CustomAnimationTextGroupPtr& pTextGroup, bool bAnimateForm ); + + SAL_DLLPRIVATE sal_Int32 getSequenceType() const { return mnSequenceType; } + + SAL_DLLPRIVATE const css::uno::Reference< css::drawing::XShape >& getTriggerShape() const { return mxEventSource; } + SAL_DLLPRIVATE void setTriggerShape( const css::uno::Reference< css::drawing::XShape >& xTrigger ) { mxEventSource = xTrigger; } + + SAL_DLLPRIVATE virtual sal_Int32 getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const; + SAL_DLLPRIVATE virtual CustomAnimationEffectPtr getEffectFromOffset( sal_Int32 nOffset ) const; + +protected: + SAL_DLLPRIVATE virtual void implRebuild(); + SAL_DLLPRIVATE virtual void reset(); + + SAL_DLLPRIVATE void createTextGroupParagraphEffects( const CustomAnimationTextGroupPtr& pTextGroup, const CustomAnimationEffectPtr& pEffect, bool bUsed ); + + SAL_DLLPRIVATE void notify_listeners(); + + SAL_DLLPRIVATE void updateTextGroups(); + + SAL_DLLPRIVATE bool getParagraphNumberingLevels( const css::uno::Reference< css::drawing::XShape >& xShape, std::vector< sal_Int32 >& rParagraphNumberingLevel ); + +protected: + css::uno::Reference< css::animations::XTimeContainer > mxSequenceRoot; + EffectSequence maEffects; + std::list< ISequenceListener* > maListeners; + CustomAnimationTextGroupMap maGroupMap; + sal_Int32 mnSequenceType; + css::uno::Reference< css::drawing::XShape > mxEventSource; +}; + +class MainSequence; + +class InteractiveSequence final : public EffectSequenceHelper +{ +friend class MainSequence; +friend class MainSequenceChangeGuard; + +public: + InteractiveSequence( const css::uno::Reference< css::animations::XTimeContainer >& xSequenceRoot, MainSequence* pMainSequence ); + + /** this method rebuilds the animation nodes */ + virtual void rebuild() override; + +private: + virtual void implRebuild() override; + + MainSequence* mpMainSequence; +}; + +typedef std::shared_ptr< InteractiveSequence > InteractiveSequencePtr; +typedef std::vector< InteractiveSequencePtr > InteractiveSequenceVector; + +class SD_DLLPUBLIC MainSequence final : public EffectSequenceHelper, public ISequenceListener +{ + friend class UndoAnimation; + friend class MainSequenceRebuildGuard; + friend class MainSequenceChangeGuard; + +public: + MainSequence(); + MainSequence( const css::uno::Reference< css::animations::XAnimationNode >& xTimingRootNode ); + virtual ~MainSequence() override; + + virtual css::uno::Reference< css::animations::XAnimationNode > getRootNode() override; + void reset( const css::uno::Reference< css::animations::XAnimationNode >& xTimingRootNode ); + + /** this method rebuilds the animation nodes */ + virtual void rebuild() override; + + virtual CustomAnimationEffectPtr findEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const override; + + virtual bool disposeShape( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + virtual void insertTextRange( const css::uno::Any& aTarget ) override; + virtual void disposeTextRange( const css::uno::Any& aTarget ) override; + virtual bool hasEffect( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + virtual void onTextChanged( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + + const InteractiveSequenceVector& getInteractiveSequenceVector() const { return maInteractiveSequenceVector; } + + virtual void notify_change() override; + + bool setTrigger( const CustomAnimationEffectPtr& pEffect, const css::uno::Reference< css::drawing::XShape >& xTriggerShape ); + + /** starts a timer that recreates the internal structure from the API core after 1 second */ + void startRecreateTimer(); + + /** starts a timer that rebuilds the API core from the internal structure after 1 second */ + void startRebuildTimer(); + + virtual sal_Int32 getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const override; + virtual CustomAnimationEffectPtr getEffectFromOffset( sal_Int32 nOffset ) const override; + +private: + /** permits rebuilds until unlockRebuilds() is called. All rebuild calls during a locked sequence are + process after unlockRebuilds() call. lockRebuilds() and unlockRebuilds() calls can be nested. */ + void lockRebuilds(); + void unlockRebuilds(); + + DECL_DLLPRIVATE_LINK(onTimerHdl, Timer *, void); + + virtual void implRebuild() override; + + void init(); + + void createMainSequence(); + virtual void reset() override; + + InteractiveSequencePtr createInteractiveSequence( const css::uno::Reference< css::drawing::XShape >& xShape ); + + InteractiveSequenceVector maInteractiveSequenceVector; + + css::uno::Reference< css::util::XChangesListener > mxChangesListener; + css::uno::Reference< css::animations::XTimeContainer > mxTimingRootNode; + Timer maTimer; + bool mbTimerMode; + bool mbRebuilding; + + ::tools::Long mnRebuildLockGuard; + bool mbPendingRebuildRequest; + sal_Int32 mbIgnoreChanges; +}; + +typedef std::shared_ptr< MainSequence > MainSequencePtr; + +class MainSequenceRebuildGuard +{ +public: + MainSequenceRebuildGuard( MainSequencePtr pMainSequence ); + ~MainSequenceRebuildGuard(); + +private: + MainSequencePtr mpMainSequence; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/CustomAnimationPreset.hxx b/sd/inc/CustomAnimationPreset.hxx new file mode 100644 index 0000000000..c262ad0595 --- /dev/null +++ b/sd/inc/CustomAnimationPreset.hxx @@ -0,0 +1,143 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +#include + +#include "CustomAnimationEffect.hxx" + +#include + +namespace sd { + +typedef std::unordered_map< OUString, CustomAnimationEffectPtr > EffectsSubTypeMap; +typedef std::unordered_map< OUString, OUString > UStringMap; + +class CustomAnimationPreset +{ + friend class CustomAnimationPresets; + +public: + CustomAnimationPreset( const CustomAnimationEffectPtr& pEffect ); + + void add( const CustomAnimationEffectPtr& pEffect ); + + SD_DLLPUBLIC css::uno::Reference< css::animations::XAnimationNode > create( const OUString& rstrSubType ); + + const OUString& getPresetId() const { return maPresetId; } + const OUString& getLabel() const { return maLabel; } + double getDuration() const { return mfDuration; } + + std::vector getSubTypes(); + std::vector getProperties() const; + + bool hasProperty( std::u16string_view rProperty ) const; + bool isTextOnly() const { return mbIsTextOnly; } + +private: + OUString maPresetId; + OUString maProperty; + OUString maLabel; + OUString maDefaultSubTyp; + double mfDuration; + bool mbIsTextOnly; + + EffectsSubTypeMap maSubTypes; +}; + +typedef std::shared_ptr< CustomAnimationPreset > CustomAnimationPresetPtr; +typedef std::unordered_map EffectDescriptorMap; +typedef std::vector< CustomAnimationPresetPtr > EffectDescriptorList; + +struct PresetCategory +{ + OUString maLabel; + EffectDescriptorList maEffects; + + PresetCategory( OUString aLabel, EffectDescriptorList&& rEffects ) + : maLabel(std::move( aLabel )), maEffects( std::move(rEffects) ) {} +}; +typedef std::shared_ptr< PresetCategory > PresetCategoryPtr; +typedef std::vector< PresetCategoryPtr > PresetCategoryList; + +class SD_DLLPUBLIC CustomAnimationPresets final +{ +public: + SAL_DLLPRIVATE CustomAnimationPresets(); + SAL_DLLPRIVATE ~CustomAnimationPresets(); + + /** This method gets presets instance, which is localized + * for the current user's locale. + */ + static const CustomAnimationPresets& getCustomAnimationPresets(); + + SAL_DLLPRIVATE css::uno::Reference< css::animations::XAnimationNode > getRandomPreset( sal_Int16 nPresetClass ) const; + + CustomAnimationPresetPtr getEffectDescriptor( const OUString& rPresetId ) const; + + SAL_DLLPRIVATE const OUString& getUINameForPresetId( const OUString& rPresetId ) const; + SAL_DLLPRIVATE const OUString& getUINameForProperty( const OUString& rProperty ) const; + + SAL_DLLPRIVATE const PresetCategoryList& getEntrancePresets() const { return maEntrancePresets; } + SAL_DLLPRIVATE const PresetCategoryList& getEmphasisPresets() const { return maEmphasisPresets; } + SAL_DLLPRIVATE const PresetCategoryList& getExitPresets() const { return maExitPresets; } + SAL_DLLPRIVATE const PresetCategoryList& getMotionPathsPresets() const { return maMotionPathsPresets; } + SAL_DLLPRIVATE const PresetCategoryList& getMiscPresets() const { return maMiscPresets; } + + SAL_DLLPRIVATE void changePresetSubType( const CustomAnimationEffectPtr& pEffect, const OUString& rPresetSubType ) const; + +private: + SAL_DLLPRIVATE void importEffects(); + SAL_DLLPRIVATE void importResources(); + + SAL_DLLPRIVATE void importPresets( const css::uno::Reference< css::lang::XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath, PresetCategoryList& rPresetMap ); + + SAL_DLLPRIVATE static const OUString& translateName( const OUString& rId, const UStringMap& rNameMap ); + +private: + css::uno::Reference< css::animations::XAnimationNode > mxRootNode; + EffectDescriptorMap maEffectDescriptorMap; + UStringMap maEffectNameMap; + UStringMap maPropertyNameMap; + + PresetCategoryList maEntrancePresets; + PresetCategoryList maEmphasisPresets; + PresetCategoryList maExitPresets; + PresetCategoryList maMotionPathsPresets; + PresetCategoryList maMiscPresets; + + //! Maps per-language the animation presets. + SAL_DLLPRIVATE static std::map mPresetsMap; +}; + + +css::uno::Reference< css::animations::XAnimationNode > implImportEffects( const css::uno::Reference< css::lang::XMultiServiceFactory >& xServiceFactory, const OUString& rPath ); + +void implImportLabels( const css::uno::Reference< css::lang::XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath, UStringMap& rStringMap ); + +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/DocumentRenderer.hrc b/sd/inc/DocumentRenderer.hrc new file mode 100644 index 0000000000..9cc79e7831 --- /dev/null +++ b/sd/inc/DocumentRenderer.hrc @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#define NC_(Context, String) TranslateId(Context, u8##String) + +const TranslateId STR_IMPRESS_PRINT_UI_CONTENT_CHOICES[] = +{ + NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Slides"), + NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Handouts"), + NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Notes"), + NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Outline") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES[] = +{ + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "According to layout"), + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "1"), + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "2"), + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "3"), + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "4"), + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "6"), + NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "9") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_ORDER_CHOICES[] = +{ + NC_("STR_IMPRESS_PRINT_UI_ORDER_CHOICES", "Left to right, then down"), + NC_("STR_IMPRESS_PRINT_UI_ORDER_CHOICES", "Top to bottom, then right") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_QUALITY_CHOICES[] = +{ + NC_("STR_IMPRESS_PRINT_UI_QUALITY_CHOICES", "Original colors"), + NC_("STR_IMPRESS_PRINT_UI_QUALITY_CHOICES", "Grayscale"), + NC_("STR_IMPRESS_PRINT_UI_QUALITY_CHOICES", "Black & white") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES[] = +{ + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Original size"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Fit to printable page"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Distribute on multiple sheets of paper"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Tile sheet of paper with repeated slides") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW[] = +{ + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Original size"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Fit to printable page"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Distribute on multiple sheets of paper"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Tile sheet of paper with repeated pages") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST[] = +{ + NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST", "All pages"), + NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST", "Front sides / right pages"), + NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST", "Back sides / left pages") +}; + +const TranslateId STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE[] = +{ + NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE", "All ~Slides"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE", "S~lides:"), + NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE", "~Selection") +}; + +const TranslateId STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE[] = +{ + NC_("STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE", "All ~Pages"), + NC_("STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE", "~Pages:"), + NC_("STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE", "~Selection") +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/EffectMigration.hxx b/sd/inc/EffectMigration.hxx new file mode 100644 index 0000000000..e6e5f9fac3 --- /dev/null +++ b/sd/inc/EffectMigration.hxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; +class SdPage; +class SvxShape; +class SdAnimationInfo; +class SdrPathObj; +class SdrObjGroup; + +namespace sd { + +/** this helper class gives various methods to convert effects from OOo 1.1 + and below to and from OOo 2.0 and above +*/ +class EffectMigration +{ +public: + static css::presentation::AnimationSpeed ConvertDuration( double fDuration ); + static double ConvertAnimationSpeed( css::presentation::AnimationSpeed eSpeed ); + + static bool ConvertPreset( std::u16string_view rPresetId, const OUString* pPresetSubType, css::presentation::AnimationEffect& rEffect ); + static bool ConvertAnimationEffect( const css::presentation::AnimationEffect& rEffect, OUString& rPresetId, OUString& rPresetSubType ); + + static void SetFadeEffect( SdPage* pPage, css::presentation::FadeEffect eNewEffect); + static css::presentation::FadeEffect GetFadeEffect( const SdPage* pPage ); + + static void SetAnimationEffect( SvxShape* pShape, css::presentation::AnimationEffect eValue ); + static css::presentation::AnimationEffect GetAnimationEffect( SvxShape* pShape ); + static void SetTextAnimationEffect( SvxShape* pShape, css::presentation::AnimationEffect eValue ); + static css::presentation::AnimationEffect GetTextAnimationEffect( SvxShape* pShape ); + static void SetAnimationSpeed( SvxShape* pShape, css::presentation::AnimationSpeed eSpeed ); + static css::presentation::AnimationSpeed GetAnimationSpeed( SvxShape* pShape ); + static void SetDimColor( SvxShape* pShape, sal_Int32 nColor ); + static sal_Int32 GetDimColor( SvxShape* pShape ); + static void SetDimHide( SvxShape* pShape, bool bDimHide ); + static bool GetDimHide( SvxShape* pShape ); + static void SetDimPrevious( SvxShape* pShape, bool bDimPrevious ); + static bool GetDimPrevious( SvxShape* pShape ); + static void SetPresentationOrder( SvxShape* pShape, sal_Int32 nNewPos ); + static sal_Int32 GetPresentationOrder( SvxShape* pShape ); + static void UpdateSoundEffect( SvxShape* pShape, SdAnimationInfo const * pInfo ); + static OUString GetSoundFile( SvxShape* pShape ); + static bool GetSoundOn( SvxShape* pShape ); + + static void SetAnimationPath( SvxShape* pShape, SdrPathObj const * pPathObj ); + static void CreateAnimatedGroup(SdrObjGroup const & rGroupObj, SdPage& rPage); + static void DocumentLoaded(SdDrawDocument & rDoc); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/FactoryIds.hxx b/sd/inc/FactoryIds.hxx new file mode 100644 index 0000000000..cc257b20a9 --- /dev/null +++ b/sd/inc/FactoryIds.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd { + +/** This are ids used by SfxTopFrame::Create() or CreateViewFrame() to + select a factory to create an instance of an SfxViewShell super + class. This allows the caller to create a view shell directly + with a certain view instead of first create a default view and + then switch to the desired view. +*/ +constexpr auto IMPRESS_FACTORY_ID = SfxInterfaceId(1); +constexpr auto DRAW_FACTORY_ID = SfxInterfaceId(1); +constexpr auto SLIDE_SORTER_FACTORY_ID = SfxInterfaceId(2); +constexpr auto OUTLINE_FACTORY_ID = SfxInterfaceId(3); +constexpr auto PRESENTATION_FACTORY_ID = SfxInterfaceId(4); + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/Outliner.hxx b/sd/inc/Outliner.hxx new file mode 100644 index 0000000000..8d00cfbbba --- /dev/null +++ b/sd/inc/Outliner.hxx @@ -0,0 +1,535 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "pres.hxx" +#include "OutlinerIterator.hxx" +#include +#include +#include + +class SdrObject; +class SdrTextObj; +class SdDrawDocument; + +namespace weld +{ +class Window; +} + +namespace sd +{ +class View; +class ViewShell; +class Window; + +/// Describes a single search hit: a set of rectangles on a given page. +struct SearchSelection +{ + /// 0-based index of the page that has the selection. + int m_nPage; + + /** + * List of selection rectangles in twips -- multiple rectangles only in + * case the selection spans over more layout lines. + */ + OString m_aRectangles; + + SearchSelection(int nPage, OString aRectangles) + : m_nPage(nPage) + , m_aRectangles(std::move(aRectangles)) + { + } + + bool operator==(const SearchSelection& rOther) const + { + return m_nPage == rOther.m_nPage && m_aRectangles == rOther.m_aRectangles; + } +}; + +} // end of namespace sd + +/** The main purpose of this class is searching and replacing as well as + spelling of impress documents. The main part of both tasks lies in + iterating over the pages and view modes of a document and apply the + respective function to all objects containing text on those pages. + +

Relevant objects: There are two sets of objects to search/spell + check. One is the set of all selected objects. The other consists of + all objects on all pages in draw-, notes-, and handout view as well as + slide- and background view (draw pages and master pages).

+ +

Iteration: Search/replace and spelling functions operate on shapes + containing text. To cover all relevant objects an order has to be + defined on the objects. For the set of all selected objects this order + is simply the order in which they can be retrieved from the selection + object.
+ When there is no selection the order is nested. The three modes of the + draw view are on the outer level: draw mode, notes mode, handout mode. + The inner level switches between draw pages and master pages. This + leads to the following order: +

    +
  1. draw pages of draw mode
  2. +
  3. master pages of draw mode
  4. +
  5. draw pages of notes mode
  6. +
  7. master pages of notes mode
  8. +
  9. draw pages of handout mode
  10. +
  11. master pages of handout mode
  12. +
+ Iteration starts at the top of the current page. When reaching the end + of the document, i.e. the last master page of the handout mode, it jumps + to the first draw page of draw mode. In backward searches this order is + reversed. When doing a replace all then the whole document is + searched for matches starting at the first page of the draw/slide view + (or last page of handout/background view even though search + direction).

+ +

The start position is restored after finishing spell checking or + replacing all matches in a document.

+ +

Some related pieces of information: + The search dialog (SvxSearchDialog) can be controlled in + more than one way: +

  • A set of option flags returned by the slot call + SID_SEARCH_OPTIONS handled by the + SdDrawDocument::GetState() method.
  • +
  • The contents of the search item of type + SvxSearchItem.
  • +
  • The HasSelection() view shell method that returns + whether or not a selection exists. However, it is called from the + search dialog with an argument so that only text selections are + queried. This is only sufficient for searching the outline view. +

    +*/ +class SdOutliner final : public SdrOutliner +{ +public: + friend class ::sd::outliner::OutlinerContainer; + + /** Create a new sd outliner object. + @param pDoc + The draw document from which to take the content. + @param nMode + The valid values OutlinerMode::DontKnow, + OutlinerMode::TextObject, + OutlinerMode::TitleObject, + OutlinerMode::OutlineObject, and + OutlinerMode::OutlineView are defined in + editeng/outliner.hxx. + */ + SdOutliner(SdDrawDocument* pDoc, OutlinerMode nMode); + virtual ~SdOutliner() override; + /// Forbid copy construction and copy assignment + SdOutliner(const Outliner&) = delete; + SdOutliner& operator=(const Outliner&) = delete; + + /** Despite the name this method is called prior to spell checking *and* + searching and replacing. The position of current view + mode/page/object/caret position is remembered and, depending on the + search mode, may be restored after finishing searching/spell + checking. + */ + void PrepareSpelling(); + + /** Initialize a spell check but do not start it yet. This method + is a better candidate for the name PrepareSpelling. + */ + void StartSpelling(); + + /** Initiate a find and/or replace on the next relevant text object. + @return + Returns when the search/replace is finished (as + indicated by user input to the search dialog). A value + indicates that another call to this method is required. + */ + bool StartSearchAndReplace(const SvxSearchItem* pSearchItem); + + /** Iterate over the sentences in all text shapes and stop at the + next sentence with spelling errors. While doing so the view + mode may be changed and text shapes are set into edit mode. + */ + svx::SpellPortions GetNextSpellSentence(); + + /** Release all resources that have been created during the find&replace + or spell check. + */ + void EndSpelling(); + + /** callback for textconversion */ + bool ConvertNextDocument() override; + + /** Starts the text conversion (hangul/hanja or Chinese simplified/traditional) + for the current viewshell */ + void StartConversion(LanguageType nSourceLanguage, LanguageType nTargetLanguage, + const vcl::Font* pTargetFont, sal_Int32 nOptions, bool bIsInteractive); + + /** This is called internally when text conversion is started. + The position of current view mode/page/object/caret position + is remembered and will be restored after conversion. + */ + void BeginConversion(); + + /** Release all resources that have been created during the conversion */ + void EndConversion(); + + int GetIgnoreCurrentPageChangesLevel() const { return mnIgnoreCurrentPageChangesLevel; }; + void IncreIgnoreCurrentPageChangesLevel() { mnIgnoreCurrentPageChangesLevel++; }; + void DecreIgnoreCurrentPageChangesLevel() { mnIgnoreCurrentPageChangesLevel--; }; + SdDrawDocument* GetDoc() const { return mpDrawDocument; } + +private: + class Implementation; + ::std::unique_ptr mpImpl; + + /// Returns the current outline view + OutlinerView* getOutlinerView(); + + /// Specifies whether to search and replace, to spell check or to do a + /// text conversion. + enum mode + { + SEARCH, + SPELL, + TEXT_CONVERSION + } meMode; + + /// The view which displays the searched objects. + ::sd::View* mpView; + /** The view shell containing the view. It is held as weak + pointer to avoid keeping it alive when the view is changed + during searching. + */ + std::weak_ptr<::sd::ViewShell> mpWeakViewShell; + /// This window contains the view. + VclPtr<::sd::Window> mpWindow; + /// The document on whose objects and pages this class operates. + SdDrawDocument* mpDrawDocument; + + /** this is the language that is used for current text conversion. + Only valid if meMode is TEXT_CONVERSION. + */ + LanguageType mnConversionLanguage; + + /** While the value of this flag is greater than 0 changes of the current page + do not lead to selecting the corresponding text in the outliner. + */ + int mnIgnoreCurrentPageChangesLevel; + + /// Specifies whether the search string has been found so far. + bool mbStringFound; + + /** This flag indicates whether there may exist a match of the search + string before/after the current position in the document. It can be + set to only when starting from the beginning/end of the + document. When reaching the end/beginning with it still be set to + then there exists no match and the search can be terminated. + */ + bool mbMatchMayExist; + + /// The number of pages in the current view. + sal_uInt16 mnPageCount; + + /** A value indicates that the end of the find&replace or spell + check has been reached. + */ + bool mbEndOfSearch; + + /** Set to when an object has been prepared successfully for + searching/spell checking. This flag directs the internal iteration + which stops when set to . + */ + bool mbFoundObject; + + /** This flag indicates whether to search forward or backwards. + */ + bool mbDirectionIsForward; + + /** This flag indicates that only the selected objects are to be + searched. + */ + bool mbRestrictSearchToSelection; + + /** When the search is restricted to the current selection then + this list contains pointers to all the objects of the + selection. This copy is necessary because during the search + process the mark list is modified. + */ + ::std::vector> maMarkListCopy; + + /** Current object that may be a text object. The object pointer to + corresponds to mnObjIndex. While iterating over the + objects on a page mpObj will point to every object + while mpTextObj will be set only to valid text + objects. + */ + SdrObject* mpObj; + + /** this stores the first object that is used for text conversion. + Conversion automatically wraps around the document and stops when it + finds this object again. + */ + SdrObject* mpFirstObj; + + /// Candidate for being searched/spell checked. + SdrTextObj* mpSearchSpellTextObj; + + /// Current text to be searched/spelled inside the current text object + sal_Int32 mnText; + + /// Paragraph object of mpTextObj. + OutlinerParaObject* mpParaObj; + + /// The view mode that was active when starting to search/spell check. + PageKind meStartViewMode; + + /// The master page mode that was active when starting to search/spell check. + EditMode meStartEditMode; + + /// The current page index on starting to search/spell check. + sal_uInt16 mnStartPageIndex; + + /// The object in edit mode when searching /spell checking was started + /// (if any). + SdrObject* mpStartEditedObject; + + /// The position of the caret when searching /spell checking was started. + ESelection maStartSelection; + + /** The search item contains various attributes that define the type of + search. It is set every time the + SearchAndReplaceAll method is called. + */ + std::unique_ptr mpSearchItem; + + /// The actual object iterator. + ::sd::outliner::Iterator maObjectIterator; + /// The current position of the object iterator. + ::sd::outliner::IteratorPosition maCurrentPosition; + /// The position when the search started. Corresponds largely to the + /// m?Start* members. + ::sd::outliner::Iterator maSearchStartPosition; + /** The last valid position describes where the last text object has been + found. This position is restored when some dialogs are shown. The + position is initially set to the where the search begins. + */ + ::sd::outliner::IteratorPosition maLastValidPosition; + + /** When this flag is true then a PrepareSpelling() is executed when + StartSearchAndReplace() is called the next time. + */ + bool mbPrepareSpellingPending; + + /** Initialize the object iterator. Call this method after being + invoked from the search or spellcheck dialog. It creates a new + iterator pointing at the current object when this has not been done + before. It reverses the direction of iteration if the given flag + differs from the current direction. + @param bDirectionIsForward + This flag specifies in which direction to iterator over the + objects. If it differs from the current direction the iterator + is reversed. + */ + void Initialize(bool bDirectionIsForward); + + /** Do search and replace for whole document. + */ + bool SearchAndReplaceAll(); + + /** Do search and replace for next match. + @param pSelections + When tiled rendering and not 0, then don't emit LOK events, instead + assume the caller will do so. + @return + The return value specifies whether the search ended () or + another call to this method is required (). + */ + bool SearchAndReplaceOnce(std::vector<::sd::SearchSelection>* pSelections = nullptr); + + void sendLOKSearchResultCallback(const std::shared_ptr& pViewShell, + const OutlinerView* pOutlinerView, + std::vector* pSelections); + + /** Detect changes of the document or view and react accordingly. Such + changes may occur because different calls to + SearchAndReplace() there usually is user + interaction. This is at least the press of the search or replace + button but may include any other action some of which affect the + search. + */ + void DetectChange(); + + /** Detect whether the selection has changed. + @return + Return when the selection has been changed since the + last call to this method. + */ + bool DetectSelectionChange(); + + /** Remember the current edited object/caret position/page/view mode + when starting to search/spell check so that it can be restored on + termination. + */ + void RememberStartPosition(); + + /** Restore the position stored in the last call of + RememberStartPositiony. + */ + void RestoreStartPosition(); + + /** Provide next object to search or spell check as text object in edit + mode on the current page. This skips all objects that do not + match or are no text object. + */ + void ProvideNextTextObject(); + + /** Handle the situation that the iterator has reached the last object. + This may result in setting the mbEndOfSearch flag + back to . This method may show either the end-of-search + dialog or the wrap-around dialog. + */ + void EndOfSearch(); + + /** Show a dialog that tells the user that the search has ended either + because there are no more matches after finding at least one or that + no match has been found at all. + */ + void ShowEndOfSearchDialog(); + + /** Show a dialog that asks the user whether to wrap around to the + beginning/end of the document and continue with the search/spell + check. + */ + bool ShowWrapAroundDialog(); + + /** Put text of current text object into outliner so that the text can + be searched/spell checked. + */ + void PutTextIntoOutliner(); + + /** Prepare to do spell checking on the current text object. This + includes putting it into edit mode. Under certain conditions this + method sets mbEndOfSearch to . + */ + void PrepareSpellCheck(); + + /** Prepare to search and replace on the current text object. This + includes putting it into edit mode. + */ + void PrepareSearchAndReplace(); + + /** Prepare to do a text conversion on the current text + object. This includes putting it into edit mode. + */ + void PrepareConversion(); + + /** Switch to a new view mode. Try to restore the original edit mode + before doing so. + @param ePageKind + Specifies the new view mode. + */ + void SetViewMode(PageKind ePageKind); + + /** Switch to the page or master page specified by the + mnPage index. Master page mode is specified by + meEditMode. + @param eEditMode + The new edit mode. + @param nPageIndex + The new page index. + */ + void SetPage(EditMode eEditMode, sal_uInt16 nPageIndex); + + /** Switch on edit mode for the currently selected text object. + */ + void EnterEditMode(bool bGrabFocus); + + /** Return the position at which a new search is started with respect to + the search direction as specified by the argument. + @return + The position mentioned above in form of a selection with start + equals end. + */ + ESelection GetSearchStartPosition() const; + + /** Detect whether there exists a previous match. Note that only the + absence of such a match can be detected reliably. An existing match + is assumed when the search started not at the beginning/end of the + presentation. This does not have to be true. The user can have set + the cursor at the middle of the text without a prior search. + @return + Returns when there is no previous match and + when there may be one. + */ + bool HasNoPreviousMatch(); + + /** Handle a failed search (with or without replace) for the outline + mode. Show message boxes when the search failed completely, + i.e. there is no match in the whole presentation, or when no further + match exists. + @return + The returned value indicates whether another (wrapped around) + search shall take place. If that is so, then it is the caller's + responsibility to set the cursor position accordingly. + */ + bool HandleFailedSearch(); + + /** Take a position as returned by an object iterator and switch to the + view and page on which the object specified by this position is + located. + @param rPosition + This position points to a SdrObject object and + contains the view and page where it is located. + @return + Return a pointer to the SdrObject. + */ + SdrObject* SetObject(const ::sd::outliner::IteratorPosition& rPosition); + + /** Use this method when the view shell in which to search has changed. + It handles i.e. registering at the associated view as selection + change listener. + */ + void SetViewShell(const std::shared_ptr<::sd::ViewShell>& rpViewShell); + + /** Activate or deactivate the search in the current selection. Call + this method whenever the selection has changed. This method creates + a copy of the current selection and reassigns the object iterator to + the current() iterator. + */ + void HandleChangedSelection(); + + /** Initiate the spell check of the next relevant text object. + When the outline view is active then this method is called + after a wrap around to continue at the beginning of the document. + @return + Returns to indicate that another call to this method is + required. When all text objects have been processed then + is returned. + */ + virtual bool SpellNextDocument() override; + + /** Find the right parent to use for a message. This function makes sure + that the otherwise non-modal search or spell dialogs, if visible, are + locked, too. + */ + weld::Window* GetMessageBoxParent(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/OutlinerIterator.hxx b/sd/inc/OutlinerIterator.hxx new file mode 100644 index 0000000000..e65efbbb86 --- /dev/null +++ b/sd/inc/OutlinerIterator.hxx @@ -0,0 +1,315 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include "pres.hxx" +#include +#include +#include + +class SdDrawDocument; +class SdOutliner; + +namespace sd { + +class ViewShell; + +namespace outliner { + +class IteratorImplBase; +class IteratorPosition; + +/** Use this enum to specify the initial location of the object pointed to by + a newly created iterator. The values are +
    • BEGIN for the first object with reference to + iteration direction.
    • +
    • END for one past the last valid object or, if the iterator is a + backward iterator, the object in front of the first valid one.
    • +
    • CURRENT for the current object. Because there is only a current + page this usually is taken to be the first/last object on the current + page.
    +*/ +enum IteratorLocation {BEGIN,END,CURRENT}; + +/** This iterator can be used to iterate over all SdrObject + objects of one of three set denoted by the IteratorType: +
    • All objects of the current mark list (selection) + (type==SELECTION).
    • +
    • All objects in the current view (type==SINGLE_VIEW).
    • +
    • All objects in all views (type=DOCUMENT).
    + +

    Note that the iterator does not change pages or views. It is the + task of the user of the iterator to take the information provided by the + IteratorPosition as returned by the + operator*() method and set view, visible page, and + selection/edit mode markers to reflect this position.

    + +

    A simple forward iteration from the first to the last object would + instantiate the iterator with + Iterator(pDocument,pViewShell,true,BEGIN) for some document + and view shell. This iterator can then be compared against + Iterator(pDocument,pViewShell,true,END). On equality the + iteration should be stopped without evaluating the iterator: The position + of an end iterator is not valid.

    +*/ +class Iterator +{ +public: + Iterator(); + + /** The copy constructor creates a new iterator by copying the + implementation object. + */ + Iterator (const Iterator& rIterator); + Iterator(Iterator&& rIterator) noexcept; + + /** Create a new iterator with the implementation object being the + provided one. + @param pObject + A copy of this object will become the implementation object. + */ + explicit Iterator (std::unique_ptr pObject); + + ~Iterator(); + + /** Assign the iterator from the given one. The implementation object + of this iterator will be a copy of the given iterator. + @param rIterator + The iterator which to assign from. + */ + Iterator& operator= (const Iterator& rIterator); + Iterator& operator=(Iterator&& rIterator) noexcept; + + /** Return the current position of the iterator. + @return + Returns a reference to the current position. Therefore this + method is not thread safe. The reason for this behaviour is, of + course, to omit the copying of the returned position. + */ + const IteratorPosition& operator* () const; + /** The prefix increment operator returns the iterator pointing to the + next object. When in doubt prefer this operator over the postfix + increment operator. + @return + Returns a reference to this iterator pointing to the next object. + */ + Iterator& operator++ (); + /** Test equality of two iterators. Two iterators are taken to be equal + when they point are of the same type (their implementation objects + are instances of the same class) and point to the same object. + @param rIterator + The iterator to test equality with. + @return + Returns when both iterators point to the same object. + */ + bool operator== (const Iterator& rIterator) const; + /** Test whether two iterators point to different objects. This is just + the negation of the result of the equality operator. + @param rIterator + The iterator to test inequality with. + @return + Returns when both iterators point to the different objects. + */ + bool operator!= (const Iterator& rIterator) const; + /** Reverse the direction of iteration. The position of the iterator is + not changed. Thus calling this method twice returns to the old state. + */ + void Reverse(); + +private: + /// The implementation object to which most of the methods are forwarded. + std::unique_ptr mxIterator; +}; + +/** This class wraps the SdOutliner class and represents it as + a container of SdrObject objects. Its main purpose is to + provide iterators for certain sub-sets of those objects. These sub-sets + are a) the set of the currently selected objects, b) all objects in the + current view, and c) all objects in all views. + +

    The direction of the returned iterators depends on the underlying + SdOutliner object and is usually set in the search + dialog.

    +*/ +class OutlinerContainer +{ +public: + /** Create a new wrapper object for the given outliner. + @param pOutliner + The outliner that is represented by the new object as + SdrObject container. + */ + OutlinerContainer (SdOutliner* pOutliner); + + /** Return an iterator that points to the first object of one of the + sets described above. This takes also into account the direction of + iteration. + @return + The returned iterator points either to the first (forward + search) or to the last object (backward search) of the set. + */ + Iterator begin(); + + /** Return an iterator that marks the end of the iteration. This takes + also into account the direction of iteration. The object pointed to + is not valid. + @return + The returned iterator points either to that object past the last + one (forward search) or to the one in front of the first + (backward search). + */ + Iterator end(); + + /** Return an iterator that points to the current object of one of the + sets described above. This takes also into account the direction of + iteration. + @return + The returned iterator points either to the first (forward + search) or to the last object (backward search) of the set of + selected objects or of the current page if the search set spans + more than one page. + */ + Iterator current(); + +private: + /// The wrapped outliner that is represented as object container. + SdOutliner* mpOutliner; + + /** Create an iterator. The object pointed to depends on the search + direction retrieved from the outliner object + mpOutliner and the given location. + @param aLocation + This specifies whether the returned iterator points to the + first, (one past the) last, or current object. + @return + Returns an iterator as constructed by + CreateSelectionIterator(), + */ + Iterator CreateIterator (IteratorLocation aLocation); + + /** Create an iterator that iterates over all currently selected + SdrObjects objects of the mpOutliner + outliner. + @param rObjectList + List of currently selected objects. This list is necessary + so that the selection can be changed without affecting the + iterator. + @param pDocument + The document to which the objects belong. + @param pViewShell + The view shell which displays the objects. + @param bDirectionIsForward + The direction of iteration. It defaults to forward. + @param aLocation + This specifies at which object the iterator points initially. + */ + static Iterator CreateSelectionIterator ( + const ::std::vector<::unotools::WeakReference>& rObjectList, + SdDrawDocument* pDocument, + const std::shared_ptr& rpViewShell, + bool bDirectionIsForward, + IteratorLocation aLocation); + + /** Create an iterator that iterates over all SdrObjects + objects of the mpOutliner outliner. + @param pDocument + The document to which the objects belong. + @param pViewShell + The view shell which displays the objects. + @param bDirectionIsForward + The direction of iteration. It defaults to forward. + @param aLocation + This specifies at which object the iterator points initially. + */ + static Iterator CreateDocumentIterator ( + SdDrawDocument* pDocument, + const std::shared_ptr& rpViewShell, + bool bDirectionIsForward, + IteratorLocation aLocation); + + /** Return the index of a page that contains an object that a new + iterator shall point to. This page index depends primarily on the + location, iteration direction, as well as on edit mode and page + kind. + @param pDocument + The document to which the page belongs. + @param pViewShell + The view shell which displays the page. + @param ePageKind + Specifies the view the page belongs to. + @param eEditMode + Specifies whether the page is a master page. + @param bDirectionIsForward + The direction of iteration. + @param aLocation + This specifies at which object the iterator points initially. + */ + static sal_Int32 GetPageIndex ( + SdDrawDocument const * pDocument, + const std::shared_ptr& rpViewShell, + PageKind ePageKind, + EditMode eEditMode, + bool bDirectionIsForward, + IteratorLocation aLocation); + + // Do not allow default constructor and copying of outliner containers. + OutlinerContainer (const OutlinerContainer&) = delete; + OutlinerContainer& operator= (const OutlinerContainer&) = delete; +}; + +/** Data collection specifying a SdrObject and its position in + a document and view. +*/ +class IteratorPosition +{ +public: + /** Create a new object with all data members set to default values. + These values should not be accessed. The only use of the object as + it is as a marker in comparisons. + */ + IteratorPosition(); + + /** Compare two positions for equality. + @return + is returned only when all data members have the same + values in both position objects. + */ + bool operator== (const IteratorPosition& aPosition) const; + + /// Pointer to the actual SdrObject object. + ::unotools::WeakReference mxObject; + + /// Number of the actual SdrText from the current SdrObject + sal_Int32 mnText; + + /// The index of a page where the object is located on. + sal_Int32 mnPageIndex; + /// Page kind of the view. + PageKind mePageKind; + /// Edit mode of the view. + EditMode meEditMode; +}; + +} } // end of namespace ::sd::outliner + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/SdShapeTypes.hxx b/sd/inc/SdShapeTypes.hxx new file mode 100644 index 0000000000..ef944e5933 --- /dev/null +++ b/sd/inc/SdShapeTypes.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +namespace accessibility +{ +/** Register the SD presentation shape types with the ShapeTypeHandler singleton. + This method is usually called while loading the sd library. +*/ +void RegisterImpressShapeTypes(); + +/** Enum describing all shape types known in the SD project. +*/ +enum SdShapeTypes +{ + PRESENTATION_OUTLINER, + PRESENTATION_SUBTITLE, + PRESENTATION_GRAPHIC_OBJECT, + PRESENTATION_PAGE, + PRESENTATION_OLE, + PRESENTATION_CHART, + PRESENTATION_TABLE, + PRESENTATION_NOTES, + PRESENTATION_TITLE, + PRESENTATION_HANDOUT, + PRESENTATION_HEADER, + PRESENTATION_FOOTER, + PRESENTATION_DATETIME, + PRESENTATION_PAGENUMBER +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/TransitionPreset.hxx b/sd/inc/TransitionPreset.hxx new file mode 100644 index 0000000000..0075e32057 --- /dev/null +++ b/sd/inc/TransitionPreset.hxx @@ -0,0 +1,78 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include +#include +#include + +namespace com::sun::star { + namespace animations { class XAnimationNode; } + namespace uno { template class Reference; } +} + +namespace sd { + +class TransitionPreset; +typedef std::shared_ptr< TransitionPreset > TransitionPresetPtr; +typedef std::vector< TransitionPresetPtr > TransitionPresetList; +typedef std::unordered_map< OUString, OUString > UStringMap; + +class TransitionPreset +{ +public: + static const TransitionPresetList& getTransitionPresetList(); + + sal_Int16 getTransition() const { return mnTransition; } + sal_Int16 getSubtype() const { return mnSubtype; } + bool getDirection() const { return mbDirection; } + sal_Int32 getFadeColor() const { return mnFadeColor; } + + const OUString& getPresetId() const { return maPresetId; } + const OUString& getSetId() const { return maSetId; } + const OUString& getSetLabel() const { return maSetLabel; } + const OUString& getVariantLabel() const { return maVariantLabel; } + +private: + TransitionPreset( const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + + static bool importTransitionPresetList(TransitionPresetList& rList); + static std::map mPresetsMap; + + sal_Int16 mnTransition; + sal_Int16 mnSubtype; + bool mbDirection; + sal_Int32 mnFadeColor; + OUString maPresetId; + OUString maSetId; + OUString maSetLabel; + OUString maVariantLabel; + + static bool importTransitionsFile( TransitionPresetList& rList, + css::uno::Reference< css::lang::XMultiServiceFactory > const & xServiceFactory, + const OUString& aFilename ); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/VectorGraphicSearchContext.hxx b/sd/inc/VectorGraphicSearchContext.hxx new file mode 100644 index 0000000000..e6f978ca27 --- /dev/null +++ b/sd/inc/VectorGraphicSearchContext.hxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#pragma once + +#include + +namespace sd +{ +struct VectorGraphicSearchContext +{ + bool mbCurrentIsVectorGraphic; + std::unique_ptr mpVectorGraphicSearch; + + VectorGraphicSearchContext() + : mbCurrentIsVectorGraphic(false) + { + } + + void reset() + { + mbCurrentIsVectorGraphic = false; + mpVectorGraphicSearch.reset(); + } +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/animations.hxx b/sd/inc/animations.hxx new file mode 100644 index 0000000000..c3edfdac6e --- /dev/null +++ b/sd/inc/animations.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sddllapi.h" + +#include +#include + +namespace com::sun::star::animations { class XAnimationNode; } + +namespace sd +{ + +/** stores the link between an after effect node and its master for later insertion + into the timing hierarchy +*/ +struct AfterEffectNode +{ + css::uno::Reference< css::animations::XAnimationNode > mxNode; + css::uno::Reference< css::animations::XAnimationNode > mxMaster; + bool mbOnNextEffect; + + AfterEffectNode( css::uno::Reference< css::animations::XAnimationNode > xNode, css::uno::Reference< css::animations::XAnimationNode > xMaster, bool bOnNextEffect ) + : mxNode(std::move( xNode )), mxMaster(std::move( xMaster )), mbOnNextEffect( bOnNextEffect ) {} +}; + +/** inserts the animation node in the given AfterEffectNode at the correct position + in the timing hierarchy of its master */ +SD_DLLPUBLIC void stl_process_after_effect_node_func(AfterEffectNode const & rNode); + +} // namespace sd; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/anminfo.hxx b/sd/inc/anminfo.hxx new file mode 100644 index 0000000000..8abc54c90d --- /dev/null +++ b/sd/inc/anminfo.hxx @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include "pres.hxx" +#include +#include +#include "sddllapi.h" + +class SD_DLLPUBLIC SdAnimationInfo final : public SdrObjUserData +{ +public: + PresObjKind mePresObjKind; + + /* deprecated animation infos */ + css::presentation::AnimationEffect meEffect; ///< Animation effect + css::presentation::AnimationEffect meTextEffect; ///< Animation effect for text content + css::presentation::AnimationSpeed meSpeed; ///< Speed of the animation + bool mbActive; ///< turned on? + bool mbDimPrevious; ///< Object fade out + bool mbIsMovie; ///< if group object than it is a sequence of them. + bool mbDimHide; ///< hide rather than dim + Color maBlueScreen; ///< identifies "background pixels" + Color maDimColor; ///< for fading the object + OUString maSoundFile; ///< Path to the sound file in MS DOS notation + bool mbSoundOn; ///< Sound on / off + bool mbPlayFull; ///< play sound completely. + css::presentation::ClickAction meClickAction; ///< Action at mouse click + css::presentation::AnimationEffect meSecondEffect; ///< for object fading. + css::presentation::AnimationSpeed meSecondSpeed; ///< for object fading. + OUString maSecondSoundFile; ///< for object fading. + bool mbSecondSoundOn; ///< for object fading. + bool mbSecondPlayFull; ///< for object fading. + sal_uInt16 mnVerb; ///< for OLE object + SdrObject& mrObject; + + void SetBookmark( const OUString& rBookmark ); + OUString GetBookmark() const; +public: + SAL_DLLPRIVATE SdAnimationInfo(SdrObject& rObject); + SAL_DLLPRIVATE SdAnimationInfo(const SdAnimationInfo& rAnmInfo, SdrObject& rObject); + SAL_DLLPRIVATE virtual ~SdAnimationInfo() override; + + SAL_DLLPRIVATE virtual std::unique_ptr Clone(SdrObject* pObject) const override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/app.hrc b/sd/inc/app.hrc new file mode 100644 index 0000000000..e275e46882 --- /dev/null +++ b/sd/inc/app.hrc @@ -0,0 +1,456 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +// Helper IDs for templates +#define HID_STANDARD_STYLESHEET_NAME (HID_SD_START + 70) +#define HID_POOLSHEET_OBJWITHOUTFILL (HID_SD_START + 73) +#define HID_POOLSHEET_OBJNOLINENOFILL (HID_SD_START + 74) +#define HID_POOLSHEET_TEXT (HID_SD_START + 71) +#define HID_POOLSHEET_A4 (HID_SD_START + 104) +#define HID_POOLSHEET_A4_TITLE (HID_SD_START + 72) +#define HID_POOLSHEET_A4_HEADLINE (HID_SD_START + 75) +#define HID_POOLSHEET_A4_TEXT (HID_SD_START + 105) +#define HID_POOLSHEET_A0 (HID_SD_START + 109) +#define HID_POOLSHEET_A0_TITLE (HID_SD_START + 110) +#define HID_POOLSHEET_A0_HEADLINE (HID_SD_START + 111) +#define HID_POOLSHEET_A0_TEXT (HID_SD_START + 112) +#define HID_POOLSHEET_GRAPHIC (HID_SD_START + 106) +#define HID_POOLSHEET_SHAPES (HID_SD_START + 107) +#define HID_POOLSHEET_FILLED (HID_SD_START + 77) +#define HID_POOLSHEET_FILLED_BLUE (HID_SD_START + 78) +#define HID_POOLSHEET_FILLED_GREEN (HID_SD_START + 79) +#define HID_POOLSHEET_FILLED_RED (HID_SD_START + 80) +#define HID_POOLSHEET_FILLED_YELLOW (HID_SD_START + 81) +#define HID_POOLSHEET_OUTLINE (HID_SD_START + 82) +#define HID_POOLSHEET_OUTLINE_BLUE (HID_SD_START + 83) +#define HID_POOLSHEET_OUTLINE_GREEN (HID_SD_START + 84) +#define HID_POOLSHEET_OUTLINE_RED (HID_SD_START + 102) +#define HID_POOLSHEET_OUTLINE_YELLOW (HID_SD_START + 103) +#define HID_POOLSHEET_LINES (HID_SD_START + 108) +#define HID_POOLSHEET_MEASURE (HID_SD_START + 76) +#define HID_POOLSHEET_LINES_DASHED (HID_SD_START + 113) //dummy +#define HID_POOLSHEET_LAST (HID_SD_START + 114) //dummy + +#define HID_PSEUDOSHEET_TITLE (HID_SD_START + 85) +#define HID_PSEUDOSHEET_OUTLINE (HID_SD_START + 86) +#define HID_PSEUDOSHEET_OUTLINE1 (HID_SD_START + 87) +#define HID_PSEUDOSHEET_OUTLINE2 (HID_SD_START + 88) +#define HID_PSEUDOSHEET_OUTLINE3 (HID_SD_START + 89) +#define HID_PSEUDOSHEET_OUTLINE4 (HID_SD_START + 90) +#define HID_PSEUDOSHEET_OUTLINE5 (HID_SD_START + 91) +#define HID_PSEUDOSHEET_OUTLINE6 (HID_SD_START + 92) +#define HID_PSEUDOSHEET_OUTLINE7 (HID_SD_START + 93) +#define HID_PSEUDOSHEET_OUTLINE8 (HID_SD_START + 94) +#define HID_PSEUDOSHEET_OUTLINE9 (HID_SD_START + 95) +#define HID_PSEUDOSHEET_BACKGROUNDOBJECTS (HID_SD_START + 96) +#define HID_PSEUDOSHEET_BACKGROUND (HID_SD_START + 97) +#define HID_PSEUDOSHEET_NOTES (HID_SD_START + 98) +#define HID_PSEUDOSHEET_SUBTITLE (HID_SD_START + 101) + +#define SID_PAGESETUP (SID_SD_START+2) + // FREE +#define SID_COPYOBJECTS (SID_SD_START+4) +#define SID_MANAGE_LINKS (SID_SD_START+5) + // FREE +#define SID_CONVERT_TO_3D_LATHE (SID_SD_START+8) +#define SID_DRAWINGMODE (SID_SD_START+9) +#define SID_OUTLINE_MODE (SID_SD_START+10) +#define SID_SLIDE_SORTER_MODE (SID_SD_START+11) +#define SID_DISPLAY_MODE (SID_SD_START+12) +#define SID_TOGGLE_TABBAR_VISIBILITY (SID_SD_START+13) +#define SID_INSERTPAGE (SID_SD_START+14) +#define SID_INSERTFILE (SID_SD_START+15) + // FREE +#define SID_ZOOM_PANNING (SID_SD_START+17) +#define SID_PRESENTATION_END (SID_SD_START+18) + // FREE +#define SID_POSITION (SID_SD_START+22) + // FREE +#define SID_TEXT_COMBINE (SID_SD_START+25) +#define SID_COMBINE (SID_SD_START+26) +#define SID_NAME_GROUP (SID_SD_START+27) +#define SID_DRAWTBX_CONNECTORS (SID_SD_START+28) + // FREE +// In svxids.hrc: SID_BEZIER_ELIMINATE_POINTS (SID_SD_START+30) +#define SID_MOREFRONT (SID_SD_START+31) +#define SID_MOREBACK (SID_SD_START+32) +// #i68101# +#define SID_OBJECT_TITLE_DESCRIPTION (SID_SD_START+33) +#define SID_VERTICAL (SID_SD_START+34) +#define SID_HORIZONTAL (SID_SD_START+35) +#define SID_CHANGEBEZIER (SID_SD_START+36) +#define SID_CHANGEPOLYGON (SID_SD_START+37) +#define SID_CAPTUREPOINT (SID_SD_START+38) +#define SID_INSERTLAYER (SID_SD_START+39) +// In svxids.hrc: SID_RULER (SID_SD_START+40) +#define SID_EDIT_OUTLINER (SID_SD_START+41) +#define SID_SWITCHPAGE (SID_SD_START+42) +#define SID_MODIFYPAGE (SID_SD_START+43) +#define SID_SWITCHLAYER (SID_SD_START+44) +#define SID_MODIFYLAYER (SID_SD_START+45) +#define SID_PAGEMODE (SID_SD_START+46) +#define SID_LAYERMODE (SID_SD_START+47) +#define SID_TOGGLELAYERVISIBILITY (SID_SD_START+48) + // FREE +#define SID_MASTERPAGE (SID_SD_START+50) +// Navigation between slides +#define SID_GO_TO_NEXT_PAGE (SID_SD_START+51) +#define SID_GO_TO_PREVIOUS_PAGE (SID_SD_START+52) +#define SID_GO_TO_FIRST_PAGE (SID_SD_START+53) +#define SID_GO_TO_LAST_PAGE (SID_SD_START+54) +// Slide sorting +#define SID_MOVE_PAGE_UP (SID_SD_START+55) +#define SID_MOVE_PAGE_DOWN (SID_SD_START+56) +#define SID_MOVE_PAGE_FIRST (SID_SD_START+57) +#define SID_MOVE_PAGE_LAST (SID_SD_START+58) + // FREE +#define SID_TOOL_CONNECTOR (SID_SD_START+61) +#define SID_ANIMATION_OBJECTS (SID_SD_START+62) +#define SID_ANIMATION_EFFECTS (SID_SD_START+63) +#define SID_PRESENTATION_LAYOUT (SID_SD_START+64) +// In svxids.hrc: SID_BEZIER_CONVERT (SID_SD_START+65) +// In svxids.hrc: SID_BEZIER_EDGE (SID_SD_START+66) +// In svxids.hrc: SID_BEZIER_SYMMTR (SID_SD_START+67) +#define SID_NOTES_MODE TypedWhichId(SID_SD_START+69) +#define SID_HANDOUT_MASTER_MODE (SID_SD_START+70) +#define SID_LINEEND_POLYGON (SID_SD_START+71) +#define SID_EXECUTE_ANIMATION_EFFECT (SID_SD_START+72) + // FREE +#define SID_SWITCH_POINTEDIT (SID_SD_START+74) + // FREE +// In svxids.hrc: SID_TEXTEDIT (SID_SD_START+76) +#define SID_SET_SNAPITEM TypedWhichId(SID_SD_START+77) + // FREE +#define SID_DELETE_PAGE (SID_SD_START+80) +#define SID_DELETE_LAYER (SID_SD_START+81) +#define SID_DISMANTLE (SID_SD_START+82) + // FREE +#define SID_SCALE TypedWhichId(SID_SD_START+85) +#define SID_STATUS_PAGE TypedWhichId(SID_SD_START+86) +#define SID_STATUS_LAYOUT TypedWhichId(SID_SD_START+87) +#define SID_STATUS_SELMODE (SID_SD_START+88) +// In sfxsids.hrc: SID_MODIFIED TypedWhichId(SID_SD_START+89) +#define SID_OBJECT_CROOK_ROTATE (SID_SD_START+90) +#define SID_OBJECT_CROOK_SLANT (SID_SD_START+91) +#define SID_OBJECT_CROOK_STRETCH (SID_SD_START+92) +#define SID_CONNECT (SID_SD_START+93) +#define SID_BREAK (SID_SD_START+94) +#define SID_OBJECT_CHOOSE_MODE (SID_SD_START+95) +// In svxids.hrc: SID_ENTER_GROUP (SID_SD_START+96) +// In svxids.hrc: SID_LEAVE_GROUP (SID_SD_START+97) +// In svxids.hrc: SID_SIZE_PAGE_WIDTH (SID_SD_START+98) +// In sfxsids.hrc: SID_SIZE_OPTIMAL (SID_SD_START+99) +#define SID_OBJECT_TRANSPARENCE (SID_SD_START+100) +#define SID_OBJECT_GRADIENT (SID_SD_START+101) + // FREE +// In svxids.hrc: SID_INSERT_MATH (SID_SD_START+106) +#define SID_OBJECT_SHEAR (SID_SD_START+107) +#define SID_DELETE_SNAPITEM TypedWhichId(SID_SD_START+108) +#define SID_OBJECT_CLOSE (SID_SD_START+109) +#define SID_ANIMATOR_ADD (SID_SD_START+110) +#define SID_ANIMATOR_CREATE (SID_SD_START+111) +#define SID_ANIMATOR_STATE TypedWhichId(SID_SD_START+112) +#define SID_PRESENTATIONOBJECT (SID_SD_START+113) +// In svxids.hrc: SID_SIZE_VISAREA (SID_SD_START+114) +// In svxids.hrc: SID_ATTR_SYMBOLTYPE (SID_SD_START+115) +// In svxids.hrc: SID_ATTR_SYMBOLSIZE (SID_SD_START+116) +#define SID_REVERSE_ORDER (SID_SD_START+117) +#define SID_CLEAR_UNDO_STACK (SID_SD_START+118) +#define SID_CONNECTOR_ARROW_START (SID_SD_START+119) +#define SID_CONNECTOR_ARROW_END (SID_SD_START+120) +#define SID_CONNECTOR_ARROWS (SID_SD_START+121) +#define SID_CONNECTOR_CIRCLE_START (SID_SD_START+122) +#define SID_CONNECTOR_CIRCLE_END (SID_SD_START+123) +#define SID_CONNECTOR_CIRCLES (SID_SD_START+124) +#define SID_CONNECTOR_LINE (SID_SD_START+125) +#define SID_CONNECTOR_LINE_ARROW_START (SID_SD_START+126) +#define SID_CONNECTOR_LINE_ARROW_END (SID_SD_START+127) +#define SID_CONNECTOR_LINE_ARROWS (SID_SD_START+128) +#define SID_CONNECTOR_LINE_CIRCLE_START (SID_SD_START+129) +#define SID_CONNECTOR_LINE_CIRCLE_END (SID_SD_START+130) +#define SID_CONNECTOR_LINE_CIRCLES (SID_SD_START+131) +#define SID_CONNECTOR_CURVE (SID_SD_START+132) +#define SID_CONNECTOR_CURVE_ARROW_START (SID_SD_START+133) +#define SID_CONNECTOR_CURVE_ARROW_END (SID_SD_START+134) +#define SID_CONNECTOR_CURVE_ARROWS (SID_SD_START+135) +#define SID_CONNECTOR_CURVE_CIRCLE_START (SID_SD_START+136) +#define SID_CONNECTOR_CURVE_CIRCLE_END (SID_SD_START+137) +#define SID_CONNECTOR_CURVE_CIRCLES (SID_SD_START+138) +#define SID_CONNECTOR_LINES (SID_SD_START+139) +#define SID_CONNECTOR_LINES_ARROW_START (SID_SD_START+140) +#define SID_CONNECTOR_LINES_ARROW_END (SID_SD_START+141) +#define SID_CONNECTOR_LINES_ARROWS (SID_SD_START+142) +#define SID_CONNECTOR_LINES_CIRCLE_START (SID_SD_START+143) +#define SID_CONNECTOR_LINES_CIRCLE_END (SID_SD_START+144) +#define SID_CONNECTOR_LINES_CIRCLES (SID_SD_START+145) +#define SID_BEHIND_OBJ (SID_SD_START+146) + // FREE +// Option pane slot IDs +#define SID_SOLID_CREATE (SID_SD_START+151) +#define SID_HELPLINES_USE (SID_SD_START+152) +// In svxids.hrc: SID_HELPLINES_MOVE (SID_SD_START+153) +// In svxids.hrc: SID_GRID_USE (SID_SD_START+154) +#define SID_SNAP_BORDER (SID_SD_START+155) +#define SID_SNAP_FRAME (SID_SD_START+156) +#define SID_SNAP_POINTS (SID_SD_START+157) +#define SID_QUICKEDIT (SID_SD_START+158) +#define SID_PICK_THROUGH (SID_SD_START+159) + // FREE 160 - 168 +#define SID_DOUBLECLICK_TEXTEDIT (SID_SD_START+169) +#define SID_CLICK_CHANGE_ROTATION (SID_SD_START+170) +#define SID_HELPLINES_VISIBLE (SID_SD_START+179) +#define SID_HELPLINES_FRONT (SID_SD_START+180) +#define SID_BEFORE_OBJ (SID_SD_START+181) + // FREE +#define SID_CUSTOM_ANIMATION_PANEL (SID_SD_START+183) +#define SID_MASTER_SLIDES_PANEL (SID_SD_START+184) + // FREE +// and even more... +#define ID_VAL_ENDINTENS (SID_SD_START+197) +#define ID_VAL_STARTINTENS (SID_SD_START+198) +#define ID_VAL_BORDER (SID_SD_START+199) +// In svxids.hrc: ID_VAL_MOUSESTART_X (SID_SD_START+200) +// In svxids.hrc: ID_VAL_MOUSESTART_Y (SID_SD_START+201) +// In svxids.hrc: ID_VAL_MOUSEEND_X (SID_SD_START+204) +// In svxids.hrc: ID_VAL_MOUSEEND_Y (SID_SD_START+205) +// In svxids.hrc: ID_VAL_AXIS_X (SID_SD_START+206) +// In svxids.hrc: ID_VAL_AXIS_Y (SID_SD_START+207) +// In svxids.hrc: ID_VAL_ANGLESTART (SID_SD_START+208) +// In svxids.hrc: ID_VAL_ANGLEEND (SID_SD_START+209) +// In svxids.hrc: ID_VAL_CENTER_X (SID_SD_START+210) +// In svxids.hrc: ID_VAL_CENTER_Y (SID_SD_START+211) +#define ID_VAL_WHATPAGE TypedWhichId(SID_SD_START+212) +#define ID_VAL_WHATLAYER (SID_SD_START+213) +#define ID_VAL_ANGLE (SID_SD_START+214) +#define ID_VAL_MIRRORVERT (SID_SD_START+215) +#define ID_VAL_ISACTIVE (SID_SD_START+216) +#define ID_VAL_WHATKIND (SID_SD_START+217) +#define ID_VAL_PAGEWIDTH (SID_SD_START+218) +#define ID_INSERT_POS (SID_SD_START+219) +#define ID_VAL_PAGETOP (SID_SD_START+220) +#define ID_VAL_PAGEBOTTOM (SID_SD_START+221) +#define ID_VAL_PAGELEFT (SID_SD_START+222) +#define ID_VAL_PAGERIGHT (SID_SD_START+223) +#define ID_VAL_SCALEOBJECTS (SID_SD_START+224) +#define ID_VAL_PAGENAME TypedWhichId(SID_SD_START+225) +#define ID_VAL_WHATLAYOUT TypedWhichId(SID_SD_START+226) +#define ID_VAL_ISPAGEBACK (SID_SD_START+227) +#define ID_VAL_ISPAGEOBJ (SID_SD_START+228) +#define ID_VAL_LAYERNAME (SID_SD_START+229) + +// just for tests, namely that APP:HRC ff. has not to be build every time +// In sfxsids.hrc: ID_VAL_DUMMY0 (SID_SD_START+230) +#define ID_VAL_ISLOCKED (SID_SD_START+231) +#define ID_VAL_ISPRINTABLE (SID_SD_START+232) +#define ID_VAL_PAGEHEIGHT (SID_SD_START+233) +#define ID_VAL_ZOOM (SID_SD_START+234) +#define ID_VAL_RED (SID_SD_START+237) +#define ID_VAL_GREEN (SID_SD_START+238) +#define ID_VAL_BLUE (SID_SD_START+239) +// In svxids.hrc: ID_VAL_STYLE (SID_SD_START+240) +// In svxids.hrc: ID_VAL_DOTS (SID_SD_START+241) +// In svxids.hrc: ID_VAL_DOTLEN (SID_SD_START+242) +// In svxids.hrc: ID_VAL_DASHES (SID_SD_START+243) +// In svxids.hrc: ID_VAL_DASHLEN (SID_SD_START+244) +// In svxids.hrc: ID_VAL_DISTANCE (SID_SD_START+245) +// In svxids.hrc: ID_VAL_INDEX (SID_SD_START+246) +#define ID_VAL_WIDTH (SID_SD_START+247) +#define SID_GRID_FRONT (SID_SD_START+248) +#define ID_VAL_ISVISIBLE (SID_SD_START+249) +#define SID_MOVETO (SID_SD_START+250) +#define SID_LINETO (SID_SD_START+251) +// In svxids.hrc: SID_BEZIERTO (SID_SD_START+252) +#define SID_PAGESIZE (SID_SD_START+253) +#define SID_PAGEMARGIN (SID_SD_START+254) + // FREE +#define SID_COLORVIEW (SID_SD_START+257) + // FREE +#define SID_GETRED (SID_SD_START+259) +#define SID_GETBLUE (SID_SD_START+260) +#define SID_GETGREEN (SID_SD_START+261) +#define SID_SETFILLSTYLE (SID_SD_START+262) +#define SID_SETFILLCOLOR (SID_SD_START+263) +#define SID_GRADIENT (SID_SD_START+264) +#define SID_SETLINESTYLE (SID_SD_START+265) +#define SID_SETLINEWIDTH (SID_SD_START+266) +// In svxids.hrc: SID_DASH (SID_SD_START+267) +#define SID_RENAMEPAGE (SID_SD_START+268) +#define SID_RENAMELAYER (SID_SD_START+269) +#define SID_HATCH (SID_SD_START+270) +#define SID_GETFILLSTYLE TypedWhichId(SID_SD_START+271) +#define SID_GETLINESTYLE TypedWhichId(SID_SD_START+272) +#define SID_GETLINEWIDTH TypedWhichId(SID_SD_START+273) +#define SID_SETLINECOLOR (SID_SD_START+274) +#define SID_SETHATCHCOLOR (SID_SD_START+275) +#define SID_SETGRADSTARTCOLOR (SID_SD_START+276) +#define SID_SETGRADENDCOLOR (SID_SD_START+277) +#define SID_SELECTGRADIENT (SID_SD_START+278) +#define SID_SELECTHATCH (SID_SD_START+279) +#define SID_UNSELECT (SID_SD_START+280) +#define SID_TEXTATTR_DLG (SID_SD_START+281) +#define SID_ORIGINAL_SIZE (SID_SD_START+282) +#define SID_PAGES_PER_ROW TypedWhichId(SID_SD_START+284) +#define SID_TEXT_FITTOSIZE (SID_SD_START+285) +// In svxids.hrc: SID_TEXT_FITTOSIZE_VERTICAL (SID_SD_START+286) +#define SID_NAVIGATOR_PAGENAME TypedWhichId(SID_SD_START+287) +#define SID_NAVIGATOR_STATE TypedWhichId(SID_SD_START+288) +#define SID_NAVIGATOR_INIT (SID_SD_START+289) + // FREE +#define SID_NAVIGATOR_PAGE TypedWhichId(SID_SD_START+292) +#define SID_NAVIGATOR_OBJECT TypedWhichId(SID_SD_START+293) +#define SID_ANIMATOR_INIT (SID_SD_START+294) +#define SID_DRAWTBX_3D_OBJECTS (SID_SD_START+295) +#define SID_3D_CUBE (SID_SD_START+296) +#define SID_3D_SPHERE (SID_SD_START+297) +#define SID_3D_CYLINDER (SID_SD_START+298) +#define SID_3D_CONE (SID_SD_START+299) +#define SID_3D_PYRAMID (SID_SD_START+300) +#define SID_GLUE_EDITMODE (SID_SD_START+301) +#define SID_GLUE_INSERT_POINT (SID_SD_START+302) +#define SID_GLUE_PERCENT (SID_SD_START+303) +#define SID_GLUE_ESCDIR TypedWhichId(SID_SD_START+304) +#define SID_GLUE_HORZALIGN_CENTER (SID_SD_START+305) +#define SID_GLUE_HORZALIGN_LEFT (SID_SD_START+306) +#define SID_GLUE_HORZALIGN_RIGHT (SID_SD_START+307) +#define SID_GLUE_VERTALIGN_CENTER (SID_SD_START+308) +#define SID_GLUE_VERTALIGN_TOP (SID_SD_START+309) +#define SID_GLUE_VERTALIGN_BOTTOM (SID_SD_START+310) +#define SID_3D_SHELL (SID_SD_START+311) +#define SID_3D_TORUS (SID_SD_START+312) +#define SID_3D_HALF_SPHERE (SID_SD_START+313) +#define SID_GLUE_ESCDIR_LEFT (SID_SD_START+314) +#define SID_GLUE_ESCDIR_RIGHT (SID_SD_START+315) +#define SID_GLUE_ESCDIR_TOP (SID_SD_START+316) +#define SID_GLUE_ESCDIR_BOTTOM (SID_SD_START+317) +#define SID_DRAWTBX_INSERT (SID_SD_START+318) +#define SID_POLYGON_MORPHING (SID_SD_START+319) + // FREE +// In svxids.hrc: SID_GRID_VISIBLE (SID_SD_START+322) +// In svxids.hrc: ID_VAL_USEFIRSTROWSTYLE (SID_SD_START+323) +// In svxids.hrc: ID_VAL_USELASTROWSTYLE (SID_SD_START+324) +// In svxids.hrc: ID_VAL_USEBANDINGROWSTYLE (SID_SD_START+325) +// In svxids.hrc: ID_VAL_USEFIRSTCOLUMNSTYLE (SID_SD_START+326) +// In svxids.hrc: ID_VAL_USELASTCOLUMNSTYLE (SID_SD_START+327) +// In svxids.hrc: ID_VAL_USEBANDINGCOLUMNSTYLE (SID_SD_START+328) + + +#define SID_PREVIEW_STATE (SID_SD_START+329) + // FREE +#define SID_SLIDE_TRANSITIONS_PANEL (SID_SD_START+334) + // FREE +#define SID_PHOTOALBUM (SID_SD_START+336) +#define SID_REMOTE_DLG (SID_SD_START+337) +#define SID_CONNECTION_DLG (SID_SD_START+338) +#define SID_PRESENTATION_DLG (SID_SD_START+339) +#define SID_HYPHENATION (SID_SD_START+340) +#define SID_CONNECTION_NEW_ROUTING (SID_SD_START+341) +#define SID_DUPLICATE_PAGE (SID_SD_START+342) +#define SID_EXPAND_PAGE (SID_SD_START+343) +#define SID_SUMMARY_PAGE (SID_SD_START+344) +#define SID_LEAVE_ALL_GROUPS (SID_SD_START+345) + // FREE +#define SID_SLIDE_MASTER_MODE TypedWhichId(SID_SD_START+348) + // FREE +#define SID_NOTES_MASTER_MODE (SID_SD_START+350) + // FREE +#define SID_INSERTPAGE_QUICK (SID_SD_START+352) + // FREE +#define SID_INSERT_FLD_PAGE_TITLE (SID_SD_START+356) +#define SID_INSERT_FLD_DATE_VAR (SID_SD_START+357) +#define SID_INSERT_FLD_DATE_FIX (SID_SD_START+358) +#define SID_INSERT_FLD_TIME_VAR (SID_SD_START+359) +#define SID_INSERT_FLD_TIME_FIX (SID_SD_START+360) +#define SID_INSERT_FLD_PAGE (SID_SD_START+361) +#define SID_MODIFY_FIELD (SID_SD_START+362) +#define SID_INSERT_FLD_FILE (SID_SD_START+363) +#define SID_INSERT_FLD_AUTHOR (SID_SD_START+364) +#define SID_CUSTOMSHOW_DLG (SID_SD_START+365) +#define SID_OUTPUT_QUALITY_COLOR (SID_SD_START+366) +#define SID_OUTPUT_QUALITY_GRAYSCALE (SID_SD_START+367) +#define SID_OUTPUT_QUALITY_BLACKWHITE (SID_SD_START+368) +#define SID_PREVIEW_QUALITY_COLOR (SID_SD_START+369) + // FREE +#define SID_INSERT_FLD_PAGES (SID_SD_START+373) + // FREE +#define SID_CONVERT_TO_BITMAP (SID_SD_START+378) +#define SID_CONVERT_TO_METAFILE (SID_SD_START+379) + // FREE +#define SID_CONVERT_TO_CONTOUR (SID_SD_START+381) + // FREE +#define ID_VAL_DUMMY1 (SID_SD_START+383) +#define ID_VAL_DUMMY2 (SID_SD_START+384) +#define ID_VAL_DUMMY3 (SID_SD_START+385) +#define ID_VAL_DUMMY4 (SID_SD_START+386) +#define ID_VAL_DUMMY5 (SID_SD_START+387) +#define ID_VAL_DUMMY6 (SID_SD_START+388) + // FREE +#define SID_OUTPUT_QUALITY_CONTRAST (SID_SD_START+400) +#define SID_PREVIEW_QUALITY_CONTRAST (SID_SD_START+401) + // FREE +#define SID_RENAMEPAGE_QUICK (SID_SD_START+405) +#define SID_SWITCH_SHELL (SID_SD_START+406) +#define SID_HEADER_AND_FOOTER (SID_SD_START+407) +#define SID_MASTER_LAYOUTS (SID_SD_START+408) + // FREE +#define SID_INSERT_PAGE_NUMBER (SID_SD_START+411) +#define SID_INSERT_DATE_TIME (SID_SD_START+412) +#define SID_SDMODE_FLAG TypedWhichId(SID_SD_START+413) +// Enum in the middle of IDs... +#define SD_DRAW_MODE 1 +#define SD_IMPRESS_MODE 2 + +#define SID_LEFT_PANE_IMPRESS (SID_SD_START+414) +#define SID_LEFT_PANE_DRAW (SID_SD_START+415) + // FREE +#define SID_NOTES_WINDOW (SID_SD_START+417) + // FREE +#define SID_NORMAL_MULTI_PANE_GUI TypedWhichId(SID_SD_START+420) +#define SID_SLIDE_SORTER_MULTI_PANE_GUI (SID_SD_START+421) + +#define SID_SELECT_BACKGROUND (SID_SD_START+422) +#define SID_SAVE_BACKGROUND (SID_SD_START+423) + // FREE +// Slots for the tool pane popup + // FREE +#define SID_INSERT_MASTER_PAGE (SID_SD_START+431) +#define SID_DELETE_MASTER_PAGE (SID_SD_START+432) +#define SID_RENAME_MASTER_PAGE (SID_SD_START+433) +#define SID_CLOSE_MASTER_VIEW (SID_SD_START+434) +#define SID_ASSIGN_LAYOUT TypedWhichId(SID_SD_START+435) +#define SID_DISPLAY_MASTER_BACKGROUND (SID_SD_START+436) +#define SID_DISPLAY_MASTER_OBJECTS (SID_SD_START+437) +#define SID_INSERTPAGE_LAYOUT_MENU (SID_SD_START+438) + // FREE +#define SID_OUTLINE_TEXT_AUTOFIT (SID_SD_START+440) + +// Add companion for the SID_HIDE_SLIDE (that is defined in svx) +#define SID_SHOW_SLIDE (SID_SD_START+441) +#define SID_ADD_MOTION_PATH TypedWhichId(SID_SD_START+442) + + // FREE +#define SID_ZOOM_MODE (SID_SD_START+447) +#define SID_HIDE_LAST_LEVEL (SID_SD_START+448) +#define SID_SHOW_NEXT_LEVEL (SID_SD_START+449) +#define SID_PRESENTATION_MINIMIZER (SID_SD_START+450) + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/bitmaps.hlst b/sd/inc/bitmaps.hlst new file mode 100644 index 0000000000..52b9005899 --- /dev/null +++ b/sd/inc/bitmaps.hlst @@ -0,0 +1,225 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include + +// preview bitmaps for layouts +inline constexpr OUString BMP_LAYOUT_EMPTY = u"sd/res/layout_empty.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD01 = u"sd/res/layout_head01.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD02 = u"sd/res/layout_head02.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD02A = u"sd/res/layout_head02a.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD02B = u"sd/res/layout_head02b.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD03 = u"sd/res/layout_head03.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD03A = u"sd/res/layout_head03a.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD03B = u"sd/res/layout_head03b.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD03C = u"sd/res/layout_head03c.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD04 = u"sd/res/layout_head04.png"_ustr; +inline constexpr OUString BMP_LAYOUT_HEAD06 = u"sd/res/layout_head06.png"_ustr; +inline constexpr OUString BMP_LAYOUT_TEXTONLY = u"sd/res/layout_textonly.png"_ustr; +inline constexpr OUString BMP_LAYOUT_VERTICAL01 = u"sd/res/layout_vertical01.png"_ustr; +inline constexpr OUString BMP_LAYOUT_VERTICAL02 = u"sd/res/layout_vertical02.png"_ustr; +inline constexpr OUString BMP_SLIDE_NONE = u"sd/res/foilnone.png"_ustr; +inline constexpr OUString BMP_SLIDEH_01 = u"sd/res/foilh01.png"_ustr; +inline constexpr OUString BMP_SLIDEH_02 = u"sd/res/foilh02.png"_ustr; +inline constexpr OUString BMP_SLIDEH_03 = u"sd/res/foilh03.png"_ustr; +inline constexpr OUString BMP_SLIDEH_04 = u"sd/res/foilh04.png"_ustr; +inline constexpr OUString BMP_SLIDEH_06 = u"sd/res/foilh06.png"_ustr; +inline constexpr OUString BMP_SLIDEH_09 = u"sd/res/foilh09.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_SLIDE = u"sd/res/displaymode_slide.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_OUTLINE = u"sd/res/displaymode_outline.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_NOTES = u"sd/res/displaymode_notes.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_SLIDE_SORTER = u"sd/res/displaymode_slidesorter.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_SLIDE_MASTER = u"sd/res/displaymode_slidemaster.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_NOTES_MASTER = u"sd/res/displaymode_notesmaster.png"_ustr; +inline constexpr OUString BMP_DISPLAYMODE_HANDOUT_MASTER = u"sd/res/displaymode_handoutmaster.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_CHART_SMALL = u"sd/res/placeholder_chart_small.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_CHART_SMALL_HOVER = u"sd/res/placeholder_chart_small_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_IMAGE_SMALL = u"sd/res/placeholder_image_small.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_IMAGE_SMALL_HOVER = u"sd/res/placeholder_image_small_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_MOVIE_SMALL = u"sd/res/placeholder_movie_small.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_MOVIE_SMALL_HOVER = u"sd/res/placeholder_movie_small_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_TABLE_SMALL = u"sd/res/placeholder_table_small.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_TABLE_SMALL_HOVER = u"sd/res/placeholder_table_small_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_CHART_LARGE = u"sd/res/placeholder_chart_large.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_CHART_LARGE_HOVER = u"sd/res/placeholder_chart_large_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_IMAGE_LARGE = u"sd/res/placeholder_image_large.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_IMAGE_LARGE_HOVER = u"sd/res/placeholder_image_large_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_MOVIE_LARGE = u"sd/res/placeholder_movie_large.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_MOVIE_LARGE_HOVER = u"sd/res/placeholder_movie_large_hover.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_TABLE_LARGE = u"sd/res/placeholder_table_large.png"_ustr; +inline constexpr OUString BMP_PLACEHOLDER_TABLE_LARGE_HOVER = u"sd/res/placeholder_table_large_hover.png"_ustr; +inline constexpr OUString BMP_SLIDEN_01 = u"sd/res/foiln01.png"_ustr; +inline constexpr OUString BMP_PAGE = u"sd/res/page.png"_ustr; +inline constexpr OUString BMP_PAGE_EXCLUDED = u"sd/res/pageexcl.png"_ustr; +inline constexpr OUString BMP_PAGEOBJS_EXCLUDED = u"sd/res/pagobjex.png"_ustr; +inline constexpr OUString BMP_PAGEOBJS = u"sd/res/pageobjs.png"_ustr; +inline constexpr OUString BMP_OBJECTS = u"sd/res/objects.png"_ustr; +inline constexpr OUString BMP_OLE = u"sd/res/ole.png"_ustr; +inline constexpr OUString BMP_GROUP = u"sd/res/group.png"_ustr; +inline constexpr OUString BMP_DOC_OPEN = u"sd/res/docopen.png"_ustr; +inline constexpr OUString BMP_DOC_TEXT = u"sd/res/doctext.png"_ustr ; +inline constexpr OUString BMP_GRAPHIC = u"sd/res/graphic.png"_ustr; +inline constexpr OUString BMP_STYLES_FAMILY_GRAPHICS = u"sd/res/sf01.png"_ustr; +inline constexpr OUString BMP_STYLES_FAMILY_PRESENTATIONS = u"sd/res/sf02.png"_ustr; +inline constexpr OUString BMP_PRESOBJ_GRAPHIC = u"sd/res/image.png"_ustr; +inline constexpr OUString BMP_PRESOBJ_OBJECT = u"sd/res/object.png"_ustr; +inline constexpr OUString BMP_PRESOBJ_CHART = u"sd/res/chart.png"_ustr; +inline constexpr OUString BMP_PRESOBJ_ORGCHART = u"sd/res/orgchart.png"_ustr; +inline constexpr OUString BMP_PRESOBJ_TABLE = u"sd/res/table.png"_ustr; +inline constexpr OUString BMP_POINTER_ICON = u"sd/res/pointericon.png"_ustr; +inline constexpr OUString BMP_WAIT_ICON = u"sd/res/waiticon.png"_ustr; +inline constexpr OUString BMP_FADE_EFFECT_INDICATOR = u"sd/res/fade_effect_indicator.png"_ustr; +inline constexpr OUString BMP_CUSTOM_ANIMATION_INDICATOR = u"sd/res/click_16.png"_ustr; +inline constexpr OUString BMP_INSERT_TABLESTYLE = u"sd/res/addtablestyle.png"_ustr; +// Presenter Screen bitmaps: +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_LEFT = u"sd/res/presenterscreen-BorderLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_DISABLED = u"sd/res/presenterscreen-ButtonSlideNextDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_SELECTED = u"sd/res/presenterscreen-ButtonSlidePreviousSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP = u"sd/res/presenterscreen-BorderCurrentSlideTop.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_NOTES_SELECTED = u"sd/res/presenterscreen-ButtonNotesSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_SELECTED = u"sd/res/presenterscreen-ScrollbarArrowDownSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BACKGROUND = u"sd/res/presenterscreen-Background.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_ANIMATION = u"sd/res/presenterscreen-Animation.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_TRANSITION = u"sd/res/presenterscreen-Transition.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_RIGHT = u"sd/res/presenterscreen-BorderRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP = u"sd/res/presenterscreen-BorderActiveTop.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_HELP_DISABLED = u"sd/res/presenterscreen-ButtonHelpDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_RIGHT = u"sd/res/presenterscreen-BorderActiveRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_NORMAL = u"sd/res/presenterscreen-ButtonFrameCenterNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarThumbMiddleMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_RIGHT = u"sd/res/presenterscreen-BorderCurrentSlideBottomRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOP_LEFT = u"sd/res/presenterscreen-BorderTopLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM = u"sd/res/presenterscreen-BorderActiveBottom.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_BOTTOM_LEFT = u"sd/res/presenterscreen-BorderBottomLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP = u"sd/res/presenterscreen-BorderToolbarTop.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_LEFT = u"sd/res/presenterscreen-BorderActiveLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_HELP_NORMAL = u"sd/res/presenterscreen-ButtonHelpNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_NORMAL = u"sd/res/presenterscreen-ButtonExitPresenterNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SEPARATOR = u"sd/res/presenterscreen-Separator.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_CALLOUT = u"sd/res/presenterscreen-BorderActiveBottomCallout.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOOLBAR_LEFT = u"sd/res/presenterscreen-BorderToolbarLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_NORMAL = u"sd/res/presenterscreen-ButtonSlideSorterNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_NORMAL = u"sd/res/presenterscreen-ScrollbarPagerMiddleNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_NORMAL = u"sd/res/presenterscreen-ButtonFrameRightNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonEffectNextMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarThumbTopMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_DISABLED = u"sd/res/presenterscreen-ButtonEffectNextDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonFrameCenterMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_LEFT = u"sd/res/presenterscreen-BorderCurrentSlideLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonFrameLeftMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_HELP_SELECTED = u"sd/res/presenterscreen-ButtonHelpSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_VIEW_BACKGROUND = u"sd/res/presenterscreen-ViewBackground.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_NOTES_MOUSE_OVER = u"sd/res/presenterscreen-ButtonNotesMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_PLUS_MOUSE_OVER = u"sd/res/presenterscreen-ButtonPlusMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_SELECTED = u"sd/res/presenterscreen-ButtonSlideSorterSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_RIGHT = u"sd/res/presenterscreen-LabelMouseOverRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_NORMAL = u"sd/res/presenterscreen-ButtonSwitchMonitorNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_NORMAL = u"sd/res/presenterscreen-ButtonRestartTimerNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_NORMAL = u"sd/res/presenterscreen-ButtonPauseTimerNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_NORMAL = u"sd/res/presenterscreen-ButtonResumeTimerNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOOLBAR_RIGHT = u"sd/res/presenterscreen-BorderToolbarRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_NORMAL = u"sd/res/presenterscreen-ScrollbarThumbMiddleNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_SELECTED = u"sd/res/presenterscreen-ButtonEffectNextSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_NORMAL = u"sd/res/presenterscreen-ScrollbarArrowDownNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_RIGHT = u"sd/res/presenterscreen-BorderCurrentSlideTopRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_PLUS_NORMAL = u"sd/res/presenterscreen-ButtonPlusNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_RIGHT = u"sd/res/presenterscreen-BorderToolbarTopRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_MINUS_DISABLED = u"sd/res/presenterscreen-ButtonMinusDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_DISABLED = u"sd/res/presenterscreen-ScrollbarArrowDownDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonFrameRightMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSwitchMonitorMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonRestartTimerMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonPauseTimerMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonResumeTimerMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_DISABLED = u"sd/res/presenterscreen-ButtonSlidePreviousDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_MINUS_SELECTED = u"sd/res/presenterscreen-ButtonMinusSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_CENTER = u"sd/res/presenterscreen-LabelMouseOverCenter.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSlideNextMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_NORMAL = u"sd/res/presenterscreen-ButtonSlideNextNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSlidePreviousMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOP = u"sd/res/presenterscreen-BorderTop.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_NORMAL = u"sd/res/presenterscreen-ButtonFrameLeftNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarArrowUpMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_NOTES_NORMAL = u"sd/res/presenterscreen-ButtonNotesNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_DISABLED = u"sd/res/presenterscreen-ButtonSlideSorterDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_NORMAL = u"sd/res/presenterscreen-ButtonEffectNextNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_LEFT = u"sd/res/presenterscreen-BorderToolbarTopLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_RIGHT = u"sd/res/presenterscreen-BorderActiveBottomRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_BOTTOM = u"sd/res/presenterscreen-BorderBottom.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_LEFT = u"sd/res/presenterscreen-BorderActiveBottomLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarArrowDownMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_PLUS_SELECTED = u"sd/res/presenterscreen-ButtonPlusSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_RIGHT = u"sd/res/presenterscreen-BorderActiveTopRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_NORMAL = u"sd/res/presenterscreen-ButtonSlidePreviousNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSlideSorterMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_MINUS_MOUSE_OVER = u"sd/res/presenterscreen-ButtonMinusMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_NOTES_DISABLED = u"sd/res/presenterscreen-ButtonNotesDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_LEFT = u"sd/res/presenterscreen-BorderCurrentSlideBottomLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOP_RIGHT = u"sd/res/presenterscreen-BorderTopRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_HELP_MOUSE_OVER = u"sd/res/presenterscreen-ButtonHelpMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonExitPresenterMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_NORMAL = u"sd/res/presenterscreen-ScrollbarThumbTopNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_SELECTED = u"sd/res/presenterscreen-ScrollbarArrowUpSelected.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_DISABLED = u"sd/res/presenterscreen-ScrollbarArrowUpDisabled.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_NORMAL = u"sd/res/presenterscreen-ScrollbarArrowUpNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_TOOLBAR_BOTTOM = u"sd/res/presenterscreen-BorderToolbarBottom.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_LEFT = u"sd/res/presenterscreen-BorderCurrentSlideTopLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_MINUS_NORMAL = u"sd/res/presenterscreen-ButtonMinusNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarThumbBottomMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_LEFT = u"sd/res/presenterscreen-BorderActiveTopLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM = u"sd/res/presenterscreen-BorderCurrentSlideBottom.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarPagerMiddleMouseOver.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_LEFT = u"sd/res/presenterscreen-LabelMouseOverLeft.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_RIGHT = u"sd/res/presenterscreen-BorderCurrentSlideRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BORDER_BOTTOM_RIGHT = u"sd/res/presenterscreen-BorderBottomRight.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_NORMAL = u"sd/res/presenterscreen-ScrollbarThumbBottomNormal.png"_ustr; +inline constexpr OUString BMP_PRESENTERSCREEN_BUTTON_PLUS_DISABLED = u"sd/res/presenterscreen-ButtonPlusDisabled.png"_ustr; + +inline constexpr OUString BMP_EMBEDDED = u"sd/res/nv08.png"_ustr; +inline constexpr OUString BMP_LINK = u"sd/res/nv09.png"_ustr; +inline constexpr OUString BMP_HYPERLINK = u"sd/res/nv010.png"_ustr; + +inline constexpr OUString IMAGE_SHADOW = u"sd/res/slide_sorter_shadow.png"_ustr; +inline constexpr OUString IMAGE_INSERT_SHADOW = u"sd/res/slide_sorter_insert_shadow.png"_ustr; +inline constexpr OUString IMAGE_HIDE_SLIDE_OVERLAY = u"sd/res/slide_sorter_hide_slide_overlay.png"_ustr; +inline constexpr OUString IMAGE_FOCUS_BORDER = u"sd/res/slide_sorter_focus_border.png"_ustr; + +inline constexpr OUString BMP_CUSTOMANIMATION_ON_CLICK = u"sd/res/click_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_AFTER_PREVIOUS = u"sd/res/time_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_ENTRANCE_EFFECT = u"sd/res/effect_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_EMPHASIS_EFFECT = u"sd/res/effectshape_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_EXIT_EFFECT = u"sd/res/effectfade_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_MOTION_PATH = u"sd/res/effectpath_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_OLE = u"sd/res/effectole_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_MEDIA_PLAY = u"sd/res/playblue_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_MEDIA_PAUSE = u"sd/res/breakplayingblue_16.png"_ustr; +inline constexpr OUString BMP_CUSTOMANIMATION_MEDIA_STOP = u"sd/res/stopplayingblue_16.png"_ustr; + +inline constexpr OUString BMP_MENU_NEXT = u"cmd/sc_nextrecord.png"_ustr; +inline constexpr OUString BMP_MENU_PREV = u"cmd/sc_prevrecord.png"_ustr; +inline constexpr OUString BMP_MENU_FIRST = u"cmd/sc_firstrecord.png"_ustr; +inline constexpr OUString BMP_MENU_LAST = u"cmd/sc_lastrecord.png"_ustr; + +inline constexpr OUString BMP_PREV_SLIDE_SMALL = u"sd/res/prevslide_small.png"_ustr; +inline constexpr OUString BMP_NEXT_SLIDE_SMALL = u"sd/res/nextslide_small.png"_ustr; +inline constexpr OUString BMP_MENU_SLIDE_SMALL = u"sd/res/slideshowmenu_small.png"_ustr; + +inline constexpr OUString BMP_PREV_SLIDE_LARGE = u"sd/res/prevslide_large.png"_ustr; +inline constexpr OUString BMP_NEXT_SLIDE_LARGE = u"sd/res/nextslide_large.png"_ustr; +inline constexpr OUString BMP_MENU_SLIDE_LARGE = u"sd/res/slideshowmenu_large.png"_ustr; + +inline constexpr OUString BMP_PREV_SLIDE_EXTRALARGE = u"sd/res/prevslide_extralarge.png"_ustr; +inline constexpr OUString BMP_NEXT_SLIDE_EXTRALARGE = u"sd/res/nextslide_extralarge.png"_ustr; +inline constexpr OUString BMP_MENU_SLIDE_EXTRALARGE = u"sd/res/slideshowmenu_extralarge.png"_ustr; + +inline constexpr OUString SFX_BMP_CLOSE_DOC = u"sfx2/res/closedoc.png"_ustr; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/inc/createpresentation.hxx b/sd/inc/createpresentation.hxx new file mode 100644 index 0000000000..b1c3016e4d --- /dev/null +++ b/sd/inc/createpresentation.hxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +namespace com::sun::star::presentation +{ +class XPresentation2; +} +class SdDrawDocument; + +css::uno::Reference +CreatePresentation(SdDrawDocument const& rDocument); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/createunocustomshow.hxx b/sd/inc/createunocustomshow.hxx new file mode 100644 index 0000000000..334aa867ac --- /dev/null +++ b/sd/inc/createunocustomshow.hxx @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace com::sun::star::uno { class XInterface; } +class SdCustomShow; + +css::uno::Reference createUnoCustomShow( + SdCustomShow * pShow); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/createunopageimpl.hxx b/sd/inc/createunopageimpl.hxx new file mode 100644 index 0000000000..8707704c14 --- /dev/null +++ b/sd/inc/createunopageimpl.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace com::sun::star::uno +{ +class XInterface; +} +class SdPage; + +css::uno::Reference createUnoPageImpl(SdPage* pPage); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/cusshow.hxx b/sd/inc/cusshow.hxx new file mode 100644 index 0000000000..c0115c310a --- /dev/null +++ b/sd/inc/cusshow.hxx @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include "sddllapi.h" + +class SdPage; + +class SD_DLLPUBLIC SdCustomShow final +{ +public: + typedef ::std::vector PageVec; + +private: + PageVec maPages; + OUString aName; + + // this is a weak reference to a possible living api wrapper for this custom show + css::uno::WeakReference mxUnoCustomShow; + +public: + SdCustomShow(); + SdCustomShow(css::uno::Reference const& xShow); + + ~SdCustomShow(); + + // @@@ copy ctor, but no copy assignment? @@@ + SdCustomShow(const SdCustomShow& rShow); + + SdCustomShow& operator=(const SdCustomShow& rShow) = delete; + + /** Provides a direct access to the collection of the SdPage objects. */ + PageVec& PagesVector() { return maPages; } + /** + * Replaces all occurrences of pOldPage with pNewPage. + * If pNewPage is 0 then removes all occurrences of pOldPage. + */ + void ReplacePage(const SdPage* pOldPage, const SdPage* pNewPage); + + void SetName(const OUString& rName); + const OUString& GetName() const { return aName; } + + css::uno::Reference getUnoCustomShow(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/customshowlist.hxx b/sd/inc/customshowlist.hxx new file mode 100644 index 0000000000..8a1706ec2e --- /dev/null +++ b/sd/inc/customshowlist.hxx @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sddllapi.h" +#include "cusshow.hxx" +#include +#include +#include +#include + +class SD_DLLPUBLIC SdCustomShowList +{ +private: + std::vector> mShows; + sal_uInt16 mnCurPos; +public: + SdCustomShowList() + : mShows(), mnCurPos(0) + { + } + + SdCustomShowList& operator=( SdCustomShowList const & ) = delete; // MSVC2017 workaround + SdCustomShowList( SdCustomShowList const & ) = delete; // MSVC2017 workaround + + bool empty() const {return mShows.empty();} + + size_t size() const {return mShows.size();} + + std::unique_ptr& operator[](size_t i) {return mShows[i];} + + std::vector>::iterator begin() {return mShows.begin();} + + void erase(std::vector>::iterator it); + + void push_back(std::unique_ptr p) {mShows.push_back(std::move(p));} + + sal_uInt16 GetCurPos() const { return mnCurPos; } + void Seek(sal_uInt16 nNewPos) { mnCurPos = nNewPos; } + + SdCustomShow* First() + { + if( mShows.empty() ) + return nullptr; + mnCurPos = 0; + return mShows[mnCurPos].get(); + } + SdCustomShow* Next() + { + ++mnCurPos; + return mnCurPos >= mShows.size() ? nullptr : mShows[mnCurPos].get(); + } + void Last() + { + if( !mShows.empty() ) + mnCurPos = mShows.size() - 1; + } + SdCustomShow* GetCurObject() + { + return mShows.empty() ? nullptr : mShows[mnCurPos].get(); + } + void erase(const SdCustomShow* p) + { + auto it = std::find_if(mShows.begin(), mShows.end(), + [&] (std::unique_ptr const &i) { return i.get() == p; }); + assert( it != mShows.end() ); + if( it != mShows.end() ) + mShows.erase(it); + } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/diadef.h b/sd/inc/diadef.h new file mode 100644 index 0000000000..6d0f9a266c --- /dev/null +++ b/sd/inc/diadef.h @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +enum class PresChange +{ + Manual = 0, + Auto = 1, + SemiAuto = 2, + LAST = SemiAuto +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx new file mode 100644 index 0000000000..dd6b81647e --- /dev/null +++ b/sd/inc/drawdoc.hxx @@ -0,0 +1,720 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "sddllapi.h" +#include "pres.hxx" + +namespace com::sun::star::xml::dom { class XNode; } +namespace com::sun::star::uno { class XInterface; } +namespace vcl { class Font; } +namespace com::sun::star::presentation { class XPresentation2; } +class SdOutliner; +class Timer; +class SfxObjectShell; +class SdPage; +class SdAnimationInfo; +class SdStyleSheetPool; +class SfxMedium; +class SvxSearchItem; +class EditStatus; +class Point; +class SdTransferable; +struct SpellCallbackInfo; +class SdCustomShowList; +class SdUndoGroup; +class SdrObject; +class Idle; +class ImageMap; +class Outliner; +class SdrModel; +class SdrOutliner; +class SdrPage; +class SdrTextObj; +class SfxItemPool; +class Size; + +namespace sd +{ +class DrawDocShell; +#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED +#define SV_DECL_DRAW_DOC_SHELL_DEFINED +typedef ::tools::SvRef DrawDocShellRef; +#endif +class UndoManager; +class ShapeList; +class FrameView; +} + +class ImpDrawPageListWatcher; +class ImpMasterPageListWatcher; + +struct StyleReplaceData +{ + SfxStyleFamily nFamily; + SfxStyleFamily nNewFamily; + OUString aName; + OUString aNewName; +}; + +enum class DocCreationMode +{ + New, + Loaded +}; + +namespace sd +{ + struct PresentationSettings + { + OUString maPresPage; + bool mbAll; + bool mbEndless; + bool mbCustomShow; + bool mbManual; + bool mbMouseVisible; + bool mbMouseAsPen; + bool mbLockedPages; + bool mbAlwaysOnTop; + bool mbFullScreen; + bool mbAnimationAllowed; + sal_Int32 mnPauseTimeout; + bool mbShowPauseLogo; + bool mbStartCustomShow; + + PresentationSettings(); + }; +} + +// SdDrawDocument +class SD_DLLPUBLIC SdDrawDocument final : public FmFormModel +{ +public: + SAL_DLLPRIVATE void setDocAccTitle( const OUString& rTitle ) { msDocAccTitle = rTitle; } + SAL_DLLPRIVATE const OUString& getDocAccTitle() const { return msDocAccTitle; } + SAL_DLLPRIVATE bool getDocReadOnly() const { return m_bReadOnly; } +private: + OUString msDocAccTitle; + std::unique_ptr + mpOutliner; ///< local outliner for outline mode + std::unique_ptr + mpInternalOutliner; ///< internal outliner for creation of text objects + std::unique_ptr mpWorkStartupTimer; + std::unique_ptr + mpOnlineSpellingIdle; + std::unique_ptr + mpOnlineSpellingList; + std::unique_ptr + mpOnlineSearchItem; + std::vector> + maFrameViewList; + std::unique_ptr mpCustomShowList; + ::sd::DrawDocShell* mpDocSh; + SdTransferable * mpCreatingTransferable; + bool mbHasOnlineSpellErrors; + bool mbInitialOnlineSpellingEnabled; + OUString maBookmarkFile; + ::sd::DrawDocShellRef mxBookmarkDocShRef; + + sd::PresentationSettings maPresentationSettings; + + css::uno::Reference< css::presentation::XPresentation2 > mxPresentation; + + bool mbNewOrLoadCompleted; + + bool mbOnlineSpell; + bool mbSummationOfParagraphs; + bool mbStartWithPresentation; ///< is set to true when starting with command line parameter -start + bool mbExitAfterPresenting; ///< true if mbStartWithPresentation AND Presentation was shown fully + LanguageType meLanguage; + LanguageType meLanguageCJK; + LanguageType meLanguageCTL; + SvxNumType mePageNumType; + ::sd::DrawDocShellRef mxAllocedDocShRef; // => AllocModel() + bool mbAllocDocSh; // => AllocModel() + DocumentType meDocType; + std::optional + moCharClass; + + ::std::unique_ptr mpDrawPageListWatcher; + ::std::unique_ptr mpMasterPageListWatcher; + + SAL_DLLPRIVATE void UpdatePageObjectsInNotes(sal_uInt16 nStartPos); + SAL_DLLPRIVATE void UpdatePageRelativeURLs(SdPage const * pPage, sal_uInt16 nPos, sal_Int32 nIncrement); + SAL_DLLPRIVATE void FillOnlineSpellingList(SdPage const * pPage); + SAL_DLLPRIVATE void SpellObject(SdrTextObj* pObj); + + DECL_DLLPRIVATE_LINK(WorkStartupHdl, Timer *, void); + DECL_DLLPRIVATE_LINK(OnlineSpellingHdl, Timer *, void); + DECL_DLLPRIVATE_LINK(OnlineSpellEventHdl, EditStatus&, void); + + std::vector< OUString > maAnnotationAuthors; + std::vector > maLayoutInfo; + + std::vector > maPresObjectInfo; + + bool mbEmbedFonts : 1; + bool mbEmbedUsedFontsOnly : 1; + bool mbEmbedFontScriptLatin : 1; + bool mbEmbedFontScriptAsian : 1; + bool mbEmbedFontScriptComplex : 1; + + sal_Int32 mnImagePreferredDPI; + + SAL_DLLPRIVATE virtual css::uno::Reference< css::frame::XModel > createUnoModel() override; + +public: + + + SAL_DLLPRIVATE SdDrawDocument(DocumentType eType, SfxObjectShell* pDocSh); + SAL_DLLPRIVATE virtual ~SdDrawDocument() override; + + // Adapt to given Size and Borders scaling all contained data, maybe + // including PresObj's in higher derivations + virtual void adaptSizeAndBorderForAllPages( + const Size& rNewSize, + tools::Long nLeft = 0, + tools::Long nRight = 0, + tools::Long nUpper = 0, + tools::Long nLower = 0) override; + + // Adapt PageSize for all Pages of PageKind ePageKind. Also + // set Borders to left/right/upper/lower, ScaleAll, Orientation, + // PaperBin and BackgroundFullSize. Create Undo-Actions when + // a SdUndoGroup is given (then used from the View probably) + void AdaptPageSizeForAllPages( + const Size& rNewSize, + PageKind ePageKind, + SdUndoGroup* pUndoGroup = nullptr, + tools::Long nLeft = 0, + tools::Long nRight = 0, + tools::Long nUpper = 0, + tools::Long nLower = 0, + bool bScaleAll = false, + Orientation eOrientation = Orientation::Landscape, + sal_uInt16 nPaperBin = 0, + bool bBackgroundFullSize = false); + + SAL_DLLPRIVATE SdDrawDocument* AllocSdDrawDocument() const; + SAL_DLLPRIVATE virtual SdrModel* AllocModel() const override; //forwards to AllocSdDrawDocument + + SAL_DLLPRIVATE rtl::Reference AllocSdPage(bool bMasterPage); + SAL_DLLPRIVATE virtual rtl::Reference AllocPage(bool bMasterPage) override; //forwards to AllocSdPage + + SAL_DLLPRIVATE virtual bool IsReadOnly() const override; + SAL_DLLPRIVATE virtual void SetChanged(bool bFlag = true) override; + + SAL_DLLPRIVATE SfxItemPool& GetPool() { return( *m_pItemPool ); } + + SAL_DLLPRIVATE SdOutliner* GetOutliner(bool bCreateOutliner=true); + SdOutliner* GetInternalOutliner(bool bCreateOutliner=true); + + SAL_DLLPRIVATE ::sd::DrawDocShell* GetDocSh() const { return mpDocSh; } + + SAL_DLLPRIVATE LanguageType GetLanguage( const sal_uInt16 nId ) const; + SAL_DLLPRIVATE void SetLanguage( const LanguageType eLang, const sal_uInt16 nId ); + + SAL_DLLPRIVATE SvxNumType GetPageNumType() const override; + SAL_DLLPRIVATE void SetPageNumType(SvxNumType eType) { mePageNumType = eType; } + OUString CreatePageNumValue(sal_uInt16 nNum) const; + + SAL_DLLPRIVATE DocumentType GetDocumentType() const { return meDocType; } + + SAL_DLLPRIVATE void SetAllocDocSh(bool bAlloc); + + SAL_DLLPRIVATE void CreatingDataObj( SdTransferable* pTransferable ) { mpCreatingTransferable = pTransferable; } + SAL_DLLPRIVATE virtual bool IsCreatingDataObj() const override { return mpCreatingTransferable != nullptr; } + + /** if the document does not contain at least one handout, one slide and one notes page with + at least one master each this methods creates them. + If a reference document is given, the sizes and border settings of that document are used + for newly created slides. + */ + void CreateFirstPages( SdDrawDocument const * pRefDocument = nullptr ); + bool CreateMissingNotesAndHandoutPages(); + + SAL_DLLPRIVATE void MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos) override; + SAL_DLLPRIVATE void InsertPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF) override; + SAL_DLLPRIVATE void DeletePage(sal_uInt16 nPgNum) override; + SAL_DLLPRIVATE rtl::Reference RemovePage(sal_uInt16 nPgNum) override; + + SAL_DLLPRIVATE virtual void InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF) override; + SAL_DLLPRIVATE virtual rtl::Reference RemoveMasterPage(sal_uInt16 nPgNum) override; + + SAL_DLLPRIVATE void RemoveUnnecessaryMasterPages( SdPage* pMaster=nullptr, bool bOnlyDuplicatePages=false, bool bUndo=true ); + void SetMasterPage(sal_uInt16 nSdPageNum, std::u16string_view rLayoutName, + SdDrawDocument* pSourceDoc, bool bMaster, bool bCheckMasters); + + SdDrawDocument* OpenBookmarkDoc(const OUString& rBookmarkFile); + SAL_DLLPRIVATE SdDrawDocument* OpenBookmarkDoc(SfxMedium* pMedium); + + SAL_DLLPRIVATE void InsertBookmark(const std::vector &rBookmarkList, + std::vector &rExchangeList, bool bLink, + sal_uInt16 nPgPos, + ::sd::DrawDocShell* pBookmarkDocSh, + Point const * pObjPos); + + SAL_DLLPRIVATE bool IsStartWithPresentation() const { return mbStartWithPresentation;} + SAL_DLLPRIVATE void SetStartWithPresentation( bool bStartWithPresentation ); + + SAL_DLLPRIVATE bool IsExitAfterPresenting() const { return mbExitAfterPresenting;} + SAL_DLLPRIVATE void SetExitAfterPresenting( bool bExitAfterPresenting ); + + /// load xml-based impress layout definitions into document + SAL_DLLPRIVATE void InitLayoutVector(); + /// return reference to vector of Impress layout definitions + SAL_DLLPRIVATE const std::vector >& GetLayoutVector() const + { return maLayoutInfo; } + + /// load xml-based impress master presentation object definitions into document + SAL_DLLPRIVATE void InitObjectVector(); + /// return reference to vector of master presentation object definitions + SAL_DLLPRIVATE const std::vector >& GetObjectVector() const { return maPresObjectInfo; } + /** Insert pages into this document + + This method inserts whole pages into this document, either + selected ones (specified via pBookmarkList/pExchangeList), or + all from the source document. + + @attention Beware! This method in its current state does not + handle all combinations of their input parameters + correctly. For example, for pBookmarkList=NULL, bReplace=true + is ignored (no replace happens). + + @param pBookmarkList + A list of strings, denoting the names of the pages to be copied + + @param pExchangeList + A list of strings, denoting the names of the pages to be renamed + + @param bLink + Whether the inserted pages should be linked to the bookmark document + + @param bReplace + Whether the pages should not be inserted, but replace the pages in + the destination document + + @param nPgPos + Insertion point/start of replacement + + @param bNoDialogs + Whether query dialogs are allowed (e.g. for page scaling) + + @param pBookmarkDocSh + DocShell of the source document (used e.g. to extract the filename + for linked pages) + + @param bCopy + Whether the source document should be treated as immutable (i.e. + inserted pages are not removed from it, but cloned) + + @param bMergeMasterPages + Whether the source document's master pages should be copied, too. + + @param bPreservePageNames + Whether the replace operation should take the name from the new + page, or preserve the old name + */ + + bool InsertBookmarkAsPage(const std::vector &rBookmarkList, + std::vector *pExchangeList, + bool bLink, bool bReplace, sal_uInt16 nPgPos, + bool bNoDialogs, ::sd::DrawDocShell* pBookmarkDocSh, + bool bCopy, bool bMergeMasterPages, + bool bPreservePageNames); + + SAL_DLLPRIVATE bool InsertBookmarkAsObject(const std::vector &rBookmarkList, + const std::vector &rExchangeList, + ::sd::DrawDocShell* pBookmarkDocSh, + Point const * pObjPos, bool bCalcObjCount); + + void CloseBookmarkDoc(); + + SAL_DLLPRIVATE SdrObject* GetObj(std::u16string_view rObjName) const; + + /** Return the first page that has the given name. Regular pages and + notes pages are searched first. When not found then the master + pages are searched. + @param rPgName + Name of the page to return. + @param rbIsMasterPage + Is set by the method to indicate whether the returned index + belongs to a master page () or a regular or notes page + (). The given value is ignored. + @return + Returns the index of the page with the given name or + SDRPAGE_NOTFOUND (=0xffff) when such a page does not exist. + */ + SAL_DLLPRIVATE sal_uInt16 GetPageByName(std::u16string_view rPgName, bool& rbIsMasterPage ) const; + /** checks, if the given name is a *unique* name for an *existing* slide + + @param rPageName the name of an existing slide + + @return true, if the name is unique and the slide exists + */ + bool IsPageNameUnique( std::u16string_view rPageName ) const; + SdPage*GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const; + sal_uInt16 GetSdPageCount(PageKind ePgKind) const; + + SAL_DLLPRIVATE void SetSelected(SdPage* pPage, bool bSelect); + SAL_DLLPRIVATE void UnselectAllPages(); + SAL_DLLPRIVATE bool MovePages(sal_uInt16 nTargetPage); + + SdPage*GetMasterSdPage(sal_uInt16 nPgNum, PageKind ePgKind); + sal_uInt16 GetMasterSdPageCount(PageKind ePgKind) const; + + sal_uInt16 GetActiveSdPageCount() const; + + SAL_DLLPRIVATE sal_uInt16 GetMasterPageUserCount(SdrPage const * pMaster) const; + + SAL_DLLPRIVATE const sd::PresentationSettings& getPresentationSettings() const { return maPresentationSettings; } + SAL_DLLPRIVATE sd::PresentationSettings& getPresentationSettings() { return maPresentationSettings; } + + SAL_DLLPRIVATE const css::uno::Reference< css::presentation::XPresentation2 >& getPresentation() const; + + SAL_DLLPRIVATE void SetSummationOfParagraphs( bool bOn = true ) { mbSummationOfParagraphs = bOn; } + SAL_DLLPRIVATE bool IsSummationOfParagraphs() const { return mbSummationOfParagraphs; } + + /** Set the mode that controls whether (and later how) the formatting of the document + depends on the current printer metrics. + @param nMode + Use ENABLED + to make formatting printer-independent and DISABLED + to make formatting depend on the current printer metrics. + */ + SAL_DLLPRIVATE void SetPrinterIndependentLayout (sal_Int32 nMode); + + /** Get the flag that controls whether the formatting of the document + depends on the current printer metrics. + @return + Use ENABLED + when formatting is printer-independent and DISABLED + when formatting depends on the current printer metrics. + */ + SAL_DLLPRIVATE sal_Int32 GetPrinterIndependentLayout() const { return mnPrinterIndependentLayout;} + + SAL_DLLPRIVATE void SetOnlineSpell( bool bIn ); + SAL_DLLPRIVATE bool GetOnlineSpell() const { return mbOnlineSpell; } + SAL_DLLPRIVATE void StopOnlineSpelling(); + SAL_DLLPRIVATE void StartOnlineSpelling(bool bForceSpelling=true); + + SAL_DLLPRIVATE void ImpOnlineSpellCallback(SpellCallbackInfo const * pInfo, SdrObject* pObj, SdrOutliner const * pOutl); + + SAL_DLLPRIVATE void InsertObject(SdrObject* pObj); + SAL_DLLPRIVATE void RemoveObject(SdrObject* pObj); + + SAL_DLLPRIVATE sal_uLong GetLinkCount() const; + + SAL_DLLPRIVATE std::vector>& GetFrameViewList() { return maFrameViewList; } + SdCustomShowList* GetCustomShowList(bool bCreate = false); + + SAL_DLLPRIVATE void NbcSetChanged(bool bFlag); + + SAL_DLLPRIVATE void SetTextDefaults() const; + + SAL_DLLPRIVATE void CreateLayoutTemplates(); + SAL_DLLPRIVATE void RenameLayoutTemplate(const OUString& rOldLayoutName, const OUString& rNewName); + + SAL_DLLPRIVATE void CreateDefaultCellStyles(); + + void StopWorkStartupDelay(); + + SAL_DLLPRIVATE void NewOrLoadCompleted(DocCreationMode eMode); + SAL_DLLPRIVATE void NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool ); + SAL_DLLPRIVATE bool IsNewOrLoadCompleted() const {return mbNewOrLoadCompleted; } + + SAL_DLLPRIVATE ::sd::FrameView* GetFrameView(sal_uLong nPos) { + return nPos < maFrameViewList.size() ? maFrameViewList[nPos].get() : nullptr; } + + /** deprecated*/ + SAL_DLLPRIVATE static SdAnimationInfo* GetAnimationInfo(SdrObject* pObject); + + static SdAnimationInfo* GetShapeUserData(SdrObject& rObject, bool bCreate = false ); + + SAL_DLLPRIVATE const std::optional& GetCharClass() const { return moCharClass; } + + SAL_DLLPRIVATE void UpdateAllLinks(); + + SAL_DLLPRIVATE void CheckMasterPages(); + + SAL_DLLPRIVATE void Merge(SdrModel& rSourceModel, + sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum, + sal_uInt16 nDestPos, + bool bMergeMasterPages, bool bAllMasterPages, + bool bUndo = true, bool bTreadSourceAsConst = false) override; + + css::text::WritingMode GetDefaultWritingMode() const; + SAL_DLLPRIVATE void SetDefaultWritingMode( css::text::WritingMode eMode ); + + /** replacespOldPage from all custom shows with pNewPage or removes pOldPage from + all custom shows if pNewPage is 0. + */ + SAL_DLLPRIVATE void ReplacePageInCustomShows( const SdPage* pOldPage, const SdPage* pNewPage ); + +public: + + /// static to prevent recursions while resolving links + SAL_DLLPRIVATE static SdDrawDocument* s_pDocLockedInsertingLinks; + + /** Create and insert a set of two new pages: a standard (draw) page and + the associated notes page. The new pages are inserted directly + after the specified page set. + @param pCurrentPage + This page is used to retrieve the layout for the page to + create. + @param ePageKind + This specifies whether pCurrentPage is a + standard (draw) page or a notes page. + @param sStandardPageName + Name of the standard page. An empty string leads to using an + automatically created name. + @param sNotesPageName + Name of the standard page. An empty string leads to using an + automatically created name. + @param eStandardLayout + Layout to use for the new standard page. Note that this layout + is not used when the given pCurrentPage is + not a standard page. In this case the layout is taken from the + standard page associated with pCurrentPage. + @param eNotesLayout + Layout to use for the new notes page. Note that this layout + is not used when the given pCurrentPage is + not a notes page. In this case the layout is taken from the + notes page associated with pCurrentPage. + @param bIsPageBack + This flag indicates whether to show the background shape. + @param bIsPageObj + This flag indicates whether to show the shapes on the master page. + @param nInsertPosition + Position where to insert the standard page. When -1 then the + new page set is inserted after the current page. + + @return + Returns an index of the inserted pages that can be used with the + GetSdPage() method. + */ + SAL_DLLPRIVATE sal_uInt16 CreatePage ( + SdPage* pCurrentPage, + PageKind ePageKind, + const OUString& sStandardPageName, + const OUString& sNotesPageName, + AutoLayout eStandardLayout, + AutoLayout eNotesLayout, + bool bIsPageBack, + bool bIsPageObj, + const sal_Int32 nInsertPosition); + + /** This method acts as a simplified front end for the more complex + DuplicatePage() method. + @param nPageNum + The page number as passed to the GetSdPage() + method for which the standard page and the notes page are to be + copied. + @return + Returns an index of the inserted pages that can be used with the + GetSdPage() method. + */ + SAL_DLLPRIVATE sal_uInt16 DuplicatePage (sal_uInt16 nPageNum); + + /** Create and insert a set of two new pages that are copies of the + given pCurrentPage and its associated notes + resp. standard page. The copies are inserted directly after the + specified page set. + @param pCurrentPage + This page and its associated notes/standard page is copied. + @param ePageKind + This specifies whether pCurrentPage is a + standard (draw) page or a notes page. + @param sStandardPageName + Name of the standard page. An empty string leads to using an + automatically created name. + @param sNotesPageName + Name of the standard page. An empty string leads to using an + automatically created name. + @param bIsPageBack + This flag indicates whether to show the background shape. + @param bIsPageObj + This flag indicates whether to show the shapes on the master page. + @param nInsertPosition + Position where to insert the standard page. When -1 then the + new page set is inserted after the current page. + + @return + Returns an index of the inserted pages that can be used with the + GetSdPage() method. + */ + SAL_DLLPRIVATE sal_uInt16 DuplicatePage ( + SdPage* pCurrentPage, + PageKind ePageKind, + const OUString& sStandardPageName, + const OUString& sNotesPageName, + bool bIsPageBack, + bool bIsPageObj, + const sal_Int32 nInsertPosition); + + /** return the document fonts for latin, cjk and ctl according to the current + languages set at this document */ + SAL_DLLPRIVATE void getDefaultFonts( vcl::Font& rLatinFont, vcl::Font& rCJKFont, vcl::Font& rCTLFont ); + + sd::UndoManager* GetUndoManager() const; + + /** converts the given western font height to a corresponding ctl font height, depending on the system language */ + SAL_DLLPRIVATE static sal_uInt32 convertFontHeightToCTL( sal_uInt32 nWesternFontHeight ); + + /** Get the style sheet pool if it was a SdStyleSheetPool. + */ + SdStyleSheetPool* GetSdStyleSheetPool() const; + + SAL_DLLPRIVATE void UpdatePageRelativeURLs( + std::u16string_view aOldName, std::u16string_view aNewName); + + SAL_DLLPRIVATE static void SetCalcFieldValueHdl( ::Outliner* pOutliner); + + SAL_DLLPRIVATE sal_uInt16 GetAnnotationAuthorIndex( const OUString& rAuthor ); + + SAL_DLLPRIVATE bool IsEmbedFonts() const { return mbEmbedFonts; } + SAL_DLLPRIVATE bool IsEmbedUsedFontsOnly() const { return mbEmbedUsedFontsOnly; } + SAL_DLLPRIVATE bool IsEmbedFontScriptLatin() const { return mbEmbedFontScriptLatin; } + SAL_DLLPRIVATE bool IsEmbedFontScriptAsian() const { return mbEmbedFontScriptAsian; } + SAL_DLLPRIVATE bool IsEmbedFontScriptComplex() const { return mbEmbedFontScriptComplex; } + + SAL_DLLPRIVATE void SetEmbedFonts(bool bUse) { mbEmbedFonts = bUse; } + SAL_DLLPRIVATE void SetEmbedUsedFontsOnly(bool bUse) { mbEmbedUsedFontsOnly = bUse; } + SAL_DLLPRIVATE void SetEmbedFontScriptLatin(bool bUse) { mbEmbedFontScriptLatin = bUse; } + SAL_DLLPRIVATE void SetEmbedFontScriptAsian(bool bUse) { mbEmbedFontScriptAsian = bUse; } + SAL_DLLPRIVATE void SetEmbedFontScriptComplex(bool bUse) { mbEmbedFontScriptComplex = bUse; } + + sal_Int32 getImagePreferredDPI() const override { return mnImagePreferredDPI; } + void setImagePreferredDPI(sal_Int32 nValue) { mnImagePreferredDPI = nValue; } + + void dumpAsXml(xmlTextWriterPtr pWriter) const override; + +private: + /** This member stores the printer independent layout mode. Please + refer to SetPrinterIndependentLayout() for its + values. + */ + sal_Int32 mnPrinterIndependentLayout; + + /** Insert a given set of standard and notes page after the given pCurrentPage. + @param pCurrentPage + This page and its associated notes/standard page is copied. + @param ePageKind + This specifies whether pCurrentPage is a + standard (draw) page or a notes page. + @param sStandardPageName + Name of the standard page. An empty string leads to using an + automatically created name. + @param sNotesPageName + Name of the standard page. An empty string leads to using an + automatically created name. + @param bIsPageBack + This flag indicates whether to show the background shape. + @param bIsPageObj + This flag indicates whether to show the shapes on the master page. + @param pStandardPage + The standard page to insert. + @param pNotesPage + The notes page to insert. + @param nInsertPosition + Position where to insert the standard page. When -1 then the + new page set is inserted after the current page. + + @return + Returns an index of the inserted pages that can be used with the + GetSdPage() method. + */ + SAL_DLLPRIVATE sal_uInt16 InsertPageSet ( + SdPage* pCurrentPage, + PageKind ePageKind, + const OUString& sStandardPageName, + const OUString& sNotesPageName, + bool bIsPageBack, + bool bIsPageObj, + SdPage* pStandardPage, + SdPage* pNotesPage, + sal_Int32 nInsertPosition); + + /** Set up a newly created page and insert it into the list of pages. + @param pPreviousPage + A page to take the size and border geometry from. + @param pPage + This is the page to set up and insert. + @param sPageName + The name of the new page. + @param nInsertionPoint + Index of the page before which the new page will be inserted. + @param bIsPageBack + This flag indicates whether to show the background shape. + @param bIsPageObj + This flag indicates whether to show the shapes on the master + page. + */ + SAL_DLLPRIVATE void SetupNewPage ( + SdPage const * pPreviousPage, + SdPage* pPage, + const OUString& sPageName, + sal_uInt16 nInsertionPoint, + bool bIsPageBack, + bool bIsPageObj); + + SAL_DLLPRIVATE virtual void PageListChanged() override; + SAL_DLLPRIVATE virtual void MasterPageListChanged() override; +}; + +namespace sd +{ + +/**an instance of this guard disables modification of a document + during its lifetime*/ +class ModifyGuard +{ +public: + ModifyGuard( SdDrawDocument* pDoc ); + ~ModifyGuard(); + +private: + void init(); + + DrawDocShell* mpDocShell; + SdDrawDocument* mpDoc; + bool mbIsEnableSetModified; + bool mbIsDocumentChanged; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/errhdl.hrc b/sd/inc/errhdl.hrc new file mode 100644 index 0000000000..6b89724a5e --- /dev/null +++ b/sd/inc/errhdl.hrc @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#define NC_(Context, String) TranslateId(Context, u8##String) + +#include +#include +#include "sderror.hxx" + +const ErrMsgCode RID_SD_ERRHDL[] = +{ + { NC_("RID_SD_ERRHDL", "File format error found at $(ARG1)(row,col)."), + ERR_FORMAT_ROWCOL }, + { NC_("RID_SD_ERRHDL", "Format error discovered in the file in sub-document $(ARG1) at position $(ARG2)(row,col)."), + ERR_FORMAT_FILE_ROWCOL }, + { NC_("RID_SD_ERRHDL", "Format error discovered in the file in sub-document $(ARG1) at position $(ARG2)(row,col)."), + WARN_FORMAT_FILE_ROWCOL }, + { {}, ERRCODE_NONE } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/family.hrc b/sd/inc/family.hrc new file mode 100644 index 0000000000..ff52e447fb --- /dev/null +++ b/sd/inc/family.hrc @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#define NC_(Context, String) TranslateId(Context, u8##String) + +const std::pair RID_GRAPHICSTYLEFAMILY[] = +{ + { NC_("RID_GRAPHICSTYLEFAMILY", "All Styles") , SfxStyleSearchBits::AllVisible }, + { NC_("RID_GRAPHICSTYLEFAMILY", "Hidden Styles") , SfxStyleSearchBits::Hidden }, + { NC_("RID_GRAPHICSTYLEFAMILY", "Applied Styles") , SfxStyleSearchBits::Used }, + { NC_("RID_GRAPHICSTYLEFAMILY", "Custom Styles") , SfxStyleSearchBits::UserDefined }, + { {}, SfxStyleSearchBits::Auto } +}; + +const std::pair RID_PRESENTATIONSTYLEFAMILY[] = +{ + { NC_("RID_PRESENTATIONSTYLEFAMILY", "All Styles") , SfxStyleSearchBits::AllVisible }, + { NC_("RID_PRESENTATIONSTYLEFAMILY", "Hidden Styles") , SfxStyleSearchBits::Hidden }, + { {}, SfxStyleSearchBits::Auto } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/glob.hxx b/sd/inc/glob.hxx new file mode 100644 index 0000000000..a6ddf50705 --- /dev/null +++ b/sd/inc/glob.hxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#define SD_IF_SDAPP SFX_INTERFACE_SD_START + SfxInterfaceId(0) +#define SD_IF_SDDRAWDOCSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(1) +#define SD_IF_SDDRAWVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(3) +#define SD_IF_SDOUTLINEVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(5) +#define SD_IF_SDDRAWTEXTOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(7) +#define SD_IF_SDDRAWBEZIEROBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(8) +#define SD_IF_SDGRAPHICDOCSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(10) +#define SD_IF_SDGRAPHICVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(11) +#define SD_IF_SDDRAWGRAFOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(13) +#define SD_IF_SDPRESVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(14) +#define SD_IF_SDVIEWSHELLBASE SFX_INTERFACE_SD_START + SfxInterfaceId(16) +#define SD_IF_SDSLIDESORTERVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(19) +#define SD_IF_SDDRAWMEDIAOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(23) +#define SD_IF_SDLEFTIMPRESSPANESHELL SFX_INTERFACE_SD_START + SfxInterfaceId(24) +#define SD_IF_SDLEFTDRAWPANESHELL SFX_INTERFACE_SD_START + SfxInterfaceId(25) +#define SD_IF_SDDRAWTABLEOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(27) +#define SD_IF_SDTOOLPANELPANESHELL SFX_INTERFACE_SD_START + SfxInterfaceId(29) +#define SD_IF_SDTOOLPANELSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(30) + + +// Object-Ids for StarDraw UserData +#define SD_ANIMATIONINFO_ID 1 +// SVX_IMAPINFO_ID = 2 + +// Separator between layout name and template name of presentation templates +inline constexpr OUString SD_LT_SEPARATOR = u"~LT~"_ustr; + +// option-stream identifier +#define SD_OPTION_MORPHING u"Morph" +#define SD_OPTION_VECTORIZE u"Vectorize" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/helper/simplereferencecomponent.hxx b/sd/inc/helper/simplereferencecomponent.hxx new file mode 100644 index 0000000000..89e43639e4 --- /dev/null +++ b/sd/inc/helper/simplereferencecomponent.hxx @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ +/** A simple base implementation for reference-counted components. + acts like sal::SimpleReferenceObject but calls the virtual disposing() + methods before the ref count switches from 1 to zero. + */ +class SimpleReferenceComponent +{ +public: + SimpleReferenceComponent(); + + /** @ATTENTION + The results are undefined if, for any individual instance of + SimpleReferenceComponent, the total number of calls to acquire() exceeds + the total number of calls to release() by a platform dependent amount + (which, hopefully, is quite large). + */ + void acquire(); + void release(); + + void Dispose(); + + bool isDisposed() const { return mbDisposed; } + +protected: + virtual void disposing(); + + virtual ~SimpleReferenceComponent(); + +private: + oslInterlockedCount m_nCount; + + SimpleReferenceComponent(SimpleReferenceComponent const&) = delete; + void operator=(SimpleReferenceComponent const&) = delete; + + bool mbDisposed; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/helpids.h b/sd/inc/helpids.h new file mode 100644 index 0000000000..bcd28e15f1 --- /dev/null +++ b/sd/inc/helpids.h @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +inline constexpr OUString HID_SDDRAWVIEWSHELL = u"SD_HID_SDDRAWVIEWSHELL"_ustr; +inline constexpr OUString HID_SDGRAPHICVIEWSHELL = u"SD_HID_SDGRAPHICVIEWSHELL"_ustr; +inline constexpr OUString HID_SDOUTLINEVIEWSHELL = u"SD_HID_SDOUTLINEVIEWSHELL"_ustr; + +inline constexpr OUString HID_SD_WIN_PRESENTATION = u"SD_HID_SD_WIN_PRESENTATION"_ustr; + +inline constexpr OUString HID_SD_TABBAR_PAGES = u"SD_HID_SD_TABBAR_PAGES"_ustr; +inline constexpr OUString HID_SD_TABBAR_LAYERS = u"SD_HID_SD_TABBAR_LAYERS"_ustr; + +inline constexpr OUString HID_SD_NAMEDIALOG_OBJECT = u"SD_HID_SD_NAMEDIALOG_OBJECT"_ustr; +inline constexpr OUString HID_SD_NAMEDIALOG_PAGE = u"SD_HID_SD_NAMEDIALOG_PAGE"_ustr; +inline constexpr OUString HID_SD_NAMEDIALOG_LINEEND = u"SD_HID_SD_NAMEDIALOG_LINEEND"_ustr; + +inline constexpr OUString HID_SD_TASK_PANE_PREVIEW_CURRENT = u"SD_HID_SD_TASK_PANE_PREVIEW_CURRENT"_ustr; +inline constexpr OUString HID_SD_TASK_PANE_PREVIEW_RECENT = u"SD_HID_SD_TASK_PANE_PREVIEW_RECENT"_ustr; +inline constexpr OUString HID_SD_TASK_PANE_PREVIEW_ALL = u"SD_HID_SD_TASK_PANE_PREVIEW_ALL"_ustr; +inline constexpr OUString HID_SD_TASK_PANE_PREVIEW_LAYOUTS = u"SD_HID_SD_TASK_PANE_PREVIEW_LAYOUTS"_ustr; + +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX"_ustr; +inline constexpr OUString HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX = u"SD_HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX"_ustr; + + +inline constexpr OUString HID_SD_RULER_HORIZONTAL = u"SD_HID_SD_RULER_HORIZONTAL"_ustr; +inline constexpr OUString HID_SD_RULER_VERTICAL = u"SD_HID_SD_RULER_VERTICAL"_ustr; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/misc/scopelock.hxx b/sd/inc/misc/scopelock.hxx new file mode 100644 index 0000000000..544bb5873f --- /dev/null +++ b/sd/inc/misc/scopelock.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ + +class ScopeLock +{ + friend class ScopeLockGuard; +public: + ScopeLock() : mnLock(0) {} + bool isLocked() const { return mnLock != 0; } +private: + void lock() { mnLock++; } + void unlock() { mnLock--; } + + sal_Int32 mnLock; +}; + +class ScopeLockGuard +{ +public: + ScopeLockGuard( ScopeLock& rScopeLock ) : mrScopeLock( rScopeLock ) { mrScopeLock.lock(); } + ~ScopeLockGuard() { mrScopeLock.unlock(); } +private: + ScopeLock& mrScopeLock; +}; + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/notifydocumentevent.hxx b/sd/inc/notifydocumentevent.hxx new file mode 100644 index 0000000000..11847a7f9e --- /dev/null +++ b/sd/inc/notifydocumentevent.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; + +void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName ); + +void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName, const css::uno::Reference< css::uno::XInterface >& xSource ); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/pageformatpanel.hrc b/sd/inc/pageformatpanel.hrc new file mode 100644 index 0000000000..7dd031314d --- /dev/null +++ b/sd/inc/pageformatpanel.hrc @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include + +#include + +#define NC_(Context, String) TranslateId(Context, u8##String) + +namespace sd +{ + +// To translators: this is a listbox labelled by "Margins:", inch units +const std::pair RID_PAGEFORMATPANEL_MARGINS_INCH[] = +{ + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "None"), 0 }, + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Narrow"), 0 }, + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Moderate"), 0 }, + // Normal (0.75") + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Normal (%1)"), 75 }, + // Normal (1") + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Normal (%1)"), 100 }, + // Normal (1.25") + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Normal (%1)"), 125 }, + { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Wide"), 0 } +}; + +// To translators: this is a listbox labelled by "Margins:", cm units +const std::pair RID_PAGEFORMATPANEL_MARGINS_CM[] = +{ + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "None"), 0 }, + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Narrow"), 0 }, + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Moderate"), 0 }, + // Normal (1.9 cm) + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Normal (%1)"), 190 }, + // Normal (2.54 cm) + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Normal (%1)"), 254 }, + // Normal (3.18 cm) + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Normal (%1)"), 318 }, + { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Wide"), 0 } +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/inc/pch/precompiled_sd.cxx b/sd/inc/pch/precompiled_sd.cxx new file mode 100644 index 0000000000..d681ebc7e6 --- /dev/null +++ b/sd/inc/pch/precompiled_sd.cxx @@ -0,0 +1,12 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "precompiled_sd.hxx" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/pch/precompiled_sd.hxx b/sd/inc/pch/precompiled_sd.hxx new file mode 100644 index 0000000000..44aba021a6 --- /dev/null +++ b/sd/inc/pch/precompiled_sd.hxx @@ -0,0 +1,631 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/* + This file has been autogenerated by update_pch.sh. It is possible to edit it + manually (such as when an include file has been moved/renamed/removed). All such + manual changes will be rewritten by the next run of update_pch.sh (which presumably + also fixes all possible problems, so it's usually better to use it). + + Generated on 2023-01-10 23:30:40 using: + ./bin/update_pch sd sd --cutoff=4 --exclude:system --exclude:module --include:local + + If after updating build fails, use the following command to locate conflicting headers: + ./bin/update_pch_bisect ./sd/inc/pch/precompiled_sd.hxx "make sd.build" --find-conflicts +*/ + +#include +#if PCH_LEVEL >= 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 1 +#if PCH_LEVEL >= 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 2 +#if PCH_LEVEL >= 3 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 3 +#if PCH_LEVEL >= 4 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 4 + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/pch/precompiled_sdui.cxx b/sd/inc/pch/precompiled_sdui.cxx new file mode 100644 index 0000000000..0471b10db7 --- /dev/null +++ b/sd/inc/pch/precompiled_sdui.cxx @@ -0,0 +1,12 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "precompiled_sdui.hxx" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/pch/precompiled_sdui.hxx b/sd/inc/pch/precompiled_sdui.hxx new file mode 100644 index 0000000000..00b2c8389d --- /dev/null +++ b/sd/inc/pch/precompiled_sdui.hxx @@ -0,0 +1,530 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/* + This file has been autogenerated by update_pch.sh. It is possible to edit it + manually (such as when an include file has been moved/renamed/removed). All such + manual changes will be rewritten by the next run of update_pch.sh (which presumably + also fixes all possible problems, so it's usually better to use it). + + Generated on 2023-07-19 09:28:08 using: + ./bin/update_pch sd sdui --cutoff=4 --exclude:system --include:module --include:local + + If after updating build fails, use the following command to locate conflicting headers: + ./bin/update_pch_bisect ./sd/inc/pch/precompiled_sdui.hxx "make sd.build" --find-conflicts +*/ + +#include +#if PCH_LEVEL >= 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 1 +#if PCH_LEVEL >= 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 2 +#if PCH_LEVEL >= 3 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 3 +#if PCH_LEVEL >= 4 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // PCH_LEVEL >= 4 + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/pglink.hxx b/sd/inc/pglink.hxx new file mode 100644 index 0000000000..5d4a314517 --- /dev/null +++ b/sd/inc/pglink.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdPage; + +class SdPageLink final : public ::sfx2::SvBaseLink +{ + SdPage* pPage; + +public: + SdPageLink(SdPage* pPg, const OUString& rFileName, const OUString& rBookmarkName); + virtual ~SdPageLink() override; + + virtual void Closed() override; + virtual ::sfx2::SvBaseLink::UpdateResult DataChanged( + const OUString& rMimeType, const css::uno::Any & rValue ) override; + void Connect() { SvBaseLink::GetRealObject(); } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/pres.hxx b/sd/inc/pres.hxx new file mode 100644 index 0000000000..ab2b44adf6 --- /dev/null +++ b/sd/inc/pres.hxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +enum class PresObjKind +{ + NONE = 0, + Title, + Outline, + Text, + Graphic, + Object, + Chart, + OrgChart, + Table, + Page, + Handout, + Notes, + Header, + Footer, + DateTime, + SlideNumber, + Calc, + Media, + LAST = Media +}; + +enum class PageKind +{ + Standard, + Notes, + Handout, + LAST = Handout +}; + +enum class EditMode +{ + Page, + MasterPage +}; + +enum class DocumentType +{ + Impress, + Draw +}; + +enum NavigatorDragType +{ + NAVIGATOR_DRAGTYPE_NONE, + NAVIGATOR_DRAGTYPE_URL, + NAVIGATOR_DRAGTYPE_LINK, + NAVIGATOR_DRAGTYPE_EMBEDDED +}; +#define NAVIGATOR_DRAGTYPE_COUNT 4 + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/prlayout.hxx b/sd/inc/prlayout.hxx new file mode 100644 index 0000000000..7cf768eae8 --- /dev/null +++ b/sd/inc/prlayout.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +/************************************************************************* +|* Contained once the class SdPresentationLayoutDlg (not needed anymore). +|* This file disappeared in a mysterious way from the PVCS. It is newly +|* checked in and does only contain the enumerator. +\************************************************************************/ + +#pragma once + +enum class PresentationObjects +{ + Title, + Background, + BackgroundObjects, + Outline_1, + Outline_2, + Outline_3, + Outline_4, + Outline_5, + Outline_6, + Outline_7, + Outline_8, + Outline_9, + Notes, + Subtitle +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/randomnode.hxx b/sd/inc/randomnode.hxx new file mode 100644 index 0000000000..6bccc738b7 --- /dev/null +++ b/sd/inc/randomnode.hxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +#include "sddllapi.h" + +namespace sd +{ +SD_DLLPUBLIC css::uno::Reference +RandomAnimationNode_createInstance(sal_Int16 nPresetClass); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/resltn.hxx b/sd/inc/resltn.hxx new file mode 100644 index 0000000000..cac2602b69 --- /dev/null +++ b/sd/inc/resltn.hxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +enum PublishingFormat +{ + FORMAT_GIF, + FORMAT_JPG, + FORMAT_PNG +}; + +enum PublishingScript +{ + SCRIPT_ASP, + SCRIPT_PERL +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdabstdlg.hxx b/sd/inc/sdabstdlg.hxx new file mode 100644 index 0000000000..594602af25 --- /dev/null +++ b/sd/inc/sdabstdlg.hxx @@ -0,0 +1,201 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "prlayout.hxx" +#include "pres.hxx" +#include "sddllapi.h" + +namespace sd { + class View; + class ViewShell; + class DrawDocShell; + class DrawView; +} + +class SfxObjectShell; +class SvxFieldData; +class GDIMetaFile; +class SdDrawDocument; +class SfxMedium; +class SdrObject; +class SfxStyleSheetBasePool; +class SfxStyleSheetBase; +class SdrModel; +class SdrView; +class Bitmap; +class SdPage; +class SdCustomShowList; +class SfxAbstractDialog; +class SfxAbstractTabDialog; + +class AbstractCopyDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractCopyDlg() override = default; +public: + virtual void GetAttr( SfxItemSet& rOutAttrs ) = 0; +}; + +class AbstractSdCustomShowDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdCustomShowDlg() override = default; +public: + virtual bool IsCustomShow() const = 0; +}; + +class AbstractSdModifyFieldDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdModifyFieldDlg() override = default; +public: + virtual SvxFieldData* GetField() = 0; + virtual SfxItemSet GetItemSet() = 0; +}; + +class AbstractSdSnapLineDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdSnapLineDlg() override = default; +public: + virtual void GetAttr(SfxItemSet& rOutAttrs) = 0; + virtual void HideRadioGroup() = 0; + virtual void HideDeleteBtn() = 0; + virtual void SetInputFields(bool bEnableX, bool bEnableY) = 0; + virtual void SetText( const OUString& rStr ) = 0; +}; + +class AbstractSdInsertLayerDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdInsertLayerDlg() override = default; +public: + virtual void GetAttr( SfxItemSet& rOutAttrs ) = 0; + virtual void SetHelpId( const OUString& rHelpId ) = 0; +}; + +class AbstractSdInsertPagesObjsDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdInsertPagesObjsDlg() override = default; +public: + virtual std::vector GetList ( const sal_uInt16 nType ) = 0; + virtual bool IsLink() = 0; + virtual bool IsRemoveUnnecessaryMasterPages() const = 0; +}; + +class AbstractMorphDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractMorphDlg() override = default; +public: + virtual void SaveSettings() const = 0; + virtual sal_uInt16 GetFadeSteps() const = 0; + virtual bool IsAttributeFade() const = 0; + virtual bool IsOrientationFade() const = 0; +}; + +class AbstractSdStartPresDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdStartPresDlg() override = default; +public: + virtual void GetAttr( SfxItemSet& rOutAttrs ) = 0; +}; + +class AbstractSdPresLayoutDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdPresLayoutDlg() override = default; +public: + virtual void GetAttr(SfxItemSet& rOutAttrs) = 0; +}; + +class AbstractSdVectorizeDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractSdVectorizeDlg() override = default; +public: + virtual const GDIMetaFile& GetGDIMetaFile() const = 0; +}; + +class AbstractHeaderFooterDialog : public VclAbstractDialog +{ +protected: + virtual ~AbstractHeaderFooterDialog() override = default; +}; + +class SdAbstractDialogFactory +{ +public: + SD_DLLPUBLIC static SdAbstractDialogFactory* Create(); + + virtual VclPtr CreateSvxBulletAndPositionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) = 0; + virtual VclPtr CreateBreakDlg(weld::Window* pWindow, ::sd::DrawView* pDrView, ::sd::DrawDocShell* pShell, sal_uLong nSumActionCount, sal_uLong nObjCount ) = 0; + virtual VclPtr CreateCopyDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View* pView ) = 0; + virtual VclPtr CreateSdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc) = 0; + virtual VclPtr CreateSdTabCharDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell) = 0; + virtual VclPtr CreateSdTabPageDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage, bool bIsImpressDoc) = 0; + virtual VclPtr CreateSdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) = 0; + virtual VclPtr CreateSdSnapLineDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) = 0; + virtual VclPtr CreateSdInsertLayerDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, bool bDeletable, const OUString& rStr) = 0; + virtual VclPtr CreateSdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName) = 0; + virtual VclPtr CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) = 0; + virtual VclPtr CreateSdOutlineBulletTabDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) = 0; + virtual VclPtr CreateSdParagraphTabDlg(weld::Window* pWindow, const SfxItemSet* pAttr) = 0; + virtual VclPtr CreateSdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, + const std::vector &rPageNames, SdCustomShowList* pCSList ) = 0; + virtual VclPtr CreateRemoteDialog(weld::Window* pWindow) = 0; + virtual VclPtr CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, bool bBackgroundDlg, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) = 0; + virtual VclPtr CreateSdPresLayoutDlg(weld::Window* pParent, ::sd::DrawDocShell* pDocShell, const SfxItemSet& rInAttrs) = 0; + virtual VclPtr CreateSdTabTemplateDlg(weld::Window* pParent, const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView) = 0; + virtual VclPtr CreatSdActionDialog(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) = 0; + virtual VclPtr CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) = 0; + + virtual VclPtr CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage*) = 0; + + virtual VclPtr CreateHeaderFooterDialog(sd::ViewShell* pViewShell, + weld::Window* pParent, + SdDrawDocument* pDoc, + SdPage* pCurrentPage) = 0; + + virtual CreateTabPage GetSdOptionsContentsTabPageCreatorFunc() = 0; + virtual CreateTabPage GetSdPrintOptionsTabPageCreatorFunc() = 0; + virtual CreateTabPage GetSdOptionsMiscTabPageCreatorFunc() = 0; + virtual CreateTabPage GetSdOptionsSnapTabPageCreatorFunc() = 0; + + virtual VclPtr CreateSdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pDoc) = 0; + +protected: + ~SdAbstractDialogFactory() {} +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdattr.hrc b/sd/inc/sdattr.hrc new file mode 100644 index 0000000000..f431dea4f6 --- /dev/null +++ b/sd/inc/sdattr.hrc @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdOptionsPrintItem; +class SfxInt32Item; +class SfxStringItem; +class SfxUInt32Item; +class XColorItem; + +// Layer attributes +#define ATTR_LAYER_START SID_SD_START + 1234 +#define ATTR_LAYER_NAME TypedWhichId(ATTR_LAYER_START) +#define ATTR_LAYER_VISIBLE ATTR_LAYER_START + 1 +#define ATTR_LAYER_PRINTABLE ATTR_LAYER_START + 2 +#define ATTR_LAYER_LOCKED ATTR_LAYER_START + 3 +#define ATTR_LAYER_THISPAGE ATTR_LAYER_START + 4 +#define ATTR_LAYER_TITLE TypedWhichId(ATTR_LAYER_START + 5) +#define ATTR_LAYER_DESC TypedWhichId(ATTR_LAYER_START + 6) +#define ATTR_LAYER_END ATTR_LAYER_DESC + +// presentation attributes +#define ATTR_PRESENT_START ATTR_LAYER_END + 1 +#define ATTR_PRESENT_ALL ATTR_PRESENT_START +#define ATTR_PRESENT_CUSTOMSHOW ATTR_PRESENT_START + 1 +#define ATTR_PRESENT_DIANAME TypedWhichId(ATTR_PRESENT_START + 2) +#define ATTR_PRESENT_ENDLESS ATTR_PRESENT_START + 3 +#define ATTR_PRESENT_MANUEL ATTR_PRESENT_START + 4 +#define ATTR_PRESENT_MOUSE ATTR_PRESENT_START + 5 +#define ATTR_PRESENT_PEN ATTR_PRESENT_START + 6 +#define ATTR_PRESENT_NAVIGATOR ATTR_PRESENT_START + 7 +#define ATTR_PRESENT_CHANGE_PAGE ATTR_PRESENT_START + 8 +#define ATTR_PRESENT_ALWAYS_ON_TOP ATTR_PRESENT_START + 9 +#define ATTR_PRESENT_FULLSCREEN ATTR_PRESENT_START + 10 +#define ATTR_PRESENT_ANIMATION_ALLOWED ATTR_PRESENT_START + 12 +#define ATTR_PRESENT_PAUSE_TIMEOUT TypedWhichId(ATTR_PRESENT_START + 13) +#define ATTR_PRESENT_SHOW_PAUSELOGO ATTR_PRESENT_START + 14 +#define ATTR_PRESENT_DISPLAY TypedWhichId(ATTR_PRESENT_START + 15) + +#define ATTR_PRESENT_END ATTR_PRESENT_DISPLAY + +// animation attributes +#define ATTR_ANIMATION_START ATTR_PRESENT_END + 1 +#define ATTR_ANIMATION_ACTIVE ATTR_ANIMATION_START +#define ATTR_ANIMATION_EFFECT TypedWhichId(ATTR_ANIMATION_START + 1) +#define ATTR_ANIMATION_SPEED TypedWhichId(ATTR_ANIMATION_START + 2) +#define ATTR_ANIMATION_INVISIBLE ATTR_ANIMATION_START + 3 +#define ATTR_ANIMATION_FADEOUT ATTR_ANIMATION_START + 4 +#define ATTR_ANIMATION_COLOR ATTR_ANIMATION_START + 5 +#define ATTR_ANIMATION_SOUNDON ATTR_ANIMATION_START + 6 +#define ATTR_ANIMATION_SOUNDFILE TypedWhichId(ATTR_ANIMATION_START + 7) +#define ATTR_ANIMATION_PLAYFULL ATTR_ANIMATION_START + 8 +#define ATTR_ANIMATION_TEXTEFFECT ATTR_ANIMATION_START + 10 +#define ATTR_ANIMATION_END ATTR_ANIMATION_TEXTEFFECT + +#define ATTR_ACTION_START ATTR_ANIMATION_END + 1 +#define ATTR_ACTION TypedWhichId(ATTR_ACTION_START) +#define ATTR_ACTION_EFFECT TypedWhichId(ATTR_ACTION_START + 1) +#define ATTR_ACTION_EFFECTSPEED TypedWhichId(ATTR_ACTION_START + 2) +#define ATTR_ACTION_FILENAME TypedWhichId(ATTR_ACTION_START + 3) +#define ATTR_ACTION_SOUNDON ATTR_ACTION_START + 4 +#define ATTR_ACTION_PLAYFULL ATTR_ACTION_START + 5 +#define ATTR_ACTION_END ATTR_ACTION_PLAYFULL + +#define ATTR_COPY_START ATTR_ACTION_END + 1 +#define ATTR_COPY_NUMBER TypedWhichId(ATTR_COPY_START) +#define ATTR_COPY_MOVE_X TypedWhichId(ATTR_COPY_START + 1) +#define ATTR_COPY_MOVE_Y TypedWhichId(ATTR_COPY_START + 2) +#define ATTR_COPY_ANGLE TypedWhichId(ATTR_COPY_START + 3) +#define ATTR_COPY_WIDTH TypedWhichId(ATTR_COPY_START + 4) +#define ATTR_COPY_HEIGHT TypedWhichId(ATTR_COPY_START + 5) +#define ATTR_COPY_START_COLOR TypedWhichId(ATTR_COPY_START + 6) +#define ATTR_COPY_END_COLOR TypedWhichId(ATTR_COPY_START + 7) +#define ATTR_COPY_END ATTR_COPY_END_COLOR + +#define ATTR_SNAPLINE_START ATTR_COPY_END + 1 +#define ATTR_SNAPLINE_KIND TypedWhichId(ATTR_SNAPLINE_START) +#define ATTR_SNAPLINE_X TypedWhichId(ATTR_SNAPLINE_START + 1) +#define ATTR_SNAPLINE_Y TypedWhichId(ATTR_SNAPLINE_START + 2) +#define ATTR_SNAPLINE_END ATTR_SNAPLINE_Y + +#define ATTR_OPTIONS_START ATTR_SNAPLINE_END + 1 +#define ATTR_OPTIONS_LAYOUT TypedWhichId(ATTR_OPTIONS_START + 1) +#define ATTR_OPTIONS_MISC TypedWhichId(ATTR_OPTIONS_START + 2) +#define ATTR_OPTIONS_SNAP TypedWhichId(ATTR_OPTIONS_START + 3) +#define ATTR_OPTIONS_PRINT TypedWhichId(ATTR_OPTIONS_START + 4) +#define ATTR_OPTIONS_END ATTR_OPTIONS_PRINT + +#define ATTR_OPTIONS_SCALE_START ATTR_OPTIONS_END + 1 +#define ATTR_OPTIONS_SCALE_X TypedWhichId(ATTR_OPTIONS_SCALE_START) +#define ATTR_OPTIONS_SCALE_Y TypedWhichId(ATTR_OPTIONS_SCALE_START + 1) +#define ATTR_OPTIONS_SCALE_WIDTH TypedWhichId(ATTR_OPTIONS_SCALE_START + 2) +#define ATTR_OPTIONS_SCALE_HEIGHT TypedWhichId(ATTR_OPTIONS_SCALE_START + 3) +#define ATTR_OPTIONS_SCALE_END ATTR_OPTIONS_SCALE_HEIGHT + +#define ATTR_PRESLAYOUT_START ATTR_OPTIONS_SCALE_END + 1 +#define ATTR_PRESLAYOUT_NAME TypedWhichId(ATTR_PRESLAYOUT_START) +#define ATTR_PRESLAYOUT_LOAD ATTR_PRESLAYOUT_START + 1 +#define ATTR_PRESLAYOUT_MASTER_PAGE TypedWhichId(ATTR_PRESLAYOUT_START + 2) +#define ATTR_PRESLAYOUT_CHECK_MASTERS ATTR_PRESLAYOUT_START + 3 +#define ATTR_PRESLAYOUT_END ATTR_PRESLAYOUT_CHECK_MASTERS + +// paragraph numbering attributes +#define ATTR_PARANUMBERING_START ATTR_PRESLAYOUT_END + 1 +#define ATTR_NUMBER_NEWSTART TypedWhichId(ATTR_PARANUMBERING_START) +#define ATTR_NUMBER_NEWSTART_AT TypedWhichId(ATTR_PARANUMBERING_START + 1) +#define ATTR_PARANUMBERING_END ATTR_NUMBER_NEWSTART_AT + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdattr.hxx b/sd/inc/sdattr.hxx new file mode 100644 index 0000000000..bff52726eb --- /dev/null +++ b/sd/inc/sdattr.hxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include "sdattr.hrc" + +// layer attributes +inline SfxStringItem makeSdAttrLayerName(const OUString& aStr) +{ + return SfxStringItem(ATTR_LAYER_NAME, aStr); +} + +inline SfxStringItem makeSdAttrLayerTitle(const OUString& aStr = OUString()) +{ + return SfxStringItem(ATTR_LAYER_TITLE, aStr); +} + +inline SfxStringItem makeSdAttrLayerDesc(const OUString& aStr = OUString()) +{ + return SfxStringItem(ATTR_LAYER_DESC, aStr); +} + +inline SfxBoolItem makeSdAttrLayerVisible(bool bValue = true) +{ + return SfxBoolItem(ATTR_LAYER_VISIBLE, bValue); +} + +inline SfxBoolItem makeSdAttrLayerPrintable(bool bValue = true) +{ + return SfxBoolItem(ATTR_LAYER_PRINTABLE, bValue); +} + +inline SfxBoolItem makeSdAttrLayerLocked(bool bValue = false) +{ + return SfxBoolItem(ATTR_LAYER_LOCKED, bValue); +} + +inline SfxBoolItem makeSdAttrLayerThisPage() { return SfxBoolItem(ATTR_LAYER_THISPAGE, false); } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdcgmfilter.hxx b/sd/inc/sdcgmfilter.hxx new file mode 100644 index 0000000000..6d5022f3c4 --- /dev/null +++ b/sd/inc/sdcgmfilter.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sdfilter.hxx" + +// SdCGMFilter +class SdCGMFilter final : public SdFilter +{ +public: + SdCGMFilter ( + SfxMedium& rMedium, + ::sd::DrawDocShell& rDocShell ); + virtual ~SdCGMFilter() override; + + bool Import(); + bool Export() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdcommands.h b/sd/inc/sdcommands.h new file mode 100644 index 0000000000..6100f99e4c --- /dev/null +++ b/sd/inc/sdcommands.h @@ -0,0 +1,26 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +inline constexpr OUString CMD_SID_HANDOUT_MASTER_MODE = u".uno:HandoutMode"_ustr; +inline constexpr OUString CMD_SID_NOTES_MODE = u".uno:NotesMode"_ustr; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sddll.hxx b/sd/inc/sddll.hxx new file mode 100644 index 0000000000..7f1258500e --- /dev/null +++ b/sd/inc/sddll.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sddllapi.h" + +class SdModule; + +/************************************************************************* +|* +|* This class is a wrapper for a Load-On-Demand-DLL. One instance +|* per SfxApplication will be created for the runtime of +|* SfxApplication-subclass::Main(). +|* +|* Remember: Do export this class! It is used by the application. +|* +\************************************************************************/ + +class SD_DLLPUBLIC SdDLL final +{ +#ifdef ENABLE_SDREMOTE + static void RegisterRemotes(); +#endif + static void RegisterFactorys(); + static void RegisterInterfaces(const SdModule* pMod); + static void RegisterControllers(SdModule* pMod); + +public: + // Ctor/Dtor must be linked to the application + SdDLL(); + ~SdDLL(); + + // DLL-init/exit-code must be linked to the DLL only + static void Init(); // called directly after loading the DLL +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sddllapi.h b/sd/inc/sddllapi.h new file mode 100644 index 0000000000..d8d4e1938b --- /dev/null +++ b/sd/inc/sddllapi.h @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#if defined(SD_DLLIMPLEMENTATION) +#define SD_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define SD_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdenumdef.hxx b/sd/inc/sdenumdef.hxx new file mode 100644 index 0000000000..bd04c67a9e --- /dev/null +++ b/sd/inc/sdenumdef.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#define RET_SNAP_DELETE 111 + +enum class SnapKind +{ + Horizontal, + Vertical, + Point +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sderror.hxx b/sd/inc/sderror.hxx new file mode 100644 index 0000000000..850d10fbec --- /dev/null +++ b/sd/inc/sderror.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +// Import errors +#define ERR_FORMAT_ROWCOL ErrCode(ErrCodeArea::Sd, ErrCodeClass::Read, 1) +#define ERR_FORMAT_FILE_ROWCOL ErrCode(ErrCodeArea::Sd, ErrCodeClass::Read, 2) + +// Warnings +#define WARN_FORMAT_FILE_ROWCOL ErrCode(WarningFlag::Yes, ErrCodeArea::Sd, ErrCodeClass::Read, 100) + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdfilter.hxx b/sd/inc/sdfilter.hxx new file mode 100644 index 0000000000..1a8c8b6739 --- /dev/null +++ b/sd/inc/sdfilter.hxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include "sddllapi.h" +#include + +namespace osl { class Module; } +namespace sd { class DrawDocShell; } +class SdDrawDocument; +class SfxMedium; +class SfxObjectShell; +class SotStorage; +class SvMemoryStream; + +class SdFilter +{ +public: + SdFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ); + virtual ~SdFilter(); + + bool IsDraw() const { return mbIsDraw; } + virtual bool Export() = 0; + +protected: + css::uno::Reference< css::frame::XModel > mxModel; + css::uno::Reference< css::task::XStatusIndicator > mxStatusIndicator; + + SfxMedium& mrMedium; + ::sd::DrawDocShell& mrDocShell; + SdDrawDocument& mrDocument; + bool mbIsDraw : 1; + void CreateStatusIndicator(); +}; + +SD_DLLPUBLIC bool ExportPPT( const std::vector< css::beans::PropertyValue >& rMediaData, + tools::SvRef const & rSvStorage, + css::uno::Reference< css::frame::XModel > const & rXModel, + css::uno::Reference< css::task::XStatusIndicator > const & rXStatInd, + SvMemoryStream* pVBA, + sal_uInt32 nCnvrtFlags ); + +// exported function +SD_DLLPUBLIC bool ImportPPT( + SdDrawDocument* pDocument, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMedium ); + +SD_DLLPUBLIC bool SaveVBA( SfxObjectShell& rDocShell, SvMemoryStream*& pBas ); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdgrffilter.hxx b/sd/inc/sdgrffilter.hxx new file mode 100644 index 0000000000..28ce9de6dd --- /dev/null +++ b/sd/inc/sdgrffilter.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sdfilter.hxx" +class ErrCode; + +// SdCGMFilter +class SdGRFFilter final : public SdFilter +{ +public: + SdGRFFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell); + + virtual ~SdGRFFilter() override; + + bool Import(); + bool Export() override; + + static void HandleGraphicFilterError(ErrCode nFilterError, ErrCode nStreamError); + static void InsertSdrGrafObj(Graphic pGraphic, SdPage* pPage); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdhtmlfilter.hxx b/sd/inc/sdhtmlfilter.hxx new file mode 100644 index 0000000000..84b9c5d48e --- /dev/null +++ b/sd/inc/sdhtmlfilter.hxx @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sdfilter.hxx" + +// SdHTMLFilter +class SdHTMLFilter final : public SdFilter +{ +public: + SdHTMLFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell); + virtual ~SdHTMLFilter() override; + + virtual bool Export() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdiocmpt.hxx b/sd/inc/sdiocmpt.hxx new file mode 100644 index 0000000000..9f1395fd7c --- /dev/null +++ b/sd/inc/sdiocmpt.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "sddllapi.h" + + +class old_SdrDownCompat +{ +protected: + SvStream& rStream; + sal_uInt32 nSubRecSiz; + sal_uInt32 nSubRecPos; + StreamMode nMode; + bool bOpen; + +protected: + void Write(); + +public: + old_SdrDownCompat(SvStream& rNewStream, StreamMode nNewMode); + ~old_SdrDownCompat(); + void OpenSubRecord(); + void CloseSubRecord(); +}; + +#define SDIOCOMPAT_VERSIONDONTKNOW sal_uInt16(0xffff) + +class SD_DLLPUBLIC SdIOCompat : public old_SdrDownCompat +{ +public: + // nNewMode: StreamMode::READ or StreamMode::WRITE + // nVer: specify only when writing + SdIOCompat(SvStream& rNewStream, StreamMode nNewMode, + sal_uInt16 nVer = SDIOCOMPAT_VERSIONDONTKNOW); + ~SdIOCompat(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdmod.hxx b/sd/inc/sdmod.hxx new file mode 100644 index 0000000000..e1a2c51b64 --- /dev/null +++ b/sd/inc/sdmod.hxx @@ -0,0 +1,186 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "glob.hxx" +#include "pres.hxx" + +#include +#include "sddllapi.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SdOptions; +class SvxSearchItem; +class EditFieldInfo; +class SdTransferable; +class SvNumberFormatter; +class SfxErrorHandler; +class SfxFrame; +class VclSimpleEvent; +namespace svtools { class ColorConfig; } +enum class SdrObjKind : sal_uInt16; + +namespace com::sun::star::frame { + class XFrame; +} + +enum class SdOptionStreamMode +{ + Load = 0, + Store = 1 +}; + +struct SdExtPropertySetInfoCacheCompare +{ + bool operator()(const std::span& lhs, const std::span& rhs) const + { + return lhs.data() < rhs.data(); + } +}; +typedef std::map< + std::span, + css::uno::Reference, + SdExtPropertySetInfoCacheCompare > SdExtPropertySetInfoCache; +typedef std::map< SdrObjKind, css::uno::Sequence< css::uno::Type> > SdTypesCache; + +/* + + This subclass of (which is a subclass of ) is + linked to the DLL. One instance of this class exists while the DLL is + loaded. + + SdModule is like to be compared with the -subclass. + + Remember: Don`t export this class! It uses DLL-internal symbols. + +*/ + +class SAL_DLLPUBLIC_RTTI SdModule final : public SfxModule, public SfxListener +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDAPP) + DECL_DLLPRIVATE_LINK( CalcFieldValueHdl, EditFieldInfo*, void ); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + SdModule(SfxObjectFactory* pDrawObjFact, SfxObjectFactory* pGraphicObjFact); + virtual ~SdModule() override; + + SdTransferable* pTransferClip; + SdTransferable* pTransferDrag; + SdTransferable* pTransferSelection; + + void Execute(SfxRequest& rReq); + void GetState(SfxItemSet&); + + SdOptions* GetSdOptions(DocumentType eDocType); + SD_DLLPUBLIC tools::SvRef GetOptionStream( std::u16string_view rOptionName, SdOptionStreamMode eMode ); + + bool GetWaterCan() const { return bWaterCan; } + void SetWaterCan( bool bWC ) { bWaterCan = bWC; } + + SvxSearchItem* GetSearchItem() { return pSearchItem.get(); } + void SetSearchItem(std::unique_ptr pItem); + + /** Return the virtual device that can be used for printer independent + layout. + @return + The returned pointer is NULL when the device could not be + created when this modules was instantiated. + */ + OutputDevice* GetVirtualRefDevice() { return mpVirtualRefDevice;} + + SD_DLLPUBLIC SvNumberFormatter* GetNumberFormatter(); + + // virtual methods for the option dialog + virtual std::optional CreateItemSet( sal_uInt16 nId ) override; + virtual void ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet ) override; + virtual std::unique_ptr CreateTabPage( sal_uInt16 nId, weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet ) override; + virtual std::optional CreateStyleFamilies() override; + + SdExtPropertySetInfoCache gImplImpressPropertySetInfoCache; + SdExtPropertySetInfoCache gImplDrawPropertySetInfoCache; + SdTypesCache gImplTypesCache; + + svtools::ColorConfig& GetColorConfig(); + +private: + + SdOptions* pImpressOptions; + SdOptions* pDrawOptions; + std::unique_ptr pSearchItem; + std::unique_ptr pNumberFormatter; + tools::SvRef xOptionStorage; + bool bWaterCan; + std::unique_ptr mpErrorHdl; + /** This device is used for printer independent layout. It is virtual + in the sense that it does not represent a printer. The pointer may + be NULL when the virtual device could not be created. + */ + VclPtr< VirtualDevice > mpVirtualRefDevice; + + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + SfxFrame* ExecuteNewDocument( SfxRequest const & rReq ); + + static SfxFrame* CreateEmptyDocument( const css::uno::Reference< css::frame::XFrame >& i_rFrame ); + static SfxFrame* CreateFromTemplate(const OUString& rTemplatePath, + const css::uno::Reference& i_rFrame, + const bool bReplaceable); + + bool mbEventListenerAdded; + + /** Take an outline from a text document and create a new impress + document according to the structure of the outline. + @param rRequest + This typically is the unmodified request from an execute() + function from where this function is called. + */ + static bool OutlineToImpress(SfxRequest const & rRequest); + + /** Add an eventlistener as soon as possible in sd, allows to use + remote devices to start the slideshow elegantly, and respecting + portability + @EventListenerHdl + The event listener handler + @VclSimpleEvent * + a pointer to a VCLSimpleEvent (see vcl/vclevent.hxx ) + */ + DECL_DLLPRIVATE_STATIC_LINK( SdModule, EventListenerHdl, VclSimpleEvent&, void ); + + std::unique_ptr mpColorConfig; +}; + +#define SD_MOD() ( static_cast(SfxApplication::GetModule(SfxToolsModule::Draw)) ) + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdpage.hxx b/sd/inc/sdpage.hxx new file mode 100644 index 0000000000..ef127ea607 --- /dev/null +++ b/sd/inc/sdpage.hxx @@ -0,0 +1,405 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SD_INC_SDPAGE_HXX +#define INCLUDED_SD_INC_SDPAGE_HXX + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "diadef.h" +#include "pres.hxx" +#include "shapelist.hxx" +#include "misc/scopelock.hxx" +#include "sddllapi.h" + +namespace com::sun::star::animations { + class XAnimationNode; +} + +class SfxStyleSheet; +class SdDrawDocument; +class SdrTextObj; +class SdPageLink; +class SfxItemSet; +class Paragraph; +class Outliner; +class SdStyleSheet; +class Graphic; + +namespace sd +{ + class MainSequence; + class Annotation; +} + +namespace sd { + + struct SD_DLLPUBLIC HeaderFooterSettings + { + bool mbHeaderVisible; + OUString maHeaderText; + + bool mbFooterVisible; + OUString maFooterText; + + bool mbSlideNumberVisible; + + bool mbDateTimeVisible; + bool mbDateTimeIsFixed; + OUString maDateTimeText; + SvxDateFormat meDateFormat; + SvxTimeFormat meTimeFormat; + + HeaderFooterSettings(); + + bool operator==( const HeaderFooterSettings& rSettings ) const; + }; + + typedef std::vector< rtl::Reference< Annotation > > AnnotationVector; +} + +namespace sd { + class UndoAnimation; + class UndoTransition; + class UndoGeoObject; + class UndoAttrObject; +} + +class SD_DLLPUBLIC SdPage final : public FmFormPage, public SdrObjUserCall +{ + SdPage& operator=(const SdPage&) = delete; + SdPage(const SdPage&) = delete; + +friend class SdGenericDrawPage; +friend class SdDrawPage; +friend class sd::UndoAnimation; +friend class sd::UndoTransition; +friend class ModifyPageUndoAction; +friend class sd::UndoGeoObject; +friend class sd::UndoAttrObject; + + PageKind mePageKind; ///< page type + AutoLayout meAutoLayout; ///< AutoLayout + sd::ShapeList maPresentationShapeList;///< presentation objects + sd::ScopeLock maLockAutoLayoutArrangement; + bool mbSelected; ///< selection identifier + PresChange mePresChange; ///< manual / automatic / semi automatic + double mfTime; ///< Display time in seconds + bool mbSoundOn; ///< with / without sound. + bool mbExcluded; ///< will (not) be displayed during show. + OUString maLayoutName; ///< Name of the layout + OUString maSoundFile; ///< Path to sound file (MS-DOS notation). + bool mbLoopSound; + bool mbStopSound; + OUString maCreatedPageName; ///< generated page name by GetPageName. + OUString maFileName; ///< file name. + OUString maBookmarkName; ///< Bookmark name. + bool mbScaleObjects; ///< Objects should be scaled + rtl_TextEncoding meCharSet; ///< Text encoding + sal_uInt16 mnPaperBin; ///< PaperBin + SdPageLink* mpPageLink; ///< Page link (at left sides only) + + sd::AnnotationVector maAnnotations; + + /** holds the smil animation sequences for this page */ + css::uno::Reference< css::animations::XAnimationNode > mxAnimationNode; + + /** a helper class to manipulate effects inside the main sequence */ + std::shared_ptr< sd::MainSequence > mpMainSequence; + + virtual css::uno::Reference< css::uno::XInterface > createUnoPage() override; + + std::unique_ptr mpItems; + + SfxItemSet* getOrCreateItems(); + + sd::HeaderFooterSettings maHeaderFooterSettings; + + // new transition settings + sal_Int16 mnTransitionType; + sal_Int16 mnTransitionSubtype; + bool mbTransitionDirection; + sal_Int32 mnTransitionFadeColor; + double mfTransitionDuration; + + void lateInit(const SdPage& rSrcPage); + +public: + + SdPage(SdDrawDocument& rNewDoc, bool bMasterPage); + virtual ~SdPage() override; + + virtual rtl::Reference CloneSdrPage(SdrModel& rTargetModel) const override; + + virtual void SetSize(const Size& aSize) override; + virtual void SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 Lwr) override; + virtual void SetLeftBorder(sal_Int32 nBorder) override; + virtual void SetRightBorder(sal_Int32 nBorder) override; + virtual void SetUpperBorder(sal_Int32 nBorder) override; + virtual void SetLowerBorder(sal_Int32 nBorder) override; + virtual bool IsReadOnly() const override; + + sd::ShapeList& GetPresentationShapeList() { return maPresentationShapeList; } + + void EnsureMasterPageDefaultBackground(); + SdrObject* CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect); + rtl::Reference CreateDefaultPresObj(PresObjKind eObjKind); + void DestroyDefaultPresObj(PresObjKind eObjKind); + SdrObject* GetPresObj(PresObjKind eObjKind, int nIndex = 1, bool bFuzzySearch = false ); + PresObjKind GetPresObjKind(SdrObject* pObj) const; + OUString GetPresObjText(PresObjKind eObjKind) const; + SfxStyleSheet* GetStyleSheetForMasterPageBackground() const; + SfxStyleSheet* GetStyleSheetForPresObj(PresObjKind eObjKind) const; + sal_Int64 GetHashCode() const; + bool RestoreDefaultText( SdrObject* pObj ); + + /** @return true if the given SdrObject is inside the presentation object list */ + bool IsPresObj(const SdrObject* pObj); + + /** removes the given SdrObject from the presentation object list */ + void RemovePresObj(const SdrObject* pObj); + + /** inserts the given SdrObject into the presentation object list */ + void InsertPresObj(SdrObject* pObj, PresObjKind eKind ); + + void SetAutoLayout(AutoLayout eLayout, bool bInit=false, bool bCreate=false); + AutoLayout GetAutoLayout() const { return meAutoLayout; } + void CreateTitleAndLayout(bool bInit=false, bool bCreate=false); + SdrObject* InsertAutoLayoutShape(SdrObject* pObj, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, bool bInit); + + virtual void NbcInsertObject(SdrObject* pObj, size_t nPos=SAL_MAX_SIZE) override; + virtual rtl::Reference NbcRemoveObject(size_t nObjNum) override; + virtual rtl::Reference RemoveObject(size_t nObjNum) override; + + /** Also override ReplaceObject methods to realize when + objects are removed with this mechanism instead of RemoveObject*/ + virtual rtl::Reference ReplaceObject(SdrObject* pNewObj, size_t nObjNum) override; + + void SetObjText(SdrTextObj* pObj, SdrOutliner* pOutliner, PresObjKind eObjKind, std::u16string_view rStr ); + + void SetPageKind(PageKind ePgType) { mePageKind = ePgType; } + PageKind GetPageKind() const { return mePageKind; } + + void SetSelected(bool bSel) { mbSelected = bSel; } + bool IsSelected() const { return mbSelected; } + + void SetFadeEffect(css::presentation::FadeEffect eNewEffect); + css::presentation::FadeEffect GetFadeEffect() const; + + void SetPresChange(PresChange eChange) { mePresChange = eChange; } + PresChange GetPresChange() const { return mePresChange; } + + void SetTime(double fNewTime) { mfTime = fNewTime; } + double GetTime() const { return mfTime; } + + void SetSound(bool bNewSoundOn) { mbSoundOn = bNewSoundOn; } + bool IsSoundOn() const { return mbSoundOn; } + + void SetExcluded(bool bNewExcluded) { mbExcluded = bNewExcluded; } + bool IsExcluded() const { return mbExcluded; } + + bool IsScaleObjects() const { return mbScaleObjects; } + + void SetSoundFile(const OUString& rStr) { maSoundFile = rStr; } + const OUString& GetSoundFile() const { return maSoundFile; } + + void SetLoopSound( bool bLoopSound ) { mbLoopSound = bLoopSound; } + bool IsLoopSound() const { return mbLoopSound; } + + void SetStopSound( bool bStopSound ) { mbStopSound = bStopSound; } + bool IsStopSound() const { return mbStopSound; } + + sal_Int16 getTransitionType() const { return mnTransitionType;} + void setTransitionType( sal_Int16 nTransitionType ); + + sal_Int16 getTransitionSubtype() const { return mnTransitionSubtype;} + void setTransitionSubtype( sal_Int16 nTransitionSubtype ); + + bool getTransitionDirection() const { return mbTransitionDirection;} + void setTransitionDirection( bool bTransitionbDirection ); + + sal_Int32 getTransitionFadeColor() const { return mnTransitionFadeColor;} + void setTransitionFadeColor( sal_Int32 nTransitionFadeColor ); + + double getTransitionDuration() const { return mfTransitionDuration;} + void setTransitionDuration( double fTransitionDuration ); + + virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, + const ::tools::Rectangle& rOldBoundRect) override; + + void SetLayoutName(const OUString& aName); + virtual OUString GetLayoutName() const override { return maLayoutName; } + + void SetFileName(const OUString& aName) { maFileName = aName; } + const OUString& GetFileName() const { return maFileName; } + void SetBookmarkName(const OUString& aName) { maBookmarkName = aName; } + const OUString& GetBookmarkName() const { return maBookmarkName; } + + void ConnectLink(); + void DisconnectLink(); + + void ScaleObjects(const Size& rNewPageSize, const ::tools::Rectangle& rNewBorderRect, + bool bScaleAllObj); + + const OUString& GetName() const; + OUString const & GetRealName() const { return FmFormPage::GetName(); }; + + void SetPresentationLayout(std::u16string_view rLayoutName, + bool bReplaceStyleSheets = true, + bool bSetMasterPage = true, + bool bReverseOrder = false); + void EndListenOutlineText(); + + void SetPaperBin(sal_uInt16 nBin) { mnPaperBin = nBin; } + sal_uInt16 GetPaperBin() const { return mnPaperBin; } + virtual void SetOrientation(Orientation eOrient) override; + virtual Orientation GetOrientation() const override; + + virtual SfxStyleSheet* GetTextStyleSheetForObject( SdrObject* pObj ) const override; + + bool setAlienAttributes( const css::uno::Any& rAttributes ); + void getAlienAttributes( css::uno::Any& rAttributes ); + + /** @return the main animation node + + @throws css::uno::RuntimeException + */ + css::uno::Reference< css::animations::XAnimationNode > const & getAnimationNode(); + + /** sets the main animation node + + @throws css::uno::RuntimeException + */ + void setAnimationNode( css::uno::Reference< css::animations::XAnimationNode > const & xNode ); + + /// @return a helper class to manipulate effects inside the main sequence + std::shared_ptr< sd::MainSequence > const & getMainSequence(); + + /** quick check if this slide has an animation node. + This can be used to have a cost free check if there are no animations ad this slide. + If it returns true this does not mean that there are animations available. + */ + bool hasAnimationNode() const; + + /// @return the SdPage implementation for the given XDrawPage or 0 if not available + static SdPage* getImplementation( const css::uno::Reference< css::drawing::XDrawPage >& xPage ); + + /** removes all custom animations for the given shape */ + void removeAnimations( const SdrObject* pObj ); + + /** Notify that the object has been renamed and the animation effects has to update. */ + void notifyObjectRenamed(const SdrObject* pObj); + + /** Set the name of the page and broadcast a model change. + */ + void SetName (const OUString& rName); + + const sd::HeaderFooterSettings& getHeaderFooterSettings() const; + void setHeaderFooterSettings( const sd::HeaderFooterSettings& rNewSettings ); + + /** + @return true if the object from the ViewObjectContact should + be visible on this page while rendering. + + bEdit selects if visibility test is for an editing view or a final render, + like printing. + */ + virtual bool checkVisibility( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + bool bEdit ) override; + + /** callback from the sd::View when a new paragraph for one object on this page is created */ + void onParagraphInserted( const ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj ); + + /** callback from the sd::View when a paragraph from one object on this page is removed */ + void onParagraphRemoving( const ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj ); + + /** callback from the sd::View when an object just left text edit mode */ + void onEndTextEdit( SdrObject* pObj ); + + /** @return the presentation style with the given helpid from this masterpage or this + slides masterpage */ + SdStyleSheet* getPresentationStyle( sal_uInt32 nHelpId ) const; + + /** removes all empty presentation objects from this slide */ + void RemoveEmptyPresentationObjects(); + + ::tools::Rectangle GetTitleRect() const; + ::tools::Rectangle GetLayoutRect() const; + + static void CalculateHandoutAreas( SdDrawDocument& rModel, AutoLayout eLayout, bool bHorizontal, std::vector< ::tools::Rectangle >& rAreas ); + + /** Set the "precious" flag to the given value. + */ + void SetPrecious (const bool bIsPrecious); + + /** The "precious" flag is used for master pages to prevent some unused + master pages from being deleted automatically. For pages + other than master pages this flag can be ignored. + @return + When this method returns for a master page then this + master page should not be deleted automatically. + */ + bool IsPrecious() const { return mbIsPrecious; } + + void createAnnotation( rtl::Reference< sd::Annotation >& xAnnotation ); + void addAnnotation( const rtl::Reference< sd::Annotation >& xAnnotation, int nIndex ); + void removeAnnotation( const rtl::Reference< sd::Annotation >& xAnnotation ); + const sd::AnnotationVector& getAnnotations() const { return maAnnotations; } + bool Equals(const SdPage&) const; + virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override; + sal_uInt16 getPageId() const { return mnPageId; } + + /** + Returns graphics objects from the page that can be prefetched before it's painted. + The pointers are temporary and should not be kept. + */ + void getGraphicsForPrefetch(std::vector& graphics) const; + + static sal_uInt16 mnLastPageId; + +private: + bool mbIsPrecious; + + // page id of this page + sal_uInt16 mnPageId; + + /** clone the animations from this and set them to rTargetPage + * TTTT: Order is strange, should be the other way around by + * convention/convenience and makes usage a little dangerous... + */ + void cloneAnimations( SdPage& rTargetPage ) const; + + /** called before a shape is removed or replaced from this slide */ + void onRemoveObject( SdrObject* pObject ); +}; + +#endif // INCLUDED_SD_INC_SDPAGE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdpdffilter.hxx b/sd/inc/sdpdffilter.hxx new file mode 100644 index 0000000000..685a3485ac --- /dev/null +++ b/sd/inc/sdpdffilter.hxx @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sdfilter.hxx" + +class SfxMedium; +namespace sd +{ +class DrawDocShell; +} + +class SdPdfFilter final : public SdFilter +{ +public: + SdPdfFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell); + + virtual ~SdPdfFilter() override; + + bool Import(); + bool Export() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdpptwrp.hxx b/sd/inc/sdpptwrp.hxx new file mode 100644 index 0000000000..7ff62a5c05 --- /dev/null +++ b/sd/inc/sdpptwrp.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "sdfilter.hxx" + +#include + +// SdPPTFilter +class SdPPTFilter final : public SdFilter +{ +public: + SdPPTFilter ( + SfxMedium& rMedium, + ::sd::DrawDocShell& rDocShell); + virtual ~SdPPTFilter() override; + + /// these methods are necessary for the export to PowerPoint + bool Import(); + bool Export() override; + + /// restores the original basic storage + void PreSaveBasic(); + +private: + SvMemoryStream* pBas; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdresid.hxx b/sd/inc/sdresid.hxx new file mode 100644 index 0000000000..2ed8cd42cf --- /dev/null +++ b/sd/inc/sdresid.hxx @@ -0,0 +1,29 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "sddllapi.h" +#include + +SD_DLLPUBLIC OUString SdResId(TranslateId aId); +SD_DLLPUBLIC OUString SdResId(TranslateNId aContextSingularPlural, int nCardinality); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdundo.hxx b/sd/inc/sdundo.hxx new file mode 100644 index 0000000000..fbcc03574c --- /dev/null +++ b/sd/inc/sdundo.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "sddllapi.h" + +class SdDrawDocument; + +class SD_DLLPUBLIC SdUndoAction : public SfxUndoAction +{ +public: + SdUndoAction(SdDrawDocument* pSdDrawDocument); + + void SetComment(const OUString& rStr) { maComment = rStr; } + virtual OUString GetComment() const override { return maComment; } + virtual SdUndoAction* Clone() const { return nullptr; } + /// See SfxUndoAction::GetViewShellId(). + ViewShellId GetViewShellId() const override; + +protected: + SdDrawDocument* mpDoc; + ViewShellId mnViewShellId; +private: + OUString maComment; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/sdxmlwrp.hxx b/sd/inc/sdxmlwrp.hxx new file mode 100644 index 0000000000..9a1bf82c02 --- /dev/null +++ b/sd/inc/sdxmlwrp.hxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include "sdfilter.hxx" + +class ErrCode; + +// SdXMLFilter +enum class SdXMLFilterMode +{ + Normal, ///< standard load and save of the complete document + Organizer ///< only for import, only the styles are loaded +}; + +class SdXMLFilter final : public SdFilter +{ +public: + SdXMLFilter( + SfxMedium& rMedium, + ::sd::DrawDocShell& rDocShell, + SdXMLFilterMode eFilterMode = SdXMLFilterMode::Normal, + sal_uLong nStoreVer = SOFFICE_FILEFORMAT_8 ); + virtual ~SdXMLFilter() override; + + bool Import( ErrCode& nError ); + bool Export() override; + +private: + SdXMLFilterMode meFilterMode; + sal_uLong mnStoreVer; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/shapelist.hxx b/sd/inc/shapelist.hxx new file mode 100644 index 0000000000..6528cc0732 --- /dev/null +++ b/sd/inc/shapelist.hxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +namespace sd +{ + class ShapeList final : public sdr::ObjectUser + { + public: + ShapeList(); + virtual ~ShapeList(); + + /** adds the given shape to this list */ + void addShape( SdrObject& rObject ); + + /** removes the shape from this list*/ + void removeShape( SdrObject& rObject ); + + /** removes all shapes from this list */ + void clear(); + + /** @return true if this list is empty */ + bool isEmpty() const; + + /** @return true if given shape is part of this list */ + bool hasShape( SdrObject& rObject ) const; + + /** returns the shape the internal iterator points to, or 0 if + * the list end is reached. moves the internal iterator to the + * next shape. */ + SdrObject* getNextShape(); + + /** Sets the internal iterator to the shape at given index. */ + void seekShape( sal_uInt32 nIndex ); + + bool hasMore() const; + + const std::list< SdrObject* >& getList() const { return maShapeList; } + + private: + virtual void ObjectInDestruction(const SdrObject& rObject) override; + + typedef std::list< SdrObject* > ListImpl; + ListImpl maShapeList; + ListImpl::iterator maIter; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/stlfamily.hxx b/sd/inc/stlfamily.hxx new file mode 100644 index 0000000000..4a2b4f3d3b --- /dev/null +++ b/sd/inc/stlfamily.hxx @@ -0,0 +1,116 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +class SdStyleSheet; +class SdPage; +struct SdStyleFamilyImpl; + +class SdStyleFamily final : public ::cppu::WeakImplHelper< css::container::XNameContainer, css::container::XNamed, css::container::XIndexAccess, css::lang::XSingleServiceFactory, css::lang::XServiceInfo, css::lang::XComponent, css::beans::XPropertySet > +{ +public: + /// creates the style family for the given SfxStyleFamily + SdStyleFamily( rtl::Reference< SfxStyleSheetPool > xPool, SfxStyleFamily nFamily ); + + /// creates the presentation family for the given masterpage + SdStyleFamily( const rtl::Reference< SfxStyleSheetPool >& xPool, const SdPage* pMasterPage ); + + virtual ~SdStyleFamily() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XNamed + virtual OUString SAL_CALL getName( ) override; + virtual void SAL_CALL setName( const OUString& aName ) override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XNameContainer + virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override; + virtual void SAL_CALL removeByName( const OUString& Name ) override; + + // XNameReplace + virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override; + + // XSingleServiceFactory + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const css::uno::Sequence< css::uno::Any >& aArguments ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; + + // XPropertySet + virtual css::uno::Reference SAL_CALL getPropertySetInfo() override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const css::uno::Reference& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName,const css::uno::Reference&aListener ) override; + +private: + /// @throws css::uno::RuntimeException + void throwIfDisposed() const; + /// @throws css::lang::IllegalArgumentException + SdStyleSheet* GetValidNewSheet( const css::uno::Any& rElement ); + /// @throws css::container::NoSuchElementException + /// @throws css::lang::WrappedTargetException + SdStyleSheet* GetSheetByName( const OUString& rName ); + + SfxStyleFamily mnFamily; + rtl::Reference< SfxStyleSheetPool > mxPool; + std::unique_ptr mpImpl; +}; + +typedef rtl::Reference< SdStyleFamily > SdStyleFamilyRef; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/stlpool.hxx b/sd/inc/stlpool.hxx new file mode 100644 index 0000000000..9e1693249f --- /dev/null +++ b/sd/inc/stlpool.hxx @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "stlfamily.hxx" +#include "stlsheet.hxx" + +#include "sddllapi.h" + +class SdDrawDocument; +class SdPage; +class SvxNumberFormat; + +typedef std::map< const SdPage*, SdStyleFamilyRef > SdStyleFamilyMap; + +typedef ::cppu::ImplInheritanceHelper< SfxStyleSheetPool, + css::lang::XServiceInfo, + css::container::XIndexAccess, + css::container::XNameAccess, + css::lang::XComponent > SdStyleSheetPoolBase; + +class SAL_DLLPUBLIC_RTTI SdStyleSheetPool final : public SdStyleSheetPoolBase, public SfxListener +{ + friend class SdDrawDocument; +public: + SdStyleSheetPool(SfxItemPool const& rPool, SdDrawDocument* pDocument); + + void SetActualStyleSheet(SfxStyleSheetBase* pActStyleSheet) { mpActualStyleSheet = pActStyleSheet; } + SfxStyleSheetBase* GetActualStyleSheet() { return mpActualStyleSheet; } + + SfxStyleSheetBase* GetTitleSheet(std::u16string_view rLayoutName); + + // Caller has to delete the list + void CreateOutlineSheetList(std::u16string_view rLayoutName, std::vector &rOutlineStyles); + + /** creates all layout style sheets for the given layout name if they + don't exist yet. + + @param rLayoutName Must be the name of a master page + @param bCheck If set to true, the debug version will assert if a style + had to be created. This is used to assert errors in documents + when styles are missing. + */ + SD_DLLPUBLIC void CreateLayoutStyleSheets(std::u16string_view rLayoutName, bool bCheck = false ); + static void CreateLayoutSheetNames(std::u16string_view rLayoutName, std::vector &aNameList); + void CreateLayoutSheetList(std::u16string_view rLayoutName, SdStyleSheetVector& rLayoutSheets); + void CopyLayoutSheets(std::u16string_view rLayoutName, SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets); + void CopyGraphicSheets(SdStyleSheetPool& rSourcePool); + void CopyCellSheets(SdStyleSheetPool& rSourcePool); + void CopyTableStyles(SdStyleSheetPool const & rSourcePool); + void CopyTableStyles(SdStyleSheetPool const & rSourcePool, XStyleVector& rCreatedSheets); + void CopyCellSheets(SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets); + void RenameAndCopyGraphicSheets(SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets, std::u16string_view rRenameSuffix); + + void CreatePseudosIfNecessary(); + void UpdateStdNames(); + static void PutNumBulletItem( SfxStyleSheetBase* pSheet, vcl::Font& rBulletFont ); + static vcl::Font GetBulletFont(); + + SdDrawDocument* GetDoc() const { return mpDoc; } + + static SdStyleSheetVector CreateChildList( SdStyleSheet const * pSheet ); + + static void setDefaultOutlineNumberFormatBulletAndIndent(sal_uInt16 i, SvxNumberFormat &rNumberFormat); + +public: + /// @throws css::uno::RuntimeException + void throwIfDisposed(); + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; + +private: + void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily ); + void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, StyleSheetCopyResultVector& rCreatedSheets ); + void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, StyleSheetCopyResultVector& rCreatedSheets, std::u16string_view rRenameSuffix ); + + virtual rtl::Reference Create(const OUString& rName, SfxStyleFamily eFamily, SfxStyleSearchBits nMask) override; + + using SfxStyleSheetPool::Create; + virtual ~SdStyleSheetPool() override; + + void AddStyleFamily( const SdPage* pPage ); + void RemoveStyleFamily( const SdPage* pPage ); + + SfxStyleSheetBase* mpActualStyleSheet; + SdDrawDocument* mpDoc; + SdStyleFamilyRef mxGraphicFamily; + SdStyleFamilyRef mxCellFamily; + SdStyleFamilyMap maStyleFamilyMap; + css::uno::Reference< css::container::XNameAccess > mxTableFamily; + OUString msTableFamilyName; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/stlsheet.hxx b/sd/inc/stlsheet.hxx new file mode 100644 index 0000000000..fe1079ffd6 --- /dev/null +++ b/sd/inc/stlsheet.hxx @@ -0,0 +1,186 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +#include "prlayout.hxx" + +class ModifyListenerForwarder; +struct SfxItemPropertyMapEntry; + +typedef cppu::ImplInheritanceHelper< SfxUnoStyleSheet, + css::beans::XPropertySet, + css::beans::XMultiPropertySet, + css::lang::XServiceInfo, + css::beans::XPropertyState, + css::util::XModifyBroadcaster, + css::lang::XComponent > SdStyleSheetBase ; + +class SdStyleSheet final : public SdStyleSheetBase +{ +public: + SdStyleSheet( const OUString& rDisplayName, SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily, SfxStyleSearchBits nMask ); + + virtual bool SetParent (const OUString& rParentName) override; + virtual SfxItemSet& GetItemSet() override; + virtual bool IsUsed() const override; + virtual bool HasFollowSupport() const override; + virtual bool HasParentSupport() const override; + virtual bool HasClearParentSupport() const override; + virtual void SetHelpId( const OUString& r, sal_uLong nId ) override; + + bool IsEditable(); + + void AdjustToFontHeight(SfxItemSet& rSet, bool bOnlyMissingItems = true); + + SdStyleSheet* GetRealStyleSheet() const; + SdStyleSheet* GetPseudoStyleSheet() const; + + void SetApiName( const OUString& rApiName ); + OUString const & GetApiName() const; + + static OUString GetFamilyString( SfxStyleFamily eFamily ); + + static rtl::Reference CreateEmptyUserStyle( SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily ); + + //Broadcast that a SdStyleSheet has changed, taking into account outline sublevels + //which need to be explicitly broadcast as changing if their parent style was + //the one that changed + static void BroadcastSdStyleSheetChange(SfxStyleSheetBase const * pStyleSheet, PresentationObjects ePO, + SfxStyleSheetBasePool* pSSPool); + + // SfxStyleSheetBase + virtual bool SetName(const OUString& rNewName, bool bReindexNow = true) override; + + // XInterface + virtual void SAL_CALL release( ) noexcept override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XNamed + virtual OUString SAL_CALL getName( ) override; + virtual void SAL_CALL setName( const OUString& aName ) override; + + // XStyle + virtual sal_Bool SAL_CALL isUserDefined( ) override; + virtual sal_Bool SAL_CALL isInUse( ) override; + virtual OUString SAL_CALL getParentStyle( ) override; + virtual void SAL_CALL setParentStyle( const OUString& aParentStyle ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // XMultiPropertySet + virtual void SAL_CALL setPropertyValues(const css::uno::Sequence& aPropertyNames, const css::uno::Sequence& aValues) override; + virtual css::uno::Sequence SAL_CALL getPropertyValues(const css::uno::Sequence& aPropertyNames) override; + virtual void SAL_CALL addPropertiesChangeListener(const css::uno::Sequence& aPropertyNames, const css::uno::Reference& xListener) override; + virtual void SAL_CALL removePropertiesChangeListener(const css::uno::Reference& xListener) override; + virtual void SAL_CALL firePropertiesChangeEvent(const css::uno::Sequence& aPropertyNames, const css::uno::Reference& xListener) override; + + // XPropertyState + virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override; + virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL getPropertyStates( const css::uno::Sequence< OUString >& aPropertyName ) override; + virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override; + virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override; + + // XModifyBroadcaster + virtual void SAL_CALL addModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override; + virtual void SAL_CALL removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; + + void notifyModifyListener(); + +private: + /// @throws css::uno::RuntimeException + static const SfxItemPropertyMapEntry* getPropertyMapEntry( std::u16string_view rPropertyName ); + + void setPropertyValue_Impl(const OUString& aPropertyName, const css::uno::Any& aValue); + css::uno::Any getPropertyValue_Impl(const OUString& PropertyName); + + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + virtual ~SdStyleSheet() override; + + /// @throws css::uno::RuntimeException + void throwIfDisposed(); + + void disposing(); + + mutable std::mutex m_aMutex; + bool m_bDisposed = false; + bool m_bInDispose = false; + comphelper::OInterfaceContainerHelper4 maModifyListeners; + comphelper::OInterfaceContainerHelper4 maEventListeners; + OUString msApiName; + rtl::Reference< SfxStyleSheetBasePool > mxPool; + + std::unique_ptr< ModifyListenerForwarder > mpModifyListenerForwarder; + + SdStyleSheet( const SdStyleSheet& ) = delete; + SdStyleSheet& operator=( const SdStyleSheet& ) = delete; +}; + +typedef std::vector< rtl::Reference< SdStyleSheet > > SdStyleSheetVector; +typedef std::vector< css::uno::Reference< css::style::XStyle > > XStyleVector; + +struct StyleSheetCopyResult +{ + rtl::Reference m_xStyleSheet; + bool m_bCreatedByCopy; + StyleSheetCopyResult(SdStyleSheet* pStyleSheet, bool bCreatedByCopy) + : m_xStyleSheet(pStyleSheet) + , m_bCreatedByCopy(bCreatedByCopy) + { + } +}; + +typedef std::vector StyleSheetCopyResultVector; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/strings.hrc b/sd/inc/strings.hrc new file mode 100644 index 0000000000..d449ccf01c --- /dev/null +++ b/sd/inc/strings.hrc @@ -0,0 +1,467 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#define NC_(Context, String) TranslateId(Context, u8##String) +#define NNC_(Context, StringSingular, StringPlural) TranslateNId(Context, reinterpret_cast(u8##StringSingular), reinterpret_cast(u8##StringPlural)) + +#define STR_NULL NC_("STR_NULL", "None") +#define STR_INSERTPAGE NC_("STR_INSERTPAGE", "Insert Slide") +#define STR_INSERTLAYER NC_("STR_INSERTLAYER", "Insert Layer") +#define STR_MODIFYLAYER NC_("STR_MODIFYLAYER", "Modify Layer") +#define STR_UNDO_SLIDE_PARAMS NC_("STR_UNDO_SLIDE_PARAMS", "Slide parameter") +#define STR_UNDO_CUT NC_("STR_UNDO_CUT", "Cut") +#define STR_UNDO_REPLACE NC_("STR_UNDO_REPLACE", "Replace") +#define STR_UNDO_DRAGDROP NC_("STR_UNDO_DRAGDROP", "Drag and Drop") +#define STR_INSERTGRAPHIC NC_("STR_INSERTGRAPHIC", "Insert Image") +#define STR_UNDO_BEZCLOSE NC_("STR_UNDO_BEZCLOSE", "Close Polygon") +#define STR_SLIDE_SORTER_MODE NC_("STR_SLIDE_SORTER_MODE", "Slide Sorter") +#define STR_NORMAL_MODE NC_("STR_NORMAL_MODE", "Normal") +#define STR_SLIDE_MASTER_MODE NC_("STR_SLIDE_MASTER_MODE", "Master Slide") +#define STR_OUTLINE_MODE NC_("STR_OUTLINE_MODE", "Outline") +#define STR_NOTES_MODE NC_("STR_NOTES_MODE", "Notes") +#define STR_NOTES_MASTER_MODE NC_("STR_NOTES_MASTER_MODE", "Master Notes") +#define STR_HANDOUT_MASTER_MODE NC_("STR_HANDOUT_MASTER_MODE", "Master Handout") +#define STR_AUTOLAYOUT_NONE NC_("STR_AUTOLAYOUT_NONE", "Blank Slide") +#define STR_AUTOLAYOUT_ONLY_TITLE NC_("STR_AUTOLAYOUT_ONLY_TITLE", "Title Only") +#define STR_AUTOLAYOUT_ONLY_TEXT NC_("STR_AUTOLAYOUT_ONLY_TEXT", "Centered Text") +#define STR_AUTOLAYOUT_TITLE NC_("STR_AUTOLAYOUT_TITLE", "Title Slide") +#define STR_AUTOLAYOUT_CONTENT NC_("STR_AUTOLAYOUT_CONTENT", "Title, Content") +#define STR_AUTOLAYOUT_2CONTENT NC_("STR_AUTOLAYOUT_2CONTENT", "Title and 2 Content") +#define STR_AUTOLAYOUT_CONTENT_2CONTENT NC_("STR_AUTOLAYOUT_CONTENT_2CONTENT", "Title, Content and 2 Content") +#define STR_AUTOLAYOUT_2CONTENT_CONTENT NC_("STR_AUTOLAYOUT_2CONTENT_CONTENT", "Title, 2 Content and Content") +#define STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT NC_("STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT", "Title, 2 Content over Content") +#define STR_AUTOLAYOUT_CONTENT_OVER_CONTENT NC_("STR_AUTOLAYOUT_CONTENT_OVER_CONTENT", "Title, Content over Content") +#define STR_AUTOLAYOUT_4CONTENT NC_("STR_AUTOLAYOUT_4CONTENT", "Title, 4 Content") +#define STR_AUTOLAYOUT_6CONTENT NC_("STR_AUTOLAYOUT_6CONTENT", "Title, 6 Content") +#define STR_AL_TITLE_VERT_OUTLINE NC_("STR_AL_TITLE_VERT_OUTLINE", "Title, Vertical Text") +#define STR_AL_TITLE_VERT_OUTLINE_CLIPART NC_("STR_AL_TITLE_VERT_OUTLINE_CLIPART", "Title, Vertical Text, Clipart") +#define STR_AL_VERT_TITLE_TEXT_CHART NC_("STR_AL_VERT_TITLE_TEXT_CHART", "Vertical Title, Text, Chart") +#define STR_AL_VERT_TITLE_VERT_OUTLINE NC_("STR_AL_VERT_TITLE_VERT_OUTLINE", "Vertical Title, Vertical Text") +#define STR_AUTOLAYOUT_HANDOUT1 NC_("STR_AUTOLAYOUT_HANDOUT1", "One Slide") +#define STR_AUTOLAYOUT_HANDOUT2 NC_("STR_AUTOLAYOUT_HANDOUT2", "Two Slides") +#define STR_AUTOLAYOUT_HANDOUT3 NC_("STR_AUTOLAYOUT_HANDOUT3", "Three Slides") +#define STR_AUTOLAYOUT_HANDOUT4 NC_("STR_AUTOLAYOUT_HANDOUT4", "Four Slides") +#define STR_AUTOLAYOUT_HANDOUT6 NC_("STR_AUTOLAYOUT_HANDOUT6", "Six Slides") +#define STR_AUTOLAYOUT_HANDOUT9 NC_("STR_AUTOLAYOUT_HANDOUT9", "Nine Slides") +#define STR_AUTOLAYOUT_NOTES NC_("STR_AUTOLAYOUT_NOTES", "Notes") +#define STR_TRANSFORM NC_("STR_TRANSFORM", "Transform") +#define STR_LINEEND NC_("STR_LINEEND", "Line Ends") +#define STR_DESC_LINEEND NC_("STR_DESC_LINEEND", "Please enter a name for the new arrow style:") +#define STR_WARN_NAME_DUPLICATE NC_("STR_WARN_NAME_DUPLICATE", "The name chosen already exists. \nPlease enter another name.") +#define STR_UNDO_ANIMATION NC_("STR_UNDO_ANIMATION", "Animation parameters") +#define STR_UNDO_COPYOBJECTS NC_("STR_UNDO_COPYOBJECTS", "Duplicate") +#define STR_TITLE_NAMEGROUP NC_("STR_TITLE_NAMEGROUP", "Name Object") +#define STR_DESC_NAMEGROUP NC_("STR_DESC_NAMEGROUP", "Name") +#define STR_WARN_PAGE_EXISTS NC_("STR_WARN_PAGE_EXISTS", "The slide name already exists or is invalid. Please enter another name.") +#define STR_WARN_PAGE_EXISTS_DRAW NC_("STR_WARN_PAGE_EXISTS_DRAW", "The page name already exists or is invalid. Please enter another name.") +#define STR_SNAPDLG_SETLINE NC_("STR_SNAPDLG_SETLINE", "Edit Snap Line") +#define STR_SNAPDLG_SETPOINT NC_("STR_SNAPDLG_SETPOINT", "Edit Snap Point") +#define STR_POPUP_EDIT_SNAPLINE NC_("STR_POPUP_EDIT_SNAPLINE", "Edit Snap Line...") +#define STR_POPUP_EDIT_SNAPPOINT NC_("STR_POPUP_EDIT_SNAPPOINT", "Edit Snap Point...") +#define STR_POPUP_DELETE_SNAPLINE NC_("STR_POPUP_DELETE_SNAPLINE", "Delete Snap Line") +#define STR_POPUP_DELETE_SNAPPOINT NC_("STR_POPUP_DELETE_SNAPPOINT", "Delete Snap Point") +#define STR_IMPRESS NC_("STR_IMPRESS", "StarImpress 4.0") +#define STR_LAYER NC_("STR_LAYER", "Layer") +#define STR_UNDO_DELETEPAGES NC_("STR_UNDO_DELETEPAGES", "Delete slides") +#define STR_UNDO_DELETEPAGES_DRAW NC_("STR_UNDO_DELETEPAGES_DRAW", "Delete pages") +#define STR_UNDO_INSERTPAGES NC_("STR_UNDO_INSERTPAGES", "Insert slides") +#define STR_ASK_DELETE_LAYER NC_("STR_ASK_DELETE_LAYER", "Are you sure you want to delete the layer \"$\"?\nNote: All objects on this layer will be deleted!") +#define STR_ASK_DELETE_ALL_PICTURES NC_("STR_ASK_DELETE_ALL_PICTURES", "Do you really want to delete all images?") +#define STR_UNDO_CHANGE_TITLE_AND_LAYOUT NC_("STR_UNDO_CHANGE_TITLE_AND_LAYOUT", "Modify title and outline") +#define STR_WAV_FILE NC_("STR_WAV_FILE", "Audio") +#define STR_MIDI_FILE NC_("STR_MIDI_FILE", "MIDI") +#define STR_AU_FILE NC_("STR_AU_FILE", "Sun/NeXT Audio") +#define STR_VOC_FILE NC_("STR_VOC_FILE", "Creative Labs Audio") +#define STR_AIFF_FILE NC_("STR_AIFF_FILE", "Apple/SGI Audio") +#define STR_SVX_FILE NC_("STR_SVX_FILE", "Amiga SVX Audio") +#define STR_SD_PAGE NC_("STR_SD_PAGE", "Slide") +#define STR_SD_PAGE_COUNT NC_("STR_SD_PAGE_COUNT", "Slide %1 of %2") +#define STR_SD_PAGE_COUNT_CUSTOM NC_("STR_SD_PAGE_COUNT_CUSTOM", "Slide %1 of %2 (%3)") +#define STR_SD_PAGE_COUNT_DRAW NC_("STR_SD_PAGE_COUNT_DRAW", "Page %1 of %2") +#define STR_SD_PAGE_COUNT_CUSTOM_DRAW NC_("STR_SD_PAGE_COUNT_CUSTOM_DRAW", "Page %1 of %2 (%3)") +#define STR_ALL_SUPPORTED_FORMATS NC_("STR_ALL_SUPPORTED_FORMATS", "All supported formats") +#define STR_ALL_FILES NC_("STR_ALL_FILES", "All files") +#define STR_UNDO_INSERT_TEXTFRAME NC_("STR_UNDO_INSERT_TEXTFRAME", "Insert text frame") +#define STR_ACTION_NOTPOSSIBLE NC_("STR_ACTION_NOTPOSSIBLE", "This function cannot be run \nwith the selected objects.") +#define STR_DLG_INSERT_PAGES_FROM_FILE NC_("STR_DLG_INSERT_PAGES_FROM_FILE", "Insert File") +#define STR_READ_DATA_ERROR NC_("STR_READ_DATA_ERROR", "The file could not be loaded!") +#define STR_SCALE_OBJECTS NC_("STR_SCALE_OBJECTS", "The page size of the target document is different than the source document.\n\nDo you want to scale the copied objects to fit the new page size?") +#define STR_SCALE_TOOLTIP NC_("STR_SCALE_TOOLTIP", "Scaling factor of the document; right-click to change.") +#define STR_CREATE_PAGES NC_("STR_CREATE_PAGES", "Create Slides") +#define STR_UNDO_CHANGE_PAGEFORMAT NC_("STR_UNDO_CHANGE_PAGEFORMAT", "Modify page format") +#define STR_UNDO_CHANGE_PAGEBORDER NC_("STR_UNDO_CHANGE_PAGEBORDER", "Modify page margins") +#define STR_EDIT_OBJ NC_("STR_EDIT_OBJ", "~Edit") +#define STR_DELETE_PAGES NC_("STR_DELETE_PAGES", "Delete Slides") +#define STR_WARN_PRINTFORMAT_FAILURE NC_("STR_WARN_PRINTFORMAT_FAILURE", "The document format could not be set on the specified printer.") +#define STR_IMPORT_GRFILTER_OPENERROR NC_("STR_IMPORT_GRFILTER_OPENERROR", "Image file cannot be opened") +#define STR_IMPORT_GRFILTER_IOERROR NC_("STR_IMPORT_GRFILTER_IOERROR", "Image file cannot be read") +#define STR_IMPORT_GRFILTER_FORMATERROR NC_("STR_IMPORT_GRFILTER_FORMATERROR", "Unknown image format") +#define STR_IMPORT_GRFILTER_VERSIONERROR NC_("STR_IMPORT_GRFILTER_VERSIONERROR", "This image file version is not supported") +#define STR_IMPORT_GRFILTER_FILTERERROR NC_("STR_IMPORT_GRFILTER_FILTERERROR", "Image filter not found") +#define STR_IMPORT_GRFILTER_TOOBIG NC_("STR_IMPORT_GRFILTER_TOOBIG", "Not enough memory to import image") +#define STR_OBJECTS NC_("STR_OBJECTS", "Objects") +#define STR_END_SPELLING NC_("STR_END_SPELLING", "Spellcheck of entire document has been completed.") +#define STR_END_SPELLING_OBJ NC_("STR_END_SPELLING_OBJ", "The spellcheck for the selected objects has been completed.") +#define STR_ASK_FOR_CONVERT_TO_BEZIER NC_("STR_ASK_FOR_CONVERT_TO_BEZIER", "Convert selected object to curve?") +#define STR_UNDO_CHANGE_PRES_OBJECT NC_("STR_UNDO_CHANGE_PRES_OBJECT", "Modify presentation object '$'") +#define STR_UNDO_MODIFY_PAGE NC_("STR_UNDO_MODIFY_PAGE", "Slide layout") +#define STR_UNDO_MODIFY_PAGE_DRAW NC_("STR_UNDO_MODIFY_PAGE_DRAW", "Page layout") +#define STR_UNDO_INSERT_FILE NC_("STR_UNDO_INSERT_FILE", "Insert file") +#define STR_UNDO_INSERT_SPECCHAR NC_("STR_UNDO_INSERT_SPECCHAR", "Insert special character") +#define STR_UNDO_SET_PRESLAYOUT NC_("STR_UNDO_SET_PRESLAYOUT", "Apply presentation layout") +#define STR_UNDO_HIDE_SLIDE NC_("STR_UNDO_HIDE_SLIDE", "Hide slide") +#define STR_UNDO_SHOW_SLIDE NC_("STR_UNDO_SHOW_SLIDE", "Show slide") +#define STR_PLAY NC_("STR_PLAY", "~Play") +#define STR_STOP NC_("STR_STOP", "Sto~p") +#define STR_UNDO_ORIGINALSIZE NC_("STR_UNDO_ORIGINALSIZE", "Original Size") +#define STR_WARN_SCALE_FAIL NC_("STR_WARN_SCALE_FAIL", "The specified scale is invalid.\nDo you want to enter a new one?") +#define STR_CLICK_ACTION_NONE NC_("STR_CLICK_ACTION_NONE", "No action") +#define STR_CLICK_ACTION_PREVPAGE NC_("STR_CLICK_ACTION_PREVPAGE", "Go to previous slide") +#define STR_CLICK_ACTION_NEXTPAGE NC_("STR_CLICK_ACTION_NEXTPAGE", "Go to next slide") +#define STR_CLICK_ACTION_FIRSTPAGE NC_("STR_CLICK_ACTION_FIRSTPAGE", "Go to first slide") +#define STR_CLICK_ACTION_LASTPAGE NC_("STR_CLICK_ACTION_LASTPAGE", "Go to last slide") +#define STR_CLICK_ACTION_BOOKMARK NC_("STR_CLICK_ACTION_BOOKMARK", "Go to page or object") +#define STR_CLICK_ACTION_DOCUMENT NC_("STR_CLICK_ACTION_DOCUMENT", "Go to document") +#define STR_CLICK_ACTION_SOUND NC_("STR_CLICK_ACTION_SOUND", "Play audio") +#define STR_CLICK_ACTION_VERB NC_("STR_CLICK_ACTION_VERB", "Start object action") +#define STR_CLICK_ACTION_PROGRAM NC_("STR_CLICK_ACTION_PROGRAM", "Run program") +#define STR_CLICK_ACTION_MACRO NC_("STR_CLICK_ACTION_MACRO", "Run macro") +#define STR_CLICK_ACTION_STOPPRESENTATION NC_("STR_CLICK_ACTION_STOPPRESENTATION", "Exit presentation") +#define STR_EFFECTDLG_JUMP NC_("STR_EFFECTDLG_JUMP", "Target") +#define STR_EFFECTDLG_ACTION NC_("STR_EFFECTDLG_ACTION", "Act~ion") +#define STR_EFFECTDLG_SOUND NC_("STR_EFFECTDLG_SOUND", "Audio") +#define STR_EFFECTDLG_PAGE_OBJECT NC_("STR_EFFECTDLG_PAGE_OBJECT", "Slide / Object") +#define STR_EFFECTDLG_DOCUMENT NC_("STR_EFFECTDLG_DOCUMENT", "Document") +#define STR_EFFECTDLG_PROGRAM NC_("STR_EFFECTDLG_PROGRAM", "Program") +#define STR_EFFECTDLG_MACRO NC_("STR_EFFECTDLG_MACRO", "Macro") +#define STR_FULLSCREEN_SLIDESHOW NC_("STR_FULLSCREEN_SLIDESHOW", "Presenting: %s") + +// To translators: this is the spinbutton in the slidesorter toolbar to set the number of slides to show per row +#define STR_SLIDES NNC_("STR_SLIDES", "%1 slide", "%1 slides") + +// Strings for animation effects +#define STR_INSERT_TEXT NC_("STR_INSERT_TEXT", "Insert Text") +#define STR_AVAILABLE_MASTERSLIDE NC_("STR_AVAILABLE_MASTERSLIDE", "Available Master Slides") +#define STR_AVAILABLE_MASTERPAGE NC_("STR_AVAILABLE_MASTERPAGE", "Available Master Pages") +#define STR_SELECT_SLIDE NC_("STR_SELECT_SLIDE", "Select a Slide Design") +#define STR_SELECT_PAGE NC_("STR_SELECT_PAGE", "Select a Page Design") +#define STR_LOAD_PRESENTATION_LAYOUT NC_("STR_LOAD_PRESENTATION_LAYOUT", "Load Master Slide") +#define STR_LOAD_DRAWING_LAYOUT NC_("STR_LOAD_DRAWING_LAYOUT", "Load Master Page") +#define STR_GLUE_ESCDIR_SMART NC_("STR_GLUE_ESCDIR_SMART", "Smart") +#define STR_GLUE_ESCDIR_LEFT NC_("STR_GLUE_ESCDIR_LEFT", "Left") +#define STR_GLUE_ESCDIR_RIGHT NC_("STR_GLUE_ESCDIR_RIGHT", "Right") +#define STR_GLUE_ESCDIR_TOP NC_("STR_GLUE_ESCDIR_TOP", "Top") +#define STR_GLUE_ESCDIR_BOTTOM NC_("STR_GLUE_ESCDIR_BOTTOM", "Bottom") +#define STR_GLUE_ESCDIR_LO NC_("STR_GLUE_ESCDIR_LO", "Top Left?") +#define STR_GLUE_ESCDIR_LU NC_("STR_GLUE_ESCDIR_LU", "Bottom Left?") +#define STR_GLUE_ESCDIR_RO NC_("STR_GLUE_ESCDIR_RO", "Top Right?") +#define STR_GLUE_ESCDIR_RU NC_("STR_GLUE_ESCDIR_RU", "Bottom Right?") +#define STR_GLUE_ESCDIR_HORZ NC_("STR_GLUE_ESCDIR_HORZ", "Horizontal") +#define STR_GLUE_ESCDIR_VERT NC_("STR_GLUE_ESCDIR_VERT", "Vertical") +#define STR_GLUE_ESCDIR_ALL NC_("STR_GLUE_ESCDIR_ALL", "All?") +#define STR_CANT_PERFORM_IN_LIVEMODE NC_("STR_CANT_PERFORM_IN_LIVEMODE", "This action can't be run in the live mode.") +#define STR_EYEDROPPER NC_("STR_EYEDROPPER", "Color Replacer") +#define STR_UNDO_MORPHING NC_("STR_UNDO_MORPHING", "Cross-fading") +#define STR_UNDO_EXPAND_PAGE NC_("STR_UNDO_EXPAND_PAGE", "Expand Slide") +#define STR_UNDO_SUMMARY_PAGE NC_("STR_UNDO_SUMMARY_PAGE", "Table of Contents Slide") +#define STR_TWAIN_NO_SOURCE_UNX NC_("STR_TWAIN_NO_SOURCE_UNX", "No SANE source is available at the moment.") +#define STR_TWAIN_NO_SOURCE NC_("STR_TWAIN_NO_SOURCE", "At present, no TWAIN source is available.") +#define STR_FIX NC_("STR_FIX", "Fixed") +#define STR_VAR NC_("STR_VAR", "Variable") +#define STR_STANDARD_NORMAL NC_("STR_STANDARD_NORMAL", "Standard") +#define STR_STANDARD_SMALL NC_("STR_STANDARD_SMALL", "Standard (short)") +#define STR_STANDARD_BIG NC_("STR_STANDARD_BIG", "Standard (long)") +#define STR_FILEFORMAT_NAME_EXT NC_("STR_FILEFORMAT_NAME_EXT", "File name") +#define STR_FILEFORMAT_FULLPATH NC_("STR_FILEFORMAT_FULLPATH", "Path/File name") +#define STR_FILEFORMAT_PATH NC_("STR_FILEFORMAT_PATH", "Path") +#define STR_FILEFORMAT_NAME NC_("STR_FILEFORMAT_NAME", "File name without extension") +#define STR_NEW_CUSTOMSHOW NC_("STR_NEW_CUSTOMSHOW", "New Custom Slide Show") +#define STR_COPY_CUSTOMSHOW NC_("STR_COPY_CUSTOMSHOW", "Copy ") +#define STR_IMPRESS_DOCUMENT_FULLTYPE_60 NC_("STR_IMPRESS_DOCUMENT_FULLTYPE_60", "%PRODUCTNAME Presentation format (Impress 6)") +#define STR_GRAPHIC_DOCUMENT_FULLTYPE_60 NC_("STR_GRAPHIC_DOCUMENT_FULLTYPE_60", "%PRODUCTNAME Drawing format (Draw 6)") +#define STR_BREAK_METAFILE NC_("STR_BREAK_METAFILE", "Ungroup Metafile(s)...") +#define STR_BREAK_FAIL NC_("STR_BREAK_FAIL", "It was not possible to ungroup all drawing objects.") +#define STR_IMPRESS_DOCUMENT_FULLTYPE_80 NC_("STR_IMPRESS_DOCUMENT_FULLTYPE_80", "%PRODUCTNAME %PRODUCTVERSION Presentation") +#define STR_GRAPHIC_DOCUMENT_FULLTYPE_80 NC_("STR_GRAPHIC_DOCUMENT_FULLTYPE_80", "%PRODUCTNAME %PRODUCTVERSION Drawing") + +#define STR_UNDO_VECTORIZE NC_("STR_UNDO_VECTORIZE", "Convert bitmap to polygon" ) +#define STR_PRES_SOFTEND NC_("STR_PRES_SOFTEND", "Click to exit presentation..." ) +#define STR_PRES_PAUSE NC_("STR_PRES_PAUSE", "Pause..." ) +#define STR_UNDO_APPLY_3D_FAVOURITE NC_("STR_UNDO_APPLY_3D_FAVOURITE", "Apply 3D favorite") +#define STR_UNDO_GRAFFILTER NC_("STR_UNDO_GRAFFILTER", "Image filter" ) +#define STR_WARNING_NOSOUNDFILE NC_("STR_WARNING_NOSOUNDFILE", "The file %\nis not a valid audio file !" ) +#define STR_UNDO_CONVERT_TO_METAFILE NC_("STR_UNDO_CONVERT_TO_METAFILE", "Convert to metafile" ) +#define STR_UNDO_CONVERT_TO_BITMAP NC_("STR_UNDO_CONVERT_TO_BITMAP", "Convert to bitmap") +#define STR_STATUSBAR_MASTERPAGE NC_("STR_STATUSBAR_MASTERPAGE", "Slide Master name. Right-click for list or click for dialog.") +#define STR_TITLE_RENAMESLIDE NC_("STR_TITLE_RENAMESLIDE", "Rename Slide") +#define STR_TITLE_RENAMEPAGE NC_("STR_TITLE_RENAMEPAGE", "Rename Page") +#define STR_TOOLTIP_RENAME NC_("STR_TOOLTIP_RENAME", "Duplicate or empty names are not possible") +#define STR_DESC_RENAMESLIDE NC_("STR_DESC_RENAMESLIDE", "Name") +#define STR_TITLE_RENAMEMASTERSLIDE NC_("STR_TITLE_RENAMEMASTERSLIDE", "Rename Master Slide") +#define STR_TITLE_RENAMEMASTERPAGE NC_("STR_TITLE_RENAMEMASTERPAGE", "Rename Master Page") +#define STR_PLACEHOLDER_DESCRIPTION_TITLE NC_("STR_PLACEHOLDER_DESCRIPTION_TITLE", "Title Area for AutoLayouts" ) +#define STR_PLACEHOLDER_DESCRIPTION_OUTLINE NC_("STR_PLACEHOLDER_DESCRIPTION_OUTLINE", "Object Area for AutoLayouts" ) +#define STR_PLACEHOLDER_DESCRIPTION_FOOTER NC_("STR_PLACEHOLDER_DESCRIPTION_FOOTER", "Footer Area" ) +#define STR_PLACEHOLDER_DESCRIPTION_HEADER NC_("STR_PLACEHOLDER_DESCRIPTION_HEADER", "Header Area" ) +#define STR_PLACEHOLDER_DESCRIPTION_DATETIME NC_("STR_PLACEHOLDER_DESCRIPTION_DATETIME", "Date Area" ) +#define STR_PLACEHOLDER_DESCRIPTION_SLIDE NC_("STR_PLACEHOLDER_DESCRIPTION_SLIDE", "Slide Number Area" ) +#define STR_PLACEHOLDER_DESCRIPTION_NUMBER NC_("STR_PLACEHOLDER_DESCRIPTION_NUMBER", "Page Number Area" ) +#define STR_FIELD_PLACEHOLDER_HEADER NC_("STR_FIELD_PLACEHOLDER_HEADER", "
    " ) +#define STR_FIELD_PLACEHOLDER_FOOTER NC_("STR_FIELD_PLACEHOLDER_FOOTER", "
    " ) +#define STR_FIELD_PLACEHOLDER_DATETIME NC_("STR_FIELD_PLACEHOLDER_DATETIME", "" ) +#define STR_FIELD_PLACEHOLDER_NUMBER NC_("STR_FIELD_PLACEHOLDER_NUMBER", "" ) +#define STR_FIELD_PLACEHOLDER_COUNT NC_("STR_FIELD_PLACEHOLDER_COUNT", "" ) +#define STR_FIELD_PLACEHOLDER_SLIDENAME NC_("STR_FIELD_PLACEHOLDER_SLIDENAME", "" ) +#define STR_FIELD_PLACEHOLDER_PAGENAME NC_("STR_FIELD_PLACEHOLDER_PAGENAME", "" ) +#define STR_PLACEHOLDER_DESCRIPTION_NOTES NC_("STR_PLACEHOLDER_DESCRIPTION_NOTES", "Notes Area") +#define STR_UNDO_HANGULHANJACONVERSION NC_("STR_UNDO_HANGULHANJACONVERSION", "Hangul/Hanja Conversion") +#define STR_LEFT_PANE_IMPRESS_TITLE NC_("STR_LEFT_PANE_IMPRESS_TITLE", "Slides") +#define STR_LEFT_PANE_IMPRESS_TITLE_MASTER NC_("STR_LEFT_PANE_IMPRESS_TITLE_MASTER", "Master Slides") +#define STR_LEFT_PANE_DRAW_TITLE NC_("STR_LEFT_PANE_DRAW_TITLE", "Pages") +#define STR_LEFT_PANE_DRAW_TITLE_MASTER NC_("STR_LEFT_PANE_DRAW_TITLE_MASTER", "Master Pages") +#define STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION NC_("STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION", "Preview not available") +#define STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION NC_("STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION", "Preparing preview") +#define STR_TASKPANEL_LAYOUT_MENU_TITLE NC_("STR_TASKPANEL_LAYOUT_MENU_TITLE", "Layouts") +#define STR_GRAPHICS_STYLE_FAMILY NC_("STR_GRAPHICS_STYLE_FAMILY", "Drawing Styles") +#define STR_PRESENTATIONS_STYLE_FAMILY NC_("STR_PRESENTATIONS_STYLE_FAMILY", "Presentation Styles") +#define STR_CELL_STYLE_FAMILY NC_("STR_CELL_STYLE_FAMILY", "Cell Styles") +#define STR_NAVIGATOR_SHAPE_BASE_NAME NC_("STR_NAVIGATOR_SHAPE_BASE_NAME", "Shape %1") +#define STR_SET_BACKGROUND_PICTURE NC_("STR_SET_BACKGROUND_PICTURE", "Set Background Image" ) +#define STR_RESET_LAYOUT NC_("STR_RESET_LAYOUT", "Reset Slide Layout") +#define STR_INSERT_TABLE NC_("STR_INSERT_TABLE", "Insert Table") +#define STR_INSERT_CHART NC_("STR_INSERT_CHART", "Insert Chart") +#define STR_INSERT_PICTURE NC_("STR_INSERT_PICTURE", "Insert Image") +#define STR_INSERT_MOVIE NC_("STR_INSERT_MOVIE", "Insert Audio or Video") +#define STRING_DRAG_AND_DROP_PAGES NC_("STRING_DRAG_AND_DROP_PAGES", "Drag and Drop Pages" ) +#define STRING_DRAG_AND_DROP_SLIDES NC_("STRING_DRAG_AND_DROP_SLIDES", "Drag and Drop Slides" ) +#define STR_PHOTO_ALBUM_EMPTY_WARNING NC_("STR_PHOTO_ALBUM_EMPTY_WARNING", "Please add Images to the Album." ) +#define STR_PHOTO_ALBUM_TEXTBOX NC_("STR_PHOTO_ALBUM_TEXTBOX", "Text Slide") + +#define STR_LAYER_BCKGRND NC_("STR_LAYER_BCKGRND", "Background" ) +#define STR_LAYER_BCKGRNDOBJ NC_("STR_LAYER_BCKGRNDOBJ", "Background objects" ) +#define STR_LAYER_LAYOUT NC_("STR_LAYER_LAYOUT", "Layout" ) +#define STR_LAYER_CONTROLS NC_("STR_LAYER_CONTROLS", "Controls" ) +#define STR_LAYER_MEASURELINES NC_("STR_LAYER_MEASURELINES", "Dimension Lines" ) +#define STR_PAGE NC_("STR_PAGE", "Slide" ) +#define STR_PAGE_NAME NC_("STR_PAGE_NAME", "Page" ) +#define STR_SLIDE_NAME NC_("STR_SLIDE_NAME", "Slide" ) +#define STR_MASTERSLIDE_NAME NC_("STR_MASTERSLIDE_NAME", "Master Slide") +#define STR_MASTERSLIDE_LABEL NC_("STR_MASTERSLIDE_LABEL", "Master Slide:") +#define STR_MASTERPAGE_NAME NC_("STR_MASTERPAGE_NAME", "Master Page") +#define STR_MASTERPAGE_LABEL NC_("STR_MASTERPAGE_LABEL", "Master Page:") +#define STR_NOTES NC_("STR_NOTES", "(Notes)" ) +#define STR_HANDOUT NC_("STR_HANDOUT", "Handouts" ) +#define STR_PRESOBJ_MPTITLE NC_("STR_PRESOBJ_MPTITLE", "Click to edit the title text format" ) +#define STR_PRESOBJ_MPOUTLINE NC_("STR_PRESOBJ_MPOUTLINE", "Click to edit the outline text format" ) +#define STR_PRESOBJ_MPTITLE_MOBILE NC_("STR_PRESOBJ_MPTITLE_MOBILE", "Double-tap to edit the title text format" ) +#define STR_PRESOBJ_MPOUTLINE_MOBILE NC_("STR_PRESOBJ_MPOUTLINE_MOBILE", "Double-tap to edit the outline text format" ) +#define STR_PRESOBJ_MPOUTLLAYER2 NC_("STR_PRESOBJ_MPOUTLLAYER2", "Second Outline Level" ) +#define STR_PRESOBJ_MPOUTLLAYER3 NC_("STR_PRESOBJ_MPOUTLLAYER3", "Third Outline Level" ) +#define STR_PRESOBJ_MPOUTLLAYER4 NC_("STR_PRESOBJ_MPOUTLLAYER4", "Fourth Outline Level" ) +#define STR_PRESOBJ_MPOUTLLAYER5 NC_("STR_PRESOBJ_MPOUTLLAYER5", "Fifth Outline Level" ) +#define STR_PRESOBJ_MPOUTLLAYER6 NC_("STR_PRESOBJ_MPOUTLLAYER6", "Sixth Outline Level" ) +#define STR_PRESOBJ_MPOUTLLAYER7 NC_("STR_PRESOBJ_MPOUTLLAYER7", "Seventh Outline Level" ) +#define STR_PRESOBJ_MPNOTESTITLE NC_("STR_PRESOBJ_MPNOTESTITLE", "Click to move the slide" ) +#define STR_PRESOBJ_MPNOTESTEXT NC_("STR_PRESOBJ_MPNOTESTEXT", "Click to edit the notes format" ) +#define STR_PRESOBJ_MPNOTESTITLE_MOBILE NC_("STR_PRESOBJ_MPNOTESTITLE_MOBILE", "Double-tap to move the slide" ) +#define STR_PRESOBJ_MPNOTESTEXT_MOBILE NC_("STR_PRESOBJ_MPNOTESTEXT_MOBILE", "Double-tap to edit the notes format" ) +#define STR_PRESOBJ_TITLE NC_("STR_PRESOBJ_TITLE", "Click to add Title" ) +#define STR_PRESOBJ_OUTLINE NC_("STR_PRESOBJ_OUTLINE", "Click to add Text" ) +#define STR_PRESOBJ_TEXT NC_("STR_PRESOBJ_TEXT", "Click to add Text" ) +#define STR_PRESOBJ_NOTESTEXT NC_("STR_PRESOBJ_NOTESTEXT", "Click to add Notes" ) +#define STR_PRESOBJ_TITLE_MOBILE NC_("STR_PRESOBJ_TITLE_MOBILE", "Double-tap to add Title" ) +#define STR_PRESOBJ_OUTLINE_MOBILE NC_("STR_PRESOBJ_OUTLINE_MOBILE", "Double-tap to add Text" ) +#define STR_PRESOBJ_TEXT_MOBILE NC_("STR_PRESOBJ_TEXT_MOBILE", "Double-tap to add Text" ) +#define STR_PRESOBJ_TEXT_EDIT_MOBILE NC_("STR_PRESOBJ_TEXT_MOBILE", "Tap to edit text" ) +#define STR_PRESOBJ_NOTESTEXT_MOBILE NC_("STR_PRESOBJ_NOTESTEXT_MOBILE", "Double-tap to add Notes" ) +#define STR_PRESOBJ_GRAPHIC NC_("STR_PRESOBJ_GRAPHIC", "Double-click to add an Image" ) +#define STR_PRESOBJ_OBJECT NC_("STR_PRESOBJ_OBJECT", "Double-click to add an Object" ) +#define STR_PRESOBJ_CHART NC_("STR_PRESOBJ_CHART", "Double-click to add a Chart" ) +#define STR_PRESOBJ_ORGCHART NC_("STR_PRESOBJ_ORGCHART", "Double-click to add an Organization Chart" ) +#define STR_PRESOBJ_TABLE NC_("STR_PRESOBJ_TABLE", "Double-click to add a Spreadsheet" ) +#define STR_LAYOUT_DEFAULT_NAME NC_("STR_LAYOUT_DEFAULT_NAME", "Default" ) +#define STR_LAYOUT_DEFAULT_TITLE_NAME NC_("STR_LAYOUT_DEFAULT_TITLE_NAME", "Title" ) +#define STR_STANDARD_STYLESHEET_NAME NC_("STR_STANDARD_STYLESHEET_NAME", "Default Drawing Style" ) +#define STR_UNDO_MOVEPAGES NC_("STR_UNDO_MOVEPAGES", "Move slides" ) +#define STR_INSERT_PAGES NC_("STR_INSERT_PAGES", "Insert Pages" ) +#define STR_INSERT_PAGE_DRAW NC_("STR_INSERT_PAGE_DRAW", "Insert Page" ) +#define STR_SLIDE_SETUP_TITLE NC_("STR_SLIDE_SETUP_TITLE", "Slide Properties" ) + +#define STR_POOLSHEET_OBJWITHOUTFILL NC_("STR_POOLSHEET_OBJWITHOUTFILL", "Object without fill" ) +#define STR_POOLSHEET_OBJNOLINENOFILL NC_("STR_POOLSHEET_OBJNOLINENOFILL", "Object with no fill and no line" ) +#define STR_POOLSHEET_TEXT NC_("STR_POOLSHEET_TEXT", "Text" ) +#define STR_POOLSHEET_A4 NC_("STR_POOLSHEET_A4", "A4" ) +#define STR_POOLSHEET_A4_TITLE NC_("STR_POOLSHEET_A4_TITLE", "Title A4" ) +#define STR_POOLSHEET_A4_HEADLINE NC_("STR_POOLSHEET_A4_HEADLINE", "Heading A4" ) +#define STR_POOLSHEET_A4_TEXT NC_("STR_POOLSHEET_A4_TEXT", "Text A4" ) +#define STR_POOLSHEET_A0 NC_("STR_POOLSHEET_A0", "A0" ) +#define STR_POOLSHEET_A0_TITLE NC_("STR_POOLSHEET_A0_TITLE", "Title A0" ) +#define STR_POOLSHEET_A0_HEADLINE NC_("STR_POOLSHEET_A0_HEADLINE", "Heading A0" ) +#define STR_POOLSHEET_A0_TEXT NC_("STR_POOLSHEET_A0_TEXT", "Text A0" ) +#define STR_POOLSHEET_GRAPHIC NC_("STR_POOLSHEET_GRAPHIC", "Graphic" ) +#define STR_POOLSHEET_SHAPES NC_("STR_POOLSHEET_GRAPHIC", "Shapes" ) +#define STR_POOLSHEET_LINES NC_("STR_POOLSHEET_LINES", "Lines" ) +#define STR_POOLSHEET_MEASURE NC_("STR_POOLSHEET_MEASURE", "Arrow Line" ) +#define STR_POOLSHEET_LINES_DASHED NC_("STR_POOLSHEET_LINES_DASHED", "Dashed Line" ) + +#define STR_POOLSHEET_FILLED NC_("STR_POOLSHEET_FILLED", "Filled" ) +#define STR_POOLSHEET_FILLED_BLUE NC_("STR_POOLSHEET_FILLED_BLUE", "Filled Blue" ) +#define STR_POOLSHEET_FILLED_GREEN NC_("STR_POOLSHEET_FILLED_GREEN", "Filled Green" ) +#define STR_POOLSHEET_FILLED_YELLOW NC_("STR_POOLSHEET_FILLED_YELLOW", "Filled Yellow" ) +#define STR_POOLSHEET_FILLED_RED NC_("STR_POOLSHEET_FILLED_RED", "Filled Red" ) + +#define STR_POOLSHEET_OUTLINE NC_("STR_POOLSHEET_OUTLINE", "Outlined" ) +#define STR_POOLSHEET_OUTLINE_BLUE NC_("STR_POOLSHEET_OUTLINE_BLUE", "Outlined Blue" ) +#define STR_POOLSHEET_OUTLINE_GREEN NC_("STR_POOLSHEET_OUTLINE_GREEN", "Outlined Green" ) +#define STR_POOLSHEET_OUTLINE_YELLOW NC_("STR_POOLSHEET_OUTLINE_YELLOW", "Outlined Yellow" ) +#define STR_POOLSHEET_OUTLINE_RED NC_("STR_POOLSHEET_OUTLINE_RED", "Outlined Red" ) + +#define STR_PSEUDOSHEET_TITLE NC_("STR_PSEUDOSHEET_TITLE", "Title" ) +#define STR_PSEUDOSHEET_SUBTITLE NC_("STR_PSEUDOSHEET_SUBTITLE", "Subtitle") +#define STR_PSEUDOSHEET_OUTLINE NC_("STR_PSEUDOSHEET_OUTLINE", "Outline" ) +#define STR_PSEUDOSHEET_BACKGROUNDOBJECTS NC_("STR_PSEUDOSHEET_BACKGROUNDOBJECTS", "Background objects" ) +#define STR_PSEUDOSHEET_BACKGROUND NC_("STR_PSEUDOSHEET_BACKGROUND", "Background" ) +#define STR_PSEUDOSHEET_NOTES NC_("STR_PSEUDOSHEET_NOTES", "Notes" ) +#define STR_POWERPOINT_IMPORT NC_("STR_POWERPOINT_IMPORT", "PowerPoint Import") +#define STR_SAVE_DOC NC_("STR_SAVE_DOC", "Save Document" ) +#define STR_SHRINK_FONT_SIZE NC_("STR_SHRINK_FONT_SIZE", "Shrink font size") +#define STR_GROW_FONT_SIZE NC_("STR_GROW_FONT_SIZE", "Grow font size") + +/* Names and descriptions of the Draw/Impress accessibility views + ============================================================== +*/ +#define SID_SD_A11Y_D_DRAWVIEW_N NC_("SID_SD_A11Y_D_DRAWVIEW_N", "Drawing View") +#define SID_SD_A11Y_I_DRAWVIEW_N NC_("SID_SD_A11Y_I_DRAWVIEW_N", "Drawing View") +#define SID_SD_A11Y_I_OUTLINEVIEW_N NC_("SID_SD_A11Y_I_OUTLINEVIEW_N", "Outline View") +#define SID_SD_A11Y_I_SLIDEVIEW_N NC_("SID_SD_A11Y_I_SLIDEVIEW_N", "Slides View") +#define SID_SD_A11Y_I_SLIDEVIEW_D NC_("SID_SD_A11Y_I_SLIDEVIEW_D", "This is where you sort slides.") +#define SID_SD_A11Y_I_NOTESVIEW_N NC_("SID_SD_A11Y_I_NOTESVIEW_N", "Notes View") +#define SID_SD_A11Y_I_HANDOUTVIEW_N NC_("SID_SD_A11Y_I_HANDOUTVIEW_N", "Handout View") +#define SID_SD_A11Y_P_TITLE_N NC_("SID_SD_A11Y_P_TITLE_N", "PresentationTitle") +#define SID_SD_A11Y_P_OUTLINER_N NC_("SID_SD_A11Y_P_OUTLINER_N", "PresentationOutliner") +#define SID_SD_A11Y_P_SUBTITLE_N NC_("SID_SD_A11Y_P_SUBTITLE_N", "PresentationSubtitle") +#define SID_SD_A11Y_P_PAGE_N NC_("SID_SD_A11Y_P_PAGE_N", "PresentationPage") +#define SID_SD_A11Y_P_NOTES_N NC_("SID_SD_A11Y_P_NOTES_N", "PresentationNotes") +#define SID_SD_A11Y_P_HANDOUT_N NC_("SID_SD_A11Y_P_HANDOUT_N", "Handout") +#define SID_SD_A11Y_P_UNKNOWN_N NC_("SID_SD_A11Y_P_UNKNOWN_N", "UnknownAccessiblePresentationShape") +#define SID_SD_A11Y_P_FOOTER_N NC_("SID_SD_A11Y_P_FOOTER_N", "PresentationFooter") +#define SID_SD_A11Y_P_HEADER_N NC_("SID_SD_A11Y_P_HEADER_N", "PresentationHeader") +#define SID_SD_A11Y_P_DATE_N NC_("SID_SD_A11Y_P_DATE_N", "PresentationDateAndTime") +#define SID_SD_A11Y_P_NUMBER_N NC_("SID_SD_A11Y_P_NUMBER_N", "PresentationPageNumber") +#define SID_SD_A11Y_D_PRESENTATION NC_("SID_SD_A11Y_D_PRESENTATION", "%PRODUCTNAME Presentation") +#define SID_SD_A11Y_P_TITLE_N_STYLE NC_("SID_SD_A11Y_P_TITLE_N_STYLE", "Title") +#define SID_SD_A11Y_P_OUTLINER_N_STYLE NC_("SID_SD_A11Y_P_OUTLINER_N_STYLE", "Outliner") +#define SID_SD_A11Y_P_SUBTITLE_N_STYLE NC_("SID_SD_A11Y_P_SUBTITLE_N_STYLE", "Subtitle") +#define SID_SD_A11Y_P_PAGE_N_STYLE NC_("SID_SD_A11Y_P_PAGE_N_STYLE", "Page") +#define SID_SD_A11Y_P_NOTES_N_STYLE NC_("SID_SD_A11Y_P_NOTES_N_STYLE", "Notes") +#define SID_SD_A11Y_P_HANDOUT_N_STYLE NC_("SID_SD_A11Y_P_HANDOUT_N_STYLE", "Handout") +#define SID_SD_A11Y_P_UNKNOWN_N_STYLE NC_("SID_SD_A11Y_P_UNKNOWN_N_STYLE", "Unknown Accessible Presentation Shape") +#define SID_SD_A11Y_P_FOOTER_N_STYLE NC_("SID_SD_A11Y_P_FOOTER_N_STYLE", "Footer") +#define SID_SD_A11Y_P_HEADER_N_STYLE NC_("SID_SD_A11Y_P_HEADER_N_STYLE", "Header") +#define SID_SD_A11Y_P_DATE_N_STYLE NC_("SID_SD_A11Y_P_DATE_N_STYLE", "Date") +#define SID_SD_A11Y_P_NUMBER_N_STYLE NC_("SID_SD_A11Y_P_NUMBER_N_STYLE", "Number") +#define SID_SD_A11Y_D_PRESENTATION_READONLY NC_("SID_SD_A11Y_D_PRESENTATION_READONLY", "(read-only)") + +#define STR_CUSTOMANIMATION_REPEAT_NONE NC_("STR_CUSTOMANIMATION_REPEAT_NONE", "none") +#define STR_CUSTOMANIMATION_REPEAT_UNTIL_NEXT_CLICK NC_("STR_CUSTOMANIMATION_REPEAT_UNTIL_NEXT_CLICK", "Until next click") +#define STR_CUSTOMANIMATION_REPEAT_UNTIL_END_OF_SLIDE NC_("STR_CUSTOMANIMATION_REPEAT_UNTIL_END_OF_SLIDE", "Until end of slide") +#define STR_CUSTOMANIMATION_DIRECTION_PROPERTY NC_("STR_CUSTOMANIMATION_DIRECTION_PROPERTY", "Direction:") +#define STR_CUSTOMANIMATION_ZOOM_PROPERTY NC_("STR_CUSTOMANIMATION_ZOOM_PROPERTY", "Zoom:") +#define STR_CUSTOMANIMATION_SPOKES_PROPERTY NC_("STR_CUSTOMANIMATION_SPOKES_PROPERTY", "Spokes:") +#define STR_CUSTOMANIMATION_FIRST_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_FIRST_COLOR_PROPERTY", "First color:") +#define STR_CUSTOMANIMATION_SECOND_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_SECOND_COLOR_PROPERTY", "Second color:") +#define STR_CUSTOMANIMATION_FILL_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_FILL_COLOR_PROPERTY", "Fill color:") +#define STR_CUSTOMANIMATION_STYLE_PROPERTY NC_("STR_CUSTOMANIMATION_STYLE_PROPERTY", "Style:") +#define STR_CUSTOMANIMATION_FONT_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_PROPERTY", "Font:") +#define STR_CUSTOMANIMATION_FONT_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_COLOR_PROPERTY", "Font color:") +#define STR_CUSTOMANIMATION_FONT_SIZE_STYLE_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_SIZE_STYLE_PROPERTY", "Style:") +#define STR_CUSTOMANIMATION_FONT_STYLE_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_STYLE_PROPERTY", "Typeface:") +#define STR_CUSTOMANIMATION_LINE_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_LINE_COLOR_PROPERTY", "Line color:") +#define STR_CUSTOMANIMATION_SIZE_PROPERTY NC_("STR_CUSTOMANIMATION_SIZE_PROPERTY", "Font size:") +#define STR_CUSTOMANIMATION_SCALE_PROPERTY NC_("STR_CUSTOMANIMATION_SCALE_PROPERTY", "Size:") +#define STR_CUSTOMANIMATION_AMOUNT_PROPERTY NC_("STR_CUSTOMANIMATION_AMOUNT_PROPERTY", "Amount:") +#define STR_CUSTOMANIMATION_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_COLOR_PROPERTY", "Color:") +#define STR_CUSTOMANIMATION_NO_SOUND NC_("STR_CUSTOMANIMATION_NO_SOUND", "(No sound)") +#define STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND NC_("STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND", "(Stop previous sound)") +#define STR_CUSTOMANIMATION_BROWSE_SOUND NC_("STR_CUSTOMANIMATION_BROWSE_SOUND", "Other sound...") +#define STR_CUSTOMANIMATION_SAMPLE NC_("STR_CUSTOMANIMATION_SAMPLE", "Sample") +#define STR_CUSTOMANIMATION_TRIGGER NC_("STR_CUSTOMANIMATION_TRIGGER", "Trigger") +#define STR_CUSTOMANIMATION_USERPATH NC_("STR_CUSTOMANIMATION_USERPATH", "User paths") +#define STR_CUSTOMANIMATION_ENTRANCE NC_("STR_CUSTOMANIMATION_ENTRANCE", "Entrance: %1") +#define STR_CUSTOMANIMATION_EMPHASIS NC_("STR_CUSTOMANIMATION_EMPHASIS", "Emphasis: %1") +#define STR_CUSTOMANIMATION_EXIT NC_("STR_CUSTOMANIMATION_EXIT", "Exit: %1") +#define STR_CUSTOMANIMATION_MOTION_PATHS NC_("STR_CUSTOMANIMATION_MOTION_PATHS", "Motion Paths: %1") +#define STR_CUSTOMANIMATION_MISC NC_("STR_CUSTOMANIMATION_MISC", "Misc: %1") +#define STR_SLIDETRANSITION_NONE NC_("STR_SLIDETRANSITION_NONE", "None") + +#define STR_ANNOTATION_TODAY NC_("STR_ANNOTATION_TODAY", "Today," ) +#define STR_ANNOTATION_YESTERDAY NC_("STR_ANNOTATION_YESTERDAY", "Yesterday," ) +#define STR_ANNOTATION_NOAUTHOR NC_("STR_ANNOTATION_NOAUTHOR", "(no author)" ) +#define STR_ANNOTATION_WRAP_FORWARD NC_("STR_ANNOTATION_WRAP_FORWARD", "%PRODUCTNAME Impress reached the end of the presentation. Do you want to continue at the beginning?") +#define STR_ANNOTATION_WRAP_BACKWARD NC_("STR_ANNOTATION_WRAP_BACKWARD", "%PRODUCTNAME Impress reached the beginning of the presentation. Do you want to continue at the end?") +#define STR_ANNOTATION_WRAP_FORWARD_DRAW NC_("STR_ANNOTATION_WRAP_FORWARD_DRAW", "%PRODUCTNAME Draw reached the end of the document. Do you want to continue at the beginning?") +#define STR_ANNOTATION_WRAP_BACKWARD_DRAW NC_("STR_ANNOTATION_WRAP_BACKWARD_DRAW", "%PRODUCTNAME Draw reached the beginning of the document. Do you want to continue at the end?") +#define STR_ANNOTATION_UNDO_INSERT NC_("STR_ANNOTATION_UNDO_INSERT", "Insert Comment") +#define STR_ANNOTATION_UNDO_DELETE NC_("STR_ANNOTATION_UNDO_DELETE", "Delete Comment(s)") +#define STR_ANNOTATION_UNDO_MOVE NC_("STR_ANNOTATION_UNDO_MOVE", "Move Comment") +#define STR_ANNOTATION_UNDO_EDIT NC_("STR_ANNOTATION_UNDO_EDIT", "Edit Comment") +#define STR_ANNOTATION_REPLY NC_("STR_ANNOTATION_REPLY", "Reply to %1" ) + +#define RID_DRAW_MEDIA_TOOLBOX NC_("RID_DRAW_MEDIA_TOOLBOX", "Media Playback" ) +#define RID_DRAW_TABLE_TOOLBOX NC_("RID_DRAW_TABLE_TOOLBOX", "Table" ) + +#define STR_IMPRESS_PRINT_UI_GROUP_NAME NC_("STR_IMPRESS_PRINT_UI_GROUP_NAME", "%PRODUCTNAME %s") +#define STR_IMPRESS_PRINT_UI_CONTENT NC_("STR_IMPRESS_PRINT_UI_CONTENT", "Document") +#define STR_IMPRESS_PRINT_UI_SLIDESPERPAGE NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE", "Slides per page:" ) +#define STR_IMPRESS_PRINT_UI_ORDER NC_("STR_IMPRESS_PRINT_UI_ORDER", "Order:" ) +#define STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT NC_("STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT", "~Contents") +#define STR_IMPRESS_PRINT_UI_IS_PRINT_NAME NC_("STR_IMPRESS_PRINT_UI_IS_PRINT_NAME", "~Slide name") +#define STR_DRAW_PRINT_UI_IS_PRINT_NAME NC_("STR_DRAW_PRINT_UI_IS_PRINT_NAME", "P~age name") +#define STR_IMPRESS_PRINT_UI_IS_PRINT_DATE NC_("STR_IMPRESS_PRINT_UI_IS_PRINT_DATE", "~Date and time") +#define STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN NC_("STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN", "Hidden pages") +#define STR_IMPRESS_PRINT_UI_QUALITY NC_("STR_IMPRESS_PRINT_UI_QUALITY", "Color") +#define STR_IMPRESS_PRINT_UI_PAGE_OPTIONS NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS", "~Size") +#define STR_IMPRESS_PRINT_UI_BROCHURE NC_("STR_IMPRESS_PRINT_UI_BROCHURE", "Brochure") +#define STR_IMPRESS_PRINT_UI_PAGE_SIDES NC_("STR_IMPRESS_PRINT_UI_PAGE_SIDES", "Page sides") +#define STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE", "Include") +#define STR_IMPRESS_PRINT_UI_PAPER_TRAY NC_("STR_IMPRESS_PRINT_UI_PAPER_TRAY", "~Use only paper tray from printer preferences") +#define STR_IMPRESS_PRINT_UI_PAGE_RANGE NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE", "Pages:") +#define STR_IMPRESS_PRINT_UI_SLIDE_RANGE NC_("STR_IMPRESS_PRINT_UI_SLIDE_RANGE", "Slides:") + +#define STR_SAR_WRAP_FORWARD NC_("STR_SAR_WRAP_FORWARD", "%PRODUCTNAME Impress has searched to the end of the presentation. Do you want to continue at the beginning?") +#define STR_SAR_WRAP_BACKWARD NC_("STR_SAR_WRAP_BACKWARD", "%PRODUCTNAME Impress has searched to the beginning of the presentation. Do you want to continue at the end?") +#define STR_SAR_WRAP_FORWARD_DRAW NC_("STR_SAR_WRAP_FORWARD_DRAW", "%PRODUCTNAME Draw has searched to the end of the document. Do you want to continue at the beginning?") +#define STR_SAR_WRAP_BACKWARD_DRAW NC_("STR_SAR_WRAP_BACKWARD_DRAW", "%PRODUCTNAME Draw has searched to the beginning of the document. Do you want to continue at the end?") + +#define STR_ANIMATION_DIALOG_TITLE NC_("STR_ANIMATION_DIALOG_TITLE", "Animation") + +#define RID_SVXSTR_EDIT_GRAPHIC NC_("RID_SVXSTR_EDIT_GRAPHIC", "Link") + +#define RID_SVXSTR_MENU_NEXT NC_("RID_SVXSTR_MENU_NEXT", "~Next") +#define RID_SVXSTR_MENU_PREV NC_("RID_SVXSTR_MENU_NEXT", "~Previous") +#define RID_SVXSTR_MENU_FIRST NC_("RID_SVXSTR_MENU_FIRST", "~First Slide") +#define RID_SVXSTR_MENU_LAST NC_("RID_SVXSTR_MENU_LAST", "~Last Slide") + +#define STR_CLOSE_PANE NC_("STR_CLOSE_PANE", "Close Pane") +#define STR_INSERT_TABLESTYLE NC_("STR_INSERT_TABLESTYLE", "Add a new design") +#define STR_REMOVE_TABLESTYLE NC_("STR_REMOVE_TABLESTYLE", "The selected style is in use in this document.\nIf you will delete this style, tables using it will revert to the default style.\nDo you still wish to delete this style?\n") + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/strings.hxx b/sd/inc/strings.hxx new file mode 100644 index 0000000000..6fe0ea594c --- /dev/null +++ b/sd/inc/strings.hxx @@ -0,0 +1,23 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include + +/* do not translate */ +inline constexpr OUString STR_LAYOUT_TITLE = u"Titel"_ustr; +inline constexpr OUString STR_LAYOUT_OUTLINE = u"Gliederung"_ustr; +inline constexpr OUString STR_LAYOUT_BACKGROUND = u"Hintergrund"_ustr; +inline constexpr OUString STR_LAYOUT_BACKGROUNDOBJECTS = u"Hintergrundobjekte"_ustr; +inline constexpr OUString STR_LAYOUT_NOTES = u"Notizen"_ustr; +inline constexpr OUString STR_LAYOUT_SUBTITLE = u"Untertitel"_ustr; +#define STR_HTMLEXP_DEFAULT_EXTENSION ".html" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/inc/textapi.hxx b/sd/inc/textapi.hxx new file mode 100644 index 0000000000..7011034905 --- /dev/null +++ b/sd/inc/textapi.hxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; + +namespace sd { + +class TextAPIEditSource; + +class TextApiObject final : public SvxUnoText +{ +public: + static rtl::Reference< TextApiObject > create( SdDrawDocument* pDoc ); + + virtual ~TextApiObject() noexcept override; + + /// @throws css::uno::RuntimeException + void dispose(); + + std::optional CreateText(); + void SetText( OutlinerParaObject const & rText ); + OUString GetText() const; + + static TextApiObject* getImplementation( const css::uno::Reference< css::text::XText >& ); + +private: + std::unique_ptr mpSource; + TextApiObject( std::unique_ptr pEditSource ); +}; + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/theme/ThemeColorChanger.hxx b/sd/inc/theme/ThemeColorChanger.hxx new file mode 100644 index 0000000000..ff100fd511 --- /dev/null +++ b/sd/inc/theme/ThemeColorChanger.hxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace sd +{ +class SD_DLLPUBLIC ThemeColorChanger : public svx::IThemeColorChanger +{ +private: + SdrPage* mpMasterPage; + sd::DrawDocShell* mpDocShell; + +public: + ThemeColorChanger(SdrPage* pMasterPage, sd::DrawDocShell* pDocShell); + virtual ~ThemeColorChanger() override; + + void apply(std::shared_ptr const& pColorSet) override; +}; + +} // end sd namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/undo/undofactory.hxx b/sd/inc/undo/undofactory.hxx new file mode 100644 index 0000000000..92b875c78f --- /dev/null +++ b/sd/inc/undo/undofactory.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ + +class UndoFactory final : public SdrUndoFactory +{ +public: + virtual std::unique_ptr CreateUndoRemoveObject(SdrObject& rObject) override; + virtual std::unique_ptr CreateUndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect = false) override; + virtual std::unique_ptr CreateUndoObjectSetText( SdrObject& rNewObj, sal_Int32 nText ) override; + virtual std::unique_ptr CreateUndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject ) override; + virtual std::unique_ptr CreateUndoGeoObject( SdrObject& rObject ) override; + virtual std::unique_ptr CreateUndoAttrObject( SdrObject& rObject, bool bStyleSheet1 = false, bool bSaveText = false ) override; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/undo/undomanager.hxx b/sd/inc/undo/undomanager.hxx new file mode 100644 index 0000000000..f4b2e6dd4e --- /dev/null +++ b/sd/inc/undo/undomanager.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ + +class UndoManager final : public SdrUndoManager +{ +public: + UndoManager(); + + virtual void EnterListAction(const OUString &rComment, const OUString& rRepeatComment, sal_uInt16 nId, ViewShellId nViewShellId) override; + + virtual void AddUndoAction( std::unique_ptr pAction, bool bTryMerg=false ) override; + + /** Set or reset the undo manager linked with the called undo manager. + */ + void SetLinkedUndoManager (SfxUndoManager* pLinkedUndoManager); + +private: + using SdrUndoManager::Undo; + using SdrUndoManager::Redo; + + /** Used when the outline view is visible as a last resort to + synchronize the undo managers. + */ + SfxUndoManager* mpLinkedUndoManager; + + /** Call ClearRedo() at the linked undo manager, when present. + + It should not be necessary to call ClearRedo() explicitly, but the + synchronization between the under managers of the document and the + outline view seems to have a bug. Therefore this method is called + whenever a new undo action is added. + */ + void ClearLinkedRedoActions(); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/undo/undoobjects.hxx b/sd/inc/undo/undoobjects.hxx new file mode 100644 index 0000000000..830ced1464 --- /dev/null +++ b/sd/inc/undo/undoobjects.hxx @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +class SdrObjUserCall; +class SdPage; + +namespace sd +{ +class UndoRemovePresObjectImpl +{ +protected: + UndoRemovePresObjectImpl(SdrObject& rObject); + virtual ~UndoRemovePresObjectImpl(); + + virtual void Undo(); + virtual void Redo(); + +private: + std::unique_ptr mpUndoUsercall; + std::unique_ptr mpUndoAnimation; + std::unique_ptr mpUndoPresObj; +}; + +class UndoRemoveObject final : public SdrUndoRemoveObj, public UndoRemovePresObjectImpl +{ +public: + UndoRemoveObject(SdrObject& rObject); + + virtual void Undo() override; + virtual void Redo() override; + +private: + ::unotools::WeakReference mxSdrObject; +}; + +class UndoDeleteObject final : public SdrUndoDelObj, public UndoRemovePresObjectImpl +{ +public: + UndoDeleteObject(SdrObject& rObject, bool bOrdNumDirect); + + virtual void Undo() override; + virtual void Redo() override; + +private: + ::unotools::WeakReference mxSdrObject; +}; + +class UndoReplaceObject final : public SdrUndoReplaceObj, public UndoRemovePresObjectImpl +{ +public: + UndoReplaceObject(SdrObject& rOldObject, SdrObject& rNewObject); + + virtual void Undo() override; + virtual void Redo() override; + +private: + ::unotools::WeakReference mxSdrObject; +}; + +class UndoObjectSetText final : public SdrUndoObjSetText +{ +public: + UndoObjectSetText(SdrObject& rNewObj, sal_Int32 nText); + virtual ~UndoObjectSetText() override; + + virtual void Undo() override; + virtual void Redo() override; + +private: + std::unique_ptr mpUndoAnimation; + bool mbNewEmptyPresObj; + ::unotools::WeakReference mxSdrObject; +}; + +// Undo for SdrObject::SetUserCall() + +class UndoObjectUserCall final : public SdrUndoObj +{ +public: + UndoObjectUserCall(SdrObject& rNewObj); + + virtual void Undo() override; + virtual void Redo() override; + +private: + SdrObjUserCall* mpOldUserCall; + SdrObjUserCall* mpNewUserCall; + ::unotools::WeakReference mxSdrObject; +}; + +// Undo for SdPage::InsertPresObj() and SdPage::RemovePresObj() + +class UndoObjectPresentationKind final : public SdrUndoObj +{ +public: + UndoObjectPresentationKind(SdrObject& rObject); + + virtual void Undo() override; + virtual void Redo() override; + +private: + PresObjKind meOldKind; + PresObjKind meNewKind; + ::unotools::WeakReference mxPage; + ::unotools::WeakReference mxSdrObject; +}; + +// Restores correct position and size for presentation shapes with user call +// on undo + +class UndoAutoLayoutPosAndSize final : public SfxUndoAction +{ +public: + UndoAutoLayoutPosAndSize(SdPage& rPage); + + virtual void Undo() override; + virtual void Redo() override; + +private: + ::unotools::WeakReference mxPage; +}; + +class UndoGeoObject final : public SdrUndoGeoObj +{ +public: + UndoGeoObject(SdrObject& rNewObj); + + virtual void Undo() override; + virtual void Redo() override; + +private: + ::unotools::WeakReference mxPage; + ::unotools::WeakReference mxSdrObject; +}; + +class UndoAttrObject final : public SdrUndoAttrObj +{ +public: + UndoAttrObject(SdrObject& rObject, bool bStyleSheet1, bool bSaveText); + + virtual void Undo() override; + virtual void Redo() override; + +private: + ::unotools::WeakReference mxPage; + ::unotools::WeakReference mxSdrObject; +}; + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/undoanim.hxx b/sd/inc/undoanim.hxx new file mode 100644 index 0000000000..2d329b50da --- /dev/null +++ b/sd/inc/undoanim.hxx @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include "sdundo.hxx" + +class SdPage; + +namespace sd +{ +struct UndoAnimationImpl; + +class UndoAnimation final : public SdrUndoAction +{ +public: + UndoAnimation(SdDrawDocument* pDoc, SdPage* pThePage); + virtual ~UndoAnimation() override; + + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; + +private: + std::unique_ptr mpImpl; +}; + +struct UndoAnimationPathImpl; +class UndoAnimationPath final : public SdrUndoAction +{ +public: + UndoAnimationPath(SdDrawDocument* pDoc, SdPage* pThePage, + const css::uno::Reference& xNode); + virtual ~UndoAnimationPath() override; + + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; + +private: + std::unique_ptr mpImpl; +}; + +struct UndoTransitionImpl; + +class UndoTransition final : public SdUndoAction +{ +public: + UndoTransition(SdDrawDocument* pDoc, SdPage* pThePage); + virtual ~UndoTransition() override; + + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; + +private: + std::unique_ptr mpImpl; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/inc/viewopt.hxx b/sd/inc/viewopt.hxx new file mode 100644 index 0000000000..03ebd2ada6 --- /dev/null +++ b/sd/inc/viewopt.hxx @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +/// View options for the current view +struct SdViewOptions +{ + // The color of the area behind the slide (used to be called "Wiese") + Color mnAppBackgroundColor; + // The color of the document background + Color mnDocBackgroundColor; + // The name of the color scheme + OUString msColorSchemeName = "Default"; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx b/sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx new file mode 100644 index 0000000000..b37d7b6a88 Binary files /dev/null and b/sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx differ diff --git a/sd/qa/filter/eppt/data/video-loop.pptx b/sd/qa/filter/eppt/data/video-loop.pptx new file mode 100644 index 0000000000..4cb7e20b74 Binary files /dev/null and b/sd/qa/filter/eppt/data/video-loop.pptx differ diff --git a/sd/qa/filter/eppt/eppt.cxx b/sd/qa/filter/eppt/eppt.cxx new file mode 100644 index 0000000000..b84630c971 --- /dev/null +++ b/sd/qa/filter/eppt/eppt.cxx @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; + +namespace +{ +/// Covers sd/source/filter/eppt/ fixes. +class Test : public UnoApiXmlTest +{ +public: + Test(); +}; + +Test::Test() + : UnoApiXmlTest("/sd/qa/filter/eppt/data/") +{ +} + +CPPUNIT_TEST_FIXTURE(Test, testOOXMLCustomShapeBitmapFill) +{ + // Save the bugdoc to PPT. + loadFromFile(u"custom-shape-bitmap-fill.pptx"); + saveAndReload("MS PowerPoint 97"); + + // Check if the bitmap shape was lost. + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: com.sun.star.drawing.GraphicObjectShape + // - Actual : com.sun.star.drawing.CustomShape + // i.e. the custom shape geometry was kept, but the actual bitmap was lost. + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GraphicObjectShape"), + xShape->getShapeType()); +} + +CPPUNIT_TEST_FIXTURE(Test, testThemeExport) +{ + // Given a document with a master slide and a theme, lt1 is set to 0x000002: + mxComponent = loadFromDesktop("private:factory/simpress"); + { + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xMasterPage(xDrawPage->getMasterPage(), uno::UNO_QUERY); + + auto pTheme = std::make_shared("mytheme"); + auto pColorSet = std::make_shared("mycolorscheme"); + pColorSet->add(model::ThemeColorType::Dark1, 0x111111); + pColorSet->add(model::ThemeColorType::Light1, 0x222222); + pColorSet->add(model::ThemeColorType::Dark2, 0x333333); + pColorSet->add(model::ThemeColorType::Light2, 0x444444); + pColorSet->add(model::ThemeColorType::Accent1, 0x555555); + pColorSet->add(model::ThemeColorType::Accent2, 0x666666); + pColorSet->add(model::ThemeColorType::Accent3, 0x777777); + pColorSet->add(model::ThemeColorType::Accent4, 0x888888); + pColorSet->add(model::ThemeColorType::Accent5, 0x999999); + pColorSet->add(model::ThemeColorType::Accent6, 0xaaaaaa); + pColorSet->add(model::ThemeColorType::Hyperlink, 0xbbbbbb); + pColorSet->add(model::ThemeColorType::FollowedHyperlink, 0xcccccc); + pTheme->setColorSet(pColorSet); + + xMasterPage->setPropertyValue("Theme", uno::Any(model::theme::createXTheme(pTheme))); + } + + // Export to PPTX and load again: + saveAndReload("Impress Office Open XML"); + + // Verify that this color is not lost: + xmlDocUniquePtr pXmlDoc = parseExport("ppt/theme/theme1.xml"); + assertXPath(pXmlDoc, "//a:clrScheme/a:lt1/a:srgbClr"_ostr, "val"_ostr, + "222222"); // expected color 22-22-22 + + // Check the theme after loading again + { + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xMasterPage(xDrawPage->getMasterPage(), uno::UNO_QUERY); + uno::Reference xTheme(xMasterPage->getPropertyValue("Theme"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, xTheme.is()); + + auto* pUnoTheme = dynamic_cast(xTheme.get()); + CPPUNIT_ASSERT(pUnoTheme); + auto pTheme = pUnoTheme->getTheme(); + + CPPUNIT_ASSERT_EQUAL(OUString("mytheme"), pTheme->GetName()); + CPPUNIT_ASSERT_EQUAL(OUString("mycolorscheme"), pTheme->getColorSet()->getName()); + CPPUNIT_ASSERT_EQUAL(OUString("Office"), pTheme->getFontScheme().getName()); + CPPUNIT_ASSERT_EQUAL(OUString(""), pTheme->getFormatScheme().getName()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testLoopingFromAnimation) +{ + // Given a media shape that has an animation that specifies looping for the video: + loadFromFile(u"video-loop.pptx"); + + // When exporting that to PPTX: + save("Impress Office Open XML"); + + // Then make sure that the "infinite" repeat count is written: + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + // Without the fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - In <>, XPath '//p:cMediaNode/p:cTn' number of nodes is incorrect + // i.e. the media node was lost on export, the video no longer looped. + assertXPath(pXmlDoc, "//p:cMediaNode/p:cTn"_ostr, "repeatCount"_ostr, "indefinite"); +} +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/uitest/data/LibreOffice.jpg b/sd/qa/uitest/data/LibreOffice.jpg new file mode 100644 index 0000000000..23812dcfdd Binary files /dev/null and b/sd/qa/uitest/data/LibreOffice.jpg differ diff --git a/sd/qa/uitest/data/embedded.pptx b/sd/qa/uitest/data/embedded.pptx new file mode 100644 index 0000000000..956fda7e91 Binary files /dev/null and b/sd/qa/uitest/data/embedded.pptx differ diff --git a/sd/qa/uitest/data/findReplace.odp b/sd/qa/uitest/data/findReplace.odp new file mode 100644 index 0000000000..6ccbfcfed7 Binary files /dev/null and b/sd/qa/uitest/data/findReplace.odp differ diff --git a/sd/qa/uitest/data/tdf119246.odp b/sd/qa/uitest/data/tdf119246.odp new file mode 100644 index 0000000000..0d2ac4c56e Binary files /dev/null and b/sd/qa/uitest/data/tdf119246.odp differ diff --git a/sd/qa/uitest/data/tdf127900.fodp b/sd/qa/uitest/data/tdf127900.fodp new file mode 100644 index 0000000000..adedafc275 --- /dev/null +++ b/sd/qa/uitest/data/tdf127900.fodp @@ -0,0 +1,778 @@ + + + + 2021-08-30T08:55:10.394000000LibreOffice/7.1.1.2$Windows_X86_64 LibreOffice_project/fe0b08f4af1bacafe4c7ecc87ce55bb4261646762021-08-30T08:56:29.116000000PT7S1 + + + 0 + 0 + 14099 + 9999 + + + view1 + false + false + true + true + true + true + false + false + true + 1500 + false + Hw== + Hw== + + false + true + false + 0 + 1 + false + true + true + 4 + 0 + -974 + -423 + 28894 + 17739 + 2000 + 2000 + 500 + 500 + 2000 + 4 + 2000 + 4 + false + 1500 + true + false + + + + + true + $(inst)/share/palette%3B$(user)/config/standard.sob + 0 + $(inst)/share/palette%3B$(user)/config/standard.soc + $(inst)/share/palette%3B$(user)/config/standard.sod + 1250 + true + true + false + true + false + $(inst)/share/palette%3B$(user)/config/standard.sog + true + $(inst)/share/palette%3B$(user)/config/standard.soh + false + false + true + true + false + true + false + false + true + false + false + false + false + false + $(inst)/share/palette%3B$(user)/config/standard.soe + false + 4 + false + 0 + low-resolution + Microsoft Print to PDF + false + GRb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEANhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABQFAMvAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDIACQDLBE/XXt+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAFNNVEoAAAAAEAC4AHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAsEQAAVjRETQEAAAAAAAAAnApwIhwAAADsAAAAAwAAAPoBTwg05ndNg+4HSBfANYHQAAAATAAAAAMAAAAACAAAAAAAAAAAAAADAAAAAAgAACoAAAAACAAAAwAAAEAAAABWAAAAABAAAEQAbwBjAHUAbQBlAG4AdABVAHMAZQByAFAAYQBzAHMAdwBvAHIAZAAAAEQAbwBjAHUAbQBlAG4AdABPAHcAbgBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AEMAcgB5AHAAdABTAGUAYwB1AHIAaQB0AHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgBDT01QQVRfRFVQTEVYX01PREUTAER1cGxleE1vZGU6OlVua25vd24= + true + false + 6 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/uitest/data/tdf144943.pptx b/sd/qa/uitest/data/tdf144943.pptx new file mode 100644 index 0000000000..e03788fbad Binary files /dev/null and b/sd/qa/uitest/data/tdf144943.pptx differ diff --git a/sd/qa/uitest/data/tdf146019.jpg b/sd/qa/uitest/data/tdf146019.jpg new file mode 100644 index 0000000000..eba4055a11 Binary files /dev/null and b/sd/qa/uitest/data/tdf146019.jpg differ diff --git a/sd/qa/uitest/data/tdf155863.odp b/sd/qa/uitest/data/tdf155863.odp new file mode 100644 index 0000000000..2ae286c05d Binary files /dev/null and b/sd/qa/uitest/data/tdf155863.odp differ diff --git a/sd/qa/uitest/findReplace/findReplace.py b/sd/qa/uitest/findReplace/findReplace.py new file mode 100644 index 0000000000..130765a865 --- /dev/null +++ b/sd/qa/uitest/findReplace/findReplace.py @@ -0,0 +1,105 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file + +class findReplace(UITestCase): + def test_find_impress(self): + with self.ui_test.load_file(get_url_for_data_file("findReplace.odp")) as impress_doc: + + # check current slide is 1 + self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 1) + + self.assertEqual("First first first", impress_doc.DrawPages[0].getByIndex(1).String) + self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String) + self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String) + self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String) + + # search for string "second" + with self.ui_test.execute_modeless_dialog_through_command(".uno:SearchDialog", close_button="close") as xDialog: + searchterm = xDialog.getChild("searchterm") + searchterm.executeAction("TYPE", mkPropertyValues({"TEXT":"second"})) #2nd slide + xsearch = xDialog.getChild("search") + xsearch.executeAction("CLICK", tuple()) + + # verify we moved to slide 2 + self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 2) + + # search for string "third" + searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + searchterm.executeAction("TYPE", mkPropertyValues({"TEXT":"third"})) + xsearch.executeAction("CLICK", tuple()) + + #verify we moved to slide 3 + self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 3) #3rd slide + + self.assertEqual("First first first", impress_doc.DrawPages[0].getByIndex(1).String) + self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String) + self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String) + self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String) + + # now open dialog and verify find="third" (remember last value); + # replace value with "First" (click match case) with word "Replace" + # click twice the Replace button, check "Replace first first" + + # open the dialog again + with self.ui_test.execute_modeless_dialog_through_command(".uno:SearchDialog", close_button="close") as xDialog: + + # verify search string is still "third" from previous search + searchterm = xDialog.getChild("searchterm") + self.assertEqual(get_state_as_dict(searchterm)["Text"], "third") + + # replace it with "First" + searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + searchterm.executeAction("TYPE", mkPropertyValues({"TEXT":"First"})) + + # click "match case" + matchcase = xDialog.getChild("matchcase") + matchcase.executeAction("CLICK", tuple()) #click match case + + # set the replace string to "Replace" + replaceterm = xDialog.getChild("replaceterm") + replaceterm.executeAction("TYPE", mkPropertyValues({"TEXT":"Replace"})) #replace textbox + + # hit replace button 2 times + replace = xDialog.getChild("replace") + + replace.executeAction("CLICK", tuple()) + replace.executeAction("CLICK", tuple()) #click twice Replace button (one selects, second replaces) + + # now replace first (uncheck match case) with word "aaa" - click once Replace All button, check "Replace aaa aaa" + matchcase = xDialog.getChild("matchcase") + matchcase.executeAction("CLICK", tuple()) # uncheck match case + + self.assertEqual("Replace first first", impress_doc.DrawPages[0].getByIndex(1).String) + self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String) + # tdf#145868 - Third was search for earlier, but never should have been replaced + self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String) + self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String) + + replaceterm = xDialog.getChild("replaceterm") + replaceterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + replaceterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + replaceterm.executeAction("TYPE", mkPropertyValues({"TEXT":"aaa"})) + replaceall = xDialog.getChild("replaceall") + replaceall.executeAction("CLICK", tuple()) # click on replace all button + + self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 1) + + # tdf#122788: Without the fix in place, this test would have failed with + # AssertionError: 'Replace aaa aaa' != 'Replace first first' + self.assertEqual("Replace aaa aaa", impress_doc.DrawPages[0].getByIndex(1).String) + self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String) + self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String) + self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/autocorrectOptions.py b/sd/qa/uitest/impress_tests/autocorrectOptions.py new file mode 100644 index 0000000000..2f4b7645e3 --- /dev/null +++ b/sd/qa/uitest/impress_tests/autocorrectOptions.py @@ -0,0 +1,101 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict +from uitest.uihelper.common import select_pos + + +class autocorrectOptions(UITestCase): + + def test_autocorrect_options_impress(self): + with self.ui_test.create_doc_in_start_center("impress"): + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:AutoCorrectDlg", close_button="cancel") as xDialog: + xTabs = xDialog.getChild("tabcontrol") + select_pos(xTabs, "0") #tab replace + origtext = xDialog.getChild("origtext") + newtext = xDialog.getChild("newtext") + xnew = xDialog.getChild("new") + xdelete = xDialog.getChild("delete") + xtabview = xDialog.getChild("tabview") + xreset = xDialog.getChild("reset") + nrRows = get_state_as_dict(xtabview)["VisibleCount"] + + self.assertTrue(int(nrRows) > 0) + + #add new rule + origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + origtext.executeAction("TYPE", mkPropertyValues({"TEXT":"::::"})) + newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + newtext.executeAction("TYPE", mkPropertyValues({"TEXT":"dvojtecky"})) + xnew.executeAction("CLICK", tuple()) + nrRowsNew = get_state_as_dict(xtabview)["VisibleCount"] + nrRowsDiff = int(nrRowsNew) - int(nrRows) + self.assertEqual(nrRowsDiff, 1) #we have +1 rule + #delete rule + origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + origtext.executeAction("TYPE", mkPropertyValues({"TEXT":"::::"})) + newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + newtext.executeAction("TYPE", mkPropertyValues({"TEXT":"dvojtecky"})) + xdelete.executeAction("CLICK", tuple()) + self.assertEqual(get_state_as_dict(xtabview)["VisibleCount"], nrRows) #we have default nr of rules + + select_pos(xTabs, "1") #tab Exceptions + #abbreviations + abbrev = xDialog.getChild("abbrev") + newabbrev = xDialog.getChild("newabbrev") + delabbrev = xDialog.getChild("delabbrev") + abbrevlist = xDialog.getChild("abbrevlist") + + nrRowsAbb = get_state_as_dict(abbrevlist)["VisibleCount"] + + self.assertTrue(int(nrRowsAbb) > 0) + + abbrev.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + abbrev.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + abbrev.executeAction("TYPE", mkPropertyValues({"TEXT":"qqqqq"})) + newabbrev.executeAction("CLICK", tuple()) + nrRowsAbbNew = get_state_as_dict(abbrevlist)["VisibleCount"] + nrRowsAbbDiff = int(nrRowsAbbNew) - int(nrRowsAbb) + self.assertEqual(nrRowsAbbDiff, 1) #we have +1 rule + delabbrev.executeAction("CLICK", tuple()) + self.assertEqual(get_state_as_dict(abbrevlist)["VisibleCount"], nrRowsAbb) #we have default nr of rules + + #words with two initial capitals + double = xDialog.getChild("double") + newdouble = xDialog.getChild("newdouble") + deldouble = xDialog.getChild("deldouble") + doublelist = xDialog.getChild("doublelist") + + nrRowsDouble = get_state_as_dict(doublelist)["VisibleCount"] + + self.assertTrue(int(nrRowsDouble) > 0) + + double.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + double.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + double.executeAction("TYPE", mkPropertyValues({"TEXT":"QQqqq"})) + newdouble.executeAction("CLICK", tuple()) + nrRowsDoubleNew = get_state_as_dict(doublelist)["VisibleCount"] + nrRowsDoubleDiff = int(nrRowsDoubleNew) - int(nrRowsDouble) #convert string and + self.assertEqual(nrRowsDoubleDiff, 1) #we have +1 rule + deldouble.executeAction("CLICK", tuple()) + self.assertEqual(get_state_as_dict(doublelist)["VisibleCount"], nrRowsDouble) #we have default nr of rules + + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/customSlideShow.py b/sd/qa/uitest/impress_tests/customSlideShow.py new file mode 100644 index 0000000000..f070a1ca1c --- /dev/null +++ b/sd/qa/uitest/impress_tests/customSlideShow.py @@ -0,0 +1,74 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +import importlib +from uitest.uihelper.common import select_pos +from uitest.uihelper.common import get_state_as_dict, type_text + +class customSlideShow(UITestCase): + def test_customSlideShow(self): + with self.ui_test.create_doc_in_start_center("impress"): + MainWindow = self.xUITest.getTopFocusWindow() + TemplateDialog = self.xUITest.getTopFocusWindow() + cancel = TemplateDialog.getChild("close") + self.ui_test.close_dialog_through_button(cancel) + with self.ui_test.execute_dialog_through_command(".uno:CustomShowDialog") as CustomSlideShows: + new = CustomSlideShows.getChild("new") + + with self.ui_test.execute_blocking_action(new.executeAction, args=('CLICK', ())) as DefineCustomSlideShow: + customname = DefineCustomSlideShow.getChild("customname") + customname.executeAction("TYPE", mkPropertyValues({"KEYCODE": "BACKSPACE"})) + customname.executeAction("TYPE", mkPropertyValues({"TEXT": "a"})) + customname.executeAction("TYPE", mkPropertyValues({"TEXT": "a"})) + pages = DefineCustomSlideShow.getChild("pages") + xEntry = pages.getChild("0") + xEntry.executeAction("SELECT", tuple()) + add = DefineCustomSlideShow.getChild("add") + add.executeAction("CLICK",tuple()) + + #verify + with self.ui_test.execute_dialog_through_command(".uno:CustomShowDialog") as CustomSlideShows: + edit = CustomSlideShows.getChild("edit") + customshowlist = CustomSlideShows.getChild("customshowlist") + self.assertEqual(get_state_as_dict(customshowlist)["SelectionCount"], "1") + + with self.ui_test.execute_blocking_action(edit.executeAction, args=('CLICK', ()), close_button="cancel") as DefineCustomSlideShow: + customname = DefineCustomSlideShow.getChild("customname") + self.assertEqual(get_state_as_dict(customname)["Text"], "aa") + custompages = DefineCustomSlideShow.getChild("custompages") + pages = DefineCustomSlideShow.getChild("pages") + remove = DefineCustomSlideShow.getChild("remove") + self.assertEqual(get_state_as_dict(custompages)["Children"], "1") + self.assertEqual(get_state_as_dict(pages)["Children"], "1") + xEntry = custompages.getChild("0") + xEntry.executeAction("SELECT", tuple()) +# remove.executeAction("CLICK",tuple()) #tdf126951 + self.assertEqual(get_state_as_dict(custompages)["Children"], "1") + self.assertEqual(get_state_as_dict(pages)["Children"], "1") + + delete = CustomSlideShows.getChild("delete") + customshowlist = CustomSlideShows.getChild("customshowlist") + self.assertEqual(get_state_as_dict(customshowlist)["Children"], "1") + +# delete.executeAction("CLICK",tuple()) +# self.assertEqual(get_state_as_dict(customshowlist)["Children"], "0") + + def test_tdf143125(self): + with self.ui_test.create_doc_in_start_center("impress"): + MainWindow = self.xUITest.getTopFocusWindow() + TemplateDialog = self.xUITest.getTopFocusWindow() + cancel = TemplateDialog.getChild("close") + self.ui_test.close_dialog_through_button(cancel) + with self.ui_test.execute_dialog_through_command(".uno:CustomShowDialog") as CustomSlideShows: + # Without the fix in place, this test would have crashed here + pass + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/embedded.py b/sd/qa/uitest/impress_tests/embedded.py new file mode 100644 index 0000000000..e324424f6f --- /dev/null +++ b/sd/qa/uitest/impress_tests/embedded.py @@ -0,0 +1,37 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_url_for_data_file +from libreoffice.calc.document import get_cell_by_position + +class EmbeddedDocument(UITestCase): + + def test_open_embedded_document(self): + with self.ui_test.load_file(get_url_for_data_file("embedded.pptx")): + + xImpressDoc = self.xUITest.getTopFocusWindow() + xEditWin = xImpressDoc.getChild("impress_win") + + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Object 2"})) + + xEditWin.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"})) + + document = self.ui_test.get_component() + self.assertEqual("Name", get_cell_by_position(document, 0, 0, 0).getString()) + self.assertEqual("NWell", get_cell_by_position(document, 0, 0, 1).getString()) + self.assertEqual("PWell", get_cell_by_position(document, 0, 0, 2).getString()) + self.assertEqual("Active", get_cell_by_position(document, 0, 0, 3).getString()) + self.assertEqual("NoPoly", get_cell_by_position(document, 0, 0, 4).getString()) + self.assertEqual("Poly", get_cell_by_position(document, 0, 0, 5).getString()) + self.assertEqual("Sized", get_cell_by_position(document, 0, 0, 6).getString()) + + self.xUITest.executeCommand(".uno:CloseDoc") + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/exportToPDF.py b/sd/qa/uitest/impress_tests/exportToPDF.py new file mode 100644 index 0000000000..429e28df4f --- /dev/null +++ b/sd/qa/uitest/impress_tests/exportToPDF.py @@ -0,0 +1,82 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues +from org.libreoffice.unotest import systemPathToFileUrl +from tempfile import TemporaryDirectory +import os.path + + +class exportToPDF(UITestCase): + + def test_checkDefaultValues(self): + + with TemporaryDirectory() as tempdir: + xFilePath = os.path.join(tempdir, 'exportToPDFFromImpress-tmp.pdf') + + with self.ui_test.create_doc_in_start_center("impress"): + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + xDoc = self.xUITest.getTopFocusWindow() + xEdit = xDoc.getChild("impress_win") + + xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"Hello World"})) + + # Export as PDF + with self.ui_test.execute_dialog_through_command('.uno:ExportToPDF', close_button="") as xDialog: + + selectedChildren = ['bookmarks', 'display', 'effects', 'enablea11y', + 'enablecopy', 'exporturl', 'forms', 'reduceresolution', 'tagged'] + + for child in selectedChildren: + self.assertEqual("true", get_state_as_dict(xDialog.getChild(child))['Selected']) + + nonSelectedChildren = ['allowdups', 'center', 'comments', 'convert', 'embed', 'emptypages', 'export', 'exportplaceholders', + 'firstonleft', 'hiddenpages', 'menubar', 'notes', 'onlynotes', 'open', 'pdfa', 'pdfua', 'resize', 'singlepagesheets', + 'toolbar', 'usereferencexobject', 'viewpdf', 'watermark', 'window'] + + for child in nonSelectedChildren: + self.assertEqual("false", get_state_as_dict(xDialog.getChild(child))['Selected']) + + checkedChildren = ['all', 'allbookmarks', 'changeany', 'default', 'defaultlayout', 'fitdefault', 'jpegcompress', 'outline', 'printhigh'] + + for child in checkedChildren: + self.assertEqual("true", get_state_as_dict(xDialog.getChild(child))['Checked']) + + nonCheckedChildren = ['changecomment', 'changeform', 'changeinsdel', 'changenone', 'contfacinglayout', 'contlayout', 'fitvis', + 'fitwidth', 'fitwin', 'fitzoom', 'losslesscompress', 'openinternet', 'openpdf', 'pageonly', 'printlow', 'printnone', 'range', + 'selection', 'singlelayout', 'thumbs', 'visiblebookmark'] + + for child in nonCheckedChildren: + self.assertEqual("false", get_state_as_dict(xDialog.getChild(child))['Checked']) + + self.assertEqual("300 DPI", get_state_as_dict(xDialog.getChild("resolution"))['Text']) + self.assertEqual("90", get_state_as_dict(xDialog.getChild("quality"))['Value']) + self.assertEqual("FDF", get_state_as_dict(xDialog.getChild("format"))['DisplayText']) + + xOk = xDialog.getChild("ok") + with self.ui_test.execute_dialog_through_action(xOk, "CLICK", close_button="open") as xSaveDialog: + xFileName = xSaveDialog.getChild('file_name') + xFileName.executeAction('TYPE', mkPropertyValues({'KEYCODE':'CTRL+A'})) + xFileName.executeAction('TYPE', mkPropertyValues({'KEYCODE':'BACKSPACE'})) + xFileName.executeAction('TYPE', mkPropertyValues({'TEXT': xFilePath})) + + with self.ui_test.load_file(systemPathToFileUrl(xFilePath)) as document: + + self.assertEqual("", document.DrawPages[0].getByIndex(0).String) + self.assertEqual(" ", document.DrawPages[0].getByIndex(1).String) + self.assertEqual(" ", document.DrawPages[0].getByIndex(2).String) + self.assertEqual("Hello World", document.DrawPages[0].getByIndex(3).String) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/insertSlide.py b/sd/qa/uitest/impress_tests/insertSlide.py new file mode 100644 index 0000000000..83f33c5978 --- /dev/null +++ b/sd/qa/uitest/impress_tests/insertSlide.py @@ -0,0 +1,50 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +#Bug 85360 - LibreOffice crashes and crashes desktop too on inserting 4th slide + + +class insertSlide(UITestCase): + + def test_insert_slide(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages + + self.xUITest.executeCommand(".uno:InsertPage") + + #verify + self.assertEqual(document.DrawPages.getCount(), 2) #nr. of pages + #undo + self.xUITest.executeCommand(".uno:Undo") + self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages + + def test_tdf85360_insert_4th_slide(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages + + self.xUITest.executeCommand(".uno:InsertPage") + self.xUITest.executeCommand(".uno:InsertPage") + self.xUITest.executeCommand(".uno:InsertPage") + self.xUITest.executeCommand(".uno:InsertPage") + #verify + self.assertEqual(document.DrawPages.getCount(), 5) #nr. of pages + #undo + self.xUITest.executeCommand(".uno:Undo") + self.xUITest.executeCommand(".uno:Undo") + self.xUITest.executeCommand(".uno:Undo") + self.xUITest.executeCommand(".uno:Undo") + self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/masterElements.py b/sd/qa/uitest/impress_tests/masterElements.py new file mode 100644 index 0000000000..9950be9e23 --- /dev/null +++ b/sd/qa/uitest/impress_tests/masterElements.py @@ -0,0 +1,44 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict + + +class masterElements(UITestCase): + + def test_master_elements(self): + with self.ui_test.create_doc_in_start_center("impress"): + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:MasterLayouts") as xDialog: + + xpagenumber = xDialog.getChild("pagenumber") + xfooter = xDialog.getChild("footer") + datetime = xDialog.getChild("datetime") + xpagenumber.executeAction("CLICK", tuple()) + xfooter.executeAction("CLICK", tuple()) + datetime.executeAction("CLICK", tuple()) + + + #verify + with self.ui_test.execute_dialog_through_command(".uno:MasterLayouts") as xDialog: + xfooter = xDialog.getChild("footer") + datetime = xDialog.getChild("datetime") + xpagenumber = xDialog.getChild("pagenumber") + + self.assertEqual(get_state_as_dict(xfooter)["Selected"], "false") + self.assertEqual(get_state_as_dict(datetime)["Selected"], "false") + self.assertEqual(get_state_as_dict(xpagenumber)["Selected"], "false") + + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/masterSlides.py b/sd/qa/uitest/impress_tests/masterSlides.py new file mode 100644 index 0000000000..c413537afc --- /dev/null +++ b/sd/qa/uitest/impress_tests/masterSlides.py @@ -0,0 +1,47 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues + +class masterSlides(UITestCase): + + def test_change_master_slide_from_dialog(self): + + with self.ui_test.create_doc_in_start_center("impress"): + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + xImpress = self.xUITest.getTopFocusWindow() + xMasterSlide = xImpress.getChild("masterslide") + self.assertEqual("Default", get_state_as_dict(xMasterSlide)['SelectEntryText']) + + xMasterButton = xImpress.getChild("masterslidebutton") + xMasterButton.executeAction("CLICK", tuple()) + + self.xUITest.executeCommand(".uno:InsertMasterPage") + + xCloseMasterButton = xImpress.getChild("closemasterslide") + xCloseMasterButton.executeAction("CLICK", tuple()) + + with self.ui_test.execute_dialog_through_command(".uno:PresentationLayout") as xDialog: + + xSelect = xDialog.getChild('select') + xSelect.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RIGHT"})) + + + xMasterSlide = xImpress.getChild("masterslide") + self.assertEqual("Default 1", get_state_as_dict(xMasterSlide)['SelectEntryText']) + + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/renameSlide.py b/sd/qa/uitest/impress_tests/renameSlide.py new file mode 100644 index 0000000000..c47e9f4909 --- /dev/null +++ b/sd/qa/uitest/impress_tests/renameSlide.py @@ -0,0 +1,47 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict + +class renameSlide(UITestCase): + + def test_rename_slide(self): + with self.ui_test.create_doc_in_start_center("impress"): + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:RenamePage") as xDialog: + + name_entry = xDialog.getChild("name_entry") + name_entry.executeAction("TYPE", mkPropertyValues({"TEXT":"NewName"})) + + + #verify + with self.ui_test.execute_dialog_through_command(".uno:RenamePage") as xDialog: + + name_entry = xDialog.getChild("name_entry") + self.assertEqual(get_state_as_dict(name_entry)["Text"], "NewName") + + self.xUITest.executeCommand(".uno:InsertPage") + + with self.ui_test.execute_dialog_through_command(".uno:RenamePage", close_button="cancel") as xDialog: + + xOKBtn = xDialog.getChild("ok") + self.assertEqual("true", get_state_as_dict(xOKBtn)['Enabled']) + + name_entry = xDialog.getChild("name_entry") + name_entry.executeAction("TYPE", mkPropertyValues({"TEXT":"NewName"})) + + self.assertEqual("false", get_state_as_dict(xOKBtn)['Enabled']) + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/save_readonly_with_password.py b/sd/qa/uitest/impress_tests/save_readonly_with_password.py new file mode 100644 index 0000000000..485dedde10 --- /dev/null +++ b/sd/qa/uitest/impress_tests/save_readonly_with_password.py @@ -0,0 +1,103 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from org.libreoffice.unotest import systemPathToFileUrl +from uitest.uihelper.common import select_by_text +from tempfile import TemporaryDirectory +import os.path + +class save_readonly_with_password(UITestCase): + + #Bug 145511 - FILESAVE to PPTX as read-only with additional password protection for editing not working + def test_save_to_pptx(self): + + with TemporaryDirectory() as tempdir: + xFilePath = os.path.join(tempdir, "tdf144374-tmp.pptx") + + with self.ui_test.create_doc_in_start_center("impress"): + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + # Save the document + with self.ui_test.execute_dialog_through_command(".uno:Save", close_button="") as xSaveDialog: + xFileName = xSaveDialog.getChild("file_name") + xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath})) + xFileTypeCombo = xSaveDialog.getChild("file_type") + select_by_text(xFileTypeCombo, "Office Open XML Presentation (.pptx)") + xPasswordCheckButton = xSaveDialog.getChild("password") + xPasswordCheckButton.executeAction("CLICK", tuple()) + xOpen = xSaveDialog.getChild("open") + + with self.ui_test.execute_dialog_through_action(xOpen, "CLICK", close_button="") as xPasswordDialog: + xReadonly = xPasswordDialog.getChild("readonly") + xReadonly.executeAction("CLICK", tuple()) + xNewPassword = xPasswordDialog.getChild("newpassroEntry") + xNewPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + xConfirmPassword = xPasswordDialog.getChild("confirmropassEntry") + xConfirmPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + + xOk = xPasswordDialog.getChild("ok") + # PPTX confirmation dialog is displayed + with self.ui_test.execute_dialog_through_action(xOk, "CLICK", close_button="save"): + pass + + with self.ui_test.load_file(systemPathToFileUrl(xFilePath)) as document: + + self.assertTrue(document.isReadonly()) + + # Without the fix in place, this dialog wouldn't have been displayed + with self.ui_test.execute_dialog_through_command(".uno:EditDoc") as xDialog: + xPassword = xDialog.getChild("newpassEntry") + xPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + + self.assertFalse(document.isReadonly()) + + def test_save_to_odp(self): + + with TemporaryDirectory() as tempdir: + xFilePath = os.path.join(tempdir, "readonly_with_password_tmp.odp") + + with self.ui_test.create_doc_in_start_center("impress"): + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + # Save the document + with self.ui_test.execute_dialog_through_command(".uno:Save", close_button="") as xSaveDialog: + xFileName = xSaveDialog.getChild("file_name") + xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath})) + xPasswordCheckButton = xSaveDialog.getChild("password") + xPasswordCheckButton.executeAction("CLICK", tuple()) + xOpen = xSaveDialog.getChild("open") + + with self.ui_test.execute_dialog_through_action(xOpen, "CLICK") as xPasswordDialog: + xReadonly = xPasswordDialog.getChild("readonly") + xReadonly.executeAction("CLICK", tuple()) + xNewPassword = xPasswordDialog.getChild("newpassroEntry") + xNewPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + xConfirmPassword = xPasswordDialog.getChild("confirmropassEntry") + xConfirmPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + + with self.ui_test.load_file(systemPathToFileUrl(xFilePath)) as document: + + self.assertTrue(document.isReadonly()) + + with self.ui_test.execute_dialog_through_command(".uno:EditDoc") as xDialog: + xPassword = xDialog.getChild("newpassEntry") + xPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + + self.assertFalse(document.isReadonly()) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/slideShowSettings.py b/sd/qa/uitest/impress_tests/slideShowSettings.py new file mode 100644 index 0000000000..16fbdc8405 --- /dev/null +++ b/sd/qa/uitest/impress_tests/slideShowSettings.py @@ -0,0 +1,60 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict, type_text, select_pos + +class slideShowSettings(UITestCase): + def test_slideShowSettings(self): + with self.ui_test.create_doc_in_start_center("impress"): + MainWindow = self.xUITest.getTopFocusWindow() + TemplateDialog = self.xUITest.getTopFocusWindow() + cancel = TemplateDialog.getChild("close") + self.ui_test.close_dialog_through_button(cancel) + self.xUITest.executeCommand(".uno:InsertPage") + with self.ui_test.execute_dialog_through_command(".uno:PresentationDialog") as PresentationDialog: + + xfrom = PresentationDialog.getChild("from") + xfrom.executeAction("CLICK",tuple()) + from_cb = PresentationDialog.getChild("from_cb") + select_pos(from_cb, "0") + window = PresentationDialog.getChild("window") + window.executeAction("CLICK",tuple()) + manualslides = PresentationDialog.getChild("manualslides") + manualslides.executeAction("CLICK",tuple()) + pointervisible = PresentationDialog.getChild("pointervisible") + pointervisible.executeAction("CLICK",tuple()) + pointeraspen = PresentationDialog.getChild("pointeraspen") + pointeraspen.executeAction("CLICK",tuple()) + animationsallowed = PresentationDialog.getChild("animationsallowed") + animationsallowed.executeAction("CLICK",tuple()) + changeslidesbyclick = PresentationDialog.getChild("changeslidesbyclick") + changeslidesbyclick.executeAction("CLICK",tuple()) + + #verify + with self.ui_test.execute_dialog_through_command(".uno:PresentationDialog", close_button="cancel") as PresentationDialog: + xfrom = PresentationDialog.getChild("from") + self.assertEqual(get_state_as_dict(xfrom)["Checked"], "true") + from_cb = PresentationDialog.getChild("from_cb") + self.assertEqual(get_state_as_dict(from_cb)["SelectEntryText"], "Slide 1") + manualslides = PresentationDialog.getChild("manualslides") + self.assertEqual(get_state_as_dict(manualslides)["Selected"], "true") + pointervisible = PresentationDialog.getChild("pointervisible") + self.assertEqual(get_state_as_dict(pointervisible)["Selected"], "true") + pointeraspen = PresentationDialog.getChild("pointeraspen") + self.assertEqual(get_state_as_dict(pointeraspen)["Selected"], "true") + animationsallowed = PresentationDialog.getChild("animationsallowed") + self.assertEqual(get_state_as_dict(animationsallowed)["Selected"], "false") + changeslidesbyclick = PresentationDialog.getChild("changeslidesbyclick") + self.assertEqual(get_state_as_dict(changeslidesbyclick)["Selected"], "false") + + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/tdf119246.py b/sd/qa/uitest/impress_tests/tdf119246.py new file mode 100644 index 0000000000..5461f714d9 --- /dev/null +++ b/sd/qa/uitest/impress_tests/tdf119246.py @@ -0,0 +1,48 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import change_measurement_unit +from uitest.uihelper.common import get_url_for_data_file + +class tdf119246(UITestCase): + + def test_tdf119246(self): + with self.ui_test.load_file(get_url_for_data_file("tdf119246.odp")) as document: + + with change_measurement_unit(self, "Centimeter"): + + xImpressDoc = self.xUITest.getTopFocusWindow() + + self.assertIsNone(document.CurrentSelection) + + xEditWin = xImpressDoc.getChild("impress_win") + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"DimensionShape"})) + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + with self.ui_test.execute_dialog_through_command(".uno:MeasureAttributes") as xDialog: + xLineDist = xDialog.getChild('MTR_LINE_DIST') + xGuideOvergang = xDialog.getChild('MTR_FLD_HELPLINE_OVERHANG') + xGuideDist = xDialog.getChild('MTR_FLD_HELPLINE_DIST') + xLeftDist = xDialog.getChild('MTR_FLD_HELPLINE1_LEN') + xRightDist = xDialog.getChild('MTR_FLD_HELPLINE2_LEN') + xDecimalPlace = xDialog.getChild('MTR_FLD_DECIMALPLACES') + + # Without the fix in place, this test would have failed with + # AssertionError: '2.80 cm' != '1.00 cm' + self.assertEqual("2.80 cm", get_state_as_dict(xLineDist)['Text']) + self.assertEqual("0.20 cm", get_state_as_dict(xGuideOvergang)['Text']) + self.assertEqual("0.50 cm", get_state_as_dict(xGuideDist)['Text']) + self.assertEqual("4.00 cm", get_state_as_dict(xLeftDist)['Text']) + self.assertEqual("-1.40 cm", get_state_as_dict(xRightDist)['Text']) + self.assertEqual("2", get_state_as_dict(xDecimalPlace)['Text']) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/tdf134734.py b/sd/qa/uitest/impress_tests/tdf134734.py new file mode 100644 index 0000000000..07985e8f6b --- /dev/null +++ b/sd/qa/uitest/impress_tests/tdf134734.py @@ -0,0 +1,101 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict, select_pos +from com.sun.star.drawing.FillStyle import SOLID + + +class TestClass(UITestCase): + def test_master_page_background(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + TemplateDialog = self.xUITest.getTopFocusWindow() + close = TemplateDialog.getChild("close") + self.ui_test.close_dialog_through_button(close) + + # set margins and fill color + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog: + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "0") + checkBackgroundFullSize = DrawPageDialog.getChild("checkBackgroundFullSize") + self.assertEqual(get_state_as_dict(checkBackgroundFullSize)["Selected"], "false") + spinMargLeft = DrawPageDialog.getChild("spinMargLeft") + for _ in range(20): + spinMargLeft.executeAction("UP",tuple()) + spinMargRight = DrawPageDialog.getChild("spinMargRight") + for _ in range(15): + spinMargRight.executeAction("UP",tuple()) + spinMargTop = DrawPageDialog.getChild("spinMargTop") + for _ in range(10): + spinMargTop.executeAction("UP",tuple()) + spinMargBot = DrawPageDialog.getChild("spinMargBot") + for _ in range(5): + spinMargBot.executeAction("UP",tuple()) + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "1") + btncolor = DrawPageDialog.getChild("btncolor") + btncolor.executeAction("CLICK",tuple()) + + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillStyle, SOLID) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderLeft, 1016) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderRight, 762) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderTop, 508) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderBottom, 254) + self.assertEqual( + document.MasterPages.getByIndex(0).BackgroundFullSize, False) + + # check it + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog: + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "0") + checkBackgroundFullSize = DrawPageDialog.getChild("checkBackgroundFullSize") + self.assertEqual(get_state_as_dict(checkBackgroundFullSize)["Selected"], "false") + checkBackgroundFullSize.executeAction("CLICK",tuple()) + + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillStyle, SOLID) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderLeft, 1016) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderRight, 762) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderTop, 508) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderBottom, 254) + self.assertEqual( + document.MasterPages.getByIndex(0).BackgroundFullSize, True) + + # uncheck it again + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog: + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "0") + checkBackgroundFullSize = DrawPageDialog.getChild("checkBackgroundFullSize") + self.assertEqual(get_state_as_dict(checkBackgroundFullSize)["Selected"], "true") + checkBackgroundFullSize.executeAction("CLICK",tuple()) + + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillStyle, SOLID) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderLeft, 1016) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderRight, 762) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderTop, 508) + self.assertEqual( + document.DrawPages.getByIndex(0).BorderBottom, 254) + self.assertEqual( + document.MasterPages.getByIndex(0).BackgroundFullSize, False) + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/tdf137729.py b/sd/qa/uitest/impress_tests/tdf137729.py new file mode 100644 index 0000000000..4362b056e1 --- /dev/null +++ b/sd/qa/uitest/impress_tests/tdf137729.py @@ -0,0 +1,51 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import select_pos +from com.sun.star.drawing.HatchStyle import SINGLE + +class tdf137729(UITestCase): + + def test_tdf137729(self): + + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as xPageSetupDlg: + + tabcontrol = xPageSetupDlg.getChild("tabcontrol") + select_pos(tabcontrol, "1") + + xBtn = xPageSetupDlg.getChild('btnhatch') + xBtn.executeAction("CLICK", tuple()) + + xDistance = xPageSetupDlg.getChild('distancemtr') + xDistance.executeAction("UP", tuple()) + + + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillHatch.Style, SINGLE ) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillHatch.Color, 0) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillHatch.Distance, 152) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillHatch.Angle, 0) + + # Without the patch in place, this test would have failed with + # AssertionError: '' != 'hatch' + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillHatchName, 'hatch') + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/tdf152295.py b/sd/qa/uitest/impress_tests/tdf152295.py new file mode 100644 index 0000000000..9c0b00719b --- /dev/null +++ b/sd/qa/uitest/impress_tests/tdf152295.py @@ -0,0 +1,54 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict, select_pos +from uitest.uihelper.common import change_measurement_unit + +class tdf152295(UITestCase): + def test_tdf152295(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + TemplateDialog = self.xUITest.getTopFocusWindow() + close = TemplateDialog.getChild("close") + self.ui_test.close_dialog_through_button(close) + + with change_measurement_unit(self, "Centimeter"): + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog: + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "1") + btnbitmap = DrawPageDialog.getChild("btnbitmap") + btnbitmap.executeAction("CLICK",tuple()) + width = DrawPageDialog.getChild("width") + for _ in range(50): + width.executeAction("UP",tuple()) + height = DrawPageDialog.getChild("height") + for _ in range(50): + height.executeAction("UP",tuple()) + + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog: + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "1") + btnbitmap = DrawPageDialog.getChild("btnbitmap") + btnbitmap.executeAction("CLICK",tuple()) + + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog: + xTabs = DrawPageDialog.getChild("tabcontrol") + select_pos(xTabs, "1") + btnbitmap = DrawPageDialog.getChild("btnbitmap") + btnbitmap.executeAction("CLICK",tuple()) + width = DrawPageDialog.getChild("width") + height = DrawPageDialog.getChild("height") + + # Without the fix in place, this test would have failed with + # AssertionError: '6.00 cm' != '13.55 cm' + # AssertionError: '6.00 cm' != '13.55 cm' + self.assertEqual("6.00 cm", get_state_as_dict(width)['Text']) + self.assertEqual("6.00 cm", get_state_as_dict(height)['Text']) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/tdf155863.py b/sd/qa/uitest/impress_tests/tdf155863.py new file mode 100644 index 0000000000..bce8936a3d --- /dev/null +++ b/sd/qa/uitest/impress_tests/tdf155863.py @@ -0,0 +1,34 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file + +class tdf155863(UITestCase): + def test_tdf155863(self): + # This document contains an image with an original size of 7.99cm x 5.74cm. + # The image has been cropped 0.8cm on the left, 3.59cm on the right, 0.99cm at the top, + # and 0.75cm at the bottom. + # Also, it has been resized to a width of 2.1cm and a height of 2.33cm. + with self.ui_test.load_file(get_url_for_data_file("tdf155863.odp")) as document: + xImpressDoc = self.xUITest.getTopFocusWindow() + xEditWin = xImpressDoc.getChild("impress_win") + + # select the image on the first slide + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Image"})) + + # click "Original Size" + self.xUITest.executeCommand(".uno:OriginalSize") + + # tdf#155863: Without the fix in place, the image will be distorted due to the wrong size. + self.assertEqual(3597, document.DrawPages[0].getByIndex(0).Size.Width) + self.assertEqual(3998, document.DrawPages[0].getByIndex(0).Size.Height) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests/textColumnsDialog.py b/sd/qa/uitest/impress_tests/textColumnsDialog.py new file mode 100644 index 0000000000..98416f8217 --- /dev/null +++ b/sd/qa/uitest/impress_tests/textColumnsDialog.py @@ -0,0 +1,51 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import change_measurement_unit, select_pos +from uitest.framework import UITestCase + +class textColumnsDialog(UITestCase): + + def test_textColumnsDialog(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with change_measurement_unit(self, 'Centimeter'): + xImpressDoc = self.xUITest.getTopFocusWindow() + + xEditWin = xImpressDoc.getChild("impress_win") + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"})) + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + # Test defaults and set some values + with self.ui_test.execute_dialog_through_command(".uno:TextAttributes") as xDialog: + xTabs = xDialog.getChild("tabcontrol") + select_pos(xTabs, "2") + colNumber = xDialog.getChild('FLD_COL_NUMBER') + colSpacing = xDialog.getChild('MTR_FLD_COL_SPACING') + self.assertEqual('1', get_state_as_dict(colNumber)['Text']) + self.assertEqual('0.00 cm', get_state_as_dict(colSpacing)['Text']) + colNumber.executeAction("SET", mkPropertyValues({"TEXT": "3"})) + colSpacing.executeAction("SET", mkPropertyValues({"TEXT": "1.5"})) + + # Test that settings persist + with self.ui_test.execute_dialog_through_command(".uno:TextAttributes") as xDialog: + xTabs = xDialog.getChild("tabcontrol") + select_pos(xTabs, "2") + colNumber = xDialog.getChild('FLD_COL_NUMBER') + colSpacing = xDialog.getChild('MTR_FLD_COL_SPACING') + self.assertEqual('3', get_state_as_dict(colNumber)['Text']) + self.assertEqual('1.50 cm', get_state_as_dict(colSpacing)['Text']) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf106612.py b/sd/qa/uitest/impress_tests2/tdf106612.py new file mode 100644 index 0000000000..6ca8fbbaf5 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf106612.py @@ -0,0 +1,47 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict + +class Tdf106612(UITestCase): + + def test_tdf106612(self): + with self.ui_test.create_doc_in_start_center("impress"): + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + xImpressDoc = self.xUITest.getTopFocusWindow() + + xEditWin = xImpressDoc.getChild("impress_win") + + self.xUITest.executeCommand(".uno:DuplicatePage") + + self.assertEqual("2", get_state_as_dict(xEditWin)["CurrentSlide"]) + + xEditWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "SdNavigatorPanel"})) + + xTree = xImpressDoc.getChild("tree") + self.assertEqual(2, len(xTree.getChildren())) + + self.assertEqual("Slide 1", get_state_as_dict(xTree.getChild('0'))['Text']) + self.assertEqual(2, len(xTree.getChild('0').getChildren())) + + self.assertEqual("Slide 2", get_state_as_dict(xTree.getChild('1'))['Text']) + self.assertEqual(2, len(xTree.getChild('1').getChildren())) + + xTree.getChild('0').executeAction("DOUBLECLICK", tuple()) + + # Without the fix in place, this test would have failed with + # AssertionError: '1' != '2' + self.assertEqual("1", get_state_as_dict(xEditWin)["CurrentSlide"]) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf125449.py b/sd/qa/uitest/impress_tests2/tdf125449.py new file mode 100644 index 0000000000..242a79e657 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf125449.py @@ -0,0 +1,59 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import select_pos +from com.sun.star.awt.GradientStyle import LINEAR + +class tdf125449(UITestCase): + + def test_tdf125449(self): + + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as xPageSetupDlg: + + tabcontrol = xPageSetupDlg.getChild("tabcontrol") + select_pos(tabcontrol, "1") + + xBtn = xPageSetupDlg.getChild('btngradient') + xBtn.executeAction("CLICK", tuple()) + + xAngle = xPageSetupDlg.getChild('anglemtr') + xAngle.executeAction("UP", tuple()) + + + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.Style, LINEAR) + self.assertEqual( + hex(document.DrawPages.getByIndex(0).Background.FillGradient.StartColor), '0xdde8cb') + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.Angle, 450) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.Border, 0) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.XOffset, 0) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.YOffset, 0) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.StartIntensity, 100) + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradient.EndIntensity, 100) + + # Without the patch in place, this test would have failed with + # AssertionError: '' != 'gradient' + self.assertEqual( + document.DrawPages.getByIndex(0).Background.FillGradientName, 'gradient') + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf127900.py b/sd/qa/uitest/impress_tests2/tdf127900.py new file mode 100644 index 0000000000..e32b76591a --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf127900.py @@ -0,0 +1,43 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import select_pos +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_url_for_data_file + + +class tdf127900(UITestCase): + + def test_tdf127900(self): + + with self.ui_test.load_file(get_url_for_data_file("tdf127900.fodp")) as doc: + + xMasterLang = doc.MasterPages.getByIndex(0).getByIndex(1).CharLocale.Language + xSlideLang = doc.DrawPages.getByIndex(1).getByIndex(1).CharLocale.Language + + self.assertEqual(xMasterLang, xSlideLang) + + self.xUITest.executeCommand(".uno:SlideMasterPage") + + xMaster = self.xUITest.getTopFocusWindow().getChild("impress_win") + + xMaster.executeAction("TYPE", mkPropertyValues({"KEYCODE": "TAB"})) + xMaster.executeAction("TYPE", mkPropertyValues({"KEYCODE": "TAB"})) + + with self.ui_test.execute_dialog_through_command(".uno:FontDialog") as xDlg: + + select_pos(xDlg.getChild("cbWestLanguage"), "10") + + xMasterLang = doc.MasterPages.getByIndex(0).getByIndex(1).CharLocale.Language + xSlideLang = doc.DrawPages.getByIndex(1).getByIndex(1).CharLocale.Language + + self.assertEqual(xMasterLang, xSlideLang) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf130440.py b/sd/qa/uitest/impress_tests2/tdf130440.py new file mode 100644 index 0000000000..73fe44b31b --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf130440.py @@ -0,0 +1,65 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues + +class tdf129346(UITestCase): + + def test_run(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit') + + self.assertEqual(document.CurrentController.getCurrentPage().Number, 1) + self.xUITest.executeCommand(".uno:DuplicatePage") + xToolkit.processEventsToIdle() + self.assertEqual(document.CurrentController.getCurrentPage().Number, 2) + + xDoc = self.xUITest.getTopFocusWindow() + xEdit = xDoc.getChild("impress_win") + # Type "test" into the text box + xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"test"})) + # Go to Page 1, which also forces to end edit box + xEdit.executeAction("GOTO", mkPropertyValues({"PAGE": "1"})) + xToolkit.processEventsToIdle() + + # We should be at Page 1 + self.assertEqual(document.CurrentController.getCurrentPage().Number, 1) + + # Undo sends us to Page 2 and undo-es the text edit + self.xUITest.executeCommand(".uno:Undo") + xToolkit.processEventsToIdle() + self.assertEqual(document.CurrentController.getCurrentPage().Number, 2) + + # Undo sends us to page 1 and undo-es command ".uno:DuplicatePage" + self.xUITest.executeCommand(".uno:Undo") + xToolkit.processEventsToIdle() + self.assertEqual(document.CurrentController.getCurrentPage().Number, 1) + + # Redo ".uno:DuplicatePage" - we go to Page 2 + self.xUITest.executeCommand(".uno:Redo") + xToolkit.processEventsToIdle() + self.assertEqual(document.CurrentController.getCurrentPage().Number, 2) + + # Redo text edit + self.xUITest.executeCommand(".uno:Redo") + + xDoc = self.xUITest.getTopFocusWindow() + xEdit = xDoc.getChild("impress_win") + xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"test"})) + + xToolkit.processEventsToIdle() + #Without the accompanying fix in place, it would fail with AssertionError: 2 != 1 + self.assertEqual(document.CurrentController.getCurrentPage().Number, 2) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf133713.py b/sd/qa/uitest/impress_tests2/tdf133713.py new file mode 100644 index 0000000000..a4195fd2b2 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf133713.py @@ -0,0 +1,58 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.framework import UITestCase + +class Tdf133713(UITestCase): + + def test_Tdf133713(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + xDoc = self.xUITest.getTopFocusWindow() + xEditWin = xDoc.getChild("impress_win") + + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"})) + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + xEditWin.executeAction("TYPE", mkPropertyValues({"TEXT":"one"})) + xEditWin.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"})) + xEditWin.executeAction("TYPE", mkPropertyValues({"TEXT":"two"})) + xEditWin.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"})) + xEditWin.executeAction("TYPE", mkPropertyValues({"TEXT":"three"})) + + self.xUITest.executeCommand(".uno:SelectAll") + + with self.ui_test.execute_dialog_through_command(".uno:OutlineBullet") as xDialog: + xNumFormat = xDialog.getChild("numfmtlb") + xSelection = xDialog.getChild("selectionrb") + xIndent = xDialog.getChild("indentmf") + xRelSize = xDialog.getChild("relsize") + + # Check some default values + self.assertEqual("Bullet", get_state_as_dict(xNumFormat)["DisplayText"]) + self.assertEqual("true", get_state_as_dict(xSelection)["Checked"]) + self.assertEqual("0", get_state_as_dict(xIndent)["Value"]) + self.assertEqual("45%", get_state_as_dict(xRelSize)["Text"]) + + drawPage = document.getDrawPages().getByIndex(0) + shape = drawPage.getByIndex(1) + xEnumeration = shape.Text.createEnumeration() + + # Without the fix in place, this test would have failed with + # AssertionError: 0 != None + for i in range(3): + self.assertEqual(0, xEnumeration.nextElement().NumberingLevel) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf137637.py b/sd/qa/uitest/impress_tests2/tdf137637.py new file mode 100644 index 0000000000..fa2a164729 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf137637.py @@ -0,0 +1,57 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict + +class Tdf137637(UITestCase): + + def test_tdf137637(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + # Insert shape with Ctrl key + xArgs = mkPropertyValues({"KeyModifier": 8192}) + self.xUITest.executeCommandWithParameters(".uno:BasicShapes.rectangle", xArgs) + + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + xImpressDoc = self.xUITest.getTopFocusWindow() + + xEditWin = xImpressDoc.getChild("impress_win") + + xEditWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "SdCustomAnimationPanel"})) + + # Without the fix in place, this test would have failed with + # AttributeError: 'NoneType' object has no attribute 'getImplementationName' + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + xAnimationList = xImpressDoc.getChild("custom_animation_list") + self.assertEqual('0', get_state_as_dict(xAnimationList)['Children']) + + xAddBtn = xImpressDoc.getChild("add_effect") + xAddBtn.executeAction("CLICK", tuple()) + + self.assertEqual('1', get_state_as_dict(xAnimationList)['Children']) + + self.xUITest.executeCommand(".uno:Undo") + + # tdf#135033: Without the fix in place, this test would have failed with + # AssertionError: '0' != '1' + self.assertEqual('0', get_state_as_dict(xAnimationList)['Children']) + + # tdf#145030: Without the fix in place, this test would have failed with + # AttributeError: 'NoneType' object has no attribute 'getImplementationName' + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: \ No newline at end of file diff --git a/sd/qa/uitest/impress_tests2/tdf139511.py b/sd/qa/uitest/impress_tests2/tdf139511.py new file mode 100644 index 0000000000..52e54d2915 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf139511.py @@ -0,0 +1,51 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import change_measurement_unit + +class tdf139511(UITestCase): + + def test_tdf139511(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with change_measurement_unit(self, "Centimeter"): + + self.xUITest.executeCommand(".uno:InsertTable?Columns:short=4&Rows:short=4") + + self.assertEqual(3885, document.DrawPages[0].getByIndex(2).BoundRect.Height) + self.assertEqual(14136, document.DrawPages[0].getByIndex(2).BoundRect.Width) + + with self.ui_test.execute_dialog_through_command(".uno:TransformDialog") as xDialog: + + + xWidth = xDialog.getChild('MTR_FLD_WIDTH') + xHeight = xDialog.getChild('MTR_FLD_HEIGHT') + + xWidth.executeAction("TYPE", mkPropertyValues({"KEYCODE": "CTRL+A"})) + xWidth.executeAction("TYPE", mkPropertyValues({"KEYCODE": "BACKSPACE"})) + xWidth.executeAction("TYPE", mkPropertyValues({"TEXT": "10"})) + + xHeight.executeAction("TYPE", mkPropertyValues({"KEYCODE": "CTRL+A"})) + xHeight.executeAction("TYPE", mkPropertyValues({"KEYCODE": "BACKSPACE"})) + xHeight.executeAction("TYPE", mkPropertyValues({"TEXT": "5"})) + + + + # Without the fix in place, this test would have failed with + # AssertionError: 5037 != 8036 + self.assertEqual(5037, document.DrawPages[0].getByIndex(2).BoundRect.Height) + self.assertEqual(10037, document.DrawPages[0].getByIndex(2).BoundRect.Width) + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf141297.py b/sd/qa/uitest/impress_tests2/tdf141297.py new file mode 100644 index 0000000000..bd776253e7 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf141297.py @@ -0,0 +1,80 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file +from org.libreoffice.unotest import systemPathToFileUrl +from tempfile import TemporaryDirectory +import os.path + +class tdf141297(UITestCase): + + def test_tdf141297(self): + with TemporaryDirectory() as tempdir: + xFilePath = os.path.join(tempdir, "tdf141297-tmp.odp") + + with self.ui_test.create_doc_in_start_center("impress"): + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:InsertGraphic", close_button="") as xOpenDialog: + + xFileName = xOpenDialog.getChild("file_name") + xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": get_url_for_data_file("LibreOffice.jpg")})) + + xLink = xOpenDialog.getChild("link") + self.assertEqual("false", get_state_as_dict(xLink)['Selected']) + + xLink.executeAction("CLICK", tuple()) + + xOpen = xOpenDialog.getChild("open") + #Confirmation dialog is displayed + with self.ui_test.execute_dialog_through_action(xOpen, "CLICK"): + pass + + with self.ui_test.execute_dialog_through_command(".uno:ManageLinks", close_button="close") as xDialog: + + sLinks = "TB_LINKS" + xLinks = xDialog.getChild(sLinks) + self.assertEqual(1, len(xLinks.getChildren())) + + sFileName = "FULL_FILE_NAME" + xFileName = xDialog.getChild(sFileName) + self.assertTrue(get_state_as_dict(xFileName)["Text"].endswith("/LibreOffice.jpg")) + + sBreakLink = "BREAK_LINK" + xBreakLink = xDialog.getChild(sBreakLink) + + with self.ui_test.execute_blocking_action(xBreakLink.executeAction, + args=("CLICK", tuple()), close_button="yes"): + pass + + # Save Copy as + with self.ui_test.execute_dialog_through_command(".uno:SaveAs", close_button="open") as xDialog: + + xFileName = xDialog.getChild("file_name") + xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"})) + xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) + xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath})) + + with self.ui_test.load_file(systemPathToFileUrl(xFilePath)): + + self.xUITest.executeCommand(".uno:ManageLinks") + + # Since the image is no longer linked, the link dialog is not open. + # Without the fix in place, this dialog would have been opened + xMainWin = self.xUITest.getTopFocusWindow() + self.assertTrue(sLinks not in xMainWin.getChildren()) + self.assertTrue(sFileName not in xMainWin.getChildren()) + self.assertTrue(sBreakLink not in xMainWin.getChildren()) + self.assertTrue("impress_win" in xMainWin.getChildren()) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf141708.py b/sd/qa/uitest/impress_tests2/tdf141708.py new file mode 100644 index 0000000000..bb9298f686 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf141708.py @@ -0,0 +1,33 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase + +class tdf141708(UITestCase): + + def test_tdf141708(self): + + with self.ui_test.create_doc_in_start_center("impress"): + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + self.xUITest.executeCommand(".uno:Navigator") + + self.xUITest.executeCommand(".uno:CloseDoc") + + with self.ui_test.create_doc_in_start_center("impress"): + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + # Without the fix in place, this test would have crashed here + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf144943.py b/sd/qa/uitest/impress_tests2/tdf144943.py new file mode 100644 index 0000000000..9bf5a891fb --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf144943.py @@ -0,0 +1,31 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from uitest.uihelper.common import get_url_for_data_file +from libreoffice.uno.propertyvalue import mkPropertyValues + +#Bug 144943 - FILEOPEN PPTX Read-only passwords on PPTX files are not working + +class tdf144943(UITestCase): + + def test_tdf144943(self): + with self.ui_test.load_file(get_url_for_data_file("tdf144943.pptx")): + document = self.ui_test.get_component() + + # Without the fix in place, this test would have failed with + # AssertionError: False is not true + self.assertTrue(document.isReadonly()) + + with self.ui_test.execute_dialog_through_command(".uno:EditDoc") as xDialog: + xPassword = xDialog.getChild("newpassEntry") + xPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"})) + + self.assertFalse(document.isReadonly()) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf146019.py b/sd/qa/uitest/impress_tests2/tdf146019.py new file mode 100644 index 0000000000..16e0290ab1 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf146019.py @@ -0,0 +1,36 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import get_url_for_data_file + +class tdf146019(UITestCase): + + def test_tdf146019(self): + + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with self.ui_test.execute_dialog_through_command(".uno:InsertGraphic", close_button="open") as xOpenDialog: + + xFileName = xOpenDialog.getChild("file_name") + xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": get_url_for_data_file("tdf146019.jpg")})) + + # Before the fix, a dialog was displayed at this point + + # Check the shape is rotated, height > width + drawPage = document.getDrawPages().getByIndex(0) + shape = drawPage.getByIndex(2) + self.assertEqual(8996, shape.getSize().Width) + self.assertEqual(11745, shape.getSize().Height) + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf149787.py b/sd/qa/uitest/impress_tests2/tdf149787.py new file mode 100644 index 0000000000..3d65f1c0bb --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf149787.py @@ -0,0 +1,40 @@ +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.framework import UITestCase +from uitest.uihelper.common import select_pos + +class TestTdf149787(UITestCase): + + def testTdf149787(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + xImpressDoc = self.xUITest.getTopFocusWindow() + + self.assertIsNone(document.CurrentSelection) + + xEditWin = xImpressDoc.getChild("impress_win") + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"})) + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + with self.ui_test.execute_dialog_through_command(".uno:FormatArea", close_button="cancel") as xDialog: + tabControl = xDialog.getChild("tabcontrol") + select_pos(tabControl, "0") + btnColor = xDialog.getChild("btncolor") + btnColor.executeAction("CLICK", tuple()) + btnMoreColors = xDialog.getChild("btnMoreColors") + + with self.ui_test.execute_blocking_action(btnMoreColors.executeAction, args=('CLICK', ()), close_button="buttonClose") as dialog: + xCloseBtn = dialog.getChild("buttonClose") + self.ui_test.wait_until_property_is_updated(xCloseBtn, "Enabled", "true") + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf82616.py b/sd/qa/uitest/impress_tests2/tdf82616.py new file mode 100644 index 0000000000..134be9bb42 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf82616.py @@ -0,0 +1,70 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues +from uitest.uihelper.common import change_measurement_unit +from uitest.framework import UITestCase + +class Tdf82616(UITestCase): + + def test_tdf82616(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + with change_measurement_unit(self, 'Centimeter'): + + xImpressDoc = self.xUITest.getTopFocusWindow() + + self.assertIsNone(document.CurrentSelection) + + xEditWin = xImpressDoc.getChild("impress_win") + xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"})) + self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName()) + + with self.ui_test.execute_dialog_through_command(".uno:Size") as xDialog: + self.assertEqual('25.2', get_state_as_dict(xDialog.getChild('MTR_FLD_WIDTH'))['Value']) + self.assertEqual('9.13', get_state_as_dict(xDialog.getChild('MTR_FLD_HEIGHT'))['Value']) + self.assertEqual('1.4', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_X'))['Value']) + self.assertEqual('3.69', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_Y'))['Value']) + self.assertEqual('0', get_state_as_dict(xDialog.getChild('NF_ANGLE'))['Value']) + + xEditWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "PosSizePropertyPanel"})) + + xHorizontalPos = xImpressDoc.getChild("horizontalpos") + self.ui_test.wait_until_property_is_updated(xHorizontalPos, "Value", "1.4") + self.assertEqual("1.4", get_state_as_dict(xHorizontalPos)['Value']) + + xVerticalPos = xImpressDoc.getChild("verticalpos") + self.ui_test.wait_until_property_is_updated(xVerticalPos, "Value", "3.69") + self.assertEqual("3.69", get_state_as_dict(xVerticalPos)['Value']) + + xDrawinglayerObject = xEditWin.getChild("Unnamed Drawinglayer object 1") + xDrawinglayerObject.executeAction("MOVE", mkPropertyValues({"X": "-5000", "Y":"-10000"})) + + with self.ui_test.execute_dialog_through_command(".uno:Size") as xDialog: + self.assertEqual('25.2', get_state_as_dict(xDialog.getChild('MTR_FLD_WIDTH'))['Value']) + self.assertEqual('9.13', get_state_as_dict(xDialog.getChild('MTR_FLD_HEIGHT'))['Value']) + self.assertEqual('-3.6', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_X'))['Value']) + self.assertEqual('-6.32', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_Y'))['Value']) + self.assertEqual('0', get_state_as_dict(xDialog.getChild('NF_ANGLE'))['Value']) + + # Without the fix in place, this test would have failed with + # AssertionError: '-3.6' != '0' + self.ui_test.wait_until_property_is_updated(xHorizontalPos, "Value", "-3.6") + self.assertEqual("-3.6", get_state_as_dict(xHorizontalPos)['Value']) + + self.ui_test.wait_until_property_is_updated(xVerticalPos, "Value", "-6.32") + self.assertEqual("-6.32", get_state_as_dict(xVerticalPos)['Value']) + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/uitest/impress_tests2/tdf91762.py b/sd/qa/uitest/impress_tests2/tdf91762.py new file mode 100644 index 0000000000..e36baec620 --- /dev/null +++ b/sd/qa/uitest/impress_tests2/tdf91762.py @@ -0,0 +1,45 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues + +class tdf91762(UITestCase): + + def test_tdf91762(self): + with self.ui_test.create_doc_in_start_center("impress") as document: + xTemplateDlg = self.xUITest.getTopFocusWindow() + xCancelBtn = xTemplateDlg.getChild("close") + self.ui_test.close_dialog_through_button(xCancelBtn) + + self.xUITest.executeCommand(".uno:AssignLayout?WhatLayout:long=1") + + with self.ui_test.execute_dialog_through_command(".uno:InsertTable") as xDialog: + self.assertEqual('5', get_state_as_dict(xDialog.getChild('columns'))['Text']) + self.assertEqual('2', get_state_as_dict(xDialog.getChild('rows'))['Text']) + + self.assertEqual(1961, document.DrawPages[0].getByIndex(1).BoundRect.Height) + self.assertEqual(25198, document.DrawPages[0].getByIndex(1).Size.Width) + self.assertEqual(1923, document.DrawPages[0].getByIndex(1).Size.Height) + + self.assertEqual(1400, document.DrawPages[0].getByIndex(1).Position.X) + self.assertEqual(3685, document.DrawPages[0].getByIndex(1).Position.Y) + + xDoc = self.xUITest.getTopFocusWindow() + xEdit = xDoc.getChild("impress_win") + for i in range(5): + xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"test"})) + xEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"})) + + # tdf#138011: Without the fix in place, it will be much lower + self.assertEqual(5466, document.DrawPages[0].getByIndex(1).BoundRect.Height) + + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sd/qa/unit/HtmlExportTest.cxx b/sd/qa/unit/HtmlExportTest.cxx new file mode 100644 index 0000000000..89f60e98f5 --- /dev/null +++ b/sd/qa/unit/HtmlExportTest.cxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +using namespace css; + +class SdHTMLFilterTest : public UnoApiXmlTest, public HtmlTestTools +{ +public: + SdHTMLFilterTest() + : UnoApiXmlTest("/sd/qa/unit/data/") + { + } + + void testHTMLExport() + { + loadFromFile(u"HtmlExportTestDocument.odp"); + save("impress_html_Export"); + htmlDocUniquePtr htmlDoc = parseHtml(maTempFile); + + assertXPath(htmlDoc, "/html"_ostr, 1); + assertXPath(htmlDoc, "/html/body"_ostr, 1); + assertXPath(htmlDoc, "/html/body/h1"_ostr, 4); + assertXPath(htmlDoc, "/html/body/table"_ostr, 1); + assertXPath(htmlDoc, "/html/body/table/tr"_ostr, 5); + assertXPath(htmlDoc, "/html/body/ul"_ostr, 1); + assertXPath(htmlDoc, "/html/body/ul/li"_ostr, 2); + + assertXPath(htmlDoc, "/html/head/meta[1]"_ostr, "content"_ostr, "text/html; charset=utf-8"); + assertXPath(htmlDoc, "/html/head/meta[2]"_ostr, "name"_ostr, "generator"); + assertXPath(htmlDoc, "/html/head/meta[3]"_ostr, "name"_ostr, "created"); + assertXPath(htmlDoc, "/html/head/meta[3]"_ostr, "content"_ostr, + "2014-04-09T17:05:41.987922038"); + } + + void testTdf154989() + { + loadFromFile(u"tdf154989.odg"); + save("XHTML Draw File"); + xmlDocUniquePtr pXmlDoc = parseXml(maTempFile); + + assertXPath(pXmlDoc, "/xhtml:html"_ostr, 1); + // 1 page + assertXPath(pXmlDoc, "/xhtml:html/xhtml:body/xhtml:div"_ostr, 1); + // 4 shapes + assertXPath(pXmlDoc, "/xhtml:html/xhtml:body/xhtml:div[1]/xhtml:div"_ostr, 4); + // 3 of them are text boxes + assertXPath(pXmlDoc, "/xhtml:html/xhtml:body/xhtml:div[1]/xhtml:div/xhtml:div"_ostr, 3); + // not sure if the order of these is stable? + assertXPathContent( + pXmlDoc, "/xhtml:html/xhtml:body/xhtml:div[1]/xhtml:div[2]/xhtml:div/xhtml:p"_ostr, + "before"); + assertXPathContent( + pXmlDoc, "/xhtml:html/xhtml:body/xhtml:div[1]/xhtml:div[3]/xhtml:div/xhtml:p"_ostr, + "above"); + assertXPathContent( + pXmlDoc, "/xhtml:html/xhtml:body/xhtml:div[1]/xhtml:div[4]/xhtml:div/xhtml:p"_ostr, + "below"); + } + + CPPUNIT_TEST_SUITE(SdHTMLFilterTest); + CPPUNIT_TEST(testHTMLExport); + CPPUNIT_TEST(testTdf154989); + CPPUNIT_TEST_SUITE_END(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(SdHTMLFilterTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/PNGExportTests.cxx b/sd/qa/unit/PNGExportTests.cxx new file mode 100644 index 0000000000..855c3becfd --- /dev/null +++ b/sd/qa/unit/PNGExportTests.cxx @@ -0,0 +1,891 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +class SdPNGExportTest : public UnoApiTest +{ +public: + SdPNGExportTest() + : UnoApiTest("/sd/qa/unit/data/") + { + } +}; + +static void assertColorsAreSimilar(const std::string& message, const BitmapColor& expected, + const BitmapColor& actual, int nDelta) +{ + // Check that the two colors match or are reasonably similar. + if (expected.GetColorError(actual) <= nDelta) + return; + + CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf105998) +{ + loadFromFile(u"odp/tdf105998.odp"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xShape); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure only the shape is exported + Size aSize = aBMPEx.GetSizePixel(); + const auto[scalingX, scalingY] = getDPIScaling(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(193 * scalingX, aSize.getWidth(), 1.5); + CPPUNIT_ASSERT_DOUBLES_EQUAL(193 * scalingY, aSize.getHeight(), 1.5); + if (!IsDefaultDPI()) + return; + + // Check all borders are red + // use assertColorsAreSimilar since the color might differ a little bit on mac + Bitmap aBMP = aBMPEx.GetBitmap(); + { + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + const Color aColorTop = pReadAccess->GetColor(0, nX); + const Color aColorBottom = pReadAccess->GetColor(aSize.Height() - 1, nX); + + assertColorsAreSimilar("Incorrect top border", COL_LIGHTRED, aColorTop, 5); + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:255 G:0 B:0 A:0 + // - Actual : Color: R:9 G:9 B:9 A:0 + assertColorsAreSimilar("Incorrect bottom border", COL_LIGHTRED, aColorBottom, 5); + } + + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColorLeft = pReadAccess->GetColor(nY, 0); + const Color aColorRight = pReadAccess->GetColor(nY, aSize.Width() - 1); + + assertColorsAreSimilar("Incorrect left border", COL_LIGHTRED, aColorLeft, 5); + assertColorsAreSimilar("Incorrect right border", COL_LIGHTRED, aColorRight, 5); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf126319) +{ + loadFromFile(u"odg/tdf126319.odg"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xShape); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure only the shape is exported + Size aSize = aBMPEx.GetSizePixel(); + const auto[scalingX, scalingY] = getDPIScaling(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(295 * scalingX, aSize.getWidth(), 1.5); + CPPUNIT_ASSERT_DOUBLES_EQUAL(134 * scalingY, aSize.getHeight(), 1.5); + if (!IsDefaultDPI()) + return; + + // Check all borders are red or similar. Ignore the corners + Bitmap aBMP = aBMPEx.GetBitmap(); + { + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 2; nX < aSize.Width() - 2; ++nX) + { + const Color aColorTop = pReadAccess->GetColor(0, nX); + // tdf#150102 the exported graphic now has no longer an empty bottom + // row, so test with '-1' in height , same as already in test + // testTdf105998 above + const Color aColorBottom = pReadAccess->GetColor(aSize.Height() - 1, nX); + + assertColorsAreSimilar("Incorrect top border", COL_LIGHTRED, aColorTop, 5); + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:255 G:0 B:0 A:0 + // - Actual : Color: R:77 G:0 B:0 A:0 + assertColorsAreSimilar("Incorrect bottom border", COL_LIGHTRED, aColorBottom, 5); + } + + for (tools::Long nY = 2; nY < aSize.Height() - 2; ++nY) + { + const Color aColorLeft = pReadAccess->GetColor(nY, 0); + // tdf#150102 the exported graphic now has no longer an empty right + // column, so test with '-1' in width , same as already in test + // testTdf105998 above + const Color aColorRight = pReadAccess->GetColor(nY, aSize.Width() - 1); + + assertColorsAreSimilar("Incorrect left border", COL_LIGHTRED, aColorLeft, 5); + assertColorsAreSimilar("Incorrect right border", COL_LIGHTRED, aColorRight, 5); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf136632) +{ + // Reuse existing file + loadFromFile(u"odp/tdf105998.odp"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ comphelper::makePropertyValue("Translucent", + sal_Int32(0)) }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xShape); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + AlphaMask aAlpha = aBMPEx.GetAlphaMask(); + BitmapScopedReadAccess pReadAccess(aAlpha); + + // Without the fix in place, this test would have failed here + CPPUNIT_ASSERT(!pReadAccess); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157652) +{ + loadFromFile(u"odp/tdf157652.odp"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + + // Without the fix in place, this test would have failed with + // - Expected: rgba[ffffffff] + // - Actual : rgba[ff953eff] + CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf156808) +{ + loadFromFile(u"pptx/tdf156808.pptx"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + int nBlackCount = 0; + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + if (aColor == COL_BLACK) + ++nBlackCount; + } + } + + // Without the fix in place, this test would have failed with + // - Expected greater than: 9000 + // - Actual : 0 + CPPUNIT_ASSERT_GREATER(9000, nBlackCount); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157795) +{ + loadFromFile(u"odp/tdf157795.odp"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)), + comphelper::makePropertyValue("Translucent", sal_Int32(1)), + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + + // Without the fix in place, this test would have failed with + // - Expected: rgba[000000ff] + // - Actual : rgba[010101ff] + CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf105362) +{ + loadFromFile(u"odp/tdf105362.odp"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)), + comphelper::makePropertyValue("Translucent", sal_Int32(1)), + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + + // Without the fix in place, this test would have failed with + // - Expected: rgba[000000ff] + // - Actual : rgba[ffffffff] + CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157636) +{ + loadFromFile(u"ppt/tdf157636.ppt"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + int nBlackCount = 0; + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + if (aColor == COL_BLACK) + ++nBlackCount; + } + } + + // Without the fix in place, this test would have failed with + // - Expected greater than: 6600 + // - Actual : 559 + CPPUNIT_ASSERT_GREATER(6600, nBlackCount); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157793) +{ + loadFromFile(u"pptx/tdf157793.pptx"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + int nLightGrayCount = 0; + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + if (aColor == 0xfefefe) + ++nLightGrayCount; + } + } + + // Without the fix in place, this test would have failed with + // - Expected greater than: 7800 + // - Actual : 0 + CPPUNIT_ASSERT_GREATER(7800, nLightGrayCount); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf157635) +{ + loadFromFile(u"pptx/tdf157635.pptx"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pReadAccess(aBMP); + int nBlackCount = 0; + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + if (aColor == COL_BLACK) + ++nBlackCount; + } + } + + // Without the fix in place, this test would have failed with + // - Expected greater than: 7100 + // - Actual : 0 + CPPUNIT_ASSERT_GREATER(7100, nBlackCount); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf113163) +{ + loadFromFile(u"pptx/tdf113163.pptx"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + { + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + // Check all pixels in the image are black + // Without the fix in place, this test would have failed with + // - Expected: 0 + // - Actual : 16777215 + const Color aColor = pReadAccess->GetColor(nY, nX); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor); + } + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf147119) +{ + loadFromFile(u"odg/tdf147119.odg"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)), + comphelper::makePropertyValue("Translucent", sal_Int32(1)), + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + AlphaMask aAlpha = aBMPEx.GetAlphaMask(); + { + BitmapScopedReadAccess pReadAccess(aAlpha); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY) + { + // Without the fix in place, this test would have failed with + // - Expected: Color: R:255 G:255 B:255 A:0 + // - Actual : Color: R:0 G:0 B:0 A:0 + const Color aColor = pReadAccess->GetColor(nY, nX); + CPPUNIT_ASSERT_EQUAL(COL_ALPHA_TRANSPARENT, aColor); + } + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf113197) +{ + loadFromFile(u"odp/tdf113197.odp"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(100)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(100)), + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + Size aSize = aBMPEx.GetSizePixel(); + CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize); + Bitmap aBMP = aBMPEx.GetBitmap(); + { + BitmapScopedReadAccess pReadAccess(aBMP); + for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX) + { + // Check the bottom half of the document is white + for (tools::Long nY = 50; nY < aSize.Height() - 1; ++nY) + { + // Check all pixels in the image are black + // Without the fix in place, this test would have failed with + // - Expected: Color: R:255 G:255 B:255 A:0 + // - Actual : Color: R:153 G:0 B:51 A:0 + const Color aColor = pReadAccess->GetColor(nY, nX); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor); + } + } + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf93124) +{ + loadFromFile(u"ppt/tdf93124.ppt"); + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(320)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(180)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + + // make sure the bitmap is not empty and correct size (PNG export->import was successful) + CPPUNIT_ASSERT_EQUAL(Size(320, 180), aBMPEx.GetSizePixel()); + Bitmap aBMP = aBMPEx.GetBitmap(); + { + BitmapScopedReadAccess pReadAccess(aBMP); + int nNonWhiteCount = 0; + // The word "Top" should be in rectangle 34,4 - 76,30. If text alignment is wrong, the rectangle will be white. + for (tools::Long nY = 4; nY < (4 + 26); ++nY) + { + for (tools::Long nX = 34; nX < (34 + 43); ++nX) + { + const Color aColor = pReadAccess->GetColor(nY, nX); + if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff) + || (aColor.GetBlue() != 0xff)) + ++nNonWhiteCount; + } + } + CPPUNIT_ASSERT_MESSAGE("Tdf93124: vertical alignment of text is incorrect!", + nNonWhiteCount > 50); + } +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf99729) +{ + const OUString filenames[] = { "odp/tdf99729-new.odp", "odp/tdf99729-legacy.odp" }; + int nonwhitecounts[] = { 0, 0 }; + for (size_t i = 0; i < SAL_N_ELEMENTS(filenames); ++i) + { + // 1st check for new behaviour - having AnchoredTextOverflowLegacy compatibility flag set to false in settings.xml + loadFromFile(filenames[i]); + + uno::Reference xContext = getComponentContext(); + CPPUNIT_ASSERT(xContext.is()); + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(xContext); + CPPUNIT_ASSERT(xGraphicExporter.is()); + + uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(320)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(240)) + }; + + uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.read(); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapScopedReadAccess pRead(aBMP); + for (tools::Long nX = 154; nX < (154 + 12); ++nX) + { + for (tools::Long nY = 16; nY < (16 + 96); ++nY) + { + const Color aColor = pRead->GetColor(nY, nX); + if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff) + || (aColor.GetBlue() != 0xff)) + ++nonwhitecounts[i]; + } + } + } + // The numbers 1-9 should be above the Text Box in rectangle 154,16 - 170,112. + // If text alignment is wrong, the rectangle will be white. + CPPUNIT_ASSERT_MESSAGE("Tdf99729: vertical alignment of text is incorrect!", + nonwhitecounts[0] > 100); // it is 134 with cleartype disabled + // The numbers 1-9 should be below the Text Box -> rectangle 154,16 - 170,112 should be white. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Tdf99729: legacy vertical alignment of text is incorrect!", 0, + nonwhitecounts[1]); +} + +CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf155048) +{ + loadFromFile(u"odg/diagonalLine.fodg"); + + auto xGraphicExporter = drawing::GraphicExportFilter::create(getComponentContext()); + CPPUNIT_ASSERT(xGraphicExporter); + + auto xSupplier = mxComponent.queryThrow(); + auto xPage = xSupplier->getDrawPages()->getByIndex(0).queryThrow(); + xGraphicExporter->setSourceDocument(xPage); + + // 1. AA disabled + { +#ifdef MACOSX + // Disable test that always fails with Apple Retina displays + // With a HiDPI display on macOS, each logical pixel is backed + // by 4 physical pixels. Turning off antialiasing and drawing a + // diagonal line causes many logical pixels on the edge of the + // diagonal line to have a mixture of white and blue physical + // pixels. Then, when such logical pixels are fetched via + // BitmapEx::GetPixelColor(), their underlying 4 white and blue + // physical pixels are combined into blended shades of white + // and blue. +#else + css::uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(200)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(200)), + comphelper::makePropertyValue("AntiAliasing", false), + }; + + css::uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + xGraphicExporter->filter(aDescriptor); + + BitmapEx bmp = vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read(); + std::set foundColors; + for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x) + for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y) + foundColors.insert(bmp.GetPixelColor(x, y)); + + // There must be only two colors (white and blue) in the bitmap generated without AA + CPPUNIT_ASSERT_EQUAL(size_t(2), foundColors.size()); + maTempFile.CloseStream(); +#endif + } + + // 2. AA enabled + { + css::uno::Sequence aFilterData{ + comphelper::makePropertyValue("PixelWidth", sal_Int32(200)), + comphelper::makePropertyValue("PixelHeight", sal_Int32(200)), + comphelper::makePropertyValue("AntiAliasing", true), + }; + + css::uno::Sequence aDescriptor{ + comphelper::makePropertyValue("URL", maTempFile.GetURL()), + comphelper::makePropertyValue("FilterName", OUString("PNG")), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + xGraphicExporter->filter(aDescriptor); + + BitmapEx bmp = vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read(); + std::set foundColors; + for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x) + for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y) + foundColors.insert(bmp.GetPixelColor(x, y)); + + // With AA, the number of colors will be greater - it is 19 on my system + CPPUNIT_ASSERT_GREATER(size_t(2), foundColors.size()); + maTempFile.CloseStream(); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/qa/unit/SVGExportTests.cxx b/sd/qa/unit/SVGExportTests.cxx new file mode 100644 index 0000000000..b53f8c1d64 --- /dev/null +++ b/sd/qa/unit/SVGExportTests.cxx @@ -0,0 +1,310 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#define SVG_SVG *[name()='svg'] +#define SVG_G *[name()='g'] +#define SVG_TEXT *[name()='text'] +#define SVG_TSPAN *[name()='tspan'] +#define SVG_DEFS *[name()='defs'] +#define SVG_IMAGE *[name()='image'] +#define SVG_USE *[name()='use'] +#define SVG_PATTERN *[name()='pattern'] +#define SVG_RECT *[name()='rect'] +#define SVG_FOREIGNOBJECT *[name()='foreignObject'] +#define SVG_BODY *[name()='body'] +#define SVG_VIDEO *[name()='video'] + +using namespace css; + +namespace +{ +bool isValidBitmapId(const OUString& sId) +{ + std::regex aRegEx("bitmap\\(\\d+\\)"); + return std::regex_match(sId.toUtf8().getStr(), aRegEx); +} + +BitmapChecksum getBitmapChecksumFromId(std::u16string_view sId) +{ + size_t nStart = sId.find(u"(") + 1; + size_t nCount = sId.find(u")") - nStart; + bool bIsValidRange = nStart > 0 && nStart != std::u16string_view::npos && nCount > 0; + CPPUNIT_ASSERT(bIsValidRange); + OUString sChecksum( sId.substr( nStart, nCount ) ); + return sChecksum.toUInt64(); +} + +bool isValidBackgroundPatternId(const OUString& sId) +{ + std::regex aRegEx( R"(bg\-pattern\.id\d+\.\d+)" ); + return std::regex_match(sId.toUtf8().getStr(), aRegEx); +} + +bool isValidTiledBackgroundId(const OUString& sId) +{ + std::regex aRegEx( R"(bg\-id\d+\.\d+)" ); + return std::regex_match(sId.toUtf8().getStr(), aRegEx); +} + +} + +class SdSVGFilterTest : public UnoApiXmlTest +{ +public: + SdSVGFilterTest() + : UnoApiXmlTest("/sd/qa/unit/data/odp/") + { + } + + void testSVGExportTextDecorations() + { + loadFromFile(u"svg-export-text-decorations.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + svgDoc->name = reinterpret_cast(xmlStrdup(reinterpret_cast(OUStringToOString(maTempFile.GetURL(), RTL_TEXTENCODING_UTF8).getStr()))); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2] ), "class"_ostr, "SlideGroup"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G ), "class"_ostr, "Slide"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1] ), "class"_ostr, "TitleText"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1]/SVG_G/SVG_TEXT ), "class"_ostr, "SVGTextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "TextPosition"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN[1] ), "text-decoration"_ostr, "underline"); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[2]/SVG_G/SVG_TEXT ), "class"_ostr, "SVGTextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[2]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "TextPosition"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[2]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "text-decoration"_ostr, "line-through"); + } + + void testSVGExportJavascriptURL() + { + loadFromFile(u"textbox-link-javascript.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + // There should be only one child (no link to javascript url) + assertXPathChildren(svgDoc, + SAL_STRINGIFY(/ SVG_SVG / SVG_G[2] / SVG_G / SVG_G / SVG_G / SVG_G + / SVG_G[3] / SVG_G), + 1); + } + + void testSVGExportSlideCustomBackground() + { + loadFromFile(u"slide-custom-background.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_DEFS ), "class"_ostr, "SlideBackground"); + } + + void testSVGExportTextFieldsInMasterPage() + { + loadFromFile(u"text-fields.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2] ), "class"_ostr, "Master_Slide"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2] ), "class"_ostr, "BackgroundObjects"); + // Current Date Field + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[4] ), "class"_ostr, "TextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[4]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "PlaceholderText Date"); + // Current Time Field + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[5] ), "class"_ostr, "TextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[5]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "PlaceholderText Time"); + // Slide Name Field + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6] ), "class"_ostr, "TextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "PlaceholderText PageName"); + // Slide Number Field + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7] ), "class"_ostr, "TextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "PlaceholderText PageNumber"); + } + + void testSVGExportEmbeddedVideo() + { + loadFromFile(u"slide-video-thumbnail.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2] ), "class"_ostr, "SlideGroup"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1] ), "visibility"_ostr, "hidden"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1] ), "id"_ostr, "container-id1"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1] ), "class"_ostr, "Slide"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1] ), "class"_ostr, "Page"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1] ), "class"_ostr, "TitleText"); + + // First one has no valid video, so we just generate the stock thumbnail as an image. + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[2] ), "class"_ostr, "com.sun.star.presentation.MediaShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[2]/SVG_G[1]/SVG_IMAGE ), 1); + + // The second one is a valid video, with the thumbnail embedded. + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[5] ), "class"_ostr, "com.sun.star.drawing.MediaShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[5]/SVG_G[1] ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[5]/SVG_G[1]/SVG_FOREIGNOBJECT ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[5]/SVG_G[1]/SVG_FOREIGNOBJECT/SVG_BODY ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[5]/SVG_G[1]/SVG_FOREIGNOBJECT/SVG_BODY/SVG_VIDEO ), "preload"_ostr, "auto"); + + const OUString poster = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[1]/SVG_G[5]/SVG_G[1]/SVG_FOREIGNOBJECT/SVG_BODY/SVG_VIDEO), "poster"_ostr); + CPPUNIT_ASSERT_MESSAGE("The video poster is invalid", poster.startsWith("data:image/png;base64,")); + } + + void testSVGExportSlideBitmapBackground() + { + loadFromFile(u"slide-bitmap-background.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9] ), "class"_ostr, "BackgroundBitmaps"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), 1); + + OUString sImageId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), "id"_ostr); + CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid id: " + sImageId.toUtf8()).getStr(), isValidBitmapId(sImageId)); + + BitmapChecksum nChecksum = getBitmapChecksumFromId(sImageId); + CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid checksum: " + sImageId.toUtf8()).getStr(), nChecksum != 0); + + // single image case + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS ), "class"_ostr, "SlideBackground"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_G/SVG_USE ), 1); + OUString sRef = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_G/SVG_USE ), "href"_ostr); + CPPUNIT_ASSERT_MESSAGE("The element has not a valid href attribute: starting '#' not present.", sRef.startsWith("#")); + sRef = sRef.copy(1); + CPPUNIT_ASSERT_MESSAGE(OString("The element does not point to a valid bitmap id: " + sRef.toUtf8()).getStr(), isValidBitmapId(sRef)); + + BitmapChecksum nUseChecksum = getBitmapChecksumFromId(sRef); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The bitmap checksum used in does not match the expected one: ", nChecksum, nUseChecksum); + } + + void testSVGExportSlideTileBitmapBackground() + { + loadFromFile(u"slide-tile-background.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + // check the bitmap + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9] ), "class"_ostr, "BackgroundBitmaps"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), 1); + + // check the pattern and background rectangle + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10] ), "class"_ostr, "BackgroundPatterns"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN/SVG_USE ), 1); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_G/SVG_RECT ), 1); + + + // check that is pointing to the correct + OUString sImageId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), "id"_ostr); + CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid id: " + sImageId.toUtf8()).getStr(), isValidBitmapId(sImageId)); + + BitmapChecksum nChecksum = getBitmapChecksumFromId(sImageId); + CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid checksum: " + sImageId.toUtf8()).getStr(), nChecksum != 0); + + OUString sRef = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN/SVG_USE ), "href"_ostr); + CPPUNIT_ASSERT_MESSAGE("The element has not a valid href attribute: starting '#' not present.", sRef.startsWith("#")); + sRef = sRef.copy(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The href attribute for does not match the id attribute: ", sImageId, sRef); + + OUString sPatternId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN ), "id"_ostr); + CPPUNIT_ASSERT_MESSAGE(OString("The exported pattern has not a valid id: " + sPatternId.toUtf8()).getStr(), isValidBackgroundPatternId(sPatternId)); + + OUString sFillUrl = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_G/SVG_RECT ), "fill"_ostr); + bool bIsUrlFormat = sFillUrl.startsWith("url(#") && sFillUrl.endsWith(")"); + CPPUNIT_ASSERT_MESSAGE("The fill attribute for the element has not a url format .", bIsUrlFormat); + // remove "url(#" and ")" + sFillUrl = sFillUrl.copy(5, sFillUrl.getLength() - 6); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The fill url for does not match the id attribute: ", sPatternId, sFillUrl); + + OUString sBackgroundId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_G ), "id"_ostr); + CPPUNIT_ASSERT_MESSAGE(OString("The exported tiled background has not a valid id: " + sBackgroundId.toUtf8()).getStr(), isValidTiledBackgroundId(sBackgroundId)); + + // check element that point to the tiled background + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS ), "class"_ostr, "SlideBackground"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_USE ), 1); + + sRef = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_USE ), "href"_ostr); + CPPUNIT_ASSERT_MESSAGE("The element has not a valid href attribute: starting '#' not present.", sRef.startsWith("#")); + sRef = sRef.copy(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The href attribute for does not match the tiled background id attribute: ", sBackgroundId, sRef); + } + + void testSVGPlaceholderLocale() + { + static constexpr OUString aLangISO(u"it-IT"_ustr); + SvtSysLocaleOptions aSysLocaleOptions; + aSysLocaleOptions.SetLocaleConfigString(aLangISO); + aSysLocaleOptions.SetUILocaleConfigString(aLangISO); + + auto aSavedSettings = Application::GetSettings(); + Resetter aResetter([&]() { Application::SetSettings(aSavedSettings); }); + AllSettings aSettings(aSavedSettings); + aSettings.SetLanguageTag(aLangISO, true); + Application::SetSettings(aSettings); + + loadFromFile(u"text-fields.odp"); + save("impress_svg_Export"); + + xmlDocUniquePtr svgDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(svgDoc); + + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2] ), "class"_ostr, "Master_Slide"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2] ), "class"_ostr, "BackgroundObjects"); + + // Slide Name Field + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6] ), "class"_ostr, "TextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "PlaceholderText PageName"); + // Slide Number Field + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7] ), "class"_ostr, "TextShape"); + assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class"_ostr, "PlaceholderText PageNumber"); + } + + CPPUNIT_TEST_SUITE(SdSVGFilterTest); + CPPUNIT_TEST(testSVGExportTextDecorations); + CPPUNIT_TEST(testSVGExportJavascriptURL); + CPPUNIT_TEST(testSVGExportSlideCustomBackground); + CPPUNIT_TEST(testSVGExportTextFieldsInMasterPage); + CPPUNIT_TEST(testSVGExportEmbeddedVideo); + CPPUNIT_TEST(testSVGExportSlideBitmapBackground); + CPPUNIT_TEST(testSVGExportSlideTileBitmapBackground); + CPPUNIT_TEST(testSVGPlaceholderLocale); + CPPUNIT_TEST_SUITE_END(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(SdSVGFilterTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/SdrPdfImportTest.cxx b/sd/qa/unit/SdrPdfImportTest.cxx new file mode 100644 index 0000000000..52388678df --- /dev/null +++ b/sd/qa/unit/SdrPdfImportTest.cxx @@ -0,0 +1,282 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace css; + +namespace +{ +class EnvVarGuard +{ +public: + EnvVarGuard(const char* var, const char* val) + { + if (getenv(var) == nullptr) + { + sVar = var; + SetEnv(sVar, val); + } + } + ~EnvVarGuard() + { + if (sVar) + SetEnv(sVar, nullptr); + } + +private: + static void SetEnv(const char* var, const char* val) + { +#ifdef _WIN32 + if (!val) + val = ""; // remove + _putenv_s(var, val); +#else + if (val) + setenv(var, val, false); + else + unsetenv(var); +#endif + } + + const char* sVar = nullptr; +}; +} + +class SdrPdfImportTest : public UnoApiTest +{ +public: + SdrPdfImportTest() + : UnoApiTest("/sd/qa/unit/data/") + { + } +}; + +// Load the PDF in Draw, which will load the PDF as an Graphic, then +// mark the graphic object and trigger "break" function. This should +// convert the PDF content into objects/shapes. +CPPUNIT_TEST_FIXTURE(SdrPdfImportTest, testImportSimpleText) +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + // We need to enable PDFium import (and make sure to disable after the test) + EnvVarGuard UsePDFiumGuard("LO_IMPORT_USE_PDFIUM", "1"); + + loadFromFile(u"SimplePDF.pdf"); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + + // Get the first page - there should be only one. + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + // Check there is one object on the page only + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); + + // Get the first object - there should be only one. + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + // Check the object is a graphic object + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + // Check the graphic is a vector graphic and that it is PDF + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + + // Mark the object + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + + // Execute the break operation - to turn the PDF into shapes/objects + pViewShell->GetDrawView()->DoImportMarkedMtf(); + + // Check there is one object on the page only + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); + + // Get the object + SdrObject* pImportedObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pImportedObject); + + // Check the object position + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(2011, 2102), Size(2106 + 1, 298 + 1)), + pImportedObject->GetLogicRect()); + + // Object should be a text object containing one paragraph with + // content "This is PDF!" + + SdrTextObj* pTextObject = DynCastSdrTextObj(pImportedObject); + CPPUNIT_ASSERT(pTextObject); + OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject(); + const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject(); + OUString sText = aEdit.GetText(0); + CPPUNIT_ASSERT_EQUAL(OUString("This is PDF!"), sText); +} + +CPPUNIT_TEST_FIXTURE(SdrPdfImportTest, testAnnotationsImportExport) +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + // We need to enable PDFium import (and make sure to disable after the test) + EnvVarGuard UsePDFiumGuard("LO_IMPORT_USE_PDFIUM", "1"); + + EnvVarGuard DisablePDFCompressionGuard("VCL_DEBUG_DISABLE_PDFCOMPRESSION", "1"); + + auto pPdfiumLibrary = vcl::pdf::PDFiumLibrary::get(); + + loadFromFile(u"PdfWithAnnotation.pdf"); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + + BinaryDataContainer aContainer; + + { + // Get the first page - there should be only one. + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + // Check the number of annotations + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->getAnnotations().size()); + + // Get the first object - there should be only one. + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + // Check the object is a graphic object + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + // Check the graphic is a vector graphic and that it is PDF + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + + // Write the PDF + aContainer = pVectorGraphicData->getBinaryDataContainer(); + } + + { // check graphic PDF has annotations + + CPPUNIT_ASSERT_EQUAL(false, aContainer.isEmpty()); + + auto pPDFDocument + = pPdfiumLibrary->openDocument(aContainer.getData(), aContainer.getSize(), OString()); + auto pPDFPage = pPDFDocument->openPage(0); + + CPPUNIT_ASSERT_EQUAL(2, pPDFPage->getAnnotationCount()); + + auto pPDFAnnotation1 = pPDFPage->getAnnotation(0); + CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text, + pPDFAnnotation1->getSubType()); // Text annotation + + auto pPDFAnnotation2 = pPDFPage->getAnnotation(1); + CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, + pPDFAnnotation2->getSubType()); // Pop-up annotation + } + + { // save as PDF and check annotations + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export"); + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "ExportBookmarks", uno::Any(true) } })); + aMediaDescriptor["FilterData"] <<= aFilterData; + xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + + // Check PDF for annotations + auto pPDFDocument = parsePDFExport(); + CPPUNIT_ASSERT(pPDFDocument); + CPPUNIT_ASSERT_EQUAL(1, pPDFDocument->getPageCount()); + + auto pPDFPage = pPDFDocument->openPage(0); + CPPUNIT_ASSERT(pPDFPage); + + CPPUNIT_ASSERT_EQUAL(2, pPDFPage->getAnnotationCount()); + + auto pPDFAnnotation1 = pPDFPage->getAnnotation(0); + CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text, + pPDFAnnotation1->getSubType()); // Text annotation + + auto pPDFAnnotation2 = pPDFPage->getAnnotation(1); + CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, + pPDFAnnotation2->getSubType()); // Pop-up annotation + + // Load document again + mxComponent = loadFromDesktop(maTempFile.GetURL()); + auto pNewImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pNewViewShell = pNewImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pNewViewShell); + + SdPage* pPage = pNewViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + // We expect only 1 annotation in the document because the PDF + // annotations are dependent on each-other: + // parent annotation "Text" and the child annotation "Pop-up" + + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->getAnnotations().size()); + + // check annotation + auto xAnnotation = pPage->getAnnotations().at(0); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(90.33, xAnnotation->getPosition().X, 1E-3); + CPPUNIT_ASSERT_DOUBLES_EQUAL(12.07, xAnnotation->getPosition().Y, 1E-3); + + CPPUNIT_ASSERT_EQUAL(OUString("TheAuthor"), xAnnotation->getAuthor()); + CPPUNIT_ASSERT_EQUAL(OUString(), xAnnotation->getInitials()); + + auto xText = xAnnotation->getTextRange(); + + CPPUNIT_ASSERT_EQUAL(OUString("This is the annotation text!"), xText->getString()); + + auto aDateTime = xAnnotation->getDateTime(); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2020), aDateTime.Year); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), aDateTime.Month); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(18), aDateTime.Day); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(12), aDateTime.Hours); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(11), aDateTime.Minutes); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(53), aDateTime.Seconds); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aDateTime.NanoSeconds); + CPPUNIT_ASSERT_EQUAL(false, bool(aDateTime.IsUTC)); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/ShapeImportExportTest.cxx b/sd/qa/unit/ShapeImportExportTest.cxx new file mode 100644 index 0000000000..a59e503e41 --- /dev/null +++ b/sd/qa/unit/ShapeImportExportTest.cxx @@ -0,0 +1,396 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" + +#include + +#include + +#include +#include + +using namespace css; + +/// Shape / SdrObject import and export tests +class ShapeImportExportTest : public SdModelTestBase +{ +public: + ShapeImportExportTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + + void testTextDistancesOOXML(); + void testTextDistancesOOXML_LargerThanTextAreaSpecialCase(); + void testTextDistancesOOXML_Export(); + void testTextDistancesODP_OOXML_Export(); + + CPPUNIT_TEST_SUITE(ShapeImportExportTest); + CPPUNIT_TEST(testTextDistancesOOXML); + CPPUNIT_TEST(testTextDistancesOOXML_LargerThanTextAreaSpecialCase); + CPPUNIT_TEST(testTextDistancesOOXML_Export); + CPPUNIT_TEST(testTextDistancesODP_OOXML_Export); + CPPUNIT_TEST_SUITE_END(); +}; + +namespace +{ +SdrObject* searchObject(SdrPage const* pPage, std::u16string_view rName) +{ + for (size_t i = 0; i < pPage->GetObjCount(); ++i) + { + SdrObject* pCurrent = pPage->GetObj(i); + if (pCurrent->GetName() == rName) + return pCurrent; + } + return nullptr; +} +} + +/* Test text distances (insets) */ +void ShapeImportExportTest::testTextDistancesOOXML() +{ + createSdImpressDoc("TextDistancesInsets1.pptx"); + + SdrPage const* pPage = GetPage(1); + // Bottom Margin = 4cm + { + std::array aObjectDesc = { + u"T, BM - 4cm", + u"M, BM - 4cm", + u"B, BM - 4cm", + }; + + for (auto const& rString : aObjectDesc) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(-1292), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(2708), pTextObj->GetTextLowerDistance()); + } + } + + // Bottom Margin = 1cm + { + std::array aObjectDesc = { + u"T, BM - 1cm", + u"M, BM - 1cm", + u"B, BM - 1cm", + }; + + for (auto const& rString : aObjectDesc) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(1000), pTextObj->GetTextLowerDistance()); + } + } + + // Top + Bottom Margin = 1cm + { + std::array aObjectDesc = { + u"T, TM+BM - 1cm", + u"M, TM+BM - 1cm", + u"B, TM+BM - 1cm", + }; + + for (auto const& rString : aObjectDesc) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextLowerDistance()); + } + } + + // No margin - Top + Bottom = 0cm + { + std::array aObjectDesc = { + u"T", + u"M", + u"B", + }; + + for (auto const& rString : aObjectDesc) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextLowerDistance()); + } + } + + // Top Margin = 1cm + { + std::array aObjectDesc = { + u"T, TM - 1cm", + u"M, TM - 1cm", + u"B, TM - 1cm", + }; + + for (auto const& rString : aObjectDesc) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(1000), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextLowerDistance()); + } + } + + // Top Margin = 4cm + { + std::array aObjectDesc = { + u"T, TM - 4cm", + u"M, TM - 4cm", + u"B, TM - 4cm", + }; + + for (auto const& rString : aObjectDesc) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(2708), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(-1292), pTextObj->GetTextLowerDistance()); + } + } +} + +/* Test text distances (insets) variants where top+bottom margin > text area*/ +void ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase() +{ + createSdImpressDoc("TextDistancesInsets2.pptx"); + + SdrPage const* pPage = GetPage(1); + + // Top/Bottom 0cm/3cm, 1cm/4cm, 4cm/7cm - all should be converted to the same value in LO + { + std::array aObjectNames = { + u"T_0_3", u"M_0_3", u"B_0_3", u"T_1_4", u"M_1_4", + u"B_1_4", u"T_4_7", u"M_4_7", u"B_4_7", + }; + + for (auto const& rName : aObjectNames) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(-792), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(2208), pTextObj->GetTextLowerDistance()); + } + } + + // Top/Bottom 0cm/2cm, 1cm/3cm, 4cm/6cm - all should be converted to the same value in LO + { + std::array aObjectNames = { + u"T_0_2", u"M_0_2", u"B_0_2", u"T_1_3", u"M_1_3", + u"B_1_3", u"T_4_6", u"M_4_6", u"B_4_6", + }; + + for (auto const& rName : aObjectNames) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(-292), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(1708), pTextObj->GetTextLowerDistance()); + } + } + + // Top/Bottom 2cm/2cm, 3cm/3cm, 4cm/4cm - all should be converted to the same value in LO + { + std::array aObjectNames = { + u"T_2_2", u"M_2_2", u"B_2_2", u"T_3_3", u"M_3_3", + u"B_3_3", u"T_4_4", u"M_4_4", u"B_4_4", + }; + + for (auto const& rName : aObjectNames) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextLowerDistance()); + } + } + + // Top/Bottom 2cm/0cm, 3cm/1cm, 6cm/4cm - all should be converted to the same value in LO + { + std::array aObjectNames = { + u"T_2_0", u"M_2_0", u"B_2_0", u"T_3_1", u"M_3_1", + u"B_3_1", u"T_6_4", u"M_6_4", u"B_6_4", + }; + + for (auto const& rName : aObjectNames) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(1708), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(-292), pTextObj->GetTextLowerDistance()); + } + } + + // Top/Bottom 3cm/0cm, 4cm/1cm, 7cm/4cm - all should be converted to the same value in LO + { + std::array aObjectNames = { + u"T_3_0", u"M_3_0", u"B_3_0", u"T_4_1", u"M_4_1", + u"B_4_1", u"T_7_4", u"M_7_4", u"B_7_4", + }; + + for (auto const& rName : aObjectNames) + { + auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName)); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(tools::Long(2208), pTextObj->GetTextUpperDistance()); + CPPUNIT_ASSERT_EQUAL(tools::Long(-792), pTextObj->GetTextLowerDistance()); + } + } +} + +/* Test export of text distances (insets) - conversion back of special case */ +void ShapeImportExportTest::testTextDistancesOOXML_Export() +{ + createSdImpressDoc("TextDistancesInsets3.pptx"); + + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + //Check shape Top/Bottom - 0cm, 4cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_0_4"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "-360000" }, { "bIns", "1079640" } }); + + //Check shape Top/Bottom - 4cm, 0cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_4_0"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "1079640" }, { "bIns", "-360000" } }); + + //Check shape Top/Bottom - 0cm, 3cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_0_3"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "-180000" }, { "bIns", "899640" } }); + + //Check shape Top/Bottom - 2cm, 1cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_2_1"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "540000" }, { "bIns", "180000" } }); + + //Check shape Top/Bottom - 0cm, 2.5cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_0_2.5"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "-90000" }, { "bIns", "809640" } }); + + //Check shape Top/Bottom - 0cm, 2cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_0_2"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "0" }, { "bIns", "720000" } }); + + //Check shape Top/Bottom - 0cm, 1.5cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_0_1.5"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "0" }, { "bIns", "540000" } }); + + //Check shape Top/Bottom - 3cm, 0cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[8]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_3_0"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[8]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "899640" }, { "bIns", "-180000" } }); + + //Check shape Top/Bottom - 2.5cm, 0cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[9]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_2.5_0"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[9]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "809640" }, { "bIns", "-90000" } }); + + //Check shape Top/Bottom - 2cm, 0cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[10]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_2_0"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[10]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "720000" }, { "bIns", "0" } }); + + //Check shape Top/Bottom - 1.5cm, 0cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[11]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_1.5_0"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[11]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "540000" }, { "bIns", "0" } }); + + //Check shape Top/Bottom - 1cm, 2cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[12]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_1_2"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[12]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "180000" }, { "bIns", "540000" } }); + + //Check shape Top/Bottom - 2cm, 1.5cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[13]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_2_1.5"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[13]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "450000" }, { "bIns", "270000" } }); + + //Check shape Top/Bottom - 1.5cm, 2cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[14]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_1.5_2"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[14]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "270000" }, { "bIns", "450000" } }); + + //Check shape Top/Bottom - 2cm, 1.75cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[15]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_2_1.75"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[15]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "405000" }, { "bIns", "315000" } }); + + //Check shape Top/Bottom - 1.75cm, 2cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[16]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_1.75_2"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[16]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "315000" }, { "bIns", "405000" } }); + + //Check shape Top/Bottom - 2cm, 2cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[17]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_2_2"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[17]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "360000" }, { "bIns", "360000" } }); + + //Check shape Top/Bottom - 1cm, 1cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[18]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_1_1"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[18]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "360000" }, { "bIns", "360000" } }); + + //Check shape Top/Bottom - 0.5cm, 0.5cm + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[19]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "Text_TB_0.5_0.5"); + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[19]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "180000" }, { "bIns", "180000" } }); +} + +void ShapeImportExportTest::testTextDistancesODP_OOXML_Export() +{ + createSdImpressDoc("odp/tdf150966_hugeInset.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + // The text ends 5cm below the top edge of the shape. + // Without the fix we exported tIns="3600000" and bIns="5400000". + // The text had ended about 3.3cm below the top edge in PowerPoint. + assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, + { { "tIns", "720000" }, { "bIns", "2520000" } }); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(ShapeImportExportTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/TextFittingTest.cxx b/sd/qa/unit/TextFittingTest.cxx new file mode 100644 index 0000000000..069825a8e6 --- /dev/null +++ b/sd/qa/unit/TextFittingTest.cxx @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace css; + +class TextFittingTest : public SdModelTestBase +{ +public: + TextFittingTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(TextFittingTest, testTest) +{ + createSdImpressDoc("TextFitting.odp"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + auto pTextObject = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTextObject); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetFontScale(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetSpacingScale(), 1E-2); + + { + OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject(); + const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject(); + CPPUNIT_ASSERT_EQUAL(u"D1"_ustr, aEdit.GetText(0)); + CPPUNIT_ASSERT_EQUAL(u"D2"_ustr, aEdit.GetText(1)); + CPPUNIT_ASSERT_EQUAL(u"D3"_ustr, aEdit.GetText(2)); + } + + sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView1 = pViewShell1->GetView(); + Scheduler::ProcessEventsToIdle(); + pView1->SdrBeginTextEdit(pTextObject); + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + + auto* pOLV = pView1->GetTextEditOutlinerView(); + CPPUNIT_ASSERT(pOLV); + auto& rEditView = pOLV->GetEditView(); + auto* pEditEngine = rEditView.GetEditEngine(); + CPPUNIT_ASSERT(pEditEngine); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pEditEngine->GetParagraphCount()); + + // Add paragraph 4 + rEditView.SetSelection(ESelection(3, 0, 3, 0)); + rEditView.InsertText(u"\nD4"_ustr); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pEditEngine->GetParagraphCount()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(87.49, pEditEngine->getGlobalFontScale().getY(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0, pEditEngine->getGlobalSpacingScale().getY(), 1E-2); + + // Add paragraph 5 + rEditView.SetSelection(ESelection(4, 0, 4, 0)); + rEditView.InsertText(u"\nD5"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pEditEngine->GetParagraphCount()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(54.68, pEditEngine->getGlobalFontScale().getY(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pEditEngine->getGlobalSpacingScale().getY(), 1E-2); + + // Add paragraph 6 + rEditView.SetSelection(ESelection(5, 0, 5, 0)); + rEditView.InsertText(u"\nD6"_ustr); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pEditEngine->GetParagraphCount()); + + // Delete paragraph 6 + rEditView.SetSelection(ESelection(4, EE_TEXTPOS_MAX_COUNT, 5, EE_TEXTPOS_MAX_COUNT)); + rEditView.DeleteSelected(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pEditEngine->GetParagraphCount()); + + // Delete paragraph 5 + rEditView.SetSelection(ESelection(3, EE_TEXTPOS_MAX_COUNT, 4, EE_TEXTPOS_MAX_COUNT)); + rEditView.DeleteSelected(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pEditEngine->GetParagraphCount()); + + // Delete paragraph 4 + rEditView.SetSelection(ESelection(2, EE_TEXTPOS_MAX_COUNT, 3, EE_TEXTPOS_MAX_COUNT)); + rEditView.DeleteSelected(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pEditEngine->GetParagraphCount()); + + // not ideal - scaling should be 100%, but close enough + CPPUNIT_ASSERT_DOUBLES_EQUAL(99.05, pEditEngine->getGlobalFontScale().getY(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pEditEngine->getGlobalSpacingScale().getY(), 1E-2); + + // are we still in text edit mode? + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + pView1->SdrEndTextEdit(); + CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetFontScale(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetSpacingScale(), 1E-2); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/ThemeTest.cxx b/sd/qa/unit/ThemeTest.cxx new file mode 100644 index 0000000000..eec1abe5df --- /dev/null +++ b/sd/qa/unit/ThemeTest.cxx @@ -0,0 +1,155 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +using namespace css; + +class ThemeTest : public SdModelTestBase +{ +public: + ThemeTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +namespace +{ +/// Get the character color of the first text portion in xShape. +Color GetShapeTextColor(const uno::Reference& xShape) +{ + uno::Reference xText(xShape->getText(), uno::UNO_QUERY); + uno::Reference xPara(xText->createEnumeration()->nextElement(), + uno::UNO_QUERY); + uno::Reference xPortion(xPara->createEnumeration()->nextElement(), + uno::UNO_QUERY); + Color nColor{}; + xPortion->getPropertyValue("CharColor") >>= nColor; + return nColor; +} + +/// Get the solid fill color of xShape. +Color GetShapeFillColor(const uno::Reference& xShape) +{ + Color nColor{}; + xShape->getPropertyValue("FillColor") >>= nColor; + return nColor; +} + +} // end anonymous namespace + +CPPUNIT_TEST_FIXTURE(ThemeTest, testThemeChange) +{ + // Given a document, with a first slide and blue shape text from theme: + loadFromFile(u"theme.pptx"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + auto* pDocShell = pXImpressDocument->GetDocShell(); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + // The draw page also contains a group shape to make sure we don't crash on group shapes. + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xDrawPageShapes(xDrawPage, uno::UNO_QUERY); + + uno::Reference xShape(xDrawPageShapes->getByIndex(0), uno::UNO_QUERY); + // Blue. + CPPUNIT_ASSERT_EQUAL(Color(0x4472c4), GetShapeTextColor(xShape)); + + uno::Reference xShape2(xDrawPageShapes->getByIndex(1), uno::UNO_QUERY); + // Blue, lighter. + CPPUNIT_ASSERT_EQUAL(Color(0xb4c7e7), GetShapeTextColor(xShape2)); + + uno::Reference xShape3(xDrawPageShapes->getByIndex(2), uno::UNO_QUERY); + // Blue, darker. + CPPUNIT_ASSERT_EQUAL(Color(0x2f5597), GetShapeTextColor(xShape3)); + + // Shape fill: + uno::Reference xShape4(xDrawPageShapes->getByIndex(4), uno::UNO_QUERY); + // Blue. + CPPUNIT_ASSERT_EQUAL(Color(0x4472c4), GetShapeFillColor(xShape4)); + + // The theme color of this filled shape is set by the PPTX import: + { + uno::Reference xComplexColor; + CPPUNIT_ASSERT(xShape4->getPropertyValue("FillComplexColor") >>= xComplexColor); + CPPUNIT_ASSERT(xComplexColor.is()); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); + } + + uno::Reference xShape5(xDrawPageShapes->getByIndex(5), uno::UNO_QUERY); + // Blue, lighter. + CPPUNIT_ASSERT_EQUAL(Color(0xb4c7e7), GetShapeFillColor(xShape5)); + // The theme index, and effects (lum mod, lum off) are set by the PPTX import: + { + uno::Reference xComplexColor; + CPPUNIT_ASSERT(xShape5->getPropertyValue("FillComplexColor") >>= xComplexColor); + CPPUNIT_ASSERT(xComplexColor.is()); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, + aComplexColor.getTransformations()[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), aComplexColor.getTransformations()[0].mnValue); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, + aComplexColor.getTransformations()[1].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), aComplexColor.getTransformations()[1].mnValue); + } + + // When changing the master slide of slide 1 to use the theme of the second master slide: + uno::Reference xDrawPage2( + xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY); + uno::Reference xMasterPage2(xDrawPage2->getMasterPage(), uno::UNO_QUERY); + uno::Any aTheme = xMasterPage2->getPropertyValue("Theme"); + + uno::Reference xMasterPage(xDrawPage->getMasterPage(), uno::UNO_QUERY); + xMasterPage->setPropertyValue("Theme", aTheme); + + css::uno::Reference xDrawPageMaster(xMasterPage, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDrawPageMaster.is()); + auto* pMasterPage = GetSdrPageFromXDrawPage(xDrawPageMaster); + auto pTheme = pMasterPage->getSdrPageProperties().getTheme(); + + sd::ThemeColorChanger aChanger(pMasterPage, pDocShell); + aChanger.apply(pTheme->getColorSet()); + + // Then make sure the shape text color is now green: + CPPUNIT_ASSERT_EQUAL(Color(0x90c226), GetShapeTextColor(xShape)); + // Green, lighter: + CPPUNIT_ASSERT_EQUAL(Color(0xd5eda2), GetShapeTextColor(xShape2)); + // Green, darker. + CPPUNIT_ASSERT_EQUAL(Color(0x6c911d), GetShapeTextColor(xShape3)); + // Shape fill: + CPPUNIT_ASSERT_EQUAL(Color(0x90c226), GetShapeFillColor(xShape4)); + // Green, lighter: + CPPUNIT_ASSERT_EQUAL(Color(0xd5eda2), GetShapeFillColor(xShape5)); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/a11y/data/tdf150064.fodp b/sd/qa/unit/a11y/data/tdf150064.fodp new file mode 100644 index 0000000000..6eda6b630c --- /dev/null +++ b/sd/qa/unit/a11y/data/tdf150064.fodp @@ -0,0 +1,796 @@ + + + 2022-07-30T14:38:24.9165100222022-07-30T15:14:00.484240506PT35M43S1LibreOfficeDev/7.5.0.0.alpha0$Linux_X86_64 LibreOffice_project/6721eddbcfefd9503a49499956e53d1a76f6712f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + P1 title + + + + + Some text + + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + + + 6 + + + 7 + + + 8 + + + 9 + + + 10 + + + + VkNMTVRGAQAxAAAAAAAAAAEAGwAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAACU3AACx + DwAA4QAAAIkAAQAhAAAAAQAbAAAADQAKyv//j9T//wEAAAABAAAAAQAAAAEAAAAAlgABAAIA + AAAJAIsAAQACAAAAAwCFAAEABQAAALOzswABhAABAAUAAAAAAAAAAG8AAgAuAAAAAQAFAOo1 + AABlKwAA7UAAAGUrAADtQAAANDMAAOo1AAA0MwAA6jUAAGUrAAAAAIwAAQAAAAAAAAIBACAA + AAAWAFhURVhUX1BBSU5UU0hBUEVfQkVHSU4AAAAAAAAAAIoAAQBFAAAABAA/AAAADwBMaWJl + cmF0aW9uIFNhbnMAAAAAAAB7AgAA//8AAAIABQAAAAAAAAAMBAAAAAAAAAABAP8DAAAAAAAA + AAAAiAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAABxAAIAHgAAAOQ2AAAnLgAA + AQAAADEAAAABAAEAAABfAQAAAQAxAAACAQATAAAACQBYVEVYVF9FT0MAAAAAAAAAAAACAQAT + AAAACQBYVEVYVF9FT0wAAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT1AAAAAAAAAAAAACAQAe + AAAAFABYVEVYVF9QQUlOVFNIQVBFX0VORAAAAAAAAAAAiwABAAIAAAADAIUAAQAFAAAAs7Oz + AAGEAAEABQAAAAAAAAAAbwACAC4AAAABAAUA7UAAAGUrAADwSwAAZSsAAPBLAAA0MwAA7UAA + ADQzAADtQAAAZSsAAAAAjAABAAAAAAAAAgEAIAAAABYAWFRFWFRfUEFJTlRTSEFQRV9CRUdJ + TgAAAAAAAAAAigABAEUAAAAEAD8AAAAPAExpYmVyYXRpb24gU2FucwAAAAAAAHsCAAD//wAA + AgAFAAAAAAAAAAwEAAAAAAAAAAEA/wMAAAAAAAAAAACIAAEAAgAAAAEAhwABAAUAAAD///// + AIYAAQAEAAAAAAAAAHEAAgAeAAAA50EAACcuAAABAAAAMgAAAAEAAQAAAF8BAAABADIAAAIB + ABMAAAAJAFhURVhUX0VPQwAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPTAAAAAAAAAAAAAIB + ABMAAAAJAFhURVhUX0VPUAAAAAAAAAAAAAIBAB4AAAAUAFhURVhUX1BBSU5UU0hBUEVfRU5E + AAAAAAAAAACLAAEAAgAAAAMAhQABAAUAAACzs7MAAYQAAQAFAAAAAAAAAABvAAIALgAAAAEA + BQDwSwAAZSsAAPNWAABlKwAA81YAADQzAADwSwAANDMAAPBLAABlKwAAAACMAAEAAAAAAAAC + AQAgAAAAFgBYVEVYVF9QQUlOVFNIQVBFX0JFR0lOAAAAAAAAAACKAAEARQAAAAQAPwAAAA8A + TGliZXJhdGlvbiBTYW5zAAAAAAAAewIAAP//AAACAAUAAAAAAAAADAQAAAAAAAAAAQD/AwAA + AAAAAAAAAIgAAQACAAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAAcQACAB4AAADqTAAA + Jy4AAAEAAAAzAAAAAQABAAAAXwEAAAEAMwAAAgEAEwAAAAkAWFRFWFRfRU9DAAAAAAAAAAAA + AgEAEwAAAAkAWFRFWFRfRU9MAAAAAAAAAAAAAgEAEwAAAAkAWFRFWFRfRU9QAAAAAAAAAAAA + AgEAHgAAABQAWFRFWFRfUEFJTlRTSEFQRV9FTkQAAAAAAAAAAIsAAQACAAAAAwCFAAEABQAA + ALOzswABhAABAAUAAAAAAAAAAG8AAgAuAAAAAQAFAPNWAABlKwAA9mEAAGUrAAD2YQAANDMA + APNWAAA0MwAA81YAAGUrAAAAAIwAAQAAAAAAAAIBACAAAAAWAFhURVhUX1BBSU5UU0hBUEVf + QkVHSU4AAAAAAAAAAIoAAQBFAAAABAA/AAAADwBMaWJlcmF0aW9uIFNhbnMAAAAAAAB7AgAA + //8AAAIABQAAAAAAAAAMBAAAAAAAAAABAP8DAAAAAAAAAAAAiAABAAIAAAABAIcAAQAFAAAA + /////wCGAAEABAAAAAAAAABxAAIAHgAAAO1XAAAnLgAAAQAAADQAAAABAAEAAABfAQAAAQA0 + AAACAQATAAAACQBYVEVYVF9FT0MAAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT0wAAAAAAAAA + AAACAQATAAAACQBYVEVYVF9FT1AAAAAAAAAAAAACAQAeAAAAFABYVEVYVF9QQUlOVFNIQVBF + X0VORAAAAAAAAAAAiwABAAIAAAADAIUAAQAFAAAAs7OzAAGEAAEABQAAAAAAAAAAbwACAC4A + AAABAAUA9mEAAGUrAAD9bAAAZSsAAP1sAAA0MwAA9mEAADQzAAD2YQAAZSsAAAAAjAABAAAA + AAAAAgEAIAAAABYAWFRFWFRfUEFJTlRTSEFQRV9CRUdJTgAAAAAAAAAAigABAEUAAAAEAD8A + AAAPAExpYmVyYXRpb24gU2FucwAAAAAAAHsCAAD//wAAAgAFAAAAAAAAAAwEAAAAAAAAAAEA + /wMAAAAAAAAAAACIAAEAAgAAAAEAhwABAAUAAAD/////AIYAAQAEAAAAAAAAAHEAAgAeAAAA + 8GIAACcuAAABAAAANQAAAAEAAQAAAF8BAAABADUAAAIBABMAAAAJAFhURVhUX0VPQwAAAAAA + AAAAAAIBABMAAAAJAFhURVhUX0VPTAAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPUAAAAAAA + AAAAAAIBAB4AAAAUAFhURVhUX1BBSU5UU0hBUEVfRU5EAAAAAAAAAACLAAEAAgAAAAMAhQAB + AAUAAADMzMwAAYQAAQAFAAAAAAAAAABvAAIALgAAAAEABQDqNQAANDMAAO1AAAA0MwAA7UAA + AAQ7AADqNQAABDsAAOo1AAA0MwAAAACMAAEAAAAAAAACAQAgAAAAFgBYVEVYVF9QQUlOVFNI + QVBFX0JFR0lOAAAAAAAAAACKAAEARQAAAAQAPwAAAA8ATGliZXJhdGlvbiBTYW5zAAAAAAAA + ewIAAP//AAACAAUAAAAAAAAADAQAAAAAAAAAAQD/AwAAAAAAAAAAAIgAAQACAAAAAQCHAAEA + BQAAAP////8AhgABAAQAAAAAAAAAcQACAB4AAADkNgAA9jUAAAEAAAA2AAAAAQABAAAAXwEA + AAEANgAAAgEAEwAAAAkAWFRFWFRfRU9DAAAAAAAAAAAAAgEAEwAAAAkAWFRFWFRfRU9MAAAA + AAAAAAAAAgEAEwAAAAkAWFRFWFRfRU9QAAAAAAAAAAAAAgEAHgAAABQAWFRFWFRfUEFJTlRT + SEFQRV9FTkQAAAAAAAAAAIsAAQACAAAAAwCFAAEABQAAAMzMzAABhAABAAUAAAAAAAAAAG8A + AgAuAAAAAQAFAO1AAAA0MwAA8EsAADQzAADwSwAABDsAAO1AAAAEOwAA7UAAADQzAAAAAIwA + AQAAAAAAAAIBACAAAAAWAFhURVhUX1BBSU5UU0hBUEVfQkVHSU4AAAAAAAAAAIoAAQBFAAAA + BAA/AAAADwBMaWJlcmF0aW9uIFNhbnMAAAAAAAB7AgAA//8AAAIABQAAAAAAAAAMBAAAAAAA + AAABAP8DAAAAAAAAAAAAiAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAABxAAIA + HgAAAOdBAAD2NQAAAQAAADcAAAABAAEAAABfAQAAAQA3AAACAQATAAAACQBYVEVYVF9FT0MA + AAAAAAAAAAACAQATAAAACQBYVEVYVF9FT0wAAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT1AA + AAAAAAAAAAACAQAeAAAAFABYVEVYVF9QQUlOVFNIQVBFX0VORAAAAAAAAAAAiwABAAIAAAAD + AIUAAQAFAAAAzMzMAAGEAAEABQAAAAAAAAAAbwACAC4AAAABAAUA8EsAADQzAADzVgAANDMA + APNWAAAEOwAA8EsAAAQ7AADwSwAANDMAAAAAjAABAAAAAAAAAgEAIAAAABYAWFRFWFRfUEFJ + TlRTSEFQRV9CRUdJTgAAAAAAAAAAigABAEUAAAAEAD8AAAAPAExpYmVyYXRpb24gU2FucwAA + AAAAAHsCAAD//wAAAgAFAAAAAAAAAAwEAAAAAAAAAAEA/wMAAAAAAAAAAACIAAEAAgAAAAEA + hwABAAUAAAD/////AIYAAQAEAAAAAAAAAHEAAgAeAAAA6kwAAPY1AAABAAAAOAAAAAEAAQAA + AF8BAAABADgAAAIBABMAAAAJAFhURVhUX0VPQwAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VP + TAAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPUAAAAAAAAAAAAAIBAB4AAAAUAFhURVhUX1BB + SU5UU0hBUEVfRU5EAAAAAAAAAACLAAEAAgAAAAMAhQABAAUAAADMzMwAAYQAAQAFAAAAAAAA + AABvAAIALgAAAAEABQDzVgAANDMAAPZhAAA0MwAA9mEAAAQ7AADzVgAABDsAAPNWAAA0MwAA + AACMAAEAAAAAAAACAQAgAAAAFgBYVEVYVF9QQUlOVFNIQVBFX0JFR0lOAAAAAAAAAACKAAEA + RQAAAAQAPwAAAA8ATGliZXJhdGlvbiBTYW5zAAAAAAAAewIAAP//AAACAAUAAAAAAAAADAQA + AAAAAAAAAQD/AwAAAAAAAAAAAIgAAQACAAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAA + cQACAB4AAADtVwAA9jUAAAEAAAA5AAAAAQABAAAAXwEAAAEAOQAAAgEAEwAAAAkAWFRFWFRf + RU9DAAAAAAAAAAAAAgEAEwAAAAkAWFRFWFRfRU9MAAAAAAAAAAAAAgEAEwAAAAkAWFRFWFRf + RU9QAAAAAAAAAAAAAgEAHgAAABQAWFRFWFRfUEFJTlRTSEFQRV9FTkQAAAAAAAAAAIsAAQAC + AAAAAwCFAAEABQAAAMzMzAABhAABAAUAAAAAAAAAAG8AAgAuAAAAAQAFAPZhAAA0MwAA/WwA + ADQzAAD9bAAABDsAAPZhAAAEOwAA9mEAADQzAAAAAIwAAQAAAAAAAAIBACAAAAAWAFhURVhU + X1BBSU5UU0hBUEVfQkVHSU4AAAAAAAAAAIoAAQBFAAAABAA/AAAADwBMaWJlcmF0aW9uIFNh + bnMAAAAAAAB7AgAA//8AAAIABQAAAAAAAAAMBAAAAAAAAAABAP8DAAAAAAAAAAAAiAABAAIA + AAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAABxAAIAJgAAAPBiAAD2NQAAAgAAADEAMAAA + AAIAAgAAAF8BAAC/AgAAAgAxADAAAAIBABMAAAAJAFhURVhUX0VPQwAAAAAAAAAAAAIBABMA + AAAJAFhURVhUX0VPQwEAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPTAAAAAAAAAAAAAIBABMA + AAAJAFhURVhUX0VPUAAAAAAAAAAAAAIBAB4AAAAUAFhURVhUX1BBSU5UU0hBUEVfRU5EAAAA + AAAAAACLAAEAAgAAAAMAhAABAAUAAAD///8AAQACAQBuAAAAFQBYUEFUSFNUUk9LRV9TRVFf + QkVHSU4AAAAATwAAAAEASQAAAAEAEwAAAAIA3DUAAGUrAAALbQAAZSsAAAABAAIAAAAAAAEA + AgAAAAAAAAAAAAAAAACO4ziO4zg8QAAAAQCO4ziO4zg8QAAAAACEAAEABQAAAP///wABhQAB + AAUAAAAAAAAAAG0AAwBTAAAAAgDcNQAAZSsAAAttAABlKwAABQA6AAAAAQAcAAAAAAAAAAAA + AAAAAAAAAAAAAAQAAAAAAAAAAAA8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAHQAA + ABMAWFBBVEhTVFJPS0VfU0VRX0VORAAAAAAAAAAAjAABAAAAAACLAAEAAgAAAAMAhAABAAUA + AAD///8AAQACAQBuAAAAFQBYUEFUSFNUUk9LRV9TRVFfQkVHSU4AAAAATwAAAAEASQAAAAEA + EwAAAAIA6jUAAFcrAADqNQAAEjsAAAABAAIAAAAAAAEAAgAAAAAAAAAAAAAAAACO4ziO4zg8 + QAAAAQCO4ziO4zg8QAAAAACEAAEABQAAAP///wABhQABAAUAAAAAAAAAAG0AAwBTAAAAAgDq + NQAAVysAAOo1AAASOwAABQA6AAAAAQAcAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAA8 + QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAHQAAABMAWFBBVEhTVFJPS0VfU0VRX0VO + RAAAAAAAAAAAjAABAAAAAACLAAEAAgAAAAMAhAABAAUAAAD///8AAQACAQBuAAAAFQBYUEFU + SFNUUk9LRV9TRVFfQkVHSU4AAAAATwAAAAEASQAAAAEAEwAAAAIA7UAAAFcrAADtQAAAEjsA + AAABAAIAAAAAAAEAAgAAAAAAAAAAAAAAAACO4ziO4zg8QAAAAQCO4ziO4zg8QAAAAACEAAEA + BQAAAP///wABhQABAAUAAAAAAAAAAG0AAwBTAAAAAgDtQAAAVysAAO1AAAASOwAABQA6AAAA + AQAcAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAA8QAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAgEAHQAAABMAWFBBVEhTVFJPS0VfU0VRX0VORAAAAAAAAAAAjAABAAAAAACLAAEA + AgAAAAMAhAABAAUAAAD///8AAQACAQBuAAAAFQBYUEFUSFNUUk9LRV9TRVFfQkVHSU4AAAAA + TwAAAAEASQAAAAEAEwAAAAIA8EsAAFcrAADwSwAAEjsAAAABAAIAAAAAAAEAAgAAAAAAAAAA + AAAAAACO4ziO4zg8QAAAAQCO4ziO4zg8QAAAAACEAAEABQAAAP///wABhQABAAUAAAAAAAAA + AG0AAwBTAAAAAgDwSwAAVysAAPBLAAASOwAABQA6AAAAAQAcAAAAAAAAAAAAAAAAAAAAAAAA + AAQAAAAAAAAAAAA8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAHQAAABMAWFBBVEhT + VFJPS0VfU0VRX0VORAAAAAAAAAAAjAABAAAAAACLAAEAAgAAAAMAhAABAAUAAAD///8AAQAC + AQBuAAAAFQBYUEFUSFNUUk9LRV9TRVFfQkVHSU4AAAAATwAAAAEASQAAAAEAEwAAAAIA81YA + AFcrAADzVgAAEjsAAAABAAIAAAAAAAEAAgAAAAAAAAAAAAAAAACO4ziO4zg8QAAAAQCO4ziO + 4zg8QAAAAACEAAEABQAAAP///wABhQABAAUAAAAAAAAAAG0AAwBTAAAAAgDzVgAAVysAAPNW + AAASOwAABQA6AAAAAQAcAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAA8QAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAgEAHQAAABMAWFBBVEhTVFJPS0VfU0VRX0VORAAAAAAAAAAA + jAABAAAAAACLAAEAAgAAAAMAhAABAAUAAAD///8AAQACAQBuAAAAFQBYUEFUSFNUUk9LRV9T + RVFfQkVHSU4AAAAATwAAAAEASQAAAAEAEwAAAAIA9mEAAFcrAAD2YQAAEjsAAAABAAIAAAAA + AAEAAgAAAAAAAAAAAAAAAACO4ziO4zg8QAAAAQCO4ziO4zg8QAAAAACEAAEABQAAAP///wAB + hQABAAUAAAAAAAAAAG0AAwBTAAAAAgD2YQAAVysAAPZhAAASOwAABQA6AAAAAQAcAAAAAAAA + AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAA8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEA + HQAAABMAWFBBVEhTVFJPS0VfU0VRX0VORAAAAAAAAAAAjAABAAAAAACLAAEAAgAAAAMAhAAB + AAUAAAD///8AAQACAQBuAAAAFQBYUEFUSFNUUk9LRV9TRVFfQkVHSU4AAAAATwAAAAEASQAA + AAEAEwAAAAIA/WwAAFcrAAD9bAAAEjsAAAABAAIAAAAAAAEAAgAAAAAAAAAAAAAAAACO4ziO + 4zg8QAAAAQCO4ziO4zg8QAAAAACEAAEABQAAAP///wABhQABAAUAAAAAAAAAAG0AAwBTAAAA + AgD9bAAAVysAAP1sAAASOwAABQA6AAAAAQAcAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAA + AAA8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAHQAAABMAWFBBVEhTVFJPS0VfU0VR + X0VORAAAAAAAAAAAjAABAAAAAACLAAEAAgAAAAMAhAABAAUAAAD///8AAQACAQBuAAAAFQBY + UEFUSFNUUk9LRV9TRVFfQkVHSU4AAAAATwAAAAEASQAAAAEAEwAAAAIA3DUAADQzAAALbQAA + NDMAAAABAAIAAAAAAAEAAgAAAAAAAAAAAAAAAACO4ziO4zg8QAAAAQCO4ziO4zg8QAAAAACE + AAEABQAAAP///wABhQABAAUAAAAAAAAAAG0AAwBTAAAAAgDcNQAANDMAAAttAAA0MwAABQA6 + AAAAAQAcAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAA8QAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAgEAHQAAABMAWFBBVEhTVFJPS0VfU0VRX0VORAAAAAAAAAAAjAABAAAAAACL + AAEAAgAAAAMAhAABAAUAAAD///8AAQACAQBuAAAAFQBYUEFUSFNUUk9LRV9TRVFfQkVHSU4A + AAAATwAAAAEASQAAAAEAEwAAAAIA3DUAAAQ7AAALbQAABDsAAAABAAIAAAAAAAEAAgAAAAAA + AAAAAAAAAACO4ziO4zg8QAAAAQCO4ziO4zg8QAAAAACEAAEABQAAAP///wABhQABAAUAAAAA + AAAAAG0AAwBTAAAAAgDcNQAABDsAAAttAAAEOwAABQA6AAAAAQAcAAAAAAAAAAAAAAAAAAAA + AAAAAAQAAAAAAAAAAAA8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAHQAAABMAWFBB + VEhTVFJPS0VfU0VRX0VORAAAAAAAAAAAjAABAAAAAAA= + + + + + + + + + + + + + + P2 title + + + + + + + 1 + + + + + + + + + 2 + + + + + + + + + 3 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/a11y/layout.cxx b/sd/qa/unit/a11y/layout.cxx new file mode 100644 index 0000000000..51ad074373 --- /dev/null +++ b/sd/qa/unit/a11y/layout.cxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include + +#include +#include + +using namespace css; + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestImpressDefaultStructure) +{ + load(u"private:factory/simpress"_ustr); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(rtl::OUString("" + "" + "" + "Click to add Title" + "" + "" + "" + "" + "Click to add Text" + "" + ""), + collectText()); +} + +// a basic check of the content order for https://bugs.documentfoundation.org/show_bug.cgi?id=150064 +CPPUNIT_TEST_FIXTURE(test::AccessibleTestBase, TestImpressDefaultLayout) +{ + load(u"private:factory/simpress"_ustr); + Scheduler::ProcessEventsToIdle(); + + auto xDocumentContext = getDocumentAccessibleContext(); + + /* The tree inside the document is a bit awkward, as the page is not the parent of the other + * shapes, but well. It looks like this: + * document_presentation + * shape (page) + * shape (title) + * paragraph + * shape (subtitle) + * paragraph + */ + CPPUNIT_ASSERT_EQUAL(sal_Int64(3), xDocumentContext->getAccessibleChildCount()); + CPPUNIT_ASSERT_EQUAL( + OUString("PresentationTitle "), + xDocumentContext->getAccessibleChild(1)->getAccessibleContext()->getAccessibleName()); + CPPUNIT_ASSERT_EQUAL( + OUString("PresentationSubtitle "), + xDocumentContext->getAccessibleChild(2)->getAccessibleContext()->getAccessibleName()); +} + +// test a11y tree order is stable (https://bugs.documentfoundation.org/show_bug.cgi?id=150064) +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, tdf150064) +{ + loadFromSrc(u"/sd/qa/unit/a11y/data/tdf150064.fodp"_ustr); + Scheduler::ProcessEventsToIdle(); + + uno::Reference xDrawPagesSupplier(mxDocument, + uno::UNO_QUERY_THROW); + uno::Reference xModel(mxDocument, uno::UNO_QUERY_THROW); + uno::Reference xDrawView(xModel->getCurrentController(), + uno::UNO_QUERY_THROW); + + auto xDrawPages = xDrawPagesSupplier->getDrawPages(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xDrawPages->getCount()); + + // Loop a couple times to make sure output is stable when loading and when switching pages + for (int i = 0; i < 2; i++) + { + uno::Reference xDrawPage; + + CPPUNIT_ASSERT(xDrawPages->getByIndex(0) >>= xDrawPage); + xDrawView->setCurrentPage(xDrawPage); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL( + rtl::OUString("" + "" + "P1 title" + "" + "" + "Some text" + "" + "" + "" + "1" + "" + "" + "2" + "" + "" + "3" + "" + "" + "4" + "" + "" + "5" + "" + "" + "6" + "" + "" + "7" + "" + "" + "8" + "" + "" + "9" + "" + "" + "10" + "" + "
    "), + collectText()); + + CPPUNIT_ASSERT(xDrawPages->getByIndex(1) >>= xDrawPage); + xDrawView->setCurrentPage(xDrawPage); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL( + rtl::OUString("" + "" + "P2 title" + "" + "" + "1" + "" + "" + "2" + "" + "" + "3" + ""), + collectText()); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/qa/unit/activex-controls-tests.cxx b/sd/qa/unit/activex-controls-tests.cxx new file mode 100644 index 0000000000..ec40a5981f --- /dev/null +++ b/sd/qa/unit/activex-controls-tests.cxx @@ -0,0 +1,1174 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +class SdActiveXControlsTest: public SdModelTestBase +{ +public: + SdActiveXControlsTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + + void testBackgroundColor(); + void testLabelProperties(); + void testTextBoxProperties(); + void testSpinButtonProperties(); + void testCommandButtonProperties(); + void testScrollBarProperties(); + void testCheckBoxProperties(); + void testOptionButtonProperties(); + void testComboBoxProperties(); + void testListBoxProperties(); + void testToggleButtonProperties(); + void testPictureProperties(); + void testFontProperties(); + + CPPUNIT_TEST_SUITE(SdActiveXControlsTest); + + CPPUNIT_TEST(testBackgroundColor); + CPPUNIT_TEST(testLabelProperties); + CPPUNIT_TEST(testTextBoxProperties); + CPPUNIT_TEST(testSpinButtonProperties); + CPPUNIT_TEST(testCommandButtonProperties); + CPPUNIT_TEST(testScrollBarProperties); + CPPUNIT_TEST(testCheckBoxProperties); + CPPUNIT_TEST(testOptionButtonProperties); + CPPUNIT_TEST(testComboBoxProperties); + CPPUNIT_TEST(testListBoxProperties); + CPPUNIT_TEST(testToggleButtonProperties); + CPPUNIT_TEST(testPictureProperties); + CPPUNIT_TEST(testFontProperties); + + CPPUNIT_TEST_SUITE_END(); +}; + +void SdActiveXControlsTest::testBackgroundColor() +{ + // Check whether all system colors are imported correctly + createSdImpressDoc("pptx/control_background_color.pptx"); + + const std::vector vBackgroundColors = + { + 0xD4D0C8, // Scroll Bars + 0x004E98, // Desktop + 0x0054E3, // Active Title Bar + 0x7A96DF, // Inactive Title Bar + 0xFFFFFF, // Menu Bar + 0xFFFFFF, // Window Background + 0x000000, // Window Frame + 0x000000, // Menu Text + 0x000000, // Window Text + 0xFFFFFF, // Active Title Bar Text + 0xD4D0C8, // Active Border + 0xD4D0C8, // Inactive Border + 0x808080, // Application Workspace + 0x316AC5, // Highlight + 0xFFFFFF, // Highlight Text + 0xECE9D8, // Button Face + 0xACA899, // Button Shadow + 0xACA899, // Disabled Text + 0x000000, // Button Text + 0xD8E4F8, // Inactive Title Bar Text + 0xFFFFFF, // Button Highlight + 0x716F64, // Button Dark Shadow + 0xF1EFE2, // Button Light Shadow + 0x000000, // Tooltip Text + 0xFFFFE1, // Tooltip + 0xFF0000, // Custom red color + }; + + for (size_t i = 0; i < vBackgroundColors.size(); ++i) + { + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(i, 0), uno::UNO_QUERY_THROW); + + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + OString sMessage = "The wrong control's index is: " + OString::number(i); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), vBackgroundColors[i], nColor); + } +} + +void SdActiveXControlsTest::testLabelProperties() +{ + createSdImpressDoc("pptx/activex_label.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OUString sLabel; + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("Label1"), sLabel); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + bool bMultiLine; + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(true, bMultiLine); + + Color nColor; + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + sal_Int16 nBorderStyle; + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nBorderStyle); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + style::VerticalAlignment eAlign; + xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign; + CPPUNIT_ASSERT_EQUAL(style::VerticalAlignment_TOP, eAlign); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("Custom Label"), sLabel); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xE0E0E0), nColor); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x0000FF), nColor); + + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle); + + Color nBorderColor; + xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor; + CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), nBorderColor); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign; + CPPUNIT_ASSERT_EQUAL(style::VerticalAlignment_TOP, eAlign); + + // Third control has transparent background + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor); +} + +void SdActiveXControlsTest::testTextBoxProperties() +{ + createSdImpressDoc("pptx/activex_textbox.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OUString sText; + xPropertySet->getPropertyValue("Text") >>= sText; + CPPUNIT_ASSERT_EQUAL(OUString(), sText); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + bool bMultiLine; + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + Color nColor; + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + sal_Int16 nBorderStyle; + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nBorderStyle); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + style::VerticalAlignment eAlign; + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign); + + bool bHideSelection; + xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideSelection; + CPPUNIT_ASSERT_EQUAL(true, bHideSelection); + + sal_Int16 nMaxLength; + xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxLength; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nMaxLength); + + sal_Int16 nEchoChar; + xPropertySet->getPropertyValue("EchoChar") >>= nEchoChar; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nEchoChar); + + bool bHScroll; + xPropertySet->getPropertyValue("HScroll") >>= bHScroll; + CPPUNIT_ASSERT_EQUAL(false, bHScroll); + + bool bVScroll; + xPropertySet->getPropertyValue("VScroll") >>= bVScroll; + CPPUNIT_ASSERT_EQUAL(false, bVScroll); + + bool bReadOnly; + xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly; + CPPUNIT_ASSERT_EQUAL(false, bReadOnly); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Text") >>= sText; + CPPUNIT_ASSERT_EQUAL(OUString("Some Text"), sText); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + // These textfields are not multilines in the pptx testfile + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x404040), nColor); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x00C000), nColor); + + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign); + + xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideSelection; + CPPUNIT_ASSERT_EQUAL(false, bHideSelection); + + xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxLength; + CPPUNIT_ASSERT_EQUAL(sal_Int16(50), nMaxLength); + + xPropertySet->getPropertyValue("EchoChar") >>= nEchoChar; + CPPUNIT_ASSERT_EQUAL(sal_Int16('x'), nEchoChar); + + xPropertySet->getPropertyValue("HScroll") >>= bHScroll; + CPPUNIT_ASSERT_EQUAL(true, bHScroll); + + xPropertySet->getPropertyValue("VScroll") >>= bVScroll; + CPPUNIT_ASSERT_EQUAL(false, bVScroll); + + xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly; + CPPUNIT_ASSERT_EQUAL(true, bReadOnly); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + // Transparent background + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign); + + xPropertySet->getPropertyValue("HScroll") >>= bHScroll; + CPPUNIT_ASSERT_EQUAL(false, bHScroll); + + xPropertySet->getPropertyValue("VScroll") >>= bVScroll; + CPPUNIT_ASSERT_EQUAL(true, bVScroll); + + // Fourth shape has both scroll bar + xControlShape.set(getShapeFromPage(3, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("HScroll") >>= bHScroll; + CPPUNIT_ASSERT_EQUAL(true, bHScroll); + + xPropertySet->getPropertyValue("VScroll") >>= bVScroll; + CPPUNIT_ASSERT_EQUAL(true, bVScroll); +} + +void SdActiveXControlsTest::testSpinButtonProperties() +{ + createSdImpressDoc("pptx/activex_spinbutton.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor); + + sal_Int32 nMax; + xPropertySet->getPropertyValue("SpinValueMax") >>= nMax; + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), nMax); + + sal_Int32 nMin; + xPropertySet->getPropertyValue("SpinValueMin") >>= nMin; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nMin); + + sal_Int32 nIncrement; + xPropertySet->getPropertyValue("SpinIncrement") >>= nIncrement; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nIncrement); + + bool bRepeat; + xPropertySet->getPropertyValue("Repeat") >>= bRepeat; + CPPUNIT_ASSERT_EQUAL(true, bRepeat); + + sal_Int32 nDelay; + xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay; + CPPUNIT_ASSERT_EQUAL(sal_Int32(50), nDelay); + + Color nArrowColor; + xPropertySet->getPropertyValue("SymbolColor") >>= nArrowColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nArrowColor); + + sal_Int32 nOrientation; + xPropertySet->getPropertyValue("Orientation") >>= nOrientation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::HORIZONTAL), nOrientation); + + sal_Int32 nSpinValue; + xPropertySet->getPropertyValue("SpinValue") >>= nSpinValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nSpinValue); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFFFF00), nColor); + + xPropertySet->getPropertyValue("SpinValueMax") >>= nMax; + CPPUNIT_ASSERT_EQUAL(sal_Int32(320), nMax); + + xPropertySet->getPropertyValue("SpinValueMin") >>= nMin; + CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nMin); + + xPropertySet->getPropertyValue("SpinIncrement") >>= nIncrement; + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), nIncrement); + + xPropertySet->getPropertyValue("Repeat") >>= bRepeat; + CPPUNIT_ASSERT_EQUAL(true, bRepeat); + + xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay; + CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nDelay); + + xPropertySet->getPropertyValue("SymbolColor") >>= nArrowColor; + CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), nArrowColor); + + xPropertySet->getPropertyValue("Orientation") >>= nOrientation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::VERTICAL), nOrientation); + + xPropertySet->getPropertyValue("SpinValue") >>= nSpinValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nSpinValue); + + // Third control has horizontal orientation + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Orientation") >>= nOrientation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::HORIZONTAL), nOrientation); +} + +void SdActiveXControlsTest::testCommandButtonProperties() +{ + createSdImpressDoc("pptx/activex_commandbutton.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OUString sLabel; + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("CommandButton1"), sLabel); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + bool bMultiLine; + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + bool bFocusOnClick; + xPropertySet->getPropertyValue("FocusOnClick") >>= bFocusOnClick; + CPPUNIT_ASSERT_EQUAL(true, bFocusOnClick); + + bool bRepeat; + xPropertySet->getPropertyValue("Repeat") >>= bRepeat; + CPPUNIT_ASSERT_EQUAL(false, bRepeat); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(true, bMultiLine); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x0000FF), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFFFF80), nColor); + + xPropertySet->getPropertyValue("FocusOnClick") >>= bFocusOnClick; + CPPUNIT_ASSERT_EQUAL(false, bFocusOnClick); + + xPropertySet->getPropertyValue("Repeat") >>= bRepeat; + CPPUNIT_ASSERT_EQUAL(false, bRepeat); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + // Transparent background + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); +} + +void SdActiveXControlsTest::testScrollBarProperties() +{ + createSdImpressDoc("pptx/activex_scrollbar.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor); + + xPropertySet->getPropertyValue("SymbolColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + sal_Int32 nDelay; + xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay; + CPPUNIT_ASSERT_EQUAL(sal_Int32(50), nDelay); + + sal_Int16 nBorderStyle; + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nBorderStyle); + + sal_Int32 nVisibleSize; + xPropertySet->getPropertyValue("VisibleSize") >>= nVisibleSize; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nVisibleSize); + + sal_Int32 nScrollValueMin; + xPropertySet->getPropertyValue("ScrollValueMin") >>= nScrollValueMin; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nScrollValueMin); + + sal_Int32 nScrollValueMax; + xPropertySet->getPropertyValue("ScrollValueMax") >>= nScrollValueMax; + CPPUNIT_ASSERT_EQUAL(sal_Int32(32767), nScrollValueMax); + + sal_Int32 nScrollValue; + xPropertySet->getPropertyValue("DefaultScrollValue") >>= nScrollValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nScrollValue); + + sal_Int32 nLineIncrement; + xPropertySet->getPropertyValue("LineIncrement") >>= nLineIncrement; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nLineIncrement); + + sal_Int32 nBlockIncrement; + xPropertySet->getPropertyValue("BlockIncrement") >>= nBlockIncrement; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nBlockIncrement); + + sal_Int32 nOrientation; + xPropertySet->getPropertyValue("Orientation") >>= nOrientation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::VERTICAL), nOrientation); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x00FFFF), nColor); + + xPropertySet->getPropertyValue("SymbolColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor); + + xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay; + CPPUNIT_ASSERT_EQUAL(sal_Int32(230), nDelay); + + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nBorderStyle); + + xPropertySet->getPropertyValue("VisibleSize") >>= nVisibleSize; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nVisibleSize); + + xPropertySet->getPropertyValue("ScrollValueMin") >>= nScrollValueMin; + CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nScrollValueMin); + + xPropertySet->getPropertyValue("ScrollValueMax") >>= nScrollValueMax; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1234567), nScrollValueMax); + + xPropertySet->getPropertyValue("DefaultScrollValue") >>= nScrollValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(125), nScrollValue); + + xPropertySet->getPropertyValue("LineIncrement") >>= nLineIncrement; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nLineIncrement); + + xPropertySet->getPropertyValue("BlockIncrement") >>= nBlockIncrement; + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), nBlockIncrement); + + xPropertySet->getPropertyValue("Orientation") >>= nOrientation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::VERTICAL), nOrientation); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Orientation") >>= nOrientation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::HORIZONTAL), nOrientation); + + xPropertySet->getPropertyValue("VisibleSize") >>= nVisibleSize; + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nVisibleSize); +} + +void SdActiveXControlsTest::testCheckBoxProperties() +{ + createSdImpressDoc("pptx/activex_checkbox.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OUString sLabel; + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("CheckBox1"), sLabel); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + bool bMultiLine; + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(true, bMultiLine); + + sal_Int16 nVisualEffect; + xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::LOOK3D), nVisualEffect); + + bool bTriState; + xPropertySet->getPropertyValue("TriState") >>= bTriState; + CPPUNIT_ASSERT_EQUAL(false, bTriState); + + sal_Int16 nState; + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF80FF), nColor); + + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::FLAT), nVisualEffect); + + xPropertySet->getPropertyValue("TriState") >>= bTriState; + CPPUNIT_ASSERT_EQUAL(true, bTriState); + + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nState); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("TriState") >>= bTriState; + CPPUNIT_ASSERT_EQUAL(true, bTriState); + + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nState); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign); + + // Transparent background + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor); +} + +void SdActiveXControlsTest::testOptionButtonProperties() +{ + createSdImpressDoc("pptx/activex_optionbutton.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OUString sLabel; + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("OptionButton1"), sLabel); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + bool bMultiLine; + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(true, bMultiLine); + + sal_Int16 nVisualEffect; + xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::LOOK3D), nVisualEffect); + + sal_Int16 nState; + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x00FFFF), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor); + + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::FLAT), nVisualEffect); + + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nState); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); // TriState / undefined imported as unchecked + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign); + + // Transparent background + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor); +} + +void SdActiveXControlsTest::testComboBoxProperties() +{ + createSdImpressDoc("pptx/activex_combobox.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + bool bAutocomplete; + xPropertySet->getPropertyValue("Autocomplete") >>= bAutocomplete; + CPPUNIT_ASSERT_EQUAL(true, bAutocomplete); + + sal_Int16 nBorderStyle; + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nBorderStyle); + + Color nBorderColor; + xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nBorderColor); + + bool bDropdown; + xPropertySet->getPropertyValue("Dropdown") >>= bDropdown; + CPPUNIT_ASSERT_EQUAL(true, bDropdown); + + bool bHideInactiveSelection; + xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideInactiveSelection; + CPPUNIT_ASSERT_EQUAL(true, bHideInactiveSelection); + + sal_Int16 nLineCount; + xPropertySet->getPropertyValue("LineCount") >>= nLineCount; + CPPUNIT_ASSERT_EQUAL(sal_Int16(8), nLineCount); + + sal_Int16 nMaxTextLen; + xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxTextLen; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nMaxTextLen); + + bool bReadOnly; + xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly; + CPPUNIT_ASSERT_EQUAL(false, bReadOnly); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x800000), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + xPropertySet->getPropertyValue("Autocomplete") >>= bAutocomplete; + CPPUNIT_ASSERT_EQUAL(true, bAutocomplete); + + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle); + + xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor; + CPPUNIT_ASSERT_EQUAL(Color(0x404040), nBorderColor); + + xPropertySet->getPropertyValue("Dropdown") >>= bDropdown; + CPPUNIT_ASSERT_EQUAL(true, bDropdown); + + xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideInactiveSelection; + CPPUNIT_ASSERT_EQUAL(false, bHideInactiveSelection); + + xPropertySet->getPropertyValue("LineCount") >>= nLineCount; + CPPUNIT_ASSERT_EQUAL(sal_Int16(12), nLineCount); + + xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxTextLen; + CPPUNIT_ASSERT_EQUAL(sal_Int16(130), nMaxTextLen); + + xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly; + CPPUNIT_ASSERT_EQUAL(false, bReadOnly); // Bogus, should be true (tdf#111417) + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Autocomplete") >>= bAutocomplete; + CPPUNIT_ASSERT_EQUAL(false, bAutocomplete); + + xPropertySet->getPropertyValue("Dropdown") >>= bDropdown; + CPPUNIT_ASSERT_EQUAL(false, bDropdown); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign); + + // Transparent background + CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor); +} + +void SdActiveXControlsTest::testListBoxProperties() +{ + createSdImpressDoc("pptx/activex_listbox.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + sal_Int16 nBorderStyle; + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nBorderStyle); + + Color nBorderColor; + xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nBorderColor); + + bool bDropdown; + xPropertySet->getPropertyValue("Dropdown") >>= bDropdown; + CPPUNIT_ASSERT_EQUAL(false, bDropdown); + + bool bMultiSelection; + xPropertySet->getPropertyValue("MultiSelection") >>= bMultiSelection; + CPPUNIT_ASSERT_EQUAL(false, bMultiSelection); + + sal_Int16 nLineCount; + xPropertySet->getPropertyValue("LineCount") >>= nLineCount; + CPPUNIT_ASSERT_EQUAL(sal_Int16(5), nLineCount); + + bool bReadOnly; + xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly; + CPPUNIT_ASSERT_EQUAL(false, bReadOnly); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFFFF00), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor); + + xPropertySet->getPropertyValue("Border") >>= nBorderStyle; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle); + + xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF00FF), nBorderColor); + + xPropertySet->getPropertyValue("MultiSelection") >>= bMultiSelection; + CPPUNIT_ASSERT_EQUAL(true, bMultiSelection); + + xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly; + CPPUNIT_ASSERT_EQUAL(false, bReadOnly); // Bogus, should be true (tdf#111417) + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("MultiSelection") >>= bMultiSelection; + CPPUNIT_ASSERT_EQUAL(true, bMultiSelection); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign); +} + +void SdActiveXControlsTest::testToggleButtonProperties() +{ + createSdImpressDoc("pptx/activex_togglebutton.pptx"); + + // First control has default properties + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OUString sLabel; + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("ToggleButton1"), sLabel); + + bool bEnabled; + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(true, bEnabled); + + bool bMultiLine; + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(true, bMultiLine); + + Color nColor; + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + bool bToggle; + xPropertySet->getPropertyValue("Toggle") >>= bToggle; + CPPUNIT_ASSERT_EQUAL(true, bToggle); + + sal_Int16 nState; + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); + + sal_Int16 nAlign; + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign); + + // Second control has custom properties + xControlShape.set(getShapeFromPage(1, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("Label") >>= sLabel; + CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel); + + xPropertySet->getPropertyValue("Enabled") >>= bEnabled; + CPPUNIT_ASSERT_EQUAL(false, bEnabled); + + xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); + + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF80FF), nColor); + + xPropertySet->getPropertyValue("TextColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x808080), nColor); + + xPropertySet->getPropertyValue("Toggle") >>= bToggle; + CPPUNIT_ASSERT_EQUAL(true, bToggle); + + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nState); + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign); + + // Third shape has some other custom properties + xControlShape.set(getShapeFromPage(2, 0), uno::UNO_QUERY_THROW); + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + + xPropertySet->getPropertyValue("State") >>= nState; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); // Undefined state + + xPropertySet->getPropertyValue("Align") >>= nAlign; + CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign); + + // Transparent background + xPropertySet->getPropertyValue("BackgroundColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor); +} + +void SdActiveXControlsTest::testPictureProperties() +{ + createSdImpressDoc("pptx/activex_picture.pptx"); + + // Different controls has different image positioning + + // Command buttons here with icons + const std::vector vImagePositions = + { + awt::ImagePosition::AboveCenter, + awt::ImagePosition::LeftTop, + awt::ImagePosition::LeftCenter, + awt::ImagePosition::LeftBottom, + awt::ImagePosition::RightTop, + awt::ImagePosition::RightCenter, + awt::ImagePosition::RightBottom, + awt::ImagePosition::AboveLeft, + awt::ImagePosition::AboveRight, + awt::ImagePosition::BelowLeft, + awt::ImagePosition::BelowCenter, + awt::ImagePosition::BelowRight, + awt::ImagePosition::Centered, + }; + + for (size_t i = 0; i < vImagePositions.size(); ++i) + { + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(i, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + uno::Reference xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + sal_Int16 nColor; + xPropertySet->getPropertyValue("ImagePosition") >>= nColor; + OString sMessage = "The wrong control's index is: " + OString::number(i); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), vImagePositions[i], nColor); + } + + // Picture controls with different properties + for (size_t i = 0; i < 4; ++i) + { + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(vImagePositions.size() + i, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OString sMessage = "The wrong control's index is: " + OString::number(i); + + uno::Reference xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + if (i == 0) // First control has no image specified + CPPUNIT_ASSERT_MESSAGE(sMessage.getStr(), !xGraphic.is()); + else + CPPUNIT_ASSERT_MESSAGE(sMessage.getStr(), xGraphic.is()); + + sal_Int16 nScaleMode; + xPropertySet->getPropertyValue("ScaleMode") >>= nScaleMode; + if (i == 2) // Stretch mode + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::ImageScaleMode::ANISOTROPIC, nScaleMode); + else if (i == 3) // Zoom mode + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::ImageScaleMode::ISOTROPIC, nScaleMode); + else // Clip mode + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::ImageScaleMode::NONE, nScaleMode); + } + + // Note: LO picture control does not support tiled image and also image positioning + // When there is no scaling picture positioned to center. +} + +void SdActiveXControlsTest::testFontProperties() +{ + createSdImpressDoc("pptx/activex_fontproperties.pptx"); + + // Different controls has different font properties + + for (size_t i = 0; i < 8; ++i) + { + uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(i, 0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + + OString sMessage = "The wrong control's index is: " + OString::number(i); + + OUString sFontName; + xPropertySet->getPropertyValue("FontName") >>= sFontName; + if (i == 4 || i == 5) + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), OUString("Times New Roman"), sFontName); + else + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), OUString("Arial"), sFontName); + + float fFontWeight; + xPropertySet->getPropertyValue("FontWeight") >>= fFontWeight; + if (i == 2 || i == 4) + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::FontWeight::BOLD, fFontWeight); + else + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::FontWeight::NORMAL, fFontWeight); + + sal_Int16 nFontSlant; + xPropertySet->getPropertyValue("FontSlant") >>= nFontSlant; + if (i == 3 || i == 4) + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontSlant_ITALIC), nFontSlant); + else + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontSlant_NONE), nFontSlant); + + sal_Int16 nFontUnderline; + xPropertySet->getPropertyValue("FontUnderline") >>= nFontUnderline; + if (i == 7) + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontUnderline::SINGLE), nFontUnderline); + else + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontUnderline::NONE), nFontUnderline); + + sal_Int16 nFontStrikeout; + xPropertySet->getPropertyValue("FontStrikeout") >>= nFontStrikeout; + if (i == 6 || i == 7) + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontStrikeout::SINGLE), nFontStrikeout); + else + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontStrikeout::NONE), nFontStrikeout); + + float fFontHeight; + xPropertySet->getPropertyValue("FontHeight") >>= fFontHeight; + if (i == 1) + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), 24.0f, fFontHeight); + else + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), 14.0f, fFontHeight); + } +} + +CPPUNIT_TEST_SUITE_REGISTRATION(SdActiveXControlsTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/qa/unit/data/AllTransitions.odp b/sd/qa/unit/data/AllTransitions.odp new file mode 100644 index 0000000000..8922a0756d Binary files /dev/null and b/sd/qa/unit/data/AllTransitions.odp differ diff --git a/sd/qa/unit/data/HtmlExportTestDocument.odp b/sd/qa/unit/data/HtmlExportTestDocument.odp new file mode 100644 index 0000000000..3c16614713 Binary files /dev/null and b/sd/qa/unit/data/HtmlExportTestDocument.odp differ diff --git a/sd/qa/unit/data/PdfWithAnnotation.pdf b/sd/qa/unit/data/PdfWithAnnotation.pdf new file mode 100644 index 0000000000..09529ed178 Binary files /dev/null and b/sd/qa/unit/data/PdfWithAnnotation.pdf differ diff --git a/sd/qa/unit/data/README b/sd/qa/unit/data/README new file mode 100644 index 0000000000..2cc9fb3cb5 --- /dev/null +++ b/sd/qa/unit/data/README @@ -0,0 +1,7 @@ +Files with the string 'CVE' in their name are encrypted to avoid +problems with virus checkers on source code download.; use: + +mdecrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to unencrypt +mcrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to create new tests + +to get access to the plain files for manual testing. diff --git a/sd/qa/unit/data/SimplePDF.pdf b/sd/qa/unit/data/SimplePDF.pdf new file mode 100644 index 0000000000..5d6fdb1915 Binary files /dev/null and b/sd/qa/unit/data/SimplePDF.pdf differ diff --git a/sd/qa/unit/data/TextDistancesInsets1.pptx b/sd/qa/unit/data/TextDistancesInsets1.pptx new file mode 100644 index 0000000000..1d1020626c Binary files /dev/null and b/sd/qa/unit/data/TextDistancesInsets1.pptx differ diff --git a/sd/qa/unit/data/TextDistancesInsets2.pptx b/sd/qa/unit/data/TextDistancesInsets2.pptx new file mode 100644 index 0000000000..136d15c9b2 Binary files /dev/null and b/sd/qa/unit/data/TextDistancesInsets2.pptx differ diff --git a/sd/qa/unit/data/TextDistancesInsets3.pptx b/sd/qa/unit/data/TextDistancesInsets3.pptx new file mode 100644 index 0000000000..e977f459c2 Binary files /dev/null and b/sd/qa/unit/data/TextDistancesInsets3.pptx differ diff --git a/sd/qa/unit/data/TextFitting.odp b/sd/qa/unit/data/TextFitting.odp new file mode 100644 index 0000000000..1d4d4fd7ef Binary files /dev/null and b/sd/qa/unit/data/TextFitting.odp differ diff --git a/sd/qa/unit/data/bnc822347_EmptyBullet.odp b/sd/qa/unit/data/bnc822347_EmptyBullet.odp new file mode 100644 index 0000000000..73f7e02960 Binary files /dev/null and b/sd/qa/unit/data/bnc822347_EmptyBullet.odp differ diff --git a/sd/qa/unit/data/cgm/fail/.gitignore b/sd/qa/unit/data/cgm/fail/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm b/sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm new file mode 100644 index 0000000000..07aa3db007 Binary files /dev/null and b/sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm differ diff --git a/sd/qa/unit/data/cgm/fail/ooo6420-1.cgm b/sd/qa/unit/data/cgm/fail/ooo6420-1.cgm new file mode 100644 index 0000000000..5b42b6ff7d --- /dev/null +++ b/sd/qa/unit/data/cgm/fail/ooo6420-1.cgm @@ -0,0 +1,400 @@ +BEGMF 'xfig-fig012228'; +mfversion 1; +mfdesc 'Converted from /tmp/xfig-fig012228 using fig2dev -Lcgm'; +mfelemlist 'DRAWINGPLUS'; +vdctype integer; +fontlist 'Hardware', + 'Times New Roman', 'Times New Roman Bold', 'Times New Roman Italic', + 'Helvetica', 'Courier', + 'Times-Roman', 'Times-Italic', + 'Times-Bold', 'Times-BoldItalic', + 'AvantGarde-Book', 'AvantGarde-BookOblique', + 'AvantGarde-Demi', 'AvantGarde-DemiOblique', + 'Bookman-light', 'Bookman-lightItalic', + 'Bookman-Demi', 'Bookman-DemiItalic', + 'Courier', 'Courier-Oblique', + 'Courier-Bold', 'Courier-BoldOblique', + 'Helvetica', 'Helvetica-Oblique', + 'Helvetica-Bold', 'Helvetica-BoldOblique', + 'Helvetica-Narrow', 'Helvetica-Narrow-Oblique', + 'Helvetica-Narrow-Bold', 'Helvetica-Narrow-BoldOblique', + 'NewCenturySchlbk-Roman', 'NewCenturySchlbk-Italic', + 'NewCenturySchlbk-Bold', 'NewCenturySchlbk-BoldItalic', + 'Palatino-Roman', 'Palatino-Italic', + 'Palatino-Bold', 'Palatino-BoldItalic', + 'Symbol', 'ZapfChancery-MediumItalic', 'ZapfDingbats'; +BEGMFDEFAULTS; + vdcext (0,0) (12974,8467); + clip off; + colrmode indexed; + colrtable 1 + 0 0 0 + 0 0 255 + 0 255 0 + 0 255 255 + 255 0 0 + 255 0 255 + 255 255 0 + 255 255 255 + 0 0 142 + 0 0 175 + 0 0 209 + 135 206 255 + 0 142 0 + 0 175 0 + 0 209 0 + 0 142 142 + 0 175 175 + 0 209 209 + 142 0 0 + 175 0 0 + 209 0 0 + 142 0 142 + 175 0 175 + 209 0 209 + 127 48 0 + 160 63 0 + 191 96 0 + 255 127 127 + 255 160 160 + 255 191 191 + 255 224 224 + 255 214 0; + linewidthmode abs; + edgewidthmode abs; + backcolr 255 255 255; + textprec stroke; + transparency ON; +ENDMFDEFAULTS; +BEGPIC 'xfig-fig012228'; +BEGPICBODY; +% Circle % +intstyle EMPTY; +edgevis ON; +edgetype 1; +edgewidth 30; +edgecolr 1; +circle (7747,5647) 225; +% Polygon % +polygon (2797,6997) (3697,5197) (2797,3397) (2797,6997); +% Polyline % +linetype 1; +linewidth 30; +linecolr 1; +line (3697,5197) (3907,5197); +intstyle SOLID; +fillcolr 1; +polygon (3847,5257)(4087,5197)(3847,5137); +% Polyline % +line (772,4747) (2797,4747); +% Polyline % +line (772,3847) (2797,3847); +% Polyline % +line (997,472) (8422,472); +% Polyline % +line (997,1372) (8422,1372); +% Polyline % +line (6622,2272) (8422,2272); +% Box % +intstyle EMPTY; +rect (5497,4522) (6622,3622); +% Polyline % +line (6622,4072) (6880,4072); +intstyle SOLID; +fillcolr 8; +polygon (6772,4132)(7012,4072)(6772,4012)(6820,4072); +% Polygon % +intstyle EMPTY; +polygon (8422,3622) (9322,1822) (8422,22) (8422,3622); +% Polyline % +line (9322,1822) (9532,1822); +intstyle SOLID; +fillcolr 1; +polygon (9472,1882)(9712,1822)(9472,1762); +% Polyline % +line (9772,3397) (9772,4522) (7747,4522) (7747,5182); +polygon (7687,5122)(7747,5362)(7807,5122); +% Polyline % +line (772,6322) (772,7387); +line (712,7147)(772,7387)(832,7147); +% Polyline % +line (772,5647) (2797,5647); +% Polyline % +line (322,6322) (1672,6322) (1672,5647); +% Polyline % +line (9772,4522) (10222,4522); +% Polyline % +line (10447,4522) (12472,4522) (12472,8122) (322,8122) (322,6322); +% Polyline % +line (9772,3397) (9772,697) (11062,697); +line (10822,757)(11062,697)(10822,637); +% Polyline % +line (9772,2722) (11962,2722); +line (11722,2782)(11962,2722)(11722,2662); +% Polyline % +line (10537,3622) (10537,3847) (12022,3847); +% Polyline % +line (10222,4522) (10222,3397) (11962,3397); +line (11722,3457)(11962,3397)(11722,3337); +% Polyline % +line (10222,4072) (11962,4072); +line (11722,4132)(11962,4072)(11722,4012); +% Polyline % +line (4147,7222) (4147,4072) (5257,4072); +polygon (5197,4132)(5437,4072)(5197,4012); +% Polyline % +line (4147,7222) (8182,7222); +polygon (8122,7282)(8362,7222)(8122,7162); +% Polyline % +line (10837,7672) (8422,7672) (8422,6772) (10837,6772); +line (10597,7732)(10837,7672)(10597,7612); +line (10597,6832)(10837,6772)(10597,6712); +% Polyline % +line (4147,6322) (7747,6322) (7747,6112); +polygon (7807,6172)(7747,5932)(7687,6172); +% Polyline % +line (7972,5647) (8182,5647); +polygon (8122,5707)(8362,5647)(8122,5587); +% Polyline % +line (1672,6547) (1882,6547); +polygon (1822,6607)(2062,6547)(1822,6487); +% Polyline % +line (10987,3847) (10777,3847); +polygon (10837,3787)(10597,3847)(10837,3907); +% Polyline % +line (9772,4522) (9982,4522); +polygon (9922,4582)(10162,4522)(9922,4462); +% Polyline % +line (10942,4522) (10732,4522); +polygon (10792,4462)(10552,4522)(10792,4582); +% Box % +intstyle EMPTY; +rect (5497,2722) (6622,1822); +% Polyline % +line (5047,2272) (5305,2272); +intstyle SOLID; +fillcolr 8; +polygon (5197,2332)(5437,2272)(5197,2212)(5245,2272); +% Polyline % +line (1447,7447) (1447,6547) (2572,6547); +% Polyline % +line (10837,6097) (8422,6097) (8422,5197) (10837,5197); +line (10597,6157)(10837,6097)(10597,6037); +line (10597,5257)(10837,5197)(10597,5137); +% Polyline % +line (2077,6547) (2797,6547); +% Text % +textfontindex 25; +textalign right base 0.0 0.0; +textcolr 1; +charheight 140; +charori (0,1200) (1200,0); +text (862,1282) final 'FMS_IN'; +% Text % +text (862,382) final 'WFB_IN'; +% Text % +textalign left base 0.0 0.0; +text (7162,3982) final 'NET'; +% Text % +text (5767,4207) final 'PCM'; +% Text % +text (5767,3892) final 'capture'; +% Text % +textalign ctr base 0.0 0.0; +text (1222,7582) final 'DECRYPT'; +% Text % +textalign left base 0.0 0.0; +text (12067,3892) final 'CRYPT'; +% Text % +text (10042,2047) final 'SE_OUT'; +% Text % +text (9997,1012) final 'GS_OUT'; +% Text % +textalign right base 0.0 0.0; +text (8197,1642) final 'FMS_IN'; +% Text % +text (8197,742) final 'WFB_IN'; +% Text % +text (4912,2182) final 'NET'; +% Text % +textalign left base 0.0 0.0; +text (5767,2407) final 'PCM'; +% Text % +text (5767,2092) final 'receive'; +% Text % +text (4327,4612) final 'NET_CAPTURE'; +% Text % +text (4372,6592) final 'LSTA_OUT'; +% Text % +text (4372,7492) final 'FMS_OUT'; +% Text % +textalign right base 0.0 0.0; +text (2662,6817) final 'CYUN_IN'; +% Text % +text (2572,5917) final 'SE_IN'; +% Text % +text (2572,5017) final 'PA_IN'; +% Text % +text (2572,4117) final 'GS_IN'; +% Text % +text (8332,2542) final 'NET_RECEIVE'; +% Text % +textalign left base 0.0 0.0; +text (2932,5107) final 'LEFT'; +% Text % +text (8512,1732) final 'RIGHT'; +% Text % +textalign right base 0.0 0.0; +text (682,4657) final 'PA_IN'; +% Text % +text (682,3757) final 'GS_IN'; +% Text % +text (682,5557) final 'SE_IN'; +% Text % +textalign left base 0.0 0.0; +text (10987,7582) final 'FMS_OUT'; +% Text % +text (10987,6682) final 'WFB_OUT'; +% Text % +text (10987,6007) final 'TA_OUT'; +% Text % +text (10987,5107) final 'LS_OUT'; +% Text % +text (12067,2632) final 'PA_OUT'; +% Text % +text (11212,607) final 'GS_OUT'; +% Text % +textalign ctr base 0.0 0.0; +text (11302,3577) final 'OL-SE'; +% Text % +text (9997,5377) final 'OL-LS'; +% Text % +text (9997,6277) final 'OL-TA'; +% Text % +text (6172,8302) final 'LOOP-RS'; +% Text % +text (1222,5827) final 'IL-SE'; +% Text % +text (11347,2902) final 'OL-PA'; +% Text % +textalign left base 0.0 0.0; +text (12067,3307) final 'SE_OUT'; +% Text % +textalign ctr base 0.0 0.0; +text (10312,4612) final 'RS1'; +% Text % +textalign left base 0.0 0.0; +text (8197,4657) final 'TA_BACK'; +% Text % +textalign ctr base 0.0 0.0; +text (9097,5512) final 'LS_ON'; +% Text % +text (9097,6412) final 'TA_ON'; +% Text % +text (10357,2992) final 'PA_ON'; +% Polygon % +colrtable 33 255 255 255; +fillcolr 33; +polygon (2122,6772) (2122,6322) (2572,6547) (2122,6772); +% Polygon % +polygon (2122,5872) (2122,5422) (2572,5647) (2122,5872); +% Polygon % +polygon (2122,4972) (2122,4522) (2572,4747) (2122,4972); +% Polygon % +polygon (2122,4072) (2122,3622) (2572,3847) (2122,4072); +% Polygon % +polygon (4372,4297) (4372,3847) (4822,4072) (4372,4297); +% Polygon % +polygon (9997,922) (9997,472) (10447,697) (9997,922); +% Polygon % +polygon (7747,2497) (7747,2047) (8197,2272) (7747,2497); +% Polygon % +polygon (7747,1597) (7747,1147) (8197,1372) (7747,1597); +% Polygon % +polygon (7747,697) (7747,247) (8197,472) (7747,697); +% Polygon % +polygon (9547,2047) (9997,2047) (9772,2497) (9547,2047); +% Box % +rect (997,5782) (1447,5512); +% Box % +rect (5947,8257) (6397,7987); +% Box % +rect (11122,2857) (11572,2587); +% Box % +rect (11122,3532) (11572,3262); +% Polygon % +polygon (4372,7447) (4372,6997) (4822,7222) (4372,7447); +% Polygon % +polygon (4372,6547) (4372,6097) (4822,6322) (4372,6547); +% Box % +rect (9772,6232) (10222,5962); +% Box % +rect (9772,5332) (10222,5062); +% Polyline % +linewidth 45; +linecolr 8; +line (8332,4522) (8017,4522); +% Polyline % +line (10222,4207) (10222,4522); +% Polyline % +line (10222,2722) (10537,2722); +% Polyline % +line (10852,3397) (10537,3397); +% Polyline % +line (8917,5197) (9232,5197); +% Polyline % +line (8917,6097) (9232,6097); +% Polyline % +linewidth 30; +linecolr 1; +line (8332,4522) (8017,4657); +% Polyline % +line (10222,4207) (10357,4522); +% Polyline % +line (10222,2722) (10537,2857); +% Polyline % +line (10852,3397) (10537,3532); +% Polyline % +line (8917,5197) (9232,5332); +% Polyline % +line (8917,6097) (9232,6232); +% Circle % +edgewidth 15; +circle (8332,4522) 45; +% Circle % +circle (8017,4522) 45; +% Circle % +circle (8017,4747) 45; +% Circle % +circle (10222,4207) 45; +% Circle % +circle (10222,4522) 45; +% Circle % +circle (10447,4522) 45; +% Circle % +circle (10222,2722) 45; +% Circle % +circle (10537,2722) 45; +% Circle % +circle (10537,2947) 45; +% Circle % +circle (10852,3397) 45; +% Circle % +circle (10537,3397) 45; +% Circle % +circle (10537,3622) 45; +% Circle % +circle (8917,5197) 45; +% Circle % +circle (9232,5197) 45; +% Circle % +circle (9232,5422) 45; +% Circle % +circle (8917,6097) 45; +% Circle % +circle (9232,6322) 45; +% Circle % +circle (9232,6097) 45; +% End of Picture % +ENDPIC; +ENDMF; diff --git a/sd/qa/unit/data/cgm/fail/recurse-1.cgm b/sd/qa/unit/data/cgm/fail/recurse-1.cgm new file mode 100644 index 0000000000..4ba3b95de4 Binary files /dev/null and b/sd/qa/unit/data/cgm/fail/recurse-1.cgm differ diff --git a/sd/qa/unit/data/cgm/indeterminate/.gitignore b/sd/qa/unit/data/cgm/indeterminate/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/cgm/pass/.gitignore b/sd/qa/unit/data/cgm/pass/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/cgm/pass/binary_corvette.cgm b/sd/qa/unit/data/cgm/pass/binary_corvette.cgm new file mode 100644 index 0000000000..2b38c48345 Binary files /dev/null and b/sd/qa/unit/data/cgm/pass/binary_corvette.cgm differ diff --git a/sd/qa/unit/data/cgm/pass/circles.cgm b/sd/qa/unit/data/cgm/pass/circles.cgm new file mode 100644 index 0000000000..d31c1b4f30 Binary files /dev/null and b/sd/qa/unit/data/cgm/pass/circles.cgm differ diff --git a/sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm b/sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm new file mode 100644 index 0000000000..08692230b9 Binary files /dev/null and b/sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm differ diff --git a/sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm b/sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm new file mode 100644 index 0000000000..4b2e9cf0d8 Binary files /dev/null and b/sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm differ diff --git a/sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm b/sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm new file mode 100644 index 0000000000..9695f9bbab Binary files /dev/null and b/sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm differ diff --git a/sd/qa/unit/data/dialogs-test.txt b/sd/qa/unit/data/dialogs-test.txt new file mode 100644 index 0000000000..33004038c7 --- /dev/null +++ b/sd/qa/unit/data/dialogs-test.txt @@ -0,0 +1,74 @@ +# -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +# This file contains all dialogs that the unit tests in the module +# will work on if it is in script mode. It will read one-by-one, +# try to open it and create a screenshot that will be saved in +# workdir/screenshots using the pattern of the ui-file name. +# +# Syntax: +# - empty lines are allowed +# - lines starting with '#' are treated as comment +# - all other lines should contain a *.ui filename in the same +# notation as in the dialog constructors (see code) + +# +# The 'known' dialogs which have a hard-coded representation +# in registerKnownDialogsByID/createDialogByID +# + +modules/sdraw/ui/breakdialog.ui +modules/sdraw/ui/copydlg.ui +modules/sdraw/ui/drawchardialog.ui +modules/sdraw/ui/drawpagedialog.ui +modules/sdraw/ui/dlgsnap.ui +modules/sdraw/ui/insertlayer.ui +modules/sdraw/ui/insertslidesdialog.ui +modules/sdraw/ui/crossfadedialog.ui +modules/sdraw/ui/bulletsandnumbering.ui +modules/sdraw/ui/drawparadialog.ui +modules/sdraw/ui/drawprtldialog.ui +modules/sdraw/ui/vectorize.ui + +modules/simpress/ui/customslideshows.ui +modules/simpress/ui/dlgfield.ui +modules/simpress/ui/presentationdialog.ui +modules/simpress/ui/remotedialog.ui +modules/simpress/ui/templatedialog.ui +modules/simpress/ui/slidedesigndialog.ui +modules/simpress/ui/interactiondialog.ui +modules/simpress/ui/photoalbum.ui +modules/simpress/ui/masterlayoutdlg.ui +modules/simpress/ui/headerfooterdialog.ui + +# +# Dialogs without a hard-coded representation. These will +# be visualized using a fallback based on weld::Builder +# + +modules/sdraw/ui/paranumberingtab.ui +modules/sdraw/ui/namedesign.ui + +# currently deactivated, leads to problems and the test to not work +# This is typically a hint that these should be hard-coded in the +# test case since they need some document and model data to work +# +# modules/simpress/ui/assistentdialog.ui + +modules/simpress/ui/headerfootertab.ui +modules/simpress/ui/customanimationproperties.ui +modules/simpress/ui/customanimationeffecttab.ui +modules/simpress/ui/customanimationtimingtab.ui +modules/simpress/ui/customanimationtexttab.ui +modules/simpress/ui/sdviewpage.ui +modules/simpress/ui/prntopts.ui +modules/simpress/ui/optimpressgeneralpage.ui +modules/simpress/ui/interactionpage.ui +modules/simpress/ui/definecustomslideshow.ui +modules/simpress/ui/insertslides.ui diff --git a/sd/qa/unit/data/empty.fodp b/sd/qa/unit/data/empty.fodp new file mode 100644 index 0000000000..3c2a4cf2cd --- /dev/null +++ b/sd/qa/unit/data/empty.fodp @@ -0,0 +1,2 @@ + + diff --git a/sd/qa/unit/data/fdo47434.pptx b/sd/qa/unit/data/fdo47434.pptx new file mode 100644 index 0000000000..1ecb8a9de2 Binary files /dev/null and b/sd/qa/unit/data/fdo47434.pptx differ diff --git a/sd/qa/unit/data/fdo64512.odp b/sd/qa/unit/data/fdo64512.odp new file mode 100644 index 0000000000..ffb9f044be Binary files /dev/null and b/sd/qa/unit/data/fdo64512.odp differ diff --git a/sd/qa/unit/data/fdo64586.ppt b/sd/qa/unit/data/fdo64586.ppt new file mode 100644 index 0000000000..62a4b11a1f Binary files /dev/null and b/sd/qa/unit/data/fdo64586.ppt differ diff --git a/sd/qa/unit/data/fdo71075.odp b/sd/qa/unit/data/fdo71075.odp new file mode 100644 index 0000000000..b418faf39a Binary files /dev/null and b/sd/qa/unit/data/fdo71075.odp differ diff --git a/sd/qa/unit/data/fdo71434.pptx b/sd/qa/unit/data/fdo71434.pptx new file mode 100644 index 0000000000..384f1f31e6 Binary files /dev/null and b/sd/qa/unit/data/fdo71434.pptx differ diff --git a/sd/qa/unit/data/fdo71961.odp b/sd/qa/unit/data/fdo71961.odp new file mode 100644 index 0000000000..323fbe82a8 Binary files /dev/null and b/sd/qa/unit/data/fdo71961.odp differ diff --git a/sd/qa/unit/data/fdo79731.odp b/sd/qa/unit/data/fdo79731.odp new file mode 100644 index 0000000000..d5d094ae01 Binary files /dev/null and b/sd/qa/unit/data/fdo79731.odp differ diff --git a/sd/qa/unit/data/fdo84043.odp b/sd/qa/unit/data/fdo84043.odp new file mode 100644 index 0000000000..eed9e79ef8 Binary files /dev/null and b/sd/qa/unit/data/fdo84043.odp differ diff --git a/sd/qa/unit/data/fdo90607.pptx b/sd/qa/unit/data/fdo90607.pptx new file mode 100644 index 0000000000..0c01aa81ec Binary files /dev/null and b/sd/qa/unit/data/fdo90607.pptx differ diff --git a/sd/qa/unit/data/fit-to-size.fodp b/sd/qa/unit/data/fit-to-size.fodp new file mode 100644 index 0000000000..734cf8a3a6 --- /dev/null +++ b/sd/qa/unit/data/fit-to-size.fodp @@ -0,0 +1,724 @@ + + + 2017-10-18T22:06:17.2032716482017-10-19T22:51:45.845520353PT31M43S4LibreOfficeDev/5.3.8.0.0$Linux_X86_64 LibreOffice_project/a0fae00a2d52960eebbb14f08d2de251e0a8ff3f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number><number> + + + + + + + + + + + + + + + + + + + + + + + + + + <number><number> + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number><number> + + + + + + + + + + + 1 + foo + + + + + 2 + foo + + + + + 3 + foo + + + + + 4 + foo + + + + 5 + Fontwork + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + Fontwork + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/media_embedding.odp b/sd/qa/unit/data/media_embedding.odp new file mode 100644 index 0000000000..8069b3f570 Binary files /dev/null and b/sd/qa/unit/data/media_embedding.odp differ diff --git a/sd/qa/unit/data/n593612.pptx b/sd/qa/unit/data/n593612.pptx new file mode 100644 index 0000000000..2ba3eebab6 Binary files /dev/null and b/sd/qa/unit/data/n593612.pptx differ diff --git a/sd/qa/unit/data/n758621.ppt b/sd/qa/unit/data/n758621.ppt new file mode 100644 index 0000000000..1470efa2b3 Binary files /dev/null and b/sd/qa/unit/data/n758621.ppt differ diff --git a/sd/qa/unit/data/n759180.pptx b/sd/qa/unit/data/n759180.pptx new file mode 100644 index 0000000000..16cbf9adbd Binary files /dev/null and b/sd/qa/unit/data/n759180.pptx differ diff --git a/sd/qa/unit/data/n762695.pptx b/sd/qa/unit/data/n762695.pptx new file mode 100644 index 0000000000..cf547f382e Binary files /dev/null and b/sd/qa/unit/data/n762695.pptx differ diff --git a/sd/qa/unit/data/n819614.pptx b/sd/qa/unit/data/n819614.pptx new file mode 100644 index 0000000000..67e8ca2d91 Binary files /dev/null and b/sd/qa/unit/data/n819614.pptx differ diff --git a/sd/qa/unit/data/n820786.pptx b/sd/qa/unit/data/n820786.pptx new file mode 100644 index 0000000000..d778b74927 Binary files /dev/null and b/sd/qa/unit/data/n820786.pptx differ diff --git a/sd/qa/unit/data/n828390_4.odp b/sd/qa/unit/data/n828390_4.odp new file mode 100644 index 0000000000..888611cc07 Binary files /dev/null and b/sd/qa/unit/data/n828390_4.odp differ diff --git a/sd/qa/unit/data/n828390_5.odp b/sd/qa/unit/data/n828390_5.odp new file mode 100644 index 0000000000..29cb8afc0d Binary files /dev/null and b/sd/qa/unit/data/n828390_5.odp differ diff --git a/sd/qa/unit/data/n902652.pptx b/sd/qa/unit/data/n902652.pptx new file mode 100644 index 0000000000..87266001bd Binary files /dev/null and b/sd/qa/unit/data/n902652.pptx differ diff --git a/sd/qa/unit/data/objectwithtext.fodg b/sd/qa/unit/data/objectwithtext.fodg new file mode 100644 index 0000000000..f58a377f2a --- /dev/null +++ b/sd/qa/unit/data/objectwithtext.fodg @@ -0,0 +1,189 @@ + + + 2017-11-06T19:36:05.7708592582017-11-06T19:38:11.864425937PT2M6S1LibreOfficeDev/6.0.0.0.alpha1$Linux_X86_64 LibreOffice_project/2f8c1379a07d581ac46337ca0f91609c544c3d6e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foobar + + + + 1 + + + 1 + + 1+1 + + + + VkNMTVRGAQAxAAAAAAAAAAEAGwAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAZYDAADX + AQAAHQAAAJYAAQACAAAACQCLAAEAAgAAAP//gQABABAAAAAAAAAAAAAAAJUDAADWAQAAlQAB + AAQAAAAAAAAAlgABAAIAAAAJAIsAAQACAAAAHwCKAAEAQgAAAAMAPAAAABAATGliZXJhdGlv + biBTZXJpZgAAAAAAAKYBAAAAAAAAAAAFAAAAAAAAAP8DAAAAAAAAAAEA/wMAAAAAAIgAAQAC + AAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAAcgACABcAAABqAAAAcgEAAAEAMdQAAAAA + AAEAAQAxAIwAAQAAAAAAiwABAAIAAAAfAIoAAQA8AAAAAwA2AAAACgBPcGVuU3ltYm9sAAAA + AAAApgEAAP//AAAAAAUAAAAAAAAA/wMAAAAAAAAAAQD/AwAAAAAAiAABAAIAAAABAIcAAQAF + AAAA/////wCGAAEABAAAAAAAAAByAAIAGgAAAFgBAAByAQAAAQAAACsA9gAAAAAAAQABACsA + jAABAAAAAACLAAEAAgAAAB8AigABAEIAAAADADwAAAAQAExpYmVyYXRpb24gU2VyaWYAAAAA + AACmAQAAAAAAAAAABQAAAAAAAAD/AwAAAAAAAAABAP8DAAAAAACIAAEAAgAAAAEAhwABAAUA + AAD/////AIYAAQAEAAAAAAAAAHIAAgAXAAAAYQIAAHIBAAABADHUAAAAAAABAAEAMQCMAAEA + AAAAAJUAAQAEAAAAAAAAAJYAAQACAAAACQCMAAEAAAAAAA== + + + + + + + diff --git a/sd/qa/unit/data/odg/FitToFrameText.odg b/sd/qa/unit/data/odg/FitToFrameText.odg new file mode 100644 index 0000000000..e65b0a3a21 Binary files /dev/null and b/sd/qa/unit/data/odg/FitToFrameText.odg differ diff --git a/sd/qa/unit/data/odg/diagonalLine.fodg b/sd/qa/unit/data/odg/diagonalLine.fodg new file mode 100644 index 0000000000..f6f8edec46 --- /dev/null +++ b/sd/qa/unit/data/odg/diagonalLine.fodg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/data/odg/fail/.gitignore b/sd/qa/unit/data/odg/fail/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/odg/glow.odg b/sd/qa/unit/data/odg/glow.odg new file mode 100644 index 0000000000..9020f663b9 Binary files /dev/null and b/sd/qa/unit/data/odg/glow.odg differ diff --git a/sd/qa/unit/data/odg/gradient-angle.fodg b/sd/qa/unit/data/odg/gradient-angle.fodg new file mode 100644 index 0000000000..6ad3b1ddf0 --- /dev/null +++ b/sd/qa/unit/data/odg/gradient-angle.fodg @@ -0,0 +1,211 @@ + + + + ms 2015-10-09T14:51:21.0864478012015-10-09T14:54:47.829092906ms PT3M27S1LibreOfficeDev/5.1.0.0.alpha1$Linux_X86_64 LibreOffice_project/83c5214889c712646e45dc1c19b6d3c13a05aa83 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/odg/indeterminate/.gitignore b/sd/qa/unit/data/odg/indeterminate/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/odg/ooo124143-1.odg b/sd/qa/unit/data/odg/ooo124143-1.odg new file mode 100644 index 0000000000..8e341cbc72 Binary files /dev/null and b/sd/qa/unit/data/odg/ooo124143-1.odg differ diff --git a/sd/qa/unit/data/odg/pass/.gitignore b/sd/qa/unit/data/odg/pass/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg b/sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg new file mode 100644 index 0000000000..321bd9cdbd Binary files /dev/null and b/sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg differ diff --git a/sd/qa/unit/data/odg/rhbz1870501.odg b/sd/qa/unit/data/odg/rhbz1870501.odg new file mode 100644 index 0000000000..cc4bcef193 Binary files /dev/null and b/sd/qa/unit/data/odg/rhbz1870501.odg differ diff --git a/sd/qa/unit/data/odg/softedges.odg b/sd/qa/unit/data/odg/softedges.odg new file mode 100644 index 0000000000..a1fcab90e9 Binary files /dev/null and b/sd/qa/unit/data/odg/softedges.odg differ diff --git a/sd/qa/unit/data/odg/tablestyles.fodg b/sd/qa/unit/data/odg/tablestyles.fodg new file mode 100644 index 0000000000..3672ad8e4a --- /dev/null +++ b/sd/qa/unit/data/odg/tablestyles.fodg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/odg/tb-rl-textbox.odg b/sd/qa/unit/data/odg/tb-rl-textbox.odg new file mode 100644 index 0000000000..95dda6208d Binary files /dev/null and b/sd/qa/unit/data/odg/tb-rl-textbox.odg differ diff --git a/sd/qa/unit/data/odg/tdf114488.fodg b/sd/qa/unit/data/odg/tdf114488.fodg new file mode 100644 index 0000000000..41a3c497d3 --- /dev/null +++ b/sd/qa/unit/data/odg/tdf114488.fodg @@ -0,0 +1,365 @@ + + + + 2016-12-14T10:36:44.079000000PT2M21S1LibreOfficeDev/6.1.0.0.alpha0$Linux_X86_64 LibreOffice_project/d36007ffd98bc9ed2f8ca6151a5283bd46a92485 + + + -817 + -127 + 10457 + 6649 + + + view1 + false + false + true + true + false + false + false + false + true + 1500 + false + //////////////////////////////////////////8= + //////////////////////////////////////////8= + + false + true + true + 0 + 0 + true + true + true + 4 + 0 + -940 + 787 + 8624 + 6889 + 1270 + 1270 + 127 + 127 + 127 + 1 + 127 + 1 + false + 1500 + false + false + + + + + true + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sob + 0 + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soc + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sod + 1270 + false + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sog + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soh + false + false + true + true + false + false + true + false + false + false + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soe + false + 7 + 4 + false + 0 + low-resolution + + false + + false + 1 + 1 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 183GmgAAAAAAAKAQwAIBCQAAAABwTAEACQAAAz0CAAACABwAAAAAAAUAAAAJAgAAAAAFAAAA + AgEBAAAABQAAAAEC////AAUAAAAuARgAAAAFAAAACwIAAAAABQAAAAwCwAKgEBIAAAAmBg8A + GgD/////AAAQAAAAwP///8D///9gEAAAgAIAAAsAAAAmBg8ADABNYXRoVHlwZQAAgAAcAAAA + +wKA/gAAAAAAAJABAQAAAAQCABBUaW1lcyBOZXcgUm9tYW4AdPEtAIlAg30gAIZ9IAdmwAQA + AAAtAQAACAAAADIKwAHCDwEAAAByeQgAAAAyCsABUA4BAAAAZHkIAAAAMgrAARgNAQAAAHJ5 + CAAAADIKwAFDCgEAAABoeQgAAAAyCsABKQkBAAAAcnkIAAAAMgrAAdwDAQAAAGp5CAAAADIK + wAHwAQEAAABoeQgAAAAyCsABmgABAAAAaXkcAAAA+wIg/wAAAAAAAJABAQAAAAQCABBUaW1l + cyBOZXcgUm9tYW4AdPEtAIlAg30gAIZ9IAdmwAQAAAAtAQEABAAAAPABAAAIAAAAMgogAvsL + AQAAAGp5CAAAADIKIALnBwEAAABpeRwAAAD7AiD/AAAAAAAAkAEAAAAABAIAEFRpbWVzIE5l + dyBSb21hbgB08S0AiUCDfSAAhn0gB2bABAAAAC0BAAAEAAAA8AEBAAgAAAAyChQBRA8BAAAA + M3kIAAAAMgoUAQwIAQAAACp5HAAAAPsCgP4AAAAAAACQAQAAAAAEAgAQVGltZXMgTmV3IFJv + bWFuAHTxLQCJQIN9IACGfSAHZsAEAAAALQEBAAQAAADwAQAACAAAADIKwAHGDQEAAAApeQgA + AAAyCsABjgwBAAAAKHkIAAAAMgpOAYMKAQAAAIh5CAAAADIKwAHXCQEAAAApeQgAAAAyCsAB + nwgBAAAAKHkIAAAAMgrAAVoEAQAAAF15CAAAADIKwAH4AgEAAAB8eQgAAAAyCk4BMAIBAAAA + iHkIAAAAMgrAAVQBAQAAAHx5CAAAADIKwAEcAAEAAABbeRwAAAD7AoD+AAAAAAAAkAEBAAAC + BAIAEFN5bWJvbAAABQcK/CAAhn108S0AiUCDfSAAhn0gB2bABAAAAC0BAAAEAAAA8AEBAAgA + AAAyCsABAwsBAAAAZnkIAAAAMgrAAR8HAQAAAGZ5HAAAAPsCwP0AAAAAAACQAQAAAAIAAgAQ + U3ltYm9sAACsAgoAIACGfXTxLQCJQIN9IACGfSAHZsAEAAAALQEBAAQAAADwAQAACAAAADIK + SgJeBgEAAADyeRwAAAD7AoD+AAAAAAAAkAEAAAACAAIAEFN5bWJvbAAABQcK/SAAhn108S0A + iUCDfSAAhn0gB2bABAAAAC0BAAAEAAAA8AEBAAgAAAAyCsABJgUBAAAAPXkKAAAAJgYPAAoA + /////wEAAAAAABwAAAD7AhAABwAAAAAAvAIAAAAAAQICIlN5c3RlbQDAIAdmwAAACgAhAIoB + AAAAAAEAAACQ8y0ABAAAAC0BAQAEAAAA8AEAAAMAAAAAAA== + + + + + iVBORw0KGgoAAAANSUhEUgAAALEAAAAdCAYAAADl941QAAAACXBIWXMAAA69AAAOlAEDvQ9G + AAAPp0lEQVR4nO2bd1wU59bHn2e20pcuRTq7gCwWCGJU7CZ4NTaaBYMgalCB1ysWYsGCKEJU + MBoboqAgdjHBHjs2sAC7sAurgCgqgtJ2ly1zFxEEwmyhaPKG7z98mHnmnN8czsycc2bAoygK + eujhnwz+awvooYfO0u1JzM1JpcWeYHqKaZOKgrz7HlEBQNjdPv9t/Ntj3K1JjFZc0g71DIy/ + bjawHsYdsSrSuC3a5aZzBEp2dafffxM9Me7OJEbf4E6H7wrGrb594J43LQGyUk3DloevOdE/ + LtO9F8zrNr//Jnpi/JHuS2KoJ5oce3L15KbfqZ6FW096zuo2f18AtDJDMzZ4RcSeW0VjlVxC + H+3dFxjYXxm8bW8tl/3QlEUsVDl2yHCi338o51T60Qv0EcDtUkH/r2KMwsoTq0av4JgPcuI/ + qM/qFVy7fY7trwQAxLKObExiEZO0cWC/szH1Y0wmDKP/aeM6/U6QBz1FWVptJWIRo0atPWhx + 4fAydxIobiuoKjPBPjhg0W/JWlsA59JPow0hxh9Qqh1sarOP2cQduTEzL+cG/dwl0rAljzMm + LLfB3ZT3eIURlxISAxZHsuYcvrUBDBK6H14dGOcz50y8GzHpr4tRKKjNVtu/4uDPuW9Vej0T + LlDb6EDfCJA2q6pz1FJSSqa4+rsdM0JAHYZj+CJ9v+ttE+86zz5qDxvLBAXi2wV0XGe71uDb + 23udtkRsWrH1nuvgU6UJjuPJ4IXkikSJ1lOeLZ404B5VoAN8Rx9NyvUNT+qHB5Wy9LW4E+PR + Pv47jsYHm61FmgVw4bXFjqu978/+/vL1UDd7HHgv32lDVH3AD4xhBgs5l8xoUAcCvnzHSUMI + n24e9tOYg4MCU7OiRw+je+Qtj/RYKS7ZYTLK9tCNztuX4f3pHlrMHfvhUYcN1qs/pGvTh/S9 + 5e5EyGi15slmu+UPZ7pG+RvuRoW6wG3V3F91/9AdNLoP4SkKW9sTPEs1XTDv5DaHqL3bDKXe + oRHUaLDTozdz3bcEeuyhx001TcADKO5ofD9rNNqNyFE3d05ne3dRiOoO9n/oO3jP1V8r7Eyp + BFDVtEfFYUABVfITff9Bj6djWKODyHdeMsoJPNChDuA41ps90YCgXh6DzQjZJAYbtbAeR03H + d0mTgQCKWb8SJ0frLB084HXeniKIIDv9D9d80mCiMqIkGLTy8vbHK8H21mu48FZy0Tj7EMPz + iOQPpeE0PsdNXIdzMcNla2qQPrRaWn1TI2zy6ni46W78gn5qN2Q1YVC9f9XC30JWzHWZlLZS + /2b5piGqZzsW35Ya5TimK3S2iwAU5j+zVqLZFpvgQO3n7ZK79L3kfgePXvMy9gy72kVJTEDt + 5ycl/g5AojzGWoLWsFTySilGNJoeW66AyQRBTbx+TfvdC6R13pai1MGnWXn9hAJnggBtWxQ0 + gr4/r5XydpD5On1Y0LwRURZpaoDWCSx5ouTGLfb5jeynkTmGkibvFAFSxlYumb028ZvFO8Jn + ZSy/blvDIioa33Y1YtI1Ou1wbc8ffCzNWIU8c8uJtNyWNS+/jkfWGjj98RLnsU/jJ0/ftWfw + +cdBpshDWT6xk1j8Cv9nXKh/SNjxDfpbi6IvzNWPUmRsI2IzjFioNXmE2o3qSI9lCXEXWBMJ + QzZkpp0O9nQgggp57XwELcfd3r3SZ+mqA+uq5t8982h9/+D2H1XtCeHj6ngCshgFEGsJhASU + rEKqw2Gdn+gl4Xkx3xjl1pF4oGUS18OSS7GuMWfLp+CenzPK1h0tChx7+fi42L3r/WyJ99q1 + JXxETkrM8bL03n/TAgdqmrdzM1V2+s7etuKMtseGzC2TSDGLpqw7UTXN5/KTWZHf4NMBwKGW + bt/fNA8/FH748RKXtSLGa/ni2wGNWDplamygtc4IR/yFhjvshydJdhGRJ0KfE5SJ/KJHhney + yI7jlpuc+BxzIWQfjRqfjqNSjETPRY+MPWrnGSCF8vjETmLEQDh8xsjTRmE3V1jRtNiKzh1r + WEzTEqRC6Xx8hueiTTdiCpdGbHd23X/+BHNBf4e++CuK2AJQRzTYb8rxPuGHF5fbWubJncAS + 6m+EOtMnxqe9FgMypnlVz/dHiuJdJpAaGox2EJfjXr8V66C8OmKduClmtUjWL+4BftfHj09M + 9Jt30as4cmF01EbLzQ5Txkf8vsIzabK7ajuNsbg0Q+8OB7G2srE40uo8lBxr/X2/SQpPz510 + MXL7Ty7eu07Fqu8r51rhC5uW4C1sX1JxHO6djFfOVRRmtuz4dkwjpk45NLbVKXbsfbH2zhqn + sdPvJnidObUgqq/KNRFzI22g05krdjRCiycCHrWfveaY/affps9u2u4IZMal3T/aJ4RshnHD + 1f6DdWuRshHCAgbbRtRrePmSzSvXjKHAImE13h4iGiJNdaRaMVuNiMvytVlVxpqDrJU5ihxH + HBGbUVgVq9MRn82gXMjloSRUzEW4PMnFQEZhZfriYV479ENi7gdOsGGv1gnUnoJP00KeFSmR + eHXl7zTrUIBXhX9NEFExR78YVSfbahHbdN1iWJqXb1VFUANjwvbFBtmRbotHR5OEZEkB2Xwy + OvW6GuIPmRyOOYvMFkiPb8c1YuuUQ2MrnUXmovo3ylHzt21GFjw4E9xX5XrDbj4zx7SQTEPs + THBFsoMv26eUJEZhVX6e2SttGx5NF5bJdtaSWshiFlM1RkzMHEaBJQ1beOy83kUqVDHNEClV + zFYjwgKmUQFiTfCzwimUxF2DANYLAAGg9QhfgBIkLT5p+4rknw2CHqWO1+Fxrq1NX2PhHnqF + glaITj183t/IgZ6nhdEIozVVStUoGU8mwzbNqRCwJRc+Yfi2LF870v2GLQiZzCe2XALJKJmM + 8muqytVZz4ppUuPbCY3YOuXQ2EpnjRrvVnL/hAIn+vJp1v9tLB1EsDCHacu38i5rOZnARrZP + KUksAgUMFg21Hid5NADF7p7CQiKDJbaydrW+3tg5CyFHYkto5dMg/K+FvkxQWM5imVUY9K+m + qsJ3imnh4qtq+SrSa2IiqqyhXI09WEcB2nS85KfgfpJ9UuG3dsu8LBYjH05TDlzr6+odqf6j + mBNvmnDLfOi0CMc5mCUPhCiU7BKL2zSI4pd4Zn61tYkrja3cEPx2aTwOomU4JktsKYnvNaz4 + dkojlk65NLbQCVH0RVZWn3Idp9o++sjLxn1cyMwptCPTbItNW00msEzJ9omdxGg1kp9XStO0 + oT3TRRQcaXFZysxiVWOajRGrsXPmIyzGMxslmk2RcYfeWglBAZNNg9bTS63wil1QgtsrHV08 + Dp58IwYkrDVQZeqHg6zdruNIQI6nhBi8efzI5pXF0HfOuqCkLPHAqAffLnyxW7n89bkNsZGl + HjsyghzwtzB9UbRqKJAnkJQnrWt0IZvEZCEW1HmWlzGTC+VJyhlI0lCrrMsvVu2LHV8x7IxG + TJ3yaGypU5Pynl/HU0JRFDY3VIJ80pNcoY2VDy1Dnrdx8vjETmJRgeRuilpSx1IvKDrnFRYy + DFkiK2Vf6qfCXcQhMPIFVtYzqPcUacqaQSsRVn65tb4dlaMB29RfMiAMi7nHeBNjpLBPTCBQ + UlOtIYiEUCTiEJMT8rxHr3FKfb53jueqF/PoySdHzmJELApgz9h+e7Y58qjt0Xhz6isLXFVd + WVmtHgqIsKlhFpcxtfOqemt+S1XB7j9qXym9eo/TNNeorGSLrJSw4ytL4zgfreYXJEKYuSVo + zr3xcTmBtrjmlzft6ZRLYwudFlRLtoVOH4Za2e/a8amL3PsMLT93Knr5woMs8oARdiYJmNOg + FsjjEzuJa/JV8kpEvcuu7XNJdA5xneWsKXPY3QSPxTQpUqGJbY2RksYN+UoMjtC88v5x3sVn + S23dzHEMeew0IywgMQuAufVU61Nd8+KkM0CgNTns6s/HlmStD8qNZjzW+HbQlfUl8bpBpefT + h080wIM6sDJuxxCso3WGVoygg6f7c/LthMAFEj6dj5DFMGYjVOIcK+wmWpCf0zsP0EkzKUVl + 0TLiK1NjM3jUMXTnXkc5dMqjsaVOvyHad9Utw+9vnTF1f0jAwE13h86fumnhsF26u5/Ozk5N + Hpft5neaTpD+Wlken9hJTJlZfrp2pqk0B1ioeh77o8oTfL77qbi/T6lyt+yIrQbQarZqfplu + L5sOjPq6BdWBVaFnr/yYEdo3LGB+Qs2eiIH/JX56wohepRj+OCNnZ8jFDX5O+Hbm4Thq/cz5 + ow5E/5K26slGF00nAvhY4xNH/3b7ZQ3Qx3YqgE/T0kdVjAzJ9gv2/2X1/4ENzbvai68UjS0R + v07Tn+d+Ya/3lR1zRxHB5wa+HZ2yNbbWOZOKywSIFX9mwpPgmQkguGnFVP6GY9JtfEYeny2S + WAhz9y/08i900G34AGiRu/1RqR8AfUGEzCcmTPwAwjQ6PrdpW8MHQDuSb87Iy77ukC0kUb7r + VgWIpM9puHjwKIHwqZzh3lRNOqnyH68zTmEtkwMh8kQCA/sKKmbtjqDGPjFn16b+MHHdoYDZ + p/zNYuR5rIqKEnuvO27oEX5mVrAx5kc4bcDQ2EqNupgr0rOvtP1Lw/0FdXaSxiTG2fLDHvK/ + C/sSHuVGBHP37Z/6bpbvTdXzV4dz3VZmfk+BzXNFFbpH3jK6x6ovowWPEhuSF5JQEhF+HEtV + X05yPmc4XXzVDtfqtaiQmWvCt/V5KfW/Kwg0XmDKoQXcgAXRIZQ43+ipFodIUrp9PueEWWjQ + +c2uh47+vMCGcFde1VgaWyIqzDWqNB/6Tre9j4i+kM7O8jf+HzsheM06TFs/5ViAQDhWvDd+ + Soh2l3wN1wE+zj0hH1HVrKMQGjWoTThwpWgCaPPmEYXluUzLWgiQahQQKFLmsJAy8P2SlISf + 7l/mDPmAWhD0IOZYDX54q6rhk5C85BsdXIkistvX2Boug2lGsAsoxuo1voTOztLxJJbUTEuv + HZ7WaQWYdkjoyKjrESMBiOi0j84iSWIlMuQhygaVelLHjRA1mHcu5RIAKXLZxekKnL/T/VP6 + IgTVG/jdEz0F5MqPEObn8qh9JmnmSO01vrpO6fyN78R/IyBZrESC9SRz2xJLBefUf1uEj8mH + t16cy6ifoD3bAY/9IdA/gJ4kxgSFvIq3GjxVPT4Fh4pRSV1MH/TNA6wPZv5x4PvxZoT2i/3a + MrqCniTGQJSzycbVeeV1zqTUuwX7VX1fvHdU85hkcU6eDr2HL0tPEmMgfvdK/XU9UIbcYqUr + v1zzZ7uvfxBthd3l9/D16EliDAhDlmXtixQvTXzKdMnUXVqXvGzwMnUFX3n38GXoSWIscEaC + MaE7do4BYOfXltKDdP4HEfnvnktJxIAAAAAASUVORK5CYII= + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/data/odg/tdf126319.odg b/sd/qa/unit/data/odg/tdf126319.odg new file mode 100644 index 0000000000..71bfde5470 Binary files /dev/null and b/sd/qa/unit/data/odg/tdf126319.odg differ diff --git a/sd/qa/unit/data/odg/tdf147119.odg b/sd/qa/unit/data/odg/tdf147119.odg new file mode 100644 index 0000000000..aafc9d600e Binary files /dev/null and b/sd/qa/unit/data/odg/tdf147119.odg differ diff --git a/sd/qa/unit/data/odg/two_columns.odg b/sd/qa/unit/data/odg/two_columns.odg new file mode 100644 index 0000000000..bd721f0c0d Binary files /dev/null and b/sd/qa/unit/data/odg/two_columns.odg differ diff --git a/sd/qa/unit/data/odp/BulletsAsImage.odp b/sd/qa/unit/data/odp/BulletsAsImage.odp new file mode 100644 index 0000000000..7094d34af9 Binary files /dev/null and b/sd/qa/unit/data/odp/BulletsAsImage.odp differ diff --git a/sd/qa/unit/data/odp/LineStylesOwn.odp b/sd/qa/unit/data/odp/LineStylesOwn.odp new file mode 100644 index 0000000000..8a145bb9ff Binary files /dev/null and b/sd/qa/unit/data/odp/LineStylesOwn.odp differ diff --git a/sd/qa/unit/data/odp/SvgImageTest.odp b/sd/qa/unit/data/odp/SvgImageTest.odp new file mode 100644 index 0000000000..38b92df808 Binary files /dev/null and b/sd/qa/unit/data/odp/SvgImageTest.odp differ diff --git a/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp b/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp new file mode 100644 index 0000000000..1a06f235e1 Binary files /dev/null and b/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp differ diff --git a/sd/qa/unit/data/odp/Tdf112594.fodp b/sd/qa/unit/data/odp/Tdf112594.fodp new file mode 100644 index 0000000000..ff3e5fc4b6 --- /dev/null +++ b/sd/qa/unit/data/odp/Tdf112594.fodp @@ -0,0 +1,853 @@ + + + + 2023-07-27T19:39:11.0788416942023-07-27T20:46:02.644285805PT8M12S4LibreOfficeDev/24.2.0.0.alpha0$MacOSX_X86_64 LibreOffice_project/cf8f7b91f41821b79495c0388359c4cb1156ea67 + + + -1087 + -415 + 28914 + 17945 + + + view1 + false + false + true + true + true + true + false + false + true + 1500 + false + Hw== + Hw== + + false + true + false + 0 + 0 + false + true + true + 4 + 0 + -1116 + -419 + 29040 + 18098 + 2540 + 2540 + 635 + 635 + 2540 + 4 + 2540 + 4 + false + 1500 + true + false + false + false + false + + + + + 6 + false + false + true + $(inst)/Resources/palette%3B$(user)/config/standard.soh + true + false + $(inst)/Resources/palette%3B$(user)/config/standard.sod + false + true + true + false + false + false + low-resolution + false + 0 + false + 1 + false + 4 + 1270 + HP LaserJet P1005 + $(inst)/Resources/palette%3B$(user)/config/standard.soc + $(inst)/Resources/palette%3B$(user)/config/standard.sob + LwH+/0hQIExhc2VySmV0IFAxMDA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASFAgTGFzZXJKZXQgUDEwMDUsIDEuNi4xAAAAAAAAAAAWAAQABAAAAAAAAAAEAAhSAAAEdAAAAAAAABIAQ09NUEFUX0RVUExFWF9NT0RFEwBEdXBsZXhNb2RlOjpVbmtub3duDABQUklOVEVSX05BTUURAEhQIExhc2VySmV0IFAxMDA1CwBEUklWRVJfTkFNRRgASFAgTGFzZXJKZXQgUDEwMDUsIDEuNi4x + $(inst)/Resources/palette%3B$(user)/config/standard.sog + true + $(inst)/Resources/palette%3B$(user)/config/standard.soe + true + true + true + false + true + true + true + false + false + 0 + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + 11 ᠤ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/data/odp/Tdf62176.odp b/sd/qa/unit/data/odp/Tdf62176.odp new file mode 100644 index 0000000000..1139dd0484 Binary files /dev/null and b/sd/qa/unit/data/odp/Tdf62176.odp differ diff --git a/sd/qa/unit/data/odp/author_field.odp b/sd/qa/unit/data/odp/author_field.odp new file mode 100644 index 0000000000..ace132df4d Binary files /dev/null and b/sd/qa/unit/data/odp/author_field.odp differ diff --git a/sd/qa/unit/data/odp/author_fixed.odp b/sd/qa/unit/data/odp/author_fixed.odp new file mode 100644 index 0000000000..2e666ad17f Binary files /dev/null and b/sd/qa/unit/data/odp/author_fixed.odp differ diff --git a/sd/qa/unit/data/odp/autofitted-textbox-indent.odp b/sd/qa/unit/data/odp/autofitted-textbox-indent.odp new file mode 100644 index 0000000000..298c19903d Binary files /dev/null and b/sd/qa/unit/data/odp/autofitted-textbox-indent.odp differ diff --git a/sd/qa/unit/data/odp/background.odp b/sd/qa/unit/data/odp/background.odp new file mode 100644 index 0000000000..f96785dd2f Binary files /dev/null and b/sd/qa/unit/data/odp/background.odp differ diff --git a/sd/qa/unit/data/odp/bnc822341.odp b/sd/qa/unit/data/odp/bnc822341.odp new file mode 100644 index 0000000000..28fe2f4f4b Binary files /dev/null and b/sd/qa/unit/data/odp/bnc822341.odp differ diff --git a/sd/qa/unit/data/odp/bulletCharAndFont.odp b/sd/qa/unit/data/odp/bulletCharAndFont.odp new file mode 100644 index 0000000000..51277b2722 Binary files /dev/null and b/sd/qa/unit/data/odp/bulletCharAndFont.odp differ diff --git a/sd/qa/unit/data/odp/cellspan.odp b/sd/qa/unit/data/odp/cellspan.odp new file mode 100644 index 0000000000..775e1e4003 Binary files /dev/null and b/sd/qa/unit/data/odp/cellspan.odp differ diff --git a/sd/qa/unit/data/odp/closed-shapes.odp b/sd/qa/unit/data/odp/closed-shapes.odp new file mode 100644 index 0000000000..d422c74a02 Binary files /dev/null and b/sd/qa/unit/data/odp/closed-shapes.odp differ diff --git a/sd/qa/unit/data/odp/document_with_linked_graphic.odp b/sd/qa/unit/data/odp/document_with_linked_graphic.odp new file mode 100644 index 0000000000..b0c327d442 Binary files /dev/null and b/sd/qa/unit/data/odp/document_with_linked_graphic.odp differ diff --git a/sd/qa/unit/data/odp/document_with_two_images.odp b/sd/qa/unit/data/odp/document_with_two_images.odp new file mode 100644 index 0000000000..33fb9bb563 Binary files /dev/null and b/sd/qa/unit/data/odp/document_with_two_images.odp differ diff --git a/sd/qa/unit/data/odp/embedded-pdf.odp b/sd/qa/unit/data/odp/embedded-pdf.odp new file mode 100644 index 0000000000..d67584d19d Binary files /dev/null and b/sd/qa/unit/data/odp/embedded-pdf.odp differ diff --git a/sd/qa/unit/data/odp/extfile_field.odp b/sd/qa/unit/data/odp/extfile_field.odp new file mode 100644 index 0000000000..e5425beade Binary files /dev/null and b/sd/qa/unit/data/odp/extfile_field.odp differ diff --git a/sd/qa/unit/data/odp/fail/.gitignore b/sd/qa/unit/data/odp/fail/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/odp/fdo77027.odp b/sd/qa/unit/data/odp/fdo77027.odp new file mode 100644 index 0000000000..4d834d4683 Binary files /dev/null and b/sd/qa/unit/data/odp/fdo77027.odp differ diff --git a/sd/qa/unit/data/odp/fillbitmap2.odp b/sd/qa/unit/data/odp/fillbitmap2.odp new file mode 100644 index 0000000000..2bf258df01 Binary files /dev/null and b/sd/qa/unit/data/odp/fillbitmap2.odp differ diff --git a/sd/qa/unit/data/odp/group_rotation.odp b/sd/qa/unit/data/odp/group_rotation.odp new file mode 100644 index 0000000000..92568c1500 Binary files /dev/null and b/sd/qa/unit/data/odp/group_rotation.odp differ diff --git a/sd/qa/unit/data/odp/image_transparency.odp b/sd/qa/unit/data/odp/image_transparency.odp new file mode 100644 index 0000000000..6d3f6c232d Binary files /dev/null and b/sd/qa/unit/data/odp/image_transparency.odp differ diff --git a/sd/qa/unit/data/odp/images_with_special_IDs.odp b/sd/qa/unit/data/odp/images_with_special_IDs.odp new file mode 100644 index 0000000000..f6a5545a84 Binary files /dev/null and b/sd/qa/unit/data/odp/images_with_special_IDs.odp differ diff --git a/sd/qa/unit/data/odp/indeterminate/.gitignore b/sd/qa/unit/data/odp/indeterminate/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/odp/linked_graphic.jpg b/sd/qa/unit/data/odp/linked_graphic.jpg new file mode 100644 index 0000000000..2218cdd72d Binary files /dev/null and b/sd/qa/unit/data/odp/linked_graphic.jpg differ diff --git a/sd/qa/unit/data/odp/linked_ole.odp b/sd/qa/unit/data/odp/linked_ole.odp new file mode 100644 index 0000000000..13fb0a845a Binary files /dev/null and b/sd/qa/unit/data/odp/linked_ole.odp differ diff --git a/sd/qa/unit/data/odp/loopNoPause.odp b/sd/qa/unit/data/odp/loopNoPause.odp new file mode 100644 index 0000000000..d9be1c2dca Binary files /dev/null and b/sd/qa/unit/data/odp/loopNoPause.odp differ diff --git a/sd/qa/unit/data/odp/loopPause10.odp b/sd/qa/unit/data/odp/loopPause10.odp new file mode 100644 index 0000000000..0e3e316db3 Binary files /dev/null and b/sd/qa/unit/data/odp/loopPause10.odp differ diff --git a/sd/qa/unit/data/odp/masterpage_style_parent.odp b/sd/qa/unit/data/odp/masterpage_style_parent.odp new file mode 100644 index 0000000000..e9f6378490 Binary files /dev/null and b/sd/qa/unit/data/odp/masterpage_style_parent.odp differ diff --git a/sd/qa/unit/data/odp/math.odp b/sd/qa/unit/data/odp/math.odp new file mode 100644 index 0000000000..c7605c5716 Binary files /dev/null and b/sd/qa/unit/data/odp/math.odp differ diff --git a/sd/qa/unit/data/odp/numfmt.odp b/sd/qa/unit/data/odp/numfmt.odp new file mode 100644 index 0000000000..51227ea091 Binary files /dev/null and b/sd/qa/unit/data/odp/numfmt.odp differ diff --git a/sd/qa/unit/data/odp/ole_icon.odp b/sd/qa/unit/data/odp/ole_icon.odp new file mode 100644 index 0000000000..073899c6e5 Binary files /dev/null and b/sd/qa/unit/data/odp/ole_icon.odp differ diff --git a/sd/qa/unit/data/odp/page_transparent_background.odp b/sd/qa/unit/data/odp/page_transparent_background.odp new file mode 100644 index 0000000000..02b11976a1 Binary files /dev/null and b/sd/qa/unit/data/odp/page_transparent_background.odp differ diff --git a/sd/qa/unit/data/odp/pass/.gitignore b/sd/qa/unit/data/odp/pass/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/odp/pass/EDB-26517-1.odp b/sd/qa/unit/data/odp/pass/EDB-26517-1.odp new file mode 100644 index 0000000000..8367930bfb Binary files /dev/null and b/sd/qa/unit/data/odp/pass/EDB-26517-1.odp differ diff --git a/sd/qa/unit/data/odp/pass/ooo56974-1.odp b/sd/qa/unit/data/odp/pass/ooo56974-1.odp new file mode 100644 index 0000000000..6a48db41a1 Binary files /dev/null and b/sd/qa/unit/data/odp/pass/ooo56974-1.odp differ diff --git a/sd/qa/unit/data/odp/pass/ooo72169-1.odp b/sd/qa/unit/data/odp/pass/ooo72169-1.odp new file mode 100644 index 0000000000..7a024b8f83 Binary files /dev/null and b/sd/qa/unit/data/odp/pass/ooo72169-1.odp differ diff --git a/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp new file mode 100644 index 0000000000..d539e8cfa6 Binary files /dev/null and b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp differ diff --git a/sd/qa/unit/data/odp/pass/test-slide-name-fields.odp b/sd/qa/unit/data/odp/pass/test-slide-name-fields.odp new file mode 100644 index 0000000000..3de53f931d Binary files /dev/null and b/sd/qa/unit/data/odp/pass/test-slide-name-fields.odp differ diff --git a/sd/qa/unit/data/odp/placeholder-box-textalignment.odp b/sd/qa/unit/data/odp/placeholder-box-textalignment.odp new file mode 100644 index 0000000000..df33291fbd Binary files /dev/null and b/sd/qa/unit/data/odp/placeholder-box-textalignment.odp differ diff --git a/sd/qa/unit/data/odp/preset-shapes-export.odp b/sd/qa/unit/data/odp/preset-shapes-export.odp new file mode 100644 index 0000000000..30668535be Binary files /dev/null and b/sd/qa/unit/data/odp/preset-shapes-export.odp differ diff --git a/sd/qa/unit/data/odp/repeatBitmapMode.odp b/sd/qa/unit/data/odp/repeatBitmapMode.odp new file mode 100644 index 0000000000..b3d8299304 Binary files /dev/null and b/sd/qa/unit/data/odp/repeatBitmapMode.odp differ diff --git a/sd/qa/unit/data/odp/rotate_flip.odp b/sd/qa/unit/data/odp/rotate_flip.odp new file mode 100644 index 0000000000..675b3fb850 Binary files /dev/null and b/sd/qa/unit/data/odp/rotate_flip.odp differ diff --git a/sd/qa/unit/data/odp/search-all-notes.odp b/sd/qa/unit/data/odp/search-all-notes.odp new file mode 100644 index 0000000000..6c38ecabb0 Binary files /dev/null and b/sd/qa/unit/data/odp/search-all-notes.odp differ diff --git a/sd/qa/unit/data/odp/shadow-blur.odp b/sd/qa/unit/data/odp/shadow-blur.odp new file mode 100644 index 0000000000..a67b8e1866 Binary files /dev/null and b/sd/qa/unit/data/odp/shadow-blur.odp differ diff --git a/sd/qa/unit/data/odp/shapes-test.odp b/sd/qa/unit/data/odp/shapes-test.odp new file mode 100644 index 0000000000..fa202104ba Binary files /dev/null and b/sd/qa/unit/data/odp/shapes-test.odp differ diff --git a/sd/qa/unit/data/odp/slide-bitmap-background.odp b/sd/qa/unit/data/odp/slide-bitmap-background.odp new file mode 100644 index 0000000000..46ea62be5a Binary files /dev/null and b/sd/qa/unit/data/odp/slide-bitmap-background.odp differ diff --git a/sd/qa/unit/data/odp/slide-custom-background.odp b/sd/qa/unit/data/odp/slide-custom-background.odp new file mode 100644 index 0000000000..df07c6f345 Binary files /dev/null and b/sd/qa/unit/data/odp/slide-custom-background.odp differ diff --git a/sd/qa/unit/data/odp/slide-tile-background.odp b/sd/qa/unit/data/odp/slide-tile-background.odp new file mode 100644 index 0000000000..d926b555f4 Binary files /dev/null and b/sd/qa/unit/data/odp/slide-tile-background.odp differ diff --git a/sd/qa/unit/data/odp/slide-video-thumbnail.odp b/sd/qa/unit/data/odp/slide-video-thumbnail.odp new file mode 100644 index 0000000000..2bb4ed5a86 Binary files /dev/null and b/sd/qa/unit/data/odp/slide-video-thumbnail.odp differ diff --git a/sd/qa/unit/data/odp/slidecount_field.odp b/sd/qa/unit/data/odp/slidecount_field.odp new file mode 100644 index 0000000000..c8f5bd46dc Binary files /dev/null and b/sd/qa/unit/data/odp/slidecount_field.odp differ diff --git a/sd/qa/unit/data/odp/slidename_field.odp b/sd/qa/unit/data/odp/slidename_field.odp new file mode 100644 index 0000000000..e1a119b9fa Binary files /dev/null and b/sd/qa/unit/data/odp/slidename_field.odp differ diff --git a/sd/qa/unit/data/odp/slidenum_field.odp b/sd/qa/unit/data/odp/slidenum_field.odp new file mode 100644 index 0000000000..e7789a3a0c Binary files /dev/null and b/sd/qa/unit/data/odp/slidenum_field.odp differ diff --git a/sd/qa/unit/data/odp/style-overflow-behavior-clip.fodp b/sd/qa/unit/data/odp/style-overflow-behavior-clip.fodp new file mode 100644 index 0000000000..29baf838f7 --- /dev/null +++ b/sd/qa/unit/data/odp/style-overflow-behavior-clip.fodp @@ -0,0 +1,18 @@ + + + + + + + + + + + + First line that is not clipped. + Second line that is clipped - but still shows up when editing + + + + + diff --git a/sd/qa/unit/data/odp/svg-export-text-decorations.odp b/sd/qa/unit/data/odp/svg-export-text-decorations.odp new file mode 100644 index 0000000000..d51661716f Binary files /dev/null and b/sd/qa/unit/data/odp/svg-export-text-decorations.odp differ diff --git a/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp b/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp new file mode 100644 index 0000000000..9df8d6615f Binary files /dev/null and b/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp differ diff --git a/sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp b/sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp new file mode 100644 index 0000000000..be3d17c21c Binary files /dev/null and b/sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp differ diff --git a/sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp b/sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp new file mode 100644 index 0000000000..e2c5f1e887 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp differ diff --git a/sd/qa/unit/data/odp/tdf100387.odp b/sd/qa/unit/data/odp/tdf100387.odp new file mode 100644 index 0000000000..72c7ba3852 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf100387.odp differ diff --git a/sd/qa/unit/data/odp/tdf103567.odp b/sd/qa/unit/data/odp/tdf103567.odp new file mode 100644 index 0000000000..a6f72c414f Binary files /dev/null and b/sd/qa/unit/data/odp/tdf103567.odp differ diff --git a/sd/qa/unit/data/odp/tdf105362.odp b/sd/qa/unit/data/odp/tdf105362.odp new file mode 100644 index 0000000000..1f0a83e85d Binary files /dev/null and b/sd/qa/unit/data/odp/tdf105362.odp differ diff --git a/sd/qa/unit/data/odp/tdf105998.odp b/sd/qa/unit/data/odp/tdf105998.odp new file mode 100644 index 0000000000..dca83afd14 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf105998.odp differ diff --git a/sd/qa/unit/data/odp/tdf106026.odp b/sd/qa/unit/data/odp/tdf106026.odp new file mode 100644 index 0000000000..0d77f755b0 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf106026.odp differ diff --git a/sd/qa/unit/data/odp/tdf108925.odp b/sd/qa/unit/data/odp/tdf108925.odp new file mode 100644 index 0000000000..5b6dfc4ca4 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf108925.odp differ diff --git a/sd/qa/unit/data/odp/tdf109169_Diamond.odp b/sd/qa/unit/data/odp/tdf109169_Diamond.odp new file mode 100644 index 0000000000..cd6a18d1b3 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf109169_Diamond.odp differ diff --git a/sd/qa/unit/data/odp/tdf109169_Octagon.odp b/sd/qa/unit/data/odp/tdf109169_Octagon.odp new file mode 100644 index 0000000000..f35e746f3b Binary files /dev/null and b/sd/qa/unit/data/odp/tdf109169_Octagon.odp differ diff --git a/sd/qa/unit/data/odp/tdf111785.odp b/sd/qa/unit/data/odp/tdf111785.odp new file mode 100644 index 0000000000..fdb704e4c9 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf111785.odp differ diff --git a/sd/qa/unit/data/odp/tdf111798.odp b/sd/qa/unit/data/odp/tdf111798.odp new file mode 100644 index 0000000000..f00c0bec7f Binary files /dev/null and b/sd/qa/unit/data/odp/tdf111798.odp differ diff --git a/sd/qa/unit/data/odp/tdf112552.odp b/sd/qa/unit/data/odp/tdf112552.odp new file mode 100644 index 0000000000..df4afb76b1 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf112552.odp differ diff --git a/sd/qa/unit/data/odp/tdf112557.odp b/sd/qa/unit/data/odp/tdf112557.odp new file mode 100644 index 0000000000..5587e7fcef Binary files /dev/null and b/sd/qa/unit/data/odp/tdf112557.odp differ diff --git a/sd/qa/unit/data/odp/tdf112647.odp b/sd/qa/unit/data/odp/tdf112647.odp new file mode 100644 index 0000000000..72a6621b8e Binary files /dev/null and b/sd/qa/unit/data/odp/tdf112647.odp differ diff --git a/sd/qa/unit/data/odp/tdf113197.odp b/sd/qa/unit/data/odp/tdf113197.odp new file mode 100644 index 0000000000..0ebabeb5fc Binary files /dev/null and b/sd/qa/unit/data/odp/tdf113197.odp differ diff --git a/sd/qa/unit/data/odp/tdf115005.odp b/sd/qa/unit/data/odp/tdf115005.odp new file mode 100644 index 0000000000..764a862fed Binary files /dev/null and b/sd/qa/unit/data/odp/tdf115005.odp differ diff --git a/sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp b/sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp new file mode 100644 index 0000000000..2f88282af5 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp differ diff --git a/sd/qa/unit/data/odp/tdf116266.odp b/sd/qa/unit/data/odp/tdf116266.odp new file mode 100644 index 0000000000..17ce46ea59 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf116266.odp differ diff --git a/sd/qa/unit/data/odp/tdf116266_chart.svg b/sd/qa/unit/data/odp/tdf116266_chart.svg new file mode 100644 index 0000000000..3a3ef2d0ec --- /dev/null +++ b/sd/qa/unit/data/odp/tdf116266_chart.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1950 + 1970 + 1990 + 2010 + 0 + 100 + 200 + 300 + 400 + 500 + 600 + 700 + Data + + 2016 vs 2006 ≙- 0,23 %/a + \ No newline at end of file diff --git a/sd/qa/unit/data/odp/tdf118045.odp b/sd/qa/unit/data/odp/tdf118045.odp new file mode 100644 index 0000000000..8b5fac36af Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118045.odp differ diff --git a/sd/qa/unit/data/odp/tdf118768-brake.odp b/sd/qa/unit/data/odp/tdf118768-brake.odp new file mode 100644 index 0000000000..1f3abbcc0d Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118768-brake.odp differ diff --git a/sd/qa/unit/data/odp/tdf118783.odp b/sd/qa/unit/data/odp/tdf118783.odp new file mode 100644 index 0000000000..719db63d1d Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118783.odp differ diff --git a/sd/qa/unit/data/odp/tdf118806.odp b/sd/qa/unit/data/odp/tdf118806.odp new file mode 100644 index 0000000000..7120fd9685 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118806.odp differ diff --git a/sd/qa/unit/data/odp/tdf118825-motionpath.odp b/sd/qa/unit/data/odp/tdf118825-motionpath.odp new file mode 100644 index 0000000000..c070b0ae2d Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118825-motionpath.odp differ diff --git a/sd/qa/unit/data/odp/tdf118835.odp b/sd/qa/unit/data/odp/tdf118835.odp new file mode 100644 index 0000000000..c3e15a6dca Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118835.odp differ diff --git a/sd/qa/unit/data/odp/tdf118836.odp b/sd/qa/unit/data/odp/tdf118836.odp new file mode 100644 index 0000000000..50857b79de Binary files /dev/null and b/sd/qa/unit/data/odp/tdf118836.odp differ diff --git a/sd/qa/unit/data/odp/tdf119223.odp b/sd/qa/unit/data/odp/tdf119223.odp new file mode 100644 index 0000000000..efb4306b9c Binary files /dev/null and b/sd/qa/unit/data/odp/tdf119223.odp differ diff --git a/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp b/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp new file mode 100644 index 0000000000..cfd296700a Binary files /dev/null and b/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp differ diff --git a/sd/qa/unit/data/odp/tdf124781.odp b/sd/qa/unit/data/odp/tdf124781.odp new file mode 100644 index 0000000000..199287db51 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf124781.odp differ diff --git a/sd/qa/unit/data/odp/tdf127267DashOnHairline.odp b/sd/qa/unit/data/odp/tdf127267DashOnHairline.odp new file mode 100644 index 0000000000..08aed1758b Binary files /dev/null and b/sd/qa/unit/data/odp/tdf127267DashOnHairline.odp differ diff --git a/sd/qa/unit/data/odp/tdf127372.odp b/sd/qa/unit/data/odp/tdf127372.odp new file mode 100644 index 0000000000..adf5ad589b Binary files /dev/null and b/sd/qa/unit/data/odp/tdf127372.odp differ diff --git a/sd/qa/unit/data/odp/tdf127379.odp b/sd/qa/unit/data/odp/tdf127379.odp new file mode 100644 index 0000000000..91602c7962 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf127379.odp differ diff --git a/sd/qa/unit/data/odp/tdf127901.odp b/sd/qa/unit/data/odp/tdf127901.odp new file mode 100644 index 0000000000..e1c5dfad3f Binary files /dev/null and b/sd/qa/unit/data/odp/tdf127901.odp differ diff --git a/sd/qa/unit/data/odp/tdf128049.odp b/sd/qa/unit/data/odp/tdf128049.odp new file mode 100644 index 0000000000..8b9990a5c5 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128049.odp differ diff --git a/sd/qa/unit/data/odp/tdf128096.odp b/sd/qa/unit/data/odp/tdf128096.odp new file mode 100644 index 0000000000..827239973c Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128096.odp differ diff --git a/sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp b/sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp new file mode 100644 index 0000000000..904490d431 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp differ diff --git a/sd/qa/unit/data/odp/tdf128345_GradientAxial.odp b/sd/qa/unit/data/odp/tdf128345_GradientAxial.odp new file mode 100644 index 0000000000..55b8ec1aac Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128345_GradientAxial.odp differ diff --git a/sd/qa/unit/data/odp/tdf128345_GradientLinear.odp b/sd/qa/unit/data/odp/tdf128345_GradientLinear.odp new file mode 100644 index 0000000000..1eadfa11f0 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128345_GradientLinear.odp differ diff --git a/sd/qa/unit/data/odp/tdf128345_GradientRadial.odp b/sd/qa/unit/data/odp/tdf128345_GradientRadial.odp new file mode 100644 index 0000000000..634d1dc1bd Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128345_GradientRadial.odp differ diff --git a/sd/qa/unit/data/odp/tdf128985.odp b/sd/qa/unit/data/odp/tdf128985.odp new file mode 100644 index 0000000000..61a184ac77 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf128985.odp differ diff --git a/sd/qa/unit/data/odp/tdf129430.odp b/sd/qa/unit/data/odp/tdf129430.odp new file mode 100644 index 0000000000..f5304f75cf Binary files /dev/null and b/sd/qa/unit/data/odp/tdf129430.odp differ diff --git a/sd/qa/unit/data/odp/tdf133502.odp b/sd/qa/unit/data/odp/tdf133502.odp new file mode 100644 index 0000000000..de72673049 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf133502.odp differ diff --git a/sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp b/sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp new file mode 100644 index 0000000000..bb0d7bbc57 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp differ diff --git a/sd/qa/unit/data/odp/tdf136949.odp b/sd/qa/unit/data/odp/tdf136949.odp new file mode 100644 index 0000000000..91f3017d4d Binary files /dev/null and b/sd/qa/unit/data/odp/tdf136949.odp differ diff --git a/sd/qa/unit/data/odp/tdf141269.odp b/sd/qa/unit/data/odp/tdf141269.odp new file mode 100644 index 0000000000..dfce4e064a Binary files /dev/null and b/sd/qa/unit/data/odp/tdf141269.odp differ diff --git a/sd/qa/unit/data/odp/tdf146876.odp b/sd/qa/unit/data/odp/tdf146876.odp new file mode 100644 index 0000000000..edb361fbab Binary files /dev/null and b/sd/qa/unit/data/odp/tdf146876.odp differ diff --git a/sd/qa/unit/data/odp/tdf147919.odp b/sd/qa/unit/data/odp/tdf147919.odp new file mode 100644 index 0000000000..2676b0e1c0 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf147919.odp differ diff --git a/sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp b/sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp new file mode 100644 index 0000000000..15d7046811 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp differ diff --git a/sd/qa/unit/data/odp/tdf148966-withflag.odp b/sd/qa/unit/data/odp/tdf148966-withflag.odp new file mode 100644 index 0000000000..7ba89b1c8e Binary files /dev/null and b/sd/qa/unit/data/odp/tdf148966-withflag.odp differ diff --git a/sd/qa/unit/data/odp/tdf148966-withoutflag.odp b/sd/qa/unit/data/odp/tdf148966-withoutflag.odp new file mode 100644 index 0000000000..fdc2c2523b Binary files /dev/null and b/sd/qa/unit/data/odp/tdf148966-withoutflag.odp differ diff --git a/sd/qa/unit/data/odp/tdf149126.odp b/sd/qa/unit/data/odp/tdf149126.odp new file mode 100644 index 0000000000..1d9c3c8c23 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf149126.odp differ diff --git a/sd/qa/unit/data/odp/tdf149128.odp b/sd/qa/unit/data/odp/tdf149128.odp new file mode 100644 index 0000000000..0c26fdd6b3 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf149128.odp differ diff --git a/sd/qa/unit/data/odp/tdf149311.odp b/sd/qa/unit/data/odp/tdf149311.odp new file mode 100644 index 0000000000..2500ed5e7a Binary files /dev/null and b/sd/qa/unit/data/odp/tdf149311.odp differ diff --git a/sd/qa/unit/data/odp/tdf149551_btlr.odp b/sd/qa/unit/data/odp/tdf149551_btlr.odp new file mode 100644 index 0000000000..41db04d782 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf149551_btlr.odp differ diff --git a/sd/qa/unit/data/odp/tdf149551_tbrl90.odp b/sd/qa/unit/data/odp/tdf149551_tbrl90.odp new file mode 100644 index 0000000000..486fcea58b Binary files /dev/null and b/sd/qa/unit/data/odp/tdf149551_tbrl90.odp differ diff --git a/sd/qa/unit/data/odp/tdf150316.odp b/sd/qa/unit/data/odp/tdf150316.odp new file mode 100644 index 0000000000..dab2971711 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf150316.odp differ diff --git a/sd/qa/unit/data/odp/tdf150966_hugeInset.odp b/sd/qa/unit/data/odp/tdf150966_hugeInset.odp new file mode 100644 index 0000000000..9dcc88bef9 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf150966_hugeInset.odp differ diff --git a/sd/qa/unit/data/odp/tdf151492.odp b/sd/qa/unit/data/odp/tdf151492.odp new file mode 100644 index 0000000000..6928dac598 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf151492.odp differ diff --git a/sd/qa/unit/data/odp/tdf153105.odp b/sd/qa/unit/data/odp/tdf153105.odp new file mode 100644 index 0000000000..a5f765f9b0 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf153105.odp differ diff --git a/sd/qa/unit/data/odp/tdf153107.odp b/sd/qa/unit/data/odp/tdf153107.odp new file mode 100644 index 0000000000..c77b65d87f Binary files /dev/null and b/sd/qa/unit/data/odp/tdf153107.odp differ diff --git a/sd/qa/unit/data/odp/tdf153161_FlushToSave.odp b/sd/qa/unit/data/odp/tdf153161_FlushToSave.odp new file mode 100644 index 0000000000..1fd5c20c2a Binary files /dev/null and b/sd/qa/unit/data/odp/tdf153161_FlushToSave.odp differ diff --git a/sd/qa/unit/data/odp/tdf154754.odp b/sd/qa/unit/data/odp/tdf154754.odp new file mode 100644 index 0000000000..9aa412de85 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf154754.odp differ diff --git a/sd/qa/unit/data/odp/tdf157652.odp b/sd/qa/unit/data/odp/tdf157652.odp new file mode 100644 index 0000000000..11fb34b0c3 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf157652.odp differ diff --git a/sd/qa/unit/data/odp/tdf157795.odp b/sd/qa/unit/data/odp/tdf157795.odp new file mode 100644 index 0000000000..abfe29bb79 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf157795.odp differ diff --git a/sd/qa/unit/data/odp/tdf48735.odp b/sd/qa/unit/data/odp/tdf48735.odp new file mode 100644 index 0000000000..9a1593a0db Binary files /dev/null and b/sd/qa/unit/data/odp/tdf48735.odp differ diff --git a/sd/qa/unit/data/odp/tdf53970.odp b/sd/qa/unit/data/odp/tdf53970.odp new file mode 100644 index 0000000000..0d48cf5d66 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf53970.odp differ diff --git a/sd/qa/unit/data/odp/tdf53970_linked.odp b/sd/qa/unit/data/odp/tdf53970_linked.odp new file mode 100644 index 0000000000..3ddb793346 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf53970_linked.odp differ diff --git a/sd/qa/unit/data/odp/tdf59046.odp b/sd/qa/unit/data/odp/tdf59046.odp new file mode 100644 index 0000000000..5c56acb95c Binary files /dev/null and b/sd/qa/unit/data/odp/tdf59046.odp differ diff --git a/sd/qa/unit/data/odp/tdf66228.odp b/sd/qa/unit/data/odp/tdf66228.odp new file mode 100644 index 0000000000..a34c6fc652 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf66228.odp differ diff --git a/sd/qa/unit/data/odp/tdf68759.odp b/sd/qa/unit/data/odp/tdf68759.odp new file mode 100644 index 0000000000..db3e51e976 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf68759.odp differ diff --git a/sd/qa/unit/data/odp/tdf74670.odp b/sd/qa/unit/data/odp/tdf74670.odp new file mode 100644 index 0000000000..98e223eb07 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf74670.odp differ diff --git a/sd/qa/unit/data/odp/tdf80020.odp b/sd/qa/unit/data/odp/tdf80020.odp new file mode 100644 index 0000000000..dade8d6596 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf80020.odp differ diff --git a/sd/qa/unit/data/odp/tdf80224.odp b/sd/qa/unit/data/odp/tdf80224.odp new file mode 100644 index 0000000000..5712c1a7d7 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf80224.odp differ diff --git a/sd/qa/unit/data/odp/tdf90626.odp b/sd/qa/unit/data/odp/tdf90626.odp new file mode 100644 index 0000000000..cea98fcd70 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf90626.odp differ diff --git a/sd/qa/unit/data/odp/tdf90627.odp b/sd/qa/unit/data/odp/tdf90627.odp new file mode 100644 index 0000000000..dfa28c9b09 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf90627.odp differ diff --git a/sd/qa/unit/data/odp/tdf92076.odp b/sd/qa/unit/data/odp/tdf92076.odp new file mode 100644 index 0000000000..ab0a20ba2b Binary files /dev/null and b/sd/qa/unit/data/odp/tdf92076.odp differ diff --git a/sd/qa/unit/data/odp/tdf93883.odp b/sd/qa/unit/data/odp/tdf93883.odp new file mode 100644 index 0000000000..54d589ca0f Binary files /dev/null and b/sd/qa/unit/data/odp/tdf93883.odp differ diff --git a/sd/qa/unit/data/odp/tdf94122_autocolor.odp b/sd/qa/unit/data/odp/tdf94122_autocolor.odp new file mode 100644 index 0000000000..921533cbea Binary files /dev/null and b/sd/qa/unit/data/odp/tdf94122_autocolor.odp differ diff --git a/sd/qa/unit/data/odp/tdf96206.odp b/sd/qa/unit/data/odp/tdf96206.odp new file mode 100644 index 0000000000..faebfd1536 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf96206.odp differ diff --git a/sd/qa/unit/data/odp/tdf96708.odp b/sd/qa/unit/data/odp/tdf96708.odp new file mode 100644 index 0000000000..bb602f3900 Binary files /dev/null and b/sd/qa/unit/data/odp/tdf96708.odp differ diff --git a/sd/qa/unit/data/odp/tdf99213-target-missing.odp b/sd/qa/unit/data/odp/tdf99213-target-missing.odp new file mode 100644 index 0000000000..3bc8c7260c Binary files /dev/null and b/sd/qa/unit/data/odp/tdf99213-target-missing.odp differ diff --git a/sd/qa/unit/data/odp/tdf99224.odp b/sd/qa/unit/data/odp/tdf99224.odp new file mode 100644 index 0000000000..e52a000dec Binary files /dev/null and b/sd/qa/unit/data/odp/tdf99224.odp differ diff --git a/sd/qa/unit/data/odp/tdf99497_CircleKind.odp b/sd/qa/unit/data/odp/tdf99497_CircleKind.odp new file mode 100644 index 0000000000..f3749dfdff Binary files /dev/null and b/sd/qa/unit/data/odp/tdf99497_CircleKind.odp differ diff --git a/sd/qa/unit/data/odp/tdf99729-legacy.odp b/sd/qa/unit/data/odp/tdf99729-legacy.odp new file mode 100644 index 0000000000..899b55c09c Binary files /dev/null and b/sd/qa/unit/data/odp/tdf99729-legacy.odp differ diff --git a/sd/qa/unit/data/odp/tdf99729-new.odp b/sd/qa/unit/data/odp/tdf99729-new.odp new file mode 100644 index 0000000000..1c5a9cd5ad Binary files /dev/null and b/sd/qa/unit/data/odp/tdf99729-new.odp differ diff --git a/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp b/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp new file mode 100644 index 0000000000..16a900b636 Binary files /dev/null and b/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp differ diff --git a/sd/qa/unit/data/odp/testZeroIndent.odp b/sd/qa/unit/data/odp/testZeroIndent.odp new file mode 100644 index 0000000000..ead2c02687 Binary files /dev/null and b/sd/qa/unit/data/odp/testZeroIndent.odp differ diff --git a/sd/qa/unit/data/odp/text-fields.odp b/sd/qa/unit/data/odp/text-fields.odp new file mode 100644 index 0000000000..3c5d057ba2 Binary files /dev/null and b/sd/qa/unit/data/odp/text-fields.odp differ diff --git a/sd/qa/unit/data/odp/textbox-link-javascript.odp b/sd/qa/unit/data/odp/textbox-link-javascript.odp new file mode 100644 index 0000000000..c046cf0c7d Binary files /dev/null and b/sd/qa/unit/data/odp/textbox-link-javascript.odp differ diff --git a/sd/qa/unit/data/odp/transparent_background.odp b/sd/qa/unit/data/odp/transparent_background.odp new file mode 100644 index 0000000000..ce599db54c Binary files /dev/null and b/sd/qa/unit/data/odp/transparent_background.odp differ diff --git a/sd/qa/unit/data/pdf/multipage.pdf b/sd/qa/unit/data/pdf/multipage.pdf new file mode 100644 index 0000000000..65c8eeaa32 Binary files /dev/null and b/sd/qa/unit/data/pdf/multipage.pdf differ diff --git a/sd/qa/unit/data/pdf/txtpic.pdf b/sd/qa/unit/data/pdf/txtpic.pdf new file mode 100644 index 0000000000..220c5822b6 Binary files /dev/null and b/sd/qa/unit/data/pdf/txtpic.pdf differ diff --git a/sd/qa/unit/data/ppt/FillPatterns.ppt b/sd/qa/unit/data/ppt/FillPatterns.ppt new file mode 100644 index 0000000000..bbd353b52b Binary files /dev/null and b/sd/qa/unit/data/ppt/FillPatterns.ppt differ diff --git a/sd/qa/unit/data/ppt/crop.ppt b/sd/qa/unit/data/ppt/crop.ppt new file mode 100644 index 0000000000..844a4392a1 Binary files /dev/null and b/sd/qa/unit/data/ppt/crop.ppt differ diff --git a/sd/qa/unit/data/ppt/fail/.gitignore b/sd/qa/unit/data/ppt/fail/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt b/sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt new file mode 100644 index 0000000000..0e4f50239e Binary files /dev/null and b/sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt differ diff --git a/sd/qa/unit/data/ppt/fdo68594.ppt b/sd/qa/unit/data/ppt/fdo68594.ppt new file mode 100644 index 0000000000..83a95cd4d8 Binary files /dev/null and b/sd/qa/unit/data/ppt/fdo68594.ppt differ diff --git a/sd/qa/unit/data/ppt/indeterminate/.gitignore b/sd/qa/unit/data/ppt/indeterminate/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/ppt/loopNoPause.ppt b/sd/qa/unit/data/ppt/loopNoPause.ppt new file mode 100644 index 0000000000..d82879a524 Binary files /dev/null and b/sd/qa/unit/data/ppt/loopNoPause.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/.gitignore b/sd/qa/unit/data/ppt/pass/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt new file mode 100644 index 0000000000..3cbcb724a4 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt new file mode 100644 index 0000000000..a1fd65a19f Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt new file mode 100644 index 0000000000..1289cfa222 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt new file mode 100644 index 0000000000..5d50f905b1 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt b/sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt new file mode 100644 index 0000000000..625c116fd1 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt b/sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt new file mode 100644 index 0000000000..64043235bf Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt b/sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt new file mode 100644 index 0000000000..091fb653a9 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/crash-1.ppt b/sd/qa/unit/data/ppt/pass/crash-1.ppt new file mode 100644 index 0000000000..5d1a04b33c Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/crash-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/crash-2.ppt b/sd/qa/unit/data/ppt/pass/crash-2.ppt new file mode 100644 index 0000000000..78a4da4660 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/crash-2.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/crash-3.ppt b/sd/qa/unit/data/ppt/pass/crash-3.ppt new file mode 100644 index 0000000000..daa0102db4 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/crash-3.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-1.ppt b/sd/qa/unit/data/ppt/pass/hang-1.ppt new file mode 100644 index 0000000000..d30cb8472e Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-10.ppt b/sd/qa/unit/data/ppt/pass/hang-10.ppt new file mode 100644 index 0000000000..99a81c4a33 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-10.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-11.ppt b/sd/qa/unit/data/ppt/pass/hang-11.ppt new file mode 100644 index 0000000000..2d9ef18373 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-11.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-12.ppt b/sd/qa/unit/data/ppt/pass/hang-12.ppt new file mode 100644 index 0000000000..921481c930 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-12.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-13.ppt b/sd/qa/unit/data/ppt/pass/hang-13.ppt new file mode 100644 index 0000000000..04fbdc558c Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-13.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-14.ppt b/sd/qa/unit/data/ppt/pass/hang-14.ppt new file mode 100644 index 0000000000..8dd397bb36 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-14.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-15.ppt b/sd/qa/unit/data/ppt/pass/hang-15.ppt new file mode 100644 index 0000000000..b93255a7fd Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-15.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-16.ppt b/sd/qa/unit/data/ppt/pass/hang-16.ppt new file mode 100644 index 0000000000..c398d2ba1e Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-16.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-17.ppt b/sd/qa/unit/data/ppt/pass/hang-17.ppt new file mode 100644 index 0000000000..de876ff37e Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-17.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-18.ppt b/sd/qa/unit/data/ppt/pass/hang-18.ppt new file mode 100644 index 0000000000..3b3e9f744a Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-18.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-19.ppt b/sd/qa/unit/data/ppt/pass/hang-19.ppt new file mode 100644 index 0000000000..942a58a66c Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-19.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-2.ppt b/sd/qa/unit/data/ppt/pass/hang-2.ppt new file mode 100644 index 0000000000..c6880b771d Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-2.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-20.ppt b/sd/qa/unit/data/ppt/pass/hang-20.ppt new file mode 100644 index 0000000000..7bfe75d7b1 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-20.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-21.ppt b/sd/qa/unit/data/ppt/pass/hang-21.ppt new file mode 100644 index 0000000000..99cf49f8d1 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-21.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-22.ppt b/sd/qa/unit/data/ppt/pass/hang-22.ppt new file mode 100644 index 0000000000..c869b39372 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-22.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-3.ppt b/sd/qa/unit/data/ppt/pass/hang-3.ppt new file mode 100644 index 0000000000..156a9d0e50 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-3.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-4.ppt b/sd/qa/unit/data/ppt/pass/hang-4.ppt new file mode 100644 index 0000000000..f5aa247521 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-4.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-5.ppt b/sd/qa/unit/data/ppt/pass/hang-5.ppt new file mode 100644 index 0000000000..cfaa8f4c60 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-5.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-6.ppt b/sd/qa/unit/data/ppt/pass/hang-6.ppt new file mode 100644 index 0000000000..f5aa247521 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-6.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-7.ppt b/sd/qa/unit/data/ppt/pass/hang-7.ppt new file mode 100644 index 0000000000..8c05271f9b Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-7.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-8.ppt b/sd/qa/unit/data/ppt/pass/hang-8.ppt new file mode 100644 index 0000000000..0f52bd5d24 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-8.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/hang-9.ppt b/sd/qa/unit/data/ppt/pass/hang-9.ppt new file mode 100644 index 0000000000..97e0158ac9 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-9.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/ofz14989-1.ppt b/sd/qa/unit/data/ppt/pass/ofz14989-1.ppt new file mode 100644 index 0000000000..b470ebecdb Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/ofz14989-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/ofz21531-1.ppt b/sd/qa/unit/data/ppt/pass/ofz21531-1.ppt new file mode 100644 index 0000000000..0d93e5b845 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/ofz21531-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/ofz37370-1.ppt b/sd/qa/unit/data/ppt/pass/ofz37370-1.ppt new file mode 100644 index 0000000000..87f904c747 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/ofz37370-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/ofz43902-1.ppt b/sd/qa/unit/data/ppt/pass/ofz43902-1.ppt new file mode 100644 index 0000000000..44d81a9514 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/ofz43902-1.ppt differ diff --git a/sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt b/sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt new file mode 100644 index 0000000000..d52f795e6d Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt differ diff --git a/sd/qa/unit/data/ppt/placeholder-priority.pptx b/sd/qa/unit/data/ppt/placeholder-priority.pptx new file mode 100644 index 0000000000..d11dc4785f Binary files /dev/null and b/sd/qa/unit/data/ppt/placeholder-priority.pptx differ diff --git a/sd/qa/unit/data/ppt/tdf105150.ppt b/sd/qa/unit/data/ppt/tdf105150.ppt new file mode 100644 index 0000000000..c832371e93 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf105150.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf115394.ppt b/sd/qa/unit/data/ppt/tdf115394.ppt new file mode 100644 index 0000000000..1fd299a5e4 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf115394.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf116899.ppt b/sd/qa/unit/data/ppt/tdf116899.ppt new file mode 100644 index 0000000000..edad3356d3 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf116899.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf119629.ppt b/sd/qa/unit/data/ppt/tdf119629.ppt new file mode 100644 index 0000000000..b9c90e916f Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf119629.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt b/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt new file mode 100644 index 0000000000..9df17e9a80 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf126761.ppt b/sd/qa/unit/data/ppt/tdf126761.ppt new file mode 100644 index 0000000000..186799ec5b Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf126761.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf136911.ppt b/sd/qa/unit/data/ppt/tdf136911.ppt new file mode 100644 index 0000000000..550dc5c3a4 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf136911.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt b/sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt new file mode 100644 index 0000000000..54111bb28a Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf157636.ppt b/sd/qa/unit/data/ppt/tdf157636.ppt new file mode 100644 index 0000000000..1dcbbe6f00 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf157636.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf48083.ppt b/sd/qa/unit/data/ppt/tdf48083.ppt new file mode 100644 index 0000000000..97ca371d7a Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf48083.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf49561.ppt b/sd/qa/unit/data/ppt/tdf49561.ppt new file mode 100644 index 0000000000..c80bf1252f Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf49561.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf49856.ppt b/sd/qa/unit/data/ppt/tdf49856.ppt new file mode 100644 index 0000000000..3e6053d458 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf49856.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf77747.ppt b/sd/qa/unit/data/ppt/tdf77747.ppt new file mode 100644 index 0000000000..e011be717a Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf77747.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf79082.ppt b/sd/qa/unit/data/ppt/tdf79082.ppt new file mode 100644 index 0000000000..259b880851 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf79082.ppt differ diff --git a/sd/qa/unit/data/ppt/tdf93124.ppt b/sd/qa/unit/data/ppt/tdf93124.ppt new file mode 100644 index 0000000000..fad847898c Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf93124.ppt differ diff --git a/sd/qa/unit/data/pptm/macro.pptm b/sd/qa/unit/data/pptm/macro.pptm new file mode 100644 index 0000000000..54e81db2a0 Binary files /dev/null and b/sd/qa/unit/data/pptm/macro.pptm differ diff --git a/sd/qa/unit/data/pptx/3columns.pptx b/sd/qa/unit/data/pptx/3columns.pptx new file mode 100644 index 0000000000..596db14a0d Binary files /dev/null and b/sd/qa/unit/data/pptx/3columns.pptx differ diff --git a/sd/qa/unit/data/pptx/LostPlaceholder.odp b/sd/qa/unit/data/pptx/LostPlaceholder.odp new file mode 100644 index 0000000000..80ead189f2 Binary files /dev/null and b/sd/qa/unit/data/pptx/LostPlaceholder.odp differ diff --git a/sd/qa/unit/data/pptx/LostPlaceholderFill.odp b/sd/qa/unit/data/pptx/LostPlaceholderFill.odp new file mode 100644 index 0000000000..d2ea8dab6d Binary files /dev/null and b/sd/qa/unit/data/pptx/LostPlaceholderFill.odp differ diff --git a/sd/qa/unit/data/pptx/Math.pptx b/sd/qa/unit/data/pptx/Math.pptx new file mode 100644 index 0000000000..fef20675b5 Binary files /dev/null and b/sd/qa/unit/data/pptx/Math.pptx differ diff --git a/sd/qa/unit/data/pptx/ShapeLineProperties.pptx b/sd/qa/unit/data/pptx/ShapeLineProperties.pptx new file mode 100644 index 0000000000..36ece8caeb Binary files /dev/null and b/sd/qa/unit/data/pptx/ShapeLineProperties.pptx differ diff --git a/sd/qa/unit/data/pptx/ShapePlusImage.pptx b/sd/qa/unit/data/pptx/ShapePlusImage.pptx new file mode 100644 index 0000000000..dd9424d172 Binary files /dev/null and b/sd/qa/unit/data/pptx/ShapePlusImage.pptx differ diff --git a/sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx b/sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx new file mode 100644 index 0000000000..cc8fd02790 Binary files /dev/null and b/sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx differ diff --git a/sd/qa/unit/data/pptx/accent-color.pptx b/sd/qa/unit/data/pptx/accent-color.pptx new file mode 100644 index 0000000000..59591606e5 Binary files /dev/null and b/sd/qa/unit/data/pptx/accent-color.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_checkbox.pptx b/sd/qa/unit/data/pptx/activex_checkbox.pptx new file mode 100644 index 0000000000..acca5f696b Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_checkbox.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_combobox.pptx b/sd/qa/unit/data/pptx/activex_combobox.pptx new file mode 100644 index 0000000000..21bb21a1ba Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_combobox.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_commandbutton.pptx b/sd/qa/unit/data/pptx/activex_commandbutton.pptx new file mode 100644 index 0000000000..29a2556172 Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_commandbutton.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_fontproperties.pptx b/sd/qa/unit/data/pptx/activex_fontproperties.pptx new file mode 100644 index 0000000000..2f117d326d Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_fontproperties.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_label.pptx b/sd/qa/unit/data/pptx/activex_label.pptx new file mode 100644 index 0000000000..3e1404e689 Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_label.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_listbox.pptx b/sd/qa/unit/data/pptx/activex_listbox.pptx new file mode 100644 index 0000000000..5e232579f1 Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_listbox.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_optionbutton.pptx b/sd/qa/unit/data/pptx/activex_optionbutton.pptx new file mode 100644 index 0000000000..e75498484c Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_optionbutton.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_picture.pptx b/sd/qa/unit/data/pptx/activex_picture.pptx new file mode 100644 index 0000000000..425a909e16 Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_picture.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_scrollbar.pptx b/sd/qa/unit/data/pptx/activex_scrollbar.pptx new file mode 100644 index 0000000000..ba7c14d930 Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_scrollbar.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_spinbutton.pptx b/sd/qa/unit/data/pptx/activex_spinbutton.pptx new file mode 100644 index 0000000000..32b5f73e88 Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_spinbutton.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_textbox.pptx b/sd/qa/unit/data/pptx/activex_textbox.pptx new file mode 100644 index 0000000000..68dec15d5a Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_textbox.pptx differ diff --git a/sd/qa/unit/data/pptx/activex_togglebutton.pptx b/sd/qa/unit/data/pptx/activex_togglebutton.pptx new file mode 100644 index 0000000000..3d4bfd287d Binary files /dev/null and b/sd/qa/unit/data/pptx/activex_togglebutton.pptx differ diff --git a/sd/qa/unit/data/pptx/altdescription.pptx b/sd/qa/unit/data/pptx/altdescription.pptx new file mode 100644 index 0000000000..f116efe411 Binary files /dev/null and b/sd/qa/unit/data/pptx/altdescription.pptx differ diff --git a/sd/qa/unit/data/pptx/arc-validiert.pptx b/sd/qa/unit/data/pptx/arc-validiert.pptx new file mode 100644 index 0000000000..163f187b0b Binary files /dev/null and b/sd/qa/unit/data/pptx/arc-validiert.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc480256-2.pptx b/sd/qa/unit/data/pptx/bnc480256-2.pptx new file mode 100644 index 0000000000..a622d77ace Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc480256-2.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc480256.pptx b/sd/qa/unit/data/pptx/bnc480256.pptx new file mode 100644 index 0000000000..71e91c2f45 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc480256.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc584721_1_2.pptx b/sd/qa/unit/data/pptx/bnc584721_1_2.pptx new file mode 100644 index 0000000000..dbbcabddcb Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc584721_1_2.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc584721_4.pptx b/sd/qa/unit/data/pptx/bnc584721_4.pptx new file mode 100644 index 0000000000..102ee0b147 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc584721_4.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc591147.pptx b/sd/qa/unit/data/pptx/bnc591147.pptx new file mode 100644 index 0000000000..afa382e657 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc591147.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc862510_5.pptx b/sd/qa/unit/data/pptx/bnc862510_5.pptx new file mode 100644 index 0000000000..ed145e4cfc Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc862510_5.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc862510_6.pptx b/sd/qa/unit/data/pptx/bnc862510_6.pptx new file mode 100644 index 0000000000..fc5f008c5c Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc862510_6.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc862510_7.pptx b/sd/qa/unit/data/pptx/bnc862510_7.pptx new file mode 100644 index 0000000000..0eb3bbec75 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc862510_7.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc870233_1.pptx b/sd/qa/unit/data/pptx/bnc870233_1.pptx new file mode 100644 index 0000000000..0659e30b38 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc870233_1.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc870233_2.pptx b/sd/qa/unit/data/pptx/bnc870233_2.pptx new file mode 100644 index 0000000000..7f4fc715aa Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc870233_2.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc870237.pptx b/sd/qa/unit/data/pptx/bnc870237.pptx new file mode 100644 index 0000000000..245ef51f80 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc870237.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc880763.pptx b/sd/qa/unit/data/pptx/bnc880763.pptx new file mode 100644 index 0000000000..f45eb13ec3 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc880763.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc887225.pptx b/sd/qa/unit/data/pptx/bnc887225.pptx new file mode 100644 index 0000000000..e5c528f180 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc887225.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc887230.pptx b/sd/qa/unit/data/pptx/bnc887230.pptx new file mode 100644 index 0000000000..7d4a235785 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc887230.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc904423.pptx b/sd/qa/unit/data/pptx/bnc904423.pptx new file mode 100644 index 0000000000..618ad1b473 Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc904423.pptx differ diff --git a/sd/qa/unit/data/pptx/bnc910045.pptx b/sd/qa/unit/data/pptx/bnc910045.pptx new file mode 100644 index 0000000000..5788ea929c Binary files /dev/null and b/sd/qa/unit/data/pptx/bnc910045.pptx differ diff --git a/sd/qa/unit/data/pptx/bulletColor.pptx b/sd/qa/unit/data/pptx/bulletColor.pptx new file mode 100644 index 0000000000..61bb834e4a Binary files /dev/null and b/sd/qa/unit/data/pptx/bulletColor.pptx differ diff --git a/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx b/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx new file mode 100644 index 0000000000..3ecfb5a740 Binary files /dev/null and b/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx differ diff --git a/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx b/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx new file mode 100644 index 0000000000..66a0f8cc6d Binary files /dev/null and b/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx differ diff --git a/sd/qa/unit/data/pptx/connectors.pptx b/sd/qa/unit/data/pptx/connectors.pptx new file mode 100644 index 0000000000..2f65acba13 Binary files /dev/null and b/sd/qa/unit/data/pptx/connectors.pptx differ diff --git a/sd/qa/unit/data/pptx/control_background_color.pptx b/sd/qa/unit/data/pptx/control_background_color.pptx new file mode 100644 index 0000000000..5d3fe61c5c Binary files /dev/null and b/sd/qa/unit/data/pptx/control_background_color.pptx differ diff --git a/sd/qa/unit/data/pptx/crop-position.pptx b/sd/qa/unit/data/pptx/crop-position.pptx new file mode 100644 index 0000000000..85b859be6b Binary files /dev/null and b/sd/qa/unit/data/pptx/crop-position.pptx differ diff --git a/sd/qa/unit/data/pptx/crop-to-shape.pptx b/sd/qa/unit/data/pptx/crop-to-shape.pptx new file mode 100644 index 0000000000..929b07e009 Binary files /dev/null and b/sd/qa/unit/data/pptx/crop-to-shape.pptx differ diff --git a/sd/qa/unit/data/pptx/croppedTo0.pptx b/sd/qa/unit/data/pptx/croppedTo0.pptx new file mode 100644 index 0000000000..081661f486 Binary files /dev/null and b/sd/qa/unit/data/pptx/croppedTo0.pptx differ diff --git a/sd/qa/unit/data/pptx/cshapes.pptx b/sd/qa/unit/data/pptx/cshapes.pptx new file mode 100644 index 0000000000..b546206256 Binary files /dev/null and b/sd/qa/unit/data/pptx/cshapes.pptx differ diff --git a/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx b/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx new file mode 100644 index 0000000000..e162f7e992 Binary files /dev/null and b/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx differ diff --git a/sd/qa/unit/data/pptx/customxml.pptx b/sd/qa/unit/data/pptx/customxml.pptx new file mode 100644 index 0000000000..ca9e8fe70d Binary files /dev/null and b/sd/qa/unit/data/pptx/customxml.pptx differ diff --git a/sd/qa/unit/data/pptx/deftabstop.pptx b/sd/qa/unit/data/pptx/deftabstop.pptx new file mode 100644 index 0000000000..5cfe717944 Binary files /dev/null and b/sd/qa/unit/data/pptx/deftabstop.pptx differ diff --git a/sd/qa/unit/data/pptx/effectOrder.pptx b/sd/qa/unit/data/pptx/effectOrder.pptx new file mode 100644 index 0000000000..7f913b3726 Binary files /dev/null and b/sd/qa/unit/data/pptx/effectOrder.pptx differ diff --git a/sd/qa/unit/data/pptx/fail/.gitignore b/sd/qa/unit/data/pptx/fail/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx b/sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx new file mode 100644 index 0000000000..f88506ff79 --- /dev/null +++ b/sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx @@ -0,0 +1 @@ +ת.Gx©Š}Ø'[eë2Î~ \ No newline at end of file diff --git a/sd/qa/unit/data/pptx/fdo83751.pptx b/sd/qa/unit/data/pptx/fdo83751.pptx new file mode 100644 index 0000000000..be0dfe43dd Binary files /dev/null and b/sd/qa/unit/data/pptx/fdo83751.pptx differ diff --git a/sd/qa/unit/data/pptx/fill-color-list.pptx b/sd/qa/unit/data/pptx/fill-color-list.pptx new file mode 100644 index 0000000000..c884349526 Binary files /dev/null and b/sd/qa/unit/data/pptx/fill-color-list.pptx differ diff --git a/sd/qa/unit/data/pptx/font-scale.pptx b/sd/qa/unit/data/pptx/font-scale.pptx new file mode 100644 index 0000000000..df33b20ceb Binary files /dev/null and b/sd/qa/unit/data/pptx/font-scale.pptx differ diff --git a/sd/qa/unit/data/pptx/formatting-bullet-indent.pptx b/sd/qa/unit/data/pptx/formatting-bullet-indent.pptx new file mode 100644 index 0000000000..3140d7ce57 Binary files /dev/null and b/sd/qa/unit/data/pptx/formatting-bullet-indent.pptx differ diff --git a/sd/qa/unit/data/pptx/greysscale-graphic.pptx b/sd/qa/unit/data/pptx/greysscale-graphic.pptx new file mode 100644 index 0000000000..547b60c102 Binary files /dev/null and b/sd/qa/unit/data/pptx/greysscale-graphic.pptx differ diff --git a/sd/qa/unit/data/pptx/group-rot.pptx b/sd/qa/unit/data/pptx/group-rot.pptx new file mode 100644 index 0000000000..11b2d6367d Binary files /dev/null and b/sd/qa/unit/data/pptx/group-rot.pptx differ diff --git a/sd/qa/unit/data/pptx/group.pptx b/sd/qa/unit/data/pptx/group.pptx new file mode 100644 index 0000000000..f0b739ee23 Binary files /dev/null and b/sd/qa/unit/data/pptx/group.pptx differ diff --git a/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx b/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx new file mode 100644 index 0000000000..38832da5eb Binary files /dev/null and b/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx differ diff --git a/sd/qa/unit/data/pptx/hyperlinktest.pptx b/sd/qa/unit/data/pptx/hyperlinktest.pptx new file mode 100644 index 0000000000..dac61c023d Binary files /dev/null and b/sd/qa/unit/data/pptx/hyperlinktest.pptx differ diff --git a/sd/qa/unit/data/pptx/indeterminate/.gitignore b/sd/qa/unit/data/pptx/indeterminate/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/pptx/lineStyle.pptx b/sd/qa/unit/data/pptx/lineStyle.pptx new file mode 100644 index 0000000000..0af7efabfc Binary files /dev/null and b/sd/qa/unit/data/pptx/lineStyle.pptx differ diff --git a/sd/qa/unit/data/pptx/loopNoPause.pptx b/sd/qa/unit/data/pptx/loopNoPause.pptx new file mode 100644 index 0000000000..f0c9966cee Binary files /dev/null and b/sd/qa/unit/data/pptx/loopNoPause.pptx differ diff --git a/sd/qa/unit/data/pptx/master-slides.pptx b/sd/qa/unit/data/pptx/master-slides.pptx new file mode 100644 index 0000000000..3494d33254 Binary files /dev/null and b/sd/qa/unit/data/pptx/master-slides.pptx differ diff --git a/sd/qa/unit/data/pptx/mirrored-graphic.pptx b/sd/qa/unit/data/pptx/mirrored-graphic.pptx new file mode 100644 index 0000000000..c7cd6a4069 Binary files /dev/null and b/sd/qa/unit/data/pptx/mirrored-graphic.pptx differ diff --git a/sd/qa/unit/data/pptx/multicol.pptx b/sd/qa/unit/data/pptx/multicol.pptx new file mode 100644 index 0000000000..3590d84c1a Binary files /dev/null and b/sd/qa/unit/data/pptx/multicol.pptx differ diff --git a/sd/qa/unit/data/pptx/n778859.pptx b/sd/qa/unit/data/pptx/n778859.pptx new file mode 100644 index 0000000000..034cfc5445 Binary files /dev/null and b/sd/qa/unit/data/pptx/n778859.pptx differ diff --git a/sd/qa/unit/data/pptx/n80340.pptx b/sd/qa/unit/data/pptx/n80340.pptx new file mode 100644 index 0000000000..6702075592 Binary files /dev/null and b/sd/qa/unit/data/pptx/n80340.pptx differ diff --git a/sd/qa/unit/data/pptx/n821567.pptx b/sd/qa/unit/data/pptx/n821567.pptx new file mode 100644 index 0000000000..9f365ad029 Binary files /dev/null and b/sd/qa/unit/data/pptx/n821567.pptx differ diff --git a/sd/qa/unit/data/pptx/n828390.pptx b/sd/qa/unit/data/pptx/n828390.pptx new file mode 100644 index 0000000000..e28a785595 Binary files /dev/null and b/sd/qa/unit/data/pptx/n828390.pptx differ diff --git a/sd/qa/unit/data/pptx/n828390_2.pptx b/sd/qa/unit/data/pptx/n828390_2.pptx new file mode 100644 index 0000000000..e30948fd73 Binary files /dev/null and b/sd/qa/unit/data/pptx/n828390_2.pptx differ diff --git a/sd/qa/unit/data/pptx/n828390_3.pptx b/sd/qa/unit/data/pptx/n828390_3.pptx new file mode 100644 index 0000000000..ad9575858c Binary files /dev/null and b/sd/qa/unit/data/pptx/n828390_3.pptx differ diff --git a/sd/qa/unit/data/pptx/n83889.pptx b/sd/qa/unit/data/pptx/n83889.pptx new file mode 100644 index 0000000000..e2f0b1386b Binary files /dev/null and b/sd/qa/unit/data/pptx/n83889.pptx differ diff --git a/sd/qa/unit/data/pptx/n862510_1.pptx b/sd/qa/unit/data/pptx/n862510_1.pptx new file mode 100644 index 0000000000..2a16a4b663 Binary files /dev/null and b/sd/qa/unit/data/pptx/n862510_1.pptx differ diff --git a/sd/qa/unit/data/pptx/n862510_2.pptx b/sd/qa/unit/data/pptx/n862510_2.pptx new file mode 100644 index 0000000000..b46cea5021 Binary files /dev/null and b/sd/qa/unit/data/pptx/n862510_2.pptx differ diff --git a/sd/qa/unit/data/pptx/n862510_4.pptx b/sd/qa/unit/data/pptx/n862510_4.pptx new file mode 100644 index 0000000000..0a461eee60 Binary files /dev/null and b/sd/qa/unit/data/pptx/n862510_4.pptx differ diff --git a/sd/qa/unit/data/pptx/n90190.pptx b/sd/qa/unit/data/pptx/n90190.pptx new file mode 100644 index 0000000000..caeabe7103 Binary files /dev/null and b/sd/qa/unit/data/pptx/n90190.pptx differ diff --git a/sd/qa/unit/data/pptx/n90223.pptx b/sd/qa/unit/data/pptx/n90223.pptx new file mode 100644 index 0000000000..0a9ee82d8e Binary files /dev/null and b/sd/qa/unit/data/pptx/n90223.pptx differ diff --git a/sd/qa/unit/data/pptx/n90255.pptx b/sd/qa/unit/data/pptx/n90255.pptx new file mode 100644 index 0000000000..2263d89bb1 Binary files /dev/null and b/sd/qa/unit/data/pptx/n90255.pptx differ diff --git a/sd/qa/unit/data/pptx/narration-non-media-shape.pptx b/sd/qa/unit/data/pptx/narration-non-media-shape.pptx new file mode 100644 index 0000000000..e7a527485f Binary files /dev/null and b/sd/qa/unit/data/pptx/narration-non-media-shape.pptx differ diff --git a/sd/qa/unit/data/pptx/narration.pptx b/sd/qa/unit/data/pptx/narration.pptx new file mode 100644 index 0000000000..5226ce6072 Binary files /dev/null and b/sd/qa/unit/data/pptx/narration.pptx differ diff --git a/sd/qa/unit/data/pptx/numfmt.pptx b/sd/qa/unit/data/pptx/numfmt.pptx new file mode 100644 index 0000000000..f855fbbeb1 Binary files /dev/null and b/sd/qa/unit/data/pptx/numfmt.pptx differ diff --git a/sd/qa/unit/data/pptx/ole-emf_min.pptx b/sd/qa/unit/data/pptx/ole-emf_min.pptx new file mode 100644 index 0000000000..0f97208fbe Binary files /dev/null and b/sd/qa/unit/data/pptx/ole-emf_min.pptx differ diff --git a/sd/qa/unit/data/pptx/ole.pptx b/sd/qa/unit/data/pptx/ole.pptx new file mode 100644 index 0000000000..b998e79e0d Binary files /dev/null and b/sd/qa/unit/data/pptx/ole.pptx differ diff --git a/sd/qa/unit/data/pptx/ooxtheme.pptx b/sd/qa/unit/data/pptx/ooxtheme.pptx new file mode 100644 index 0000000000..f0f3f25758 Binary files /dev/null and b/sd/qa/unit/data/pptx/ooxtheme.pptx differ diff --git a/sd/qa/unit/data/pptx/open-as-read-only.pptx b/sd/qa/unit/data/pptx/open-as-read-only.pptx new file mode 100644 index 0000000000..57a4d32de7 Binary files /dev/null and b/sd/qa/unit/data/pptx/open-as-read-only.pptx differ diff --git a/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx b/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx new file mode 100644 index 0000000000..ac1dd074b8 Binary files /dev/null and b/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx differ diff --git a/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx b/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx new file mode 100644 index 0000000000..a6164a227d Binary files /dev/null and b/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx differ diff --git a/sd/qa/unit/data/pptx/pass/.gitignore b/sd/qa/unit/data/pptx/pass/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx b/sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx new file mode 100644 index 0000000000..ee80cbe4eb Binary files /dev/null and b/sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx differ diff --git a/sd/qa/unit/data/pptx/pass/ofz35597-1.pptx b/sd/qa/unit/data/pptx/pass/ofz35597-1.pptx new file mode 100644 index 0000000000..e7fcacc254 Binary files /dev/null and b/sd/qa/unit/data/pptx/pass/ofz35597-1.pptx differ diff --git a/sd/qa/unit/data/pptx/pass/ofz46160-1.pptx b/sd/qa/unit/data/pptx/pass/ofz46160-1.pptx new file mode 100644 index 0000000000..721d1d87d8 Binary files /dev/null and b/sd/qa/unit/data/pptx/pass/ofz46160-1.pptx differ diff --git a/sd/qa/unit/data/pptx/predefined-table-style.pptx b/sd/qa/unit/data/pptx/predefined-table-style.pptx new file mode 100644 index 0000000000..5c3429f9e9 Binary files /dev/null and b/sd/qa/unit/data/pptx/predefined-table-style.pptx differ diff --git a/sd/qa/unit/data/pptx/presetDashDot.pptx b/sd/qa/unit/data/pptx/presetDashDot.pptx new file mode 100644 index 0000000000..ae1525c97b Binary files /dev/null and b/sd/qa/unit/data/pptx/presetDashDot.pptx differ diff --git a/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx b/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx new file mode 100644 index 0000000000..8c3a46c8b9 Binary files /dev/null and b/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx differ diff --git a/sd/qa/unit/data/pptx/shape-blur-effect.pptx b/sd/qa/unit/data/pptx/shape-blur-effect.pptx new file mode 100644 index 0000000000..db304fa653 Binary files /dev/null and b/sd/qa/unit/data/pptx/shape-blur-effect.pptx differ diff --git a/sd/qa/unit/data/pptx/shape-glow-effect.pptx b/sd/qa/unit/data/pptx/shape-glow-effect.pptx new file mode 100644 index 0000000000..6a33aa58ff Binary files /dev/null and b/sd/qa/unit/data/pptx/shape-glow-effect.pptx differ diff --git a/sd/qa/unit/data/pptx/shape-soft-edges.pptx b/sd/qa/unit/data/pptx/shape-soft-edges.pptx new file mode 100644 index 0000000000..cafb8cf4ca Binary files /dev/null and b/sd/qa/unit/data/pptx/shape-soft-edges.pptx differ diff --git a/sd/qa/unit/data/pptx/shape-text-rotate.pptx b/sd/qa/unit/data/pptx/shape-text-rotate.pptx new file mode 100644 index 0000000000..4a433c748d Binary files /dev/null and b/sd/qa/unit/data/pptx/shape-text-rotate.pptx differ diff --git a/sd/qa/unit/data/pptx/slidenum_field.pptx b/sd/qa/unit/data/pptx/slidenum_field.pptx new file mode 100644 index 0000000000..3388568831 Binary files /dev/null and b/sd/qa/unit/data/pptx/slidenum_field.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-accent-process.pptx b/sd/qa/unit/data/pptx/smartart-accent-process.pptx new file mode 100644 index 0000000000..8710e7f170 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-accent-process.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-autoTxRot.pptx b/sd/qa/unit/data/pptx/smartart-autoTxRot.pptx new file mode 100644 index 0000000000..30e69a6de6 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-autoTxRot.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx b/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx new file mode 100644 index 0000000000..e27dbbfd3d Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx b/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx new file mode 100644 index 0000000000..d89f28a21c Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-background.pptx b/sd/qa/unit/data/pptx/smartart-background.pptx new file mode 100644 index 0000000000..beb862dc12 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-background.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-bullet-list.pptx b/sd/qa/unit/data/pptx/smartart-bullet-list.pptx new file mode 100644 index 0000000000..d95bdb7691 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-bullet-list.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-center-cycle.pptx b/sd/qa/unit/data/pptx/smartart-center-cycle.pptx new file mode 100644 index 0000000000..72f3685fb2 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-center-cycle.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-chevron.pptx b/sd/qa/unit/data/pptx/smartart-chevron.pptx new file mode 100644 index 0000000000..883fbeb495 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-chevron.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-children.pptx b/sd/qa/unit/data/pptx/smartart-children.pptx new file mode 100644 index 0000000000..8eca2f21ec Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-children.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-cnt.pptx b/sd/qa/unit/data/pptx/smartart-cnt.pptx new file mode 100644 index 0000000000..4ab27d169a Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-cnt.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx b/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx new file mode 100644 index 0000000000..08d0e6dd02 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx b/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx new file mode 100644 index 0000000000..b2ef58f0bb Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx b/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx new file mode 100644 index 0000000000..fb1cb7ea2c Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-cycle.pptx b/sd/qa/unit/data/pptx/smartart-cycle.pptx new file mode 100644 index 0000000000..bea0524d39 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-cycle.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-data-follow.pptx b/sd/qa/unit/data/pptx/smartart-data-follow.pptx new file mode 100644 index 0000000000..7e906462d0 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-data-follow.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-dir.pptx b/sd/qa/unit/data/pptx/smartart-dir.pptx new file mode 100644 index 0000000000..ab94459d26 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-dir.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-font-size.pptx b/sd/qa/unit/data/pptx/smartart-font-size.pptx new file mode 100644 index 0000000000..253cd4c73b Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-font-size.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx b/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx new file mode 100644 index 0000000000..49b210a38c Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx b/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx new file mode 100644 index 0000000000..cf1a23a615 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-linear-rule.pptx b/sd/qa/unit/data/pptx/smartart-linear-rule.pptx new file mode 100644 index 0000000000..05905299ed Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-linear-rule.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-maxdepth.pptx b/sd/qa/unit/data/pptx/smartart-maxdepth.pptx new file mode 100644 index 0000000000..545d744bd2 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-maxdepth.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx b/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx new file mode 100644 index 0000000000..2917875a00 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-multidirectional.pptx b/sd/qa/unit/data/pptx/smartart-multidirectional.pptx new file mode 100644 index 0000000000..fd723982a6 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-multidirectional.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-org-chart.pptx b/sd/qa/unit/data/pptx/smartart-org-chart.pptx new file mode 100644 index 0000000000..08c9a4fc91 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-org-chart.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-org-chart2.pptx b/sd/qa/unit/data/pptx/smartart-org-chart2.pptx new file mode 100644 index 0000000000..5e2be21679 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-org-chart2.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-picture-strip.pptx b/sd/qa/unit/data/pptx/smartart-picture-strip.pptx new file mode 100644 index 0000000000..bfb8d4f2c1 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-picture-strip.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-preserve.pptx b/sd/qa/unit/data/pptx/smartart-preserve.pptx new file mode 100644 index 0000000000..6108a8c778 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-preserve.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx b/sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx new file mode 100644 index 0000000000..592b26b08b Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-recursion.pptx b/sd/qa/unit/data/pptx/smartart-recursion.pptx new file mode 100644 index 0000000000..205db6b703 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-recursion.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx b/sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx new file mode 100644 index 0000000000..1a6421b9b2 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-rotation.pptx b/sd/qa/unit/data/pptx/smartart-rotation.pptx new file mode 100644 index 0000000000..e938d9a299 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-rotation.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-rotation2.pptx b/sd/qa/unit/data/pptx/smartart-rotation2.pptx new file mode 100644 index 0000000000..e1c4493a74 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-rotation2.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-snake-rows.pptx b/sd/qa/unit/data/pptx/smartart-snake-rows.pptx new file mode 100644 index 0000000000..5ef81dfd30 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-snake-rows.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-tdf134221.pptx b/sd/qa/unit/data/pptx/smartart-tdf134221.pptx new file mode 100644 index 0000000000..9dba931cd3 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-tdf134221.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-text.pptx b/sd/qa/unit/data/pptx/smartart-text.pptx new file mode 100644 index 0000000000..9656e4fab6 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-text.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx b/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx new file mode 100644 index 0000000000..923f03c0ee Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx b/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx new file mode 100644 index 0000000000..b67d99e700 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx differ diff --git a/sd/qa/unit/data/pptx/smartart1.pptx b/sd/qa/unit/data/pptx/smartart1.pptx new file mode 100644 index 0000000000..2a8817f158 Binary files /dev/null and b/sd/qa/unit/data/pptx/smartart1.pptx differ diff --git a/sd/qa/unit/data/pptx/standardConnectors.pptx b/sd/qa/unit/data/pptx/standardConnectors.pptx new file mode 100644 index 0000000000..46bb0735f4 Binary files /dev/null and b/sd/qa/unit/data/pptx/standardConnectors.pptx differ diff --git a/sd/qa/unit/data/pptx/table-list.pptx b/sd/qa/unit/data/pptx/table-list.pptx new file mode 100644 index 0000000000..bc5fe7418e Binary files /dev/null and b/sd/qa/unit/data/pptx/table-list.pptx differ diff --git a/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx b/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx new file mode 100644 index 0000000000..c46b7bcee8 Binary files /dev/null and b/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx differ diff --git a/sd/qa/unit/data/pptx/tablescale.pptx b/sd/qa/unit/data/pptx/tablescale.pptx new file mode 100644 index 0000000000..c4d946e5c6 Binary files /dev/null and b/sd/qa/unit/data/pptx/tablescale.pptx differ diff --git a/sd/qa/unit/data/pptx/tcPr-vert-roundtrip.pptx b/sd/qa/unit/data/pptx/tcPr-vert-roundtrip.pptx new file mode 100644 index 0000000000..9600f5ec1d Binary files /dev/null and b/sd/qa/unit/data/pptx/tcPr-vert-roundtrip.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf100065.pptx b/sd/qa/unit/data/pptx/tdf100065.pptx new file mode 100644 index 0000000000..c6125dc6d4 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf100065.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf100926.pptx b/sd/qa/unit/data/pptx/tdf100926.pptx new file mode 100644 index 0000000000..71627394ec Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf100926.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf100926_ODP.pptx b/sd/qa/unit/data/pptx/tdf100926_ODP.pptx new file mode 100644 index 0000000000..71627394ec Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf100926_ODP.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf102261_testParaTabStopDefaultDistance.pptx b/sd/qa/unit/data/pptx/tdf102261_testParaTabStopDefaultDistance.pptx new file mode 100644 index 0000000000..88438d7b54 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf102261_testParaTabStopDefaultDistance.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf103347.pptx b/sd/qa/unit/data/pptx/tdf103347.pptx new file mode 100644 index 0000000000..1207851907 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf103347.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf103473.pptx b/sd/qa/unit/data/pptx/tdf103473.pptx new file mode 100644 index 0000000000..5b31b761d2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf103473.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf103477.pptx b/sd/qa/unit/data/pptx/tdf103477.pptx new file mode 100644 index 0000000000..0ee96462c2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf103477.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf103792.pptx b/sd/qa/unit/data/pptx/tdf103792.pptx new file mode 100644 index 0000000000..e48d25e40a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf103792.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf103800.pptx b/sd/qa/unit/data/pptx/tdf103800.pptx new file mode 100644 index 0000000000..91f8bb719f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf103800.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf103876.pptx b/sd/qa/unit/data/pptx/tdf103876.pptx new file mode 100644 index 0000000000..5eb7e869e2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf103876.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104015.pptx b/sd/qa/unit/data/pptx/tdf104015.pptx new file mode 100644 index 0000000000..f3675f9e88 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104015.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104201.pptx b/sd/qa/unit/data/pptx/tdf104201.pptx new file mode 100644 index 0000000000..99a6532a6f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104201.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104445.pptx b/sd/qa/unit/data/pptx/tdf104445.pptx new file mode 100644 index 0000000000..bee32dc002 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104445.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104722.pptx b/sd/qa/unit/data/pptx/tdf104722.pptx new file mode 100644 index 0000000000..27ea419580 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104722.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104786.pptx b/sd/qa/unit/data/pptx/tdf104786.pptx new file mode 100644 index 0000000000..165b5676e4 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104786.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104788.pptx b/sd/qa/unit/data/pptx/tdf104788.pptx new file mode 100644 index 0000000000..c46fb3da50 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104788.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104789.pptx b/sd/qa/unit/data/pptx/tdf104789.pptx new file mode 100644 index 0000000000..d5ead6a931 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104789.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx b/sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx new file mode 100644 index 0000000000..ac72639efd Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf105150.pptx b/sd/qa/unit/data/pptx/tdf105150.pptx new file mode 100644 index 0000000000..48a2e01dc4 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf105150.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf105739.pptx b/sd/qa/unit/data/pptx/tdf105739.pptx new file mode 100644 index 0000000000..08e26f55a9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf105739.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf106638.pptx b/sd/qa/unit/data/pptx/tdf106638.pptx new file mode 100644 index 0000000000..6a4d7819ee Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf106638.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf106867.pptx b/sd/qa/unit/data/pptx/tdf106867.pptx new file mode 100644 index 0000000000..5bf16d690e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf106867.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf107608.pptx b/sd/qa/unit/data/pptx/tdf107608.pptx new file mode 100644 index 0000000000..52973c8ed5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf107608.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf108926.ppt b/sd/qa/unit/data/pptx/tdf108926.ppt new file mode 100644 index 0000000000..c8455e226e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf108926.ppt differ diff --git a/sd/qa/unit/data/pptx/tdf109067.pptx b/sd/qa/unit/data/pptx/tdf109067.pptx new file mode 100644 index 0000000000..ef213774cb Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf109067.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf109187.pptx b/sd/qa/unit/data/pptx/tdf109187.pptx new file mode 100644 index 0000000000..0fd03c81e6 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf109187.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf111518.pptx b/sd/qa/unit/data/pptx/tdf111518.pptx new file mode 100644 index 0000000000..a0d77617f6 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf111518.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf111786.pptx b/sd/qa/unit/data/pptx/tdf111786.pptx new file mode 100644 index 0000000000..5d8f62b24a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf111786.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf111789.pptx b/sd/qa/unit/data/pptx/tdf111789.pptx new file mode 100644 index 0000000000..32d7d754a0 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf111789.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf111863.pptx b/sd/qa/unit/data/pptx/tdf111863.pptx new file mode 100644 index 0000000000..19579ada5a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf111863.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf111884.pptx b/sd/qa/unit/data/pptx/tdf111884.pptx new file mode 100644 index 0000000000..9d08b668de Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf111884.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112086.pptx b/sd/qa/unit/data/pptx/tdf112086.pptx new file mode 100644 index 0000000000..ba125df454 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112086.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112088.pptx b/sd/qa/unit/data/pptx/tdf112088.pptx new file mode 100644 index 0000000000..5ad58192e5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112088.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112089.pptx b/sd/qa/unit/data/pptx/tdf112089.pptx new file mode 100644 index 0000000000..d0cafcd91c Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112089.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112209.pptx b/sd/qa/unit/data/pptx/tdf112209.pptx new file mode 100644 index 0000000000..80865820df Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112209.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112280.pptx b/sd/qa/unit/data/pptx/tdf112280.pptx new file mode 100644 index 0000000000..39c2aa4cb1 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112280.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112333.pptx b/sd/qa/unit/data/pptx/tdf112333.pptx new file mode 100644 index 0000000000..c381ed8b35 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112333.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112334.pptx b/sd/qa/unit/data/pptx/tdf112334.pptx new file mode 100644 index 0000000000..1e57d41caa Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112334.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf112633.pptx b/sd/qa/unit/data/pptx/tdf112633.pptx new file mode 100644 index 0000000000..b9e0629671 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf112633.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf113163.pptx b/sd/qa/unit/data/pptx/tdf113163.pptx new file mode 100644 index 0000000000..f220eb9402 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf113163.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf113198.pptx b/sd/qa/unit/data/pptx/tdf113198.pptx new file mode 100644 index 0000000000..a541a2b264 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf113198.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf113818-swivel.pptx b/sd/qa/unit/data/pptx/tdf113818-swivel.pptx new file mode 100644 index 0000000000..f39225223a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf113818-swivel.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf113822underline.pptx b/sd/qa/unit/data/pptx/tdf113822underline.pptx new file mode 100644 index 0000000000..2d0d076544 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf113822underline.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf114821.pptx b/sd/qa/unit/data/pptx/tdf114821.pptx new file mode 100644 index 0000000000..3813b06079 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf114821.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx b/sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx new file mode 100644 index 0000000000..e9fcb92d80 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf114848.pptx b/sd/qa/unit/data/pptx/tdf114848.pptx new file mode 100644 index 0000000000..5b8b6c3fad Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf114848.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf114913.pptx b/sd/qa/unit/data/pptx/tdf114913.pptx new file mode 100644 index 0000000000..cf031aba06 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf114913.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf115394-zero.pptx b/sd/qa/unit/data/pptx/tdf115394-zero.pptx new file mode 100644 index 0000000000..e8fb0cfa24 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf115394-zero.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf115394.pptx b/sd/qa/unit/data/pptx/tdf115394.pptx new file mode 100644 index 0000000000..d01c90270f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf115394.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf116350-texteffects.pptx b/sd/qa/unit/data/pptx/tdf116350-texteffects.pptx new file mode 100644 index 0000000000..2a5067ae1a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf116350-texteffects.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf118776.pptx b/sd/qa/unit/data/pptx/tdf118776.pptx new file mode 100644 index 0000000000..8df94522ab Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf118776.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf119015.pptx b/sd/qa/unit/data/pptx/tdf119015.pptx new file mode 100644 index 0000000000..8c2313ad9b Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf119015.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf119087.pptx b/sd/qa/unit/data/pptx/tdf119087.pptx new file mode 100644 index 0000000000..d70bc8b0d4 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf119087.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf119118.pptx b/sd/qa/unit/data/pptx/tdf119118.pptx new file mode 100644 index 0000000000..8eba153282 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf119118.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf119187.pptx b/sd/qa/unit/data/pptx/tdf119187.pptx new file mode 100644 index 0000000000..0c4501abbc Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf119187.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf119649.pptx b/sd/qa/unit/data/pptx/tdf119649.pptx new file mode 100644 index 0000000000..303d4c0ad8 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf119649.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf120028.pptx b/sd/qa/unit/data/pptx/tdf120028.pptx new file mode 100644 index 0000000000..035c367306 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf120028.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf120573.pptx b/sd/qa/unit/data/pptx/tdf120573.pptx new file mode 100644 index 0000000000..3c8070fc99 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf120573.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf123090.pptx b/sd/qa/unit/data/pptx/tdf123090.pptx new file mode 100644 index 0000000000..c219f52de0 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf123090.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf123684.pptx b/sd/qa/unit/data/pptx/tdf123684.pptx new file mode 100644 index 0000000000..8724342275 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf123684.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf124457.pptx b/sd/qa/unit/data/pptx/tdf124457.pptx new file mode 100644 index 0000000000..5ea5173a10 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf124457.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125071.pptx b/sd/qa/unit/data/pptx/tdf125071.pptx new file mode 100644 index 0000000000..42b65ab1f1 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125071.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125346.pptx b/sd/qa/unit/data/pptx/tdf125346.pptx new file mode 100644 index 0000000000..32fbbdf52e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125346.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125346_2.pptx b/sd/qa/unit/data/pptx/tdf125346_2.pptx new file mode 100644 index 0000000000..5322558102 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125346_2.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125360.pptx b/sd/qa/unit/data/pptx/tdf125360.pptx new file mode 100644 index 0000000000..c1a3045bc1 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125360.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125360_1.pptx b/sd/qa/unit/data/pptx/tdf125360_1.pptx new file mode 100644 index 0000000000..cfc5798369 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125360_1.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125360_2.pptx b/sd/qa/unit/data/pptx/tdf125360_2.pptx new file mode 100644 index 0000000000..4f6b16455f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125360_2.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125551.pptx b/sd/qa/unit/data/pptx/tdf125551.pptx new file mode 100644 index 0000000000..fb7c106d20 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125551.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125554.pptx b/sd/qa/unit/data/pptx/tdf125554.pptx new file mode 100644 index 0000000000..b78bc43fa9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125554.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx b/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx new file mode 100644 index 0000000000..28672eb4b7 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf126234.pptx b/sd/qa/unit/data/pptx/tdf126234.pptx new file mode 100644 index 0000000000..7db54f8225 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf126234.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf126324.pptx b/sd/qa/unit/data/pptx/tdf126324.pptx new file mode 100644 index 0000000000..d5540cdc4d Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf126324.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf126741.pptx b/sd/qa/unit/data/pptx/tdf126741.pptx new file mode 100644 index 0000000000..ca74d1c349 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf126741.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf127090.odp b/sd/qa/unit/data/pptx/tdf127090.odp new file mode 100644 index 0000000000..bbdc799585 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf127090.odp differ diff --git a/sd/qa/unit/data/pptx/tdf127129.pptx b/sd/qa/unit/data/pptx/tdf127129.pptx new file mode 100644 index 0000000000..680fcf631b Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf127129.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf127237.pptx b/sd/qa/unit/data/pptx/tdf127237.pptx new file mode 100644 index 0000000000..f63423cd47 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf127237.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf127964.pptx b/sd/qa/unit/data/pptx/tdf127964.pptx new file mode 100644 index 0000000000..89482a4ce9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf127964.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128212.pptx b/sd/qa/unit/data/pptx/tdf128212.pptx new file mode 100644 index 0000000000..52ba8ed0d8 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128212.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128213-shaperot.pptx b/sd/qa/unit/data/pptx/tdf128213-shaperot.pptx new file mode 100644 index 0000000000..4e834bb7c5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128213-shaperot.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128213.pptx b/sd/qa/unit/data/pptx/tdf128213.pptx new file mode 100644 index 0000000000..1f308128c3 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128213.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128550.pptx b/sd/qa/unit/data/pptx/tdf128550.pptx new file mode 100644 index 0000000000..e2be342b2e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128550.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128596.pptx b/sd/qa/unit/data/pptx/tdf128596.pptx new file mode 100644 index 0000000000..62a166308d Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128596.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128684.pptx b/sd/qa/unit/data/pptx/tdf128684.pptx new file mode 100644 index 0000000000..80a5f30568 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128684.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf128952.pptx b/sd/qa/unit/data/pptx/tdf128952.pptx new file mode 100644 index 0000000000..242a3ee9ac Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf128952.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf129372.pptx b/sd/qa/unit/data/pptx/tdf129372.pptx new file mode 100644 index 0000000000..ff172c9cdf Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf129372.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf129686.pptx b/sd/qa/unit/data/pptx/tdf129686.pptx new file mode 100644 index 0000000000..9aeb396f6f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf129686.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf130058.pptx b/sd/qa/unit/data/pptx/tdf130058.pptx new file mode 100644 index 0000000000..cb28109ec7 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf130058.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf131390.pptx b/sd/qa/unit/data/pptx/tdf131390.pptx new file mode 100644 index 0000000000..22069d8164 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf131390.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf131553.pptx b/sd/qa/unit/data/pptx/tdf131553.pptx new file mode 100644 index 0000000000..106067d51d Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf131553.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf131554.pptx b/sd/qa/unit/data/pptx/tdf131554.pptx new file mode 100644 index 0000000000..a65f423add Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf131554.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf131905.pptx b/sd/qa/unit/data/pptx/tdf131905.pptx new file mode 100644 index 0000000000..4d203510f0 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf131905.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf132282.pptx b/sd/qa/unit/data/pptx/tdf132282.pptx new file mode 100644 index 0000000000..cc1d7df4cd Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf132282.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf132302_SmartArt_rightArrow.pptx b/sd/qa/unit/data/pptx/tdf132302_SmartArt_rightArrow.pptx new file mode 100644 index 0000000000..f6cc139d07 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf132302_SmartArt_rightArrow.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf132472.pptx b/sd/qa/unit/data/pptx/tdf132472.pptx new file mode 100644 index 0000000000..e7873dcd50 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf132472.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf134053_dashdot.pptx b/sd/qa/unit/data/pptx/tdf134053_dashdot.pptx new file mode 100644 index 0000000000..f2d951c570 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf134053_dashdot.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf134174.pptx b/sd/qa/unit/data/pptx/tdf134174.pptx new file mode 100644 index 0000000000..ef722dc501 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf134174.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf134210.pptx b/sd/qa/unit/data/pptx/tdf134210.pptx new file mode 100644 index 0000000000..6867ac4801 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf134210.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf134862.pptx b/sd/qa/unit/data/pptx/tdf134862.pptx new file mode 100644 index 0000000000..b92acfc3e2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf134862.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf135843.pptx b/sd/qa/unit/data/pptx/tdf135843.pptx new file mode 100644 index 0000000000..0a5dcb334b Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf135843.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf135843_export.pptx b/sd/qa/unit/data/pptx/tdf135843_export.pptx new file mode 100644 index 0000000000..c07b0e0dfa Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf135843_export.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf135843_insideH.pptx b/sd/qa/unit/data/pptx/tdf135843_insideH.pptx new file mode 100644 index 0000000000..9b7864adb3 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf135843_insideH.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf135953_SmartArt_textposition.pptx b/sd/qa/unit/data/pptx/tdf135953_SmartArt_textposition.pptx new file mode 100644 index 0000000000..a2399431c3 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf135953_SmartArt_textposition.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf136830.pptx b/sd/qa/unit/data/pptx/tdf136830.pptx new file mode 100644 index 0000000000..b9ca658992 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf136830.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf137367.pptx b/sd/qa/unit/data/pptx/tdf137367.pptx new file mode 100644 index 0000000000..cf6aa086d9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf137367.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf137675.pptx b/sd/qa/unit/data/pptx/tdf137675.pptx new file mode 100644 index 0000000000..d4d767aa52 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf137675.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf138148.pptx b/sd/qa/unit/data/pptx/tdf138148.pptx new file mode 100644 index 0000000000..76237c602c Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf138148.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf140714.pptx b/sd/qa/unit/data/pptx/tdf140714.pptx new file mode 100644 index 0000000000..6f5e98ec66 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf140714.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf140852.pptx b/sd/qa/unit/data/pptx/tdf140852.pptx new file mode 100644 index 0000000000..1332b5a68c Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf140852.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx b/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx new file mode 100644 index 0000000000..e55bc43800 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf141058-1.pptx b/sd/qa/unit/data/pptx/tdf141058-1.pptx new file mode 100644 index 0000000000..a93bf88242 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf141058-1.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf141704.pptx b/sd/qa/unit/data/pptx/tdf141704.pptx new file mode 100644 index 0000000000..2aef7c3f9e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf141704.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf142590.pptx b/sd/qa/unit/data/pptx/tdf142590.pptx new file mode 100644 index 0000000000..ecc131c2a0 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf142590.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf142645.pptx b/sd/qa/unit/data/pptx/tdf142645.pptx new file mode 100644 index 0000000000..e57bd9ee17 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf142645.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf142648.pptx b/sd/qa/unit/data/pptx/tdf142648.pptx new file mode 100644 index 0000000000..fc470530fc Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf142648.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf142716.pptx b/sd/qa/unit/data/pptx/tdf142716.pptx new file mode 100644 index 0000000000..4ef29e3894 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf142716.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf142913.pptx b/sd/qa/unit/data/pptx/tdf142913.pptx new file mode 100644 index 0000000000..4fd938de1e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf142913.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf142915.pptx b/sd/qa/unit/data/pptx/tdf142915.pptx new file mode 100644 index 0000000000..889a08fd50 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf142915.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf143126.pptx b/sd/qa/unit/data/pptx/tdf143126.pptx new file mode 100644 index 0000000000..f5799b60f2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf143126.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf143129.pptx b/sd/qa/unit/data/pptx/tdf143129.pptx new file mode 100644 index 0000000000..77377c212b Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf143129.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf143222.pptx b/sd/qa/unit/data/pptx/tdf143222.pptx new file mode 100644 index 0000000000..63938d1bdc Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf143222.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf143624.pptx b/sd/qa/unit/data/pptx/tdf143624.pptx new file mode 100644 index 0000000000..1eed8fedaa Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf143624.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx b/sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx new file mode 100644 index 0000000000..5d75c87d52 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx b/sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx new file mode 100644 index 0000000000..949a0561b2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf144616.pptx b/sd/qa/unit/data/pptx/tdf144616.pptx new file mode 100644 index 0000000000..bb153dcff9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf144616.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf144917.pptx b/sd/qa/unit/data/pptx/tdf144917.pptx new file mode 100644 index 0000000000..654b17a432 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf144917.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf144918.pptx b/sd/qa/unit/data/pptx/tdf144918.pptx new file mode 100644 index 0000000000..54f862bd1b Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf144918.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf145162.pptx b/sd/qa/unit/data/pptx/tdf145162.pptx new file mode 100644 index 0000000000..3746740f32 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf145162.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf145528_SmartArt_Matrix.pptx b/sd/qa/unit/data/pptx/tdf145528_SmartArt_Matrix.pptx new file mode 100644 index 0000000000..0758fedb15 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf145528_SmartArt_Matrix.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf146223.pptx b/sd/qa/unit/data/pptx/tdf146223.pptx new file mode 100644 index 0000000000..73d5eea144 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf146223.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf146731.pptx b/sd/qa/unit/data/pptx/tdf146731.pptx new file mode 100644 index 0000000000..3862e45461 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf146731.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf147121.pptx b/sd/qa/unit/data/pptx/tdf147121.pptx new file mode 100644 index 0000000000..5762a4b921 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf147121.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf147459.pptx b/sd/qa/unit/data/pptx/tdf147459.pptx new file mode 100644 index 0000000000..ef71ec94d5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf147459.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf147586.pptx b/sd/qa/unit/data/pptx/tdf147586.pptx new file mode 100644 index 0000000000..723facf820 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf147586.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf148665.pptx b/sd/qa/unit/data/pptx/tdf148665.pptx new file mode 100644 index 0000000000..c358387c12 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf148665.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf148685.pptx b/sd/qa/unit/data/pptx/tdf148685.pptx new file mode 100644 index 0000000000..80af5a9bbf Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf148685.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf148810_PARA_OUTLLEVEL.pptx b/sd/qa/unit/data/pptx/tdf148810_PARA_OUTLLEVEL.pptx new file mode 100644 index 0000000000..b2f4a13da5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf148810_PARA_OUTLLEVEL.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf148921.pptx b/sd/qa/unit/data/pptx/tdf148921.pptx new file mode 100644 index 0000000000..51add90aff Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf148921.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf148965.pptx b/sd/qa/unit/data/pptx/tdf148965.pptx new file mode 100644 index 0000000000..5b7b9f098d Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf148965.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf148966.pptx b/sd/qa/unit/data/pptx/tdf148966.pptx new file mode 100644 index 0000000000..d6c77f9125 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf148966.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149124.pptx b/sd/qa/unit/data/pptx/tdf149124.pptx new file mode 100644 index 0000000000..9c43c43ce0 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149124.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149206.pptx b/sd/qa/unit/data/pptx/tdf149206.pptx new file mode 100644 index 0000000000..ec39ec635c Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149206.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149314.pptx b/sd/qa/unit/data/pptx/tdf149314.pptx new file mode 100644 index 0000000000..3138c1ddaf Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149314.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149551_SmartArt_Gear.pptx b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Gear.pptx new file mode 100644 index 0000000000..cf549d4f72 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Gear.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149551_SmartArt_Pie.pptx b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Pie.pptx new file mode 100644 index 0000000000..c1354a951c Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Pie.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149551_SmartArt_Pyramid.pptx b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Pyramid.pptx new file mode 100644 index 0000000000..fa1783f211 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Pyramid.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149551_SmartArt_Venn.pptx b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Venn.pptx new file mode 100644 index 0000000000..02783e9e08 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149551_SmartArt_Venn.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx b/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx new file mode 100644 index 0000000000..8967590b92 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149697.pptx b/sd/qa/unit/data/pptx/tdf149697.pptx new file mode 100644 index 0000000000..b8209e360a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149697.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149785.pptx b/sd/qa/unit/data/pptx/tdf149785.pptx new file mode 100644 index 0000000000..9b969af171 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149785.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149803.pptx b/sd/qa/unit/data/pptx/tdf149803.pptx new file mode 100644 index 0000000000..a3a16cc23f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149803.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx b/sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx new file mode 100644 index 0000000000..25513df7c9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf149985.pptx b/sd/qa/unit/data/pptx/tdf149985.pptx new file mode 100644 index 0000000000..fedc3234a1 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf149985.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf150719.pptx b/sd/qa/unit/data/pptx/tdf150719.pptx new file mode 100644 index 0000000000..d8aedf6b75 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf150719.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf150770.pptx b/sd/qa/unit/data/pptx/tdf150770.pptx new file mode 100644 index 0000000000..72a2dc322e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf150770.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf151134.odp b/sd/qa/unit/data/pptx/tdf151134.odp new file mode 100644 index 0000000000..56ea86a314 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf151134.odp differ diff --git a/sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx b/sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx new file mode 100644 index 0000000000..1bb723c2af Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf151767.pptx b/sd/qa/unit/data/pptx/tdf151767.pptx new file mode 100644 index 0000000000..689a641701 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf151767.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf152070.pptx b/sd/qa/unit/data/pptx/tdf152070.pptx new file mode 100644 index 0000000000..c98116c187 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf152070.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf152186.pptx b/sd/qa/unit/data/pptx/tdf152186.pptx new file mode 100644 index 0000000000..c4160f2091 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf152186.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf152335.pptx b/sd/qa/unit/data/pptx/tdf152335.pptx new file mode 100644 index 0000000000..03c8612bb5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf152335.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf152434.pptx b/sd/qa/unit/data/pptx/tdf152434.pptx new file mode 100644 index 0000000000..f0716a92fe Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf152434.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf152606.pptx b/sd/qa/unit/data/pptx/tdf152606.pptx new file mode 100644 index 0000000000..6b4c756d11 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf152606.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf153008-srcRect-smallNegBound.pptx b/sd/qa/unit/data/pptx/tdf153008-srcRect-smallNegBound.pptx new file mode 100644 index 0000000000..9870e3f2e2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf153008-srcRect-smallNegBound.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx b/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx new file mode 100644 index 0000000000..e9a3199b4a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf153466.pptx b/sd/qa/unit/data/pptx/tdf153466.pptx new file mode 100644 index 0000000000..8900083ba7 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf153466.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf154363.pptx b/sd/qa/unit/data/pptx/tdf154363.pptx new file mode 100644 index 0000000000..b549fda901 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf154363.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf156649.pptx b/sd/qa/unit/data/pptx/tdf156649.pptx new file mode 100644 index 0000000000..2b3b12a9a0 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf156649.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf156808.pptx b/sd/qa/unit/data/pptx/tdf156808.pptx new file mode 100644 index 0000000000..34256151b6 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf156808.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf156829.pptx b/sd/qa/unit/data/pptx/tdf156829.pptx new file mode 100644 index 0000000000..4235883772 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf156829.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf156856.pptx b/sd/qa/unit/data/pptx/tdf156856.pptx new file mode 100644 index 0000000000..a4624adbce Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf156856.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf157635.pptx b/sd/qa/unit/data/pptx/tdf157635.pptx new file mode 100644 index 0000000000..8612f13717 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf157635.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf157740.pptx b/sd/qa/unit/data/pptx/tdf157740.pptx new file mode 100644 index 0000000000..009e9eeb1d Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf157740.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf157793.pptx b/sd/qa/unit/data/pptx/tdf157793.pptx new file mode 100644 index 0000000000..b1c4f200b8 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf157793.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf44223.pptx b/sd/qa/unit/data/pptx/tdf44223.pptx new file mode 100644 index 0000000000..6f0af688c2 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf44223.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf50499.pptx b/sd/qa/unit/data/pptx/tdf50499.pptx new file mode 100644 index 0000000000..2cdcbfa984 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf50499.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf51340.pptx b/sd/qa/unit/data/pptx/tdf51340.pptx new file mode 100644 index 0000000000..090ea1be18 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf51340.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf54037.pptx b/sd/qa/unit/data/pptx/tdf54037.pptx new file mode 100644 index 0000000000..a6120619c4 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf54037.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf59323.pptx b/sd/qa/unit/data/pptx/tdf59323.pptx new file mode 100644 index 0000000000..0660c0af4f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf59323.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf62255.pptx b/sd/qa/unit/data/pptx/tdf62255.pptx new file mode 100644 index 0000000000..fc06a9ea7b Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf62255.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf65724.pptx b/sd/qa/unit/data/pptx/tdf65724.pptx new file mode 100644 index 0000000000..fef2d9f2dd Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf65724.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf79007.pptx b/sd/qa/unit/data/pptx/tdf79007.pptx new file mode 100644 index 0000000000..65e94f1a9d Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf79007.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf79082.pptx b/sd/qa/unit/data/pptx/tdf79082.pptx new file mode 100644 index 0000000000..8dcf4ff0a9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf79082.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf84205.pptx b/sd/qa/unit/data/pptx/tdf84205.pptx new file mode 100644 index 0000000000..211cea6d02 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf84205.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf89064.pptx b/sd/qa/unit/data/pptx/tdf89064.pptx new file mode 100644 index 0000000000..312496f79a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf89064.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf89449.pptx b/sd/qa/unit/data/pptx/tdf89449.pptx new file mode 100644 index 0000000000..e55cbf21a9 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf89449.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf89927.pptx b/sd/qa/unit/data/pptx/tdf89927.pptx new file mode 100644 index 0000000000..c71e557025 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf89927.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx b/sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx new file mode 100644 index 0000000000..90edf8ea0a Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf90626.pptx b/sd/qa/unit/data/pptx/tdf90626.pptx new file mode 100644 index 0000000000..ef31fc92f1 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf90626.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf91060.pptx b/sd/qa/unit/data/pptx/tdf91060.pptx new file mode 100644 index 0000000000..8ed2d41452 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf91060.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf91378.pptx b/sd/qa/unit/data/pptx/tdf91378.pptx new file mode 100644 index 0000000000..361be2c9a5 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf91378.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx b/sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx new file mode 100644 index 0000000000..7559597b74 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf92222.pptx b/sd/qa/unit/data/pptx/tdf92222.pptx new file mode 100644 index 0000000000..60ec3b886f Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf92222.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf93097.pptx b/sd/qa/unit/data/pptx/tdf93097.pptx new file mode 100644 index 0000000000..687110db35 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf93097.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf93830.pptx b/sd/qa/unit/data/pptx/tdf93830.pptx new file mode 100644 index 0000000000..8415daff35 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf93830.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf93868.pptx b/sd/qa/unit/data/pptx/tdf93868.pptx new file mode 100644 index 0000000000..f54fb0496e Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf93868.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf94238.pptx b/sd/qa/unit/data/pptx/tdf94238.pptx new file mode 100644 index 0000000000..6f61cc5b43 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf94238.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf95932.pptx b/sd/qa/unit/data/pptx/tdf95932.pptx new file mode 100644 index 0000000000..5e22b11581 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf95932.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf96061.pptx b/sd/qa/unit/data/pptx/tdf96061.pptx new file mode 100644 index 0000000000..c6e6aa5ae1 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf96061.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf98477grow.pptx b/sd/qa/unit/data/pptx/tdf98477grow.pptx new file mode 100644 index 0000000000..5761c7b079 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf98477grow.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf98603.pptx b/sd/qa/unit/data/pptx/tdf98603.pptx new file mode 100644 index 0000000000..92c7177215 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf98603.pptx differ diff --git a/sd/qa/unit/data/pptx/tdf99030.pptx b/sd/qa/unit/data/pptx/tdf99030.pptx new file mode 100644 index 0000000000..38448f93fe Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf99030.pptx differ diff --git a/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx b/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx new file mode 100644 index 0000000000..d681c749ca Binary files /dev/null and b/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx differ diff --git a/sd/qa/unit/data/pptx/tdt142291.pptx b/sd/qa/unit/data/pptx/tdt142291.pptx new file mode 100644 index 0000000000..eb5a17eebe Binary files /dev/null and b/sd/qa/unit/data/pptx/tdt142291.pptx differ diff --git a/sd/qa/unit/data/pptx/testShapeAutofit.pptx b/sd/qa/unit/data/pptx/testShapeAutofit.pptx new file mode 100644 index 0000000000..fd402c01c8 Binary files /dev/null and b/sd/qa/unit/data/pptx/testShapeAutofit.pptx differ diff --git a/sd/qa/unit/data/pptx/trigger.pptx b/sd/qa/unit/data/pptx/trigger.pptx new file mode 100644 index 0000000000..fdfb397402 Binary files /dev/null and b/sd/qa/unit/data/pptx/trigger.pptx differ diff --git a/sd/qa/unit/data/pptx/vertical-bracket-list.pptx b/sd/qa/unit/data/pptx/vertical-bracket-list.pptx new file mode 100644 index 0000000000..bef9d7481d Binary files /dev/null and b/sd/qa/unit/data/pptx/vertical-bracket-list.pptx differ diff --git a/sd/qa/unit/data/smoketest.pptx b/sd/qa/unit/data/smoketest.pptx new file mode 100644 index 0000000000..e0cfe49009 Binary files /dev/null and b/sd/qa/unit/data/smoketest.pptx differ diff --git a/sd/qa/unit/data/strict_ooxml.pptx b/sd/qa/unit/data/strict_ooxml.pptx new file mode 100644 index 0000000000..534b483ff4 Binary files /dev/null and b/sd/qa/unit/data/strict_ooxml.pptx differ diff --git a/sd/qa/unit/data/svg/test.svg b/sd/qa/unit/data/svg/test.svg new file mode 100644 index 0000000000..74e01e644a --- /dev/null +++ b/sd/qa/unit/data/svg/test.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + C + l + i + c + k + + t + o + + e + d + i + t + + t + h + e + + t + i + t + l + e + + t + e + x + t + + f + o + r + m + a + t + + + + + + + + + + + H + e + l + l + o + + + + + + + + + R + a + d + e + k + s + k + i + + : + - + ) + + + + + + + + + + + + . + . + . + + + + + + diff --git a/sd/qa/unit/data/sxi/ooo41061-1.sxi b/sd/qa/unit/data/sxi/ooo41061-1.sxi new file mode 100644 index 0000000000..4c2482a586 Binary files /dev/null and b/sd/qa/unit/data/sxi/ooo41061-1.sxi differ diff --git a/sd/qa/unit/data/tdf100491.pptx b/sd/qa/unit/data/tdf100491.pptx new file mode 100644 index 0000000000..d25388d236 Binary files /dev/null and b/sd/qa/unit/data/tdf100491.pptx differ diff --git a/sd/qa/unit/data/tdf101242_ODF.odg b/sd/qa/unit/data/tdf101242_ODF.odg new file mode 100644 index 0000000000..98934c7f7c Binary files /dev/null and b/sd/qa/unit/data/tdf101242_ODF.odg differ diff --git a/sd/qa/unit/data/tdf101242_settings.odg b/sd/qa/unit/data/tdf101242_settings.odg new file mode 100644 index 0000000000..5bea0d072d Binary files /dev/null and b/sd/qa/unit/data/tdf101242_settings.odg differ diff --git a/sd/qa/unit/data/tdf109317.pptx b/sd/qa/unit/data/tdf109317.pptx new file mode 100644 index 0000000000..427108069b Binary files /dev/null and b/sd/qa/unit/data/tdf109317.pptx differ diff --git a/sd/qa/unit/data/tdf111522.odp b/sd/qa/unit/data/tdf111522.odp new file mode 100644 index 0000000000..fd6ebeb6ed Binary files /dev/null and b/sd/qa/unit/data/tdf111522.odp differ diff --git a/sd/qa/unit/data/tdf112126.odg b/sd/qa/unit/data/tdf112126.odg new file mode 100644 index 0000000000..f291a3910f Binary files /dev/null and b/sd/qa/unit/data/tdf112126.odg differ diff --git a/sd/qa/unit/data/tdf119392_InsertLayer.odg b/sd/qa/unit/data/tdf119392_InsertLayer.odg new file mode 100644 index 0000000000..617624ce9b Binary files /dev/null and b/sd/qa/unit/data/tdf119392_InsertLayer.odg differ diff --git a/sd/qa/unit/data/tdf119956.odg b/sd/qa/unit/data/tdf119956.odg new file mode 100644 index 0000000000..eb1104035f Binary files /dev/null and b/sd/qa/unit/data/tdf119956.odg differ diff --git a/sd/qa/unit/data/tdf120527.jpg b/sd/qa/unit/data/tdf120527.jpg new file mode 100644 index 0000000000..12b393569e Binary files /dev/null and b/sd/qa/unit/data/tdf120527.jpg differ diff --git a/sd/qa/unit/data/tdf123841.odg b/sd/qa/unit/data/tdf123841.odg new file mode 100644 index 0000000000..a92477e83a Binary files /dev/null and b/sd/qa/unit/data/tdf123841.odg differ diff --git a/sd/qa/unit/data/tdf124708.ppt b/sd/qa/unit/data/tdf124708.ppt new file mode 100644 index 0000000000..6d29e1acbf Binary files /dev/null and b/sd/qa/unit/data/tdf124708.ppt differ diff --git a/sd/qa/unit/data/tdf126197.odp b/sd/qa/unit/data/tdf126197.odp new file mode 100644 index 0000000000..cbe5b07446 Binary files /dev/null and b/sd/qa/unit/data/tdf126197.odp differ diff --git a/sd/qa/unit/data/tdf128651_CustomShapeUndo.odp b/sd/qa/unit/data/tdf128651_CustomShapeUndo.odp new file mode 100644 index 0000000000..9e820da094 Binary files /dev/null and b/sd/qa/unit/data/tdf128651_CustomShapeUndo.odp differ diff --git a/sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp b/sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp new file mode 100644 index 0000000000..796b57b2cb Binary files /dev/null and b/sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp differ diff --git a/sd/qa/unit/data/tdf130988_3D_create_lathe.odg b/sd/qa/unit/data/tdf130988_3D_create_lathe.odg new file mode 100644 index 0000000000..e2b37ef602 Binary files /dev/null and b/sd/qa/unit/data/tdf130988_3D_create_lathe.odg differ diff --git a/sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg b/sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg new file mode 100644 index 0000000000..f6cfc96e6b Binary files /dev/null and b/sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg differ diff --git a/sd/qa/unit/data/tdf131269.ppt b/sd/qa/unit/data/tdf131269.ppt new file mode 100644 index 0000000000..480691d3b7 Binary files /dev/null and b/sd/qa/unit/data/tdf131269.ppt differ diff --git a/sd/qa/unit/data/tdf143412.svg b/sd/qa/unit/data/tdf143412.svg new file mode 100644 index 0000000000..147830f83c --- /dev/null +++ b/sd/qa/unit/data/tdf143412.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/data/tdf154989.odg b/sd/qa/unit/data/tdf154989.odg new file mode 100644 index 0000000000..5bc7e83042 Binary files /dev/null and b/sd/qa/unit/data/tdf154989.odg differ diff --git a/sd/qa/unit/data/tdf67248.odg b/sd/qa/unit/data/tdf67248.odg new file mode 100644 index 0000000000..03417effa6 Binary files /dev/null and b/sd/qa/unit/data/tdf67248.odg differ diff --git a/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg b/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg new file mode 100644 index 0000000000..12efa023b3 --- /dev/null +++ b/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg @@ -0,0 +1,407 @@ + + + + 2020-02-17T15:21:21.9272561422020-02-17T16:18:41.297941901PT17M53S8LibreOfficeDev/7.0.0.0.alpha0$Linux_X86_64 LibreOffice_project/76fec020a99a41a06176307cb2c31f9494867dd0 + + + 19876 + 6602 + 3646 + 3659 + + + view1 + false + false + true + true + false + false + false + false + true + 1500 + false + Hw== + Hw== + + false + true + true + 0 + 0 + true + true + true + 4 + 0 + 20184 + 6885 + 3052 + 3063 + 1000 + 1000 + 100 + 100 + 1000 + 10 + 1000 + 10 + false + 1500 + false + false + + + + + true + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sob + 0 + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soc + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sod + 1250 + true + true + false + true + false + + + en + GB + + + + + + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sog + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soh + false + false + true + true + false + false + true + false + false + false + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soe + false + 3 + 4 + false + 0 + low-resolution + Boomaga + false + lwH+/0Jvb21hZ2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpCb29tYWdhAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAuAAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9Qm9vbWFnYQpvcmllbnRhdGlvbj1Qb3J0cmFpdApjb3BpZXM9MQpjb2xsYXRlPWZhbHNlCm1hcmdpbmRhanVzdG1lbnQ9MCwwLDAsMApjb2xvcmRlcHRoPTI0CnBzbGV2ZWw9MApwZGZkZXZpY2U9MQpjb2xvcmRldmljZT0wClBQRENvbnRleERhdGEKRHVwbGV4Ok5vbmUAUGFnZVNpemU6QTQAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmY= + true + false + 1 + 1 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Subscript shouldn’t drop below descender: qp + + Superscript shouldn’t raise above ascender: dL + + + + + Text with aSubscript + Text with aSubscript + Text with aSubscript + Text with aSubscript + Text with aSubscript + Text with aSubscript + A normal line of text + A normal line of text + A normal line of text + A normal line of text + A normal line of text + A normal line of text + Text with aSubscript + Text with aSubscript + Text with aSubscript + Text with aSubscript + Text with aSubscript + Text with aSuperscript + Text with aSuperscript + Text with aSuperscript + The spacing between all of these rows should be identical. There should not be big gaps caused by default subscripts or superscripts. + + + + + + diff --git a/sd/qa/unit/data/tdf90338.odp b/sd/qa/unit/data/tdf90338.odp new file mode 100644 index 0000000000..55739bb989 Binary files /dev/null and b/sd/qa/unit/data/tdf90338.odp differ diff --git a/sd/qa/unit/data/tdf90403.pptx b/sd/qa/unit/data/tdf90403.pptx new file mode 100644 index 0000000000..fd48d058a2 Binary files /dev/null and b/sd/qa/unit/data/tdf90403.pptx differ diff --git a/sd/qa/unit/data/tdf92001.odp b/sd/qa/unit/data/tdf92001.odp new file mode 100644 index 0000000000..886826f0b7 Binary files /dev/null and b/sd/qa/unit/data/tdf92001.odp differ diff --git a/sd/qa/unit/data/tdf97808.fodp b/sd/qa/unit/data/tdf97808.fodp new file mode 100644 index 0000000000..ac2d3e2d8c --- /dev/null +++ b/sd/qa/unit/data/tdf97808.fodp @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/tdf98839_ShearVFlipH.odg b/sd/qa/unit/data/tdf98839_ShearVFlipH.odg new file mode 100644 index 0000000000..88763f8d3c Binary files /dev/null and b/sd/qa/unit/data/tdf98839_ShearVFlipH.odg differ diff --git a/sd/qa/unit/data/tdf99396.odp b/sd/qa/unit/data/tdf99396.odp new file mode 100644 index 0000000000..636260020c Binary files /dev/null and b/sd/qa/unit/data/tdf99396.odp differ diff --git a/sd/qa/unit/data/theme.pptx b/sd/qa/unit/data/theme.pptx new file mode 100644 index 0000000000..08e4a3b6f1 Binary files /dev/null and b/sd/qa/unit/data/theme.pptx differ diff --git a/sd/qa/unit/data/tolerance.xml b/sd/qa/unit/data/tolerance.xml new file mode 100644 index 0000000000..167dfb61b8 --- /dev/null +++ b/sd/qa/unit/data/tolerance.xml @@ -0,0 +1,3 @@ + + + diff --git a/sd/qa/unit/data/transparent-text.fodg b/sd/qa/unit/data/transparent-text.fodg new file mode 100644 index 0000000000..697f2a22b8 --- /dev/null +++ b/sd/qa/unit/data/transparent-text.fodg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + asdf + + + + + + diff --git a/sd/qa/unit/data/underline.fodp b/sd/qa/unit/data/underline.fodp new file mode 100644 index 0000000000..6fe945b3fc --- /dev/null +++ b/sd/qa/unit/data/underline.fodp @@ -0,0 +1,754 @@ + + + + 2022-04-21T09:59:24.3609835462022-04-21T10:00:11.300414659PT47S1LibreOfficeDev/7.4.0.0.alpha0$Linux_X86_64 LibreOffice_project/795a39cc0b0e640863503d4b7b1dfdc4fcd7c6a4 + + + -30780 + -441 + 29545 + 77170 + + + view1 + false + false + true + true + true + true + false + false + true + 1500 + false + Hw== + Hw== + + false + true + false + 0 + 0 + false + true + true + 4 + 0 + -30780 + -441 + 29546 + 77171 + 2000 + 2000 + 500 + 500 + 2000 + 4 + 2000 + 4 + false + 1500 + true + false + + + + + true + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sob + 0 + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soc + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sod + 1250 + true + true + false + true + false + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sog + true + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soh + 0 + false + false + true + true + false + true + false + false + true + false + false + false + false + false + $(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soe + false + 4 + false + 0 + low-resolution + Generic Printer + false + lAH+/0dlbmVyaWMgUHJpbnRlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0dFTlBSVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAtQAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9R2VuZXJpYyBQcmludGVyCm9yaWVudGF0aW9uPVBvcnRyYWl0CmNvcGllcz0xCmNvbGxhdGU9ZmFsc2UKbWFyZ2luYWRqdXN0bWVudD0wLDAsMCwwCmNvbG9yZGVwdGg9MjQKcHNsZXZlbD0wCnBkZmRldmljZT0xCmNvbG9yZGV2aWNlPTAKUFBEQ29udGV4dERhdGEKUGFnZVNpemU6QTQAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmY= + true + false + 6 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + Test + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/data/unknown-attribute.fodp b/sd/qa/unit/data/unknown-attribute.fodp new file mode 100644 index 0000000000..3aa39b6666 --- /dev/null +++ b/sd/qa/unit/data/unknown-attribute.fodp @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/fdo47434_0.xml b/sd/qa/unit/data/xml/fdo47434_0.xml new file mode 100644 index 0000000000..24dc470056 --- /dev/null +++ b/sd/qa/unit/data/xml/fdo47434_0.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/fdo64586_0.xml b/sd/qa/unit/data/xml/fdo64586_0.xml new file mode 100644 index 0000000000..cdabdd2119 --- /dev/null +++ b/sd/qa/unit/data/xml/fdo64586_0.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/fdo71434_0.xml b/sd/qa/unit/data/xml/fdo71434_0.xml new file mode 100644 index 0000000000..0ec2570dcb --- /dev/null +++ b/sd/qa/unit/data/xml/fdo71434_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n593612_0.xml b/sd/qa/unit/data/xml/n593612_0.xml new file mode 100644 index 0000000000..3f5f88e445 --- /dev/null +++ b/sd/qa/unit/data/xml/n593612_0.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n758621_0.xml b/sd/qa/unit/data/xml/n758621_0.xml new file mode 100644 index 0000000000..3284a1da87 --- /dev/null +++ b/sd/qa/unit/data/xml/n758621_0.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n758621_1.xml b/sd/qa/unit/data/xml/n758621_1.xml new file mode 100644 index 0000000000..5d24431bed --- /dev/null +++ b/sd/qa/unit/data/xml/n758621_1.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n762695_0.xml b/sd/qa/unit/data/xml/n762695_0.xml new file mode 100644 index 0000000000..59b226e0d5 --- /dev/null +++ b/sd/qa/unit/data/xml/n762695_0.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n762695_1.xml b/sd/qa/unit/data/xml/n762695_1.xml new file mode 100644 index 0000000000..02d3b735da --- /dev/null +++ b/sd/qa/unit/data/xml/n762695_1.xml @@ -0,0 +1,632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n819614_0.xml b/sd/qa/unit/data/xml/n819614_0.xml new file mode 100644 index 0000000000..c889b00c34 --- /dev/null +++ b/sd/qa/unit/data/xml/n819614_0.xml @@ -0,0 +1,6613 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n820786_0.xml b/sd/qa/unit/data/xml/n820786_0.xml new file mode 100644 index 0000000000..1dedb61faa --- /dev/null +++ b/sd/qa/unit/data/xml/n820786_0.xml @@ -0,0 +1,3216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/n902652_0.xml b/sd/qa/unit/data/xml/n902652_0.xml new file mode 100644 index 0000000000..34a18af57f --- /dev/null +++ b/sd/qa/unit/data/xml/n902652_0.xml @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page0.xml b/sd/qa/unit/data/xml/shapes-test_page0.xml new file mode 100644 index 0000000000..60afef2807 --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page0.xml @@ -0,0 +1,1666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page1.xml b/sd/qa/unit/data/xml/shapes-test_page1.xml new file mode 100644 index 0000000000..344342bc4a --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page1.xml @@ -0,0 +1,2426 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page2.xml b/sd/qa/unit/data/xml/shapes-test_page2.xml new file mode 100644 index 0000000000..e9f3139fdd --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page2.xml @@ -0,0 +1,3104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page3.xml b/sd/qa/unit/data/xml/shapes-test_page3.xml new file mode 100644 index 0000000000..4b06ff3d13 --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page3.xml @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page4.xml b/sd/qa/unit/data/xml/shapes-test_page4.xml new file mode 100644 index 0000000000..3557b10381 --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page4.xml @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page5.xml b/sd/qa/unit/data/xml/shapes-test_page5.xml new file mode 100644 index 0000000000..cb0ae47243 --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page5.xml @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page6.xml b/sd/qa/unit/data/xml/shapes-test_page6.xml new file mode 100644 index 0000000000..45ef536763 --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page6.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sd/qa/unit/data/xml/shapes-test_page7.xml b/sd/qa/unit/data/xml/shapes-test_page7.xml new file mode 100644 index 0000000000..2ebed128b5 --- /dev/null +++ b/sd/qa/unit/data/xml/shapes-test_page7.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/tdf100491_0.xml b/sd/qa/unit/data/xml/tdf100491_0.xml new file mode 100644 index 0000000000..e45eba130e --- /dev/null +++ b/sd/qa/unit/data/xml/tdf100491_0.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/tdf109317_0.xml b/sd/qa/unit/data/xml/tdf109317_0.xml new file mode 100644 index 0000000000..745ffff59e --- /dev/null +++ b/sd/qa/unit/data/xml/tdf109317_0.xml @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/tdf90338_0.xml b/sd/qa/unit/data/xml/tdf90338_0.xml new file mode 100644 index 0000000000..741d6ca080 --- /dev/null +++ b/sd/qa/unit/data/xml/tdf90338_0.xml @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/data/xml/tdf90403_0.xml b/sd/qa/unit/data/xml/tdf90403_0.xml new file mode 100644 index 0000000000..297504d4be --- /dev/null +++ b/sd/qa/unit/data/xml/tdf90403_0.xml @@ -0,0 +1,4 @@ + + + + diff --git a/sd/qa/unit/data/xml/tdf92001_0.xml b/sd/qa/unit/data/xml/tdf92001_0.xml new file mode 100644 index 0000000000..d67952eb1f --- /dev/null +++ b/sd/qa/unit/data/xml/tdf92001_0.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/dialogs-test.cxx b/sd/qa/unit/dialogs-test.cxx new file mode 100644 index 0000000000..45bdcaef9d --- /dev/null +++ b/sd/qa/unit/dialogs-test.cxx @@ -0,0 +1,616 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +/// Test opening a dialog in sd +class SdDialogsTest : public ScreenshotTest +{ +private: + /// Document and ComponentContext + uno::Reference mxComponent; + + /// initially created SdAbstractDialogFactory and pointer to document + SdAbstractDialogFactory* mpFact; + SdXImpressDocument* mpImpressDocument; + + /// on-demand created instances required for various dialogs to open + ::sd::DrawDocShell* mpDocShell; + ::sd::ViewShell* mpViewShell; + ::sd::DrawView* mpDrawView; + + std::unique_ptr mpSfxItemSetFromSdrObject; + std::unique_ptr mpEmptySfxItemSet; + std::unique_ptr mpEmptyFillStyleSfxItemSet; + + /// helpers + SdAbstractDialogFactory* getSdAbstractDialogFactory(); + SdXImpressDocument* getSdXImpressDocument(); + ::sd::DrawDocShell* getDocShell(); + ::sd::ViewShell* getViewShell(); + ::sd::DrawView* getDrawView(); + const SfxItemSet& getSfxItemSetFromSdrObject(); + const SfxItemSet& getEmptySfxItemSet(); + const SfxItemSet& getEmptyFillStyleSfxItemSet(); + + /// helper method to populate KnownDialogs, called in setUp(). Needs to be + /// written and has to add entries to KnownDialogs + virtual void registerKnownDialogsByID(mapType& rKnownDialogs) override; + + /// dialog creation for known dialogs by ID. Has to be implemented for + /// each registered known dialog + virtual VclPtr createDialogByID(sal_uInt32 nID) override; + +public: + SdDialogsTest(); + + virtual void setUp() override; + + void tearDown() override; + + // try to open a dialog + void openAnyDialog(); + + CPPUNIT_TEST_SUITE(SdDialogsTest); + CPPUNIT_TEST(openAnyDialog); + CPPUNIT_TEST_SUITE_END(); +}; + +SdDialogsTest::SdDialogsTest() +: mxComponent(), + mpFact(nullptr), + mpImpressDocument(nullptr), + mpDocShell(nullptr), + mpViewShell(nullptr), + mpDrawView(nullptr) +{ +} + +void SdDialogsTest::setUp() +{ + ScreenshotTest::setUp(); + + mpFact = SdAbstractDialogFactory::Create(); + mxComponent = loadFromDesktop("private:factory/simpress", "com.sun.star.presentation.PresentationDocument"); + + mpImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(mpImpressDocument); +} + +void SdDialogsTest::tearDown() +{ + mpSfxItemSetFromSdrObject.reset(); + mpEmptySfxItemSet.reset(); + mpEmptyFillStyleSfxItemSet.reset(); + mxComponent->dispose(); + ScreenshotTest::tearDown(); +} + +SdAbstractDialogFactory* SdDialogsTest::getSdAbstractDialogFactory() +{ + return mpFact; +} + +SdXImpressDocument* SdDialogsTest::getSdXImpressDocument() +{ + return mpImpressDocument; +} + +::sd::DrawDocShell* SdDialogsTest::getDocShell() +{ + if (!mpDocShell) + { + mpDocShell = getSdXImpressDocument()->GetDocShell(); + CPPUNIT_ASSERT(mpDocShell); + } + + return mpDocShell; +} + +::sd::ViewShell* SdDialogsTest::getViewShell() +{ + if (!mpViewShell) + { + mpViewShell = getDocShell()->GetViewShell(); + CPPUNIT_ASSERT(mpViewShell); + } + + return mpViewShell; +} + +::sd::DrawView* SdDialogsTest::getDrawView() +{ + if (!mpDrawView) + { + mpDrawView = dynamic_cast<::sd::DrawView*>(getViewShell()->GetDrawView()); + CPPUNIT_ASSERT(mpDrawView); + } + + return mpDrawView; +} + +const SfxItemSet& SdDialogsTest::getSfxItemSetFromSdrObject() +{ + if (!mpSfxItemSetFromSdrObject) + { + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard); + CPPUNIT_ASSERT(pSdPage); + SdrObject* pSdrObj = pSdPage->GetObj(0); + CPPUNIT_ASSERT(pSdrObj); + mpSfxItemSetFromSdrObject.reset( new SfxItemSet( pSdrObj->GetMergedItemSet() ) ); + CPPUNIT_ASSERT(mpSfxItemSetFromSdrObject); + } + + return *mpSfxItemSetFromSdrObject; +} + +const SfxItemSet& SdDialogsTest::getEmptySfxItemSet() +{ + if (!mpEmptySfxItemSet) + { + // needs an SfxItemSet, use the one from the 1st object + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + mpEmptySfxItemSet.reset( new SfxItemSet(pDrawDoc->GetItemPool()) ); + CPPUNIT_ASSERT(mpEmptySfxItemSet); + } + + return *mpEmptySfxItemSet; +} + +const SfxItemSet& SdDialogsTest::getEmptyFillStyleSfxItemSet() +{ + if (!mpEmptyFillStyleSfxItemSet) + { + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + mpEmptyFillStyleSfxItemSet.reset( new SfxItemSet(pDrawDoc->GetItemPool(), svl::Items) ); + CPPUNIT_ASSERT(mpEmptyFillStyleSfxItemSet); + mpEmptyFillStyleSfxItemSet->Put(XFillStyleItem(drawing::FillStyle_NONE)); + } + + return *mpEmptyFillStyleSfxItemSet; +} + +void SdDialogsTest::registerKnownDialogsByID(mapType& rKnownDialogs) +{ + // fill map of known dialogs + rKnownDialogs["modules/sdraw/ui/breakdialog.ui"_ostr] = 0; + rKnownDialogs["modules/sdraw/ui/copydlg.ui"_ostr] = 1; + rKnownDialogs["modules/simpress/ui/customslideshows.ui"_ostr] = 2; + rKnownDialogs["modules/sdraw/ui/drawchardialog.ui"_ostr] = 3; + rKnownDialogs["modules/sdraw/ui/drawpagedialog.ui"_ostr] = 4; + rKnownDialogs["modules/simpress/ui/dlgfield.ui"_ostr] = 5; + rKnownDialogs["modules/sdraw/ui/dlgsnap.ui"_ostr] = 6; + rKnownDialogs["modules/sdraw/ui/insertlayer.ui"_ostr] = 7; + rKnownDialogs["modules/sdraw/ui/insertslidesdialog.ui"_ostr] = 8; + rKnownDialogs["modules/sdraw/ui/crossfadedialog.ui"_ostr] = 9; + rKnownDialogs["modules/sdraw/ui/bulletsandnumbering.ui"_ostr] = 10; + rKnownDialogs["modules/sdraw/ui/drawparadialog.ui"_ostr] = 11; + rKnownDialogs["modules/simpress/ui/presentationdialog.ui"_ostr] = 12; + rKnownDialogs["modules/simpress/ui/remotedialog.ui"_ostr] = 13; + rKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"_ostr] = 14; + rKnownDialogs["modules/simpress/ui/slidedesigndialog.ui"_ostr] = 15; + rKnownDialogs["modules/simpress/ui/templatedialog.ui"_ostr] = 16; + rKnownDialogs["modules/simpress/ui/interactiondialog.ui"_ostr] = 17; + rKnownDialogs["modules/sdraw/ui/vectorize.ui"_ostr] = 18; + rKnownDialogs["modules/simpress/ui/photoalbum.ui"_ostr] = 19; + rKnownDialogs["modules/simpress/ui/masterlayoutdlg.ui"_ostr] = 20; + rKnownDialogs["modules/simpress/ui/headerfooterdialog.ui"_ostr] = 21; +} + +VclPtr SdDialogsTest::createDialogByID(sal_uInt32 nID) +{ + VclPtr pRetval; + + if (getSdAbstractDialogFactory()) + { + switch (nID) + { + case 0: + { + // CreateBreakDlg(weld::Window* pWindow, ::sd::DrawView* pDrView, ::sd::DrawDocShell* pShell, sal_uLong nSumActionCount, sal_uLong nObjCount) override; + // this dialog requires pDrawView. It does not show much when + // there is no object selected that can be broken up. For better + // results it might be necessary to add/select an object that + // delivers a good metafile (which is the base for breaking) + pRetval = getSdAbstractDialogFactory()->CreateBreakDlg( + Application::GetDefDialogParent(), + getDrawView(), + getDocShell(), + 0, + 0); + break; + } + case 1: + { + // needs an SfxItemSet, use the one from the 1st object + pRetval = getSdAbstractDialogFactory()->CreateCopyDlg( + getViewShell()->GetFrameWeld(), + getSfxItemSetFromSdrObject(), + getDrawView()); + break; + } + case 2: + { + // CreateSdCustomShowDlg(SdDrawDocument& rDrawDoc) = 0; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + + pRetval = getSdAbstractDialogFactory()->CreateSdCustomShowDlg( + getViewShell()->GetFrameWeld(), *pDrawDoc); + break; + } + case 3: + { + // CreateSdTabCharDialog(const SfxItemSet* pAttr, SfxObjectShell* pDocShell) override; + // needs an SfxItemSet, use an empty constructed one + // needs a 'SfxObjectShell* pDocShell', crashes without + pRetval = getSdAbstractDialogFactory()->CreateSdTabCharDialog( + getViewShell()->GetFrameWeld(), + &getEmptySfxItemSet(), + getDocShell()); + break; + } + case 4: + { + // CreateSdTabPageDialog(const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage = true, bool bIsImpressDoc) override; + // needs a special SfxItemSet with merged content from page and other stuff, crashes without that (2nd page) + // needs a 'SfxObjectShell* pDocShell', crashes without. Also sufficient: FillStyleItemSet with XFILL_NONE set + pRetval = getSdAbstractDialogFactory()->CreateSdTabPageDialog( + getViewShell()->GetFrameWeld(), + &getEmptyFillStyleSfxItemSet(), + getDocShell(), + true, /*bIsImpressDoc=*/false); + break; + } + case 5: + { + // CreateSdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) override; + pRetval = getSdAbstractDialogFactory()->CreateSdModifyFieldDlg( + getViewShell()->GetFrameWeld(), + nullptr, + getEmptySfxItemSet()); + break; + } + case 6: + { + // CreateSdSnapLineDlg(const SfxItemSet& rInAttrs, ::sd::View* pView) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SfxItemSet aNewAttr(pDrawDoc->GetItemPool(), svl::Items); + aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_X, 0)); + aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_Y, 0)); + pRetval = getSdAbstractDialogFactory()->CreateSdSnapLineDlg( + getViewShell()->GetFrameWeld(), + aNewAttr, + getDrawView()); + break; + } + case 7: + { + // CreateSdInsertLayerDlg(const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SfxItemSet aNewAttr(pDrawDoc->GetItemPool(), svl::Items); + const OUString aLayerName = SdResId(STR_LAYER); // + OUString::number(2); + aNewAttr.Put(makeSdAttrLayerName(aLayerName)); + aNewAttr.Put(makeSdAttrLayerTitle()); + aNewAttr.Put(makeSdAttrLayerDesc()); + aNewAttr.Put(makeSdAttrLayerVisible()); + aNewAttr.Put(makeSdAttrLayerPrintable()); + aNewAttr.Put(makeSdAttrLayerLocked()); + aNewAttr.Put(makeSdAttrLayerThisPage()); + pRetval = getSdAbstractDialogFactory()->CreateSdInsertLayerDlg( + getViewShell()->GetFrameWeld(), + aNewAttr, + true, // alternative: false + SdResId(STR_INSERTLAYER) /* alternative: STR_MODIFYLAYER */); + break; + } + case 8: + { + // CreateSdInsertPagesObjsDlg(const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + pRetval = getSdAbstractDialogFactory()->CreateSdInsertPagesObjsDlg( + getViewShell()->GetFrameWeld(), + pDrawDoc, + nullptr, + "foo"); + break; + } + case 9: + { + // CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard); + CPPUNIT_ASSERT(pSdPage); + SdrObject* pSdrObj = pSdPage->GetObj(0); + // using one SdrObject is okay, none crashes + CPPUNIT_ASSERT(pSdrObj); + pRetval = getSdAbstractDialogFactory()->CreateMorphDlg( + Application::GetDefDialogParent(), + pSdrObj, + pSdrObj); + break; + } + case 10: + { + // CreateSdOutlineBulletTabDlg(const SfxItemSet* pAttr, ::sd::View* pView = nullptr) override; + pRetval = getSdAbstractDialogFactory()->CreateSdOutlineBulletTabDlg( + Application::GetDefDialogParent(), + &getEmptySfxItemSet(), + getDrawView()); + break; + } + case 11: + { + // CreateSdParagraphTabDlg(const SfxItemSet* pAttr) override; + pRetval = getSdAbstractDialogFactory()->CreateSdParagraphTabDlg( + getViewShell()->GetFrameWeld(), + &getEmptySfxItemSet()); + break; + } + case 12: + { + // CreateSdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, const std::vector &rPageNames, SdCustomShowList* pCSList) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SfxItemSet aDlgSet(pDrawDoc->GetItemPool(), svl::Items); + ::sd::PresentationSettings& rPresentationSettings = pDrawDoc->getPresentationSettings(); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ALL, rPresentationSettings.mbAll)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_CUSTOMSHOW, rPresentationSettings.mbCustomShow)); + aDlgSet.Put(SfxStringItem(ATTR_PRESENT_DIANAME, OUString())); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ENDLESS, rPresentationSettings.mbEndless)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_MANUEL, rPresentationSettings.mbManual)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_MOUSE, rPresentationSettings.mbMouseVisible)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_PEN, rPresentationSettings.mbMouseAsPen)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ANIMATION_ALLOWED, rPresentationSettings.mbAnimationAllowed)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_CHANGE_PAGE, !rPresentationSettings.mbLockedPages)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ALWAYS_ON_TOP, rPresentationSettings.mbAlwaysOnTop)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_FULLSCREEN, rPresentationSettings.mbFullScreen)); + aDlgSet.Put(SfxUInt32Item(ATTR_PRESENT_PAUSE_TIMEOUT, rPresentationSettings.mnPauseTimeout)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_SHOW_PAUSELOGO, rPresentationSettings.mbShowPauseLogo)); + //SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + aDlgSet.Put(SfxInt32Item(ATTR_PRESENT_DISPLAY, 0 /*pOptions->GetDisplay()*/)); + pRetval = getSdAbstractDialogFactory()->CreateSdStartPresentationDlg( + Application::GetDefDialogParent(), + aDlgSet, + std::vector(), + nullptr); + break; + } + case 13: + { + // CreateRemoteDialog(vcl::Window* pWindow) override; // ad for RemoteDialog + pRetval = getSdAbstractDialogFactory()->CreateRemoteDialog( + Application::GetDefDialogParent()); + break; + } + case 14: + { + // CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, const SdResId& DlgId, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) override; + // use STR_PSEUDOSHEET_TITLE configuration, see futempl.cxx for more possible configurations + // may be nicer on the long run to take a configuration which represents a selected SdrObject + SfxStyleSheetBasePool* pStyleSheetPool = getDocShell()->GetStyleSheetPool(); + CPPUNIT_ASSERT(pStyleSheetPool); + SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->First(SfxStyleFamily::Page); + CPPUNIT_ASSERT(pStyleSheet); + pRetval = getSdAbstractDialogFactory()->CreateSdPresLayoutTemplateDlg( + getDocShell(), + Application::GetDefDialogParent(), + false, + *pStyleSheet, + PresentationObjects::Title, + pStyleSheetPool); + break; + } + case 15: + { + // CreateSdPresLayoutDlg(::sd::DrawDocShell* pDocShell, vcl::Window* pWindow, const SfxItemSet& rInAttrs) override; + pRetval = getSdAbstractDialogFactory()->CreateSdPresLayoutDlg( + Application::GetDefDialogParent(), + getDocShell(), + getEmptySfxItemSet()); + break; + } + case 16: + { + // CreateSdTabTemplateDlg(const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView) override; + // pretty similar to CreateSdPresLayoutTemplateDlg, see above + // may be nicer on the long run to take a configuration which represents a selected SdrObject + SfxStyleSheetBasePool* pStyleSheetPool = getDocShell()->GetStyleSheetPool(); + CPPUNIT_ASSERT(pStyleSheetPool); + SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->First(SfxStyleFamily::Pseudo); + CPPUNIT_ASSERT(pStyleSheet); + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + pRetval = getSdAbstractDialogFactory()->CreateSdTabTemplateDlg( + getViewShell()->GetFrameWeld(), + getDocShell(), + *pStyleSheet, + pDrawDoc, + getDrawView()); + break; + } + case 17: + { + // CreatSdActionDialog(const SfxItemSet* pAttr, ::sd::View* pView) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SfxItemSet aSet(pDrawDoc->GetItemPool(), svl::Items); + aSet.Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, false)); + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE))); + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, sal_uInt16(presentation::AnimationEffect_NONE))); + aSet.InvalidateItem(ATTR_ANIMATION_SPEED); + aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, false)); + aSet.Put(SvxColorItem(COL_LIGHTGRAY, ATTR_ANIMATION_COLOR)); + aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, false)); + aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, false)); + aSet.InvalidateItem(ATTR_ANIMATION_SOUNDFILE); + aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, false)); + aSet.Put(SfxUInt16Item(ATTR_ACTION, sal_uInt16(presentation::ClickAction_NONE))); + aSet.InvalidateItem(ATTR_ACTION_FILENAME); + aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE))); + aSet.InvalidateItem(ATTR_ACTION_EFFECTSPEED); + aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, false)); + aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, false)); + pRetval = getSdAbstractDialogFactory()->CreatSdActionDialog( + getViewShell()->GetFrameWeld(), + &aSet, + getDrawView()); + break; + } + case 18: + { + // CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) override; + // works well with empty Bitmap, but my be nicer with setting one + Bitmap aEmptyBitmap; + pRetval = getSdAbstractDialogFactory()->CreateSdVectorizeDlg( + Application::GetDefDialogParent(), + aEmptyBitmap, + getDocShell()); + break; + } + case 19: + { + // CreateSdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pDoc) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + pRetval = getSdAbstractDialogFactory()->CreateSdPhotoAlbumDialog( + Application::GetDefDialogParent(), + pDrawDoc); + break; + } + case 20: + { + // CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage*) override; + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard); + CPPUNIT_ASSERT(pSdPage); + pRetval = getSdAbstractDialogFactory()->CreateMasterLayoutDialog( + Application::GetDefDialogParent(), + pDrawDoc, + pSdPage); + break; + } + case 21: + { + // CreateHeaderFooterDialog(sd::ViewShell* pViewShell, weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) override; + // This is a hard case, for two reasons: + // - It uses BaseClass TabPage which has a very sparse interface, + // need to add 'Screenshot interface' there and implement + // - The concrete dialog has two TabPages which use the *same* + // .ui file, so extended markup will be needed to differ these two + // cases + SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); + CPPUNIT_ASSERT(pDrawDoc); + SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard); + CPPUNIT_ASSERT(pSdPage); + pRetval = getSdAbstractDialogFactory()->CreateHeaderFooterDialog( + getViewShell(), + Application::GetDefDialogParent(), + pDrawDoc, + pSdPage); + break; + } + default: + break; + } + } + + return pRetval; +} + +void SdDialogsTest::openAnyDialog() +{ + /// example how to process an input file containing the UXMLDescriptions of the dialogs + /// to dump + if (true) + { + processDialogBatchFile(u"sd/qa/unit/data/dialogs-test.txt"); + } + + /// example how to dump all known dialogs + if ((false)) + { + processAllKnownDialogs(); + } + + /// example how to dump exactly one known dialog + if ((false)) + { + // example for SfxTabDialog: 5 -> "modules/sdraw/ui/drawpagedialog.ui" + // example for TabDialog: 22 -> "modules/simpress/ui/headerfooterdialog.ui" + ScopedVclPtr pDlg(createDialogByID(5)); + + if (pDlg) + { + // known dialog, dump screenshot to path + dumpDialogToPath(*pDlg); + } + else + { + // unknown dialog, should not happen in this basic loop. + // You have probably forgotten to add a case and + // implementation to createDialogByID, please do this + } + } + + /// example how to dump a dialog using fallback functionality + if ((false)) + { + // unknown dialog, try fallback to generic created + // VclBuilder-generated instance. Keep in mind that Dialogs + // using this mechanism will probably not be layouted well + // since the setup/initialization part is missing. Thus, + // only use for fallback when only the UI file is available. + // + // Take any example here, it's only for demonstration - using + // even a known one to demonstrate the fallback possibility + dumpDialogToPath("modules/sdraw/ui/breakdialog.ui"); + } +} + +CPPUNIT_TEST_SUITE_REGISTRATION(SdDialogsTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx new file mode 100644 index 0000000000..9f87fd5d92 --- /dev/null +++ b/sd/qa/unit/export-tests-ooxml1.cxx @@ -0,0 +1,1708 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include "sdmodeltestbase.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace css; + +class SdOOXMLExportTest1 : public SdModelTestBase +{ +public: + SdOOXMLExportTest1() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +namespace +{ +template +void checkFontAttributes(const SdrTextObj* pObj, ItemValue nVal, sal_uInt32 nId) +{ + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + const EditTextObject& aEdit = pObj->GetOutlinerParaObject()->GetTextObject(); + std::vector rLst; + aEdit.GetCharAttribs(0, rLst); + for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); ++it) + { + const ItemType* pAttrib = dynamic_cast((*it).pAttr); + if (pAttrib && pAttrib->Which() == nId) + { + CPPUNIT_ASSERT_EQUAL(nVal, static_cast(pAttrib->GetValue())); + } + } +} +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf152335) +{ + createSdImpressDoc("pptx/tdf152335.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocTheme = parseExport("ppt/theme/theme1.xml"); + assertXPathChildren( + pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:effectStyleLst/a:effectStyle[3]"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149803) +{ + createSdImpressDoc("pptx/tdf149803.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp"_ostr, "useBgFill"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149311) +{ + createSdImpressDoc("odp/tdf149311.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); + + assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "slide2.xml"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf149128) +{ + createSdImpressDoc("odp/tdf149128.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, + "id"_ostr, "8"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, + "idx"_ostr, "0"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn"_ostr, + "id"_ostr, "9"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn"_ostr, + "idx"_ostr, "2"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf66228) +{ + createSdImpressDoc("odp/tdf66228.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "bentConnector3"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf147919) +{ + createSdImpressDoc("odp/tdf147919.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "bentConnector2"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:prstGeom/a:avLst/a:gd"_ostr, + "name"_ostr, "adj1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "bentConnector3"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "16200000"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, + "name"_ostr, "adj1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, + "name"_ostr, "adj2"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "bentConnector4"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm"_ostr, "flipV"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "10800000"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, + "name"_ostr, "adj1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, + "name"_ostr, "adj2"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[3]"_ostr, + "name"_ostr, "adj3"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "bentConnector5"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "16200000"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "curvedConnector2"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "16200000"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:prstGeom/a:avLst/a:gd"_ostr, + "name"_ostr, "adj1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "curvedConnector3"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm"_ostr, "flipV"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "10800000"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, + "name"_ostr, "adj1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, + "name"_ostr, "adj2"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "curvedConnector4"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:xfrm"_ostr, "flipV"_ostr, "1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "16200000"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[1]"_ostr, + "name"_ostr, "adj1"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[2]"_ostr, + "name"_ostr, "adj2"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[3]"_ostr, + "name"_ostr, "adj3"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "curvedConnector5"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf130165) +{ + createSdImpressDoc("pptx/tdf146223.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld"_ostr, "showMasterSp"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf124781) +{ + createSdImpressDoc("odp/tdf124781.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:r[2]/a:rPr"_ostr, + "baseline"_ostr, "33000"); + + xmlDocUniquePtr pXmlDoc2 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:r[2]/a:rPr"_ostr, + "baseline"_ostr, "-8000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf144914) +{ + createSdImpressDoc("pptx/tdf144616.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=firstslide"); + + xmlDocUniquePtr pXmlDoc2 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=lastslide"); + + xmlDocUniquePtr pXmlDoc3 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=nextslide"); + + xmlDocUniquePtr pXmlDoc4 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=previousslide"); + + xmlDocUniquePtr pXmlDoc5 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc5, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinksldjump"); + xmlDocUniquePtr pRelsDoc5 = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath(pRelsDoc5, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "slide2.xml"); + + xmlDocUniquePtr pXmlDoc6 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc6, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=endshow"); + + xmlDocUniquePtr pXmlDoc7 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc7, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:nvSpPr/p:cNvPr/a:hlinkClick"_ostr, + "id"_ostr, "rId2"); + xmlDocUniquePtr pRelsDoc7 = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath(pRelsDoc7, "/rels:Relationships/rels:Relationship[@Id='rId2']"_ostr, "Target"_ostr, + "http://www.example.com/"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf124232) +{ + createSdImpressDoc("pptx/tdf141704.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=lastslide"); + + xmlDocUniquePtr pXmlDoc2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=nextslide"); + + xmlDocUniquePtr pXmlDoc3 = parseExport("ppt/slides/slide3.xml"); + assertXPath(pXmlDoc3, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=previousslide"); + + xmlDocUniquePtr pXmlDoc4 = parseExport("ppt/slides/slide4.xml"); + assertXPath(pXmlDoc4, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "id"_ostr, "rId1"); + xmlDocUniquePtr pRelsDoc4 = parseExport("ppt/slides/_rels/slide4.xml.rels"); + assertXPath(pRelsDoc4, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "http://www.example.com/"); + + xmlDocUniquePtr pXmlDoc5 = parseExport("ppt/slides/slide5.xml"); + assertXPath(pXmlDoc5, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinksldjump"); + xmlDocUniquePtr pRelsDoc5 = parseExport("ppt/slides/_rels/slide5.xml.rels"); + assertXPath(pRelsDoc5, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "slide6.xml"); + + xmlDocUniquePtr pXmlDoc6 = parseExport("ppt/slides/slide6.xml"); + assertXPath(pXmlDoc6, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=endshow"); + + xmlDocUniquePtr pXmlDoc7 = parseExport("ppt/slides/slide7.xml"); + assertXPath(pXmlDoc7, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=firstslide"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf143624) +{ + createSdImpressDoc("pptx/tdf143624.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); + + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "useTimings"_ostr, "0"); + + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf142648) +{ + createSdImpressDoc("pptx/tdf142648.pptx"); + + uno::Reference xDPS(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xDrawPages(xDPS->getDrawPages(), uno::UNO_SET_THROW); + uno::Reference xDrawPage; + xDrawPages->getByIndex(0) >>= xDrawPage; + uno::Reference xNamed(xDrawPage, uno::UNO_QUERY_THROW); + xNamed->setName("#Slide 1"); + + save("Impress Office Open XML"); + + xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide2.xml.rels"); + + assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "slide1.xml"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf47365) +{ + createSdImpressDoc("pptx/loopNoPause.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); + + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "loop"_ostr, "1"); + + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf125071) +{ + createSdImpressDoc("pptx/tdf125071.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/presentation.xml"); + + assertXPath(pXmlDoc, "/p:presentation/p:custShowLst/p:custShow[1]"_ostr, "name"_ostr, + "Custom1"); + assertXPath(pXmlDoc, "/p:presentation/p:custShowLst/p:custShow[2]"_ostr, "name"_ostr, + "Custom2"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf54037) +{ + createSdImpressDoc("pptx/tdf54037.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:r/a:rPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinksldjump"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:r/a:rPr/a:hlinkClick"_ostr, + "action"_ostr, "ppaction://hlinkshowjump?jump=nextslide"); + + assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "slide2.xml"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf127237) +{ + createSdImpressDoc("pptx/tdf127237.pptx"); + saveAndReload("impress8"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT(pPage != nullptr); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj != nullptr); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + + Color nFillColor; + uno::Reference xCell(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x0070C0), nFillColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc887230) +{ + createSdImpressDoc("pptx/bnc887230.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0)); + // Without the fix in place, this test would have failed with + //- Expected: 255 + //- Actual : 13421823 + checkFontAttributes(pObj, Color(0x0000ff), EE_CHAR_COLOR); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc870233_1) +{ + createSdImpressDoc("pptx/bnc870233_1.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + // The problem was all shapes had the same font (the last parsed font attributes overwrote all previous ones) + + // First shape has red, bold font + { + const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0)); + checkFontAttributes(pObj, Color(0xff0000), EE_CHAR_COLOR); + checkFontAttributes(pObj, WEIGHT_BOLD, EE_CHAR_WEIGHT); + } + + // Second shape has blue, italic font + { + const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(1)); + checkFontAttributes(pObj, Color(0x0000ff), EE_CHAR_COLOR); + checkFontAttributes(pObj, ITALIC_NORMAL, EE_CHAR_ITALIC); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc870233_2) +{ + createSdImpressDoc("pptx/bnc870233_2.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + // The problem was in some SmartArts font color was wrong + + // First smart art has blue font color (direct formatting) + { + const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pObjGroup); + const SdrTextObj* pObj = DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1)); + checkFontAttributes(pObj, Color(0x0000ff), EE_CHAR_COLOR); + } + + // Second smart art has "dk2" font color (style) + { + const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(1)); + CPPUNIT_ASSERT(pObjGroup); + const SdrTextObj* pObj = DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1)); + checkFontAttributes(pObj, Color(0x1f497d), EE_CHAR_COLOR); + } + + // Third smart art has white font color (style) + { + const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT(pObjGroup); + const SdrTextObj* pObj = DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1)); + checkFontAttributes(pObj, Color(0xffffff), EE_CHAR_COLOR); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testN828390_4) +{ + bool bPassed = false; + createSdImpressDoc("n828390_4.odp"); + + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + { + std::vector rLst; + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + aEdit.GetCharAttribs(0, rLst); + for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); + ++it) + { + const SvxFontHeightItem* pFontHeight + = dynamic_cast((*it).pAttr); + if (pFontHeight && (*it).nStart == 18) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font height is wrong", static_cast(1129), + pFontHeight->GetHeight()); + const SvxFontItem* pFont = dynamic_cast((*it).pAttr); + if (pFont) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font is wrong", OUString("Arial"), + pFont->GetFamilyName()); + bPassed = true; + } + const SvxWeightItem* pWeight = dynamic_cast((*it).pAttr); + if (pWeight && (*it).nStart == 18) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font Weight is wrong", WEIGHT_BOLD, + pWeight->GetWeight()); + } + } + CPPUNIT_ASSERT(bPassed); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testN828390_5) +{ + createSdImpressDoc("n828390_5.odp"); + + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + { + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem& rNumFmt = aEdit.GetParaAttribs(3).Get(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's relative size is wrong!", sal_uInt16(75), + rNumFmt.GetNumRule().GetLevel(1).GetBulletRelSize()); // != 25 + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testLostPlaceholders) +{ + createSdImpressDoc("pptx/LostPlaceholder.odp"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT(pDoc); + auto pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT(pPage); + auto pObj = pPage->GetObj(1); + CPPUNIT_ASSERT(pObj); + uno::Reference xShp(pObj->getUnoShape(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShp); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Wrong ShapeType!", u"com.sun.star.presentation.OutlinerShape"_ustr, xShp->getShapeType()); + uno::Reference xShpProps(xShp, uno::UNO_QUERY); + // Without the fix in place there will be the following error: + // Expected: com.sun.star.presentation.OutlinerShape + // Actual: com.sun.star.drawing.CustomShape + + CPPUNIT_ASSERT_EQUAL_MESSAGE("It must be a placeholder!", true, + xShpProps->getPropertyValue("IsPresentationObject").get()); + // Without the fix in place this will the following: + // Expected: true + // Actual: false +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testPlaceholderFillAndOutlineExport) +{ + createSdImpressDoc("pptx/LostPlaceholderFill.odp"); + + uno::Any aFillStyle; + uno::Any aFillColor; + uno::Any aLineStyle; + uno::Any aLineColor; + + for (int i = 1; i <= 2; i++) + { + SdXImpressDocument* pXImpressDocument + = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT(pDoc); + auto pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT(pPage); + auto pObj = pPage->GetObj(1); + CPPUNIT_ASSERT(pObj); + + uno::Reference xShp(pObj->getUnoShape(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShp); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong ShapeType!", + u"com.sun.star.presentation.OutlinerShape"_ustr, + xShp->getShapeType()); + uno::Reference xShpProps(xShp, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "It must be a placeholder!", true, + xShpProps->getPropertyValue("IsPresentationObject").get()); + + if (i == 1) + { + aFillStyle = xShpProps->getPropertyValue("FillStyle"); + aFillColor = xShpProps->getPropertyValue("FillColor"); + + aLineStyle = xShpProps->getPropertyValue("LineStyle"); + aLineColor = xShpProps->getPropertyValue("LineColor"); + + saveAndReload("Impress Office Open XML"); + continue; + } + else + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder fillstyle has not been exported!", + aFillStyle, xShpProps->getPropertyValue("FillStyle")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder fillcolor has not been exported!", + aFillColor, xShpProps->getPropertyValue("FillColor")); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder linestyle has not been exported!", + aLineStyle, xShpProps->getPropertyValue("LineStyle")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder linecolor has not been exported!", + aLineColor, xShpProps->getPropertyValue("LineColor")); + break; + } + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo71961) +{ + createSdImpressDoc("fdo71961.odp"); + + saveAndReload("Impress Office Open XML"); + const SdrPage* pPage = GetPage(1); + + // Export to .pptx changes all text frames to custom shape objects, which obey TextWordWrap property + // (which is false for text frames otherwise and is ignored). Check that frames that should wrap still do. + auto pTxtObj = pPage->GetObj(1); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT_EQUAL(OUString("Text to be always wrapped"), + pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0)); + CPPUNIT_ASSERT_EQUAL(true, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue()); + + pTxtObj = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT_EQUAL(OUString("Custom shape non-wrapped text"), + pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0)); + CPPUNIT_ASSERT_EQUAL(false, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue()); + + pTxtObj = dynamic_cast(pPage->GetObj(3)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT_EQUAL(OUString("Custom shape wrapped text"), + pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0)); + CPPUNIT_ASSERT_EQUAL(true, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testN828390) +{ + bool bPassed = false; + createSdImpressDoc("pptx/n828390.pptx"); + + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + { + std::vector rLst; + // Get the object + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + aEdit.GetCharAttribs(0, rLst); + bPassed = std::any_of(rLst.rbegin(), rLst.rend(), [](const EECharAttrib& rCharAttr) { + const SvxEscapementItem* pFontEscapement + = dynamic_cast(rCharAttr.pAttr); + return pFontEscapement && (pFontEscapement->GetEsc() == -25); + }); + } + CPPUNIT_ASSERT_MESSAGE("Subscript not exported properly", bPassed); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc880763) +{ + createSdImpressDoc("pptx/bnc880763.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + // Check z-order of the two shapes, use background color to identify them + // First object in the background has blue background color + const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pObjGroup); + const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(1); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL( + Color(0x0000ff), + (static_cast(pObj->GetMergedItem(XATTR_FILLCOLOR))).GetColorValue()); + + // Second object at the front has green background color + pObj = pPage->GetObj(1); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL( + Color(0x00ff00), + (static_cast(pObj->GetMergedItem(XATTR_FILLCOLOR))).GetColorValue()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc862510_5) +{ + createSdImpressDoc("pptx/bnc862510_5.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + // Same as testBnc870237, but here we check the horizontal spacing + const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pObjGroup); + const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(2); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_UPPERDIST).GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LOWERDIST).GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7510), pObj->GetMergedItem(SDRATTR_TEXT_RIGHTDIST).GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LEFTDIST).GetValue()); +} + +// In numbering a bullet could be defined as empty (no character). +// When exporting to OOXML make sure that the bullet is ignored and +// not written into the file. +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBnc822347_EmptyBullet) +{ + createSdImpressDoc("bnc822347_EmptyBullet.odp"); + saveAndReload("Impress Office Open XML"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + SdrOutliner* pOutliner = pDoc->GetInternalOutliner(); + const SdrPage* pPage = pDoc->GetPage(1); + SdrObject* pObject = pPage->GetObj(0); + SdrTextObj* pTextObject = DynCastSdrTextObj(pObject); + CPPUNIT_ASSERT(pTextObject); + + OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject(); + const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject(); + + OUString sText = aEdit.GetText(0); + CPPUNIT_ASSERT_EQUAL(OUString("M3 Feature Test"), sText); + + pOutliner->SetText(*pOutlinerParagraphObject); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pOutliner->GetParagraphCount()); + + const sal_Int16 nDepth = pOutliner->GetDepth(0); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(-1), + nDepth); // depth >= 0 means that the paragraph has bullets enabled +} + +//Bullets not having any text following them are not getting exported to pptx correctly. +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo90607) +{ + createSdImpressDoc("fdo90607.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + OutlinerParaObject* pOutlinerParagraphObject = pTxtObj->GetOutlinerParaObject(); + const sal_Int16 nDepth = pOutlinerParagraphObject->GetDepth(0); + CPPUNIT_ASSERT_MESSAGE("not equal", nDepth != -1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo83751) +{ + createSdImpressDoc("pptx/fdo83751.pptx"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xProps + = xDocumentPropertiesSupplier->getDocumentProperties(); + uno::Reference xUDProps(xProps->getUserDefinedProperties(), + uno::UNO_QUERY); + OUString propValue; + xUDProps->getPropertyValue("Testing") >>= propValue; + CPPUNIT_ASSERT_EQUAL(OUString("Document"), propValue); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testFdo79731) +{ + createSdImpressDoc("fdo79731.odp"); + saveAndReload("Impress Office Open XML"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT(pDoc); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTableCellFillProperties) +{ + // Load the original file + createSdImpressDoc("odp/Table_with_Cell_Fill.odp"); + + // Export the document and import again for a check + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell; + + // Test Solid fill color + Color nColor; + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x66ffff), nColor); + + // Test Picture fill type for cell + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_BITMAP), static_cast(aFillStyle)); + + // Test Gradient fill type for cell + xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast(aFillStyle)); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletStartNumber) +{ + createSdImpressDoc("pptx/n90255.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's start number is wrong!", sal_Int16(3), + sal_Int16(pNumFmt->GetNumRule().GetLevel(0).GetStart())); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testLineStyle) +{ + createSdImpressDoc("pptx/lineStyle.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + SdrObject const* pShape = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr); + + const XLineStyleItem& rStyleItem = pShape->GetMergedItem(XATTR_LINESTYLE); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong style", int(drawing::LineStyle_SOLID), + static_cast(rStyleItem.GetValue())); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf134862) +{ + createSdImpressDoc("pptx/tdf134862.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + sal_Int16 nWritingMode = 0; + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + + // Without the fix in place, this test would have failed here + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, + nWritingMode); + + saveAndReload("Impress Office Open XML"); + + xShape.set(getShapeFromPage(0, 0)); + + xParagraph.set(getParagraphFromShape(0, xShape)); + xPropSet.set(xParagraph, uno::UNO_QUERY_THROW); + + nWritingMode = 0; + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, + nWritingMode); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testRightToLeftParaghraph) +{ + createSdImpressDoc("pptx/rightToLeftParagraph.pptx"); + + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + sal_Int16 nWritingMode = 0; + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, + nWritingMode); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTextboxWithHyperlink) +{ + createSdImpressDoc("pptx/hyperlinktest.pptx"); + + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // first chunk of text + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + uno::Reference xField; + xPropSet->getPropertyValue("TextField") >>= xField; + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); + + xPropSet.set(xField, uno::UNO_QUERY); + OUString aURL; + xPropSet->getPropertyValue("URL") >>= aURL; + CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("http://www.xkcd.com/"), aURL); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf136911) +{ + createSdImpressDoc("ppt/tdf136911.ppt"); + + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get second paragraph + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // first chunk of text + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + uno::Reference xField; + xPropSet->getPropertyValue("TextField") >>= xField; + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); + + xPropSet.set(xField, uno::UNO_QUERY); + OUString aURL; + xPropSet->getPropertyValue("URL") >>= aURL; + CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("http://google.com"), aURL); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletColor) +{ + createSdImpressDoc("pptx/bulletColor.pptx"); + + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's color is wrong!", Color(0xff0000), + pNumFmt->GetNumRule().GetLevel(0).GetBulletColor()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletCharAndFont) +{ + createSdImpressDoc("odp/bulletCharAndFont.odp"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + uno::Reference xLevels(xPropSet->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + OUString sBulletChar(u'\xf06c'); + for (beans::PropertyValue const& rProp : std::as_const(aProps)) + { + if (rProp.Name == "BulletChar") + CPPUNIT_ASSERT_EQUAL_MESSAGE("BulletChar incorrect.", sBulletChar, + rProp.Value.get()); + if (rProp.Name == "BulletFont") + { + awt::FontDescriptor aFontDescriptor; + rProp.Value >>= aFontDescriptor; + CPPUNIT_ASSERT_EQUAL_MESSAGE("BulletFont incorrect.", OUString("Wingdings"), + aFontDescriptor.Name); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testBulletMarginAndIndentation) +{ + createSdImpressDoc("pptx/bulletMarginAndIndent.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Bullet's left margin is wrong!", sal_Int32(1000), + pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace()); // left margin is 0.79 cm + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's indentation is wrong!", sal_Int32(-1000), + pNumFmt->GetNumRule().GetLevel(0).GetFirstLineOffset()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testParaMarginAndindentation) +{ + createSdImpressDoc("pptx/paraMarginAndIndentation.pptx"); + + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + sal_Int32 nParaLeftMargin = 0; + xPropSet->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin; + CPPUNIT_ASSERT_EQUAL(sal_uInt32(1000), sal_uInt32(nParaLeftMargin)); + + sal_Int32 nParaFirstLineIndent = 0; + xPropSet->getPropertyValue("ParaFirstLineIndent") >>= nParaFirstLineIndent; + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1270), nParaFirstLineIndent); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testCellLeftAndRightMargin) +{ + createSdImpressDoc("pptx/n90223.pptx"); + saveAndReload("Impress Office Open XML"); + sal_Int32 nLeftMargin, nRightMargin; + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); + uno::Reference xCell(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + uno::Reference xCellPropSet(xCell, uno::UNO_QUERY_THROW); + + uno::Any aLeftMargin = xCellPropSet->getPropertyValue("TextLeftDistance"); + CPPUNIT_ASSERT(aLeftMargin >>= nLeftMargin); + + uno::Any aRightMargin = xCellPropSet->getPropertyValue("TextRightDistance"); + CPPUNIT_ASSERT(aRightMargin >>= nRightMargin); + + // Convert values to EMU + nLeftMargin = oox::drawingml::convertHmmToEmu(nLeftMargin); + nRightMargin = oox::drawingml::convertHmmToEmu(nRightMargin); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(45720), nLeftMargin); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45720), nRightMargin); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testMergedCells) +{ + createSdImpressDoc("odp/cellspan.odp"); + saveAndReload("Impress Office Open XML"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + + CPPUNIT_ASSERT(pTableObj); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); + uno::Reference xText1(xTable->getCellByPosition(3, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("0,3"), xText1->getString()); + + uno::Reference xText2(xTable->getCellByPosition(3, 2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("2,3"), xText2->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTableCellBorder) +{ + createSdImpressDoc("pptx/n90190.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + table::BorderLine2 aBorderLine; + + uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); + uno::Reference xCell(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + uno::Reference xCellPropSet(xCell, uno::UNO_QUERY_THROW); + + xCellPropSet->getPropertyValue("LeftBorder") >>= aBorderLine; + // While importing the table cell border line width, it converts EMU->Hmm then divided result by 2. + // To get original value of LineWidth need to multiple by 2. + sal_Int32 nLeftBorder = aBorderLine.LineWidth * 2; + nLeftBorder = oox::drawingml::convertHmmToEmu(nLeftBorder); + CPPUNIT_ASSERT(nLeftBorder); + CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color)); + + xCellPropSet->getPropertyValue("RightBorder") >>= aBorderLine; + sal_Int32 nRightBorder = aBorderLine.LineWidth * 2; + nRightBorder = oox::drawingml::convertHmmToEmu(nRightBorder); + CPPUNIT_ASSERT(nRightBorder); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, Color(ColorTransparency, aBorderLine.Color)); + + xCellPropSet->getPropertyValue("TopBorder") >>= aBorderLine; + sal_Int32 nTopBorder = aBorderLine.LineWidth * 2; + nTopBorder = oox::drawingml::convertHmmToEmu(nTopBorder); + CPPUNIT_ASSERT(nTopBorder); + CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color)); + + xCellPropSet->getPropertyValue("BottomBorder") >>= aBorderLine; + sal_Int32 nBottomBorder = aBorderLine.LineWidth * 2; + nBottomBorder = oox::drawingml::convertHmmToEmu(nBottomBorder); + CPPUNIT_ASSERT(nBottomBorder); + CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color)); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf111884) +{ + createSdImpressDoc("pptx/tdf111884.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + SdrObject const* pShape = pPage->GetObj(2); + CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr); + + // must be a group shape + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Group, pShape->GetObjIdentifier()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf112633) +{ + // Load document and export it to a temporary file + createSdImpressDoc("pptx/tdf112633.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); + + // Check image with artistic effect exists in the slide + assertXPath(pXmlDoc, + "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:extLst/a:ext/a14:imgProps/" + "a14:imgLayer/a14:imgEffect/a14:artisticPencilGrayscale"_ostr, + "pencilSize"_ostr, "80"); + + // Check there is a relation with the .wdp file that contains the backed up image + OUString sEmbedId1 = getXPath(pXmlDoc, + "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:extLst/" + "a:ext/a14:imgProps/a14:imgLayer"_ostr, + "embed"_ostr); + OUString sXmlPath = "/rels:Relationships/rels:Relationship[@Id='" + sEmbedId1 + "']"; + assertXPath(pRelsDoc, OUStringToOString(sXmlPath, RTL_TEXTENCODING_UTF8), "Target"_ostr, + "../media/hdphoto1.wdp"); + + // Check the .wdp file exists + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("ppt/media/hdphoto1.wdp"))); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128952) +{ + createSdImpressDoc("pptx/tdf128952.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:off"_ostr, "x"_ostr, "360"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:off"_ostr, "y"_ostr, "-360"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:ext"_ostr, "cx"_ostr, + "1919880"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:ext"_ostr, "cy"_ostr, + "1462680"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf127090) +{ + createSdImpressDoc("pptx/tdf127090.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr"_ostr, "rot"_ostr, + "-5400000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testCustomXml) +{ + // Load document and export it to a temporary file + createSdImpressDoc("pptx/customxml.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("customXml/item1.xml"); + CPPUNIT_ASSERT(pXmlDoc); + xmlDocUniquePtr pRelsDoc = parseExport("customXml/_rels/item1.xml.rels"); + CPPUNIT_ASSERT(pRelsDoc); + + // Check there is a relation to itemProps1.xml. + assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship"_ostr, 1); + assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "itemProps1.xml"); + + std::unique_ptr pStream = parseExportStream(maTempFile.GetURL(), "ddp/ddpfile.xen"); + CPPUNIT_ASSERT(pStream); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf94238) +{ + // Load document and export it to a temporary file. + createSdImpressDoc("pptx/tdf94238.pptx"); + save("Impress Office Open XML"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDoc.is()); + + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + + uno::Reference xShape(getShape(0, xPage)); + CPPUNIT_ASSERT(xShape.is()); + + awt::Gradient2 aGradient; + CPPUNIT_ASSERT(xShape->getPropertyValue("FillGradient") >>= aGradient); + + // Without the accompanying fix in place, this test would have failed with + // the following details: + // - aGradient.Style was awt::GradientStyle_ELLIPTICAL + // - aGradient.YOffset was 70 + // - aGradient.Border was 0 + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_RADIAL, aGradient.Style); + CPPUNIT_ASSERT_EQUAL(static_cast(100), aGradient.YOffset); + // MCGR: 39->0 no border needed anymore with ooxml import + CPPUNIT_ASSERT_EQUAL(static_cast(0), aGradient.Border); + + // MCGR: Use the completely imported gradient to check for correctness + const basegfx::BColorStops aColorStops + = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + // Without the accompanying fix in place, this test would have failed with + // 'Expected: 0, Actual : 10592673', i.e. the start color of the gradient + // was incorrect. + CPPUNIT_ASSERT_EQUAL(size_t(3), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 0.39000000000000001)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[2].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x8b8b8b), Color(aColorStops[2].getStopColor())); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testPictureTransparency) +{ + // Load document and export it to a temporary file. + createSdImpressDoc("odp/image_transparency.odp"); + save("Impress Office Open XML"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDoc.is()); + + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + + uno::Reference xGraphicShape(getShape(0, xPage)); + CPPUNIT_ASSERT(xGraphicShape.is()); + + sal_Int16 nTransparency = 0; + CPPUNIT_ASSERT(xGraphicShape->getPropertyValue("Transparency") >>= nTransparency); + CPPUNIT_ASSERT_EQUAL(static_cast(51), nTransparency); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf125554) +{ + createSdImpressDoc("pptx/tdf125554.pptx"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xShape = getShapeFromPage(0, 0); + uno::Any aFillTransparenceGradientName + = xShape->getPropertyValue("FillTransparenceGradientName"); + CPPUNIT_ASSERT(aFillTransparenceGradientName.has()); + // Without the accompanying fix in place, this test would have failed, i.e. the transparency of + // the shape has no gradient, so it looked like a solid fill instead of a gradient fill. + CPPUNIT_ASSERT(!aFillTransparenceGradientName.get().isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testRoundtripOwnLineStyles) +{ + // Load odp document and read the LineDash values. + createSdImpressDoc("odp/LineStylesOwn.odp"); + uno::Reference xDocodp(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDocodp.is()); + uno::Reference xPageodp(xDocodp->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xPageodp.is()); + drawing::LineDash aLineDashodp[10]; + for (sal_uInt16 i = 0; i < 10; i++) + { + uno::Reference xShapeodp(getShape(i, xPageodp)); + CPPUNIT_ASSERT(xShapeodp.is()); + xShapeodp->getPropertyValue("LineDash") >>= aLineDashodp[i]; + } + + // Save to pptx, reload and compare the LineDash values + save("Impress Office Open XML"); + uno::Reference xDocpptx(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDocpptx.is()); + uno::Reference xPagepptx(xDocpptx->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xPagepptx.is()); + + for (sal_uInt16 i = 0; i < 10; i++) + { + drawing::LineDash aLineDashpptx; + uno::Reference xShapepptx(getShape(i, xPagepptx)); + CPPUNIT_ASSERT(xShapepptx.is()); + xShapepptx->getPropertyValue("LineDash") >>= aLineDashpptx; + bool bIsSameLineDash = (aLineDashodp[i].Style == aLineDashpptx.Style + && aLineDashodp[i].Dots == aLineDashpptx.Dots + && aLineDashodp[i].DotLen == aLineDashpptx.DotLen + && aLineDashodp[i].Dashes == aLineDashpptx.Dashes + && aLineDashodp[i].DashLen == aLineDashpptx.DashLen + && aLineDashodp[i].Distance == aLineDashpptx.Distance); + CPPUNIT_ASSERT_MESSAGE("LineDash differ", bIsSameLineDash); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testRoundtripPrstDash) +{ + // load and save document, compare prstDash values in saved document with original. + createSdImpressDoc("pptx/presetDashDot.pptx"); + save("Impress Office Open XML"); + + const OUString sOriginal[] + = { "dash", "dashDot", "dot", "lgDash", "lgDashDot", + "lgDashDotDot", "sysDash", "sysDashDot", "sysDashDotDot", "sysDot" }; + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OStringLiteral sStart = "/p:sld/p:cSld/p:spTree/p:sp["; + static constexpr OStringLiteral sEnd = "]/p:spPr/a:ln/a:prstDash"; + for (sal_uInt16 i = 0; i < 10; i++) + { + OString sXmlPath = sStart + OString::number(i + 1) + sEnd; + OUString sResaved = getXPath(pXmlDoc, sXmlPath, "val"_ostr); + CPPUNIT_ASSERT_EQUAL_MESSAGE("wrong prstDash", sOriginal[i], sResaved); + } + + // tdf#126746: Make sure that dash-dot pattern starts with the longer dash, as defined in OOXML + // Make sure Style is drawing::DashStyle_RECTRELATIVE + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDoc.is()); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + for (sal_uInt16 i = 0; i < 10; i++) + { + drawing::LineDash aLineDash; + uno::Reference xShape(getShape(i, xPage)); + CPPUNIT_ASSERT(xShape.is()); + xShape->getPropertyValue("LineDash") >>= aLineDash; + CPPUNIT_ASSERT_MESSAGE("First dash is short", aLineDash.DotLen >= aLineDash.DashLen); + bool bIsRectRelative = aLineDash.Style == drawing::DashStyle_RECTRELATIVE; + CPPUNIT_ASSERT_MESSAGE("not RECTRELATIVE", bIsRectRelative); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testDashOnHairline) +{ + // load and save document, make sure the custDash has 11 child elements. + createSdImpressDoc("odp/tdf127267DashOnHairline.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:ln/a:custDash/a:ds"_ostr, 11); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testNarrationNonMediaShape) +{ + createSdImpressDoc("pptx/narration-non-media-shape.pptx"); + // Without the accompanying fix in place, this test would have failed, + // beans::UnknownPropertyException was thrown. + saveAndReload("Impress Office Open XML"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testCustomshapeBitmapfillSrcrect) +{ + createSdImpressDoc("pptx/customshape-bitmapfill-srcrect.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + + // tdf#132680 + // We are preventing the side effect of DOCX improvement to PPTX case. + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - XPath '/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect' number of nodes is incorrect + // i.e. was exported as in , which made part of the image + // invisible. + + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr); + + // tdf#134210 + // Original values of attribute of l and r in xml files: + // No core feature for handling this. We add support to import filter. We crop the bitmap + // physically during import and shouldn't export the l r t b attributes anymore. In the + // future if we add core feature to LibreOffice, we should change the control value with + // 4393. + + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, + "l"_ostr); + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, + "r"_ostr); + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, + "t"_ostr); + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect"_ostr, + "b"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf100348FontworkBitmapFill) +{ + createSdImpressDoc("odp/tdf100348_FontworkBitmapFill.odp"); + save("Impress Office Open XML"); + + // Make sure the fontwork shape has a blip bitmap fill and a colored outline. + // Without the patch, fill and outline were black. + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:blipFill/a:blip", 1); + assertXPath(pXmlDoc, sPathStart + "/a:ln/a:solidFill/a:srgbClr", "val"_ostr, "ffbf00"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf100348FontworkGradientGlow) +{ + createSdImpressDoc("odp/tdf100348_FontworkGradientGlow.odp"); + save("Impress Office Open XML"); + + // Make sure the fontwork shape has a gradient fill and a colored glow. + // Without the patch, fill was black and no glow applied. + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val"_ostr, + "8d281e"); + assertXPath(pXmlDoc, sPathStart + "/a:effectLst/a:glow", "rad"_ostr, "63360"); + assertXPath(pXmlDoc, sPathStart + "/a:effectLst/a:glow/a:srgbClr", "val"_ostr, "ff4500"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345FullTransparentGradient) +{ + createSdImpressDoc("odp/tdf128345_FullTransparentGradient.odp"); + save("Impress Office Open XML"); + + // Make sure the shape has no fill. Without the patch, fill was solid red. + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:noFill"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345GradientLinear) +{ + createSdImpressDoc("odp/tdf128345_GradientLinear.odp"); + save("Impress Office Open XML"); + + // Make sure the shape has a lin fill. Without the patch, fill was solid red. + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:lin", "ang"_ostr, "3600000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs", 2); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]", "pos"_ostr, "25000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr", "val"_ostr, "ff0000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val"_ostr, "20000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]", "pos"_ostr, "100000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr", "val"_ostr, "ff0000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val"_ostr, "80000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345GradientRadial) +{ + createSdImpressDoc("odp/tdf128345_GradientRadial.odp"); + save("Impress Office Open XML"); + + // Make sure the shape has transparency. In OOXML alpha means 'opacity' with default + // 100000 for full opak, so only the full transparency with val 0 should be written. + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs", 2); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr", "val"_ostr, "ff0000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", 0); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr", "val"_ostr, "ffffff"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf128345GradientAxial) +{ + // Without the patch, symmetric linear gradient with full transparence outside and + // full opak in the middle were imported as full transparent. + createSdImpressDoc("odp/tdf128345_GradientAxial.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShapePropSet(getShapeFromPage(0, 0)); + + awt::Gradient2 aTransparenceGradient; + xShapePropSet->getPropertyValue("FillTransparenceGradient") >>= aTransparenceGradient; + + // MCGR: Use the completely imported gradient to check for correctness + const basegfx::BColorStops aColorStops + = model::gradient::getColorStopsFromUno(aTransparenceGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(3), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xffffff), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 0.5)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[2].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xffffff), Color(aColorStops[2].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_LINEAR, aTransparenceGradient.Style); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf134969TransparencyOnColorGradient) +{ + createSdImpressDoc("odp/tdf134969_TransparencyOnColorGradient.odp"); + save("Impress Office Open XML"); + + // Make sure the shape has a transparency in gradient stops. + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs", 2); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val"_ostr, "60000"); + assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val"_ostr, "60000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testArcTo) +{ + createSdImpressDoc("pptx/arc-validiert.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPath("//a:custGeom/a:pathLst/a:path/a:arcTo"_ostr); + assertXPath(pXmlDoc, sPath, "wR"_ostr, "3"); + assertXPath(pXmlDoc, sPath, "hR"_ostr, "3"); + assertXPath(pXmlDoc, sPath, "stAng"_ostr, "1800000"); + assertXPath(pXmlDoc, sPath, "swAng"_ostr, "2700000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testNarrationMimeType) +{ + createSdImpressDoc("pptx/narration.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: audio/mp4 + // - Actual : application/vnd.sun.star.media + // i.e. the mime type of the narration was incorrect. + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/media1.m4a']"_ostr, + "ContentType"_ostr, "audio/mp4"); + + // Check if the bitmap of the media shape is exported correctly. + xmlDocUniquePtr pSlideDoc = parseExport("ppt/slides/slide1.xml"); + OUString aImageId + = getXPath(pSlideDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip"_ostr, "embed"_ostr); + xmlDocUniquePtr pRelsDoc = parseExport("ppt/slides/_rels/slide1.xml.rels"); + OUString aImagePath = "/rels:Relationships/rels:Relationship[@Id='" + aImageId + "']"; + // Something like ../media/image2.png. + OUString aImageStreamName = getXPath(pRelsDoc, aImagePath.toUtf8(), "Target"_ostr); + OUString aImageAbsName = rtl::Uri::convertRelToAbs("file:///ppt/slides/", aImageStreamName); + // Something like ppt/media/image2.png. + OUString aImageRelName; + CPPUNIT_ASSERT(aImageAbsName.startsWith("file:///", &aImageRelName)); + std::unique_ptr pImageStream = parseExportStream(maTempFile.GetURL(), aImageRelName); + vcl::PngImageReader aReader(*pImageStream); + BitmapEx aBitmapEx = aReader.read(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 256 + // - Actual : 120 + // i.e. the bitmap of the narration was lost, some default placeholder was exported instead. + CPPUNIT_ASSERT_EQUAL(static_cast(256), aBitmapEx.GetSizePixel().Height()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. p:blipFill was missing its a:stretch child element, so the shape was invisible. + assertXPath(pSlideDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:stretch/a:fillRect"_ostr, 1); + + // Without the accompanying fix in place, this test would have failed with: + // - ... no attribute 'cmd' exist + // i.e. '' was written instead of ''. + assertXPath(pSlideDoc, "//p:cmd"_ostr, "cmd"_ostr, "playFrom(0.0)"); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. had no children, the whole audio animation node was lost. + assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode"_ostr, 1); + + // Without the accompanying fix in place, this test would have failed with: + // - ... no attribute 'showWhenStopped' exist + // i.e. had the default visibility -> bitmap was visible during slideshow. + assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode"_ostr, "showWhenStopped"_ostr, "0"); + + // Without the accompanying fix in place, this test would have failed with: + // - ... no attribute 'isNarration' exist + // i.e. was not a narration -> could not mass-remove narrations on the UI. + assertXPath(pSlideDoc, "//p:childTnLst/p:audio"_ostr, "isNarration"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf150316) +{ + createSdImpressDoc("odp/tdf150316.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p/a:pPr"_ostr, "indent"_ostr, + "-343080"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf140865Wordart3D) +{ + createSdImpressDoc("pptx/tdf140865Wordart3D.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + + // without the fix in place a:sp3d was lost on round trip, and so extrusion was lost. + constexpr OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "extrusionH"_ostr, "342900"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "contourW"_ostr, "12700"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "w"_ostr, "114300"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "h"_ostr, "38100"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "prst"_ostr, "softRound"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelB", "h"_ostr, "152400"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:extrusionClr/a:srgbClr", "val"_ostr, "990000"); + assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:contourClr/a:srgbClr", "val"_ostr, "009876"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf124457) +{ + createSdImpressDoc("pptx/tdf124457.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + + assertXPath( + pXmlDoc, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par[1]/p:cTn"_ostr, + "repeatCount"_ostr, "3000"); + + assertXPath( + pXmlDoc, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par[2]/p:cTn"_ostr, + "repeatCount"_ostr, "indefinite"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf143126) +{ + createSdImpressDoc("pptx/tdf143126.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); + + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:sldRg"_ostr, "st"_ostr, "2"); + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:sldRg"_ostr, "end"_ostr, "3"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf143129) +{ + createSdImpressDoc("pptx/tdf143129.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/presProps.xml"); + + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr"_ostr, "showNarration"_ostr, "1"); + assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:custShow"_ostr, "id"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf118045) +{ + createSdImpressDoc("odp/tdf118045.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:lnSpc/a:spcPct"_ostr, + "val"_ostr, "110000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf137675) +{ + createSdImpressDoc("pptx/tdf137675.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path"_ostr, + "fill"_ostr, "none"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest1, testTdf151134) +{ + createSdImpressDoc("pptx/tdf151134.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, "lIns"_ostr, + "91440"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx new file mode 100644 index 0000000000..4498f66bf0 --- /dev/null +++ b/sd/qa/unit/export-tests-ooxml2.cxx @@ -0,0 +1,1994 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +using namespace css; +using namespace css::animations; + +namespace +{ +bool checkBeginWithNumber(std::u16string_view aStr) +{ + sal_Unicode aChar = (aStr.size() > 1) ? aStr[0] : '\0'; + return aChar == '.' || aChar == '-' || rtl::isAsciiDigit(aChar); +} +} + +#define CPPUNIT_ASSERT_MOTIONPATH(expect, actual) \ + assertMotionPath(expect, actual, CPPUNIT_SOURCELINE()) + +static void assertMotionPath(std::u16string_view rStr1, std::u16string_view rStr2, + const CppUnit::SourceLine& rSourceLine) +{ + sal_Int32 nIdx1 = 0; + sal_Int32 nIdx2 = 0; + + OString sMessage + = "Motion path values mismatch.\nExpect: " + OUStringToOString(rStr1, RTL_TEXTENCODING_UTF8) + + "\nActual: " + OUStringToOString(rStr2, RTL_TEXTENCODING_UTF8); + + while (nIdx1 != -1 && nIdx2 != -1) + { + OUString aToken1(o3tl::getToken(rStr1, 0, ' ', nIdx1)); + OUString aToken2(o3tl::getToken(rStr2, 0, ' ', nIdx2)); + + if (checkBeginWithNumber(aToken1) && checkBeginWithNumber(aToken2)) + assertDoubleEquals(aToken1.toDouble(), aToken2.toDouble(), DBL_EPSILON, rSourceLine, + std::string(sMessage)); + else + assertEquals(aToken1, aToken2, rSourceLine, std::string(sMessage)); + } + assertEquals(sal_Int32(-1), nIdx1, rSourceLine, std::string(sMessage)); + assertEquals(sal_Int32(-1), nIdx2, rSourceLine, std::string(sMessage)); +} + +class SdOOXMLExportTest2 : public SdModelTestBase +{ +public: + SdOOXMLExportTest2() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testRepeatBitmapMode) +{ + createSdImpressDoc("odp/repeatBitmapMode.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "tx"_ostr, + "1269669"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "ty"_ostr, + "186051"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "sx"_ostr, + "100000"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "sy"_ostr, + "100000"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "algn"_ostr, + "tr"); + + // if the "Scale" setting is checked in the images settings dialog. + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "tx"_ostr, + "0"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "ty"_ostr, + "0"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "sx"_ostr, + "682760"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "sy"_ostr, + "639983"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile"_ostr, "algn"_ostr, + "ctr"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf153107) +{ + createSdImpressDoc("odp/tdf153107.odp"); + save("Impress Office Open XML"); + + // placeholder + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:blipFill/a:tile"_ostr, + "tx"_ostr, "1879200"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:blipFill/a:tile"_ostr, + "ty"_ostr, "83628"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:blipFill/a:tile"_ostr, + "sx"_ostr, "264773"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:blipFill/a:tile"_ostr, + "sy"_ostr, "91428"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:blipFill/a:tile"_ostr, + "algn"_ostr, "ctr"); + + // custom shape + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:blipFill/a:tile"_ostr, + "tx"_ostr, "198000"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:blipFill/a:tile"_ostr, + "ty"_ostr, "324000"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:blipFill/a:tile"_ostr, + "sx"_ostr, "69743"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:blipFill/a:tile"_ostr, + "sy"_ostr, "78709"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:blipFill/a:tile"_ostr, + "algn"_ostr, "tl"); + + // polygon + xmlDocUniquePtr pXmlDocContent3 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:blipFill/a:tile"_ostr, + "tx"_ostr, "2073600"); + assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:blipFill/a:tile"_ostr, + "ty"_ostr, "221760"); + assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:blipFill/a:tile"_ostr, + "sx"_ostr, "182602"); + assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:blipFill/a:tile"_ostr, + "sy"_ostr, "86580"); + assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:blipFill/a:tile"_ostr, + "algn"_ostr, "ctr"); + + // textbox + xmlDocUniquePtr pXmlDocContent4 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:blipFill/a:tile"_ostr, + "tx"_ostr, "662400"); + assertXPath(pXmlDocContent4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:blipFill/a:tile"_ostr, + "ty"_ostr, "760320"); + assertXPath(pXmlDocContent4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:blipFill/a:tile"_ostr, + "sx"_ostr, "202891"); + assertXPath(pXmlDocContent4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:blipFill/a:tile"_ostr, + "sy"_ostr, "129870"); + assertXPath(pXmlDocContent4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:blipFill/a:tile"_ostr, + "algn"_ostr, "tl"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf142291) +{ + createSdImpressDoc("pptx/tdt142291.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr/a:tc[1]/" + "a:tcPr/a:lnL/a:prstDash"_ostr, + "val"_ostr, "sysDashDotDot"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr/a:tc[1]/" + "a:tcPr/a:lnR/a:prstDash"_ostr, + "val"_ostr, "dot"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr/a:tc[1]/" + "a:tcPr/a:lnT/a:prstDash"_ostr, + "val"_ostr, "solid"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr/a:tc[1]/" + "a:tcPr/a:lnB/a:prstDash"_ostr, + "val"_ostr, "dash"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr/a:tc[2]/" + "a:tcPr/a:lnR/a:prstDash"_ostr, + "val"_ostr, "dashDot"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf151492) +{ + createSdImpressDoc("odp/tdf151492.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, "idx"_ostr, + "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf149697) +{ + createSdImpressDoc("pptx/tdf149697.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, + "idx"_ostr, "5"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn"_ostr, + "idx"_ostr, "4"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn"_ostr, + "idx"_ostr, "3"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn"_ostr, + "idx"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf149126) +{ + createSdImpressDoc("odp/tdf149126.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom"_ostr, "prst"_ostr, + "triangle"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf131905) +{ + createSdImpressDoc("pptx/tdf131905.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr[1]/a:tc/a:tcPr"_ostr, + "anchor"_ostr, "t"); + + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr[2]/a:tc/a:tcPr"_ostr, + "anchor"_ostr, "ctr"); + + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr[3]/a:tc/a:tcPr"_ostr, + "anchor"_ostr, "b"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf93883) +{ + createSdImpressDoc("odp/tdf93883.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(!xPropSet->getPropertyValue("NumberingLevel").hasValue()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testBnc822341) +{ + // Check import / export of embedded text document + createSdImpressDoc("odp/bnc822341.odp"); + save("Impress Office Open XML"); + + // Export an LO specific ole object (imported from an ODP document) + { + xmlDocUniquePtr pXmlDocCT = parseExport("[Content_Types].xml"); + assertXPath(pXmlDocCT, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.openxmlformats-officedocument.wordprocessingml.document']"_ostr, + "PartName"_ostr, "/ppt/embeddings/oleObject1.docx"); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath( + pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='../embeddings/oleObject1.docx']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/p:oleObj"_ostr, + "progId"_ostr, "Word.Document.12"); + + const SdrPage* pPage = GetPage(1); + + const SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); + } + + save("Impress Office Open XML"); + + // Export an MS specific ole object (imported from a PPTX document) + { + xmlDocUniquePtr pXmlDocCT = parseExport("[Content_Types].xml"); + assertXPath(pXmlDocCT, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.openxmlformats-officedocument.wordprocessingml.document']"_ostr, + "PartName"_ostr, "/ppt/embeddings/oleObject1.docx"); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath( + pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='../embeddings/oleObject1.docx']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/p:oleObj"_ostr, + "progId"_ostr, "Word.Document.12"); + + const SdrPage* pPage = GetPage(1); + + const SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testMathObject) +{ + // Check import / export of math object + createSdImpressDoc("odp/math.odp"); + save("Impress Office Open XML"); + + // Export an LO specific ole object (imported from an ODP document) + { + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice"_ostr, + "Requires"_ostr, "a14"); + assertXPathContent(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/" + "a14:m/m:oMath/m:r[1]/m:t"_ostr, + "a"); + + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); + } + + save("Impress Office Open XML"); + + // Export an MS specific ole object (imported from a PPTX document) + { + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice"_ostr, + "Requires"_ostr, "a14"); + assertXPathContent(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/" + "a14:m/m:oMath/m:r[1]/m:t"_ostr, + "a"); + + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testMathObjectPPT2010) +{ + // Check import / export of math object + createSdImpressDoc("pptx/Math.pptx"); + save("Impress Office Open XML"); + + // Export an MS specific ole object (imported from a PPTX document) + { + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice"_ostr, + "Requires"_ostr, "a14"); + assertXPathContent(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/" + "a14:m/m:oMath/m:sSup/m:e/m:r[1]/m:t"_ostr, + u"\U0001D44E"_ustr); // non-BMP char + + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf119015) +{ + createSdImpressDoc("pptx/tdf119015.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + // The position was previously not properly initialized: (0, 0, 100, 100) + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(6991, 6902), Size(14099, 2000)), + pTableObj->GetLogicRect()); + uno::Reference xTable(pTableObj->getTable()); + + // Test that we actually have three cells: this threw css.lang.IndexOutOfBoundsException + uno::Reference xTextRange(xTable->getCellByPosition(1, 0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("A3"), xTextRange->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf123090) +{ + createSdImpressDoc("pptx/tdf123090.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + uno::Reference xTable(pTableObj->getTable()); + + // Test that we actually have two cells: this threw css.lang.IndexOutOfBoundsException + uno::Reference xTextRange(xTable->getCellByPosition(1, 0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("aaa"), xTextRange->getString()); + + sal_Int32 nWidth; + uno::Reference xColumns(xTable->getColumns(), uno::UNO_SET_THROW); + uno::Reference xRefColumn(xColumns->getByIndex(1), uno::UNO_QUERY_THROW); + xRefColumn->getPropertyValue("Width") >>= nWidth; + CPPUNIT_ASSERT_EQUAL(sal_Int32(9136), nWidth); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf126324) +{ + createSdImpressDoc("pptx/tdf126324.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + uno::Reference xShape(getShape(0, xPage)); + CPPUNIT_ASSERT(xShape.is()); + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("17"), xText->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf119187) +{ + // load document + createSdImpressDoc("pptx/tdf119187.pptx"); + + //Check For Import and Export Both + for (sal_uInt32 i = 0; i < 2; i++) + { + // get shape properties + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT(pPage); + SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT(pObj); + const sdr::properties::BaseProperties& rProperties = pObj->GetProperties(); + + // check text vertical alignment + const SdrTextVertAdjustItem& rSdrTextVertAdjustItem + = rProperties.GetItem(SDRATTR_TEXT_VERTADJUST); + const SdrTextVertAdjust eTVA = rSdrTextVertAdjustItem.GetValue(); + CPPUNIT_ASSERT_EQUAL(SDRTEXTVERTADJUST_TOP, eTVA); + saveAndReload("Impress Office Open XML"); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf132472) +{ + createSdImpressDoc("pptx/tdf132472.pptx"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell; + Color nColor; + + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nColor); + + uno::Reference xParagraph(getParagraphFromShape(0, xCell)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY); + xPropSet->getPropertyValue("CharColor") >>= nColor; + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:0 G:0 B:0 A:0 + // - Actual : Color: R:255 G:255 B:255 A:0 + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf80224) +{ + createSdImpressDoc("odp/tdf80224.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph->getStart(), uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(Color(0x6562ac), nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf91378) +{ + //Check For Import and Export Both + createSdImpressDoc("pptx/tdf91378.pptx"); + for (sal_uInt32 i = 0; i < 2; i++) + { + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xProps + = xDocumentPropertiesSupplier->getDocumentProperties(); + uno::Reference xUDProps(xProps->getUserDefinedProperties(), + uno::UNO_QUERY); + OUString propValue; + xUDProps->getPropertyValue("Testing") >>= propValue; + CPPUNIT_ASSERT(propValue.isEmpty()); + saveAndReload("Impress Office Open XML"); + } +} + +static bool checkTransitionOnPage(uno::Reference const& xDoc, + sal_Int32 nSlideNumber, sal_Int16 nExpectedTransitionType, + sal_Int16 nExpectedTransitionSubType, + bool bExpectedDirection = true) +{ + sal_Int32 nSlideIndex = nSlideNumber - 1; + + CPPUNIT_ASSERT_MESSAGE("Slide/Page index out of range", + nSlideIndex < xDoc->getDrawPages()->getCount()); + + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(nSlideIndex), + uno::UNO_QUERY_THROW); + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + + sal_Int16 nTransitionType = 0; + xPropSet->getPropertyValue("TransitionType") >>= nTransitionType; + + if (nExpectedTransitionType != nTransitionType) + { + std::cerr << "Transition type: " << nTransitionType << " " << nExpectedTransitionType + << std::endl; + return false; + } + + sal_Int16 nTransitionSubtype = 0; + xPropSet->getPropertyValue("TransitionSubtype") >>= nTransitionSubtype; + if (nExpectedTransitionSubType != nTransitionSubtype) + { + std::cerr << "Transition Subtype: " << nTransitionSubtype << " " + << nExpectedTransitionSubType << std::endl; + return false; + } + + bool bDirection = false; + xPropSet->getPropertyValue("TransitionDirection") >>= bDirection; + + if (bExpectedDirection != bDirection) + { + std::cerr << "Transition Direction: " << (bExpectedDirection ? "normal" : "reversed") << " " + << (bDirection ? "normal" : "reversed") << std::endl; + return false; + } + + return true; +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testExportTransitionsPPTX) +{ + createSdImpressDoc("AllTransitions.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + + // WIPE TRANSITIONS + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 01, TransitionType::BARWIPE, + TransitionSubType::TOPTOBOTTOM, false)); + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 02, TransitionType::BARWIPE, TransitionSubType::LEFTTORIGHT)); + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 03, TransitionType::BARWIPE, + TransitionSubType::LEFTTORIGHT, false)); + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 04, TransitionType::BARWIPE, TransitionSubType::TOPTOBOTTOM)); + + // CUT THROUGH BLACK + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 31, TransitionType::BARWIPE, TransitionSubType::FADEOVERCOLOR)); + + // COMB + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 41, TransitionType::PUSHWIPE, + TransitionSubType::COMBHORIZONTAL)); + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 42, TransitionType::PUSHWIPE, TransitionSubType::COMBVERTICAL)); + + // OUTSIDE TURNING CUBE + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 57, TransitionType::MISCSHAPEWIPE, + TransitionSubType::CORNERSOUT)); + // INSIDE TURNING CUBE + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 60, TransitionType::MISCSHAPEWIPE, + TransitionSubType::CORNERSIN)); + + // FALL + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 61, TransitionType::MISCSHAPEWIPE, + TransitionSubType::LEFTTORIGHT)); + + // VORTEX + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 70, TransitionType::MISCSHAPEWIPE, + TransitionSubType::VERTICAL)); + + // RIPPLE + CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 71, TransitionType::MISCSHAPEWIPE, + TransitionSubType::HORIZONTAL)); + + // GLITTER + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 72, TransitionType::MISCSHAPEWIPE, TransitionSubType::DIAMOND)); + + // HONEYCOMB + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 73, TransitionType::MISCSHAPEWIPE, TransitionSubType::HEART)); + + // NEWSFLASH + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 74, TransitionType::ZOOM, TransitionSubType::ROTATEIN)); + + // OVAL VERTICAL - cannot be exported to PPTX so fallback to circle + //CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 76, TransitionType::ELLIPSEWIPE, TransitionSubType::VERTICAL)); + CPPUNIT_ASSERT( + checkTransitionOnPage(xDoc, 76, TransitionType::ELLIPSEWIPE, TransitionSubType::CIRCLE)); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testPresetShapesExport) +{ + createSdImpressDoc("odp/preset-shapes-export.odp"); + const char* sShapeTypeAndValues[] = { + "wedgeEllipseCallout", + "adj1", + "val 45310", + "adj2", + "val 97194", + "wedgeRoundRectCallout", + "adj1", + "val 46694", + "adj2", + "val 129726", + "adj3", + "val 16667", + "wedgeRectCallout", + "adj1", + "val 40037", + "adj2", + "val 111694", + "smileyFace", + "adj", + "val -9282", + "can", + "adj", + "val 50000", + "frame", + "adj1", + "val 10490", + "donut", + "adj", + "val 9601", + "bevel", + "adj", + "val 42592", + "foldedCorner", + "adj", + "val 10750", + "verticalScroll", + "adj", + "val 25000", + "horizontalScroll", + "adj", + "val 25000", + "cube", + "adj", + "val 85129", + "bracketPair", + "adj", + "val 50000", + "sun", + "adj", + "val 12500", + "bracePair", + "adj", + "val 25000", + "cloudCallout", + "adj1", + "val 77611", + "adj2", + "val -47819", + "borderCallout1", + "adj1", + "val 18750", + "adj2", + "val -8333", + "adj3", + "val 170013", + "adj4", + "val 143972", + "borderCallout2", + "adj1", + "val 18750", + "adj2", + "val -8333", + "adj3", + "val 113768", + "adj4", + "val -81930", + "adj5", + "val -22375", + "adj6", + "val -134550", + "blockArc", + "adj1", + "val 12975429", + "adj2", + "val 19424571", + "adj3", + "val 3770", + }; + + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocCT = parseExport("ppt/slides/slide1.xml"); + static constexpr OStringLiteral sT("_T_"); + static constexpr OStringLiteral sN("_N_"); + static constexpr OStringLiteral sPropertyName("name"); + static constexpr OStringLiteral sPropertyFmla("fmla"); + + size_t i = 0; + while (i < SAL_N_ELEMENTS(sShapeTypeAndValues)) + { + OString sType(sShapeTypeAndValues[i++]); + for (size_t j = 1; i < SAL_N_ELEMENTS(sShapeTypeAndValues) + && o3tl::starts_with(sShapeTypeAndValues[i], "adj"); + ++j) + { + OString sXPath + = "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom[@prst='_T_']/a:avLst/a:gd[_N_]"_ostr + .replaceFirst(sT, sType) + .replaceFirst(sN, OString::number(j)); + assertXPath(pXmlDocCT, sXPath, sPropertyName, + OUString::createFromAscii(sShapeTypeAndValues[i++])); + assertXPath(pXmlDocCT, sXPath, sPropertyFmla, + OUString::createFromAscii(sShapeTypeAndValues[i++])); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf92527) +{ + // We draw a diamond in an empty document. + // If custom shape has name and preset information in OOXML, should be export as preset shape. + createSdImpressDoc("empty.fodp"); + uno::Reference xPage1(getPage(0)); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape1( + xFactory->createInstance("com.sun.star.drawing.CustomShape"), uno::UNO_QUERY); + xPage1->add(xShape1); + xShape1->setSize(awt::Size(10000, 10000)); + xShape1->setPosition(awt::Point(1000, 1000)); + uno::Sequence aShapeGeometry(comphelper::InitPropertySequence({ + { "Type", uno::Any(OUString("diamond")) }, + })); + uno::Reference xPropertySet1(xShape1, uno::UNO_QUERY); + xPropertySet1->setPropertyValue("CustomShapeGeometry", uno::Any(aShapeGeometry)); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xDoc2(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage2(xDoc2->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + uno::Reference xShape2(xPage2->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xPropertySet2(xShape2, uno::UNO_QUERY_THROW); + uno::Sequence aProps; + xPropertySet2->getPropertyValue("CustomShapeGeometry") >>= aProps; + uno::Sequence aPathProps; + for (beans::PropertyValue const& rProp : std::as_const(aProps)) + { + if (rProp.Name == "Path") + aPathProps = rProp.Value.get>(); + } + uno::Sequence aCoordinates; + for (beans::PropertyValue const& rProp : std::as_const(aPathProps)) + { + if (rProp.Name == "Coordinates") + aCoordinates + = rProp.Value.get>(); + } + + // 4 coordinate pairs + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), aCoordinates.getLength()); +} + +namespace +{ +void matchNumberFormat(int nPage, uno::Reference const& xField) +{ + uno::Reference xPropSet(xField, uno::UNO_QUERY_THROW); + sal_Int32 nNumFmt; + xPropSet->getPropertyValue("NumberFormat") >>= nNumFmt; + switch (nPage) + { + case 0: // 13/02/96 (StdSmall) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", + sal_Int32(SvxDateFormat::StdSmall), nNumFmt); + break; + case 1: // 13/02/1996 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", + sal_Int32(SvxDateFormat::B), nNumFmt); + break; + case 2: // Tuesday, June 29, 2021 (StdBig) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", + sal_Int32(SvxDateFormat::StdBig), nNumFmt); + break; + case 3: // 13:49:38 (Standard) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", + sal_Int32(SvxTimeFormat::Standard), nNumFmt); + break; + case 4: // 13:49 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", + sal_Int32(SvxTimeFormat::HH24_MM), nNumFmt); + break; + case 5: // 01:49 PM + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", + sal_Int32(SvxTimeFormat::HH12_MM), nNumFmt); + break; + case 6: // 01:49:38 PM + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", + sal_Int32(SvxTimeFormat::HH12_MM_SS), nNumFmt); + break; + case 7: // June 29, 2021 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", + sal_Int32(SvxDateFormat::D), nNumFmt); + break; + case 8: // Jun 29, 2021 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", + sal_Int32(SvxDateFormat::C), nNumFmt); + break; + } +} +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testDatetimeFieldNumberFormat) +{ + createSdImpressDoc("odp/numfmt.odp"); + + saveAndReload("Impress Office Open XML"); + + for (sal_uInt16 i = 0; i <= 8; ++i) + { + matchNumberFormat(i, getTextFieldFromPage(0, 0, 0, i)); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testDatetimeFieldNumberFormatPPTX) +{ + createSdImpressDoc("pptx/numfmt.pptx"); + + saveAndReload("Impress Office Open XML"); + + for (sal_uInt16 i = 0; i <= 8; ++i) + { + matchNumberFormat(i, getTextFieldFromPage(0, 0, 0, i)); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testSlideNumberField) +{ + createSdImpressDoc("odp/slidenum_field.odp"); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xField = getTextFieldFromPage(0, 0, 0, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testSlideNumberFieldPPTX) +{ + createSdImpressDoc("pptx/slidenum_field.pptx"); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xField = getTextFieldFromPage(0, 0, 0, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testSlideCountField) +{ + createSdImpressDoc("odp/slidecount_field.odp"); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xField = getTextFieldFromPage(0, 0, 0, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testSlideNameField) +{ + createSdImpressDoc("odp/slidename_field.odp"); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xField = getTextFieldFromPage(0, 0, 0, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testExtFileField) +{ + createSdImpressDoc("odp/extfile_field.odp"); + + saveAndReload("Impress Office Open XML"); + + for (sal_uInt16 i = 0; i <= 3; ++i) + { + uno::Reference xField = getTextFieldFromPage(0, 0, i, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); + + uno::Reference xPropSet(xField, uno::UNO_QUERY_THROW); + sal_Int32 nNumFmt; + xPropSet->getPropertyValue("FileFormat") >>= nNumFmt; + switch (i) + { + case 0: // Path/File name + CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(0), nNumFmt); + break; + case 1: // Path + CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(1), nNumFmt); + break; + case 2: // File name without extension + CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(2), nNumFmt); + break; + case 3: // File name with extension + CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(3), nNumFmt); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testAuthorField) +{ + createSdImpressDoc("odp/author_field.odp"); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xField = getTextFieldFromPage(0, 0, 0, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf99224) +{ + createSdImpressDoc("odp/tdf99224.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xPage = getPage(0); + // This was 0: the image with text was lost on export. + CPPUNIT_ASSERT_EQUAL(static_cast(1), xPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf92076) +{ + createSdImpressDoc("odp/tdf92076.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xPage = getPage(0); + CPPUNIT_ASSERT_EQUAL(static_cast(2), xPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf59046) +{ + createSdImpressDoc("odp/tdf59046.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf133502) +{ + createSdImpressDoc("odp/tdf133502.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/comments/comment1.xml"); + + assertXPathContent(pXmlDocRels, "/p:cmLst/p:cm/p:text"_ostr, "Test for creator-initials"); + + // Without the fix in place, the comment position would have been 0,0 + assertXPath(pXmlDocRels, "/p:cmLst/p:cm/p:pos"_ostr, "x"_ostr, "2032"); + assertXPath(pXmlDocRels, "/p:cmLst/p:cm/p:pos"_ostr, "y"_ostr, "1029"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf105739) +{ + // Gradient was lost during saving to ODP + createSdImpressDoc("pptx/tdf105739.pptx"); + save("impress8"); + uno::Reference xPage = getPage(0); + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + uno::Any aAny = xPropSet->getPropertyValue("Background"); + CPPUNIT_ASSERT(aAny.hasValue()); + if (aAny.hasValue()) + { + uno::Reference aXBackgroundPropSet; + aAny >>= aXBackgroundPropSet; + + // Test fill type + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + aXBackgroundPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast(aFillStyle)); + + // Test gradient properties + com::sun::star::awt::Gradient2 aFillGradient; + aXBackgroundPropSet->getPropertyValue("FillGradient") >>= aFillGradient; + + // MCGR: Use the completely imported gradient to check for correctness + const basegfx::BColorStops aColorStops + = model::gradient::getColorStopsFromUno(aFillGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xff0000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x00b050), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT_EQUAL(int(awt::GradientStyle_LINEAR), static_cast(aFillGradient.Style)); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testPageBitmapWithTransparency) +{ + createSdImpressDoc("pptx/page_transparent_bitmap.pptx"); + + saveAndReload("impress8"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be exactly one page", static_cast(1), + xDoc->getDrawPages()->getCount()); + + uno::Reference xPage(getPage(0)); + + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + uno::Any aAny = xPropSet->getPropertyValue("Background"); + CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue()); + + uno::Reference aXBackgroundPropSet; + aAny >>= aXBackgroundPropSet; + sal_Int32 nTransparence; + aAny = aXBackgroundPropSet->getPropertyValue("FillTransparence"); + aAny >>= nTransparence; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide background transparency is wrong", sal_Int32(49), + nTransparence); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testPptmContentType) +{ + createSdImpressDoc("pptm/macro.pptm"); + save("Impress MS PowerPoint 2007 XML VBA"); + + // Assert that the content type is the one of PPTM + xmlDocUniquePtr pXmlContentType = parseExport("[Content_Types].xml"); + assertXPath(pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/presentation.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf111798) +{ + createSdImpressDoc("odp/tdf111798.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + + const OUString data[][11] = { { "2700000", "2458080", "2414880", "1439640", "1440000", "gd[1]", + "adj1", "val 50000", "gd[2]", "adj2", "val 25000" }, + { "2700000", "6778080", "2414880", "1439640", "1440000", "gd[1]", + "adj1", "val 50000", "gd[2]", "adj2", "val 25006" } }; + + for (size_t nShapeIndex = 0; nShapeIndex < SAL_N_ELEMENTS(data); nShapeIndex++) + { + size_t nDataIndex = 0; + + const OString sSpPr + = "/p:sld/p:cSld/p:spTree/p:sp[" + OString::number(nShapeIndex + 1) + "]/p:spPr"; + const OString sXfrm = sSpPr + "/a:xfrm"; + assertXPath(pXmlDoc, sXfrm, "rot"_ostr, data[nShapeIndex][nDataIndex++]); + const OString sOff = sXfrm + "/a:off"; + assertXPath(pXmlDoc, sOff, "x"_ostr, data[nShapeIndex][nDataIndex++]); + assertXPath(pXmlDoc, sOff, "y"_ostr, data[nShapeIndex][nDataIndex++]); + const OString sExt = sXfrm + "/a:ext"; + assertXPath(pXmlDoc, sExt, "cx"_ostr, data[nShapeIndex][nDataIndex++]); + assertXPath(pXmlDoc, sExt, "cy"_ostr, data[nShapeIndex][nDataIndex++]); + + while (nDataIndex < SAL_N_ELEMENTS(data[nShapeIndex])) + { + const OString sGd + = sSpPr + "/a:prstGeom/a:avLst/a:" + data[nShapeIndex][nDataIndex++].toUtf8() + ""; + assertXPath(pXmlDoc, sGd, "name"_ostr, data[nShapeIndex][nDataIndex++]); + assertXPath(pXmlDoc, sGd, "fmla"_ostr, data[nShapeIndex][nDataIndex++]); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testPptmVBAStream) +{ + createSdImpressDoc("pptm/macro.pptm"); + save("Impress MS PowerPoint 2007 XML VBA"); + + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + // This failed: VBA stream was not roundtripped + CPPUNIT_ASSERT(xNameAccess->hasByName("ppt/vbaProject.bin")); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf111863) +{ + createSdImpressDoc("pptx/tdf111863.pptx"); + save("Impress Office Open XML"); + + // check that transition attribute didn't change from 'out' to 'in' + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath( + pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/" + "p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animEffect"_ostr, + "transition"_ostr, "out"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf111518) +{ + createSdImpressDoc("pptx/tdf111518.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + OUString sActual = getXPath(pXmlDocRels, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:animMotion"_ostr, + "path"_ostr); + CPPUNIT_ASSERT_MOTIONPATH(u"M -3.54167E-6 -4.81481E-6 L 0.39037 -0.00069 E", sActual); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf100387) +{ + createSdImpressDoc("odp/tdf100387.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn"_ostr, + "dur"_ostr, "indefinite"); + assertXPath( + pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]/p:cTn"_ostr, + "fill"_ostr, "hold"); + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par[1]/p:cTn/p:childTnLst/p:par/p:cTn"_ostr, + "fill"_ostr, "hold"); + + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]" + "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/" + "p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg"_ostr, + "st"_ostr, "0"); + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]" + "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/" + "p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg"_ostr, + "end"_ostr, "0"); + + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[2]" + "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/" + "p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg"_ostr, + "st"_ostr, "1"); + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[2]" + "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/" + "p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg"_ostr, + "end"_ostr, "1"); + + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[3]" + "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/" + "p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg"_ostr, + "st"_ostr, "2"); + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[3]" + "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/" + "p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg"_ostr, + "end"_ostr, "2"); +} + +// tdf#126746 Add support for Line Caps import and export +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testClosingShapesAndLineCaps) +{ + createSdImpressDoc("odp/closed-shapes.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:moveTo/a:pt"_ostr, 1); + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt"_ostr, 1); + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[2]/a:pt"_ostr, 1); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:close"_ostr, + 1); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln"_ostr, "cap"_ostr, + "rnd"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:miter"_ostr, 1); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:custGeom/a:pathLst/a:path/a:close"_ostr, + 0); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:ln"_ostr, "cap"_ostr, + "rnd"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:ln/a:miter"_ostr, 1); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:custGeom/a:pathLst/a:path/a:close"_ostr, + 0); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:ln"_ostr, "cap"_ostr, + "rnd"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:ln/a:miter"_ostr, 1); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:custGeom/a:pathLst/a:path/a:close"_ostr, + 0); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:ln"_ostr, "cap"_ostr, + "sq"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:ln/a:round"_ostr, 1); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:custGeom/a:pathLst/a:path/a:close"_ostr, + 0); + assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:ln"_ostr, + "cap"_ostr); // by default it is "flat" cap style + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:ln/a:bevel"_ostr, 1); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[6]/p:spPr/a:custGeom/a:pathLst/a:path/a:close"_ostr, + 0); + assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:ln"_ostr, + "cap"_ostr); // by default it is "flat" cap style + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:spPr/a:ln/a:round"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testRotateFlip) +{ + createSdImpressDoc("odp/rotate_flip.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + const OUString data[][4] = { // flipH flipV x y + { "0", "1", "1170000", "1035720" }, + { "1", "1", "7108560", "1036440" }, + { "1", "0", "4140000", "1036440" } + }; + + const OUString points[][2] + = { { "221", "293" }, { "506", "12" }, { "367", "0" }, { "29", "406" }, + { "431", "347" }, { "145", "645" }, { "99", "520" }, { "0", "861" }, + { "326", "765" }, { "209", "711" }, { "640", "233" }, { "640", "233" } }; + + for (size_t nShapeIndex = 0; nShapeIndex < SAL_N_ELEMENTS(data); nShapeIndex++) + { + size_t nDataIndex = 0; + + const OString sSpPr + = "/p:sld/p:cSld/p:spTree/p:sp[" + OString::number(nShapeIndex + 1) + "]/p:spPr"; + const OString sXfrm = sSpPr + "/a:xfrm"; + if (data[nShapeIndex][nDataIndex++] == "1") + assertXPath(pXmlDocContent, sXfrm, "flipH"_ostr, "1"); + if (data[nShapeIndex][nDataIndex++] == "1") + assertXPath(pXmlDocContent, sXfrm, "flipV"_ostr, "1"); + assertXPath(pXmlDocContent, sXfrm, "rot"_ostr, "20400000"); + const OString sOff = sXfrm + "/a:off"; + assertXPath(pXmlDocContent, sOff, "x"_ostr, data[nShapeIndex][nDataIndex++]); + assertXPath(pXmlDocContent, sOff, "y"_ostr, data[nShapeIndex][nDataIndex++]); + const OString sExt = sXfrm + "/a:ext"; + assertXPath(pXmlDocContent, sExt, "cx"_ostr, "1800000"); + assertXPath(pXmlDocContent, sExt, "cy"_ostr, "3600000"); + + for (size_t nPointIndex = 0; nPointIndex < SAL_N_ELEMENTS(points); nPointIndex++) + { + const OString sPt = sSpPr + "/a:custGeom/a:pathLst/a:path/a:lnTo[" + + OString::number(nPointIndex + 1) + "]/a:pt"; + assertXPath(pXmlDocContent, sPt, "x"_ostr, points[nPointIndex][0]); + assertXPath(pXmlDocContent, sPt, "y"_ostr, points[nPointIndex][1]); + } + assertXPath(pXmlDocContent, sSpPr + "/a:custGeom/a:pathLst/a:path/a:close", 1); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf106867) +{ + createSdImpressDoc("pptx/tdf106867.pptx"); + save("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + + // first check that we have the media object + const SdrMediaObj* pMediaObj = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT_MESSAGE("no media object", pMediaObj != nullptr); + CPPUNIT_ASSERT_EQUAL(OUString("vnd.sun.star.Package:ppt/media/media1.avi"), + pMediaObj->getURL()); + + // additional checks of the output file + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + // check that the document contains the video stream + CPPUNIT_ASSERT(xNameAccess->hasByName("ppt/media/media1.avi")); + + // both the ooxml and the extended markup + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/a:videoFile"_ostr); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/p:extLst/p:ext/p14:media"_ostr); + + // target the shape with the video in the command + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/" + "p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:cmd/" + "p:cBhvr/p:tgtEl/p:spTgt"_ostr, + "spid"_ostr, "67"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112280) +{ + createSdImpressDoc("pptx/tdf112280.pptx"); + save("Impress Office Open XML"); + + // check the animRot value + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath( + pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/" + "p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animRot"_ostr, + "by"_ostr, "21600000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112088) +{ + createSdImpressDoc("pptx/tdf112088.pptx"); + save("Impress Office Open XML"); + + // check gradient stops + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPathChildren(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:gradFill/a:gsLst"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112333) +{ + createSdImpressDoc("pptx/tdf112333.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + OUString sTo = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/" + "p:cTn/p:childTnLst/p:set[1]/p:to/p:strVal"_ostr, + "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("solid"), sTo); + + OUString sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:set[1]/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("fill.type"), sAttributeName); + + sTo = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/" + "p:set[2]/p:to/p:strVal"_ostr, + "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("true"), sTo); + + sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:set[2]/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("fill.on"), sAttributeName); + + sTo = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/" + "p:animClr/p:to/a:srgbClr"_ostr, + "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("0563c1"), sTo); + + sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:animClr/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("fillcolor"), sAttributeName); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112552) +{ + // Background fill was not displayed, but it was because of the wrong geometry + createSdImpressDoc("odp/tdf112552.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path"_ostr, "w"_ostr, + "21600"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path"_ostr, "h"_ostr, + "21600"); + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt"_ostr, + "x"_ostr, "21600"); + assertXPath( + pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt"_ostr, + "y"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112557) +{ + // Subtitle shape should be skipped by export. + createSdImpressDoc("odp/tdf112557.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slideMasters/slideMaster1.xml"); + assertXPath(pXmlDocContent, "/p:sldMaster/p:cSld/p:spTree/p:sp"_ostr, 2); // title and object +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf128049) +{ + createSdImpressDoc("odp/tdf128049.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom"_ostr, 0); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom"_ostr, + "prst"_ostr, "noSmoking"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst/a:gd"_ostr, "name"_ostr, + "adj"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst/a:gd"_ostr, "fmla"_ostr, + "val 12500"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf106026) +{ + createSdImpressDoc("odp/tdf106026.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlMasterContent = parseExport("ppt/slideMasters/slideMaster1.xml"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "1417"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "1134"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[3]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "850"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[4]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "567"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[5]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "283"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[6]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "283"); + assertXPath(pXmlMasterContent, + "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[7]/a:pPr/a:spcBef/a:spcPts"_ostr, + "val"_ostr, "283"); + + xmlDocUniquePtr pXmlSlideContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlSlideContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr/a:spcAft/a:spcPts"_ostr, + "val"_ostr, "11339"); + assertXPath(pXmlSlideContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:spcAft/a:spcPts"_ostr, + "val"_ostr, "11339"); + assertXPath(pXmlSlideContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr/a:spcAft/a:spcPts"_ostr, + "val"_ostr, "11339"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112334) +{ + createSdImpressDoc("pptx/tdf112334.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + OUString sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:animClr[1]/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("style.color"), sAttributeName); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112089) +{ + createSdImpressDoc("pptx/tdf112089.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + OUString sID = getXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:cNvPr"_ostr, + "id"_ostr); + OUString sTarget = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt"_ostr, + "spid"_ostr); + CPPUNIT_ASSERT_EQUAL(sID, sTarget); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112086) +{ + createSdImpressDoc("pptx/tdf112086.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + OUString sVal = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/" + "p:cTn/p:childTnLst/p:anim[2]/p:tavLst/p:tav/p:val/p:fltVal"_ostr, + "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("0"), sVal); + + OUString sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:anim[1]/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("ppt_w"), sAttributeName); + + sVal = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/" + "p:anim[2]/p:tavLst/p:tav/p:val/p:fltVal"_ostr, + "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("0"), sVal); + + sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:anim[2]/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("ppt_h"), sAttributeName); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112647) +{ + createSdImpressDoc("odp/tdf112647.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + css::style::LineSpacing aLineSpacing; + xPropSet->getPropertyValue("ParaLineSpacing") >>= aLineSpacing; + CPPUNIT_ASSERT_EQUAL(sal_Int16(css::style::LineSpacingMode::FIX), aLineSpacing.Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2117), aLineSpacing.Height); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testGroupRotation) +{ + createSdImpressDoc("odp/group_rotation.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:grpSpPr/a:xfrm"_ostr, + "rot"_ostr); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[1]/p:spPr/a:xfrm"_ostr, + "rot"_ostr, "20400000"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[2]/p:spPr/a:xfrm"_ostr, + "rot"_ostr, "20400000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf104788) +{ + createSdImpressDoc("pptx/tdf104788.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide6.xml"); + + OUString sVal = getXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/" + "p:childTnLst/p:par[2]/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:anim[2]"_ostr, + "to"_ostr); + CPPUNIT_ASSERT_EQUAL(-1.0, sVal.toDouble()); + + OUString sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par[2]/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:anim[2]/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("xshear"), sAttributeName); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testSmartartRotation2) +{ + createSdImpressDoc("pptx/smartart-rotation2.pptx"); + + // clear SmartArt data to check how group shapes with double-rotated children are exported, not smartart + // NOTE: Resetting the GrabBag data is a *very* indirect way to reset the SmartArt functionality. + // Since this worked before and there is not (yet?) a better way to do it using UNO API, I added + // code to support this for now + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Sequence aInteropGrabBag; + xShape->setPropertyValue("InteropGrabBag", uno::Any(aInteropGrabBag)); + + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPathContent(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:txBody/a:p/a:r/a:t"_ostr, "Text"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:txBody/a:bodyPr"_ostr, + "rot"_ostr, "10800000"); + double dX + = getXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:spPr/a:xfrm/a:off"_ostr, "x"_ostr) + .toDouble(); + double dY + = getXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:spPr/a:xfrm/a:off"_ostr, "y"_ostr) + .toDouble(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(2276280.0, dX, dX * .001); + CPPUNIT_ASSERT_DOUBLES_EQUAL(3158280.0, dY, dY * .001); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf91999_rotateShape) +{ + createSdImpressDoc("pptx/tdf91999_rotateShape.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr"_ostr, "name"_ostr, + "CustomShape 2"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "10800000"); + double dX = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off"_ostr, + "x"_ostr) + .toDouble(); + double dY = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off"_ostr, + "y"_ostr) + .toDouble(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(2960640.0, dX, dX * .001); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1449000.0, dY, dY * .001); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf114845_rotateShape) +{ + createSdImpressDoc("pptx/tdf114845_rotateShape.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:nvCxnSpPr/p:cNvPr"_ostr, + "name"_ostr, "Straight Arrow Connector 9"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:xfrm"_ostr, + "flipV"_ostr, "1"); + double dX = getXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:xfrm/a:off"_ostr, "x"_ostr) + .toDouble(); + double dY = getXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:xfrm/a:off"_ostr, "y"_ostr) + .toDouble(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4059000.0, dX, dX * .001); + CPPUNIT_ASSERT_DOUBLES_EQUAL(3287520.0, dY, dY * .001); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testGroupsPosition) +{ + createSdImpressDoc("pptx/group.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[1]/p:spPr/a:xfrm/a:off"_ostr, "x"_ostr, + "5004000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[1]/p:spPr/a:xfrm/a:off"_ostr, "y"_ostr, + "3310560"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[3]/p:spPr/a:xfrm/a:off"_ostr, "x"_ostr, + "7760160"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[3]/p:spPr/a:xfrm/a:off"_ostr, "y"_ostr, + "3310560"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testGroupsRotatedPosition) +{ + createSdImpressDoc("pptx/group-rot.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[3]/p:spPr/a:xfrm/a:off"_ostr, + "x"_ostr, "2857320"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[3]/p:spPr/a:xfrm/a:off"_ostr, + "y"_ostr, "4026960"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testAccentColor) +{ + createSdImpressDoc("pptx/accent-color.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:style/a:fillRef/a:schemeClr"_ostr, + "val"_ostr, "accent6"); + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp/p:style/a:fillRef/a:schemeClr"_ostr, + "val"_ostr, "accent6"); + xmlDocUniquePtr pXmlDocTheme1 = parseExport("ppt/theme/theme1.xml"); + assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr"_ostr, + "val"_ostr, "70ad47"); + xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme12.xml"); + assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr"_ostr, + "val"_ostr, "deb340"); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Motyw pakietu Office + // - Actual : Office Theme + // i.e. the theme and color scheme name was lost on export. + assertXPath(pXmlDocTheme1, "/a:theme"_ostr, "name"_ostr, "Motyw pakietu Office"); + assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme"_ostr, "name"_ostr, + "Pakiet Office"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testThemeColors) +{ + createSdImpressDoc("pptx/tdf84205.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme1.xml"); + assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr"_ostr, + "val"_ostr, "44546a"); + assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent3/a:srgbClr"_ostr, + "val"_ostr, "a5a5a5"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf111785) +{ + createSdImpressDoc("odp/tdf111785.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + + // Without the fix in place, this test would have failed with + // - Expected: ed1c24 + // - Actual : ffffff + assertXPath(pXmlDocRels, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:pattFill/a:bgClr/a:srgbClr"_ostr, + "val"_ostr, "ed1c24"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf118825) +{ + createSdImpressDoc("odp/tdf118825-motionpath.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + CPPUNIT_ASSERT_MOTIONPATH( + u"M 0.0449285714285714 0.00368253968253968 C 0.0575714285714285 -0.00095238095238096 " + u"0.0704264795523803 -0.00370117418637049 0.0831071428571428 -0.00819047619047622 C " + u"0.0953550597998766 -0.0125265741339082 0.107821870086751 -0.010397536991717 " + u"0.120321428571429 -0.0115555555555556 C 0.133179018681433 -0.0127467438724762 " + u"0.151318627483861 -0.0158700272533852 0.1585 0.00539682539682542 C 0.16478291361998 " + u"0.0240029898688431 0.15828642886492 0.0483806254341085 0.161392857142857 " + u"0.0698412698412698 C 0.165179286017685 0.0959996731216037 0.17453898927982 " + u"0.119735912694626 0.187142857142857 0.132634920634921 C 0.199788991845377 " + u"0.145577185161529 0.215607110490848 0.142889773028431 0.230107142857143 " + u"0.142857142857143 C 0.243821417584191 0.142826280916829 0.257716514999779 " + u"0.142685979556724 0.271142857142857 0.137777777777778 C 0.286895094567923 " + u"0.132019309914514 0.302318190711873 0.122962218306185 0.317928571428571 0.11568253968254 " + u"C 0.333496771884548 0.108422531222479 0.348787823719556 0.0990570571890929 " + u"0.363714285714286 0.0885079365079364 C 0.374930683062651 0.080580865157908 " + u"0.385357142857143 0.0693333333333332 0.396178571428571 0.0596825396825396 L " + u"0.404785714285714 0.0410158730158729 L 0.401892857142857 0.0342222222222221 E", + getXPath(pXmlDocContent, "(//p:animMotion)[1]"_ostr, "path"_ostr)); + CPPUNIT_ASSERT_MOTIONPATH(u"M 0.025 0.0571428571428571 L 0.0821428571428571 0.184126984126984 " + u"L -0.175 0.234920634920635 L -0.246428571428571 " + u"-0.0190476190476191 L -0.0821428571428573 -0.133333333333333 E", + getXPath(pXmlDocContent, "(//p:animMotion)[2]"_ostr, "path"_ostr)); + CPPUNIT_ASSERT_MOTIONPATH( + u"M -0.0107142857142857 0.00634920634920635 C -0.110714285714286 0.501587301587301 " + u"-0.153571428571429 -0.00634920634920635 -0.246428571428572 0.184126984126984 C " + u"-0.339285714285715 0.374603174603175 -0.296428571428572 0.514285714285714 " + u"-0.267857142857143 0.603174603174603 C -0.239285714285715 0.692063492063492 " + u"0.0607142857142858 0.590476190476191 0.0607142857142858 0.590476190476191 E", + getXPath(pXmlDocContent, "(//p:animMotion)[3]"_ostr, "path"_ostr)); + CPPUNIT_ASSERT_MOTIONPATH(u"M 0.0535714285714286 -0.0444444444444444 L 0.132142857142857 " + u"-0.0444444444444444 L 0.132142857142857 -0.146031746031746 L " + u"0.0964285714285715 -0.146031746031746 E", + getXPath(pXmlDocContent, "(//p:animMotion)[4]"_ostr, "path"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTextColumns_tdf140852) +{ + // The document defines two columns in slideLayout12.xml, but explicitly redefines + // in slide1.xml. Here we check that the redefinition in the slide takes precedence. + + createSdImpressDoc("pptx/tdf140852.pptx"); + { + uno::Reference xPage(getPage(0)); + uno::Reference xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference const xParagraph(getParagraphFromShape(0, xProps)); + CPPUNIT_ASSERT_EQUAL(OUString("Training will be treated as part of sharing the sweet when " + "it comes to serving ice cream"), + xParagraph->getString()); + uno::Reference xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(1000)), + xColProps->getPropertyValue("AutomaticDistance")); + } + save("Impress Office Open XML"); + + { + uno::Reference xPage(getPage(0)); + uno::Reference xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference const xParagraph(getParagraphFromShape(0, xProps)); + CPPUNIT_ASSERT_EQUAL(OUString("Training will be treated as part of sharing the sweet when " + "it comes to serving ice cream"), + xParagraph->getString()); + uno::Reference xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(1000)), + xColProps->getPropertyValue("AutomaticDistance")); + } + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, "numCol"_ostr, + "1"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, "spcCol"_ostr, + "360000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTextColumns_3columns) +{ + createSdImpressDoc("pptx/3columns.pptx"); + { + uno::Reference xPage(getPage(0)); + uno::Reference xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(300)), + xColProps->getPropertyValue("AutomaticDistance")); + // Scale value may be unstable; just test that the text is actually scaled + double fScale; + CPPUNIT_ASSERT(xProps->getPropertyValue("TextFitToSizeScale") >>= fScale); + CPPUNIT_ASSERT_GREATER(0.0, fScale); + CPPUNIT_ASSERT_LESS(100.0, fScale); + } + + save("Impress Office Open XML"); + + { + uno::Reference xPage(getPage(0)); + uno::Reference xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(300)), + xColProps->getPropertyValue("AutomaticDistance")); + // Scale value may be unstable; just test that the text is actually scaled + double fScale; + CPPUNIT_ASSERT(xProps->getPropertyValue("TextFitToSizeScale") >>= fScale); + CPPUNIT_ASSERT_GREATER(0.0, fScale); + CPPUNIT_ASSERT_LESS(100.0, fScale); + } + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, "numCol"_ostr, + "3"); + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr"_ostr, "spcCol"_ostr, + "108000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf59323_slideFooters) +{ + createSdImpressDoc("pptx/tdf59323.pptx"); + + save("Impress Office Open XML"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xDoc->getDrawPages()->getCount()); + + for (int nPageIndex = 0; nPageIndex < 3; nPageIndex++) + { + uno::Reference xPage(getPage(0)); + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, xPropSet->getPropertyValue("IsFooterVisible").get()); + CPPUNIT_ASSERT_EQUAL(true, xPropSet->getPropertyValue("IsDateTimeVisible").get()); + CPPUNIT_ASSERT_EQUAL(true, xPropSet->getPropertyValue("IsPageNumberVisible").get()); + } + + // Test placeholder indexes + xmlDocUniquePtr pXmlDocMaster = parseExport("ppt/slideMasters/slideMaster1.xml"); + assertXPath(pXmlDocMaster, "//p:ph [@type='dt']"_ostr, "idx"_ostr, "1"); + assertXPath(pXmlDocMaster, "//p:ph [@type='ftr']"_ostr, "idx"_ostr, "2"); + assertXPath(pXmlDocMaster, "//p:ph [@type='sldNum']"_ostr, "idx"_ostr, "3"); + + xmlDocUniquePtr pXmlDocSlide1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocSlide1, "//p:ph [@type='dt']"_ostr, "idx"_ostr, "1"); + assertXPath(pXmlDocSlide1, "//p:ph [@type='ftr']"_ostr, "idx"_ostr, "2"); + assertXPath(pXmlDocSlide1, "//p:ph [@type='sldNum']"_ostr, "idx"_ostr, "3"); + + // Test if datetime fields have text in them + // This is needed for backwards compatibility + assertXPath(pXmlDocSlide1, "//a:fld [@type='datetime1']/a:t"_ostr); + + // tdf#143316: Without the fix in place, this test would have failed with + // - Expected: 1 + // - Actual : 0 + assertXPath(pXmlDocSlide1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:fld/a:rPr"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf53970) +{ + // Embedded media file + { + createSdImpressDoc("odp/tdf53970.odp"); + saveAndReload("Impress Office Open XML"); + + // Without fix in place, the media shape was lost on export. + CPPUNIT_ASSERT(getPage(0)->hasElements()); + } + + // Linked media file + { + createSdImpressDoc("odp/tdf53970_linked.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlRels = parseExport("ppt/slides/_rels/slide1.xml.rels"); + CPPUNIT_ASSERT(pXmlRels); + assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@TargetMode='External']"_ostr, + 2); + + uno::Reference xShape(getShape(0, getPage(0))); + CPPUNIT_ASSERT(xShape.is()); + OUString sVideoURL; + + // Without fix in place, the media shape was imported as an image after export + // and this test would have failed with exception of type com.sun.star.beans.UnknownPropertyException + CPPUNIT_ASSERT_MESSAGE("MediaURL property is not set", + xShape->getPropertyValue("MediaURL") >>= sVideoURL); + CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sVideoURL.isEmpty()); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx new file mode 100644 index 0000000000..106073c478 --- /dev/null +++ b/sd/qa/unit/export-tests-ooxml3.cxx @@ -0,0 +1,999 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include "sdmodeltestbase.hxx" +#include +#include +#include +#include + +#include + +class SdOOXMLExportTest3 : public SdModelTestBase +{ +public: + SdOOXMLExportTest3() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + + int testTdf115005_FallBack_Images(bool bAddReplacementImages); +}; + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf153105) +{ + createSdImpressDoc("odp/tdf153105.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:stretch/a:fillRect"_ostr, + "l"_ostr, "20000"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:stretch/a:fillRect"_ostr, + "t"_ostr, "30000"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:stretch/a:fillRect"_ostr, + "r"_ostr, "20000"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:stretch/a:fillRect"_ostr, + "b"_ostr, "30000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf92222) +{ + createSdImpressDoc("pptx/tdf92222.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocTheme = parseExport("ppt/theme/theme1.xml"); + assertXPath(pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:lnStyleLst/a:ln[1]"_ostr, + "w"_ostr, "6350"); + assertXPath(pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:lnStyleLst/a:ln[2]"_ostr, + "w"_ostr, "12700"); + assertXPath(pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:lnStyleLst/a:ln[3]"_ostr, + "w"_ostr, "19050"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf129430) +{ + createSdImpressDoc("odp/tdf129430.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:pPr/a:lnSpc/a:spcPct"_ostr, + "val"_ostr, "100000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf114848) +{ + createSdImpressDoc("pptx/tdf114848.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocTheme1 = parseExport("ppt/theme/theme1.xml"); + assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr"_ostr, + "val"_ostr, "1f497d"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf147586) +{ + createSdImpressDoc("pptx/tdf147586.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + // Without the fix in place, this test would have failed with + // - Expected: 227fc7 + // - Actual : 4f4f4f + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p[1]/a:pPr/a:buClr/a:srgbClr"_ostr, + "val"_ostr, "227fc7"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p[2]/a:pPr/a:buClr/a:srgbClr"_ostr, + "val"_ostr, "227fc7"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf68759) +{ + createSdImpressDoc("odp/tdf68759.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[1]/p:spPr/a:xfrm/a:off"_ostr, + "x"_ostr, "1687320"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[1]/p:spPr/a:xfrm/a:off"_ostr, + "y"_ostr, "1615320"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, + "1"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm"_ostr, "rot"_ostr, + "9600000"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm/a:off"_ostr, + "x"_ostr, "3847320"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm/a:off"_ostr, + "y"_ostr, "1614600"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[3]/p:spPr/a:xfrm"_ostr, "flipH"_ostr, + "1"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[3]/p:spPr/a:xfrm/a:off"_ostr, + "x"_ostr, "5934960"); + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[3]/p:spPr/a:xfrm/a:off"_ostr, + "y"_ostr, "1615320"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf127901) +{ + createSdImpressDoc("odp/tdf127901.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:lum"_ostr, + "bright"_ostr, "70000"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:lum"_ostr, + "contrast"_ostr, "-70000"); + + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:grayscl"_ostr, + 1); + + xmlDocUniquePtr pXmlDocContent3 = parseExport("ppt/slides/slide3.xml"); + assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:biLevel"_ostr, + "thresh"_ostr, "50000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf48735) +{ + createSdImpressDoc("odp/tdf48735.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect"_ostr, "b"_ostr, + "23627"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect"_ostr, "l"_ostr, + "23627"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect"_ostr, "r"_ostr, + "23627"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect"_ostr, "t"_ostr, + "18842"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf90626) +{ + createSdImpressDoc("odp/tdf90626.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr/a:buSzPct"_ostr, "val"_ostr, + "100000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buSzPct"_ostr, "val"_ostr, + "150142"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr/a:buSzPct"_ostr, "val"_ostr, + "100000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[4]/a:pPr/a:buSzPct"_ostr, "val"_ostr, + "150142"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf107608) +{ + createSdImpressDoc("pptx/tdf107608.pptx"); + save("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); + + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + xPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, aFillStyle); + + bool bBackgroundFill = false; + xPropSet->getPropertyValue("FillBackground") >>= bBackgroundFill; + CPPUNIT_ASSERT(bBackgroundFill); + + Color nBackgroundColor; + xPropSet->getPropertyValue("FillColor") >>= nBackgroundColor; + CPPUNIT_ASSERT_EQUAL(Color(0x92D050), nBackgroundColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf111786) +{ + // Export line transparency with the color + + createSdImpressDoc("pptx/tdf111786.pptx"); + save("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); + + Color nLineColor; + xPropSet->getPropertyValue("LineColor") >>= nLineColor; + CPPUNIT_ASSERT_EQUAL(Color(0x3465A4), nLineColor); + + sal_Int16 nTransparency; + xPropSet->getPropertyValue("LineTransparence") >>= nTransparency; + CPPUNIT_ASSERT_EQUAL(static_cast(33), nTransparency); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testFontScale) +{ + createSdImpressDoc("pptx/font-scale.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + // Rounding errors possible, approximate value (+/- 1%) + OUString sScale = getXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:normAutofit"_ostr, + "fontScale"_ostr); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(81111), sScale.toInt32(), 1000); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testShapeAutofitPPTX) +{ + createSdImpressDoc("pptx/testShapeAutofit.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + CPPUNIT_ASSERT(pXmlDocContent); + + // TextAutoGrowHeight --> "Resize shape to fit text" --> true + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr/a:spAutoFit"_ostr, + 1); + // TextAutoGrowHeight --> "Resize shape to fit text" --> false + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr/a:noAutofit"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testLegacyShapeAutofitPPTX) +{ + createSdImpressDoc("odp/testLegacyShapeAutofit.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + CPPUNIT_ASSERT(pXmlDocContent); + + // Text in a legacy rectangle + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr/a:noAutofit"_ostr, + 1); + // Text in (closed) Polygon + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr/a:noAutofit"_ostr, + 1); + // Text in a legacy ellipse + assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:txBody/a:bodyPr/a:noAutofit"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf115394) +{ + createSdImpressDoc("pptx/tdf115394.pptx"); + save("Impress Office Open XML"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + double fTransitionDuration; + + // Slow in MS formats + SdPage* pPage1 = pDoc->GetSdPage(0, PageKind::Standard); + fTransitionDuration = pPage1->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration); + + // Medium in MS formats + SdPage* pPage2 = pDoc->GetSdPage(1, PageKind::Standard); + fTransitionDuration = pPage2->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration); + + // Fast in MS formats + SdPage* pPage3 = pDoc->GetSdPage(2, PageKind::Standard); + fTransitionDuration = pPage3->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration); + + // Custom values + SdPage* pPage4 = pDoc->GetSdPage(3, PageKind::Standard); + fTransitionDuration = pPage4->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.25, fTransitionDuration); + + SdPage* pPage5 = pDoc->GetSdPage(4, PageKind::Standard); + fTransitionDuration = pPage5->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(4.25, fTransitionDuration); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf115394Zero) +{ + createSdImpressDoc("pptx/tdf115394-zero.pptx"); + save("Impress Office Open XML"); + double fTransitionDuration; + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + SdPage* pPage = pDoc->GetSdPage(0, PageKind::Standard); + fTransitionDuration = pPage->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.01, fTransitionDuration); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf115005) +{ + createSdImpressDoc("odp/tdf115005.odp"); + save("impress8"); + + // additional checks of the output file + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, maTempFile.GetURL()); + + // check that the document contains original vector images + const uno::Sequence names = xNameAccess->getElementNames(); + int nSVMFiles = 0; + for (OUString const& s : names) + { + if (s.endsWith(".svm")) + nSVMFiles++; + } + CPPUNIT_ASSERT_EQUAL(3, nSVMFiles); +} + +int SdOOXMLExportTest3::testTdf115005_FallBack_Images(bool bAddReplacementImages) +{ + createSdImpressDoc("odp/tdf115005_no_fallback_images.odp"); + + // check if fallback images were not created if AddReplacementImages=true/false + // set AddReplacementImages + { + std::shared_ptr batch( + comphelper::ConfigurationChanges::create()); + if (!officecfg::Office::Common::Save::Graphic::AddReplacementImages::isReadOnly()) + officecfg::Office::Common::Save::Graphic::AddReplacementImages::set( + bAddReplacementImages, batch); + batch->commit(); + } + + // save the file with already set options + save("impress8"); + + // additional checks of the output file + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, maTempFile.GetURL()); + + // check that the document contains original vector images + const uno::Sequence names = xNameAccess->getElementNames(); + int nSVMFiles = 0; + int nPNGFiles = 0; + for (OUString const& n : names) + { + if (n.endsWith(".svm")) + nSVMFiles++; + if (n.endsWith(".png") && n != "Thumbnails/thumbnail.png") // Ignore the thumbnail + nPNGFiles++; + } + + // check results + CPPUNIT_ASSERT_EQUAL(1, nSVMFiles); + return nPNGFiles; +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf115005_FallBack_Images_On) +{ + const int nPNGFiles = testTdf115005_FallBack_Images(true); + CPPUNIT_ASSERT_EQUAL(1, nPNGFiles); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf115005_FallBack_Images_Off) +{ + const int nPNGFiles = testTdf115005_FallBack_Images(false); + CPPUNIT_ASSERT_EQUAL(0, nPNGFiles); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf118806) +{ + createSdImpressDoc("odp/tdf118806.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "//p:animMotion"_ostr, "origin"_ostr, "layout"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf130058) +{ + createSdImpressDoc("pptx/tdf130058.pptx"); + save("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + bool bHasShadow = false; + xShape->getPropertyValue("Shadow") >>= bHasShadow; + CPPUNIT_ASSERT(bHasShadow); + double fShadowDist = 0.0; + xShape->getPropertyValue("ShadowXDistance") >>= fShadowDist; + CPPUNIT_ASSERT_EQUAL(static_cast(0), fShadowDist); + xShape->getPropertyValue("ShadowYDistance") >>= fShadowDist; + CPPUNIT_ASSERT_EQUAL(static_cast(141), fShadowDist); + Color nColor; + xShape->getPropertyValue("ShadowColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + sal_Int32 nTransparency = 0; + xShape->getPropertyValue("ShadowTransparence") >>= nTransparency; + CPPUNIT_ASSERT_EQUAL(static_cast(57), nTransparency); + double fShadowSizeX = 0.0; + xShape->getPropertyValue("ShadowSizeX") >>= fShadowSizeX; + CPPUNIT_ASSERT_EQUAL(static_cast(1000), fShadowSizeX); + double fShadowSizeY = 0.0; + xShape->getPropertyValue("ShadowSizeY") >>= fShadowSizeY; + CPPUNIT_ASSERT_EQUAL(static_cast(1000), fShadowSizeY); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf111789) +{ + // Shadow properties were not exported for text shapes. + + createSdImpressDoc("pptx/tdf111789.pptx"); + save("Impress Office Open XML"); + + // First text shape has some shadow + { + uno::Reference xShape(getShapeFromPage(0, 0)); + bool bHasShadow = false; + xShape->getPropertyValue("Shadow") >>= bHasShadow; + CPPUNIT_ASSERT(bHasShadow); + double fShadowDist = 0.0; + xShape->getPropertyValue("ShadowXDistance") >>= fShadowDist; + CPPUNIT_ASSERT_EQUAL(static_cast(274), fShadowDist); + xShape->getPropertyValue("ShadowYDistance") >>= fShadowDist; + CPPUNIT_ASSERT_EQUAL(static_cast(274), fShadowDist); + Color nColor; + xShape->getPropertyValue("ShadowColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor); + sal_Int32 nTransparency = 0; + xShape->getPropertyValue("ShadowTransparence") >>= nTransparency; + CPPUNIT_ASSERT_EQUAL(static_cast(7), nTransparency); + double fShadowSizeX = 0.0; + xShape->getPropertyValue("ShadowSizeX") >>= fShadowSizeX; + CPPUNIT_ASSERT_EQUAL(static_cast(100000), fShadowSizeX); + double fShadowSizeY = 0.0; + xShape->getPropertyValue("ShadowSizeY") >>= fShadowSizeY; + CPPUNIT_ASSERT_EQUAL(static_cast(100000), fShadowSizeY); + } + + // Second text shape has no shadow + { + uno::Reference xShape(getShapeFromPage(1, 0)); + bool bHasShadow = false; + xShape->getPropertyValue("Shadow") >>= bHasShadow; + CPPUNIT_ASSERT(!bHasShadow); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf145162) +{ + createSdImpressDoc("pptx/tdf145162.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone"_ostr); + // Before the fix, that tag was missing so PP put bullet to each para. +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testZeroIndentExport) +{ + // Load the bugdoc and save to pptx then. + + createSdImpressDoc("odp/testZeroIndent.odp"); + save("Impress Office Open XML"); + // There are 3 slides, get them + xmlDocUniquePtr pSlide1 = parseExport("ppt/slides/slide1.xml"); + xmlDocUniquePtr pSlide2 = parseExport("ppt/slides/slide2.xml"); + xmlDocUniquePtr pSlide3 = parseExport("ppt/slides/slide3.xml"); + + CPPUNIT_ASSERT(pSlide1); + CPPUNIT_ASSERT(pSlide2); + CPPUNIT_ASSERT(pSlide3); + + // Each slide has 3 paragraphs, one full line, an empty and a normal para. + // Check the indent and bullet. These have to match with PP. Before the fix, + // they were different. + assertXPath(pSlide1, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone"_ostr); + + assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr/a:buNone"_ostr); + assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr"_ostr, "indent"_ostr, + "0"); + assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone"_ostr); + assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr"_ostr, "indent"_ostr, + "0"); + assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr/a:buNone"_ostr); + assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr"_ostr, "indent"_ostr, + "0"); + + assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr"_ostr, "indent"_ostr, + "0"); + assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone"_ostr); + assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr"_ostr, "indent"_ostr, + "0"); + assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr"_ostr, "indent"_ostr, + "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf100348_convert_Fontwork2TextWarp) +{ + createSdImpressDoc("odp/tdf100348_Fontwork2TextWarp.odp"); + save("Impress Office Open XML"); + + // Resulting pptx has to contain the TextWarp shape + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart( + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr/a:prstTxWarp"_ostr); + assertXPath(pXmlDocContent, sPathStart + "[@prst='textWave1']"); + const OString sPathAdj(sPathStart + "/a:avLst/a:gd"); + assertXPath(pXmlDocContent, sPathAdj + "[@name='adj1' and @fmla='val 18750']"); + assertXPath(pXmlDocContent, sPathAdj + "[@name='adj2' and @fmla='val -7500']"); + + // Reloading has to get the Fontwork shape back + // TextPath makes a custom shape to a Fontwork shape, so must exist + uno::Reference xShapeWavePropSet(getShapeFromPage(0, 0)); + auto aGeomPropSeq = xShapeWavePropSet->getPropertyValue("CustomShapeGeometry") + .get>(); + auto aGeomPropVec + = comphelper::sequenceToContainer>(aGeomPropSeq); + OUString sName = "TextPath"; + auto aIterator = std::find_if( + aGeomPropVec.begin(), aGeomPropVec.end(), + [sName](const beans::PropertyValue& rValue) { return rValue.Name == sName; }); + CPPUNIT_ASSERT_MESSAGE("No TextPath", aIterator != aGeomPropVec.end()); + + // Type has to be same as in original document on roundtrip. + sName = "Type"; + auto aIterator2 = std::find_if( + aGeomPropVec.begin(), aGeomPropVec.end(), + [sName](const beans::PropertyValue& rValue) { return rValue.Name == sName; }); + CPPUNIT_ASSERT_MESSAGE("No Type", aIterator2 != aGeomPropVec.end()); + OUString sOwnName; + aIterator2->Value >>= sOwnName; + CPPUNIT_ASSERT_EQUAL(OUString("fontwork-wave"), sOwnName); + + // Adjustmentvalues need to be the same. + sName = "AdjustmentValues"; + auto aIterator3 = std::find_if( + aGeomPropVec.begin(), aGeomPropVec.end(), + [sName](const beans::PropertyValue& rValue) { return rValue.Name == sName; }); + CPPUNIT_ASSERT_MESSAGE("No AdjustmentValues", aIterator3 != aGeomPropVec.end()); + uno::Sequence aAdjValueSeq; + aIterator3->Value >>= aAdjValueSeq; + double fAdj1; + aAdjValueSeq[0].Value >>= fAdj1; + double fAdj2; + aAdjValueSeq[1].Value >>= fAdj2; + CPPUNIT_ASSERT_EQUAL(4050.0, fAdj1); // odp values, not pptx values + CPPUNIT_ASSERT_EQUAL(9180.0, fAdj2); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf125573_FontWorkScaleX) +{ + createSdImpressDoc("pptx/tdf125573_FontWorkScaleX.pptx"); + save("Impress Office Open XML"); + + // Error was, that attribute 'fromWordArt' was ignored + // ensure, resulting pptx has fromWordArt="1" on textArchDown shape + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr[@fromWordArt='1']"_ostr); + + // Error was, that text in legacy shapes of category "Follow Path" was not scaled to the path. + uno::Reference xShapeArchProps(getShapeFromPage(0, 0)); + awt::Rectangle aBoundRectArch; + xShapeArchProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRectArch; + // BoundRect is DPI dependent, thus allow some range. + // Expected width is 13139 in 96dpi and is 13106 in 120 dpi, for example + // (Without fix Expected less than: 85 Actual : 10432) + CPPUNIT_ASSERT_LESS(sal_Int32(85), std::abs(aBoundRectArch.Width - 13145)); + + // Error was, that text in shapes of category "Warp" was not scaled to the path. + uno::Reference xShapeWaveProps(getShapeFromPage(0, 1)); + awt::Rectangle aBoundRectWave; + xShapeWaveProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRectWave; + // BoundRect is DPI dependent, thus allow some range. + // Expected with is 11576 in 96dpt and is 11578 in 120dpi, for example + CPPUNIT_ASSERT_LESS(sal_Int32(85), std::abs(aBoundRectWave.Width - 11576)); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf99497_keepAppearanceOfCircleKind) +{ + // Error was, that all CircleKind were exported to 'ellipse'. + // Resulting pptx has to contain the customshapes of the corresponding kind + // slide 1 ARC -> arc, slide 2 CUT -> chord, slide 3 SECTION -> pie + // Adjustment values need to exist and their values need to correspond to the + // original angles. Shape 'arc' needs to be unfilled. + createSdImpressDoc("odp/tdf99497_CircleKind.odp"); + save("Impress Office Open XML"); + + // slide 1 45° -> adj1 = 20493903, 270° -> adj2 = 5400000, exists + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart1("/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom"_ostr); + assertXPath(pXmlDocContent1, sPathStart1 + "[@prst='arc']"); + const OString sPathAdj1(sPathStart1 + "/a:avLst/a:gd"); + assertXPath(pXmlDocContent1, sPathAdj1 + "[@name='adj1' and @fmla='val 20493903']"); + assertXPath(pXmlDocContent1, sPathAdj1 + "[@name='adj2' and @fmla='val 5400000']"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:noFill"_ostr); + + // slide 2 270° -> adj1 = 5400000, 180° -> adj2 = 10800000 + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide2.xml"); + static constexpr OString sPathStart2("/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom"_ostr); + assertXPath(pXmlDocContent2, sPathStart2 + "[@prst='chord']"); + const OString sPathAdj2(sPathStart2 + "/a:avLst/a:gd"); + assertXPath(pXmlDocContent2, sPathAdj2 + "[@name='adj1' and @fmla='val 5400000']"); + assertXPath(pXmlDocContent2, sPathAdj2 + "[@name='adj2' and @fmla='val 10800000']"); + + // slide 3 120° -> adj1 = 12600000, 30° -> adj2 = 20946396 + xmlDocUniquePtr pXmlDocContent3 = parseExport("ppt/slides/slide3.xml"); + static constexpr OString sPathStart3("/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom"_ostr); + assertXPath(pXmlDocContent3, sPathStart3 + "[@prst='pie']"); + const OString sPathAdj3(sPathStart3 + "/a:avLst/a:gd"); + assertXPath(pXmlDocContent3, sPathAdj3 + "[@name='adj1' and @fmla='val 12600000']"); + assertXPath(pXmlDocContent3, sPathAdj3 + "[@name='adj2' and @fmla='val 20946396']"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf104792) +{ + createSdImpressDoc("pptx/tdf104792-smart-art-animation.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst[1]/p:seq/p:cTn/p:childTnLst[1]/" + "p:par[1]/p:cTn/p:childTnLst[1]/p:par/p:cTn/p:childTnLst[1]/p:par/p:cTn/" + "p:childTnLst[1]/p:set/p:cBhvr/p:tgtEl/p:spTgt"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf90627) +{ + createSdImpressDoc("odp/tdf90627.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + // Don't export empty endCondLst without cond. + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst[1]/p:seq/p:cTn/p:childTnLst[1]/" + "p:par[2]/p:cTn/p:childTnLst[1]/p:par/p:cTn/p:childTnLst[1]/p:par/p:cTn/" + "p:endCondLst[not(*)]"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf104786) +{ + createSdImpressDoc("pptx/tdf104786.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide2.xml"); + // Don't export empty 'to' + assertXPath(pXmlDocContent, + "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst[1]/p:seq/p:cTn/p:childTnLst[1]/" + "p:par[2]/p:cTn/p:childTnLst[1]/p:par/p:cTn/p:childTnLst[1]/p:par/p:cTn/" + "p:childTnLst/p:set[2]/p:to"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf118783) +{ + createSdImpressDoc("odp/tdf118783.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + OUString sAttributeName + = getXPathContent(pXmlDocContent, "//p:animRot/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("r"), sAttributeName); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf104789) +{ + createSdImpressDoc("pptx/tdf104789.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + OUString sAttributeName = getXPathContent( + pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/" + "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/" + "p:childTnLst/p:set/p:cBhvr/p:attrNameLst/p:attrName"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("style.opacity"), sAttributeName); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testOpenDocumentAsReadOnly) +{ + createSdImpressDoc("pptx/open-as-read-only.pptx"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::DrawDocShell* pDocShell = pXImpressDocument->GetDocShell(); + CPPUNIT_ASSERT(pDocShell->IsSecurityOptOpenReadOnly()); + save("Impress Office Open XML"); + pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + pDocShell = pXImpressDocument->GetDocShell(); + CPPUNIT_ASSERT(pDocShell->IsSecurityOptOpenReadOnly()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf118835) +{ + createSdImpressDoc("odp/tdf118835.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "(//p:animClr)[1]"_ostr, "clrSpc"_ostr, "rgb"); + assertXPathContent(pXmlDocContent, "(//p:animClr)[1]//p:attrName"_ostr, "style.color"); + assertXPath(pXmlDocContent, "(//p:animClr)[1]//p:to/a:srgbClr"_ostr, "val"_ostr, "ed1c24"); + + assertXPath(pXmlDocContent, "(//p:animClr)[2]"_ostr, "clrSpc"_ostr, "rgb"); + assertXPathContent(pXmlDocContent, "(//p:animClr)[2]//p:attrName"_ostr, "stroke.color"); + assertXPath(pXmlDocContent, "(//p:animClr)[2]//p:to/a:srgbClr"_ostr, "val"_ostr, "333399"); + + assertXPath(pXmlDocContent, "(//p:animClr)[3]"_ostr, "clrSpc"_ostr, "rgb"); + assertXPathContent(pXmlDocContent, "(//p:animClr)[3]//p:attrName"_ostr, "fillcolor"); + assertXPath(pXmlDocContent, "(//p:animClr)[3]//p:to/a:srgbClr"_ostr, "val"_ostr, "fcd3c1"); + + assertXPath(pXmlDocContent, "(//p:animClr)[5]"_ostr, "clrSpc"_ostr, "hsl"); + assertXPathContent(pXmlDocContent, "(//p:animClr)[5]//p:attrName"_ostr, "fillcolor"); + assertXPath(pXmlDocContent, "(//p:animClr)[5]//p:by/p:hsl"_ostr, "h"_ostr, "10800000"); + assertXPath(pXmlDocContent, "(//p:animClr)[5]//p:by/p:hsl"_ostr, "s"_ostr, "0"); + assertXPath(pXmlDocContent, "(//p:animClr)[5]//p:by/p:hsl"_ostr, "l"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf118768) +{ + createSdImpressDoc("odp/tdf118768-brake.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "//p:anim[1]"_ostr, "from"_ostr, "(-#ppt_w/2)"); + assertXPath(pXmlDocContent, "//p:anim[1]"_ostr, "to"_ostr, "(#ppt_x)"); + assertXPath(pXmlDocContent, "//p:anim[2]"_ostr, "from"_ostr, "0"); + + assertXPath(pXmlDocContent, "//p:anim[2]"_ostr, "to"_ostr, "-1"); + assertXPath(pXmlDocContent, "//p:anim[2]/p:cBhvr/p:cTn"_ostr, "autoRev"_ostr, "1"); + + assertXPath(pXmlDocContent, "//p:anim[3]"_ostr, "by"_ostr, "(#ppt_h/3+#ppt_w*0.1)"); + assertXPath(pXmlDocContent, "//p:anim[3]/p:cBhvr/p:cTn"_ostr, "autoRev"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf118836) +{ + createSdImpressDoc("odp/tdf118836.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "//p:animScale/p:by"_ostr, "x"_ostr, "250000"); + assertXPath(pXmlDocContent, "//p:animScale/p:by"_ostr, "y"_ostr, "250000"); +} + +static double getAdjustmentValue(const uno::Reference& xSet) +{ + auto aGeomPropSeq + = xSet->getPropertyValue("CustomShapeGeometry").get>(); + auto aGeomPropVec + = comphelper::sequenceToContainer>(aGeomPropSeq); + + auto aIterator = std::find_if( + aGeomPropVec.begin(), aGeomPropVec.end(), + [](const beans::PropertyValue& rValue) { return rValue.Name == "AdjustmentValues"; }); + + if (aIterator != aGeomPropVec.end()) + { + uno::Sequence aAdjustment; + double fResult = 0.0; + aIterator->Value >>= aAdjustment; + aAdjustment[0].Value >>= fResult; + return fResult; + } + + return -1.0; +} + +static bool getScaleXValue(const uno::Reference& xSet) +{ + bool bScaleX = false; + + auto aGeomPropSeq + = xSet->getPropertyValue("CustomShapeGeometry").get>(); + auto aGeomPropVec + = comphelper::sequenceToContainer>(aGeomPropSeq); + + auto aIterator = std::find_if( + aGeomPropVec.begin(), aGeomPropVec.end(), + [](const beans::PropertyValue& rValue) { return rValue.Name == "TextPath"; }); + + if (aIterator != aGeomPropVec.end()) + { + uno::Sequence aTextPathProperties; + aIterator->Value >>= aTextPathProperties; + auto aIterator2 = std::find_if( + std::cbegin(aTextPathProperties), std::cend(aTextPathProperties), + [](const beans::PropertyValue& rValue) { return rValue.Name == "ScaleX"; }); + + if (aIterator2 != std::cend(aTextPathProperties)) + { + aIterator2->Value >>= bScaleX; + } + } + + return bScaleX; +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf116350TextEffects) +{ + createSdImpressDoc("pptx/tdf116350-texteffects.pptx"); + + // Default angle for ArchUp + uno::Reference xShape0(getShapeFromPage(0, 0)); + double fAdjust = getAdjustmentValue(xShape0); + CPPUNIT_ASSERT_EQUAL(180.0, fAdjust); + + bool bScaleX = getScaleXValue(xShape0); + CPPUNIT_ASSERT_EQUAL(true, bScaleX); + + // Default angle for ArchDown + uno::Reference xShape14(getShapeFromPage(14, 0)); + fAdjust = getAdjustmentValue(xShape14); + CPPUNIT_ASSERT_EQUAL(0.0, fAdjust); + + bScaleX = getScaleXValue(xShape14); + CPPUNIT_ASSERT_EQUAL(true, bScaleX); + + // Angle directly set + uno::Reference xShape1(getShapeFromPage(1, 0)); + fAdjust = getAdjustmentValue(xShape1); + CPPUNIT_ASSERT_EQUAL(213.25, fAdjust); + + bScaleX = getScaleXValue(xShape1); + CPPUNIT_ASSERT_EQUAL(true, bScaleX); + + // Export + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "//p:sp[1]/p:txBody/a:bodyPr/a:prstTxWarp"_ostr, "prst"_ostr, + "textArchUp"); + assertXPath(pXmlDocContent, "//p:sp[14]/p:txBody/a:bodyPr/a:prstTxWarp"_ostr, "prst"_ostr, + "textCircle"); + assertXPath(pXmlDocContent, "//p:sp[14]/p:spPr/a:solidFill/a:srgbClr"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf128096) +{ + createSdImpressDoc("odp/tdf128096.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, + "//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:highlight/a:srgbClr"_ostr, + "val"_ostr, "ffff00"); + + // Check that underlined content is also highlighted + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pXmlDocContent2, + "//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:highlight/a:srgbClr"_ostr, + "val"_ostr, "ffff00"); +} +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf120573) +{ + createSdImpressDoc("pptx/tdf120573.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/a:audioFile"_ostr, 1); + assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/a:videoFile"_ostr, 0); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath(pXmlDocRels, + "(/rels:Relationships/rels:Relationship[@Target='../media/media1.wav'])[1]"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio"); + + xmlDocUniquePtr pXmlContentType = parseExport("[Content_Types].xml"); + assertXPath(pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/media1.wav']"_ostr, + "ContentType"_ostr, "audio/x-wav"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf119118) +{ + createSdImpressDoc("pptx/tdf119118.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, "//p:iterate"_ostr, "type"_ostr, "lt"); + assertXPath(pXmlDocContent, "//p:tmAbs"_ostr, "val"_ostr, "200"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf99213) +{ + createSdImpressDoc("odp/tdf99213-target-missing.odp"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + // Number of nodes with p:attrNameLst was 3, including one that missed tgtEl + assertXPath(pXmlDocContent, "//p:attrNameLst"_ostr, 2); + // Timenode that miss its target element should be filtered. + assertXPath(pXmlDocContent, "//p:attrNameLst/preceding-sibling::p:tgtEl"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testPotxExport) +{ + // Create new document + createSdImpressDoc(); + + // Export as a POTM template + save("Impress Office Open XML Template"); + + // Load and check content type + xmlDocUniquePtr pContentTypes = parseExport("[Content_Types].xml"); + CPPUNIT_ASSERT(pContentTypes); + assertXPath(pContentTypes, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/presentation.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf44223) +{ + createSdImpressDoc("pptx/tdf44223.pptx"); + save("Impress Office Open XML"); + + std::unique_ptr const pStream1( + parseExportStream(maTempFile.GetURL(), "ppt/media/audio1.wav")); + CPPUNIT_ASSERT_EQUAL(sal_uInt64(11140), pStream1->remainingSize()); + + std::unique_ptr const pStream2( + parseExportStream(maTempFile.GetURL(), "ppt/media/audio2.wav")); + CPPUNIT_ASSERT_EQUAL(sal_uInt64(28074), pStream2->remainingSize()); + + xmlDocUniquePtr pXmlContentType = parseExport("[Content_Types].xml"); + assertXPath(pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/audio1.wav']"_ostr, + "ContentType"_ostr, "audio/x-wav"); + + assertXPath(pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/audio2.wav']"_ostr, + "ContentType"_ostr, "audio/x-wav"); + + xmlDocUniquePtr pDoc1 = parseExport("ppt/slides/slide1.xml"); + + // tdf#124230 all nodes were under p:childTnLst, but event triggered nodes need + // to be under p:subTnLst, especially for audio to work correctly. + // Start condition: 0s after timenode id 5 begins. + assertXPath(pDoc1, "//p:subTnLst/p:audio/p:cMediaNode/p:cTn/p:stCondLst/p:cond"_ostr, + "evt"_ostr, "begin"); + assertXPath(pDoc1, "//p:subTnLst/p:audio/p:cMediaNode/p:cTn/p:stCondLst/p:cond"_ostr, + "delay"_ostr, "0"); + assertXPath(pDoc1, "//p:subTnLst/p:audio/p:cMediaNode/p:cTn/p:stCondLst/p:cond/p:tn"_ostr, + "val"_ostr, "5"); + + xmlDocUniquePtr pDoc2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pDoc2, "//p:transition/p:sndAc/p:stSnd/p:snd[@r:embed]"_ostr, 2); + + xmlDocUniquePtr pRels1 = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath(pRels1, "//rels:Relationship[@Id='rId1']"_ostr, "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio"); + assertXPath(pRels1, "//rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, + "../media/audio1.wav"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf135843) +{ + createSdImpressDoc("pptx/tdf135843_export.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + static constexpr OString sPathStart( + "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl"_ostr); + assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnL/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnR/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnT/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnB/a:solidFill"); + + assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnL/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnR/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnT/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnB/a:solidFill"); + + assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnL/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnR/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnT/a:solidFill"); + assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnB/a:solidFill"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/export-tests-ooxml4.cxx b/sd/qa/unit/export-tests-ooxml4.cxx new file mode 100644 index 0000000000..b09614454d --- /dev/null +++ b/sd/qa/unit/export-tests-ooxml4.cxx @@ -0,0 +1,1104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +class SdOOXMLExportTest4 : public SdModelTestBase +{ +public: + SdOOXMLExportTest4() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testSmartArtPreserve) +{ + createSdImpressDoc("pptx/smartart-preserve.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:cNvPr"_ostr); + assertXPath(pXmlDoc, + "//p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/dgm:relIds"_ostr); + assertXPath( + pXmlDoc, + "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:nvPr/p:extLst/p:ext"_ostr, + "uri"_ostr, "{D42A27DB-BD31-4B8C-83A1-F6EECF244321}"); + assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:nvPr/" + "p:extLst/p:ext/p14:modId"_ostr); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/_rels/slide1.xml.rels"); + assertXPath( + pXmlDocRels, + "(/rels:Relationships/rels:Relationship[@Target='../diagrams/layout1.xml'])[1]"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramLayout"); + assertXPath(pXmlDocRels, + "(/rels:Relationships/rels:Relationship[@Target='../diagrams/data1.xml'])[1]"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramData"); + assertXPath( + pXmlDocRels, + "(/rels:Relationships/rels:Relationship[@Target='../diagrams/colors1.xml'])[1]"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramColors"); + assertXPath( + pXmlDocRels, + "(/rels:Relationships/rels:Relationship[@Target='../diagrams/quickStyle1.xml'])[1]"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramQuickStyle"); + + xmlDocUniquePtr pXmlContentType = parseExport("[Content_Types].xml"); + assertXPath( + pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/layout1.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml"); + assertXPath(pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/data1.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml"); + assertXPath( + pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/colors1.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml"); + assertXPath( + pXmlContentType, + "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/quickStyle1.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125346) +{ + // There are two themes in the test document, make sure we use the right theme + + createSdImpressDoc("pptx/tdf125346.pptx"); + save("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); + + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + xPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); + + Color nFillColor; + xPropSet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125346_2) +{ + // There are two themes in the test document, make sure we use the right theme + // Test more slides with different themes + + createSdImpressDoc("pptx/tdf125346_2.pptx"); + save("Impress Office Open XML"); + + { + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); + + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + xPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); + + Color nFillColor; + xPropSet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor); + } + + { + uno::Reference xShape(getShapeFromPage(0, 1)); + uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); + + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + xPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); + + Color nFillColor; + xPropSet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x052F61), nFillColor); + } + + { + uno::Reference xShape(getShapeFromPage(0, 2)); + uno::Reference xPropSet(xShape, uno::UNO_SET_THROW); + + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + xPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle); + + Color nFillColor; + xPropSet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125360) +{ + // Check whether the changed fill transparency is exported correctly. + // Color is defined by shape style + + createSdImpressDoc("pptx/tdf125360.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + + xShape->setPropertyValue("FillTransparence", uno::Any(static_cast(23))); + + save("Impress Office Open XML"); + + xShape.set(getShapeFromPage(0, 0)); + + sal_Int32 nTransparence = 0; + xShape->getPropertyValue("FillTransparence") >>= nTransparence; + CPPUNIT_ASSERT_EQUAL(static_cast(23), nTransparence); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125360_1) +{ + // Check whether the changed fill transparency is exported correctly. + // Color is defined by color scheme + + createSdImpressDoc("pptx/tdf125360_1.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + + xShape->setPropertyValue("FillTransparence", uno::Any(static_cast(23))); + + save("Impress Office Open XML"); + + xShape.set(getShapeFromPage(0, 0)); + + sal_Int32 nTransparence = 0; + xShape->getPropertyValue("FillTransparence") >>= nTransparence; + CPPUNIT_ASSERT_EQUAL(static_cast(23), nTransparence); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125360_2) +{ + // Check whether the changed fill transparency is exported correctly. + // Color is defined by color scheme with a transparency + + createSdImpressDoc("pptx/tdf125360_2.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + + sal_Int32 nTransparence = 0; + xShape->getPropertyValue("FillTransparence") >>= nTransparence; + CPPUNIT_ASSERT_EQUAL(static_cast(82), nTransparence); + + xShape->setPropertyValue("FillTransparence", uno::Any(static_cast(23))); + + save("Impress Office Open XML"); + + xShape.set(getShapeFromPage(0, 0)); + + nTransparence = 0; + xShape->getPropertyValue("FillTransparence") >>= nTransparence; + CPPUNIT_ASSERT_EQUAL(static_cast(23), nTransparence); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125551) +{ + createSdImpressDoc("pptx/tdf125551.pptx"); + save("Impress Office Open XML"); + + uno::Reference xGroupShape(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xShapeBg(xGroupShape->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(static_cast(1024), xShapeBg->getPosition().X); + CPPUNIT_ASSERT_EQUAL(static_cast(576), xShapeBg->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(static_cast(10816), xShapeBg->getSize().Width); + CPPUNIT_ASSERT_EQUAL(static_cast(8588), xShapeBg->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf136830) +{ + createSdImpressDoc("pptx/tdf136830.pptx"); + save("Impress Office Open XML"); + + // Without the fix in place, the X position of the shapes would have been 0 + uno::Reference xGroupShape(getShapeFromPage(0, 0), uno::UNO_QUERY); + + uno::Reference xShape1(xGroupShape->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(14134), xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(static_cast(-5321), xShape1->getPosition().Y); + + uno::Reference xShape2(xGroupShape->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(8085), xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(static_cast(8085), xShape2->getPosition().Y); + + uno::Reference xShape3(xGroupShape->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(8283), xShape3->getPosition().X); + CPPUNIT_ASSERT_EQUAL(static_cast(4620), xShape3->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf126234) +{ + createSdImpressDoc("pptx/tdf126234.pptx"); + save("Impress Office Open XML"); + + // check relative size of the bullet, 400% is a legitimate value for MS Office document + // Without a fix, it will fail to set the size correctly + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(400), pNumFmt->GetNumRule().GetLevel(0).GetBulletRelSize()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf126741) +{ + createSdImpressDoc("pptx/tdf126741.pptx"); + save("Impress Office Open XML"); + + // dash dot dot line style import fix + // The original fixed values are replaced with the percent values, because + // with fix for tdf#127166 the MS Office preset styles are correctly detected. + const SdrPage* pPage = GetPage(1); + SdrObject* const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT(pObj); + + const XLineStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_LINESTYLE); + const XLineDashItem& rDashItem = pObj->GetMergedItem(XATTR_LINEDASH); + + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_DASH, rStyleItem.GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rDashItem.GetDashValue().GetDots()); + CPPUNIT_ASSERT_EQUAL(800.0, rDashItem.GetDashValue().GetDotLen()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rDashItem.GetDashValue().GetDashes()); + CPPUNIT_ASSERT_EQUAL(100.0, rDashItem.GetDashValue().GetDashLen()); + CPPUNIT_ASSERT_EQUAL(300.0, rDashItem.GetDashValue().GetDistance()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf127372) +{ + createSdImpressDoc("odp/tdf127372.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + awt::Gradient2 aTransparenceGradient; + xShape->getPropertyValue("FillTransparenceGradient") >>= aTransparenceGradient; + + // MCGR: Use the completely imported gradient to check for correctness + const basegfx::BColorStops aColorStops + = model::gradient::getColorStopsFromUno(aTransparenceGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[1].getStopColor())); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf127379) +{ + createSdImpressDoc("odp/tdf127379.odp"); + saveAndReload("Impress Office Open XML"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDoc->getDrawPages()->getCount()); + + uno::Reference xPage(getPage(0)); + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + + uno::Any aAny = xPropSet->getPropertyValue("Background"); + CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue()); + uno::Reference aXBackgroundPropSet; + aAny >>= aXBackgroundPropSet; + + drawing::FillStyle aFillStyle(drawing::FillStyle_NONE); + aXBackgroundPropSet->getPropertyValue("FillStyle") >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, aFillStyle); + + awt::Gradient2 aGradient; + CPPUNIT_ASSERT(aXBackgroundPropSet->getPropertyValue("FillGradient") >>= aGradient); + + // MCGR: Use the completely imported gradient to check for correctness + const basegfx::BColorStops aColorStops + = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xff0000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x2a6099), Color(aColorStops[1].getStopColor())); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf98603) +{ + createSdImpressDoc("pptx/tdf98603.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + css::lang::Locale aLocale; + xPropSet->getPropertyValue("CharLocaleComplex") >>= aLocale; + CPPUNIT_ASSERT_EQUAL(OUString("he"), aLocale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("IL"), aLocale.Country); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf128213) +{ + createSdImpressDoc("pptx/tdf128213.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm"_ostr, + "rot"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf79082) +{ + createSdImpressDoc("pptx/tdf79082.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]"_ostr, + "pos"_ostr, "360000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]"_ostr, + "algn"_ostr, "l"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]"_ostr, + "pos"_ostr, "756000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]"_ostr, + "algn"_ostr, "l"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]"_ostr, + "pos"_ostr, "1440000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]"_ostr, + "algn"_ostr, "ctr"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]"_ostr, + "pos"_ostr, "1800000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]"_ostr, + "algn"_ostr, "r"); + + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]"_ostr, + "pos"_ostr, "3240000"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]"_ostr, + "algn"_ostr, "dec"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf129372) +{ + //Without the fix in place, it would crash at import time + + createSdImpressDoc("pptx/tdf129372.pptx"); + saveAndReload("Impress Office Open XML"); + const SdrPage* pPage = GetPage(1); + + const SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeGlowEffect) +{ + createSdImpressDoc("pptx/shape-glow-effect.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + sal_Int32 nRadius = -1; + xShape->getPropertyValue("GlowEffectRadius") >>= nRadius; + CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 139700 EMU = 388.0556 mm/100 + Color nColor; + xShape->getPropertyValue("GlowEffectColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFFC000), nColor); + sal_Int16 nTransparency; + xShape->getPropertyValue("GlowEffectTransparency") >>= nTransparency; + CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nTransparency); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testUnderline) +{ + createSdImpressDoc("underline.fodp"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nColor; + xPropSet->getPropertyValue("CharColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, nColor); + + xPropSet->getPropertyValue("CharUnderlineColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nColor); + + sal_Int16 nUnderline; + xPropSet->getPropertyValue("CharUnderline") >>= nUnderline; + CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::DOUBLE, nUnderline); + + saveAndReload("Impress Office Open XML"); + + xShape.set(getShapeFromPage(0, 0)); + xParagraph.set(getParagraphFromShape(0, xShape)); + xRun.set(getRunFromParagraph(0, xParagraph)); + xPropSet.set(xRun, uno::UNO_QUERY_THROW); + + xPropSet->getPropertyValue("CharColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, nColor); + + xPropSet->getPropertyValue("CharUnderlineColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nColor); + + xPropSet->getPropertyValue("CharUnderline") >>= nUnderline; + CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::DOUBLE, nUnderline); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf119087) +{ + createSdImpressDoc("pptx/tdf119087.pptx"); + saveAndReload("Impress Office Open XML"); + // This would fail both on export validation, and reloading the saved pptx file. + + // Get first paragraph of the text + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + // Get first run of the paragraph + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nColor = COL_AUTO; + xPropSet->getPropertyValue("CharColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x00B050), nColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf131554) +{ + createSdImpressDoc("pptx/tdf131554.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(1, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(5622), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(static_cast(13251), xShape->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf132282) +{ + createSdImpressDoc("pptx/tdf132282.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_QUERY); + // Without the fix in place, the position would be 0,0, height = 1 and width = 1 + CPPUNIT_ASSERT_EQUAL(static_cast(1736), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(static_cast(763), xShape->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(static_cast(30523), xShape->getSize().Width); + CPPUNIT_ASSERT_EQUAL(static_cast(2604), xShape->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf132201EffectOrder) +{ + createSdImpressDoc("pptx/effectOrder.pptx"); + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/slides/slide1.xml"); + assertXPathChildren(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst"_ostr, + 2); + // The relative order of effects is important: glow must be before shadow + CPPUNIT_ASSERT_EQUAL( + 0, getXPathPosition(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst"_ostr, "glow")); + CPPUNIT_ASSERT_EQUAL( + 1, getXPathPosition(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst"_ostr, "outerShdw")); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeSoftEdgeEffect) +{ + createSdImpressDoc("pptx/shape-soft-edges.pptx"); + saveAndReload("Impress Office Open XML"); + auto xShapeProps(getShapeFromPage(0, 0)); + sal_Int32 nRadius = -1; + xShapeProps->getPropertyValue("SoftEdgeRadius") >>= nRadius; + CPPUNIT_ASSERT_EQUAL(sal_Int32(635), nRadius); // 18 pt +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testShapeShadowBlurEffect) +{ + createSdImpressDoc("pptx/shape-blur-effect.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xShape(getShapeFromPage(0, 0)); + bool bHasShadow = false; + xShape->getPropertyValue("Shadow") >>= bHasShadow; + CPPUNIT_ASSERT(bHasShadow); + sal_Int32 nRadius = -1; + xShape->getPropertyValue("ShadowBlur") >>= nRadius; + CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 11 pt +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf119223) +{ + createSdImpressDoc("odp/tdf119223.odp"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeCustomShape']"_ostr); + + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomePicture']"_ostr); + + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeFormula']"_ostr); + + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeLine']"_ostr); + + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeTextbox']"_ostr); + + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeTable']"_ostr); + + assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeGroup']"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf128213ShapeRot) +{ + createSdImpressDoc("pptx/tdf128213-shaperot.pptx"); + save("Impress Office Open XML"); + + xmlDocUniquePtr pXmlDocRels = parseExport("ppt/slides/slide1.xml"); + + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:scene3d"_ostr); + assertXPath(pXmlDocRels, + "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:scene3d/a:camera/a:rot"_ostr, + "rev"_ostr, "5400000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125560_textDeflate) +{ + createSdImpressDoc("pptx/ShapePlusImage.pptx"); + + // This problem did not affect the pptx export, only the ODP so assert that + save("impress8"); + + xmlDocUniquePtr pXmlDocRels = parseExport("content.xml"); + assertXPath(pXmlDocRels, + "/office:document-content/office:body/office:presentation/draw:page/" + "draw:custom-shape/draw:enhanced-geometry"_ostr, + "type"_ostr, "mso-spt161"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf125560_textInflateTop) +{ + createSdImpressDoc("pptx/ShapeTextInflateTop.pptx"); + + // This problem did not affect the pptx export, only the ODP so assert that + save("impress8"); + + xmlDocUniquePtr pXmlDocRels = parseExport("content.xml"); + assertXPath(pXmlDocRels, + "/office:document-content/office:body/office:presentation/draw:page/" + "draw:custom-shape/draw:enhanced-geometry"_ostr, + "type"_ostr, "mso-spt164"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf142235_TestPlaceholderTextAlignment) +{ + createSdImpressDoc("odp/placeholder-box-textalignment.odp"); + + save("Impress Office Open XML"); + + xmlDocUniquePtr pXml1 = parseExport("ppt/slides/slide2.xml"); + xmlDocUniquePtr pXml2 = parseExport("ppt/slides/slide3.xml"); + + // Without the fix in place many of these asserts failed, because alignment was bad. + + assertXPath(pXml1, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr"_ostr, "anchor"_ostr, "t"); + assertXPath(pXml2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr"_ostr, "anchor"_ostr, "t"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf96061_textHighlight) +{ + createSdImpressDoc("pptx/tdf96061.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph1(getParagraphFromShape(0, xShape)); + uno::Reference xRun1(getRunFromParagraph(0, xParagraph1)); + uno::Reference xPropSet1(xRun1, uno::UNO_QUERY_THROW); + + Color aColor; + xPropSet1->getPropertyValue("CharBackColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor); + + uno::Reference const xParagraph2(getParagraphFromShape(1, xShape)); + uno::Reference xRun2(getRunFromParagraph(0, xParagraph2)); + uno::Reference xPropSet2(xRun2, uno::UNO_QUERY_THROW); + xPropSet2->getPropertyValue("CharBackColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, aColor); + + saveAndReload("Impress Office Open XML"); + + uno::Reference xShape2(getShapeFromPage(0, 0)); + uno::Reference const xParagraph3(getParagraphFromShape(0, xShape2)); + uno::Reference xRun3(getRunFromParagraph(0, xParagraph3)); + uno::Reference xPropSet3(xRun3, uno::UNO_QUERY_THROW); + xPropSet3->getPropertyValue("CharBackColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor); + + uno::Reference const xParagraph4(getParagraphFromShape(1, xShape2)); + uno::Reference xRun4(getRunFromParagraph(0, xParagraph4)); + uno::Reference xPropSet4(xRun4, uno::UNO_QUERY_THROW); + xPropSet4->getPropertyValue("CharBackColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, aColor); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf143222_embeddedWorksheet) +{ + // Check import of embedded worksheet in slide. + + createSdImpressDoc("pptx/tdf143222.pptx"); + + const SdrPage* pPage = GetPage(1); + const SdrOle2Obj* pOleObj = static_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no object", pOleObj != nullptr); + + // Without the fix we lost the graphic of ole object. + const Graphic* pGraphic = pOleObj->GetGraphic(); + CPPUNIT_ASSERT_MESSAGE("no graphic", pGraphic != nullptr); + + // Check export of embedded worksheet in slide. + saveAndReload("Impress Office Open XML"); + + pPage = GetPage(1); + pOleObj = static_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no object after the export", pOleObj != nullptr); + + pGraphic = pOleObj->GetGraphic(); + CPPUNIT_ASSERT_MESSAGE("no graphic after the export", pGraphic != nullptr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf143315) +{ + createSdImpressDoc("ppt/tdf143315-WordartWithoutBullet.ppt"); + + save("Impress Office Open XML"); + + xmlDocUniquePtr pXml = parseExport("ppt/slides/slide1.xml"); + + // Without the fix in place, this would have failed with + // - Expected: + // - Actual : 216000 + // - In , XPath '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr' unexpected 'marL' attribute + + assertXPathNoAttribute(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr"_ostr, + "marL"_ostr); + assertXPathNoAttribute(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr"_ostr, + "indent"_ostr); + assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buClr"_ostr, 0); + assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buSzPct"_ostr, 0); + assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buFont"_ostr, 0); + assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buChar"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf147121) +{ + // Get the bugdoc + createSdImpressDoc("pptx/tdf147121.pptx"); + + // Get the second line props of the placeholder + uno::Reference xPage(getPage(0)); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xRun( + getRunFromParagraph(2, getParagraphFromShape(0, xShape)), uno::UNO_QUERY_THROW); + + // Save the font size + const auto nFontSizeBefore = xRun->getPropertyValue("CharHeight").get() * 100; + + save("Impress Office Open XML"); + + // Parse the export + xmlDocUniquePtr pXml = parseExport("ppt/slides/slide1.xml"); + const auto nFontSizeAfter + = getXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:br[1]/a:rPr"_ostr, "sz"_ostr) + .toFloat(); + + // The font size was not saved before now it must be equal with the saved one. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected font size", nFontSizeBefore, nFontSizeAfter); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf140912_PicturePlaceholder) +{ + // FIXME: the DPI check should be removed when either (1) the test is fixed to work with + // non-default DPI; or (2) unit tests on Windows are made to use svp VCL plugin. + // -8490 in the test below turns into -8014 on my Windows box with 150% scaling. + if (!IsDefaultDPI()) + return; + + createSdImpressDoc("pptx/tdfpictureplaceholder.pptx"); + + uno::Reference xShapeProps(getShapeFromPage(0, 0)); + bool bTextContourFrame = true; + xShapeProps->getPropertyValue("TextContourFrame") >>= bTextContourFrame; + CPPUNIT_ASSERT_EQUAL(false, bTextContourFrame); + + text::GraphicCrop aGraphicCrop; + xShapeProps->getPropertyValue("GraphicCrop") >>= aGraphicCrop; + CPPUNIT_ASSERT_EQUAL(static_cast(-8490), aGraphicCrop.Top); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testEnhancedPathViewBox) +{ + createSdImpressDoc("odp/tdf147978_enhancedPath_viewBox.odp"); + saveAndReload("Impress Office Open XML"); + auto xShapeProps(getShapeFromPage(0, 0)); + awt::Rectangle aBoundRectangle; + xShapeProps->getPropertyValue("BoundRect") >>= aBoundRectangle; + // The shape has a Bézier curve which does not touch the right edge. Prior to the fix the curve + // was stretched to touch the edge, resulting in 5098 curve width instead of 2045. + CPPUNIT_ASSERT_EQUAL(sal_Int32(2045), aBoundRectangle.Width); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf74670) +{ + createSdImpressDoc("odp/tdf74670.odp"); + save("Impress Office Open XML"); + + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + const uno::Sequence aNames(xNameAccess->getElementNames()); + int nImageFiles = 0; + for (const auto& rElementName : aNames) + if (rElementName.startsWith("ppt/media/image")) + nImageFiles++; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // i.e. the embedded picture would have been saved twice. + CPPUNIT_ASSERT_EQUAL(1, nImageFiles); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf109169_OctagonBevel) +{ + // The document has a shape 'Octagon Bevel'. It consists of an octagon with 8 points and eight + // facets with 4 points each, total 8+8*4=40 points. Without the patch it was exported as + // rectangle and thus had 4 points. + + createSdImpressDoc("odp/tdf109169_Octagon.odp"); + saveAndReload("Impress Office Open XML"); + + auto xPropSet(getShapeFromPage(0, 0)); + auto aGeomPropSeq = xPropSet->getPropertyValue("CustomShapeGeometry") + .get>(); + comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq); + auto aPathSeq((aCustomShapeGeometry["Path"]).get>()); + comphelper::SequenceAsHashMap aPath(aPathSeq); + auto aCoordinates( + (aPath["Coordinates"]).get>()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(40), aCoordinates.getLength()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf109169_DiamondBevel) +{ + // The document has a shape 'Diamond Bevel'. It consists of a diamond with 4 points and four + // facets with 4 points each, total 4+4*4=20 points. Without the patch it was exported as + // rectangle and thus had 4 points. + + createSdImpressDoc("odp/tdf109169_Diamond.odp"); + saveAndReload("Impress Office Open XML"); + + auto xPropSet(getShapeFromPage(0, 0)); + auto aGeomPropSeq = xPropSet->getPropertyValue("CustomShapeGeometry") + .get>(); + comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq); + auto aPathSeq((aCustomShapeGeometry["Path"]).get>()); + comphelper::SequenceAsHashMap aPath(aPathSeq); + auto aCoordinates( + (aPath["Coordinates"]).get>()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(20), aCoordinates.getLength()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf144092_emptyShapeTextProps) +{ + // Document contains one shape and one table. Both without any text but with + // text properties contained inside endParaRPr - The import and export + // of endParaRPr for empty cells and shapes are tested here + createSdImpressDoc("pptx/tdf144092-emptyShapeTextProps.pptx"); + saveAndReload("Impress Office Open XML"); + + Color aColor; + // check text properties of empty shape + uno::Reference xRectShapeProps(getShapeFromPage(1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Calibri"), + xRectShapeProps->getPropertyValue("CharFontName").get()); + CPPUNIT_ASSERT_EQUAL(float(196), xRectShapeProps->getPropertyValue("CharHeight").get()); + xRectShapeProps->getPropertyValue("CharColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(Color(0x70AD47), aColor); + + const SdrPage* pPage = GetPage(1); + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell; + + // check text properties of empty cells + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("CharColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFFFFFF), aColor); + + xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("CharColor") >>= aColor; + CPPUNIT_ASSERT_EQUAL(Color(0x70AD47), aColor); + CPPUNIT_ASSERT_EQUAL(float(96), xCell->getPropertyValue("CharHeight").get()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf149551_tbrl90) +{ + // The document contains a shape with writing mode TB_RL90. That is the same as vert="vert" in + // OOXML. Without the patch it was not possible to use this writing mode at all. + + createSdImpressDoc("odp/tdf149551_tbrl90.odp"); + + // Test, that the shape has writing mode TB_RL90. + uno::Reference xShapeProps(getShapeFromPage(0, 0)); + sal_Int16 eWritingMode; + xShapeProps->getPropertyValue("WritingMode") >>= eWritingMode; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL90, eWritingMode); + + // Test, that it is exported to vert="vert" + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "//a:bodyPr"_ostr, "vert"_ostr, "vert"); + + // Test, that the shape has writing mode TB_RL90 after read from pptx + uno::Reference xShapeProps2(getShapeFromPage(0, 0)); + sal_Int16 eWritingMode2; + xShapeProps2->getPropertyValue("WritingMode") >>= eWritingMode2; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL90, eWritingMode2); + + // Test, that it is written to odp with loext:writing-mode="tb-rl90" + save("impress8"); + pXmlDoc = parseExport("content.xml"); + assertXPath( + pXmlDoc, + "//style:style[@style:name='gr1']/style:graphic-properties[@loext:writing-mode='tb-rl90']"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf149551_btlr) +{ + // The document contains a shape with writing mode BT_LR. That is the same as vert="vert270" in + // OOXML. Without the patch it was not possible to use this writing mode at all for shapes. + + createSdImpressDoc("odp/tdf149551_btlr.odp"); + + // Test, that the shape has writing mode BT_LR. + uno::Reference xShapeProps(getShapeFromPage(0, 0)); + sal_Int16 eWritingMode; + xShapeProps->getPropertyValue("WritingMode") >>= eWritingMode; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, eWritingMode); + + // Test, that it is exported to vert="vert270" + save("Impress Office Open XML"); + xmlDocUniquePtr pXmlDoc = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDoc, "//a:bodyPr"_ostr, "vert"_ostr, "vert270"); + + // Test, that the shape has writing mode BT_LR after read from pptx + uno::Reference xShapeProps2(getShapeFromPage(0, 0)); + sal_Int16 eWritingMode2; + xShapeProps2->getPropertyValue("WritingMode") >>= eWritingMode2; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, eWritingMode2); + + // Test, that it is written to odp with loext:writing-mode="bt-lr" + save("impress8"); + pXmlDoc = parseExport("content.xml"); + assertXPath( + pXmlDoc, + "//style:style[@style:name='gr1']/style:graphic-properties[@loext:writing-mode='bt-lr']"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf94122_autoColor) +{ + // Document contains three pages, with different scenarios for automatic + // color export to pptx. + // - First page: Page background light, automatic colored text on a FillType_NONE shape + // - Second page: Page background dark, automatic colored text on a FillType_NONE shape + // - Third page: Page background light, automatic colored text on a dark colored fill + // and another automatic colored text on a light colored fill + + createSdImpressDoc("odp/tdf94122_autocolor.odp"); + + save("Impress Office Open XML"); + + // Without the accompanying fix in place, these tests would have failed with: + // - Expected: 1 + // - Actual : 0 + // - In ..., XPath '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr' number of nodes is incorrect + // i.e. automatic color wasn't resolved & exported + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, + "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, + "val"_ostr, "000000"); + + xmlDocUniquePtr pXmlDocContent2 = parseExport("ppt/slides/slide2.xml"); + assertXPath(pXmlDocContent2, + "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, + "val"_ostr, "ffffff"); + + xmlDocUniquePtr pXmlDocContent3 = parseExport("ppt/slides/slide3.xml"); + assertXPath(pXmlDocContent3, + "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, + "val"_ostr, "ffffff"); + assertXPath(pXmlDocContent3, + "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr"_ostr, + "val"_ostr, "000000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf124333) +{ + // Document contains one rectangle and one embedded OLE object. + + createSdImpressDoc("pptx/ole.pptx"); + + // Without the fix in place, the number of shapes was 3. + CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect", sal_Int32(2), + getPage(0)->getCount()); + + saveAndReload("Impress Office Open XML"); + + // Check number of shapes after export. + CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect after export", sal_Int32(2), + getPage(0)->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testAutofittedTextboxIndent) +{ + createSdImpressDoc("odp/autofitted-textbox-indent.odp"); + + save("Impress Office Open XML"); + + // Check that the indent hasn't changed and wasn't scaled when exporting + // (the behaviour changed). + + xmlDocUniquePtr pXmlDocContent1 = parseExport("ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:pPr"_ostr, + "marL"_ostr, "1080000"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf151622_oleIcon) +{ + createSdImpressDoc("odp/ole_icon.odp"); + + save("Impress Office Open XML"); + + xmlDocUniquePtr pXml = parseExport("ppt/slides/slide1.xml"); + + // Without the accompanying fix in place, this test would have failed with: + // - Expression: prop + // - In ..., XPath '//p:oleObj' no attribute 'showAsIcon' exist + // i.e. show as icon option wasn't exported. + assertXPath(pXml, "//p:oleObj"_ostr, "showAsIcon"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf152436) +{ + createSdImpressDoc("pptx/ole-emf_min.pptx"); + saveAndReload("Impress Office Open XML"); + + // Check number of shapes after export. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getPage(0)->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testLinkedOLE) +{ + createSdImpressDoc("odp/linked_ole.odp"); + + save("Impress Office Open XML"); + + xmlDocUniquePtr pXml = parseExport("ppt/slides/slide1.xml"); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - In<>, XPath '//p:oleObj' number of nodes is incorrect + // i.e. the linked ole object wasn't exported. + assertXPath(pXml, "//p:oleObj"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf102261_testParaTabStopDefaultDistance) +{ + createSdImpressDoc("pptx/tdf102261_testParaTabStopDefaultDistance.pptx"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + { + uno::Reference xPropSet(getParagraphFromShape(0, xShape), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL( + sal_Int32{ 1270 }, + xPropSet->getPropertyValue("ParaTabStopDefaultDistance").get()); + } + { + uno::Reference xPropSet(getParagraphFromShape(1, xShape), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL( + sal_Int32{ 2540 }, + xPropSet->getPropertyValue("ParaTabStopDefaultDistance").get()); + } +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTableCellVerticalPropertyRoundtrip) +{ + createSdImpressDoc("pptx/tcPr-vert-roundtrip.pptx"); + saveAndReload("Impress Office Open XML"); + + xmlDocUniquePtr pXml = parseExport("ppt/slides/slide1.xml"); + + assertXPath(pXml, "(//a:tcPr)[1]"_ostr, "vert"_ostr, "vert"); + assertXPath(pXml, "(//a:tcPr)[2]"_ostr, "vert"_ostr, "vert270"); + assertXPath(pXml, "(//a:tcPr)[3]"_ostr, "vert"_ostr, "wordArtVert"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf157740_slideMasters) +{ + createSdImpressDoc("pptx/tdf157740.pptx"); + saveAndReload("Impress Office Open XML"); + + // Test how many slidemaster we have + xmlDocUniquePtr pXmlDocContent = parseExport("ppt/presentation.xml"); + assertXPath(pXmlDocContent, "/p:presentation/p:sldMasterIdLst/p:sldMasterId"_ostr, 7); + + pXmlDocContent = parseExport("ppt/slideMasters/slideMaster1.xml"); + assertXPath(pXmlDocContent, "/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId"_ostr, 1); + + pXmlDocContent = parseExport("ppt/slideMasters/slideMaster7.xml"); + assertXPath(pXmlDocContent, "/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId"_ostr, 1); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx new file mode 100644 index 0000000000..428b09e983 --- /dev/null +++ b/sd/qa/unit/export-tests.cxx @@ -0,0 +1,1974 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include "sdmodeltestbase.hxx" +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace css; +using namespace css::animations; + +class SdExportTest : public SdModelTestBase +{ +public: + SdExportTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + +protected: + uno::Reference getBitmapFromTable(OUString const& rName); +}; + +uno::Reference SdExportTest::getBitmapFromTable(OUString const& rName) +{ + uno::Reference xBitmap; + + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + + try + { + uno::Reference xBitmapTable( + xFactory->createInstance("com.sun.star.drawing.BitmapTable"), uno::UNO_QUERY); + uno::Any rValue = xBitmapTable->getByName(rName); + if (rValue.has>()) + { + return rValue.get>(); + } + } + catch (const uno::Exception& /*rEx*/) + { + } + + return xBitmap; +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testBackgroundImage) +{ + // Initial bug: N821567 + + // Check if Slide background image is imported from PPTX and exported to PPTX, PPT and ODP correctly + + OUString bgImageName; + createSdImpressDoc("pptx/n821567.pptx"); + + // Check that imported background image from PPTX exists + { + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast(1), + xDoc->getDrawPages()->getCount()); + uno::Reference xPage(getPage(0)); + + uno::Reference xPropertySet(xPage, uno::UNO_QUERY); + uno::Any aAny = xPropertySet->getPropertyValue("Background"); + if (aAny.has>()) + { + uno::Reference xBackgroundPropSet; + aAny >>= xBackgroundPropSet; + aAny = xBackgroundPropSet->getPropertyValue("FillBitmapName"); + aAny >>= bgImageName; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide Background is not imported from PPTX correctly", + OUString("msFillBitmap 1"), bgImageName); + + uno::Reference xBitmap = getBitmapFromTable(bgImageName); + CPPUNIT_ASSERT_MESSAGE("Slide Background Bitmap is missing when imported from PPTX", + xBitmap.is()); + } + + // Save as PPTX, reload and check again so we make sure exporting to PPTX is working correctly + { + saveAndReload("Impress Office Open XML"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast(1), + xDoc->getDrawPages()->getCount()); + uno::Reference xPage(getPage(0)); + + uno::Reference xPropertySet(xPage, uno::UNO_QUERY); + uno::Any aAny = xPropertySet->getPropertyValue("Background"); + if (aAny.hasValue()) + { + uno::Reference xBackgroundPropSet; + aAny >>= xBackgroundPropSet; + aAny = xBackgroundPropSet->getPropertyValue("FillBitmapName"); + aAny >>= bgImageName; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide Background is not exported from PPTX correctly", + OUString("msFillBitmap 1"), bgImageName); + + uno::Reference xBitmap = getBitmapFromTable(bgImageName); + CPPUNIT_ASSERT_MESSAGE("Slide Background Bitmap is missing when exported from PPTX", + xBitmap.is()); + } + + // Save as ODP, reload and check again so we make sure exporting and importing to ODP is working correctly + { + saveAndReload("impress8"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast(1), + xDoc->getDrawPages()->getCount()); + uno::Reference xPage(getPage(0)); + + uno::Reference xPropertySet(xPage, uno::UNO_QUERY); + uno::Any aAny = xPropertySet->getPropertyValue("Background"); + if (aAny.hasValue()) + { + uno::Reference xBackgroundPropSet; + aAny >>= xBackgroundPropSet; + aAny = xBackgroundPropSet->getPropertyValue("FillBitmapName"); + aAny >>= bgImageName; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Slide Background is not exported or imported from ODP correctly", + OUString("msFillBitmap 1"), bgImageName); + + uno::Reference xBitmap = getBitmapFromTable(bgImageName); + CPPUNIT_ASSERT_MESSAGE( + "Slide Background Bitmap is missing when exported or imported from ODP", xBitmap.is()); + } +} + +namespace +{ +template +void checkFontAttributes(const SdrTextObj* pObj, ItemValue nVal, sal_uInt32 nId) +{ + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + const EditTextObject& aEdit = pObj->GetOutlinerParaObject()->GetTextObject(); + std::vector rLst; + aEdit.GetCharAttribs(0, rLst); + for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); ++it) + { + const ItemType* pAttrib = dynamic_cast((*it).pAttr); + if (pAttrib && pAttrib->Which() == nId) + { + CPPUNIT_ASSERT_EQUAL(nVal, static_cast(pAttrib->GetValue())); + } + } +} +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTransparentBackground) +{ + createSdImpressDoc("odp/transparent_background.odp"); + saveAndReload("impress8"); + + const SdrPage* pPage = GetPage(1); + + const SdrTextObj* pObj1 = DynCastSdrTextObj(pPage->GetObj(0)); + checkFontAttributes(pObj1, COL_TRANSPARENT, EE_CHAR_BKGCOLOR); + + const SdrTextObj* pObj2 = DynCastSdrTextObj(pPage->GetObj(1)); + checkFontAttributes(pObj2, COL_YELLOW, EE_CHAR_BKGCOLOR); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testDecorative) +{ + createSdImpressDoc("pptx/tdf141058-1.pptx"); + + auto doTest = [this](OString const test) { + ::std::set const decorative = { + "Picture 6"_ostr, + "Rectangle 7"_ostr, + "Group 24"_ostr, + "Connector: Elbow 9"_ostr, + "Connector: Elbow 11"_ostr, + "Connector: Elbow 14"_ostr, + "Connector: Elbow 17"_ostr, + "Straight Arrow Connector 21"_ostr, + "Straight Arrow Connector 22"_ostr, + "Straight Arrow Connector 23"_ostr, + }; + + uno::Reference const xPage(getPage(0)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(test.getStr(), sal_Int32(5), xPage->getCount()); + auto nDecorative(0); + auto nShapes(0); + auto nInnerDecorative(0); + auto nInnerShapes(0); + for (auto i = xPage->getCount(); i != 0; --i) + { + uno::Reference xShape(getShape(i - 1, xPage)); + uno::Reference xNamed(xShape, uno::UNO_QUERY); + OString const name(OUStringToOString(xNamed->getName(), RTL_TEXTENCODING_UTF8)); + if (decorative.find(name) != decorative.end()) + { + CPPUNIT_ASSERT_MESSAGE(OString(test + name).getStr(), + xShape->getPropertyValue("Decorative").get()); + ++nDecorative; + } + else + { + CPPUNIT_ASSERT_MESSAGE(OString(test + name).getStr(), + !xShape->getPropertyValue("Decorative").get()); + ++nShapes; + } + uno::Reference const xShapes(xShape, uno::UNO_QUERY); + if (xShapes.is()) + { + for (auto j = xShapes->getCount(); j != 0; --j) + { + uno::Reference xInnerShape(xShapes->getByIndex(i - 1), + uno::UNO_QUERY); + uno::Reference xInnerNamed(xInnerShape, uno::UNO_QUERY); + OString const innerName( + OUStringToOString(xInnerNamed->getName(), RTL_TEXTENCODING_UTF8)); + if (decorative.find(innerName) != decorative.end()) + { + CPPUNIT_ASSERT_MESSAGE( + OString(test + innerName).getStr(), + xInnerShape->getPropertyValue("Decorative").get()); + ++nInnerDecorative; + } + else + { + CPPUNIT_ASSERT_MESSAGE( + OString(test + innerName).getStr(), + !xInnerShape->getPropertyValue("Decorative").get()); + ++nInnerShapes; + } + } + } + } + CPPUNIT_ASSERT_EQUAL_MESSAGE(test.getStr(), static_cast(3), + nDecorative); + CPPUNIT_ASSERT_EQUAL_MESSAGE(test.getStr(), static_cast(2), nShapes); + CPPUNIT_ASSERT_EQUAL_MESSAGE(test.getStr(), static_cast(7), + nInnerDecorative); + CPPUNIT_ASSERT_EQUAL_MESSAGE(test.getStr(), static_cast(16), + nInnerShapes); + }; + + doTest("initial pptx load: "_ostr); + + saveAndReload("Impress Office Open XML"); + doTest("reload OOXML: "_ostr); + + saveAndReload("impress8"); + doTest("reload ODF: "_ostr); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf142716) +{ + createSdImpressDoc("pptx/tdf142716.pptx"); + saveAndReload("Impress Office Open XML"); + + const SdrPage* pPage = GetPage(1); + const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0)); + + OUString sText = pObj->GetOutlinerParaObject()->GetTextObject().GetText(0); + + // Without fix "yyy" part will be lost. + CPPUNIT_ASSERT_EQUAL(OUString("xxx and yyy"), sText); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testMediaEmbedding) +{ + createSdImpressDoc("media_embedding.odp"); + + const SdrPage* pPage = GetPage(1); + + // Second object is a sound + SdrMediaObj* pMediaObj = dynamic_cast(pPage->GetObj(3)); + CPPUNIT_ASSERT_MESSAGE("missing media object", pMediaObj != nullptr); + CPPUNIT_ASSERT_EQUAL(OUString("vnd.sun.star.Package:Media/button-1.wav"), + pMediaObj->getMediaProperties().getURL()); + CPPUNIT_ASSERT_EQUAL(OUString("application/vnd.sun.star.media"), + pMediaObj->getMediaProperties().getMimeType()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testFillBitmapUnused) +{ + createSdImpressDoc("odp/fillbitmap2.odp"); + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // shapes + assertXPath( + pXmlDoc, + "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']"_ostr, + 1); + assertXPath( + pXmlDoc, + "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']"_ostr, + "fill-image-name"_ostr, "nav_5f_up"); + assertXPath( + pXmlDoc, + "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='solid']"_ostr, + 1); + assertXPath(pXmlDoc, + "//style:style[@style:family='graphic']/" + "style:graphic-properties[@draw:fill='solid' and @draw:fill-image-name]"_ostr, + 0); + assertXPath( + pXmlDoc, + "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='solid']"_ostr, + "fill-color"_ostr, "#808080"); + + xmlDocUniquePtr pStyles = parseExport("styles.xml"); + // master slide presentation style + assertXPath(pStyles, + "/office:document-styles/office:styles/style:style[@style:family='presentation' " + "and @style:name='Default-background']/style:graphic-properties"_ostr, + "fill"_ostr, "bitmap"); + assertXPath(pStyles, + "/office:document-styles/office:styles/style:style[@style:family='presentation' " + "and @style:name='Default-background']/style:graphic-properties"_ostr, + "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pStyles, + "/office:document-styles/office:styles/style:style[@style:family='presentation' " + "and @style:name='Default_20_1-background']/style:graphic-properties"_ostr, + "fill"_ostr, "solid"); + assertXPath(pStyles, + "/office:document-styles/office:styles/style:style[@style:family='presentation' " + "and @style:name='Default_20_1-background']/style:graphic-properties"_ostr, + "fill-color"_ostr, "#808080"); + assertXPath( + pStyles, + "/office:document-styles/office:styles/style:style[@style:family='presentation' and " + "@style:name='Default_20_1-background']/style:graphic-properties[@draw:fill-image-name]"_ostr, + 0); + // master slide drawing-page style + assertXPath(pStyles, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/" + "style:drawing-page-properties"_ostr, + "fill"_ostr, "bitmap"); + assertXPath(pStyles, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/" + "style:drawing-page-properties"_ostr, + "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pStyles, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/" + "style:drawing-page-properties"_ostr, + "fill"_ostr, "solid"); + assertXPath(pStyles, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/" + "style:drawing-page-properties"_ostr, + "fill-color"_ostr, "#808080"); + assertXPath(pStyles, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/" + "style:drawing-page-properties[@draw:fill-image-name]"_ostr, + 0); + + // the named items + assertXPath(pStyles, "/office:document-styles/office:styles/draw:fill-image"_ostr, 1); + assertXPath(pStyles, "/office:document-styles/office:styles/draw:fill-image"_ostr, "name"_ostr, + "nav_5f_up"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testFdo84043) +{ + createSdImpressDoc("fdo84043.odp"); + saveAndReload("impress8"); + + // the bug was duplicate attributes, causing crash in a build with asserts + const SdrPage* pPage = GetPage(1); + SdrObject const* pShape = pPage->GetObj(1); + CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf97630) +{ + createSdImpressDoc("fit-to-size.fodp"); + { + uno::Reference xDP(getPage(0)); + + drawing::TextFitToSizeType tmp; + // text shapes + uno::Reference xShape0(xDP->getByIndex(0), uno::UNO_QUERY); + xShape0->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp); + uno::Reference xShape1(xDP->getByIndex(1), uno::UNO_QUERY); + xShape1->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp); + uno::Reference xShape2(xDP->getByIndex(2), uno::UNO_QUERY); + xShape2->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_ALLLINES, tmp); + uno::Reference xShape3(xDP->getByIndex(3), uno::UNO_QUERY); + xShape3->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_AUTOFIT, tmp); + + // fontworks + uno::Reference xShape4(xDP->getByIndex(4), uno::UNO_QUERY); + xShape4->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp); + uno::Reference xShape5(xDP->getByIndex(5), uno::UNO_QUERY); + xShape5->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_ALLLINES, tmp); + } + + saveAndReload("impress8"); + + { + uno::Reference xDP(getPage(0)); + + drawing::TextFitToSizeType tmp; + // text shapes + uno::Reference xShape0(xDP->getByIndex(0), uno::UNO_QUERY); + xShape0->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp); + uno::Reference xShape1(xDP->getByIndex(1), uno::UNO_QUERY); + xShape1->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp); + uno::Reference xShape2(xDP->getByIndex(2), uno::UNO_QUERY); + xShape2->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp); + uno::Reference xShape3(xDP->getByIndex(3), uno::UNO_QUERY); + xShape3->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_AUTOFIT, tmp); + + // fontworks + uno::Reference xShape4(xDP->getByIndex(4), uno::UNO_QUERY); + xShape4->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp); + uno::Reference xShape5(xDP->getByIndex(5), uno::UNO_QUERY); + xShape5->getPropertyValue("TextFitToSize") >>= tmp; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp); + } + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // text shapes + assertXPath(pXmlDoc, + "//style:style[@style:family='presentation']/" + "style:graphic-properties[@draw:fit-to-size='false' and " + "@style:shrink-to-fit='false']"_ostr, + 1); + assertXPath(pXmlDoc, + "//style:style[@style:family='presentation']/" + "style:graphic-properties[@draw:fit-to-size='true' and " + "@style:shrink-to-fit='false']"_ostr, + 2); + assertXPath(pXmlDoc, + "//style:style[@style:family='presentation']/" + "style:graphic-properties[@draw:fit-to-size='false' and " + "@style:shrink-to-fit='true']"_ostr, + 1); + // fontworks + assertXPath(pXmlDoc, + "//style:style[@style:family='graphic']/" + "style:graphic-properties[@draw:fit-to-size='false' and " + "@style:shrink-to-fit='false']"_ostr, + 1); + assertXPath(pXmlDoc, + "//style:style[@style:family='graphic']/" + "style:graphic-properties[@draw:fit-to-size='true' and " + "@style:shrink-to-fit='false']"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testImpressPasswordExport) +{ + std::vector vFormat{ "impress8", "Impress Office Open XML" }; + + for (size_t i = 0; i < vFormat.size(); i++) + { + createSdImpressDoc(); + + saveAndReload(vFormat[i], /*pPassword*/ "test"); + } +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testDrawPasswordExport) +{ + createSdDrawDoc(); + + saveAndReload("draw8", /*pPassword*/ "test"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testSwappedOutImageExport) +{ + // Problem was with the swapped out images, which were not swapped in during export. + + std::vector vFormat{ "impress8", "Impress Office Open XML", "MS PowerPoint 97" }; + + for (size_t i = 0; i < vFormat.size(); i++) + { + // Load the original file with one image + createSdImpressDoc("odp/document_with_two_images.odp"); + const OString sFailedMessage = "Failed on filter: " + vFormat[i].toUtf8(); + + // Export the document and import again for a check + saveAndReload(vFormat[i]); + + // Check whether graphic exported well after it was swapped out + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(2), + xDrawPagesSupplier->getDrawPages()->getCount()); + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW); + + uno::Reference xImage(xDrawPage->getByIndex(2), uno::UNO_QUERY); + uno::Reference XPropSet(xImage, uno::UNO_QUERY_THROW); + + // Check Graphic, Size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), + xGraphic->getType() != graphic::GraphicType::EMPTY); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(610), + xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(381), + xBitmap->getSize().Height); + } + + // Second Image + xDrawPage.set(xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW); + xImage.set(xDrawPage->getByIndex(1), uno::UNO_QUERY); + XPropSet.set(xImage, uno::UNO_QUERY_THROW); + + // Check Graphic, Size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), + xGraphic->getType() != graphic::GraphicType::EMPTY); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(900), + xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(600), + xBitmap->getSize().Height); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testOOoXMLAnimations) +{ + createSdImpressDoc("sxi/ooo41061-1.sxi"); + + // FIXME: Error: unexpected attribute "presentation:preset-property" + skipValidation(); + + save("impress8"); + + // the problem was that legacy OOoXML animations were lost if store + // immediately follows load because they were "converted" async by a timer + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//anim:par[@presentation:node-type='timing-root']"_ostr, 26); + // currently getting 52 of these without the fix (depends on timing) + assertXPath(pXmlDoc, "//anim:par"_ostr, 223); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testBnc480256) +{ + createSdImpressDoc("pptx/bnc480256.pptx"); + // In the document, there are two tables with table background properties. + // Make sure colors are set properly for individual cells. + + // TODO: If you are working on improving table background support, expect + // this unit test to fail. In that case, feel free to change the numbers. + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj; + uno::Reference xTable; + uno::Reference xCell; + Color nColor; + table::BorderLine2 aBorderLine; + + pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW); + + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x9bc3ee), nColor); + xCell->getPropertyValue("LeftBorder") >>= aBorderLine; + CPPUNIT_ASSERT_EQUAL(Color(0x5597d3), Color(ColorTransparency, aBorderLine.Color)); + + xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xc6ddff), nColor); + xCell->getPropertyValue("TopBorder") >>= aBorderLine; + CPPUNIT_ASSERT_EQUAL(Color(0x5597d3), Color(ColorTransparency, aBorderLine.Color)); + + pTableObj = dynamic_cast(pPage->GetObj(1)); + CPPUNIT_ASSERT(pTableObj); + xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW); + + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x6bace6), nColor); + xCell->getPropertyValue("LeftBorder") >>= aBorderLine; + CPPUNIT_ASSERT_EQUAL(Color(0xbecfe6), Color(ColorTransparency, aBorderLine.Color)); + + xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x4697e0), nColor); + + // This border should be invisible. + xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("BottomBorder") >>= aBorderLine; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), sal_Int32(aBorderLine.LineWidth)); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testUnknownAttributes) +{ + createSdImpressDoc("unknown-attribute.fodp"); + + // FIXME: Error: unexpected attribute "foo:non-existent-att" + skipValidation(); + + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/" + "style:style[@style:name='gr1']/" + "style:graphic-properties[@foo:non-existent-att='bar']"_ostr); + // TODO: if the namespace is *known*, the attribute is not preserved, but that seems to be a pre-existing problem, or maybe it's even intentional? + // assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='gr1']/style:graphic-properties[@svg:non-existent-att='blah']"); + // this was on style:graphic-properties on the import, but the export moves it to root node which is OK + assertXPathNSDef(pXmlDoc, "/office:document-content"_ostr, u"foo", u"http://example.com/"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf80020) +{ + createSdImpressDoc("odp/tdf80020.odp"); + { + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference xStyleFamily(xStyleFamilies->getByName("graphics"), + uno::UNO_QUERY); + uno::Reference xStyle(xStyleFamily->getByName("Test Style"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("text"), xStyle->getParentStyle()); + saveAndReload("impress8"); + } + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference xStyleFamily(xStyleFamilies->getByName("graphics"), + uno::UNO_QUERY); + uno::Reference xStyle(xStyleFamily->getByName("Test Style"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("text"), xStyle->getParentStyle()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf128985) +{ + createSdImpressDoc("odp/tdf128985.odp"); + { + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference xStyleFamily(xStyleFamilies->getByName("LushGreen"), + uno::UNO_QUERY); + uno::Reference xStyle(xStyleFamily->getByName("outline1"), uno::UNO_QUERY); + uno::Reference xPropSet(xStyle, uno::UNO_QUERY); + + sal_Int16 nWritingMode = 0; + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, nWritingMode); + + xPropSet->setPropertyValue("WritingMode", uno::Any(text::WritingMode2::LR_TB)); + + saveAndReload("impress8"); + } + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference xStyleFamily(xStyleFamilies->getByName("LushGreen"), + uno::UNO_QUERY); + uno::Reference xStyle(xStyleFamily->getByName("outline1"), uno::UNO_QUERY); + uno::Reference xPropSet(xStyle, uno::UNO_QUERY); + + sal_Int16 nWritingMode = 0; + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + + // Without the fix in place, this test would have failed with + // - Expected: 0 + // - Actual : 1 + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nWritingMode); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testLinkedGraphicRT) +{ + // FIXME: PPTX fails + std::vector vFormat{ "impress8", "MS PowerPoint 97" }; + for (size_t i = 0; i < vFormat.size(); i++) + { + // Load the original file with one image + createSdImpressDoc("odp/document_with_linked_graphic.odp"); + + // Check if the graphic has been imported correctly (before doing the export/import run) + { + constexpr OString sFailedImportMessage = "Failed to correctly import the document"_ostr; + SdXImpressDocument* pXImpressDocument + = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pDoc != nullptr); + const SdrPage* pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pPage != nullptr); + SdrGrafObj* pObject = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pObject != nullptr); + CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pObject->IsLinkedGraphic()); + + const GraphicObject& rGraphicObj = pObject->GetGraphicObject(true); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedImportMessage.getStr(), int(GraphicType::Bitmap), + int(rGraphicObj.GetGraphic().GetType())); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedImportMessage.getStr(), sal_uLong(864900), + rGraphicObj.GetGraphic().GetSizeBytes()); + } + + // Save and reload + saveAndReload(vFormat[i]); + + // Check whether graphic imported well after export + { + const OString sFailedMessage = "Failed on filter: " + vFormat[i].toUtf8(); + + SdXImpressDocument* pXImpressDocument + = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pDoc != nullptr); + const SdrPage* pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pPage != nullptr); + SdrGrafObj* pObject = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pObject != nullptr); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pObject->IsLinkedGraphic()); + + const GraphicObject& rGraphicObj = pObject->GetGraphicObject(true); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), int(GraphicType::Bitmap), + int(rGraphicObj.GetGraphic().GetType())); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_uLong(864900), + rGraphicObj.GetGraphic().GetSizeBytes()); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf79082) +{ + createSdImpressDoc("ppt/tdf79082.ppt"); + save("impress8"); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + // P1 should have 6 tab stops defined + assertXPathChildren( + pXmlDoc, "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops"_ostr, + 6); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[1]"_ostr, + "position"_ostr, "0cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[2]"_ostr, + "position"_ostr, "5.08cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[3]"_ostr, + "position"_ostr, "10.16cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[4]"_ostr, + "position"_ostr, "15.24cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[5]"_ostr, + "position"_ostr, "20.32cm"); + assertXPath(pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/" + "style:tab-stop[6]"_ostr, + "position"_ostr, "25.4cm"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testImageWithSpecialID) +{ + // Check how LO handles when the imported graphic's ID is different from that one + // which is generated by LO. + + std::vector vFormat{ "impress8", "Impress Office Open XML", "MS PowerPoint 97" }; + for (size_t i = 0; i < vFormat.size(); i++) + { + // Load the original file + createSdImpressDoc("odp/images_with_special_IDs.odp"); + const OString sFailedMessage = "Failed on filter: " + vFormat[i].toUtf8(); + saveAndReload(vFormat[i]); + + // Check whether graphic was exported well + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(2), + xDrawPagesSupplier->getDrawPages()->getCount()); + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW); + + uno::Reference xImage(xDrawPage->getByIndex(2), uno::UNO_QUERY); + uno::Reference XPropSet(xImage, uno::UNO_QUERY_THROW); + + // Check Graphic, Size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), + xGraphic->getType() != graphic::GraphicType::EMPTY); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(610), + xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(381), + xBitmap->getSize().Height); + } + + // Second Image + xDrawPage.set(xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW); + xImage.set(xDrawPage->getByIndex(1), uno::UNO_QUERY); + XPropSet.set(xImage, uno::UNO_QUERY_THROW); + + // Check Graphic, Size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), + xGraphic->getType() != graphic::GraphicType::EMPTY); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(900), + xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(600), + xBitmap->getSize().Height); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf62176) +{ + createSdImpressDoc("odp/Tdf62176.odp"); + uno::Reference xPage(getPage(0)); + + //there should be only *one* shape + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPage->getCount()); + + uno::Reference xShape(getShape(0, xPage)); + //checking Paragraph's Left Margin with expected value + sal_Int32 nParaLeftMargin = 0; + xShape->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), nParaLeftMargin); + //checking Paragraph's First Line Indent with expected value + sal_Int32 nParaFirstLineIndent = 0; + xShape->getPropertyValue("ParaFirstLineIndent") >>= nParaFirstLineIndent; + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1300), nParaFirstLineIndent); + + //Checking the *Text* in TextBox + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + CPPUNIT_ASSERT_EQUAL(OUString("Hello World"), xParagraph->getString()); + + //Saving and Reloading the file + saveAndReload("impress8"); + uno::Reference xPage2(getPage(0)); + //there should be only *one* shape + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPage2->getCount()); + + uno::Reference xShape2(getShape(0, xPage2)); + //checking Paragraph's Left Margin with expected value + sal_Int32 nParaLeftMargin2 = 0; + xShape2->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin2; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), nParaLeftMargin2); + //checking Paragraph's First Line Indent with expected value + sal_Int32 nParaFirstLineIndent2 = 0; + xShape2->getPropertyValue("ParaFirstLineIndent") >>= nParaFirstLineIndent2; + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1300), nParaFirstLineIndent2); + + //Checking the *Text* in TextBox + uno::Reference xParagraph2(getParagraphFromShape(0, xShape2)); + CPPUNIT_ASSERT_EQUAL(OUString("Hello World"), xParagraph2->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testEmbeddedPdf) +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + createSdImpressDoc("odp/embedded-pdf.odp"); + saveAndReload("impress8"); + uno::Reference xPage = getPage(0); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xGraphic; + xShape->getPropertyValue("ReplacementGraphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testEmbeddedText) +{ + createSdDrawDoc("objectwithtext.fodg"); + saveAndReload("draw8"); + + uno::Reference xPage = getPage(0); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xText(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT(xText.is()); + + uno::Reference xEA(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT(xEA->hasElements()); + uno::Reference xEnum(xEA->createEnumeration()); + uno::Reference xTC; + xEnum->nextElement() >>= xTC; + CPPUNIT_ASSERT(xTC.is()); + + uno::Reference xParaEA(xTC, uno::UNO_QUERY); + uno::Reference xParaEnum(xParaEA->createEnumeration()); + uno::Reference xPortion(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPortion.is()); + uno::Reference xRange(xPortion, uno::UNO_QUERY); + OUString type; + xPortion->getPropertyValue("TextPortionType") >>= type; + CPPUNIT_ASSERT_EQUAL(OUString("Text"), type); + CPPUNIT_ASSERT_EQUAL(OUString("foobar"), xRange->getString()); //tdf#112547 +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTransparenText) +{ + createSdDrawDoc("transparent-text.fodg"); + saveAndReload("draw8"); + + uno::Reference xPage = getPage(0); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + sal_Int16 nCharTransparence = 0; + xShape->getPropertyValue("CharTransparence") >>= nCharTransparence; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 75 + // - Actual : 0 + // i.e. the 75% transparent text was turned into a "not transparent at all" text. + CPPUNIT_ASSERT_EQUAL(static_cast(75), nCharTransparence); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testDefaultSubscripts) +{ + createSdDrawDoc("tdf80194_defaultSubscripts.fodg"); + saveAndReload("draw8"); + + uno::Reference xPage = getPage(0); + uno::Reference xShape(xPage->getByIndex(1), uno::UNO_QUERY); + // Default subscripts were too large, enlarging the gap between the next line. + // The exact size isn't important. Was 18975, now 16604. + CPPUNIT_ASSERT(17000 > xShape->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf98477) +{ + createSdImpressDoc("pptx/tdf98477grow.pptx"); + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//anim:animateTransform"_ostr, "by"_ostr, "0.5,0.5"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testAuthorField) +{ + createSdImpressDoc("odp/author_fixed.odp"); + + saveAndReload("impress8"); + + uno::Reference xField = getTextFieldFromPage(0, 0, 0, 0); + CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is()); + + uno::Reference xPropSet(xField, uno::UNO_QUERY_THROW); + bool bFixed = false; + xPropSet->getPropertyValue("IsFixed") >>= bFixed; + CPPUNIT_ASSERT_MESSAGE("Author field is not fixed", bFixed); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf50499) +{ + createSdImpressDoc("pptx/tdf50499.pptx"); + + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//anim:animate[1]"_ostr, "from"_ostr, "(-width/2)"); + assertXPath(pXmlDoc, "//anim:animate[1]"_ostr, "to"_ostr, "(x)"); + assertXPath(pXmlDoc, "//anim:animate[3]"_ostr, "by"_ostr, "(height/3+width*0.1)"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf100926) +{ + createSdImpressDoc("pptx/tdf100926_ODP.pptx"); + + saveAndReload("impress8"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT(pPage != nullptr); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj != nullptr); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + + sal_Int32 nRotation = 0; + uno::Reference xCell(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + xCell->getPropertyValue("RotateAngle") >>= nRotation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), nRotation); + + xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("RotateAngle") >>= nRotation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(9000), nRotation); + + xCell.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("RotateAngle") >>= nRotation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRotation); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testPageWithTransparentBackground) +{ + createSdImpressDoc("odp/page_transparent_background.odp"); + + saveAndReload("impress8"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be exactly one page", static_cast(1), + xDoc->getDrawPages()->getCount()); + + uno::Reference xPage(getPage(0)); + + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + uno::Any aAny = xPropSet->getPropertyValue("Background"); + CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue()); + + uno::Reference aXBackgroundPropSet; + aAny >>= aXBackgroundPropSet; + sal_Int32 nTransparence; + aAny = aXBackgroundPropSet->getPropertyValue("FillTransparence"); + aAny >>= nTransparence; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide background transparency is wrong", sal_Int32(42), + nTransparence); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTextRotation) +{ + // Save behavior depends on whether ODF strict or extended is used. + Resetter _([]() { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(3, pBatch); + return pBatch->commit(); + }); + + // The contained shape has a text rotation vert="vert" which corresponds to + // loext:writing-mode="tb-rl90" in the graphic-properties of the style of the shape in ODF 1.3 + // extended. + // Save to ODF 1.3 extended. Adapt 3 (=ODFVER_LATEST) to a to be ODFVER_013_EXTENDED when + // attribute value "tb-rl90" is included in ODF strict. + { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(3, pBatch); + pBatch->commit(); + + createSdImpressDoc("pptx/shape-text-rotate.pptx"); + saveAndReload("impress8"); + + uno::Reference xPage(getPage(0)); + uno::Reference xPropSet(getShape(0, xPage)); + CPPUNIT_ASSERT(xPropSet.is()); + + auto aWritingMode = xPropSet->getPropertyValue("WritingMode").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::WritingMode2::TB_RL90), aWritingMode); + } + // In ODF 1.3 strict the workaround to use the TextRotateAngle is used instead. + { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(10, pBatch); + pBatch->commit(); + + createSdImpressDoc("pptx/shape-text-rotate.pptx"); + saveAndReload("impress8"); + + uno::Reference xPage(getPage(0)); + uno::Reference xPropSet(getShape(0, xPage)); + + CPPUNIT_ASSERT(xPropSet.is()); + auto aGeomPropSeq = xPropSet->getPropertyValue("CustomShapeGeometry") + .get>(); + comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq); + + auto it = aCustomShapeGeometry.find("TextRotateAngle"); + CPPUNIT_ASSERT(it != aCustomShapeGeometry.end()); + + CPPUNIT_ASSERT_EQUAL(double(-90), aCustomShapeGeometry["TextRotateAngle"].get()); + } +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf115394PPT) +{ + createSdImpressDoc("ppt/tdf115394.ppt"); + + // Export the document and import again for a check + saveAndReload("MS PowerPoint 97"); + + double fTransitionDuration; + + // Fast + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + SdPage* pPage1 = pDoc->GetSdPage(0, PageKind::Standard); + fTransitionDuration = pPage1->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration); + + // Medium + SdPage* pPage2 = pDoc->GetSdPage(1, PageKind::Standard); + fTransitionDuration = pPage2->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration); + + // Slow + SdPage* pPage3 = pDoc->GetSdPage(2, PageKind::Standard); + fTransitionDuration = pPage3->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testBulletsAsImageImpress8) +{ + createSdImpressDoc("odp/BulletsAsImage.odp"); + saveAndReload("impress8"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + uno::Reference xLevels(xPropSet->getPropertyValue("NumberingRules"), + uno::UNO_QUERY_THROW); + uno::Sequence aProperties; + xLevels->getByIndex(0) >>= aProperties; // 1st level + + uno::Reference xBitmap; + awt::Size aSize; + sal_Int16 nNumberingType = -1; + + for (beans::PropertyValue const& rProperty : std::as_const(aProperties)) + { + if (rProperty.Name == "NumberingType") + { + nNumberingType = rProperty.Value.get(); + } + else if (rProperty.Name == "GraphicBitmap") + { + xBitmap = rProperty.Value.get>(); + } + else if (rProperty.Name == "GraphicSize") + { + aSize = rProperty.Value.get(); + } + } + + CPPUNIT_ASSERT_EQUAL(style::NumberingType::BITMAP, nNumberingType); + + // Graphic Bitmap + CPPUNIT_ASSERT_MESSAGE("No bitmap for the bullets", xBitmap.is()); + Graphic aGraphic(uno::Reference(xBitmap, uno::UNO_QUERY)); + CPPUNIT_ASSERT_EQUAL(GraphicType::Bitmap, aGraphic.GetType()); + CPPUNIT_ASSERT(aGraphic.GetSizeBytes() > o3tl::make_unsigned(0)); + + CPPUNIT_ASSERT_EQUAL(tools::Long(16), aGraphic.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(16), aGraphic.GetSizePixel().Height()); + + // Graphic Size + CPPUNIT_ASSERT_EQUAL(sal_Int32(500), aSize.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(500), aSize.Height); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testBulletsAsImageImpressOfficeOpenXml) +{ + createSdImpressDoc("odp/BulletsAsImage.odp"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + uno::Reference xLevels(xPropSet->getPropertyValue("NumberingRules"), + uno::UNO_QUERY_THROW); + uno::Sequence aProperties; + xLevels->getByIndex(0) >>= aProperties; // 1st level + + uno::Reference xBitmap; + awt::Size aSize; + sal_Int16 nNumberingType = -1; + + for (beans::PropertyValue const& rProperty : std::as_const(aProperties)) + { + if (rProperty.Name == "NumberingType") + { + nNumberingType = rProperty.Value.get(); + } + else if (rProperty.Name == "GraphicBitmap") + { + xBitmap = rProperty.Value.get>(); + } + else if (rProperty.Name == "GraphicSize") + { + aSize = rProperty.Value.get(); + } + } + + CPPUNIT_ASSERT_EQUAL(style::NumberingType::BITMAP, nNumberingType); + + // Graphic Bitmap + CPPUNIT_ASSERT_MESSAGE("No bitmap for the bullets", xBitmap.is()); + Graphic aGraphic(uno::Reference(xBitmap, uno::UNO_QUERY)); + CPPUNIT_ASSERT_EQUAL(GraphicType::Bitmap, aGraphic.GetType()); + CPPUNIT_ASSERT(aGraphic.GetSizeBytes() > o3tl::make_unsigned(0)); + + // FIXME: what happened here + CPPUNIT_ASSERT_EQUAL(tools::Long(64), aGraphic.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(64), aGraphic.GetSizePixel().Height()); + + // Graphic Size + // FIXME: totally wrong + CPPUNIT_ASSERT_EQUAL(sal_Int32(790), aSize.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(790), aSize.Height); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testBulletsAsImageMsPowerpoint97) +{ + createSdImpressDoc("odp/BulletsAsImage.odp"); + saveAndReload("MS PowerPoint 97"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + uno::Reference xLevels(xPropSet->getPropertyValue("NumberingRules"), + uno::UNO_QUERY_THROW); + uno::Sequence aProperties; + xLevels->getByIndex(0) >>= aProperties; // 1st level + + uno::Reference xBitmap; + awt::Size aSize; + sal_Int16 nNumberingType = -1; + + for (beans::PropertyValue const& rProperty : std::as_const(aProperties)) + { + if (rProperty.Name == "NumberingType") + { + nNumberingType = rProperty.Value.get(); + } + else if (rProperty.Name == "GraphicBitmap") + { + xBitmap = rProperty.Value.get>(); + } + else if (rProperty.Name == "GraphicSize") + { + aSize = rProperty.Value.get(); + } + } + + CPPUNIT_ASSERT_EQUAL(style::NumberingType::BITMAP, nNumberingType); + + // Graphic Bitmap + CPPUNIT_ASSERT_MESSAGE("No bitmap for the bullets", xBitmap.is()); + Graphic aGraphic(uno::Reference(xBitmap, uno::UNO_QUERY)); + CPPUNIT_ASSERT_EQUAL(GraphicType::Bitmap, aGraphic.GetType()); + CPPUNIT_ASSERT(aGraphic.GetSizeBytes() > o3tl::make_unsigned(0)); + + CPPUNIT_ASSERT_EQUAL(tools::Long(16), aGraphic.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(16), aGraphic.GetSizePixel().Height()); + + // Graphic Size + // seems like a conversion error + CPPUNIT_ASSERT_EQUAL(sal_Int32(504), aSize.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(504), aSize.Height); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf113822) +{ + createSdImpressDoc("pptx/tdf113822underline.pptx"); + + // Was unable to export iterate container (tdf#99213). + saveAndReload("Impress Office Open XML"); + // Was unable to import iterate container (tdf#113822). + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + // IterateContainer was created as ParallelTimeContainer before, so + // the iterate type is not set too. + assertXPath(pXmlDoc, "//anim:iterate"_ostr, "iterate-type"_ostr, "by-letter"); + // The target of the child animation nodes need to be in the iterate container. + assertXPath(pXmlDoc, "//anim:iterate"_ostr, "targetElement"_ostr, "id1"); + assertXPath(pXmlDoc, "//anim:iterate/anim:set"_ostr, "attributeName"_ostr, "text-underline"); + assertXPath(pXmlDoc, "//anim:iterate/anim:set"_ostr, "to"_ostr, "solid"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf113818) +{ + createSdImpressDoc("pptx/tdf113818-swivel.pptx"); + saveAndReload("MS PowerPoint 97"); + saveAndReload("Impress Office Open XML"); + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//anim:animate[1]"_ostr, "formula"_ostr, "width*sin(2.5*pi*$)"); + assertXPath(pXmlDoc, "//anim:animate[1]"_ostr, "values"_ostr, "0;1"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf119629) +{ + createSdImpressDoc("ppt/tdf119629.ppt"); + saveAndReload("MS PowerPoint 97"); + save("impress8"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + // MSO's effect node type Click parallel node, with group node, after group node + // were missing. + assertXPath(pXmlDoc, + "//draw:page" + "/anim:par[@presentation:node-type='timing-root']" + "/anim:seq[@presentation:node-type='main-sequence']" + "/anim:par[@presentation:node-type='on-click']" + "/anim:par[@presentation:node-type='with-previous']" + "/anim:par[@presentation:node-type='on-click']" + "/anim:animate[@anim:formula='width*sin(2.5*pi*$)']"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf141269) +{ + createSdImpressDoc("odp/tdf141269.odp"); + saveAndReload("MS PowerPoint 97"); + + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + + uno::Reference xGraphic; + xShape->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(tools::Long(1920), aBitmap.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(1080), aBitmap.GetSizePixel().Height()); + + Color aExpectedColor(0xC2DEEA); + aExpectedColor.SetAlpha(0xF); + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:194 G:222 B:234 A:240 + // - Actual : Color: R:194 G:222 B:234 A:15 + CPPUNIT_ASSERT_EQUAL(aExpectedColor, aBitmap.GetPixelColor(960, 540)); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf123557) +{ + createSdImpressDoc("pptx/trigger.pptx"); + saveAndReload("Impress Office Open XML"); + save("impress8"); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + // Contains 2 interactive sequences and 3 triggered effects. + assertXPath(pXmlDoc, "//draw:page"_ostr, 1); + assertXPath(pXmlDoc, "//draw:page/anim:par"_ostr, 1); + assertXPath(pXmlDoc, + "//draw:page" + "/anim:par[@presentation:node-type='timing-root']" + "/anim:seq[@presentation:node-type='interactive-sequence']"_ostr, + 2); + assertXPath(pXmlDoc, + "//draw:page" + "/anim:par[@presentation:node-type='timing-root']" + "/anim:seq[@presentation:node-type='interactive-sequence']" + "/anim:par[@smil:begin]"_ostr, + 3); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf126761) +{ + createSdImpressDoc("ppt/tdf126761.ppt"); + saveAndReload("impress8"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph of the text + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // Get first run of the paragraph + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + // Check character underline, to make sure it has been set correctly + sal_uInt32 nCharUnderline; + xPropSet->getPropertyValue("CharUnderline") >>= nCharUnderline; + CPPUNIT_ASSERT_EQUAL(sal_uInt32(1), nCharUnderline); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testGlow) +{ + createSdDrawDoc("odg/glow.odg"); + saveAndReload("draw8"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Check glow properties + sal_Int32 nGlowEffectRad = 0; + CPPUNIT_ASSERT(xShape->getPropertyValue("GlowEffectRadius") >>= nGlowEffectRad); + CPPUNIT_ASSERT_EQUAL(sal_Int32(529), nGlowEffectRad); // 15 pt = 529.166... mm/100 + Color nGlowEffectColor; + CPPUNIT_ASSERT(xShape->getPropertyValue("GlowEffectColor") >>= nGlowEffectColor); + CPPUNIT_ASSERT_EQUAL(Color(0x00FF4000), nGlowEffectColor); // "Brick" + sal_Int16 nGlowEffectTransparency = 0; + CPPUNIT_ASSERT(xShape->getPropertyValue("GlowEffectTransparency") >>= nGlowEffectTransparency); + CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nGlowEffectTransparency); // 60% + + // Test ODF element + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + // check that we actually test graphic style + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[2]"_ostr, + "family"_ostr, "graphic"); + // check loext graphic attributes + assertXPath( + pXmlDoc, + "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties"_ostr, + "glow-radius"_ostr, "0.529cm"); + assertXPath( + pXmlDoc, + "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties"_ostr, + "glow-color"_ostr, "#ff4000"); + assertXPath( + pXmlDoc, + "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties"_ostr, + "glow-transparency"_ostr, "60%"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testSoftEdges) +{ + createSdDrawDoc("odg/softedges.odg"); + saveAndReload("draw8"); + auto xShapeProps(getShapeFromPage(0, 0)); + + // Check property + sal_Int32 nRad = 0; + CPPUNIT_ASSERT(xShapeProps->getPropertyValue("SoftEdgeRadius") >>= nRad); + CPPUNIT_ASSERT_EQUAL(sal_Int32(635), nRad); // 18 pt + + // Test ODF element + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + // check that we actually test graphic style + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[2]"_ostr, + "family"_ostr, "graphic"); + // check loext graphic attribute + assertXPath( + pXmlDoc, + "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties"_ostr, + "softedge-radius"_ostr, "0.635cm"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testShadowBlur) +{ + createSdImpressDoc("odp/shadow-blur.odp"); + saveAndReload("draw8"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + sal_Int32 nRad = 0; + CPPUNIT_ASSERT(xShape->getPropertyValue("ShadowBlur") >>= nRad); + CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRad); // 11 pt = 388 Hmm + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[3]"_ostr, + "family"_ostr, "graphic"); + assertXPath( + pXmlDoc, + "/office:document-content/office:automatic-styles/style:style[3]/style:graphic-properties"_ostr, + "shadow-blur"_ostr, "0.388cm"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testRhbz1870501) +{ + //Without the fix in place, it would crash at export time + createSdDrawDoc("odg/rhbz1870501.odg"); + saveAndReload("draw8"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf152606) +{ + //Without the fix in place, it would crash at import time + createSdImpressDoc("pptx/tdf152606.pptx"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xDrawPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf154754) +{ + //Without the fix in place, it would crash at export time + skipValidation(); + createSdImpressDoc("odp/tdf154754.odp"); + saveAndReload("impress8"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf91060) +{ + //Without the fix in place, it would crash at import time + createSdImpressDoc("pptx/tdf91060.pptx"); + saveAndReload("Impress Office Open XML"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf128550) +{ + createSdImpressDoc("pptx/tdf128550.pptx"); + save("impress8"); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//anim:iterate[@anim:sub-item='background']"_ostr, 1); + assertXPath(pXmlDoc, "//anim:iterate[@anim:sub-item='text']"_ostr, 4); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf140714) +{ + //Without the fix in place, shape will be imported as GraphicObjectShape instead of CustomShape. + + createSdImpressDoc("pptx/tdf140714.pptx"); + saveAndReload("Impress Office Open XML"); + + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString{ "com.sun.star.drawing.CustomShape" }, xShape->getShapeType()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf156649) +{ + createSdImpressDoc("pptx/tdf156649.pptx"); + saveAndReload("Impress Office Open XML"); + + auto xShapeProps(getShapeFromPage(0, 0)); + // Without the fix in place, this test would have failed with + //- Expected: 55 + //- Actual : 0 + // i.e. alphaModFix wasn't imported as fill transparency for the custom shape + CPPUNIT_ASSERT_EQUAL(sal_Int16(55), + xShapeProps->getPropertyValue("FillTransparence").get()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testMasterPageBackgroundFullSize) +{ + createSdImpressDoc("odp/background.odp"); + + // BackgroundFullSize exists on master pages only + // (note: this document can't be created with the UI because UI keeps + // page margins and the flag synchronized across all master pages) + uno::Reference xMPS(mxComponent, uno::UNO_QUERY); + uno::Reference xMPs(xMPS->getMasterPages()); + Color nFillColor; + { + uno::Reference xMP(xMPs->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_SOLID, + xBackgroundProps->getPropertyValue("FillStyle").get()); + xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + { + uno::Reference xMP(xMPs->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_SOLID, + xBackgroundProps->getPropertyValue("FillStyle").get()); + xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + { + uno::Reference xMP(xMPs->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_BITMAP, + xBackgroundProps->getPropertyValue("FillStyle").get()); + CPPUNIT_ASSERT_EQUAL( + drawing::BitmapMode_STRETCH, + xBackgroundProps->getPropertyValue("FillBitmapMode").get()); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + { + uno::Reference xMP(xMPs->getByIndex(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_BITMAP, + xBackgroundProps->getPropertyValue("FillStyle").get()); + CPPUNIT_ASSERT_EQUAL( + drawing::BitmapMode_STRETCH, + xBackgroundProps->getPropertyValue("FillBitmapMode").get()); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + + saveAndReload("impress8"); + + xMPS.set(mxComponent, uno::UNO_QUERY); + xMPs.set(xMPS->getMasterPages()); + { + uno::Reference xMP(xMPs->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_SOLID, + xBackgroundProps->getPropertyValue("FillStyle").get()); + xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + { + uno::Reference xMP(xMPs->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_SOLID, + xBackgroundProps->getPropertyValue("FillStyle").get()); + xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + { + uno::Reference xMP(xMPs->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_BITMAP, + xBackgroundProps->getPropertyValue("FillStyle").get()); + CPPUNIT_ASSERT_EQUAL( + drawing::BitmapMode_STRETCH, + xBackgroundProps->getPropertyValue("FillBitmapMode").get()); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + { + uno::Reference xMP(xMPs->getByIndex(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get()); + uno::Reference xBackgroundProps( + xMP->getPropertyValue("Background").get>()); + CPPUNIT_ASSERT_EQUAL( + drawing::FillStyle_BITMAP, + xBackgroundProps->getPropertyValue("FillStyle").get()); + CPPUNIT_ASSERT_EQUAL( + drawing::BitmapMode_STRETCH, + xBackgroundProps->getPropertyValue("FillBitmapMode").get()); + CPPUNIT_ASSERT_EQUAL( + sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get()); + } + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/" + "style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/" + "style:master-page[@style:name='Default']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, + "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/" + "style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/" + "style:master-page[@style:name='Default_20_3']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, + "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/" + "style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/" + "style:master-page[@style:name='Default_20_2']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, + "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/" + "style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/" + "style:master-page[@style:name='Default_20_1']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, + "background-size"_ostr, "full"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testColumnsODG) +{ + createSdDrawDoc("odg/two_columns.odg"); + + { + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(700)), + xColProps->getPropertyValue("AutomaticDistance")); + + auto pTextObj = DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pTextObj); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(700), pTextObj->GetTextColumnsSpacing()); + } + + saveAndReload("draw8"); + + { + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xIndexAccess(xPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xProps(xShape, uno::UNO_QUERY_THROW); + uno::Reference xCols(xProps->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(700)), + xColProps->getPropertyValue("AutomaticDistance")); + + auto pTextObj = DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pTextObj); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(700), pTextObj->GetTextColumnsSpacing()); + } + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, + "/office:document-content/office:automatic-styles/style:style/" + "style:graphic-properties/style:columns"_ostr, + "column-count"_ostr, "2"); + assertXPath(pXmlDoc, + "/office:document-content/office:automatic-styles/style:style/" + "style:graphic-properties/style:columns"_ostr, + "column-gap"_ostr, "0.7cm"); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf112126) +{ + createSdDrawDoc("tdf112126.odg"); + saveAndReload("draw8"); + uno::Reference xPage(getPage(0)); + uno::Reference xPropertySet(xPage, uno::UNO_QUERY); + + OUString xPageName; + xPropertySet->getPropertyValue("LinkDisplayName") >>= xPageName; + + // without the fix in place, it fails with + // - Expected: Page 1 + // - Actual : Slide 1 + CPPUNIT_ASSERT_EQUAL(OUString("Page 1"), xPageName); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testCellProperties) +{ + // Silence unrelated failure: + // Error: element "table:table-template" is missing "first-row-start-column" attribute + // Looks like an oversight in the schema, as the docs claim this attribute is deprecated. + skipValidation(); + + createSdDrawDoc("odg/tablestyles.fodg"); + saveAndReload("draw8"); + + const SdrPage* pPage = GetPage(1); + auto pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj != nullptr); + uno::Reference xCell(pTableObj->getTable()->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + + Color nColor; + table::BorderLine2 aBorderLine; + drawing::TextVerticalAdjust aTextAdjust; + sal_Int32 nPadding; + + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), nColor); + xCell->getPropertyValue("RightBorder") >>= aBorderLine; + CPPUNIT_ASSERT_EQUAL(Color(0x99ccff), Color(ColorTransparency, aBorderLine.Color)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(159), aBorderLine.LineWidth); + xCell->getPropertyValue("TextRightDistance") >>= nPadding; + CPPUNIT_ASSERT_EQUAL(sal_Int32(300), nPadding); + xCell->getPropertyValue("TextVerticalAdjust") >>= aTextAdjust; + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust::TextVerticalAdjust_CENTER, aTextAdjust); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testUserTableStyles) +{ + // Silence unrelated failure: + // Error: element "table:table-template" is missing "first-row-start-column" attribute + // Looks like an oversight in the schema, as the docs claim this attribute is deprecated. + skipValidation(); + + createSdDrawDoc("odg/tablestyles.fodg"); + saveAndReload("draw8"); + + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xStyleFamily( + xStyleFamiliesSupplier->getStyleFamilies()->getByName("table"), uno::UNO_QUERY); + + uno::Reference xTableStyle(xStyleFamily->getByName("default"), uno::UNO_QUERY); + CPPUNIT_ASSERT(!xTableStyle->isUserDefined()); + + uno::Reference xNameAccess(xTableStyle, uno::UNO_QUERY); + uno::Reference xCellStyle(xNameAccess->getByName("first-row"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xCellStyle); + CPPUNIT_ASSERT_EQUAL(OUString("userdefined"), xCellStyle->getName()); + + CPPUNIT_ASSERT(xStyleFamily->hasByName("userdefined")); + xTableStyle.set(xStyleFamily->getByName("userdefined"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xTableStyle->isUserDefined()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf153179) +{ + createSdImpressDoc("pptx/ole-emf_min.pptx"); + saveAndReload("impress8"); + + // Check number of shapes after export. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getPage(0)->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdExportTest, testSvgImageSupport) +{ + for (OUString const& rFormat : { u"impress8"_ustr, u"Impress Office Open XML"_ustr }) + { + // Load the original file + createSdImpressDoc("odp/SvgImageTest.odp"); + // Save into the target format + saveAndReload(rFormat); + + const OString sFailedMessage = "Failed on filter: " + rFormat.toUtf8(); + + // Check whether SVG graphic was exported as expected + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(1), + xDrawPagesSupplier->getDrawPages()->getCount()); + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xDrawPage.is()); + + // Get the image + uno::Reference xImage(xDrawPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xPropertySet(xImage, uno::UNO_QUERY_THROW); + + // Convert to a XGraphic + uno::Reference xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + + // Access the Graphic + Graphic aGraphic(xGraphic); + + // Check if it contian a VectorGraphicData struct + auto pVectorGraphic = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pVectorGraphic); + + // Which should be of type SVG, which means we have a SVG file + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), VectorGraphicDataType::Svg, + pVectorGraphic->getType()); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/filters-test.cxx b/sd/qa/unit/filters-test.cxx new file mode 100644 index 0000000000..1ed0f79914 --- /dev/null +++ b/sd/qa/unit/filters-test.cxx @@ -0,0 +1,118 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include + +using namespace ::com::sun::star; + +/// Test loading of files to assure they do not crash on load. +class SdFiltersTest + : public test::FiltersTest + , public test::BootstrapFixture +{ +public: + SdFiltersTest(); + + virtual bool load( const OUString &rFilter, + const OUString &rURL, const OUString &rUserData, + SfxFilterFlags nFilterFlags, SotClipboardFormatId nClipboardID, + unsigned int nFilterVersion) override; + + virtual void setUp() override; + virtual void tearDown() override; + + // Ensure CVEs remain unbroken + void testCVEs(); + + CPPUNIT_TEST_SUITE(SdFiltersTest); + CPPUNIT_TEST(testCVEs); + CPPUNIT_TEST_SUITE_END(); + +private: + uno::Reference m_xDrawComponent; +}; + +bool SdFiltersTest::load(const OUString &rFilter, const OUString &rURL, + const OUString &rUserData, SfxFilterFlags nFilterFlags, SotClipboardFormatId nClipboardID, + unsigned int nFilterVersion) +{ + auto pFilter = std::make_shared( + rFilter, + OUString(), nFilterFlags, nClipboardID, OUString(), OUString(), + rUserData, OUString() ); + pFilter->SetVersion(nFilterVersion); + + ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress); + SfxMedium* pSrcMed = new SfxMedium(rURL, StreamMode::STD_READ); + pSrcMed->SetFilter(pFilter); + bool bLoaded = xDocShRef->DoLoad(pSrcMed); + xDocShRef->DoClose(); + return bLoaded; +} + +void SdFiltersTest::testCVEs() +{ +#ifndef DISABLE_CVE_TESTS + testDir("MS PowerPoint 97", + m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/"), + "sd"); + + testDir("Impress Office Open XML", + m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/"), + "", (SfxFilterFlags::IMPORT | SfxFilterFlags::ALIEN | SfxFilterFlags::STARONEFILTER)); + + testDir("impress8", + m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/"), + "sd"); + + testDir("draw8", + m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/"), + "sd"); + + testDir("CGM - Computer Graphics Metafile", + m_directories.getURLFromSrc(u"/sd/qa/unit/data/cgm/"), + "icg"); +#endif +} + +SdFiltersTest::SdFiltersTest() +{ +} + +void SdFiltersTest::setUp() +{ + test::BootstrapFixture::setUp(); + + // This is a bit of a fudge, we do this to ensure that ScGlobals::ensure, + // which is a private symbol to us, gets called + m_xDrawComponent = + getMultiServiceFactory()->createInstance("com.sun.star.comp.Draw.PresentationDocument"); + CPPUNIT_ASSERT_MESSAGE("no impress component!", m_xDrawComponent.is()); +} + +void SdFiltersTest::tearDown() +{ + uno::Reference< lang::XComponent >( m_xDrawComponent, uno::UNO_QUERY_THROW )->dispose(); + test::BootstrapFixture::tearDown(); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(SdFiltersTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/import-tests-smartart.cxx b/sd/qa/unit/import-tests-smartart.cxx new file mode 100644 index 0000000000..2382ed4a9f --- /dev/null +++ b/sd/qa/unit/import-tests-smartart.cxx @@ -0,0 +1,1765 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace +{ +/// Gets one child of xShape, which one is specified by nIndex. +uno::Reference getChildShape(const uno::Reference& xShape, + sal_Int32 nIndex) +{ + uno::Reference xGroup(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + CPPUNIT_ASSERT(xGroup->getCount() > nIndex); + + uno::Reference xRet(xGroup->getByIndex(nIndex), uno::UNO_QUERY); + CPPUNIT_ASSERT(xRet.is()); + + return xRet; +} + +uno::Reference findChildShapeByText(const uno::Reference& xShape, + const OUString& sText) +{ + uno::Reference xText(xShape, uno::UNO_QUERY); + if (xText.is() && xText->getString() == sText) + return xShape; + + uno::Reference xGroup(xShape, uno::UNO_QUERY); + if (!xGroup.is()) + return uno::Reference(); + + for (sal_Int32 i = 0; i < xGroup->getCount(); i++) + { + uno::Reference xChildShape(xGroup->getByIndex(i), uno::UNO_QUERY); + uno::Reference xReturnShape = findChildShapeByText(xChildShape, sText); + if (xReturnShape.is()) + return xReturnShape; + } + + return uno::Reference(); +} +} + +class SdImportTestSmartArt : public SdModelTestBase +{ +public: + SdImportTestSmartArt() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBase) +{ + createSdImpressDoc("pptx/smartart1.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xShapeGroup->getCount()); + + uno::Reference xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString()); + uno::Reference xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("b"), xText1->getString()); + uno::Reference xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("c"), xText2->getString()); + uno::Reference xText3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("d"), xText3->getString()); + uno::Reference xText4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("e"), xText4->getString()); + + uno::Reference xShape(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + + Color nFillColor; + xShape->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x4F81BD), nFillColor); + + sal_Int16 nParaAdjust = 0; + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + xPropSet->getPropertyValue("ParaAdjust") >>= nParaAdjust; + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, + static_cast(nParaAdjust)); + + uno::Reference xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + uno::Reference xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + uno::Reference xShape3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW); + uno::Reference xShape4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW); + + /* + * Arrangement + * (LTR) + * ╭─────────╮ + * │ 0 1 │ + * │ 2 3 │ + * │ 4 │ + * ╰─────────╯ + */ + CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y, xShape3->getPosition().Y); + + CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().X, xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X, xShape3->getPosition().X); + + CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y - xShape0->getPosition().Y, + xShape4->getPosition().Y - xShape2->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X - xShape0->getPosition().X, + xShape3->getPosition().X - xShape2->getPosition().X); + CPPUNIT_ASSERT_DOUBLES_EQUAL(xShape2->getPosition().X + xShape3->getPosition().X, + 2 * xShape4->getPosition().X, 1); + + CPPUNIT_ASSERT(xShape2->getPosition().Y > xShape0->getPosition().Y); + CPPUNIT_ASSERT(xShape4->getPosition().Y > xShape2->getPosition().Y); + CPPUNIT_ASSERT(xShape0->getPosition().X < xShape1->getPosition().X); + CPPUNIT_ASSERT(xShape2->getPosition().X < xShape3->getPosition().X); + CPPUNIT_ASSERT((xShape2->getPosition().X < xShape4->getPosition().X)); + CPPUNIT_ASSERT((xShape3->getPosition().X > xShape4->getPosition().X)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testChildren) +{ + createSdImpressDoc("pptx/smartart-children.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xShapeGroup->getCount()); + + uno::Reference xShapeGroup0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup0->getCount()); + uno::Reference xTextA(xShapeGroup0->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xTextA->getString()); + + uno::Reference xChildren0(xShapeGroup0->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xChildren0->getCount()); + uno::Reference xChildB(xChildren0->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xTextB(xChildB->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("b"), xTextB->getString()); + uno::Reference xChildC(xChildren0->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xTextC(xChildC->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("c"), xTextC->getString()); + + uno::Reference xShapeGroup1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup1->getCount()); + uno::Reference xTextX(xShapeGroup1->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("x"), xTextX->getString()); + + uno::Reference xChildren1(xShapeGroup1->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xChildren1->getCount()); + uno::Reference xChildY(xChildren1->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xTextY(xChildY->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("y"), xTextY->getString()); + uno::Reference xChildZ(xChildren1->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xTextZ(xChildZ->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("z"), xTextZ->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testText) +{ + createSdImpressDoc("pptx/smartart-text.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + uno::Reference xShapeGroup2(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + + uno::Reference xText0(xShapeGroup2->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xText0->getString().isEmpty()); + + uno::Reference xText1(xShapeGroup2->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("test"), xText1->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testCnt) +{ + createSdImpressDoc("pptx/smartart-cnt.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + sal_Int32 nCount = xShapeGroup->getCount(); + sal_Int32 nCorrect = 0; + for (sal_Int32 i = 0; i < nCount; i++) + { + uno::Reference xText(xShapeGroup->getByIndex(i), uno::UNO_QUERY); + if (xText.is() && !xText->getString().isEmpty()) + nCorrect++; + } + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nCorrect); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testDir) +{ + createSdImpressDoc("pptx/smartart-dir.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xShapeGroup->getCount()); + + uno::Reference xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xShape0->getPosition().X > xShape1->getPosition().X); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf148665) +{ + // Without the fix in place, this test would have crashed at import time + createSdImpressDoc("pptx/tdf148665.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xShapeGroup->getCount()); + + uno::Reference xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("\nFufufu"), xText0->getString()); + uno::Reference xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Susu"), xText1->getString()); + uno::Reference xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Sasa Haha"), xText2->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf148921) +{ + createSdImpressDoc("pptx/tdf148921.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup->getCount()); + + uno::Reference xShapeGroup2(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + + // Without the fix in place, this test would have failed with + // - Expected: 2 + // - Actual : 4 + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup2->getCount()); + + uno::Reference xShape0(xShapeGroup2->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xShape1(xShapeGroup2->getByIndex(1), uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xShape0->getPosition().X < xShape1->getPosition().X); + CPPUNIT_ASSERT(xShape0->getPosition().Y < xShape1->getPosition().Y); + CPPUNIT_ASSERT(xShape0->getSize().Height > xShape1->getSize().Height); + CPPUNIT_ASSERT(xShape0->getSize().Width > xShape1->getSize().Width); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testMaxDepth) +{ + createSdImpressDoc("pptx/smartart-maxdepth.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xShapeGroup->getCount()); + + uno::Reference xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("first"), xText0->getString()); + uno::Reference xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("second"), xText1->getString()); + + uno::Reference xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, + xShape1->getPosition().Y); // Confirms shapes are in same Y axis-level. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testRotation) +{ + createSdImpressDoc("pptx/smartart-rotation.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + + uno::Reference xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xShape0->getPropertyValue("RotateAngle").get()); + + uno::Reference xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24000), + xShape1->getPropertyValue("RotateAngle").get()); + + uno::Reference xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(12000), + xShape2->getPropertyValue("RotateAngle").get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTextAutoRotation) +{ + createSdImpressDoc("pptx/smartart-autoTxRot.pptx"); + + auto testText = [&](int pageNo, sal_Int32 txtNo, const OUString& expTx, sal_Int32 expShRot, + sal_Int32 expTxRot) { + OString msgText = "Page: " + OString::number(pageNo) + " text: " + OString::number(txtNo); + uno::Reference xShapeGroup(getShapeFromPage(0, pageNo), + uno::UNO_QUERY_THROW); + + txtNo++; //skip background + uno::Reference xTxt(xShapeGroup->getByIndex(txtNo), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), expTx, xTxt->getString()); + uno::Reference xTxtProps(xTxt, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), expShRot, + xTxtProps->getPropertyValue("RotateAngle").get()); + + auto aGeomPropSeq = xTxtProps->getPropertyValue("CustomShapeGeometry") + .get>(); + comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq); + + auto it = aCustomShapeGeometry.find("TextPreRotateAngle"); + if (it == aCustomShapeGeometry.end()) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), sal_Int32(0), expTxRot); + } + else + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), expTxRot, it->second.get()); + } + }; + + // Slide 1: absent autoTxRot => defaults to "upr" + testText(0, 0, "a", 0, 0); + testText(0, 1, "b", 33750, 0); + testText(0, 2, "c", 31500, 0); + testText(0, 3, "d", 29250, 90); + testText(0, 4, "e", 27000, 90); + testText(0, 5, "f", 24750, 90); + testText(0, 6, "g", 22500, 180); + testText(0, 7, "h", 20250, 180); + testText(0, 8, "i", 18000, 180); + testText(0, 9, "j", 15750, 180); + testText(0, 10, "k", 13500, 180); + testText(0, 11, "l", 11250, 270); + testText(0, 12, "m", 9000, 270); + testText(0, 13, "n", 6750, 270); + testText(0, 14, "o", 4500, 0); + testText(0, 15, "p", 2250, 0); + + // Slide 2: autoTxRot == "none" + testText(1, 0, "a", 0, 0); + testText(1, 1, "b", 33750, 0); + testText(1, 2, "c", 31500, 0); + testText(1, 3, "d", 29250, 0); + testText(1, 4, "e", 27000, 0); + testText(1, 5, "f", 24750, 0); + testText(1, 6, "g", 22500, 0); + testText(1, 7, "h", 20250, 0); + testText(1, 8, "i", 18000, 0); + testText(1, 9, "j", 15750, 0); + testText(1, 10, "k", 13500, 0); + testText(1, 11, "l", 11250, 0); + testText(1, 12, "m", 9000, 0); + testText(1, 13, "n", 6750, 0); + testText(1, 14, "o", 4500, 0); + testText(1, 15, "p", 2250, 0); + + // Slide 3: autoTxRot == "grav" + testText(2, 0, "a", 0, 0); + testText(2, 1, "b", 33750, 0); + testText(2, 2, "c", 31500, 0); + testText(2, 3, "d", 29250, 0); + testText(2, 4, "e", 27000, 0); + testText(2, 5, "f", 24750, 180); + testText(2, 6, "g", 22500, 180); + testText(2, 7, "h", 20250, 180); + testText(2, 8, "i", 18000, 180); + testText(2, 9, "j", 15750, 180); + testText(2, 10, "k", 13500, 180); + testText(2, 11, "l", 11250, 180); + testText(2, 12, "m", 9000, 0); + testText(2, 13, "n", 6750, 0); + testText(2, 14, "o", 4500, 0); + testText(2, 15, "p", 2250, 0); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBasicProcess) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testPyramid) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testPyramidOneChild) +{ + // Load a document with a pyra algorithm in it. + // Without the accompanying fix in place, this test would have crashed. + createSdImpressDoc("pptx/smartart-pyramid-1child.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xText(getChildShape(getChildShape(xGroup, 1), 1), + uno::UNO_QUERY); + // Verify that the text of the only child is imported correctly. + CPPUNIT_ASSERT_EQUAL(OUString("A"), xText->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testChevron) +{ + createSdImpressDoc("pptx/smartart-chevron.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xShapeGroup->getCount()); + + uno::Reference xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString()); + uno::Reference xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("b"), xText1->getString()); + uno::Reference xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("c"), xText2->getString()); + + uno::Reference xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + uno::Reference xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xShape0->getPosition().X < xShape1->getPosition().X); + CPPUNIT_ASSERT(xShape1->getPosition().X < xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().Y, xShape2->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testCycle) +{ + createSdImpressDoc("pptx/smartart-cycle.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + // 11 children: background, 5 shapes, 5 connectors + CPPUNIT_ASSERT_EQUAL(static_cast(11), xGroup->getCount()); + + uno::Reference xShape0(xGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xShapeConn(xGroup->getByIndex(2), uno::UNO_QUERY_THROW); + uno::Reference xShape2(xGroup->getByIndex(3), uno::UNO_QUERY_THROW); + + uno::Reference xText0(xShape0, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString()); + uno::Reference xText2(xShape2, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("b"), xText2->getString()); + + // xShapeConn is connector between shapes 0 and 2 + // it should lay between them and be rotated 0 -> 2 + CPPUNIT_ASSERT(xShape0->getPosition().X < xShapeConn->getPosition().X); + CPPUNIT_ASSERT(xShape0->getPosition().Y < xShapeConn->getPosition().Y); + CPPUNIT_ASSERT(xShapeConn->getPosition().Y < xShape2->getPosition().Y); + uno::Reference xPropSetConn(xShapeConn, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(32400), + xPropSetConn->getPropertyValue("RotateAngle").get()); + + // Make sure that we have an arrow shape between the two shapes + comphelper::SequenceAsHashMap aCustomShapeGeometry( + xPropSetConn->getPropertyValue("CustomShapeGeometry")); + CPPUNIT_ASSERT(aCustomShapeGeometry["Type"].has()); + OUString aType = aCustomShapeGeometry["Type"].get(); + CPPUNIT_ASSERT_EQUAL(OUString("ooxml-rightArrow"), aType); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testHierarchy) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testmatrix) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testvenndiagram) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testInvertedPyramid) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testMultidirectional) +{ + // similar document as cycle, but arrows are pointing in both directions + createSdImpressDoc("pptx/smartart-multidirectional.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + // 7 children: background, 3 shapes, 3 connectors + CPPUNIT_ASSERT_EQUAL(static_cast(7), xGroup->getCount()); + + uno::Reference xShapeConn(xGroup->getByIndex(2), uno::UNO_QUERY_THROW); + uno::Reference xPropSetConn(xShapeConn, uno::UNO_QUERY_THROW); + comphelper::SequenceAsHashMap aCustomShapeGeometry( + xPropSetConn->getPropertyValue("CustomShapeGeometry")); + CPPUNIT_ASSERT(aCustomShapeGeometry["Type"].has()); + OUString aType = aCustomShapeGeometry["Type"].get(); + CPPUNIT_ASSERT_EQUAL(OUString("ooxml-leftRightArrow"), aType); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testHorizontalBulletList) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testEquation) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBasicRadicals) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testSegmentedCycle) +{ + //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet. +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBaseRtoL) +{ + createSdImpressDoc("pptx/smartart-rightoleftblockdiagram.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xShapeGroup->getCount()); + + uno::Reference xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString()); + uno::Reference xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("b"), xText1->getString()); + uno::Reference xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("c"), xText2->getString()); + uno::Reference xText3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("d"), xText3->getString()); + uno::Reference xText4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("e"), xText4->getString()); + + uno::Reference xShape(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + + Color nFillColor; + xShape->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x4F81BD), nFillColor); + + sal_Int16 nParaAdjust = 0; + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + xPropSet->getPropertyValue("ParaAdjust") >>= nParaAdjust; + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, + static_cast(nParaAdjust)); + + uno::Reference xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW); + uno::Reference xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW); + uno::Reference xShape3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW); + uno::Reference xShape4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW); + + /* + * Arrangement + * (RTL) + * ╭─────────╮ + * │ 1 0 │ + * │ 3 2 │ + * │ 4 │ + * ╰─────────╯ + */ + CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y, xShape3->getPosition().Y); + + CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().X, xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X, xShape3->getPosition().X); + + CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y - xShape0->getPosition().Y, + xShape4->getPosition().Y - xShape2->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X - xShape0->getPosition().X, + xShape3->getPosition().X - xShape2->getPosition().X); + CPPUNIT_ASSERT_DOUBLES_EQUAL(xShape2->getPosition().X + xShape3->getPosition().X, + 2 * xShape4->getPosition().X, 1); + + CPPUNIT_ASSERT(xShape2->getPosition().Y > xShape0->getPosition().Y); + CPPUNIT_ASSERT(xShape4->getPosition().Y > xShape2->getPosition().Y); + CPPUNIT_ASSERT(xShape0->getPosition().X > xShape1->getPosition().X); + CPPUNIT_ASSERT(xShape2->getPosition().X > xShape3->getPosition().X); + CPPUNIT_ASSERT((xShape2->getPosition().X > xShape4->getPosition().X)); + CPPUNIT_ASSERT((xShape3->getPosition().X < xShape4->getPosition().X)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testVerticalBoxList) +{ + createSdImpressDoc("pptx/smartart-vertical-box-list.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + // Without the accompanying fix in place, this test would have failed with + // 'actual: 0'. + CPPUNIT_ASSERT_EQUAL(static_cast(3), xShapeGroup->getCount()); + + uno::Reference xFirstChild(xShapeGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstChild.is()); + uno::Reference xParentText(xFirstChild->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xParentText.is()); + // Without the accompanying fix in place, this test would have failed with + // 'actual: 7361', i.e. the width was not the 70% of the parent as the + // constraint wanted. + CPPUNIT_ASSERT_EQUAL(static_cast(11852), xParentText->getSize().Width); + + uno::Reference xChildText(xShapeGroup->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xChildText.is()); + // Without the accompanying fix in place, this test would have failed with + // 'actual: 7361' (and with the fix: 'actual: 16932', i.e. the width of the + // parent). + CPPUNIT_ASSERT_GREATER(static_cast(10000), xChildText->getSize().Width); + + // Assert that the right edge of the parent text is closer to the slide + // boundary than the right edge of the parent text. + // Without the accompanying fix in place, this test would have failed with + // 'Expected greater than: 25656, Actual : 21165'. + CPPUNIT_ASSERT_GREATER(xParentText->getPosition().X + xParentText->getSize().Width, + xChildText->getPosition().X + xChildText->getSize().Width); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testVerticalBracketList) +{ + createSdImpressDoc("pptx/vertical-bracket-list.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(static_cast(2), xShapeGroup->getCount()); + + uno::Reference xFirstChild(xShapeGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstChild.is()); + // Without the accompanying fix in place, this test would have failed with + // 'actual: 2', i.e. one child shape (with its "A" text) was missing. + CPPUNIT_ASSERT_EQUAL(static_cast(3), xFirstChild->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTableList) +{ + createSdImpressDoc("pptx/table-list.pptx"); + uno::Reference xShapeGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShapeGroup.is()); + CPPUNIT_ASSERT_EQUAL(static_cast(4), xShapeGroup->getCount()); + + uno::Reference xParentText(xShapeGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xParentText.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Parent"), xParentText->getString()); + uno::Reference xParent(xParentText, uno::UNO_QUERY); + CPPUNIT_ASSERT(xParent.is()); + int nParentRight = xParent->getPosition().X + xParent->getSize().Width; + + uno::Reference xChildren(xShapeGroup->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xChildren.is()); + uno::Reference xChild2Text(xChildren->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xChild2Text.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Child 2"), xChild2Text->getString()); + uno::Reference xChild2(xChild2Text, uno::UNO_QUERY); + CPPUNIT_ASSERT(xChild2.is()); + int nChild2Right = xChild2->getPosition().X + xChild2->getSize().Width; + + // Without the accompanying fix in place, this test would have failed with + // 'Expected less than: 100, Actual : 22014', i.e. the second child was + // shifted to the right too much. + CPPUNIT_ASSERT_LESS(100, abs(nChild2Right - nParentRight)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testAccentProcess) +{ + createSdImpressDoc("pptx/smartart-accent-process.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + // 3 children: first pair, connector, second pair. + CPPUNIT_ASSERT_EQUAL(static_cast(4), xGroup->getCount()); + uno::Reference xGroupShape(xGroup, uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroupShape.is()); + + // The pair is a parent (shape + text) and a child, so 3 shapes in total. + // The order is important, first is at the back, last is at the front. + uno::Reference xFirstPair(xGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstPair.is()); + CPPUNIT_ASSERT_EQUAL(static_cast(3), xFirstPair->getCount()); + + uno::Reference xFirstParentText(xFirstPair->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstParentText.is()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xFirstParentText->getString()); + uno::Reference xFirstParent(xFirstParentText, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstParent.is()); + int nFirstParentTop = xFirstParent->getPosition().Y; + + uno::Reference xFirstChildText(xFirstPair->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstChildText.is()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), xFirstChildText->getString()); + uno::Reference xFirstChild(xFirstChildText, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstChildText.is()); + + { + uno::Reference xParasAccess(xFirstChildText, uno::UNO_QUERY); + uno::Reference xParas = xParasAccess->createEnumeration(); + uno::Reference xPara(xParas->nextElement(), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed + // with 'Expected: 0; Actual : 1270', i.e. there was a large + // unexpected left margin. + CPPUNIT_ASSERT_EQUAL(static_cast(0), + xPara->getPropertyValue("ParaLeftMargin").get()); + + uno::Reference xRules(xPara->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + comphelper::SequenceAsHashMap aRule(xRules->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(u"•"_ustr, aRule["BulletChar"].get()); + } + + int nFirstChildTop = xFirstChild->getPosition().Y; + int nFirstChildRight = xFirstChild->getPosition().X + xFirstChild->getSize().Width; + + // First child is below the first parent. + // Without the accompanying fix in place, this test would have failed with + // 'Expected less than: 3881, Actual : 3881', i.e. xFirstChild was not + // below xFirstParent (a good position is 9081). + CPPUNIT_ASSERT_LESS(nFirstChildTop, nFirstParentTop); + + // Make sure that we have an arrow shape between the two pairs. + uno::Reference xArrow(xGroup->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xArrow.is()); + comphelper::SequenceAsHashMap aCustomShapeGeometry( + xArrow->getPropertyValue("CustomShapeGeometry")); + // Without the accompanying fix in place, this test would have failed, i.e. + // the custom shape lacked a type -> arrow was not visible. + CPPUNIT_ASSERT(aCustomShapeGeometry["Type"].has()); + OUString aType = aCustomShapeGeometry["Type"].get(); + CPPUNIT_ASSERT_EQUAL(OUString("ooxml-rightArrow"), aType); + + // Make sure that height of the arrow is less than its width. + uno::Reference xArrowShape(xArrow, uno::UNO_QUERY); + CPPUNIT_ASSERT(xArrowShape.is()); + awt::Size aArrowSize = xArrowShape->getSize(); + CPPUNIT_ASSERT_LESS(aArrowSize.Width, aArrowSize.Height); + + uno::Reference xSecondPair(xGroup->getByIndex(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xSecondPair.is()); + CPPUNIT_ASSERT_EQUAL(static_cast(3), xSecondPair->getCount()); + uno::Reference xSecondParentText(xSecondPair->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstParentText.is()); + // Without the accompanying fix in place, this test would have failed with + // 'Expected: cc; Actual : c', i.e. non-first runs on data points were ignored. + CPPUNIT_ASSERT_EQUAL(OUString("cc"), xSecondParentText->getString()); + uno::Reference xSecondParent(xSecondParentText, uno::UNO_QUERY); + CPPUNIT_ASSERT(xSecondParent.is()); + int nSecondParentLeft = xSecondParent->getPosition().X; + // Without the accompanying fix in place, this test would have failed with + // 'Expected less than: 12700; Actual : 18540', i.e. the "b" and "c" + // shapes overlapped. + CPPUNIT_ASSERT_LESS(nSecondParentLeft, nFirstChildRight); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testContinuousBlockProcess) +{ + createSdImpressDoc("pptx/smartart-continuous-block-process.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + // 3 children: diagram background, background arrow, foreground. + CPPUNIT_ASSERT_EQUAL(static_cast(3), xGroup->getCount()); + + uno::Reference xLinear(xGroup->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xLinear.is()); + // 3 children: A, B and C. + CPPUNIT_ASSERT_EQUAL(static_cast(3), xLinear->getCount()); + + uno::Reference xA(xLinear->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xA.is()); + CPPUNIT_ASSERT_EQUAL(OUString("A"), xA->getString()); + uno::Reference xAShape(xA, uno::UNO_QUERY); + CPPUNIT_ASSERT(xAShape.is()); + // Without the accompanying fix in place, this test would have failed: the + // theoretically correct value is 5462 mm100 (16933 is the total width, and + // need to divide that to 1, 0.5, 1, 0.5 and 1 units), while the old value + // was 4703 and the new one is 5461. + CPPUNIT_ASSERT_GREATER(static_cast(5000), xAShape->getSize().Width); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testOrgChart) +{ + // Simple org chart with 1 manager and 1 employee only. + createSdImpressDoc("pptx/smartart-org-chart.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + uno::Reference xManager( + getChildShape(getChildShape(getChildShape(xGroup, 1), 0), 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xManager.is()); + // Without the accompanying fix in place, this test would have failed: this + // was just "Manager", and the second paragraph was lost. + CPPUNIT_ASSERT_EQUAL(OUString("Manager\nSecond para"), xManager->getString()); + + uno::Reference xParaEnumAccess(xManager, uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnumAccess(xPara, uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + uno::Reference xRun(xRunEnum->nextElement(), uno::UNO_QUERY); + Color nActualColor; + xRun->getPropertyValue("CharColor") >>= nActualColor; + // Without the accompanying fix in place, this test would have failed: the + // "Manager" font color was black, not white. + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nActualColor); + + uno::Reference xManagerShape(xManager, uno::UNO_QUERY); + CPPUNIT_ASSERT(xManagerShape.is()); + + awt::Point aManagerPos = xManagerShape->getPosition(); + awt::Size aManagerSize = xManagerShape->getSize(); + + // Make sure that the manager has 2 employees. + uno::Reference xEmployees(getChildShape(getChildShape(xGroup, 1), 2), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xEmployees.is()); + // 4 children: connector, 1st employee, connector, 2nd employee. + CPPUNIT_ASSERT_EQUAL(static_cast(4), xEmployees->getCount()); + + uno::Reference xEmployee( + getChildShape( + getChildShape(getChildShape(getChildShape(getChildShape(xGroup, 1), 2), 1), 0), 0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xEmployee.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Employee"), xEmployee->getString()); + + uno::Reference xEmployeeShape(xEmployee, uno::UNO_QUERY); + CPPUNIT_ASSERT(xEmployeeShape.is()); + + awt::Point aEmployeePos = xEmployeeShape->getPosition(); + awt::Size aEmployeeSize = xEmployeeShape->getSize(); + + CPPUNIT_ASSERT_EQUAL(aManagerPos.X, aEmployeePos.X); + + // Without the accompanying fix in place, this test would have failed: the + // two shapes were overlapping, i.e. "manager" was not above "employee". + CPPUNIT_ASSERT_GREATER(aManagerPos.Y, aEmployeePos.Y); + + // Make sure that the second employee is on the right of the first one. + // Without the accompanying fix in place, this test would have failed, as + // the second employee was below the first one. + uno::Reference xEmployee2( + getChildShape( + getChildShape(getChildShape(getChildShape(getChildShape(xGroup, 1), 2), 3), 0), 0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xEmployee2.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Employee2"), xEmployee2->getString()); + + uno::Reference xEmployee2Shape(xEmployee2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xEmployee2Shape.is()); + + awt::Point aEmployee2Pos = xEmployee2Shape->getPosition(); + //awt::Size aEmployee2Size = xEmployee2Shape->getSize(); + CPPUNIT_ASSERT_GREATER(aEmployeePos.X, aEmployee2Pos.X); + + // Make sure that assistant is above employees. + uno::Reference xAssistant( + getChildShape( + getChildShape(getChildShape(getChildShape(getChildShape(xGroup, 1), 1), 1), 0), 0), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Assistant"), xAssistant->getString()); + + uno::Reference xAssistantShape(xAssistant, uno::UNO_QUERY); + CPPUNIT_ASSERT(xAssistantShape.is()); + + awt::Point aAssistantPos = xAssistantShape->getPosition(); + // Without the accompanying fix in place, this test would have failed: the + // assistant shape was below the employee shape. + CPPUNIT_ASSERT_GREATER(aAssistantPos.Y, aEmployeePos.Y); + + // Make sure the connector of the assistant is above the shape. + uno::Reference xAssistantConnector + = getChildShape(getChildShape(getChildShape(xGroup, 1), 1), 0); + CPPUNIT_ASSERT(xAssistantConnector.is()); + //awt::Point aAssistantConnectorPos = xAssistantConnector->getPosition(); + // This failed, the vertical positions of the connector and the shape of + // the assistant were the same. + //CPPUNIT_ASSERT_LESS(aAssistantPos.Y, aAssistantConnectorPos.Y); + // connectors are hidden as they don't work correctly + + // Make sure the height of xManager and xManager2 is the same. + uno::Reference xManager2( + getChildShape(getChildShape(getChildShape(xGroup, 2), 0), 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xManager2.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Manager2"), xManager2->getString()); + + uno::Reference xManager2Shape(xManager2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xManager2Shape.is()); + + awt::Size aManager2Size = xManager2Shape->getSize(); + // Without the accompanying fix in place, this test would have failed: + // xManager2's height was 3 times larger than xManager's height. + CPPUNIT_ASSERT_EQUAL(aManagerSize.Height, aManager2Size.Height); + + // Make sure the employee nodes use the free space on the right, since + // manager2 has no assistants / employees. + //CPPUNIT_ASSERT_GREATER(aManagerSize.Width, aEmployeeSize.Width + aEmployee2Size.Width); + // currently disabled as causes problems in complex charts + + // Without the accompanying fix in place, this test would have failed: an + // employee was exactly the third of the total height, without any spacing. + CPPUNIT_ASSERT_LESS(xGroup->getSize().Height / 3, aEmployeeSize.Height); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testCycleMatrix) +{ + createSdImpressDoc("pptx/smartart-cycle-matrix.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + // Without the accompanying fix in place, this test would have failed: the height was 12162, + // which is not the mm100 equivalent of the 4064000 EMU in the input file. + CPPUNIT_ASSERT_EQUAL(static_cast(11288), xGroup->getSize().Height); + + uno::Reference xA1(getChildShape(getChildShape(xGroup, 2), 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xA1.is()); + CPPUNIT_ASSERT_EQUAL(OUString("A1"), xA1->getString()); + + // Test fill color of B1, should be orange. + uno::Reference xB1(getChildShape(getChildShape(xGroup, 2), 1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xB1.is()); + CPPUNIT_ASSERT_EQUAL(OUString("B1"), xB1->getString()); + + uno::Reference xB1Props(xB1, uno::UNO_QUERY); + CPPUNIT_ASSERT(xB1Props.is()); + Color nFillColor; + xB1Props->getPropertyValue("FillColor") >>= nFillColor; + // Without the accompanying fix in place, this test would have failed: the background color was + // 0x4f81bd, i.e. blue, not orange. + CPPUNIT_ASSERT_EQUAL(Color(0xf79646), nFillColor); + + // Without the accompanying fix in place, this test would have failed: the + // content of the "A2" shape was lost. + uno::Reference xA2(getChildShape(getChildShape(getChildShape(xGroup, 1), 0), 1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xA2.is()); + CPPUNIT_ASSERT_EQUAL(OUString("A2"), xA2->getString()); + + // Test that the layout of shapes is like this: + // A2 B2 + // D2 C2 + + uno::Reference xA2Shape(xA2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xA2Shape.is()); + + uno::Reference xB2(getChildShape(getChildShape(getChildShape(xGroup, 1), 1), 1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xB2.is()); + CPPUNIT_ASSERT_EQUAL(OUString("B2"), xB2->getString()); + uno::Reference xB2Shape(xB2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xB2Shape.is()); + + // Test line color of B2, should be orange. + uno::Reference xB2Props(xB2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xB2Props.is()); + Color nLineColor = 0; + xB2Props->getPropertyValue("LineColor") >>= nLineColor; + CPPUNIT_ASSERT_EQUAL(Color(0xf79646), nLineColor); + + uno::Reference xC2(getChildShape(getChildShape(getChildShape(xGroup, 1), 2), 1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xC2.is()); + // Without the accompanying fix in place, this test would have failed, i.e. the order of the + // lines in the shape were wrong: C2-1\nC2-4\nC2-3\nC2-2. + CPPUNIT_ASSERT_EQUAL(OUString("C2-1\nC2-2\nC2-3\nC2-4"), xC2->getString()); + uno::Reference xC2Shape(xC2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xC2Shape.is()); + + uno::Reference xD2(getChildShape(getChildShape(getChildShape(xGroup, 1), 3), 1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xD2.is()); + CPPUNIT_ASSERT_EQUAL(OUString("D2"), xD2->getString()); + uno::Reference xD2Shape(xD2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xD2Shape.is()); + + // Without the accompanying fix in place, this test would have failed, i.e. + // the A2 and B2 shapes had the same horizontal position, while B2 should + // be on the right of A2. + CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().X, xB2Shape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xA2Shape->getPosition().Y, xB2Shape->getPosition().Y); + CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().X, xC2Shape->getPosition().X); + CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().Y, xC2Shape->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xA2Shape->getPosition().X, xD2Shape->getPosition().X); + CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().Y, xD2Shape->getPosition().Y); + + // Without the accompanying fix in place, this test would have failed: width was expected to be + // 4887, was actually 7331. + uno::Reference xA1Shape(xA1, uno::UNO_QUERY); + CPPUNIT_ASSERT(xA1Shape.is()); + CPPUNIT_ASSERT_EQUAL(xA1Shape->getSize().Height, xA1Shape->getSize().Width); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testPictureStrip) +{ + createSdImpressDoc("pptx/smartart-picture-strip.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + uno::Reference xFirstImage(getChildShape(getChildShape(xGroup, 1), 1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstImage.is()); + drawing::FillStyle eFillStyle = drawing::FillStyle_NONE; + xFirstImage->getPropertyValue("FillStyle") >>= eFillStyle; + // Without the accompanying fix in place, this test would have failed: fill style was solid, not + // bitmap. + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, eFillStyle); + + uno::Reference xGraphic; + xFirstImage->getPropertyValue("FillBitmap") >>= xGraphic; + Graphic aFirstGraphic(xGraphic); + + uno::Reference xSecondImage(getChildShape(getChildShape(xGroup, 2), 1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xSecondImage.is()); + eFillStyle = drawing::FillStyle_NONE; + xSecondImage->getPropertyValue("FillStyle") >>= eFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, eFillStyle); + + xSecondImage->getPropertyValue("FillBitmap") >>= xGraphic; + Graphic aSecondGraphic(xGraphic); + // Without the accompanying fix in place, this test would have failed: both xFirstImage and + // xSecondImage had the bitmap fill from the second shape. + CPPUNIT_ASSERT(aFirstGraphic.GetChecksum() != aSecondGraphic.GetChecksum()); + + // Test that the 3 images are in a single column, in 3 rows. + uno::Reference xFirstImageShape(xFirstImage, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstImage.is()); + uno::Reference xSecondImageShape(xSecondImage, uno::UNO_QUERY); + CPPUNIT_ASSERT(xSecondImage.is()); + uno::Reference xThirdImageShape = getChildShape(getChildShape(xGroup, 3), 1); + CPPUNIT_ASSERT(xThirdImageShape.is()); + // Without the accompanying fix in place, this test would have failed: the first and the second + // image were in the same row. + CPPUNIT_ASSERT_EQUAL(xFirstImageShape->getPosition().X, xSecondImageShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xSecondImageShape->getPosition().X, xThirdImageShape->getPosition().X); + CPPUNIT_ASSERT_GREATER(xFirstImageShape->getPosition().Y, xSecondImageShape->getPosition().Y); + CPPUNIT_ASSERT_GREATER(xSecondImageShape->getPosition().Y, xThirdImageShape->getPosition().Y); + + // Make sure that the title shape doesn't overlap with the diagram. + // Note that real "no overlap" is asserted here, though in fact what we want is a less strict + // condition: that no text part of the title shape and the diagram overlaps. + uno::Reference xTitle(getShapeFromPage(1, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xTitle.is()); + // Without the accompanying fix in place, this test would have failed with 'Expected greater + // than: 2873; Actual : 2320', i.e. the title shape and the diagram overlapped. + uno::Reference xFirstPair = getChildShape(xGroup, 1); + CPPUNIT_ASSERT_GREATER(xTitle->getPosition().Y + xTitle->getSize().Height, + xFirstPair->getPosition().Y); + + // Make sure that left margin is 60% of width (if you count width in points and margin in mms). + uno::Reference xFirstText(getChildShape(getChildShape(xGroup, 1), 0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstText.is()); + sal_Int32 nTextLeftDistance = 0; + xFirstText->getPropertyValue("TextLeftDistance") >>= nTextLeftDistance; + uno::Reference xFirstTextShape(xFirstText, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFirstTextShape.is()); + sal_Int32 nWidth = xFirstTextShape->getSize().Width; + double fFactor = oox::drawingml::convertPointToMms(0.6); + // Without the accompanying fix in place, this test would have failed with 'Expected: 3440, + // Actual : 263', i.e. the left margin was too small. + CPPUNIT_ASSERT_EQUAL(static_cast(nWidth * fFactor), nTextLeftDistance); + + // Make sure that aspect ratio is not ignored, i.e. width is not larger than height 3 times. + awt::Size aFirstPairSize = xFirstPair->getSize(); + // Without the accompanying fix in place, this test would have failed: bad width was 16932, good + // width is 12540, but let's accept 12541 as well. + CPPUNIT_ASSERT_LESSEQUAL(aFirstPairSize.Height * 3 + 1, aFirstPairSize.Width); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testInteropGrabBag) +{ + createSdImpressDoc("pptx/smartart-interopgrabbag.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + uno::Reference xPropertySet(xGroup, uno::UNO_QUERY_THROW); + uno::Sequence aGrabBagSeq; + xPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBagSeq; + comphelper::SequenceAsHashMap aGrabBag(aGrabBagSeq); + CPPUNIT_ASSERT(aGrabBag.find("OOXData") != aGrabBag.end()); + CPPUNIT_ASSERT(aGrabBag.find("OOXLayout") != aGrabBag.end()); + CPPUNIT_ASSERT(aGrabBag.find("OOXStyle") != aGrabBag.end()); + CPPUNIT_ASSERT(aGrabBag.find("OOXColor") != aGrabBag.end()); + CPPUNIT_ASSERT(aGrabBag.find("OOXDrawing") != aGrabBag.end()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBackground) +{ + createSdImpressDoc("pptx/smartart-background.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + // background should fill whole diagram + uno::Reference xShapeGroup(xGroup, uno::UNO_QUERY); + uno::Reference xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(xShape->getPosition().X, xShapeGroup->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xShape->getPosition().Y, xShapeGroup->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape->getSize().Width, xShapeGroup->getSize().Width); + CPPUNIT_ASSERT_EQUAL(xShape->getSize().Height, xShapeGroup->getSize().Height); + + uno::Reference xPropertySet(xShape, uno::UNO_QUERY_THROW); + drawing::FillStyle eFillStyle = drawing::FillStyle_NONE; + xPropertySet->getPropertyValue("FillStyle") >>= eFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, eFillStyle); + + Color nFillColor; + xPropertySet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x339933), nFillColor); + + bool bMoveProtect = false; + xPropertySet->getPropertyValue("MoveProtect") >>= bMoveProtect; + CPPUNIT_ASSERT_EQUAL(true, bMoveProtect); + + bool bSizeProtect = false; + xPropertySet->getPropertyValue("SizeProtect") >>= bSizeProtect; + CPPUNIT_ASSERT_EQUAL(true, bSizeProtect); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBackgroundDrawingmlFallback) +{ + // same as testBackground, but test file contains drawingML fallback + + createSdImpressDoc("pptx/smartart-background-drawingml-fallback.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + // background should fill whole diagram + uno::Reference xShapeGroup(xGroup, uno::UNO_QUERY); + uno::Reference xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(xShape->getPosition().X, xShapeGroup->getPosition().X); + CPPUNIT_ASSERT_EQUAL(xShape->getPosition().Y, xShapeGroup->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(xShape->getSize().Width, xShapeGroup->getSize().Width); + CPPUNIT_ASSERT_EQUAL(xShape->getSize().Height, xShapeGroup->getSize().Height); + + uno::Reference xPropertySet(xShape, uno::UNO_QUERY_THROW); + drawing::FillStyle eFillStyle = drawing::FillStyle_NONE; + xPropertySet->getPropertyValue("FillStyle") >>= eFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, eFillStyle); + + Color nFillColor; + xPropertySet->getPropertyValue("FillColor") >>= nFillColor; + CPPUNIT_ASSERT_EQUAL(Color(0x339933), nFillColor); + + bool bMoveProtect = false; + xPropertySet->getPropertyValue("MoveProtect") >>= bMoveProtect; + CPPUNIT_ASSERT_EQUAL(true, bMoveProtect); + + bool bSizeProtect = false; + xPropertySet->getPropertyValue("SizeProtect") >>= bSizeProtect; + CPPUNIT_ASSERT_EQUAL(true, bSizeProtect); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testCenterCycle) +{ + createSdImpressDoc("pptx/smartart-center-cycle.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + uno::Reference xGroupNested(xGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroupNested.is()); + + uno::Reference xShapeCenter(xGroupNested->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShapeA(xGroupNested->getByIndex(1), uno::UNO_QUERY); + uno::Reference xShapeB(xGroupNested->getByIndex(2), uno::UNO_QUERY); + uno::Reference xShapeC(xGroupNested->getByIndex(3), uno::UNO_QUERY); + + uno::Reference xTextCenter(xShapeCenter, uno::UNO_QUERY); + CPPUNIT_ASSERT(xTextCenter.is()); + CPPUNIT_ASSERT_EQUAL(OUString("center"), xTextCenter->getString()); + + CPPUNIT_ASSERT_LESS(xShapeCenter->getPosition().Y, xShapeA->getPosition().Y); + CPPUNIT_ASSERT_GREATER(xShapeCenter->getPosition().X, xShapeB->getPosition().X); + CPPUNIT_ASSERT_GREATER(xShapeCenter->getPosition().Y, xShapeB->getPosition().Y); + CPPUNIT_ASSERT_LESS(xShapeCenter->getPosition().X, xShapeC->getPosition().X); + CPPUNIT_ASSERT_GREATER(xShapeCenter->getPosition().Y, xShapeC->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testFontSize) +{ + createSdImpressDoc("pptx/smartart-font-size.pptx"); + + uno::Reference xGroup1(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xShape1(xGroup1->getByIndex(1), uno::UNO_QUERY); + uno::Reference xParagraph1(getParagraphFromShape(0, xShape1)); + uno::Reference xRun1(getRunFromParagraph(0, xParagraph1)); + uno::Reference xPropSet1(xRun1, uno::UNO_QUERY); + double fFontSize1 = xPropSet1->getPropertyValue("CharHeight").get(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(65.0, fFontSize1, 0.01); + + uno::Reference xGroup2(getShapeFromPage(1, 0), uno::UNO_QUERY); + uno::Reference xShape2(xGroup2->getByIndex(1), uno::UNO_QUERY); + uno::Reference xParagraph2(getParagraphFromShape(0, xShape2)); + uno::Reference xRun2(getRunFromParagraph(0, xParagraph2)); + uno::Reference xPropSet2(xRun2, uno::UNO_QUERY); + double fFontSize2 = xPropSet2->getPropertyValue("CharHeight").get(); + CPPUNIT_ASSERT_EQUAL(32.0, fFontSize2); + + uno::Reference xGroup3(getShapeFromPage(2, 0), uno::UNO_QUERY); + uno::Reference xShape3(xGroup3->getByIndex(1), uno::UNO_QUERY); + drawing::TextFitToSizeType eTextFitToSize = drawing::TextFitToSizeType_NONE; + xShape3->getPropertyValue("TextFitToSize") >>= eTextFitToSize; + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_AUTOFIT, eTextFitToSize); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testVerticalBlockList) +{ + createSdImpressDoc("pptx/smartart-vertical-block-list.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + uno::Reference xGroup1(xGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), xGroup1->getCount()); + uno::Reference xShapeA(xGroup1->getByIndex(1), uno::UNO_QUERY); + uno::Reference xShapeBC(xGroup1->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextA(xShapeA, uno::UNO_QUERY); + uno::Reference xTextBC(xShapeBC, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xTextA->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b\nc"), xTextBC->getString()); + + uno::Reference xPropSetBC(xShapeBC, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), + xPropSetBC->getPropertyValue("RotateAngle").get()); + + // BC shape is rotated 90*, so width and height is swapped + CPPUNIT_ASSERT_GREATER(xShapeA->getSize().Width, xShapeBC->getSize().Height); + CPPUNIT_ASSERT_LESS(xShapeA->getSize().Height, xShapeBC->getSize().Width); + CPPUNIT_ASSERT_GREATER(xShapeA->getPosition().X, xShapeBC->getPosition().X); + CPPUNIT_ASSERT_GREATER(xShapeA->getPosition().Y, xShapeBC->getPosition().Y); + + uno::Reference xGroup3(xGroup->getByIndex(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xGroup3->getCount()); + uno::Reference xShapeEmpty(xGroup3->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextEmpty(xShapeEmpty, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("empty"), xTextEmpty->getString()); + + CPPUNIT_ASSERT_EQUAL(xShapeA->getSize().Width, xShapeEmpty->getSize().Width); + CPPUNIT_ASSERT_EQUAL(xShapeA->getSize().Height, xShapeEmpty->getSize().Height); + CPPUNIT_ASSERT_EQUAL(xShapeA->getPosition().X, xShapeEmpty->getPosition().X); + CPPUNIT_ASSERT_GREATER(xShapeA->getPosition().Y + 2 * xShapeA->getSize().Height, + xShapeEmpty->getPosition().Y); + + uno::Reference xGroupShape(xGroup, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(xGroupShape->getPosition().Y + xGroupShape->getSize().Height, + xShapeEmpty->getPosition().Y + xShapeEmpty->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testMissingBulletAndIndent) +{ + createSdImpressDoc("pptx/smartart-missing-bullet.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xGroup1(xGroup->getByIndex(2), uno::UNO_QUERY); + uno::Reference xGroup2(xGroup1->getByIndex(0), uno::UNO_QUERY); + uno::Reference xText(xGroup2->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xText.is()); + + uno::Reference xParasAccess(xText, uno::UNO_QUERY); + uno::Reference xParas = xParasAccess->createEnumeration(); + xParas->nextElement(); // skip parent + + uno::Reference xPara1(xParas->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara1.is()); + + sal_Int16 nNumberingLevel = -1; + xPara1->getPropertyValue("NumberingLevel") >>= nNumberingLevel; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nNumberingLevel); + + uno::Reference xNumRule; + xPara1->getPropertyValue("NumberingRules") >>= xNumRule; + uno::Sequence aBulletProps; + xNumRule->getByIndex(1) >>= aBulletProps; + + for (beans::PropertyValue const& rProp : std::as_const(aBulletProps)) + { + if (rProp.Name == "LeftMargin") + CPPUNIT_ASSERT_EQUAL(sal_Int32(309), rProp.Value.get()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testBulletList) +{ + createSdImpressDoc("pptx/smartart-bullet-list.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xGroup.is()); + + uno::Reference xText(xGroup->getByIndex(1), uno::UNO_QUERY); + uno::Reference xParasAccess(xText, uno::UNO_QUERY); + uno::Reference xParas = xParasAccess->createEnumeration(); + xParas->nextElement(); // skip parent + + // child levels should have bullets + uno::Reference xPara1(xParas->nextElement(), uno::UNO_QUERY); + uno::Reference xRules1(xPara1->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + comphelper::SequenceAsHashMap aRule1(xRules1->getByIndex(1)); + CPPUNIT_ASSERT_EQUAL(u"•"_ustr, aRule1["BulletChar"].get()); + + uno::Reference xPara2(xParas->nextElement(), uno::UNO_QUERY); + uno::Reference xRules2(xPara2->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + comphelper::SequenceAsHashMap aRule2(xRules2->getByIndex(2)); + CPPUNIT_ASSERT_EQUAL(u"•"_ustr, aRule2["BulletChar"].get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testRecursion) +{ + createSdImpressDoc("pptx/smartart-recursion.pptx"); + + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xGroup1(xGroup->getByIndex(1), uno::UNO_QUERY); + + uno::Reference xGroupA(xGroup1->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextA(xGroupA->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("A"), xTextA->getString()); + + uno::Reference xGroupB(xGroup1->getByIndex(1), uno::UNO_QUERY); + // 5 connectors, B1 with children, B2 with children + CPPUNIT_ASSERT_EQUAL(static_cast(7), xGroupB->getCount()); + + uno::Reference xGroupB1(xGroupB->getByIndex(1), uno::UNO_QUERY); + + uno::Reference xGroupB1a(xGroupB1->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextB1(xGroupB1a->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("B1"), xTextB1->getString()); + + uno::Reference xGroupC12(xGroupB1->getByIndex(1), uno::UNO_QUERY); + uno::Reference xTextC1( + getChildShape(getChildShape(getChildShape(xGroupC12, 0), 0), 0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("C1"), xTextC1->getString()); + uno::Reference xTextC2( + getChildShape(getChildShape(getChildShape(xGroupC12, 1), 0), 0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("C2"), xTextC2->getString()); + + uno::Reference xGroupB2(xGroupB->getByIndex(5), uno::UNO_QUERY); + + uno::Reference xGroupB2a(xGroupB2->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextB2(xGroupB2a->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("B2"), xTextB2->getString()); + + uno::Reference xGroupC3(xGroupB2->getByIndex(1), uno::UNO_QUERY); + uno::Reference xTextC3( + getChildShape(getChildShape(getChildShape(xGroupC3, 0), 0), 0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("C3"), xTextC3->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testDataFollow) +{ + // checks if data nodes are followed correctly + // different variables are set for two presentation points with the same name + // they should be layouted differently - one horizontally and one vertically + + createSdImpressDoc("pptx/smartart-data-follow.pptx"); + + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + + uno::Reference xGroupLeft(xGroup->getByIndex(1), uno::UNO_QUERY); + uno::Reference xGroupB(xGroupLeft->getByIndex(1), uno::UNO_QUERY); + uno::Reference xShapeB1 + = getChildShape(getChildShape(getChildShape(xGroupB, 1), 0), 0); + uno::Reference xTextB1(xShapeB1, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("B1"), xTextB1->getString()); + uno::Reference xShapeB2 + = getChildShape(getChildShape(getChildShape(xGroupB, 3), 0), 0); + uno::Reference xTextB2(xShapeB2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("B2"), xTextB2->getString()); + + CPPUNIT_ASSERT_EQUAL(xShapeB1->getPosition().Y, xShapeB2->getPosition().Y); + CPPUNIT_ASSERT_GREATEREQUAL(xShapeB1->getPosition().X + xShapeB1->getSize().Width, + xShapeB2->getPosition().X); + + uno::Reference xGroupRight(xGroup->getByIndex(2), uno::UNO_QUERY); + uno::Reference xGroupC(xGroupRight->getByIndex(1), uno::UNO_QUERY); + uno::Reference xShapeC1 + = getChildShape(getChildShape(getChildShape(xGroupC, 3), 0), 0); + uno::Reference xTextC1(xShapeC1, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("C1"), xTextC1->getString()); + uno::Reference xShapeC2 + = getChildShape(getChildShape(getChildShape(xGroupC, 5), 0), 0); + uno::Reference xTextC2(xShapeC2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("C2"), xTextC2->getString()); + + CPPUNIT_ASSERT_EQUAL(xShapeC1->getPosition().X, xShapeC2->getPosition().X); + CPPUNIT_ASSERT_GREATEREQUAL(xShapeC1->getPosition().Y + xShapeC1->getSize().Height, + xShapeC2->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testOrgChart2) +{ + createSdImpressDoc("pptx/smartart-org-chart2.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + + uno::Reference xShapeC1 = findChildShapeByText(xGroup, "C1"); + uno::Reference xShapeC2 = findChildShapeByText(xGroup, "C2"); + uno::Reference xShapeC3 = findChildShapeByText(xGroup, "C3"); + uno::Reference xShapeC4 = findChildShapeByText(xGroup, "C4"); + uno::Reference xShapeD1 = findChildShapeByText(xGroup, "D1"); + uno::Reference xShapeD2 = findChildShapeByText(xGroup, "D2"); + + CPPUNIT_ASSERT(xShapeC1.is()); + CPPUNIT_ASSERT(xShapeC2.is()); + CPPUNIT_ASSERT(xShapeC3.is()); + CPPUNIT_ASSERT(xShapeC4.is()); + CPPUNIT_ASSERT(xShapeD1.is()); + CPPUNIT_ASSERT(xShapeD2.is()); + + CPPUNIT_ASSERT_EQUAL(xShapeC1->getPosition().Y, xShapeC2->getPosition().Y); + CPPUNIT_ASSERT_GREATEREQUAL(xShapeC1->getPosition().X + xShapeC1->getSize().Width, + xShapeC2->getPosition().X); + + CPPUNIT_ASSERT_EQUAL(xShapeC3->getPosition().X, xShapeC4->getPosition().X); + CPPUNIT_ASSERT_GREATEREQUAL(xShapeC3->getPosition().Y + xShapeC3->getSize().Height, + xShapeC4->getPosition().Y); + + CPPUNIT_ASSERT_EQUAL(xShapeD1->getPosition().X, xShapeD2->getPosition().X); + CPPUNIT_ASSERT_GREATEREQUAL(xShapeD1->getPosition().Y + xShapeD1->getSize().Height, + xShapeD2->getPosition().Y); + + CPPUNIT_ASSERT_GREATEREQUAL(xShapeC2->getPosition().X, xShapeD1->getPosition().X); + CPPUNIT_ASSERT_GREATEREQUAL(xShapeC2->getPosition().Y + xShapeC2->getSize().Height, + xShapeD1->getPosition().Y); + + CPPUNIT_ASSERT_GREATEREQUAL(xShapeD1->getPosition().X + xShapeD1->getSize().Width, + xShapeC4->getPosition().X); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf131553) +{ + createSdImpressDoc("pptx/tdf131553.pptx"); + + const SdrPage* pPage = GetPage(1); + const SdrObjGroup* pObjGroup = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pObjGroup); + const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(1); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testFillColorList) +{ + createSdImpressDoc("pptx/fill-color-list.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xShape = getChildShape(getChildShape(xGroup, 1), 0); + uno::Reference xPropertySet(xShape, uno::UNO_QUERY_THROW); + Color nFillColor; + xPropertySet->getPropertyValue("FillColor") >>= nFillColor; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 12603469 (0xc0504d) + // - Actual : 16225862 (0xf79646) + // i.e. the background of the "A" shape was orange-ish, rather than red-ish. + CPPUNIT_ASSERT_EQUAL(Color(0xC0504D), nFillColor); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2239 + // - Actual : 5199 + // i.e. the "A" shape's height/width aspect ratio was not 0.4 but rather close to 1.0, even if + // ppt/diagrams/layout1.xml's requested + // 0.4. + awt::Size aActualSize = xShape->getSize(); + CPPUNIT_ASSERT_EQUAL(static_cast(2239), aActualSize.Height); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 1738 (2766) + // - Actual : 1738 + // i.e. the columns were not centered vertically. + sal_Int32 nGroupTop = xGroup->getPosition().Y; + sal_Int32 nShapeTop = xShape->getPosition().Y; + CPPUNIT_ASSERT_GREATER(nGroupTop, nShapeTop); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf134221) +{ + createSdImpressDoc("pptx/smartart-tdf134221.pptx"); + saveAndReload("Impress Office Open XML"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xShapeB = findChildShapeByText(xGroup, "B"); + CPPUNIT_ASSERT(xShapeB.is()); + uno::Reference xTxtProps(xShapeB, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT_EQUAL(static_cast(-248), + xTxtProps->getPropertyValue("TextUpperDistance").get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testLinearRule) +{ + createSdImpressDoc("pptx/smartart-linear-rule.pptx"); + + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // Last child, then first child inside that. + // It is first as backgroundArrow is last, but chOrder="t" is set to reverse the order. + uno::Reference xShape = getChildShape(getChildShape(xGroup, 1), 0); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 17500 (19867) + // - Actual : 4966 + // i.e. the width of the background arrow was too small. + CPPUNIT_ASSERT_GREATER(static_cast(17500), xShape->getSize().Width); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 3160 + // - Actual : 8770 + // i.e. there was unexpected spacing on the left of the arrow. + // Then the imported version of the test document failed with: + // - Expected: 3160 + // - Actual : 19828 + // i.e. the spacing on the left of the arrow was so large that the shape was mostly outside the + // slide. + sal_Int32 nGroupLeft = xGroup->getPosition().X; + sal_Int32 nArrowLeft = xShape->getPosition().X; + CPPUNIT_ASSERT_EQUAL(nGroupLeft, nArrowLeft); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected less or equal than: 10092 + // - Actual : 20183 + // i.e. the arrow height was larger than the canvas given to the smartart on slide 1. + CPPUNIT_ASSERT_LESSEQUAL(static_cast(10092), xShape->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testLinearRuleVert) +{ + createSdImpressDoc("pptx/smartart-linear-rule-vert.pptx"); + + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // Get the P1 shape. + uno::Reference xShape = getChildShape(getChildShape(xGroup, 1), 1); + uno::Reference xShapeText(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("P1"), xShapeText->getString()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2020 + // - Actual : 10308 + // i.e. the first item on the vertical linear layout used ~all space, the other items were not + // visible. + CPPUNIT_ASSERT_EQUAL(static_cast(2020), xShape->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testAutofitSync) +{ + createSdImpressDoc("pptx/smartart-autofit-sync.pptx"); + + uno::Reference xDiagram(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xMiddle = getChildShape(xDiagram, 2); + uno::Reference xFirstInner(getChildShape(getChildShape(xMiddle, 0), 0), + uno::UNO_QUERY); + double nFirstScale = 0; + CPPUNIT_ASSERT(xFirstInner->getPropertyValue("TextFitToSizeScale") >>= nFirstScale); + CPPUNIT_ASSERT_GREATER(0.0, nFirstScale); + CPPUNIT_ASSERT_LESS(100.0, nFirstScale); + uno::Reference xSecondInner(getChildShape(getChildShape(xMiddle, 2), 0), + uno::UNO_QUERY); + double nSecondScale = 0; + CPPUNIT_ASSERT(xSecondInner->getPropertyValue("TextFitToSizeScale") >>= nSecondScale); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 56 + // - Actual : 100 + // i.e. the left shape had no scale-down and the right shape was scaled down, even if it was + // requested that their scaling matches. + CPPUNIT_ASSERT_EQUAL(nSecondScale, nFirstScale); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 (drawing::TextFitToSizeType_NONE) + // - Actual : 3 (TextFitToSizeType_AUTOFIT) + // i.e. the 3rd shape had font size as direct formatting, but its automatic text scale was not + // disabled. + uno::Reference xThirdInner(getChildShape(getChildShape(xMiddle, 4), 0), + uno::UNO_QUERY); + drawing::TextFitToSizeType eType{}; + CPPUNIT_ASSERT(xThirdInner->getPropertyValue("TextFitToSize") >>= eType); + CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, eType); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testSnakeRows) +{ + // Load a smartart which contains a snake algorithm. + // The expected layout of the 6 children is a 3x2 grid. + createSdImpressDoc("pptx/smartart-snake-rows.pptx"); + + uno::Reference xDiagram(getShapeFromPage(0, 0), uno::UNO_QUERY); + // Collect position of the background and the real child shapes. First row and background has + // the same top position, unless some unexpected spacing happens, since this is a + // "left-to-right, then top-to-bottom" snake direction. + std::set aYPositions; + for (sal_Int32 nChild = 0; nChild < xDiagram->getCount(); ++nChild) + { + uno::Reference xChild(xDiagram->getByIndex(nChild), uno::UNO_QUERY); + aYPositions.insert(xChild->getPosition().Y); + } + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 3 + // i.e. an unwanted row appeared. + CPPUNIT_ASSERT_EQUAL(static_cast(2), aYPositions.size()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testCompositeInferRight) +{ + // Load a smartart which contains a composite algorithm. + // One constraint says that the left of the text should be the right of the image. + createSdImpressDoc("pptx/smartart-composite-infer-right.pptx"); + + uno::Reference xDiagram(getShapeFromPage(0, 0), uno::UNO_QUERY); + uno::Reference xMiddle = getChildShape(xDiagram, 1); + uno::Reference xImage = getChildShape(xMiddle, 1); + uno::Reference xText = getChildShape(xMiddle, 2); + sal_Int32 nRightOfImage = xImage->getPosition().X + xImage->getSize().Width; + sal_Int32 nLeftOfText = xText->getPosition().X; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 7925 + // - Actual : 2430 + // i.e. the text was overlapping with the image. + CPPUNIT_ASSERT_GREATER(nRightOfImage, nLeftOfText); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf149551Pie) +{ + // The file contains a diagram of type "Basic Pie". + createSdImpressDoc("pptx/tdf149551_SmartArt_Pie.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // shape at index 0 is the background shape + uno::Reference xShape = getChildShape(xGroup, 1); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + tools::Rectangle aTextRect; + pCustomShape->TakeTextAnchorRect(aTextRect); + // without fix the text area rectangle had LT [7787,3420] and RB[16677,12312]. The values from + // txXfrm were ignored. + // The used tolerance is estimated. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(12658), sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(5073), sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(15627), sal_Int32(aTextRect.Right()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(7990), sal_Int32(aTextRect.Bottom()), 4); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf149551Pyramid) +{ + // The file contains a diagram of type "Basic Pyramid". + createSdImpressDoc("pptx/tdf149551_SmartArt_Pyramid.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // shape at index 0 is the background shape + uno::Reference xShape = getChildShape(xGroup, 1); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + tools::Rectangle aTextRect; + pCustomShape->TakeTextAnchorRect(aTextRect); + // without fix the text area rectangle had LT [9369,2700] and RB[14632,6185]. The values from + // txXfrm were ignored. + // The used tolerance is estimated. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(7591), sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1515), sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(16410), sal_Int32(aTextRect.Right()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(7370), sal_Int32(aTextRect.Bottom()), 4); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf149551Venn) +{ + // The file contains a diagram of type "Stacked Venn". + createSdImpressDoc("pptx/tdf149551_SmartArt_Venn.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // shape at index 0 is the background shape + uno::Reference xShape = getChildShape(xGroup, 1); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + tools::Rectangle aTextRect; + pCustomShape->TakeTextAnchorRect(aTextRect); + // without fix the text area rectangle had LT [6865,3396] and RB[17136,4600]. The values from + // txXfrm were ignored. + // The used tolerance is estimated. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(8772), sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1834), sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(15229), sal_Int32(aTextRect.Right()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(6162), sal_Int32(aTextRect.Bottom()), 4); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf149551Gear) +{ + // The file contains a diagram of type "Gear". + createSdImpressDoc("pptx/tdf149551_SmartArt_Gear.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // shape at index 0 is the background shape + uno::Reference xShape = getChildShape(xGroup, 1); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + tools::Rectangle aTextRect; + pCustomShape->TakeTextAnchorRect(aTextRect); + // without fix the text area rectangle had LT [4101,1014] and RB[8019,4932]. The values from + // txXfrm were ignored. + // The used tolerance is estimated. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(5501), sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(4500), sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(11000), sal_Int32(aTextRect.Right()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(9999), sal_Int32(aTextRect.Bottom()), 4); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf145528Matrix) +{ + // The file contains a diagram of type "Titled Matrix". Such is build from shapes of type + // 'round1Rect'. + createSdImpressDoc("pptx/tdf145528_SmartArt_Matrix.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // expected values + sal_Int32 nLeft[]{ 4001, 12001, 12001, 18501 }; + sal_Int32 nTop[]{ 9999, 1999, 12499, 5999 }; + // nWidth = 10292, nHeight = 4499 + // Without the fix in place the values were + // nLeft {2001, 12001, 12001, 22001} + // nTop {7999. 1999, 13999, 7999} + // nWidth {6000, 10000, 10000, 6000} + // nHeight {10000, 6000, 6000, 10000} + tools::Rectangle aTextRect; + for (auto i : { 1, 2, 3, 4 }) // shape at index 0 is the background shape + { + uno::Reference xShape = getChildShape(xGroup, i); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape + = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + pCustomShape->TakeTextAnchorRect(aTextRect); + CPPUNIT_ASSERT_DOUBLES_EQUAL(nLeft[i - 1], sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(nTop[i - 1], sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(10293), sal_Int32(aTextRect.GetWidth()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(4500), sal_Int32(aTextRect.GetHeight()), 4); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf135953TextPosition) +{ + // The file contains a diagram of type "Detailed Process". There the text area rectangle + // is at the left edge of the shape and rotated there. + createSdImpressDoc("pptx/tdf135953_SmartArt_textposition.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // shape at index 0 is the background shape + uno::Reference xShape = getChildShape(xGroup, 1); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + tools::Rectangle aTextRect; + pCustomShape->TakeTextAnchorRect(aTextRect); + // without fix the text area rectangle had LT[-2213,2336] and RB[4123,4575]. It was not + // considered that the txXfrm and the preset text area rectangle have different centers in this + // case and thus the text was far off. + // The used tolerance is estimated. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(3223), sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(-1661), sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(9559), sal_Int32(aTextRect.Right()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(578), sal_Int32(aTextRect.Bottom()), 4); +} + +CPPUNIT_TEST_FIXTURE(SdImportTestSmartArt, testTdf132302RightArrow) +{ + // The file contains a diagram of type "Process Arrows". It uses shapes of type "rightArrow". + // The text starts not at the left edge but in the middle to have space for a circle. Error was + // that the text starts left and so was hidden by the circle. + createSdImpressDoc("pptx/tdf132302_SmartArt_rightArrow.pptx"); + uno::Reference xGroup(getShapeFromPage(0, 0), uno::UNO_QUERY); + // shape at index 0 is the background shape + uno::Reference xShape = getChildShape(xGroup, 1); + CPPUNIT_ASSERT(xShape.is()); + auto pCustomShape = dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pCustomShape); + tools::Rectangle aTextRect; + pCustomShape->TakeTextAnchorRect(aTextRect); + // without fix the text area rectangle had LT[2790,59] and RB[11591,7940]. Position and size + // given in txXfrm in drawing.xml were not considered. + // The used tolerance is estimated. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(5078), sal_Int32(aTextRect.Left()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(58), sal_Int32(aTextRect.Top()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(11989), sal_Int32(aTextRect.Right()), 4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(7940), sal_Int32(aTextRect.Bottom()), 4); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx new file mode 100644 index 0000000000..c08e44ea26 --- /dev/null +++ b/sd/qa/unit/import-tests.cxx @@ -0,0 +1,1927 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "sdmodeltestbase.hxx" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace com::sun::star::uno +{ +template +static std::ostream& operator<<(std::ostream& rStrm, const uno::Reference& xRef) +{ + rStrm << xRef.get(); + return rStrm; +} +} + +/// Impress import filters tests. +class SdImportTest : public SdModelTestBase +{ +public: + SdImportTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +/** Test document against a reference XML dump of shapes. + +If you want to update one of these tests, or add a new one, set the nUpdateMe +to the index of the test, and the dump XML's will be created (or rewritten) +instead of checking. Use with care - when the test is failing, first find out +why, instead of just updating .xml's blindly. + +Example: Let's say you are adding a test called fdoABCD.pptx. You'll place it +to the data/ subdirectory, and will add an entry to aFilesToCompare below, +the 3rd parameter is for export test - can be -1 (don't export), "impress8", "MS PowerPoint 97" or "Impress Office Open XML" +like: + + { "fdoABCD.pptx", "xml/fdoABCD_", "Impress Office Open XML" }, + +and will count the index in the aFilesToCompare structure (1st is 0, 2nd is 1, +etc.) Temporarily you'll set nUpdateMe to this index (instead of -1), and run + +make sd + +This will generate the sd/qa/unit/data/xml/fdoABCD_*.xml for you. Now you +will change nUpdateMe back to -1, and commit your fdoABCD.pptx test, the +xml/fdoABCD_*.xml dumps, and the aFilesToCompare addition in one commit. + +As the last step, you will revert your fix and do 'make sd' again, to check +that without your fix, the unit test breaks. Then clean up, and push :-) + +NOTE: This approach is suitable only for tests of fixes that actually change +the layout - best to check by reverting your fix locally after having added +the test, and re-running; it should break. +*/ +CPPUNIT_TEST_FIXTURE(SdImportTest, testDocumentLayout) +{ + static const struct + { + std::u16string_view sInput, sDump; + OUString sExportType; + } aFilesToCompare[] + = { { u"odp/shapes-test.odp", u"xml/shapes-test_page", u""_ustr }, + { u"fdo47434.pptx", u"xml/fdo47434_", u""_ustr }, + { u"n758621.ppt", u"xml/n758621_", u""_ustr }, + { u"fdo64586.ppt", u"xml/fdo64586_", u""_ustr }, + + // needed to adapt this, the border parameter is no longer + // exported with MCGRs due to oox neither needing nor + // supporting it with now freely definable gradients + { u"n819614.pptx", u"xml/n819614_", u""_ustr }, + + { u"n820786.pptx", u"xml/n820786_", u""_ustr }, + { u"n762695.pptx", u"xml/n762695_", u""_ustr }, + { u"n593612.pptx", u"xml/n593612_", u""_ustr }, + { u"fdo71434.pptx", u"xml/fdo71434_", u""_ustr }, + { u"n902652.pptx", u"xml/n902652_", u""_ustr }, + { u"tdf90403.pptx", u"xml/tdf90403_", u""_ustr }, + { u"tdf90338.odp", u"xml/tdf90338_", u"Impress Office Open XML"_ustr }, + { u"tdf92001.odp", u"xml/tdf92001_", u"Impress Office Open XML"_ustr }, +// GCC -mfpmath=387 rounding issues in lclPushMarkerProperties +// (oox/source/drawingml/lineproperties.cxx); see mail sub-thread starting at +// "Re: Test File: sc/qa/unit/data/functions/fods/chiinv.fods: +// fails with Assertion" for how "-mfpmath=sse -msse2" would fix that: +#if !(defined LINUX && defined X86) + { u"tdf100491.pptx", u"xml/tdf100491_", u""_ustr }, +#endif + { u"tdf109317.pptx", u"xml/tdf109317_", u"impress8"_ustr }, + // { u"pptx/n828390.pptx", u"pptx/xml/n828390_", "Impress Office Open XML" }, // Example + }; + + for (int i = 0; i < static_cast(SAL_N_ELEMENTS(aFilesToCompare)); ++i) + { + int const nUpdateMe + = -1; // index of test we want to update; supposedly only when the test is created + + loadFromFile(aFilesToCompare[i].sInput); + if (!aFilesToCompare[i].sExportType.isEmpty()) + saveAndReload(aFilesToCompare[i].sExportType); + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xDrawPages = xDrawPagesSupplier->getDrawPages(); + CPPUNIT_ASSERT(xDrawPages.is()); + + sal_Int32 nLength = xDrawPages->getCount(); + for (sal_Int32 j = 0; j < nLength; ++j) + { + uno::Reference xDrawPage; + uno::Any aAny = xDrawPages->getByIndex(j); + aAny >>= xDrawPage; + uno::Reference xShapes(xDrawPage, uno::UNO_QUERY_THROW); + OUString aString = XShapeDumper::dump(xShapes); + + OString aFileName + = OUStringToOString(createFileURL(aFilesToCompare[i].sDump), RTL_TEXTENCODING_UTF8) + + OString::number(j) + ".xml"; + + if (nUpdateMe == i) // index was wrong here + { + // had to adapt this, std::ofstream annot write to an URL but needs a + // filesystem path. Seems as if no one had to adapt any of the cases + // for some years :-/ + OUString sTempFilePath; + osl::FileBase::getSystemPathFromFileURL(OUString::fromUtf8(aFileName), + sTempFilePath); + std::ofstream aStream(sTempFilePath.toUtf8().getStr(), + std::ofstream::out | std::ofstream::binary); + aStream << aString; + aStream.close(); + } + else + { + doXMLDiff(aFileName.getStr(), + OUStringToOString(aString, RTL_TEXTENCODING_UTF8).getStr(), + static_cast(aString.getLength()), + OUStringToOString(createFileURL(u"tolerance.xml"), RTL_TEXTENCODING_UTF8) + .getStr()); + } + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testFreeformShapeGluePoints) +{ + createSdImpressDoc("pptx/tdf156829.pptx"); + uno::Reference xFreeformShape(getShapeFromPage(0, 0)); + uno::Sequence aProps; + xFreeformShape->getPropertyValue("CustomShapeGeometry") >>= aProps; + + uno::Sequence aPathProps; + for (beans::PropertyValue const& rProp : std::as_const(aProps)) + { + if (rProp.Name == "Path") + aPathProps = rProp.Value.get>(); + } + + uno::Sequence seqGluePoints; + for (beans::PropertyValue const& rProp : std::as_const(aPathProps)) + { + if (rProp.Name == "GluePoints") + { + seqGluePoints + = rProp.Value.get>(); + } + } + + sal_Int32 nCountGluePoints = seqGluePoints.getLength(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), nCountGluePoints); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf154363) +{ + sal_Int32 nGlueId; + createSdImpressDoc("pptx/tdf154363.pptx"); + { + uno::Reference xConnector1(getShapeFromPage(1, 0), uno::UNO_SET_THROW); + uno::Reference xConnector2(getShapeFromPage(3, 0), uno::UNO_SET_THROW); + nGlueId = xConnector1->getPropertyValue("StartGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nGlueId); + nGlueId = xConnector2->getPropertyValue("EndGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nGlueId); + } + + saveAndReload("Impress MS PowerPoint 2007 XML"); + { + uno::Reference xConnector1(getShapeFromPage(1, 0), uno::UNO_SET_THROW); + uno::Reference xConnector2(getShapeFromPage(3, 0), uno::UNO_SET_THROW); + nGlueId = xConnector1->getPropertyValue("StartGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nGlueId); + nGlueId = xConnector2->getPropertyValue("EndGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nGlueId); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf153466) +{ + createSdImpressDoc("pptx/tdf153466.pptx"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xPageSet(xPage, uno::UNO_QUERY_THROW); + uno::Reference xBackground( + xPageSet->getPropertyValue("Background").get>()); + + com::sun::star::drawing::RectanglePoint aRectanglePoint; + xBackground->getPropertyValue("FillBitmapRectanglePoint") >>= aRectanglePoint; + CPPUNIT_ASSERT_EQUAL(drawing::RectanglePoint::RectanglePoint_RIGHT_BOTTOM, aRectanglePoint); + + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + xShape->getPropertyValue("FillBitmapRectanglePoint") >>= aRectanglePoint; + CPPUNIT_ASSERT_EQUAL(drawing::RectanglePoint::RectanglePoint_LEFT_MIDDLE, aRectanglePoint); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf152434) +{ + createSdImpressDoc("pptx/tdf152434.pptx"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + const SdrPage* pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testStandardConnectors) +{ + createSdImpressDoc("pptx/standardConnectors.pptx"); + + sal_Int32 aEdgeValue[] = { -1352, -2457, 3977, -2900, -1261, 4611, -1431, -2643, 3830, 3438 }; + + sal_Int32 nCount = 0; + sal_Int32 nEdgeLine = 0; + for (size_t i = 0; i < 10; i++) + { + uno::Reference xConnector(getShapeFromPage(i, 0)); + bool bConnector = xConnector->getPropertySetInfo()->hasPropertyByName("EdgeKind"); + if (bConnector) + { + nEdgeLine = xConnector->getPropertyValue("EdgeLine1Delta").get(); + CPPUNIT_ASSERT_EQUAL(aEdgeValue[nCount], nEdgeLine); + nCount++; + + nEdgeLine = xConnector->getPropertyValue("EdgeLine2Delta").get(); + if (nEdgeLine != 0) + { + CPPUNIT_ASSERT_EQUAL(aEdgeValue[nCount], nEdgeLine); + nCount++; + } + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testConnectors) +{ + createSdImpressDoc("pptx/connectors.pptx"); + + sal_Int32 aEdgeValue[] = { -1167, -1167, -1591, 1476, 1356, -1357, 1604, -1540, + 607, 1296, -1638, -1060, -522, 1578, -1291, 333 }; + + sal_Int32 nCount = 0; + for (size_t i = 0; i < 18; i++) + { + uno::Reference xConnector(getShapeFromPage(i, 0)); + bool bConnector = xConnector->getPropertySetInfo()->hasPropertyByName("EdgeLine1Delta"); + if (bConnector) + { + sal_Int32 nEdgeLine = xConnector->getPropertyValue("EdgeLine1Delta").get(); + CPPUNIT_ASSERT_EQUAL(aEdgeValue[nCount], nEdgeLine); + nCount++; + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf153036_resizedConnectorL) +{ + createSdImpressDoc("pptx/tdf153036_resizedConnectorL.pptx"); + + // TODO: If you are working on improvement related to connectors import, then + // expect this unit test to fail. + // This is a "L" shape, imported as a special "Z" shape that looks like a "L" shape. + uno::Reference xConnector(getShapeFromPage(1, 0)); + CPPUNIT_ASSERT(xConnector->getPropertySetInfo()->hasPropertyByName("EdgeLine1Delta")); + + sal_Int32 nEdgeLine = xConnector->getPropertyValue("EdgeLine1Delta").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-3243), nEdgeLine); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf150719) +{ + createSdImpressDoc("pptx/tdf150719.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(1, xParagraph)); + uno::Reference xPropSet1(xRun, uno::UNO_QUERY_THROW); + sal_Int16 nUnderline; + xPropSet1->getPropertyValue("CharUnderline") >>= nUnderline; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The underline is missing!", sal_Int16(1), nUnderline); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf149314) +{ + createSdImpressDoc("pptx/tdf149314.pptx"); + + OUString aURL; + uno::Reference xShape(getShapeFromPage(0, 1)); + + uno::Reference const xParagraph1(getParagraphFromShape(0, xShape)); + uno::Reference xRun1(getRunFromParagraph(0, xParagraph1)); + uno::Reference xPropSet1(xRun1, uno::UNO_QUERY_THROW); + uno::Reference xField1; + xPropSet1->getPropertyValue("TextField") >>= xField1; + xPropSet1.set(xField1, uno::UNO_QUERY); + xPropSet1->getPropertyValue("URL") >>= aURL; + CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("#Slide 1"), aURL); + + uno::Reference const xParagraph2(getParagraphFromShape(1, xShape)); + uno::Reference xRun2(getRunFromParagraph(0, xParagraph2)); + uno::Reference xPropSet2(xRun2, uno::UNO_QUERY_THROW); + uno::Reference xField2; + xPropSet2->getPropertyValue("TextField") >>= xField2; + xPropSet2.set(xField2, uno::UNO_QUERY); + xPropSet2->getPropertyValue("URL") >>= aURL; + CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("#Slide 3"), aURL); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf149124) +{ + createSdImpressDoc("pptx/tdf149124.pptx"); + + uno::Reference xGroupShape(getShapeFromPage(0, 0), + uno::UNO_QUERY_THROW); + uno::Reference xStandardConnector(xGroupShape->getByIndex(2), + uno::UNO_QUERY_THROW); + + sal_Int32 nStartGlueId + = xStandardConnector->getPropertyValue("StartGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nStartGlueId); + sal_Int32 nEndGlueId + = xStandardConnector->getPropertyValue("EndGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nEndGlueId); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf148965) +{ + // Set the system user interface to Hungarian + SvtSysLocaleOptions aOptions; + OUString sUIConfigString = aOptions.GetLanguageTag().getBcp47(); + aOptions.SetUILocaleConfigString("hu-HU"); + aOptions.Commit(); + comphelper::ScopeGuard g([&aOptions, &sUIConfigString] { + aOptions.SetUILocaleConfigString(sUIConfigString); + aOptions.Commit(); + }); + + createSdImpressDoc("pptx/tdf148965.pptx"); + + uno::Reference xShape1(getShapeFromPage(0, 1)); + uno::Reference xEventsSupplier1(xShape1, uno::UNO_QUERY); + uno::Reference xEvents1(xEventsSupplier1->getEvents()); + uno::Sequence props1; + xEvents1->getByName("OnClick") >>= props1; + comphelper::SequenceAsHashMap map1(props1); + auto iter1(map1.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("page1"), iter1->second.get()); + + uno::Reference xShape2(getShapeFromPage(1, 1)); + uno::Reference xEventsSupplier2(xShape2, uno::UNO_QUERY); + uno::Reference xEvents2(xEventsSupplier2->getEvents()); + uno::Sequence props2; + xEvents2->getByName("OnClick") >>= props2; + comphelper::SequenceAsHashMap map2(props2); + auto iter2(map2.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("page3"), iter2->second.get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf89449) +{ + createSdImpressDoc("pptx/tdf89449.pptx"); + + sal_Int32 nStartGlueId; + sal_Int32 nEndGlueId; + css::drawing::ConnectorType aConnectorType; + + uno::Reference xCurvedConnector(getShapeFromPage(3, 0)); + xCurvedConnector->getPropertyValue("EdgeKind") >>= aConnectorType; + CPPUNIT_ASSERT_EQUAL(drawing::ConnectorType::ConnectorType_CURVE, aConnectorType); + nStartGlueId = xCurvedConnector->getPropertyValue("StartGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nStartGlueId); + nEndGlueId = xCurvedConnector->getPropertyValue("EndGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nEndGlueId); + + uno::Reference xStraightConnector(getShapeFromPage(4, 0)); + xStraightConnector->getPropertyValue("EdgeKind") >>= aConnectorType; + CPPUNIT_ASSERT_EQUAL(drawing::ConnectorType::ConnectorType_LINE, aConnectorType); + nStartGlueId = xStraightConnector->getPropertyValue("StartGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nStartGlueId); + nEndGlueId = xStraightConnector->getPropertyValue("EndGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nEndGlueId); + + uno::Reference xStandardConnector(getShapeFromPage(5, 0)); + xStandardConnector->getPropertyValue("EdgeKind") >>= aConnectorType; + CPPUNIT_ASSERT_EQUAL(drawing::ConnectorType::ConnectorType_STANDARD, aConnectorType); + nStartGlueId = xStandardConnector->getPropertyValue("StartGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nStartGlueId); + nEndGlueId = xStandardConnector->getPropertyValue("EndGluePointIndex").get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nEndGlueId); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf147459) +{ + createSdImpressDoc("pptx/tdf147459.pptx"); + uno::Reference xTriangleShape(getShapeFromPage(0, 0)); + uno::Sequence aProps; + xTriangleShape->getPropertyValue("CustomShapeGeometry") >>= aProps; + + uno::Sequence aPathProps; + for (beans::PropertyValue const& rProp : std::as_const(aProps)) + { + if (rProp.Name == "Path") + aPathProps = rProp.Value.get>(); + } + + uno::Sequence seqGluePoints; + for (beans::PropertyValue const& rProp : std::as_const(aPathProps)) + { + if (rProp.Name == "GluePoints") + { + seqGluePoints + = rProp.Value.get>(); + } + } + + sal_Int32 nCountGluePoints = seqGluePoints.getLength(); + // The triangle has 6 glue points. + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), nCountGluePoints); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf146223) +{ + createSdImpressDoc("pptx/tdf146223.pptx"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + + uno::Reference xPage1(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xSet(xPage1, uno::UNO_QUERY_THROW); + + bool bBackgroundObjectsVisible; + xSet->getPropertyValue("IsBackgroundObjectsVisible") >>= bBackgroundObjectsVisible; + CPPUNIT_ASSERT_EQUAL(false, bBackgroundObjectsVisible); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf144918) +{ + createSdImpressDoc("pptx/tdf144918.pptx"); + + uno::Reference xShape1(getShapeFromPage(0, 1)); + uno::Reference xEventsSupplier1(xShape1, uno::UNO_QUERY); + uno::Reference xEvents1(xEventsSupplier1->getEvents()); + uno::Sequence props1; + xEvents1->getByName("OnClick") >>= props1; + comphelper::SequenceAsHashMap map1(props1); + auto iter1(map1.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("First slide"), iter1->second.get()); + + uno::Reference xShape2(getShapeFromPage(1, 1)); + uno::Reference xEventsSupplier2(xShape2, uno::UNO_QUERY); + uno::Reference xEvents2(xEventsSupplier2->getEvents()); + uno::Sequence props2; + xEvents2->getByName("OnClick") >>= props2; + comphelper::SequenceAsHashMap map2(props2); + auto iter2(map2.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("Third slide"), iter2->second.get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf144917) +{ + createSdImpressDoc("pptx/tdf144917.pptx"); + + uno::Reference xGroupShape(getShapeFromPage(0, 0), + uno::UNO_QUERY_THROW); + uno::Reference xShape(xGroupShape->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xEventsSupplier(xShape, uno::UNO_QUERY); + uno::Reference xEvents(xEventsSupplier->getEvents()); + uno::Sequence props; + xEvents->getByName("OnClick") >>= props; + comphelper::SequenceAsHashMap map(props); + auto iter(map.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("http://www.example.com/"), iter->second.get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testHyperlinkOnImage) +{ + createSdImpressDoc("pptx/hyperlinkOnImage.pptx"); + + uno::Reference xShape1(getShapeFromPage(1, 0)); + uno::Reference xEventsSupplier1(xShape1, uno::UNO_QUERY); + uno::Reference xEvents1(xEventsSupplier1->getEvents()); + uno::Sequence props1; + xEvents1->getByName("OnClick") >>= props1; + comphelper::SequenceAsHashMap map1(props1); + auto iter1(map1.find("ClickAction")); + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_LASTPAGE, + iter1->second.get()); + + uno::Reference xShape2(getShapeFromPage(1, 1)); + uno::Reference xEventsSupplier2(xShape2, uno::UNO_QUERY); + uno::Reference xEvents2(xEventsSupplier2->getEvents()); + uno::Sequence props2; + xEvents2->getByName("OnClick") >>= props2; + comphelper::SequenceAsHashMap map2(props2); + auto iter2(map2.find("ClickAction")); + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_NONE, + iter2->second.get()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf142645) +{ + createSdImpressDoc("pptx/tdf142645.pptx"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + + uno::Reference xPage1(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xNamed1(xPage1, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xNamed1->getName()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf141704) +{ + createSdImpressDoc("pptx/tdf141704.pptx"); + + for (sal_Int32 i = 0; i < 7; i++) + { + uno::Reference xShape(getShapeFromPage(1, i)); + uno::Reference xEventsSupplier(xShape, uno::UNO_QUERY); + uno::Reference xEvents(xEventsSupplier->getEvents()); + + uno::Sequence props; + xEvents->getByName("OnClick") >>= props; + comphelper::SequenceAsHashMap map(props); + auto iter(map.find("ClickAction")); + switch (i) + { + case 0: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_LASTPAGE, + iter->second.get()); + break; + case 1: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_NEXTPAGE, + iter->second.get()); + break; + case 2: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_PREVPAGE, + iter->second.get()); + break; + case 3: + { + auto iter1(map.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("http://www.example.com/"), + iter1->second.get()); + } + break; + case 4: + { + auto iter2(map.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("End Show"), iter2->second.get()); + } + break; + case 5: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_STOPPRESENTATION, + iter->second.get()); + break; + case 6: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_FIRSTPAGE, + iter->second.get()); + break; + default: + break; + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf142915) +{ + createSdImpressDoc("pptx/tdf142915.pptx"); + + uno::Reference xPresentationSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xPresentationProps(xPresentationSupplier->getPresentation(), + uno::UNO_QUERY_THROW); + + bool bChangeManually = xPresentationProps->getPropertyValue("IsAutomatic").get(); + + CPPUNIT_ASSERT_EQUAL(true, bChangeManually); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf142913) +{ + createSdImpressDoc("pptx/tdf142913.pptx"); + + uno::Reference xPresentationSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xPresentationProps(xPresentationSupplier->getPresentation(), + uno::UNO_QUERY_THROW); + + OUString sFirstPage = xPresentationProps->getPropertyValue("FirstPage").get(); + + CPPUNIT_ASSERT_EQUAL(OUString("Second"), sFirstPage); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf142590) +{ + createSdImpressDoc("pptx/tdf142590.pptx"); + + uno::Reference xPresentationSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xPresentationProps(xPresentationSupplier->getPresentation(), + uno::UNO_QUERY_THROW); + const OUString sCustomShowId + = xPresentationProps->getPropertyValue("CustomShow").get(); + + CPPUNIT_ASSERT(!sCustomShowId.isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testCustomSlideShow) +{ + createSdImpressDoc("pptx/tdf131390.pptx"); + + css::uno::Reference aXCPSup( + mxComponent, css::uno::UNO_QUERY); + css::uno::Reference aXCont(aXCPSup->getCustomPresentations()); + const css::uno::Sequence aNameSeq(aXCont->getElementNames()); + + // In the document, there are two custom presentations. + CPPUNIT_ASSERT_EQUAL(sal_uInt32(2), aNameSeq.size()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testInternalHyperlink) +{ + createSdImpressDoc("pptx/tdf65724.pptx"); + + uno::Reference xShape(getShapeFromPage(1, 0)); + + // Get first paragraph + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // first chunk of text + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + uno::Reference xField; + xPropSet->getPropertyValue("TextField") >>= xField; + CPPUNIT_ASSERT_MESSAGE("The text field is missing!", xField.is()); + + xPropSet.set(xField, uno::UNO_QUERY); + OUString aURL; + xPropSet->getPropertyValue("URL") >>= aURL; + CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("#Slide2"), aURL); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testHyperlinkColor) +{ + createSdImpressDoc("pptx/tdf137367.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph of the text + uno::Reference const xParagraph1(getParagraphFromShape(0, xShape)); + // Get second paragraph of the text + uno::Reference const xParagraph2(getParagraphFromShape(1, xShape)); + // Get third paragraph of the text + uno::Reference const xParagraph3(getParagraphFromShape(2, xShape)); + + // Get run of the first paragraph + uno::Reference xRun1(getRunFromParagraph(0, xParagraph1)); + uno::Reference xPropSet1(xRun1, uno::UNO_QUERY_THROW); + Color nCharColorBlue; + xPropSet1->getPropertyValue("CharColor") >>= nCharColorBlue; + + // Get run of the second paragraph + uno::Reference xRun2(getRunFromParagraph(1, xParagraph2)); + uno::Reference xPropSet2(xRun2, uno::UNO_QUERY_THROW); + Color nCharColorRed; + xPropSet2->getPropertyValue("CharColor") >>= nCharColorRed; + + // Get run of the third paragraph + uno::Reference xRun3(getRunFromParagraph(2, xParagraph3)); + uno::Reference xPropSet3(xRun3, uno::UNO_QUERY_THROW); + Color nCharColorGreen; + xPropSet3->getPropertyValue("CharColor") >>= nCharColorGreen; + + // Hyperlink colors should be blue, red, green. + CPPUNIT_ASSERT_EQUAL(Color(0x4472c4), nCharColorBlue); + CPPUNIT_ASSERT_EQUAL(Color(0xff0000), nCharColorRed); + CPPUNIT_ASSERT_EQUAL(Color(0x548235), nCharColorGreen); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testSmoketest) +{ + createSdImpressDoc("smoketest.pptx"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + // cf. SdrModel svx/svdmodel.hxx ... + + CPPUNIT_ASSERT_EQUAL_MESSAGE("wrong page count", static_cast(3), + pDoc->GetPageCount()); + + const SdrPage* pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE("no page", pPage != nullptr); + + CPPUNIT_ASSERT_MESSAGE("changed", !pDoc->IsChanged()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf131269) +{ + createSdImpressDoc("tdf131269.ppt"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + // Without the fix in place, this test would have failed with + // - Expected: 115 + // - Actual : 3 + CPPUNIT_ASSERT_EQUAL(static_cast(115), pDoc->GetPageCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN759180) +{ + createSdImpressDoc("n759180.pptx"); + + const SdrPage* pPage = GetPage(1); + + // Get the object + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + std::vector rLst; + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxULSpaceItem* pULSpace = aEdit.GetParaAttribs(0).GetItem(EE_PARA_ULSPACE); + CPPUNIT_ASSERT(pULSpace); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Para bottom spacing is wrong!", static_cast(0), + pULSpace->GetLower()); + aEdit.GetCharAttribs(1, rLst); + auto it = std::find_if(rLst.rbegin(), rLst.rend(), [](const EECharAttrib& rCharAttr) { + return dynamic_cast(rCharAttr.pAttr) != nullptr; + }); + if (it != rLst.rend()) + { + const SvxFontHeightItem* pFontHeight = dynamic_cast((*it).pAttr); + // nStart == 9 + // font height = 5 => 5*2540/72 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font height is wrong", static_cast(176), + pFontHeight->GetHeight()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN862510_1) +{ + createSdImpressDoc("pptx/n862510_1.pptx"); + + const SdrPage* pPage = GetPage(1); + { + std::vector rLst; + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + aEdit.GetCharAttribs(0, rLst); + for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); + ++it) + { + const SvxEscapementItem* pFontEscapement + = dynamic_cast((*it).pAttr); + CPPUNIT_ASSERT_MESSAGE( + "Baseline attribute not handled properly", + !(pFontEscapement && pFontEscapement->GetProportionalHeight() != 100)); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN862510_2) +{ + createSdImpressDoc("pptx/n862510_2.pptx"); + + const SdrPage* pPage = GetPage(1); + { + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); + SdrObjGroup* pGrpObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pGrpObj); + SdrObjCustomShape* pObj + = dynamic_cast(pGrpObj->GetSubList()->GetObj(1)); + CPPUNIT_ASSERT(pObj); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong Text Rotation!", 90.0, + pObj->GetExtraTextRotation(false)); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN862510_4) +{ + createSdImpressDoc("pptx/n862510_4.pptx"); + + const SdrPage* pPage = GetPage(1); + { + std::vector rLst; + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + aEdit.GetCharAttribs(0, rLst); + for (std::vector::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); + ++it) + { + const SvxColorItem* pC = dynamic_cast((*it).pAttr); + CPPUNIT_ASSERT_MESSAGE("gradfill for text color not handled!", + !(pC && pC->GetValue() == Color(0))); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN828390_2) +{ + createSdImpressDoc("pptx/n828390_2.pptx"); + const SdrPage* pPage = GetPage(1); + + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + CPPUNIT_ASSERT_EQUAL(OUString("Linux "), aEdit.GetText(0)); + CPPUNIT_ASSERT_EQUAL(OUString("Standard Platform"), aEdit.GetText(1)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN828390_3) +{ + createSdImpressDoc("pptx/n828390_3.pptx"); + const SdrPage* pPage = GetPage(1); + + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTxtObj); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + std::vector rLst; + aEdit.GetCharAttribs(1, rLst); + bool bPassed = std::none_of(rLst.rbegin(), rLst.rend(), [](const EECharAttrib& rCharAttr) { + const SvxEscapementItem* pFontEscapement + = dynamic_cast(rCharAttr.pAttr); + return pFontEscapement && (pFontEscapement->GetEsc() != 0); + }); + CPPUNIT_ASSERT_MESSAGE("CharEscapment not imported properly", bPassed); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testMasterPageStyleParent) +{ + createSdImpressDoc("odp/masterpage_style_parent.odp"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + SdStyleSheetPool* const pPool(pDoc->GetSdStyleSheetPool()); + + int parents(0); + SfxStyleSheetIterator iter(pPool, SfxStyleFamily::Page); + for (SfxStyleSheetBase* pStyle = iter.First(); pStyle; pStyle = iter.Next()) + { + OUString const name(pStyle->GetName()); + OUString const parent(pStyle->GetParent()); + if (!parent.isEmpty()) + { + ++parents; + // check that parent exists + SfxStyleSheetBase* const pParentStyle(pPool->Find(parent, SfxStyleFamily::Page)); + CPPUNIT_ASSERT(pParentStyle); + CPPUNIT_ASSERT_EQUAL(pParentStyle->GetName(), parent); + // check that parent has the same master page as pStyle + CPPUNIT_ASSERT(parent.indexOf(SD_LT_SEPARATOR) != -1); + CPPUNIT_ASSERT(name.indexOf(SD_LT_SEPARATOR) != -1); + CPPUNIT_ASSERT_EQUAL(parent.copy(0, parent.indexOf(SD_LT_SEPARATOR)), + name.copy(0, name.indexOf(SD_LT_SEPARATOR))); + } + } + // check that there are actually parents... + CPPUNIT_ASSERT_EQUAL(16, parents); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testGradientAngle) +{ + createSdDrawDoc("odg/gradient-angle.fodg"); + + uno::Reference const xDoc(mxComponent, uno::UNO_QUERY); + + awt::Gradient gradient; + uno::Reference const xGradients( + xDoc->createInstance("com.sun.star.drawing.GradientTable"), uno::UNO_QUERY); + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 38") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), gradient.Angle); // was: 3600 + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 10") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(270), gradient.Angle); // 27deg + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 11") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1145), gradient.Angle); // 2rad + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 12") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(900), gradient.Angle); // 100grad + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 13") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(3599), gradient.Angle); // -1 + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 14") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(3028), gradient.Angle); // -1rad + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 15") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(300), gradient.Angle); // 3900 + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 16") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(105), gradient.Angle); // 10.5deg + + CPPUNIT_ASSERT(xGradients->getByName("Gradient 17") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1800), gradient.Angle); // \pi rad + + uno::Reference const xTranspGradients( + xDoc->createInstance("com.sun.star.drawing.TransparencyGradientTable"), uno::UNO_QUERY); + + CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 2") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(10), gradient.Angle); // 1 + + CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 1") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(900), gradient.Angle); // 90deg + + CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 3") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(572), gradient.Angle); // 1.0rad + + CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 4") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1800), gradient.Angle); // 1000grad +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testN778859) +{ + createSdImpressDoc("pptx/n778859.pptx"); + + const SdrPage* pPage = GetPage(1); + { + // Get the object + SdrObject* pObj = pPage->GetObj(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + CPPUNIT_ASSERT(!pTxtObj->IsAutoFit()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testFdo68594) +{ + createSdImpressDoc("ppt/fdo68594.ppt"); + + const SdrPage* pPage = &(GetPage(1)->TRG_GetMasterPage()); + SdrObject* pObj = pPage->GetObj(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + const SvxColorItem* pC = &pTxtObj->GetMergedItem(EE_CHAR_COLOR); + CPPUNIT_ASSERT_MESSAGE("no color item", pC != nullptr); + // Color should be black + CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder color mismatch", COL_BLACK, pC->GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testPlaceholderPriority) +{ + createSdImpressDoc("ppt/placeholder-priority.pptx"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Missing placeholder", sal_uInt32(2), + sal_uInt32(pPage->GetObjCount())); + + tools::Rectangle pObj1Rect(9100, 3500, 29619, 4038); + SdrObject* pObj1 = pPage->GetObj(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder position is wrong, check the placeholder priority", + pObj1Rect, pObj1->GetCurrentBoundRect()); + + tools::Rectangle pObj2Rect(9102, 8643, 29619, 12642); + SdrObject* pObj2 = pPage->GetObj(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder position is wrong, check the placeholder priority", + pObj2Rect, pObj2->GetCurrentBoundRect()); + + // If the placeholder positions are wrong, please check placeholder priority in Placeholders class. +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testFdo72998) +{ + createSdImpressDoc("pptx/cshapes.pptx"); + + const SdrPage* pPage = GetPage(1); + { + SdrObjCustomShape* pObj = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT(pObj); + const SdrCustomShapeGeometryItem& rGeometryItem + = pObj->GetMergedItem(SDRATTR_CUSTOMSHAPE_GEOMETRY); + const css::uno::Any* pViewBox = const_cast(rGeometryItem) + .GetPropertyValueByName(OUString("ViewBox")); + CPPUNIT_ASSERT_MESSAGE("Missing ViewBox", pViewBox); + css::awt::Rectangle aViewBox; + CPPUNIT_ASSERT((*pViewBox >>= aViewBox)); + CPPUNIT_ASSERT_MESSAGE("Width should be zero - for forcing scale to 1", !aViewBox.Width); + CPPUNIT_ASSERT_MESSAGE("Height should be zero - for forcing scale to 1", !aViewBox.Height); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testFdo77027) +{ + createSdImpressDoc("odp/fdo77027.odp"); + + const SdrPage* pPage = GetPage(1); + { + SdrOle2Obj* const pObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pObj); + + // check that the fill style/color was actually imported + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0xff6600), rColorItem.GetColorValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf97808) +{ + createSdImpressDoc("tdf97808.fodp"); + + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference xStyleFamily(xStyleFamilies->getByName("graphics"), + uno::UNO_QUERY); + uno::Reference xStyle(xStyleFamily->getByName("objectwithoutfill"), + uno::UNO_QUERY); + OUString lineend; + CPPUNIT_ASSERT(xStyle->getPropertyValue("LineEndName") >>= lineend); + CPPUNIT_ASSERT_EQUAL(OUString("Arrow"), lineend); + + // the draw:marker-end="" did not override the style + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + uno::Reference xLine(xPage->getByIndex(0), uno::UNO_QUERY_THROW); + //uno::Reference xParent; + uno::Reference xParent; + CPPUNIT_ASSERT(xLine->getPropertyValue("Style") >>= xParent); + CPPUNIT_ASSERT_EQUAL(xStyle, xParent); + CPPUNIT_ASSERT(xLine->getPropertyValue("LineEndName") >>= lineend); + CPPUNIT_ASSERT_EQUAL(OUString(), lineend); +} +CPPUNIT_TEST_FIXTURE(SdImportTest, testFillStyleNone) +{ + createSdDrawDoc("tdf123841.odg"); + + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + // Without the accompanying fix in place, this test would have failed with 'Expected: 0; Actual: + // 1', i.e. the shape's fill was FillStyle_SOLID, making the text of the shape unreadable. + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testFdo64512) +{ + createSdImpressDoc("fdo64512.odp"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast(1), + xDoc->getDrawPages()->getCount()); + + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly three shapes", static_cast(3), + xPage->getCount()); + + uno::Reference xConnectorShape(xPage->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("no connector shape", xConnectorShape.is()); + + uno::Reference xSvgShape(xConnectorShape->getPropertyValue("StartShape"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("no start shape", xSvgShape.is()); + + uno::Reference xCustomShape(xConnectorShape->getPropertyValue("EndShape"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("no end shape", xCustomShape.is()); + + uno::Reference xAnimNodeSupplier(xPage, + uno::UNO_QUERY_THROW); + uno::Reference xRootNode(xAnimNodeSupplier->getAnimationNode()); + std::vector> aAnimVector; + anim::create_deep_vector(xRootNode, aAnimVector); + CPPUNIT_ASSERT_EQUAL_MESSAGE("not 8 animation nodes", static_cast(8), + aAnimVector.size()); + + uno::Reference xNode(aAnimVector[7], uno::UNO_QUERY_THROW); + uno::Reference xTargetShape(xNode->getTarget(), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("inner node not referencing svg shape", xTargetShape != xSvgShape); +} + +// Unit test for importing charts +CPPUNIT_TEST_FIXTURE(SdImportTest, testFdo71075) +{ + double values[] = { 12.0, 13.0, 14.0 }; + css::uno::Any aAny; + + createSdImpressDoc("fdo71075.odp"); + + uno::Reference xPropSet(getShapeFromPage(0, 0)); + aAny = xPropSet->getPropertyValue("Model"); + CPPUNIT_ASSERT_MESSAGE("The shape doesn't have the property", aAny.hasValue()); + + uno::Reference xChartDoc; + aAny >>= xChartDoc; + CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChartDoc.is()); + uno::Reference xChart2Doc(xChartDoc, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChart2Doc.is()); + + uno::Reference xBCooSysCnt(xChart2Doc->getFirstDiagram(), + uno::UNO_QUERY); + uno::Sequence> aCooSysSeq( + xBCooSysCnt->getCoordinateSystems()); + uno::Reference xCTCnt(aCooSysSeq[0], uno::UNO_QUERY); + + uno::Reference xDSCnt(xCTCnt->getChartTypes()[0], uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("failed to load data series", xDSCnt.is()); + uno::Sequence> aSeriesSeq(xDSCnt->getDataSeries()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Series count", static_cast(1), + aSeriesSeq.getLength()); + uno::Reference xSource(aSeriesSeq[0], uno::UNO_QUERY); + uno::Sequence> aSeqCnt( + xSource->getDataSequences()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Series count", static_cast(1), + aSeqCnt.getLength()); + uno::Reference xValueSeq(aSeqCnt[0]->getValues()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Data count", + static_cast(SAL_N_ELEMENTS(values)), + xValueSeq->getData().getLength()); + uno::Reference xNumSeq(xValueSeq, uno::UNO_QUERY); + uno::Sequence aValues(xNumSeq->getNumericalData()); + for (sal_Int32 i = 0; i < xValueSeq->getData().getLength(); i++) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Series count", values[i], aValues.getConstArray()[i]); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testStrictOOXML) +{ + createSdImpressDoc("strict_ooxml.pptx"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT_MESSAGE("no document", pDoc != nullptr); + getShapeFromPage(0, 0); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc870237) +{ + createSdImpressDoc("pptx/bnc870237.pptx"); + const SdrPage* pPage = GetPage(1); + + // Simulate a:ext inside dsp:txXfrm with changing the lower distance + const SdrObjGroup* pGroupObj = dynamic_cast(pPage->GetObj(0)); + const SdrObject* pObj = pGroupObj->GetSubList()->GetObj(1); + CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-158), pObj->GetMergedItem(SDRATTR_TEXT_UPPERDIST).GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(9760), pObj->GetMergedItem(SDRATTR_TEXT_LOWERDIST).GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-158), pObj->GetMergedItem(SDRATTR_TEXT_RIGHTDIST).GetValue()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-158), pObj->GetMergedItem(SDRATTR_TEXT_LEFTDIST).GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testCreationDate) +{ + createSdImpressDoc("fdo71434.pptx"); + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xDocumentProperties + = xDocumentPropertiesSupplier->getDocumentProperties(); + util::DateTime aDate = xDocumentProperties->getCreationDate(); + OUStringBuffer aBuffer; + sax::Converter::convertDateTime(aBuffer, aDate, nullptr); + // Metadata wasn't imported, this was 0000-00-00. + CPPUNIT_ASSERT_EQUAL(OUString("2013-11-09T10:37:56"), aBuffer.makeStringAndClear()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testMultiColTexts) +{ + createSdImpressDoc("pptx/multicol.pptx"); + const SdrPage* pPage = GetPage(1); + + auto pTextObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTextObj); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pTextObj->GetTextColumnsSpacing()); + + auto pMasterTextObj = DynCastSdrTextObj(pPage->TRG_GetMasterPage().GetObj(0)); + CPPUNIT_ASSERT(pMasterTextObj); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pMasterTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pMasterTextObj->GetTextColumnsSpacing()); + + uno::Reference xText(pMasterTextObj->getUnoShape(), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("mastershape1\nmastershape2"), xText->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testPredefinedTableStyle) +{ + // 073A0DAA-6AF3-43AB-8588-CEC1D06C72B9 (Medium Style 2) + createSdImpressDoc("pptx/predefined-table-style.pptx"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell; + Color nColor; + + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor); + + xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xcccccc), nColor); + + xCell.set(xTable->getCellByPosition(0, 2), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xe7e7e7), nColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc887225) +{ + createSdImpressDoc("pptx/bnc887225.pptx"); + // In the document, lastRow and lastCol table properties are used. + // Make sure styles are set properly for individual cells. + + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(2)); + CPPUNIT_ASSERT(pTableObj); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell; + Color nColor; + + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor); + + xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor); + + xCell.set(xTable->getCellByPosition(1, 1), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xd1deef), nColor); + + xCell.set(xTable->getCellByPosition(1, 2), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xe9eff7), nColor); + + xCell.set(xTable->getCellByPosition(1, 4), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor); + + xCell.set(xTable->getCellByPosition(3, 2), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor); + + xCell.set(xTable->getCellByPosition(3, 4), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc584721_1) +{ + // Title text shape on the master page contained wrong text. + + createSdImpressDoc("pptx/bnc584721_1_2.pptx"); + + const SdrPage* pPage = &(GetPage(1)->TRG_GetMasterPage()); + SdrObject* pObj = pPage->GetObj(0); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + CPPUNIT_ASSERT_EQUAL(OUString("Click to edit Master title style"), aEdit.GetText(0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc584721_2) +{ + // Import created an extra/unneeded outliner shape on the master slide next to the imported title shape. + + createSdImpressDoc("pptx/bnc584721_1_2.pptx"); + + const SdrPage* pPage = &(GetPage(1)->TRG_GetMasterPage()); + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc591147) +{ + createSdImpressDoc("pptx/bnc591147.pptx"); + + // In the document, there are two slides with media files. + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xDoc->getDrawPages()->getCount()); + + // First page has video file inserted + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPage->getCount()); + + //uno::Reference< drawing::XShape > xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW ); + uno::Reference xPropSet(getShape(0, xPage)); + OUString sVideoURL("emptyURL"); + bool bSuccess = xPropSet->getPropertyValue("MediaURL") >>= sVideoURL; + CPPUNIT_ASSERT_MESSAGE("MediaURL property is not set", bSuccess); + CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sVideoURL.isEmpty()); + + // Second page has audio file inserted + xPage.set(xDoc->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPage->getCount()); + + xPropSet.set(getShape(0, xPage)); + OUString sAudioURL("emptyURL"); + bSuccess = xPropSet->getPropertyValue("MediaURL") >>= sAudioURL; + CPPUNIT_ASSERT_MESSAGE("MediaURL property is not set", bSuccess); + CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sAudioURL.isEmpty()); + + CPPUNIT_ASSERT_MESSAGE("sAudioURL and sVideoURL should not be equal", sAudioURL != sVideoURL); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc584721_4) +{ + // Black text was imported as white because of wrong caching mechanism + + createSdImpressDoc("pptx/bnc584721_4.pptx"); + uno::Reference xShape(getShapeFromPage(1, 1)); + + // Get first paragraph of the text + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // Get first run of the paragraph + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + + // Color should be black + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc904423) +{ + // Here the problem was that different fill properties were applied in wrong order on the shape + // Right order: 1) master slide fill style, 2) theme, 3) direct formatting + + createSdImpressDoc("pptx/bnc904423.pptx"); + + const SdrPage* pPage = GetPage(1); + // First shape's background color is defined on master slide + { + SdrObject* const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT(pObj); + + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x00CC99), rColorItem.GetColorValue()); + } + + // Second shape's background color is defined by theme + { + SdrObject* const pObj = pPage->GetObj(1); + CPPUNIT_ASSERT(pObj); + + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x3333CC), rColorItem.GetColorValue()); + } + + // Third shape's background color is defined by direct formatting + { + SdrObject* const pObj = pPage->GetObj(2); + CPPUNIT_ASSERT(pObj); + + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), rColorItem.GetColorValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testShapeLineStyle) +{ + // Here the problem was that different line properties were applied in wrong order on the shape + // Right order: 1) master slide line style, 2) theme, 3) direct formatting + createSdImpressDoc("pptx/ShapeLineProperties.pptx"); + + const SdrPage* pPage = GetPage(1); + // First shape's line style is defined on master slide + { + SdrObject* const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT(pObj); + + const XLineStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_LINESTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_DASH, rStyleItem.GetValue()); + + const XLineColorItem& rColorItem = pObj->GetMergedItem(XATTR_LINECOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), rColorItem.GetColorValue()); + + const XLineWidthItem& rWidthItem = pObj->GetMergedItem(XATTR_LINEWIDTH); + CPPUNIT_ASSERT_EQUAL(sal_Int32(132), rWidthItem.GetValue()); + } + + // Second shape's line style is defined by theme + { + SdrObject* const pObj = pPage->GetObj(1); + CPPUNIT_ASSERT(pObj); + + const XLineStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_LINESTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue()); + + const XLineColorItem& rColorItem = pObj->GetMergedItem(XATTR_LINECOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x3333CC), rColorItem.GetColorValue()); + + const XLineWidthItem& rWidthItem = pObj->GetMergedItem(XATTR_LINEWIDTH); + CPPUNIT_ASSERT_EQUAL(sal_Int32(35), rWidthItem.GetValue()); + } + + // Third shape's line style is defined by direct formatting + { + SdrObject* const pObj = pPage->GetObj(2); + CPPUNIT_ASSERT(pObj); + + const XLineStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_LINESTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue()); + + const XLineColorItem& rColorItem = pObj->GetMergedItem(XATTR_LINECOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x7030A0), rColorItem.GetColorValue()); + + const XLineWidthItem& rWidthItem = pObj->GetMergedItem(XATTR_LINEWIDTH); + CPPUNIT_ASSERT_EQUAL(sal_Int32(176), rWidthItem.GetValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTableBorderLineStyle) +{ + createSdImpressDoc("pptx/tableBorderLineStyle.pptx"); + + // TODO: If you are working on improvement of table border line style + // support, then expect this unit test to fail. + + const sal_Int16 nObjBorderLineStyles[] + = { ::table::BorderLineStyle::DASHED, ::table::BorderLineStyle::DASH_DOT_DOT, + ::table::BorderLineStyle::DASH_DOT, ::table::BorderLineStyle::DOTTED, + ::table::BorderLineStyle::DASHED, ::table::BorderLineStyle::DOTTED, + ::table::BorderLineStyle::DASHED, ::table::BorderLineStyle::DASH_DOT, + ::table::BorderLineStyle::DASH_DOT, ::table::BorderLineStyle::SOLID, + ::table::BorderLineStyle::NONE }; + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_EQUAL(SAL_N_ELEMENTS(nObjBorderLineStyles), pPage->GetObjCount()); + + sdr::table::SdrTableObj* pTableObj; + uno::Reference xTable; + uno::Reference xCell; + table::BorderLine2 aBorderLine; + + for (size_t i = 0; i < SAL_N_ELEMENTS(nObjBorderLineStyles); i++) + { + pTableObj = dynamic_cast(pPage->GetObj(i)); + CPPUNIT_ASSERT(pTableObj); + xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW); + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("TopBorder") >>= aBorderLine; + if (aBorderLine.LineWidth > 0) + { + CPPUNIT_ASSERT_EQUAL(nObjBorderLineStyles[i], aBorderLine.LineStyle); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc862510_6) +{ + // Black text was imported instead of gray + + createSdImpressDoc("pptx/bnc862510_6.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph of the text + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // Get first run of the paragraph + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + + // Color should be gray + CPPUNIT_ASSERT_EQUAL(Color(0x8B8B8B), nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc862510_7) +{ + // Title shape's text was aligned to left instead of center. + + createSdImpressDoc("pptx/bnc862510_7.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + sal_Int16 nParaAdjust = 0; + xPropSet->getPropertyValue("ParaAdjust") >>= nParaAdjust; + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, + static_cast(nParaAdjust)); +} + +#if ENABLE_PDFIMPORT +// These tests use the old PDF-importing logic, which imports PDF elements as +// SD elements. This suffered many issues, and therefore wasn't ideal. +// The old PDF importer relied on an open-source project (xpdf) with an +// incompatible license (gpl), which has to be interfaced via an out-of-process +// library wrapper process. The resulting imported document was inaccurate +// and often very slow and with large memory footprint. +// Instead, PDFium offers state-of-the-art PDF importing logic, +// which is well-maintained and renders PDFs into images with high accuracy. +// So, the idea is to import PDFs as images using PDFium, which has a very +// high quality (and is much faster) than importing individual editable elements. +// So that's the "new" way of importing. +// The user then breaks the image to editable elements (which is not perfect, +// but very close to the old way), only if they need editing ability. +// PDFium should overall be better, and where it isn't, we just need to improve it. +// So these tests aren't really useful anymore. They should be modified to do +// import+break and then check the results. But that isn't straight-forward and +// currently await volunteering time to implement. + +CPPUNIT_TEST_FIXTURE(SdImportTest, testPDFImportShared) +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + comphelper::LibreOfficeKit::setActive(); + + createSdDrawDoc("pdf/multipage.pdf"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + // This test is to verify that we share the PDF stream linked to each + // Graphic instance in the imported document. + // Since we import PDFs as images, we support attaching the original + // PDF with each image to allow for advanced editing. + // Here we iterate over all Graphic instances embedded in the pages + // and verify that they all point to the same object in memory. + std::vector aGraphics; + + for (int nPageIndex = 0; nPageIndex < pDoc->GetPageCount(); ++nPageIndex) + { + const SdrPage* pPage = GetPage(nPageIndex); + if (pPage == nullptr) + break; + + for (size_t nObjIndex = 0; nObjIndex < pPage->GetObjCount(); ++nObjIndex) + { + SdrObject* pObject = pPage->GetObj(nObjIndex); + if (pObject == nullptr) + continue; + + SdrGrafObj* pSdrGrafObj = dynamic_cast(pObject); + if (pSdrGrafObj == nullptr) + continue; + + const GraphicObject& rGraphicObject = pSdrGrafObj->GetGraphicObject().GetGraphic(); + const Graphic& rGraphic = rGraphicObject.GetGraphic(); + CPPUNIT_ASSERT_MESSAGE( + "After loading, the PDF shouldn't have the primitive sequence created yet", + !rGraphic.getVectorGraphicData()->isPrimitiveSequenceCreated()); + aGraphics.push_back(rGraphic); + } + } + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Expected more than one page.", size_t(9), aGraphics.size()); + + Graphic const& rFirstGraphic = aGraphics[0]; + + for (size_t i = 0; i < aGraphics.size(); ++i) + { + Graphic const& rGraphic = aGraphics[i]; + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Expected all PDF streams to be identical.", + rFirstGraphic.getVectorGraphicData()->getBinaryDataContainer().getData(), + rGraphic.getVectorGraphicData()->getBinaryDataContainer().getData()); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Expected all GfxLinks to be identical.", + rFirstGraphic.GetSharedGfxLink().get(), + rGraphic.GetSharedGfxLink().get()); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Page number doesn't match expected", sal_Int32(i), + rGraphic.getPageNumber()); + } + + mxComponent->dispose(); + mxComponent.clear(); + + comphelper::LibreOfficeKit::setActive(false); +} + +#if defined(IMPORT_PDF_ELEMENTS) + +CPPUNIT_TEST_FIXTURE(SdImportTest, testPDFImport) +{ + createSdDrawDoc("pdf/txtpic.pdf"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("no exactly two shapes", static_cast(2), + xPage->getCount()); + + uno::Reference xShape(getShape(0, xPage)); + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("not a text shape", xText.is()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testPDFImportSkipImages) +{ + auto pParams = std::make_shared(SfxGetpApp()->GetPool()); + pParams->Put(SfxStringItem(SID_FILE_FILTEROPTIONS, "SkipImages")); + + createSdDrawDoc("pdf/txtpic.pdf"), PDF, pParams); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("no exactly one shape", static_cast(1), + xPage->getCount()); + + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("not a text shape", xText.is()); +} + +#endif +#endif + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBulletSuffix) +{ + createSdImpressDoc("pptx/n83889.pptx"); + + // check suffix of the char bullet + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(1).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's suffix is wrong!", + pNumFmt->GetNumRule().GetLevel(0).GetSuffix(), OUString()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testBnc910045) +{ + // Problem with table style which defines cell color with fill style + + createSdImpressDoc("pptx/bnc910045.pptx"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell; + Color nColor; + + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("FillColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0x4f81bd), nColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testRowHeight) +{ + createSdImpressDoc("pptx/n80340.pptx"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + sal_Int32 nHeight; + uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); + uno::Reference xRows(xTable->getRows(), uno::UNO_SET_THROW); + uno::Reference xRefRow(xRows->getByIndex(0), uno::UNO_QUERY_THROW); + xRefRow->getPropertyValue("Height") >>= nHeight; + CPPUNIT_ASSERT_EQUAL(sal_Int32(508), nHeight); + + createSdImpressDoc("pptx/tablescale.pptx"); + const SdrPage* pPage2 = GetPage(1); + + sdr::table::SdrTableObj* pTableObj2 = dynamic_cast(pPage2->GetObj(0)); + CPPUNIT_ASSERT(pTableObj2); + + uno::Reference xTable2(pTableObj2->getTable(), uno::UNO_SET_THROW); + uno::Reference xRows2(xTable2->getRows(), uno::UNO_SET_THROW); + + for (sal_Int32 nRow = 0; nRow < 7; ++nRow) + { + uno::Reference xRefRow2(xRows2->getByIndex(nRow), + uno::UNO_QUERY_THROW); + xRefRow2->getPropertyValue("Height") >>= nHeight; + CPPUNIT_ASSERT_EQUAL(sal_Int32(800), nHeight); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf93830) +{ + // Text shape offset was ignored + + createSdImpressDoc("pptx/tdf93830.pptx"); + uno::Reference xPage(getPage(0)); + + // Get the first text box from group shape + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xPropSet(xShape->getByIndex(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("no textbox shape", xPropSet.is()); + + sal_Int32 nTextLeftDistance = 0; + xPropSet->getPropertyValue("TextLeftDistance") >>= nTextLeftDistance; + CPPUNIT_ASSERT_EQUAL(sal_Int32(4024), nTextLeftDistance); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf127129) +{ + createSdImpressDoc("pptx/tdf127129.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, nCharColor); + + // Without the accompanying fix in place, the highlight would be -1 + Color nCharBackColor; + xPropSet->getPropertyValue("CharBackColor") >>= nCharBackColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF00), nCharBackColor); +} +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf93097) +{ + // Throwing metadata import aborted the filter, check that metadata is now imported. + + createSdImpressDoc("pptx/tdf93097.pptx"); + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xDocumentProperties + = xDocumentPropertiesSupplier->getDocumentProperties(); + CPPUNIT_ASSERT_EQUAL(OUString("ss"), xDocumentProperties->getTitle()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf62255) +{ + createSdImpressDoc("pptx/tdf62255.pptx"); + const SdrPage* pPage = GetPage(1); + + sdr::table::SdrTableObj* pTableObj; + pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + + css::uno::Any aAny; + uno::Reference xTable; + uno::Reference xCell; + xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW); + xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW); + aAny = xCell->getPropertyValue("FillStyle"); + + if (aAny.hasValue()) + { + drawing::FillStyle aFillStyle; + aAny >>= aFillStyle; + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, aFillStyle); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf89927) +{ + createSdImpressDoc("pptx/tdf89927.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf103800) +{ + createSdImpressDoc("pptx/tdf103800.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(Color(0xC00000), nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf151767) +{ + createSdImpressDoc("pptx/tdf151767.pptx"); + + const SdrPage* pPage = GetPage(1); + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + uno::Reference xCell(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + + table::BorderLine2 aLeft; + xCell->getPropertyValue("LeftBorder") >>= aLeft; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The left border is missing!", true, aLeft.LineWidth > 0); + + table::BorderLine2 aRight; + xCell->getPropertyValue("RightBorder") >>= aRight; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The right border is missing!", true, aRight.LineWidth > 0); + + table::BorderLine2 aTop; + xCell->getPropertyValue("TopBorder") >>= aTop; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The top border is missing!", true, aTop.LineWidth > 0); + + table::BorderLine2 aBottom; + xCell->getPropertyValue("BottomBorder") >>= aBottom; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The bottom border is missing!", true, aBottom.LineWidth > 0); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest, testTdf152070) +{ + createSdImpressDoc("pptx/tdf152070.pptx"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xPropSet(xPage, uno::UNO_QUERY_THROW); + uno::Reference xBackgroundProps( + xPropSet->getPropertyValue("Background").get>()); + + CPPUNIT_ASSERT_EQUAL( + sal_Int32(50), // 50% + xBackgroundProps->getPropertyValue("FillBitmapPositionOffsetX").get()); + CPPUNIT_ASSERT_EQUAL( + sal_Int32(83), // 83% + xBackgroundProps->getPropertyValue("FillBitmapPositionOffsetY").get()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx new file mode 100644 index 0000000000..ac730a24d6 --- /dev/null +++ b/sd/qa/unit/import-tests2.cxx @@ -0,0 +1,1987 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "sdmodeltestbase.hxx" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +class SdImportTest2 : public SdModelTestBase +{ +public: + SdImportTest2() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + +protected: + bool checkPattern(int nShapeNumber, std::vector& rExpected); +}; + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf152186) +{ + createSdImpressDoc("pptx/tdf152186.pptx"); + saveAndReload("Impress MS PowerPoint 2007 XML"); + + bool bHasShadow = bool(); + const SdrPage* pPage = GetPage(1); + for (size_t i = 0; i < pPage->GetObjCount(); ++i) + { + uno::Reference xShape(getShapeFromPage(i, 0)); + CPPUNIT_ASSERT(xShape->getPropertyValue("Shadow") >>= bHasShadow); + CPPUNIT_ASSERT(!bHasShadow); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf93868) +{ + createSdImpressDoc("pptx/tdf93868.pptx"); + + const SdrPage* pPage = &(GetPage(1)->TRG_GetMasterPage()); + CPPUNIT_ASSERT_EQUAL(size_t(5), pPage->GetObjCount()); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, + pPage->GetObj(0)->GetMergedItem(XATTR_FILLSTYLE).GetValue()); + + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, + pPage->GetObj(1)->GetMergedItem(XATTR_FILLSTYLE).GetValue()); + CPPUNIT_ASSERT_EQUAL(true, + pPage->GetObj(1)->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND).GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf95932) +{ + createSdImpressDoc("pptx/tdf95932.pptx"); + + const SdrPage* pPage = GetPage(1); + SdrObject* const pObj = pPage->GetObj(1); + CPPUNIT_ASSERT(pObj); + + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x76bf3d), rColorItem.GetColorValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf99030) +{ + createSdImpressDoc("pptx/tdf99030.pptx"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getMasterPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + uno::Reference xPropSet(xPage, uno::UNO_QUERY); + + Color nFillColor; + uno::Any aAny = xPropSet->getPropertyValue("Background"); + if (aAny.hasValue()) + { + uno::Reference xBackgroundPropSet; + aAny >>= xBackgroundPropSet; + xBackgroundPropSet->getPropertyValue("FillColor") >>= nFillColor; + } + CPPUNIT_ASSERT_EQUAL(Color(0x676A55), nFillColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf49561) +{ + createSdImpressDoc("ppt/tdf49561.ppt"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getMasterPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xPage->getCount()); + + uno::Reference xShape(getShape(3, xPage)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + float fCharHeight = 0; + CPPUNIT_ASSERT(xPropSet->getPropertyValue("CharHeight") >>= fCharHeight); + CPPUNIT_ASSERT_EQUAL(12.f, fCharHeight); + + OUString aCharFontName; + CPPUNIT_ASSERT(xPropSet->getPropertyValue("CharFontName") >>= aCharFontName); + CPPUNIT_ASSERT_EQUAL(OUString("Stencil"), aCharFontName); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf103473) +{ + createSdImpressDoc("pptx/tdf103473.pptx"); + + const SdrPage* pPage = GetPage(1); + SdrTextObj* const pObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pObj); + ::tools::Rectangle aRect = pObj->GetGeoRect(); + CPPUNIT_ASSERT_EQUAL(tools::Long(3629), aRect.Left()); + CPPUNIT_ASSERT_EQUAL(tools::Long(4431), aRect.Top()); + CPPUNIT_ASSERT_EQUAL(tools::Long(8353), aRect.Right()); + CPPUNIT_ASSERT_EQUAL(tools::Long(9155), aRect.Bottom()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testAoo124143) +{ + createSdDrawDoc("odg/ooo124143-1.odg"); + + uno::Reference const xImage(getShapeFromPage(0, 0)); + uno::Reference const xGPS(xImage, uno::UNO_QUERY); + uno::Reference const xGluePoints(xGPS->getGluePoints(), + uno::UNO_QUERY); + + uno::Sequence const ids(xGluePoints->getIdentifiers()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), ids.getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), ids[0]); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ids[1]); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), ids[2]); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), ids[3]); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), ids[4]); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), ids[5]); + + // interesting ones are custom 4, 5 + drawing::GluePoint2 glue4; + xGluePoints->getByIdentifier(4) >>= glue4; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2470), glue4.Position.X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1810), glue4.Position.Y); + + drawing::GluePoint2 glue5; + xGluePoints->getByIdentifier(5) >>= glue5; + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2975), glue5.Position.X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2165), glue5.Position.Y); + + // now check connectors + uno::Reference const xEllipse(getShapeFromPage(1, 0)); + uno::Reference const xConn1(getShapeFromPage(2, 0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), + xConn1->getPropertyValue("StartGluePointIndex").get()); + CPPUNIT_ASSERT_EQUAL( + xEllipse, + xConn1->getPropertyValue("StartShape").get>()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), + xConn1->getPropertyValue("EndGluePointIndex").get()); + CPPUNIT_ASSERT_EQUAL( + xImage, xConn1->getPropertyValue("EndShape").get>()); + uno::Reference const xConn2(getShapeFromPage(3, 0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), + xConn2->getPropertyValue("StartGluePointIndex").get()); + CPPUNIT_ASSERT_EQUAL( + xEllipse, + xConn2->getPropertyValue("StartShape").get>()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), + xConn2->getPropertyValue("EndGluePointIndex").get()); + CPPUNIT_ASSERT_EQUAL( + xImage, xConn2->getPropertyValue("EndShape").get>()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf103567) +{ + createSdImpressDoc("odp/tdf103567.odp"); + for (int i = 0; i < 4; ++i) + { + uno::Reference const xShape(getShapeFromPage(i, 0)); + uno::Reference const xEventsSupplier(xShape, uno::UNO_QUERY); + uno::Reference const xEvents(xEventsSupplier->getEvents()); + OString const msg("shape " + OString::number(i) + ": "); + + CPPUNIT_ASSERT(xEvents->hasByName("OnClick")); + uno::Sequence props; + xEvents->getByName("OnClick") >>= props; + comphelper::SequenceAsHashMap const map(props); + { + auto iter(map.find("EventType")); + CPPUNIT_ASSERT_MESSAGE(OString(msg + "no EventType").getStr(), iter != map.end()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), OUString("Presentation"), + iter->second.get()); + } + { + auto iter(map.find("ClickAction")); + CPPUNIT_ASSERT_MESSAGE(OString(msg + "no ClickAction").getStr(), iter != map.end()); + if (i % 2 == 0) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), css::presentation::ClickAction_DOCUMENT, + iter->second.get()); + } + else + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), css::presentation::ClickAction_NEXTPAGE, + iter->second.get()); + } + } + if (i % 2 == 0) + { + auto iter(map.find("Bookmark")); + CPPUNIT_ASSERT_MESSAGE(OString(msg + "no Bookmark").getStr(), iter != map.end()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), OUString("http://example.com/"), + iter->second.get()); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf103792) +{ + // Title text shape on the actual slide contained no text neither a placeholder text. + + createSdImpressDoc("pptx/tdf103792.pptx"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr); + SdrObject* pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT_MESSAGE("Not a text object", pTxtObj != nullptr); + + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + CPPUNIT_ASSERT_EQUAL(OUString("Click to add Title"), aEdit.GetText(0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf148685) +{ + createSdImpressDoc("pptx/tdf148685.pptx"); + uno::Reference xShape(getShapeFromPage(1, 0)); + + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + CPPUNIT_ASSERT_EQUAL(OUString("TEXT "), xRun->getString()); + + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharUnderlineColor; + xPropSet->getPropertyValue("CharUnderlineColor") >>= nCharUnderlineColor; + CPPUNIT_ASSERT_EQUAL(Color(0xA1467E), nCharUnderlineColor); + + xRun.set(getRunFromParagraph(1, xParagraph)); + + CPPUNIT_ASSERT_EQUAL(OUString("TE"), xRun->getString()); + + xPropSet.set(xRun, uno::UNO_QUERY_THROW); + + xPropSet->getPropertyValue("CharUnderlineColor") >>= nCharUnderlineColor; + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:255 G:255 B:255 A:255 + // - Actual : Color: R:161 G:70 B:126 A:0 + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharUnderlineColor); + + xRun.set(getRunFromParagraph(2, xParagraph)); + CPPUNIT_ASSERT_EQUAL(OUString("XT"), xRun->getString()); + + xPropSet.set(xRun, uno::UNO_QUERY_THROW); + + xPropSet->getPropertyValue("CharUnderlineColor") >>= nCharUnderlineColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharUnderlineColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf103876) +{ + // Title text shape's placeholder text did not inherit the corresponding text properties + + createSdImpressDoc("pptx/tdf103876.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Check paragraph alignment + sal_Int16 nParaAdjust = 0; + xShape->getPropertyValue("ParaAdjust") >>= nParaAdjust; + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, + static_cast(nParaAdjust)); + + // Check character color + Color nCharColor; + xShape->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf79007) +{ + createSdImpressDoc("pptx/tdf79007.pptx"); + + uno::Reference xShape1(getShapeFromPage(0, 0)); + CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape1.is()); + + // Check we map mso washout to our watermark + drawing::ColorMode aColorMode1; + xShape1->getPropertyValue("GraphicColorMode") >>= aColorMode1; + CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_WATERMARK, aColorMode1); + + sal_Int16 nContrast1; + xShape1->getPropertyValue("AdjustContrast") >>= nContrast1; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nContrast1); + + sal_Int16 nLuminance1; + xShape1->getPropertyValue("AdjustLuminance") >>= nLuminance1; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nLuminance1); + + uno::Reference xShape2(getShapeFromPage(1, 0)); + CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape2.is()); + + // Check we map mso grayscale to our grayscale + drawing::ColorMode aColorMode2; + xShape2->getPropertyValue("GraphicColorMode") >>= aColorMode2; + CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_GREYS, aColorMode2); + + sal_Int16 nContrast2; + xShape2->getPropertyValue("AdjustContrast") >>= nContrast2; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nContrast2); + + sal_Int16 nLuminance2; + xShape2->getPropertyValue("AdjustLuminance") >>= nLuminance2; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nLuminance2); + + uno::Reference xShape3(getShapeFromPage(2, 0)); + CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape3.is()); + + // Check we map mso black/white to our black/white + drawing::ColorMode aColorMode3; + xShape3->getPropertyValue("GraphicColorMode") >>= aColorMode3; + CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_MONO, aColorMode3); + + sal_Int16 nContrast3; + xShape3->getPropertyValue("AdjustContrast") >>= nContrast3; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nContrast3); + + sal_Int16 nLuminance3; + xShape3->getPropertyValue("AdjustLuminance") >>= nLuminance3; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nLuminance3); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf119649) +{ + createSdImpressDoc("pptx/tdf119649.pptx"); + uno::Reference xShape(getShapeFromPage(1, 0)); + + // Get first paragraph of the text + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + CPPUNIT_ASSERT_EQUAL(OUString("default_color("), xRun->getString()); + + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharColor); + + xRun.set(getRunFromParagraph(1, xParagraph)); + + // Without the fix in place, this test would have failed with + // - Expected: colored_text + // - Actual : colored_text) + CPPUNIT_ASSERT_EQUAL(OUString("colored_text"), xRun->getString()); + + xPropSet.set(xRun, uno::UNO_QUERY_THROW); + + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(Color(0xCE181E), nCharColor); + + xRun.set(getRunFromParagraph(2, xParagraph)); + CPPUNIT_ASSERT_EQUAL(OUString(")"), xRun->getString()); + + xPropSet.set(xRun, uno::UNO_QUERY_THROW); + + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf118776) +{ + createSdImpressDoc("pptx/tdf118776.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph of the text + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // Get first run of the paragraph + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + sal_Int16 nTransparency = 0; + xPropSet->getPropertyValue("CharTransparence") >>= nTransparency; + + // Import noFill color as 99% transparency + CPPUNIT_ASSERT_EQUAL(static_cast(99), nTransparency); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf129686) +{ + createSdImpressDoc("pptx/tdf129686.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + + // Get first paragraph of the text + uno::Reference const xParagraph(getParagraphFromShape(0, xShape)); + + // Get first run of the paragraph + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + sal_Int16 nTransparency = 0; + xPropSet->getPropertyValue("CharTransparence") >>= nTransparency; + + // 0 = no transparency, 100 (default) = completely transparent (unless COL_AUTO) + CPPUNIT_ASSERT_EQUAL(static_cast(0), nTransparency); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf104015) +{ + // Shape fill, line and effect properties were not inherited from master slide shape + + createSdImpressDoc("pptx/tdf104015.pptx"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr); + SdrObject* const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr); + // Should have a red fill color + { + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), rColorItem.GetColorValue()); + } + // Should have a blue line + { + const XLineStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_LINESTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue()); + + const XLineColorItem& rColorItem = pObj->GetMergedItem(XATTR_LINECOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x0000FF), rColorItem.GetColorValue()); + } + // Should have some shadow + { + const SdrOnOffItem& rShadowItem = pObj->GetMergedItem(SDRATTR_SHADOW); + CPPUNIT_ASSERT(rShadowItem.GetValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf104201) +{ + // Group shape properties did not overwrite the child shapes' fill + + createSdImpressDoc("pptx/tdf104201.pptx"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr); + + // First shape has red fill, but this should be overwritten by green group fill + { + SdrObject* const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr); + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), rColorItem.GetColorValue()); + } + // Second shape has blue fill, but this should be overwritten by green group fill + { + SdrObject* const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr); + const XFillStyleItem& rStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = pObj->GetMergedItem(XATTR_FILLCOLOR); + CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), rColorItem.GetColorValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf103477) +{ + createSdImpressDoc("pptx/tdf103477.pptx"); + + const SdrPage* pPage = GetPage(1); + + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(6)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's color is wrong!", Color(0x000000), + pNumFmt->GetNumRule().GetLevel(1).GetBulletColor()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf105150) +{ + createSdImpressDoc("pptx/tdf105150.pptx"); + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(1); + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + // This was drawing::FillStyle_NONE, was ignored when + // the slide didn't have an explicit background fill. + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf123684) +{ + createSdImpressDoc("pptx/tdf123684.pptx"); + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + // Without the accompanying fix in place, this test would have failed with 'Expected: 0; Actual: + // 1', i.e. the shape's fill was FillStyle_SOLID, making the text of the shape unreadable. + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf105150PPT) +{ + createSdImpressDoc("ppt/tdf105150.ppt"); + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(1); + // This was drawing::FillStyle_NONE, the shape's mso_fillBackground was + // ignored when the slide didn't have an explicit background fill. + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf104445) +{ + // Extra bullets were added to the first shape + + createSdImpressDoc("pptx/tdf104445.pptx"); + + // First shape should not have bullet + { + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is()); + uno::Reference xPropSet(xText, uno::UNO_QUERY_THROW); + + uno::Reference xNumRule; + xPropSet->getPropertyValue("NumberingRules") >>= xNumRule; + uno::Sequence aBulletProps; + xNumRule->getByIndex(0) >>= aBulletProps; + + for (beans::PropertyValue const& rProp : std::as_const(aBulletProps)) + { + if (rProp.Name == "NumberingType") + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::NumberingType::NUMBER_NONE), + rProp.Value.get()); + if (rProp.Name == "LeftMargin") + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), rProp.Value.get()); + } + } + // Second shape should have bullet set + { + uno::Reference xShape(getShapeFromPage(1, 0)); + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is()); + uno::Reference xPropSet(xText, uno::UNO_QUERY_THROW); + + uno::Reference xNumRule; + xPropSet->getPropertyValue("NumberingRules") >>= xNumRule; + uno::Sequence aBulletProps; + xNumRule->getByIndex(0) >>= aBulletProps; + + for (beans::PropertyValue const& rProp : std::as_const(aBulletProps)) + { + if (rProp.Name == "NumberingType") + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::NumberingType::CHAR_SPECIAL), + rProp.Value.get()); + if (rProp.Name == "LeftMargin") + CPPUNIT_ASSERT_EQUAL(sal_Int32(635), rProp.Value.get()); + } + } +} + +namespace +{ +bool checkPatternValues(std::vector& rExpected, Bitmap& rBitmap) +{ + bool bResult = true; + + const Color aFGColor(0xFF0000); + const Color aBGColor(0xFFFFFF); + + BitmapScopedReadAccess pAccess(rBitmap); + for (tools::Long y = 0; y < pAccess->Height(); ++y) + { + Scanline pScanline = pAccess->GetScanline(y); + for (tools::Long x = 0; x < pAccess->Width(); ++x) + { + Color aColor = pAccess->GetPixelFromData(pScanline, x); + sal_uInt8 aValue = rExpected[y * 8 + x]; + + if (aValue == 1 && aColor != aFGColor) + bResult = false; + else if (aValue == 0 && aColor != aBGColor) + bResult = false; + } + } + + return bResult; +} + +} // end anonymous namespace + +bool SdImportTest2::checkPattern(int nShapeNumber, std::vector& rExpected) +{ + uno::Reference xShape(getShapeFromPage(nShapeNumber, 0)); + CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape.is()); + + Bitmap aBitmap; + if (xShape.is()) + { + uno::Any aBitmapAny = xShape->getPropertyValue("FillBitmap"); + uno::Reference xBitmap; + if (aBitmapAny >>= xBitmap) + { + uno::Sequence aBitmapSequence(xBitmap->getDIB()); + SvMemoryStream aBitmapStream(aBitmapSequence.getArray(), aBitmapSequence.getLength(), + StreamMode::READ); + ReadDIB(aBitmap, aBitmapStream, true); + } + } + CPPUNIT_ASSERT_EQUAL(tools::Long(8), aBitmap.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(8), aBitmap.GetSizePixel().Height()); + return checkPatternValues(rExpected, aBitmap); +} + +/* Test checks that importing a PPT file with all supported fill patterns is + * correctly imported as a tiled fill bitmap with the expected pattern. + */ +CPPUNIT_TEST_FIXTURE(SdImportTest2, testPatternImport) +{ + createSdImpressDoc("ppt/FillPatterns.ppt"); + + std::vector aExpectedPattern1 = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + std::vector aExpectedPattern2 = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + std::vector aExpectedPattern3 = { + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + std::vector aExpectedPattern4 = { + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + }; + std::vector aExpectedPattern5 = { + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, + }; + std::vector aExpectedPattern6 = { + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, + }; + std::vector aExpectedPattern7 = { + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, + }; + std::vector aExpectedPattern8 = { + 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, + 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, + }; + std::vector aExpectedPattern9 = { + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, + }; + std::vector aExpectedPattern10 = { + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + }; + std::vector aExpectedPattern11 = { + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + }; + std::vector aExpectedPattern12 = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + }; + std::vector aExpectedPatternLine1 = { + 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, + }; + std::vector aExpectedPatternLine2 = { + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + }; + std::vector aExpectedPatternLine3 = { + 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, + }; + std::vector aExpectedPatternLine4 = { + 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, + }; + std::vector aExpectedPatternLine5 = { + 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + }; + std::vector aExpectedPatternLine6 = { + 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, + }; + std::vector aExpectedPatternLine7 = { + 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + }; + std::vector aExpectedPatternLine8 = { + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + std::vector aExpectedPatternLine9 = { + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + }; + std::vector aExpectedPatternLine10 = { + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + }; + std::vector aExpectedPatternLine11 = { + 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, + }; + std::vector aExpectedPatternLine12 = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + CPPUNIT_ASSERT_MESSAGE("Pattern1 - 5%", checkPattern(0, aExpectedPattern1)); + CPPUNIT_ASSERT_MESSAGE("Pattern2 - 10%", checkPattern(1, aExpectedPattern2)); + CPPUNIT_ASSERT_MESSAGE("Pattern3 - 20%", checkPattern(2, aExpectedPattern3)); + CPPUNIT_ASSERT_MESSAGE("Pattern4 - 25%", checkPattern(3, aExpectedPattern4)); + CPPUNIT_ASSERT_MESSAGE("Pattern5 - 30%", checkPattern(4, aExpectedPattern5)); + CPPUNIT_ASSERT_MESSAGE("Pattern6 - 40%", checkPattern(5, aExpectedPattern6)); + CPPUNIT_ASSERT_MESSAGE("Pattern7 - 50%", checkPattern(6, aExpectedPattern7)); + CPPUNIT_ASSERT_MESSAGE("Pattern8 - 60%", checkPattern(7, aExpectedPattern8)); + CPPUNIT_ASSERT_MESSAGE("Pattern9 - 70%", checkPattern(8, aExpectedPattern9)); + CPPUNIT_ASSERT_MESSAGE("Pattern10 - 75%", checkPattern(9, aExpectedPattern10)); + CPPUNIT_ASSERT_MESSAGE("Pattern11 - 80%", checkPattern(10, aExpectedPattern11)); + CPPUNIT_ASSERT_MESSAGE("Pattern12 - 90%", checkPattern(11, aExpectedPattern12)); + + CPPUNIT_ASSERT_MESSAGE("Pattern13 - Light downward diagonal", + checkPattern(12, aExpectedPatternLine1)); + CPPUNIT_ASSERT_MESSAGE("Pattern14 - Light upward diagonal", + checkPattern(13, aExpectedPatternLine2)); + CPPUNIT_ASSERT_MESSAGE("Pattern15 - Dark downward diagonal", + checkPattern(14, aExpectedPatternLine3)); + CPPUNIT_ASSERT_MESSAGE("Pattern16 - Dark upward diagonal", + checkPattern(15, aExpectedPatternLine4)); + CPPUNIT_ASSERT_MESSAGE("Pattern17 - Wide downward diagonal", + checkPattern(16, aExpectedPatternLine5)); + CPPUNIT_ASSERT_MESSAGE("Pattern18 - Wide upward diagonal", + checkPattern(17, aExpectedPatternLine6)); + + CPPUNIT_ASSERT_MESSAGE("Pattern19 - Light vertical", checkPattern(18, aExpectedPatternLine7)); + CPPUNIT_ASSERT_MESSAGE("Pattern20 - Light horizontal", checkPattern(19, aExpectedPatternLine8)); + CPPUNIT_ASSERT_MESSAGE("Pattern21 - Narrow vertical", checkPattern(20, aExpectedPatternLine9)); + CPPUNIT_ASSERT_MESSAGE("Pattern22 - Narrow horizontal", + checkPattern(21, aExpectedPatternLine10)); + CPPUNIT_ASSERT_MESSAGE("Pattern23 - Dark vertical", checkPattern(22, aExpectedPatternLine11)); + CPPUNIT_ASSERT_MESSAGE("Pattern24 - Dark horizontal", checkPattern(23, aExpectedPatternLine12)); + + // TODO: other patterns in the test document +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf100926) +{ + createSdImpressDoc("pptx/tdf100926.pptx"); + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT(pPage != nullptr); + + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj != nullptr); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW); + + sal_Int32 nRotation = 0; + uno::Reference xCell(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + xCell->getPropertyValue("RotateAngle") >>= nRotation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), nRotation); + + xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("RotateAngle") >>= nRotation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(9000), nRotation); + + xCell.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW); + xCell->getPropertyValue("RotateAngle") >>= nRotation; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRotation); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf89064) +{ + createSdImpressDoc("pptx/tdf89064.pptx"); + uno::Reference xPage(getPage(0), uno::UNO_QUERY_THROW); + uno::Reference xNotesPage(xPage->getNotesPage(), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xNotesPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf108925) +{ + // Test document contains bulleting with too small bullet size (1%) which breaks the lower constraint + // So it should be converted to the lowest allowed value (25%). + + createSdImpressDoc("odp/tdf108925.odp"); + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(25), pNumFmt->GetNumRule().GetLevel(0).GetBulletRelSize()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf109067) +{ + createSdImpressDoc("pptx/tdf109067.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + awt::Gradient gradient; + CPPUNIT_ASSERT(xShape->getPropertyValue("FillGradient") >>= gradient); + CPPUNIT_ASSERT_EQUAL(sal_Int16(450), gradient.Angle); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf109187) +{ + createSdImpressDoc("pptx/tdf109187.pptx"); + uno::Reference xArrow1(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + awt::Gradient aGradient1; + CPPUNIT_ASSERT(xArrow1->getPropertyValue("FillGradient") >>= aGradient1); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2250), aGradient1.Angle); + uno::Reference xArrow2(getShapeFromPage(1, 0), uno::UNO_SET_THROW); + awt::Gradient aGradient2; + CPPUNIT_ASSERT(xArrow2->getPropertyValue("FillGradient") >>= aGradient2); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1350), aGradient2.Angle); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf108926) +{ + createSdImpressDoc("pptx/tdf108926.ppt"); + uno::Reference xPage(getPage(0), uno::UNO_QUERY_THROW); + uno::Reference xNotesPage(xPage->getNotesPage(), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(static_cast(2), xNotesPage->getCount()); + + // Second object should be imported as an empty presentation shape + uno::Reference xPresentationShape(xNotesPage->getByIndex(1), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xPresentationShape.is()); + bool bIsEmptyPresObject = false; + xPresentationShape->getPropertyValue("IsEmptyPresentationObject") >>= bIsEmptyPresObject; + CPPUNIT_ASSERT(bIsEmptyPresObject); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf100065) +{ + createSdImpressDoc("pptx/tdf100065.pptx"); + + uno::Reference xGroupShape1(getShapeFromPage(0, 0), + uno::UNO_QUERY_THROW); + uno::Reference xShape1(xGroupShape1->getByIndex(1), uno::UNO_QUERY_THROW); + sal_Int32 nAngle1; + CPPUNIT_ASSERT(xShape1->getPropertyValue("RotateAngle") >>= nAngle1); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), nAngle1); + + uno::Reference xGroupShape2(getShapeFromPage(1, 0), + uno::UNO_QUERY_THROW); + uno::Reference xShape2(xGroupShape2->getByIndex(0), uno::UNO_QUERY_THROW); + sal_Int32 nAngle2; + CPPUNIT_ASSERT(xShape2->getPropertyValue("RotateAngle") >>= nAngle2); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18000), nAngle2); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf90626) +{ + createSdImpressDoc("pptx/tdf90626.pptx"); + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1)); + CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + for (int i = 0; i < 4; i++) + { + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(i).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_DOUBLES_EQUAL(tools::Long(372), + pNumFmt->GetNumRule().GetLevel(0).GetGraphicSize().getHeight(), + tools::Long(1)); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf138148) +{ + createSdImpressDoc("pptx/tdf138148.pptx"); + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + for (int i = 0; i < 2; i++) + { + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(i).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_DOUBLES_EQUAL(tools::Long(444), + pNumFmt->GetNumRule().GetLevel(0).GetGraphicSize().getHeight(), + tools::Long(1)); + + // Without the fix in place, this test would have failed with + // - Expected: 148 + // - Actual : 444 + CPPUNIT_ASSERT_DOUBLES_EQUAL(tools::Long(148), + pNumFmt->GetNumRule().GetLevel(0).GetGraphicSize().getWidth(), + tools::Long(1)); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf114488) +{ + // This doc has two images - one WMF and the other PNG (fallback image). + // When loading this doc, the WMF image should be preferred over the PNG image. + + createSdDrawDoc("odg/tdf114488.fodg"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + uno::Reference xGraphic; + xShape->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + OUString sMimeType(comphelper::GraphicMimeTypeHelper::GetMimeTypeForXGraphic(xGraphic)); + CPPUNIT_ASSERT_EQUAL(OUString("image/x-wmf"), sMimeType); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf134174) +{ + createSdImpressDoc("pptx/tdf134174.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(Color(0x8b21db), aBitmap.GetPixelColor(0, 0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf134210) +{ + createSdImpressDoc("pptx/tdf134210.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(Color(0x605741), aBitmap.GetPixelColor(0, 0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf114913) +{ + createSdImpressDoc("pptx/tdf114913.pptx"); + SdrTextObj* pTxtObj = DynCastSdrTextObj(GetPage(1)->GetObj(1)); + CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr); + const SvxNumBulletItem* pItem + = pTxtObj->GetOutlinerParaObject()->GetTextObject().GetParaAttribs(0).GetItem( + EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pItem); + CPPUNIT_ASSERT_EQUAL(tools::Long(692), + pItem->GetNumRule().GetLevel(0).GetGraphicSize().getHeight()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf114821) +{ + css::uno::Any aAny; + + createSdImpressDoc("pptx/tdf114821.pptx"); + + uno::Reference xPropSet(getShapeFromPage(0, 0)); + aAny = xPropSet->getPropertyValue("Model"); + CPPUNIT_ASSERT_MESSAGE("The shape doesn't have the property", aAny.hasValue()); + + uno::Reference xChartDoc; + aAny >>= xChartDoc; + CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChartDoc.is()); + uno::Reference xChart2Doc(xChartDoc, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChart2Doc.is()); + + uno::Reference xBCooSysCnt(xChart2Doc->getFirstDiagram(), + uno::UNO_QUERY); + uno::Sequence> aCooSysSeq( + xBCooSysCnt->getCoordinateSystems()); + uno::Reference xCTCnt(aCooSysSeq[0], uno::UNO_QUERY); + + uno::Reference xDSCnt(xCTCnt->getChartTypes()[0], uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("failed to load data series", xDSCnt.is()); + uno::Sequence> aSeriesSeq(xDSCnt->getDataSeries()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Series count", static_cast(1), + aSeriesSeq.getLength()); + + // These Labels have custom position, so the exported LabelPlacement (reference point) by MSO is OUTSIDE/OUTEND + // Check the first label + const css::uno::Reference& rPropSet0( + aSeriesSeq[0]->getDataPointByIndex(0)); + CPPUNIT_ASSERT(rPropSet0.is()); + sal_Int32 aPlacement; + rPropSet0->getPropertyValue("LabelPlacement") >>= aPlacement; + CPPUNIT_ASSERT_EQUAL(css::chart::DataLabelPlacement::OUTSIDE, aPlacement); + + // Check the second label + const css::uno::Reference& rPropSet1( + aSeriesSeq[0]->getDataPointByIndex(1)); + CPPUNIT_ASSERT(rPropSet1.is()); + rPropSet1->getPropertyValue("LabelPlacement") >>= aPlacement; + CPPUNIT_ASSERT_EQUAL(css::chart::DataLabelPlacement::OUTSIDE, aPlacement); + + // Check the third label + const css::uno::Reference& rPropSet2( + aSeriesSeq[0]->getDataPointByIndex(2)); + CPPUNIT_ASSERT(rPropSet2.is()); + rPropSet2->getPropertyValue("LabelPlacement") >>= aPlacement; + CPPUNIT_ASSERT_EQUAL(css::chart::DataLabelPlacement::OUTSIDE, aPlacement); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf115394) +{ + createSdImpressDoc("pptx/tdf115394.pptx"); + double fTransitionDuration; + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + // Slow in MS formats + SdPage* pPage1 = pDoc->GetSdPage(0, PageKind::Standard); + fTransitionDuration = pPage1->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration); + + // Medium in MS formats + SdPage* pPage2 = pDoc->GetSdPage(1, PageKind::Standard); + fTransitionDuration = pPage2->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration); + + // Fast in MS formats + SdPage* pPage3 = pDoc->GetSdPage(2, PageKind::Standard); + fTransitionDuration = pPage3->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration); + + // Custom values + SdPage* pPage4 = pDoc->GetSdPage(3, PageKind::Standard); + fTransitionDuration = pPage4->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.25, fTransitionDuration); + + SdPage* pPage5 = pDoc->GetSdPage(4, PageKind::Standard); + fTransitionDuration = pPage5->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(4.25, fTransitionDuration); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf115394PPT) +{ + createSdImpressDoc("ppt/tdf115394.ppt"); + double fTransitionDuration; + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + // Fast + SdPage* pPage1 = pDoc->GetSdPage(0, PageKind::Standard); + fTransitionDuration = pPage1->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration); + + // Medium + SdPage* pPage2 = pDoc->GetSdPage(1, PageKind::Standard); + fTransitionDuration = pPage2->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration); + + // Slow + SdPage* pPage3 = pDoc->GetSdPage(2, PageKind::Standard); + fTransitionDuration = pPage3->getTransitionDuration(); + CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf51340) +{ + // Line spacing was not inherited from upper levels (slide layout, master slide) + + createSdImpressDoc("pptx/tdf51340.pptx"); + uno::Reference xShape(getShapeFromPage(1, 0)); + + // First paragraph has a 90% line spacing set on master slide + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + css::style::LineSpacing aSpacing; + xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing; + CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode); + CPPUNIT_ASSERT_EQUAL(static_cast(90), aSpacing.Height); + + // Second paragraph has a 125% line spacing set on slide layout + xParagraph.set(getParagraphFromShape(1, xShape)); + xPropSet.set(xParagraph, uno::UNO_QUERY_THROW); + xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing; + CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode); + CPPUNIT_ASSERT_EQUAL(static_cast(125), aSpacing.Height); + + // Third paragraph has a 70% line spacing set directly on normal slide (master slide property is overridden) + xParagraph.set(getParagraphFromShape(2, xShape)); + xPropSet.set(xParagraph, uno::UNO_QUERY_THROW); + xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing; + CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode); + CPPUNIT_ASSERT_EQUAL(static_cast(70), aSpacing.Height); + + // Fourth paragraph has a 190% line spacing set directly on normal slide (slide layout property is overridden) + xParagraph.set(getParagraphFromShape(3, xShape)); + xPropSet.set(xParagraph, uno::UNO_QUERY_THROW); + xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing; + CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode); + CPPUNIT_ASSERT_EQUAL(static_cast(190), aSpacing.Height); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf116899) +{ + // This is a PPT created in Impress and roundtripped in PP, the key times become [1, -1] in PP, + // a time of -1 (-1000) in PPT means key times have to be distributed evenly between 0 and 1 + + createSdImpressDoc("ppt/tdf116899.ppt"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), + uno::UNO_QUERY_THROW); + uno::Reference xAnimNodeSupplier(xPage, + uno::UNO_QUERY_THROW); + uno::Reference xRootNode(xAnimNodeSupplier->getAnimationNode()); + std::vector> aAnimVector; + anim::create_deep_vector(xRootNode, aAnimVector); + uno::Reference xNode(aAnimVector[8], uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of key times in the animation node isn't 2.", + static_cast(2), xNode->getKeyTimes().getLength()); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "First key time in the animation node isn't 0, key times aren't normalized.", 0., + xNode->getKeyTimes()[0]); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Second key time in the animation node isn't 1, key times aren't normalized.", 1., + xNode->getKeyTimes()[1]); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf77747) +{ + createSdImpressDoc("ppt/tdf77747.ppt"); + SdrTextObj* pTxtObj = DynCastSdrTextObj(GetPage(1)->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr); + const SvxNumBulletItem* pNumFmt + = pTxtObj->GetOutlinerParaObject()->GetTextObject().GetParaAttribs(0).GetItem( + EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's suffix is wrong!", OUString("-"), + pNumFmt->GetNumRule().GetLevel(0).GetSuffix()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's numbering type is wrong!", SVX_NUM_NUMBER_HEBREW, + pNumFmt->GetNumRule().GetLevel(0).GetNumberingType()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf116266) +{ + createSdImpressDoc("odp/tdf116266.odp"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + sfx2::LinkManager* rLinkManager = pDoc->GetLinkManager(); + // The document contains one SVG stored as a link. + CPPUNIT_ASSERT_EQUAL(size_t(1), rLinkManager->GetLinks().size()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testPptCrop) +{ + createSdImpressDoc("ppt/crop.ppt"); + + uno::Reference xPropertySet(getShapeFromPage(/*nShape=*/1, /*nPage=*/0)); + text::GraphicCrop aCrop; + xPropertySet->getPropertyValue("GraphicCrop") >>= aCrop; + // These were all 0, lazy-loading broke cropping. + CPPUNIT_ASSERT_GREATER(static_cast(0), aCrop.Top); + CPPUNIT_ASSERT_GREATER(static_cast(0), aCrop.Bottom); + CPPUNIT_ASSERT_GREATER(static_cast(0), aCrop.Left); + CPPUNIT_ASSERT_GREATER(static_cast(0), aCrop.Right); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf149206) +{ + // Check that the image is cropped + createSdImpressDoc("pptx/tdf149206.pptx"); + + uno::Reference xPropertySet(getShapeFromPage(/*nShape=*/0, /*nPage=*/0)); + text::GraphicCrop aCrop; + xPropertySet->getPropertyValue("GraphicCrop") >>= aCrop; + + CPPUNIT_ASSERT_EQUAL(static_cast(0), aCrop.Top); + + // Without the fix in place, this test would have failed with + // - Expected: 5937 + // - Actual : 0 + CPPUNIT_ASSERT_EQUAL(static_cast(5937), aCrop.Bottom); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aCrop.Left); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aCrop.Right); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf149785) +{ + // Without the fix in place, this test would have failed to load the file + createSdImpressDoc("pptx/tdf149785.pptx"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf149985) +{ + // Without the fix in place, this test would have failed to load the file + createSdImpressDoc("pptx/tdf149985.pptx"); + + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf150770) +{ + // Without the fix in place, this test would have failed to load the file + createSdImpressDoc("pptx/tdf150770.pptx"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xDoc->getDrawPages()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf120028) +{ + // Check that the text shape has 4 columns. + createSdImpressDoc("pptx/tdf120028.pptx"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDoc.is()); + + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + + uno::Reference xShape(getShape(0, xPage)); + uno::Reference xCols(xShape->getPropertyValue("TextColumns"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(static_cast(4), xCols->getColumnCount()); + uno::Reference xColProps(xCols, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(0)), xColProps->getPropertyValue("AutomaticDistance")); + + // Check font size in the shape. + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + double fCharHeight = 0; + xPropSet->getPropertyValue("CharHeight") >>= fCharHeight; + CPPUNIT_ASSERT_DOUBLES_EQUAL(13.5, fCharHeight, 1E-12); + + double fTextSclale = 0.0; + xShape->getPropertyValue("TextFitToSizeScale") >>= fTextSclale; + CPPUNIT_ASSERT_DOUBLES_EQUAL(92.0, fTextSclale, 1E1); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testDescriptionImport) +{ + createSdImpressDoc("pptx/altdescription.pptx"); + + uno::Reference xPropertySet(getShapeFromPage(/*nShape=*/2, /*nPage=*/0)); + OUString sDesc; + + xPropertySet->getPropertyValue("Description") >>= sDesc; + + CPPUNIT_ASSERT_EQUAL(OUString("We Can Do It!"), sDesc); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf83247) +{ + auto GetPause = [this](const OUString& sSrc) { + loadFromFile(sSrc); + uno::Reference xPresentationSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xPresentationProps( + xPresentationSupplier->getPresentation(), uno::UNO_QUERY_THROW); + + auto retVal = xPresentationProps->getPropertyValue("Pause"); + return retVal.get(); + }; + + // 1. Check that presentation:pause attribute is imported correctly + CPPUNIT_ASSERT_EQUAL(sal_Int32(10), GetPause("odp/loopPause10.odp")); + + // 2. ODF compliance: if presentation:pause attribute is absent, it must be treated as 0 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), GetPause("odp/loopNoPause.odp")); + + // 3. Import PPT: pause should be 0 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), GetPause("ppt/loopNoPause.ppt")); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf47365) +{ + createSdImpressDoc("pptx/loopNoPause.pptx"); + uno::Reference xPresentationSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xPresentationProps(xPresentationSupplier->getPresentation(), + uno::UNO_QUERY_THROW); + + const bool bEndlessVal = xPresentationProps->getPropertyValue("IsEndless").get(); + const sal_Int32 nPauseVal = xPresentationProps->getPropertyValue("Pause").get(); + + // Check that we import "loop" attribute of the presentation, and don't introduce any pauses + CPPUNIT_ASSERT(bEndlessVal); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nPauseVal); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf122899) +{ + // tdf122899 FILEOPEN: ppt: old kind arc from MS Office 97 is broken + // Error was, that the path coordinates of a mso_sptArc shape were read as sal_Int16 + // although they are unsigned 16 bit. This leads to wrong positions of start and end + // point and results to a huge shape width in the test document. + createSdImpressDoc("ppt/tdf122899_Arc_90_to_91_clockwise.ppt"); + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get XDrawPagesSupplier", xDrawPagesSupplier.is()); + uno::Reference xDrawPages(xDrawPagesSupplier->getDrawPages()); + uno::Reference xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get xDrawPage", xDrawPage.is()); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get xShape", xShape.is()); + awt::Rectangle aFrameRect; + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get the shape properties", xShapeProps.is()); + xShapeProps->getPropertyValue(UNO_NAME_MISC_OBJ_FRAMERECT) >>= aFrameRect; + // original width is 9cm, add some tolerance + CPPUNIT_ASSERT_LESS(static_cast(9020), aFrameRect.Width); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testOOXTheme) +{ + createSdImpressDoc("pptx/ooxtheme.pptx"); + + uno::Reference xPropSet(mxComponent, uno::UNO_QUERY_THROW); + uno::Sequence aGrabBag; + xPropSet->getPropertyValue("InteropGrabBag") >>= aGrabBag; + + bool bTheme = false; + for (beans::PropertyValue const& prop : std::as_const(aGrabBag)) + { + if (prop.Name == "OOXTheme") + { + bTheme = true; + uno::Reference aThemeDom; + CPPUNIT_ASSERT(prop.Value >>= aThemeDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aThemeDom); // Reference not empty + } + } + CPPUNIT_ASSERT(bTheme); // Grab Bag has all the expected elements +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testCropToShape) +{ + createSdImpressDoc("pptx/crop-to-shape.pptx"); + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get XDrawPagesSupplier", xDrawPagesSupplier.is()); + uno::Reference xDrawPages(xDrawPagesSupplier->getDrawPages()); + uno::Reference xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get xDrawPage", xDrawPage.is()); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString{ "com.sun.star.drawing.CustomShape" }, xShape->getShapeType()); + CPPUNIT_ASSERT_MESSAGE("Could not get xShape", xShape.is()); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + css::drawing::FillStyle fillStyle; + xShapeProps->getPropertyValue("FillStyle") >>= fillStyle; + CPPUNIT_ASSERT_EQUAL(css::drawing::FillStyle_BITMAP, fillStyle); + css::drawing::BitmapMode bitmapmode; + xShapeProps->getPropertyValue("FillBitmapMode") >>= bitmapmode; + CPPUNIT_ASSERT_EQUAL(css::drawing::BitmapMode_STRETCH, bitmapmode); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf127964) +{ + createSdImpressDoc("pptx/tdf127964.pptx"); + { + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); + } + + saveAndReload("impress8"); + + { + const SdrPage* pPage = GetPage(1); + const SdrObject* pObj = pPage->GetObj(0); + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf48083) +{ + createSdImpressDoc("ppt/tdf48083.ppt"); + const SdrPage* pPage = GetPage(1); + CPPUNIT_ASSERT_EQUAL(size_t(2), pPage->GetObjCount()); + const SdrObject* pObj = pPage->GetObj(1); + auto& rFillStyleItem = pObj->GetMergedItem(XATTR_FILLSTYLE); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf106638) +{ + createSdImpressDoc("pptx/tdf106638.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference const xPara(getParagraphFromShape(1, xShape)); + uno::Reference xText = xPara->getText(); + uno::Reference xTextCursor + = xText->createTextCursorByRange(xPara->getStart()); + uno::Reference xPropSet(xTextCursor, uno::UNO_QUERY_THROW); + OUString aCharFontName; + CPPUNIT_ASSERT(xTextCursor->goRight(1, true)); + // First character U+f0fe that uses Wingding + xPropSet->getPropertyValue("CharFontName") >>= aCharFontName; + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), aCharFontName); + + // The rest characters that do not use Wingding. + CPPUNIT_ASSERT(xTextCursor->goRight(45, true)); + xPropSet->getPropertyValue("CharFontName") >>= aCharFontName; + CPPUNIT_ASSERT(aCharFontName != "Wingdings"); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf128684) +{ + createSdImpressDoc("pptx/tdf128684.pptx"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDoc.is()); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPage.is()); + uno::Reference xShapeProperties(getShape(0, xPage)); + CPPUNIT_ASSERT(xShapeProperties.is()); + // Check text direction. + sal_Int16 eWritingMode(text::WritingMode2::LR_TB); + if (xShapeProperties->getPropertySetInfo()->hasPropertyByName("WritingMode")) + xShapeProperties->getPropertyValue("WritingMode") >>= eWritingMode; + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::WritingMode2::TB_RL90), eWritingMode); + // Check shape rotation + sal_Int32 nRotateAngle = 0; + if (xShapeProperties->getPropertySetInfo()->hasPropertyByName("RotateAngle")) + xShapeProperties->getPropertyValue("RotateAngle") >>= nRotateAngle; + CPPUNIT_ASSERT_EQUAL(static_cast(9000), nRotateAngle); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf113198) +{ + createSdImpressDoc("pptx/tdf113198.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + sal_Int16 nParaAdjust = -1; + xShape->getPropertyValue("ParaAdjust") >>= nParaAdjust; + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, + static_cast(nParaAdjust)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf49856) +{ + createSdImpressDoc("ppt/tdf49856.ppt"); + const SdrPage* pPage = GetPage(1); + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1)); + CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr); + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + const sal_UCS4 aBullet = pNumFmt->GetNumRule().GetLevel(0).GetBulletChar(); + CPPUNIT_ASSERT_EQUAL(OUString("More level 2"), aEdit.GetText(2)); + CPPUNIT_ASSERT_EQUAL(sal_UCS4(0x2022), aBullet); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testShapeGlowEffectPPTXImpoer) +{ + createSdImpressDoc("pptx/shape-glow-effect.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + sal_Int32 nRadius = -1; + xShape->getPropertyValue("GlowEffectRadius") >>= nRadius; + CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 139700 EMU = 388.0556 mm/100 + Color nColor; + xShape->getPropertyValue("GlowEffectColor") >>= nColor; + CPPUNIT_ASSERT_EQUAL(Color(0xFFC000), nColor); + sal_Int16 nTransparency; + xShape->getPropertyValue("GlowEffectTransparency") >>= nTransparency; + CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nTransparency); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testShapeBlurPPTXImport) +{ + createSdImpressDoc("pptx/shape-blur-effect.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + bool bHasShadow = false; + xShape->getPropertyValue("Shadow") >>= bHasShadow; + CPPUNIT_ASSERT(bHasShadow); + + sal_Int32 nRadius = -1; + xShape->getPropertyValue("ShadowBlur") >>= nRadius; + CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 584200EMU=46pt - 139700EMU = 388Hmm = 11pt +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testMirroredGraphic) +{ + createSdImpressDoc("pptx/mirrored-graphic.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(Color(0x4f4955), aBitmap.GetPixelColor(0, 0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf134210CropPosition) +{ + // We are testing crop position of bitmap in custom shapes. We should see only green with proper fix. + + createSdImpressDoc("pptx/crop-position.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(Color(0x81d41a), aBitmap.GetPixelColor(0, 0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testGreysScaleGraphic) +{ + createSdImpressDoc("pptx/greysscale-graphic.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(Color(0x3c3c3c), aBitmap.GetPixelColor(0, 0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf103347) +{ + createSdImpressDoc("pptx/tdf103347.pptx"); + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + + uno::Reference xPage1(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xNamed1(xPage1, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xNamed1->getName()); + + uno::Reference xPage2(xDoc->getDrawPages()->getByIndex(1), uno::UNO_QUERY); + uno::Reference xNamed2(xPage2, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello (2)"), xNamed2->getName()); + + uno::Reference xPage3(xDoc->getDrawPages()->getByIndex(2), uno::UNO_QUERY); + uno::Reference xNamed3(xPage3, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello (3)"), xNamed3->getName()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testHyperlinksOnShapes) +{ + createSdImpressDoc("pptx/tdf144616.pptx"); + + for (sal_Int32 i = 0; i < 7; i++) + { + uno::Reference xShape(getShapeFromPage(i, 0)); + uno::Reference xEventsSupplier(xShape, uno::UNO_QUERY); + uno::Reference xEvents(xEventsSupplier->getEvents()); + + uno::Sequence props; + xEvents->getByName("OnClick") >>= props; + comphelper::SequenceAsHashMap map(props); + auto iter(map.find("ClickAction")); + switch (i) + { + case 0: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_FIRSTPAGE, + iter->second.get()); + break; + case 1: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_LASTPAGE, + iter->second.get()); + break; + case 2: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_NEXTPAGE, + iter->second.get()); + break; + case 3: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_PREVPAGE, + iter->second.get()); + break; + case 4: + { + auto iter2(map.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("Second slide"), iter2->second.get()); + } + break; + case 5: + CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_STOPPRESENTATION, + iter->second.get()); + break; + case 6: + { + auto iter1(map.find("Bookmark")); + CPPUNIT_ASSERT_EQUAL(OUString("http://www.example.com/"), + iter1->second.get()); + } + break; + default: + break; + } + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf112209) +{ + createSdImpressDoc("pptx/tdf112209.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Color: R:132 G:132 B:132 A:0 + // - Actual : Color: R:21 G:170 B:236 A:0 + // i.e. the image color was blue instead of grey. + CPPUNIT_ASSERT_EQUAL(Color(0x848484), aBitmap.GetPixelColor(0, 0)); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf128596) +{ + createSdImpressDoc("pptx/tdf128596.pptx"); + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + + css::drawing::BitmapMode bitmapmode; + xShape->getPropertyValue("FillBitmapMode") >>= bitmapmode; + CPPUNIT_ASSERT_EQUAL(css::drawing::BitmapMode_REPEAT, bitmapmode); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testDefaultTabStop) +{ + createSdImpressDoc("pptx/deftabstop.pptx"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + sal_Int32 nDefTab = pDoc->GetDefaultTabulator(); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2540), nDefTab); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testCropToZero) +{ + // Must not crash because of division by zero + // Also must not fail assertions because of passing negative value to CropQuotientsFromSrcRect + createSdImpressDoc("pptx/croppedTo0.pptx"); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf144092TableHeight) +{ + createSdImpressDoc("pptx/tdf144092-tableHeight.pptx"); + + uno::Reference xTableShape(getShapeFromPage(0, 0), uno::UNO_QUERY); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 7606 + // - Actual : 4595 + // i.e. the table height wasn't corrected by expanding less than minimum sized rows. + CPPUNIT_ASSERT_EQUAL(sal_Int32(7606), xTableShape->getSize().Height); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf89928BlackWhiteThreshold) +{ + // A slide with two graphics, one with color HSV{0,0,74%} and one with HSV{0,0,76%} + // where both have an applied 75% Black/White Color Effect. + + createSdImpressDoc("pptx/tdf89928-blackWhiteEffectThreshold.pptx"); + + // First graphic should appear black + { + uno::Reference xShape(getShapeFromPage(0, 0), uno::UNO_SET_THROW); + uno::Reference xGraphic; + xShape->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Color: R:0 G:0 B:0 A:0 + // - Actual : Color: R:189 G:189 B:189 A:0 + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0x000000), aBitmap.GetPixelColor(0, 0)); + } + + // Second graphic should appear white + { + uno::Reference xShape(getShapeFromPage(1, 0), uno::UNO_SET_THROW); + uno::Reference xGraphic; + xShape->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xFFFFFF), aBitmap.GetPixelColor(0, 0)); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf151547TransparentWhiteText) +{ + createSdImpressDoc("pptx/tdf151547-transparent-white-text.pptx"); + + uno::Reference xShape(getShapeFromPage(0, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Color: R:255 G:255 B:254 A:255 + // - Actual : Color: R:255 G:255 B:255 A:255 + // i.e. fully transparent white text color was interpreted as COL_AUTO + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xFFFFFFFE), nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf149961AutofitIndentation) +{ + createSdImpressDoc("pptx/tdf149961-autofitIndentation.pptx"); + + const SdrPage* pPage = GetPage(1); + + { + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(3175), pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-3175), + pNumFmt->GetNumRule().GetLevel(0).GetFirstLineOffset()); + } + + { + SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1)); + CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr); + + const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET); + CPPUNIT_ASSERT(pNumFmt); + + // Spacing doesn't change when it is scaled + CPPUNIT_ASSERT_EQUAL(sal_Int32(3175), pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-3175), + pNumFmt->GetNumRule().GetLevel(0).GetFirstLineOffset()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf149588TransparentSolidFill) +{ + createSdImpressDoc("pptx/tdf149588_transparentSolidFill.pptx"); + saveAndReload("Impress MS PowerPoint 2007 XML"); + + uno::Reference xShape(getShapeFromPage(6, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xRun(getRunFromParagraph(0, xParagraph)); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + Color nCharColor; + xPropSet->getPropertyValue("CharColor") >>= nCharColor; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Color: R:99 G:99 B:99 A 51 (T:204) + // - Actual : Color: R:99 G:99 B:99 A: 255 (T: 0) + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xCC636363), nCharColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testOverflowBehaviorClip) +{ + createSdImpressDoc("odp/style-overflow-behavior-clip.fodp"); + { + uno::Reference xPropSet(getShapeFromPage(0, 0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + CPPUNIT_ASSERT_EQUAL(true, + xPropSet->getPropertyValue("TextClipVerticalOverflow").get()); + } + + saveAndReload("impress8"); + { + uno::Reference xPropSet(getShapeFromPage(0, 0)); + CPPUNIT_ASSERT_EQUAL(true, + xPropSet->getPropertyValue("TextClipVerticalOverflow").get()); + } +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testIndentDuplication) +{ + createSdImpressDoc("pptx/formatting-bullet-indent.pptx"); + uno::Reference xShape(getShapeFromPage(2, 0)); + + uno::Reference const xParagraph1(getParagraphFromShape(0, xShape), + uno::UNO_QUERY_THROW); + sal_Int32 nIndent1; + xParagraph1->getPropertyValue("ParaFirstLineIndent") >>= nIndent1; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2500), nIndent1); + + uno::Reference const xParagraph2(getParagraphFromShape(1, xShape), + uno::UNO_QUERY_THROW); + sal_Int32 nIndent2; + xParagraph2->getPropertyValue("ParaFirstLineIndent") >>= nIndent2; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nIndent2); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, test_srcRect_smallNegBound) +{ + // Given a cropped custom shape, with a srcRect having a small negative value in one of bounds + createSdImpressDoc("pptx/tdf153008-srcRect-smallNegBound.pptx"); + + uno::Reference xGraphic( + getShapeFromPage(0, 0)->getPropertyValue("FillBitmap"), uno::UNO_QUERY_THROW); + + BitmapEx aBitmap(Graphic(xGraphic).GetBitmapEx()); + + // Properly cropped bitmap should have black pixels close to left edge, near vertical center. + // Before the fix, the gear was distorted, and this area was white. + auto yMiddle = aBitmap.GetSizePixel().Height() / 2; + auto x5Percent = aBitmap.GetSizePixel().Width() / 20; + CPPUNIT_ASSERT(aBitmap.GetPixelColor(x5Percent, yMiddle).IsDark()); + // Just in case, check that the corner is bright (it is in fact yellow) + CPPUNIT_ASSERT(aBitmap.GetPixelColor(0, 0).IsBright()); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf153012) +{ + // Given a chart with a data point with solid fill of "Background 1, Darker 15%" color, + // where the 'bg1' is mapped in the slide to "dk1", but in the chart to "lt1": + createSdImpressDoc("pptx/chart_pt_color_bg1.pptx"); + + uno::Reference xChart2Doc( + getShapeFromPage(0, 0)->getPropertyValue("Model"), uno::UNO_QUERY_THROW); + + uno::Reference xCooSysCnt(xChart2Doc->getFirstDiagram(), + uno::UNO_QUERY_THROW); + + uno::Reference xCTCnt(xCooSysCnt->getCoordinateSystems()[0], + uno::UNO_QUERY_THROW); + + uno::Reference xDSCnt(xCTCnt->getChartTypes()[0], + uno::UNO_QUERY_THROW); + + uno::Sequence> aSeriesSeq(xDSCnt->getDataSeries()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aSeriesSeq.getLength()); + + css::uno::Reference xPropSet1(aSeriesSeq[0]->getDataPointByIndex(1), + uno::UNO_SET_THROW); + Color aFillColor; + xPropSet1->getPropertyValue("FillColor") >>= aFillColor; + // The color must arrive correctly. Without the fix, it would fail: + // - Expected: rgba[d9d9d9ff] + // - Actual : rgba[000000ff] + CPPUNIT_ASSERT_EQUAL(Color(0xd9d9d9), aFillColor); +} + +CPPUNIT_TEST_FIXTURE(SdImportTest2, testMasterSlides) +{ + createSdImpressDoc("pptx/master-slides.pptx"); + uno::Reference xMasterPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xMasterPages(xMasterPagesSupplier->getMasterPages()); + CPPUNIT_ASSERT(xMasterPages.is()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7), xMasterPages->getCount()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/import-tests_skia.cxx b/sd/qa/unit/import-tests_skia.cxx new file mode 100644 index 0000000000..47f6406dde --- /dev/null +++ b/sd/qa/unit/import-tests_skia.cxx @@ -0,0 +1,36 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "sdmodeltestbase.hxx" + +#include + +// Tests here are expected to run with Skia enabled, similar to CppunitTest_vcl_skia. +// At some point, this could be true for all tests? + +class SdImportTestSkia : public SdModelTestBase +{ +public: + SdImportTestSkia() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SdImportTestSkia, testTdf156856) +{ + // Loading the document must not fail assertion + createSdImpressDoc("pptx/tdf156856.pptx"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/qa/unit/layout-tests.cxx b/sd/qa/unit/layout-tests.cxx new file mode 100644 index 0000000000..a93584b62f --- /dev/null +++ b/sd/qa/unit/layout-tests.cxx @@ -0,0 +1,385 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include + +#include +#include + +class SdLayoutTest : public UnoApiXmlTest +{ +public: + SdLayoutTest() + : UnoApiXmlTest("/sd/qa/unit/data/") + { + } + + xmlDocUniquePtr load(const char* pName) + { + loadFromFile(OUString::createFromAscii(pName)); + SfxBaseModel* pModel = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pModel); + SfxObjectShell* pShell = pModel->GetObjectShell(); + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + return pXmlDoc; + } +}; + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf104722) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/tdf104722.pptx"); + + // Without the fix in place, this would have failed with + // - Expected: 2093 + // - Actual : -10276 + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]"_ostr, "x"_ostr, "2093"); + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]"_ostr, "y"_ostr, "9273"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf135843) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/tdf135843.pptx"); + + // Without the fix, the test fails with: + // - Expected: 21165 + // - Actual : 4218 + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[1]"_ostr, "x"_ostr, + "21165"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[1]"_ostr, "y"_ostr, + "3866"); + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[2]"_ostr, "x"_ostr, + "21165"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[2]"_ostr, "y"_ostr, + "5956"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf146876) +{ + xmlDocUniquePtr pXmlDoc = load("odp/tdf146876.odp"); + + // Check the shape is inside the (5000,8500) - (11500,12500) area + for (size_t i = 2; i < 4; ++i) + { + for (size_t j = 1; j < 6; ++j) + { + const OString xPath = "/metafile/push[1]/push[1]/push[" + OString::number(i) + + "]/polyline/point[" + OString::number(j) + "]"; + const sal_Int32 nX = getXPath(pXmlDoc, xPath, "x"_ostr).toInt32(); + const sal_Int32 nY = getXPath(pXmlDoc, xPath, "y"_ostr).toInt32(); + + // Without the fix in place, this test would have failed with + // - Expected greater or equal than: 5000 + // - Actual : 0 + CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(5000), nX); + CPPUNIT_ASSERT_LESSEQUAL(sal_Int32(11500), nX); + + CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(8500), nY); + CPPUNIT_ASSERT_LESSEQUAL(sal_Int32(12500), nY); + } + } +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf136949) +{ + xmlDocUniquePtr pXmlDoc = load("odp/tdf136949.odp"); + + // Without the fix in place, this test would have failed with + // - Expected: 13687 + // - Actual : 2832 + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[7]/polyline/point[1]"_ostr, "x"_ostr, + "13687"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[7]/polyline/point[2]"_ostr, "x"_ostr, + "24759"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf128212) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/tdf128212.pptx"); + + // Without the fix in place, this test would have failed with + // - Expected: 7792 + // - Actual : 12068 + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray"_ostr, "x"_ostr, "4520"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray"_ostr, "y"_ostr, "7792"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testColumnsLayout) +{ + // This tests a 2-column text box's layout + + const OUString sText[] = { + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat mi quis " + "pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. " + "Curabitur dignissim sapien quis cursus egestas. Donec blandit auctor arcu, nec " + "pellentesque eros molestie eget. In consectetur aliquam hendrerit. Sed cursus mauris " + "vitae ligula pellentesque, non pellentesque urna aliquet. Fusce placerat mauris enim, " + "nec rutrum purus semper vel. Praesent tincidunt neque eu pellentesque pharetra. Fusce " + "pellentesque est orci.", + "Integer sodales tincidunt tristique. Sed a metus posuere, adipiscing nunc et, viverra " + "odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales " + "nisl sed orci mattis iaculis. Nunc eget dolor accumsan, pharetra risus a, vestibulum " + "mauris. Nunc vulputate lobortis mollis. Vivamus nec tellus faucibus, tempor magna nec, " + "facilisis felis. Donec commodo enim a vehicula pellentesque. Nullam vehicula vestibulum " + "est vel ultricies.", + "Aliquam velit massa, laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu " + "ut diam tempor luctus. Cum sociis natoque penatibus et magnis dis parturient montes, " + "nascetur ridiculus mus. Praesent vitae lacus vel leo sodales pharetra a a nibh. " + "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; " + "Nam luctus tempus nibh, fringilla dictum augue consectetur eget. Curabitur at ante sit " + "amet tortor pharetra molestie eu nec ante. Mauris tincidunt, nibh eu sollicitudin " + "molestie, dolor sapien congue tortor, a pulvinar sapien turpis sed ante. Donec nec est " + "elementum, euismod nulla in, mollis nunc." + }; + + // sentence#, index, length, x, y + const std::tuple strings[] = { + // Column 1 + { 0, 0, 40, 3750, 3193 }, + { 0, 40, 41, 3750, 3587 }, + { 0, 81, 39, 3750, 3981 }, + { 0, 120, 33, 3750, 4375 }, + { 0, 153, 35, 3750, 4769 }, + { 0, 188, 34, 3750, 5163 }, + { 0, 222, 38, 3750, 5557 }, + { 0, 260, 35, 3750, 5951 }, + { 0, 295, 37, 3750, 6345 }, + { 0, 332, 31, 3750, 6739 }, + { 0, 363, 33, 3750, 7133 }, + { 0, 396, 39, 3750, 7527 }, + { 0, 435, 37, 3750, 7921 }, + { 0, 472, 32, 3750, 8315 }, + { 0, 504, 22, 3750, 8709 }, + { 1, 0, 43, 3750, 9103 }, + { 1, 43, 35, 3750, 9497 }, + { 1, 78, 36, 3750, 9891 }, + { 1, 114, 41, 3750, 10285 }, + { 1, 155, 39, 3750, 10679 }, + { 1, 194, 35, 3750, 11073 }, + { 1, 229, 37, 3750, 11467 }, + { 1, 266, 40, 3750, 11861 }, + { 1, 306, 39, 3750, 12255 }, + { 1, 345, 38, 3750, 12649 }, + { 1, 383, 39, 3750, 13043 }, + { 1, 422, 29, 3750, 13437 }, + { 2, 0, 42, 3750, 13831 }, + { 2, 42, 41, 3750, 14225 }, + { 2, 83, 39, 3750, 14619 }, + { 2, 122, 32, 3750, 15013 }, + { 2, 154, 38, 3750, 15407 }, + { 2, 192, 34, 3750, 15801 }, + { 2, 226, 38, 3750, 16195 }, + // Column 2 + { 2, 264, 42, 10725, 3193 }, + { 2, 306, 39, 10725, 3587 }, + { 2, 345, 37, 10725, 3981 }, + { 2, 382, 37, 10725, 4375 }, + { 2, 419, 42, 10725, 4769 }, + { 2, 461, 36, 10725, 5163 }, + { 2, 497, 36, 10725, 5557 }, + { 2, 533, 40, 10725, 5951 }, + { 2, 573, 35, 10725, 6345 }, + { 2, 608, 30, 10725, 6739 }, + }; + + xmlDocUniquePtr pXmlDoc = load("odg/two_columns.odg"); + + for (size_t i = 0; i < SAL_N_ELEMENTS(strings); ++i) + { + const auto & [ sentence, index, length, x, y ] = strings[i]; + OString sXPath = "/metafile/push[1]/push[1]/textarray[" + OString::number(i + 1) + "]"; + assertXPathContent(pXmlDoc, sXPath + "/text", sText[sentence]); + assertXPath(pXmlDoc, sXPath, "index"_ostr, OUString::number(index)); + assertXPath(pXmlDoc, sXPath, "length"_ostr, OUString::number(length)); + assertXPath(pXmlDoc, sXPath, "x"_ostr, OUString::number(x)); + assertXPath(pXmlDoc, sXPath, "y"_ostr, OUString::number(y)); + } +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, tdf143258_testTbRlLayout) +{ + // This tests a 1-column and a 2-column text boxes' layout + + const OUString sText[] = { + "tb-rl text within a small text box", // Box 1 + "tb-rl text within a small 2-column text box", // Box 2 + }; + + // sentence#, index, length, x, y + const std::tuple strings[] = { + // Box 1 + { 0, 0, 11, 5346, 3250 }, + { 0, 11, 9, 4635, 3250 }, + { 0, 20, 6, 3924, 3250 }, + { 0, 26, 8, 3213, 3250 }, + // Box 2 column 1 + { 1, 0, 6, 5346, 7250 }, + { 1, 6, 5, 4635, 7250 }, + { 1, 11, 7, 3924, 7250 }, + { 1, 18, 8, 3213, 7250 }, + // Box 2 column 2 + { 1, 26, 2, 5346, 9600 }, + { 1, 28, 7, 4635, 9600 }, + { 1, 35, 5, 3924, 9600 }, + { 1, 40, 3, 3213, 9600 }, + }; + + xmlDocUniquePtr pXmlDoc = load("odg/tb-rl-textbox.odg"); + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/font"_ostr, SAL_N_ELEMENTS(strings)); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray"_ostr, SAL_N_ELEMENTS(strings)); + for (size_t i = 0; i < SAL_N_ELEMENTS(strings); ++i) + { + const auto & [ sentence, index, length, x, y ] = strings[i]; + OString sXPath = "/metafile/push[1]/push[1]/font[" + OString::number(i + 1) + "]"; + assertXPath(pXmlDoc, sXPath, "orientation"_ostr, "-900"); + assertXPath(pXmlDoc, sXPath, "vertical"_ostr, "true"); + sXPath = "/metafile/push[1]/push[1]/textarray[" + OString::number(i + 1) + "]"; + assertXPathContent(pXmlDoc, sXPath + "/text", sText[sentence]); + assertXPath(pXmlDoc, sXPath, "index"_ostr, OUString::number(index)); + assertXPath(pXmlDoc, sXPath, "length"_ostr, OUString::number(length)); + + // Without the fix in place, this would have failed with + // - Expected: 5346 + // - Actual : 503924 + // - In <>, attribute 'x' of '/metafile/push[1]/push[1]/textarray[1]' incorrect value. + assertXPath(pXmlDoc, sXPath, "x"_ostr, OUString::number(x)); + assertXPath(pXmlDoc, sXPath, "y"_ostr, OUString::number(y)); + } +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf146731) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/tdf146731.pptx"); + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[3]/polyline[1]"_ostr, "width"_ostr, "187"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[4]/polyline[1]"_ostr, "width"_ostr, "187"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]"_ostr, "width"_ostr, "187"); + + // Without the fix in place, this test would have failed with + // - Expected: 30 + // - Actual : 187 + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[6]/polyline[1]"_ostr, "width"_ostr, "30"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[7]/polyline[1]"_ostr, "width"_ostr, "187"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf135843_InsideHBorders) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/tdf135843_insideH.pptx"); + + // Without the fix, the test fails with: + //- Expected: 34 + //- Actual : 36 + // We shouldn't see two vertical borders inside the table on ui. + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push"_ostr, 34); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testBnc480256) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/bnc480256-2.pptx"); + + // Without the fix, the test fails with: + //- Expected: #ff0000 + //- Actual : #ffffff + // We should see the red vertical border inside the table. + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[8]/linecolor[1]"_ostr, "color"_ostr, + "#ff0000"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testFitToFrameTextFitting) +{ + // This test checks that the text fitting is working correctly when + // the textbox is set to "fit to frame" by stretching the text to or + // near the textbox boundary. The problem is especially complicated + // when the font size is set to a higher number (like 999) + // + // The text fitting behaviour when "fit by frame" is enabled is to + // always fit the text into the text box (without forcing the text + // into new line) by shrinking or expanding the text horizontally + // and vertically. + + xmlDocUniquePtr pXmlDoc = load("odg/FitToFrameText.odg"); + + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]"_ostr, "x"_ostr, "0"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]"_ostr, "y"_ostr, "406"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]/dxarray"_ostr, "first"_ostr, + "110"); +#ifndef _WIN32 // Windows seems to differ in text layouting, so ignore for now + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]/dxarray"_ostr, "last"_ostr, + "6981"); +#endif +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf148966) +{ + // Test related to IgnoreBreakAfterMultilineField compatibility flag. + { + xmlDocUniquePtr pXmlDoc = load("pptx/tdf148966.pptx"); + // Without the accompanying fix, would fail with: + // - Expected: 5952 + // - Actual : 7814 + // i.e. Line break after multiline field should have been ignored. + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[3]"_ostr, "y"_ostr, "5952"); + } + { + xmlDocUniquePtr pXmlDoc = load("odp/tdf148966-withflag.odp"); + // Without the accompanying fix, would fail with: + // - Expected: 5952 + // - Actual : 7814 + // i.e. When IgnoreBreakAfterMultilineField flag is set, line break + // after multiline field should have been ignored. + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[3]"_ostr, "y"_ostr, "5952"); + } + { + xmlDocUniquePtr pXmlDoc = load("odp/tdf148966-withoutflag.odp"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[3]"_ostr, "y"_ostr, "7814"); + } +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTableVerticalText) +{ + xmlDocUniquePtr pXmlDoc = load("pptx/tcPr-vert-roundtrip.pptx"); + + // Without the accompanying fix, would fail with: + // - Expected: -900 + // - Actual : 0 + // - In <>, attribute 'orientation' of '//font[1]' incorrect value. + // i.e. table cell text that was supposed to be vertical (rotated 90 + // degrees) was not vertical. + assertXPath(pXmlDoc, "//font[1]"_ostr, "orientation"_ostr, "-900"); + assertXPath(pXmlDoc, "//font[2]"_ostr, "orientation"_ostr, "900"); +} + +CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf112594) +{ + xmlDocUniquePtr pXmlDoc = load("odp/Tdf112594.fodp"); + + // Test that a NNBSP is grouped with the Mongolian characters after it, so + // we have one text array covering the whole string. + // + // Without the fix, it fails with: + // - Expected: 4 + // - Actual : 3 + // - In <>, attribute 'length' of '/metafile/push[1]/push[1]/textarray[3]' incorrect value. + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[3]"_ostr, "index"_ostr, "0"); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[3]"_ostr, "length"_ostr, "4"); + assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/textarray[3]/text"_ostr, + u"11\u202f\u1824"_ustr); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx new file mode 100644 index 0000000000..1bbf8364fd --- /dev/null +++ b/sd/qa/unit/misc-tests.cxx @@ -0,0 +1,962 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "sdmodeltestbase.hxx" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +/// Impress miscellaneous tests. +class SdMiscTest : public SdModelTestBase +{ +public: + SdMiscTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + + void testTdf99396(); + void testTableObjectUndoTest(); + void testFillGradient(); + void testTdf44774(); + void testTdf38225(); + void testTdf101242_ODF_no_settings(); + void testTdf101242_ODF_add_settings(); + void testTdf101242_settings_keep(); + void testTdf101242_settings_remove(); + void testTdf119392(); + void testTdf67248(); + void testTdf119956(); + void testTdf120527(); + void testTextColumns(); + void testTdf98839_ShearVFlipH(); + void testTdf130988(); + void testTdf131033(); + void testTdf129898LayerDrawnInSlideshow(); + void testTdf136956(); + void testTdf39519(); + void testEncodedTableStyles(); + + CPPUNIT_TEST_SUITE(SdMiscTest); + CPPUNIT_TEST(testTdf99396); + CPPUNIT_TEST(testTableObjectUndoTest); + CPPUNIT_TEST(testFillGradient); + CPPUNIT_TEST(testTdf44774); + CPPUNIT_TEST(testTdf38225); + CPPUNIT_TEST(testTdf101242_ODF_no_settings); + CPPUNIT_TEST(testTdf101242_ODF_add_settings); + CPPUNIT_TEST(testTdf101242_settings_keep); + CPPUNIT_TEST(testTdf101242_settings_remove); + CPPUNIT_TEST(testTdf119392); + CPPUNIT_TEST(testTdf67248); + CPPUNIT_TEST(testTdf119956); + CPPUNIT_TEST(testTdf120527); + CPPUNIT_TEST(testTextColumns); + CPPUNIT_TEST(testTdf98839_ShearVFlipH); + CPPUNIT_TEST(testTdf130988); + CPPUNIT_TEST(testTdf131033); + CPPUNIT_TEST(testTdf129898LayerDrawnInSlideshow); + CPPUNIT_TEST(testTdf136956); + CPPUNIT_TEST(testTdf39519); + CPPUNIT_TEST(testEncodedTableStyles); + CPPUNIT_TEST_SUITE_END(); +}; + +void SdMiscTest::testTdf99396() +{ + // Load the document and select the table. + createSdImpressDoc("tdf99396.odp"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + + SdPage* pPage = pViewShell->GetActualPage(); + SdrObject* pObject = pPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + // Make sure that the undo stack is empty. + CPPUNIT_ASSERT_EQUAL(static_cast(0), pDoc->GetUndoManager()->GetUndoActionCount()); + + // Set the vertical alignment of the cells to bottom. + sdr::table::SvxTableController* pTableController + = dynamic_cast(pView->getSelectionController().get()); + CPPUNIT_ASSERT(pTableController); + SfxRequest aRequest(*pViewShell->GetViewFrame(), SID_TABLE_VERT_BOTTOM); + pTableController->Execute(aRequest); + // This was 0, it wasn't possible to undo a vertical alignment change. + CPPUNIT_ASSERT_EQUAL(static_cast(1), pDoc->GetUndoManager()->GetUndoActionCount()); +} + +void SdMiscTest::testTableObjectUndoTest() +{ + // See tdf#99396 for the issue + + // Load the document and select the table. + createSdImpressDoc("tdf99396.odp"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + auto pTableObject = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObject); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTableObject, pView->GetSdrPageView()); + + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + // Make sure that the undo stack is empty. + CPPUNIT_ASSERT_EQUAL(static_cast(0), pDoc->GetUndoManager()->GetUndoActionCount()); + + // Set horizontal and vertical adjustment during text edit. + pView->SdrBeginTextEdit(pTableObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + { + SfxRequest aRequest(*pViewShell->GetViewFrame(), SID_ATTR_PARA_ADJUST_RIGHT); + SfxItemSet aEditAttr(pDoc->GetPool()); + pView->GetAttributes(aEditAttr); + SfxItemSet aNewAttr(*(aEditAttr.GetPool()), aEditAttr.GetRanges()); + aNewAttr.Put(SvxAdjustItem(SvxAdjust::Right, EE_PARA_JUST)); + aRequest.Done(aNewAttr); + const SfxItemSet* pArgs = aRequest.GetArgs(); + pView->SetAttributes(*pArgs); + } + const auto& pLocalUndoManager = pView->getViewLocalUndoManager(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pLocalUndoManager->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(OUString("Apply attributes"), pLocalUndoManager->GetUndoActionComment()); + { + auto pTableController + = dynamic_cast(pView->getSelectionController().get()); + CPPUNIT_ASSERT(pTableController); + SfxRequest aRequest(*pViewShell->GetViewFrame(), SID_TABLE_VERT_BOTTOM); + pTableController->Execute(aRequest); + } + // Global change "Format cell" is applied only - Change the vertical alignment to "Bottom" + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetUndoManager()->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), pDoc->GetUndoManager()->GetUndoActionComment()); + + pView->SdrEndTextEdit(); + + // End of text edit, so the text edit action is added to the undo stack + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetUndoManager()->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(OUString("Edit text of Table"), + pDoc->GetUndoManager()->GetUndoActionComment(0)); + CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), pDoc->GetUndoManager()->GetUndoActionComment(1)); + + // Check that the result is what we expect. + { + uno::Reference xTable = pTableObject->getTable(); + uno::Reference xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY); + drawing::TextVerticalAdjust eAdjust + = xCell->getPropertyValue("TextVerticalAdjust").get(); + CPPUNIT_ASSERT_EQUAL(int(drawing::TextVerticalAdjust_BOTTOM), static_cast(eAdjust)); + } + { + const EditTextObject& rEdit + = pTableObject->getText(0)->GetOutlinerParaObject()->GetTextObject(); + const SfxItemSet& rParaAttribs = rEdit.GetParaAttribs(0); + auto pAdjust = rParaAttribs.GetItem(EE_PARA_JUST); + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, pAdjust->GetAdjust()); + } + + // Now undo. + pXImpressDocument->GetDocShell()->GetUndoManager()->Undo(); + + // Undoing the last action - one left + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetUndoManager()->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), pDoc->GetUndoManager()->GetUndoActionComment(0)); + + // Check again that the result is what we expect. + { + uno::Reference xTable = pTableObject->getTable(); + uno::Reference xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY); + drawing::TextVerticalAdjust eAdjust + = xCell->getPropertyValue("TextVerticalAdjust").get(); + // This failed: Undo() did not change it from drawing::TextVerticalAdjust_BOTTOM. + CPPUNIT_ASSERT_EQUAL(int(drawing::TextVerticalAdjust_TOP), static_cast(eAdjust)); + } + { + const EditTextObject& rEdit + = pTableObject->getText(0)->GetOutlinerParaObject()->GetTextObject(); + const SfxItemSet& rParaAttribs = rEdit.GetParaAttribs(0); + auto pAdjust = rParaAttribs.GetItem(EE_PARA_JUST); + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Center, pAdjust->GetAdjust()); + } + + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetUndoManager()->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), pDoc->GetUndoManager()->GetUndoActionComment(0)); + + /* + * now test tdf#103950 - Undo does not revert bundled font size changes for table cells + */ + pTableObject = dynamic_cast(pPage->GetObj(0)); + pView->MarkObj(pTableObject, pView->GetSdrPageView()); // select table + { + SfxRequest aRequest(*pViewShell->GetViewFrame(), SID_GROW_FONT_SIZE); + static_cast(pViewShell)->ExecChar(aRequest); + } + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(static_cast(3), pDoc->GetUndoManager()->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(OUString("Apply attributes to Table"), + pDoc->GetUndoManager()->GetUndoActionComment(0)); + CPPUNIT_ASSERT_EQUAL(OUString("Grow font size"), + pDoc->GetUndoManager()->GetUndoActionComment(1)); + CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), pDoc->GetUndoManager()->GetUndoActionComment(2)); +} + +void SdMiscTest::testFillGradient() +{ + createSdImpressDoc(); + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPages = xDrawPagesSupplier->getDrawPages(); + // Insert a new page. + uno::Reference xDrawPage(xDrawPages->insertNewByIndex(0), + uno::UNO_SET_THROW); + uno::Reference xShapes(xDrawPage, uno::UNO_QUERY_THROW); + // Create a rectangle + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFactory.is()); + uno::Reference xShape1( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY_THROW); + uno::Reference xPropSet(xShape1, uno::UNO_QUERY_THROW); + // Set FillStyle and FillGradient + awt::Gradient aGradient; + aGradient.StartColor = sal_Int32(Color(255, 0, 0)); + aGradient.EndColor = sal_Int32(Color(0, 255, 0)); + xPropSet->setPropertyValue("FillStyle", uno::Any(drawing::FillStyle_GRADIENT)); + xPropSet->setPropertyValue("FillGradient", uno::Any(aGradient)); + // Add the rectangle to the page. + xShapes->add(xShape1); + + // Retrieve the shape and check FillStyle and FillGradient + uno::Reference xIndexAccess(xDrawPage, uno::UNO_QUERY_THROW); + uno::Reference xPropSet2(xIndexAccess->getByIndex(0), + uno::UNO_QUERY_THROW); + drawing::FillStyle eFillStyle; + awt::Gradient2 aGradient2; + CPPUNIT_ASSERT(xPropSet2->getPropertyValue("FillStyle") >>= eFillStyle); + CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast(eFillStyle)); + CPPUNIT_ASSERT(xPropSet2->getPropertyValue("FillGradient") >>= aGradient2); + + // MCGR: Use the completely imported gradient to check for correctness + const basegfx::BColorStops aColorStops + = model::gradient::getColorStopsFromUno(aGradient2.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xff0000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x00ff00), Color(aColorStops[1].getStopColor())); +} + +void SdMiscTest::testTdf44774() +{ + createSdDrawDoc(); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::DrawDocShell* pDocShell = pXImpressDocument->GetDocShell(); + + SfxStyleSheetBasePool* pSSPool = pDocShell->GetStyleSheetPool(); + + // Create a new style with an empty name, like what happens in UI when creating a new style + SfxStyleSheetBase& rStyleA + = pSSPool->Make("", SfxStyleFamily::Para, SfxStyleSearchBits::UserDefined); + // Assign a new name, which does not yet set its ApiName + rStyleA.SetName("StyleA"); + // Create another style + SfxStyleSheetBase& rStyleB + = pSSPool->Make("StyleB", SfxStyleFamily::Para, SfxStyleSearchBits::UserDefined); + // ... and set its parent to the first one + rStyleB.SetParent("StyleA"); + + // Now save the file and reload + saveAndReload("draw8"); + pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + pDocShell = pXImpressDocument->GetDocShell(); + pSSPool = pDocShell->GetStyleSheetPool(); + + SfxStyleSheetBase* pStyle = pSSPool->Find("StyleB", SfxStyleFamily::Para); + CPPUNIT_ASSERT(pStyle); + // The parent set in StyleB used to reset, because parent style's msApiName was empty + CPPUNIT_ASSERT_EQUAL(OUString("StyleA"), pStyle->GetParent()); +} + +void SdMiscTest::testTdf38225() +{ + createSdImpressDoc(); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::DrawDocShell* pDocShell = pXImpressDocument->GetDocShell(); + + SfxStyleSheetBasePool* pSSPool = pDocShell->GetStyleSheetPool(); + + // Create a new style with a name + pSSPool->Make("StyleWithName1", SfxStyleFamily::Para, SfxStyleSearchBits::UserDefined); + + // Now save the file and reload + saveAndReload("draw8"); + pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + pDocShell = pXImpressDocument->GetDocShell(); + pSSPool = pDocShell->GetStyleSheetPool(); + + SfxStyleSheetBase* pStyle = pSSPool->Find("StyleWithName1", SfxStyleFamily::Para); + CPPUNIT_ASSERT(pStyle); + + // Rename the style + CPPUNIT_ASSERT(pStyle->SetName("StyleWithName2")); + + // Save the file and reload again + saveAndReload("draw8"); + pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + pDocShell = pXImpressDocument->GetDocShell(); + pSSPool = pDocShell->GetStyleSheetPool(); + + // The problem was that the style kept the old name upon reloading + pStyle = pSSPool->Find("StyleWithName1", SfxStyleFamily::Para); + CPPUNIT_ASSERT(!pStyle); + pStyle = pSSPool->Find("StyleWithName2", SfxStyleFamily::Para); + CPPUNIT_ASSERT(pStyle); +} + +void SdMiscTest::testTdf120527() +{ + createSdImpressDoc(); + + // Load a bitmap into the bitmap table. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFactory.is()); + uno::Reference xBitmaps( + xFactory->createInstance("com.sun.star.drawing.BitmapTable"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xBitmaps.is()); + OUString aGraphicURL = createFileURL(u"tdf120527.jpg"); + xBitmaps->insertByName("test", uno::Any(aGraphicURL)); + + // Create a graphic. + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShape.is()); + uno::Reference xShapeProperySet(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT(xShapeProperySet.is()); + xShapeProperySet->setPropertyValue("GraphicURL", xBitmaps->getByName("test")); + + // Insert it. + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDrawPagesSupplier.is()); + uno::Reference xDrawPages = xDrawPagesSupplier->getDrawPages(); + CPPUNIT_ASSERT(xDrawPages.is()); + uno::Reference xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xDrawPage.is()); + // This failed with a lang.IllegalArgumentException. + xDrawPage->add(xShape); + + // Verify that the graphic was actually consumed. + uno::Reference xGraphic; + xShapeProperySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); +} + +// Testing document model part of editengine-columns +void SdMiscTest::testTextColumns() +{ + createSdImpressDoc(); + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPages = xDrawPagesSupplier->getDrawPages(); + // Insert a new page. + uno::Reference xDrawPage(xDrawPages->insertNewByIndex(0), + uno::UNO_SET_THROW); + uno::Reference xShapes(xDrawPage, uno::UNO_QUERY_THROW); + + { + // Create a text shape + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFactory.is()); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.TextShape"), uno::UNO_QUERY_THROW); + uno::Reference xPropSet(xShape, uno::UNO_QUERY_THROW); + + // Add the shape to the page. + xShapes->add(xShape); + + // Set up columns + auto pTextObj = DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pTextObj); + pTextObj->SetMergedItem(SfxInt16Item(SDRATTR_TEXTCOLUMNS_NUMBER, 2)); + pTextObj->SetMergedItem(SdrMetricItem(SDRATTR_TEXTCOLUMNS_SPACING, 1000)); + } + + { + // Retrieve the shape and check columns + uno::Reference xIndexAccess(xDrawPage, uno::UNO_QUERY_THROW); + uno::Reference xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW); + + auto pTextObj = DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape)); + CPPUNIT_ASSERT(pTextObj); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pTextObj->GetTextColumnsSpacing()); + } +} + +/// Draw miscellaneous tests. + +// Since LO 6.2 the visible/printable/locked information for layers is always +// written as ODF attributes draw:display and draw:protected. It is only read from +// there, if the config items VisibleLayers, PrintableLayers and LockedLayers do +// not exist. The user option WriteLayerStateAsConfigItem can be set to 'true' to +// write these config items in addition to the ODF attributes for to produce +// documents for older LO versions or Apache OpenOffice. With value 'false' no +// config items are written. The 'testTdf101242_xyz' tests combine source +// files with and without config items with option values 'true' and 'false'. + +void SdMiscTest::testTdf101242_ODF_add_settings() +{ + // Loads a document, which has the visible/printable/locked information for layers + // only in the ODF attributes draw:display and draw:protected. The resaved document + // should still have the ODF attributes and in addition the config items in settings.xml. + // "Load" is needed for to handle layers, simple "loadURL" does not work. + createSdDrawDoc("tdf101242_ODF.odg"); + + // Saving including items in settings.xml + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(true, pBatch); + pBatch->commit(); + save("draw8"); + + // Verify, that the saved document still has the ODF attributes + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc); + static constexpr OString sPathStart( + "/office:document-styles/office:master-styles/draw:layer-set/draw:layer"_ostr); + assertXPath(pXmlDoc, + sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']"); + + // Verify, that the saved document has got the items in settings.xml + xmlDocUniquePtr pXmlDoc2 = parseExport("settings.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2); + static constexpr OString sPathStart2("/office:document-settings/office:settings/" + "config:config-item-set[@config:name='ooo:view-settings']/" + "config:config-item-map-indexed[@config:name='Views']/" + "config:config-item-map-entry"_ostr); + // Value is a bitfield with first Byte in order '* * * measurelines controls backgroundobjects background layout' + // The first three bits depend on initialization and may change. The values in file are Base64 encoded. + OUString sBase64; + uno::Sequence aDecodedSeq; + sBase64 = getXPathContent(pXmlDoc2, + sPathStart2 + "/config:config-item[@config:name='VisibleLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item VisibleLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x0F, static_cast(aDecodedSeq[0]) & 0x1F); + + sBase64 = getXPathContent(pXmlDoc2, + sPathStart2 + "/config:config-item[@config:name='PrintableLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item PrintableLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x17, static_cast(aDecodedSeq[0]) & 0x1F); + + sBase64 = getXPathContent(pXmlDoc2, + sPathStart2 + "/config:config-item[@config:name='LockedLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item LockedLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x04, static_cast(aDecodedSeq[0]) & 0x1F); +} + +void SdMiscTest::testTdf101242_ODF_no_settings() +{ + // Loads a document, which has the visible/printable/locked information for layers + // only in the ODF attributes draw:display and draw:protected. The resave document + // should have only the ODF attributes and no config items in settings.xml. + createSdDrawDoc("tdf101242_ODF.odg"); + + // Saving without items in settings.xml + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(false, pBatch); + pBatch->commit(); + save("draw8"); + + // Verify, that the saved document still has the ODF attributes + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc); + static constexpr OString sPathStart( + "/office:document-styles/office:master-styles/draw:layer-set/draw:layer"_ostr); + assertXPath(pXmlDoc, + sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']"); + + // Verify, that the saved document has no layer items in settings.xml + xmlDocUniquePtr pXmlDoc2 = parseExport("settings.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2); + static constexpr OString sPathStart2("/office:document-settings/office:settings/" + "config:config-item-set[@config:name='ooo:view-settings']/" + "config:config-item-map-indexed[@config:name='Views']/" + "config:config-item-map-entry"_ostr); + assertXPath(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='VisibleLayers']", 0); + assertXPath(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='PrintableLayers']", 0); + assertXPath(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='LockedLayers']", 0); +} + +void SdMiscTest::testTdf101242_settings_keep() +{ + // Loads a document, which has the visible/printable/locked information for layers + // only in the config items in settings.xml. That is the case for all old documents. + // The resaved document should have the ODF attributes draw:display and draw:protected + // and should still have these config items in settings.xml. + createSdDrawDoc("tdf101242_settings.odg"); + + // Saving including items in settings.xml + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(true, pBatch); + pBatch->commit(); + save("draw8"); + + // Verify, that the saved document has the ODF attributes + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc); + static constexpr OString sPathStart( + "/office:document-styles/office:master-styles/draw:layer-set/draw:layer"_ostr); + assertXPath(pXmlDoc, + sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']"); + + // Verify, that the saved document still has the items in settings.xml + xmlDocUniquePtr pXmlDoc2 = parseExport("settings.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2); + static constexpr OString sPathStart2("/office:document-settings/office:settings/" + "config:config-item-set[@config:name='ooo:view-settings']/" + "config:config-item-map-indexed[@config:name='Views']/" + "config:config-item-map-entry"_ostr); + // Value is a bitfield with first Byte in order '* * * measurelines controls backgroundobjects background layout' + // The first three bits depend on initialization and may change. The values in file are Base64 encoded. + OUString sBase64; + uno::Sequence aDecodedSeq; + sBase64 = getXPathContent(pXmlDoc2, + sPathStart2 + "/config:config-item[@config:name='VisibleLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item VisibleLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x0F, static_cast(aDecodedSeq[0]) & 0x1F); + + sBase64 = getXPathContent(pXmlDoc2, + sPathStart2 + "/config:config-item[@config:name='PrintableLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item PrintableLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x17, static_cast(aDecodedSeq[0]) & 0x1F); + + sBase64 = getXPathContent(pXmlDoc2, + sPathStart2 + "/config:config-item[@config:name='LockedLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item LockedLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x04, static_cast(aDecodedSeq[0]) & 0x1F); +} + +void SdMiscTest::testTdf101242_settings_remove() +{ + // Loads a document, which has the visible/printable/locked information for layers + // only in the config items in settings.xml. That is the case for all old documents. + // The resaved document should have only the ODF attributes draw:display and draw:protected + // and should have no config items in settings.xml. + createSdDrawDoc("tdf101242_settings.odg"); + + // Saving without config items in settings.xml + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(false, pBatch); + pBatch->commit(); + save("draw8"); + + // Verify, that the saved document has the ODF attributes + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc); + static constexpr OString sPathStart( + "/office:document-styles/office:master-styles/draw:layer-set/draw:layer"_ostr); + assertXPath(pXmlDoc, + sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']"); + assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']"); + + // Verify, that the saved document has no layer items in settings.xml + xmlDocUniquePtr pXmlDoc2 = parseExport("settings.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2); + static constexpr OString sPathStart2("/office:document-settings/office:settings/" + "config:config-item-set[@config:name='ooo:view-settings']/" + "config:config-item-map-indexed[@config:name='Views']/" + "config:config-item-map-entry"_ostr); + assertXPath(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='VisibleLayers']", 0); + assertXPath(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='PrintableLayers']", 0); + assertXPath(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='LockedLayers']", 0); +} + +void SdMiscTest::testTdf119392() +{ + // Loads a document which has two user layers "V--" and "V-L". Inserts a new layer "-P-" between them. + // Checks, that the bitfields in the saved file have the bits in the correct order, in case + // option WriteLayerAsConfigItem is true and the config items are written. + std::shared_ptr batch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(true, batch); + batch->commit(); + + createSdDrawDoc("tdf119392_InsertLayer.odg"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + // Insert layer "-P-", not visible, printable, not locked + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView = pViewShell->GetView(); + pView->InsertNewLayer("-P-", 6); // 0..4 standard layer, 5 layer "V--" + SdrPageView* pPageView = pView->GetSdrPageView(); + pPageView->SetLayerVisible("-P-", false); + pPageView->SetLayerPrintable("-P-", true); + pPageView->SetLayerLocked("-P-", false); + save("draw8"); + + // Verify correct bit order in bitfield in the config items in settings.xml + xmlDocUniquePtr pXmlDoc = parseExport("settings.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc); + static constexpr OString sPathStart("/office:document-settings/office:settings/" + "config:config-item-set[@config:name='ooo:view-settings']/" + "config:config-item-map-indexed[@config:name='Views']/" + "config:config-item-map-entry"_ostr); + // First Byte is in order 'V-L -P- V-- measurelines controls backgroundobjects background layout' + // Bits need to be: visible=10111111=0xbf=191 printable=01011111=0x5f=95 locked=10000000=0x80=128 + // The values in file are Base64 encoded. + OUString sBase64; + uno::Sequence aDecodedSeq; + sBase64 = getXPathContent(pXmlDoc, + sPathStart + "/config:config-item[@config:name='VisibleLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item VisibleLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0xbF, + static_cast(aDecodedSeq[0]) + & 0xff); // & 0xff forces unambiguous types for CPPUNIT_ASSERT_EQUAL + + sBase64 = getXPathContent(pXmlDoc, + sPathStart + "/config:config-item[@config:name='PrintableLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item PrintableLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x5f, static_cast(aDecodedSeq[0]) & 0xff); + + sBase64 + = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='LockedLayers']"); + CPPUNIT_ASSERT_MESSAGE("Item LockedLayers does not exists.", !sBase64.isEmpty()); + comphelper::Base64::decode(aDecodedSeq, sBase64); + CPPUNIT_ASSERT_EQUAL(0x80, static_cast(aDecodedSeq[0]) & 0xff); +} + +void SdMiscTest::testTdf67248() +{ + // The document tdf67248.odg has been created with a German UI. It has a user layer named "Background". + // On opening the user layer must still exists. The error was, that it was merged into the standard + // layer "background". + createSdDrawDoc("tdf67248.odg"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), rLayerAdmin.GetLayerCount()); +} + +void SdMiscTest::testTdf119956() +{ + createSdDrawDoc("tdf119956.odg"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + + sd::GraphicViewShell* pGraphicViewShell = static_cast(pViewShell); + CPPUNIT_ASSERT(pGraphicViewShell); + sd::LayerTabBar* pLayerTabBar = pGraphicViewShell->GetLayerTabControl(); + CPPUNIT_ASSERT(pLayerTabBar); + pLayerTabBar->StateChanged(StateChangedType::InitShow); + + // Alt+Click sets a tab in edit mode, so that you can rename it. + // The error was, that Alt+Click on a tab, which was not the current tab, did not set the clicked tab + // as current tab. As a result, the entered text was applied to the wrong tab. + + // The test document has the layer tabs "layout", "controls", "measurelines" and "Layer4" in this order + // The "pagePos" is 0, 1, 2, 3 + // Make sure, that tab "layout" is the current tab. + MouseEvent aSyntheticMouseEvent; + if (pLayerTabBar->GetCurPagePos() != 0) + { + sal_uInt16 nIdOfTabPos0(pLayerTabBar->GetPageId(0)); + tools::Rectangle aTabPos0Rect(pLayerTabBar->GetPageRect(nIdOfTabPos0)); + aSyntheticMouseEvent + = MouseEvent(aTabPos0Rect.Center(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, 0); + pLayerTabBar->MouseButtonDown(aSyntheticMouseEvent); + } + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pLayerTabBar->GetCurPagePos()); + + // Alt+Click on tab "Layer4" + sal_uInt16 nIdOfTabPos3(pLayerTabBar->GetPageId(3)); + tools::Rectangle aTabPos3Rect(pLayerTabBar->GetPageRect(nIdOfTabPos3)); + aSyntheticMouseEvent = MouseEvent(aTabPos3Rect.Center(), 1, MouseEventModifiers::SYNTHETIC, + MOUSE_LEFT, KEY_MOD2); + pLayerTabBar->MouseButtonDown(aSyntheticMouseEvent); + + // Make sure, tab 3 is current tab now. + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pLayerTabBar->GetCurPagePos()); +} + +void SdMiscTest::testTdf98839_ShearVFlipH() +{ + // Loads a document with a sheared shape and mirrors it + createSdDrawDoc("tdf98839_ShearVFlipH.odg"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + SdrObjCustomShape* pShape = static_cast(pPage->GetObj(0)); + pShape->Mirror(Point(4000, 2000), Point(4000, 10000)); + + // Save and examine attribute draw:transform + save("draw8"); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + CPPUNIT_ASSERT_MESSAGE("Failed to get 'content.xml'", pXmlDoc); + static constexpr OString sPathStart( + "/office:document-content/office:body/office:drawing/draw:page"_ostr); + assertXPath(pXmlDoc, sPathStart); + const OUString sTransform + = getXPath(pXmlDoc, sPathStart + "/draw:custom-shape", "transform"_ostr); + + // Error was, that the shear angle had a wrong sign. + CPPUNIT_ASSERT_MESSAGE("expected: draw:transform='skewX (-0.64350...)", + sTransform.startsWith("skewX (-")); +} + +void SdMiscTest::testTdf130988() +{ + createSdDrawDoc("tdf130988_3D_create_lathe.odg"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + + //emulate command .uno:ConvertInto3DLathe + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + E3dView* pView = pViewShell->GetView(); + pView->MarkNextObj(); + pView->ConvertMarkedObjTo3D(false, basegfx::B2DPoint(8000.0, -3000.0), + basegfx::B2DPoint(3000.0, -8000.0)); + E3dScene* pObj = dynamic_cast(pView->GetMarkedObjectByIndex(0)); + CPPUNIT_ASSERT(pObj); + + // Error was, that the created 3D object had a wrong path. Instead examining + // the path directly, I use the scene distance, because that is easier. The + // scene distance is calculated from the object while creating. + const double fDistance = pObj->GetDistance(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("D3DSceneDistance", 7071.0, fDistance, 0.5); +} + +void SdMiscTest::testTdf131033() +{ + createSdDrawDoc("tdf131033_3D_SceneSizeIn2d.odg"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + + // The document contains a polygon, so that emulate command .uno:ConvertInto3DLathe + // by direct call of ConvertMarkedObjTo3D works. + // It produces a rotation around a vertical axis, which is far away from the + // generating shape. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + E3dView* pView = pViewShell->GetView(); + pView->MarkNextObj(); + pView->ConvertMarkedObjTo3D(false, basegfx::B2DPoint(11000.0, -5000.0), + basegfx::B2DPoint(11000.0, -9000.0)); + E3dScene* pObj = dynamic_cast(pView->GetMarkedObjectByIndex(0)); + CPPUNIT_ASSERT(pObj); + + // Error was, that the 2D representation of the scene did not contain the default 20° + // rotation of the new scene around x-axis and therefore was not high enough. + const double fSnapRectHeight = pObj->GetSnapRect().getOpenHeight(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("2D height", 7096.0, fSnapRectHeight, 1.0); +} + +void SdMiscTest::testTdf129898LayerDrawnInSlideshow() +{ + // Versions LO 6.2 to 6.4 have produced files, where the layer DrawnInSlideshow has + // got visible=false and printable=false attributes. Those files should be repaired now. + createSdImpressDoc("tdf129898_faulty_DrawnInSlideshow.odp"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + + // Verify model + static constexpr OUString sName = u"DrawnInSlideshow"_ustr; + SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin(); + SdrLayer* pLayer = rLayerAdmin.GetLayer(sName); + CPPUNIT_ASSERT_MESSAGE("No layer DrawnInSlideshow", pLayer); + CPPUNIT_ASSERT(pLayer->IsVisibleODF()); + CPPUNIT_ASSERT(pLayer->IsPrintableODF()); + + // Verify view + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrPageView* pPageView = pViewShell->GetView()->GetSdrPageView(); + CPPUNIT_ASSERT(pPageView->IsLayerVisible(sName)); + CPPUNIT_ASSERT(pPageView->IsLayerPrintable(sName)); +} + +void SdMiscTest::testTdf136956() +{ + createSdImpressDoc("odp/cellspan.odp"); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + const SdrPage* pPage = pDoc->GetPage(1); + sdr::table::SdrTableObj* pTableObj = dynamic_cast(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObj); + uno::Reference xTable(pTableObj->getTable(), uno::UNO_SET_THROW); + + uno::Reference xRange( + xTable->createCursorByRange(xTable->getCellRangeByPosition(0, 0, 3, 2)), + uno::UNO_QUERY_THROW); + + // 4x3 Table before merge. + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable->getColumnCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRowCount()); + + xRange->merge(); + + // 1x1 Table after merge. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumnCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRowCount()); + + pXImpressDocument->GetDocShell()->GetUndoManager()->Undo(); + + // 4x3 Table after undo. Undo crashed before. + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable->getColumnCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRowCount()); +} + +void SdMiscTest::testTdf39519() +{ + createSdImpressDoc(); + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + + // Change the name of the first page in the newly created document + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + SdPage* pPage = static_cast(pDoc->GetPage(1)); + pPage->SetName("Test"); + + // Insert a bookmark as a new page using the same name + std::vector aBookmarkList = { "Test" }; + pDoc->InsertBookmarkAsPage(aBookmarkList, nullptr, false, false, 2, true, pDoc->GetDocSh(), + true, false, false); + + // Check if the copied page has a different name + SdPage* pCopiedPage = static_cast(pDoc->GetPage(2)); + // Without the fix in place, the names of the pages would not be different + CPPUNIT_ASSERT(pCopiedPage->GetName() != pPage->GetName()); +} + +void SdMiscTest::testEncodedTableStyles() +{ + // Silence unrelated failure: + // Error: element "table:table-template" is missing "first-row-start-column" attribute + skipValidation(); + + createSdDrawDoc(); + + { + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xTableStyleFamily( + xStyleFamiliesSupplier->getStyleFamilies()->getByName("table"), uno::UNO_QUERY_THROW); + uno::Reference xCellStyleFamily( + xStyleFamiliesSupplier->getStyleFamilies()->getByName("cell"), uno::UNO_QUERY_THROW); + + uno::Reference xTableStyle(xTableStyleFamily->createInstance(), + uno::UNO_QUERY_THROW); + uno::Reference xCellStyle(xCellStyleFamily->createInstance(), + uno::UNO_QUERY_THROW); + + uno::Reference(xTableStyleFamily, uno::UNO_QUERY_THROW) + ->insertByName("table_1", uno::Any(xTableStyle)); + uno::Reference(xCellStyleFamily, uno::UNO_QUERY_THROW) + ->insertByName("table-body_1", uno::Any(xCellStyle)); + uno::Reference(xTableStyle, uno::UNO_QUERY_THROW) + ->replaceByName("body", uno::Any(xCellStyle)); + } + + saveAndReload("draw8"); + + { + uno::Reference xStyleFamiliesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xTableStyleFamily( + xStyleFamiliesSupplier->getStyleFamilies()->getByName("table"), uno::UNO_QUERY_THROW); + // Such style used to be exported as "table_5f_1" instead. + CPPUNIT_ASSERT(xTableStyleFamily->hasByName("table_1")); + + uno::Reference xTableStyle(xTableStyleFamily->getByName("table_1"), + uno::UNO_QUERY_THROW); + uno::Reference xCellStyle(xTableStyle->getByName("body"), uno::UNO_QUERY); + // Such style used to not be found by the table style, as it was + // searching for "table-body_5f_1" instead of "table-body_1". + CPPUNIT_ASSERT(xCellStyle.is()); + CPPUNIT_ASSERT_EQUAL(OUString("table-body_1"), xCellStyle->getName()); + } +} + +CPPUNIT_TEST_SUITE_REGISTRATION(SdMiscTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/sdmodeltestbase.hxx b/sd/qa/unit/sdmodeltestbase.hxx new file mode 100644 index 0000000000..4f0d15c564 --- /dev/null +++ b/sd/qa/unit/sdmodeltestbase.hxx @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +class SdModelTestBase : public UnoApiXmlTest +{ +public: + SdModelTestBase(OUString path) + : UnoApiXmlTest(path) + { + } + + void createSdImpressDoc(const char* pName = nullptr, const char* pPassword = nullptr) + { + if (!pName) + load("private:factory/simpress"); + else + loadFromFile(OUString::createFromAscii(pName), pPassword); + + uno::Reference xServiceInfo(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.presentation.PresentationDocument")); + + CPPUNIT_ASSERT(!getSdDocShell()->GetMedium()->GetWarningError()); + } + + void createSdDrawDoc(const char* pName = nullptr, const char* pPassword = nullptr) + { + if (!pName) + load("private:factory/sdraw"); + else + loadFromFile(OUString::createFromAscii(pName), pPassword); + + uno::Reference xServiceInfo(mxComponent, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.drawing.DrawingDocument")); + + CPPUNIT_ASSERT(!getSdDocShell()->GetMedium()->GetWarningError()); + } + + sd::DrawDocShell* getSdDocShell() + { + SdXImpressDocument* pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + return pImpressDocument->GetDocShell(); + } + + uno::Reference getPage(int nPage) + { + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDoc.is()); + uno::Reference xPage(xDoc->getDrawPages()->getByIndex(nPage), + uno::UNO_QUERY_THROW); + return xPage; + } + + uno::Reference getShapeFromPage(int nShape, int nPage) + { + uno::Reference xPage(getPage(nPage)); + uno::Reference xShape(getShape(nShape, xPage)); + CPPUNIT_ASSERT_MESSAGE("Failed to load shape", xShape.is()); + + return xShape; + } + + // very confusing ... UNO index-based access to pages is 0-based. This one is 1-based + const SdrPage* GetPage(int nPage) + { + SdXImpressDocument* pXImpressDocument + = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + CPPUNIT_ASSERT_MESSAGE("no document", pDoc != nullptr); + + const SdrPage* pPage = pDoc->GetPage(nPage); + CPPUNIT_ASSERT_MESSAGE("no page", pPage != nullptr); + return pPage; + } + + uno::Reference getShape(int nShape, + uno::Reference const& xPage) + { + uno::Reference xShape(xPage->getByIndex(nShape), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Failed to load shape", xShape.is()); + return xShape; + } + + uno::Reference + getParagraphFromShape(int nPara, uno::Reference const& xShape) + { + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is()); + + uno::Reference paraEnumAccess(xText, uno::UNO_QUERY); + uno::Reference paraEnum(paraEnumAccess->createEnumeration()); + + for (int i = 0; i < nPara; ++i) + paraEnum->nextElement(); + + uno::Reference xParagraph(paraEnum->nextElement(), uno::UNO_QUERY_THROW); + + return xParagraph; + } + + uno::Reference + getRunFromParagraph(int nRun, uno::Reference const& xParagraph) + { + uno::Reference runEnumAccess(xParagraph, uno::UNO_QUERY); + uno::Reference runEnum = runEnumAccess->createEnumeration(); + + for (int i = 0; i < nRun; ++i) + runEnum->nextElement(); + + uno::Reference xRun(runEnum->nextElement(), uno::UNO_QUERY); + + return xRun; + } + + uno::Reference getTextFieldFromPage(int nRun, int nPara, int nShape, + int nPage) + { + // get TextShape 1 from the first page + uno::Reference xShape(getShapeFromPage(nShape, nPage)); + + // Get first paragraph + uno::Reference xParagraph(getParagraphFromShape(nPara, xShape)); + + // first chunk of text + uno::Reference xRun(getRunFromParagraph(nRun, xParagraph)); + + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + uno::Reference xField; + xPropSet->getPropertyValue("TextField") >>= xField; + return xField; + } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/tiledrendering/CallbackRecorder.hxx b/sd/qa/unit/tiledrendering/CallbackRecorder.hxx new file mode 100644 index 0000000000..ad64f5ab39 --- /dev/null +++ b/sd/qa/unit/tiledrendering/CallbackRecorder.hxx @@ -0,0 +1,152 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace css; + +namespace +{ +std::vector lcl_convertSeparated(std::u16string_view rString, sal_Unicode nSeparator) +{ + std::vector aRet; + + sal_Int32 nIndex = 0; + do + { + OUString aToken(o3tl::trim(o3tl::getToken(rString, 0, nSeparator, nIndex))); + if (!aToken.isEmpty()) + aRet.push_back(aToken); + } while (nIndex >= 0); + + return aRet; +} + +void lcl_convertRectangle(std::u16string_view rString, tools::Rectangle& rRectangle) +{ + uno::Sequence aSeq = comphelper::string::convertCommaSeparated(rString); + CPPUNIT_ASSERT(aSeq.getLength() == 4 || aSeq.getLength() == 5); + rRectangle.SetLeft(aSeq[0].toInt32()); + rRectangle.SetTop(aSeq[1].toInt32()); + rRectangle.setWidth(aSeq[2].toInt32()); + rRectangle.setHeight(aSeq[3].toInt32()); +} +} + +struct CallbackRecorder +{ + CallbackRecorder() + : m_bFound(true) + , m_nPart(0) + , m_nSelectionBeforeSearchResult(0) + , m_nSelectionAfterSearchResult(0) + , m_nSearchResultCount(0) + , m_callbackWrapper(&callback, this) + { + } + + tools::Rectangle m_aInvalidation; + std::vector<::tools::Rectangle> m_aSelection; + bool m_bFound; + sal_Int32 m_nPart; + std::vector m_aSearchResultSelection; + std::vector m_aSearchResultPart; + int m_nSelectionBeforeSearchResult; + int m_nSelectionAfterSearchResult; + int m_nSearchResultCount; + /// For document size changed callback. + osl::Condition m_aDocumentSizeCondition; + TestLokCallbackWrapper m_callbackWrapper; + + static void callback(int nType, const char* pPayload, void* pData) + { + static_cast(pData)->processCallback(nType, pPayload); + } + + void processCallback(int nType, const char* pPayload) + { + switch (nType) + { + case LOK_CALLBACK_INVALIDATE_TILES: + { + OUString aPayload = OUString::createFromAscii(pPayload); + if (aPayload != "EMPTY" && m_aInvalidation.IsEmpty()) + lcl_convertRectangle(aPayload, m_aInvalidation); + } + break; + case LOK_CALLBACK_TEXT_SELECTION: + { + OUString aPayload = OUString::createFromAscii(pPayload); + m_aSelection.clear(); + for (const OUString& rString : lcl_convertSeparated(aPayload, u';')) + { + ::tools::Rectangle aRectangle; + lcl_convertRectangle(rString, aRectangle); + m_aSelection.push_back(aRectangle); + } + if (m_aSearchResultSelection.empty()) + ++m_nSelectionBeforeSearchResult; + else + ++m_nSelectionAfterSearchResult; + } + break; + case LOK_CALLBACK_SEARCH_NOT_FOUND: + { + m_bFound = false; + } + break; + case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED: + { + m_aDocumentSizeCondition.set(); + } + break; + case LOK_CALLBACK_SET_PART: + { + OUString aPayload = OUString::createFromAscii(pPayload); + m_nPart = aPayload.toInt32(); + } + break; + case LOK_CALLBACK_SEARCH_RESULT_SELECTION: + { + m_nSearchResultCount++; + m_aSearchResultSelection.clear(); + m_aSearchResultPart.clear(); + boost::property_tree::ptree aTree; + std::stringstream aStream(pPayload); + boost::property_tree::read_json(aStream, aTree); + for (const boost::property_tree::ptree::value_type& rValue : + aTree.get_child("searchResultSelection")) + { + m_aSearchResultSelection.emplace_back( + rValue.second.get("rectangles").c_str()); + m_aSearchResultPart.push_back( + std::atoi(rValue.second.get("part").c_str())); + } + } + break; + } + } + + void registerCallbacksFor(SfxViewShell& rViewShell) + { + rViewShell.setLibreOfficeKitViewCallback(&m_callbackWrapper); + } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/tiledrendering/LOKitSearchTest.cxx b/sd/qa/unit/tiledrendering/LOKitSearchTest.cxx new file mode 100644 index 0000000000..35b32640b5 --- /dev/null +++ b/sd/qa/unit/tiledrendering/LOKitSearchTest.cxx @@ -0,0 +1,948 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "CallbackRecorder.hxx" +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace css; + +class LOKitSearchTest : public UnoApiTest +{ +public: + LOKitSearchTest() + : UnoApiTest("/sd/qa/unit/tiledrendering/data/") + { + } + + virtual void setUp() override; + virtual void tearDown() override; + + void testSearch(); + void testSearchAll(); + void testSearchAllSelections(); + void testSearchAllNotifications(); + void testSearchAllFollowedBySearch(); + void testDontSearchInMasterPages(); + void testSearchInPDFNonExisting(); + void testSearchInPDF(); + void testSearchInPDFOnePDFObject(); + void testSearchInPDFInMultiplePages(); + void testSearchInPDFInMultiplePagesBackwards(); + void testSearchIn2MixedObjects(); + void testSearchIn6MixedObjects(); + void testReplace(); + void testReplaceAll(); + void testReplaceCombined(); + + CPPUNIT_TEST_SUITE(LOKitSearchTest); + CPPUNIT_TEST(testSearch); + CPPUNIT_TEST(testSearchAll); + CPPUNIT_TEST(testSearchAllSelections); + CPPUNIT_TEST(testSearchAllNotifications); + CPPUNIT_TEST(testSearchAllFollowedBySearch); + CPPUNIT_TEST(testDontSearchInMasterPages); + CPPUNIT_TEST(testSearchInPDFNonExisting); + CPPUNIT_TEST(testSearchInPDF); + CPPUNIT_TEST(testSearchInPDFOnePDFObject); + CPPUNIT_TEST(testSearchInPDFInMultiplePages); + CPPUNIT_TEST(testSearchInPDFInMultiplePagesBackwards); + CPPUNIT_TEST(testSearchIn2MixedObjects); + CPPUNIT_TEST(testSearchIn6MixedObjects); + CPPUNIT_TEST(testReplace); + CPPUNIT_TEST(testReplaceAll); + CPPUNIT_TEST(testReplaceCombined); + CPPUNIT_TEST_SUITE_END(); + +private: + SdXImpressDocument* createDoc(const char* pName, + const uno::Sequence& rArguments + = uno::Sequence()); + void lcl_search(const OUString& rKey, bool bFindAll = false, bool bBackwards = false); + void lcl_replace(const OUString& rKey, const OUString& rReplace, bool bAll = false); + + std::unique_ptr mpCallbackRecorder; +}; + +void LOKitSearchTest::setUp() +{ + UnoApiTest::setUp(); + + // prevent showing warning message box + setenv("OOX_NO_SMARTART_WARNING", "1", 1); + comphelper::LibreOfficeKit::setActive(true); + + mpCallbackRecorder = std::make_unique(); +} + +void LOKitSearchTest::tearDown() +{ + if (mxComponent.is()) + { + mxComponent->dispose(); + mxComponent.clear(); + } + + comphelper::LibreOfficeKit::setActive(false); + + UnoApiTest::tearDown(); +} + +SdXImpressDocument* +LOKitSearchTest::createDoc(const char* pName, const uno::Sequence& rArguments) +{ + loadFromFile(OUString::createFromAscii(pName)); + SdXImpressDocument* pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + pImpressDocument->initializeForTiledRendering(rArguments); + return pImpressDocument; +} + +void LOKitSearchTest::lcl_search(const OUString& rKey, bool bFindAll, bool bBackwards) +{ + Scheduler::ProcessEventsToIdle(); + SvxSearchCmd eSearch = bFindAll ? SvxSearchCmd::FIND_ALL : SvxSearchCmd::FIND; + + uno::Sequence aPropertyValues(comphelper::InitPropertySequence({ + { "SearchItem.SearchString", uno::Any(rKey) }, + { "SearchItem.Backward", uno::Any(bBackwards) }, + { "SearchItem.Command", uno::Any(sal_uInt16(eSearch)) }, + })); + + dispatchCommand(mxComponent, ".uno:ExecuteSearch", aPropertyValues); +} + +void LOKitSearchTest::lcl_replace(const OUString& rKey, const OUString& rReplace, bool bAll) +{ + Scheduler::ProcessEventsToIdle(); + + SvxSearchCmd eSearch = bAll ? SvxSearchCmd::REPLACE_ALL : SvxSearchCmd::REPLACE; + + uno::Sequence aPropertyValues(comphelper::InitPropertySequence({ + { "SearchItem.SearchString", uno::Any(rKey) }, + { "SearchItem.ReplaceString", uno::Any(rReplace) }, + { "SearchItem.Command", uno::Any(sal_uInt16(eSearch)) }, + })); + + dispatchCommand(mxComponent, ".uno:ExecuteSearch", aPropertyValues); +} + +namespace +{ +SdrObject* lclGetSelectedObject(sd::ViewShell* pViewShell) +{ + SdrView* pSdrView = pViewShell->GetView(); + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rMarkList.GetMarkCount()); + SdrObject* pObject = rMarkList.GetMark(0)->GetMarkedSdrObj(); + return pObject; +} + +} // end anonymous namespace + +void LOKitSearchTest::testSearch() +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + uno::Reference xDrawPage( + pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + xShape->setString("Aaa bbb."); + + lcl_search("bbb"); + + SdrView* pView = pViewShell->GetView(); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + // Did we indeed manage to select the second word? + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), rEditView.GetSelected()); + + // Did the selection callback fire? + CPPUNIT_ASSERT_EQUAL(static_cast(1), mpCallbackRecorder->m_aSelection.size()); + + // Search for something on the second slide, and make sure that the set-part callback fired. + lcl_search("bbb"); + CPPUNIT_ASSERT_EQUAL(static_cast(1), mpCallbackRecorder->m_nPart); + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + // This was 0; should be 1 match for "find". + CPPUNIT_ASSERT_EQUAL(static_cast(1), + mpCallbackRecorder->m_aSearchResultSelection.size()); + // Result is on the second slide. + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]); + + // This should trigger the not-found callback. + lcl_search("ccc"); + CPPUNIT_ASSERT_EQUAL(false, mpCallbackRecorder->m_bFound); +} + +void LOKitSearchTest::testSearchAll() +{ + SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + lcl_search("match", /*bFindAll=*/true); + + // This was empty: find-all did not highlight the first match. + CPPUNIT_ASSERT_EQUAL("match"_ostr, + apitest::helper::transferable::getTextSelection( + pXImpressDocument->getSelection(), "text/plain;charset=utf-8"_ostr)); + + // We're on the first slide, search for something on the second slide and make sure we get a SET_PART. + mpCallbackRecorder->m_nPart = 0; + lcl_search("second", /*bFindAll=*/true); + // This was 0: no SET_PART was emitted. + CPPUNIT_ASSERT_EQUAL(static_cast(1), mpCallbackRecorder->m_nPart); +} + +void LOKitSearchTest::testSearchAllSelections() +{ + SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + lcl_search("third", /*bFindAll=*/true); + // Make sure this is found on the 3rd slide. + CPPUNIT_ASSERT_EQUAL(static_cast(2), mpCallbackRecorder->m_nPart); + // This was 1: only the first match was highlighted. + CPPUNIT_ASSERT_EQUAL(static_cast(2), mpCallbackRecorder->m_aSelection.size()); +} + +void LOKitSearchTest::testSearchAllNotifications() +{ + SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + lcl_search("third", /*bFindAll=*/true); + // Make sure that we get no notifications about selection changes during search. + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_nSelectionBeforeSearchResult); + // But we do get the selection of the first hit. + CPPUNIT_ASSERT(mpCallbackRecorder->m_nSelectionAfterSearchResult > 0); +} + +void LOKitSearchTest::testSearchAllFollowedBySearch() +{ + SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + lcl_search("third", /*bFindAll=*/true); + lcl_search("match" /*,bFindAll=false*/); + + // This used to give wrong result: 'search' after 'search all' still + // returned 'third' + CPPUNIT_ASSERT_EQUAL("match"_ostr, + apitest::helper::transferable::getTextSelection( + pXImpressDocument->getSelection(), "text/plain;charset=utf-8"_ostr)); +} + +void LOKitSearchTest::testDontSearchInMasterPages() +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + // This should trigger the not-found callback ("date" is present only on + // the master page) + lcl_search("date"); + CPPUNIT_ASSERT_EQUAL(false, mpCallbackRecorder->m_bFound); +} + +void LOKitSearchTest::testSearchInPDFNonExisting() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + + lcl_search("NonExisting"); + + CPPUNIT_ASSERT_EQUAL(false, mpCallbackRecorder->m_bFound); +} + +void LOKitSearchTest::testSearchInPDF() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + + // Search + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL("3763, 1331, 1432, 483"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(3763, 1331), Size(1433, 484)), + mpCallbackRecorder->m_aSelection[0]); + + // Search again - same result + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL("3763, 1331, 1432, 483"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(3763, 1331), Size(1433, 484)), + mpCallbackRecorder->m_aSelection[0]); +} + +void LOKitSearchTest::testSearchInPDFOnePDFObject() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("OnePDFObject.odg"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + + // Search down + lcl_search("ABC", false, false); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount); + + // Search up + lcl_search("ABC", false, true); // This caused a crash + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount); +} + +void LOKitSearchTest::testSearchInPDFInMultiplePages() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + { + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + } + + // Search for "him" + lcl_search("him"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("9463, 3382, 1099, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" + lcl_search("him"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("5592, 5038, 1100, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" + lcl_search("him"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("9463, 1308, 1099, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" + lcl_search("him"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(4, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("5592, 2964, 1100, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" - back to start + lcl_search("him"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(5, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("9463, 3382, 1099, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); +} + +void LOKitSearchTest::testSearchInPDFInMultiplePagesBackwards() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + { + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + } + + // Expected for backwards search is: + // - Start with Page 1 + // + search backwards through objects + // + inside objects search backwards through text + // - Switch to Page 2 + // + search backwards through objects + // + inside objects search backwards through text + + // Search for "him" + lcl_search("him", /*FindAll*/ false, /*Backwards*/ true); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("5592, 5038, 1100, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" + lcl_search("him", /*FindAll*/ false, /*Backwards*/ true); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("9463, 3382, 1099, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" + lcl_search("him", /*FindAll*/ false, /*Backwards*/ true); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("5592, 2964, 1100, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" + lcl_search("him", /*FindAll*/ false, /*Backwards*/ true); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(4, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("9463, 1308, 1099, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search for "him" - back to start + lcl_search("him", /*FindAll*/ false, /*Backwards*/ true); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(5, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]); + CPPUNIT_ASSERT_EQUAL("5592, 5038, 1100, 499"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); +} + +// Test searching in document with mixed objects. +// We have 2 objects: 1. Text Object, 2. Graphic Object with PDF +void LOKitSearchTest::testSearchIn2MixedObjects() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("MixedTest1.odg"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + SdDrawDocument* pDocument = pXImpressDocument->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDocument); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + // Check we have one page + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pDocument->GetSdPageCount(PageKind::Standard)); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + // Check page has 2 objects only + CPPUNIT_ASSERT_EQUAL(size_t(2), pPage->GetObjCount()); + + // Check Object 1 + { + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pObject->GetObjIdentifier()); + } + + // Check Object 2 + { + SdrObject* pObject = pPage->GetObj(1); + CPPUNIT_ASSERT(pObject); + + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier()); + + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + + Graphic aGraphic = pGraphicObject->GetGraphic(); + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + } + + // Let's try to search now + + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL("3546, 3174, 738, 402"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search next + + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL("8412, 6385, 519, 174"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); + + // Search next again - we should get the first object again + + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + + CPPUNIT_ASSERT_EQUAL("3546, 3174, 738, 402"_ostr, + mpCallbackRecorder->m_aSearchResultSelection[0]); +} + +// Test searching in document with mixed objects. We have 6 objects. +void LOKitSearchTest::testSearchIn6MixedObjects() +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + SdXImpressDocument* pXImpressDocument = createDoc("MixedTest2.odg"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + SdDrawDocument* pDocument = pXImpressDocument->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDocument); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + // Check we have one page + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pDocument->GetSdPageCount(PageKind::Standard)); + + SdPage* pPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT(pPage); + + // Check page has 6 objects only + CPPUNIT_ASSERT_EQUAL(size_t(6), pPage->GetObjCount()); + + // Check we have the right objects that we expect + + // Check Object 1 + { + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pObject->GetObjIdentifier()); + } + + // Check Object 2 + { + SdrObject* pObject = pPage->GetObj(1); + CPPUNIT_ASSERT(pObject); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier()); + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + } + + // Check Object 3 + { + SdrObject* pObject = pPage->GetObj(2); + CPPUNIT_ASSERT(pObject); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::CustomShape, pObject->GetObjIdentifier()); + } + + // Check Object 4 + { + SdrObject* pObject = pPage->GetObj(3); + CPPUNIT_ASSERT(pObject); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::CustomShape, pObject->GetObjIdentifier()); + } + + // Check Object 5 + { + SdrObject* pObject = pPage->GetObj(4); + CPPUNIT_ASSERT(pObject); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier()); + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Svg, pVectorGraphicData->getType()); + } + + // Check Object 6 + { + SdrObject* pObject = pPage->GetObj(5); + CPPUNIT_ASSERT(pObject); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier()); + SdrGrafObj* pGraphicObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pGraphicObject); + auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + } + + // Search "ABC" which is in all objects (2 times in Object 3) + + // Object 1 + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(0), lclGetSelectedObject(pViewShell)); + + // Object 2 + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(1), lclGetSelectedObject(pViewShell)); + + // Object 3 + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(2), lclGetSelectedObject(pViewShell)); + + // Object 3 again + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(4, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(2), lclGetSelectedObject(pViewShell)); + + // Object 4 + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(5, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(3), lclGetSelectedObject(pViewShell)); + + // Object 5 + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(6, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(4), lclGetSelectedObject(pViewShell)); + + // Object 6 + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(7, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(5), lclGetSelectedObject(pViewShell)); + + // Loop to Object 1 again + lcl_search("ABC"); + + CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound); + CPPUNIT_ASSERT_EQUAL(8, mpCallbackRecorder->m_nSearchResultCount); + + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size()); + CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size()); + CPPUNIT_ASSERT_EQUAL(pPage->GetObj(0), lclGetSelectedObject(pViewShell)); +} +namespace +{ +OUString getShapeText(SdXImpressDocument* pXImpressDocument, sal_uInt32 nPage, sal_uInt32 nShape) +{ + uno::Reference xDrawPage; + xDrawPage.set(pXImpressDocument->getDrawPages()->getByIndex(nPage), uno::UNO_QUERY); + + uno::Reference xShape(xDrawPage->getByIndex(nShape), uno::UNO_QUERY); + return xShape->getString(); +} +} + +void LOKitSearchTest::testReplace() +{ + SdXImpressDocument* pXImpressDocument = createDoc("ReplaceTest.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0)); + + lcl_replace("bbb", "aaa", false); // select + + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0)); + + lcl_replace("bbb", "aaa", false); // replace + + CPPUNIT_ASSERT_EQUAL(OUString("aaa"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0)); +} + +void LOKitSearchTest::testReplaceAll() +{ + SdXImpressDocument* pXImpressDocument = createDoc("ReplaceTest.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0)); + + lcl_replace("bbb", "ccc", true); + + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc ccc ccc ccc"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 4, 0)); + + lcl_replace("ccc", "bbb", true); + + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0)); +} + +void LOKitSearchTest::testReplaceCombined() +{ + SdXImpressDocument* pXImpressDocument = createDoc("ReplaceTest.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase()); + + lcl_replace("bbb", "aaa", false); // select + lcl_replace("bbb", "aaa", false); // replace + + CPPUNIT_ASSERT_EQUAL(OUString("aaa"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0)); + + lcl_replace("bbb", "ccc", true); + + CPPUNIT_ASSERT_EQUAL(OUString("aaa"), getShapeText(pXImpressDocument, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc ccc ccc ccc"), getShapeText(pXImpressDocument, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 3, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 4, 0)); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(LOKitSearchTest); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/tiledrendering/data/2slides.odp b/sd/qa/unit/tiledrendering/data/2slides.odp new file mode 100644 index 0000000000..baa42ba9fc Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/2slides.odp differ diff --git a/sd/qa/unit/tiledrendering/data/MixedTest1.odg b/sd/qa/unit/tiledrendering/data/MixedTest1.odg new file mode 100644 index 0000000000..db952318c7 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/MixedTest1.odg differ diff --git a/sd/qa/unit/tiledrendering/data/MixedTest2.odg b/sd/qa/unit/tiledrendering/data/MixedTest2.odg new file mode 100644 index 0000000000..2709707c1b Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/MixedTest2.odg differ diff --git a/sd/qa/unit/tiledrendering/data/OnePDFObject.odg b/sd/qa/unit/tiledrendering/data/OnePDFObject.odg new file mode 100644 index 0000000000..225741c7b5 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/OnePDFObject.odg differ diff --git a/sd/qa/unit/tiledrendering/data/PDFSearch.pdf b/sd/qa/unit/tiledrendering/data/PDFSearch.pdf new file mode 100644 index 0000000000..ea8a0919a4 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/PDFSearch.pdf differ diff --git a/sd/qa/unit/tiledrendering/data/ReplaceTest.odp b/sd/qa/unit/tiledrendering/data/ReplaceTest.odp new file mode 100644 index 0000000000..9b0fc61aaf Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/ReplaceTest.odp differ diff --git a/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg new file mode 100644 index 0000000000..aa1a37b831 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg differ diff --git a/sd/qa/unit/tiledrendering/data/cut_selection_change.odp b/sd/qa/unit/tiledrendering/data/cut_selection_change.odp new file mode 100644 index 0000000000..19d3a18480 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/cut_selection_change.odp differ diff --git a/sd/qa/unit/tiledrendering/data/dummy.odg b/sd/qa/unit/tiledrendering/data/dummy.odg new file mode 100644 index 0000000000..19ae49d63b Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/dummy.odg differ diff --git a/sd/qa/unit/tiledrendering/data/dummy.odp b/sd/qa/unit/tiledrendering/data/dummy.odp new file mode 100644 index 0000000000..83dee413c5 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/dummy.odp differ diff --git a/sd/qa/unit/tiledrendering/data/duplicate-undo.odp b/sd/qa/unit/tiledrendering/data/duplicate-undo.odp new file mode 100644 index 0000000000..f66c9f6081 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/duplicate-undo.odp differ diff --git a/sd/qa/unit/tiledrendering/data/insert-delete.odp b/sd/qa/unit/tiledrendering/data/insert-delete.odp new file mode 100644 index 0000000000..e388fb60b6 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/insert-delete.odp differ diff --git a/sd/qa/unit/tiledrendering/data/language-all-text.odp b/sd/qa/unit/tiledrendering/data/language-all-text.odp new file mode 100644 index 0000000000..a484a6310e Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/language-all-text.odp differ diff --git a/sd/qa/unit/tiledrendering/data/notes-view.odp b/sd/qa/unit/tiledrendering/data/notes-view.odp new file mode 100644 index 0000000000..d41bdf9599 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/notes-view.odp differ diff --git a/sd/qa/unit/tiledrendering/data/paste-undo.fodp b/sd/qa/unit/tiledrendering/data/paste-undo.fodp new file mode 100644 index 0000000000..2615d1e114 --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/paste-undo.fodp @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + world + + + + + + diff --git a/sd/qa/unit/tiledrendering/data/paste_text_onslide.odp b/sd/qa/unit/tiledrendering/data/paste_text_onslide.odp new file mode 100644 index 0000000000..c33b7c1102 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/paste_text_onslide.odp differ diff --git a/sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx b/sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx new file mode 100644 index 0000000000..97635a5187 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx differ diff --git a/sd/qa/unit/tiledrendering/data/search-all.odp b/sd/qa/unit/tiledrendering/data/search-all.odp new file mode 100644 index 0000000000..46ddaf412b Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/search-all.odp differ diff --git a/sd/qa/unit/tiledrendering/data/shape.odp b/sd/qa/unit/tiledrendering/data/shape.odp new file mode 100644 index 0000000000..b1ffa54e36 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/shape.odp differ diff --git a/sd/qa/unit/tiledrendering/data/table-column.odp b/sd/qa/unit/tiledrendering/data/table-column.odp new file mode 100644 index 0000000000..d2c274e888 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/table-column.odp differ diff --git a/sd/qa/unit/tiledrendering/data/table.odp b/sd/qa/unit/tiledrendering/data/table.odp new file mode 100644 index 0000000000..6d92898a00 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/table.odp differ diff --git a/sd/qa/unit/tiledrendering/data/tdf102223.odp b/sd/qa/unit/tiledrendering/data/tdf102223.odp new file mode 100644 index 0000000000..6b8570f070 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf102223.odp differ diff --git a/sd/qa/unit/tiledrendering/data/tdf103083.fodp b/sd/qa/unit/tiledrendering/data/tdf103083.fodp new file mode 100644 index 0000000000..8de5e37b8f --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/tdf103083.fodp @@ -0,0 +1,932 @@ + + + + + 2016-10-03T11:33:02.159552013 + PT21M51S + 2 + LibreOfficeDev/5.3.0.0.alpha0$Linux_X86_64 LibreOffice_project/36b8fd83a57132f486d918e5ab39a6e8898bb630 + 2016-10-03T11:33:43.592997719 + + + -275 + -1323 + 28053 + 19616 + + + view1 + false + false + true + true + true + true + false + false + true + 1500 + false + //////////////////////////////////////////8= + //////////////////////////////////////////8= + + false + true + V2278V23104H18449H578V627V24757H4049H2466H17561 + true + 0 + 0 + false + true + false + 4 + 0 + -275 + -1323 + 28057 + 19620 + 2540 + 2540 + 254 + 254 + 254 + 1 + 254 + 1 + false + 1500 + true + true + + + + + true + $(inst)/share/palette%3B$(user)/config/standard.sob + 0 + $(inst)/share/palette%3B$(user)/config/standard.soc + $(inst)/share/palette%3B$(user)/config/standard.sod + 1270 + false + + + de + DE + + + + + + en + US + + + + + + en + GB + + + + + + en + ZA + + + + + + $(inst)/share/palette%3B$(user)/config/standard.sog + true + $(inst)/share/palette%3B$(user)/config/standard.soh + false + false + true + true + false + true + false + false + true + false + false + false + false + false + $(inst)/share/palette%3B$(user)/config/standard.soe + false + 4 + false + 0 + low-resolution + + + false + 6 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> <number> <number> + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> <number> <number> + + + + + + + + + + + + How to reproduce + + + + + + + This is the 1st level + + + + + + + These are the 4 bullet points we are focussing on + + + + + + + + + They have all the same formatting + + + + + + + + + Simply cut (CTRL+X) and paste (CTRL+V) a line + + + And see what happens. But bullet point changes format + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/tiledrendering/data/tdf104405.fodp b/sd/qa/unit/tiledrendering/data/tdf104405.fodp new file mode 100644 index 0000000000..d902f177d5 --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/tdf104405.fodp @@ -0,0 +1,822 @@ + + + + 2016-11-16T15:27:08.2227083542016-11-16T15:30:23.342583235PT3M18S1LibreOfficeDev/5.3.0.0.alpha1$Linux_X86_64 LibreOffice_project/f0c20dc458d8fe9e86b323c8c24df2f3d31610ad + + + 0 + 0 + 14099 + 9999 + + + view1 + false + false + true + true + true + true + false + false + true + 1500 + false + //////////////////////////////////////////8= + //////////////////////////////////////////8= + + false + true + false + 0 + 0 + false + true + true + 4 + 0 + -310 + -2139 + 32314 + 21646 + 2000 + 2000 + 200 + 200 + 200 + 1 + 200 + 1 + false + 1500 + true + false + + + + + true + $(inst)/share/palette%3B$(user)/config/standard.sob + 0 + $(inst)/share/palette%3B$(user)/config/standard.soc + $(inst)/share/palette%3B$(user)/config/standard.sod + 1250 + false + + + en + ZA + + + + + + $(inst)/share/palette%3B$(user)/config/standard.sog + true + $(inst)/share/palette%3B$(user)/config/standard.soh + false + false + true + true + false + true + false + false + true + false + false + false + false + false + $(inst)/share/palette%3B$(user)/config/standard.soe + false + 4 + false + 0 + low-resolution + + + false + 6 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + + <number> + + + + + + + + + + + + + + + + + + + + + + + + aaa + + + aa + + + aaaa + + + aaaaa + + + aaaa + + + + + aaa + + + aaa + + + aaa + + + aaa + + + aaaaaa + + + + + aaa + + + aaaaa + + + aaa + + + aaaa + + + aaaaaa + + + + + aaa + + + aaaaaa + + + aaa + + + aaa + + + aaa + + + + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAAEElEQVR4nGJgAQAAAP//AwAA + BgAFV7+r1AAAAABJRU5ErkJggg== + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sd/qa/unit/tiledrendering/data/tdf105502.odp b/sd/qa/unit/tiledrendering/data/tdf105502.odp new file mode 100644 index 0000000000..2150f1152b Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf105502.odp differ diff --git a/sd/qa/unit/tiledrendering/data/tdf115783.fodp b/sd/qa/unit/tiledrendering/data/tdf115783.fodp new file mode 100644 index 0000000000..d9ada63ad1 --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/tdf115783.fodp @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + before + + + hello + + + after + + + + + + + + diff --git a/sd/qa/unit/tiledrendering/data/tdf115873-group.fodp b/sd/qa/unit/tiledrendering/data/tdf115873-group.fodp new file mode 100644 index 0000000000..603ec4c7e5 --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/tdf115873-group.fodp @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/tiledrendering/data/tdf115873.fodp b/sd/qa/unit/tiledrendering/data/tdf115873.fodp new file mode 100644 index 0000000000..1633a04714 --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/tdf115873.fodp @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sd/qa/unit/tiledrendering/data/tdf118354.odp b/sd/qa/unit/tiledrendering/data/tdf118354.odp new file mode 100644 index 0000000000..beb132c7e3 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf118354.odp differ diff --git a/sd/qa/unit/tiledrendering/data/tdf81754.pptx b/sd/qa/unit/tiledrendering/data/tdf81754.pptx new file mode 100644 index 0000000000..8a1fa1dcfd Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/tdf81754.pptx differ diff --git a/sd/qa/unit/tiledrendering/data/title-shape.odp b/sd/qa/unit/tiledrendering/data/title-shape.odp new file mode 100644 index 0000000000..15d39d68e1 Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/title-shape.odp differ diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx new file mode 100644 index 0000000000..31d61c1fb1 --- /dev/null +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -0,0 +1,2947 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace css; + +static std::ostream& operator<<(std::ostream& os, ViewShellId id) +{ + os << static_cast(id); + return os; +} + +class SdTiledRenderingTest : public UnoApiXmlTest +{ +public: + SdTiledRenderingTest(); + virtual void setUp() override; + virtual void tearDown() override; + +protected: + SdXImpressDocument* createDoc(const char* pName, const uno::Sequence& rArguments = uno::Sequence()); + void setupLibreOfficeKitViewCallback(SfxViewShell& pViewShell); + static void callback(int nType, const char* pPayload, void* pData); + void callbackImpl(int nType, const char* pPayload); + xmlDocUniquePtr parseXmlDump(); + + ::tools::Rectangle m_aInvalidation; + std::vector<::tools::Rectangle> m_aSelection; + bool m_bFound; + sal_Int32 m_nPart; + std::vector m_aSearchResultSelection; + std::vector m_aSearchResultPart; + int m_nSelectionBeforeSearchResult; + int m_nSelectionAfterSearchResult; + + /// For document size changed callback. + osl::Condition m_aDocumentSizeCondition; + xmlBufferPtr m_pXmlBuffer; + TestLokCallbackWrapper m_callbackWrapper; +}; + +SdTiledRenderingTest::SdTiledRenderingTest() + : UnoApiXmlTest("/sd/qa/unit/tiledrendering/data/"), + m_bFound(true), + m_nPart(0), + m_nSelectionBeforeSearchResult(0), + m_nSelectionAfterSearchResult(0), + m_pXmlBuffer(nullptr), + m_callbackWrapper(&callback, this) +{ +} + +void SdTiledRenderingTest::setUp() +{ + UnoApiXmlTest::setUp(); + + // prevent showing warning message box + setenv("OOX_NO_SMARTART_WARNING", "1", 1); + comphelper::LibreOfficeKit::setActive(true); +} + +void SdTiledRenderingTest::tearDown() +{ + if (mxComponent.is()) + { + mxComponent->dispose(); + mxComponent.clear(); + } + + if (m_pXmlBuffer) + xmlBufferFree(m_pXmlBuffer); + + m_callbackWrapper.clear(); + comphelper::LibreOfficeKit::setActive(false); + + UnoApiXmlTest::tearDown(); +} + +SdXImpressDocument* SdTiledRenderingTest::createDoc(const char* pName, const uno::Sequence& rArguments) +{ + loadFromFile(OUString::createFromAscii(pName)); + SdXImpressDocument* pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + pImpressDocument->initializeForTiledRendering(rArguments); + return pImpressDocument; +} + +void SdTiledRenderingTest::setupLibreOfficeKitViewCallback(SfxViewShell& pViewShell) +{ + pViewShell.setLibreOfficeKitViewCallback(&m_callbackWrapper); + m_callbackWrapper.setLOKViewId(SfxLokHelper::getView(&pViewShell)); +} + +void SdTiledRenderingTest::callback(int nType, const char* pPayload, void* pData) +{ + static_cast(pData)->callbackImpl(nType, pPayload); +} + +namespace +{ + +std::vector lcl_convertSeparated(std::u16string_view rString, sal_Unicode nSeparator) +{ + std::vector aRet; + + sal_Int32 nIndex = 0; + do + { + OUString aToken( o3tl::trim(o3tl::getToken(rString, 0, nSeparator, nIndex)) ); + if (!aToken.isEmpty()) + aRet.push_back(aToken); + } + while (nIndex >= 0); + + return aRet; +} + +void lcl_convertRectangle(std::u16string_view rString, ::tools::Rectangle& rRectangle) +{ + uno::Sequence aSeq = comphelper::string::convertCommaSeparated(rString); + CPPUNIT_ASSERT(aSeq.getLength() == 4 || aSeq.getLength() == 5); + rRectangle.SetLeft(aSeq[0].toInt32()); + rRectangle.SetTop(aSeq[1].toInt32()); + rRectangle.setWidth(aSeq[2].toInt32()); + rRectangle.setHeight(aSeq[3].toInt32()); +} + +} // end anonymous namespace + +void SdTiledRenderingTest::callbackImpl(int nType, const char* pPayload) +{ + switch (nType) + { + case LOK_CALLBACK_INVALIDATE_TILES: + { + OUString aPayload = OUString::createFromAscii(pPayload); + if (aPayload != "EMPTY" && m_aInvalidation.IsEmpty()) + lcl_convertRectangle(aPayload, m_aInvalidation); + } + break; + case LOK_CALLBACK_TEXT_SELECTION: + { + OUString aPayload = OUString::createFromAscii(pPayload); + m_aSelection.clear(); + for (const OUString& rString : lcl_convertSeparated(aPayload, u';')) + { + ::tools::Rectangle aRectangle; + lcl_convertRectangle(rString, aRectangle); + m_aSelection.push_back(aRectangle); + } + if (m_aSearchResultSelection.empty()) + ++m_nSelectionBeforeSearchResult; + else + ++m_nSelectionAfterSearchResult; + } + break; + case LOK_CALLBACK_SEARCH_NOT_FOUND: + { + m_bFound = false; + } + break; + case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED: + { + m_aDocumentSizeCondition.set(); + } + break; + case LOK_CALLBACK_SET_PART: + { + OUString aPayload = OUString::createFromAscii(pPayload); + m_nPart = aPayload.toInt32(); + } + break; + case LOK_CALLBACK_SEARCH_RESULT_SELECTION: + { + m_aSearchResultSelection.clear(); + m_aSearchResultPart.clear(); + boost::property_tree::ptree aTree; + std::stringstream aStream(pPayload); + boost::property_tree::read_json(aStream, aTree); + for (const boost::property_tree::ptree::value_type& rValue : aTree.get_child("searchResultSelection")) + { + m_aSearchResultSelection.emplace_back(rValue.second.get("rectangles").c_str()); + m_aSearchResultPart.push_back(std::atoi(rValue.second.get("part").c_str())); + } + } + break; + } +} + +xmlDocUniquePtr SdTiledRenderingTest::parseXmlDump() +{ + if (m_pXmlBuffer) + xmlBufferFree(m_pXmlBuffer); + + // Create the xml writer. + m_pXmlBuffer = xmlBufferCreate(); + xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(m_pXmlBuffer, 0); + (void)xmlTextWriterStartDocument(pXmlWriter, nullptr, nullptr, nullptr); + + // Create the dump. + SdXImpressDocument* pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + pImpressDocument->GetDoc()->dumpAsXml(pXmlWriter); + + // Delete the xml writer. + (void)xmlTextWriterEndDocument(pXmlWriter); + xmlFreeTextWriter(pXmlWriter); + + auto pCharBuffer = xmlBufferContent(m_pXmlBuffer); + SAL_INFO("test", "SdTiledRenderingTest::parseXmlDump: pCharBuffer is '" << pCharBuffer << "'"); + return xmlDocUniquePtr(xmlParseDoc(pCharBuffer)); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCreateDestroy) +{ + createDoc("dummy.odp"); + // Nothing to do, the tearDown call should cleanup. +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCreateView) +{ + createDoc("dummy.odp"); + + SfxLokHelper::createView(); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testRegisterCallback) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + setupLibreOfficeKitViewCallback(pViewShell->GetViewShellBase()); + + // Start text edit of the empty title shape. + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->SdrBeginTextEdit(pObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + + // Check that the top left 256x256px tile would be invalidated. + CPPUNIT_ASSERT(!m_aInvalidation.IsEmpty()); + ::tools::Rectangle aTopLeft(0, 0, 256*15, 256*15); // 1 px = 15 twips, assuming 96 DPI. + CPPUNIT_ASSERT(m_aInvalidation.Overlaps(aTopLeft)); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPostKeyEvent) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject->GetObjIdentifier()); + SdrTextObj* pTextObj = static_cast(pObject); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTextObj, pView->GetSdrPageView()); + SfxStringItem aInputString(SID_ATTR_CHAR, "x"); + pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, + SfxCallMode::SYNCHRON, { &aInputString }); + + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + // Did we manage to enter a second character? + CPPUNIT_ASSERT_EQUAL(static_cast(2), rEditView.GetSelection().nStartPos); + ESelection aWordSelection(0, 0, 0, 2); // start para, start char, end para, end char. + rEditView.SetSelection(aWordSelection); + // Did we enter the expected character? + CPPUNIT_ASSERT_EQUAL(OUString("xx"), rEditView.GetSelected()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPostMouseEvent) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject->GetObjIdentifier()); + SdrTextObj* pTextObj = static_cast(pObject); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTextObj, pView->GetSdrPageView()); + SfxStringItem aInputString(SID_ATTR_CHAR, "x"); + pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, + SfxCallMode::SYNCHRON, { &aInputString }); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + // Did we manage to go after the first character? + CPPUNIT_ASSERT_EQUAL(static_cast(1), rEditView.GetSelection().nStartPos); + + vcl::Cursor* pCursor = rEditView.GetCursor(); + Point aPosition(pCursor->GetPos().getX(), pCursor->GetPos().getY() + pCursor->GetSize().Height() / 2); + aPosition.setX(aPosition.getX() - 1000); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + o3tl::toTwips(aPosition.getX(), o3tl::Length::mm100), o3tl::toTwips(aPosition.getY(), o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + o3tl::toTwips(aPosition.getX(), o3tl::Length::mm100), o3tl::toTwips(aPosition.getY(), o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + // The new cursor position must be before the first word. + CPPUNIT_ASSERT_EQUAL(static_cast(0), rEditView.GetSelection().nStartPos); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSetTextSelection) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + uno::Reference xDrawPage(pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + xShape->setString("Aaa bbb."); + // Create a selection on the second word. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->SdrBeginTextEdit(pObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + ESelection aWordSelection(0, 4, 0, 7); + rEditView.SetSelection(aWordSelection); + // Did we indeed manage to select the second word? + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), rEditView.GetSelected()); + + // Now use setTextSelection() to move the end of the selection 1000 twips right. + vcl::Cursor* pCursor = rEditView.GetCursor(); + Point aEnd = pCursor->GetPos(); + aEnd.setX(aEnd.getX() + 1000); + pXImpressDocument->setTextSelection(LOK_SETTEXTSELECTION_END, aEnd.getX(), aEnd.getY()); + // The new selection must include the ending dot, too -- but not the first word. + CPPUNIT_ASSERT_EQUAL(OUString("bbb."), rEditView.GetSelected()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testGetTextSelection) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + uno::Reference xDrawPage(pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + xShape->setString("Shape"); + // Create a selection on the shape text. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->SdrBeginTextEdit(pObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + ESelection aWordSelection(0, 0, 0, 5); + rEditView.SetSelection(aWordSelection); + // Did we indeed manage to copy the selected text? + CPPUNIT_ASSERT_EQUAL("Shape"_ostr, apitest::helper::transferable::getTextSelection(pXImpressDocument->getSelection(), "text/plain;charset=utf-8"_ostr)); + + // Make sure returned RTF is not empty. + CPPUNIT_ASSERT(!apitest::helper::transferable::getTextSelection(pXImpressDocument->getSelection(), "text/rtf"_ostr).isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSetGraphicSelection) +{ + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + SdrObject* pObject = pPage->GetObj(0); + SdrHdlList handleList(nullptr); + pObject->AddToHdlList(handleList); + // Make sure the rectangle has 8 handles: at each corner and at the center of each edge. + CPPUNIT_ASSERT_EQUAL(static_cast(8), handleList.GetHdlCount()); + // Take the bottom center one. + SdrHdl* pHdl = handleList.GetHdl(6); + CPPUNIT_ASSERT_EQUAL(int(SdrHdlKind::Lower), static_cast(pHdl->GetKind())); + ::tools::Rectangle aShapeBefore = pObject->GetSnapRect(); + // Resize. + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, o3tl::toTwips(pHdl->GetPos().getX(), o3tl::Length::mm100), o3tl::toTwips(pHdl->GetPos().getY(), o3tl::Length::mm100)); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, o3tl::toTwips(pHdl->GetPos().getX(), o3tl::Length::mm100), o3tl::toTwips(pHdl->GetPos().getY() + 1000, o3tl::Length::mm100)); + + // Assert that view shell ID tracking works. + sal_Int32 nView1 = SfxLokHelper::getView(); + SdDrawDocument* pDocument = pXImpressDocument->GetDoc(); + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetUndoActionCount()); + auto pListAction = dynamic_cast(pUndoManager->GetUndoAction()); + CPPUNIT_ASSERT(pListAction); + for (size_t i = 0; i < pListAction->maUndoActions.size(); ++i) + // The second item was -1 here, view shell ID wasn't known. + CPPUNIT_ASSERT_EQUAL(ViewShellId(nView1), pListAction->GetUndoAction(i)->GetViewShellId()); + + ::tools::Rectangle aShapeAfter = pObject->GetSnapRect(); + // Check that a resize happened, but aspect ratio is not kept. + CPPUNIT_ASSERT_EQUAL(aShapeBefore.getOpenWidth(), aShapeAfter.getOpenWidth()); + CPPUNIT_ASSERT(aShapeBefore.getOpenHeight() < aShapeAfter.getOpenHeight()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testUndoShells) +{ + // Load a document and set the page size. + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + uno::Sequence aPropertyValues(comphelper::InitPropertySequence( + { + {"AttributePageSize.Width", uno::Any(static_cast(10000))}, + {"AttributePageSize.Height", uno::Any(static_cast(10000))}, + })); + dispatchCommand(mxComponent, ".uno:AttributePageSize", aPropertyValues); + + // Assert that view shell ID tracking works for SdUndoAction subclasses. + SdDrawDocument* pDocument = pXImpressDocument->GetDoc(); + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetUndoActionCount()); + sal_Int32 nView1 = SfxLokHelper::getView(); + // This was -1, SdUndoGroup did not track what view shell created it. + CPPUNIT_ASSERT_EQUAL(ViewShellId(nView1), pUndoManager->GetUndoAction()->GetViewShellId()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testResetSelection) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + uno::Reference xDrawPage(pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + xShape->setString("Aaa bbb."); + // Create a selection on the second word. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->SdrBeginTextEdit(pObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + ESelection aWordSelection(0, 4, 0, 7); + rEditView.SetSelection(aWordSelection); + // Did we indeed manage to select the second word? + CPPUNIT_ASSERT_EQUAL(OUString("bbb"), rEditView.GetSelected()); + + // Now use resetSelection() to reset the selection. + pXImpressDocument->resetSelection(); + CPPUNIT_ASSERT(!pView->GetTextEditObject()); +} + +namespace +{ + +std::vector getCurrentParts(SdXImpressDocument* pDocument) +{ + int parts = pDocument->getParts(); + std::vector result; + + result.reserve(parts); + for (int i = 0; i < parts; i++) + { + result.push_back(pDocument->getPartName(i)); + } + + return result; +} + +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testInsertDeletePage) +{ + SdXImpressDocument* pXImpressDocument = createDoc("insert-delete.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + setupLibreOfficeKitViewCallback(pViewShell->GetViewShellBase()); + + SdDrawDocument* pDoc = pXImpressDocument->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + std::vector aInserted = + { + "Slide 1", "Slide 2", "Slide 3", "Slide 4", "Slide 5", + "Slide 6", "Slide 7", "Slide 8", "Slide 9", "Slide 10", "Slide 11" + }; + + std::vector aDeleted = + { + "Slide 1" + }; + + // the document has 1 slide + CPPUNIT_ASSERT_EQUAL(static_cast(1), pDoc->GetSdPageCount(PageKind::Standard)); + + uno::Sequence aArgs; + + // Insert slides + m_aDocumentSizeCondition.reset(); + for (unsigned it = 1; it <= 10; it++) + dispatchCommand(mxComponent, ".uno:InsertPage", aArgs); + + osl::Condition::Result aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2)); + CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult); + + // Verify inserted slides + std::vector aPageList(getCurrentParts(pXImpressDocument)); + CPPUNIT_ASSERT_EQUAL(aPageList.size(), aInserted.size()); + + for (auto it1 = aPageList.begin(), it2 = aInserted.begin(); it1 != aPageList.end(); ++it1, ++it2) + { + CPPUNIT_ASSERT_EQUAL(*it1, *it2); + } + + // Delete slides + m_aDocumentSizeCondition.reset(); + for (unsigned it = 1; it <= 10; it++) + dispatchCommand(mxComponent, ".uno:DeletePage", aArgs); + + aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2)); + CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult); + + // Verify deleted slides + aPageList = getCurrentParts(pXImpressDocument); + CPPUNIT_ASSERT_EQUAL(aPageList.size(), aDeleted.size()); + for (auto it1 = aPageList.begin(), it2 = aDeleted.begin(); it1 != aPageList.end(); ++it1, ++it2) + { + CPPUNIT_ASSERT_EQUAL(*it1, *it2); + } + + // Undo deleted slides + m_aDocumentSizeCondition.reset(); + for (unsigned it = 1; it <= 10; it++) + dispatchCommand(mxComponent, ".uno:Undo", aArgs); + + aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2)); + CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult); + + // Verify inserted slides + aPageList = getCurrentParts(pXImpressDocument); + CPPUNIT_ASSERT_EQUAL(aPageList.size(), aInserted.size()); + for (auto it1 = aPageList.begin(), it2 = aInserted.begin(); it1 != aPageList.end(); ++it1, ++it2) + { + CPPUNIT_ASSERT_EQUAL(*it1, *it2); + } + + // Redo deleted slides + m_aDocumentSizeCondition.reset(); + for (unsigned it = 1; it <= 10; it++) + dispatchCommand(mxComponent, ".uno:Redo", aArgs); + + aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2)); + CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult); + + // Verify deleted slides + aPageList = getCurrentParts(pXImpressDocument); + CPPUNIT_ASSERT_EQUAL(aPageList.size(), aDeleted.size()); + for (auto it1 = aPageList.begin(), it2 = aDeleted.begin(); it1 != aPageList.end(); ++it1, ++it2) + { + CPPUNIT_ASSERT_EQUAL(*it1, *it2); + } + + // the document has 1 slide + CPPUNIT_ASSERT_EQUAL(static_cast(1), pDoc->GetSdPageCount(PageKind::Standard)); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testInsertTable) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { + { "Rows", uno::Any(sal_Int32(3)) }, + { "Columns", uno::Any(sal_Int32(5)) } + })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + // get the table + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(1); + CPPUNIT_ASSERT(pObject); + + // check that the table is not in the top left corner + Point aPos(pObject->GetRelativePos()); + + CPPUNIT_ASSERT(aPos.X() != 0); + CPPUNIT_ASSERT(aPos.Y() != 0); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testDeleteTable) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { + { "Rows", uno::Any(sal_Int32(3)) }, + { "Columns", uno::Any(sal_Int32(5)) } + })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pSdrView = pViewShell->GetView(); + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + CPPUNIT_ASSERT(rMarkList.GetMarkCount()); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | awt::Key::A); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_MOD1 | awt::Key::A); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DELETE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_DELETE); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(!rMarkList.GetMarkCount()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPartHash) +{ + SdXImpressDocument* pDoc = createDoc("dummy.odp"); + + int nParts = pDoc->getParts(); + for (int it = 0; it < nParts; it++) + { + CPPUNIT_ASSERT(!pDoc->getPartHash(it).isEmpty()); + } + + // check part that it does not exists + CPPUNIT_ASSERT(pDoc->getPartHash(100).isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testResizeTable) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("table.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + auto pTableObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pTableObject); + + // Select the table by marking it + starting and ending text edit. + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + pView->SdrBeginTextEdit(pObject); + pView->SdrEndTextEdit(); + + // Remember the original row heights. + uno::Reference xTable = pTableObject->getTable(); + uno::Reference xRows = xTable->getRows(); + uno::Reference xRow1(xRows->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nExpectedRow1 = xRow1->getPropertyValue("Size").get(); + uno::Reference xRow2(xRows->getByIndex(1), uno::UNO_QUERY); + sal_Int32 nExpectedRow2 = xRow2->getPropertyValue("Size").get(); + + // Resize the upper row, decrease its height by 1 cm. + Point aInnerRowEdge = pObject->GetSnapRect().Center(); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, o3tl::toTwips(aInnerRowEdge.getX(), o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY(), o3tl::Length::mm100)); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, o3tl::toTwips(aInnerRowEdge.getX(), o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY() - 1000, o3tl::Length::mm100)); + + // Remember the resized row heights. + sal_Int32 nResizedRow1 = xRow1->getPropertyValue("Size").get(); + CPPUNIT_ASSERT(nResizedRow1 < nExpectedRow1); + sal_Int32 nResizedRow2 = xRow2->getPropertyValue("Size").get(); + CPPUNIT_ASSERT_EQUAL(nExpectedRow2, nResizedRow2); + + // Now undo the resize. + pXImpressDocument->GetDocShell()->GetUndoManager()->Undo(); + + // Check the undo result. + sal_Int32 nActualRow1 = xRow1->getPropertyValue("Size").get(); + CPPUNIT_ASSERT_EQUAL(nExpectedRow1, nActualRow1); + sal_Int32 nActualRow2 = xRow2->getPropertyValue("Size").get(); + // Expected was 4000, actual was 4572, i.e. the second row after undo was larger than expected. + CPPUNIT_ASSERT_EQUAL(nExpectedRow2, nActualRow2); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testResizeTableColumn) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("table-column.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + auto pTableObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pTableObject); + + // Select the table by marking it + starting and ending text edit. + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + pView->SdrBeginTextEdit(pObject); + pView->SdrEndTextEdit(); + + // Remember the original cell widths. + xmlDocUniquePtr pXmlDoc = parseXmlDump(); + OString aPrefix = "/SdDrawDocument/SdrModel/maPages/SdPage/SdrPage/SdrObjList/SdrTableObj/SdrTableObjImpl/TableLayouter/columns/"_ostr; + sal_Int32 nExpectedColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size"_ostr).toInt32(); + sal_Int32 nExpectedColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size"_ostr).toInt32(); + pXmlDoc = nullptr; + + // Resize the left column, decrease its width by 1 cm. + Point aInnerRowEdge = pObject->GetSnapRect().Center(); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, o3tl::toTwips(aInnerRowEdge.getX(), o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY(), o3tl::Length::mm100)); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, o3tl::toTwips(aInnerRowEdge.getX() - 1000, o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY(), o3tl::Length::mm100)); + + // Remember the resized column widths. + pXmlDoc = parseXmlDump(); + sal_Int32 nResizedColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size"_ostr).toInt32(); + CPPUNIT_ASSERT(nResizedColumn1 < nExpectedColumn1); + sal_Int32 nResizedColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size"_ostr).toInt32(); + CPPUNIT_ASSERT(nResizedColumn2 > nExpectedColumn2); + pXmlDoc = nullptr; + + // Now undo the resize. + pXImpressDocument->GetDocShell()->GetUndoManager()->Undo(); + + // Check the undo result. + pXmlDoc = parseXmlDump(); + sal_Int32 nActualColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size"_ostr).toInt32(); + // Expected was 7049, actual was 6048, i.e. the first column width after undo was 1cm smaller than expected. + CPPUNIT_ASSERT_EQUAL(nExpectedColumn1, nActualColumn1); + sal_Int32 nActualColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(nExpectedColumn2, nActualColumn2); + pXmlDoc = nullptr; +} + +namespace { + +/// A view callback tracks callbacks invoked on one specific view. +class ViewCallback final +{ + SfxViewShell* mpViewShell; + int mnView; +public: + bool m_bGraphicSelectionInvalidated; + bool m_bGraphicViewSelectionInvalidated; + /// Our current part, to be able to decide if a view cursor/selection is relevant for us. + int m_nPart; + bool m_bCursorVisibleChanged; + bool m_bCursorVisible; + bool m_bViewLock; + bool m_bTilesInvalidated; + std::vector m_aInvalidations; + std::map m_aViewCursorInvalidations; + std::map m_aViewCursorVisibilities; + bool m_bViewSelectionSet; + boost::property_tree::ptree m_aCommentCallbackResult; + OString m_ShapeSelection; + TestLokCallbackWrapper m_callbackWrapper; + + ViewCallback() + : m_bGraphicSelectionInvalidated(false), + m_bGraphicViewSelectionInvalidated(false), + m_nPart(0), + m_bCursorVisibleChanged(false), + m_bCursorVisible(false), + m_bViewLock(false), + m_bTilesInvalidated(false), + m_bViewSelectionSet(false), + m_callbackWrapper(&callback, this) + { + mpViewShell = SfxViewShell::Current(); + mpViewShell->setLibreOfficeKitViewCallback(&m_callbackWrapper); + mnView = SfxLokHelper::getView(); + m_callbackWrapper.setLOKViewId( mnView ); + } + + ~ViewCallback() + { + SfxLokHelper::setView(mnView); + mpViewShell->setLibreOfficeKitViewCallback(nullptr); + } + + static void callback(int nType, const char* pPayload, void* pData) + { + static_cast(pData)->callbackImpl(nType, pPayload); + } + + void callbackImpl(int nType, const char* pPayload) + { + switch (nType) + { + case LOK_CALLBACK_INVALIDATE_TILES: + { + m_bTilesInvalidated = true; + OString text(pPayload); + if (!text.startsWith("EMPTY")) + { + uno::Sequence aSeq = comphelper::string::convertCommaSeparated(OUString::createFromAscii(pPayload)); + CPPUNIT_ASSERT(aSeq.getLength() == 4 || aSeq.getLength() == 5); + tools::Rectangle aInvalidationRect; + aInvalidationRect.SetLeft(aSeq[0].toInt32()); + aInvalidationRect.SetTop(aSeq[1].toInt32()); + aInvalidationRect.setWidth(aSeq[2].toInt32()); + aInvalidationRect.setHeight(aSeq[3].toInt32()); + m_aInvalidations.push_back(aInvalidationRect); + } + } + break; + case LOK_CALLBACK_GRAPHIC_SELECTION: + { + m_bGraphicSelectionInvalidated = true; + m_ShapeSelection = OString(pPayload); + } + break; + case LOK_CALLBACK_GRAPHIC_VIEW_SELECTION: + { + std::stringstream aStream(pPayload); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + if (aTree.get_child("part").get_value() == m_nPart) + // Ignore callbacks which are for a different part. + m_bGraphicViewSelectionInvalidated = true; + } + break; + case LOK_CALLBACK_CURSOR_VISIBLE: + { + m_bCursorVisibleChanged = true; + m_bCursorVisible = (std::string_view("true") == pPayload); + } + break; + case LOK_CALLBACK_VIEW_LOCK: + { + std::stringstream aStream(pPayload); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + m_bViewLock = aTree.get_child("rectangle").get_value() != "EMPTY"; + } + break; + case LOK_CALLBACK_INVALIDATE_VIEW_CURSOR: + { + std::stringstream aStream(pPayload); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + int nViewId = aTree.get_child("viewId").get_value(); + m_aViewCursorInvalidations[nViewId] = true; + } + break; + case LOK_CALLBACK_VIEW_CURSOR_VISIBLE: + { + std::stringstream aStream(pPayload); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + const int nViewId = aTree.get_child("viewId").get_value(); + m_aViewCursorVisibilities[nViewId] = std::string_view("true") == pPayload; + } + break; + case LOK_CALLBACK_TEXT_VIEW_SELECTION: + { + m_bViewSelectionSet = true; + } + break; + case LOK_CALLBACK_COMMENT: + { + m_aCommentCallbackResult.clear(); + std::stringstream aStream(pPayload); + boost::property_tree::read_json(aStream, m_aCommentCallbackResult); + m_aCommentCallbackResult = m_aCommentCallbackResult.get_child("comment"); + } + break; + } + } +}; + +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testViewCursors) +{ + // Create two views. + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + ViewCallback aView1; + SfxLokHelper::createView(); + ViewCallback aView2; + + // Select the shape in the second view. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + Scheduler::ProcessEventsToIdle(); + + // First view notices that there was a selection change in the other view. + CPPUNIT_ASSERT(aView1.m_bGraphicViewSelectionInvalidated); + // Second view notices that there was a selection change in its own view. + CPPUNIT_ASSERT(aView2.m_bGraphicSelectionInvalidated); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testViewCursorParts) +{ + // Create two views. + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + ViewCallback aView1; + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering(uno::Sequence()); + ViewCallback aView2; + + // Select the shape in the second view. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + Scheduler::ProcessEventsToIdle(); + // First view notices that there was a selection change in the other view. + CPPUNIT_ASSERT(aView1.m_bGraphicViewSelectionInvalidated); + pView->UnmarkAllObj(pView->GetSdrPageView()); + + // Now switch to the second part in the second view. + pXImpressDocument->setPart(1); + aView2.m_nPart = 1; + aView1.m_bGraphicViewSelectionInvalidated = false; + pActualPage = pViewShell->GetActualPage(); + pObject = pActualPage->GetObj(0); + pView->MarkObj(pObject, pView->GetSdrPageView()); + Scheduler::ProcessEventsToIdle(); + // First view ignores view selection, as it would be for part 1, and it's in part 0. + // This failed when the "part" was always 0 in the callback. + CPPUNIT_ASSERT(!aView1.m_bGraphicViewSelectionInvalidated); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCursorViews) +{ + // Create the first view. + SdXImpressDocument* pXImpressDocument = createDoc("title-shape.odp"); + int nView1 = SfxLokHelper::getView(); + ViewCallback aView1; + + // Begin text edit on the only object on the slide. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView = pViewShell->GetView(); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pView->IsTextEdit()); + + // Make sure that cursor state is not changed just because we create a second view. + aView1.m_bCursorVisibleChanged = false; + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering(uno::Sequence()); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(!aView1.m_bCursorVisibleChanged); + + // Make sure that typing in the first view causes an invalidation in the + // second view as well, even if the second view was created after begin + // text edit in the first view. + ViewCallback aView2; + // This failed: the second view didn't get a lock notification, even if the + // first view already started text edit. + CPPUNIT_ASSERT(aView2.m_bViewLock); + SfxLokHelper::setView(nView1); + aView2.m_bTilesInvalidated = false; + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0); + Scheduler::ProcessEventsToIdle(); + // This failed: the second view was not invalidated when pressing a key in + // the first view. + CPPUNIT_ASSERT(aView2.m_bTilesInvalidated); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCursorVisibility_SingleClick) +{ + // Single-clicking in a text box enters editing only + // when it's on the text, even if it's the default text. + + // Load doc. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + ViewCallback aView1; + + // Begin text edit on the only object on the slide. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject1 = pActualPage->GetObj(0); + CPPUNIT_ASSERT(pObject1 != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast(pObject1); + + // Click once outside of the text (in the first quartile) => no editing. + const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + const auto cornerX = o3tl::toTwips(aRect.Left() + (aRect.getOpenWidth() / 4), o3tl::Length::mm100); + const auto cornerY = o3tl::toTwips(aRect.Top() + (aRect.getOpenHeight() / 4), o3tl::Length::mm100); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + cornerX, cornerY, + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + cornerX, cornerY, + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + // No editing. + CPPUNIT_ASSERT(!pViewShell->GetView()->IsTextEdit()); + CPPUNIT_ASSERT(!aView1.m_bCursorVisible); + + // Click again, now on the text, in the center, to start editing. + const auto centerX = o3tl::toTwips(aRect.Left() + (aRect.getOpenWidth() / 2), o3tl::Length::mm100); + const auto centerY = o3tl::toTwips(aRect.Top() + (aRect.getOpenHeight() / 2), o3tl::Length::mm100); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + centerX, centerY, + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + centerX, centerY, + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + // We must be in text editing mode and have cursor visible. + CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit()); + CPPUNIT_ASSERT(aView1.m_bCursorVisible); +} + + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCursorVisibility_DoubleClick) +{ + // Double-clicking anywhere in the TextBox should start editing. + + // Create the first view. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + ViewCallback aView1; + + // Begin text edit on the only object on the slide. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject1 = pActualPage->GetObj(0); + CPPUNIT_ASSERT(pObject1 != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast(pObject1); + + // Double-click outside the text to enter edit mode. + const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + const auto cornerX = o3tl::toTwips(aRect.Left() + (aRect.getOpenWidth() / 4), o3tl::Length::mm100); + const auto cornerY = o3tl::toTwips(aRect.Top() + (aRect.getOpenHeight() / 4), o3tl::Length::mm100); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + cornerX, cornerY, + 2, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + cornerX, cornerY, + 2, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + // We must be in text editing mode and have cursor visible. + CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit()); + CPPUNIT_ASSERT(aView1.m_bCursorVisible); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCursorVisibility_MultiView) +{ + // Create the first view. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + const int nView1 = SfxLokHelper::getView(); + ViewCallback aView1; + + // Begin text edit on the only object on the slide. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject1 = pActualPage->GetObj(0); + CPPUNIT_ASSERT(pObject1); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast(pObject1); + + // Make sure that cursor state is not changed just because we create a second view. + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering(uno::Sequence()); + const int nView2 = SfxLokHelper::getView(); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(false, aView1.m_bCursorVisibleChanged); + CPPUNIT_ASSERT_EQUAL(false, aView1.m_aViewCursorVisibilities[nView2]); + + // Also check that the second view gets the notifications. + ViewCallback aView2; + + SfxLokHelper::setView(nView1); + + ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + const auto centerX = o3tl::toTwips(aRect.Left() + (aRect.getOpenWidth() / 2), o3tl::Length::mm100); + const auto centerY = o3tl::toTwips(aRect.Top() + (aRect.getOpenHeight() / 2), o3tl::Length::mm100); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + centerX, centerY, + 2, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + centerX, centerY, + 2, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + // We must be in text editing mode and have cursor visible. + CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit()); + CPPUNIT_ASSERT(aView1.m_bCursorVisible); + CPPUNIT_ASSERT_EQUAL(false, aView1.m_aViewCursorVisibilities[nView2]); + + CPPUNIT_ASSERT_EQUAL(false, aView2.m_bCursorVisible); + CPPUNIT_ASSERT_EQUAL(false, aView2.m_aViewCursorVisibilities[nView1]); + CPPUNIT_ASSERT_EQUAL(false, aView2.m_aViewCursorVisibilities[nView2]); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCursorVisibility_Escape) +{ + // Load doc. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + ViewCallback aView1; + + // Begin text edit on the only object on the slide. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject1 = pActualPage->GetObj(0); + CPPUNIT_ASSERT(pObject1 != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast(pObject1); + + // Click once on the text to start editing. + const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + const auto centerX = o3tl::toTwips(aRect.Left() + (aRect.getOpenWidth() / 2), o3tl::Length::mm100); + const auto centerY = o3tl::toTwips(aRect.Top() + (aRect.getOpenHeight() / 2), o3tl::Length::mm100); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + centerX, centerY, + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + centerX, centerY, + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + // We must be in text editing mode and have cursor visible. + CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit()); + CPPUNIT_ASSERT(aView1.m_bCursorVisible); + + // End editing by pressing the escape key. + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + + // We must be in text editing mode and have cursor visible. + CPPUNIT_ASSERT(!pViewShell->GetView()->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, aView1.m_bCursorVisible); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testViewLock) +{ + // Load a document that has a shape and create two views. + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + ViewCallback aView1; + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering(uno::Sequence()); + + // Begin text edit in the second view and assert that the first gets a lock + // notification. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + aView1.m_bViewLock = false; + pView->SdrBeginTextEdit(pObject); + CPPUNIT_ASSERT(aView1.m_bViewLock); + + // End text edit in the second view, and assert that the lock is removed in + // the first view. + pView->SdrEndTextEdit(); + CPPUNIT_ASSERT(!aView1.m_bViewLock); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testUndoLimiting) +{ + // Create the first view. + SdXImpressDocument* pXImpressDocument = createDoc("title-shape.odp"); + sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell(); + int nView1 = SfxLokHelper::getView(); + SfxLokHelper::createView(); + sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell1 != pViewShell2); + + // Begin text edit on the only object on the slide. + SfxLokHelper::setView(nView1); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pViewShell1->GetView()->IsTextEdit()); + + // View2 UNDO stack should be empty + { + SfxRequest aReq2(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool()); + aReq2.AppendItem(SfxUInt16Item(SID_UNDO, 1)); + pViewShell2->ExecuteSlot(aReq2); + const auto* pReturnValue = aReq2.GetReturnValue().getItem(); + CPPUNIT_ASSERT(!pReturnValue); + } + + // View1 can UNDO + { + SfxRequest aReq1(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool()); + aReq1.AppendItem(SfxUInt16Item(SID_UNDO, 1)); + pViewShell1->ExecuteSlot(aReq1); + CPPUNIT_ASSERT(aReq1.IsDone()); + } + + // View1 can REDO + { + SfxRequest aReq1(SID_REDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool()); + aReq1.AppendItem(SfxUInt16Item(SID_REDO, 1)); + pViewShell1->ExecuteSlot(aReq1); + CPPUNIT_ASSERT(aReq1.IsDone()); + } + + // Exit text edit mode + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT(!pViewShell1->GetView()->IsTextEdit()); + + // Now check view2 cannot undo actions. + { + SfxRequest aReq2(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool()); + aReq2.AppendItem(SfxUInt16Item(SID_UNDO, 1)); + pViewShell2->ExecuteSlot(aReq2); + const SfxUInt32Item* pUInt32Item = dynamic_cast(aReq2.GetReturnValue().getItem()); + CPPUNIT_ASSERT(pUInt32Item); + CPPUNIT_ASSERT_EQUAL(static_cast< sal_uInt32 >(SID_REPAIRPACKAGE), pUInt32Item->GetValue()); + } + + // Now check view1 can undo action + { + SfxRequest aReq1(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool()); + aReq1.AppendItem(SfxUInt16Item(SID_UNDO, 1)); + pViewShell1->ExecuteSlot(aReq1); + CPPUNIT_ASSERT(aReq1.IsDone()); + } +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCreateViewGraphicSelection) +{ + // Load a document and register a callback. + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + ViewCallback aView1; + + // Select the only shape in the document and assert that the graphic selection is changed. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + aView1.m_bGraphicSelectionInvalidated = false; + pView->MarkObj(pObject, pView->GetSdrPageView()); + CPPUNIT_ASSERT(aView1.m_bGraphicSelectionInvalidated); + + // Now create a new view. + aView1.m_bGraphicSelectionInvalidated = false; + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering({}); + // This failed, creating a new view affected the graphic selection of an + // existing view. + CPPUNIT_ASSERT(!aView1.m_bGraphicSelectionInvalidated); + + // Check that when the first view has a shape selected and we register a + // callback on the second view, then it gets a "graphic view selection". + ViewCallback aView2; + // This failed, the created new view had no "view selection" of the first + // view's selected shape. + CPPUNIT_ASSERT(aView2.m_bGraphicViewSelectionInvalidated); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCreateViewTextCursor) +{ + // Load a document and register a callback. + SdXImpressDocument* pXImpressDocument = createDoc("title-shape.odp"); + ViewCallback aView1; + + // Begin text edit. + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0); + Scheduler::ProcessEventsToIdle(); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pSdrView = pViewShell->GetView(); + CPPUNIT_ASSERT(pSdrView->IsTextEdit()); + + // Create an editeng text selection. + EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); + // 0th para, 0th char -> 0th para, 1st char. + ESelection aWordSelection(0, 0, 0, 1); + rEditView.SetSelection(aWordSelection); + + // Make sure that creating a new view either doesn't affect the previous + // one, or at least the effect is not visible at the end. + aView1.m_aViewCursorInvalidations.clear(); + aView1.m_aViewCursorVisibilities.clear(); + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering({}); + ViewCallback aView2; + bool bFoundCursor = false; + for (const auto& rInvalidation : aView1.m_aViewCursorInvalidations) + { + auto itVisibility = aView1.m_aViewCursorVisibilities.find(rInvalidation.first); + // For each cursor invalidation: if there is no visibility or the visibility is true, that's a problem. + if (itVisibility == aView1.m_aViewCursorVisibilities.end() || itVisibility->second) + { + bFoundCursor = true; + break; + } + } + // This failed: the second view created an unexpected view cursor in the + // first view. + CPPUNIT_ASSERT(!bFoundCursor); + // This failed: the text view selection of the first view wasn't seen by + // the second view. + CPPUNIT_ASSERT(aView2.m_bViewSelectionSet); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf102223) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("tdf102223.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + auto pTableObject = dynamic_cast(pActualPage->GetObj(2)); + CPPUNIT_ASSERT(pTableObject); + SdrView* pView = pViewShell->GetView(); + + // select contents of cell + ::tools::Rectangle aRect = pTableObject->GetCurrentBoundRect(); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + pView->SdrBeginTextEdit(pTableObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(OUString("Red"), rEditView.GetSelected()); + CPPUNIT_ASSERT_EQUAL( + int(1411), static_cast(rEditView.GetAttribs().Get(EE_CHAR_FONTHEIGHT).GetHeight())); + + // cut contents of cell + uno::Sequence aArgs; + dispatchCommand(mxComponent, ".uno:Cut", aArgs); + + pView->SdrEndTextEdit(false); + pView->SdrBeginTextEdit(pTableObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView2.SetSelection(ESelection(0, 0, 0, 1)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL( + int(1411), static_cast(rEditView2.GetAttribs().Get(EE_CHAR_FONTHEIGHT).GetHeight())); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf118354) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("tdf118354.odp"); + + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + + CPPUNIT_ASSERT_EQUAL(static_cast(2), pActualPage->GetObjCount()); + + auto pTableObject = dynamic_cast(pActualPage->GetObj(0)); + CPPUNIT_ASSERT(pTableObject); + + // Without the fix, it would crash here + ::tools::Rectangle aRect = pTableObject->GetCurrentBoundRect(); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + SdrView* pView = pViewShell->GetView(); + auto pMarkedObj = dynamic_cast(pView->GetMarkedObjectByIndex(0)); + CPPUNIT_ASSERT_EQUAL(pMarkedObj, pTableObject); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPostKeyEventInvalidation) +{ + // Load a document and begin text edit on the first slide. + SdXImpressDocument* pXImpressDocument = createDoc("2slides.odp"); + CPPUNIT_ASSERT_EQUAL(0, pXImpressDocument->getPart()); + ViewCallback aView1; + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView = pViewShell->GetView(); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F2); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_F2); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + + // Create a second view and begin text edit there as well, in parallel. + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering({}); + ViewCallback aView2; + pXImpressDocument->setPart(1); + sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView2 = pViewShell2->GetView(); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F2); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_F2); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pView2->GetTextEditObject()); + + // Now go left with the cursor in the second view and watch for + // invalidations. + aView2.m_bTilesInvalidated = false; + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT); + Scheduler::ProcessEventsToIdle(); + // This failed: moving the cursor caused unexpected invalidation. + CPPUNIT_ASSERT(!aView2.m_bTilesInvalidated); +} + +/** + * tests a cut/paste bug around bullet items in a list + */ +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf103083) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("tdf103083.fodp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + + SdrObject* pObject1 = pActualPage->GetObj(1); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::OutlineText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast(pObject1); + + SdrView* pView = pViewShell->GetView(); + + // select contents of bullet item + ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + pView->SdrBeginTextEdit(pTextObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(OUString("They have all the same formatting"), rEditView.GetSelected()); + SdrOutliner* pOutliner = pView->GetTextEditOutliner(); + CPPUNIT_ASSERT_EQUAL(OUString("No-Logo Content~LT~Gliederung 2"), + pOutliner->GetStyleSheet(2)->GetName()); + const EditTextObject& aEdit = pTextObject->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); + SvxNumberFormat aNumFmt(pNumFmt->GetNumRule().GetLevel(2)); + + // cut contents of bullet item + dispatchCommand(mxComponent, ".uno:Cut", uno::Sequence()); + + CPPUNIT_ASSERT(pView->GetTextEditObject()); + EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView2.SetSelection(ESelection(2, 0, 2, 10)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(OUString(), rEditView2.GetSelected()); + + // paste contents of bullet item + dispatchCommand(mxComponent, ".uno:Paste", uno::Sequence()); + + // send an ESC key to trigger the commit of the edit to the main model + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + + pView->SdrBeginTextEdit(pTextObject); + CPPUNIT_ASSERT(pView->GetTextEditObject()); + pOutliner = pView->GetTextEditOutliner(); + EditView& rEditView3 = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView3.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char. + CPPUNIT_ASSERT_EQUAL(OUString("They have all the same formatting"), rEditView3.GetSelected()); + CPPUNIT_ASSERT_EQUAL(OUString("No-Logo Content~LT~Gliederung 2"), + pOutliner->GetStyleSheet(2)->GetName()); + + const EditTextObject& aEdit2 = pTextObject->GetOutlinerParaObject()->GetTextObject(); + const SvxNumBulletItem* pNumFmt2 = aEdit2.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET); + SvxNumberFormat aNumFmt2(pNumFmt2->GetNumRule().GetLevel(2)); + + bool bEqual(aNumFmt2 == aNumFmt); + CPPUNIT_ASSERT_MESSAGE("Bullet properties changed after paste", bEqual); +} + +/** + * tests a clone-formatting bug around table cell attributes + */ +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf104405) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("tdf104405.fodp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(2); + auto pTableObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pTableObject); + + // select the middle cell + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTableObject, pView->GetSdrPageView()); + pTableObject->setActiveCell(sdr::table::CellPos(2,1)); + pView->SdrBeginTextEdit(pTableObject); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char. + + // trigger the clone-formatting/paintbrush command to copy formatting contents of cell + uno::Sequence aArgs{ comphelper::makePropertyValue("PersistentCopy", true) }; + dispatchCommand(mxComponent, ".uno:FormatPaintbrush", aArgs); + + // now click on the table + pView->MarkObj(pTableObject, pView->GetSdrPageView()); + pTableObject->setActiveCell(sdr::table::CellPos(0,0)); + pView->SdrEndTextEdit(false); + pView->SdrBeginTextEdit(pTableObject); + EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView2.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char. + ::tools::Rectangle aRect = pTableObject->GetCurrentBoundRect(); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + o3tl::toTwips(aRect.Left(), o3tl::Length::mm100), o3tl::toTwips(aRect.Top(), o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + o3tl::toTwips(aRect.Left(), o3tl::Length::mm100), o3tl::toTwips(aRect.Top(), o3tl::Length::mm100), + 1, MOUSE_LEFT, 0); + + Scheduler::ProcessEventsToIdle(); + + // check that the first cell has acquired the resulting vertical style + xmlDocUniquePtr pXmlDoc = parseXmlDump(); + // the following name has a compiler-dependent part + CPPUNIT_ASSERT_EQUAL( + OUString("2"), + getXPath( + pXmlDoc, + "/SdDrawDocument/SdrModel/maPages/SdPage/SdrPage/SdrObjList/SdrTableObj/SdrTableObjImpl" + "/TableModel/Cell[1]/DefaultProperties/SfxItemSet/SdrTextVertAdjustItem"_ostr, + "value"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf81754) +{ + SdXImpressDocument* pXImpressDocument = createDoc("tdf81754.pptx"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(1); + + SdrTextObj* pTextObj = static_cast(pObject); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTextObj, pView->GetSdrPageView()); + SfxStringItem aInputString(SID_ATTR_CHAR, "x"); + pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, + SfxCallMode::SYNCHRON, { &aInputString }); + + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0); + Scheduler::ProcessEventsToIdle(); + + // now save, reload, and assert that we did not lose the edit + saveAndReload("Impress Office Open XML"); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(u"Somethingxx"_ustr, xShape->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf105502) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("tdf105502.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + sd::Window* pWindow = pViewShell->GetActiveWindow(); + CPPUNIT_ASSERT(pWindow); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + auto pTableObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pTableObject); + + // Select the first row. + sd::View* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + pView->SdrBeginTextEdit(pObject); + rtl::Reference xSelectionController(pView->getSelectionController()); + CPPUNIT_ASSERT(xSelectionController.is()); + SfxRequest aRequest(*pViewShell->GetViewFrame(), SID_TABLE_SELECT_ROW); + xSelectionController->Execute(aRequest); + + // Assert that the A1:B1 selection succeeded. + CPPUNIT_ASSERT(xSelectionController->hasSelectedCells()); + sdr::table::CellPos aFirstCell; + sdr::table::CellPos aLastCell; + xSelectionController->getSelectedCells(aFirstCell, aLastCell); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aFirstCell.mnCol); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aFirstCell.mnRow); + CPPUNIT_ASSERT_EQUAL(static_cast(1), aLastCell.mnCol); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aLastCell.mnRow); + + // Grow font size for the selection. + dispatchCommand(mxComponent, ".uno:Grow", {}); + + // Assert that the selected A1 has now a larger font than the unselected + // A2. + xmlDocUniquePtr pXmlDoc = parseXmlDump(); + sal_Int32 nA1Height = getXPath(pXmlDoc, "//Cell[1]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/SfxItemSet/SvxFontHeightItem[1]"_ostr, "height"_ostr).toInt32(); + sal_Int32 nA2Height = getXPath(pXmlDoc, "//Cell[3]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/attribs[1]/SvxFontHeightItem"_ostr, "height"_ostr).toInt32(); + // This failed when FuText::ChangeFontSize() never did "continue" in the + // text loop, instead of doing so depending on what IsInSelection() returns. + CPPUNIT_ASSERT(nA1Height > nA2Height); + + // Check that selection remains the same + CPPUNIT_ASSERT(xSelectionController->hasSelectedCells()); + xSelectionController->getSelectedCells(aFirstCell, aLastCell); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aFirstCell.mnCol); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aFirstCell.mnRow); + CPPUNIT_ASSERT_EQUAL(static_cast(1), aLastCell.mnCol); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aLastCell.mnRow); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCommentCallbacks) +{ + // Load the document. + // Set the tiled annotations off + comphelper::LibreOfficeKit::setTiledAnnotations(false); + + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp", comphelper::InitPropertySequence( + { + {".uno:Author", uno::Any(OUString("LOK User1"))}, + })); + ViewCallback aView1; + int nView1 = SfxLokHelper::getView(); + + SfxLokHelper::createView(); + uno::Sequence aArgs(comphelper::InitPropertySequence( + { + {".uno:Author", uno::Any(OUString("LOK User2"))}, + })); + pXImpressDocument->initializeForTiledRendering(aArgs); + ViewCallback aView2; + int nView2 = SfxLokHelper::getView(); + + SfxLokHelper::setView(nView1); + + // Add a new comment + aArgs = comphelper::InitPropertySequence( + { + {"Text", uno::Any(OUString("Comment"))}, + }); + dispatchCommand(mxComponent, ".uno:InsertAnnotation", aArgs); + + // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action + CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get("action")); + int nComment1 = aView1.m_aCommentCallbackResult.get("id"); + CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get("id")); + css::util::DateTime aDateTime; + OUString aDateTimeString = OUString::createFromAscii(aView1.m_aCommentCallbackResult.get("dateTime")); + CPPUNIT_ASSERT(utl::ISO8601parseDateTime(aDateTimeString, aDateTime)); + CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView1.m_aCommentCallbackResult.get("author")); + CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView2.m_aCommentCallbackResult.get("author")); + CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView2.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get("parthash").empty()); + CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get("parthash").empty()); + + // Reply to a just added comment + SfxLokHelper::setView(nView2); + aArgs = comphelper::InitPropertySequence( + { + {"Id", uno::Any(OUString::number(nComment1))}, + {"Text", uno::Any(OUString("Reply to comment"))}, + }); + dispatchCommand(mxComponent, ".uno:ReplyToAnnotation", aArgs); + + // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action + CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get("id")); + CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get("id")); + CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), aView1.m_aCommentCallbackResult.get("author")); + CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), aView2.m_aCommentCallbackResult.get("author")); + OUString aReplyTextView1 = OUString::createFromAscii(aView1.m_aCommentCallbackResult.get("text")); + OUString aReplyTextView2 = OUString::createFromAscii(aView2.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT(aReplyTextView1.startsWith("Reply to LOK User1")); + CPPUNIT_ASSERT(aReplyTextView1.endsWith("Reply to comment")); + CPPUNIT_ASSERT(aReplyTextView2.startsWith("Reply to LOK User1")); + CPPUNIT_ASSERT(aReplyTextView2.endsWith("Reply to comment")); + CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get("parthash").empty()); + CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get("parthash").empty()); + + // Edit this annotation now + aArgs = comphelper::InitPropertySequence( + { + {"Id", uno::Any(OUString::number(nComment1))}, + {"Text", uno::Any(OUString("Edited comment"))}, + }); + dispatchCommand(mxComponent, ".uno:EditAnnotation", aArgs); + + // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action + CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get("id")); + CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get("id")); + CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get("parthash").empty()); + CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get("parthash").empty()); + CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView1.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView2.m_aCommentCallbackResult.get("text")); + + // Delete the comment + aArgs = comphelper::InitPropertySequence( + { + {"Id", uno::Any(OUString::number(nComment1))}, + }); + dispatchCommand(mxComponent, ".uno:DeleteAnnotation", aArgs); + + // We received a LOK_CALLBACK_COMMENT callback with comment 'Remove' action + CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView1.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView2.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get("id")); + CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get("id")); + + comphelper::LibreOfficeKit::setTiledAnnotations(true); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCommentChangeImpress) +{ + uno::Sequence aArgs; + + // Load the document. + // Set the tiled annotations off + comphelper::LibreOfficeKit::setTiledAnnotations(false); + + createDoc("dummy.odp", comphelper::InitPropertySequence( + { + {".uno:Author", uno::Any(OUString("LOK User1"))}, + })); + + ViewCallback aView1; + + // Add a new comment + aArgs = comphelper::InitPropertySequence( + { + {"Text", uno::Any(OUString("Comment"))}, + }); + dispatchCommand(mxComponent, ".uno:InsertAnnotation", aArgs); + + CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get("action")); + + int nComment1 = aView1.m_aCommentCallbackResult.get("id"); + + CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get("parthash").empty()); + CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT_EQUAL(std::string("0, 0, 0, 0"), aView1.m_aCommentCallbackResult.get("rectangle")); + + // Edit this annotation now + aArgs = comphelper::InitPropertySequence( + { + {"Id", uno::Any(OUString::number(nComment1))}, + {"PositionX", uno::Any(sal_Int32(10))}, + {"PositionY", uno::Any(sal_Int32(20))} + }); + dispatchCommand(mxComponent, ".uno:EditAnnotation", aArgs); + + CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT_EQUAL(std::string("10, 20, 0, 0"), aView1.m_aCommentCallbackResult.get("rectangle")); + + comphelper::LibreOfficeKit::setTiledAnnotations(true); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCommentChangeDraw) +{ + uno::Sequence aArgs; + + // Load the document. + // Set the tiled annotations off + comphelper::LibreOfficeKit::setTiledAnnotations(false); + + createDoc("dummy.odg", comphelper::InitPropertySequence( + { + {".uno:Author", uno::Any(OUString("LOK User1"))}, + })); + + ViewCallback aView1; + + // Add a new comment + aArgs = comphelper::InitPropertySequence( + { + {"Text", uno::Any(OUString("Comment"))}, + }); + dispatchCommand(mxComponent, ".uno:InsertAnnotation", aArgs); + + CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get("action")); + + int nComment1 = aView1.m_aCommentCallbackResult.get("id"); + + CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get("parthash").empty()); + CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT_EQUAL(std::string("0, 0, 0, 0"), aView1.m_aCommentCallbackResult.get("rectangle")); + + // Edit this annotation now + aArgs = comphelper::InitPropertySequence( + { + {"Id", uno::Any(OUString::number(nComment1))}, + {"PositionX", uno::Any(sal_Int32(10))}, + {"PositionY", uno::Any(sal_Int32(20))} + }); + dispatchCommand(mxComponent, ".uno:EditAnnotation", aArgs); + + CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get("action")); + CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get("text")); + CPPUNIT_ASSERT_EQUAL(std::string("10, 20, 0, 0"), aView1.m_aCommentCallbackResult.get("rectangle")); + + comphelper::LibreOfficeKit::setTiledAnnotations(true); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testMultiViewInsertDeletePage) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + ViewCallback aView1; + int nView1 = SfxLokHelper::getView(); + uno::Sequence aArgs; + SdDrawDocument* pDoc = pXImpressDocument->GetDocShell()->GetDoc(); + + // Create second view + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering(aArgs); + ViewCallback aView2; + int nView2 = SfxLokHelper::getView(); + + // the document has 8 slides + CPPUNIT_ASSERT_EQUAL(static_cast(8), pDoc->GetSdPageCount(PageKind::Standard)); + + // Switch to 5th page in 2nd view + pXImpressDocument->setPart(4); + + // Insert slide in 1st view + SfxLokHelper::setView(nView1); + dispatchCommand(mxComponent, ".uno:InsertPage", aArgs); + + // See if the current slide number changed in 2nd view too + SfxLokHelper::setView(nView2); + CPPUNIT_ASSERT_EQUAL(5, pXImpressDocument->getPart()); + + // Delete the page in 1st view now + SfxLokHelper::setView(nView1); + dispatchCommand(mxComponent, ".uno:DeletePage", aArgs); + + // See if current slide number changed in 2nd view too + SfxLokHelper::setView(nView2); + CPPUNIT_ASSERT_EQUAL(4, pXImpressDocument->getPart()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testMultiViewInsertDeletePage2) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + ViewCallback aView1; + int nView1 = SfxLokHelper::getView(); + uno::Sequence aArgs; + SdDrawDocument* pDoc = pXImpressDocument->GetDocShell()->GetDoc(); + + // Create second view + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering(aArgs); + ViewCallback aView2; + int nView2 = SfxLokHelper::getView(); + + // the document has 8 slides + CPPUNIT_ASSERT_EQUAL(static_cast(8), pDoc->GetSdPageCount(PageKind::Standard)); + + // Switch to 5th page in 2nd view + pXImpressDocument->setPart(4); + + // Begin text edit on the only object on the slide. + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject1 = pActualPage->GetObj(0); + CPPUNIT_ASSERT(pObject1 != nullptr); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier()); + SdrTextObj* pTextObject = static_cast(pObject1); + + // Double-click outside the text to enter edit mode. + const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect(); + const auto cornerX = o3tl::toTwips(aRect.Left() + (aRect.getOpenWidth() / 4), o3tl::Length::mm100); + const auto cornerY = o3tl::toTwips(aRect.Top() + (aRect.getOpenHeight() / 4), o3tl::Length::mm100); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + cornerX, cornerY, + 2, MOUSE_LEFT, 0); + pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, + cornerX, cornerY, + 2, MOUSE_LEFT, 0); + Scheduler::ProcessEventsToIdle(); + + // We must be in text editing mode and have cursor visible. + CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit()); + + // Insert slide in 1st view + SfxLokHelper::setView(nView1); + dispatchCommand(mxComponent, ".uno:InsertPage", aArgs); + + // See if the current slide number changed in 2nd view too + SfxLokHelper::setView(nView2); + CPPUNIT_ASSERT_EQUAL(5, pXImpressDocument->getPart()); + + // Delete the page in 1st view now + SfxLokHelper::setView(nView1); + dispatchCommand(mxComponent, ".uno:DeletePage", aArgs); + + // See if current slide number changed in 2nd view too + SfxLokHelper::setView(nView2); + CPPUNIT_ASSERT_EQUAL(4, pXImpressDocument->getPart()); + + // We must be still in text editing mode and have cursor visible. + CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testDisableUndoRepair) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + + // Create View 1 + SfxViewShell* pView1 = SfxViewShell::Current(); + sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell(); + int nView1 = SfxLokHelper::getView(); + + // Create View 2 + SfxLokHelper::createView(); + SfxViewShell* pView2 = SfxViewShell::Current(); + sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell(); + int nView2 = SfxLokHelper::getView(); + + // Check UNDO is disabled + { + std::unique_ptr pItem1; + std::unique_ptr pItem2; + CPPUNIT_ASSERT_EQUAL(SfxItemState::DISABLED, pView1->GetViewFrame().GetBindings().QueryState(SID_UNDO, pItem1)); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DISABLED, pView2->GetViewFrame().GetBindings().QueryState(SID_UNDO, pItem2)); + } + + // Insert a character in the first view. + SfxLokHelper::setView(nView1); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'h', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'h', 0); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pViewShell1->GetView()->IsTextEdit()); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(!pViewShell1->GetView()->IsTextEdit()); + + // Check + { + std::unique_ptr xItem1; + pView1->GetViewFrame().GetBindings().QueryState(SID_UNDO, xItem1); + const auto* pUInt32Item1 = dynamic_cast(xItem1.get()); + CPPUNIT_ASSERT(!pUInt32Item1); + + std::unique_ptr xItem2; + pView2->GetViewFrame().GetBindings().QueryState(SID_UNDO, xItem2); + const auto* pUInt32Item2 = dynamic_cast(xItem2.get()); + CPPUNIT_ASSERT(pUInt32Item2); + CPPUNIT_ASSERT_EQUAL(static_cast(SID_REPAIRPACKAGE), pUInt32Item2->GetValue()); + } + + // Insert a character in the second view. + SfxLokHelper::setView(nView2); + pXImpressDocument->setPart(1); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', 0); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pViewShell2->GetView()->IsTextEdit()); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(!pViewShell2->GetView()->IsTextEdit()); + + // Check + { + std::unique_ptr xItem1; + pView1->GetViewFrame().GetBindings().QueryState(SID_UNDO, xItem1); + const SfxUInt32Item* pUInt32Item = dynamic_cast(xItem1.get()); + CPPUNIT_ASSERT(pUInt32Item); + CPPUNIT_ASSERT_EQUAL(static_cast(SID_REPAIRPACKAGE), pUInt32Item->GetValue()); + + std::unique_ptr xItem2; + pView2->GetViewFrame().GetBindings().QueryState(SID_UNDO, xItem2); + CPPUNIT_ASSERT(!dynamic_cast< const SfxUInt32Item* >(xItem2.get())); + } +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testDocumentRepair) +{ + // Create two views. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + CPPUNIT_ASSERT(pXImpressDocument); + + // view #1 + SfxViewShell* pView1 = SfxViewShell::Current(); + + // view #2 + SfxLokHelper::createView(); + SfxViewShell* pView2 = SfxViewShell::Current(); + int nView2 = SfxLokHelper::getView(); + sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell(); + + CPPUNIT_ASSERT(pView1 != pView2); + { + std::unique_ptr pItem1; + pView1->GetViewFrame().GetBindings().QueryState(SID_DOC_REPAIR, pItem1); + CPPUNIT_ASSERT(pItem1); + CPPUNIT_ASSERT_EQUAL(false, pItem1->GetValue()); + + std::unique_ptr pItem2; + pView2->GetViewFrame().GetBindings().QueryState(SID_DOC_REPAIR, pItem2); + CPPUNIT_ASSERT(pItem2); + CPPUNIT_ASSERT_EQUAL(false, pItem2->GetValue()); + } + + // Insert a character in the second view. + SfxLokHelper::setView(nView2); + pXImpressDocument->setPart(1); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', 0); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(pViewShell2->GetView()->IsTextEdit()); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT(!pViewShell2->GetView()->IsTextEdit()); + + { + std::unique_ptr pItem1; + pView1->GetViewFrame().GetBindings().QueryState(SID_DOC_REPAIR, pItem1); + CPPUNIT_ASSERT(pItem1); + CPPUNIT_ASSERT_EQUAL(true, pItem1->GetValue()); + + std::unique_ptr pItem2; + pView2->GetViewFrame().GetBindings().QueryState(SID_DOC_REPAIR, pItem2); + CPPUNIT_ASSERT(pItem2); + CPPUNIT_ASSERT_EQUAL(true, pItem2->GetValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testLanguageStatus) +{ + // Load the document. + createDoc("dummy.odp"); + SfxViewShell* pView1 = SfxViewShell::Current(); + SfxLokHelper::createView(); + SfxViewShell* pView2 = SfxViewShell::Current(); + { + std::unique_ptr xItem1; + std::unique_ptr xItem2; + pView1->GetViewFrame().GetBindings().QueryState(SID_LANGUAGE_STATUS, xItem1); + pView2->GetViewFrame().GetBindings().QueryState(SID_LANGUAGE_STATUS, xItem2); + auto pStringItem = dynamic_cast(xItem1.get()); + CPPUNIT_ASSERT(pStringItem); + + CPPUNIT_ASSERT_EQUAL(OUString("English (USA);en-US"), pStringItem->GetValue()); + + CPPUNIT_ASSERT(dynamic_cast< const SfxStringItem* >(xItem2.get())); + } +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testLanguageAllText) +{ + // Load the document, which has a single shape, with Hungarian text. + createDoc("language-all-text.odp"); + + // Set the language to English for all text. + uno::Sequence aArgs = comphelper::InitPropertySequence({ + { "Language", uno::Any(OUString("Default_English (USA)")) }, + }); + dispatchCommand(mxComponent, ".uno:LanguageStatus", aArgs); + + // Assert that the shape text language was changed. + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xRun(xShape, uno::UNO_QUERY_THROW); + lang::Locale aLocale; + xRun->getPropertyValue("CharLocale") >>= aLocale; + // Without the accompanying fix in place, this test would have failed with 'Expected: en; + // Actual: hu', as the shape text language was not set. + CPPUNIT_ASSERT_EQUAL(OUString("en"), aLocale.Language); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testDefaultView) +{ + // Load the document with notes view. + SdXImpressDocument* pXImpressDocument = createDoc("notes-view.odp"); + sd::ViewShell* pView = pXImpressDocument->GetDocShell()->GetViewShell(); + { + std::unique_ptr pImpressView; + std::unique_ptr pNotesView; + pView->GetViewFrame()->GetBindings().QueryState(SID_NORMAL_MULTI_PANE_GUI, pImpressView); + pView->GetViewFrame()->GetBindings().QueryState(SID_NOTES_MODE, pNotesView); + CPPUNIT_ASSERT(pImpressView); + CPPUNIT_ASSERT(pNotesView); + CPPUNIT_ASSERT_EQUAL(true, pImpressView->GetValue()); + CPPUNIT_ASSERT_EQUAL(false, pNotesView->GetValue()); + } +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testIMESupport) +{ + // Load the document with notes view. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + VclPtr pDocWindow = pXImpressDocument->getDocWindow(); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrObject* pObject = pViewShell->GetActualPage()->GetObj(0); + SdrTextObj* pTextObj = static_cast(pObject); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTextObj, pView->GetSdrPageView()); + SfxStringItem aInputString(SID_ATTR_CHAR, "x"); + pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, + SfxCallMode::SYNCHRON, { &aInputString }); + + // sequence of chinese IME compositions when 'nihao' is typed in an IME + const std::vector aUtf8Inputs{ "年"_ostr, "你"_ostr, "你好"_ostr, "你哈"_ostr, "你好"_ostr, "你好"_ostr }; + std::vector aInputs; + std::transform(aUtf8Inputs.begin(), aUtf8Inputs.end(), + std::back_inserter(aInputs), [](OString aInput) { + return OUString::fromUtf8(aInput); + }); + for (const auto& aInput: aInputs) + { + pDocWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, aInput); + } + pDocWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); + + // the cursor should be at position 3rd + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + CPPUNIT_ASSERT_EQUAL(static_cast(3), rEditView.GetSelection().nStartPos); + + ESelection aWordSelection(0, 0, 0, 3); // start para, start char, end para, end char. + rEditView.SetSelection(aWordSelection); + // content contains only the last IME composition, not all + CPPUNIT_ASSERT_EQUAL(OUString("x" + aInputs[aInputs.size() - 1]), rEditView.GetSelected()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf115783) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("tdf115783.fodp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + auto pTableObject = dynamic_cast(pObject); + CPPUNIT_ASSERT(pTableObject); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pTableObject, pView->GetSdrPageView()); + + // Create a cell selection and set font height. + // Go to the end of the B1 cell. + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT); + // Create a B1->C1 cell selection. + const int nShiftRight = KEY_SHIFT + KEY_RIGHT; + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, nShiftRight); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, nShiftRight); + uno::Sequence aArgs = comphelper::InitPropertySequence({ + { "FontHeight.Height", uno::Any(static_cast(12)) }, + }); + dispatchCommand(mxComponent, ".uno:FontHeight", aArgs); + + // Create a text selection on the B1 cell. + pTableObject->setActiveCell(sdr::table::CellPos(1, 0)); + pView->SdrBeginTextEdit(pTableObject); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + // Start para, start char, end para, end char. + rEditView.SetSelection(ESelection(0, 0, 0, 5)); + CPPUNIT_ASSERT_EQUAL(OUString("hello"), rEditView.GetSelected()); + + // Copy selection, paste at the start of the cell. + aArgs = {}; + dispatchCommand(mxComponent, ".uno:Copy", aArgs); + rEditView.SetSelection(ESelection(0, 0, 0, 0)); + aArgs = {}; + dispatchCommand(mxComponent, ".uno:Paste", aArgs); + pView->SdrEndTextEdit(); + + // And now verify that the cell has the correct font size. + uno::Reference xTable = pTableObject->getTable(); + CPPUNIT_ASSERT(xTable.is()); + uno::Reference xCell(xTable->getCellByPosition(1, 0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xCell.is()); + uno::Reference xText(xCell->getText(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xText.is()); + uno::Reference xParagraph( + xText->createEnumeration()->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xParagraph.is()); + uno::Reference xPortion(xParagraph->createEnumeration()->nextElement(), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xPortion.is()); + // This failed, it was only "hello" as the paragraph had 2 portions: a + // "hello" with 12pt size and a "hello" with 18pt. + CPPUNIT_ASSERT_EQUAL(OUString("hellohello"), xPortion->getString()); + uno::Reference xPropertySet(xPortion, uno::UNO_QUERY); + int nHeight = xPropertySet->getPropertyValue("CharHeight").get(); + // Make sure that the single font size for the cell is the expected one. + CPPUNIT_ASSERT_EQUAL(12, nHeight); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPasteTextOnSlide) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("paste_text_onslide.odp"); + CPPUNIT_ASSERT(pXImpressDocument); + + // select second text object + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + Scheduler::ProcessEventsToIdle(); + + // step into text editing + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, '1', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, '1', 0); + Scheduler::ProcessEventsToIdle(); + + // select full text + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + Scheduler::ProcessEventsToIdle(); + + // Copy some text + dispatchCommand(mxComponent, ".uno:Copy", uno::Sequence()); + + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + + // Paste onto the slide + dispatchCommand(mxComponent, ".uno:Paste", uno::Sequence()); + + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE); + Scheduler::ProcessEventsToIdle(); + + // Check the position of the newly added text shape, created for pasted text + SdPage* pActualPage = pXImpressDocument->GetDocShell()->GetViewShell()->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObjCount()); + SdrObject* pObject = pActualPage->GetObj(2); + CPPUNIT_ASSERT(pObject); + SdrTextObj* pTextObj = DynCastSdrTextObj(pObject); + CPPUNIT_ASSERT(pTextObj); + CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pTextObj->GetObjIdentifier()); + const Point aPos = pTextObj->GetLastBoundRect().TopLeft(); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aPos.getX()); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aPos.getY()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf115873) +{ + // Initialize the navigator. + SdXImpressDocument* pXImpressDocument = createDoc("tdf115873.fodp"); + SfxViewShell* pViewShell = SfxViewShell::Current(); + CPPUNIT_ASSERT(pViewShell); + SfxBindings& rBindings = pViewShell->GetViewFrame().GetBindings(); + auto xNavigator = std::make_unique(nullptr, &rBindings, nullptr); + xNavigator->InitTreeLB(pXImpressDocument->GetDoc()); + SdPageObjsTLV& rObjects = xNavigator->GetObjects(); + rObjects.SelectEntry(u"Slide 1"); + rObjects.Select(); + sd::ViewShell* pSdViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pSdrView = pSdViewShell->GetView(); + pSdrView->UnmarkAllObj(pSdrView->GetSdrPageView()); + + // Make sure that no shapes are selected. + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(static_cast(0), rMarkList.GetMarkCount()); + + // Single-click with the mouse. + MouseEvent aMouseEvent(Point(0, 0), /*nClicks=*/1, MouseEventModifiers::NONE, MOUSE_LEFT); + rObjects.MousePressHdl(aMouseEvent); + rObjects.SelectEntry(u"Rectangle"); + rObjects.Select(); + rObjects.MouseReleaseHdl(aMouseEvent); + Scheduler::ProcessEventsToIdle(); + // This failed, single-click did not result in a shape selection (only + // double-click did). + CPPUNIT_ASSERT_EQUAL(static_cast(1), rMarkList.GetMarkCount()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testTdf115873Group) +{ + // Initialize the navigator. + SdXImpressDocument* pXImpressDocument = createDoc("tdf115873-group.fodp"); + SfxViewShell* pViewShell = SfxViewShell::Current(); + CPPUNIT_ASSERT(pViewShell); + SfxBindings& rBindings = pViewShell->GetViewFrame().GetBindings(); + auto xNavigator = std::make_unique(nullptr, &rBindings, nullptr); + xNavigator->InitTreeLB(pXImpressDocument->GetDoc()); + SdPageObjsTLV& rObjects = xNavigator->GetObjects(); + // This failed, Fill() and IsEqualToDoc() were out of sync for group + // shapes. + CPPUNIT_ASSERT(rObjects.IsEqualToDoc(pXImpressDocument->GetDoc())); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testCutSelectionChange) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("cut_selection_change.odp"); + CPPUNIT_ASSERT(pXImpressDocument); + + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + setupLibreOfficeKitViewCallback(pViewShell->GetViewShellBase()); + Scheduler::ProcessEventsToIdle(); + + // Select first text object + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + Scheduler::ProcessEventsToIdle(); + + // step into text editing + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, '1', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, '1', 0); + Scheduler::ProcessEventsToIdle(); + + // select some text + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT); + Scheduler::ProcessEventsToIdle(); + + // Check that we have a selection before cutting + CPPUNIT_ASSERT_EQUAL(static_cast(1), m_aSelection.size()); + + // Cut the selected text + dispatchCommand(mxComponent, ".uno:Cut", uno::Sequence()); + + // Selection is removed + CPPUNIT_ASSERT_EQUAL(static_cast(0), m_aSelection.size()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testGetViewRenderState) +{ + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + int nFirstViewId = SfxLokHelper::getView(); + ViewCallback aView1; + CPPUNIT_ASSERT_EQUAL(";Default"_ostr, pXImpressDocument->getViewRenderState()); + // Create a second view + SfxLokHelper::createView(); + ViewCallback aView2; + CPPUNIT_ASSERT_EQUAL(";Default"_ostr, pXImpressDocument->getViewRenderState()); + // Set to dark scheme + { + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { + { "NewTheme", uno::Any(OUString("Dark")) }, + } + ); + dispatchCommand(mxComponent, ".uno:ChangeTheme", aPropertyValues); + } + CPPUNIT_ASSERT_EQUAL(";Dark"_ostr, pXImpressDocument->getViewRenderState()); + // Switch back to the first view, and check that the options string is the same + SfxLokHelper::setView(nFirstViewId); + CPPUNIT_ASSERT_EQUAL(";Default"_ostr, pXImpressDocument->getViewRenderState()); +} + +// Helper function to get a tile to a bitmap and check the pixel color +static void assertTilePixelColor(SdXImpressDocument* pXImpressDocument, int nPixelX, int nPixelY, Color aColor) +{ + size_t nCanvasSize = 1024; + size_t nTileSize = 256; + std::vector aPixmap(nCanvasSize * nCanvasSize * 4, 0); + ScopedVclPtrInstance pDevice(DeviceFormat::WITHOUT_ALPHA); + pDevice->SetBackground(Wallpaper(COL_TRANSPARENT)); + pDevice->SetOutputSizePixelScaleOffsetAndLOKBuffer(Size(nCanvasSize, nCanvasSize), + Fraction(1.0), Point(), aPixmap.data()); + pXImpressDocument->paintTile(*pDevice, nCanvasSize, nCanvasSize, 0, 0, 15360, 7680); + pDevice->EnableMapMode(false); + Bitmap aBitmap = pDevice->GetBitmap(Point(0, 0), Size(nTileSize, nTileSize)); + BitmapScopedReadAccess pAccess(aBitmap); + Color aActualColor(pAccess->GetPixel(nPixelX, nPixelY)); + CPPUNIT_ASSERT_EQUAL(aColor, aActualColor); +} + +// Test that changing the theme in one view doesn't change it in the other view +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testThemeViewSeparation) +{ + Color aDarkColor(0x1c, 0x1c, 0x1c); + // Add a minimal dark scheme + { + svtools::EditableColorConfig aColorConfig; + svtools::ColorConfigValue aValue; + aValue.bIsVisible = true; + aValue.nColor = aDarkColor; + aColorConfig.SetColorValue(svtools::DOCCOLOR, aValue); + aColorConfig.AddScheme(u"Dark"_ustr); + } + // Add a minimal light scheme + { + svtools::EditableColorConfig aColorConfig; + svtools::ColorConfigValue aValue; + aValue.bIsVisible = true; + aValue.nColor = COL_WHITE; + aColorConfig.SetColorValue(svtools::DOCCOLOR, aValue); + aColorConfig.AddScheme(u"Light"_ustr); + } + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + int nFirstViewId = SfxLokHelper::getView(); + ViewCallback aView1; + // Switch first view to light scheme + { + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { + { "NewTheme", uno::Any(OUString("Light")) }, + } + ); + dispatchCommand(mxComponent, ".uno:ChangeTheme", aPropertyValues); + } + // First view is at light scheme + assertTilePixelColor(pXImpressDocument, 255, 255, COL_WHITE); + // Create second view + SfxLokHelper::createView(); + int nSecondViewId = SfxLokHelper::getView(); + ViewCallback aView2; + // Set second view to dark scheme + { + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { + { "NewTheme", uno::Any(OUString("Dark")) }, + } + ); + dispatchCommand(mxComponent, ".uno:ChangeTheme", aPropertyValues); + } + assertTilePixelColor(pXImpressDocument, 255, 255, aDarkColor); + // First view still in light scheme + SfxLokHelper::setView(nFirstViewId); + assertTilePixelColor(pXImpressDocument, 255, 255, COL_WHITE); + // Second view still in dark scheme + SfxLokHelper::setView(nSecondViewId); + assertTilePixelColor(pXImpressDocument, 255, 255, Color(0x1c, 0x1c, 0x1c)); + // Switch second view back to light scheme + { + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { + { "NewTheme", uno::Any(OUString("Light")) }, + } + ); + dispatchCommand(mxComponent, ".uno:ChangeTheme", aPropertyValues); + } + // Now in light scheme + assertTilePixelColor(pXImpressDocument, 255, 255, COL_WHITE); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testRegenerateDiagram) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("regenerate-diagram.pptx"); + CPPUNIT_ASSERT(pXImpressDocument); + + SdPage* pActualPage = pXImpressDocument->GetDocShell()->GetViewShell()->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(static_cast(4), pActualPage->GetObj(0)->GetSubList()->GetObjCount()); + + // For new Diagram functionality entering group using UI is not allowed as long + // as the group shape is a diagram. Do the same as before done by triggering UI + // events directly in the model + // Remove and free top-left entry (Box showing "A") + pActualPage->GetObj(0)->GetSubList()->RemoveObject(1); + + // select diagram + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObj(0)->GetSubList()->GetObjCount()); + + // regenerate diagram + dispatchCommand(mxComponent, ".uno:RegenerateDiagram", uno::Sequence()); + + // diagram content (child shape count) should be the same as in the beginning + CPPUNIT_ASSERT_EQUAL(static_cast(4), pActualPage->GetObj(0)->GetSubList()->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testInsertDeletePageInvalidation) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + ViewCallback aView1; + CPPUNIT_ASSERT_EQUAL(8, pXImpressDocument->getParts()); + + // Insert slide + aView1.m_bTilesInvalidated = false; + aView1.m_aInvalidations.clear(); + dispatchCommand(mxComponent, ".uno:InsertPage", uno::Sequence()); + CPPUNIT_ASSERT(aView1.m_bTilesInvalidated); + CPPUNIT_ASSERT_EQUAL(9, pXImpressDocument->getParts()); + CPPUNIT_ASSERT_EQUAL(size_t(9), aView1.m_aInvalidations.size()); + + // Delete slide + aView1.m_bTilesInvalidated = false; + aView1.m_aInvalidations.clear(); + dispatchCommand(mxComponent, ".uno:DeletePage", uno::Sequence()); + CPPUNIT_ASSERT(aView1.m_bTilesInvalidated); + CPPUNIT_ASSERT_EQUAL(8, pXImpressDocument->getParts()); + CPPUNIT_ASSERT_EQUAL(size_t(8), aView1.m_aInvalidations.size()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSpellOnlineRenderParameter) +{ + // Load the document. + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + bool bSet = pXImpressDocument->GetDoc()->GetOnlineSpell(); + + uno::Sequence aPropertyValues = + { + comphelper::InitPropertySequence({ { ".uno:SpellOnline", uno::Any(!bSet) } }), + }; + pXImpressDocument->initializeForTiledRendering(aPropertyValues); + CPPUNIT_ASSERT_EQUAL(!bSet, pXImpressDocument->GetDoc()->GetOnlineSpell()); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSlideDuplicateUndo) +{ + // Create two views. + SdXImpressDocument* pXImpressDocument = createDoc("duplicate-undo.odp"); + int nView0 = SfxLokHelper::getView(); + SfxLokHelper::createView(); + pXImpressDocument->initializeForTiledRendering({}); + int nView1 = SfxLokHelper::getView(); + SfxLokHelper::setView(nView0); + + // Switch to the 3rd slide on view 0, and start text editing. + { + pXImpressDocument->setPart(2); + sd::ViewShell* pViewShell0 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView = pViewShell0->GetView(); + SdPage* pActualPage = pViewShell0->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(1); + SdrTextObj* pTextObj = static_cast(pObject); + pView->MarkObj(pTextObj, pView->GetSdrPageView()); + SfxStringItem aInputString(SID_ATTR_CHAR, "x"); + pViewShell0->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, + SfxCallMode::SYNCHRON, { &aInputString }); + CPPUNIT_ASSERT(pView->IsTextEdit()); + CPPUNIT_ASSERT(pView->GetTextEditPageView()); + } + + // Duplicate the first slide on view 1 and undo it. + SfxLokHelper::setView(nView1); + dispatchCommand(mxComponent, ".uno:DuplicatePage", {}); + pXImpressDocument->setPart(0, /*bAllowChangeFocus=*/false); + pXImpressDocument->setPart(1, /*bAllowChangeFocus=*/false); + SfxLokHelper::setView(nView0); + pXImpressDocument->setPart(0, /*bAllowChangeFocus=*/false); + pXImpressDocument->setPart(3, /*bAllowChangeFocus=*/false); + SfxLokHelper::setView(nView1); + pXImpressDocument->getUndoManager()->undo(); + // Without the accompanying fix in place, this would have tried to access the outdated page view + // pointer, potentially leading to a crash. + pXImpressDocument->setPart(2, /*bAllowChangeFocus=*/false); + + // Make sure that view 0 now doesn't have an outdated page view pointer. + SfxLokHelper::setView(nView0); + sd::ViewShell* pViewShell0 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView0 = pViewShell0->GetView(); + CPPUNIT_ASSERT(!pView0->GetTextEditPageView()); +} + +namespace +{ + +void lcl_extractHandleParameters(std::string_view selection, sal_uInt32& id, sal_uInt32& x, sal_uInt32& y) +{ + OString extraInfo( selection.substr(selection.find("{")) ); + std::stringstream aStream((std::string(extraInfo))); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + boost::property_tree::ptree + handle0 = aTree + .get_child("handles") + .get_child("kinds") + .get_child("rectangle") + .get_child("1") + .begin()->second; + id = handle0.get_child("id").get_value(); + x = handle0.get_child("point").get_child("x").get_value(); + y = handle0.get_child("point").get_child("y").get_value(); +} + +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testMoveShapeHandle) +{ + SdXImpressDocument* pXImpressDocument = createDoc("shape.odp"); + ViewCallback aView1; + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + SdrObject* pObject = pPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT(!aView1.m_ShapeSelection.isEmpty()); + { + sal_uInt32 id, x, y; + lcl_extractHandleParameters(aView1.m_ShapeSelection, id, x ,y); + sal_uInt32 oldX = x; + sal_uInt32 oldY = y; + uno::Sequence aPropertyValues(comphelper::InitPropertySequence( + { + {"HandleNum", uno::Any(id)}, + {"NewPosX", uno::Any(x+1)}, + {"NewPosY", uno::Any(y+1)} + })); + dispatchCommand(mxComponent, ".uno:MoveShapeHandle", aPropertyValues); + CPPUNIT_ASSERT(!aView1.m_ShapeSelection.isEmpty()); + lcl_extractHandleParameters(aView1.m_ShapeSelection, id, x ,y); + CPPUNIT_ASSERT_EQUAL(x-1, oldX); + CPPUNIT_ASSERT_EQUAL(y-1, oldY); + } +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testPasteUndo) +{ + // Given a document with a textbox, containing "world": + SdXImpressDocument* pXImpressDocument = createDoc("paste-undo.fodp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + pView->SdrBeginTextEdit(pObject); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_HOME); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_HOME); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + ESelection aWordSelection(0, 0, 0, 1); // "w" of "world" + rEditView.SetSelection(aWordSelection); + dispatchCommand(mxComponent, ".uno:Cut", {}); + + // When undoing a paste: + dispatchCommand(mxComponent, ".uno:Paste", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // Then make sure the cursor position is still at the beginning: + ESelection aSelection = rEditView.GetSelection(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 4 + // i.e. the cursor position after undo was at the end of the line, not at the start, as + // expected. + CPPUNIT_ASSERT_EQUAL(static_cast(0), aSelection.nStartPos); +} + +CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testShapeEditInMultipleViews) +{ + SdXImpressDocument* pXImpressDocument = createDoc("TextBoxAndRect.odg"); + pXImpressDocument->initializeForTiledRendering(uno::Sequence()); + SdDrawDocument* pDocument = pXImpressDocument->GetDoc(); + + // Create view 1 + const int nView1 = SfxLokHelper::getView(); + sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView1 = pViewShell1->GetView(); + Scheduler::ProcessEventsToIdle(); + + // Create view 2 + SfxLokHelper::createView(); + const int nView2 = SfxLokHelper::getView(); + CPPUNIT_ASSERT(nView1 != nView2); + + sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView2 = pViewShell2->GetView(); + Scheduler::ProcessEventsToIdle(); + + // Switch to view 1 + SfxLokHelper::setView(nView1); + + SdPage* pPage1 = pViewShell1->GetActualPage(); + + SdrObject* pTextBoxObject = pPage1->GetObj(0); + CPPUNIT_ASSERT_EQUAL(OUString("Text Box"), pTextBoxObject->GetName()); + + SdrObject* pRectangleObject = pPage1->GetObj(1); + CPPUNIT_ASSERT_EQUAL(OUString("Rect"), pRectangleObject->GetName()); + + SdrObject* pTableObject = pPage1->GetObj(2); + CPPUNIT_ASSERT_EQUAL(OUString("Table1"), pTableObject->GetName()); + + // Scenario 1 + // 2 shapes - "Text Box" and "Rect" + // View1 - "Text Box" enters text edit mode, View 2 - moves the "Rect" around + { + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + CPPUNIT_ASSERT_EQUAL(size_t(0), pUndoManager->GetUndoActionCount()); + + pView1->SdrBeginTextEdit(pTextBoxObject); + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // Local undo count for View1 is 0 + CPPUNIT_ASSERT_EQUAL(size_t(0), pView1->getViewLocalUndoManager()->GetUndoActionCount()); + // Write 'test' in View1 + SfxStringItem aInputString(SID_ATTR_CHAR, "test"); + pViewShell1->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, { &aInputString }); + // Local undo count for View1 is now 1 + CPPUNIT_ASSERT_EQUAL(size_t(1), pView1->getViewLocalUndoManager()->GetUndoActionCount()); + + // Mark rectangle object + pView2->MarkObj(pRectangleObject, pView2->GetSdrPageView()); + + // Check the initial position of the object + tools::Rectangle aRectangle = pRectangleObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(6250L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(7000L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(6501L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(4501L, aRectangle.GetHeight()); + + // On View2 - Move handle 0 on the shape to a new position - resize + Point aNewPosition = aRectangle.TopLeft() + Point(-1250, -1000); + pView2->MoveShapeHandle(0, aNewPosition, -1); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pUndoManager->GetUndoActionCount()); + + // Check the object has a new size + aRectangle = pRectangleObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(5000L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(6000L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(7751L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(5501L, aRectangle.GetHeight()); + + // View1 is still in text edit mode... + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // On View2 - relative move the shape to a different position + pView2->MoveMarkedObj(Size(1000, 2000), /*bCopy=*/false); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(2), pUndoManager->GetUndoActionCount()); + + // Check the object is at a different position + aRectangle = pRectangleObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(6000L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(8000L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(7751L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(5501L, aRectangle.GetHeight()); + + // View1 is still in text edit mode... + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // End Text edit - check undo count increase from 2 -> 3 + CPPUNIT_ASSERT_EQUAL(size_t(2), pUndoManager->GetUndoActionCount()); + pView1->SdrEndTextEdit(); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(3), pUndoManager->GetUndoActionCount()); + + // Check that both views exited the text edit mode + CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + } + + // Scenario 2 + // 1 shapes - "Text Box" + // View1 - "Text Box" enters text edit mode, View 2 - moves the "Text Box" around + { + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + CPPUNIT_ASSERT_EQUAL(size_t(3), pUndoManager->GetUndoActionCount()); + + pView1->SdrBeginTextEdit(pTextBoxObject); + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // Local undo count for View1 is 0 + CPPUNIT_ASSERT_EQUAL(size_t(0), pView1->getViewLocalUndoManager()->GetUndoActionCount()); + // Write 'test' in View1 + SfxStringItem aInputString(SID_ATTR_CHAR, "test"); + pViewShell1->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, { &aInputString }); + // Local undo count for View1 is now 1 + CPPUNIT_ASSERT_EQUAL(size_t(1), pView1->getViewLocalUndoManager()->GetUndoActionCount()); + + // Mark rectangle object + pView2->MarkObj(pTextBoxObject, pView2->GetSdrPageView()); + + // Check the initial position of the object + tools::Rectangle aRectangle = pTextBoxObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(2250L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(2000L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(4501L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(2001L, aRectangle.GetHeight()); + + // On View2 - Move handle 0 on the shape to a new position - resize + Point aNewPosition = aRectangle.TopLeft() + Point(-1250, -1000); + pView2->MoveShapeHandle(0, aNewPosition, -1); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(4), pUndoManager->GetUndoActionCount()); + + // Check the object has a new size + aRectangle = pTextBoxObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(1000L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(1000L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(4990L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(2175L, aRectangle.GetHeight()); + + // View1 is still in text edit mode... + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // On View2 - relative move the shape to a different position + pView2->MoveMarkedObj(Size(1000, 2000), /*bCopy=*/false); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(5), pUndoManager->GetUndoActionCount()); + + // Check the object is at a different position + aRectangle = pTextBoxObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(2000L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(3000L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(4990L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(2175L, aRectangle.GetHeight()); + + // View1 is still in text edit mode... + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // End Text edit - check undo count increase from 5 -> 6 + CPPUNIT_ASSERT_EQUAL(size_t(5), pUndoManager->GetUndoActionCount()); + pView1->SdrEndTextEdit(); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(6), pUndoManager->GetUndoActionCount()); + + // Check that both views exited the text edit mode + CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + } + + // Scenario 3 + // 1 shapes - "Table1" + // View1 - "Table1" enters text edit mode, View 2 - moves the "Table1" around + { + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + CPPUNIT_ASSERT_EQUAL(size_t(6), pUndoManager->GetUndoActionCount()); + + pView1->SdrBeginTextEdit(pTableObject); + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // Local undo count for View1 is 0 + CPPUNIT_ASSERT_EQUAL(size_t(0), pView1->getViewLocalUndoManager()->GetUndoActionCount()); + // Write 'test' in View1 + SfxStringItem aInputString(SID_ATTR_CHAR, "test"); + pViewShell1->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, { &aInputString }); + // Local undo count for View1 is now 1 + CPPUNIT_ASSERT_EQUAL(size_t(1), pView1->getViewLocalUndoManager()->GetUndoActionCount()); + + // Mark rectangle object + pView2->MarkObj(pTableObject, pView2->GetSdrPageView()); + + // Check the initial position of the table + tools::Rectangle aRectangle = pTableObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(2919L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(18063L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(14099L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(5999L, aRectangle.GetHeight()); + + // On View2 - relative move the shape to a different position + pView2->MoveMarkedObj(Size(1000, 2000), /*bCopy=*/false); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(7), pUndoManager->GetUndoActionCount()); + + // Check the object is at a different position + aRectangle = pTableObject->GetLogicRect(); + CPPUNIT_ASSERT_EQUAL(3919L, aRectangle.TopLeft().X()); + CPPUNIT_ASSERT_EQUAL(20063L, aRectangle.TopLeft().Y()); + CPPUNIT_ASSERT_EQUAL(14099L, aRectangle.GetWidth()); + CPPUNIT_ASSERT_EQUAL(5999L, aRectangle.GetHeight()); + + // View1 is still in text edit mode... + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + + // End Text edit - check undo count increase from 7 -> 8 + CPPUNIT_ASSERT_EQUAL(size_t(7), pUndoManager->GetUndoActionCount()); + pView1->SdrEndTextEdit(); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(size_t(8), pUndoManager->GetUndoActionCount()); + + // Check that both views exited the text edit mode + CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit()); + CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit()); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/uiimpress.cxx b/sd/qa/unit/uiimpress.cxx new file mode 100644 index 0000000000..41c685feef --- /dev/null +++ b/sd/qa/unit/uiimpress.cxx @@ -0,0 +1,1266 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sdmodeltestbase.hxx" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +/// Impress UI tests. +class SdUiImpressTest : public SdModelTestBase +{ +public: + SdUiImpressTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } + + void checkCurrentPageNumber(sal_uInt16 nNum); + void typeString(SdXImpressDocument* rImpressDocument, const std::u16string_view& rStr); + void typeKey(SdXImpressDocument* rImpressDocument, const sal_uInt16 nKey); + void insertStringToObject(sal_uInt16 nObj, const std::u16string_view& rStr, bool bUseEscape); + sd::slidesorter::SlideSorterViewShell* getSlideSorterViewShell(); + void lcl_search(const OUString& rKey, bool bFindAll = false, bool bBackwards = false); +}; + +void SdUiImpressTest::checkCurrentPageNumber(sal_uInt16 nNum) +{ + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawView(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xPage(xDrawView->getCurrentPage(), uno::UNO_SET_THROW); + uno::Reference xPropertySet(xPage, uno::UNO_QUERY); + + sal_uInt16 nPageNumber; + xPropertySet->getPropertyValue("Number") >>= nPageNumber; + CPPUNIT_ASSERT_EQUAL(nNum, nPageNumber); +} + +void SdUiImpressTest::typeKey(SdXImpressDocument* rImpressDocument, const sal_uInt16 nKey) +{ + rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, nKey); + rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, nKey); + Scheduler::ProcessEventsToIdle(); +} + +void SdUiImpressTest::typeString(SdXImpressDocument* rImpressDocument, + const std::u16string_view& rStr) +{ + for (const char16_t c : rStr) + { + rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, c, 0); + rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, c, 0); + Scheduler::ProcessEventsToIdle(); + } +} + +void SdUiImpressTest::insertStringToObject(sal_uInt16 nObj, const std::u16string_view& rStr, + bool bUseEscape) +{ + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + SdrObject* pShape = pPage->GetObj(nObj); + CPPUNIT_ASSERT_MESSAGE("No Shape", pShape); + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pShape, pView->GetSdrPageView()); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT(!pView->IsTextEdit()); + + typeString(pImpressDocument, rStr); + + CPPUNIT_ASSERT(pView->IsTextEdit()); + + if (bUseEscape) + { + typeKey(pImpressDocument, KEY_ESCAPE); + CPPUNIT_ASSERT(!pView->IsTextEdit()); + } +} + +sd::slidesorter::SlideSorterViewShell* SdUiImpressTest::getSlideSorterViewShell() +{ + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + sd::slidesorter::SlideSorterViewShell* pSSVS = nullptr; + // Same as in sd/qa/unit/misc-tests.cxx + for (int i = 0; i < 1000; i++) + { + // Process all Tasks - slide sorter is created here + Scheduler::ProcessEventsToIdle(); + if ((pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter( + pViewShell->GetViewShellBase())) + != nullptr) + break; + osl::Thread::wait(std::chrono::milliseconds(100)); + } + CPPUNIT_ASSERT(pSSVS); + return pSSVS; +} + +void SdUiImpressTest::lcl_search(const OUString& rKey, bool bFindAll, bool bBackwards) +{ + Scheduler::ProcessEventsToIdle(); + SvxSearchCmd eSearch = bFindAll ? SvxSearchCmd::FIND_ALL : SvxSearchCmd::FIND; + + uno::Sequence aPropertyValues(comphelper::InitPropertySequence({ + { "SearchItem.SearchString", uno::Any(rKey) }, + { "SearchItem.Backward", uno::Any(bBackwards) }, + { "SearchItem.Command", uno::Any(sal_uInt16(eSearch)) }, + })); + + dispatchCommand(mxComponent, ".uno:ExecuteSearch", aPropertyValues); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf111522) +{ + // Load the document and create two new windows. + createSdImpressDoc("tdf111522.odp"); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON); + sd::ViewShell* pViewShell1 = pImpressDocument->GetDocShell()->GetViewShell(); + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON); + sd::ViewShell* pViewShell2 = pImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell1 != pViewShell2); + + // Have slide 1 in window 1, slide 2 in window 2. + SfxRequest aRequest(*pViewShell2->GetViewFrame(), SID_SWITCHPAGE); + aRequest.AppendItem(SfxUInt32Item(ID_VAL_WHATPAGE, 1)); + aRequest.AppendItem( + SfxUInt32Item(ID_VAL_WHATKIND, static_cast(PageKind::Standard))); + pViewShell2->ExecuteSlot(aRequest, /*bAsync=*/false); + + // Start text edit in window 1. + SdPage* pPage1 = pViewShell1->GetActualPage(); + SdrObject* pShape1 = pPage1->GetObj(0); + SdrView* pView1 = pViewShell1->GetView(); + pView1->MarkObj(pShape1, pView1->GetSdrPageView()); + pView1->SdrBeginTextEdit(pShape1); + CPPUNIT_ASSERT(pView1->IsTextEdit()); + + // Move the shape in window 2 & undo. + SdPage* pPage2 = pViewShell2->GetActualPage(); + CPPUNIT_ASSERT(pPage1 != pPage2); + SdrObject* pShape2 = pPage2->GetObj(0); + SdrView* pView2 = pViewShell2->GetView(); + pView2->MarkObj(pShape2, pView2->GetSdrPageView()); + pView2->MoveMarkedObj(Size(1, 1), /*bCopy=*/false); + // Without the accompanying fix in place, this test would have failed with an assertion failure + // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr. + pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON); + + // Rotate the shape in window 2 & undo. + pView2->MarkObj(pShape2, pView2->GetSdrPageView()); + pView2->RotateMarkedObj(pShape2->GetLastBoundRect().Center(), /*nAngle=*/45_deg100); + // Without the accompanying fix in place, this test would have failed with an assertion failure + // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr. + pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON); + + // Start text edit in window 2. + // tdf#125824 + pView2->MarkObj(pShape2, pView2->GetSdrPageView()); + pView2->SdrBeginTextEdit(pShape2); + CPPUNIT_ASSERT(pView2->IsTextEdit()); + // Write 'test' inside the shape + SfxStringItem aInputString(SID_ATTR_CHAR, "test"); + pViewShell2->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, + { &aInputString }); + CPPUNIT_ASSERT(pView2->GetTextEditObject()); + EditView& rEditView = pView2->GetTextEditOutlinerView()->GetEditView(); + CPPUNIT_ASSERT_EQUAL(static_cast(4), rEditView.GetSelection().nStartPos); + pView2->SdrEndTextEdit(); + // Without the accompanying fix in place, this test would have failed with an assertion failure + // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr. + pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf126197) +{ + // Load the document and create two new windows. + createSdImpressDoc("tdf126197.odp"); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON); + sd::ViewShell* pViewShell1 = pImpressDocument->GetDocShell()->GetViewShell(); + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON); + sd::ViewShell* pViewShell2 = pImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell1 != pViewShell2); + + // Start text edit in window 1. + SdPage* pPage1 = pViewShell1->GetActualPage(); + SdrObject* pShape1 = pPage1->GetObj(0); + SdrView* pView1 = pViewShell1->GetView(); + pView1->MarkObj(pShape1, pView1->GetSdrPageView()); + pView1->SdrBeginTextEdit(pShape1); + CPPUNIT_ASSERT(pView1->IsTextEdit()); + + SdPage* pPage2 = pViewShell2->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(pPage1, pPage2); + SdrObject* pShape2 = pPage2->GetObj(0); + CPPUNIT_ASSERT_EQUAL(pShape1, pShape2); + SdrView* pView2 = pViewShell2->GetView(); + pView2->MarkObj(pShape2, pView2->GetSdrPageView()); + + // Without the accompanying fix in place, this test would have failed with an assertion failure + // in SdrObjEditView::SdrEndTextEdit() + pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_DELETE, SfxCallMode::SYNCHRON); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf124708) +{ + createSdImpressDoc("tdf124708.ppt"); + + dispatchCommand(mxComponent, ".uno:NextPage", {}); + + checkCurrentPageNumber(2); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(static_cast(16), pActualPage->GetObjCount()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Delete", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(0), pActualPage->GetObjCount()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(16), pActualPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf143412) +{ + createSdImpressDoc(); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + + SdPage* pActualPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pActualPage->GetObjCount()); + + OUString aImageURL = createFileURL(u"tdf143412.svg"); + uno::Sequence aArgs(comphelper::InitPropertySequence({ + { "FileName", uno::Any(aImageURL) }, + })); + dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs); + + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObjCount()); + + // Without the fix in place, this test would have crashed + // Check that converting an image to the different options doesn't crash + + dispatchCommand(mxComponent, ".uno:ChangeBezier", {}); + + dispatchCommand(mxComponent, ".uno:ChangePolygon", {}); + + dispatchCommand(mxComponent, ".uno:convert_to_contour", {}); + + dispatchCommand(mxComponent, ".uno:ConvertInto3D", {}); + + dispatchCommand(mxComponent, ".uno:ConvertInto3DLatheFast", {}); + + dispatchCommand(mxComponent, ".uno:ConvertIntoBitmap", {}); + + dispatchCommand(mxComponent, ".uno:ConvertIntoMetaFile", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf96206) +{ + // Copying/pasting slide referring to a non-default master with a text duplicated the master + + createSdImpressDoc("odp/tdf96206.odp"); + + sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell(); + auto& rSSController = pSSVS->GetSlideSorter().GetController(); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + const sal_uInt16 nMasterPageCnt1 = pDoc->GetMasterSdPageCount(PageKind::Standard); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), nMasterPageCnt1); + rSSController.GetClipboard().DoCopy(); + rSSController.GetClipboard().DoPaste(); + const sal_uInt16 nMasterPageCnt2 = pDoc->GetMasterSdPageCount(PageKind::Standard); + CPPUNIT_ASSERT_EQUAL(nMasterPageCnt1, nMasterPageCnt2); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf96708) +{ + createSdImpressDoc("odp/tdf96708.odp"); + + sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell(); + auto& rSSController = pSSVS->GetSlideSorter().GetController(); + auto& rPageSelector = rSSController.GetPageSelector(); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + SdDrawDocument* pDoc = pXImpressDocument->GetDoc(); + const sal_uInt16 nMasterPageCnt1 = pDoc->GetMasterSdPageCount(PageKind::Standard); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), nMasterPageCnt1); + rSSController.GetClipboard().DoCopy(); + rPageSelector.SelectAllPages(); + + // Now wait for timers to trigger creation of auto-layout + osl::Thread::wait(std::chrono::milliseconds(100)); + Scheduler::ProcessEventsToIdle(); + + rSSController.GetClipboard().DoPaste(); + + const sal_uInt16 nMasterPageCnt2 = pDoc->GetMasterSdPageCount(PageKind::Standard); + //FIXME: tdf#151802: Number of master pages should be 4, it's 5 instead + //CPPUNIT_ASSERT_EQUAL(nMasterPageCnt1, nMasterPageCnt2); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), nMasterPageCnt2); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf139996) +{ + createSdImpressDoc(); + + sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell(); + auto& rSSController = pSSVS->GetSlideSorter().GetController(); + auto& rPageSelector = rSSController.GetPageSelector(); + + CPPUNIT_ASSERT_EQUAL(1, rPageSelector.GetSelectedPageCount()); + + rPageSelector.DeselectAllPages(); + + CPPUNIT_ASSERT_EQUAL(0, rPageSelector.GetSelectedPageCount()); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:MovePageUp", {}); + + dispatchCommand(mxComponent, ".uno:MovePageDown", {}); + + dispatchCommand(mxComponent, ".uno:MovePageTop", {}); + + dispatchCommand(mxComponent, ".uno:MovePageBottom", {}); + + CPPUNIT_ASSERT_EQUAL(0, rPageSelector.GetSelectedPageCount()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf128651) +{ + // Error was, that undo and redo changes size of the shape. Affected actions were e.g. + // extrusion on/off, shadow on/off, changes on line or fill attributes. + // All these actions do not change the snap rectangle. + createSdImpressDoc("tdf128651_CustomShapeUndo.odp"); + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + auto pCustomShape = dynamic_cast(pObject); + CPPUNIT_ASSERT_MESSAGE("No Shape", pCustomShape); + const sal_Int32 nOrigWidth(pCustomShape->GetSnapRect().GetWidth()); + + SdDrawDocument* pDocument = pXImpressDocument->GetDoc(); + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + CPPUNIT_ASSERT_EQUAL(static_cast(0), pUndoManager->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(static_cast(0), pUndoManager->GetRedoActionCount()); + + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pCustomShape, pView->GetSdrPageView()); + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_EXTRUSION_TOGGLE, + SfxCallMode::SYNCHRON); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetUndoActionCount()); + + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON); + const sal_Int32 nUndoWidth(pCustomShape->GetSnapRect().GetWidth()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo changes width", nOrigWidth, nUndoWidth); + + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetRedoActionCount()); + pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_REDO, SfxCallMode::SYNCHRON); + const sal_Int32 nRedoWidth(pCustomShape->GetSnapRect().GetWidth()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Redo changes width", nUndoWidth, nRedoWidth); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf126605) +{ + createSdImpressDoc(); + + dispatchCommand(mxComponent, ".uno:InsertPage", {}); + + insertStringToObject(0, u"Test", /*bUseEscape*/ false); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(1), + uno::UNO_QUERY); + + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is()); + + uno::Reference paraEnumAccess(xText, uno::UNO_QUERY); + uno::Reference paraEnum(paraEnumAccess->createEnumeration()); + + // Get first paragraph + uno::Reference xParagraph(paraEnum->nextElement(), uno::UNO_QUERY_THROW); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + + sal_Int16 nWritingMode = 0; + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nWritingMode); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:ParaRightToLeft", {}); + + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, nWritingMode); + + dispatchCommand(mxComponent, ".uno:ParaLeftToRight", {}); + + xPropSet->getPropertyValue("WritingMode") >>= nWritingMode; + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nWritingMode); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf100950) +{ + createSdImpressDoc(); + + dispatchCommand(mxComponent, ".uno:InsertPage", {}); + + dispatchCommand(mxComponent, ".uno:InsertPage", {}); + + insertStringToObject(0, u"Test", /*bUseEscape*/ true); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell(); + auto& rSSController = pSSVS->GetSlideSorter().GetController(); + auto& rPageSelector = rSSController.GetPageSelector(); + + // Without the fix in place, this test would have failed here + CPPUNIT_ASSERT(rPageSelector.IsPageSelected(2)); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf130581_undo_hide_show_slide) +{ + createSdImpressDoc(); + + // Hide slide and check the number of available undo actions + dispatchCommand(mxComponent, ".uno:ShowSlide", {}); + dispatchCommand(mxComponent, ".uno:HideSlide", {}); + + // There should be a single undo action, i.e., hide slide + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + SdDrawDocument* pDocument = pXImpressDocument->GetDoc(); + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + // Check if there is the correct undo action, i.e., hide slide + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(SdResId(STR_UNDO_HIDE_SLIDE), pUndoManager->GetUndoActionComment()); + sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell(); + + // Check if the page is actually hidden + auto& rSSController = pSSVS->GetSlideSorter().GetController(); + auto& rPageSelector = rSSController.GetPageSelector(); + CPPUNIT_ASSERT_EQUAL(true, rPageSelector.IsPageExcluded(0)); + + // Undo hide slide action and check the number of available redo actions + // including the correct undo action, i.e., hide slide + dispatchCommand(mxComponent, ".uno:Undo", {}); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetRedoActionCount()); + CPPUNIT_ASSERT_EQUAL(SdResId(STR_UNDO_HIDE_SLIDE), pUndoManager->GetRedoActionComment()); + CPPUNIT_ASSERT_EQUAL(false, rPageSelector.IsPageExcluded(0)); + + // Show slide and check the number of available undo actions + dispatchCommand(mxComponent, ".uno:Redo", {}); + CPPUNIT_ASSERT_EQUAL(true, rPageSelector.IsPageExcluded(0)); + dispatchCommand(mxComponent, ".uno:ShowSlide", {}); + // There should be two undo actions, i.e., show and hide slide + CPPUNIT_ASSERT_EQUAL(static_cast(2), pUndoManager->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(SdResId(STR_UNDO_SHOW_SLIDE), pUndoManager->GetUndoActionComment()); + CPPUNIT_ASSERT_EQUAL(false, rPageSelector.IsPageExcluded(0)); + + // Undo show slide and check the number of available undo/redo actions + dispatchCommand(mxComponent, ".uno:Undo", {}); + // There should be one undo action, i.e., hide slide, and one redo action, i.e., show slide + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(SdResId(STR_UNDO_HIDE_SLIDE), pUndoManager->GetUndoActionComment()); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pUndoManager->GetRedoActionCount()); + CPPUNIT_ASSERT_EQUAL(SdResId(STR_UNDO_SHOW_SLIDE), pUndoManager->GetRedoActionComment()); + CPPUNIT_ASSERT_EQUAL(true, rPageSelector.IsPageExcluded(0)); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf129346) +{ + createSdImpressDoc(); + + dispatchCommand(mxComponent, ".uno:DiaMode", {}); + checkCurrentPageNumber(1); + + dispatchCommand(mxComponent, ".uno:InsertPage", {}); + checkCurrentPageNumber(2); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + checkCurrentPageNumber(1); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testmoveSlides) +{ + createSdImpressDoc(); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "PageName", uno::Any(OUString("Test 1")) }, + { "WhatLayout", uno::Any(sal_Int32(1)) }, + { "IsPageBack", uno::Any(false) }, + { "IsPageObj", uno::Any(false) } })); + + dispatchCommand(mxComponent, ".uno:InsertPage", aArgs); + checkCurrentPageNumber(2); + + CPPUNIT_ASSERT_EQUAL(OUString("Test 1"), pViewShell->GetActualPage()->GetName()); + + aArgs = comphelper::InitPropertySequence({ { "PageName", uno::Any(OUString("Test 2")) }, + { "WhatLayout", uno::Any(sal_Int32(1)) }, + { "IsPageBack", uno::Any(false) }, + { "IsPageObj", uno::Any(false) } }); + + dispatchCommand(mxComponent, ".uno:InsertPage", aArgs); + checkCurrentPageNumber(3); + + CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName()); + + // Move slide 'Test 2' up + for (size_t i = 2; i > 0; --i) + { + dispatchCommand(mxComponent, ".uno:MovePageUp", {}); + checkCurrentPageNumber(i); + CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName()); + } + + // Move slide 'Test 2' down + for (size_t i = 2; i < 4; ++i) + { + dispatchCommand(mxComponent, ".uno:MovePageDown", {}); + checkCurrentPageNumber(i); + CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName()); + } + + // Move slide 'Test 2' to the top + dispatchCommand(mxComponent, ".uno:MovePageFirst", {}); + checkCurrentPageNumber(1); + CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName()); + + // Move slide 'Test 2' to the bottom + dispatchCommand(mxComponent, ".uno:MovePageLast", {}); + checkCurrentPageNumber(3); + CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf148620) +{ + createSdImpressDoc(); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(u""_ustr, xShape->getString()); + + insertStringToObject(1, u"one", /*bUseEscape*/ false); + typeKey(pXImpressDocument, KEY_RETURN); + typeString(pXImpressDocument, u"two"); + typeKey(pXImpressDocument, KEY_RETURN); + typeString(pXImpressDocument, u"three"); + typeKey(pXImpressDocument, KEY_RETURN); + typeString(pXImpressDocument, u"four"); + typeKey(pXImpressDocument, KEY_RETURN); + typeString(pXImpressDocument, u"five"); + typeKey(pXImpressDocument, KEY_RETURN); + typeString(pXImpressDocument, u"six"); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nThree\nFour\nFive\nsix"_ustr, xShape->getString()); + + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(sal_Int32(0)) } })); + dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nThree\nFour\nsix\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nThree\nsix\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nsix\nThree\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nsix\nTwo\nThree\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"six\nOne\nTwo\nThree\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nsix\nTwo\nThree\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nsix\nThree\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nThree\nsix\nFour\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nThree\nFour\nsix\nFive"_ustr, xShape->getString()); + + dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs); + + CPPUNIT_ASSERT_EQUAL(u"One\nTwo\nThree\nFour\nFive\nsix"_ustr, xShape->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf141703) +{ + createSdImpressDoc(); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + // Move to A1 using Alt + Tab and write 'A' + for (int i = 0; i < 3; i++) + { + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_SHIFT | KEY_TAB); + Scheduler::ProcessEventsToIdle(); + } + + typeString(pXImpressDocument, u"A"); + + // Move to A2 with Tab and write 'B' + typeKey(pXImpressDocument, KEY_TAB); + + typeString(pXImpressDocument, u"B"); + + typeKey(pXImpressDocument, KEY_ESCAPE); + + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + auto pTableObject = dynamic_cast(pActualPage->GetObj(2)); + CPPUNIT_ASSERT(pTableObject); + + uno::Reference xTable(pTableObject->getTable(), uno::UNO_SET_THROW); + uno::Reference xCellA1(xTable->getCellByPosition(0, 0), + uno::UNO_QUERY_THROW); + uno::Reference xCellA2(xTable->getCellByPosition(1, 0), + uno::UNO_QUERY_THROW); + + uno::Reference xTextA1 + = uno::Reference(xCellA1, uno::UNO_QUERY_THROW)->getText(); + + // Without the fix in place, this test would have failed with + // - Expected: A + // - Actual : + CPPUNIT_ASSERT_EQUAL(OUString("A"), xTextA1->getString()); + + uno::Reference xTextA2 + = uno::Reference(xCellA2, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("B"), xTextA2->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf127481) +{ + createSdImpressDoc(); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pActualPage->GetObjCount()); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(1)) }, { "Columns", uno::Any(sal_Int32(1)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObjCount()); + + dispatchCommand(mxComponent, ".uno:DuplicatePage", aArgs); + + checkCurrentPageNumber(2); + + pActualPage = pViewShell->GetActualPage(); + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObjCount()); + + auto pTableObject = dynamic_cast(pActualPage->GetObj(2)); + CPPUNIT_ASSERT(pTableObject); + + //without the fix, it would crash here + pViewShell->GetView()->SdrBeginTextEdit(pTableObject); + + CPPUNIT_ASSERT_EQUAL(static_cast(3), pActualPage->GetObjCount()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testPageFillColor) +{ + // Load the document and create two new windows. + createSdImpressDoc("tdf126197.odp"); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + + // Set FillPageColor + + uno::Sequence aPropertyValues = { + comphelper::makePropertyValue("FillColor", static_cast(0xff0000)), + }; + dispatchCommand(mxComponent, ".uno:FillPageColor", aPropertyValues); + + SdPage* pPage = pViewShell->getCurrentPage(); + const SfxItemSet& rPageAttr = pPage->getSdrPageProperties().GetItemSet(); + + const XFillStyleItem* pFillStyle = rPageAttr.GetItem(XATTR_FILLSTYLE); + drawing::FillStyle eXFS = pFillStyle->GetValue(); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, eXFS); + + Color aColor = rPageAttr.GetItem(XATTR_FILLCOLOR)->GetColorValue(); + CPPUNIT_ASSERT_EQUAL(Color(0xff0000), aColor); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testPageFillGradient) +{ + // Load the document and create two new windows. + createSdImpressDoc("tdf126197.odp"); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + + // Set FillPageColor + + uno::Sequence aPropertyValues(comphelper::InitPropertySequence({ + { "FillPageGradientJSON", + uno::Any( + OUString("{\"style\":\"LINEAR\",\"startcolor\":\"ff0000\",\"endcolor\":\"0000ff\"," + "\"angle\":\"300\",\"border\":\"0\",\"x\":\"0\",\"y\":\"0\",\"intensstart\":" + "\"100\",\"intensend\":\"100\",\"stepcount\":\"0\"}")) }, + })); + + dispatchCommand(mxComponent, ".uno:FillPageGradient", aPropertyValues); + + SdPage* pPage = pViewShell->getCurrentPage(); + const SfxItemSet& rPageAttr = pPage->getSdrPageProperties().GetItemSet(); + + const XFillStyleItem* pFillStyle = rPageAttr.GetItem(XATTR_FILLSTYLE); + drawing::FillStyle eXFS = pFillStyle->GetValue(); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, eXFS); + + basegfx::BGradient aGradient(rPageAttr.GetItem(XATTR_FILLGRADIENT)->GetGradientValue()); + const basegfx::BColorStops& rColorStops(aGradient.GetColorStops()); + + CPPUNIT_ASSERT_EQUAL(size_t(2), rColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(rColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xff0000), Color(rColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(rColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x0000ff), Color(rColorStops[1].getStopColor())); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf134053) +{ + // Error was, that dashes and dots were longer than in MS Office. + createSdImpressDoc("pptx/tdf134053_dashdot.pptx"); + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pShape = pActualPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("No Shape", pShape); + + SdDrawDocument* pDocument = pXImpressDocument->GetDoc(); + sd::UndoManager* pUndoManager = pDocument->GetUndoManager(); + + // tdf#114613: Without the fix in place, this test would have failed with + // - Expected: 0 + // - Actual : 8 + CPPUNIT_ASSERT_EQUAL(static_cast(0), pUndoManager->GetUndoActionCount()); + CPPUNIT_ASSERT_EQUAL(static_cast(0), pUndoManager->GetRedoActionCount()); + + XDash dash = pShape->GetMergedItem(XATTR_LINEDASH).GetDashValue(); + + // Because 0% is not possible as dash length (as of June 2020) 1% is used in the fix. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Distance", 399.0, dash.GetDistance()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Dot length", 301.0, dash.GetDotLen()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Dash length", 1.0, dash.GetDashLen()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testSpellOnlineParameter) +{ + createSdImpressDoc(); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + bool bSet = pImpressDocument->GetDoc()->GetOnlineSpell(); + + uno::Sequence params( + comphelper::InitPropertySequence({ { "Enable", uno::Any(!bSet) } })); + dispatchCommand(mxComponent, ".uno:SpellOnline", params); + CPPUNIT_ASSERT_EQUAL(!bSet, pImpressDocument->GetDoc()->GetOnlineSpell()); + + // set the same state as now and we don't expect any change (no-toggle) + params = comphelper::InitPropertySequence({ { "Enable", uno::Any(!bSet) } }); + dispatchCommand(mxComponent, ".uno:SpellOnline", params); + CPPUNIT_ASSERT_EQUAL(!bSet, pImpressDocument->GetDoc()->GetOnlineSpell()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf38669) +{ + createSdImpressDoc(); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + + // Insert shape with ctrl key + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } })); + dispatchCommand(mxComponent, ".uno:BasicShapes.rectangle", aArgs); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xDrawPage->getCount()); + + typeString(pImpressDocument, u"°"); + + uno::Reference xShape(xDrawPage->getByIndex(2), uno::UNO_QUERY); + // Without the fix in place, this test would have failed with: + // - Expected: ° + // - Actual : ㅀ + CPPUNIT_ASSERT_EQUAL(u"°"_ustr, xShape->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf151417) +{ + createSdImpressDoc(); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDraws = xDrawPagesSupplier->getDrawPages(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount()); + + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xDrawPage->getCount()); + + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } })); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Edit", aArgs); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xDrawPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf123841) +{ + // To check if selecting unfilled rectangle produces unfilled rectangle + createSdImpressDoc(); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } })); + dispatchCommand(mxComponent, ".uno:Rect_Unfilled", aArgs); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xDrawPage->getCount()); + + for (int i = 0; i < 3; i++) + { + uno::Reference XPropSet(xDrawPage->getByIndex(i), uno::UNO_QUERY); + drawing::FillStyle eFillStyle = drawing::FillStyle_NONE; + XPropSet->getPropertyValue("FillStyle") >>= eFillStyle; + + // Without the fix in place, this test would have failed with + // with drawing::FillStyle_NONE != drawing::FillStyle_SOLID + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, eFillStyle); + } +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testSearchAllInDocumentAndNotes) +{ + // tdf#142478 + // "find all" produces a crash when the search string exists in notes + // and the document + + createSdImpressDoc("odp/search-all-notes.odp"); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + CPPUNIT_ASSERT(pViewShell); + + lcl_search("Crash", /*bFindAll=*/true, /*bBackwards=*/true); +} + +#if !defined(_WIN32) && !defined(MACOSX) +// for some reason, the search for "second" (or "Second") didn't return page 2 in WIN and MACOS +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf123658_SearchAfterSlideChange) +{ + createSdImpressDoc("odp/tdf123658_SearchAfterSlideChange.odp"); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + + lcl_search("second"); + checkCurrentPageNumber(2); + + pXImpressDocument->setPart(0); // Switch to 1st page + + lcl_search("of"); + // Instead of finding this on the 1st page (or on the 2nd page would be acceptable too) + // it was going to the third page. + checkCurrentPageNumber(1); +} +#endif + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf142589) +{ + createSdImpressDoc(); + + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + + SfxRequest aRequest(*pViewShell->GetViewFrame(), SID_PRESENTATION); + pImpressDocument->GetDoc()->getPresentationSettings().mbCustomShow = true; + pImpressDocument->GetDoc()->getPresentationSettings().mbStartCustomShow = true; + sd::slideshowhelp::ShowSlideShow(aRequest, *pImpressDocument->GetDoc()); + CPPUNIT_ASSERT_EQUAL(false, pImpressDocument->GetDoc()->getPresentationSettings().mbCustomShow); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testCharColorTheme) +{ + // Given an Impress document with a shape, with its text selected: + createSdImpressDoc(); + uno::Reference xPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + { + uno::Reference xText = xShape->getText(); + xText->insertString(xText->getStart(), u"test"_ustr, false); + } + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xController(xModel->getCurrentController(), + uno::UNO_QUERY); + xController->select(uno::Any(xShape)); + Scheduler::ProcessEventsToIdle(); + dispatchCommand(mxComponent, ".uno:Text", {}); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView = pViewShell->GetView(); + CPPUNIT_ASSERT(pView->IsTextEdit()); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + // When picking a theme color on the sidebar: + { + model::ComplexColor aComplexColor; + aComplexColor.setThemeColor(model::ThemeColorType::Accent1); + aComplexColor.addTransformation({ model::TransformationType::LumMod, 2000 }); + aComplexColor.addTransformation({ model::TransformationType::LumOff, 8000 }); + + OUString aJSON + = OStringToOUString(model::color::convertToJSON(aComplexColor), RTL_TEXTENCODING_UTF8); + + // When setting the fill color of that shape, with theme metadata & effects: + uno::Sequence aColorArgs = { + comphelper::makePropertyValue("Color.Color", sal_Int32(0xdae3f3)), // 80% light blue + comphelper::makePropertyValue("Color.ComplexColorJSON", uno::Any(aJSON)), + }; + dispatchCommand(mxComponent, ".uno:Color", aColorArgs); + } + + // Then make sure the theme "metadata" is set in the document model: + pView->EndTextEditCurrentView(); + CPPUNIT_ASSERT(!pView->IsTextEdit()); + uno::Reference xShapeParaAccess(xShape, uno::UNO_QUERY); + uno::Reference xPara( + xShapeParaAccess->createEnumeration()->nextElement(), uno::UNO_QUERY); + uno::Reference xPortion(xPara->createEnumeration()->nextElement(), + uno::UNO_QUERY); + { + uno::Reference xComplexColor; + CPPUNIT_ASSERT(xPortion->getPropertyValue("CharComplexColor") >>= xComplexColor); + CPPUNIT_ASSERT(xComplexColor.is()); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, + aComplexColor.getTransformations()[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2000), aComplexColor.getTransformations()[0].mnValue); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, + aComplexColor.getTransformations()[1].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(8000), aComplexColor.getTransformations()[1].mnValue); + } +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testFillColorTheme) +{ + // Given an Impress document with a selected shape: + createSdImpressDoc(); + uno::Reference xPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xPage(xPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xController(xModel->getCurrentController(), + uno::UNO_QUERY); + xController->select(uno::Any(xShape)); + + // Change fill color + { + model::ComplexColor aComplexColor; + aComplexColor.setThemeColor(model::ThemeColorType::Accent1); + aComplexColor.addTransformation({ model::TransformationType::LumMod, 4000 }); + aComplexColor.addTransformation({ model::TransformationType::LumOff, 6000 }); + + OUString aJSON + = OStringToOUString(model::color::convertToJSON(aComplexColor), RTL_TEXTENCODING_UTF8); + + // When setting the fill color of that shape, with theme metadata & effects: + uno::Sequence aColorArgs = { + comphelper::makePropertyValue("FillColor.Color", sal_Int32(0xed7d31)), // orange + comphelper::makePropertyValue("FillColor.ComplexColorJSON", + uno::Any(aJSON)), // accent 1 + }; + dispatchCommand(mxComponent, ".uno:FillColor", aColorArgs); + } + + // Then make sure the theme index is not lost when the sidebar sets it: + { + uno::Reference xComplexColor; + CPPUNIT_ASSERT(xShape->getPropertyValue("FillComplexColor") >>= xComplexColor); + CPPUNIT_ASSERT(xComplexColor.is()); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, + aComplexColor.getTransformations()[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), aComplexColor.getTransformations()[0].mnValue); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, + aComplexColor.getTransformations()[1].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), aComplexColor.getTransformations()[1].mnValue); + } +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testFillColorNoColor) +{ + // Given an empty Impress document: + createSdImpressDoc(); + auto pImpressDocument = dynamic_cast(mxComponent.get()); + sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell(); + SfxDispatcher* pDispatcher = pViewShell->GetViewFrame()->GetDispatcher(); + + // When dispatching a fill color that only has a fill style (no color), then make sure we don't + // crash: + XFillStyleItem aXFillStyleItem(drawing::FillStyle_NONE); + pDispatcher->ExecuteList(SID_ATTR_FILL_COLOR, SfxCallMode::RECORD, { &aXFillStyleItem }); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf153161) +{ + createSdImpressDoc("odp/tdf153161_FlushToSave.odp"); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + OUString sOldText(xShape->getString()); + CPPUNIT_ASSERT(sOldText.startsWith(u"在没有版本控制系统的时期")); + + // Type something, getting into text editing mode (appending) automatically + insertStringToObject(1, u"Foo Bar", /*bUseEscape*/ false); + + saveAndReload("impress8"); + + xDrawPagesSupplier.set(mxComponent, uno::UNO_QUERY); + xDrawPage.set(xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + xShape.set(xDrawPage->getByIndex(1), uno::UNO_QUERY); + OUString sExpectedText = sOldText + "Foo Bar"; + CPPUNIT_ASSERT_EQUAL(sExpectedText, xShape->getString()); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf148810) +{ + createSdImpressDoc("pptx/tdf148810_PARA_OUTLLEVEL.pptx"); + + // type something to get into text editing mode (instead of shape selection). + insertStringToObject(1, u"x", /*bUseEscape*/ false); + + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + typeKey(pXImpressDocument, KEY_HOME); + + typeKey(pXImpressDocument, KEY_BACKSPACE); + + uno::Reference xShape(getShapeFromPage(1, 0)); + uno::Reference xParagraph(getParagraphFromShape(0, xShape)); + uno::Reference xPropSet(xParagraph, uno::UNO_QUERY_THROW); + sal_Int16 nNumberingLevel = -1; + xPropSet->getPropertyValue("NumberingLevel") >>= nNumberingLevel; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nNumberingLevel); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + nNumberingLevel = -1; + xPropSet->getPropertyValue("NumberingLevel") >>= nNumberingLevel; + + // Without the fix in place, this test would have failed with + // - Expected: 0 + // - Actual : -1 + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nNumberingLevel); +} + +CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf127696) +{ + createSdImpressDoc(); + + dispatchCommand(mxComponent, ".uno:InsertPage", {}); + + insertStringToObject(0, u"Test", /*bUseEscape*/ false); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:OutlineFont", {}); + + // Save it as PPTX and load it again. + saveAndReload("Impress Office Open XML"); + + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(1), + uno::UNO_QUERY); + + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is()); + + uno::Reference paraEnumAccess(xText, uno::UNO_QUERY); + uno::Reference paraEnum(paraEnumAccess->createEnumeration()); + + uno::Reference xParagraph(paraEnum->nextElement(), uno::UNO_QUERY_THROW); + + uno::Reference runEnumAccess(xParagraph, uno::UNO_QUERY); + uno::Reference runEnum = runEnumAccess->createEnumeration(); + + uno::Reference xRun(runEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xPropSet(xRun, uno::UNO_QUERY_THROW); + + bool bContoured = false; + xPropSet->getPropertyValue("CharContoured") >>= bContoured; + CPPUNIT_ASSERT(bContoured); +} + +// TODO - Readd when we implement style level fill color and set that for default style +/*CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testThemeShapeInsert) +{ + // Given a document with a theme, accent1 color is set to 0x000004: + createSdImpressDoc(); + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xMasterPageTarget(xDrawPage, uno::UNO_QUERY); + uno::Reference xMasterPage(xMasterPageTarget->getMasterPage(), + uno::UNO_QUERY); + + auto pTheme = std::make_shared("mytheme"); + auto pColorSet = std::make_shared("mycolorscheme"); + pColorSet->add(model::ThemeColorType::Dark1, 0x0); + pColorSet->add(model::ThemeColorType::Light1, 0x1); + pColorSet->add(model::ThemeColorType::Dark2, 0x2); + pColorSet->add(model::ThemeColorType::Light2, 0x3); + pColorSet->add(model::ThemeColorType::Accent1, 0x4); + pColorSet->add(model::ThemeColorType::Accent2, 0x5); + pColorSet->add(model::ThemeColorType::Accent3, 0x6); + pColorSet->add(model::ThemeColorType::Accent4, 0x7); + pColorSet->add(model::ThemeColorType::Accent5, 0x8); + pColorSet->add(model::ThemeColorType::Accent6, 0x9); + pColorSet->add(model::ThemeColorType::Hyperlink, 0xa); + pColorSet->add(model::ThemeColorType::FollowedHyperlink, 0xb); + pTheme->setColorSet(pColorSet); + + xMasterPage->setPropertyValue("Theme", uno::Any(model::theme::createXTheme(pTheme))); + + // When inserting a shape: + uno::Sequence aArgs = { + comphelper::makePropertyValue("CreateDirectly", true), + }; + dispatchCommand(mxComponent, ".uno:BasicShapes.round-rectangle", aArgs); + + // Then make sure the that fill color of the last shape is the accent1 color: + sal_Int32 nShapeIndex = xDrawPage->getCount() - 1; + uno::Reference xShape(xDrawPage->getByIndex(nShapeIndex), uno::UNO_QUERY); + sal_Int32 nFillColor{}; + xShape->getPropertyValue("FillColor") >>= nFillColor; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 / 0x000004 (~black) + // - Actual : 7512015 / 0x729fcf (~blue) + CPPUNIT_ASSERT_EQUAL(static_cast(0x4), nFillColor); +}*/ + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/uimpress.cxx b/sd/qa/unit/uimpress.cxx new file mode 100644 index 0000000000..bd6bb16a75 --- /dev/null +++ b/sd/qa/unit/uimpress.cxx @@ -0,0 +1,110 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; + +namespace { + +class Test : public CppUnit::TestFixture { +public: + Test(); + + virtual void setUp() override; + virtual void tearDown() override; + + void testAddPage(); + void testCustomShow(); + + CPPUNIT_TEST_SUITE(Test); + CPPUNIT_TEST(testAddPage); + CPPUNIT_TEST(testCustomShow); + CPPUNIT_TEST_SUITE_END(); + +private: + uno::Reference< uno::XComponentContext > m_xContext; + std::unique_ptr m_pDoc; +}; + +Test::Test() + : m_xContext(cppu::defaultBootstrap_InitialComponentContext()) +{ + + uno::Reference xFactory(m_xContext->getServiceManager()); + uno::Reference xSM(xFactory, uno::UNO_QUERY_THROW); + + //Without this we're crashing because callees are using + //getProcessServiceFactory. In general those should be removed in favour + //of retaining references to the root ServiceFactory as it's passed around + comphelper::setProcessServiceFactory(xSM); + + InitVCL(); + + SdDLL::Init(); +} + +void Test::setUp() +{ + m_pDoc.reset(new SdDrawDocument(DocumentType::Impress, nullptr)); +} + +void Test::tearDown() +{ + m_pDoc.reset(); +} + +void Test::testAddPage() +{ + rtl::Reference pPage = m_pDoc->AllocPage(false); + m_pDoc->InsertPage(pPage.get()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("added one page to model", + static_cast(1), m_pDoc->GetPageCount()); + m_pDoc->DeletePage(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("removed one page to model", + static_cast(0), m_pDoc->GetPageCount()); + + rtl::Reference pMasterPage = m_pDoc->AllocPage(true); + m_pDoc->InsertMasterPage(pMasterPage.get()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("added one master page to model", + static_cast(1), m_pDoc->GetMasterPageCount()); + m_pDoc->DeleteMasterPage(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("removed one master page to model", + static_cast(0), m_pDoc->GetMasterPageCount()); +} + +void Test::testCustomShow() +{ + CPPUNIT_ASSERT_MESSAGE("test generation of custom show list!", + m_pDoc->GetCustomShowList(true)); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(Test); + +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unoapi/knownissues.xcl b/sd/qa/unoapi/knownissues.xcl new file mode 100644 index 0000000000..d9e0690013 --- /dev/null +++ b/sd/qa/unoapi/knownissues.xcl @@ -0,0 +1,86 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +### tdf#115345 - not useful to set Orientation ### +sd.SdDrawPage::com::sun::star::drawing::GenericDrawPage +sd.SdGenericDrawPage::com::sun::star::drawing::GenericDrawPage +sd.SdMasterPage::com::sun::star::drawing::GenericDrawPage + +### i84994 ### +sd.SdXImpressDocument::com::sun::star::view::XPrintable +# -> disabled in sd.sce + +### i34994 ### +sd.SdXPresentation::com::sun::star::presentation::Presentation + +### i53605 ### +sd.DrawController_OutlineView::com::sun::star::awt::XUserInputInterception +sd.DrawController_PresentationView::com::sun::star::awt::XUserInputInterception +sd.DrawController_DrawView::com::sun::star::awt::XUserInputInterception +sd.DrawController_HandoutView::com::sun::star::awt::XUserInputInterception +sd.DrawController_NotesView::com::sun::star::awt::XUserInputInterception + +### i63664 ### +sd.DrawController_OutlineView::com::sun::star::view::XSelectionSupplier +sd.DrawController_PresentationView::com::sun::star::view::XSelectionSupplier + +### i65255 ### +sd.DrawController_OutlineView::com::sun::star::drawing::DrawingDocumentDrawView +sd.DrawController_PresentationView::com::sun::star::drawing::DrawingDocumentDrawView +sd.DrawController_DrawView::com::sun::star::drawing::DrawingDocumentDrawView +sd.DrawController_HandoutView::com::sun::star::drawing::DrawingDocumentDrawView +sd.DrawController_NotesView::com::sun::star::drawing::DrawingDocumentDrawView + +### i65256 ### +sd.DrawController_PresentationView::com::sun::star::drawing::XDrawView +sd.DrawController_HandoutView::com::sun::star::drawing::XDrawView +sd.DrawController_NotesView::com::sun::star::drawing::XDrawView + +### i84992 ### +sd.DrawController_NotesView::com::sun::star::ui::XContextMenuInterception +sd.DrawController_OutlineView::com::sun::star::ui::XContextMenuInterception +sd.DrawController_HandoutView::com::sun::star::ui::XContextMenuInterception +sd.DrawController_PresentationView::com::sun::star::ui::XContextMenuInterception +sd.DrawController_DrawView::com::sun::star::ui::XContextMenuInterception + +### i87746 ### +sd.SdXShape::com::sun::star::drawing::Shape::Style +# -> disabled in sd.sce + +### i88256 ### +sd.SdXCustomPresentationAccess::com::sun::star::container::XNameReplace + +### i88309 ### +sd.DrawController_OutlineView::com::sun::star::frame::XController + +### i88537 ### +sd.DrawController_OutlineView::com::sun::star::beans::XPropertySet + +### i88537 ### +sd.DrawController_PresentationView::com::sun::star::beans::XPropertySet + +### i109518 ### +sd.SdXPresentation::com::sun::star::presentation::XPresentation +sd.SdXPresentation::com::sun::star::beans::XPropertySet + +### i113161 ### +sd.SdLayer::com::sun::star::beans::XPropertySet +sd.SdLayer::com::sun::star::drawing::Layer + +### i113386 ### +sd.AccessibleDrawDocumentView::com::sun::star::accessibility::XAccessibleComponent diff --git a/sd/qa/unoapi/sd.sce b/sd/qa/unoapi/sd.sce new file mode 100644 index 0000000000..3ba62b02d2 --- /dev/null +++ b/sd/qa/unoapi/sd.sce @@ -0,0 +1,41 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +-o sd.AccessibleDrawDocumentView +#i111199 -o sd.AccessibleOutlineView +#i35935# -o sd.AccessibleSlideView +#i111042# -o sd.DrawController_DrawView +#i111042# -o sd.DrawController_HandoutView +#i111042# -o sd.DrawController_NotesView +#i111043# -o sd.DrawController_OutlineView +#i111042# -o sd.DrawController_PresentationView +-o sd.SdDocLinkTargets +-o sd.SdDrawPage +-o sd.SdDrawPagesAccess +-o sd.SdGenericDrawPage +-o sd.SdLayer +-o sd.SdLayerManager +-o sd.SdMasterPage +-o sd.SdMasterPagesAccess +-o sd.SdPageLinkTargets +-o sd.SdXCustomPresentation +#i111329 -o sd.SdXCustomPresentationAccess +#i84994# -o sd.SdXImpressDocument +-o sd.SdXPresentation +#i87746 -o sd.SdXShape + diff --git a/sd/sdi/SlideSorterController.sdi b/sd/sdi/SlideSorterController.sdi new file mode 100644 index 0000000000..22bc642148 --- /dev/null +++ b/sd/sdi/SlideSorterController.sdi @@ -0,0 +1,341 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +enum FadeEffect +{ + FADE_EFFECT_NONE , + FADE_EFFECT_FADE_FROM_LEFT , + FADE_EFFECT_FADE_FROM_TOP , + FADE_EFFECT_FADE_FROM_RIGHT , + FADE_EFFECT_FADE_FROM_BOTTOM , + FADE_EFFECT_FADE_TO_CENTER , + FADE_EFFECT_FADE_FROM_CENTER , + FADE_EFFECT_MOVE_FROM_LEFT , + FADE_EFFECT_MOVE_FROM_TOP , + FADE_EFFECT_MOVE_FROM_RIGHT , + FADE_EFFECT_MOVE_FROM_BOTTOM , + FADE_EFFECT_ROLL_FROM_LEFT , + FADE_EFFECT_ROLL_FROM_TOP , + FADE_EFFECT_ROLL_FROM_RIGHT , + FADE_EFFECT_ROLL_FROM_BOTTOM , + FADE_EFFECT_VERTICAL_STRIPES , + FADE_EFFECT_HORIZONTAL_STRIPES , + FADE_EFFECT_OPEN_VERTICAL , + FADE_EFFECT_CLOSE_VERTICAL , + FADE_EFFECT_OPEN_HORIZONTAL , + FADE_EFFECT_CLOSE_HORIZONTAL , + FADE_EFFECT_CLEAR_AWAY , + FADE_EFFECT_OVERLAY +} + +enum FadeSpeed +{ + FADE_SPEED_SLOW , + FADE_SPEED_MEDIUM , + FADE_SPEED_FAST +} + +enum PresChange +{ + PresChange::Manual , + PresChange::Auto , + PresChange::SemiAuto +} ; + + // Items +item UINT32 DiaTimeItem ; +item PresChange DiaAutoItem ; +item FadeEffect DiaEffectItem ; +item FadeSpeed DiaSpeedItem ; + + +interface SlideSorterView +{ + SID_INSERTPAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_MASTER_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DUPLICATE_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DELETE_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetClipboardState ; + ] + SID_DELETE_MASTER_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetClipboardState ; + ] + SID_RENAMEPAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_RENAME_MASTER_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DELETE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CUT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetClipboardState ; + ] + SID_COPY // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetClipboardState ; + ] + SID_PASTE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetClipboardState ; + ] + SID_PASTE_SPECIAL // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetClipboardState ; + ] + SID_REHEARSE_TIMINGS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_CURRENT_SLIDE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_HIDE_SLIDE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SHOW_SLIDE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_SELECT // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_TOOLBOX // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SIZE_VISAREA // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PAGES_PER_ROW // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_SELECTALL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_STATUS_PAGE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_STATUS_LAYOUT // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_SCALE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_RELOAD // ole : no, status : ? + [ + GroupId = SfxGroupId::Document ; + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + Asynchron , AutoUpdate , + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_SEARCH_DLG // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + SID_SLIDE_TRANSITIONS_PANEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MASTER_SLIDES_PANEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_DLG + [ + ExecMethod = FuTemporary ; + ] + SID_REMOTE_DLG + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CUSTOMSHOW_DLG + [ + ExecMethod = FuTemporary ; + ] + SID_EXPAND_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SUMMARY_PAGE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OUTPUT_QUALITY_COLOR // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_OUTPUT_QUALITY_GRAYSCALE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_OUTPUT_QUALITY_BLACKWHITE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_OUTPUT_QUALITY_CONTRAST // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_MAIL_SCROLLBODY_PAGEDOWN // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_STYLE_FAMILY + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_OPT_LOCALE_CHANGED // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + + SID_GETUNDOSTRINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_UNDO // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GETREDOSTRINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_REDO // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_MODIFYPAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ASSIGN_LAYOUT + [ + ExecMethod = FuTemporary; + StateMethod = GetMenuState; + ] + SID_PHOTOALBUM + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MOVE_PAGE_UP + [ + ExecMethod = ExecMovePageUp ; + StateMethod = GetStateMovePageUp ; + ] + SID_MOVE_PAGE_DOWN + [ + ExecMethod = ExecMovePageDown ; + StateMethod = GetStateMovePageDown ; + ] + SID_MOVE_PAGE_FIRST + [ + ExecMethod = ExecMovePageFirst ; + StateMethod = GetStateMovePageFirst ; + ] + SID_MOVE_PAGE_LAST + [ + ExecMethod = ExecMovePageLast ; + StateMethod = GetStateMovePageLast ; + ] +} + +shell SlideSorterController +{ + import SlideSorterView; +} + +shell SlideSorterViewShell +{ + import SlideSorterView; +} diff --git a/sd/sdi/ViewShellBase.sdi b/sd/sdi/ViewShellBase.sdi new file mode 100644 index 0000000000..f39368368f --- /dev/null +++ b/sd/sdi/ViewShellBase.sdi @@ -0,0 +1,152 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface ViewShellBaseView +{ + SID_SWITCH_SHELL + [ + ExecMethod = Execute; + ] + SID_LEFT_PANE_IMPRESS + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_LEFT_PANE_DRAW + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_NOTES_WINDOW + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_NORMAL_MULTI_PANE_GUI + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_SLIDE_SORTER_MULTI_PANE_GUI + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TOGGLE_TABBAR_VISIBILITY + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_DISPLAY_MODE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_DRAWINGMODE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_SLIDE_SORTER_MODE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_OUTLINE_MODE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_NOTES_MODE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_HANDOUT_MASTER_MODE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_SLIDE_MASTER_MODE + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_NOTES_MASTER_MODE + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_WIN_FULLSCREEN + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + FN_INSERT_SOFT_HYPHEN // status(final|play) + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + FN_INSERT_HARDHYPHEN // status() + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + FN_INSERT_HARD_SPACE // status(final|play) + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + FN_INSERT_NNBSP // status(final|play) + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_INSERT_RLM + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_INSERT_LRM + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_INSERT_ZWSP + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_INSERT_WJ + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_RESTORE_EDITING_VIEW + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_INSERT_DRAW + [] +} + +shell ViewShellBase +{ + import ViewShellBaseView; +} diff --git a/sd/sdi/_docsh.sdi b/sd/sdi/_docsh.sdi new file mode 100644 index 0000000000..02de70858a --- /dev/null +++ b/sd/sdi/_docsh.sdi @@ -0,0 +1,93 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +interface DrawDocument +{ + SID_ATTR_CHAR_FONTLIST + [ + StateMethod = GetState ; + ] + SID_CLOSEDOC // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_HANGUL_HANJA_CONVERSION // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_CHINESE_CONVERSION // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_LANGUAGE_STATUS + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + // ? + FID_SEARCH_NOW // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Document ; + ] + // ? + FID_SEARCH_ON // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Document ; + ] + // ? + FID_SEARCH_OFF // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Document ; + ] + + SID_GET_COLORLIST + [ + ExecMethod = Execute; + ] + SID_VERSION + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_NOTEBOOKBAR + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_SPELLCHECK_IGNORE_ALL + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_SPELLCHECK_APPLY_SUGGESTION + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] +} + diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi new file mode 100644 index 0000000000..55ed82d07d --- /dev/null +++ b/sd/sdi/_drvwsh.sdi @@ -0,0 +1,2955 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface DrawView +{ + SID_JUMPTOMARK // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_SWITCHPAGE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_SWITCHLAYER // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_RELOAD // ole : no, status : ? + [ + GroupId = SfxGroupId::Document ; + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + Asynchron , AutoUpdate , + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_PAGEMODE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + SID_LAYERMODE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + SID_OBJECTRESIZE // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + SID_ORIGINAL_SIZE // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CHANGE_PICTURE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SAVE_GRAPHIC + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_COMPRESS_GRAPHIC + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_GRAPHIC_SIZE_CHECK + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTERNAL_EDIT + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CUT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_COPY // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PASTE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_UNICODE_NOTATION_TOGGLE + [ + ExecMethod = FuSupport; + ] + SID_PASTE_UNFORMATTED + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_CLIPBOARD_FORMAT_ITEMS + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ]; + SID_DRAWINGMODE // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_MASTERPAGE // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + // Menu messages for temporary functions with dialog + SID_ATTR_ZOOM // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetStatusBarState ; + ] + SID_ATTR_ZOOMSLIDER // status() + [ + ExecMethod = FuTemporary ; + StateMethod = GetStatusBarState ; + ] + SID_ATTRIBUTES_LINE // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ATTRIBUTES_AREA // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERTPAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERTPAGE_QUICK // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_HYPERLINK_SETLINK // ole : no, status : no + [ + ExecMethod = FuTemporary ; + ] + SID_HYPERLINK_GETLINK // ole : no, status : no + [ + StateMethod = GetCtrlState ; + ] + SID_READONLY_MODE // ole : no, status : no + [ + StateMethod = GetCtrlState ; + ] + SID_RENAMEPAGE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_RENAMEPAGE_QUICK // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERTLAYER // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MODIFYLAYER // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_TOGGLELAYERVISIBILITY // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_RENAMELAYER // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_NAVIGATOR // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_3D_WIN // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_3D_INIT // ole : no, status : ? + [ + ExecMethod = ExecEffectWin ; + StateMethod = GetMenuState ; + ] + SID_3D_STATE // ole : no, status : ? + [ + ExecMethod = ExecEffectWin ; + StateMethod = GetMenuState ; + ] + SID_3D_ASSIGN // ole : no, status : ? + [ + ExecMethod = ExecEffectWin ; + StateMethod = GetMenuState ; + ] + SID_ATTR_TRANSFORM // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + + SID_ATTR_TRANSFORM_WIDTH // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_HEIGHT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_POS_X // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_POS_Y // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_ANGLE + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_ROT_X + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_ROT_Y + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_PROTECT_POS + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_PROTECT_SIZE + [ + ExecMethod = FuTemporary ; + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_AUTOWIDTH + [ + StateMethod = GetDrawAttrState ; + ] + SID_ATTR_TRANSFORM_AUTOHEIGHT + [ + StateMethod = GetDrawAttrState ; + ] + + /// !? + SID_CHAR_DLG // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CHAR_DLG_EFFECT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + + SID_PARA_DLG // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_CHARMAP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CHARMAP_CONTROL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + FN_INSERT_SOFT_HYPHEN // status(final|play) + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + FN_INSERT_HARDHYPHEN // status() + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + FN_INSERT_HARD_SPACE // status(final|play) + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + FN_INSERT_NNBSP // status(final|play) + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_RLM + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_LRM + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_ZWSP + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_WJ + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + + SID_PASTE_SPECIAL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + + SID_INSERT_GRAPHIC // ole : no, status : todo + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Insert ; + Asynchron , + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_MANAGE_LINKS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_THESAURUS // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ATTR_TABLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + + SID_INSERT_DIAGRAM // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + Asynchron , + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_BMPMASK // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_BMPMASK_PIPETTE // ole : no, status : ? + [ + ExecMethod = ExecBmpMask ; + StateMethod = GetBmpMaskState ; + ] + SID_BMPMASK_EXEC // ole : no, status : ? + [ + ExecMethod = ExecBmpMask ; + StateMethod = GetBmpMaskState ; + ] + SID_INSERT_OBJECT // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLOATINGFRAME // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_MATH // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_COPYOBJECTS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PAGESETUP // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PAGESIZE // ole : no, status : rec play + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PAGEMARGIN // ole : no, status : rec play + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_LAYOUT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_GROUP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + FastCall = FALSE ; + ] + SID_ENTER_GROUP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_LEAVE_GROUP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_LEAVE_ALL_GROUPS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_UNGROUP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + FastCall = FALSE ; + ] + SID_TEXT_COMBINE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_COMBINE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_DLG // ole : no, status : ? + [ + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + ] + SID_DISTRIBUTE_HLEFT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_HCENTER // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_HDISTANCE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_HRIGHT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_VTOP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_VCENTER // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_VDISTANCE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISTRIBUTE_VBOTTOM // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_POLY_MERGE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_POLY_SUBSTRACT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_POLY_INTERSECT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EQUALIZEWIDTH // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EQUALIZEHEIGHT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONNECT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISMANTLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_BREAK // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONVERT_TO_3D // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONVERT_TO_3D_LATHE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONVERT_TO_BITMAP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONVERT_TO_METAFILE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FRAME_TO_TOP // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MOREFRONT // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FRAME_UP // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_BEFORE_OBJ // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_BEHIND_OBJ // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_REVERSE_ORDER // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MOREBACK // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FRAME_DOWN // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FRAME_TO_BOTTOM // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_ALIGN_LEFT // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_ALIGN_CENTER // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_ALIGN_RIGHT // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_ALIGN_UP // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_ALIGN_MIDDLE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_ALIGN_DOWN // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SELECTALL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_NEXT // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_PREV // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_OUT // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_MODE // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_PANNING // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_IN // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SIZE_REAL // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SIZE_PAGE // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SIZE_VISAREA // ole : no, status : no + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SIZE_PAGE_WIDTH // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SIZE_OPTIMAL // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SIZE_ALL // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DELETE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + Asynchron , + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_CHANGEBEZIER // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CHANGEPOLYGON // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ReadOnlyDoc = FALSE ; + ] + SID_CONVERT_TO_CONTOUR // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ReadOnlyDoc = FALSE ; + ] + FN_NUM_BULLET_ON + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + FN_NUM_NUMBERING_ON + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_OUTLINE_BULLET // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + MenuConfig = TRUE; + ] + FN_SVX_SET_BULLET + [ + ExecMethod = FuTemporary ; + ] + FN_SVX_SET_NUMBER + [ + ExecMethod = FuTemporary ; + ] + FN_BUL_NUM_RULE_INDEX + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + Asynchron , AutoUpdate ; + ] + FN_NUM_NUM_RULE_INDEX + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + Asynchron , AutoUpdate ; + ] + SID_ATTR_CHAR // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_TEXT_VERTICAL // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_TEXTEDIT // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_TEXT_FITTOSIZE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_OUTLINE_TEXT_AUTOFIT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_TEXT_FITTOSIZE_VERTICAL // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_VERTICALTEXT_STATE + [ + StateMethod = GetMenuState ; + ] + SID_CTLFONT_STATE + [ + StateMethod = GetMenuState ; + ] + + + SID_OBJECT_ROTATE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + AutoUpdate , + MenuConfig , AccelConfig , ToolBoxConfig ; + ] + SID_OBJECT_SHEAR // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + + SID_OBJECT_MIRROR // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + + SID_OBJECT_CROP // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + + SID_OBJECT_TRANSPARENCE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_GRADIENT // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + + SID_OBJECT_CROOK_ROTATE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_CROOK_SLANT // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_CROOK_STRETCH // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_RECT // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_RECT_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_RECT_ROUND // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_RECT_ROUND_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_SQUARE // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_SQUARE_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_SQUARE_ROUND // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_SQUARE_ROUND_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_TOOL_CONNECTOR // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_ARROW_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_ARROW_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_ARROWS // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CIRCLE_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CIRCLE_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CIRCLES // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE_ARROW_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE_ARROW_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE_ARROWS // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE_CIRCLE_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE_CIRCLE_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINE_CIRCLES // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE_ARROW_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE_ARROW_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE_ARROWS // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE_CIRCLE_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE_CIRCLE_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_CURVE_CIRCLES // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES_ARROW_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES_ARROW_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES_ARROWS // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES_CIRCLE_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES_CIRCLE_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_CONNECTOR_LINES_CIRCLES // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_ARROW_START // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_ARROW_END // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_ARROWS // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_ARROW_CIRCLE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_CIRCLE_ARROW // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_ARROW_SQUARE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINE_SQUARE_ARROW // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CAPTION // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CAPTION_VERTICAL // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLE // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLE_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_ELLIPSE // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_ELLIPSE_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_ARC // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLEARC // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_PIE // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_PIE_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLEPIE // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLEPIE_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLECUT // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CIRCLECUT_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_ELLIPSECUT // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_ELLIPSECUT_NOFILL // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_LINE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_MEASURELINE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_XLINE // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_MOVETO // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_LINETO // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_BEZIERTO // ole : no, status : play rec + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_XPOLYGON // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_XPOLYGON_NOFILL // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_POLYGON // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_POLYGON_NOFILL // ole : no, status : no + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_BEZIER_FILL // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_BEZIER_NOFILL // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_FREELINE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_FREELINE_NOFILL // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_CUBE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_SPHERE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_CYLINDER // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_CONE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_PYRAMID // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_SHELL // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_TORUS // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_3D_HALF_SPHERE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + + SID_OBJECT_ALIGN // ole : no, status : ? + [ + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + ] + + SID_ZOOM_TOOLBOX // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_CHOOSE_MODE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_POSITION // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_TEXT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CONNECTORS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_RECTANGLES // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_ELLIPSES // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_REDACTED_EXPORT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_LINES // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_ARROWS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_3D_OBJECTS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_INSERT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_SELECT // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ReadOnlyDoc = TRUE ; + ] + + // Begin FormSlots + SID_FM_CREATE_CONTROL + [ + ExecMethod = FuPermanent ; + ] + SfxBoolItem CreateFieldControl SID_FM_CREATE_FIELDCONTROL + () + [ + ExecMethod = FuPermanent ; + ] + SID_ATTR_YEAR2000 + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + // End FormSlots + + SID_ATTR_FILL_STYLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_COLOR // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_GRADIENT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_HATCH // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_BITMAP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_USE_SLIDE_BACKGROUND // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_TRANSPARENCE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_FILL_FLOATTRANSPARENCE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_STYLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_JOINT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_CAP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_TRANSPARENCE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_DASH // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_DASH_LIST + [ + StateMethod = GetAttrState ; + ] + SID_LINEEND_LIST + [ + StateMethod = GetAttrState ; + ] + SID_COLOR_TABLE + [ + StateMethod = GetAttrState; + ] + SID_GRADIENT_LIST + [ + StateMethod = GetAttrState ; + ] + SID_HATCH_LIST + [ + StateMethod = GetAttrState ; + ] + SID_BITMAP_LIST + [ + StateMethod = GetAttrState ; + ] + SID_PATTERN_LIST + [ + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_WIDTH // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_COLOR // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINEEND_STYLE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_START // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_LINE_END // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_DELETE_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DELETE_LAYER // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERTFILE // ole : no, status : todo + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_STYLE_FAMILY2 // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_STYLE_FAMILY3 // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_STYLE_NEW // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_DRAGHIERARCHIE // ole : no, status : ? + [ + StateMethod = GetAttrState ; + ] + SID_STYLE_EDIT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_DELETE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_HIDE + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_SHOW + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_APPLY // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_WATERCAN // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_NEW_BY_EXAMPLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_UPDATE_BY_EXAMPLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_SET_DEFAULT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_REMOVE_HYPERLINK // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_RULER_PAGE_POS // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + + SID_RULER_OBJECT // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + + SID_RULER_NULL_OFFSET // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + SID_ATTR_LONG_LRSPACE // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + SID_ATTR_LONG_ULSPACE // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + SID_RULER_LR_MIN_MAX // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + + SID_RULER_PROTECT // status() + [ + StateMethod = GetRulerState ; + ] + SID_RULER_TEXT_RIGHT_TO_LEFT + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + + SID_ATTR_TABSTOP // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetRulerState ; + ] + + SID_ATTR_PARA_LRSPACE // ole : no, status : ? + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_PARA_LINESPACE + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_PARA_ULSPACE + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_PARA_ADJUST_LEFT + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_PARA_ADJUST_CENTER + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_PARA_ADJUST_RIGHT + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_PARA_ADJUST_BLOCK + [ + ExecMethod = ExecRuler ; + StateMethod = GetAttrState ; + ] + SID_ATTR_POSITION // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_ATTR_SIZE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_STATUS_PAGE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_STATUS_LAYOUT // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_SCALE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_LINEEND_POLYGON // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_NAME_GROUP // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OBJECT_TITLE_DESCRIPTION // #i68101# ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONTEXT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SET_SNAPITEM // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetSnapItemState ; + ] + SID_DELETE_SNAPITEM // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetSnapItemState ; + ] + SID_CAPTUREPOINT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + GroupId = SfxGroupId::Document ; + ] + SID_SWITCH_POINTEDIT // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_RULER // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + MenuConfig = TRUE ; + ] + SID_COLOR_CONTROL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FORMTEXT_STYLE // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_ADJUST // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_DISTANCE // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_START // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_MIRROR // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_HIDEFORM // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_OUTLINE // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_SHADOW // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_SHDWCOLOR // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_SHDWXVAL // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_FORMTEXT_SHDWYVAL // ole : no, status : ? + [ + ExecMethod = ExecFormText ; + StateMethod = GetFormTextState ; + ] + SID_GALLERY // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + ] + SID_GALLERY_FORMATS // ole : no, status : ? + [ + ExecMethod = ExecGallery ; + GroupId = SfxGroupId::Document ; + ] + SID_NAVIGATOR_INIT // ole : no, status : ? + [ + ExecMethod = ExecNavigatorWin ; + StateMethod = GetNavigatorWinState ; + ] + SID_NAVIGATOR_PAGE // ole : no, status : ? + [ + ExecMethod = ExecNavigatorWin ; + StateMethod = GetNavigatorWinState ; + ] + SID_NAVIGATOR_OBJECT // ole : no, status : ? + [ + ExecMethod = ExecNavigatorWin ; + StateMethod = GetNavigatorWinState ; + ] + SID_NAVIGATOR_STATE // ole : no, status : ? + [ + ExecMethod = ExecNavigatorWin ; + StateMethod = GetNavigatorWinState ; + ] + SID_NAVIGATOR_PAGENAME // ole : no, status : ? + [ + ExecMethod = ExecNavigatorWin ; + StateMethod = GetNavigatorWinState ; + ] + SID_HORIZONTAL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FLIP_HORIZONTAL + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_VERTICAL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FLIP_VERTICAL + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ATTR_FILL_SHADOW // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_SHADOW_COLOR + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_SHADOW_TRANSPARENCE + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_SHADOW_BLUR + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_SHADOW_XDISTANCE + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_ATTR_SHADOW_YDISTANCE + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_ATTR_TEXT_FITTOSIZE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_OBJECT_CLOSE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SETFILLSTYLE // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GETFILLSTYLE // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETLINESTYLE // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GETLINESTYLE // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETLINEWIDTH // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GETLINEWIDTH // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETFILLCOLOR // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETLINECOLOR // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETHATCHCOLOR // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETGRADSTARTCOLOR // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SETGRADENDCOLOR // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GETRED // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GETBLUE // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GETGREEN // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_DASH // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_HATCH // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_GRADIENT // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SELECTGRADIENT // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_SELECTHATCH // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_UNSELECT // ole : no, status : play rec + [ + ExecMethod = AttrExec ; + StateMethod = AttrState ; + ] + SID_TEXTATTR_DLG // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MEASURE_DLG // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONNECTION_DLG // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CONNECTION_NEW_ROUTING // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SCAN // ole : no, status : todo + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_TWAIN_SELECT // ole : no, status : todo + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_TWAIN_TRANSFER // ole : no, status : todo + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_IMAP // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_IMAP_EXEC // ole : no, status : ? + [ + ExecMethod = ExecIMap ; + StateMethod = GetIMapState ; + ] + SID_GLUE_EDITMODE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_GLUE_INSERT_POINT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_PERCENT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_ESCDIR // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_ESCDIR_LEFT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_ESCDIR_RIGHT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_ESCDIR_TOP // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_ESCDIR_BOTTOM // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_HORZALIGN_CENTER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_HORZALIGN_LEFT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_HORZALIGN_RIGHT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_VERTALIGN_CENTER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_VERTALIGN_TOP // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_VERTALIGN_BOTTOM // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_POLYGON_MORPHING // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_GRID_FRONT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_HELPLINES_FRONT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_AUTOSPELL_CHECK // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_CONVERT_TO_3D_LATHE_FAST // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + // slots in the option pane + SID_BEZIER_EDIT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GLUE_EDITMODE // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_GRID_VISIBLE // ole : no, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_HELPLINES_VISIBLE // ole : no, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_SOLID_CREATE // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_HELPLINES_USE // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_HELPLINES_MOVE // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_GRID_USE // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_SNAP_BORDER // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_SNAP_FRAME // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_SNAP_POINTS // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_QUICKEDIT // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_PICK_THROUGH // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_DOUBLECLICK_TEXTEDIT // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_CLICK_CHANGE_ROTATION // ole : ?, status : ? + [ + ExecMethod = ExecOptionsBar ; + StateMethod = GetOptionsBarState ; + ] + SID_HYPHENATION // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_DUPLICATE_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_DATE_FIX // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_DATE_VAR // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_TIME_FIX // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_TIME_VAR // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_PAGE_TITLE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_PAGES // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_FILE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_AUTHOR // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MODIFY_FIELD // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OUTPUT_QUALITY_COLOR // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_OUTPUT_QUALITY_GRAYSCALE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_OUTPUT_QUALITY_BLACKWHITE // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_OUTPUT_QUALITY_CONTRAST // ole : no, status : play rec + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_MAIL_SCROLLBODY_PAGEDOWN // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_EDIT_HYPERLINK // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OPEN_HYPERLINK // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_COPY_HYPERLINK_LOCATION // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_HIDE_LAST_LEVEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SHOW_NEXT_LEVEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_TRANSLITERATE_UPPER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_SENTENCE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_TITLE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_TOGGLE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_ROTATE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupportRotate ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_LOWER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_HALFWIDTH // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_FULLWIDTH // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_HIRAGANA // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_KATAKANA // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + + // #UndoRedo# + SID_GETUNDOSTRINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_UNDO // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GETREDOSTRINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_REDO // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + + SID_FORMATPAINTBRUSH + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + + SID_HEADER_AND_FOOTER // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + + SID_INSERT_PAGE_NUMBER // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + + SID_INSERT_DATE_TIME // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + + SID_MASTER_LAYOUTS + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + + SID_OPT_LOCALE_CHANGED // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + + SID_OPEN_XML_FILTERSETTINGS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SPELL_DIALOG // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_TOGGLE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_TILT_DOWN + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_TILT_UP + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_TILT_LEFT + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_TILT_RIGHT + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_DEPTH_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_DEPTH_DIALOG + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_DIRECTION_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_LIGHTING_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_SURFACE_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_3D_COLOR + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_DEPTH + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_DIRECTION + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_PROJECTION + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_LIGHTING_DIRECTION + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_LIGHTING_INTENSITY + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXTRUSION_SURFACE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_SHAPE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_GALLERY_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_SHAPE_TYPE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_ALIGNMENT_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_CHARACTER_SPACING_FLOATER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_ALIGNMENT + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_SAME_LETTER_HEIGHTS + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_CHARACTER_SPACING + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_KERN_CHARACTER_PAIRS + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_FONTWORK_CHARACTER_SPACING_DIALOG + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DRAW_FONTWORK + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DRAW_FONTWORK_VERTICAL + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CS_BASIC + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CS_SYMBOL + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CS_ARROW + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CS_FLOWCHART + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CS_CALLOUT + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAWTBX_CS_STAR + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_DRAW_CS_ID + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_INSERT_SIGNATURELINE + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ReadOnlyDoc = TRUE ; + ] + SID_AVMEDIA_PLAYER // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_AVMEDIA // ole : yes, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + + SID_INSERT_MASTER_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DELETE_MASTER_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_RENAME_MASTER_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CLOSE_MASTER_VIEW + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_SELECT_BACKGROUND + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SAVE_BACKGROUND + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ATTR_PAGE + [ + ExecMethod = FuTemporary ; + StateMethod = GetPageProperties ; + ] + SID_ATTR_PAGE_SIZE + [ + ExecMethod = FuTemporary ; + StateMethod = GetPageProperties ; + ] + SID_ATTR_PAGE_LRSPACE + [ + ExecMethod = SetPageProperties ; + StateMethod = GetMarginProperties ; + ] + SID_ATTR_PAGE_ULSPACE + [ + ExecMethod = SetPageProperties ; + StateMethod = GetMarginProperties ; + ] + SID_ATTR_PAGE_COLOR + [ + ExecMethod = SetPageProperties ; + StateMethod = GetPageProperties; + ] + SID_ATTR_PAGE_GRADIENT + [ + ExecMethod = SetPageProperties ; + StateMethod = GetPageProperties ; + ] + SID_ATTR_PAGE_HATCH + [ + ExecMethod = SetPageProperties ; + StateMethod = GetPageProperties ; + ] + SID_ATTR_PAGE_BITMAP + [ + ExecMethod = SetPageProperties ; + StateMethod = GetPageProperties ; + ] + SID_ATTR_PAGE_FILLSTYLE + [ + ExecMethod = SetPageProperties; + StateMethod = GetPageProperties; + ] + SID_DISPLAY_MASTER_BACKGROUND + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_DISPLAY_MASTER_OBJECTS + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_TABLE + [ + ExecMethod = FuTable ; + StateMethod = GetTableMenuState ; + ] + SID_TABLEDESIGN + [ + ExecMethod = FuTable ; + StateMethod = GetTableMenuState ; + ] + SID_ATTR_CHAR_FONT + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_FONTHEIGHT + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_WEIGHT + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_POSTURE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_OVERLINE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_UNDERLINE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ULINE_VAL_NONE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ULINE_VAL_SINGLE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ULINE_VAL_DOUBLE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ULINE_VAL_DOTTED + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_SHADOWED + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_STRIKEOUT + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_CONTOUR // ole : ?, status : ? + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState; + ] + SID_ATTR_CHAR_COLOR + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_BACK_COLOR + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_ATTR_CHAR_KERNING + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_SET_SUB_SCRIPT + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_SET_SUPER_SCRIPT + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_SHRINK_FONT_SIZE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_GROW_FONT_SIZE + [ + ExecMethod = ExecChar ; + StateMethod = GetAttrState ; + ] + SID_TABLE_VERT_NONE + [ + ExecMethod = ExecutePropPanelAttr ; + StateMethod = GetStatePropPanelAttr ; + ] + SID_TABLE_VERT_CENTER + [ + ExecMethod = ExecutePropPanelAttr ; + StateMethod = GetStatePropPanelAttr ; + ] + SID_TABLE_VERT_BOTTOM + [ + ExecMethod = ExecutePropPanelAttr ; + StateMethod = GetStatePropPanelAttr ; + ] + SID_PRESENTATION_MINIMIZER + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_GO_TO_NEXT_PAGE + [ + ExecMethod = ExecGoToNextPage ; + StateMethod = GetStateGoToNextPage ; + ] + SID_GO_TO_PREVIOUS_PAGE + [ + ExecMethod = ExecGoToPreviousPage ; + StateMethod = GetStateGoToPreviousPage ; + ] + SID_GO_TO_FIRST_PAGE + [ + ExecMethod = ExecGoToFirstPage ; + StateMethod = GetStateGoToFirstPage ; + ] + SID_GO_TO_LAST_PAGE + [ + ExecMethod = ExecGoToLastPage ; + StateMethod = GetStateGoToLastPage ; + ] + SID_CLASSIFICATION_APPLY + [ + ExecMethod = FuTemporary ; + ] + SID_CLASSIFICATION_DIALOG + [ + ExecMethod = FuTemporary ; + ] + SID_REGENERATE_DIAGRAM + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + SID_EDIT_DIAGRAM + [ + ExecMethod = ExecCtrl ; + StateMethod = GetMenuState ; + ] + SID_INSERT_QRCODE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EDIT_QRCODE + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ADDITIONS_DIALOG + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ATTR_GLOW_COLOR + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ATTR_GLOW_RADIUS + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_ATTR_GLOW_TRANSPARENCY + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_ATTR_SOFTEDGE_RADIUS + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_MOVE_SHAPE_HANDLE + [ + ExecMethod = FuTemporary ; + ] + SID_ATTR_TEXTCOLUMNS_NUMBER + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_ATTR_TEXTCOLUMNS_SPACING + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] + SID_THEME_DIALOG + [ + ExecMethod = FuTemporary; + StateMethod = GetAttrState; + ] +} diff --git a/sd/sdi/app.sdi b/sd/sdi/app.sdi new file mode 100644 index 0000000000..b524f4a4b5 --- /dev/null +++ b/sd/sdi/app.sdi @@ -0,0 +1,93 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface StarImpress +{ + SID_NEWDOC // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Application ; + Container ; + ] + + SID_ATTR_METRIC + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_NEWSD // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_OPENDOC // ole() api() + [ + + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_OPENHYPERLINK // ole() api() + [ + + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_AUTOSPELL_CHECK // ole() api() + [ + + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_ATTR_LANGUAGE // ole() api() + [ + + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_ATTR_CHAR_CJK_LANGUAGE // ole() api() + [ + + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_ATTR_CHAR_CTL_LANGUAGE // ole() api() + [ + + ExecMethod = Execute ; + StateMethod = GetState ; + ] + + SID_OUTLINE_TO_IMPRESS // ole() api() + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] +} + +shell SdModule +{ + import StarImpress; +} + diff --git a/sd/sdi/docshell.sdi b/sd/sdi/docshell.sdi new file mode 100644 index 0000000000..f5f322177b --- /dev/null +++ b/sd/sdi/docshell.sdi @@ -0,0 +1,31 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface ImpressDocument : DrawDocument +{ + SID_NOTEBOOKBAR + [ + ExecMethod = Execute; + StateMethod = GetState; + ] +} + +shell DrawDocShell +{ + import ImpressDocument; +} diff --git a/sd/sdi/drbezob.sdi b/sd/sdi/drbezob.sdi new file mode 100644 index 0000000000..10387e821e --- /dev/null +++ b/sd/sdi/drbezob.sdi @@ -0,0 +1,81 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +shell BezierObjectBar +{ + SID_BEZIER_MOVE // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_INSERT // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_DELETE // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_CUTLINE // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_CONVERT // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_EDGE // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_SMOOTH // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_SYMMTR // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_ELIMINATE_POINTS // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_BEZIER_CLOSE // ole : no, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] +} + diff --git a/sd/sdi/drgrfob.sdi b/sd/sdi/drgrfob.sdi new file mode 100644 index 0000000000..cf5bc9a2b8 --- /dev/null +++ b/sd/sdi/drgrfob.sdi @@ -0,0 +1,138 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +shell GraphicObjectBar +{ + SID_GRFFILTER + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_INVERT // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState ; + ] + SID_GRFFILTER_SMOOTH // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState ; + ] + SID_GRFFILTER_SHARPEN // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState ; + ] + SID_GRFFILTER_REMOVENOISE // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState ; + ] + SID_GRFFILTER_SOBEL // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_MOSAIC // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_EMBOSS // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_POSTER // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_POPART // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_SEPIA // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + SID_GRFFILTER_SOLARIZE // ole : no, status : no + [ + ExecMethod = ExecuteFilter; + StateMethod = GetFilterState; + ] + + + SID_ATTR_GRAF_MODE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_RED + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_GREEN + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_BLUE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_LUMINANCE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_CONTRAST + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_GAMMA + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_TRANSPARENCE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_INVERT + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_GRAF_CROP + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_COLOR_SETTINGS + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] +} diff --git a/sd/sdi/drtxtob.sdi b/sd/sdi/drtxtob.sdi new file mode 100644 index 0000000000..e34445f55b --- /dev/null +++ b/sd/sdi/drtxtob.sdi @@ -0,0 +1,300 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +shell TextObjectBar +{ + SID_STYLE_APPLY // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + GroupId = SfxGroupId::Document; + AutoUpdate; + ] + + SID_ATTR_CHAR_FONT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_FONTHEIGHT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_COLOR // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_BACK_COLOR // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_WEIGHT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_POSTURE // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_UNDERLINE // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ULINE_VAL_NONE + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + + SID_ULINE_VAL_SINGLE + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + + SID_ULINE_VAL_DOUBLE + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + + SID_ULINE_VAL_DOTTED + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + + SID_ATTR_CHAR_OVERLINE // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_UNDERLINE // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_CONTOUR // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_STRIKEOUT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_SHADOWED // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_CASEMAP // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_PARA_ADJUST_LEFT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_ADJUST_CENTER // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_ADJUST_RIGHT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_ADJUST_BLOCK // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_LEFT_TO_RIGHT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_RIGHT_TO_LEFT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_LINESPACE_10 // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_LINESPACE_15 // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_ATTR_PARA_LINESPACE_20 // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; +// AutoUpdate; + ] + + SID_SET_SUPER_SCRIPT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_SET_SUB_SCRIPT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_CHAR_KERNING + [ + ExecMethod = Execute; + StateMethod = GetCharState; + ] + + SID_PARASPACE_INCREASE // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_PARASPACE_DECREASE // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_INC_INDENT + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_DEC_INDENT + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + + SID_ATTR_PARA_LRSPACE + [ + ExecMethod = Execute ; + StateMethod = GetAttrState; + ] + + SID_HANGING_INDENT + [ + ExecMethod = Execute ; + StateMethod = GetAttrState; + ] + + SID_OUTLINE_LEFT // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + SID_OUTLINE_RIGHT // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + SID_OUTLINE_UP // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + SID_OUTLINE_DOWN // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + FN_NUM_BULLET_ON // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_TEXTDIRECTION_LEFT_TO_RIGHT // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_TEXTDIRECTION_TOP_TO_BOTTOM // ole : ?, status : ? + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_GROW_FONT_SIZE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_SHRINK_FONT_SIZE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_THES + [ + ExecMethod = Execute ; + StateMethod = GetAttrState ; + ] + + +} diff --git a/sd/sdi/drviewsh.sdi b/sd/sdi/drviewsh.sdi new file mode 100644 index 0000000000..84fa9bfa84 --- /dev/null +++ b/sd/sdi/drviewsh.sdi @@ -0,0 +1,223 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +interface ImpressEditView : DrawView +{ + SID_MODIFYPAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ASSIGN_LAYOUT + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ANIMATION_OBJECTS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ANIMATION_EFFECTS // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EXECUTE_ANIMATION_EFFECT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CUSTOM_ANIMATION_PANEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SLIDE_TRANSITIONS_PANEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SLIDE_TRANSITIONS_PANEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_MASTER_SLIDES_PANEL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_REHEARSE_TIMINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_CURRENT_SLIDE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_END // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_CLEAR_UNDO_STACK // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_STYLE_FAMILY5 // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + SID_ANIMATOR_INIT // ole : no, status : ? + [ + ExecMethod = ExecAnimationWin ; + StateMethod = GetAnimationWinState ; + ] + SID_ANIMATOR_ADD // ole : no, status : ? + [ + ExecMethod = ExecAnimationWin ; + StateMethod = GetAnimationWinState ; + ] + SID_ANIMATOR_CREATE // ole : no, status : ? + [ + ExecMethod = ExecAnimationWin ; + StateMethod = GetAnimationWinState ; + ] + SID_ANIMATOR_STATE // ole : no, status : ? + [ + ExecMethod = ExecAnimationWin ; + StateMethod = GetAnimationWinState ; + ] + SID_PRESENTATION_DLG + [ + ExecMethod = FuTemporary ; + ] + SID_REMOTE_DLG + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CUSTOMSHOW_DLG + [ + ExecMethod = FuTemporary ; + ] + SID_EXPAND_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ReadOnlyDoc = FALSE; + ] + SID_SUMMARY_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_STYLE_FAMILY + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + + SID_SEARCH_OPTIONS // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Document ; + ] + SID_SEARCH_ITEM // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_TOGGLE_NOTES + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_INSERT_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_EDIT_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_REPLYTO_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_DELETE_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_DELETEALL_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_PREVIOUS_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_NEXT_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_DELETEALLBYAUTHOR_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_PHOTOALBUM + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] +} + +shell DrawViewShell +{ + import ImpressEditView; +} + + +shell PresentationViewShell +{ + import ImpressEditView; +} + + +shell PreviewViewShell +{ + import ImpressEditView; +} diff --git a/sd/sdi/grdocsh.sdi b/sd/sdi/grdocsh.sdi new file mode 100644 index 0000000000..961a4c6051 --- /dev/null +++ b/sd/sdi/grdocsh.sdi @@ -0,0 +1,26 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface GraphicDocument : DrawDocument +{ +} + +shell GraphicDocShell +{ + import GraphicDocument; +} diff --git a/sd/sdi/grviewsh.sdi b/sd/sdi/grviewsh.sdi new file mode 100644 index 0000000000..976dfaa5b6 --- /dev/null +++ b/sd/sdi/grviewsh.sdi @@ -0,0 +1,82 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface GraphicEditView : DrawView +{ + SID_SEARCH_OPTIONS // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Document ; + ] + SID_SEARCH_ITEM // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] +} + +shell GraphicViewShell +{ + import GraphicEditView; + SID_INSERT_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_EDIT_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_TOGGLE_NOTES + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_REPLYTO_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_DELETE_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_DELETEALL_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_PREVIOUS_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_NEXT_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] + SID_DELETEALLBYAUTHOR_POSTIT + [ + ExecMethod = ExecuteAnnotation; + StateMethod = GetAnnotationState; + ] +} diff --git a/sd/sdi/mediaob.sdi b/sd/sdi/mediaob.sdi new file mode 100644 index 0000000000..9f7392b969 --- /dev/null +++ b/sd/sdi/mediaob.sdi @@ -0,0 +1,26 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +shell MediaObjectBar +{ + SID_AVMEDIA_TOOLBOX + [ + ExecMethod = Execute; + StateMethod = GetState; + ] +} diff --git a/sd/sdi/outlnvsh.sdi b/sd/sdi/outlnvsh.sdi new file mode 100644 index 0000000000..b1aaaa7639 --- /dev/null +++ b/sd/sdi/outlnvsh.sdi @@ -0,0 +1,552 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +interface OutlineView +{ + SID_CUT // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_COPY // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PASTE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PASTE_UNFORMATTED // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_DELETE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + Asynchron ; + ] + SID_DRAWINGMODE // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_NEXT // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_PREV // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_TOOLBOX // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetStatusBarState ; + ] + SID_ATTR_ZOOM // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetStatusBarState ; + ] + SID_ATTR_ZOOMSLIDER // status() + [ + ExecMethod = FuTemporary ; + StateMethod = GetStatusBarState ; + ] + SID_ZOOM_OUT // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_ZOOM_IN // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SIZE_REAL // ole : no, status : play rec + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SIZE_VISAREA // ole : no, status : no + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_HYPERLINK_SETLINK // ole : no, status : no + [ + ExecMethod = FuTemporaryModify ; + ] + SID_HYPERLINK_GETLINK // ole : no, status : no + [ + StateMethod = GetCtrlState ; + ] + SID_READONLY_MODE // ole : no, status : no + [ + StateMethod = GetCtrlState ; + ] + SID_OUTLINE_FORMAT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OUTLINE_COLLAPSE_ALL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OUTLINE_COLLAPSE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OUTLINE_EXPAND_ALL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_OUTLINE_EXPAND // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CHARMAP // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_CHARMAP_CONTROL // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + FN_INSERT_SOFT_HYPHEN // status(final|play) + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + FN_INSERT_HARDHYPHEN // status() + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + FN_INSERT_HARD_SPACE // status(final|play) + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + FN_INSERT_NNBSP // status(final|play) + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_RLM + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_INSERT_LRM + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_ZWSP + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_WJ + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + FN_SVX_SET_BULLET + [ + ExecMethod = FuTemporaryModify ; + ] + FN_SVX_SET_NUMBER + [ + ExecMethod = FuTemporaryModify ; + ] + SID_OUTLINE_BULLET // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_CHAR_DLG // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_CHAR_DLG_EFFECT // wj for sym2_1876 + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_SELECTALL // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + ] + SID_INSERTFILE // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_CURRENT_SLIDE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_EDIT_OUTLINER // ole : no, status : ? + [ + ExecMethod = FuPermanent ; + StateMethod = GetMenuState ; + ] + SID_SAVEDOC // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetMenuState ; + GroupId = SfxGroupId::Document ; + ] + SID_SAVEASDOC // ole : no, status : ? + [ + ExecMethod = Execute ; + GroupId = SfxGroupId::Document ; + ] + SID_RULER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_STATUS_PAGE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_STATUS_LAYOUT // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_SCALE // ole : no, status : ? + [ + ExecMethod = ExecStatusBar ; + StateMethod = GetStatusBarState ; + ] + SID_THESAURUS // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_COLORVIEW // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_SET_DEFAULT // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATIONOBJECT + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + // Templates + // no menu entry + SID_STYLE_FAMILY2 // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_FAMILY3 // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + // Templates + // no menu entry + SID_STYLE_FAMILY5 // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + ] + // no menu entry + SID_STYLE_EDIT // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + // no menu entry + SID_STYLE_UPDATE_BY_EXAMPLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + // no menu entry + SID_STYLE_WATERCAN // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + // no menu entry + SID_STYLE_NEW_BY_EXAMPLE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + // no menu entry + SID_STYLE_NEW // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + // no menu entry + SID_STYLE_DELETE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_HIDE + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_STYLE_SHOW + [ + ExecMethod = FuTemporary ; + StateMethod = GetAttrState ; + GroupId = SfxGroupId::Document ; + ] + SID_AUTOSPELL_CHECK // ole : no, status : play rec + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_PREVIEW_STATE // ole : no, status : ? + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_PRESENTATION_DLG + [ + ExecMethod = FuTemporary ; + ] + SID_REMOTE_DLG + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] + SID_CUSTOMSHOW_DLG + [ + ExecMethod = FuTemporary ; + ] + SID_EXPAND_PAGE // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_SUMMARY_PAGE // ole : no, status : ? + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_DATE_FIX // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_DATE_VAR // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_TIME_FIX // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_TIME_VAR // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_PAGE_TITLE // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_PAGE // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_PAGES // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_FILE // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_INSERT_FLD_AUTHOR // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + SID_MODIFY_FIELD // ole : no, status : play rec + [ + ExecMethod = FuTemporaryModify ; + StateMethod = GetMenuState ; + ] + + SID_MAIL_SCROLLBODY_PAGEDOWN // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + SID_STYLE_FAMILY + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_TRANSLITERATE_SENTENCE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_TITLE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_TOGGLE_CASE // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_UPPER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_LOWER // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_HALFWIDTH // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_FULLWIDTH // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_HIRAGANA // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_TRANSLITERATE_KATAKANA // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetCtrlState ; + ] + SID_OPT_LOCALE_CHANGED // ole : no, status : ? + [ + ExecMethod = ExecCtrl ; + StateMethod = GetCtrlState ; + ] + + SID_GETUNDOSTRINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_UNDO // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_GETREDOSTRINGS // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + SID_REDO // ole : no, status : ? + [ + ExecMethod = FuSupport ; + StateMethod = GetMenuState ; + ] + + SID_SEARCH_OPTIONS // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + GroupId = SfxGroupId::Document ; + ] + SID_SEARCH_ITEM // ole : ?, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetState ; + ] + SID_SPELL_DIALOG // ole : no, status : ? + [ + ExecMethod = Execute ; + StateMethod = GetMenuState ; + ] + SID_PHOTOALBUM + [ + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] +} + +shell OutlineViewShell +{ + import OutlineView; +} + diff --git a/sd/sdi/sdgslots.sdi b/sd/sdi/sdgslots.sdi new file mode 100644 index 0000000000..e7c94ab322 --- /dev/null +++ b/sd/sdi/sdgslots.sdi @@ -0,0 +1,89 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +module StarDraw +[ + SlotIdFile( "sdslots.hrc" ) +] +{ + include "sfxitems.sdi" + include "sfx.sdi" + include "svxitems.sdi" + include "xoitems.sdi" + include "svx.sdi" + + enum FadeEffect + { + FADE_EFFECT_NONE , + FADE_EFFECT_FADE_FROM_LEFT , + FADE_EFFECT_FADE_FROM_TOP , + FADE_EFFECT_FADE_FROM_RIGHT , + FADE_EFFECT_FADE_FROM_BOTTOM , + FADE_EFFECT_FADE_TO_CENTER , + FADE_EFFECT_FADE_FROM_CENTER , + FADE_EFFECT_MOVE_FROM_LEFT , + FADE_EFFECT_MOVE_FROM_TOP , + FADE_EFFECT_MOVE_FROM_RIGHT , + FADE_EFFECT_MOVE_FROM_BOTTOM , + FADE_EFFECT_ROLL_FROM_LEFT , + FADE_EFFECT_ROLL_FROM_TOP , + FADE_EFFECT_ROLL_FROM_RIGHT , + FADE_EFFECT_ROLL_FROM_BOTTOM , + FADE_EFFECT_VERTICAL_STRIPES , + FADE_EFFECT_HORIZONTAL_STRIPES , + FADE_EFFECT_OPEN_VERTICAL , + FADE_EFFECT_CLOSE_VERTICAL , + FADE_EFFECT_OPEN_HORIZONTAL , + FADE_EFFECT_CLOSE_HORIZONTAL , + FADE_EFFECT_CLEAR_AWAY , + FADE_EFFECT_OVERLAY + } + + enum FadeSpeed + { + FADE_SPEED_SLOW , + FADE_SPEED_MEDIUM , + FADE_SPEED_FAST + } + + enum PresChange + { + PresChange::Manual, + PresChange::Auto, + PresChange::SemiAuto + }; + + // Items + item UINT32 DiaTimeItem ; + item PresChange DiaAutoItem ; + item FadeEffect DiaEffectItem ; + item FadeSpeed DiaSpeedItem ; + + include "sdraw.sdi" + include "app.sdi" + include "_drvwsh.sdi" + include "grviewsh.sdi" + include "outlnvsh.sdi" + include "drtxtob.sdi" + include "drbezob.sdi" + include "_docsh.sdi" + include "grdocsh.sdi" + include "drgrfob.sdi" + include "mediaob.sdi" + include "tables.sdi" +} + diff --git a/sd/sdi/sdraw.sdi b/sd/sdi/sdraw.sdi new file mode 100644 index 0000000000..7bb752c687 --- /dev/null +++ b/sd/sdi/sdraw.sdi @@ -0,0 +1,4706 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +SfxVoidItem AdvancedMode SID_OBJECT_CHOOSE_MODE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem AnimationEffects SID_ANIMATION_EFFECTS +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem ExecuteAnimationEffect SID_EXECUTE_ANIMATION_EFFECT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem AnimationObjects SID_ANIMATION_OBJECTS + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem AnimatorAddObject SID_ANIMATOR_ADD + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem AnimatorCreateObject SID_ANIMATOR_CREATE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem AnimatorInit SID_ANIMATOR_INIT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxUInt16Item AnimatorState SID_ANIMATOR_STATE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem Backward SID_MOREBACK +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ObjectBackOne SID_FRAME_DOWN +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem BeforeObject SID_BEFORE_OBJ +() +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem BehindObject SID_BEHIND_OBJ +() +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem Break SID_BREAK +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem CapturePoint SID_CAPTUREPOINT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem ChangeBezier SID_CHANGEBEZIER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem ChangePolygon SID_CHANGEPOLYGON +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem ClickChangeRotation SID_CLICK_CHANGE_ROTATION + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem CloseObject SID_OBJECT_CLOSE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem ColorView SID_COLORVIEW + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem TextCombine SID_TEXT_COMBINE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem Combine SID_COMBINE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem Cone SID_3D_CONE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem Connect SID_CONNECT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem Connector SID_TOOL_CONNECTOR + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorArrowEnd SID_CONNECTOR_ARROW_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorArrows SID_CONNECTOR_ARROWS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorArrowStart SID_CONNECTOR_ARROW_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxVoidItem ConnectorAttributes SID_CONNECTION_DLG +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem ConnectorCircleEnd SID_CONNECTOR_CIRCLE_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCircles SID_CONNECTOR_CIRCLES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCircleStart SID_CONNECTOR_CIRCLE_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurve SID_CONNECTOR_CURVE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurveArrowEnd SID_CONNECTOR_CURVE_ARROW_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurveArrows SID_CONNECTOR_CURVE_ARROWS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurveArrowStart SID_CONNECTOR_CURVE_ARROW_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurveCircleEnd SID_CONNECTOR_CURVE_CIRCLE_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurveCircles SID_CONNECTOR_CURVE_CIRCLES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorCurveCircleStart SID_CONNECTOR_CURVE_CIRCLE_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLine SID_CONNECTOR_LINE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLineArrowEnd SID_CONNECTOR_LINE_ARROW_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLineArrows SID_CONNECTOR_LINE_ARROWS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLineArrowStart SID_CONNECTOR_LINE_ARROW_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLineCircleEnd SID_CONNECTOR_LINE_CIRCLE_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLineCircles SID_CONNECTOR_LINE_CIRCLES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLineCircleStart SID_CONNECTOR_LINE_CIRCLE_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLines SID_CONNECTOR_LINES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLinesArrowEnd SID_CONNECTOR_LINES_ARROW_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLinesArrows SID_CONNECTOR_LINES_ARROWS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLinesArrowStart SID_CONNECTOR_LINES_ARROW_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLinesCircleEnd SID_CONNECTOR_LINES_CIRCLE_END + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLinesCircles SID_CONNECTOR_LINES_CIRCLES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxBoolItem ConnectorLinesCircleStart SID_CONNECTOR_LINES_CIRCLE_START + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Connector; +] + +SfxVoidItem ConnectorToolbox SID_DRAWTBX_CONNECTORS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem convert_to_contour SID_CONVERT_TO_CONTOUR +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem ConvertInto3D SID_CONVERT_TO_3D +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ConvertInto3DLathe SID_CONVERT_TO_3D_LATHE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ConvertInto3DLatheFast SID_CONVERT_TO_3D_LATHE_FAST +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ConvertIntoBitmap SID_CONVERT_TO_BITMAP +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ConvertIntoMetaFile SID_CONVERT_TO_METAFILE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem CopyObjects SID_COPYOBJECTS +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] + +SfxBoolItem CrookRotate SID_OBJECT_CROOK_ROTATE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem CrookSlant SID_OBJECT_CROOK_SLANT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem CrookStretch SID_OBJECT_CROOK_STRETCH + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem Cube SID_3D_CUBE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem CustomShowDialog SID_CUSTOMSHOW_DLG +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem Cylinder SID_3D_CYLINDER + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem Cyramid SID_3D_PYRAMID + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem DeleteLayer SID_DELETE_LAYER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] + +SfxVoidItem DeletePage SID_DELETE_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] + +SfxStringItem DeleteSnapItem SID_DELETE_SNAPITEM + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxVoidItem DeSelect SID_UNSELECT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxBoolItem DiaMode SID_SLIDE_SORTER_MODE +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem Dismantle SID_DISMANTLE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem DoubleClickTextEdit SID_DOUBLECLICK_TEXTEDIT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem DrawingMode SID_DRAWINGMODE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem DuplicatePage SID_DUPLICATE_PAGE +(SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ,SfxUInt16Item InsertPos ID_INSERT_POS) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem EditOutline SID_EDIT_OUTLINER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxBoolItem CustomAnimation SID_CUSTOM_ANIMATION_PANEL + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem EllipseToolbox SID_DRAWTBX_ELLIPSES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem RedactedExportToolbox SID_DRAWTBX_REDACTED_EXPORT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem ExpandPage SID_EXPAND_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] + +SfxVoidItem SetFillColor SID_SETFILLCOLOR +(SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem Forward SID_MOREFRONT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ObjectForwardOne SID_FRAME_UP +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem GetBlue SID_GETBLUE +(SfxUInt32Item WhatKind ID_VAL_WHATKIND) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxUInt32Item GetFillStyle SID_GETFILLSTYLE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem GetGreen SID_GETGREEN +(SfxUInt32Item WhatKind ID_VAL_WHATKIND) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxUInt32Item GetLineStyle SID_GETLINESTYLE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxUInt32Item GetLineWidth SID_GETLINEWIDTH + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem GetRed SID_GETRED +(SfxUInt32Item WhatKind ID_VAL_WHATKIND) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueEditMode SID_GLUE_EDITMODE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxUInt16Item GlueEscapeDirection SID_GLUE_ESCDIR + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueEscapeDirectionBottom SID_GLUE_ESCDIR_BOTTOM + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueEscapeDirectionLeft SID_GLUE_ESCDIR_LEFT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueEscapeDirectionRight SID_GLUE_ESCDIR_RIGHT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueEscapeDirectionTop SID_GLUE_ESCDIR_TOP + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueHorzAlignCenter SID_GLUE_HORZALIGN_CENTER + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueHorzAlignLeft SID_GLUE_HORZALIGN_LEFT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueHorzAlignRight SID_GLUE_HORZALIGN_RIGHT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueInsertPoint SID_GLUE_INSERT_POINT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GluePercent SID_GLUE_PERCENT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = TRUE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueVertAlignBottom SID_GLUE_VERTALIGN_BOTTOM + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueVertAlignCenter SID_GLUE_VERTALIGN_CENTER + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem GlueVertAlignTop SID_GLUE_VERTALIGN_TOP + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem Gradient SID_GRADIENT +(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Style ID_VAL_STYLE,SfxUInt32Item Angle ID_VAL_ANGLE,SfxUInt32Item Border ID_VAL_BORDER,SfxUInt32Item XOffset ID_VAL_CENTER_X,SfxUInt32Item YOffset ID_VAL_CENTER_Y,SfxUInt32Item StartIntens ID_VAL_STARTINTENS,SfxUInt32Item EndIntens ID_VAL_ENDINTENS) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem GradientEndColor SID_SETGRADENDCOLOR +(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem GradientStartColor SID_SETGRADSTARTCOLOR +(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem GridFront SID_GRID_FRONT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem HalfSphere SID_3D_HALF_SPHERE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem HandoutMode SID_HANDOUT_MASTER_MODE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Document; +] + +SfxVoidItem Hatch SID_HATCH +(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Style ID_VAL_STYLE,SfxUInt32Item Distance ID_VAL_DISTANCE,SfxUInt32Item Angle ID_VAL_ANGLE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem HatchColor SID_SETHATCHCOLOR +(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem HelplinesFront SID_HELPLINES_FRONT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem HelplinesUse SID_HELPLINES_USE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem HelplinesVisible SID_HELPLINES_VISIBLE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem HideSlide SID_HIDE_SLIDE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ShowSlide SID_SHOW_SLIDE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem Hyphenation SID_HYPHENATION + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = TRUE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem ImportFromFile SID_INSERTFILE +(SfxStringItem FileName ID_VAL_DUMMY1,SfxStringItem FilterName ID_VAL_DUMMY2) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertAuthorField SID_INSERT_FLD_AUTHOR +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertDateFieldFix SID_INSERT_FLD_DATE_FIX +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertDateFieldVar SID_INSERT_FLD_DATE_VAR +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertFileField SID_INSERT_FLD_FILE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertLayer SID_INSERTLAYER +(SfxStringItem LayerName ID_VAL_LAYERNAME,SfxBoolItem IsVisible ID_VAL_ISVISIBLE,SfxBoolItem IsLocked ID_VAL_ISLOCKED,SfxBoolItem IsPrintable ID_VAL_ISPRINTABLE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertPage SID_INSERTPAGE +(SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertPageField SID_INSERT_FLD_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertPageTitleField SID_INSERT_FLD_PAGE_TITLE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertPagesField SID_INSERT_FLD_PAGES +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertPageQuick SID_INSERTPAGE_QUICK +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertTimeFieldFix SID_INSERT_FLD_TIME_FIX +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertTimeFieldVar SID_INSERT_FLD_TIME_VAR +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem InsertToolbox SID_DRAWTBX_INSERT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem InteractiveGradient SID_OBJECT_GRADIENT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem InteractiveTransparence SID_OBJECT_TRANSPARENCE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem LayerMode SID_LAYERMODE +(SfxBoolItem IsActive ID_VAL_ISACTIVE,SfxUInt32Item WhatLayer ID_VAL_WHATLAYER) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxStringItem LayoutStatus SID_STATUS_LAYOUT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxStringItem Scale SID_SCALE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem LeaveAllGroups SID_LEAVE_ALL_GROUPS + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem LineColor SID_SETLINECOLOR +(SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem LineEndPolygon SID_LINEEND_POLYGON +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem LineTo SID_LINETO +(SfxUInt32Item MouseEndX ID_VAL_MOUSEEND_X,SfxUInt32Item MouseEndY ID_VAL_MOUSEEND_Y) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem ManageLinks SID_MANAGE_LINKS +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] + +SfxBoolItem MasterPage SID_MASTERPAGE +(SfxBoolItem Isactive ID_VAL_ISACTIVE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem MirrorHorz SID_HORIZONTAL +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MirrorVert SID_VERTICAL +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ModifyField SID_MODIFY_FIELD +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] + +SfxVoidItem ModifyLayer SID_MODIFYLAYER +(SfxStringItem LayerName ID_VAL_LAYERNAME,SfxBoolItem IsVisible ID_VAL_ISVISIBLE,SfxBoolItem IsLocked ID_VAL_ISLOCKED,SfxBoolItem IsPrintable ID_VAL_ISPRINTABLE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem ModifyPage SID_MODIFYPAGE +(SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem ToggleLayerVisibility SID_TOGGLELAYERVISIBILITY +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = TRUE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem AssignLayout SID_ASSIGN_LAYOUT +(SfxUInt32Item WhatPage ID_VAL_WHATPAGE, SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + + +SfxBoolItem ToggleTabBarVisibility SID_TOGGLE_TABBAR_VISIBILITY + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = TRUE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + + +SfxVoidItem DisplayMode SID_DISPLAY_MODE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem ModifyPresentationObject SID_PRESENTATIONOBJECT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem Morphing SID_POLYGON_MORPHING +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MoveTo SID_MOVETO +(SfxUInt32Item MouseStartX ID_VAL_MOUSESTART_X,SfxUInt32Item MouseStartY ID_VAL_MOUSESTART_Y) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem NameGroup SID_NAME_GROUP +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +//-#i68101#------------------------------------------------------------------------ +SfxVoidItem ObjectTitleDescription SID_OBJECT_TITLE_DESCRIPTION +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem NavigatorInit SID_NAVIGATOR_INIT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxStringItem NavigatorObject SID_NAVIGATOR_OBJECT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxUInt16Item NavigatorPage SID_NAVIGATOR_PAGE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxStringItem NavigatorPageName SID_NAVIGATOR_PAGENAME + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxUInt32Item NavigatorState SID_NAVIGATOR_STATE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxBoolItem NewRouting SID_CONNECTION_NEW_ROUTING + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem NotesMasterPage SID_NOTES_MASTER_MODE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem NotesMode SID_NOTES_MODE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem ObjectPosition SID_POSITION + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem Objects3DToolbox SID_DRAWTBX_3D_OBJECTS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem OriginalSize SID_ORIGINAL_SIZE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem OutlineMode SID_OUTLINE_MODE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem OutputQualityBlackWhite SID_OUTPUT_QUALITY_BLACKWHITE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem OutputQualityColor SID_OUTPUT_QUALITY_COLOR + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem OutputQualityContrast SID_OUTPUT_QUALITY_CONTRAST + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem OutputQualityGrayscale SID_OUTPUT_QUALITY_GRAYSCALE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem PageMargin SID_PAGEMARGIN +(SfxUInt32Item PageLeft ID_VAL_PAGELEFT,SfxUInt32Item PageRight ID_VAL_PAGERIGHT,SfxUInt32Item PageTop ID_VAL_PAGETOP,SfxUInt32Item PageBottom ID_VAL_PAGEBOTTOM,SfxBoolItem ScaleObjects ID_VAL_SCALEOBJECTS) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem PageMode SID_PAGEMODE +(SfxBoolItem IsActive ID_VAL_ISACTIVE,SfxUInt32Item WhatKind ID_VAL_WHATKIND) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem PageSetup SID_PAGESETUP +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem PageSize SID_PAGESIZE +(SfxUInt32Item PageWidth ID_VAL_PAGEWIDTH,SfxUInt32Item PageHeight ID_VAL_PAGEHEIGHT,SfxBoolItem ScaleObjects ID_VAL_SCALEOBJECTS) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Application; +] + +SfxUInt16Item PagesPerRow SID_PAGES_PER_ROW + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxStringItem PageStatus SID_STATUS_PAGE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem PickThrough SID_PICK_THROUGH + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem Presentation SID_PRESENTATION +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem PresentationCurrentSlide SID_PRESENTATION_CURRENT_SLIDE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem PresentationDialog SID_PRESENTATION_DLG +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem Remote SID_REMOTE_DLG +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem PresentationEnd SID_PRESENTATION_END +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem ClearUndoStack SID_CLEAR_UNDO_STACK +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem PresentationLayout SID_PRESENTATION_LAYOUT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxUInt32Item PreviewState SID_PREVIEW_STATE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem QuickEdit SID_QUICKEDIT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem RectangleToolbox SID_DRAWTBX_RECTANGLES + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem RehearseTimings SID_REHEARSE_TIMINGS +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem RenameLayer SID_RENAMELAYER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem RenamePage SID_RENAMEPAGE +(SfxStringItem Name SID_RENAMEPAGE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem RenamePageQuick SID_RENAMEPAGE_QUICK +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem ReverseOrder SID_REVERSE_ORDER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SvxObjectItem RulerObject SID_RULER_OBJECT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = ; +] + +SfxVoidItem SelectGradient SID_SELECTGRADIENT +(SfxStringItem Name ID_VAL_INDEX) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxVoidItem SelectHatch SID_SELECTHATCH +(SfxStringItem Name ID_VAL_INDEX) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] + +SfxVoidItem SetFillStyle SID_SETFILLSTYLE +(SfxUInt32Item Style ID_VAL_STYLE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem SetLineStyle SID_SETLINESTYLE +(SfxUInt32Item Style ID_VAL_STYLE) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem SetLineWidth SID_SETLINEWIDTH +(SfxUInt32Item Width ID_VAL_WIDTH) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Format; +] + +SfxStringItem SetSnapItem SID_SET_SNAPITEM + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem Shear SID_OBJECT_SHEAR + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem Shell3D SID_3D_SHELL + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem SlideChangeWindow SID_SLIDE_TRANSITIONS_PANEL + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem MasterSlidesPanel SID_MASTER_SLIDES_PANEL + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem SlideMasterPage SID_SLIDE_MASTER_MODE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem SnapBorder SID_SNAP_BORDER + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem SnapFrame SID_SNAP_FRAME + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem SnapPoints SID_SNAP_POINTS + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem SolidCreate SID_SOLID_CREATE + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem Sphere SID_3D_SPHERE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem SummaryPage SID_SUMMARY_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem SwitchLayer SID_SWITCHLAYER +(SfxUInt32Item WhatLayer ID_VAL_WHATLAYER) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem SwitchPage SID_SWITCHPAGE +(SfxUInt32Item WhatPage ID_VAL_WHATPAGE,SfxUInt32Item WhatKind ID_VAL_WHATKIND) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem SwitchPointEdit SID_SWITCH_POINTEDIT +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem TextAttributes SID_TEXTATTR_DLG +(SfxBoolItem IsAutoGrow ID_VAL_DUMMY0,SfxBoolItem IsCenter ID_VAL_DUMMY1,SfxBoolItem IsFitToSize ID_VAL_DUMMY2,SfxUInt32Item LeftBorder ID_VAL_DUMMY3,SfxUInt32Item RightBorder ID_VAL_DUMMY4,SfxUInt32Item TopBorder ID_VAL_DUMMY5,SfxUInt32Item BottomBorder ID_VAL_DUMMY6) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem TextFitToSizeTool SID_TEXT_FITTOSIZE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem TextAutoFitToSize SID_OUTLINE_TEXT_AUTOFIT + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem TextToolbox SID_DRAWTBX_TEXT + +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem Torus SID_3D_TORUS + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem VerticalTextFitToSizeTool SID_TEXT_FITTOSIZE_VERTICAL + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem ZoomPanning SID_ZOOM_PANNING +() +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem ZoomMode SID_ZOOM_MODE +() +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem Mirror SID_OBJECT_MIRROR +( SfxBoolItem MirrorVert ID_VAL_MIRRORVERT ) +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Document ; +] + +SfxVoidItem HeaderAndFooter SID_HEADER_AND_FOOTER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem InsertPageNumber SID_INSERT_PAGE_NUMBER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem InsertDateAndTime SID_INSERT_DATE_TIME +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MasterLayouts SID_MASTER_LAYOUTS +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem DrawFontwork SID_DRAW_FONTWORK +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxBoolItem DrawFontworkVertical SID_DRAW_FONTWORK_VERTICAL +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Drawing; +] + +SfxVoidItem InsertMasterPage SID_INSERT_MASTER_PAGE( +SfxStringItem PageName ID_VAL_PAGENAME, +SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT, +SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK, +SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +SfxVoidItem DeleteMasterPage SID_DELETE_MASTER_PAGE() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Edit; +] +SfxVoidItem RenameMasterPage SID_RENAME_MASTER_PAGE() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem CloseMasterView SID_CLOSE_MASTER_VIEW() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxVoidItem SelectBackground SID_SELECT_BACKGROUND +(SfxStringItem FileName SID_SELECT_BACKGROUND,SfxStringItem FilterName FN_PARAM_FILTER,SfxBoolItem AsLink FN_PARAM_1,SfxStringItem Style FN_PARAM_2) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem SaveBackground SID_SAVE_BACKGROUND +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxBoolItem DisplayMasterBackground SID_DISPLAY_MASTER_BACKGROUND +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] +SfxBoolItem DisplayMasterObjects SID_DISPLAY_MASTER_OBJECTS +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxVoidItem SetMinimalColumnWidth SID_TABLE_MINIMAL_COLUMN_WIDTH +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Table; +] + +SfxVoidItem SetOptimalColumnWidth SID_TABLE_OPTIMAL_COLUMN_WIDTH +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Table; +] + +SfxVoidItem DistributeColumns SID_TABLE_DISTRIBUTE_COLUMNS +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Table; +] + +SfxVoidItem SetMinimalRowHeight SID_TABLE_MINIMAL_ROW_HEIGHT +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Table; +] + +SfxVoidItem SetOptimalRowHeight SID_TABLE_OPTIMAL_ROW_HEIGHT +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Table; +] + +SfxVoidItem DistributeRows SID_TABLE_DISTRIBUTE_ROWS +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Table; +] + +SfxVoidItem TaskPaneInsertPage SID_INSERTPAGE_LAYOUT_MENU +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Insert; +] + +/** This item holds the requested type of view shell when calling the + SID_SWITCH_SHELL slot. +*/ +SfxInt32Item SwitchViewShell SID_SWITCH_SHELL +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem LeftPaneImpress SID_LEFT_PANE_IMPRESS + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem LeftPaneDraw SID_LEFT_PANE_DRAW + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem NotesChildWindow SID_NOTES_WINDOW + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = TRUE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::View; +] + +SfxBoolItem NormalMultiPaneGUI SID_NORMAL_MULTI_PANE_GUI + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem SlideSorterMultiPaneGUI SID_SLIDE_SORTER_MULTI_PANE_GUI + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem PhotoAlbumDialog SID_PHOTOALBUM +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem PresentationMinimizer SID_PRESENTATION_MINIMIZER +() +[ + AutoUpdate = FALSE, + FastCall = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem HideLastLevel SID_HIDE_LAST_LEVEL +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem ShowNextLevel SID_SHOW_NEXT_LEVEL +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Options; +] + +SfxVoidItem NextPage SID_GO_TO_NEXT_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem PreviousPage SID_GO_TO_PREVIOUS_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem FirstPage SID_GO_TO_FIRST_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem LastPage SID_GO_TO_LAST_PAGE +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = FALSE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MovePageUp SID_MOVE_PAGE_UP +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MovePageDown SID_MOVE_PAGE_DOWN +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MovePageFirst SID_MOVE_PAGE_FIRST +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxVoidItem MovePageLast SID_MOVE_PAGE_LAST +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Modify; +] + +SfxBoolItem UnderlineNone SID_ULINE_VAL_NONE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem UnderlineSingle SID_ULINE_VAL_SINGLE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem UnderlineDouble SID_ULINE_VAL_DOUBLE + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] + +SfxBoolItem UnderlineDotted SID_ULINE_VAL_DOTTED + +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Format; +] diff --git a/sd/sdi/sdslots.hrc b/sd/sdi/sdslots.hrc new file mode 100644 index 0000000000..64760097e3 --- /dev/null +++ b/sd/sdi/sdslots.hrc @@ -0,0 +1,27 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#include +#include +#include +#include +#include +#include +#include + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/sdi/sdslots.sdi b/sd/sdi/sdslots.sdi new file mode 100644 index 0000000000..751c09901f --- /dev/null +++ b/sd/sdi/sdslots.sdi @@ -0,0 +1,91 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +module StarDraw +[ + SlotIdFile( "sdslots.hrc" ) +] +{ + include "sfxitems.sdi" + include "sfx.sdi" + include "svxitems.sdi" + include "xoitems.sdi" + include "svx.sdi" + + enum FadeEffect + { + FADE_EFFECT_NONE , + FADE_EFFECT_FADE_FROM_LEFT , + FADE_EFFECT_FADE_FROM_TOP , + FADE_EFFECT_FADE_FROM_RIGHT , + FADE_EFFECT_FADE_FROM_BOTTOM , + FADE_EFFECT_FADE_TO_CENTER , + FADE_EFFECT_FADE_FROM_CENTER , + FADE_EFFECT_MOVE_FROM_LEFT , + FADE_EFFECT_MOVE_FROM_TOP , + FADE_EFFECT_MOVE_FROM_RIGHT , + FADE_EFFECT_MOVE_FROM_BOTTOM , + FADE_EFFECT_ROLL_FROM_LEFT , + FADE_EFFECT_ROLL_FROM_TOP , + FADE_EFFECT_ROLL_FROM_RIGHT , + FADE_EFFECT_ROLL_FROM_BOTTOM , + FADE_EFFECT_VERTICAL_STRIPES , + FADE_EFFECT_HORIZONTAL_STRIPES , + FADE_EFFECT_OPEN_VERTICAL , + FADE_EFFECT_CLOSE_VERTICAL , + FADE_EFFECT_OPEN_HORIZONTAL , + FADE_EFFECT_CLOSE_HORIZONTAL , + FADE_EFFECT_CLEAR_AWAY , + FADE_EFFECT_OVERLAY + } + + enum FadeSpeed + { + FADE_SPEED_SLOW , + FADE_SPEED_MEDIUM , + FADE_SPEED_FAST + } + + enum PresChange + { + PresChange::Manual, + PresChange::Auto, + PresChange::SemiAuto + }; + + // Items + item UINT32 DiaTimeItem ; + item PresChange DiaAutoItem ; + item FadeEffect DiaEffectItem ; + item FadeSpeed DiaSpeedItem ; + + include "sdraw.sdi" + include "app.sdi" + include "_drvwsh.sdi" + include "drviewsh.sdi" + include "outlnvsh.sdi" + include "drtxtob.sdi" + include "drbezob.sdi" + include "_docsh.sdi" + include "docshell.sdi" + include "drgrfob.sdi" + include "SlideSorterController.sdi" + include "ViewShellBase.sdi" + include "mediaob.sdi" + include "tables.sdi" + } diff --git a/sd/sdi/tables.sdi b/sd/sdi/tables.sdi new file mode 100644 index 0000000000..9943ce719e --- /dev/null +++ b/sd/sdi/tables.sdi @@ -0,0 +1,193 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +shell TableObjectBar +{ + SID_FRAME_LINESTYLE + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_FRAME_LINECOLOR + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_ATTR_BORDER + [ + ExecMethod = Execute; + StateMethod = GetAttrState; + ] + SID_TABLE_MERGE_CELLS + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_SPLIT_CELLS + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_OPTIMIZE_TABLE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_VERT_BOTTOM + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_VERT_CENTER + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_VERT_NONE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_ROW + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_COL + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_ROW_DLG + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_ROW_BEFORE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_ROW_AFTER + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_COL_DLG + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_COL_BEFORE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_INSERT_COL_AFTER + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_DELETE_ROW + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_DELETE_COL + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_DELETE_TABLE + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_SELECT_ALL + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_SELECT_COL + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_SELECT_ROW + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_FORMAT_TABLE_DLG + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_SORT_DIALOG + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_AUTOSUM + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_TABLE_MINIMAL_COLUMN_WIDTH + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_TABLE_OPTIMAL_COLUMN_WIDTH + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_TABLE_DISTRIBUTE_COLUMNS + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_TABLE_MINIMAL_ROW_HEIGHT + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_TABLE_OPTIMAL_ROW_HEIGHT + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + + SID_TABLE_DISTRIBUTE_ROWS + [ + ExecMethod = Execute; + StateMethod = GetState; + ] + SID_TABLE_CHANGE_CURRENT_BORDER_POSITION + [ + ExecMethod = Execute; + ] + +} + diff --git a/sd/source/console/PresenterAccessibility.cxx b/sd/source/console/PresenterAccessibility.cxx new file mode 100644 index 0000000000..e7ac0b95d5 --- /dev/null +++ b/sd/source/console/PresenterAccessibility.cxx @@ -0,0 +1,1769 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterAccessibility.hxx" +#include "PresenterTextView.hxx" +#include "PresenterConfigurationAccess.hxx" +#include "PresenterNotesView.hxx" +#include "PresenterPaneBase.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterPaneFactory.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +//===== PresenterAccessibleObject ============================================= + +namespace sdext::presenter { + +namespace { + typedef ::cppu::WeakComponentImplHelper < + css::accessibility::XAccessible, + css::accessibility::XAccessibleContext, + css::accessibility::XAccessibleComponent, + css::accessibility::XAccessibleEventBroadcaster, + css::awt::XWindowListener + > PresenterAccessibleObjectInterfaceBase; +} + +class PresenterAccessible::AccessibleObject + : public ::cppu::BaseMutex, + public PresenterAccessibleObjectInterfaceBase +{ +public: + AccessibleObject ( + css::lang::Locale aLocale, + const sal_Int16 nRole, + OUString sName); + void LateInitialization(); + + virtual void SetWindow ( + const css::uno::Reference& rxContentWindow, + const css::uno::Reference& rxBorderWindow); + void SetAccessibleParent (const css::uno::Reference& rxAccessibleParent); + + virtual void SAL_CALL disposing() override; + + void AddChild (const ::rtl::Reference& rpChild); + void RemoveChild (const ::rtl::Reference& rpChild); + + void SetIsFocused (const bool bIsFocused); + void SetAccessibleName (const OUString& rsName); + + void FireAccessibleEvent ( + const sal_Int16 nEventId, + const css::uno::Any& rOldValue, + const css::uno::Any& rNewValue); + + void UpdateStateSet(); + + //----- XAccessible ------------------------------------------------------- + + virtual css::uno::Reference SAL_CALL + getAccessibleContext() override; + + //----- XAccessibleContext ---------------------------------------------- + + virtual sal_Int64 SAL_CALL getAccessibleChildCount() override; + + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override; + + virtual sal_Int64 SAL_CALL getAccessibleIndexInParent() override; + + virtual sal_Int16 SAL_CALL getAccessibleRole() override; + + virtual OUString SAL_CALL getAccessibleDescription() override; + + virtual OUString SAL_CALL getAccessibleName() override; + + virtual css::uno::Reference SAL_CALL + getAccessibleRelationSet() override; + + virtual sal_Int64 SAL_CALL getAccessibleStateSet() override; + + virtual css::lang::Locale SAL_CALL getLocale() override; + + //----- XAccessibleComponent -------------------------------------------- + + virtual sal_Bool SAL_CALL containsPoint ( + const css::awt::Point& aPoint) override; + + virtual css::uno::Reference SAL_CALL + getAccessibleAtPoint ( + const css::awt::Point& aPoint) override; + + virtual css::awt::Rectangle SAL_CALL getBounds() override; + + virtual css::awt::Point SAL_CALL getLocation() override; + + virtual css::awt::Point SAL_CALL getLocationOnScreen() override; + + virtual css::awt::Size SAL_CALL getSize() override; + + virtual void SAL_CALL grabFocus() override; + + virtual sal_Int32 SAL_CALL getForeground() override; + + virtual sal_Int32 SAL_CALL getBackground() override; + + //----- XAccessibleEventBroadcaster -------------------------------------- + + virtual void SAL_CALL addAccessibleEventListener ( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL removeAccessibleEventListener ( + const css::uno::Reference& rxListener) override; + + //----- XWindowListener --------------------------------------------------- + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + //----- XEventListener ---------------------------------------------------- + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + +protected: + OUString msName; + css::uno::Reference mxContentWindow; + css::uno::Reference mxBorderWindow; + const css::lang::Locale maLocale; + const sal_Int16 mnRole; + sal_Int64 mnStateSet; + bool mbIsFocused; + css::uno::Reference mxParentAccessible; + ::std::vector > maChildren; + ::std::vector > maListeners; + + virtual awt::Point GetRelativeLocation(); + virtual awt::Size GetSize(); + virtual awt::Point GetAbsoluteParentLocation(); + + virtual bool GetWindowState (const sal_Int64 nType) const; + + void UpdateState (const sal_Int64 aState, const bool bValue); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +namespace { + +//===== AccessibleRelationSet ================================================= + +typedef ::cppu::WeakComponentImplHelper < + css::accessibility::XAccessibleRelationSet + > AccessibleRelationSetInterfaceBase; + +class AccessibleRelationSet + : public ::cppu::BaseMutex, + public AccessibleRelationSetInterfaceBase +{ +public: + AccessibleRelationSet(); + + void AddRelation ( + const sal_Int16 nRelationType, + const Reference& rxObject); + + //----- XAccessibleRelationSet -------------------------------------------- + + virtual sal_Int32 SAL_CALL getRelationCount() override; + + virtual AccessibleRelation SAL_CALL getRelation (sal_Int32 nIndex) override; + + virtual sal_Bool SAL_CALL containsRelation (sal_Int16 nRelationType) override; + + virtual AccessibleRelation SAL_CALL getRelationByType (sal_Int16 nRelationType) override; + +private: + ::std::vector maRelations; +}; + +//===== PresenterAccessibleParagraph ========================================== + +typedef ::cppu::ImplInheritanceHelper < + PresenterAccessible::AccessibleObject, + css::accessibility::XAccessibleText + > PresenterAccessibleParagraphInterfaceBase; +} + +class PresenterAccessible::AccessibleParagraph + : public PresenterAccessibleParagraphInterfaceBase +{ +public: + AccessibleParagraph ( + const css::lang::Locale& rLocale, + const OUString& rsName, + SharedPresenterTextParagraph pParagraph, + const sal_Int32 nParagraphIndex); + + //----- XAccessibleContext ------------------------------------------------ + + virtual css::uno::Reference SAL_CALL + getAccessibleRelationSet() override; + + //----- XAccessibleText --------------------------------------------------- + + virtual sal_Int32 SAL_CALL getCaretPosition() override; + + virtual sal_Bool SAL_CALL setCaretPosition (sal_Int32 nIndex) override; + + virtual sal_Unicode SAL_CALL getCharacter (sal_Int32 nIndex) override; + + virtual css::uno::Sequence SAL_CALL + getCharacterAttributes ( + ::sal_Int32 nIndex, + const css::uno::Sequence& rRequestedAttributes) override; + + virtual css::awt::Rectangle SAL_CALL getCharacterBounds (sal_Int32 nIndex) override; + + virtual sal_Int32 SAL_CALL getCharacterCount() override; + + virtual sal_Int32 SAL_CALL getIndexAtPoint (const css::awt::Point& rPoint) override; + + virtual OUString SAL_CALL getSelectedText() override; + + virtual sal_Int32 SAL_CALL getSelectionStart() override; + + virtual sal_Int32 SAL_CALL getSelectionEnd() override; + + virtual sal_Bool SAL_CALL setSelection (sal_Int32 nStartIndex, sal_Int32 nEndIndex) override; + + virtual OUString SAL_CALL getText() override; + + virtual OUString SAL_CALL getTextRange ( + sal_Int32 nStartIndex, + sal_Int32 nEndIndex) override; + + virtual css::accessibility::TextSegment SAL_CALL getTextAtIndex ( + sal_Int32 nIndex, + sal_Int16 nTextType) override; + + virtual css::accessibility::TextSegment SAL_CALL getTextBeforeIndex ( + sal_Int32 nIndex, + sal_Int16 nTextType) override; + + virtual css::accessibility::TextSegment SAL_CALL getTextBehindIndex ( + sal_Int32 nIndex, + sal_Int16 nTextType) override; + + virtual sal_Bool SAL_CALL copyText (sal_Int32 nStartIndex, sal_Int32 nEndIndex) override; + + virtual sal_Bool SAL_CALL scrollSubstringTo( + sal_Int32 nStartIndex, + sal_Int32 nEndIndex, + css::accessibility::AccessibleScrollType aScrollType) override; + +protected: + virtual awt::Point GetRelativeLocation() override; + virtual awt::Size GetSize() override; + virtual awt::Point GetAbsoluteParentLocation() override; + virtual bool GetWindowState (const sal_Int64 nType) const override; + +private: + SharedPresenterTextParagraph mpParagraph; + const sal_Int32 mnParagraphIndex; +}; + +//===== AccessibleConsole ===================================================== + +namespace { + +class AccessibleConsole +{ +public: + static rtl::Reference Create ( + const css::uno::Reference& rxContext, + const lang::Locale& rLocale) + { + OUString sName ("Presenter Console"); + PresenterConfigurationAccess aConfiguration ( + rxContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + aConfiguration.GetConfigurationNode("Presenter/Accessibility/Console/String") + >>= sName; + + rtl::Reference pObject ( + new PresenterAccessible::AccessibleObject( + rLocale, AccessibleRole::PANEL, sName)); + pObject->LateInitialization(); + pObject->UpdateStateSet(); + + return pObject; + } +}; + +//===== AccessiblePreview ===================================================== + +class AccessiblePreview +{ +public: + static rtl::Reference Create ( + const Reference& rxContext, + const lang::Locale& rLocale, + const Reference& rxContentWindow, + const Reference& rxBorderWindow) + { + OUString sName ("Presenter Notes Window"); + { + PresenterConfigurationAccess aConfiguration ( + rxContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + aConfiguration.GetConfigurationNode("Presenter/Accessibility/Preview/String") + >>= sName; + } + + rtl::Reference pObject ( + new PresenterAccessible::AccessibleObject( + rLocale, + AccessibleRole::LABEL, + sName)); + pObject->LateInitialization(); + pObject->UpdateStateSet(); + pObject->SetWindow(rxContentWindow, rxBorderWindow); + + return pObject; + } +}; + +//===== AccessibleNotes ======================================================= + +class AccessibleNotes : public PresenterAccessible::AccessibleObject +{ +public: + AccessibleNotes ( + const css::lang::Locale& rLocale, + const OUString& rsName); + + static rtl::Reference Create ( + const css::uno::Reference& rxContext, + const lang::Locale& rLocale, + const Reference& rxContentWindow, + const Reference& rxBorderWindow, + const std::shared_ptr& rpTextView); + + void SetTextView (const std::shared_ptr& rpTextView); + + virtual void SetWindow ( + const css::uno::Reference& rxContentWindow, + const css::uno::Reference& rxBorderWindow) override; + +private: + std::shared_ptr mpTextView; + + void NotifyCaretChange ( + const sal_Int32 nOldParagraphIndex, + const sal_Int32 nOldCharacterIndex, + const sal_Int32 nNewParagraphIndex, + const sal_Int32 nNewCharacterIndex); +}; + +//===== AccessibleFocusManager ================================================ + +/** A singleton class that makes sure that only one accessibility object in + the PresenterConsole hierarchy has the focus. +*/ +class AccessibleFocusManager +{ +public: + static std::shared_ptr const & Instance(); + + void AddFocusableObject (const ::rtl::Reference& rpObject); + void RemoveFocusableObject (const ::rtl::Reference& rpObject); + + void FocusObject (const ::rtl::Reference& rpObject); + + ~AccessibleFocusManager(); + +private: + static std::shared_ptr mpInstance; + ::std::vector > maFocusableObjects; + bool m_isInDtor = false; + + AccessibleFocusManager(); +}; + +} + +//===== PresenterAccessible =================================================== + +PresenterAccessible::PresenterAccessible ( + css::uno::Reference xContext, + ::rtl::Reference xPresenterController, + const Reference& rxMainPane) + : PresenterAccessibleInterfaceBase(m_aMutex), + mxComponentContext(std::move(xContext)), + mpPresenterController(std::move(xPresenterController)), + mxMainPane(rxMainPane, UNO_QUERY) +{ + if (mxMainPane.is()) + mxMainPane->setAccessible(this); +} + +PresenterAccessible::~PresenterAccessible() +{ +} + +PresenterPaneContainer::SharedPaneDescriptor PresenterAccessible::GetPreviewPane() const +{ + PresenterPaneContainer::SharedPaneDescriptor pPreviewPane; + + if ( ! mpPresenterController.is()) + return pPreviewPane; + + rtl::Reference pContainer (mpPresenterController->GetPaneContainer()); + if ( ! pContainer.is()) + return pPreviewPane; + + pPreviewPane = pContainer->FindPaneURL(PresenterPaneFactory::msCurrentSlidePreviewPaneURL); + Reference xPreviewPane; + if (pPreviewPane) + xPreviewPane = pPreviewPane->mxPane.get(); + if ( ! xPreviewPane.is()) + { + pPreviewPane = pContainer->FindPaneURL(PresenterPaneFactory::msSlideSorterPaneURL); + } + return pPreviewPane; +} + +void PresenterAccessible::UpdateAccessibilityHierarchy() +{ + if ( ! mpPresenterController.is()) + return; + + Reference xConfigurationController( + mpPresenterController->GetConfigurationController()); + if ( ! xConfigurationController.is()) + return; + + rtl::Reference pPaneContainer ( + mpPresenterController->GetPaneContainer()); + if ( ! pPaneContainer.is()) + return; + + if ( ! mpAccessibleConsole.is()) + return; + + // Get the preview pane (standard or notes view) or the slide overview + // pane. + PresenterPaneContainer::SharedPaneDescriptor pPreviewPane(GetPreviewPane()); + Reference xPreviewPane; + if (pPreviewPane) + xPreviewPane = pPreviewPane->mxPane.get(); + + // Get the notes pane. + PresenterPaneContainer::SharedPaneDescriptor pNotesPane( + pPaneContainer->FindPaneURL(PresenterPaneFactory::msNotesPaneURL)); + Reference xNotesPane; + if (pNotesPane) + xNotesPane = pNotesPane->mxPane.get(); + + // Get the notes view. + Reference xNotesView; + if (pNotesPane) + xNotesView = pNotesPane->mxView; + rtl::Reference pNotesView ( + dynamic_cast(xNotesView.get())); + + UpdateAccessibilityHierarchy( + pPreviewPane ? pPreviewPane->mxContentWindow : Reference(), + pPreviewPane ? pPreviewPane->mxBorderWindow : Reference(), + (pPreviewPane&&pPreviewPane->mxPane.is()) ? pPreviewPane->mxPane->GetTitle() : OUString(), + pNotesPane ? pNotesPane->mxContentWindow : Reference(), + pNotesPane ? pNotesPane->mxBorderWindow : Reference(), + pNotesView.is() + ? pNotesView->GetTextView() + : std::shared_ptr()); +} + +void PresenterAccessible::UpdateAccessibilityHierarchy ( + const Reference& rxPreviewContentWindow, + const Reference& rxPreviewBorderWindow, + const OUString& rsTitle, + const Reference& rxNotesContentWindow, + const Reference& rxNotesBorderWindow, + const std::shared_ptr& rpNotesTextView) +{ + if ( ! mpAccessibleConsole.is()) + return; + + if (mxPreviewContentWindow != rxPreviewContentWindow) + { + if (mpAccessiblePreview.is()) + { + mpAccessibleConsole->RemoveChild(mpAccessiblePreview); + mpAccessiblePreview = nullptr; + } + + mxPreviewContentWindow = rxPreviewContentWindow; + mxPreviewBorderWindow = rxPreviewBorderWindow; + + if (mxPreviewContentWindow.is()) + { + mpAccessiblePreview = AccessiblePreview::Create( + mxComponentContext, + lang::Locale(), + mxPreviewContentWindow, + mxPreviewBorderWindow); + mpAccessibleConsole->AddChild(mpAccessiblePreview); + mpAccessiblePreview->SetAccessibleName(rsTitle); + } + } + + if (mxNotesContentWindow == rxNotesContentWindow) + return; + + if (mpAccessibleNotes.is()) + { + mpAccessibleConsole->RemoveChild(mpAccessibleNotes); + mpAccessibleNotes = nullptr; + } + + mxNotesContentWindow = rxNotesContentWindow; + mxNotesBorderWindow = rxNotesBorderWindow; + + if (mxNotesContentWindow.is()) + { + mpAccessibleNotes = AccessibleNotes::Create( + mxComponentContext, + lang::Locale(), + mxNotesContentWindow, + mxNotesBorderWindow, + rpNotesTextView); + mpAccessibleConsole->AddChild(mpAccessibleNotes); + } +} + +void PresenterAccessible::NotifyCurrentSlideChange () +{ + if (mpAccessiblePreview.is()) + { + PresenterPaneContainer::SharedPaneDescriptor pPreviewPane (GetPreviewPane()); + mpAccessiblePreview->SetAccessibleName( + pPreviewPane&&pPreviewPane->mxPane.is() + ? pPreviewPane->mxPane->GetTitle() + : OUString()); + } + + // Play some focus ping-pong to trigger AT tools. + //AccessibleFocusManager::Instance()->FocusObject(mpAccessibleConsole); + AccessibleFocusManager::Instance()->FocusObject(mpAccessiblePreview); +} + +void SAL_CALL PresenterAccessible::disposing() +{ + UpdateAccessibilityHierarchy( + nullptr, + nullptr, + OUString(), + nullptr, + nullptr, + std::shared_ptr()); + + if (mxMainWindow.is()) + { + mxMainWindow->removeFocusListener(this); + + if (mxMainPane.is()) + mxMainPane->setAccessible(nullptr); + } + + mpAccessiblePreview = nullptr; + mpAccessibleNotes = nullptr; + mpAccessibleConsole = nullptr; +} + +//----- XAccessible ----------------------------------------------------------- + +Reference SAL_CALL PresenterAccessible::getAccessibleContext() +{ + if ( ! mpAccessibleConsole.is()) + { + Reference xMainPane (mxMainPane, UNO_QUERY); + if (xMainPane.is()) + { + mxMainWindow = xMainPane->getWindow(); + mxMainWindow->addFocusListener(this); + } + mpAccessibleConsole = AccessibleConsole::Create( + mxComponentContext, css::lang::Locale()); + mpAccessibleConsole->SetWindow(mxMainWindow, nullptr); + mpAccessibleConsole->SetAccessibleParent(mxAccessibleParent); + UpdateAccessibilityHierarchy(); + if (mpPresenterController.is()) + mpPresenterController->SetAccessibilityActiveState(true); + } + return mpAccessibleConsole->getAccessibleContext(); +} + +//----- XFocusListener ---------------------------------------------------- + +void SAL_CALL PresenterAccessible::focusGained (const css::awt::FocusEvent&) +{ + SAL_INFO("sdext.presenter", __func__ << ": PresenterAccessible::focusGained at " << this + << " and window " << mxMainWindow.get()); + AccessibleFocusManager::Instance()->FocusObject(mpAccessibleConsole); +} + +void SAL_CALL PresenterAccessible::focusLost (const css::awt::FocusEvent&) +{ + SAL_INFO("sdext.presenter", __func__ << ": PresenterAccessible::focusLost at " << this); + AccessibleFocusManager::Instance()->FocusObject(nullptr); +} + +//----- XEventListener ---------------------------------------------------- + +void SAL_CALL PresenterAccessible::disposing (const css::lang::EventObject& rEvent) +{ + if (rEvent.Source == mxMainWindow) + mxMainWindow = nullptr; +} + +//----- XInitialize ----------------------------------------------------------- + +void SAL_CALL PresenterAccessible::initialize (const css::uno::Sequence& rArguments) +{ + if (rArguments.hasElements()) + { + mxAccessibleParent.set(rArguments[0], UNO_QUERY); + if (mpAccessibleConsole.is()) + mpAccessibleConsole->SetAccessibleParent(mxAccessibleParent); + } +} + +//===== PresenterAccessible::AccessibleObject ========================================= + +PresenterAccessible::AccessibleObject::AccessibleObject ( + lang::Locale aLocale, + const sal_Int16 nRole, + OUString sName) + : PresenterAccessibleObjectInterfaceBase(m_aMutex), + msName(std::move(sName)), + maLocale(std::move(aLocale)), + mnRole(nRole), + mnStateSet(0), + mbIsFocused(false) +{ +} + +void PresenterAccessible::AccessibleObject::LateInitialization() +{ + AccessibleFocusManager::Instance()->AddFocusableObject(this); +} + +void PresenterAccessible::AccessibleObject::SetWindow ( + const Reference& rxContentWindow, + const Reference& rxBorderWindow) +{ + Reference xContentWindow (rxContentWindow, UNO_QUERY); + + if (mxContentWindow.get() == xContentWindow.get()) + return; + + if (mxContentWindow.is()) + { + mxContentWindow->removeWindowListener(this); + } + + mxContentWindow = xContentWindow; + mxBorderWindow.set(rxBorderWindow, UNO_QUERY); + + if (mxContentWindow.is()) + { + mxContentWindow->addWindowListener(this); + } + + UpdateStateSet(); +} + +void PresenterAccessible::AccessibleObject::SetAccessibleParent ( + const Reference& rxAccessibleParent) +{ + mxParentAccessible = rxAccessibleParent; +} + +void SAL_CALL PresenterAccessible::AccessibleObject::disposing() +{ + AccessibleFocusManager::Instance()->RemoveFocusableObject(this); + SetWindow(nullptr, nullptr); +} + +//----- XAccessible ------------------------------------------------------- + +Reference SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleContext() +{ + ThrowIfDisposed(); + + return this; +} + +//----- XAccessibleContext ---------------------------------------------- + +sal_Int64 SAL_CALL PresenterAccessible::AccessibleObject::getAccessibleChildCount() +{ + ThrowIfDisposed(); + + return maChildren.size(); +} + +Reference SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleChild (sal_Int64 nIndex) +{ + ThrowIfDisposed(); + + if (nIndex<0 || o3tl::make_unsigned(nIndex)>=maChildren.size()) + throw lang::IndexOutOfBoundsException("invalid child index", static_cast(this)); + + return maChildren[nIndex]; +} + +Reference SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleParent() +{ + ThrowIfDisposed(); + + return mxParentAccessible; +} + +sal_Int64 SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleIndexInParent() +{ + ThrowIfDisposed(); + + const Reference xThis (this); + if (mxParentAccessible.is()) + { + const Reference xContext (mxParentAccessible->getAccessibleContext()); + for (sal_Int64 nIndex = 0, nCount=xContext->getAccessibleChildCount(); + nIndexgetAccessibleChild(nIndex) == xThis) + return nIndex; + } + } + + return 0; +} + +sal_Int16 SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleRole() +{ + ThrowIfDisposed(); + + return mnRole; +} + +OUString SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleDescription() +{ + ThrowIfDisposed(); + + return msName; +} + +OUString SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleName() +{ + ThrowIfDisposed(); + + return msName; +} + +Reference SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleRelationSet() +{ + ThrowIfDisposed(); + + return nullptr; +} + +sal_Int64 SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleStateSet() +{ + ThrowIfDisposed(); + + return mnStateSet; +} + +lang::Locale SAL_CALL + PresenterAccessible::AccessibleObject::getLocale() +{ + ThrowIfDisposed(); + + if (mxParentAccessible.is()) + { + Reference xParentContext (mxParentAccessible->getAccessibleContext()); + if (xParentContext.is()) + return xParentContext->getLocale(); + } + return maLocale; +} + +//----- XAccessibleComponent ------------------------------------------------ + +sal_Bool SAL_CALL PresenterAccessible::AccessibleObject::containsPoint ( + const awt::Point& rPoint) +{ + ThrowIfDisposed(); + + if (mxContentWindow.is()) + { + const awt::Rectangle aBox (getBounds()); + return rPoint.X>=aBox.X + && rPoint.Y>=aBox.Y + && rPoint.X SAL_CALL + PresenterAccessible::AccessibleObject::getAccessibleAtPoint (const awt::Point&) +{ + ThrowIfDisposed(); + + return Reference(); +} + +awt::Rectangle SAL_CALL PresenterAccessible::AccessibleObject::getBounds() +{ + ThrowIfDisposed(); + + const awt::Point aLocation (GetRelativeLocation()); + const awt::Size aSize (GetSize()); + + return awt::Rectangle (aLocation.X, aLocation.Y, aSize.Width, aSize.Height); +} + +awt::Point SAL_CALL PresenterAccessible::AccessibleObject::getLocation() +{ + ThrowIfDisposed(); + + const awt::Point aLocation (GetRelativeLocation()); + + return aLocation; +} + +awt::Point SAL_CALL PresenterAccessible::AccessibleObject::getLocationOnScreen() +{ + ThrowIfDisposed(); + + awt::Point aRelativeLocation (GetRelativeLocation()); + awt::Point aParentLocationOnScreen (GetAbsoluteParentLocation()); + + return awt::Point( + aRelativeLocation.X + aParentLocationOnScreen.X, + aRelativeLocation.Y + aParentLocationOnScreen.Y); +} + +awt::Size SAL_CALL PresenterAccessible::AccessibleObject::getSize() +{ + ThrowIfDisposed(); + + const awt::Size aSize (GetSize()); + + return aSize; +} + +void SAL_CALL PresenterAccessible::AccessibleObject::grabFocus() +{ + ThrowIfDisposed(); + if (mxBorderWindow.is()) + mxBorderWindow->setFocus(); + else if (mxContentWindow.is()) + mxContentWindow->setFocus(); +} + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleObject::getForeground() +{ + ThrowIfDisposed(); + + return 0x00ffffff; +} + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleObject::getBackground() +{ + ThrowIfDisposed(); + + return 0x00000000; +} + +//----- XAccessibleEventBroadcaster ------------------------------------------- + +void SAL_CALL PresenterAccessible::AccessibleObject::addAccessibleEventListener ( + const Reference& rxListener) +{ + if (!rxListener.is()) + return; + + const osl::MutexGuard aGuard(m_aMutex); + + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + uno::Reference xThis (static_cast(this), UNO_QUERY); + rxListener->disposing (lang::EventObject(xThis)); + } + else + { + maListeners.push_back(rxListener); + } +} + +void SAL_CALL PresenterAccessible::AccessibleObject::removeAccessibleEventListener ( + const Reference& rxListener) +{ + ThrowIfDisposed(); + if (rxListener.is()) + { + const osl::MutexGuard aGuard(m_aMutex); + + std::erase(maListeners, rxListener); + } +} + +//----- XWindowListener --------------------------------------------------- + +void SAL_CALL PresenterAccessible::AccessibleObject::windowResized ( + const css::awt::WindowEvent&) +{ + FireAccessibleEvent(AccessibleEventId::BOUNDRECT_CHANGED, Any(), Any()); +} + +void SAL_CALL PresenterAccessible::AccessibleObject::windowMoved ( + const css::awt::WindowEvent&) +{ + FireAccessibleEvent(AccessibleEventId::BOUNDRECT_CHANGED, Any(), Any()); +} + +void SAL_CALL PresenterAccessible::AccessibleObject::windowShown ( + const css::lang::EventObject&) +{ + UpdateStateSet(); +} + +void SAL_CALL PresenterAccessible::AccessibleObject::windowHidden ( + const css::lang::EventObject&) +{ + UpdateStateSet(); +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL PresenterAccessible::AccessibleObject::disposing (const css::lang::EventObject& rEvent) +{ + if (rEvent.Source == mxContentWindow) + { + mxContentWindow = nullptr; + mxBorderWindow = nullptr; + } + else + { + SetWindow(nullptr, nullptr); + } +} + +//----- private --------------------------------------------------------------- + +bool PresenterAccessible::AccessibleObject::GetWindowState (const sal_Int64 nType) const +{ + switch (nType) + { + case AccessibleStateType::ENABLED: + return mxContentWindow.is() && mxContentWindow->isEnabled(); + + case AccessibleStateType::FOCUSABLE: + return true; + + case AccessibleStateType::FOCUSED: + return mbIsFocused; + + case AccessibleStateType::SHOWING: + return mxContentWindow.is() && mxContentWindow->isVisible(); + + default: + return false; + } +} + +void PresenterAccessible::AccessibleObject::UpdateStateSet() +{ + UpdateState(AccessibleStateType::FOCUSABLE, true); + UpdateState(AccessibleStateType::VISIBLE, true); + UpdateState(AccessibleStateType::ENABLED, true); + UpdateState(AccessibleStateType::MULTI_LINE, true); + UpdateState(AccessibleStateType::SENSITIVE, true); + + UpdateState(AccessibleStateType::ENABLED, GetWindowState(AccessibleStateType::ENABLED)); + UpdateState(AccessibleStateType::FOCUSED, GetWindowState(AccessibleStateType::FOCUSED)); + UpdateState(AccessibleStateType::SHOWING, GetWindowState(AccessibleStateType::SHOWING)); + // UpdateState(AccessibleStateType::ACTIVE, GetWindowState(AccessibleStateType::ACTIVE)); +} + +void PresenterAccessible::AccessibleObject::UpdateState( + const sal_Int64 nState, + const bool bValue) +{ + if (((mnStateSet & nState) != 0) == bValue) + return; + if (bValue) + { + mnStateSet |= nState; + FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, Any(), Any(nState)); + } + else + { + mnStateSet &= ~nState; + FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, Any(nState), Any()); + } +} + +void PresenterAccessible::AccessibleObject::AddChild ( + const ::rtl::Reference& rpChild) +{ + maChildren.push_back(rpChild); + rpChild->SetAccessibleParent(this); + FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any()); +} + +void PresenterAccessible::AccessibleObject::RemoveChild ( + const ::rtl::Reference& rpChild) +{ + rpChild->SetAccessibleParent(Reference()); + maChildren.erase(::std::find(maChildren.begin(), maChildren.end(), rpChild)); + FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any()); +} + +void PresenterAccessible::AccessibleObject::SetIsFocused (const bool bIsFocused) +{ + if (mbIsFocused != bIsFocused) + { + mbIsFocused = bIsFocused; + UpdateStateSet(); + } +} + +void PresenterAccessible::AccessibleObject::SetAccessibleName (const OUString& rsName) +{ + if (msName != rsName) + { + const OUString sOldName(msName); + msName = rsName; + FireAccessibleEvent(AccessibleEventId::NAME_CHANGED, Any(sOldName), Any(msName)); + } +} + +void PresenterAccessible::AccessibleObject::FireAccessibleEvent ( + const sal_Int16 nEventId, + const uno::Any& rOldValue, + const uno::Any& rNewValue ) +{ + AccessibleEventObject aEventObject; + + aEventObject.Source = Reference(this); + aEventObject.EventId = nEventId; + aEventObject.NewValue = rNewValue; + aEventObject.OldValue = rOldValue; + + ::std::vector > aListenerCopy(maListeners); + for (const auto& rxListener : aListenerCopy) + { + try + { + rxListener->notifyEvent(aEventObject); + } + catch (const lang::DisposedException&) + { + // Listener has been disposed and should have been removed + // already. + removeAccessibleEventListener(rxListener); + } + catch (const Exception&) + { + // Ignore all other exceptions and assume that they are + // caused by a temporary problem. + } + } +} + +awt::Point PresenterAccessible::AccessibleObject::GetRelativeLocation() +{ + awt::Point aLocation; + if (mxContentWindow.is()) + { + const awt::Rectangle aContentBox (mxContentWindow->getPosSize()); + aLocation.X = aContentBox.X; + aLocation.Y = aContentBox.Y; + if (mxBorderWindow.is()) + { + const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize()); + aLocation.X += aBorderBox.X; + aLocation.Y += aBorderBox.Y; + } + } + return aLocation; +} + +awt::Size PresenterAccessible::AccessibleObject::GetSize() +{ + if (mxContentWindow.is()) + { + const awt::Rectangle aBox (mxContentWindow->getPosSize()); + return awt::Size(aBox.Width, aBox.Height); + } + else + return awt::Size(); +} + +awt::Point PresenterAccessible::AccessibleObject::GetAbsoluteParentLocation() +{ + Reference xParentComponent; + if (mxParentAccessible.is()) + xParentComponent.set( mxParentAccessible->getAccessibleContext(), UNO_QUERY); + if (xParentComponent.is()) + return xParentComponent->getLocationOnScreen(); + else + return awt::Point(); +} + +void PresenterAccessible::AccessibleObject::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + throw lang::DisposedException("object has already been disposed", uno::Reference(const_cast(static_cast(this)))); +} + + +//===== AccessibleRelationSet ================================================= + +AccessibleRelationSet::AccessibleRelationSet() + : AccessibleRelationSetInterfaceBase(m_aMutex) +{ +} + +void AccessibleRelationSet::AddRelation ( + const sal_Int16 nRelationType, + const Reference& rxObject) +{ + maRelations.emplace_back(); + maRelations.back().RelationType = nRelationType; + maRelations.back().TargetSet = { rxObject }; +} + +//----- XAccessibleRelationSet ------------------------------------------------ + +sal_Int32 SAL_CALL AccessibleRelationSet::getRelationCount() +{ + return maRelations.size(); +} + +AccessibleRelation SAL_CALL AccessibleRelationSet::getRelation (sal_Int32 nIndex) +{ + if (nIndex<0 && o3tl::make_unsigned(nIndex)>=maRelations.size()) + return AccessibleRelation(); + else + return maRelations[nIndex]; +} + +sal_Bool SAL_CALL AccessibleRelationSet::containsRelation (sal_Int16 nRelationType) +{ + return std::any_of(maRelations.begin(), maRelations.end(), + [nRelationType](const AccessibleRelation& rRelation) { return rRelation.RelationType == nRelationType; }); +} + +AccessibleRelation SAL_CALL AccessibleRelationSet::getRelationByType (sal_Int16 nRelationType) +{ + auto iRelation = std::find_if(maRelations.begin(), maRelations.end(), + [nRelationType](const AccessibleRelation& rRelation) { return rRelation.RelationType == nRelationType; }); + if (iRelation != maRelations.end()) + return *iRelation; + return AccessibleRelation(); +} + +//===== PresenterAccessible::AccessibleParagraph ============================== + +PresenterAccessible::AccessibleParagraph::AccessibleParagraph ( + const lang::Locale& rLocale, + const OUString& rsName, + SharedPresenterTextParagraph xParagraph, + const sal_Int32 nParagraphIndex) + : PresenterAccessibleParagraphInterfaceBase(rLocale, AccessibleRole::PARAGRAPH, rsName), + mpParagraph(std::move(xParagraph)), + mnParagraphIndex(nParagraphIndex) +{ +} + +//----- XAccessibleContext ---------------------------------------------------- + +Reference SAL_CALL + PresenterAccessible::AccessibleParagraph::getAccessibleRelationSet() +{ + ThrowIfDisposed(); + + rtl::Reference pSet (new AccessibleRelationSet); + + if (mxParentAccessible.is()) + { + Reference xParentContext (mxParentAccessible->getAccessibleContext()); + if (xParentContext.is()) + { + if (mnParagraphIndex>0) + pSet->AddRelation( + AccessibleRelationType::CONTENT_FLOWS_FROM, + xParentContext->getAccessibleChild(mnParagraphIndex-1)); + + if (mnParagraphIndexgetAccessibleChildCount()-1) + pSet->AddRelation( + AccessibleRelationType::CONTENT_FLOWS_TO, + xParentContext->getAccessibleChild(mnParagraphIndex+1)); + } + } + + return pSet; +} + +//----- XAccessibleText ------------------------------------------------------- + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getCaretPosition() +{ + ThrowIfDisposed(); + + sal_Int32 nPosition (-1); + if (mpParagraph) + nPosition = mpParagraph->GetCaretPosition(); + + return nPosition; +} + +sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::setCaretPosition (sal_Int32 nIndex) +{ + ThrowIfDisposed(); + + if (mpParagraph) + { + mpParagraph->SetCaretPosition(nIndex); + return true; + } + else + return false; +} + +sal_Unicode SAL_CALL PresenterAccessible::AccessibleParagraph::getCharacter (sal_Int32 nIndex) +{ + ThrowIfDisposed(); + + if (!mpParagraph) + throw lang::IndexOutOfBoundsException("no text support in current mode", static_cast(this)); + return mpParagraph->GetCharacter(nIndex); +} + +Sequence SAL_CALL + PresenterAccessible::AccessibleParagraph::getCharacterAttributes ( + ::sal_Int32 nIndex, + const css::uno::Sequence& rRequestedAttributes) +{ + ThrowIfDisposed(); + +#if OSL_DEBUG_LEVEL > 0 + SAL_INFO( "sdext.presenter", __func__ << " at " << this << ", " << nIndex << " returns empty set" ); + for (sal_Int32 nAttributeIndex(0), nAttributeCount(rRequestedAttributes.getLength()); + nAttributeIndex < nAttributeCount; + ++nAttributeIndex) + { + SAL_INFO( "sdext.presenter", + " requested attribute " << nAttributeIndex << " is " << rRequestedAttributes[nAttributeIndex] ); + } +#else + (void)nIndex; + (void)rRequestedAttributes; +#endif + + // Character properties are not supported. + return Sequence(); +} + +awt::Rectangle SAL_CALL PresenterAccessible::AccessibleParagraph::getCharacterBounds ( + sal_Int32 nIndex) +{ + ThrowIfDisposed(); + + awt::Rectangle aCharacterBox; + if (nIndex < 0) + { + throw lang::IndexOutOfBoundsException("invalid text index", static_cast(this)); + } + else if (mpParagraph) + { + aCharacterBox = mpParagraph->GetCharacterBounds(nIndex, false); + // Convert coordinates relative to the window origin into absolute + // screen coordinates. + const awt::Point aWindowLocationOnScreen (getLocationOnScreen()); + aCharacterBox.X += aWindowLocationOnScreen.X; + aCharacterBox.Y += aWindowLocationOnScreen.Y; + } + else + { + throw lang::IndexOutOfBoundsException("no text support in current mode", static_cast(this)); + } + + return aCharacterBox; +} + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getCharacterCount() +{ + ThrowIfDisposed(); + + sal_Int32 nCount (0); + if (mpParagraph) + nCount = mpParagraph->GetCharacterCount(); + + return nCount; +} + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getIndexAtPoint ( + const css::awt::Point& ) +{ + ThrowIfDisposed(); + return -1; +} + +OUString SAL_CALL PresenterAccessible::AccessibleParagraph::getSelectedText() +{ + ThrowIfDisposed(); + + return getTextRange(getSelectionStart(), getSelectionEnd()); +} + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getSelectionStart() +{ + ThrowIfDisposed(); + + return getCaretPosition(); +} + +sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getSelectionEnd() +{ + ThrowIfDisposed(); + + return getCaretPosition(); +} + +sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::setSelection ( + sal_Int32 nStartIndex, + sal_Int32) +{ + ThrowIfDisposed(); + + return setCaretPosition(nStartIndex); +} + +OUString SAL_CALL PresenterAccessible::AccessibleParagraph::getText() +{ + ThrowIfDisposed(); + + OUString sText; + if (mpParagraph) + sText = mpParagraph->GetText(); + + return sText; +} + +OUString SAL_CALL PresenterAccessible::AccessibleParagraph::getTextRange ( + sal_Int32 nLocalStartIndex, + sal_Int32 nLocalEndIndex) +{ + ThrowIfDisposed(); + + OUString sText; + if (mpParagraph) + { + const TextSegment aSegment ( + mpParagraph->CreateTextSegment(nLocalStartIndex, nLocalEndIndex)); + sText = aSegment.SegmentText; + } + + return sText; +} + +TextSegment SAL_CALL PresenterAccessible::AccessibleParagraph::getTextAtIndex ( + sal_Int32 nLocalCharacterIndex, + sal_Int16 nTextType) +{ + ThrowIfDisposed(); + + TextSegment aSegment; + if (mpParagraph) + aSegment = mpParagraph->GetTextSegment(0, nLocalCharacterIndex, nTextType); + + return aSegment; +} + +TextSegment SAL_CALL PresenterAccessible::AccessibleParagraph::getTextBeforeIndex ( + sal_Int32 nLocalCharacterIndex, + sal_Int16 nTextType) +{ + ThrowIfDisposed(); + + TextSegment aSegment; + if (mpParagraph) + aSegment = mpParagraph->GetTextSegment(-1, nLocalCharacterIndex, nTextType); + + return aSegment; +} + +TextSegment SAL_CALL PresenterAccessible::AccessibleParagraph::getTextBehindIndex ( + sal_Int32 nLocalCharacterIndex, + sal_Int16 nTextType) +{ + ThrowIfDisposed(); + + TextSegment aSegment; + if (mpParagraph) + aSegment = mpParagraph->GetTextSegment(+1, nLocalCharacterIndex, nTextType); + + return aSegment; +} + +sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::copyText ( + sal_Int32, + sal_Int32) +{ + ThrowIfDisposed(); + + // Return false because copying to clipboard is not supported. + // It IS supported in the notes view. There is no need to duplicate + // this here. + return false; +} + +sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::scrollSubstringTo( + sal_Int32, + sal_Int32, + AccessibleScrollType) +{ + return false; +} + +//----- protected ------------------------------------------------------------- + +awt::Point PresenterAccessible::AccessibleParagraph::GetRelativeLocation() +{ + awt::Point aLocation (AccessibleObject::GetRelativeLocation()); + if (mpParagraph) + { + const awt::Point aParagraphLocation (mpParagraph->GetRelativeLocation()); + aLocation.X += aParagraphLocation.X; + aLocation.Y += aParagraphLocation.Y; + } + + return aLocation; +} + +awt::Size PresenterAccessible::AccessibleParagraph::GetSize() +{ + if (mpParagraph) + return mpParagraph->GetSize(); + else + return AccessibleObject::GetSize(); +} + +awt::Point PresenterAccessible::AccessibleParagraph::GetAbsoluteParentLocation() +{ + if (mxParentAccessible.is()) + { + Reference xParentContext = + mxParentAccessible->getAccessibleContext(); + if (xParentContext.is()) + { + Reference xGrandParentComponent( + xParentContext->getAccessibleParent(), UNO_QUERY); + if (xGrandParentComponent.is()) + return xGrandParentComponent->getLocationOnScreen(); + } + } + + return awt::Point(); +} + +bool PresenterAccessible::AccessibleParagraph::GetWindowState (const sal_Int64 nType) const +{ + switch (nType) + { + case AccessibleStateType::EDITABLE: + return bool(mpParagraph); + + case AccessibleStateType::ACTIVE: + return true; + + default: + return AccessibleObject::GetWindowState(nType); + } +} + +//===== AccessibleNotes ======================================================= + +AccessibleNotes::AccessibleNotes ( + const css::lang::Locale& rLocale, + const OUString& rsName) + : AccessibleObject(rLocale,AccessibleRole::PANEL,rsName) +{ +} + +rtl::Reference AccessibleNotes::Create ( + const css::uno::Reference& rxContext, + const lang::Locale& rLocale, + const Reference& rxContentWindow, + const Reference& rxBorderWindow, + const std::shared_ptr& rpTextView) +{ + OUString sName ("Presenter Notes Text"); + { + PresenterConfigurationAccess aConfiguration ( + rxContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + aConfiguration.GetConfigurationNode("Presenter/Accessibility/Notes/String") + >>= sName; + } + + rtl::Reference pObject ( + new AccessibleNotes( + rLocale, + sName)); + pObject->LateInitialization(); + pObject->SetTextView(rpTextView); + pObject->UpdateStateSet(); + pObject->SetWindow(rxContentWindow, rxBorderWindow); + + return pObject; +} + +void AccessibleNotes::SetTextView ( + const std::shared_ptr& rpTextView) +{ + ::std::vector > aChildren; + + // Release any listeners to the current text view. + if (mpTextView) + { + mpTextView->GetCaret()->SetCaretMotionBroadcaster( + ::std::function()); + mpTextView->SetTextChangeBroadcaster( + ::std::function()); + } + + mpTextView = rpTextView; + + if (!mpTextView) + return; + + // Create a new set of children, one for each paragraph. + const sal_Int32 nParagraphCount (mpTextView->GetParagraphCount()); + for (sal_Int32 nIndex=0; nIndex pParagraph ( + new PresenterAccessible::AccessibleParagraph( + css::lang::Locale(), + "Paragraph"+OUString::number(nIndex), + rpTextView->GetParagraph(nIndex), + nIndex)); + pParagraph->LateInitialization(); + pParagraph->SetWindow(mxContentWindow, mxBorderWindow); + pParagraph->SetAccessibleParent(this); + aChildren.emplace_back(pParagraph.get()); + } + maChildren.swap(aChildren); + FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any()); + + // Dispose the old children. (This will remove them from the focus + // manager). + for (const auto& rxChild : aChildren) + { + Reference xComponent = rxChild; + if (xComponent.is()) + xComponent->dispose(); + } + + // This class acts as a controller of who broadcasts caret motion + // events and handles text changes. Register the corresponding + // listeners here. + mpTextView->GetCaret()->SetCaretMotionBroadcaster( + [this](sal_Int32 a, sal_Int32 b, sal_Int32 c, sal_Int32 d) + { return this->NotifyCaretChange(a, b, c, d); }); + mpTextView->SetTextChangeBroadcaster( + [this]() { return SetTextView(mpTextView); }); +} + +void AccessibleNotes::SetWindow ( + const css::uno::Reference& rxContentWindow, + const css::uno::Reference& rxBorderWindow) +{ + AccessibleObject::SetWindow(rxContentWindow, rxBorderWindow); + + // Set the windows at the children as well, so that every paragraph can + // setup its geometry. + for (auto& rxChild : maChildren) + { + rxChild->SetWindow(rxContentWindow, rxBorderWindow); + } +} + +void AccessibleNotes::NotifyCaretChange ( + const sal_Int32 nOldParagraphIndex, + const sal_Int32 nOldCharacterIndex, + const sal_Int32 nNewParagraphIndex, + const sal_Int32 nNewCharacterIndex) +{ + AccessibleFocusManager::Instance()->FocusObject( + nNewParagraphIndex >= 0 + ? maChildren[nNewParagraphIndex] + : this); + + if (nOldParagraphIndex != nNewParagraphIndex) + { + // Moved caret from one paragraph to another (or showed or + // hid the caret). Move focus from one accessible + // paragraph to another. + if (nOldParagraphIndex >= 0) + { + maChildren[nOldParagraphIndex]->FireAccessibleEvent( + AccessibleEventId::CARET_CHANGED, + Any(nOldCharacterIndex), + Any(sal_Int32(-1))); + } + if (nNewParagraphIndex >= 0) + { + maChildren[nNewParagraphIndex]->FireAccessibleEvent( + AccessibleEventId::CARET_CHANGED, + Any(sal_Int32(-1)), + Any(nNewCharacterIndex)); + } + } + else if (nNewParagraphIndex >= 0) + { + // Caret moved inside one paragraph. + maChildren[nNewParagraphIndex]->FireAccessibleEvent( + AccessibleEventId::CARET_CHANGED, + Any(nOldCharacterIndex), + Any(nNewCharacterIndex)); + } +} + + +//===== AccessibleFocusManager ================================================ + +std::shared_ptr AccessibleFocusManager::mpInstance; + +std::shared_ptr const & AccessibleFocusManager::Instance() +{ + if ( ! mpInstance) + { + mpInstance.reset(new AccessibleFocusManager()); + } + return mpInstance; +} + +AccessibleFocusManager::AccessibleFocusManager() +{ +} + +AccessibleFocusManager::~AccessibleFocusManager() +{ + // copy member to stack, then drop it - otherwise will get use-after-free + // from AccessibleObject::disposing(), it will call ~Reference *twice* + auto const temp(std::move(maFocusableObjects)); + (void) temp; + m_isInDtor = true; +} + +void AccessibleFocusManager::AddFocusableObject ( + const ::rtl::Reference& rpObject) +{ + OSL_ASSERT(rpObject.is()); + OSL_ASSERT(::std::find(maFocusableObjects.begin(),maFocusableObjects.end(), rpObject)==maFocusableObjects.end()); + + maFocusableObjects.push_back(rpObject); +} + +void AccessibleFocusManager::RemoveFocusableObject ( + const ::rtl::Reference& rpObject) +{ + ::std::vector >::iterator iObject ( + ::std::find(maFocusableObjects.begin(),maFocusableObjects.end(), rpObject)); + + if (iObject != maFocusableObjects.end()) + maFocusableObjects.erase(iObject); + else + { + OSL_ASSERT(m_isInDtor); // in dtor, was removed already + } +} + +void AccessibleFocusManager::FocusObject ( + const ::rtl::Reference& rpObject) +{ + // Remove the focus of any of the other focusable objects. + for (auto& rxObject : maFocusableObjects) + { + if (rxObject!=rpObject) + rxObject->SetIsFocused(false); + } + + if (rpObject.is()) + rpObject->SetIsFocused(true); +} + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterAccessibility.hxx b/sd/source/console/PresenterAccessibility.hxx new file mode 100644 index 0000000000..12015d0938 --- /dev/null +++ b/sd/source/console/PresenterAccessibility.hxx @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERACCESSIBILITY_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERACCESSIBILITY_HXX + +#include "PresenterPaneContainer.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sdext::presenter { + +class PresenterController; +class PresenterTextView; + +typedef ::cppu::WeakComponentImplHelper < + css::accessibility::XAccessible, + css::lang::XInitialization, + css::awt::XFocusListener +> PresenterAccessibleInterfaceBase; + +class PresenterAccessible + : public ::cppu::BaseMutex, + public PresenterAccessibleInterfaceBase +{ +public: + PresenterAccessible ( + css::uno::Reference xContext, + ::rtl::Reference xPresenterController, + const css::uno::Reference& rxMainPane); + virtual ~PresenterAccessible() override; + + void UpdateAccessibilityHierarchy(); + + void NotifyCurrentSlideChange (); + + virtual void SAL_CALL disposing() override; + + //----- XAccessible ------------------------------------------------------- + + virtual css::uno::Reference SAL_CALL + getAccessibleContext() override; + + //----- XFocusListener ---------------------------------------------------- + + virtual void SAL_CALL focusGained (const css::awt::FocusEvent& rEvent) override; + + virtual void SAL_CALL focusLost (const css::awt::FocusEvent& rEvent) override; + + //----- XEventListener ---------------------------------------------------- + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + //----- XInitialization --------------------------------------------------- + + virtual void SAL_CALL initialize (const css::uno::Sequence& rArguments) override; + + class AccessibleObject; + class AccessibleParagraph; + +private: + const css::uno::Reference mxComponentContext; + ::rtl::Reference mpPresenterController; + css::uno::Reference mxMainPane; + css::uno::Reference mxMainWindow; + css::uno::Reference mxPreviewContentWindow; + css::uno::Reference mxPreviewBorderWindow; + css::uno::Reference mxNotesContentWindow; + css::uno::Reference mxNotesBorderWindow; + ::rtl::Reference mpAccessibleConsole; + ::rtl::Reference mpAccessiblePreview; + ::rtl::Reference mpAccessibleNotes; + css::uno::Reference mxAccessibleParent; + + void UpdateAccessibilityHierarchy ( + const css::uno::Reference& rxPreviewContentWindow, + const css::uno::Reference& rxPreviewBorderWindow, + const OUString& rsTitle, + const css::uno::Reference& rxNotesContentWindow, + const css::uno::Reference& rxNotesBorderWindow, + const std::shared_ptr& rpNotesTextView); + PresenterPaneContainer::SharedPaneDescriptor GetPreviewPane() const; +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterBitmapContainer.cxx b/sd/source/console/PresenterBitmapContainer.cxx new file mode 100644 index 0000000000..b25dacdf11 --- /dev/null +++ b/sd/source/console/PresenterBitmapContainer.cxx @@ -0,0 +1,399 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterBitmapContainer.hxx" +#include "PresenterConfigurationAccess.hxx" + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +//===== PresenterBitmapContainer ============================================== + +PresenterBitmapContainer::PresenterBitmapContainer ( + const OUString& rsConfigurationBase, + std::shared_ptr xParentContainer, + const css::uno::Reference& rxComponentContext, + css::uno::Reference xCanvas, + css::uno::Reference xPresenterHelper) + : mpParentContainer(std::move(xParentContainer)), + mxCanvas(std::move(xCanvas)), + mxPresenterHelper(std::move(xPresenterHelper)) +{ + Initialize(rxComponentContext); + + // Get access to the configuration. + PresenterConfigurationAccess aConfiguration ( + rxComponentContext, + "org.openoffice.Office.PresenterScreen", + PresenterConfigurationAccess::READ_ONLY); + Reference xBitmapList ( + aConfiguration.GetConfigurationNode(rsConfigurationBase), + UNO_QUERY_THROW); + + LoadBitmaps(xBitmapList); +} + +PresenterBitmapContainer::PresenterBitmapContainer ( + const css::uno::Reference& rxRootNode, + std::shared_ptr xParentContainer, + const css::uno::Reference& rxComponentContext, + css::uno::Reference xCanvas, + css::uno::Reference xPresenterHelper) + : mpParentContainer(std::move(xParentContainer)), + mxCanvas(std::move(xCanvas)), + mxPresenterHelper(std::move(xPresenterHelper)) +{ + Initialize(rxComponentContext); + + LoadBitmaps(rxRootNode); +} + +void PresenterBitmapContainer::Initialize ( + const css::uno::Reference& rxComponentContext) +{ + if ( mxPresenterHelper.is()) + return; + + // Create an object that is able to load the bitmaps in a format that is + // supported by the canvas. + Reference xFactory = + rxComponentContext->getServiceManager(); + if ( ! xFactory.is()) + return; + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.drawing.PresenterHelper", + rxComponentContext), + UNO_QUERY_THROW); +} + +PresenterBitmapContainer::~PresenterBitmapContainer() +{ + maIconContainer.clear(); +} + +std::shared_ptr PresenterBitmapContainer::GetBitmap ( + const OUString& rsName) const +{ + BitmapContainer::const_iterator iSet (maIconContainer.find(rsName)); + if (iSet != maIconContainer.end()) + return iSet->second; + else if (mpParentContainer != nullptr) + return mpParentContainer->GetBitmap(rsName); + else + return SharedBitmapDescriptor(); +} + +void PresenterBitmapContainer::LoadBitmaps ( + const css::uno::Reference& rxBitmapList) +{ + if ( ! mxCanvas.is()) + return; + + if ( ! rxBitmapList.is()) + return; + + try + { + // Load all button bitmaps. + if (rxBitmapList.is()) + { + PresenterConfigurationAccess::ForAll( + rxBitmapList, + [this](OUString const& rKey, Reference const& xProps) + { + this->ProcessBitmap(rKey, xProps); + }); + } + } + catch (Exception&) + { + OSL_ASSERT(false); + } +} + +std::shared_ptr PresenterBitmapContainer::LoadBitmap ( + const css::uno::Reference& rxNode, + const OUString& rsPath, + const css::uno::Reference& rxPresenterHelper, + const css::uno::Reference& rxCanvas, + const std::shared_ptr& rpDefault) +{ + SharedBitmapDescriptor pBitmap; + + if (rxNode.is()) + { + try + { + Reference xBitmapProperties ( + PresenterConfigurationAccess::GetConfigurationNode(rxNode, rsPath), + UNO_QUERY); + if (xBitmapProperties.is()) + pBitmap = LoadBitmap( + xBitmapProperties, + rxPresenterHelper, + rxCanvas, + rpDefault); + } + catch (Exception&) + { + OSL_ASSERT(false); + } + } + + return pBitmap; +} + +void PresenterBitmapContainer::ProcessBitmap ( + const OUString& rsKey, + const Reference& rxProperties) +{ + OUString sName; + if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties, "Name") >>= sName)) + sName = rsKey; + + maIconContainer[sName] = LoadBitmap( + rxProperties, + mxPresenterHelper, + mxCanvas, + SharedBitmapDescriptor()); +} + +std::shared_ptr PresenterBitmapContainer::LoadBitmap ( + const Reference& rxProperties, + const css::uno::Reference& rxPresenterHelper, + const css::uno::Reference& rxCanvas, + const std::shared_ptr& rpDefault) +{ + OSL_ASSERT(rxCanvas.is()); + OSL_ASSERT(rxPresenterHelper.is()); + + SharedBitmapDescriptor pBitmap = std::make_shared(rpDefault); + + if ( ! rxProperties.is()) + return pBitmap; + + OUString sFileName; + + // Load bitmaps. + if (PresenterConfigurationAccess::GetProperty(rxProperties, "NormalFileName") >>= sFileName) + try + { + pBitmap->SetBitmap( + BitmapDescriptor::Normal, + rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); + } + catch (Exception&) + {} + if (PresenterConfigurationAccess::GetProperty(rxProperties, "MouseOverFileName") >>= sFileName) + try + { + pBitmap->SetBitmap( + BitmapDescriptor::MouseOver, + rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); + } + catch (Exception&) + {} + if (PresenterConfigurationAccess::GetProperty(rxProperties, "ButtonDownFileName") >>= sFileName) + try + { + pBitmap->SetBitmap( + BitmapDescriptor::ButtonDown, + rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); + } + catch (Exception&) + {} + if (PresenterConfigurationAccess::GetProperty(rxProperties, "DisabledFileName") >>= sFileName) + try + { + pBitmap->SetBitmap( + BitmapDescriptor::Disabled, + rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); + } + catch (Exception&) + {} + if (PresenterConfigurationAccess::GetProperty(rxProperties, "MaskFileName") >>= sFileName) + try + { + pBitmap->SetBitmap( + BitmapDescriptor::Mask, + rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); + } + catch (Exception&) + {} + + PresenterConfigurationAccess::GetProperty(rxProperties, "XOffset") >>= pBitmap->mnXOffset; + PresenterConfigurationAccess::GetProperty(rxProperties, "YOffset") >>= pBitmap->mnYOffset; + + PresenterConfigurationAccess::GetProperty(rxProperties, "XHotSpot") >>= pBitmap->mnXHotSpot; + PresenterConfigurationAccess::GetProperty(rxProperties, "YHotSpot") >>= pBitmap->mnYHotSpot; + + PresenterConfigurationAccess::GetProperty(rxProperties, "ReplacementColor") >>= pBitmap->maReplacementColor; + + OUString sTexturingMode; + if (PresenterConfigurationAccess::GetProperty(rxProperties, "HorizontalTexturingMode") >>= sTexturingMode) + pBitmap->meHorizontalTexturingMode = StringToTexturingMode(sTexturingMode); + if (PresenterConfigurationAccess::GetProperty(rxProperties, "VerticalTexturingMode") >>= sTexturingMode) + pBitmap->meVerticalTexturingMode = StringToTexturingMode(sTexturingMode); + + return pBitmap; +} + +PresenterBitmapContainer::BitmapDescriptor::TexturingMode + PresenterBitmapContainer::StringToTexturingMode (std::u16string_view rsTexturingMode) +{ + if (rsTexturingMode == u"Once") + return PresenterBitmapContainer::BitmapDescriptor::Once; + else if (rsTexturingMode == u"Repeat") + return PresenterBitmapContainer::BitmapDescriptor::Repeat; + else if (rsTexturingMode == u"Stretch") + return PresenterBitmapContainer::BitmapDescriptor::Stretch; + else + return PresenterBitmapContainer::BitmapDescriptor::Once; +} + +//===== PresenterBitmapContainer::BitmapSet =================================== + +PresenterBitmapContainer::BitmapDescriptor::BitmapDescriptor() + : mnWidth(0), + mnHeight(0), + mnXOffset(0), + mnYOffset(0), + mnXHotSpot(0), + mnYHotSpot(0), + maReplacementColor(0x00000000), + meHorizontalTexturingMode(Once), + meVerticalTexturingMode(Once) +{ +} + +PresenterBitmapContainer::BitmapDescriptor::BitmapDescriptor ( + const std::shared_ptr& rpDefault) + : mnWidth(0), + mnHeight(0), + mnXOffset(0), + mnYOffset(0), + mnXHotSpot(0), + mnYHotSpot(0), + maReplacementColor(0x00000000), + meHorizontalTexturingMode(Once), + meVerticalTexturingMode(Once) +{ + if (rpDefault == nullptr) + return; + + mnWidth = rpDefault->mnWidth; + mnHeight = rpDefault->mnHeight; + mnXOffset = rpDefault->mnXOffset; + mnYOffset = rpDefault->mnYOffset; + mnXHotSpot = rpDefault->mnXHotSpot; + mnYHotSpot = rpDefault->mnYHotSpot; + maReplacementColor = rpDefault->maReplacementColor; + meHorizontalTexturingMode = rpDefault->meHorizontalTexturingMode; + meVerticalTexturingMode = rpDefault->meVerticalTexturingMode; + mxNormalBitmap = rpDefault->mxNormalBitmap; + mxMouseOverBitmap = rpDefault->mxMouseOverBitmap; + mxButtonDownBitmap = rpDefault->mxButtonDownBitmap; + mxDisabledBitmap = rpDefault->mxDisabledBitmap; + mxMaskBitmap = rpDefault->mxMaskBitmap; +} + +const css::uno::Reference& + PresenterBitmapContainer::BitmapDescriptor::GetNormalBitmap() const +{ + return mxNormalBitmap; +} + +css::uno::Reference const & + PresenterBitmapContainer::BitmapDescriptor::GetBitmap(const Mode eMode) const +{ + switch (eMode) + { + case Normal: + default: + return mxNormalBitmap; + + case MouseOver: + if (mxMouseOverBitmap.is()) + return mxMouseOverBitmap; + else + return mxNormalBitmap; + + case ButtonDown: + if (mxButtonDownBitmap.is()) + return mxButtonDownBitmap; + else + return mxNormalBitmap; + + case Disabled: + if (mxDisabledBitmap.is()) + return mxDisabledBitmap; + else + return mxNormalBitmap; + + case Mask: + return mxMaskBitmap; + } +} + +void PresenterBitmapContainer::BitmapDescriptor::SetBitmap ( + const Mode eMode, + const css::uno::Reference& rxBitmap) +{ + switch (eMode) + { + case Normal: + default: + mxNormalBitmap = rxBitmap; + if (mxNormalBitmap.is()) + { + const geometry::IntegerSize2D aSize (mxNormalBitmap->getSize()); + mnWidth = aSize.Width; + mnHeight = aSize.Height; + } + break; + + case MouseOver: + mxMouseOverBitmap = rxBitmap; + break; + + case ButtonDown: + mxButtonDownBitmap = rxBitmap; + break; + + case Disabled: + mxDisabledBitmap = rxBitmap; + break; + + case Mask: + mxMaskBitmap = rxBitmap; + break; + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterBitmapContainer.hxx b/sd/source/console/PresenterBitmapContainer.hxx new file mode 100644 index 0000000000..7a9de89a7f --- /dev/null +++ b/sd/source/console/PresenterBitmapContainer.hxx @@ -0,0 +1,146 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERBITMAPCONTAINER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERBITMAPCONTAINER_HXX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +/** Manage a set of bitmap groups as they are used for buttons: three + bitmaps, one for the normal state, one for a mouse over effect and one + to show that the button has been pressed. + A bitmap group is defined by some entries in the configuration. +*/ +class PresenterBitmapContainer +{ +public: + /** There is one bitmap for the normal state, one for a mouse over effect and one + to show that a button has been pressed. + */ + class BitmapDescriptor + { + public: + BitmapDescriptor(); + explicit BitmapDescriptor (const std::shared_ptr& rpDefault); + + enum Mode {Normal, MouseOver, ButtonDown, Disabled, Mask}; + const css::uno::Reference& GetNormalBitmap() const; + css::uno::Reference const & GetBitmap(const Mode eMode) const; + void SetBitmap ( + const Mode eMode, + const css::uno::Reference& rxBitmap); + + sal_Int32 mnWidth; + sal_Int32 mnHeight; + sal_Int32 mnXOffset; + sal_Int32 mnYOffset; + sal_Int32 mnXHotSpot; + sal_Int32 mnYHotSpot; + css::util::Color maReplacementColor; + enum TexturingMode { Once, Repeat, Stretch }; + TexturingMode meHorizontalTexturingMode; + TexturingMode meVerticalTexturingMode; + + private: + css::uno::Reference mxNormalBitmap; + css::uno::Reference mxMouseOverBitmap; + css::uno::Reference mxButtonDownBitmap; + css::uno::Reference mxDisabledBitmap; + css::uno::Reference mxMaskBitmap; + }; + + /** Create a new bitmap container from a section of the configuration. + @param rxComponentContext + The component context is used to create new API objects. + @param rxCanvas + Bitmaps are created specifically for this canvas. + @param rsConfigurationBase + The name of a configuration node whose sub-tree defines the + bitmap sets. + */ + PresenterBitmapContainer ( + const OUString& rsConfigurationBase, + std::shared_ptr xParentContainer, + const css::uno::Reference& rxComponentContext, + css::uno::Reference xCanvas, + css::uno::Reference xPresenterHelper = nullptr); + PresenterBitmapContainer ( + const css::uno::Reference& rsRootNode, + std::shared_ptr xParentContainer, + const css::uno::Reference& rxComponentContext, + css::uno::Reference xCanvas, + css::uno::Reference xPresenterHelper = nullptr); + ~PresenterBitmapContainer(); + PresenterBitmapContainer(const PresenterBitmapContainer&) = delete; + PresenterBitmapContainer& operator=(const PresenterBitmapContainer&) = delete; + + void Initialize ( + const css::uno::Reference& rxComponentContext); + + /** Return the bitmap set that is associated with the given name. + */ + std::shared_ptr GetBitmap (const OUString& rsName) const; + + static std::shared_ptr LoadBitmap ( + const css::uno::Reference& rxNode, + const OUString& rsPathToBitmapNode, + const css::uno::Reference& rxPresenterHelper, + const css::uno::Reference& rxCanvas, + const std::shared_ptr& rpDefaultBitmap); + +private: + std::shared_ptr mpParentContainer; + typedef ::std::map > BitmapContainer; + BitmapContainer maIconContainer; + css::uno::Reference mxCanvas; + css::uno::Reference mxPresenterHelper; + + void LoadBitmaps ( + const css::uno::Reference& rsRootNode); + void ProcessBitmap ( + const OUString& rsKey, + const css::uno::Reference& rProperties); + static std::shared_ptr LoadBitmap ( + const css::uno::Reference& rxProperties, + const css::uno::Reference& rxPresenterHelper, + const css::uno::Reference& rxCanvas, + const std::shared_ptr& rpDefault); + static BitmapDescriptor::TexturingMode + StringToTexturingMode (std::u16string_view rsTexturingMode); +}; + +typedef PresenterBitmapContainer::BitmapDescriptor PresenterBitmapDescriptor; +typedef std::shared_ptr SharedBitmapDescriptor; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterButton.cxx b/sd/source/console/PresenterButton.cxx new file mode 100644 index 0000000000..d0fa61a09c --- /dev/null +++ b/sd/source/console/PresenterButton.cxx @@ -0,0 +1,448 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterButton.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterController.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterUIPainter.hxx" +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +const double gnHorizontalBorder (15); +const double gnVerticalBorder (5); + +::rtl::Reference PresenterButton::Create ( + const css::uno::Reference& rxComponentContext, + const ::rtl::Reference& rpPresenterController, + const std::shared_ptr& rpTheme, + const css::uno::Reference& rxParentWindow, + const css::uno::Reference& rxParentCanvas, + const OUString& rsConfigurationName) +{ + Reference xProperties (GetConfigurationProperties( + rxComponentContext, + rsConfigurationName)); + if (xProperties.is()) + { + OUString sText; + OUString sAction; + PresenterConfigurationAccess::GetProperty(xProperties, "Text") >>= sText; + PresenterConfigurationAccess::GetProperty(xProperties, "Action") >>= sAction; + + PresenterTheme::SharedFontDescriptor pFont; + if (rpTheme != nullptr) + pFont = rpTheme->GetFont("ButtonFont"); + + PresenterTheme::SharedFontDescriptor pMouseOverFont; + if (rpTheme != nullptr) + pMouseOverFont = rpTheme->GetFont("ButtonMouseOverFont"); + + rtl::Reference pButton ( + new PresenterButton( + rxComponentContext, + rpPresenterController, + rpTheme, + rxParentWindow, + pFont, + pMouseOverFont, + sText, + sAction)); + pButton->SetCanvas(rxParentCanvas, rxParentWindow); + return pButton; + } + else + return nullptr; +} + +PresenterButton::PresenterButton ( + const css::uno::Reference& rxComponentContext, + ::rtl::Reference xPresenterController, + std::shared_ptr xTheme, + const css::uno::Reference& rxParentWindow, + PresenterTheme::SharedFontDescriptor xFont, + PresenterTheme::SharedFontDescriptor xMouseOverFont, + OUString sText, + OUString sAction) + : PresenterButtonInterfaceBase(m_aMutex), + mpPresenterController(std::move(xPresenterController)), + mpTheme(std::move(xTheme)), + msText(std::move(sText)), + mpFont(std::move(xFont)), + mpMouseOverFont(std::move(xMouseOverFont)), + msAction(std::move(sAction)), + maButtonSize(-1,-1), + meState(PresenterBitmapDescriptor::Normal) +{ + try + { + Reference xFactory (rxComponentContext->getServiceManager()); + if ( ! xFactory.is()) + throw RuntimeException(); + + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + rxComponentContext), + UNO_QUERY_THROW); + + if (mxPresenterHelper.is()) + mxWindow = mxPresenterHelper->createWindow(rxParentWindow, + false, + false, + false, + false); + + // Make the background transparent. + Reference xPeer (mxWindow, UNO_QUERY_THROW); + xPeer->setBackground(0xff000000); + + mxWindow->setVisible(true); + mxWindow->addPaintListener(this); + mxWindow->addMouseListener(this); + } + catch (RuntimeException&) + { + } +} + +PresenterButton::~PresenterButton() +{ +} + +void SAL_CALL PresenterButton::disposing() +{ + if (mxCanvas.is()) + { + Reference xComponent (mxCanvas, UNO_QUERY); + mxCanvas = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + if (mxWindow.is()) + { + mxWindow->removePaintListener(this); + mxWindow->removeMouseListener(this); + Reference xComponent = mxWindow; + mxWindow = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } +} + +void PresenterButton::SetCenter (const css::geometry::RealPoint2D& rLocation) +{ + if (mxCanvas.is()) + { + Invalidate(); + + maCenter = rLocation; + mxWindow->setPosSize( + sal_Int32(0.5 + maCenter.X - maButtonSize.Width/2), + sal_Int32(0.5 + maCenter.Y - maButtonSize.Height/2), + maButtonSize.Width, + maButtonSize.Height, + awt::PosSize::POSSIZE); + + Invalidate(); + } + else + { + // The button can not be painted but we can at least store the new center. + maCenter = rLocation; + } +} + +void PresenterButton::SetCanvas ( + const css::uno::Reference& rxParentCanvas, + const css::uno::Reference& rxParentWindow) +{ + if (mxCanvas.is()) + { + Reference xComponent (mxCanvas, UNO_QUERY); + mxCanvas = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + if (!(mxPresenterHelper.is() && rxParentCanvas.is() && rxParentWindow.is())) + return; + + mxCanvas = mxPresenterHelper->createSharedCanvas ( + Reference(rxParentCanvas, UNO_QUERY), + rxParentWindow, + rxParentCanvas, + rxParentWindow, + mxWindow); + if (mxCanvas.is()) + { + SetupButtonBitmaps(); + SetCenter(maCenter); + } +} + +css::geometry::IntegerSize2D const & PresenterButton::GetSize() +{ + if (maButtonSize.Width < 0) + CalculateButtonSize(); + return maButtonSize; +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterButton::windowPaint (const css::awt::PaintEvent& rEvent) +{ + ThrowIfDisposed(); + if (!(mxWindow.is() && mxCanvas.is())) + return; + + Reference xBitmap; + if (meState == PresenterBitmapDescriptor::MouseOver) + xBitmap = mxMouseOverBitmap; + else + xBitmap = mxNormalBitmap; + if ( ! xBitmap.is()) + return; + + rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr); + rendering::RenderState aRenderState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + PresenterGeometryHelper::CreatePolygon(rEvent.UpdateRect, mxCanvas->getDevice()), + Sequence(4), + rendering::CompositeOperation::SOURCE); + + mxCanvas->drawBitmap(xBitmap, aViewState, aRenderState); + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +//----- XMouseListener -------------------------------------------------------- + +void SAL_CALL PresenterButton::mousePressed (const css::awt::MouseEvent&) +{ + ThrowIfDisposed(); + meState = PresenterBitmapDescriptor::ButtonDown; +} + +void SAL_CALL PresenterButton::mouseReleased (const css::awt::MouseEvent&) +{ + ThrowIfDisposed(); + + if (meState == PresenterBitmapDescriptor::ButtonDown) + { + OSL_ASSERT(mpPresenterController); + mpPresenterController->DispatchUnoCommand(msAction); + + meState = PresenterBitmapDescriptor::Normal; + Invalidate(); + } +} + +void SAL_CALL PresenterButton::mouseEntered (const css::awt::MouseEvent&) +{ + ThrowIfDisposed(); + meState = PresenterBitmapDescriptor::MouseOver; + Invalidate(); +} + +void SAL_CALL PresenterButton::mouseExited (const css::awt::MouseEvent&) +{ + ThrowIfDisposed(); + meState = PresenterBitmapDescriptor::Normal; + Invalidate(); +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterButton::disposing (const css::lang::EventObject& rEvent) +{ + if (rEvent.Source == mxWindow) + mxWindow = nullptr; +} + + +css::geometry::IntegerSize2D PresenterButton::CalculateButtonSize() +{ + if (mpFont && !mpFont->mxFont.is() && mxCanvas.is()) + mpFont->PrepareFont(mxCanvas); + if (!mpFont || !mpFont->mxFont.is()) + return geometry::IntegerSize2D(-1,-1); + + geometry::RealSize2D aTextSize (PresenterCanvasHelper::GetTextSize(mpFont->mxFont,msText)); + + return geometry::IntegerSize2D ( + sal_Int32(0.5 + aTextSize.Width + 2*gnHorizontalBorder), + sal_Int32(0.5 + aTextSize.Height + 2*gnVerticalBorder)); +} + +void PresenterButton::RenderButton ( + const Reference& rxCanvas, + const geometry::IntegerSize2D& rSize, + const PresenterTheme::SharedFontDescriptor& rpFont, + const PresenterBitmapDescriptor::Mode eMode, + const SharedBitmapDescriptor& rpLeft, + const SharedBitmapDescriptor& rpCenter, + const SharedBitmapDescriptor& rpRight) +{ + if ( ! rxCanvas.is()) + return; + + const awt::Rectangle aBox(0,0, rSize.Width, rSize.Height); + + PresenterUIPainter::PaintHorizontalBitmapComposite ( + rxCanvas, + aBox, + aBox, + GetBitmap(rpLeft, eMode), + GetBitmap(rpCenter, eMode), + GetBitmap(rpRight, eMode)); + + if (!rpFont || ! rpFont->mxFont.is()) + return; + + const rendering::StringContext aContext (msText, 0, msText.getLength()); + const Reference xLayout ( + rpFont->mxFont->createTextLayout(aContext,rendering::TextDirection::WEAK_LEFT_TO_RIGHT,0)); + const geometry::RealRectangle2D aTextBBox (xLayout->queryTextBounds()); + + rendering::RenderState aRenderState (geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr, + Sequence(4), rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, rpFont->mnColor); + + aRenderState.AffineTransform.m02 = (rSize.Width - aTextBBox.X2 + aTextBBox.X1)/2; + aRenderState.AffineTransform.m12 = (rSize.Height - aTextBBox.Y2 + aTextBBox.Y1)/2 - aTextBBox.Y1; + + /// this is responsible of the close button + rxCanvas->drawTextLayout( + xLayout, + rendering::ViewState(geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr), + aRenderState); +} + +void PresenterButton::Invalidate() +{ + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); +} + +Reference PresenterButton::GetBitmap ( + const SharedBitmapDescriptor& mpIcon, + const PresenterBitmapDescriptor::Mode eMode) +{ + if (mpIcon) + return mpIcon->GetBitmap(eMode); + else + { + OSL_ASSERT(mpIcon); + return nullptr; + } +} + +void PresenterButton::SetupButtonBitmaps() +{ + if ( ! mxCanvas.is()) + return; + if ( ! mxCanvas->getDevice().is()) + return; + + // Get the bitmaps for the button border. + SharedBitmapDescriptor pLeftBitmap (mpTheme->GetBitmap("ButtonFrameLeft")); + SharedBitmapDescriptor pCenterBitmap(mpTheme->GetBitmap("ButtonFrameCenter")); + SharedBitmapDescriptor pRightBitmap(mpTheme->GetBitmap("ButtonFrameRight")); + + maButtonSize = CalculateButtonSize(); + + if (maButtonSize.Height<=0 && maButtonSize.Width<= 0) + return; + + mxNormalBitmap = mxCanvas->getDevice()->createCompatibleAlphaBitmap(maButtonSize); + Reference xCanvas (mxNormalBitmap, UNO_QUERY); + if (xCanvas.is()) + RenderButton( + xCanvas, + maButtonSize, + mpFont, + PresenterBitmapDescriptor::Normal, + pLeftBitmap, + pCenterBitmap, + pRightBitmap); + + mxMouseOverBitmap = mxCanvas->getDevice()->createCompatibleAlphaBitmap(maButtonSize); + xCanvas.set(mxMouseOverBitmap, UNO_QUERY); + if (mpMouseOverFont && !mpMouseOverFont->mxFont.is() && mxCanvas.is()) + mpMouseOverFont->PrepareFont(mxCanvas); + if (xCanvas.is()) + RenderButton( + xCanvas, + maButtonSize, + mpMouseOverFont, + PresenterBitmapDescriptor::MouseOver, + pLeftBitmap, + pCenterBitmap, + pRightBitmap); +} + +Reference PresenterButton::GetConfigurationProperties ( + const css::uno::Reference& rxComponentContext, + const OUString& rsConfigurationName) +{ + PresenterConfigurationAccess aConfiguration ( + rxComponentContext, + PresenterConfigurationAccess::msPresenterScreenRootName, + PresenterConfigurationAccess::READ_ONLY); + return Reference( + PresenterConfigurationAccess::Find ( + Reference( + aConfiguration.GetConfigurationNode("PresenterScreenSettings/Buttons"), + UNO_QUERY), + [&rsConfigurationName](OUString const&, uno::Reference const& xProps) -> bool + { + return PresenterConfigurationAccess::IsStringPropertyEqual( + rsConfigurationName, "Name", xProps); + }), + UNO_QUERY); +} + +void PresenterButton::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterButton object has already been disposed", + const_cast(static_cast(this))); + } +} + +} // end of namespace sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterButton.hxx b/sd/source/console/PresenterButton.hxx new file mode 100644 index 0000000000..ec2f617bd6 --- /dev/null +++ b/sd/source/console/PresenterButton.hxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERBUTTON_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERBUTTON_HXX + +#include "PresenterBitmapContainer.hxx" +#include "PresenterTheme.hxx" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +class PresenterController; + +typedef ::cppu::WeakComponentImplHelper < + css::awt::XPaintListener, + css::awt::XMouseListener +> PresenterButtonInterfaceBase; + +/** Button for the presenter screen. It displays a text surrounded by a + frame. +*/ +class PresenterButton + : private ::cppu::BaseMutex, + public PresenterButtonInterfaceBase +{ +public: + static ::rtl::Reference Create ( + const css::uno::Reference& rxComponentContext, + const ::rtl::Reference& rpPresenterController, + const std::shared_ptr& rpTheme, + const css::uno::Reference& rxParentWindow, + const css::uno::Reference& rxParentCanvas, + const OUString& rsConfigurationName); + virtual ~PresenterButton() override; + PresenterButton(const PresenterButton&) = delete; + PresenterButton& operator=(const PresenterButton&) = delete; + + virtual void SAL_CALL disposing() override; + + void SetCenter (const css::geometry::RealPoint2D& rLocation); + void SetCanvas ( + const css::uno::Reference& rxParentCanvas, + const css::uno::Reference& rxParentWindow); + css::geometry::IntegerSize2D const & GetSize(); + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XMouseListener + + virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override; + + // lang::XEventListener + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + +private: + ::rtl::Reference mpPresenterController; + std::shared_ptr mpTheme; + css::uno::Reference mxWindow; + css::uno::Reference mxCanvas; + css::uno::Reference mxPresenterHelper; + const OUString msText; + const PresenterTheme::SharedFontDescriptor mpFont; + const PresenterTheme::SharedFontDescriptor mpMouseOverFont; + const OUString msAction; + css::geometry::RealPoint2D maCenter; + css::geometry::IntegerSize2D maButtonSize; + PresenterBitmapDescriptor::Mode meState; + css::uno::Reference mxNormalBitmap; + css::uno::Reference mxMouseOverBitmap; + + PresenterButton ( + const css::uno::Reference& rxComponentContext, + ::rtl::Reference xPresenterController, + std::shared_ptr xTheme, + const css::uno::Reference& rxParentWindow, + PresenterTheme::SharedFontDescriptor aFont, + PresenterTheme::SharedFontDescriptor aMouseOverFont, + OUString sText, + OUString sAction); + void RenderButton ( + const css::uno::Reference& rxCanvas, + const css::geometry::IntegerSize2D& rSize, + const PresenterTheme::SharedFontDescriptor& rFont, + const PresenterBitmapDescriptor::Mode eMode, + const SharedBitmapDescriptor& rpLeft, + const SharedBitmapDescriptor& rpCenter, + const SharedBitmapDescriptor& rpRight); + css::geometry::IntegerSize2D CalculateButtonSize(); + void Invalidate(); + static css::uno::Reference GetBitmap ( + const SharedBitmapDescriptor& mpIcon, + const PresenterBitmapDescriptor::Mode eMode); + void SetupButtonBitmaps(); + static css::uno::Reference GetConfigurationProperties ( + const css::uno::Reference& rxComponentContext, + const OUString& rsConfigurationName); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterCanvasHelper.cxx b/sd/source/console/PresenterCanvasHelper.cxx new file mode 100644 index 0000000000..4ff103958e --- /dev/null +++ b/sd/source/console/PresenterCanvasHelper.cxx @@ -0,0 +1,289 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterCanvasHelper.hxx" + +#include "PresenterGeometryHelper.hxx" +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +PresenterCanvasHelper::PresenterCanvasHelper() + : maDefaultViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr), + maDefaultRenderState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE) +{ +} + +PresenterCanvasHelper::~PresenterCanvasHelper() +{ +} + +void PresenterCanvasHelper::Paint ( + const SharedBitmapDescriptor& rpBitmap, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::awt::Rectangle& rOuterBoundingBox, + const css::awt::Rectangle& rContentBoundingBox) const +{ + PaintRectangle(rpBitmap,rxCanvas,rRepaintBox,rOuterBoundingBox,rContentBoundingBox, + maDefaultViewState, maDefaultRenderState); +} + +void PresenterCanvasHelper::PaintRectangle ( + const SharedBitmapDescriptor& rpBitmap, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::awt::Rectangle& rOuterBoundingBox, + const css::awt::Rectangle& rContentBoundingBox, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState) +{ + if (!rpBitmap) + return; + + if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is()) + return; + + // Create a clip polypolygon that has the content box as hole. + ::std::vector aRectangles; + aRectangles.reserve(2); + aRectangles.push_back( + PresenterGeometryHelper::Intersection(rRepaintBox, rOuterBoundingBox)); + if (rContentBoundingBox.Width > 0 && rContentBoundingBox.Height > 0) + aRectangles.push_back( + PresenterGeometryHelper::Intersection(rRepaintBox, rContentBoundingBox)); + Reference xPolyPolygon ( + PresenterGeometryHelper::CreatePolygon( + aRectangles, + rxCanvas->getDevice())); + if ( ! xPolyPolygon.is()) + return; + xPolyPolygon->setFillRule(rendering::FillRule_EVEN_ODD); + + if (rpBitmap->GetNormalBitmap().is()) + { + if (rpBitmap->meHorizontalTexturingMode == PresenterBitmapDescriptor::Repeat + || rpBitmap->meVerticalTexturingMode == PresenterBitmapDescriptor::Repeat) + { + PaintTiledBitmap( + rpBitmap->GetNormalBitmap(), + rxCanvas, + rRepaintBox, + xPolyPolygon, + rContentBoundingBox, + rDefaultViewState, + rDefaultRenderState); + } + else + { + PaintBitmap( + rpBitmap->GetNormalBitmap(), + awt::Point(rOuterBoundingBox.X, rOuterBoundingBox.Y), + rxCanvas, + rRepaintBox, + xPolyPolygon, + rDefaultViewState, + rDefaultRenderState); + } + } + else + { + PaintColor( + rpBitmap->maReplacementColor, + rxCanvas, + rRepaintBox, + xPolyPolygon, + rDefaultViewState, + rDefaultRenderState); + } +} + +void PresenterCanvasHelper::PaintTiledBitmap ( + const css::uno::Reference& rxTexture, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::uno::Reference& rxPolygon, + const css::awt::Rectangle& rHole, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState) +{ + if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is()) + return; + + if ( ! rxTexture.is()) + return; + + if ( ! rxPolygon.is()) + return; + + rendering::ViewState aViewState (rDefaultViewState); + aViewState.Clip = rxPolygon; + + // Create a local render state at which the location of the bitmap is + // set. + rendering::RenderState aRenderState (rDefaultRenderState); + + // Tile the bitmap over the repaint box. + const geometry::IntegerSize2D aBitmapSize (rxTexture->getSize()); + if( aBitmapSize.Width < 1 || aBitmapSize.Height < 1) + return; + + const sal_Int32 nLeft = (rRepaintBox.X / aBitmapSize.Width) * aBitmapSize.Width; + const sal_Int32 nTop = (rRepaintBox.Y / aBitmapSize.Height) * aBitmapSize.Height; + const sal_Int32 nRight = ((rRepaintBox.X + rRepaintBox.Width - 1 + aBitmapSize.Width - 1) + / aBitmapSize.Width) * aBitmapSize.Width; + const sal_Int32 nBottom = ((rRepaintBox.Y + rRepaintBox.Height - 1 + aBitmapSize.Height - 1) + / aBitmapSize.Height) * aBitmapSize.Height; + + for (sal_Int32 nY=nTop; nY<=nBottom; nY+=aBitmapSize.Height) + for (sal_Int32 nX=nLeft; nX<=nRight; nX+=aBitmapSize.Width) + { + if (PresenterGeometryHelper::IsInside( + awt::Rectangle(nX,nY,aBitmapSize.Width,aBitmapSize.Height), + rHole)) + { + continue; + } + aRenderState.AffineTransform.m02 = nX; + aRenderState.AffineTransform.m12 = nY; + rxCanvas->drawBitmap( + rxTexture, + aViewState, + aRenderState); + } +} + +void PresenterCanvasHelper::PaintBitmap ( + const css::uno::Reference& rxBitmap, + const awt::Point& rLocation, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::uno::Reference& rxPolygon, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState) +{ + if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is()) + return; + + if ( ! rxBitmap.is()) + return; + + if ( ! rxPolygon.is()) + return; + + // Set the repaint box as clip rectangle at the view state. + rendering::ViewState aViewState (rDefaultViewState); + aViewState.Clip = PresenterGeometryHelper::CreatePolygon(rRepaintBox, rxCanvas->getDevice()); + + // Setup the rendering state so that the bitmap is painted top left in + // the polygon bounding box. + rendering::RenderState aRenderState (rDefaultRenderState); + aRenderState.AffineTransform = geometry::AffineMatrix2D(1,0, rLocation.X, 0,1,rLocation.Y); + aRenderState.Clip = rxPolygon; + + rxCanvas->drawBitmap( + rxBitmap, + aViewState, + aRenderState); +} + +void PresenterCanvasHelper::PaintColor ( + const css::util::Color nColor, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::uno::Reference& rxPolygon, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState) +{ + if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is()) + return; + + if ( ! rxPolygon.is()) + return; + + // Set the repaint box as clip rectangle at the view state. + rendering::ViewState aViewState (rDefaultViewState); + aViewState.Clip = PresenterGeometryHelper::CreatePolygon(rRepaintBox, rxCanvas->getDevice()); + + // Setup the rendering state to use the given color. + rendering::RenderState aRenderState (rDefaultRenderState); + SetDeviceColor(aRenderState, nColor); + + rxCanvas->fillPolyPolygon( + rxPolygon, + aViewState, + aRenderState); +} + +void PresenterCanvasHelper::SetDeviceColor( + rendering::RenderState& rRenderState, + const util::Color aColor) +{ + // Other component counts then 4 (RGBA) are not accepted (anymore). + + OSL_ASSERT(rRenderState.DeviceColor.getLength() == 4); + if (rRenderState.DeviceColor.getLength() == 4) + { + auto pDeviceColor = rRenderState.DeviceColor.getArray(); + pDeviceColor[0] = ((aColor >> 16) & 0x0ff) / 255.0; + pDeviceColor[1] = ((aColor >> 8) & 0x0ff) / 255.0; + pDeviceColor[2] = ((aColor >> 0) & 0x0ff) / 255.0; + pDeviceColor[3] = 1.0 - ((aColor >> 24) & 0x0ff) / 255.0; + } +} + +css::geometry::RealRectangle2D PresenterCanvasHelper::GetTextBoundingBox ( + const css::uno::Reference& rxFont, + const OUString& rsText, + const sal_Int8 nTextDirection) +{ + if (rxFont.is() && !rsText.isEmpty()) + { + rendering::StringContext aContext (rsText, 0, rsText.getLength()); + Reference xLayout ( + rxFont->createTextLayout(aContext, nTextDirection, 0)); + return xLayout->queryTextBounds(); + } + else + { + return geometry::RealRectangle2D(0,0,0,0); + } +} + +css::geometry::RealSize2D PresenterCanvasHelper::GetTextSize ( + const css::uno::Reference& rxFont, + const OUString& rsText) +{ + const geometry::RealRectangle2D aTextBBox (GetTextBoundingBox(rxFont, rsText)); + return css::geometry::RealSize2D(aTextBBox.X2 - aTextBBox.X1, aTextBBox.Y2 - aTextBBox.Y1); +} + +} // end of namespace sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterCanvasHelper.hxx b/sd/source/console/PresenterCanvasHelper.hxx new file mode 100644 index 0000000000..8902a9712b --- /dev/null +++ b/sd/source/console/PresenterCanvasHelper.hxx @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCANVASHELPER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCANVASHELPER_HXX + +#include "PresenterBitmapContainer.hxx" +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +/** Collection of functions to ease the life of a canvas user. +*/ +class PresenterCanvasHelper +{ +public: + PresenterCanvasHelper(); + ~PresenterCanvasHelper(); + PresenterCanvasHelper(const PresenterCanvasHelper&) = delete; + PresenterCanvasHelper& operator=(const PresenterCanvasHelper&) = delete; + + void Paint ( + const SharedBitmapDescriptor& rpBitmap, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::awt::Rectangle& rBackgroundBoundingBox, + const css::awt::Rectangle& rContentBoundingBox) const; + + static void PaintRectangle ( + const SharedBitmapDescriptor& rpBitmap, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::awt::Rectangle& rBackgroundBoundingBox, + const css::awt::Rectangle& rContentBoundingBox, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState); + + static void SetDeviceColor( + css::rendering::RenderState& rRenderState, + const css::util::Color aColor); + + static css::geometry::RealRectangle2D GetTextBoundingBox ( + const css::uno::Reference& rxFont, + const OUString& rsText, + const sal_Int8 = css::rendering::TextDirection::WEAK_LEFT_TO_RIGHT); + + static css::geometry::RealSize2D GetTextSize ( + const css::uno::Reference& rxFont, + const OUString& rsText ); + +private: + const css::rendering::ViewState maDefaultViewState; + const css::rendering::RenderState maDefaultRenderState; + + static void PaintTiledBitmap ( + const css::uno::Reference& rxTexture, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::uno::Reference& rxPolygon, + const css::awt::Rectangle& rHole, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState); + + static void PaintBitmap ( + const css::uno::Reference& rxBitmap, + const css::awt::Point& rLocation, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::uno::Reference& rxPolygon, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState); + + static void PaintColor ( + const css::util::Color nColor, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRepaintBox, + const css::uno::Reference& rxPolygon, + const css::rendering::ViewState& rDefaultViewState, + const css::rendering::RenderState& rDefaultRenderState); +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterConfigurationAccess.cxx b/sd/source/console/PresenterConfigurationAccess.cxx new file mode 100644 index 0000000000..4e8494c111 --- /dev/null +++ b/sd/source/console/PresenterConfigurationAccess.cxx @@ -0,0 +1,274 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterConfigurationAccess.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +PresenterConfigurationAccess::PresenterConfigurationAccess ( + const Reference& rxContext, + const OUString& rsRootName, + WriteMode eMode) +{ + try + { + if (rxContext.is()) + { + uno::Sequence aCreationArguments(comphelper::InitAnyPropertySequence( + { + {"nodepath", uno::Any(rsRootName)}, + {"depth", uno::Any(sal_Int32(-1))} + })); + + OUString sAccessService; + if (eMode == READ_ONLY) + sAccessService = "com.sun.star.configuration.ConfigurationAccess"; + else + sAccessService = "com.sun.star.configuration.ConfigurationUpdateAccess"; + + Reference xProvider = + configuration::theDefaultProvider::get( rxContext ); + mxRoot = xProvider->createInstanceWithArguments( + sAccessService, aCreationArguments); + maNode <<= mxRoot; + } + } + catch (const Exception&) + { + DBG_UNHANDLED_EXCEPTION("sdext.presenter", "caught exception while opening configuration"); + } +} + +PresenterConfigurationAccess::~PresenterConfigurationAccess() +{ +} + +bool PresenterConfigurationAccess::IsValid() const +{ + return mxRoot.is(); +} + +Any PresenterConfigurationAccess::GetConfigurationNode (const OUString& sPathToNode) +{ + return GetConfigurationNode( + Reference(mxRoot, UNO_QUERY), + sPathToNode); +} + +bool PresenterConfigurationAccess::GoToChild (const OUString& rsPathToNode) +{ + if ( ! IsValid()) + return false; + + Reference xNode (maNode, UNO_QUERY); + if (xNode.is()) + { + maNode = GetConfigurationNode( + Reference(maNode, UNO_QUERY), + rsPathToNode); + if (Reference(maNode, UNO_QUERY).is()) + return true; + } + + mxRoot = nullptr; + return false; +} + +bool PresenterConfigurationAccess::GoToChild (const Predicate& rPredicate) +{ + if ( ! IsValid()) + return false; + + maNode = Find(Reference(maNode,UNO_QUERY), rPredicate); + if (Reference(maNode, UNO_QUERY).is()) + return true; + + mxRoot = nullptr; + return false; +} + +bool PresenterConfigurationAccess::SetProperty ( + const OUString& rsPropertyName, + const Any& rValue) +{ + Reference xProperties (maNode, UNO_QUERY); + if (xProperties.is()) + { + xProperties->setPropertyValue(rsPropertyName, rValue); + return true; + } + else + return false; +} + +Any PresenterConfigurationAccess::GetConfigurationNode ( + const css::uno::Reference& rxNode, + const OUString& sPathToNode) +{ + if (sPathToNode.isEmpty()) + return Any(rxNode); + + try + { + if (rxNode.is()) + { + return rxNode->getByHierarchicalName(sPathToNode); + } + } + catch (const Exception&) + { + TOOLS_WARN_EXCEPTION("sdext.presenter", "caught exception while getting configuration node " << sPathToNode); + } + + return Any(); +} + +Reference PresenterConfigurationAccess::GetNodeProperties ( + const css::uno::Reference& rxNode, + const OUString& rsPathToNode) +{ + return Reference(GetConfigurationNode(rxNode, rsPathToNode), UNO_QUERY); +} + +void PresenterConfigurationAccess::CommitChanges() +{ + Reference xConfiguration (mxRoot, UNO_QUERY); + if (xConfiguration.is()) + xConfiguration->commitChanges(); +} + +void PresenterConfigurationAccess::ForAll ( + const Reference& rxContainer, + const ::std::vector& rArguments, + const ItemProcessor& rProcessor) +{ + if (!rxContainer.is()) + return; + + ::std::vector aValues(rArguments.size()); + const Sequence aKeys (rxContainer->getElementNames()); + for (const OUString& rsKey : aKeys) + { + bool bHasAllValues (true); + Reference xSetItem (rxContainer->getByName(rsKey), UNO_QUERY); + Reference xSet (xSetItem, UNO_QUERY); + OSL_ASSERT(xSet.is()); + if (xSetItem.is()) + { + // Get from the current item of the container the children + // that match the names in the rArguments list. + for (size_t nValueIndex=0; nValueIndexhasByName(rArguments[nValueIndex])) + bHasAllValues = false; + else + aValues[nValueIndex] = xSetItem->getByName(rArguments[nValueIndex]); + } + } + else + bHasAllValues = false; + if (bHasAllValues) + rProcessor(aValues); + } +} + +void PresenterConfigurationAccess::ForAll ( + const Reference& rxContainer, + const PropertySetProcessor& rProcessor) +{ + if (rxContainer.is()) + { + const Sequence aKeys (rxContainer->getElementNames()); + for (const OUString& rsKey : aKeys) + { + Reference xSet (rxContainer->getByName(rsKey), UNO_QUERY); + if (xSet.is()) + rProcessor(rsKey, xSet); + } + } +} + +Any PresenterConfigurationAccess::Find ( + const Reference& rxContainer, + const Predicate& rPredicate) +{ + if (rxContainer.is()) + { + const Sequence aKeys (rxContainer->getElementNames()); + for (const auto& rKey : aKeys) + { + Reference xProperties ( + rxContainer->getByName(rKey), + UNO_QUERY); + if (xProperties.is()) + if (rPredicate(rKey, xProperties)) + return Any(xProperties); + } + } + return Any(); +} + +bool PresenterConfigurationAccess::IsStringPropertyEqual ( + std::u16string_view rsValue, + const OUString& rsPropertyName, + const css::uno::Reference& rxNode) +{ + OUString sValue; + if (GetProperty(rxNode, rsPropertyName) >>= sValue) + return sValue == rsValue; + else + return false; +} + +Any PresenterConfigurationAccess::GetProperty ( + const Reference& rxProperties, + const OUString& rsKey) +{ + OSL_ASSERT(rxProperties.is()); + if ( ! rxProperties.is()) + return Any(); + try + { + Reference xInfo (rxProperties->getPropertySetInfo()); + if (xInfo.is()) + if ( ! xInfo->hasPropertyByName(rsKey)) + return Any(); + return rxProperties->getPropertyValue(rsKey); + } + catch (beans::UnknownPropertyException&) + { + } + return Any(); +} + +} // end of namespace sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterConfigurationAccess.hxx b/sd/source/console/PresenterConfigurationAccess.hxx new file mode 100644 index 0000000000..68e03f8fe5 --- /dev/null +++ b/sd/source/console/PresenterConfigurationAccess.hxx @@ -0,0 +1,178 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCONFIGURATIONACCESS_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCONFIGURATIONACCESS_HXX + +#include +#include +#include +#include +#include + +#include +#include + +namespace sdext::presenter { + +/** This class gives access to the configuration. Create an object of this + class for one node of the configuration. This will be the root node. + From this one you can use this class in two ways. + +

    In a stateless mode (with exception of the root node) you can use static + methods for obtaining child nodes, get values from properties at leaf + nodes and iterate over children of inner nodes.

    + +

    In a stateful mode use non-static methods like GoToChild() to + navigate to children.

    + +

    Note to call CommitChanges() after making changes to + PresenterConfigurationAccess object that was opened in READ_WRITE mode.

    +*/ +class PresenterConfigurationAccess +{ +public: + enum WriteMode { READ_WRITE, READ_ONLY }; + typedef ::std::function&)> Predicate; + static constexpr OUString msPresenterScreenRootName = + u"/org.openoffice.Office.PresenterScreen/"_ustr; + + /** Create a new object to access the configuration entries below the + given root. + @param rsRootName + Name of the root. You can use msPresenterScreenRootName to + access the configuration of the presenter screen. + @param eMode + This flag specifies whether to give read-write or read-only + access. + */ + PresenterConfigurationAccess( + const css::uno::Reference& rxContext, + const OUString& rsRootName, + WriteMode eMode); + + ~PresenterConfigurationAccess(); + + /** Return a configuration node below the root of the called object. + @param rsPathToNode + The relative path from the root (as given the constructor) to the node. + */ + css::uno::Any GetConfigurationNode ( + const OUString& rsPathToNode); + + /** Return when opening the configuration (via creating a new + PresenterConfigurationAccess object) or previous calls to + GoToChild() left the called PresenterConfigurationAccess object in a + valid state. + */ + bool IsValid() const; + + /** Move the focused node to the (possibly indirect) child specified by the given path. + */ + bool GoToChild (const OUString& rsPathToNode); + + /** Move the focused node to the first direct child that fulfills the given predicate. + */ + bool GoToChild (const Predicate& rPredicate); + + /** Modify the property child of the currently focused node. Keep in + mind to call CommitChanges() to write the change back to the + configuration. + */ + bool SetProperty (const OUString& rsPropertyName, const css::uno::Any& rValue); + + /** Return a configuration node below the given node. + @param rxNode + The node that acts as root to the given relative path. + @param rsPathToNode + The relative path from the given node to the requested node. + When this string is empty then rxNode is returned. + @return + The type of the returned node varies with the requested node. + It is empty when the node was not found. + */ + static css::uno::Any GetConfigurationNode ( + const css::uno::Reference& rxNode, + const OUString& rsPathToNode); + + static css::uno::Reference GetNodeProperties ( + const css::uno::Reference& rxNode, + const OUString& rsPathToNode); + + /** Write any changes that have been made back to the configuration. + This call is ignored when the called ConfigurationAccess object was + not create with read-write mode. + */ + void CommitChanges(); + + typedef ::std::function&) > ItemProcessor; + typedef ::std::function&) > PropertySetProcessor; + + /** Execute a functor for all elements of the given container. + @param rxContainer + The container is a XNameAccess to a list of the configuration. + This can be a node returned by GetConfigurationNode(). + @param rArguments + The functor is called with arguments that are children of each + element of the container. The set of children is specified this + list. + @param rFunctor + The functor to be executed for some or all of the elements in + the given container. + */ + static void ForAll ( + const css::uno::Reference& rxContainer, + const ::std::vector& rArguments, + const ItemProcessor& rProcessor); + static void ForAll ( + const css::uno::Reference& rxContainer, + const PropertySetProcessor& rProcessor); + + static css::uno::Any Find ( + const css::uno::Reference& rxContainer, + const Predicate& rPredicate); + + static bool IsStringPropertyEqual ( + std::u16string_view rsValue, + const OUString& rsPropertyName, + const css::uno::Reference& rxNode); + + /** This method wraps a call to getPropertyValue() and returns an empty + Any instead of throwing an exception when the property does not + exist. + */ + static css::uno::Any GetProperty ( + const css::uno::Reference& rxProperties, + const OUString& rsKey); + +private: + css::uno::Reference mxRoot; + css::uno::Any maNode; +}; + +} // end of namespace sdext::tools + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterController.cxx b/sd/source/console/PresenterController.cxx new file mode 100644 index 0000000000..7bb137d8c0 --- /dev/null +++ b/sd/source/console/PresenterController.cxx @@ -0,0 +1,1183 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include "PresenterController.hxx" + +#include "PresenterAccessibility.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterCurrentSlideObserver.hxx" +#include "PresenterScreen.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterPaneBase.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterPaneBorderPainter.hxx" +#include "PresenterTheme.hxx" +#include "PresenterViewFactory.hxx" +#include "PresenterWindowManager.hxx" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::drawing::framework; + +namespace { + const sal_Int32 ResourceActivationEventType = 0; + const sal_Int32 ResourceDeactivationEventType = 1; + const sal_Int32 ConfigurationUpdateEndEventType = 2; +} + +namespace sdext::presenter { + +IPresentationTime::~IPresentationTime() +{ +} + +PresenterController::InstanceContainer PresenterController::maInstances; + +::rtl::Reference PresenterController::Instance ( + const css::uno::Reference& rxFrame) +{ + InstanceContainer::const_iterator iInstance (maInstances.find(rxFrame)); + if (iInstance != maInstances.end()) + return iInstance->second; + else + return ::rtl::Reference(); +} + +PresenterController::PresenterController ( + unotools::WeakReference xScreen, + const Reference& rxContext, + const rtl::Reference<::sd::DrawController>& rxController, + const Reference& rxSlideShowController, + rtl::Reference xPaneContainer, + const Reference& rxMainPaneId) + : PresenterControllerInterfaceBase(m_aMutex), + mxScreen(std::move(xScreen)), + mxComponentContext(rxContext), + mxController(rxController), + mxSlideShowController(rxSlideShowController), + mxMainPaneId(rxMainPaneId), + mpPaneContainer(std::move(xPaneContainer)), + mnCurrentSlideIndex(-1), + mpWindowManager(new PresenterWindowManager(rxContext,mpPaneContainer,this)), + mpCanvasHelper(std::make_shared()), + mnPendingSlideNumber(-1), + mbIsAccessibilityActive(false) +{ + OSL_ASSERT(mxController.is()); + + if ( ! mxSlideShowController.is()) + throw lang::IllegalArgumentException( + "missing slide show controller", + static_cast(this), + 2); + + new PresenterCurrentSlideObserver(this,rxSlideShowController); + + // Listen for configuration changes. + mxConfigurationController = mxController->getConfigurationController(); + if (mxConfigurationController.is()) + { + mxConfigurationController->addConfigurationChangeListener( + this, + "ResourceActivation", + Any(ResourceActivationEventType)); + mxConfigurationController->addConfigurationChangeListener( + this, + "ResourceDeactivation", + Any(ResourceDeactivationEventType)); + mxConfigurationController->addConfigurationChangeListener( + this, + "ConfigurationUpdateEnd", + Any(ConfigurationUpdateEndEventType)); + } + + // Listen for the frame being activated. + Reference xFrame (mxController->getFrame()); + if (xFrame.is()) + xFrame->addFrameActionListener(this); + + // Create the border painter. + mpPaneBorderPainter = new PresenterPaneBorderPainter(rxContext); + mpWindowManager->SetPaneBorderPainter(mpPaneBorderPainter); + + // Create an object that is able to load the bitmaps in a format that is + // supported by the canvas. + Reference xFactory = + rxContext->getServiceManager(); + if ( ! xFactory.is()) + return; + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.drawing.PresenterHelper", + rxContext), + UNO_QUERY_THROW); + + if (mxSlideShowController.is()) + { + mxSlideShowController->activate(); + Reference xProperties (mxSlideShowController, UNO_QUERY); + if (xProperties.is()) + { + Reference xWindow ( + xProperties->getPropertyValue("ParentWindow"), UNO_QUERY); + if (xWindow.is()) + xWindow->addKeyListener(this); + } + } + + UpdateCurrentSlide(0); + + maInstances[mxController->getFrame()] = this; + + // Create a URLTransformer. + if (xFactory.is()) + { + mxUrlTransformer.set(util::URLTransformer::create(mxComponentContext)); + } +} + +PresenterController::~PresenterController() +{ +} + +void PresenterController::disposing() +{ + maInstances.erase(mxController->getFrame()); + + if (mxMainWindow.is()) + { + mxMainWindow->removeKeyListener(this); + mxMainWindow->removeMouseListener(this); + mxMainWindow = nullptr; + } + if (mxConfigurationController.is()) + mxConfigurationController->removeConfigurationChangeListener(this); + + if (mxController.is()) + { + Reference xFrame (mxController->getFrame()); + if (xFrame.is()) + xFrame->removeFrameActionListener(this); + mxController = nullptr; + } + + Reference xWindowManagerComponent = mpWindowManager; + mpWindowManager = nullptr; + if (xWindowManagerComponent.is()) + xWindowManagerComponent->dispose(); + + mxComponentContext = nullptr; + mxConfigurationController = nullptr; + mxSlideShowController = nullptr; + mxMainPaneId = nullptr; + mpPaneContainer = nullptr; + mnCurrentSlideIndex = -1; + mxCurrentSlide = nullptr; + mxNextSlide = nullptr; + mpTheme.reset(); + { + Reference xComponent = mpPaneBorderPainter; + mpPaneBorderPainter = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + mpCanvasHelper.reset(); + { + Reference xComponent (mxPresenterHelper, UNO_QUERY); + mxPresenterHelper = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + mpPaintManager.reset(); + mnPendingSlideNumber = -1; + { + Reference xComponent (mxUrlTransformer, UNO_QUERY); + mxUrlTransformer = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } +} + +void PresenterController::UpdateCurrentSlide (const sal_Int32 nOffset) +{ + // std::cerr << "Updating current Slide to " << nOffset << std::endl; + GetSlides(nOffset); + UpdatePaneTitles(); + UpdateViews(); + + // Update the accessibility object. + if (IsAccessibilityActive()) + { + mpAccessibleObject->NotifyCurrentSlideChange(); + } +} + +void PresenterController::GetSlides (const sal_Int32 nOffset) +{ + if ( ! mxSlideShowController.is()) + return; + + // Get the current slide from the slide show controller. + mxCurrentSlide = nullptr; + Reference xIndexAccess(mxSlideShowController, UNO_QUERY); + try + { + sal_Int32 nSlideIndex = mxSlideShowController->getCurrentSlideIndex() + nOffset; + if (mxSlideShowController->isPaused()) + nSlideIndex = -1; + + if (xIndexAccess.is() && nSlideIndex>=0) + { + if (nSlideIndex < xIndexAccess->getCount()) + { + mnCurrentSlideIndex = nSlideIndex; + mxCurrentSlide.set( xIndexAccess->getByIndex(nSlideIndex), UNO_QUERY); + } + } + } + catch (RuntimeException&) + { + } + + // Get the next slide. + mxNextSlide = nullptr; + try + { + const sal_Int32 nNextSlideIndex (mxSlideShowController->getNextSlideIndex()+nOffset); + if (nNextSlideIndex >= 0) + { + if (xIndexAccess.is()) + { + if (nNextSlideIndex < xIndexAccess->getCount()) + mxNextSlide.set( xIndexAccess->getByIndex(nNextSlideIndex), UNO_QUERY); + } + } + } + catch (RuntimeException&) + { + } +} + +void PresenterController::UpdatePaneTitles() +{ + if ( ! mxSlideShowController.is()) + return; + + // Get placeholders and their values. + static constexpr OUStringLiteral sCurrentSlideNumberPlaceholder (u"CURRENT_SLIDE_NUMBER"); + static constexpr OUStringLiteral sCurrentSlideNamePlaceholder (u"CURRENT_SLIDE_NAME"); + static constexpr OUStringLiteral sSlideCountPlaceholder (u"SLIDE_COUNT"); + + // Get string for slide count. + OUString sSlideCount ("---"); + Reference xIndexAccess(mxSlideShowController, UNO_QUERY); + if (xIndexAccess.is()) + sSlideCount = OUString::number(xIndexAccess->getCount()); + + // Get string for current slide index. + OUString sCurrentSlideNumber (OUString::number(mnCurrentSlideIndex + 1)); + + // Get name of the current slide. + OUString sCurrentSlideName; + Reference xNamedSlide (mxCurrentSlide, UNO_QUERY); + if (xNamedSlide.is()) + sCurrentSlideName = xNamedSlide->getName(); + Reference xSlideProperties (mxCurrentSlide, UNO_QUERY); + if (xSlideProperties.is()) + { + try + { + OUString sName; + if (xSlideProperties->getPropertyValue("LinkDisplayName") >>= sName) + { + // Find out whether the name of the current slide has been + // automatically created or has been set by the user. + if (sName != sCurrentSlideName) + sCurrentSlideName = sName; + } + } + catch (const beans::UnknownPropertyException&) + { + } + } + + // Replace the placeholders with their current values. + for (auto& rxPane : mpPaneContainer->maPanes) + { + OSL_ASSERT(rxPane != nullptr); + + OUString sTemplate (IsAccessibilityActive() + ? rxPane->msAccessibleTitleTemplate + : rxPane->msTitleTemplate); + if (sTemplate.isEmpty()) + continue; + + OUStringBuffer sResult; + sResult.ensureCapacity(sTemplate.getLength()); + + sal_Int32 nIndex (0); + while (true) + { + sal_Int32 nStartIndex = sTemplate.indexOf('%', nIndex); + if (nStartIndex < 0) + { + // Add the remaining part of the string. + sResult.append(sTemplate.subView(nIndex)); + break; + } + else + { + // Add the part preceding the next %. + sResult.append(sTemplate.subView(nIndex, nStartIndex-nIndex)); + + // Get the placeholder + ++nStartIndex; + const sal_Int32 nEndIndex (sTemplate.indexOf('%', nStartIndex+1)); + const std::u16string_view sPlaceholder (sTemplate.subView(nStartIndex, nEndIndex-nStartIndex)); + nIndex = nEndIndex+1; + + // Replace the placeholder with its current value. + if (sPlaceholder == sCurrentSlideNumberPlaceholder) + sResult.append(sCurrentSlideNumber); + else if (sPlaceholder == sCurrentSlideNamePlaceholder) + sResult.append(sCurrentSlideName); + else if (sPlaceholder == sSlideCountPlaceholder) + sResult.append(sSlideCount); + } + } + + rxPane->msTitle = sResult.makeStringAndClear(); + if (rxPane->mxPane.is()) + rxPane->mxPane->SetTitle(rxPane->msTitle); + } +} + +void PresenterController::UpdateViews() +{ + // Tell all views about the slides they should display. + for (const auto& rxPane : mpPaneContainer->maPanes) + { + Reference xDrawView (rxPane->mxView, UNO_QUERY); + if (xDrawView.is()) + xDrawView->setCurrentPage(mxCurrentSlide); + } +} + +SharedBitmapDescriptor + PresenterController::GetViewBackground (const OUString& rsViewURL) const +{ + if (mpTheme != nullptr) + { + const OUString sStyleName (mpTheme->GetStyleName(rsViewURL)); + return mpTheme->GetBitmap(sStyleName, "Background"); + } + return SharedBitmapDescriptor(); +} + +PresenterTheme::SharedFontDescriptor + PresenterController::GetViewFont (const OUString& rsViewURL) const +{ + if (mpTheme != nullptr) + { + const OUString sStyleName (mpTheme->GetStyleName(rsViewURL)); + return mpTheme->GetFont(sStyleName); + } + return PresenterTheme::SharedFontDescriptor(); +} + +const std::shared_ptr& PresenterController::GetTheme() const +{ + return mpTheme; +} + +const ::rtl::Reference& PresenterController::GetWindowManager() const +{ + return mpWindowManager; +} + +const Reference& + PresenterController::GetSlideShowController() const +{ + return mxSlideShowController; +} + +const rtl::Reference& PresenterController::GetPaneContainer() const +{ + return mpPaneContainer; +} + +const ::rtl::Reference& PresenterController::GetPaneBorderPainter() const +{ + return mpPaneBorderPainter; +} + +const std::shared_ptr& PresenterController::GetCanvasHelper() const +{ + return mpCanvasHelper; +} + +const Reference& PresenterController::GetPresenterHelper() const +{ + return mxPresenterHelper; +} + +const std::shared_ptr& PresenterController::GetPaintManager() const +{ + return mpPaintManager; +} + +void PresenterController::ShowView (const OUString& rsViewURL) +{ + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + mpPaneContainer->FindViewURL(rsViewURL)); + if (!pDescriptor) + return; + + pDescriptor->mbIsActive = true; + mxConfigurationController->requestResourceActivation( + pDescriptor->mxPaneId, + ResourceActivationMode_ADD); + mxConfigurationController->requestResourceActivation( + ResourceId::createWithAnchor( + mxComponentContext, + rsViewURL, + pDescriptor->mxPaneId), + ResourceActivationMode_REPLACE); +} + +void PresenterController::HideView (const OUString& rsViewURL) +{ + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + mpPaneContainer->FindViewURL(rsViewURL)); + if (pDescriptor) + { + mxConfigurationController->requestResourceDeactivation( + ResourceId::createWithAnchor( + mxComponentContext, + rsViewURL, + pDescriptor->mxPaneId)); + } +} + +void PresenterController::DispatchUnoCommand (const OUString& rsCommand) const +{ + if ( ! mxUrlTransformer.is()) + return; + + util::URL aURL; + aURL.Complete = rsCommand; + mxUrlTransformer->parseStrict(aURL); + + Reference xDispatch (GetDispatch(aURL)); + if ( ! xDispatch.is()) + return; + + xDispatch->dispatch(aURL, Sequence()); +} + +Reference PresenterController::GetDispatch (const util::URL& rURL) const +{ + if ( ! mxController.is()) + return nullptr; + + Reference xDispatchProvider (mxController->getFrame(), UNO_QUERY); + if ( ! xDispatchProvider.is()) + return nullptr; + + return xDispatchProvider->queryDispatch( + rURL, + OUString(), + frame::FrameSearchFlag::SELF); +} + +util::URL PresenterController::CreateURLFromString (const OUString& rsURL) const +{ + util::URL aURL; + + if (mxUrlTransformer.is()) + { + aURL.Complete = rsURL; + mxUrlTransformer->parseStrict(aURL); + } + + return aURL; +} + +const Reference& + PresenterController::GetConfigurationController() const +{ + return mxConfigurationController; +} + +const Reference& PresenterController::GetCurrentSlide() const +{ + return mxCurrentSlide; +} + +bool PresenterController::HasTransition (Reference const & rxPage) +{ + bool bTransition = false; + if( rxPage.is() ) + { + Reference xSlidePropertySet (rxPage, UNO_QUERY); + try + { + sal_uInt16 aTransitionType = 0; + xSlidePropertySet->getPropertyValue("TransitionType") >>= aTransitionType; + if (aTransitionType > 0) + { + bTransition = true; + } + } + catch (const beans::UnknownPropertyException&) + { + } + } + return bTransition; +} + +bool PresenterController::HasCustomAnimation (Reference const & rxPage) +{ + bool bCustomAnimation = false; + if( rxPage.is() ) + { + sal_uInt32 i, nCount = rxPage->getCount(); + for ( i = 0; i < nCount; i++ ) + { + Reference xShape(rxPage->getByIndex(i), UNO_QUERY); + Reference xShapePropertySet(xShape, UNO_QUERY); + presentation::AnimationEffect aEffect = presentation::AnimationEffect_NONE; + presentation::AnimationEffect aTextEffect = presentation::AnimationEffect_NONE; + try + { + xShapePropertySet->getPropertyValue("Effect") >>= aEffect; + xShapePropertySet->getPropertyValue("TextEffect") >>= aTextEffect; + } + catch (const beans::UnknownPropertyException&) + { + } + if( aEffect != presentation::AnimationEffect_NONE || + aTextEffect != presentation::AnimationEffect_NONE ) + { + bCustomAnimation = true; + break; + } + } + } + return bCustomAnimation; +} + +void PresenterController::SetAccessibilityActiveState (const bool bIsActive) +{ + if ( mbIsAccessibilityActive != bIsActive) + { + mbIsAccessibilityActive = bIsActive; + UpdatePaneTitles(); + } +} + + +void PresenterController::HandleMouseClick (const awt::MouseEvent& rEvent) +{ + if (!mxSlideShowController.is()) + return; + + switch (rEvent.Buttons) + { + case awt::MouseButton::LEFT: + if (rEvent.Modifiers == awt::KeyModifier::MOD2) + mxSlideShowController->gotoNextSlide(); + else + mxSlideShowController->gotoNextEffect(); + break; + + case awt::MouseButton::RIGHT: + mxSlideShowController->gotoPreviousSlide(); + break; + + default: + // Other or multiple buttons. + break; + } +} + +void PresenterController::RequestViews ( + const bool bIsSlideSorterActive, + const bool bIsNotesViewActive, + const bool bIsHelpViewActive) +{ + for (const auto& rxPane : mpPaneContainer->maPanes) + { + bool bActivate (true); + const OUString sViewURL (rxPane->msViewURL); + if (sViewURL == PresenterViewFactory::msNotesViewURL) + { + bActivate = bIsNotesViewActive && !bIsSlideSorterActive && !bIsHelpViewActive; + } + else if (sViewURL == PresenterViewFactory::msSlideSorterURL) + { + bActivate = bIsSlideSorterActive; + } + else if (sViewURL == PresenterViewFactory::msCurrentSlidePreviewViewURL + || sViewURL == PresenterViewFactory::msNextSlidePreviewViewURL) + { + bActivate = !bIsSlideSorterActive && ! bIsHelpViewActive; + } + else if (sViewURL == PresenterViewFactory::msToolBarViewURL) + { + bActivate = true; + } + else if (sViewURL == PresenterViewFactory::msHelpViewURL) + { + bActivate = bIsHelpViewActive; + } + + if (bActivate) + ShowView(sViewURL); + else + HideView(sViewURL); + } +} + +void PresenterController::SetPresentationTime(IPresentationTime* pPresentationTime) +{ + mpPresentationTime = pPresentationTime; +} + +IPresentationTime* PresenterController::GetPresentationTime() +{ + return mpPresentationTime; +} + +//----- XConfigurationChangeListener ------------------------------------------ + +void SAL_CALL PresenterController::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterController object has already been disposed", + static_cast(this)); + } + + sal_Int32 nType (0); + if ( ! (rEvent.UserData >>= nType)) + return; + + switch (nType) + { + case ResourceActivationEventType: + if (rEvent.ResourceId->compareTo(mxMainPaneId) == 0) + { + InitializeMainPane(Reference(rEvent.ResourceObject,UNO_QUERY)); + } + else if (rEvent.ResourceId->isBoundTo(mxMainPaneId,AnchorBindingMode_DIRECT)) + { + // A pane bound to the main pane has been created and is + // stored in the pane container. + Reference xPane (rEvent.ResourceObject,UNO_QUERY); + if (xPane.is()) + { + mpPaneContainer->FindPaneId(xPane->getResourceId()); + } + } + else if (rEvent.ResourceId->isBoundTo(mxMainPaneId,AnchorBindingMode_INDIRECT)) + { + // A view bound to one of the panes has been created and is + // stored in the pane container along with its pane. + Reference xView (rEvent.ResourceObject,UNO_QUERY); + if (xView.is()) + { + mpPaneContainer->StoreView(xView); + UpdateViews(); + mpWindowManager->NotifyViewCreation(xView); + } + } + break; + + case ResourceDeactivationEventType: + if (rEvent.ResourceId->isBoundTo(mxMainPaneId,AnchorBindingMode_INDIRECT)) + { + // If this is a view then remove it from the pane container. + Reference xView (rEvent.ResourceObject,UNO_QUERY); + if (xView.is()) + { + PresenterPaneContainer::SharedPaneDescriptor pDescriptor( + mpPaneContainer->RemoveView(xView)); + + // A possibly opaque view has been removed. Update() + // updates the clip polygon. + mpWindowManager->Update(); + // Request the repainting of the area previously + // occupied by the view. + if (pDescriptor) + GetPaintManager()->Invalidate(pDescriptor->mxBorderWindow); + } + } + break; + + case ConfigurationUpdateEndEventType: + if (IsAccessibilityActive()) + { + mpAccessibleObject->UpdateAccessibilityHierarchy(); + UpdateCurrentSlide(0); + } + break; + } +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL PresenterController::disposing ( + const lang::EventObject& rEvent) +{ + if (rEvent.Source.get() == static_cast(mxController.get())) + mxController = nullptr; + else if (rEvent.Source == mxConfigurationController) + mxConfigurationController = nullptr; + else if (rEvent.Source == mxSlideShowController) + mxSlideShowController = nullptr; + else if (rEvent.Source == mxMainWindow) + mxMainWindow = nullptr; +} + +//----- XFrameActionListener -------------------------------------------------- + +void SAL_CALL PresenterController::frameAction ( + const frame::FrameActionEvent& rEvent) +{ + if (rEvent.Action == frame::FrameAction_FRAME_ACTIVATED) + { + if (mxSlideShowController.is()) + mxSlideShowController->activate(); + } +} + +//----- XKeyListener ---------------------------------------------------------- + +void SAL_CALL PresenterController::keyPressed (const awt::KeyEvent& rEvent) +{ + // Tell all views about the unhandled key event. + for (const auto& rxPane : mpPaneContainer->maPanes) + { + if ( ! rxPane->mbIsActive) + continue; + + Reference xKeyListener (rxPane->mxView, UNO_QUERY); + if (xKeyListener.is()) + xKeyListener->keyPressed(rEvent); + } +} + +void SAL_CALL PresenterController::keyReleased (const awt::KeyEvent& rEvent) +{ + if (rEvent.Source != mxMainWindow) + return; + + switch (rEvent.KeyCode) + { + case awt::Key::ESCAPE: + case awt::Key::SUBTRACT: + { + if( mxController.is() ) + { + Reference< XPresentationSupplier > xPS( mxController->getModel(), UNO_QUERY ); + if( xPS.is() ) + { + Reference< XPresentation > xP( xPS->getPresentation() ); + if( xP.is() ) + xP->end(); + } + } + } + break; + + case awt::Key::PAGEDOWN: + if (mxSlideShowController.is()) + { + if (rEvent.Modifiers == awt::KeyModifier::MOD2) + mxSlideShowController->gotoNextSlide(); + else + mxSlideShowController->gotoNextEffect(); + } + break; + + case awt::Key::RIGHT: + case awt::Key::SPACE: + case awt::Key::DOWN: + case awt::Key::XF86FORWARD: + if (mxSlideShowController.is()) + { + mxSlideShowController->gotoNextEffect(); + } + break; + + case awt::Key::PAGEUP: + if (mxSlideShowController.is()) + { + if (rEvent.Modifiers == awt::KeyModifier::MOD2) + mxSlideShowController->gotoPreviousSlide(); + else + mxSlideShowController->gotoPreviousEffect(); + } + break; + + case awt::Key::LEFT: + case awt::Key::UP: + case awt::Key::BACKSPACE: + case awt::Key::XF86BACK: + if (mxSlideShowController.is()) + { + mxSlideShowController->gotoPreviousEffect(); + } + break; + + case awt::Key::P: + if (mxSlideShowController.is()) + { + bool bPenEnabled = mxSlideShowController->getUsePen(); + mxSlideShowController->setUsePen( !bPenEnabled ); + } + break; + + // tdf#149351 Ctrl+A disables pointer as pen mode + case awt::Key::A: + if (mxSlideShowController.is()) + { + if (rEvent.Modifiers == awt::KeyModifier::MOD1) + { + mxSlideShowController->setUsePen( false ); + } + } + break; + + case awt::Key::E: + if (mxSlideShowController.is()) + { + mxSlideShowController->setEraseAllInk( true ); + } + break; + + case awt::Key::HOME: + if (mxSlideShowController.is()) + { + mxSlideShowController->gotoFirstSlide(); + } + break; + + case awt::Key::END: + if (mxSlideShowController.is()) + { + mxSlideShowController->gotoLastSlide(); + } + break; + + case awt::Key::W: + case awt::Key::COMMA: + if (mxSlideShowController.is()) + { + if (mxSlideShowController->isPaused()) + mxSlideShowController->resume(); + else + mxSlideShowController->blankScreen(0x00ffffff); + } + break; + + case awt::Key::B: + case awt::Key::POINT: + if (mxSlideShowController.is()) + { + if (mxSlideShowController->isPaused()) + mxSlideShowController->resume(); + else + mxSlideShowController->blankScreen(0x00000000); + } + break; + + case awt::Key::NUM0: + case awt::Key::NUM1: + case awt::Key::NUM2: + case awt::Key::NUM3: + case awt::Key::NUM4: + case awt::Key::NUM5: + case awt::Key::NUM6: + case awt::Key::NUM7: + case awt::Key::NUM8: + case awt::Key::NUM9: + HandleNumericKeyPress(rEvent.KeyCode-awt::Key::NUM0, rEvent.Modifiers); + break; + + case awt::Key::RETURN: + if (mnPendingSlideNumber > 0) + { + if (mxSlideShowController.is()) + mxSlideShowController->gotoSlideIndex(mnPendingSlideNumber - 1); + mnPendingSlideNumber = -1; + } + else + { + if (mxSlideShowController.is()) + mxSlideShowController->gotoNextEffect(); + } + + break; + + case awt::Key::F1: + // Toggle the help view. + if (mpWindowManager) + { + if (mpWindowManager->GetViewMode() != PresenterWindowManager::VM_Help) + mpWindowManager->SetViewMode(PresenterWindowManager::VM_Help); + else + mpWindowManager->SetHelpViewState(false); + } + + break; + + default: + // Tell all views about the unhandled key event. + for (const auto& rxPane : mpPaneContainer->maPanes) + { + if ( ! rxPane->mbIsActive) + continue; + + Reference xKeyListener (rxPane->mxView, UNO_QUERY); + if (xKeyListener.is()) + xKeyListener->keyReleased(rEvent); + } + break; + } +} + +void PresenterController::HandleNumericKeyPress ( + const sal_Int32 nKey, + const sal_Int32 nModifiers) +{ + switch (nModifiers) + { + case 0: + if (mnPendingSlideNumber == -1) + mnPendingSlideNumber = 0; + UpdatePendingSlideNumber(mnPendingSlideNumber * 10 + nKey); + break; + + case awt::KeyModifier::MOD1: + // Ctrl-1, Ctrl-2, and Ctrl-3 are used to switch between views + // (slide view, notes view, normal). Ctrl-4 switches monitors + mnPendingSlideNumber = -1; + if (!mpWindowManager) + return; + switch(nKey) + { + case 1: + mpWindowManager->SetViewMode(PresenterWindowManager::VM_Standard); + break; + case 2: + mpWindowManager->SetViewMode(PresenterWindowManager::VM_Notes); + break; + case 3: + mpWindowManager->SetViewMode(PresenterWindowManager::VM_SlideOverview); + break; + case 4: + SwitchMonitors(); + break; + default: + // Ignore unsupported key. + break; + } + break; + + default: + // Ignore unsupported modifiers. + break; + } +} + +//----- XMouseListener -------------------------------------------------------- + +void SAL_CALL PresenterController::mousePressed (const css::awt::MouseEvent&) +{ + if (mxMainWindow.is()) + mxMainWindow->setFocus(); +} + +void SAL_CALL PresenterController::mouseReleased (const css::awt::MouseEvent&) {} + +void SAL_CALL PresenterController::mouseEntered (const css::awt::MouseEvent&) {} + +void SAL_CALL PresenterController::mouseExited (const css::awt::MouseEvent&) {} + +void PresenterController::InitializeMainPane (const Reference& rxPane) +{ + if ( ! rxPane.is()) + return; + + mpAccessibleObject = new PresenterAccessible( + mxComponentContext, + this, + rxPane); + + LoadTheme(rxPane); + + // Main pane has been created and is now observed by the window + // manager. + mpWindowManager->SetParentPane(rxPane); + mpWindowManager->SetTheme(mpTheme); + + if (mpPaneBorderPainter) + mpPaneBorderPainter->SetTheme(mpTheme); + + // Add key listener + mxMainWindow = rxPane->getWindow(); + if (mxMainWindow.is()) + { + mxMainWindow->addKeyListener(this); + mxMainWindow->addMouseListener(this); + } + Reference xPane2 (rxPane, UNO_QUERY); + if (xPane2.is()) + xPane2->setVisible(true); + + mpPaintManager = std::make_shared(mxMainWindow, mxPresenterHelper, mpPaneContainer); + + mxCanvas.set(rxPane->getCanvas(), UNO_QUERY); + + if (mxSlideShowController.is()) + mxSlideShowController->activate(); + + UpdateCurrentSlide(0); +} + +void PresenterController::LoadTheme (const Reference& rxPane) +{ + // Create (load) the current theme. + if (rxPane.is()) + mpTheme = std::make_shared(mxComponentContext, rxPane->getCanvas()); +} + +double PresenterController::GetSlideAspectRatio() const +{ + double nSlideAspectRatio (28.0/21.0); + + try + { + if (mxController.is()) + { + Reference xSlideSupplier ( + mxController->getModel(), UNO_QUERY_THROW); + Reference xSlides (xSlideSupplier->getDrawPages()); + if (xSlides.is() && xSlides->getCount()>0) + { + Reference xProperties(xSlides->getByIndex(0),UNO_QUERY_THROW); + sal_Int32 nWidth (28000); + sal_Int32 nHeight (21000); + if ((xProperties->getPropertyValue("Width") >>= nWidth) + && (xProperties->getPropertyValue("Height") >>= nHeight) + && nHeight > 0) + { + nSlideAspectRatio = double(nWidth) / double(nHeight); + } + } + } + } + catch (RuntimeException&) + { + OSL_ASSERT(false); + } + + return nSlideAspectRatio; +} + +void PresenterController::UpdatePendingSlideNumber (const sal_Int32 nPendingSlideNumber) +{ + mnPendingSlideNumber = nPendingSlideNumber; + + if (mpTheme == nullptr) + return; + + if ( ! mxMainWindow.is()) + return; + + PresenterTheme::SharedFontDescriptor pFont ( + mpTheme->GetFont("PendingSlideNumberFont")); + if (!pFont) + return; + + pFont->PrepareFont(mxCanvas); + if ( ! pFont->mxFont.is()) + return; + + const OUString sText (OUString::number(mnPendingSlideNumber)); + rendering::StringContext aContext (sText, 0, sText.getLength()); + pFont->mxFont->createTextLayout( + aContext, + rendering::TextDirection::WEAK_LEFT_TO_RIGHT, + 0); +} + +void PresenterController::SwitchMonitors() +{ + rtl::Reference pScreen( mxScreen ); + if (!pScreen) + return; + + pScreen->SwitchMonitors(); +} + +void PresenterController::ExitPresenter() +{ + if( mxController.is() ) + { + Reference< XPresentationSupplier > xPS( mxController->getModel(), UNO_QUERY ); + if( xPS.is() ) + { + Reference< XPresentation > xP( xPS->getPresentation() ); + if( xP.is() ) + xP->end(); + } + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterController.hxx b/sd/source/console/PresenterController.hxx new file mode 100644 index 0000000000..a4d7993eec --- /dev/null +++ b/sd/source/console/PresenterController.hxx @@ -0,0 +1,226 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCONTROLLER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCONTROLLER_HXX + +#include "PresenterAccessibility.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterTheme.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { class DrawController; } + +namespace sdext::presenter { + +class PresenterCanvasHelper; +class PresenterPaintManager; +class PresenterPaneAnimator; +class PresenterPaneContainer; +class PresenterPaneBorderPainter; +class PresenterScreen; +class PresenterTheme; +class PresenterWindowManager; + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeListener, + css::frame::XFrameActionListener, + css::awt::XKeyListener, + css::awt::XMouseListener +> PresenterControllerInterfaceBase; + +/// Represents an element in the toolbar that shows the time elapsed since the presentation started. +class IPresentationTime +{ +public: + virtual void restart() = 0; + virtual bool isPaused() = 0; + virtual void setPauseStatus(const bool pauseStatus) = 0; + virtual ~IPresentationTime(); +}; + +/** The controller of the presenter screen is responsible for telling the + individual views which slides to show. Additionally it provides access + to frequently used values of the current theme. +*/ +class PresenterController + : protected ::cppu::BaseMutex, + public PresenterControllerInterfaceBase +{ +public: + static ::rtl::Reference Instance ( + const css::uno::Reference& rxFrame); + + PresenterController ( + unotools::WeakReference xScreen, + const css::uno::Reference& rxContext, + const rtl::Reference<::sd::DrawController>& rxController, + const css::uno::Reference& rxSlideShowController, + rtl::Reference xPaneContainer, + const css::uno::Reference& rxMainPaneId); + virtual ~PresenterController() override; + + virtual void SAL_CALL disposing() override; + + void UpdateCurrentSlide (const sal_Int32 nOffset); + + SharedBitmapDescriptor + GetViewBackground (const OUString& rsViewURL) const; + PresenterTheme::SharedFontDescriptor + GetViewFont (const OUString& rsViewURL) const; + const std::shared_ptr& GetTheme() const; + const ::rtl::Reference& GetWindowManager() const; + const css::uno::Reference& + GetSlideShowController() const; + const rtl::Reference& GetPaneContainer() const; + const ::rtl::Reference& GetPaneBorderPainter() const; + const std::shared_ptr& GetCanvasHelper() const; + const css::uno::Reference& GetPresenterHelper() const; + const std::shared_ptr& GetPaintManager() const; + double GetSlideAspectRatio() const; + void ShowView (const OUString& rsViewURL); + void HideView (const OUString& rsViewURL); + void SwitchMonitors(); + void ExitPresenter(); + void DispatchUnoCommand (const OUString& rsCommand) const; + css::uno::Reference GetDispatch ( + const css::util::URL& rURL) const; + css::util::URL CreateURLFromString (const OUString& rsURL) const; + const css::uno::Reference& + GetConfigurationController() const; + const css::uno::Reference& GetCurrentSlide() const; + static bool HasTransition (css::uno::Reference const & rxPage); + static bool HasCustomAnimation (css::uno::Reference const & rxPage); + void SetAccessibilityActiveState (const bool bIsActive); + bool IsAccessibilityActive() const { return mbIsAccessibilityActive;} + + void HandleMouseClick (const css::awt::MouseEvent& rEvent); + void UpdatePaneTitles(); + + /** Request activation or deactivation of (some of) the views according + to the given parameters. + */ + void RequestViews ( + const bool bIsSlideSorterActive, + const bool bIsNotesViewActive, + const bool bIsHelpViewActive); + + void SetPresentationTime(IPresentationTime* pPresentationTime); + IPresentationTime* GetPresentationTime(); + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + + // XFrameActionListener + + virtual void SAL_CALL frameAction ( + const css::frame::FrameActionEvent& rEvent) override; + + // XKeyListener + + virtual void SAL_CALL keyPressed (const css::awt::KeyEvent& rEvent) override; + virtual void SAL_CALL keyReleased (const css::awt::KeyEvent& rEvent) override; + + // XMouseListener + + virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override; + +private: + typedef ::std::map,rtl::Reference > InstanceContainer; + static InstanceContainer maInstances; + + unotools::WeakReference mxScreen; + css::uno::Reference mxComponentContext; + css::uno::Reference mxCanvas; + rtl::Reference<::sd::DrawController> mxController; + css::uno::Reference + mxConfigurationController; + css::uno::Reference mxSlideShowController; + css::uno::Reference mxMainPaneId; + rtl::Reference mpPaneContainer; + sal_Int32 mnCurrentSlideIndex; + css::uno::Reference mxCurrentSlide; + css::uno::Reference mxNextSlide; + ::rtl::Reference mpWindowManager; + std::shared_ptr mpTheme; + css::uno::Reference mxMainWindow; + ::rtl::Reference mpPaneBorderPainter; + std::shared_ptr mpCanvasHelper; + css::uno::Reference mxPresenterHelper; + std::shared_ptr mpPaintManager; + sal_Int32 mnPendingSlideNumber; + css::uno::Reference mxUrlTransformer; + ::rtl::Reference mpAccessibleObject; + bool mbIsAccessibilityActive; + IPresentationTime* mpPresentationTime; + + void GetSlides (const sal_Int32 nOffset); + void UpdateViews(); + void InitializeMainPane (const css::uno::Reference& rxPane); + void LoadTheme (const css::uno::Reference& rxPane); + void UpdatePendingSlideNumber (const sal_Int32 nPendingSlideNumber); + + /** This method is called when the user pressed one of the numerical + keys. Depending on the modifier, numeric keys switch to another + slide (no modifier), or change to another view (Ctrl modifier). + @param nKey + Numeric value that is printed on the pressed key. For example + pressing the key '4' will result in the value 4, not the ASCII + code (0x34?). + @param nModifiers + The modifier bit field as provided by the key up event. + */ + void HandleNumericKeyPress (const sal_Int32 nKey, const sal_Int32 nModifiers); +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterCurrentSlideObserver.cxx b/sd/source/console/PresenterCurrentSlideObserver.cxx new file mode 100644 index 0000000000..27e5dc7e45 --- /dev/null +++ b/sd/source/console/PresenterCurrentSlideObserver.cxx @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include "PresenterCurrentSlideObserver.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +//===== PresenterCurrentSlideObserver ========================================= + +PresenterCurrentSlideObserver::PresenterCurrentSlideObserver ( + ::rtl::Reference xPresenterController, + const Reference& rxSlideShowController) + : PresenterCurrentSlideObserverInterfaceBase(m_aMutex), + mpPresenterController(std::move(xPresenterController)), + mxSlideShowController(rxSlideShowController) +{ + if( mpPresenterController.is() ) + { + mpPresenterController->addEventListener(this); + } + + if( mxSlideShowController.is() ) + { + // Listen for events from the slide show controller. + mxSlideShowController->addSlideShowListener(static_cast(this)); + } +} + +PresenterCurrentSlideObserver::~PresenterCurrentSlideObserver() +{ +} + +void SAL_CALL PresenterCurrentSlideObserver::disposing() +{ + // Disconnect form the slide show controller. + if(mxSlideShowController.is()) + { + mxSlideShowController->removeSlideShowListener(static_cast(this)); + mxSlideShowController = nullptr; + } + + if (mpPresenterController.is()) + mpPresenterController->removeEventListener(this); +} + +//----- XSlideShowListener ---------------------------------------------------- + +void SAL_CALL PresenterCurrentSlideObserver::beginEvent ( + const Reference&) +{} + +void SAL_CALL PresenterCurrentSlideObserver::endEvent ( + const Reference&) +{} + +void SAL_CALL PresenterCurrentSlideObserver::repeat ( + const css::uno::Reference&, + sal_Int32) +{} + +void SAL_CALL PresenterCurrentSlideObserver::paused() +{ +} + +void SAL_CALL PresenterCurrentSlideObserver::resumed() +{ +} + +void SAL_CALL PresenterCurrentSlideObserver::slideEnded (sal_Bool bReverse) +{ + // Determine whether the new current slide (the one after the one that + // just ended) is the slide past the last slide in the presentation, + // i.e. the one that says something like "click to end presentation...". + if (mxSlideShowController.is() && !bReverse) + if (mxSlideShowController->getNextSlideIndex() < 0) + if( mpPresenterController.is() ) + mpPresenterController->UpdateCurrentSlide(+1); +} + +void SAL_CALL PresenterCurrentSlideObserver::hyperLinkClicked (const OUString &) +{ +} + +void SAL_CALL PresenterCurrentSlideObserver::slideTransitionStarted() +{ + if( mpPresenterController.is() ) + mpPresenterController->UpdateCurrentSlide(0); +} + +void SAL_CALL PresenterCurrentSlideObserver::slideTransitionEnded() +{ +} + +void SAL_CALL PresenterCurrentSlideObserver::slideAnimationsEnded() +{ +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL PresenterCurrentSlideObserver::disposing ( + const lang::EventObject& rEvent) +{ + if (rEvent.Source == Reference(static_cast(mpPresenterController.get()))) + dispose(); + else if (rEvent.Source == mxSlideShowController) + mxSlideShowController = nullptr; +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterCurrentSlideObserver.hxx b/sd/source/console/PresenterCurrentSlideObserver.hxx new file mode 100644 index 0000000000..6e005e4c87 --- /dev/null +++ b/sd/source/console/PresenterCurrentSlideObserver.hxx @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCURRENTSLIDEOBSERVER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCURRENTSLIDEOBSERVER_HXX + +#include "PresenterController.hxx" +#include +#include +#include +#include + +namespace sdext::presenter { + +typedef ::cppu::WeakComponentImplHelper < + css::presentation::XSlideShowListener +> PresenterCurrentSlideObserverInterfaceBase; + +/** Check periodically the slide show controller and the + frame::XController whether the current slide has changed. If so, + then inform the presenter controller about it. + + Objects of this class have their own lifetime control and destroy + themselves when the presenter controller is disposed. +*/ +class PresenterCurrentSlideObserver + : protected ::cppu::BaseMutex, + public PresenterCurrentSlideObserverInterfaceBase +{ +public: + PresenterCurrentSlideObserver ( + ::rtl::Reference xPresenterController, + const css::uno::Reference& rxSlideShowController); + virtual ~PresenterCurrentSlideObserver() override; + + virtual void SAL_CALL disposing() override; + + // XSlideShowListener + virtual void SAL_CALL paused( ) override; + virtual void SAL_CALL resumed( ) override; + virtual void SAL_CALL slideTransitionStarted( ) override; + virtual void SAL_CALL slideTransitionEnded( ) override; + virtual void SAL_CALL slideAnimationsEnded( ) override; + virtual void SAL_CALL slideEnded(sal_Bool bReverse) override; + virtual void SAL_CALL hyperLinkClicked( const OUString& hyperLink ) override; + + // XAnimationListener + virtual void SAL_CALL beginEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override; + virtual void SAL_CALL endEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override; + virtual void SAL_CALL repeat( const css::uno::Reference< css::animations::XAnimationNode >& Node, ::sal_Int32 Repeat ) override; + + // XEventListener + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + +private: + ::rtl::Reference mpPresenterController; + css::uno::Reference mxSlideShowController; +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterFrameworkObserver.cxx b/sd/source/console/PresenterFrameworkObserver.cxx new file mode 100644 index 0000000000..3ca06a9137 --- /dev/null +++ b/sd/source/console/PresenterFrameworkObserver.cxx @@ -0,0 +1,110 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterFrameworkObserver.hxx" +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + + +namespace sdext::presenter { + +PresenterFrameworkObserver::PresenterFrameworkObserver ( + css::uno::Reference xController, + const Action& rAction) + : PresenterFrameworkObserverInterfaceBase(m_aMutex), + mxConfigurationController(std::move(xController)), + maAction(rAction) +{ + if ( ! mxConfigurationController.is()) + throw lang::IllegalArgumentException(); + + if (mxConfigurationController->hasPendingRequests()) + { + mxConfigurationController->addConfigurationChangeListener( + this, + "ConfigurationUpdateEnd", + Any()); + } + else + { + rAction(true); + } +} + +PresenterFrameworkObserver::~PresenterFrameworkObserver() +{ +} + +void PresenterFrameworkObserver::RunOnUpdateEnd ( + const css::uno::Reference&rxController, + const Action& rAction) +{ + new PresenterFrameworkObserver( + rxController, + rAction); +} + +void SAL_CALL PresenterFrameworkObserver::disposing() +{ + if (maAction) + maAction(false); + Shutdown(); +} + +void PresenterFrameworkObserver::Shutdown() +{ + maAction = Action(); + if (mxConfigurationController != nullptr) + { + mxConfigurationController->removeConfigurationChangeListener(this); + mxConfigurationController = nullptr; + } +} + +void SAL_CALL PresenterFrameworkObserver::disposing (const lang::EventObject& rEvent) +{ + if ( ! rEvent.Source.is()) + return; + + if (rEvent.Source == mxConfigurationController) + { + mxConfigurationController = nullptr; + if (maAction) + maAction(false); + } +} + +void SAL_CALL PresenterFrameworkObserver::notifyConfigurationChange ( + const ConfigurationChangeEvent& /*rEvent*/) +{ + Action aAction(maAction); + Shutdown(); + aAction(true); + + maAction = nullptr; + dispose(); +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterFrameworkObserver.hxx b/sd/source/console/PresenterFrameworkObserver.hxx new file mode 100644 index 0000000000..6700ad0a23 --- /dev/null +++ b/sd/source/console/PresenterFrameworkObserver.hxx @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERFRAMEWORKOBSERVER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERFRAMEWORKOBSERVER_HXX + +#include +#include +#include +#include + +#include + +namespace sdext::presenter { + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeListener + > PresenterFrameworkObserverInterfaceBase; + +/** Watch the drawing framework for changes and run callbacks when a certain + change takes place. +*/ +class PresenterFrameworkObserver + : private ::cppu::BaseMutex, + public PresenterFrameworkObserverInterfaceBase +{ +public: + typedef ::std::function Action; + + PresenterFrameworkObserver(const PresenterFrameworkObserver&) = delete; + PresenterFrameworkObserver& operator=(const PresenterFrameworkObserver&) = delete; + + static void RunOnUpdateEnd ( + const css::uno::Reference&rxController, + const Action& rAction); + + virtual void SAL_CALL disposing() override; + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + +private: + css::uno::Reference mxConfigurationController; + Action maAction; + + /** Create a new PresenterFrameworkObserver object. + @param rPredicate + This functor tests whether the action is to be executed or not. + @param rAction + The functor to execute when the predicate returns true, + e.g. when some resource has been created. + */ + PresenterFrameworkObserver ( + css::uno::Reference xController, + const Action& rAction); + virtual ~PresenterFrameworkObserver() override; + + void Shutdown(); +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterGeometryHelper.cxx b/sd/source/console/PresenterGeometryHelper.cxx new file mode 100644 index 0000000000..b2ad35c63e --- /dev/null +++ b/sd/source/console/PresenterGeometryHelper.cxx @@ -0,0 +1,262 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterGeometryHelper.hxx" + +#include +#include +#include + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace { + +sal_Int32 Right (const awt::Rectangle& rBox) +{ + return rBox.X + rBox.Width - 1; +} + +sal_Int32 Bottom (const awt::Rectangle& rBox) +{ + return rBox.Y + rBox.Height - 1; +} + +sal_Int32 Width (const sal_Int32 nLeft, const sal_Int32 nRight) +{ + return nRight - nLeft + 1; +} + +sal_Int32 Height (const sal_Int32 nTop, const sal_Int32 nBottom) +{ + return nBottom - nTop + 1; +} + +} // end of anonymous namespace + +namespace sdext::presenter { + +sal_Int32 PresenterGeometryHelper::Floor (const double nValue) +{ + return sal::static_int_cast(floor(nValue)); +} + +sal_Int32 PresenterGeometryHelper::Ceil (const double nValue) +{ + return sal::static_int_cast(ceil(nValue)); +} + +sal_Int32 PresenterGeometryHelper::Round (const double nValue) +{ + return sal::static_int_cast(floor(0.5 + nValue)); +} + +awt::Rectangle PresenterGeometryHelper::ConvertRectangle ( + const geometry::RealRectangle2D& rBox) +{ + const sal_Int32 nLeft (Floor(rBox.X1)); + const sal_Int32 nTop (Floor(rBox.Y1)); + const sal_Int32 nRight (Ceil(rBox.X2)); + const sal_Int32 nBottom (Ceil(rBox.Y2)); + return awt::Rectangle (nLeft,nTop,nRight-nLeft,nBottom-nTop); +} + +awt::Rectangle PresenterGeometryHelper::ConvertRectangleWithConstantSize ( + const geometry::RealRectangle2D& rBox) +{ + return awt::Rectangle ( + Round(rBox.X1), + Round(rBox.Y1), + Round(rBox.X2 - rBox.X1), + Round(rBox.Y2 - rBox.Y1)); +} + +geometry::RealRectangle2D PresenterGeometryHelper::ConvertRectangle ( + const css::awt::Rectangle& rBox) +{ + return geometry::RealRectangle2D( + rBox.X, + rBox.Y, + rBox.X + rBox.Width, + rBox.Y + rBox.Height); +} + +awt::Rectangle PresenterGeometryHelper::TranslateRectangle ( + const css::awt::Rectangle& rBox, + const sal_Int32 nXOffset, + const sal_Int32 nYOffset) +{ + return awt::Rectangle(rBox.X + nXOffset, rBox.Y + nYOffset, rBox.Width, rBox.Height); +} + +awt::Rectangle PresenterGeometryHelper::Intersection ( + const css::awt::Rectangle& rBox1, + const css::awt::Rectangle& rBox2) +{ + const sal_Int32 nLeft (::std::max(rBox1.X, rBox2.X)); + const sal_Int32 nTop (::std::max(rBox1.Y, rBox2.Y)); + const sal_Int32 nRight (::std::min(Right(rBox1), Right(rBox2))); + const sal_Int32 nBottom (::std::min(Bottom(rBox1), Bottom(rBox2))); + if (nLeft >= nRight || nTop >= nBottom) + return awt::Rectangle(); + else + return awt::Rectangle(nLeft,nTop, Width(nLeft,nRight), Height(nTop,nBottom)); +} + +geometry::RealRectangle2D PresenterGeometryHelper::Intersection ( + const geometry::RealRectangle2D& rBox1, + const geometry::RealRectangle2D& rBox2) +{ + const double nLeft (::std::max(rBox1.X1, rBox2.X1)); + const double nTop (::std::max(rBox1.Y1, rBox2.Y1)); + const double nRight (::std::min(rBox1.X2, rBox2.X2)); + const double nBottom (::std::min(rBox1.Y2, rBox2.Y2)); + if (nLeft >= nRight || nTop >= nBottom) + return geometry::RealRectangle2D(0,0,0,0); + else + return geometry::RealRectangle2D(nLeft,nTop, nRight, nBottom); +} + +bool PresenterGeometryHelper::IsInside ( + const css::geometry::RealRectangle2D& rBox, + const css::geometry::RealPoint2D& rPoint) +{ + return rBox.X1 <= rPoint.X + && rBox.Y1 <= rPoint.Y + && rBox.X2 >= rPoint.X + && rBox.Y2 >= rPoint.Y; +} + +bool PresenterGeometryHelper::IsInside ( + const css::awt::Rectangle& rBox1, + const css::awt::Rectangle& rBox2) +{ + return rBox1.X >= rBox2.X + && rBox1.Y >= rBox2.Y + && rBox1.X+rBox1.Width <= rBox2.X+rBox2.Width + && rBox1.Y+rBox1.Height <= rBox2.Y+rBox2.Height; +} + +geometry::RealRectangle2D PresenterGeometryHelper::Union ( + const geometry::RealRectangle2D& rBox1, + const geometry::RealRectangle2D& rBox2) +{ + const double nLeft (::std::min(rBox1.X1, rBox2.X1)); + const double nTop (::std::min(rBox1.Y1, rBox2.Y1)); + const double nRight (::std::max(rBox1.X2, rBox2.X2)); + const double nBottom (::std::max(rBox1.Y2, rBox2.Y2)); + if (nLeft >= nRight || nTop >= nBottom) + return geometry::RealRectangle2D(0,0,0,0); + else + return geometry::RealRectangle2D(nLeft,nTop, nRight, nBottom); +} + +bool PresenterGeometryHelper::AreRectanglesDisjoint ( + const css::awt::Rectangle& rBox1, + const css::awt::Rectangle& rBox2) +{ + return rBox1.X+rBox1.Width <= rBox2.X + || rBox1.Y+rBox1.Height <= rBox2.Y + || rBox1.X >= rBox2.X+rBox2.Width + || rBox1.Y >= rBox2.Y+rBox2.Height; +} + +Reference PresenterGeometryHelper::CreatePolygon( + const awt::Rectangle& rBox, + const Reference& rxDevice) +{ + if ( ! rxDevice.is()) + return nullptr; + + Sequence > aPoints + { + { + { o3tl::narrowing(rBox.X), o3tl::narrowing(rBox.Y) }, + { o3tl::narrowing(rBox.X), o3tl::narrowing(rBox.Y+rBox.Height) }, + { o3tl::narrowing(rBox.X+rBox.Width), o3tl::narrowing(rBox.Y+rBox.Height) }, + { o3tl::narrowing(rBox.X+rBox.Width), o3tl::narrowing(rBox.Y) } + } + }; + Reference xPolygon ( + rxDevice->createCompatibleLinePolyPolygon(aPoints)); + if (xPolygon.is()) + xPolygon->setClosed(0, true); + + return xPolygon; +} + +Reference PresenterGeometryHelper::CreatePolygon( + const geometry::RealRectangle2D& rBox, + const Reference& rxDevice) +{ + if ( ! rxDevice.is()) + return nullptr; + + Sequence > aPoints + { + { + { rBox.X1, rBox.Y1 }, + { rBox.X1, rBox.Y2 }, + { rBox.X2, rBox.Y2 }, + { rBox.X2, rBox.Y1 } + } + }; + Reference xPolygon ( + rxDevice->createCompatibleLinePolyPolygon(aPoints)); + if (xPolygon.is()) + xPolygon->setClosed(0, true); + + return xPolygon; +} + +Reference PresenterGeometryHelper::CreatePolygon( + const ::std::vector& rBoxes, + const Reference& rxDevice) +{ + if ( ! rxDevice.is()) + return nullptr; + + const sal_Int32 nCount (rBoxes.size()); + Sequence > aPoints(nCount); + auto aPointsRange = asNonConstRange(aPoints); + for (sal_Int32 nIndex=0; nIndex + { + { o3tl::narrowing(rBox.X), o3tl::narrowing(rBox.Y) }, + { o3tl::narrowing(rBox.X), o3tl::narrowing(rBox.Y+rBox.Height) }, + { o3tl::narrowing(rBox.X+rBox.Width), o3tl::narrowing(rBox.Y+rBox.Height) }, + { o3tl::narrowing(rBox.X+rBox.Width), o3tl::narrowing(rBox.Y) } + }; + } + + Reference xPolygon ( + rxDevice->createCompatibleLinePolyPolygon(aPoints)); + if (xPolygon.is()) + for (sal_Int32 nIndex=0; nIndexsetClosed(nIndex, true); + + return xPolygon; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterGeometryHelper.hxx b/sd/source/console/PresenterGeometryHelper.hxx new file mode 100644 index 0000000000..c2f55757e9 --- /dev/null +++ b/sd/source/console/PresenterGeometryHelper.hxx @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERGEOMETRYHELPER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERGEOMETRYHELPER_HXX + +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +/** Collection of geometry related convenience functions. +*/ +class PresenterGeometryHelper +{ +public: + static sal_Int32 Round (const double nValue); + static sal_Int32 Floor (const double nValue); + static sal_Int32 Ceil (const double nValue); + + /** Return the bounding box with integer coordinates of the given + rectangle. Note that due to different rounding of the left/top and + the right/bottom border the width of the resulting rectangle may + differ for different positions but constant width and height. + */ + static css::awt::Rectangle ConvertRectangle ( + const css::geometry::RealRectangle2D& rBox); + + /** Convert the given rectangle to integer coordinates so that width and + height remain constant when only the position changes. + */ + static css::awt::Rectangle ConvertRectangleWithConstantSize ( + const css::geometry::RealRectangle2D& rBox); + + static css::geometry::RealRectangle2D ConvertRectangle ( + const css::awt::Rectangle& rBox); + + // static css::awt::Size ConvertSize ( + // const css::geometry::RealSize2D& rSize); + + static css::awt::Rectangle TranslateRectangle ( + const css::awt::Rectangle& rBox, + const sal_Int32 nXOffset, + const sal_Int32 nYOffset); + + static css::awt::Rectangle Intersection ( + const css::awt::Rectangle& rBox1, + const css::awt::Rectangle& rBox2); + + static css::geometry::RealRectangle2D Intersection ( + const css::geometry::RealRectangle2D& rBox1, + const css::geometry::RealRectangle2D& rBox2); + + static bool IsInside ( + const css::geometry::RealRectangle2D& rBox, + const css::geometry::RealPoint2D& rPoint); + + /** Return whether rBox1 is completely inside rBox2. + */ + static bool IsInside ( + const css::awt::Rectangle& rBox1, + const css::awt::Rectangle& rBox2); + + static css::geometry::RealRectangle2D Union ( + const css::geometry::RealRectangle2D& rBox1, + const css::geometry::RealRectangle2D& rBox2); + + static bool AreRectanglesDisjoint ( + const css::awt::Rectangle& rBox1, + const css::awt::Rectangle& rBox2); + + static css::uno::Reference CreatePolygon( + const css::awt::Rectangle& rBox, + const css::uno::Reference& rxDevice); + + static css::uno::Reference CreatePolygon( + const css::geometry::RealRectangle2D& rBox, + const css::uno::Reference& rxDevice); + + static css::uno::Reference CreatePolygon( + const ::std::vector& rBoxes, + const css::uno::Reference& rxDevice); + + /** Create a polygon for a rounded rectangle. + */ + /* static css::uno::Reference CreatePolygon( + const css::awt::Rectangle& rBox, + const double nRadius, + const css::uno::Reference& + rxDevice); + */ +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterHelpView.cxx b/sd/source/console/PresenterHelpView.cxx new file mode 100644 index 0000000000..b4f3477e33 --- /dev/null +++ b/sd/source/console/PresenterHelpView.cxx @@ -0,0 +1,748 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include "PresenterHelpView.hxx" +#include "PresenterButton.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::std::vector; + +namespace sdext::presenter { + +namespace { + const sal_Int32 gnHorizontalGap (20); + const sal_Int32 gnVerticalBorder (30); + const sal_Int32 gnVerticalButtonPadding (12); + + class LineDescriptor + { + public: + LineDescriptor(); + void AddPart ( + std::u16string_view rsLine, + const css::uno::Reference& rxFont); + bool IsEmpty() const; + + OUString msLine; + geometry::RealSize2D maSize; + double mnVerticalOffset; + + void CalculateSize (const css::uno::Reference& rxFont); + }; + + class LineDescriptorList + { + public: + LineDescriptorList ( + OUString sText, + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth); + + void Update ( + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth); + + double Paint( + const Reference& rxCanvas, + const geometry::RealRectangle2D& rBBox, + const bool bFlushLeft, + const rendering::ViewState& rViewState, + rendering::RenderState& rRenderState, + const css::uno::Reference& rxFont) const; + double GetHeight() const; + + private: + const OUString msText; + std::shared_ptr > mpLineDescriptors; + + static void SplitText (std::u16string_view rsText, vector& rTextParts); + void FormatText ( + const vector& rTextParts, + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth); + }; + + class Block + { + public: + Block ( + const OUString& rsLeftText, + const OUString& rsRightText, + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth); + Block(const Block&) = delete; + Block& operator=(const Block&) = delete; + void Update ( + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth); + + LineDescriptorList maLeft; + LineDescriptorList maRight; + }; +} // end of anonymous namespace + +class PresenterHelpView::TextContainer : public vector > +{ +}; + +PresenterHelpView::PresenterHelpView ( + const Reference& rxContext, + const Reference& rxViewId, + const rtl::Reference<::sd::DrawController>& rxController, + ::rtl::Reference xPresenterController) + : PresenterHelpViewInterfaceBase(m_aMutex), + mxComponentContext(rxContext), + mxViewId(rxViewId), + mpPresenterController(std::move(xPresenterController)), + mnSeparatorY(0), + mnMaximalWidth(0) +{ + try + { + // Get the content window via the pane anchor. + Reference xCC ( + rxController->getConfigurationController(), UNO_SET_THROW); + mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW); + + mxWindow = mxPane->getWindow(); + ProvideCanvas(); + + mxWindow->addWindowListener(this); + mxWindow->addPaintListener(this); + Reference xPeer (mxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->setBackground(util::Color(0xff000000)); + mxWindow->setVisible(true); + + if (mpPresenterController.is()) + { + mpFont = mpPresenterController->GetViewFont(mxViewId->getResourceURL()); + if (mpFont) + { + mpFont->PrepareFont(mxCanvas); + } + } + + // Create the close button. + mpCloseButton = PresenterButton::Create( + mxComponentContext, + mpPresenterController, + mpPresenterController->GetTheme(), + mxWindow, + mxCanvas, + "HelpViewCloser"); + + ReadHelpStrings(); + Resize(); + } + catch (RuntimeException&) + { + mxViewId = nullptr; + mxWindow = nullptr; + throw; + } +} + +PresenterHelpView::~PresenterHelpView() +{ +} + +void SAL_CALL PresenterHelpView::disposing() +{ + mxViewId = nullptr; + + if (mpCloseButton.is()) + { + Reference xComponent = mpCloseButton; + mpCloseButton = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + if (mxWindow.is()) + { + mxWindow->removeWindowListener(this); + mxWindow->removePaintListener(this); + } +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterHelpView::disposing (const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxCanvas) + { + mxCanvas = nullptr; + } + else if (rEventObject.Source == mxWindow) + { + mxWindow = nullptr; + dispose(); + } +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterHelpView::windowResized (const awt::WindowEvent&) +{ + ThrowIfDisposed(); + Resize(); +} + +void SAL_CALL PresenterHelpView::windowMoved (const awt::WindowEvent&) +{ + ThrowIfDisposed(); +} + +void SAL_CALL PresenterHelpView::windowShown (const lang::EventObject&) +{ + ThrowIfDisposed(); + Resize(); +} + +void SAL_CALL PresenterHelpView::windowHidden (const lang::EventObject&) +{ + ThrowIfDisposed(); +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterHelpView::windowPaint (const css::awt::PaintEvent& rEvent) +{ + Paint(rEvent.UpdateRect); +} + +void PresenterHelpView::Paint (const awt::Rectangle& rUpdateBox) +{ + ProvideCanvas(); + if ( ! mxCanvas.is()) + return; + + // Clear background. + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + mpPresenterController->GetCanvasHelper()->Paint( + mpPresenterController->GetViewBackground(mxViewId->getResourceURL()), + mxCanvas, + rUpdateBox, + awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height), + awt::Rectangle()); + + // Paint vertical divider. + + rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + PresenterGeometryHelper::CreatePolygon(rUpdateBox, mxCanvas->getDevice())); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor); + + mxCanvas->drawLine( + geometry::RealPoint2D((aWindowBox.Width/2.0), gnVerticalBorder), + geometry::RealPoint2D((aWindowBox.Width/2.0), mnSeparatorY - gnVerticalBorder), + aViewState, + aRenderState); + + // Paint the horizontal separator. + mxCanvas->drawLine( + geometry::RealPoint2D(0, mnSeparatorY), + geometry::RealPoint2D(aWindowBox.Width, mnSeparatorY), + aViewState, + aRenderState); + + // Paint text. + double nY (gnVerticalBorder); + for (const auto& rxBlock : *mpTextContainer) + { + sal_Int32 LeftX1 = gnHorizontalGap; + sal_Int32 LeftX2 = aWindowBox.Width/2 - gnHorizontalGap; + sal_Int32 RightX1 = aWindowBox.Width/2 + gnHorizontalGap; + sal_Int32 RightX2 = aWindowBox.Width - gnHorizontalGap; + /* check whether RTL interface or not + then replace the windowbox position */ + if(AllSettings::GetLayoutRTL()) + { + LeftX1 = aWindowBox.Width/2 + gnHorizontalGap; + LeftX2 = aWindowBox.Width - gnHorizontalGap; + RightX1 = gnHorizontalGap; + RightX2 = aWindowBox.Width/2 - gnHorizontalGap; + } + const double nLeftHeight ( + rxBlock->maLeft.Paint(mxCanvas, + geometry::RealRectangle2D( + LeftX1, + nY, + LeftX2, + aWindowBox.Height - gnVerticalBorder), + false, + aViewState, + aRenderState, + mpFont->mxFont)); + const double nRightHeight ( + rxBlock->maRight.Paint(mxCanvas, + geometry::RealRectangle2D( + RightX1, + nY, + RightX2, + aWindowBox.Height - gnVerticalBorder), + true, + aViewState, + aRenderState, + mpFont->mxFont)); + + nY += ::std::max(nLeftHeight,nRightHeight); + } + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +void PresenterHelpView::ReadHelpStrings() +{ + mpTextContainer.reset(new TextContainer); + PresenterConfigurationAccess aConfiguration ( + mxComponentContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + Reference xStrings ( + aConfiguration.GetConfigurationNode("PresenterScreenSettings/HelpView/HelpStrings"), + UNO_QUERY); + PresenterConfigurationAccess::ForAll( + xStrings, + [this](OUString const&, uno::Reference const& xProps) + { + return this->ProcessString(xProps); + }); +} + +void PresenterHelpView::ProcessString ( + const Reference& rsProperties) +{ + if ( ! rsProperties.is()) + return; + + OUString sLeftText; + PresenterConfigurationAccess::GetProperty(rsProperties, "Left") >>= sLeftText; + OUString sRightText; + PresenterConfigurationAccess::GetProperty(rsProperties, "Right") >>= sRightText; + mpTextContainer->push_back( + std::make_shared( + sLeftText, sRightText, mpFont->mxFont, mnMaximalWidth)); +} + +void PresenterHelpView::CheckFontSize() +{ + if (!mpFont) + return; + + sal_Int32 nBestSize (6); + + // Scaling down and then reformatting can cause the text to be too large + // still. So do this again and again until the text size is + // small enough. Restrict the number of loops. + for (int nLoopCount=0; nLoopCount<5; ++nLoopCount) + { + double nY = std::accumulate(mpTextContainer->begin(), mpTextContainer->end(), double(0), + [](const double& sum, const std::shared_ptr& rxBlock) { + return sum + std::max( + rxBlock->maLeft.GetHeight(), + rxBlock->maRight.GetHeight()); + }); + + const double nHeightDifference (nY - (mnSeparatorY-gnVerticalBorder)); + if (nHeightDifference <= 0 && nHeightDifference > -50) + { + // We have found a good font size that is large and leaves not + // too much space below the help text. + return; + } + + // Use a simple linear transformation to calculate initial guess of + // a size that lets all help text be shown inside the window. + const double nScale (double(mnSeparatorY-gnVerticalBorder) / nY); + if (nScale > 1.0 && nScale < 1.05) + break; + + sal_Int32 nFontSizeGuess (sal_Int32(mpFont->mnSize * nScale)); + if (nHeightDifference<=0 && mpFont->mnSize>nBestSize) + nBestSize = mpFont->mnSize; + mpFont->mnSize = nFontSizeGuess; + mpFont->mxFont = nullptr; + mpFont->PrepareFont(mxCanvas); + + // Reformat blocks. + for (auto& rxBlock : *mpTextContainer) + rxBlock->Update(mpFont->mxFont, mnMaximalWidth); + } + + if (nBestSize != mpFont->mnSize) + { + mpFont->mnSize = nBestSize; + mpFont->mxFont = nullptr; + mpFont->PrepareFont(mxCanvas); + + // Reformat blocks. + for (auto& rxBlock : *mpTextContainer) + { + rxBlock->Update(mpFont->mxFont, mnMaximalWidth); + } + } +} + +//----- XResourceId ----------------------------------------------------------- + +Reference SAL_CALL PresenterHelpView::getResourceId() +{ + ThrowIfDisposed(); + return mxViewId; +} + +sal_Bool SAL_CALL PresenterHelpView::isAnchorOnly() +{ + return false; +} + + +void PresenterHelpView::ProvideCanvas() +{ + if ( ! mxCanvas.is() && mxPane.is()) + { + mxCanvas = mxPane->getCanvas(); + if ( ! mxCanvas.is()) + return; + Reference xComponent (mxCanvas, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener(static_cast(this)); + + if (mpCloseButton.is()) + mpCloseButton->SetCanvas(mxCanvas, mxWindow); + } +} + +void PresenterHelpView::Resize() +{ + if (!(mpCloseButton && mxWindow.is())) + return; + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + mnMaximalWidth = (mxWindow->getPosSize().Width - 4*gnHorizontalGap) / 2; + + // Place vertical separator. + mnSeparatorY = aWindowBox.Height + - mpCloseButton->GetSize().Height - gnVerticalButtonPadding; + + mpCloseButton->SetCenter(geometry::RealPoint2D( + aWindowBox.Width/2.0, + aWindowBox.Height - mpCloseButton->GetSize().Height/2.0)); + + CheckFontSize(); +} + +void PresenterHelpView::ThrowIfDisposed() +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterHelpView has been already disposed", + static_cast(this)); + } +} + +//===== LineDescriptor ========================================================= + +namespace { + +LineDescriptor::LineDescriptor() + : maSize(0,0), + mnVerticalOffset(0) +{ +} + +void LineDescriptor::AddPart ( + std::u16string_view rsLine, + const css::uno::Reference& rxFont) +{ + msLine += rsLine; + + CalculateSize(rxFont); +} + +bool LineDescriptor::IsEmpty() const +{ + return msLine.isEmpty(); +} + +void LineDescriptor::CalculateSize ( + const css::uno::Reference& rxFont) +{ + OSL_ASSERT(rxFont.is()); + + rendering::StringContext aContext (msLine, 0, msLine.getLength()); + Reference xLayout ( + rxFont->createTextLayout(aContext, rendering::TextDirection::WEAK_LEFT_TO_RIGHT, 0)); + const geometry::RealRectangle2D aTextBBox (xLayout->queryTextBounds()); + maSize = css::geometry::RealSize2D(aTextBBox.X2 - aTextBBox.X1, aTextBBox.Y2 - aTextBBox.Y1); + mnVerticalOffset = aTextBBox.Y2; +} + +} // end of anonymous namespace + +//===== LineDescriptorList ==================================================== + +namespace { + +LineDescriptorList::LineDescriptorList ( + OUString sText, + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth) + : msText(std::move(sText)) +{ + Update(rxFont, nMaximalWidth); +} + +double LineDescriptorList::Paint( + const Reference& rxCanvas, + const geometry::RealRectangle2D& rBBox, + const bool bFlushLeft, + const rendering::ViewState& rViewState, + rendering::RenderState& rRenderState, + const css::uno::Reference& rxFont) const +{ + if ( ! rxCanvas.is()) + return 0; + + double nY (rBBox.Y1); + for (const auto& rLine : *mpLineDescriptors) + { + double nX; + /// check whether RTL interface or not + if(!AllSettings::GetLayoutRTL()) + { + nX = rBBox.X1; + if ( ! bFlushLeft) + nX = rBBox.X2 - rLine.maSize.Width; + } + else + { + nX=rBBox.X2 - rLine.maSize.Width; + if ( ! bFlushLeft) + nX = rBBox.X1; + } + rRenderState.AffineTransform.m02 = nX; + rRenderState.AffineTransform.m12 = nY + rLine.maSize.Height - rLine.mnVerticalOffset; + + const rendering::StringContext aContext (rLine.msLine, 0, rLine.msLine.getLength()); + Reference xLayout ( + rxFont->createTextLayout(aContext, rendering::TextDirection::WEAK_LEFT_TO_RIGHT, 0)); + rxCanvas->drawTextLayout ( + xLayout, + rViewState, + rRenderState); + + nY += rLine.maSize.Height * 1.2; + } + + return nY - rBBox.Y1; +} + +double LineDescriptorList::GetHeight() const +{ + return std::accumulate(mpLineDescriptors->begin(), mpLineDescriptors->end(), double(0), + [](const double& nHeight, const LineDescriptor& rLine) { + return nHeight + rLine.maSize.Height * 1.2; + }); +} + +void LineDescriptorList::Update ( + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth) +{ + vector aTextParts; + SplitText(msText, aTextParts); + FormatText(aTextParts, rxFont, nMaximalWidth); +} + +void LineDescriptorList::SplitText ( + std::u16string_view rsText, + vector& rTextParts) +{ + const char cQuote ('\''); + const char cSeparator (','); + + size_t nIndex (0); + size_t nStart (0); + size_t nLength (rsText.size()); + bool bIsQuoted (false); + while (nIndex < nLength) + { + const size_t nQuoteIndex (rsText.find(cQuote, nIndex)); + const size_t nSeparatorIndex (rsText.find(cSeparator, nIndex)); + if (nQuoteIndex != std::u16string_view::npos && + (nSeparatorIndex == std::u16string_view::npos || nQuoteIndex& rTextParts, + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth) +{ + LineDescriptor aLineDescriptor; + + mpLineDescriptors = std::make_shared>(); + + vector::const_iterator iPart (rTextParts.begin()); + vector::const_iterator iEnd (rTextParts.end()); + while (iPart!=iEnd) + { + if (aLineDescriptor.IsEmpty()) + { + // Avoid empty lines. + if (PresenterCanvasHelper::GetTextSize( + rxFont, *iPart).Width > nMaximalWidth) + { + const char cSpace (' '); + + sal_Int32 nIndex (0); + sal_Int32 nStart (0); + sal_Int32 nLength (iPart->getLength()); + while (nIndex < nLength) + { + sal_Int32 nSpaceIndex (iPart->indexOf(cSpace, nIndex)); + while (nSpaceIndex >= 0 && PresenterCanvasHelper::GetTextSize( + rxFont, iPart->copy(nStart, nSpaceIndex-nStart)).Width <= nMaximalWidth) + { + nIndex = nSpaceIndex; + nSpaceIndex = iPart->indexOf(cSpace, nIndex+1); + } + + if (nSpaceIndex < 0 && PresenterCanvasHelper::GetTextSize( + rxFont, iPart->copy(nStart, nLength-nStart)).Width <= nMaximalWidth) + { + nIndex = nLength; + } + + if (nIndex == nStart) + { + nIndex = nLength; + } + + aLineDescriptor.AddPart(iPart->subView(nStart, nIndex-nStart), rxFont); + if (nIndex != nLength) + { + mpLineDescriptors->push_back(aLineDescriptor); + aLineDescriptor = LineDescriptor(); + } + nStart = nIndex; + } + } + else + { + aLineDescriptor.AddPart(*iPart, rxFont); + } + } + else if (PresenterCanvasHelper::GetTextSize( + rxFont, aLineDescriptor.msLine+", "+*iPart).Width > nMaximalWidth) + { + aLineDescriptor.AddPart(u",", rxFont); + mpLineDescriptors->push_back(aLineDescriptor); + aLineDescriptor = LineDescriptor(); + continue; + } + else + { + aLineDescriptor.AddPart(Concat2View(", "+*iPart), rxFont); + } + ++iPart; + } + if ( ! aLineDescriptor.IsEmpty()) + { + mpLineDescriptors->push_back(aLineDescriptor); + } +} + +} // end of anonymous namespace + +//===== Block ================================================================= + +namespace { + +Block::Block ( + const OUString& rsLeftText, + const OUString& rsRightText, + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth) + : maLeft(rsLeftText, rxFont, nMaximalWidth), + maRight(rsRightText, rxFont, nMaximalWidth) +{ +} + +void Block::Update ( + const css::uno::Reference& rxFont, + const sal_Int32 nMaximalWidth) +{ + maLeft.Update(rxFont, nMaximalWidth); + maRight.Update(rxFont, nMaximalWidth); +} + +} // end of anonymous namespace + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterHelpView.hxx b/sd/source/console/PresenterHelpView.hxx new file mode 100644 index 0000000000..e342e2c994 --- /dev/null +++ b/sd/source/console/PresenterHelpView.hxx @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPVIEW_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPVIEW_HXX + +#include "PresenterController.hxx" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +class PresenterButton; + +typedef cppu::WeakComponentImplHelper< + css::drawing::framework::XView, + css::awt::XWindowListener, + css::awt::XPaintListener + > PresenterHelpViewInterfaceBase; + +/** Show help text that describes the defined keys. +*/ +class PresenterHelpView + : private ::cppu::BaseMutex, + public PresenterHelpViewInterfaceBase +{ +public: + explicit PresenterHelpView ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxViewId, + const rtl::Reference<::sd::DrawController>& rxController, + ::rtl::Reference xPresenterController); + virtual ~PresenterHelpView() override; + + virtual void SAL_CALL disposing() override; + + // lang::XEventListener + + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XResourceId + + virtual css::uno::Reference SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + +private: + class TextContainer; + + css::uno::Reference mxComponentContext; + css::uno::Reference mxViewId; + css::uno::Reference mxPane; + css::uno::Reference mxWindow; + css::uno::Reference mxCanvas; + ::rtl::Reference mpPresenterController; + PresenterTheme::SharedFontDescriptor mpFont; + std::unique_ptr mpTextContainer; + ::rtl::Reference mpCloseButton; + sal_Int32 mnSeparatorY; + sal_Int32 mnMaximalWidth; + + void ProvideCanvas(); + void Resize(); + void Paint (const css::awt::Rectangle& rRedrawArea); + void ReadHelpStrings(); + void ProcessString ( + const css::uno::Reference& rsProperties); + + /** Find a font size, so that all text can be displayed at the same + time. + */ + void CheckFontSize(); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterHelper.cxx b/sd/source/console/PresenterHelper.cxx new file mode 100644 index 0000000000..76bec0ecee --- /dev/null +++ b/sd/source/console/PresenterHelper.cxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterHelper.hxx" + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::presentation; + +namespace sdext::presenter { + +constexpr OUStringLiteral msPaneURLPrefix( u"private:resource/pane/"); +const OUString PresenterHelper::msFullScreenPaneURL( msPaneURLPrefix + "FullScreenPane"); + +Reference PresenterHelper::GetSlideShowController ( + const Reference& rxController) +{ + Reference xSlideShowController; + + if( rxController.is() ) try + { + Reference xPS ( rxController->getModel(), UNO_QUERY_THROW); + + Reference xPresentation(xPS->getPresentation(), UNO_QUERY_THROW); + + xSlideShowController = xPresentation->getController(); + } + catch(RuntimeException&) + { + } + + return xSlideShowController; +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterHelper.hxx b/sd/source/console/PresenterHelper.hxx new file mode 100644 index 0000000000..69fc573339 --- /dev/null +++ b/sd/source/console/PresenterHelper.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPER_HXX + +#include +#include + +namespace sdext::presenter +{ +/** Collection of helper functions that do not fit in anywhere else. + Provide access to frequently used strings of the drawing framework. +*/ +namespace PresenterHelper +{ +extern const OUString msFullScreenPaneURL; + +/** Return the slide show controller of a running presentation that has + the same document as the given framework controller. + @return + When no presentation is running this method returns an empty reference. +*/ +css::uno::Reference +GetSlideShowController(const css::uno::Reference& rxController); +} + +} // end of namespace presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterNotesView.cxx b/sd/source/console/PresenterNotesView.cxx new file mode 100644 index 0000000000..5c959b78a0 --- /dev/null +++ b/sd/source/console/PresenterNotesView.cxx @@ -0,0 +1,649 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "PresenterNotesView.hxx" +#include "PresenterButton.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterScrollBar.hxx" +#include "PresenterTextView.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +const sal_Int32 gnSpaceBelowSeparator (10); +const sal_Int32 gnSpaceAboveSeparator (10); +const double gnLineScrollFactor (1.2); + +namespace sdext::presenter { + +//===== PresenterNotesView ==================================================== + +PresenterNotesView::PresenterNotesView ( + const Reference& rxComponentContext, + const Reference& rxViewId, + const ::rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController) + : PresenterNotesViewInterfaceBase(m_aMutex), + mxViewId(rxViewId), + mpPresenterController(rpPresenterController), + maSeparatorColor(0xffffff), + mnSeparatorYLocation(0), + mnTop(0) +{ + try + { + Reference xCC (rxController->getConfigurationController(), UNO_SET_THROW); + Reference xPane (xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW); + + mxParentWindow = xPane->getWindow(); + mxCanvas = xPane->getCanvas(); + mpTextView = std::make_shared( + rxComponentContext, + mxCanvas, + mpPresenterController->GetPaintManager()->GetInvalidator(mxParentWindow)); + + const OUString sResourceURL (mxViewId->getResourceURL()); + mpFont = std::make_shared( + rpPresenterController->GetViewFont(sResourceURL)); + maSeparatorColor = mpFont->mnColor; + mpTextView->SetFont(mpFont); + + CreateToolBar(rxComponentContext, rpPresenterController); + + mpCloseButton = PresenterButton::Create( + rxComponentContext, + mpPresenterController, + mpPresenterController->GetTheme(), + mxParentWindow, + mxCanvas, + "NotesViewCloser"); + + if (mxParentWindow.is()) + { + mxParentWindow->addWindowListener(this); + mxParentWindow->addPaintListener(this); + mxParentWindow->addKeyListener(this); + mxParentWindow->setVisible(true); + } + + mpScrollBar = new PresenterVerticalScrollBar( + rxComponentContext, + mxParentWindow, + mpPresenterController->GetPaintManager(), + [this](double f) { return this->SetTop(f); }); + mpScrollBar->SetBackground( + mpPresenterController->GetViewBackground(mxViewId->getResourceURL())); + + mpScrollBar->SetCanvas(mxCanvas); + + Layout(); + } + catch (RuntimeException&) + { + PresenterNotesView::disposing(); + throw; + } +} + +PresenterNotesView::~PresenterNotesView() +{ +} + +void SAL_CALL PresenterNotesView::disposing() +{ + if (mxParentWindow.is()) + { + mxParentWindow->removeWindowListener(this); + mxParentWindow->removePaintListener(this); + mxParentWindow->removeKeyListener(this); + mxParentWindow = nullptr; + } + + // Dispose tool bar. + { + Reference xComponent = mpToolBar; + mpToolBar = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + { + Reference xComponent (mxToolBarCanvas, UNO_QUERY); + mxToolBarCanvas = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + { + Reference xComponent = mxToolBarWindow; + mxToolBarWindow = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + // Dispose close button + { + Reference xComponent = mpCloseButton; + mpCloseButton = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + // Create the tool bar. + + mpScrollBar = nullptr; + + mxViewId = nullptr; +} + +void PresenterNotesView::CreateToolBar ( + const css::uno::Reference& rxContext, + const ::rtl::Reference& rpPresenterController) +{ + if (!rpPresenterController) + return; + + Reference xPresenterHelper ( + rpPresenterController->GetPresenterHelper()); + if ( ! xPresenterHelper.is()) + return; + + // Create a new window as container of the tool bar. + mxToolBarWindow = xPresenterHelper->createWindow( + mxParentWindow, + false, + true, + false, + false); + mxToolBarCanvas = xPresenterHelper->createSharedCanvas ( + Reference(mxCanvas, UNO_QUERY), + mxParentWindow, + mxCanvas, + mxParentWindow, + mxToolBarWindow); + + // Create the tool bar. + mpToolBar = new PresenterToolBar( + rxContext, + mxToolBarWindow, + mxToolBarCanvas, + rpPresenterController, + PresenterToolBar::Left); + mpToolBar->Initialize( + "PresenterScreenSettings/ToolBars/NotesToolBar"); +} + +void PresenterNotesView::SetSlide (const Reference& rxNotesPage) +{ + static constexpr OUString sNotesShapeName ( + u"com.sun.star.presentation.NotesShape"_ustr); + static constexpr OUStringLiteral sTextShapeName ( + u"com.sun.star.drawing.TextShape"); + + if (!rxNotesPage.is()) + return; + + // Iterate over all shapes and find the one that holds the text. + sal_Int32 nCount (rxNotesPage->getCount()); + for (sal_Int32 nIndex=0; nIndex xServiceName ( + rxNotesPage->getByIndex(nIndex), UNO_QUERY); + if (xServiceName.is() + && xServiceName->getServiceName() == sNotesShapeName) + { + } + else + { + Reference xShapeDescriptor ( + rxNotesPage->getByIndex(nIndex), UNO_QUERY); + if (xShapeDescriptor.is()) + { + OUString sType (xShapeDescriptor->getShapeType()); + if (sType == sNotesShapeName || sType == sTextShapeName) + { + Reference xText ( + rxNotesPage->getByIndex(nIndex), UNO_QUERY); + if (xText.is()) + { + mpTextView->SetText(Reference(xText, UNO_QUERY)); + } + } + } + } + } + + Layout(); + + if (mpScrollBar) + { + mpScrollBar->SetThumbPosition(0, false); + UpdateScrollBar(); + } + + Invalidate(); +} + +//----- lang::XEventListener ------------------------------------------------- + +void SAL_CALL PresenterNotesView::disposing (const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxParentWindow) + mxParentWindow = nullptr; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterNotesView::windowResized (const awt::WindowEvent&) +{ + Layout(); +} + +void SAL_CALL PresenterNotesView::windowMoved (const awt::WindowEvent&) {} + +void SAL_CALL PresenterNotesView::windowShown (const lang::EventObject&) {} + +void SAL_CALL PresenterNotesView::windowHidden (const lang::EventObject&) {} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterNotesView::windowPaint (const awt::PaintEvent& rEvent) +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterNotesView object has already been disposed", + static_cast(this)); + } + + if ( ! mbIsPresenterViewActive) + return; + + ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex()); + Paint(rEvent.UpdateRect); +} + +//----- XResourceId ----------------------------------------------------------- + +Reference SAL_CALL PresenterNotesView::getResourceId() +{ + return mxViewId; +} + +sal_Bool SAL_CALL PresenterNotesView::isAnchorOnly() +{ + return false; +} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL PresenterNotesView::setCurrentPage (const Reference& rxSlide) +{ + // Get the associated notes page. + mxCurrentNotesPage = nullptr; + try + { + Reference xPresentationPage(rxSlide, UNO_QUERY); + if (xPresentationPage.is()) + mxCurrentNotesPage = xPresentationPage->getNotesPage(); + } + catch (RuntimeException&) + { + } + + SetSlide(mxCurrentNotesPage); +} + +Reference SAL_CALL PresenterNotesView::getCurrentPage() +{ + return nullptr; +} + +//----- XKeyListener ---------------------------------------------------------- + +void SAL_CALL PresenterNotesView::keyPressed (const awt::KeyEvent& rEvent) +{ + switch (rEvent.KeyCode) + { + case awt::Key::A: + Scroll(-gnLineScrollFactor * mpFont->mnSize); + break; + + case awt::Key::Y: + case awt::Key::Z: + Scroll(+gnLineScrollFactor * mpFont->mnSize); + break; + + case awt::Key::S: + ChangeFontSize(-1); + break; + + case awt::Key::G: + ChangeFontSize(+1); + break; + + case awt::Key::H: + if (mpTextView) + mpTextView->MoveCaret( + -1, + (rEvent.Modifiers == awt::KeyModifier::SHIFT) + ? css::accessibility::AccessibleTextType::CHARACTER + : css::accessibility::AccessibleTextType::WORD); + break; + + case awt::Key::L: + if (mpTextView) + mpTextView->MoveCaret( + +1, + (rEvent.Modifiers == awt::KeyModifier::SHIFT) + ? css::accessibility::AccessibleTextType::CHARACTER + : css::accessibility::AccessibleTextType::WORD); + break; + } +} + +void SAL_CALL PresenterNotesView::keyReleased (const awt::KeyEvent&) {} + + +void PresenterNotesView::Layout() +{ + if ( ! mxParentWindow.is()) + return; + awt::Rectangle aWindowBox (mxParentWindow->getPosSize()); + geometry::RealRectangle2D aNewTextBoundingBox (0,0,aWindowBox.Width, aWindowBox.Height); + // Size the tool bar and the horizontal separator above it. + if (mxToolBarWindow.is()) + { + const geometry::RealSize2D aToolBarSize (mpToolBar->GetMinimalSize()); + const sal_Int32 nToolBarHeight = sal_Int32(aToolBarSize.Height + 0.5); + mxToolBarWindow->setPosSize(0, aWindowBox.Height - nToolBarHeight, + sal_Int32(aToolBarSize.Width + 0.5), nToolBarHeight, + awt::PosSize::POSSIZE); + mnSeparatorYLocation = aWindowBox.Height - nToolBarHeight - gnSpaceBelowSeparator; + aNewTextBoundingBox.Y2 = mnSeparatorYLocation - gnSpaceAboveSeparator; + // Place the close button. + if (mpCloseButton) + mpCloseButton->SetCenter(geometry::RealPoint2D( + (aWindowBox.Width + aToolBarSize.Width) / 2, + aWindowBox.Height - aToolBarSize.Height/2)); + } + // Check whether the vertical scroll bar is necessary. + if (mpScrollBar) + { + bool bShowVerticalScrollbar (false); + try + { + const double nTextBoxHeight (aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1); + const double nHeight (mpTextView->GetTotalTextHeight()); + if (nHeight > nTextBoxHeight) + { + bShowVerticalScrollbar = true; + if(!AllSettings::GetLayoutRTL()) + aNewTextBoundingBox.X2 -= mpScrollBar->GetSize(); + else + aNewTextBoundingBox.X1 += mpScrollBar->GetSize(); + } + mpScrollBar->SetTotalSize(nHeight); + } + catch(beans::UnknownPropertyException&) + { + OSL_ASSERT(false); + } + if(AllSettings::GetLayoutRTL()) + { + mpScrollBar->SetVisible(bShowVerticalScrollbar); + mpScrollBar->SetPosSize( + geometry::RealRectangle2D( + aNewTextBoundingBox.X1 - mpScrollBar->GetSize(), + aNewTextBoundingBox.Y1, + aNewTextBoundingBox.X1, + aNewTextBoundingBox.Y2)); + if( ! bShowVerticalScrollbar) + mpScrollBar->SetThumbPosition(0, false); + UpdateScrollBar(); + } + else + { + mpScrollBar->SetVisible(bShowVerticalScrollbar); + mpScrollBar->SetPosSize( + geometry::RealRectangle2D( + aWindowBox.Width - mpScrollBar->GetSize(), + aNewTextBoundingBox.Y1, + aNewTextBoundingBox.X2 + mpScrollBar->GetSize(), + aNewTextBoundingBox.Y2)); + if( ! bShowVerticalScrollbar) + mpScrollBar->SetThumbPosition(0, false); + UpdateScrollBar(); + } + } + // Has the text area has changed it position or size? + if (aNewTextBoundingBox.X1 != maTextBoundingBox.X1 + || aNewTextBoundingBox.Y1 != maTextBoundingBox.Y1 + || aNewTextBoundingBox.X2 != maTextBoundingBox.X2 + || aNewTextBoundingBox.Y2 != maTextBoundingBox.Y2) + { + maTextBoundingBox = aNewTextBoundingBox; + mpTextView->SetLocation( + geometry::RealPoint2D( + aNewTextBoundingBox.X1, + aNewTextBoundingBox.Y1)); + mpTextView->SetSize( + geometry::RealSize2D( + aNewTextBoundingBox.X2 - aNewTextBoundingBox.X1, + aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1)); + } +} + +void PresenterNotesView::Paint (const awt::Rectangle& rUpdateBox) +{ + if ( ! mxParentWindow.is()) + return; + if ( ! mxCanvas.is()) + return; + + if (!mpBackground) + mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL()); + + if (rUpdateBox.Y < maTextBoundingBox.Y2 + && rUpdateBox.X < maTextBoundingBox.X2) + { + PaintText(rUpdateBox); + } + + mpTextView->Paint(rUpdateBox); + + if (rUpdateBox.Y + rUpdateBox.Height > maTextBoundingBox.Y2) + { + PaintToolBar(rUpdateBox); + } +} + +void PresenterNotesView::PaintToolBar (const awt::Rectangle& rUpdateBox) +{ + awt::Rectangle aWindowBox (mxParentWindow->getPosSize()); + + rendering::ViewState aViewState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr); + rendering::RenderState aRenderState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + if (mpBackground) + { + // Paint the background. + mpPresenterController->GetCanvasHelper()->Paint( + mpBackground, + mxCanvas, + rUpdateBox, + awt::Rectangle(0,sal_Int32(maTextBoundingBox.Y2),aWindowBox.Width,aWindowBox.Height), + awt::Rectangle()); + } + + // Paint the horizontal separator. + OSL_ASSERT(mxViewId.is()); + PresenterCanvasHelper::SetDeviceColor(aRenderState, maSeparatorColor); + + mxCanvas->drawLine( + geometry::RealPoint2D(0,mnSeparatorYLocation), + geometry::RealPoint2D(aWindowBox.Width,mnSeparatorYLocation), + aViewState, + aRenderState); +} + +void PresenterNotesView::PaintText (const awt::Rectangle& rUpdateBox) +{ + const awt::Rectangle aBox (PresenterGeometryHelper::Intersection(rUpdateBox, + PresenterGeometryHelper::ConvertRectangle(maTextBoundingBox))); + + if (aBox.Width <= 0 || aBox.Height <= 0) + return; + + if (mpBackground) + { + // Paint the background. + mpPresenterController->GetCanvasHelper()->Paint( + mpBackground, + mxCanvas, + rUpdateBox, + aBox, + awt::Rectangle()); + } + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +void PresenterNotesView::Invalidate() +{ + mpPresenterController->GetPaintManager()->Invalidate( + mxParentWindow, + PresenterGeometryHelper::ConvertRectangle(maTextBoundingBox)); +} + +void PresenterNotesView::Scroll (const double rnDistance) +{ + try + { + mnTop += rnDistance; + mpTextView->SetOffset(0, mnTop); + + UpdateScrollBar(); + Invalidate(); + } + catch (beans::UnknownPropertyException&) + {} +} + +void PresenterNotesView::SetTop (const double nTop) +{ + try + { + mnTop = nTop; + mpTextView->SetOffset(0, mnTop); + + UpdateScrollBar(); + Invalidate(); + } + catch (beans::UnknownPropertyException&) + {} +} + +void PresenterNotesView::ChangeFontSize (const sal_Int32 nSizeChange) +{ + const sal_Int32 nNewSize (mpFont->mnSize + nSizeChange); + if (nNewSize <= 5) + return; + + mpFont->mnSize = nNewSize; + mpFont->mxFont = nullptr; + mpTextView->SetFont(mpFont); + + Layout(); + UpdateScrollBar(); + Invalidate(); + + // Write the new font size to the configuration to make it persistent. + try + { + const OUString sStyleName (mpPresenterController->GetTheme()->GetStyleName( + mxViewId->getResourceURL())); + std::shared_ptr pConfiguration ( + mpPresenterController->GetTheme()->GetNodeForViewStyle( + sStyleName)); + if (pConfiguration == nullptr || !pConfiguration->IsValid()) + return; + + pConfiguration->GoToChild("Font"); + pConfiguration->SetProperty("Size", Any(static_cast(nNewSize+0.5))); + pConfiguration->CommitChanges(); + } + catch (Exception&) + { + OSL_ASSERT(false); + } +} + +const std::shared_ptr& PresenterNotesView::GetTextView() const +{ + return mpTextView; +} + +void PresenterNotesView::UpdateScrollBar() +{ + if (!mpScrollBar) + return; + + try + { + mpScrollBar->SetTotalSize(mpTextView->GetTotalTextHeight()); + } + catch(beans::UnknownPropertyException&) + { + OSL_ASSERT(false); + } + + mpScrollBar->SetLineHeight(mpFont->mnSize*1.2); + mpScrollBar->SetThumbPosition(mnTop, false); + + mpScrollBar->SetThumbSize(maTextBoundingBox.Y2 - maTextBoundingBox.Y1); + mpScrollBar->CheckValues(); +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterNotesView.hxx b/sd/source/console/PresenterNotesView.hxx new file mode 100644 index 0000000000..e2f3139f4b --- /dev/null +++ b/sd/source/console/PresenterNotesView.hxx @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERNOTESVIEW_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERNOTESVIEW_HXX + +#include "PresenterController.hxx" +#include "PresenterToolBar.hxx" +#include "PresenterViewFactory.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { class DrawController; } + +namespace sdext::presenter { + +class PresenterButton; +class PresenterScrollBar; +class PresenterTextView; + +typedef cppu::WeakComponentImplHelper< + css::awt::XWindowListener, + css::awt::XPaintListener, + css::drawing::framework::XView, + css::drawing::XDrawView, + css::awt::XKeyListener + > PresenterNotesViewInterfaceBase; + +/** A drawing framework view of the notes of a slide. At the moment this is + a simple text view that does not show the original formatting of the + notes text. +*/ +class PresenterNotesView + : private ::cppu::BaseMutex, + public PresenterNotesViewInterfaceBase, + public CachablePresenterView +{ +public: + explicit PresenterNotesView ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxViewId, + const ::rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterNotesView() override; + + virtual void SAL_CALL disposing() override; + + /** Typically called from setCurrentSlide() with the notes page that is + associated with the slide given to setCurrentSlide(). + + Iterates over all text shapes on the given notes page and displays + the concatenated text of these. + */ + void SetSlide ( + const css::uno::Reference& rxNotesPage); + + void ChangeFontSize (const sal_Int32 nSizeChange); + + const std::shared_ptr& GetTextView() const; + + // lang::XEventListener + + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XResourceId + + virtual css::uno::Reference SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference& rxSlide) override; + + virtual css::uno::Reference SAL_CALL getCurrentPage() override; + + // XKeyListener + + virtual void SAL_CALL keyPressed (const css::awt::KeyEvent& rEvent) override; + virtual void SAL_CALL keyReleased (const css::awt::KeyEvent& rEvent) override; + +private: + css::uno::Reference mxViewId; + ::rtl::Reference mpPresenterController; + css::uno::Reference mxParentWindow; + css::uno::Reference mxCanvas; + css::uno::Reference mxCurrentNotesPage; + ::rtl::Reference mpScrollBar; + css::uno::Reference mxToolBarWindow; + css::uno::Reference mxToolBarCanvas; + ::rtl::Reference mpToolBar; + ::rtl::Reference mpCloseButton; + css::util::Color maSeparatorColor; + sal_Int32 mnSeparatorYLocation; + css::geometry::RealRectangle2D maTextBoundingBox; + SharedBitmapDescriptor mpBackground; + double mnTop; + PresenterTheme::SharedFontDescriptor mpFont; + std::shared_ptr mpTextView; + + void CreateToolBar ( + const css::uno::Reference& rxContext, + const ::rtl::Reference& rpPresenterController); + void Layout(); + void Paint (const css::awt::Rectangle& rUpdateBox); + void PaintToolBar (const css::awt::Rectangle& rUpdateBox); + void PaintText (const css::awt::Rectangle& rUpdateBox); + void Invalidate(); + void Scroll (const double nDistance); + void SetTop (const double nTop); + void UpdateScrollBar(); +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaintManager.cxx b/sd/source/console/PresenterPaintManager.cxx new file mode 100644 index 0000000000..f7b612d9a0 --- /dev/null +++ b/sd/source/console/PresenterPaintManager.cxx @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPaintManager.hxx" + +#include "PresenterPaneContainer.hxx" +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +PresenterPaintManager::PresenterPaintManager ( + const css::uno::Reference& rxParentWindow, + css::uno::Reference xPresenterHelper, + rtl::Reference xPaneContainer) + : mxParentWindow(rxParentWindow), + mxParentWindowPeer(rxParentWindow, UNO_QUERY), + mxPresenterHelper(std::move(xPresenterHelper)), + mpPaneContainer(std::move(xPaneContainer)) +{ +} + +::std::function + PresenterPaintManager::GetInvalidator ( + const css::uno::Reference& rxWindow) +{ + return [this, rxWindow] (css::awt::Rectangle const& rRepaintBox) + { + return this->Invalidate(rxWindow, rRepaintBox /* , bSynchronous=false */); + }; +} + +void PresenterPaintManager::Invalidate ( + const css::uno::Reference& rxWindow) +{ + sal_Int16 nInvalidateMode (awt::InvalidateStyle::CHILDREN); + + PresenterPaneContainer::SharedPaneDescriptor pDescriptor( + mpPaneContainer->FindContentWindow(rxWindow)); + if (!pDescriptor || ! pDescriptor->mbIsOpaque) + nInvalidateMode |= awt::InvalidateStyle::TRANSPARENT; + else + nInvalidateMode |= awt::InvalidateStyle::NOTRANSPARENT; + + Invalidate(rxWindow, nInvalidateMode); +} + +void PresenterPaintManager::Invalidate ( + const css::uno::Reference& rxWindow, + const sal_Int16 nInvalidateFlags) +{ + if ((nInvalidateFlags & awt::InvalidateStyle::TRANSPARENT) != 0) + { + // Window is transparent and parent window(s) have to be painted as + // well. Invalidate the parent explicitly. + if (mxPresenterHelper.is() && mxParentWindowPeer.is()) + { + const awt::Rectangle aBBox ( + mxPresenterHelper->getWindowExtentsRelative(rxWindow, mxParentWindow)); + mxParentWindowPeer->invalidateRect(aBBox, nInvalidateFlags); + } + } + else + { + Reference xPeer (rxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->invalidate(nInvalidateFlags); + } +} + +void PresenterPaintManager::Invalidate ( + const css::uno::Reference& rxWindow, + const css::awt::Rectangle& rRepaintBox, + const bool bSynchronous) +{ + sal_Int16 nInvalidateMode (awt::InvalidateStyle::CHILDREN); + if (bSynchronous) + nInvalidateMode |= awt::InvalidateStyle::UPDATE; + + PresenterPaneContainer::SharedPaneDescriptor pDescriptor( + mpPaneContainer->FindContentWindow(rxWindow)); + if (!pDescriptor || ! pDescriptor->mbIsOpaque) + nInvalidateMode |= awt::InvalidateStyle::TRANSPARENT; + else + nInvalidateMode |= awt::InvalidateStyle::NOTRANSPARENT; + + Invalidate(rxWindow, rRepaintBox, nInvalidateMode); +} + +void PresenterPaintManager::Invalidate ( + const css::uno::Reference& rxWindow, + const css::awt::Rectangle& rRepaintBox, + const sal_Int16 nInvalidateFlags) +{ + if ((nInvalidateFlags & awt::InvalidateStyle::TRANSPARENT) != 0) + { + // Window is transparent and parent window(s) have to be painted as + // well. Invalidate the parent explicitly. + if (mxPresenterHelper.is() && mxParentWindowPeer.is()) + { + const awt::Rectangle aBBox ( + mxPresenterHelper->getWindowExtentsRelative(rxWindow, mxParentWindow)); + mxParentWindowPeer->invalidateRect( + awt::Rectangle( + rRepaintBox.X + aBBox.X, + rRepaintBox.Y + aBBox.Y, + rRepaintBox.Width, + rRepaintBox.Height), + nInvalidateFlags); + } + } + else + { + Reference xPeer (rxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->invalidateRect(rRepaintBox, nInvalidateFlags); + } +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaintManager.hxx b/sd/source/console/PresenterPaintManager.hxx new file mode 100644 index 0000000000..ad2f6b0cbf --- /dev/null +++ b/sd/source/console/PresenterPaintManager.hxx @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPAINTMANAGER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPAINTMANAGER_HXX + +#include +#include +#include +#include + +#include + +#include "PresenterPaneContainer.hxx" + +namespace sdext::presenter { + +class PresenterPaneContainer; + +/** Synchronize painting of windows and canvases. At the moment there is + just some processing of invalidate calls. + This could be extended to process incoming windowPaint() calls. +*/ +class PresenterPaintManager +{ +public: + /** Create paint manager with the window that is the top node in the + local window hierarchy. + */ + PresenterPaintManager ( + const css::uno::Reference& rxParentWindow, + css::uno::Reference xPresenterHelper, + rtl::Reference xPaneContainer); + + ::std::function + GetInvalidator ( + const css::uno::Reference& rxWindow); + + /** Request a repaint of the whole window. + @param rxWindow + May be the parent window or one of its descendents. + */ + void Invalidate ( + const css::uno::Reference& rxWindow); + void Invalidate ( + const css::uno::Reference& rxWindow, + const sal_Int16 nInvalidateFlags); + + /** Request a repaint of a part of a window. + @param rxWindow + May be the parent window or one of its descendents. + */ + void Invalidate ( + const css::uno::Reference& rxWindow, + const css::awt::Rectangle& rRepaintBox, + const bool bSynchronous = false); + void Invalidate ( + const css::uno::Reference& rxWindow, + const css::awt::Rectangle& rRepaintBox, + const sal_Int16 nInvalidateFlags); + +private: + css::uno::Reference mxParentWindow; + css::uno::Reference mxParentWindowPeer; + css::uno::Reference mxPresenterHelper; + ::rtl::Reference mpPaneContainer; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPane.cxx b/sd/source/console/PresenterPane.cxx new file mode 100644 index 0000000000..ad35315438 --- /dev/null +++ b/sd/source/console/PresenterPane.cxx @@ -0,0 +1,169 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPane.hxx" +#include "PresenterController.hxx" +#include "PresenterPaintManager.hxx" +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +//===== PresenterPane ========================================================= + +PresenterPane::PresenterPane ( + const Reference& rxContext, + const ::rtl::Reference& rpPresenterController) + : PresenterPaneBase(rxContext, rpPresenterController) +{ + Reference xFactory ( + mxComponentContext->getServiceManager(), UNO_SET_THROW); + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + mxComponentContext), + UNO_QUERY_THROW); +} + +PresenterPane::~PresenterPane() +{ +} + +//----- XPane ----------------------------------------------------------------- + +Reference SAL_CALL PresenterPane::getWindow() +{ + ThrowIfDisposed(); + return mxContentWindow; +} + +Reference SAL_CALL PresenterPane::getCanvas() +{ + ThrowIfDisposed(); + return mxContentCanvas; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterPane::windowResized (const awt::WindowEvent& rEvent) +{ + PresenterPaneBase::windowResized(rEvent); + + Invalidate(maBoundingBox); + + LayoutContextWindow(); + ToTop(); + + UpdateBoundingBox(); + Invalidate(maBoundingBox); +} + +void SAL_CALL PresenterPane::windowMoved (const awt::WindowEvent& rEvent) +{ + PresenterPaneBase::windowMoved(rEvent); + + Invalidate(maBoundingBox); + + ToTop(); + + UpdateBoundingBox(); + Invalidate(maBoundingBox); +} + +void SAL_CALL PresenterPane::windowShown (const lang::EventObject& rEvent) +{ + PresenterPaneBase::windowShown(rEvent); + + ToTop(); + + if (mxContentWindow.is()) + { + LayoutContextWindow(); + mxContentWindow->setVisible(true); + } + + UpdateBoundingBox(); + Invalidate(maBoundingBox); +} + +void SAL_CALL PresenterPane::windowHidden (const lang::EventObject& rEvent) +{ + PresenterPaneBase::windowHidden(rEvent); + + if (mxContentWindow.is()) + mxContentWindow->setVisible(false); +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterPane::windowPaint (const awt::PaintEvent& rEvent) +{ + ThrowIfDisposed(); + + PaintBorder(rEvent.UpdateRect); +} + + +void PresenterPane::CreateCanvases ( + const Reference& rxParentCanvas) +{ + if ( ! mxPresenterHelper.is()) + return; + if ( ! mxParentWindow.is()) + return; + if ( ! rxParentCanvas.is()) + return; + + mxBorderCanvas = mxPresenterHelper->createSharedCanvas( + rxParentCanvas, + mxParentWindow, + rxParentCanvas, + mxParentWindow, + mxBorderWindow); + mxContentCanvas = mxPresenterHelper->createSharedCanvas( + rxParentCanvas, + mxParentWindow, + rxParentCanvas, + mxParentWindow, + mxContentWindow); + + PaintBorder(mxBorderWindow->getPosSize()); +} + +void PresenterPane::Invalidate (const css::awt::Rectangle& rRepaintBox) +{ + // Invalidate the parent window to be able to invalidate an area outside + // the current window area. + mpPresenterController->GetPaintManager()->Invalidate(mxParentWindow, rRepaintBox); +} + +void PresenterPane::UpdateBoundingBox() +{ + if (mxBorderWindow.is() && IsVisible()) + maBoundingBox = mxBorderWindow->getPosSize(); + else + maBoundingBox = awt::Rectangle(); +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPane.hxx b/sd/source/console/PresenterPane.hxx new file mode 100644 index 0000000000..2a057229f8 --- /dev/null +++ b/sd/source/console/PresenterPane.hxx @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANE_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANE_HXX + +#include "PresenterPaneBase.hxx" +#include +#include +#include + +namespace sdext::presenter +{ +/** Pane used by the presenter screen. Pane objects are stored in the + PresenterPaneContainer. Sizes and positions are controlled + by the PresenterWindowManager. Interactive positioning and resizing is + managed by the PresenterPaneBorderManager. Borders around panes are + painted by the PresenterPaneBorderPainter. +*/ +class PresenterPane : public PresenterPaneBase +{ +public: + PresenterPane(const css::uno::Reference& rxContext, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterPane() override; + + // XPane + + css::uno::Reference SAL_CALL getWindow() override; + + css::uno::Reference SAL_CALL getCanvas() override; + + // XWindowListener + + virtual void SAL_CALL windowResized(const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved(const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown(const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden(const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint(const css::awt::PaintEvent& rEvent) override; + +private: + /** Store the bounding box so that when the window is resized or moved + we still know the old position and size. + */ + css::awt::Rectangle maBoundingBox; + + virtual void CreateCanvases( + const css::uno::Reference& rxParentCanvas) override; + + void Invalidate(const css::awt::Rectangle& rRepaintBox); + void UpdateBoundingBox(); +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneBase.cxx b/sd/source/console/PresenterPaneBase.cxx new file mode 100644 index 0000000000..33dc38a1ac --- /dev/null +++ b/sd/source/console/PresenterPaneBase.cxx @@ -0,0 +1,343 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPaneBase.hxx" +#include "PresenterController.hxx" +#include "PresenterPaintManager.hxx" +#include +#include +#include + +using namespace css; +using namespace css::uno; +using namespace css::drawing::framework; + +namespace sdext::presenter { + +//===== PresenterPaneBase ===================================================== + +PresenterPaneBase::PresenterPaneBase ( + const Reference& rxContext, + ::rtl::Reference xPresenterController) + : PresenterPaneBaseInterfaceBase(m_aMutex), + mpPresenterController(std::move(xPresenterController)), + mxComponentContext(rxContext) +{ + if (mpPresenterController) + mxPresenterHelper = mpPresenterController->GetPresenterHelper(); +} + +PresenterPaneBase::~PresenterPaneBase() +{ +} + +void PresenterPaneBase::disposing() +{ + if (mxBorderWindow.is()) + { + mxBorderWindow->removeWindowListener(this); + mxBorderWindow->removePaintListener(this); + } + + { + Reference xComponent (mxContentCanvas, UNO_QUERY); + mxContentCanvas = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + { + Reference xComponent = mxContentWindow; + mxContentWindow = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + { + Reference xComponent (mxBorderCanvas, UNO_QUERY); + mxBorderCanvas = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + { + Reference xComponent = mxBorderWindow; + mxBorderWindow = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + mxComponentContext = nullptr; +} + +void PresenterPaneBase::SetTitle (const OUString& rsTitle) +{ + msTitle = rsTitle; + + OSL_ASSERT(mpPresenterController); + OSL_ASSERT(mpPresenterController->GetPaintManager() != nullptr); + + mpPresenterController->GetPaintManager()->Invalidate(mxBorderWindow); +} + +const OUString& PresenterPaneBase::GetTitle() const +{ + return msTitle; +} + +const Reference& + PresenterPaneBase::GetPaneBorderPainter() const +{ + return mxBorderPainter; +} + +//----- XInitialization ------------------------------------------------------- + +void SAL_CALL PresenterPaneBase::initialize (const Sequence& rArguments) +{ + ThrowIfDisposed(); + + if ( ! mxComponentContext.is()) + { + throw RuntimeException( + "PresenterSpritePane: missing component context", + static_cast(this)); + } + + if (rArguments.getLength() != 5 && rArguments.getLength() != 6) + { + throw RuntimeException( + "PresenterSpritePane: invalid number of arguments", + static_cast(this)); + } + + try + { + // Get the resource id from the first argument. + if ( ! (rArguments[0] >>= mxPaneId)) + { + throw lang::IllegalArgumentException( + "PresenterPane: invalid pane id", + static_cast(this), + 0); + } + + if ( ! (rArguments[1] >>= mxParentWindow)) + { + throw lang::IllegalArgumentException( + "PresenterPane: invalid parent window", + static_cast(this), + 1); + } + + Reference xParentCanvas; + if ( ! (rArguments[2] >>= xParentCanvas)) + { + throw lang::IllegalArgumentException( + "PresenterPane: invalid parent canvas", + static_cast(this), + 2); + } + + if ( ! (rArguments[3] >>= msTitle)) + { + throw lang::IllegalArgumentException( + "PresenterPane: invalid title", + static_cast(this), + 3); + } + + if ( ! (rArguments[4] >>= mxBorderPainter)) + { + throw lang::IllegalArgumentException( + "PresenterPane: invalid border painter", + static_cast(this), + 4); + } + + bool bIsWindowVisibleOnCreation (true); + if (rArguments.getLength()>5 && ! (rArguments[5] >>= bIsWindowVisibleOnCreation)) + { + throw lang::IllegalArgumentException( + "PresenterPane: invalid window visibility flag", + static_cast(this), + 5); + } + + CreateWindows(bIsWindowVisibleOnCreation); + + if (mxBorderWindow.is()) + { + mxBorderWindow->addWindowListener(this); + mxBorderWindow->addPaintListener(this); + } + + CreateCanvases(xParentCanvas); + + // Raise new windows. + ToTop(); + } + catch (Exception&) + { + mxContentWindow = nullptr; + mxComponentContext = nullptr; + throw; + } +} + +//----- XResourceId ----------------------------------------------------------- + +Reference SAL_CALL PresenterPaneBase::getResourceId() +{ + ThrowIfDisposed(); + return mxPaneId; +} + +sal_Bool SAL_CALL PresenterPaneBase::isAnchorOnly() +{ + return true; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterPaneBase::windowResized (const awt::WindowEvent&) +{ + ThrowIfDisposed(); +} + +void SAL_CALL PresenterPaneBase::windowMoved (const awt::WindowEvent&) +{ + ThrowIfDisposed(); +} + +void SAL_CALL PresenterPaneBase::windowShown (const lang::EventObject&) +{ + ThrowIfDisposed(); +} + +void SAL_CALL PresenterPaneBase::windowHidden (const lang::EventObject&) +{ + ThrowIfDisposed(); +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterPaneBase::disposing (const lang::EventObject& rEvent) +{ + if (rEvent.Source == mxBorderWindow) + { + mxBorderWindow = nullptr; + } +} + + +void PresenterPaneBase::CreateWindows ( + const bool bIsWindowVisibleOnCreation) +{ + if (!(mxPresenterHelper.is() && mxParentWindow.is())) + return; + + mxBorderWindow = mxPresenterHelper->createWindow( + mxParentWindow, + false, + bIsWindowVisibleOnCreation, + false, + false); + mxContentWindow = mxPresenterHelper->createWindow( + mxBorderWindow, + false, + bIsWindowVisibleOnCreation, + false, + false); +} + +const Reference& PresenterPaneBase::GetBorderWindow() const +{ + return mxBorderWindow; +} + +void PresenterPaneBase::ToTop() +{ + if (mxPresenterHelper.is()) + mxPresenterHelper->toTop(mxContentWindow); +} + +void PresenterPaneBase::PaintBorder (const awt::Rectangle& rUpdateBox) +{ + OSL_ASSERT(mxPaneId.is()); + + if (!(mxBorderPainter.is() && mxBorderWindow.is() && mxBorderCanvas.is())) + return; + + awt::Rectangle aBorderBox (mxBorderWindow->getPosSize()); + awt::Rectangle aLocalBorderBox (0,0, aBorderBox.Width, aBorderBox.Height); + + //TODO: paint border background? + + mxBorderPainter->paintBorder( + mxPaneId->getResourceURL(), + mxBorderCanvas, + aLocalBorderBox, + rUpdateBox, + msTitle); +} + +void PresenterPaneBase::LayoutContextWindow() +{ + OSL_ASSERT(mxPaneId.is()); + OSL_ASSERT(mxBorderWindow.is()); + OSL_ASSERT(mxContentWindow.is()); + if (!(mxBorderPainter.is() && mxPaneId.is() && mxBorderWindow.is() && mxContentWindow.is())) + return; + + const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize()); + const awt::Rectangle aInnerBox (mxBorderPainter->removeBorder( + mxPaneId->getResourceURL(), + aBorderBox, + drawing::framework::BorderType_TOTAL_BORDER)); + mxContentWindow->setPosSize( + aInnerBox.X - aBorderBox.X, + aInnerBox.Y - aBorderBox.Y, + aInnerBox.Width, + aInnerBox.Height, + awt::PosSize::POSSIZE); +} + +bool PresenterPaneBase::IsVisible() const +{ + Reference xWindow2 (mxBorderPainter, UNO_QUERY); + if (xWindow2.is()) + return xWindow2->isVisible(); + + return false; +} + +void PresenterPaneBase::ThrowIfDisposed() +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterPane object has already been disposed", + static_cast(this)); + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneBase.hxx b/sd/source/console/PresenterPaneBase.hxx new file mode 100644 index 0000000000..3264797fce --- /dev/null +++ b/sd/source/console/PresenterPaneBase.hxx @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBASE_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBASE_HXX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sdext::presenter { + +class PresenterController; + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XPane, + css::lang::XInitialization, + css::awt::XWindowListener, + css::awt::XPaintListener +> PresenterPaneBaseInterfaceBase; + +/** Base class of the panes used by the presenter screen. Pane objects are + stored in the PresenterPaneContainer. Sizes and positions are + controlled by the PresenterWindowManager. Interactive positioning and + resizing is managed by the PresenterPaneBorderManager. Borders around + panes are painted by the PresenterPaneBorderPainter. +*/ +class PresenterPaneBase + : protected ::cppu::BaseMutex, + public PresenterPaneBaseInterfaceBase +{ +public: + PresenterPaneBase ( + const css::uno::Reference& rxContext, + ::rtl::Reference xPresenterController); + virtual ~PresenterPaneBase() override; + PresenterPaneBase(const PresenterPaneBase&) = delete; + PresenterPaneBase& operator=(const PresenterPaneBase&) = delete; + + virtual void SAL_CALL disposing() override; + + const css::uno::Reference& GetBorderWindow() const; + void SetTitle (const OUString& rsTitle); + const OUString& GetTitle() const; + const css::uno::Reference& GetPaneBorderPainter() const; + + // XInitialization + + virtual void SAL_CALL initialize (const css::uno::Sequence& rArguments) override; + + // XResourceId + + virtual css::uno::Reference SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // lang::XEventListener + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + +protected: + ::rtl::Reference mpPresenterController; + css::uno::Reference mxParentWindow; + css::uno::Reference mxBorderWindow; + css::uno::Reference mxBorderCanvas; + css::uno::Reference mxContentWindow; + css::uno::Reference mxContentCanvas; + css::uno::Reference mxPaneId; + css::uno::Reference mxBorderPainter; + css::uno::Reference mxPresenterHelper; + OUString msTitle; + css::uno::Reference mxComponentContext; + + virtual void CreateCanvases ( + const css::uno::Reference& rxParentCanvas) = 0; + + void CreateWindows ( + const bool bIsWindowVisibleOnCreation); + void PaintBorder (const css::awt::Rectangle& rUpdateRectangle); + void ToTop(); + void LayoutContextWindow(); + bool IsVisible() const; + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneBorderPainter.cxx b/sd/source/console/PresenterPaneBorderPainter.cxx new file mode 100644 index 0000000000..fac17dd9d6 --- /dev/null +++ b/sd/source/console/PresenterPaneBorderPainter.cxx @@ -0,0 +1,883 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPaneBorderPainter.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterTheme.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +namespace { + class BorderSize + { + public: + BorderSize(); + sal_Int32 mnLeft; + sal_Int32 mnTop; + sal_Int32 mnRight; + sal_Int32 mnBottom; + }; + + class RendererPaneStyle + { + public: + RendererPaneStyle ( + const std::shared_ptr& rpTheme, + const OUString& rsStyleName); + + awt::Rectangle AddBorder ( + const awt::Rectangle& rBox, + drawing::framework::BorderType eBorderType) const; + awt::Rectangle RemoveBorder ( + const awt::Rectangle& rBox, + drawing::framework::BorderType eBorderType) const; + Reference GetFont ( + const Reference& rxCanvas) const; + + SharedBitmapDescriptor mpTopLeft; + SharedBitmapDescriptor mpTop; + SharedBitmapDescriptor mpTopRight; + SharedBitmapDescriptor mpLeft; + SharedBitmapDescriptor mpRight; + SharedBitmapDescriptor mpBottomLeft; + SharedBitmapDescriptor mpBottom; + SharedBitmapDescriptor mpBottomRight; + SharedBitmapDescriptor mpBottomCallout; + SharedBitmapDescriptor mpEmpty; + PresenterTheme::SharedFontDescriptor mpFont; + sal_Int32 mnFontXOffset; + sal_Int32 mnFontYOffset; + enum class Anchor { Left, Right, Center }; + Anchor meFontAnchor; + BorderSize maInnerBorderSize; + BorderSize maOuterBorderSize; + BorderSize maTotalBorderSize; + private: + void UpdateBorderSizes(); + SharedBitmapDescriptor GetBitmap( + const std::shared_ptr& rpTheme, + const OUString& rsStyleName, + const OUString& rsBitmapName); + }; +} + +class PresenterPaneBorderPainter::Renderer +{ +public: + Renderer ( + const Reference& rxContext, + std::shared_ptr xTheme); + + void SetCanvas (const Reference& rxCanvas); + void PaintBorder ( + const OUString& rsTitle, + const awt::Rectangle& rBBox, + const awt::Rectangle& rUpdateBox, + const OUString& rsPaneURL); + void PaintTitle ( + const OUString& rsTitle, + const std::shared_ptr& rpStyle, + const awt::Rectangle& rUpdateBox, + const awt::Rectangle& rOuterBox, + const awt::Rectangle& rInnerBox); + void SetupClipping ( + const awt::Rectangle& rUpdateBox, + const awt::Rectangle& rOuterBox, + const OUString& rsPaneStyleName); + std::shared_ptr GetRendererPaneStyle (const OUString& rsResourceURL); + void SetCalloutAnchor ( + const awt::Point& rCalloutAnchor); + +private: + std::shared_ptr mpTheme; + typedef ::std::map > RendererPaneStyleContainer; + RendererPaneStyleContainer maRendererPaneStyles; + Reference mxCanvas; + Reference mxPresenterHelper; + css::rendering::ViewState maViewState; + Reference mxViewStateClip; + bool mbHasCallout; + awt::Point maCalloutAnchor; + + void PaintBitmap( + const awt::Rectangle& rBox, + const awt::Rectangle& rUpdateBox, + const sal_Int32 nXPosition, + const sal_Int32 nYPosition, + const sal_Int32 nStartOffset, + const sal_Int32 nEndOffset, + const bool bExpand, + const SharedBitmapDescriptor& rpBitmap); +}; + +// ===== PresenterPaneBorderPainter =========================================== + +PresenterPaneBorderPainter::PresenterPaneBorderPainter ( + const Reference& rxContext) + : PresenterPaneBorderPainterInterfaceBase(m_aMutex), + mxContext(rxContext) +{ +} + +PresenterPaneBorderPainter::~PresenterPaneBorderPainter() +{ +} + +//----- XPaneBorderPainter ---------------------------------------------------- + +awt::Rectangle SAL_CALL PresenterPaneBorderPainter::addBorder ( + const OUString& rsPaneBorderStyleName, + const css::awt::Rectangle& rRectangle, + drawing::framework::BorderType eBorderType) +{ + ThrowIfDisposed(); + + ProvideTheme(); + + return AddBorder(rsPaneBorderStyleName, rRectangle, eBorderType); +} + +awt::Rectangle SAL_CALL PresenterPaneBorderPainter::removeBorder ( + const OUString& rsPaneBorderStyleName, + const css::awt::Rectangle& rRectangle, + drawing::framework::BorderType eBorderType) +{ + ThrowIfDisposed(); + + ProvideTheme(); + + return RemoveBorder(rsPaneBorderStyleName, rRectangle, eBorderType); +} + +void SAL_CALL PresenterPaneBorderPainter::paintBorder ( + const OUString& rsPaneBorderStyleName, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rOuterBorderRectangle, + const css::awt::Rectangle& rRepaintArea, + const OUString& rsTitle) +{ + ThrowIfDisposed(); + + // Early reject paints completely outside the repaint area. + if (rRepaintArea.X >= rOuterBorderRectangle.X+rOuterBorderRectangle.Width + || rRepaintArea.Y >= rOuterBorderRectangle.Y+rOuterBorderRectangle.Height + || rRepaintArea.X+rRepaintArea.Width <= rOuterBorderRectangle.X + || rRepaintArea.Y+rRepaintArea.Height <= rOuterBorderRectangle.Y) + { + return; + } + ProvideTheme(rxCanvas); + + if (mpRenderer == nullptr) + return; + + mpRenderer->SetCanvas(rxCanvas); + mpRenderer->SetupClipping( + rRepaintArea, + rOuterBorderRectangle, + rsPaneBorderStyleName); + mpRenderer->PaintBorder( + rsTitle, + rOuterBorderRectangle, + rRepaintArea, + rsPaneBorderStyleName); +} + +void SAL_CALL PresenterPaneBorderPainter::paintBorderWithCallout ( + const OUString& rsPaneBorderStyleName, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rOuterBorderRectangle, + const css::awt::Rectangle& rRepaintArea, + const OUString& rsTitle, + const css::awt::Point& rCalloutAnchor) +{ + ThrowIfDisposed(); + + // Early reject paints completely outside the repaint area. + if (rRepaintArea.X >= rOuterBorderRectangle.X+rOuterBorderRectangle.Width + || rRepaintArea.Y >= rOuterBorderRectangle.Y+rOuterBorderRectangle.Height + || rRepaintArea.X+rRepaintArea.Width <= rOuterBorderRectangle.X + || rRepaintArea.Y+rRepaintArea.Height <= rOuterBorderRectangle.Y) + { + return; + } + ProvideTheme(rxCanvas); + + if (mpRenderer == nullptr) + return; + + mpRenderer->SetCanvas(rxCanvas); + mpRenderer->SetupClipping( + rRepaintArea, + rOuterBorderRectangle, + rsPaneBorderStyleName); + mpRenderer->SetCalloutAnchor(rCalloutAnchor); + mpRenderer->PaintBorder( + rsTitle, + rOuterBorderRectangle, + rRepaintArea, + rsPaneBorderStyleName); +} + +awt::Point SAL_CALL PresenterPaneBorderPainter::getCalloutOffset ( + const OUString& rsPaneBorderStyleName) +{ + ThrowIfDisposed(); + ProvideTheme(); + if (mpRenderer != nullptr) + { + const std::shared_ptr pRendererPaneStyle( + mpRenderer->GetRendererPaneStyle(rsPaneBorderStyleName)); + if (pRendererPaneStyle != nullptr && pRendererPaneStyle->mpBottomCallout) + { + return awt::Point ( + 0, + pRendererPaneStyle->mpBottomCallout->mnHeight + - pRendererPaneStyle->mpBottomCallout->mnYHotSpot); + } + } + + return awt::Point(0,0); +} + + +bool PresenterPaneBorderPainter::ProvideTheme (const Reference& rxCanvas) +{ + bool bModified (false); + + if ( ! mxContext.is()) + return false; + + if (mpTheme != nullptr) + { + // Check if the theme already has a canvas. + if ( ! mpTheme->HasCanvas()) + { + mpTheme->ProvideCanvas(rxCanvas); + bModified = true; + } + } + else + { + mpTheme = std::make_shared(mxContext, rxCanvas); + bModified = true; + } + + if (bModified) + { + if (mpRenderer == nullptr) + mpRenderer.reset(new Renderer(mxContext, mpTheme)); + else + mpRenderer->SetCanvas(rxCanvas); + } + + return bModified; +} + +void PresenterPaneBorderPainter::ProvideTheme() +{ + if (mpTheme == nullptr) + { + // Create a theme without bitmaps (no canvas => no bitmaps). + ProvideTheme(nullptr); + } + // When there already is a theme then without a canvas we can not + // add anything new. +} + +void PresenterPaneBorderPainter::SetTheme (const std::shared_ptr& rpTheme) +{ + mpTheme = rpTheme; + if (mpRenderer == nullptr) + mpRenderer.reset(new Renderer(mxContext, mpTheme)); +} + +awt::Rectangle PresenterPaneBorderPainter::AddBorder ( + const OUString& rsPaneURL, + const awt::Rectangle& rInnerBox, + const css::drawing::framework::BorderType eBorderType) const +{ + if (mpRenderer != nullptr) + { + const std::shared_ptr pRendererPaneStyle(mpRenderer->GetRendererPaneStyle(rsPaneURL)); + if (pRendererPaneStyle != nullptr) + return pRendererPaneStyle->AddBorder(rInnerBox, eBorderType); + } + return rInnerBox; +} + +awt::Rectangle PresenterPaneBorderPainter::RemoveBorder ( + const OUString& rsPaneURL, + const css::awt::Rectangle& rOuterBox, + const css::drawing::framework::BorderType eBorderType) const +{ + if (mpRenderer != nullptr) + { + const std::shared_ptr pRendererPaneStyle(mpRenderer->GetRendererPaneStyle(rsPaneURL)); + if (pRendererPaneStyle != nullptr) + return pRendererPaneStyle->RemoveBorder(rOuterBox, eBorderType); + } + return rOuterBox; +} + +void PresenterPaneBorderPainter::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterPaneBorderPainter object has already been disposed", + const_cast(static_cast(this))); + } +} + +//===== PresenterPaneBorderPainter::Renderer ===================================== + +PresenterPaneBorderPainter::Renderer::Renderer ( + const Reference& rxContext, + std::shared_ptr xTheme) + : mpTheme(std::move(xTheme)), + maViewState(geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr), + mbHasCallout(false) +{ + Reference xFactory (rxContext->getServiceManager()); + if (xFactory.is()) + { + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + rxContext), + UNO_QUERY_THROW); + } +} + +void PresenterPaneBorderPainter::Renderer::SetCanvas (const Reference& rxCanvas) +{ + if (mxCanvas != rxCanvas) + { + mxCanvas = rxCanvas; + } +} + +void PresenterPaneBorderPainter::Renderer::PaintBorder ( + const OUString& rsTitle, + const awt::Rectangle& rBBox, + const awt::Rectangle& rUpdateBox, + const OUString& rsPaneURL) +{ + if ( ! mxCanvas.is()) + return; + + // Create the outer and inner border of the, ahm, border. + std::shared_ptr pStyle (GetRendererPaneStyle(rsPaneURL)); + if (pStyle == nullptr) + return; + + awt::Rectangle aOuterBox (rBBox); + awt::Rectangle aCenterBox ( + pStyle->RemoveBorder(aOuterBox, drawing::framework::BorderType_OUTER_BORDER)); + awt::Rectangle aInnerBox ( + pStyle->RemoveBorder(aOuterBox, drawing::framework::BorderType_TOTAL_BORDER)); + + // Prepare references for all used bitmaps. + SharedBitmapDescriptor pTop (pStyle->mpTop); + SharedBitmapDescriptor pTopLeft (pStyle->mpTopLeft); + SharedBitmapDescriptor pTopRight (pStyle->mpTopRight); + SharedBitmapDescriptor pLeft (pStyle->mpLeft); + SharedBitmapDescriptor pRight (pStyle->mpRight); + SharedBitmapDescriptor pBottomLeft (pStyle->mpBottomLeft); + SharedBitmapDescriptor pBottomRight (pStyle->mpBottomRight); + SharedBitmapDescriptor pBottom (pStyle->mpBottom); + + // Paint the sides. + PaintBitmap(aCenterBox, rUpdateBox, 0,-1, + pTopLeft->mnXOffset, pTopRight->mnXOffset, true, pTop); + PaintBitmap(aCenterBox, rUpdateBox, -1,0, + pTopLeft->mnYOffset, pBottomLeft->mnYOffset, true, pLeft); + PaintBitmap(aCenterBox, rUpdateBox, +1,0, + pTopRight->mnYOffset, pBottomRight->mnYOffset, true, pRight); + if (mbHasCallout && pStyle->mpBottomCallout->GetNormalBitmap().is()) + { + const sal_Int32 nCalloutWidth (pStyle->mpBottomCallout->mnWidth); + sal_Int32 nCalloutX (maCalloutAnchor.X - pStyle->mpBottomCallout->mnXHotSpot + - (aCenterBox.X - aOuterBox.X)); + if (nCalloutX < pBottomLeft->mnXOffset + aCenterBox.X) + nCalloutX = pBottomLeft->mnXOffset + aCenterBox.X; + if (nCalloutX > pBottomRight->mnXOffset + aCenterBox.X + aCenterBox.Width) + nCalloutX = pBottomRight->mnXOffset + aCenterBox.X + aCenterBox.Width; + // Paint bottom callout. + PaintBitmap(aCenterBox, rUpdateBox, 0,+1, nCalloutX,0, false, pStyle->mpBottomCallout); + // Paint regular bottom bitmap left and right. + PaintBitmap(aCenterBox, rUpdateBox, 0,+1, + pBottomLeft->mnXOffset, nCalloutX-aCenterBox.Width, true, pBottom); + PaintBitmap(aCenterBox, rUpdateBox, 0,+1, + nCalloutX+nCalloutWidth, pBottomRight->mnXOffset, true, pBottom); + } + else + { + // Stretch the bottom bitmap over the full width. + PaintBitmap(aCenterBox, rUpdateBox, 0,+1, + pBottomLeft->mnXOffset, pBottomRight->mnXOffset, true, pBottom); + } + + // Paint the corners. + PaintBitmap(aCenterBox, rUpdateBox, -1,-1, 0,0, false, pTopLeft); + PaintBitmap(aCenterBox, rUpdateBox, +1,-1, 0,0, false, pTopRight); + PaintBitmap(aCenterBox, rUpdateBox, -1,+1, 0,0, false, pBottomLeft); + PaintBitmap(aCenterBox, rUpdateBox, +1,+1, 0,0, false, pBottomRight); + + // Paint the title. + PaintTitle(rsTitle, pStyle, rUpdateBox, aOuterBox, aInnerBox); + + // In a double buffering environment request to make the changes visible. + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +void PresenterPaneBorderPainter::Renderer::PaintTitle ( + const OUString& rsTitle, + const std::shared_ptr& rpStyle, + const awt::Rectangle& rUpdateBox, + const awt::Rectangle& rOuterBox, + const awt::Rectangle& rInnerBox) +{ + if ( ! mxCanvas.is()) + return; + + if (rsTitle.isEmpty()) + return; + + Reference xFont (rpStyle->GetFont(mxCanvas)); + if ( ! xFont.is()) + return; + + rendering::StringContext aContext ( + rsTitle, + 0, + rsTitle.getLength()); + Reference xLayout (xFont->createTextLayout( + aContext, + rendering::TextDirection::WEAK_LEFT_TO_RIGHT, + 0)); + if ( ! xLayout.is()) + return; + + /// this is responsible of the texts above the slide windows + geometry::RealRectangle2D aBox (xLayout->queryTextBounds()); + const double nTextHeight = aBox.Y2 - aBox.Y1; + const double nTextWidth = aBox.X1 + aBox.X2; + const sal_Int32 nTitleBarHeight = rInnerBox.Y - rOuterBox.Y - 1; + double nY = rOuterBox.Y + (nTitleBarHeight - nTextHeight) / 2 - aBox.Y1; + if (nY >= rInnerBox.Y) + nY = rInnerBox.Y - 1; + double nX; + switch (rpStyle->meFontAnchor) + { + case RendererPaneStyle::Anchor::Left: + nX = rInnerBox.X; + break; + case RendererPaneStyle::Anchor::Right: + nX = rInnerBox.X + rInnerBox.Width - nTextWidth; + break; + default: // RendererPaneStyle::Anchor::Center + nX = rInnerBox.X + (rInnerBox.Width - nTextWidth)/2; + break; + } + nX += rpStyle->mnFontXOffset; + nY += rpStyle->mnFontYOffset; + + if (rUpdateBox.X >= nX+nTextWidth + || rUpdateBox.Y >= nY+nTextHeight + || rUpdateBox.X+rUpdateBox.Width <= nX + || rUpdateBox.Y+rUpdateBox.Height <= nY) + { + return; + } + + rendering::RenderState aRenderState( + geometry::AffineMatrix2D(1,0,nX, 0,1,nY), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + PresenterCanvasHelper::SetDeviceColor( + aRenderState, + rpStyle->mpFont->mnColor); + + mxCanvas->drawTextLayout ( + xLayout, + maViewState, + aRenderState); +} + +std::shared_ptr + PresenterPaneBorderPainter::Renderer::GetRendererPaneStyle (const OUString& rsResourceURL) +{ + OSL_ASSERT(mpTheme != nullptr); + + RendererPaneStyleContainer::const_iterator iStyle (maRendererPaneStyles.find(rsResourceURL)); + if (iStyle == maRendererPaneStyles.end()) + { + OUString sPaneStyleName ("DefaultRendererPaneStyle"); + + // Get pane layout name for resource URL. + const OUString sStyleName (mpTheme->GetStyleName(rsResourceURL)); + if (!sStyleName.isEmpty()) + sPaneStyleName = sStyleName; + + // Create a new pane style object and initialize it with bitmaps. + auto pStyle = std::make_shared(mpTheme,sPaneStyleName); + iStyle = maRendererPaneStyles.emplace(rsResourceURL, pStyle).first; + } + if (iStyle != maRendererPaneStyles.end()) + return iStyle->second; + else + return std::shared_ptr(); +} + +void PresenterPaneBorderPainter::Renderer::SetCalloutAnchor ( + const awt::Point& rCalloutAnchor) +{ + mbHasCallout = true; + maCalloutAnchor = rCalloutAnchor; +} + +void PresenterPaneBorderPainter::Renderer::PaintBitmap( + const awt::Rectangle& rBox, + const awt::Rectangle& rUpdateBox, + const sal_Int32 nXPosition, + const sal_Int32 nYPosition, + const sal_Int32 nStartOffset, + const sal_Int32 nEndOffset, + const bool bExpand, + const SharedBitmapDescriptor& rpBitmap) +{ + bool bUseCanvas (mxCanvas.is()); + if ( ! bUseCanvas) + return; + + if (rpBitmap->mnWidth<=0 || rpBitmap->mnHeight<=0) + return; + + Reference xBitmap = rpBitmap->GetNormalBitmap(); + if ( ! xBitmap.is()) + return; + + // Calculate position, and for side bitmaps, the size. + sal_Int32 nX = 0; + sal_Int32 nY = 0; + sal_Int32 nW = rpBitmap->mnWidth; + sal_Int32 nH = rpBitmap->mnHeight; + if (nXPosition < 0) + { + nX = rBox.X - rpBitmap->mnWidth + rpBitmap->mnXOffset; + } + else if (nXPosition > 0) + { + nX = rBox.X + rBox.Width + rpBitmap->mnXOffset; + } + else + { + nX = rBox.X + nStartOffset; + if (bExpand) + nW = rBox.Width - nStartOffset + nEndOffset; + } + + if (nYPosition < 0) + { + nY = rBox.Y - rpBitmap->mnHeight + rpBitmap->mnYOffset; + } + else if (nYPosition > 0) + { + nY = rBox.Y + rBox.Height + rpBitmap->mnYOffset; + } + else + { + nY = rBox.Y + nStartOffset; + if (bExpand) + nH = rBox.Height - nStartOffset + nEndOffset; + } + + // Do not paint when bitmap area does not intersect with update box. + if (nX >= rUpdateBox.X + rUpdateBox.Width + || nX+nW <= rUpdateBox.X + || nY >= rUpdateBox.Y + rUpdateBox.Height + || nY+nH <= rUpdateBox.Y) + { + return; + } + + /* + Reference xMaskedBitmap ( + PresenterBitmapHelper::FillMaskedWithColor ( + mxCanvas, + Reference(xBitmap, UNO_QUERY), + rBitmap.mxMaskBitmap, + 0x00ff0000, + rBackgroundBitmap.maReplacementColor)); + if (xMaskedBitmap.is()) + xBitmap = xMaskedBitmap; + else if (rBitmap.mxMaskBitmap.is() && mxPresenterHelper.is()) + { + const static sal_Int32 nOutsideMaskColor (0x00ff0000); + Reference xMask ( + mxPresenterHelper->createMask( + mxCanvas, + rBitmap.mxMaskBitmap, + nOutsideMaskColor, + false)); + xBitmap = mxPresenterHelper->applyBitmapMaskWithColor( + mxCanvas, + Reference(xBitmap, UNO_QUERY), + xMask, + rBackgroundBitmap.maReplacementColor); + } + */ + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D( + double(nW)/rpBitmap->mnWidth, 0, nX, + 0, double(nH)/rpBitmap->mnHeight, nY), + nullptr, + Sequence(4), + rendering::CompositeOperation::OVER); + + if (xBitmap.is()) + mxCanvas->drawBitmap( + xBitmap, + maViewState, + aRenderState); +} + +void PresenterPaneBorderPainter::Renderer::SetupClipping ( + const awt::Rectangle& rUpdateBox, + const awt::Rectangle& rOuterBox, + const OUString& rsPaneStyleName) +{ + mxViewStateClip = nullptr; + maViewState.Clip = nullptr; + + if ( ! mxCanvas.is()) + return; + + std::shared_ptr pStyle (GetRendererPaneStyle(rsPaneStyleName)); + if (pStyle == nullptr) + { + mxViewStateClip = PresenterGeometryHelper::CreatePolygon( + rUpdateBox, + mxCanvas->getDevice()); + } + else + { + awt::Rectangle aInnerBox ( + pStyle->RemoveBorder(rOuterBox, drawing::framework::BorderType_TOTAL_BORDER)); + ::std::vector aRectangles + { + PresenterGeometryHelper::Intersection(rUpdateBox, rOuterBox), + PresenterGeometryHelper::Intersection(rUpdateBox, aInnerBox) + }; + mxViewStateClip = PresenterGeometryHelper::CreatePolygon( + aRectangles, + mxCanvas->getDevice()); + if (mxViewStateClip.is()) + mxViewStateClip->setFillRule(rendering::FillRule_EVEN_ODD); + } + maViewState.Clip = mxViewStateClip; +} + +namespace { + +//===== BorderSize ============================================================ + +BorderSize::BorderSize() + : mnLeft(0), + mnTop(0), + mnRight(0), + mnBottom(0) +{ +} + +//===== RendererPaneStyle ============================================================ + +RendererPaneStyle::RendererPaneStyle ( + const std::shared_ptr& rpTheme, + const OUString& rsStyleName) + : mpEmpty(std::make_shared()), + mnFontXOffset(0), + mnFontYOffset(0), + meFontAnchor(Anchor::Center) +{ + if (rpTheme == nullptr) + return; + + mpTopLeft = GetBitmap(rpTheme, rsStyleName, "TopLeft"); + mpTop = GetBitmap(rpTheme, rsStyleName, "Top"); + mpTopRight = GetBitmap(rpTheme, rsStyleName, "TopRight"); + mpLeft = GetBitmap(rpTheme, rsStyleName,"Left"); + mpRight = GetBitmap(rpTheme, rsStyleName, "Right"); + mpBottomLeft = GetBitmap(rpTheme, rsStyleName, "BottomLeft"); + mpBottom = GetBitmap(rpTheme, rsStyleName, "Bottom"); + mpBottomRight = GetBitmap(rpTheme, rsStyleName, "BottomRight"); + mpBottomCallout = GetBitmap(rpTheme, rsStyleName, "BottomCallout"); + + // Get font description. + mpFont = rpTheme->GetFont(rsStyleName); + + OUString sAnchor ("Left"); + if (mpFont) + { + sAnchor = mpFont->msAnchor; + mnFontXOffset = mpFont->mnXOffset; + mnFontYOffset = mpFont->mnYOffset; + } + + if ( sAnchor == "Left" ) + meFontAnchor = Anchor::Left; + else if ( sAnchor == "Right" ) + meFontAnchor = Anchor::Right; + else + meFontAnchor = Anchor::Center; + + // Get border sizes. + try + { + ::std::vector aInnerBorder (rpTheme->GetBorderSize(rsStyleName, false)); + OSL_ASSERT(aInnerBorder.size()==4); + maInnerBorderSize.mnLeft = aInnerBorder[0]; + maInnerBorderSize.mnTop = aInnerBorder[1]; + maInnerBorderSize.mnRight = aInnerBorder[2]; + maInnerBorderSize.mnBottom = aInnerBorder[3]; + + ::std::vector aOuterBorder (rpTheme->GetBorderSize(rsStyleName, true)); + OSL_ASSERT(aOuterBorder.size()==4); + maOuterBorderSize.mnLeft = aOuterBorder[0]; + maOuterBorderSize.mnTop = aOuterBorder[1]; + maOuterBorderSize.mnRight = aOuterBorder[2]; + maOuterBorderSize.mnBottom = aOuterBorder[3]; + } + catch(beans::UnknownPropertyException&) + { + OSL_ASSERT(false); + } + + UpdateBorderSizes(); +} + +awt::Rectangle RendererPaneStyle::AddBorder ( + const awt::Rectangle& rBox, + const drawing::framework::BorderType eBorderType) const +{ + const BorderSize* pBorderSize = nullptr; + switch (eBorderType) + { + case drawing::framework::BorderType_INNER_BORDER: + pBorderSize = &maInnerBorderSize; + break; + case drawing::framework::BorderType_OUTER_BORDER: + pBorderSize = &maOuterBorderSize; + break; + case drawing::framework::BorderType_TOTAL_BORDER: + pBorderSize = &maTotalBorderSize; + break; + default: + return rBox; + } + return awt::Rectangle ( + rBox.X - pBorderSize->mnLeft, + rBox.Y - pBorderSize->mnTop, + rBox.Width + pBorderSize->mnLeft + pBorderSize->mnRight, + rBox.Height + pBorderSize->mnTop + pBorderSize->mnBottom); +} + +awt::Rectangle RendererPaneStyle::RemoveBorder ( + const awt::Rectangle& rBox, + const css::drawing::framework::BorderType eBorderType) const +{ + const BorderSize* pBorderSize = nullptr; + switch (eBorderType) + { + case drawing::framework::BorderType_INNER_BORDER: + pBorderSize = &maInnerBorderSize; + break; + case drawing::framework::BorderType_OUTER_BORDER: + pBorderSize = &maOuterBorderSize; + break; + case drawing::framework::BorderType_TOTAL_BORDER: + pBorderSize = &maTotalBorderSize; + break; + default: + return rBox; + } + return awt::Rectangle ( + rBox.X + pBorderSize->mnLeft, + rBox.Y + pBorderSize->mnTop, + rBox.Width - pBorderSize->mnLeft - pBorderSize->mnRight, + rBox.Height - pBorderSize->mnTop - pBorderSize->mnBottom); +} + +Reference RendererPaneStyle::GetFont ( + const Reference& rxCanvas) const +{ + if (mpFont) + { + mpFont->PrepareFont(rxCanvas); + return mpFont->mxFont; + } + return Reference(); +} + +void RendererPaneStyle::UpdateBorderSizes() +{ + maTotalBorderSize.mnLeft = maInnerBorderSize.mnLeft + maOuterBorderSize.mnLeft; + maTotalBorderSize.mnTop = maInnerBorderSize.mnTop + maOuterBorderSize.mnTop; + maTotalBorderSize.mnRight = maInnerBorderSize.mnRight + maOuterBorderSize.mnRight; + maTotalBorderSize.mnBottom = maInnerBorderSize.mnBottom + maOuterBorderSize.mnBottom; +} + +SharedBitmapDescriptor RendererPaneStyle::GetBitmap( + const std::shared_ptr& rpTheme, + const OUString& rsStyleName, + const OUString& rsBitmapName) +{ + SharedBitmapDescriptor pDescriptor (rpTheme->GetBitmap(rsStyleName, rsBitmapName)); + if (pDescriptor) + return pDescriptor; + else + return mpEmpty; +} + +} // end of anonymous namespace + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneBorderPainter.hxx b/sd/source/console/PresenterPaneBorderPainter.hxx new file mode 100644 index 0000000000..b7b9c0de1e --- /dev/null +++ b/sd/source/console/PresenterPaneBorderPainter.hxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBORDERPAINTER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBORDERPAINTER_HXX + +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +class PresenterPane; +class PresenterTheme; + +typedef ::cppu::WeakComponentImplHelper< + css::drawing::framework::XPaneBorderPainter +> PresenterPaneBorderPainterInterfaceBase; + +/** This class is responsible for painting window borders of PresenterPane + objects. +*/ +class PresenterPaneBorderPainter + : protected ::cppu::BaseMutex, + public PresenterPaneBorderPainterInterfaceBase +{ +public: + explicit PresenterPaneBorderPainter ( + const css::uno::Reference& rxContext); + virtual ~PresenterPaneBorderPainter() override; + PresenterPaneBorderPainter(const PresenterPaneBorderPainter&) = delete; + PresenterPaneBorderPainter& operator=(const PresenterPaneBorderPainter&) = delete; + + /** Transform the bounding box of the window content to the outer + bounding box of the border that is painted around it. + @param rsPaneURL + Specifies the pane style that is used to determine the border sizes. + @param rInnerBox + The rectangle of the inner window content. + */ + css::awt::Rectangle AddBorder ( + const OUString& rsPaneURL, + const css::awt::Rectangle& rInnerBox, + const css::drawing::framework::BorderType eBorderType) const; + + /** Transform the outer bounding box of a window to the bounding box of + the inner content area. + @param rsPaneURL + Specifies the pane style that is used to determine the border sizes. + @param rOuterBox + The bounding box of the rectangle around the window. + @param bIsTitleVisible + This flag controls whether the upper part of the frame is + supposed to contain the window title. + */ + css::awt::Rectangle RemoveBorder ( + const OUString& rsPaneURL, + const css::awt::Rectangle& rOuterBox, + const css::drawing::framework::BorderType eBorderType) const; + + void SetTheme (const std::shared_ptr& rpTheme); + + class Renderer; + + // XPaneBorderPainter + + virtual css::awt::Rectangle SAL_CALL addBorder ( + const OUString& rsPaneBorderStyleName, + const css::awt::Rectangle& rRectangle, + css::drawing::framework::BorderType eBorderType) override; + + virtual css::awt::Rectangle SAL_CALL removeBorder ( + const OUString& rsPaneBorderStyleName, + const css::awt::Rectangle& rRectangle, + css::drawing::framework::BorderType eBorderType) override; + + virtual void SAL_CALL paintBorder ( + const OUString& rsPaneBorderStyleName, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rOuterBorderRectangle, + const css::awt::Rectangle& rRepaintArea, + const OUString& rsTitle) override; + + virtual void SAL_CALL paintBorderWithCallout ( + const OUString& rsPaneBorderStyleName, + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rOuterBorderRectangle, + const css::awt::Rectangle& rRepaintArea, + const OUString& rsTitle, + const css::awt::Point& rCalloutAnchor) override; + + virtual css::awt::Point SAL_CALL getCalloutOffset ( + const OUString& rsPaneBorderStyleName) override; + +private: + css::uno::Reference mxContext; + std::shared_ptr mpTheme; + std::unique_ptr mpRenderer; + + /** When the theme for the border has not yet been loaded then try again + when this method is called. + @return + Returns only one time when the theme is loaded and/or the + renderer is initialized. + */ + bool ProvideTheme ( + const css::uno::Reference& rxCanvas); + void ProvideTheme(); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneContainer.cxx b/sd/source/console/PresenterPaneContainer.cxx new file mode 100644 index 0000000000..b28f36a399 --- /dev/null +++ b/sd/source/console/PresenterPaneContainer.cxx @@ -0,0 +1,331 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPaneContainer.hxx" +#include "PresenterPaneBase.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +PresenterPaneContainer::PresenterPaneContainer ( + const Reference& rxContext) + : PresenterPaneContainerInterfaceBase(m_aMutex) +{ + Reference xFactory (rxContext->getServiceManager()); + if (xFactory.is()) + { + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + rxContext), + UNO_QUERY_THROW); + } +} + +PresenterPaneContainer::~PresenterPaneContainer() +{ +} + +void PresenterPaneContainer::PreparePane ( + const Reference& rxPaneId, + const OUString& rsViewURL, + const OUString& rsTitle, + const OUString& rsAccessibleTitle, + const bool bIsOpaque, + const ViewInitializationFunction& rViewInitialization) +{ + if ( ! rxPaneId.is()) + return; + + SharedPaneDescriptor pPane (FindPaneURL(rxPaneId->getResourceURL())); + if (pPane) + return; + + // No entry found for the given pane id. Create a new one. + SharedPaneDescriptor pDescriptor = std::make_shared(); + pDescriptor->mxPaneId = rxPaneId; + pDescriptor->msViewURL = rsViewURL; + pDescriptor->mxPane = nullptr; + if (rsTitle.indexOf('%') < 0) + { + pDescriptor->msTitle = rsTitle; + pDescriptor->msTitleTemplate.clear(); + } + else + { + pDescriptor->msTitleTemplate = rsTitle; + pDescriptor->msTitle.clear(); + } + pDescriptor->msAccessibleTitleTemplate = rsAccessibleTitle; + pDescriptor->maViewInitialization = rViewInitialization; + pDescriptor->mbIsActive = true; + pDescriptor->mbIsOpaque = bIsOpaque; + pDescriptor->mbIsSprite = false; + + maPanes.push_back(pDescriptor); +} + +void SAL_CALL PresenterPaneContainer::disposing() +{ + for (const auto& rxPane : maPanes) + if (rxPane->mxPaneId.is()) + RemovePane(rxPane->mxPaneId); +} + +PresenterPaneContainer::SharedPaneDescriptor + PresenterPaneContainer::StorePane (const rtl::Reference& rxPane) +{ + SharedPaneDescriptor pDescriptor; + + if (rxPane.is()) + { + OUString sPaneURL; + Reference xPaneId (rxPane->getResourceId()); + if (xPaneId.is()) + sPaneURL = xPaneId->getResourceURL(); + + pDescriptor = FindPaneURL(sPaneURL); + if (!pDescriptor) + PreparePane(xPaneId, OUString(), OUString(), OUString(), + false, ViewInitializationFunction()); + pDescriptor = FindPaneURL(sPaneURL); + if (pDescriptor) + { + Reference xWindow (rxPane->getWindow()); + pDescriptor->mxContentWindow = xWindow; + pDescriptor->mxPaneId = xPaneId; + pDescriptor->mxPane = rxPane; + pDescriptor->mxPane->SetTitle(pDescriptor->msTitle); + + if (xWindow.is()) + xWindow->addEventListener(this); + } + } + + return pDescriptor; +} + +PresenterPaneContainer::SharedPaneDescriptor + PresenterPaneContainer::StoreBorderWindow( + const Reference& rxPaneId, + const Reference& rxBorderWindow) +{ + // The content window may not be present. Use the resource URL of the + // pane id as key. + OUString sPaneURL; + if (rxPaneId.is()) + sPaneURL = rxPaneId->getResourceURL(); + + SharedPaneDescriptor pDescriptor (FindPaneURL(sPaneURL)); + if (pDescriptor) + { + pDescriptor->mxBorderWindow = rxBorderWindow; + return pDescriptor; + } + else + return SharedPaneDescriptor(); +} + +PresenterPaneContainer::SharedPaneDescriptor + PresenterPaneContainer::StoreView ( + const Reference& rxView) +{ + SharedPaneDescriptor pDescriptor; + + if (rxView.is()) + { + OUString sPaneURL; + Reference xViewId (rxView->getResourceId()); + if (xViewId.is()) + { + Reference xPaneId (xViewId->getAnchor()); + if (xPaneId.is()) + sPaneURL = xPaneId->getResourceURL(); + } + + pDescriptor = FindPaneURL(sPaneURL); + if (pDescriptor) + { + pDescriptor->mxView = rxView; + try + { + if (pDescriptor->maViewInitialization) + pDescriptor->maViewInitialization(rxView); + } + catch (RuntimeException&) + { + OSL_ASSERT(false); + } + } + } + + return pDescriptor; +} + +PresenterPaneContainer::SharedPaneDescriptor + PresenterPaneContainer::RemovePane (const Reference& rxPaneId) +{ + SharedPaneDescriptor pDescriptor (FindPaneId(rxPaneId)); + if (pDescriptor) + { + if (pDescriptor->mxContentWindow.is()) + pDescriptor->mxContentWindow->removeEventListener(this); + pDescriptor->mxContentWindow = nullptr; + pDescriptor->mxBorderWindow = nullptr; + pDescriptor->mxPane = nullptr; + pDescriptor->mxView = nullptr; + pDescriptor->mbIsActive = false; + } + return pDescriptor; +} + +PresenterPaneContainer::SharedPaneDescriptor + PresenterPaneContainer::RemoveView (const Reference& rxView) +{ + SharedPaneDescriptor pDescriptor; + + if (rxView.is()) + { + OUString sPaneURL; + Reference xViewId (rxView->getResourceId()); + if (xViewId.is()) + { + Reference xPaneId (xViewId->getAnchor()); + if (xPaneId.is()) + sPaneURL = xPaneId->getResourceURL(); + } + + pDescriptor = FindPaneURL(sPaneURL); + if (pDescriptor) + { + pDescriptor->mxView = nullptr; + } + } + + return pDescriptor; +} + +PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindBorderWindow ( + const Reference& rxBorderWindow) +{ + auto iPane = std::find_if(maPanes.begin(), maPanes.end(), + [&rxBorderWindow](const SharedPaneDescriptor& rxPane) { return rxPane->mxBorderWindow == rxBorderWindow; }); + if (iPane != maPanes.end()) + return *iPane; + return SharedPaneDescriptor(); +} + +PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindContentWindow ( + const Reference& rxContentWindow) +{ + auto iPane = std::find_if(maPanes.begin(), maPanes.end(), + [&rxContentWindow](const SharedPaneDescriptor& rxPane) { return rxPane->mxContentWindow == rxContentWindow; }); + if (iPane != maPanes.end()) + return *iPane; + return SharedPaneDescriptor(); +} + +PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindPaneURL ( + const OUString& rsPaneURL) +{ + auto iPane = std::find_if(maPanes.begin(), maPanes.end(), + [&rsPaneURL](const SharedPaneDescriptor& rxPane) { return rxPane->mxPaneId->getResourceURL() == rsPaneURL; }); + if (iPane != maPanes.end()) + return *iPane; + return SharedPaneDescriptor(); +} + +PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindPaneId ( + const Reference& rxPaneId) +{ + if ( ! rxPaneId.is()) + return SharedPaneDescriptor(); + + auto iPane = std::find_if(maPanes.begin(), maPanes.end(), + [&rxPaneId](const SharedPaneDescriptor& rxPane) { return rxPaneId->compareTo(rxPane->mxPaneId) == 0; }); + if (iPane != maPanes.end()) + return *iPane; + return SharedPaneDescriptor(); +} + +PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindViewURL ( + const OUString& rsViewURL) +{ + auto iPane = std::find_if(maPanes.begin(), maPanes.end(), + [&rsViewURL](const SharedPaneDescriptor& rxPane) { return rsViewURL == rxPane->msViewURL; }); + if (iPane != maPanes.end()) + return *iPane; + return SharedPaneDescriptor(); +} + +OUString PresenterPaneContainer::GetPaneURLForViewURL (const OUString& rsViewURL) +{ + SharedPaneDescriptor pDescriptor (FindViewURL(rsViewURL)); + if (pDescriptor) + if (pDescriptor->mxPaneId.is()) + return pDescriptor->mxPaneId->getResourceURL(); + return OUString(); +} + +void PresenterPaneContainer::ToTop (const SharedPaneDescriptor& rpDescriptor) +{ + if (!rpDescriptor) + return; + + // Find iterator for pDescriptor. + PaneList::iterator iEnd (maPanes.end()); + auto iPane = std::find_if(maPanes.begin(), iEnd, + [&rpDescriptor](SharedPaneDescriptor& rxPane) { return rxPane.get() == rpDescriptor.get(); }); + OSL_ASSERT(iPane!=iEnd); + if (iPane == iEnd) + return; + + if (mxPresenterHelper.is()) + mxPresenterHelper->toTop(rpDescriptor->mxBorderWindow); + + maPanes.erase(iPane); + maPanes.push_back(rpDescriptor); +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL PresenterPaneContainer::disposing ( + const css::lang::EventObject& rEvent) +{ + SharedPaneDescriptor pDescriptor ( + FindContentWindow(Reference(rEvent.Source, UNO_QUERY))); + if (pDescriptor) + { + RemovePane(pDescriptor->mxPaneId); + } +} + +//===== PresenterPaneContainer::PaneDescriptor ================================ + +void PresenterPaneContainer::PaneDescriptor::SetActivationState (const bool bIsActive) +{ + mbIsActive = bIsActive; +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneContainer.hxx b/sd/source/console/PresenterPaneContainer.hxx new file mode 100644 index 0000000000..136c25690b --- /dev/null +++ b/sd/source/console/PresenterPaneContainer.hxx @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANECONTAINER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANECONTAINER_HXX + +#include "PresenterPaneBase.hxx" +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sdext::presenter { + +class PresenterPaneBase; +class PresenterSprite; + +typedef ::cppu::WeakComponentImplHelper < + css::lang::XEventListener +> PresenterPaneContainerInterfaceBase; + +/** This class could also be called PresenterPaneAndViewContainer because it + stores not only references to all panes that belong to the presenter + screen but stores the views displayed in these panes as well. +*/ +class PresenterPaneContainer + : private ::cppu::BaseMutex, + public PresenterPaneContainerInterfaceBase +{ +public: + explicit PresenterPaneContainer ( + const css::uno::Reference& rxContext); + virtual ~PresenterPaneContainer() override; + PresenterPaneContainer(const PresenterPaneContainer&) = delete; + PresenterPaneContainer& operator=(const PresenterPaneContainer&) = delete; + + virtual void SAL_CALL disposing() override; + + typedef ::std::function&)> + ViewInitializationFunction; + + /** Each pane descriptor holds references to one pane and the view + displayed in this pane as well as the other information that is used + to manage the pane window like an XWindow reference, the title, and + the coordinates. + + A initialization function for the view is stored as well. This + function is executed as soon as a view is created. + */ + class PaneDescriptor + { + public: + css::uno::Reference mxPaneId; + OUString msViewURL; + ::rtl::Reference mxPane; + css::uno::Reference mxView; + css::uno::Reference mxContentWindow; + css::uno::Reference mxBorderWindow; + OUString msTitleTemplate; + OUString msAccessibleTitleTemplate; + OUString msTitle; + ViewInitializationFunction maViewInitialization; + bool mbIsActive; + bool mbIsOpaque; + bool mbIsSprite; + + void SetActivationState (const bool bIsActive); + }; + typedef std::shared_ptr SharedPaneDescriptor; + typedef ::std::vector PaneList; + PaneList maPanes; + + void PreparePane ( + const css::uno::Reference& rxPaneId, + const OUString& rsViewURL, + const OUString& rsTitle, + const OUString& rsAccessibleTitle, + const bool bIsOpaque, + const ViewInitializationFunction& rViewInitialization); + + SharedPaneDescriptor StorePane ( + const rtl::Reference& rxPane); + + SharedPaneDescriptor StoreBorderWindow( + const css::uno::Reference& rxPaneId, + const css::uno::Reference& rxBorderWindow); + + SharedPaneDescriptor StoreView ( + const css::uno::Reference& rxView); + + SharedPaneDescriptor RemovePane ( + const css::uno::Reference& rxPaneId); + + SharedPaneDescriptor RemoveView ( + const css::uno::Reference& rxView); + + /** Find the pane whose border window is identical to the given border + window. + */ + SharedPaneDescriptor FindBorderWindow ( + const css::uno::Reference& rxBorderWindow); + + /** Find the pane whose border window is identical to the given content + window. + */ + SharedPaneDescriptor FindContentWindow ( + const css::uno::Reference& rxBorderWindow); + + /** Find the pane whose pane URL is identical to the given URL string. + */ + SharedPaneDescriptor FindPaneURL (const OUString& rsPaneURL); + + /** Find the pane whose resource id is identical to the given one. + */ + SharedPaneDescriptor FindPaneId (const css::uno::Reference< + css::drawing::framework::XResourceId>& rxPaneId); + + SharedPaneDescriptor FindViewURL (const OUString& rsViewURL); + + OUString GetPaneURLForViewURL (const OUString& rsViewURL); + + void ToTop (const SharedPaneDescriptor& rpDescriptor); + + // XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference mxPresenterHelper; +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneFactory.cxx b/sd/source/console/PresenterPaneFactory.cxx new file mode 100644 index 0000000000..822055b8ed --- /dev/null +++ b/sd/source/console/PresenterPaneFactory.cxx @@ -0,0 +1,283 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPaneFactory.hxx" +#include "PresenterController.hxx" +#include "PresenterPane.hxx" +#include "PresenterPaneBorderPainter.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterSpritePane.hxx" +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +//===== PresenterPaneFactory ================================================== + +Reference PresenterPaneFactory::Create ( + const Reference& rxContext, + const rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController) +{ + rtl::Reference pFactory ( + new PresenterPaneFactory(rxContext,rpPresenterController)); + pFactory->Register(rxController); + return Reference(pFactory); +} + +PresenterPaneFactory::PresenterPaneFactory ( + const Reference& rxContext, + ::rtl::Reference xPresenterController) + : PresenterPaneFactoryInterfaceBase(m_aMutex), + mxComponentContextWeak(rxContext), + mpPresenterController(std::move(xPresenterController)) +{ +} + +void PresenterPaneFactory::Register (const rtl::Reference<::sd::DrawController>& rxController) +{ + Reference xCC; + try + { + // Get the configuration controller. + xCC.set(rxController->getConfigurationController()); + mxConfigurationControllerWeak = xCC; + if ( ! xCC.is()) + { + throw RuntimeException(); + } + xCC->addResourceFactory( + "private:resource/pane/Presenter/*", + this); + } + catch (RuntimeException&) + { + OSL_ASSERT(false); + if (xCC.is()) + xCC->removeResourceFactoryForReference(this); + mxConfigurationControllerWeak = WeakReference(); + + throw; + } +} + +PresenterPaneFactory::~PresenterPaneFactory() +{ +} + +void SAL_CALL PresenterPaneFactory::disposing() +{ + Reference xCC (mxConfigurationControllerWeak); + if (xCC.is()) + xCC->removeResourceFactoryForReference(this); + mxConfigurationControllerWeak = WeakReference(); + + // Dispose the panes in the cache. + if (mpResourceCache != nullptr) + { + for (const auto& rxPane : *mpResourceCache) + { + Reference xPaneComponent (rxPane.second, UNO_QUERY); + if (xPaneComponent.is()) + xPaneComponent->dispose(); + } + mpResourceCache.reset(); + } +} + +//----- XPaneFactory ---------------------------------------------------------- + +Reference SAL_CALL PresenterPaneFactory::createResource ( + const Reference& rxPaneId) +{ + ThrowIfDisposed(); + + if ( ! rxPaneId.is()) + return nullptr; + + const OUString sPaneURL (rxPaneId->getResourceURL()); + if (sPaneURL.isEmpty()) + return nullptr; + + if (mpResourceCache != nullptr) + { + // Has the requested resource already been created? + ResourceContainer::const_iterator iResource (mpResourceCache->find(sPaneURL)); + if (iResource != mpResourceCache->end()) + { + // Yes. Mark it as active. + rtl::Reference pPaneContainer( + mpPresenterController->GetPaneContainer()); + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + pPaneContainer->FindPaneURL(sPaneURL)); + if (pDescriptor) + { + pDescriptor->SetActivationState(true); + if (pDescriptor->mxBorderWindow.is()) + pDescriptor->mxBorderWindow->setVisible(true); + pPaneContainer->StorePane(pDescriptor->mxPane); + } + + return iResource->second; + } + } + + // No. Create a new one. + Reference xResource = CreatePane(rxPaneId); + return xResource; +} + +void SAL_CALL PresenterPaneFactory::releaseResource (const Reference& rxResource) +{ + ThrowIfDisposed(); + + if ( ! rxResource.is()) + throw lang::IllegalArgumentException(); + + // Mark the pane as inactive. + rtl::Reference pPaneContainer( + mpPresenterController->GetPaneContainer()); + const OUString sPaneURL (rxResource->getResourceId()->getResourceURL()); + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + pPaneContainer->FindPaneURL(sPaneURL)); + if (!pDescriptor) + return; + + pDescriptor->SetActivationState(false); + if (pDescriptor->mxBorderWindow.is()) + pDescriptor->mxBorderWindow->setVisible(false); + + if (mpResourceCache != nullptr) + { + // Store the pane in the cache. + (*mpResourceCache)[sPaneURL] = rxResource; + } + else + { + // Dispose the pane. + Reference xPaneComponent (rxResource, UNO_QUERY); + if (xPaneComponent.is()) + xPaneComponent->dispose(); + } +} + + +Reference PresenterPaneFactory::CreatePane ( + const Reference& rxPaneId) +{ + if ( ! rxPaneId.is()) + return nullptr; + + Reference xCC (mxConfigurationControllerWeak); + if ( ! xCC.is()) + return nullptr; + + Reference xContext (mxComponentContextWeak); + if ( ! xContext.is()) + return nullptr; + + Reference xParentPane (xCC->getResource(rxPaneId->getAnchor()), UNO_QUERY); + if ( ! xParentPane.is()) + return nullptr; + + try + { + return CreatePane( + rxPaneId, + xParentPane, + rxPaneId->getFullResourceURL().Arguments == "Sprite=1"); + } + catch (Exception&) + { + OSL_ASSERT(false); + } + + return nullptr; +} + +Reference PresenterPaneFactory::CreatePane ( + const Reference& rxPaneId, + const Reference& rxParentPane, + const bool bIsSpritePane) +{ + Reference xContext (mxComponentContextWeak); + Reference xFactory ( + xContext->getServiceManager(), UNO_SET_THROW); + + // Create a border window and canvas and store it in the pane + // container. + + // Create the pane. + ::rtl::Reference xPane; + if (bIsSpritePane) + { + xPane.set( new PresenterSpritePane(xContext, mpPresenterController)); + } + else + { + xPane.set( new PresenterPane(xContext, mpPresenterController)); + } + + // Supply arguments. + Sequence aArguments{ Any(rxPaneId), + Any(rxParentPane->getWindow()), + Any(rxParentPane->getCanvas()), + Any(OUString()), + Any(Reference( + mpPresenterController->GetPaneBorderPainter())), + Any(!bIsSpritePane) }; + xPane->initialize(aArguments); + + // Store pane and canvases and windows in container. + ::rtl::Reference pContainer ( + mpPresenterController->GetPaneContainer()); + PresenterPaneContainer::SharedPaneDescriptor pDescriptor( + pContainer->StoreBorderWindow(rxPaneId, xPane->GetBorderWindow())); + pContainer->StorePane(xPane); + if (pDescriptor) + { + pDescriptor->mbIsSprite = bIsSpritePane; + + // Get the window of the frame and make that visible. + Reference xWindow (pDescriptor->mxBorderWindow, UNO_SET_THROW); + xWindow->setVisible(true); + } + + return Reference(static_cast(xPane.get()), UNO_QUERY_THROW); +} + +void PresenterPaneFactory::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterPaneFactory object has already been disposed", + const_cast(static_cast(this))); + } +} + +} // end of namespace sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterPaneFactory.hxx b/sd/source/console/PresenterPaneFactory.hxx new file mode 100644 index 0000000000..1145cd5327 --- /dev/null +++ b/sd/source/console/PresenterPaneFactory.hxx @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEFACTORY_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEFACTORY_HXX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { class DrawController; } + +namespace sdext::presenter { + +class PresenterController; + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XResourceFactory +> PresenterPaneFactoryInterfaceBase; + +/** The PresenterPaneFactory provides a fixed set of panes. + + In order to make the presenter screen more easily extendable in the + future the set of supported panes could be made extendable on demand. +*/ +class PresenterPaneFactory + : public ::cppu::BaseMutex, + public PresenterPaneFactoryInterfaceBase +{ +public: + static constexpr OUString msCurrentSlidePreviewPaneURL + = u"private:resource/pane/Presenter/Pane1"_ustr; + static constexpr OUString msNextSlidePreviewPaneURL + = u"private:resource/pane/Presenter/Pane2"_ustr; + static constexpr OUString msNotesPaneURL = u"private:resource/pane/Presenter/Pane3"_ustr; + static constexpr OUString msToolBarPaneURL = u"private:resource/pane/Presenter/Pane4"_ustr; + static constexpr OUString msSlideSorterPaneURL + = u"private:resource/pane/Presenter/Pane5"_ustr; + + /** Create a new instance of this class and register it as resource + factory in the drawing framework of the given controller. + This registration keeps it alive. When the drawing framework is + shut down and releases its reference to the factory then the factory + is destroyed. + */ + static css::uno::Reference Create ( + const css::uno::Reference& rxContext, + const rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterPaneFactory() override; + + virtual void SAL_CALL disposing() override; + + // XResourceFactory + + virtual css::uno::Reference + SAL_CALL createResource ( + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxPaneId) override; + + virtual void SAL_CALL + releaseResource ( + const css::uno::Reference& + rxPane) override; + +private: + css::uno::WeakReference mxComponentContextWeak; + css::uno::WeakReference + mxConfigurationControllerWeak; + ::rtl::Reference mpPresenterController; + typedef ::std::map > + ResourceContainer; + std::unique_ptr mpResourceCache; + + PresenterPaneFactory ( + const css::uno::Reference& rxContext, + ::rtl::Reference xPresenterController); + + void Register (const rtl::Reference<::sd::DrawController>& rxController); + + css::uno::Reference CreatePane ( + const css::uno::Reference& rxPaneId); + css::uno::Reference CreatePane ( + const css::uno::Reference& rxPaneId, + const css::uno::Reference& rxParentPane, + const bool bIsSpritePane); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterProtocolHandler.cxx b/sd/source/console/PresenterProtocolHandler.cxx new file mode 100644 index 0000000000..ddfb4340c0 --- /dev/null +++ b/sd/source/console/PresenterProtocolHandler.cxx @@ -0,0 +1,830 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "PresenterProtocolHandler.hxx" +#include "PresenterController.hxx" +#include "PresenterNotesView.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterViewFactory.hxx" +#include "PresenterWindowManager.hxx" +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +namespace { + class Command + { + public: + virtual ~Command() {} + virtual void Execute() = 0; + virtual bool IsEnabled() const { return true; } + virtual Any GetState() const { return Any(false); } + }; + + class GotoPreviousSlideCommand : public Command + { + public: + explicit GotoPreviousSlideCommand ( + rtl::Reference xPresenterController); + virtual void Execute() override; + virtual bool IsEnabled() const override; + private: + rtl::Reference mpPresenterController; + }; + + class GotoNextSlideCommand : public Command + { + public: + explicit GotoNextSlideCommand ( + rtl::Reference xPresenterController); + virtual void Execute() override; + // The next slide command is always enabled, even when the current slide + // is the last slide: from the last slide it goes to the pause slide, + // and from there it ends the slide show. + virtual bool IsEnabled() const override { return true; } + private: + rtl::Reference mpPresenterController; + }; + + class GotoNextEffectCommand : public Command + { + public: + explicit GotoNextEffectCommand ( + rtl::Reference xPresenterController); + virtual void Execute() override; + virtual bool IsEnabled() const override; + private: + rtl::Reference mpPresenterController; + }; + + class SwitchMonitorCommand : public Command + { + public: + explicit SwitchMonitorCommand ( + rtl::Reference xPresenterController); + virtual void Execute() override; + private: + rtl::Reference mpPresenterController; + }; + + class PauseResumeCommand : public Command + { + public: + explicit PauseResumeCommand(rtl::Reference xPresenterController); + virtual void Execute() override; + virtual Any GetState() const override; + private: + rtl::Reference mpPresenterController; + }; + + /// This command restarts the presentation timer. + class RestartTimerCommand : public Command + { + public: + explicit RestartTimerCommand(rtl::Reference xPresenterController); + virtual void Execute() override; + private: + rtl::Reference mpPresenterController; + }; + + class SetNotesViewCommand : public Command + { + public: + SetNotesViewCommand ( + const bool bOn, + rtl::Reference xPresenterController); + virtual void Execute() override; + virtual Any GetState() const override; + private: + bool mbOn; + rtl::Reference mpPresenterController; + }; + + class SetSlideSorterCommand : public Command + { + public: + SetSlideSorterCommand ( + const bool bOn, + rtl::Reference xPresenterController); + virtual void Execute() override; + virtual Any GetState() const override; + private: + bool mbOn; + rtl::Reference mpPresenterController; + }; + + class SetHelpViewCommand : public Command + { + public: + SetHelpViewCommand ( + const bool bOn, + rtl::Reference xPresenterController); + virtual void Execute() override; + virtual Any GetState() const override; + private: + bool mbOn; + rtl::Reference mpPresenterController; + }; + + class NotesFontSizeCommand : public Command + { + public: + NotesFontSizeCommand( + rtl::Reference xPresenterController, + const sal_Int32 nSizeChange); + virtual void Execute() override; + virtual Any GetState() const override; + protected: + ::rtl::Reference GetNotesView() const; + private: + rtl::Reference mpPresenterController; + const sal_Int32 mnSizeChange; + }; + + class ExitPresenterCommand : public Command + { + public: + explicit ExitPresenterCommand(rtl::Reference xPresenterController); + virtual void Execute() override; + private: + rtl::Reference mpPresenterController; + }; + +} // end of anonymous namespace + +namespace { + typedef ::cppu::WeakComponentImplHelper < + css::frame::XDispatch, + css::document::XEventListener + > PresenterDispatchInterfaceBase; +} + +class PresenterProtocolHandler::Dispatch + : protected ::cppu::BaseMutex, + public PresenterDispatchInterfaceBase +{ +public: + /** Create a new Dispatch object. When the given command name + (rsURLPath) is not known then an empty reference is returned. + */ + static Reference Create ( + const OUString& rsURLPath, + const ::rtl::Reference& rpPresenterController); + + void SAL_CALL disposing() override; + static Command* CreateCommand ( + std::u16string_view rsURLPath, + const ::rtl::Reference& rpPresenterController); + + // XDispatch + virtual void SAL_CALL dispatch( + const css::util::URL& aURL, + const css::uno::Sequence& rArguments) override; + + virtual void SAL_CALL addStatusListener( + const css::uno::Reference& rxListener, + const css::util::URL& rURL) override; + + virtual void SAL_CALL removeStatusListener ( + const css::uno::Reference& rxListener, + const css::util::URL& rURL) override; + + // document::XEventListener + + virtual void SAL_CALL notifyEvent (const css::document::EventObject& rEvent) override; + + // lang::XEventListener + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + +private: + OUString msURLPath; + std::unique_ptr mpCommand; + ::rtl::Reference mpPresenterController; + typedef ::std::vector > StatusListenerContainer; + StatusListenerContainer maStatusListenerContainer; + bool mbIsListeningToWindowManager; + + Dispatch ( + const OUString& rsURLPath, + const ::rtl::Reference& rpPresenterController); + virtual ~Dispatch() override; +}; + + +//===== PresenterProtocolHandler ========================================================= + +PresenterProtocolHandler::PresenterProtocolHandler () + : PresenterProtocolHandlerInterfaceBase(m_aMutex) +{ +} + +PresenterProtocolHandler::~PresenterProtocolHandler() +{ +} + +void SAL_CALL PresenterProtocolHandler::disposing() +{ +} + +//----- XInitialize ----------------------------------------------------------- + +void SAL_CALL PresenterProtocolHandler::initialize (const Sequence& aArguments) +{ + ThrowIfDisposed(); + if (aArguments.getLength() <= 0) + return; + + try + { + Reference xFrame; + if (aArguments[0] >>= xFrame) + { + mpPresenterController = PresenterController::Instance(xFrame); + } + } + catch (RuntimeException&) + { + OSL_ASSERT(false); + } +} + +OUString PresenterProtocolHandler::getImplementationName() +{ + return "org.libreoffice.comp.PresenterScreenProtocolHandler"; +} + +sal_Bool PresenterProtocolHandler::supportsService(OUString const & ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +css::uno::Sequence +PresenterProtocolHandler::getSupportedServiceNames() +{ + return { "com.sun.star.frame.ProtocolHandler" }; +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +sd_PresenterProtocolHandler_get_implementation( + css::uno::XComponentContext* , css::uno::Sequence const&) +{ + return cppu::acquire(new PresenterProtocolHandler()); +} + +//----- XDispatchProvider ----------------------------------------------------- + +Reference SAL_CALL PresenterProtocolHandler::queryDispatch ( + const css::util::URL& rURL, + const OUString&, + sal_Int32) +{ + ThrowIfDisposed(); + + Reference xDispatch; + + // tdf#154546 skip dispatch when presenter controller is not set + // mpPresenterController is sometimes unset and this will cause a + // crash when pressing the presenter console's Exchange button. + if (rURL.Protocol == "vnd.org.libreoffice.presenterscreen:" && mpPresenterController.is()) + { + xDispatch.set(Dispatch::Create(rURL.Path, mpPresenterController)); + } + + return xDispatch; +} + +Sequence > SAL_CALL PresenterProtocolHandler::queryDispatches( + const Sequence&) +{ + ThrowIfDisposed(); + return Sequence >(); +} + + +void PresenterProtocolHandler::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterProtocolHandler object has already been disposed", + const_cast(static_cast(this))); + } +} + +//===== PresenterProtocolHandler::Dispatch ==================================== + +Reference PresenterProtocolHandler::Dispatch::Create ( + const OUString& rsURLPath, + const ::rtl::Reference& rpPresenterController) +{ + ::rtl::Reference pDispatch (new Dispatch (rsURLPath, rpPresenterController)); + if (pDispatch->mpCommand != nullptr) + return pDispatch; + else + return nullptr; +} + +PresenterProtocolHandler::Dispatch::Dispatch ( + const OUString& rsURLPath, + const ::rtl::Reference& rpPresenterController) + : PresenterDispatchInterfaceBase(m_aMutex), + msURLPath(rsURLPath), + mpCommand(CreateCommand(rsURLPath, rpPresenterController)), + mpPresenterController(rpPresenterController), + mbIsListeningToWindowManager(false) +{ + if (mpCommand != nullptr) + { + mpPresenterController->GetWindowManager()->AddLayoutListener(this); + mbIsListeningToWindowManager = true; + } +} + +Command* PresenterProtocolHandler::Dispatch::CreateCommand ( + std::u16string_view rsURLPath, + const ::rtl::Reference& rpPresenterController) +{ + if (rsURLPath.size() <= 5) + return nullptr; + + if (rsURLPath == u"CloseNotes") + return new SetNotesViewCommand(false, rpPresenterController); + if (rsURLPath == u"CloseSlideSorter") + return new SetSlideSorterCommand(false, rpPresenterController); + if (rsURLPath == u"CloseHelp") + return new SetHelpViewCommand(false, rpPresenterController); + if (rsURLPath == u"GrowNotesFont") + return new NotesFontSizeCommand(rpPresenterController, +1); + if (rsURLPath == u"NextEffect") + return new GotoNextEffectCommand(rpPresenterController); + if (rsURLPath == u"NextSlide") + return new GotoNextSlideCommand(rpPresenterController); + if (rsURLPath == u"PrevSlide") + return new GotoPreviousSlideCommand(rpPresenterController); + if (rsURLPath == u"SwitchMonitor") + return new SwitchMonitorCommand(rpPresenterController); + if (rsURLPath == u"PauseResumeTimer") + return new PauseResumeCommand(rpPresenterController); + if (rsURLPath == u"RestartTimer") + return new RestartTimerCommand(rpPresenterController); + if (rsURLPath == u"ShowNotes") + return new SetNotesViewCommand(true, rpPresenterController); + if (rsURLPath == u"ShowSlideSorter") + return new SetSlideSorterCommand(true, rpPresenterController); + if (rsURLPath == u"ShowHelp") + return new SetHelpViewCommand(true, rpPresenterController); + if (rsURLPath == u"ShrinkNotesFont") + return new NotesFontSizeCommand(rpPresenterController, -1); + if (rsURLPath == u"ExitPresenter") + return new ExitPresenterCommand(rpPresenterController); + + return nullptr; +} + +PresenterProtocolHandler::Dispatch::~Dispatch() +{ +} + +void PresenterProtocolHandler::Dispatch::disposing() +{ + if (mbIsListeningToWindowManager) + { + if (mpPresenterController) + mpPresenterController->GetWindowManager()->RemoveLayoutListener(this); + mbIsListeningToWindowManager = false; + } + + msURLPath.clear(); + mpCommand.reset(); +} + +//----- XDispatch ------------------------------------------------------------- + +void SAL_CALL PresenterProtocolHandler::Dispatch::dispatch( + const css::util::URL& rURL, + const css::uno::Sequence& /*rArguments*/) +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterProtocolHandler::Dispatch object has already been disposed", + static_cast(this)); + } + + if (rURL.Protocol != "vnd.org.libreoffice.presenterscreen:" + || rURL.Path != msURLPath) + { + // We can not throw an IllegalArgumentException + throw RuntimeException(); + } + + if (mpCommand != nullptr) + mpCommand->Execute(); +} + +void SAL_CALL PresenterProtocolHandler::Dispatch::addStatusListener( + const css::uno::Reference& rxListener, + const css::util::URL& rURL) +{ + if (rURL.Path != msURLPath) + throw RuntimeException(); + + maStatusListenerContainer.push_back(rxListener); + + frame::FeatureStateEvent aEvent; + aEvent.FeatureURL = rURL; + aEvent.IsEnabled = mpCommand->IsEnabled(); + aEvent.Requery = false; + aEvent.State = mpCommand->GetState(); + rxListener->statusChanged(aEvent); +} + +void SAL_CALL PresenterProtocolHandler::Dispatch::removeStatusListener ( + const css::uno::Reference& rxListener, + const css::util::URL& rURL) +{ + if (rURL.Path != msURLPath) + throw RuntimeException(); + + StatusListenerContainer::iterator iListener ( + ::std::find( + maStatusListenerContainer.begin(), + maStatusListenerContainer.end(), + rxListener)); + if (iListener != maStatusListenerContainer.end()) + maStatusListenerContainer.erase(iListener); +} + +//----- document::XEventListener ---------------------------------------------- + +void SAL_CALL PresenterProtocolHandler::Dispatch::notifyEvent ( + const css::document::EventObject&) +{ + mpCommand->GetState(); +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterProtocolHandler::Dispatch::disposing (const css::lang::EventObject&) +{ + mbIsListeningToWindowManager = false; +} + +//===== GotoPreviousSlideCommand ============================================== + +GotoPreviousSlideCommand::GotoPreviousSlideCommand ( + rtl::Reference xPresenterController) + : mpPresenterController(std::move(xPresenterController)) +{ +} + +void GotoPreviousSlideCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + if ( ! mpPresenterController->GetSlideShowController().is()) + return; + + mpPresenterController->GetSlideShowController()->gotoPreviousSlide(); +} + +bool GotoPreviousSlideCommand::IsEnabled() const +{ + if ( ! mpPresenterController.is()) + return false; + + if ( ! mpPresenterController->GetSlideShowController().is()) + return false; + + return mpPresenterController->GetSlideShowController()->getCurrentSlideIndex()>0; +} + +//===== GotoNextEffect ======================================================== + +GotoNextEffectCommand::GotoNextEffectCommand ( + rtl::Reference xPresenterController) + : mpPresenterController(std::move(xPresenterController)) +{ +} + +void GotoNextEffectCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + if ( ! mpPresenterController->GetSlideShowController().is()) + return; + + mpPresenterController->GetSlideShowController()->gotoNextEffect(); +} + +bool GotoNextEffectCommand::IsEnabled() const +{ + if ( ! mpPresenterController.is()) + return false; + + if ( ! mpPresenterController->GetSlideShowController().is()) + return false; + + return ( mpPresenterController->GetSlideShowController()->getNextSlideIndex() < mpPresenterController->GetSlideShowController()->getSlideCount() ); + +} + +//===== GotoNextSlide ========================================================= + +GotoNextSlideCommand::GotoNextSlideCommand ( + rtl::Reference xPresenterController) + : mpPresenterController(std::move(xPresenterController)) +{ +} + +void GotoNextSlideCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + if ( ! mpPresenterController->GetSlideShowController().is()) + return; + + mpPresenterController->GetSlideShowController()->gotoNextSlide(); +} + +//===== SwitchMonitorCommand ============================================== + +SwitchMonitorCommand::SwitchMonitorCommand ( + rtl::Reference xPresenterController) + : mpPresenterController(std::move(xPresenterController)) +{ +} + +void SwitchMonitorCommand::Execute() +{ + mpPresenterController->SwitchMonitors(); +} + +//===== PauseResumeCommand ============================================== + +PauseResumeCommand::PauseResumeCommand (rtl::Reference xPresenterController) +: mpPresenterController(std::move(xPresenterController)) +{ +} + +void PauseResumeCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + + IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime(); + if (!pPresentationTime) + return; + + if(pPresentationTime->isPaused()) + { + pPresentationTime->setPauseStatus(false); + pWindowManager->SetPauseState(false); + } + else + { + pPresentationTime->setPauseStatus(true); + pWindowManager->SetPauseState(true); + } +} + +Any PauseResumeCommand::GetState() const +{ + if ( ! mpPresenterController.is()) + return Any(false); + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return Any(false); + + if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime()) + { + return Any(pPresentationTime->isPaused()); + } + else + return Any(false); +} + +RestartTimerCommand::RestartTimerCommand (rtl::Reference xPresenterController) +: mpPresenterController(std::move(xPresenterController)) +{ +} + +void RestartTimerCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + + if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime()) + { + //Resets the pause status and restarts the timer + pPresentationTime->setPauseStatus(false); + pWindowManager->SetPauseState(false); + pPresentationTime->restart(); + } +} + +//===== SetNotesViewCommand =================================================== + +SetNotesViewCommand::SetNotesViewCommand ( + const bool bOn, + rtl::Reference xPresenterController) + : mbOn(bOn), + mpPresenterController(std::move(xPresenterController)) +{ +} + +void SetNotesViewCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + + if (mbOn) + pWindowManager->SetViewMode(PresenterWindowManager::VM_Notes); + else + pWindowManager->SetViewMode(PresenterWindowManager::VM_Standard); +} + +Any SetNotesViewCommand::GetState() const +{ + if ( ! mpPresenterController.is()) + return Any(false); + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return Any(false); + + return Any(pWindowManager->GetViewMode() == PresenterWindowManager::VM_Notes); +} + +//===== SetSlideSorterCommand ================================================= + +SetSlideSorterCommand::SetSlideSorterCommand ( + const bool bOn, + rtl::Reference xPresenterController) + : mbOn(bOn), + mpPresenterController(std::move(xPresenterController)) +{ +} + +void SetSlideSorterCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + + pWindowManager->SetSlideSorterState(mbOn); +} + +Any SetSlideSorterCommand::GetState() const +{ + if ( ! mpPresenterController.is()) + return Any(false); + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return Any(false); + + return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_SlideOverview); +} + +//===== SetHelpViewCommand =================================================== + +SetHelpViewCommand::SetHelpViewCommand ( + const bool bOn, + rtl::Reference xPresenterController) + : mbOn(bOn), + mpPresenterController(std::move(xPresenterController)) +{ +} + +void SetHelpViewCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + + pWindowManager->SetHelpViewState(mbOn); +} + +Any SetHelpViewCommand::GetState() const +{ + if ( ! mpPresenterController.is()) + return Any(false); + + ::rtl::Reference pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return Any(false); + + return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_Help); +} + +//===== NotesFontSizeCommand ================================================== + +NotesFontSizeCommand::NotesFontSizeCommand( + rtl::Reference xPresenterController, + const sal_Int32 nSizeChange) + : mpPresenterController(std::move(xPresenterController)), + mnSizeChange(nSizeChange) +{ +} + +::rtl::Reference NotesFontSizeCommand::GetNotesView() const +{ + if (!mpPresenterController) + return nullptr; + + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + mpPresenterController->GetPaneContainer()->FindViewURL( + PresenterViewFactory::msNotesViewURL)); + if (!pDescriptor) + return nullptr; + + return dynamic_cast(pDescriptor->mxView.get()); +} + +void NotesFontSizeCommand::Execute() +{ + ::rtl::Reference pView (GetNotesView()); + if (pView.is()) + pView->ChangeFontSize(mnSizeChange); +} + +Any NotesFontSizeCommand::GetState() const +{ + return Any(); +} + +//===== ExitPresenterCommand ================================================== + +ExitPresenterCommand::ExitPresenterCommand (rtl::Reference xPresenterController) +: mpPresenterController(std::move(xPresenterController)) +{ +} + +void ExitPresenterCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + mpPresenterController->ExitPresenter(); +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterProtocolHandler.hxx b/sd/source/console/PresenterProtocolHandler.hxx new file mode 100644 index 0000000000..217fb2658a --- /dev/null +++ b/sd/source/console/PresenterProtocolHandler.hxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPROTOCOLHANDLER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPROTOCOLHANDLER_HXX + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +typedef ::cppu::WeakComponentImplHelper < + css::lang::XInitialization, + css::lang::XServiceInfo, + css::util::XCacheInfo, + css::frame::XDispatchProvider +> PresenterProtocolHandlerInterfaceBase; + +class PresenterController; + +class PresenterProtocolHandler + : protected ::cppu::BaseMutex, + public PresenterProtocolHandlerInterfaceBase +{ +public: + PresenterProtocolHandler (); + virtual ~PresenterProtocolHandler() override; + + void SAL_CALL disposing() override; + + // XInitialization + + virtual void SAL_CALL initialize( + const css::uno::Sequence& aArguments) override; + + OUString SAL_CALL getImplementationName() override; + + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override; + + css::uno::Sequence SAL_CALL getSupportedServiceNames() override; + + // XDispatchProvider + + virtual css::uno::Reference SAL_CALL + queryDispatch ( + const css::util::URL& aURL, + const OUString& aTargetFrameName, + sal_Int32 nSearchFlags ) override; + + virtual css::uno::Sequence > SAL_CALL + queryDispatches( + const css::uno::Sequence< css::frame::DispatchDescriptor>& rDescriptors) override; + + /// See XCacheInfo::IsCachingAllowed(). + sal_Bool SAL_CALL isCachingAllowed() override { return false; } + +private: + class Dispatch; + ::rtl::Reference mpPresenterController; + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterScreen.cxx b/sd/source/console/PresenterScreen.cxx new file mode 100644 index 0000000000..cd6c20d38c --- /dev/null +++ b/sd/source/console/PresenterScreen.cxx @@ -0,0 +1,824 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterScreen.hxx" +#include "PresenterConfigurationAccess.hxx" +#include "PresenterController.hxx" +#include "PresenterFrameworkObserver.hxx" +#include "PresenterHelper.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterPaneFactory.hxx" +#include "PresenterViewFactory.hxx" +#include "PresenterWindowManager.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +namespace { + typedef ::cppu::WeakComponentImplHelper < + css::document::XEventListener + > PresenterScreenListenerInterfaceBase; + + /** One instance of a PresenterScreenListener is registered per Impress + document and waits for the full screen slide show to start and to + end. + */ + class PresenterScreenListener + : private ::cppu::BaseMutex, + public PresenterScreenListenerInterfaceBase + { + public: + PresenterScreenListener ( + css::uno::Reference xContext, + css::uno::Reference xModel); + PresenterScreenListener(const PresenterScreenListener&) = delete; + PresenterScreenListener& operator=(const PresenterScreenListener&) = delete; + + void Initialize(); + virtual void SAL_CALL disposing() override; + + // document::XEventListener + + virtual void SAL_CALL notifyEvent( const css::document::EventObject& Event ) override; + + // XEventListener + + virtual void SAL_CALL disposing ( const css::lang::EventObject& rEvent) override; + + private: + css::uno::Reference mxModel; + css::uno::Reference mxComponentContext; + rtl::Reference mpPresenterScreen; + }; +} + +//----- XServiceInfo --------------------------------------------------------------- + +Sequence< OUString > SAL_CALL PresenterScreenJob::getSupportedServiceNames() +{ + return { }; +} + +OUString SAL_CALL PresenterScreenJob::getImplementationName() +{ + return "org.libreoffice.comp.PresenterScreenJob"; +} + +sal_Bool SAL_CALL PresenterScreenJob::supportsService(const OUString& aServiceName) +{ + return cppu::supportsService(this, aServiceName); +} + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +sd_PresenterScreenJob_get_implementation( + css::uno::XComponentContext* context , css::uno::Sequence const&) +{ + return cppu::acquire(new PresenterScreenJob(context)); +} + + +//===== PresenterScreenJob ==================================================== + +PresenterScreenJob::PresenterScreenJob (const Reference& rxContext) + : PresenterScreenJobInterfaceBase(m_aMutex), + mxComponentContext(rxContext) +{ +} + +PresenterScreenJob::~PresenterScreenJob() +{ +} + +void SAL_CALL PresenterScreenJob::disposing() +{ + mxComponentContext = nullptr; +} + +//----- XJob ----------------------------------------------------------- + +Any SAL_CALL PresenterScreenJob::execute( + const Sequence< beans::NamedValue >& Arguments ) +{ + Sequence< beans::NamedValue > lEnv; + auto pArg = std::find_if(Arguments.begin(), Arguments.end(), + [](const beans::NamedValue& rArg) { return rArg.Name == "Environment"; }); + if (pArg != Arguments.end()) + pArg->Value >>= lEnv; + + Reference xModel; + auto pProp = std::find_if(std::cbegin(lEnv), std::cend(lEnv), + [](const beans::NamedValue& rProp) { return rProp.Name == "Model"; }); + if (pProp != std::cend(lEnv)) + pProp->Value >>= xModel; + + Reference< XServiceInfo > xInfo( xModel, UNO_QUERY ); + if( xInfo.is() && xInfo->supportsService("com.sun.star.presentation.PresentationDocument") ) + { + // Create a new listener that waits for the full screen presentation + // to start and to end. It takes care of its own lifetime. + ::rtl::Reference pListener ( + new PresenterScreenListener(mxComponentContext, xModel)); + pListener->Initialize(); + } + + return Any(); +} + +//===== PresenterScreenListener =============================================== + +namespace { + +PresenterScreenListener::PresenterScreenListener ( + css::uno::Reference xContext, + css::uno::Reference xModel) + : PresenterScreenListenerInterfaceBase(m_aMutex), + mxModel(std::move(xModel)), + mxComponentContext(std::move(xContext)) +{ +} + +void PresenterScreenListener::Initialize() +{ + Reference< document::XEventListener > xDocListener(this); + Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY ); + if( xDocBroadcaster.is() ) + xDocBroadcaster->addEventListener(xDocListener); +} + +void SAL_CALL PresenterScreenListener::disposing() +{ + Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY ); + if( xDocBroadcaster.is() ) + xDocBroadcaster->removeEventListener( + Reference(this) ); + + if (mpPresenterScreen.is()) + { + mpPresenterScreen->RequestShutdownPresenterScreen(); + mpPresenterScreen = nullptr; + } +} + +// document::XEventListener + +void SAL_CALL PresenterScreenListener::notifyEvent( const css::document::EventObject& Event ) +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterScreenListener object has already been disposed", + static_cast(this)); + } + + if ( Event.EventName == "OnStartPresentation" ) + { + mpPresenterScreen = new PresenterScreen(mxComponentContext, mxModel); + if(PresenterScreen::isPresenterScreenEnabled(mxComponentContext)) + mpPresenterScreen->InitializePresenterScreen(); + } + else if ( Event.EventName == "OnEndPresentation" ) + { + if (mpPresenterScreen.is()) + { + mpPresenterScreen->RequestShutdownPresenterScreen(); + mpPresenterScreen = nullptr; + } + } +} + +// XEventListener + +void SAL_CALL PresenterScreenListener::disposing (const css::lang::EventObject&) +{ + if (mpPresenterScreen.is()) + { + mpPresenterScreen->RequestShutdownPresenterScreen(); + mpPresenterScreen = nullptr; + } +} + +} // end of anonymous namespace + +//===== PresenterScreen ======================================================= + +PresenterScreen::PresenterScreen ( + const Reference& rxContext, + css::uno::Reference xModel) + : PresenterScreenInterfaceBase(m_aMutex), + mxModel(std::move(xModel)), + mxContextWeak(rxContext) +{ +} + +PresenterScreen::~PresenterScreen() +{ +} + +bool PresenterScreen::isPresenterScreenEnabled(const css::uno::Reference& rxContext) +{ + bool dEnablePresenterScreen=true; + PresenterConfigurationAccess aConfiguration ( + rxContext, + "/org.openoffice.Office.Impress/", + PresenterConfigurationAccess::READ_ONLY); + aConfiguration.GetConfigurationNode("Misc/Start/EnablePresenterScreen") + >>= dEnablePresenterScreen; + return dEnablePresenterScreen; +} + +bool PresenterScreen::isPresenterScreenFullScreen(const css::uno::Reference& rxContext) +{ + bool dPresenterScreenFullScreen = true; + PresenterConfigurationAccess aConfiguration ( + rxContext, + "/org.openoffice.Office.Impress/", + PresenterConfigurationAccess::READ_ONLY); + aConfiguration.GetConfigurationNode("Misc/Start/PresenterScreenFullScreen") + >>= dPresenterScreenFullScreen; + return dPresenterScreenFullScreen; +} + +void SAL_CALL PresenterScreen::disposing() +{ + Reference xCC (mxConfigurationControllerWeak); + if (xCC.is() && mxSavedConfiguration.is()) + { + xCC->restoreConfiguration(mxSavedConfiguration); + } + mxConfigurationControllerWeak = Reference(nullptr); + + Reference xViewFactoryComponent (mxViewFactory, UNO_QUERY); + if (xViewFactoryComponent.is()) + xViewFactoryComponent->dispose(); + Reference xPaneFactoryComponent (mxPaneFactory, UNO_QUERY); + if (xPaneFactoryComponent.is()) + xPaneFactoryComponent->dispose(); + + mxModel = nullptr; +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL PresenterScreen::disposing (const lang::EventObject& /*rEvent*/) +{ + RequestShutdownPresenterScreen(); +} + + +void PresenterScreen::InitializePresenterScreen() +{ + try + { + Reference xContext (mxContextWeak); + mpPaneContainer = new PresenterPaneContainer(xContext); + + Reference xPS ( mxModel, UNO_QUERY_THROW); + Reference xPresentation(xPS->getPresentation(), UNO_QUERY_THROW); + Reference xSlideShowController( xPresentation->getController() ); + + if( !xSlideShowController.is() || !xSlideShowController->isFullScreen() ) + return; + + // find first controller that is not the current controller (the one with the slideshow + auto tmpController = mxModel->getCurrentController(); + Reference< container::XEnumeration > xEnum( mxModel->getControllers() ); + if( xEnum.is() ) + { + while( xEnum->hasMoreElements() ) + { + Reference< frame::XController > xC( xEnum->nextElement(), UNO_QUERY ); + if( xC.is() && (xC.get() != tmpController.get()) ) + { + mxController = dynamic_cast<::sd::DrawController*>(xC.get()); + assert(bool(mxController) == bool(xC) && "only support instances of type DrawController"); + break; + } + } + } + // Get the XController from the first argument. + + Reference xCC( mxController->getConfigurationController()); + mxConfigurationControllerWeak = xCC; + + Reference xMainPaneId( + GetMainPaneId(xPresentation, xContext)); + // An empty reference means that the presenter screen can + // not or must not be displayed. + if ( ! xMainPaneId.is()) + return; + + if (xCC.is() && xContext.is()) + { + // Store the current configuration so that we can restore it when + // the presenter view is deactivated. + mxSavedConfiguration = xCC->getRequestedConfiguration(); + xCC->lock(); + + try + { + // At the moment the presenter controller is displayed in its + // own full screen window that is controlled by the same + // configuration controller as the Impress document from + // which the presentation was started. Therefore the main + // pane is activated additionally to the already existing + // panes and does not replace them. + xCC->requestResourceActivation( + xMainPaneId, + ResourceActivationMode_ADD); + SetupConfiguration(xContext, xMainPaneId); + + mpPresenterController = new PresenterController( + this, + xContext, + mxController, + xSlideShowController, + mpPaneContainer, + xMainPaneId); + + // Create pane and view factories and integrate them into the + // drawing framework. + SetupPaneFactory(xContext); + SetupViewFactory(xContext); + + mpPresenterController->GetWindowManager()->RestoreViewMode(); + } + catch (const RuntimeException&) + { + xCC->restoreConfiguration(mxSavedConfiguration); + } + xCC->unlock(); + } + } + catch (const Exception&) + { + } +} + +void PresenterScreen::SwitchMonitors() +{ + try { + Reference xPS ( mxModel, UNO_QUERY_THROW); + Reference xPresentation(xPS->getPresentation(), UNO_QUERY_THROW); + + // Get the existing presenter console screen, we want to switch the + // presentation to use that instead. + sal_Int32 nNewScreen = GetPresenterScreenNumber (xPresentation); + if (nNewScreen < 0) + return; + + // Adapt that display number to be the 'default' setting of 0 if it matches + sal_Int32 nExternalDisplay = Application::GetDisplayExternalScreen(); + + if (nNewScreen == nExternalDisplay) + nNewScreen = 0; // screen zero is best == the primary display + else + nNewScreen++; // otherwise we store screens offset by one. + + // Set the new presentation display + Reference xProperties (xPresentation, UNO_QUERY_THROW); + xProperties->setPropertyValue("Display", Any(nNewScreen)); + } catch (const uno::Exception &) { + } +} + +/** + * Return the real VCL screen number to show the presenter console + * on or -1 to not show anything. + */ +sal_Int32 PresenterScreen::GetPresenterScreenNumber ( + const Reference& rxPresentation) const +{ + sal_Int32 nScreenNumber (0); + try + { + if ( ! rxPresentation.is()) + return -1; + + // Determine the screen on which the full screen presentation is being + // displayed. + sal_Int32 nDisplayNumber (-1); + if ( ! (rxPresentation->getPropertyValue("Display") >>= nDisplayNumber)) + return -1; + if (nDisplayNumber == -1) + { + // The special value -1 indicates that the slide show + // spans all available displays. That leaves no room for + // the presenter screen. + return -1; + } + + SAL_INFO("sdext.presenter", "Display number is " << nDisplayNumber); + + if (nDisplayNumber > 0) + { + nScreenNumber = nDisplayNumber - 1; + } + else if (nDisplayNumber == 0) + { + // A display number value of 0 indicates the primary screen. + // Find out which screen number that is. + nScreenNumber = Application::GetDisplayExternalScreen(); + } + + // We still have to determine the number of screens to decide + // whether the presenter screen may be shown at all. + sal_Int32 nScreenCount = Application::GetScreenCount(); + + if (nScreenCount < 2 || nDisplayNumber > nScreenCount) + { + // There is either only one screen or the full screen + // presentation spans all available screens. The presenter + // screen is shown only when a special flag in the configuration + // is set or when the presenter screen will be shown as + // non-full screen window + Reference xContext (mxContextWeak); + PresenterConfigurationAccess aConfiguration ( + xContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + bool bStartAlways (false); + bool bPresenterScreenFullScreen = isPresenterScreenFullScreen(xContext); + if (aConfiguration.GetConfigurationNode( + "Presenter/StartAlways") >>= bStartAlways) + { + if (bStartAlways || !bPresenterScreenFullScreen) + return GetPresenterScreenFromScreen(nScreenNumber); + } + return -1; + } + } + catch (const beans::UnknownPropertyException&) + { + OSL_ASSERT(false); + // For some reason we can not access the screen number. Use + // the default instead. + } + SAL_INFO("sdext.presenter", "Get presenter screen for screen " << nScreenNumber); + return GetPresenterScreenFromScreen(nScreenNumber); +} + +sal_Int32 PresenterScreen::GetPresenterScreenFromScreen( sal_Int32 nPresentationScreen ) +{ + // Setup the resource id of the full screen background pane so that + // it is displayed on another screen than the presentation. + sal_Int32 nPresenterScreenNumber (1); + switch (nPresentationScreen) + { + case 0: + nPresenterScreenNumber = 1; + break; + + case 1: + nPresenterScreenNumber = 0; + break; + + default: + SAL_INFO("sdext.presenter", "Warning unexpected, out of bound screen " + "mapped to 0" << nPresentationScreen); + // When the full screen presentation is displayed on a screen + // other than 0 or 1 then place the presenter on the first + // available screen. + nPresenterScreenNumber = 0; + break; + } + return nPresenterScreenNumber; +} + +Reference PresenterScreen::GetMainPaneId ( + const Reference& rxPresentation, + const Reference& xContext) const +{ + // A negative value means that the presentation spans all available + // displays. That leaves no room for the presenter. + const sal_Int32 nScreen(GetPresenterScreenNumber(rxPresentation)); + if (nScreen < 0) + return nullptr; + + auto fullScreenStr = isPresenterScreenFullScreen(xContext) + ? OUString("true") + : OUString("false"); + + return ResourceId::create( + Reference(mxContextWeak), + PresenterHelper::msFullScreenPaneURL + + "?FullScreen=" + + fullScreenStr + + "&ScreenNumber=" + + OUString::number(nScreen)); +} + +void PresenterScreen::RequestShutdownPresenterScreen() +{ + // Restore the configuration that was active before the presenter screen + // has been activated. Now, that the presenter screen is displayed in + // its own top level window this probably not necessary, but one never knows. + Reference xCC (mxConfigurationControllerWeak); + if (xCC.is() && mxSavedConfiguration.is()) + { + xCC->restoreConfiguration(mxSavedConfiguration); + mxSavedConfiguration = nullptr; + } + + if (xCC.is()) + { + // The actual restoration of the configuration takes place + // asynchronously. The view and pane factories can only by disposed + // after that. Therefore, set up a listener and wait for the + // restoration. + rtl::Reference pSelf (this); + PresenterFrameworkObserver::RunOnUpdateEnd( + xCC, + [pSelf](bool){ return pSelf->ShutdownPresenterScreen(); }); + xCC->update(); + } +} + +void PresenterScreen::ShutdownPresenterScreen() +{ + Reference xViewFactoryComponent (mxViewFactory, UNO_QUERY); + if (xViewFactoryComponent.is()) + xViewFactoryComponent->dispose(); + mxViewFactory = nullptr; + + Reference xPaneFactoryComponent (mxPaneFactory, UNO_QUERY); + if (xPaneFactoryComponent.is()) + xPaneFactoryComponent->dispose(); + mxPaneFactory = nullptr; + + if (mpPresenterController) + { + mpPresenterController->dispose(); + mpPresenterController.clear(); + } + mpPaneContainer = new PresenterPaneContainer(Reference(mxContextWeak)); +} + +void PresenterScreen::SetupPaneFactory (const Reference& rxContext) +{ + try + { + if ( ! mxPaneFactory.is()) + mxPaneFactory = PresenterPaneFactory::Create( + rxContext, + mxController, + mpPresenterController); + } + catch (const RuntimeException&) + { + OSL_ASSERT(false); + } +} + +void PresenterScreen::SetupViewFactory (const Reference& rxContext) +{ + try + { + if ( ! mxViewFactory.is()) + mxViewFactory = PresenterViewFactory::Create( + rxContext, + mxController, + mpPresenterController); + } + catch (const RuntimeException&) + { + OSL_ASSERT(false); + } +} + +void PresenterScreen::SetupConfiguration ( + const Reference& rxContext, + const Reference& rxAnchorId) +{ + try + { + PresenterConfigurationAccess aConfiguration ( + rxContext, + "org.openoffice.Office.PresenterScreen", + PresenterConfigurationAccess::READ_ONLY); + maViewDescriptors.clear(); + ProcessViewDescriptions(aConfiguration); + OUString sLayoutName ("DefaultLayout"); + aConfiguration.GetConfigurationNode( + "Presenter/CurrentLayout") >>= sLayoutName; + ProcessLayout(aConfiguration, sLayoutName, rxContext, rxAnchorId); + } + catch (const RuntimeException&) + { + } +} + +void PresenterScreen::ProcessLayout ( + PresenterConfigurationAccess& rConfiguration, + std::u16string_view rsLayoutName, + const Reference& rxContext, + const Reference& rxAnchorId) +{ + try + { + Reference xLayoutNode ( + rConfiguration.GetConfigurationNode( + OUString::Concat("Presenter/Layouts/")+rsLayoutName), + UNO_QUERY_THROW); + + // Read the parent layout first, if one is referenced. + OUString sParentLayout; + PresenterConfigurationAccess::GetConfigurationNode( + xLayoutNode, + "ParentLayout") >>= sParentLayout; + if (!sParentLayout.isEmpty()) + { + // Prevent infinite recursion. + if (rsLayoutName != sParentLayout) + ProcessLayout(rConfiguration, sParentLayout, rxContext, rxAnchorId); + } + + // Process the actual layout list. + Reference xList ( + PresenterConfigurationAccess::GetConfigurationNode( + xLayoutNode, + "Layout"), + UNO_QUERY_THROW); + + ::std::vector aProperties + { + "PaneURL", + "ViewURL", + "RelativeX", + "RelativeY", + "RelativeWidth", + "RelativeHeight" + }; + PresenterConfigurationAccess::ForAll( + xList, + aProperties, + [this, rxContext, rxAnchorId](std::vector const& rArgs) + { + this->ProcessComponent(rArgs, rxContext, rxAnchorId); + }); + } + catch (const RuntimeException&) + { + } +} + +void PresenterScreen::ProcessViewDescriptions ( + PresenterConfigurationAccess& rConfiguration) +{ + try + { + Reference xViewDescriptionsNode ( + rConfiguration.GetConfigurationNode("Presenter/Views"), + UNO_QUERY_THROW); + + ::std::vector aProperties + { + "ViewURL", + "Title", + "AccessibleTitle", + "IsOpaque" + }; + PresenterConfigurationAccess::ForAll( + xViewDescriptionsNode, + aProperties, + [this](std::vector const& rArgs) + { + return this->ProcessViewDescription(rArgs); + }); + } + catch (const RuntimeException&) + { + OSL_ASSERT(false); + } +} + +void PresenterScreen::ProcessComponent ( + const ::std::vector& rValues, + const Reference& rxContext, + const Reference& rxAnchorId) +{ + if (rValues.size() != 6) + return; + + try + { + OUString sPaneURL; + OUString sViewURL; + double nX = 0; + double nY = 0; + double nWidth = 0; + double nHeight = 0; + rValues[0] >>= sPaneURL; + rValues[1] >>= sViewURL; + rValues[2] >>= nX; + rValues[3] >>= nY; + rValues[4] >>= nWidth; + rValues[5] >>= nHeight; + + if (nX>=0 && nY>=0 && nWidth>0 && nHeight>0) + { + SetupView( + rxContext, + rxAnchorId, + sPaneURL, + sViewURL, + PresenterPaneContainer::ViewInitializationFunction()); + } + } + catch (const Exception&) + { + OSL_ASSERT(false); + } +} + +void PresenterScreen::ProcessViewDescription ( + const ::std::vector& rValues) +{ + if (rValues.size() != 4) + return; + + try + { + ViewDescriptor aViewDescriptor; + OUString sViewURL; + rValues[0] >>= sViewURL; + rValues[1] >>= aViewDescriptor.msTitle; + rValues[2] >>= aViewDescriptor.msAccessibleTitle; + rValues[3] >>= aViewDescriptor.mbIsOpaque; + if (aViewDescriptor.msAccessibleTitle.isEmpty()) + aViewDescriptor.msAccessibleTitle = aViewDescriptor.msTitle; + maViewDescriptors[sViewURL] = aViewDescriptor; + } + catch (const Exception&) + { + OSL_ASSERT(false); + } +} + +void PresenterScreen::SetupView( + const Reference& rxContext, + const Reference& rxAnchorId, + const OUString& rsPaneURL, + const OUString& rsViewURL, + const PresenterPaneContainer::ViewInitializationFunction& rViewInitialization) +{ + Reference xCC (mxConfigurationControllerWeak); + if (!xCC.is()) + return; + + Reference xPaneId (ResourceId::createWithAnchor(rxContext,rsPaneURL,rxAnchorId)); + // Look up the view descriptor. + ViewDescriptor aViewDescriptor; + ViewDescriptorContainer::const_iterator iDescriptor (maViewDescriptors.find(rsViewURL)); + if (iDescriptor != maViewDescriptors.end()) + aViewDescriptor = iDescriptor->second; + + // Prepare the pane. + OSL_ASSERT(mpPaneContainer); + mpPaneContainer->PreparePane( + xPaneId, + rsViewURL, + aViewDescriptor.msTitle, + aViewDescriptor.msAccessibleTitle, + aViewDescriptor.mbIsOpaque, + rViewInitialization); +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterScreen.hxx b/sd/source/console/PresenterScreen.hxx new file mode 100644 index 0000000000..0445311b96 --- /dev/null +++ b/sd/source/console/PresenterScreen.hxx @@ -0,0 +1,233 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSCREEN_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSCREEN_HXX + +#include "PresenterConfigurationAccess.hxx" +#include "PresenterPaneContainer.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace sd { class DrawController; } + +namespace sdext::presenter { + +class PresenterController; + +typedef ::cppu::WeakComponentImplHelper < + css::task::XJob, css::lang::XServiceInfo + > PresenterScreenJobInterfaceBase; + +/** The PresenterScreenJob service is instantiated every time a document is + created or loaded. In its execute() method it then filters out all + non-Impress documents and creates and registers a new PresenterScreen + object. +*/ +class PresenterScreenJob + : private ::cppu::BaseMutex, + public PresenterScreenJobInterfaceBase +{ +public: + PresenterScreenJob(const PresenterScreenJob&) = delete; + PresenterScreenJob& operator=(const PresenterScreenJob&) = delete; + + virtual void SAL_CALL disposing() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames () override; + + // XJob + virtual css::uno::Any SAL_CALL execute( + const css::uno::Sequence& Arguments) override; + + explicit PresenterScreenJob (const css::uno::Reference& rxContext); + virtual ~PresenterScreenJob() override; + +private: + css::uno::Reference mxComponentContext; +}; + +/** This is the bootstrap class of the presenter screen. It is registered + as drawing framework startup service. That means that every drawing + framework instance creates an instance of this class. + +

    A PresenterScreen object registers itself as listener for drawing + framework configuration changes. It waits for the full screen marker (a + top level resource) to appear in the current configuration. When that + happens the actual presenter screen is initialized. A new + PresenterController is created and takes over the task of controlling + the presenter screen.

    +*/ +typedef ::cppu::WeakComponentImplHelper < + css::lang::XEventListener + > PresenterScreenInterfaceBase; +class PresenterScreen + : private ::cppu::BaseMutex, + public PresenterScreenInterfaceBase +{ +public: + PresenterScreen ( + const css::uno::Reference& rxContext, + css::uno::Reference xModel); + virtual ~PresenterScreen() override; + PresenterScreen(const PresenterScreen&) = delete; + PresenterScreen& operator=(const PresenterScreen&) = delete; + + virtual void SAL_CALL disposing() override; + + static bool isPresenterScreenEnabled( + const css::uno::Reference& rxContext); + static bool isPresenterScreenFullScreen( + const css::uno::Reference& rxContext); + + /** Make the presenter screen visible. + */ + void InitializePresenterScreen(); + + /** Do not call ShutdownPresenterScreen() directly. Call + RequestShutdownPresenterScreen() instead. It will issue an + asynchronous call to ShutdownPresenterScreen() when that is safe. + */ + void RequestShutdownPresenterScreen(); + + /** Switch / converse monitors between presenter view and slide output + */ + void SwitchMonitors(); + + // XEventListener + + virtual void SAL_CALL disposing ( const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference mxModel; + rtl::Reference<::sd::DrawController> mxController; + css::uno::WeakReference + mxConfigurationControllerWeak; + css::uno::WeakReference mxContextWeak; + ::rtl::Reference mpPresenterController; + css::uno::Reference mxSavedConfiguration; + ::rtl::Reference mpPaneContainer; + css::uno::Reference mxPaneFactory; + css::uno::Reference mxViewFactory; + + class ViewDescriptor + { + public: + OUString msTitle; + OUString msAccessibleTitle; + bool mbIsOpaque; + ViewDescriptor() + : mbIsOpaque(false) + { + } + }; + typedef ::std::map ViewDescriptorContainer; + ViewDescriptorContainer maViewDescriptors; + + void ShutdownPresenterScreen(); + + /** Create and initialize the factory for presenter view specific panes. + */ + void SetupPaneFactory ( + const css::uno::Reference& rxContext); + + /** Create and initialize the factory for presenter view specific views. + */ + void SetupViewFactory ( + const css::uno::Reference& rxContext); + + /** Read the current layout from the configuration and call + ProcessLayout to bring it on to the screen. + */ + void SetupConfiguration ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxAnchorId); + + /** Read one layout from the configuration and make resource activation + requests to bring it on to the screen. When one layout references a + parent layout then this method calls itself recursively. + */ + void ProcessLayout ( + PresenterConfigurationAccess& rConfiguration, + std::u16string_view rsLayoutName, + const css::uno::Reference& rxContext, + const css::uno::Reference& rxAnchorId); + + /** Called by ProcessLayout for a single entry of a Layouts + configuration list. + */ + void ProcessComponent ( + const ::std::vector& rValues, + const css::uno::Reference& rxContext, + const css::uno::Reference& rxAnchorId); + + /** Read the view descriptions from the configuration. + */ + void ProcessViewDescriptions ( + PresenterConfigurationAccess& rConfiguration); + + /** Called by ProcessViewDescriptions for a single entry. + */ + void ProcessViewDescription ( + const ::std::vector& rValues); + + void SetupView ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxAnchorId, + const OUString& rsPaneURL, + const OUString& rsViewURL, + const PresenterPaneContainer::ViewInitializationFunction& rViewInitialization); + + /** Return the built-in screen number on the presentation will normally + display the presenter console. + @return + Returns -1 when the presenter screen can or shall not be + displayed. + */ + sal_Int32 GetPresenterScreenNumber ( + const css::uno::Reference& rxPresentation) const; + + static sal_Int32 GetPresenterScreenFromScreen( sal_Int32 nPresentationScreen ); + + /** Create a resource id for the full screen background pane so that it + is displayed on another screen than the full screen presentation. + */ + css::uno::Reference GetMainPaneId ( + const css::uno::Reference& rxPresentation, + const css::uno::Reference& xContext) const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterScrollBar.cxx b/sd/source/console/PresenterScrollBar.cxx new file mode 100644 index 0000000000..3a0891ec5d --- /dev/null +++ b/sd/source/console/PresenterScrollBar.cxx @@ -0,0 +1,825 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterScrollBar.hxx" +#include "PresenterBitmapContainer.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterTimer.hxx" +#include "PresenterUIPainter.hxx" +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +const double gnScrollBarGap (10); + +namespace sdext::presenter { + +//===== PresenterScrollBar::MousePressRepeater ================================ + +class PresenterScrollBar::MousePressRepeater + : public std::enable_shared_from_this +{ +public: + explicit MousePressRepeater (::rtl::Reference xScrollBar); + void Dispose(); + void Start (const PresenterScrollBar::Area& reArea); + void Stop(); + void SetMouseArea (const PresenterScrollBar::Area& reArea); + +private: + void Callback (); + void Execute(); + + sal_Int32 mnMousePressRepeaterTaskId; + ::rtl::Reference mpScrollBar; + PresenterScrollBar::Area meMouseArea; +}; + +//===== PresenterScrollBar ==================================================== + +std::weak_ptr PresenterScrollBar::mpSharedBitmaps; + +PresenterScrollBar::PresenterScrollBar ( + const Reference& rxComponentContext, + const Reference& rxParentWindow, + std::shared_ptr xPaintManager, + ::std::function aThumbMotionListener) + : PresenterScrollBarInterfaceBase(m_aMutex), + mxComponentContext(rxComponentContext), + mpPaintManager(std::move(xPaintManager)), + mnThumbPosition(0), + mnTotalSize(0), + mnThumbSize(0), + mnLineHeight(10), + maDragAnchor(-1,-1), + maThumbMotionListener(std::move(aThumbMotionListener)), + meButtonDownArea(None), + meMouseMoveArea(None), + mbIsNotificationActive(false), + mpMousePressRepeater(std::make_shared(this)), + mpCanvasHelper(new PresenterCanvasHelper()) +{ + try + { + Reference xFactory (rxComponentContext->getServiceManager()); + if ( ! xFactory.is()) + throw RuntimeException(); + + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + rxComponentContext), + UNO_QUERY_THROW); + + if (mxPresenterHelper.is()) + mxWindow = mxPresenterHelper->createWindow(rxParentWindow, + false, + false, + false, + false); + + // Make the background transparent. The slide show paints its own background. + Reference xPeer (mxWindow, UNO_QUERY_THROW); + xPeer->setBackground(0xff000000); + + mxWindow->setVisible(true); + mxWindow->addWindowListener(this); + mxWindow->addPaintListener(this); + mxWindow->addMouseListener(this); + mxWindow->addMouseMotionListener(this); + } + catch (RuntimeException&) + { + } +} + +PresenterScrollBar::~PresenterScrollBar() +{ +} + +void SAL_CALL PresenterScrollBar::disposing() +{ + mpMousePressRepeater->Dispose(); + + if (mxWindow.is()) + { + mxWindow->removeWindowListener(this); + mxWindow->removePaintListener(this); + mxWindow->removeMouseListener(this); + mxWindow->removeMouseMotionListener(this); + + Reference xComponent = mxWindow; + mxWindow = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + mpBitmaps.reset(); +} + +void PresenterScrollBar::SetVisible (const bool bIsVisible) +{ + if (mxWindow.is()) + mxWindow->setVisible(bIsVisible); +} + +void PresenterScrollBar::SetPosSize (const css::geometry::RealRectangle2D& rBox) +{ + if (mxWindow.is()) + { + mxWindow->setPosSize( + sal_Int32(floor(rBox.X1)), + sal_Int32(ceil(rBox.Y1)), + sal_Int32(ceil(rBox.X2-rBox.X1)), + sal_Int32(floor(rBox.Y2-rBox.Y1)), + awt::PosSize::POSSIZE); + UpdateBorders(); + } +} + +void PresenterScrollBar::SetThumbPosition ( + double nPosition, + const bool bAsynchronousUpdate) +{ + nPosition = ValidateThumbPosition(nPosition); + + if (nPosition == mnThumbPosition || mbIsNotificationActive) + return; + + mnThumbPosition = nPosition; + + UpdateBorders(); + Repaint(GetRectangle(Total), bAsynchronousUpdate); + + mbIsNotificationActive = true; + try + { + maThumbMotionListener(mnThumbPosition); + } + catch (Exception&) + { + } + mbIsNotificationActive = false; +} + + +void PresenterScrollBar::SetTotalSize (const double nTotalSize) +{ + if (mnTotalSize != nTotalSize) + { + mnTotalSize = nTotalSize + 1; + UpdateBorders(); + Repaint(GetRectangle(Total), false); + } +} + +void PresenterScrollBar::SetThumbSize (const double nThumbSize) +{ + OSL_ASSERT(nThumbSize>=0); + if (mnThumbSize != nThumbSize) + { + mnThumbSize = nThumbSize; + UpdateBorders(); + Repaint(GetRectangle(Total), false); + } +} + + +void PresenterScrollBar::SetLineHeight (const double nLineHeight) +{ + mnLineHeight = nLineHeight; +} + + +void PresenterScrollBar::SetCanvas (const Reference& rxCanvas) +{ + if (mxCanvas == rxCanvas) + return; + + mxCanvas = rxCanvas; + if (!mxCanvas.is()) + return; + + if (mpBitmaps == nullptr) + { + mpBitmaps = mpSharedBitmaps.lock(); + if (!mpBitmaps) + { + try + { + mpBitmaps = std::make_shared( + "PresenterScreenSettings/ScrollBar/Bitmaps", + std::shared_ptr(), + mxComponentContext, + mxCanvas); + mpSharedBitmaps = mpBitmaps; + } + catch(Exception&) + { + OSL_ASSERT(false); + } + } + UpdateBitmaps(); + UpdateBorders(); + } + + Repaint(GetRectangle(Total), false); +} + +void PresenterScrollBar::SetBackground (const SharedBitmapDescriptor& rpBackgroundBitmap) +{ + mpBackgroundBitmap = rpBackgroundBitmap; +} + +void PresenterScrollBar::CheckValues() +{ + mnThumbPosition = ValidateThumbPosition(mnThumbPosition); +} + +double PresenterScrollBar::ValidateThumbPosition (double nPosition) +{ + if (nPosition + mnThumbSize > mnTotalSize) + nPosition = mnTotalSize - mnThumbSize; + if (nPosition < 0) + nPosition = 0; + return nPosition; +} + +void PresenterScrollBar::Paint ( + const awt::Rectangle& rUpdateBox) +{ + if ( ! mxCanvas.is() || ! mxWindow.is()) + { + OSL_ASSERT(mxCanvas.is()); + OSL_ASSERT(mxWindow.is()); + return; + } + + if (PresenterGeometryHelper::AreRectanglesDisjoint (rUpdateBox, mxWindow->getPosSize())) + return; + + PaintBackground(rUpdateBox); + PaintComposite(rUpdateBox, PagerUp, + mpPagerStartDescriptor, mpPagerCenterDescriptor, SharedBitmapDescriptor()); + PaintComposite(rUpdateBox, PagerDown, + SharedBitmapDescriptor(), mpPagerCenterDescriptor, mpPagerEndDescriptor); + PaintComposite(rUpdateBox, Thumb, + mpThumbStartDescriptor, mpThumbCenterDescriptor, mpThumbEndDescriptor); + PaintBitmap(rUpdateBox, PrevButton, mpPrevButtonDescriptor); + PaintBitmap(rUpdateBox, NextButton, mpNextButtonDescriptor); + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterScrollBar::windowResized (const css::awt::WindowEvent&) {} + +void SAL_CALL PresenterScrollBar::windowMoved (const css::awt::WindowEvent&) {} + +void SAL_CALL PresenterScrollBar::windowShown (const css::lang::EventObject&) {} + +void SAL_CALL PresenterScrollBar::windowHidden (const css::lang::EventObject&) {} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterScrollBar::windowPaint (const css::awt::PaintEvent& rEvent) +{ + if (mxWindow.is()) + { + awt::Rectangle aRepaintBox (rEvent.UpdateRect); + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + aRepaintBox.X += aWindowBox.X; + aRepaintBox.Y += aWindowBox.Y; + Paint(aRepaintBox); + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); + } +} + +//----- XMouseListener -------------------------------------------------------- + +void SAL_CALL PresenterScrollBar::mousePressed (const css::awt::MouseEvent& rEvent) +{ + maDragAnchor.X = rEvent.X; + maDragAnchor.Y = rEvent.Y; + meButtonDownArea = GetArea(rEvent.X, rEvent.Y); + + mpMousePressRepeater->Start(meButtonDownArea); +} + +void SAL_CALL PresenterScrollBar::mouseReleased (const css::awt::MouseEvent&) +{ + mpMousePressRepeater->Stop(); + + if (mxPresenterHelper.is()) + mxPresenterHelper->releaseMouse(mxWindow); +} + +void SAL_CALL PresenterScrollBar::mouseEntered (const css::awt::MouseEvent&) {} + +void SAL_CALL PresenterScrollBar::mouseExited (const css::awt::MouseEvent&) +{ + if (meMouseMoveArea != None) + { + const Area eOldMouseMoveArea (meMouseMoveArea); + meMouseMoveArea = None; + Repaint(GetRectangle(eOldMouseMoveArea), true); + } + meButtonDownArea = None; + meMouseMoveArea = None; + + mpMousePressRepeater->Stop(); +} + +//----- XMouseMotionListener -------------------------------------------------- + +void SAL_CALL PresenterScrollBar::mouseMoved (const css::awt::MouseEvent& rEvent) +{ + const Area eArea (GetArea(rEvent.X, rEvent.Y)); + if (eArea != meMouseMoveArea) + { + const Area eOldMouseMoveArea (meMouseMoveArea); + meMouseMoveArea = eArea; + if (eOldMouseMoveArea != None) + Repaint(GetRectangle(eOldMouseMoveArea), meMouseMoveArea==None); + if (meMouseMoveArea != None) + Repaint(GetRectangle(meMouseMoveArea), true); + } + mpMousePressRepeater->SetMouseArea(eArea); +} + +void SAL_CALL PresenterScrollBar::mouseDragged (const css::awt::MouseEvent& rEvent) +{ + if (meButtonDownArea != Thumb) + return; + + mpMousePressRepeater->Stop(); + + if (mxPresenterHelper.is()) + mxPresenterHelper->captureMouse(mxWindow); + + const double nDragDistance (GetDragDistance(rEvent.X,rEvent.Y)); + UpdateDragAnchor(nDragDistance); + if (nDragDistance != 0) + { + SetThumbPosition(mnThumbPosition + nDragDistance, false); + } +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterScrollBar::disposing (const css::lang::EventObject& rEvent) +{ + if (rEvent.Source == mxWindow) + mxWindow = nullptr; +} + + +geometry::RealRectangle2D const & PresenterScrollBar::GetRectangle (const Area eArea) const +{ + OSL_ASSERT(eArea>=0 && eAreaInvalidate( + mxWindow, + PresenterGeometryHelper::ConvertRectangle(rBox), + bAsynchronousUpdate); +} + +void PresenterScrollBar::PaintBackground( + const css::awt::Rectangle& rUpdateBox) +{ + if (!mpBackgroundBitmap) + return; + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + mpCanvasHelper->Paint( + mpBackgroundBitmap, + mxCanvas, + rUpdateBox, + aWindowBox, + awt::Rectangle()); +} + +void PresenterScrollBar::PaintBitmap( + const css::awt::Rectangle& rUpdateBox, + const Area eArea, + const SharedBitmapDescriptor& rpBitmaps) +{ + const geometry::RealRectangle2D aLocalBox (GetRectangle(eArea)); + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + geometry::RealRectangle2D aBox (aLocalBox); + aBox.X1 += aWindowBox.X; + aBox.Y1 += aWindowBox.Y; + aBox.X2 += aWindowBox.X; + aBox.Y2 += aWindowBox.Y; + + Reference xBitmap (GetBitmap(eArea,rpBitmaps)); + + if (!xBitmap.is()) + return; + + Reference xClipPolygon ( + PresenterGeometryHelper::CreatePolygon( + PresenterGeometryHelper::Intersection(rUpdateBox, + PresenterGeometryHelper::ConvertRectangle(aBox)), + mxCanvas->getDevice())); + + const rendering::ViewState aViewState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + xClipPolygon); + + const geometry::IntegerSize2D aBitmapSize (xBitmap->getSize()); + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D( + 1,0,aBox.X1 + (aBox.X2-aBox.X1 - aBitmapSize.Width)/2, + 0,1,aBox.Y1 + (aBox.Y2-aBox.Y1 - aBitmapSize.Height)/2), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + mxCanvas->drawBitmap( + xBitmap, + aViewState, + aRenderState); +} + +PresenterScrollBar::Area PresenterScrollBar::GetArea (const double nX, const double nY) const +{ + const geometry::RealPoint2D aPoint(nX, nY); + + if (PresenterGeometryHelper::IsInside(GetRectangle(Pager), aPoint)) + { + if (PresenterGeometryHelper::IsInside(GetRectangle(Thumb), aPoint)) + return Thumb; + else if (PresenterGeometryHelper::IsInside(GetRectangle(PagerUp), aPoint)) + return PagerUp; + else if (PresenterGeometryHelper::IsInside(GetRectangle(PagerDown), aPoint)) + return PagerDown; + } + else if (PresenterGeometryHelper::IsInside(GetRectangle(PrevButton), aPoint)) + return PrevButton; + else if (PresenterGeometryHelper::IsInside(GetRectangle(NextButton), aPoint)) + return NextButton; + + return None; +} + +void PresenterScrollBar::UpdateWidthOrHeight ( + sal_Int32& rSize, + const SharedBitmapDescriptor& rpDescriptor) +{ + if (rpDescriptor) + { + Reference xBitmap (rpDescriptor->GetNormalBitmap()); + if (xBitmap.is()) + { + const geometry::IntegerSize2D aBitmapSize (xBitmap->getSize()); + const sal_Int32 nBitmapSize = static_cast(GetMinor(aBitmapSize.Width, aBitmapSize.Height)); + if (nBitmapSize > rSize) + rSize = nBitmapSize; + } + } +} + +css::uno::Reference PresenterScrollBar::GetBitmap ( + const Area eArea, + const SharedBitmapDescriptor& rpBitmaps) const +{ + if (!rpBitmaps) + return nullptr; + else + return rpBitmaps->GetBitmap(GetBitmapMode(eArea)); +} + +PresenterBitmapContainer::BitmapDescriptor::Mode PresenterScrollBar::GetBitmapMode ( + const Area eArea) const +{ + if (IsDisabled(eArea)) + return PresenterBitmapContainer::BitmapDescriptor::Disabled; + else if (eArea == meMouseMoveArea) + return PresenterBitmapContainer::BitmapDescriptor::MouseOver; + else + return PresenterBitmapContainer::BitmapDescriptor::Normal; +} + +bool PresenterScrollBar::IsDisabled (const Area eArea) const +{ + OSL_ASSERT(eArea>=0 && eArea& rxComponentContext, + const Reference& rxParentWindow, + const std::shared_ptr& rpPaintManager, + const ::std::function& rThumbMotionListener) + : PresenterScrollBar(rxComponentContext, rxParentWindow, rpPaintManager, rThumbMotionListener), + mnScrollBarWidth(0) +{ +} + +PresenterVerticalScrollBar::~PresenterVerticalScrollBar() +{ +} + +double PresenterVerticalScrollBar::GetDragDistance (const sal_Int32, const sal_Int32 nY) const +{ + const double nDistance (nY - maDragAnchor.Y); + if (nDistance == 0) + return 0; + else + { + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + const double nBarWidth (aWindowBox.Width); + const double nPagerHeight (aWindowBox.Height - 2*nBarWidth); + const double nDragDistance (mnTotalSize / nPagerHeight * nDistance); + if (nDragDistance + mnThumbPosition < 0) + return -mnThumbPosition; + else if (mnThumbPosition + nDragDistance > mnTotalSize-mnThumbSize) + return mnTotalSize-mnThumbSize-mnThumbPosition; + else + return nDragDistance; + } +} + +void PresenterVerticalScrollBar::UpdateDragAnchor (const double nDragDistance) +{ + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + const double nBarWidth (aWindowBox.Width); + const double nPagerHeight (aWindowBox.Height - 2*nBarWidth); + maDragAnchor.Y += nDragDistance * nPagerHeight / mnTotalSize; +} + +sal_Int32 PresenterVerticalScrollBar::GetSize() const +{ + return mnScrollBarWidth; +} + +double PresenterVerticalScrollBar::GetMinor (const double nX, const double) const +{ + return nX; +} + +void PresenterVerticalScrollBar::UpdateBorders() +{ + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + double nBottom = aWindowBox.Height; + + if (mpNextButtonDescriptor) + { + Reference xBitmap (mpNextButtonDescriptor->GetNormalBitmap()); + if (xBitmap.is()) + { + geometry::IntegerSize2D aSize (xBitmap->getSize()); + maBox[NextButton] = geometry::RealRectangle2D( + 0, nBottom - aSize.Height, aWindowBox.Width, nBottom); + nBottom -= aSize.Height + gnScrollBarGap; + } + } + if (mpPrevButtonDescriptor) + { + Reference xBitmap (mpPrevButtonDescriptor->GetNormalBitmap()); + if (xBitmap.is()) + { + geometry::IntegerSize2D aSize (xBitmap->getSize()); + maBox[PrevButton] = geometry::RealRectangle2D( + 0, nBottom - aSize.Height, aWindowBox.Width, nBottom); + nBottom -= aSize.Height + gnScrollBarGap; + } + } + const double nPagerHeight (nBottom); + maBox[Pager] = geometry::RealRectangle2D( + 0,0, aWindowBox.Width, nBottom); + if (mnTotalSize < 1) + { + maBox[Thumb] = maBox[Pager]; + + // Set up the enabled/disabled states. + maEnabledState[PrevButton] = false; + maEnabledState[PagerUp] = false; + maEnabledState[NextButton] = false; + maEnabledState[PagerDown] = false; + maEnabledState[Thumb] = false; + } + else + { + const double nThumbSize = ::std::min(mnThumbSize,mnTotalSize); + const double nThumbPosition = ::std::clamp(mnThumbPosition, 0.0, mnTotalSize - nThumbSize); + maBox[Thumb] = geometry::RealRectangle2D( + 0, nThumbPosition / mnTotalSize * nPagerHeight, + aWindowBox.Width, + (nThumbPosition+nThumbSize) / mnTotalSize * nPagerHeight); + + // Set up the enabled/disabled states. + maEnabledState[PrevButton] = nThumbPosition>0; + maEnabledState[PagerUp] = nThumbPosition>0; + maEnabledState[NextButton] = nThumbPosition+nThumbSize < mnTotalSize; + maEnabledState[PagerDown] = nThumbPosition+nThumbSize < mnTotalSize; + maEnabledState[Thumb] = nThumbSize < mnTotalSize; + } + maBox[PagerUp] = geometry::RealRectangle2D( + maBox[Pager].X1, maBox[Pager].Y1, maBox[Pager].X2, maBox[Thumb].Y1-1); + maBox[PagerDown] = geometry::RealRectangle2D( + maBox[Pager].X1, maBox[Thumb].Y2+1, maBox[Pager].X2, maBox[Pager].Y2); + maBox[Total] = PresenterGeometryHelper::Union( + PresenterGeometryHelper::Union(maBox[PrevButton], maBox[NextButton]), + maBox[Pager]); +} + +void PresenterVerticalScrollBar::UpdateBitmaps() +{ + if (mpBitmaps == nullptr) + return; + + mpPrevButtonDescriptor = mpBitmaps->GetBitmap("Up"); + mpNextButtonDescriptor = mpBitmaps->GetBitmap("Down"); + mpPagerStartDescriptor = mpBitmaps->GetBitmap("PagerTop"); + mpPagerCenterDescriptor = mpBitmaps->GetBitmap("PagerVertical"); + mpPagerEndDescriptor = mpBitmaps->GetBitmap("PagerBottom"); + mpThumbStartDescriptor = mpBitmaps->GetBitmap("ThumbTop"); + mpThumbCenterDescriptor = mpBitmaps->GetBitmap("ThumbVertical"); + mpThumbEndDescriptor = mpBitmaps->GetBitmap("ThumbBottom"); + + mnScrollBarWidth = 0; + UpdateWidthOrHeight(mnScrollBarWidth, mpPrevButtonDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpNextButtonDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpPagerStartDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpPagerCenterDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpPagerEndDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpThumbStartDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpThumbCenterDescriptor); + UpdateWidthOrHeight(mnScrollBarWidth, mpThumbEndDescriptor); + if (mnScrollBarWidth == 0) + mnScrollBarWidth = 20; +} + +void PresenterVerticalScrollBar::PaintComposite( + const css::awt::Rectangle& rUpdateBox, + const Area eArea, + const SharedBitmapDescriptor& rpStartBitmaps, + const SharedBitmapDescriptor& rpCenterBitmaps, + const SharedBitmapDescriptor& rpEndBitmaps) +{ + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + geometry::RealRectangle2D aBox (GetRectangle(eArea)); + aBox.X1 += aWindowBox.X; + aBox.Y1 += aWindowBox.Y; + aBox.X2 += aWindowBox.X; + aBox.Y2 += aWindowBox.Y; + + // Get bitmaps and sizes. + + PresenterUIPainter::PaintVerticalBitmapComposite( + mxCanvas, + rUpdateBox, + (eArea == Thumb + ? PresenterGeometryHelper::ConvertRectangleWithConstantSize(aBox) + : PresenterGeometryHelper::ConvertRectangle(aBox)), + GetBitmap(eArea, rpStartBitmaps), + GetBitmap(eArea, rpCenterBitmaps), + GetBitmap(eArea, rpEndBitmaps)); +} + +//===== PresenterScrollBar::MousePressRepeater ================================ + +PresenterScrollBar::MousePressRepeater::MousePressRepeater ( + ::rtl::Reference xScrollBar) + : mnMousePressRepeaterTaskId(PresenterTimer::NotAValidTaskId), + mpScrollBar(std::move(xScrollBar)), + meMouseArea(PresenterScrollBar::None) +{ +} + +void PresenterScrollBar::MousePressRepeater::Dispose() +{ + Stop(); + mpScrollBar = nullptr; +} + +void PresenterScrollBar::MousePressRepeater::Start (const PresenterScrollBar::Area& reArea) +{ + meMouseArea = reArea; + + if (mnMousePressRepeaterTaskId == PresenterTimer::NotAValidTaskId) + { + // Execute key press operation at least this one time. + Execute(); + + // Schedule repeated executions. + auto pThis(shared_from_this()); + mnMousePressRepeaterTaskId = PresenterTimer::ScheduleRepeatedTask ( + mpScrollBar->GetComponentContext(), + [pThis] (TimeValue const&) { return pThis->Callback(); }, + 500000000, + 250000000); + } + else + { + // There is already an active repeating task. + } +} + +void PresenterScrollBar::MousePressRepeater::Stop() +{ + if (mnMousePressRepeaterTaskId != PresenterTimer::NotAValidTaskId) + { + const sal_Int32 nTaskId (mnMousePressRepeaterTaskId); + mnMousePressRepeaterTaskId = PresenterTimer::NotAValidTaskId; + PresenterTimer::CancelTask(nTaskId); + } +} + +void PresenterScrollBar::MousePressRepeater::SetMouseArea(const PresenterScrollBar::Area& reArea) +{ + if (meMouseArea != reArea) + { + if (mnMousePressRepeaterTaskId != PresenterTimer::NotAValidTaskId) + { + Stop(); + } + } +} + +void PresenterScrollBar::MousePressRepeater::Callback () +{ + if (!mpScrollBar) + { + Stop(); + return; + } + + Execute(); +} + +void PresenterScrollBar::MousePressRepeater::Execute() +{ + const double nThumbPosition (mpScrollBar->GetThumbPosition()); + switch (meMouseArea) + { + case PrevButton: + mpScrollBar->SetThumbPosition(nThumbPosition - mpScrollBar->GetLineHeight(), true); + break; + + case NextButton: + mpScrollBar->SetThumbPosition(nThumbPosition + mpScrollBar->GetLineHeight(), true); + break; + + case PagerUp: + mpScrollBar->SetThumbPosition(nThumbPosition - mpScrollBar->GetThumbSize()*0.8, true); + break; + + case PagerDown: + mpScrollBar->SetThumbPosition(nThumbPosition + mpScrollBar->GetThumbSize()*0.8, true); + break; + + default: + break; + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterScrollBar.hxx b/sd/source/console/PresenterScrollBar.hxx new file mode 100644 index 0000000000..1c3bcc2fd1 --- /dev/null +++ b/sd/source/console/PresenterScrollBar.hxx @@ -0,0 +1,257 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSCROLLBAR_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSCROLLBAR_HXX + +#include "PresenterBitmapContainer.hxx" +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace sdext::presenter { + +class PresenterCanvasHelper; +class PresenterPaintManager; + +typedef ::cppu::WeakComponentImplHelper < + css::awt::XWindowListener, + css::awt::XPaintListener, + css::awt::XMouseListener, + css::awt::XMouseMotionListener +> PresenterScrollBarInterfaceBase; + +/** Base class of horizontal and vertical scroll bars. +*/ +class PresenterScrollBar + : private ::cppu::BaseMutex, + public PresenterScrollBarInterfaceBase +{ +public: + virtual ~PresenterScrollBar() override; + PresenterScrollBar(const PresenterScrollBar&) = delete; + PresenterScrollBar& operator=(const PresenterScrollBar&) = delete; + + virtual void SAL_CALL disposing() override; + + css::uno::Reference const& + GetComponentContext() const { return mxComponentContext; } + + void SetVisible (const bool bIsVisible); + + /** Set the bounding box of the scroll bar. + */ + void SetPosSize (const css::geometry::RealRectangle2D& rBox); + + /** Set the position of the movable thumb. + @param nPosition + A value between 0 and the last value given to SetTotalSize() + minus the last value given to SetThumbSize(). + */ + void SetThumbPosition ( + double nPosition, + const bool bAsynchronousRepaint); + + double GetThumbPosition() const { return mnThumbPosition;} + + /** Set the upper border of the slider range. + */ + void SetTotalSize (const double nTotalSize); + + /** Set the size of the movable thumb. + @param nThumbSize + A value not larger than the last value given to SetTotalSize(). + */ + void SetThumbSize (const double nThumbSize); + double GetThumbSize() const { return mnThumbSize;} + + void SetLineHeight (const double nLineHeight); + double GetLineHeight() const { return mnLineHeight;} + + /** Set the canvas that is used for painting the scroll bar. + */ + void SetCanvas (const css::uno::Reference& rxCanvas); + + void SetBackground (const SharedBitmapDescriptor& rpBackgroundBitmap); + + /** Call this after changing total size or thumb position or size to + move the thumb to a valid position. + */ + void CheckValues(); + + /** On some occasions it is necessary to trigger the painting of a + scrollbar from the outside. + */ + void Paint ( + const css::awt::Rectangle& rUpdateBox); + + virtual sal_Int32 GetSize() const = 0; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XMouseListener + + virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override; + + // XMouseMotionListener + + virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override; + + // lang::XEventListener + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + enum Area { Total, Pager, Thumb, PagerUp, PagerDown, PrevButton, NextButton, None, + AreaCount = None }; + +protected: + css::uno::Reference mxComponentContext; + css::uno::Reference mxWindow; + css::uno::Reference mxCanvas; + css::uno::Reference mxPresenterHelper; + std::shared_ptr mpPaintManager; + double mnThumbPosition; + double mnTotalSize; + double mnThumbSize; + double mnLineHeight; + css::geometry::RealPoint2D maDragAnchor; + ::std::function maThumbMotionListener; + Area meButtonDownArea; + Area meMouseMoveArea; + css::geometry::RealRectangle2D maBox[AreaCount]; + bool mbIsNotificationActive; + static std::weak_ptr mpSharedBitmaps; + std::shared_ptr mpBitmaps; + SharedBitmapDescriptor mpPrevButtonDescriptor; + SharedBitmapDescriptor mpNextButtonDescriptor; + SharedBitmapDescriptor mpPagerStartDescriptor; + SharedBitmapDescriptor mpPagerCenterDescriptor; + SharedBitmapDescriptor mpPagerEndDescriptor; + SharedBitmapDescriptor mpThumbStartDescriptor; + SharedBitmapDescriptor mpThumbCenterDescriptor; + SharedBitmapDescriptor mpThumbEndDescriptor; + bool maEnabledState[AreaCount]; + + css::geometry::RealRectangle2D const & GetRectangle (const Area eArea) const; + virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const = 0; + virtual void UpdateDragAnchor (const double nDragDistance) = 0; + virtual double GetMinor (const double nX, const double nY) const = 0; + virtual void UpdateBorders() = 0; + virtual void UpdateBitmaps() = 0; + virtual void PaintComposite( + const css::awt::Rectangle& rRepaintBox, + const Area eArea, + const SharedBitmapDescriptor& rpStartBitmaps, + const SharedBitmapDescriptor& rpCenterBitmaps, + const SharedBitmapDescriptor& rpEndBitmaps) = 0; + + PresenterScrollBar ( + const css::uno::Reference& rxComponentContext, + const css::uno::Reference& rxParentWindow, + std::shared_ptr xPaintManager, + ::std::function aThumbMotionListener); + + void Repaint ( + const css::geometry::RealRectangle2D& rBox, + const bool bAsynchronous); + void PaintBackground ( + const css::awt::Rectangle& rRepaintBox); + void PaintBitmap( + const css::awt::Rectangle& rRepaintBox, + const Area eArea, + const SharedBitmapDescriptor& rpBitmaps); + void UpdateWidthOrHeight (sal_Int32& rSize, + const SharedBitmapDescriptor& rpDescriptor); + css::uno::Reference GetBitmap ( + const Area eArea, + const SharedBitmapDescriptor& rpBitmaps) const; + PresenterBitmapContainer::BitmapDescriptor::Mode GetBitmapMode ( + const Area eArea) const; + bool IsDisabled (const Area eArea) const; + double ValidateThumbPosition (double nPosition); + +private: + class MousePressRepeater; + std::shared_ptr mpMousePressRepeater; + SharedBitmapDescriptor mpBackgroundBitmap; + std::unique_ptr mpCanvasHelper; + + Area GetArea (const double nX, const double nY) const; +}; + +/** A vertical scroll bar. +*/ +class PresenterVerticalScrollBar : public PresenterScrollBar +{ +public: + PresenterVerticalScrollBar ( + const css::uno::Reference& rxComponentContext, + const css::uno::Reference& rxParentWindow, + const std::shared_ptr& rpPaintManager, + const ::std::function& rThumbMotionListener); + virtual ~PresenterVerticalScrollBar() override; + virtual sal_Int32 GetSize() const override; + +protected: + virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const override; + virtual void UpdateDragAnchor (const double nDragDistance) override; + virtual double GetMinor (const double nX, const double nY) const override; + virtual void UpdateBorders() override; + virtual void UpdateBitmaps() override; + virtual void PaintComposite( + const css::awt::Rectangle& rRepaintBox, + const Area eArea, + const SharedBitmapDescriptor& rpStartBitmaps, + const SharedBitmapDescriptor& rpCenterBitmaps, + const SharedBitmapDescriptor& rpEndBitmaps) override; + +private: + sal_Int32 mnScrollBarWidth; +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSlidePreview.cxx b/sd/source/console/PresenterSlidePreview.cxx new file mode 100644 index 0000000000..9de4c8820b --- /dev/null +++ b/sd/source/console/PresenterSlidePreview.cxx @@ -0,0 +1,352 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterSlidePreview.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterBitmapContainer.hxx" +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace +{ + // Use a super sample factor greater than 1 to achieve a poor mans + // antialiasing effect for slide previews. + const sal_Int16 gnSuperSampleFactor = 2; +} + +namespace sdext::presenter { + +//===== PresenterSlidePreview ================================================= + +PresenterSlidePreview::PresenterSlidePreview ( + const Reference& rxContext, + const Reference& rxViewId, + const Reference& rxAnchorPane, + const ::rtl::Reference& rpPresenterController) + : PresenterSlidePreviewInterfaceBase(m_aMutex), + mpPresenterController(rpPresenterController), + mxViewId(rxViewId), + mnSlideAspectRatio(28.0 / 21.0) +{ + if ( ! rxContext.is() + || ! rxViewId.is() + || ! rxAnchorPane.is() + || ! rpPresenterController.is()) + { + throw RuntimeException( + "PresenterSlidePreview can not be constructed due to empty argument", + static_cast(this)); + } + + mxWindow = rxAnchorPane->getWindow(); + mxCanvas = rxAnchorPane->getCanvas(); + + if (mxWindow.is()) + { + mxWindow->addWindowListener(this); + mxWindow->addPaintListener(this); + + Reference xPeer (mxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->setBackground(util::Color(0xff000000)); + + mxWindow->setVisible(true); + } + + if (mpPresenterController) + mnSlideAspectRatio = mpPresenterController->GetSlideAspectRatio(); + + Reference xFactory = rxContext->getServiceManager(); + if (xFactory.is()) + mxPreviewRenderer.set( + xFactory->createInstanceWithContext( + "com.sun.star.drawing.SlideRenderer", + rxContext), + UNO_QUERY); + mpBitmaps = std::make_shared( + "PresenterScreenSettings/ScrollBar/Bitmaps", + std::shared_ptr(), + rxContext, + mxCanvas); + Resize(); +} + +PresenterSlidePreview::~PresenterSlidePreview() +{ +} + +void SAL_CALL PresenterSlidePreview::disposing() +{ + if (mxWindow.is()) + { + mxWindow->removeWindowListener(this); + mxWindow->removePaintListener(this); + mxWindow = nullptr; + mxCanvas = nullptr; + } + + Reference xComponent (mxPreviewRenderer, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); +} + +//----- XResourceId ----------------------------------------------------------- + +Reference SAL_CALL PresenterSlidePreview::getResourceId() +{ + return mxViewId; +} + +sal_Bool SAL_CALL PresenterSlidePreview::isAnchorOnly() +{ + return false; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterSlidePreview::windowResized (const awt::WindowEvent&) +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + Resize(); +} + +void SAL_CALL PresenterSlidePreview::windowMoved (const awt::WindowEvent&) {} + +void SAL_CALL PresenterSlidePreview::windowShown (const lang::EventObject&) +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + Resize(); +} + +void SAL_CALL PresenterSlidePreview::windowHidden (const lang::EventObject&) {} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterSlidePreview::windowPaint (const awt::PaintEvent& rEvent) +{ + ThrowIfDisposed(); + + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + if (mxWindow.is()) + Paint(awt::Rectangle( + rEvent.UpdateRect.X, + rEvent.UpdateRect.Y, + rEvent.UpdateRect.Width, + rEvent.UpdateRect.Height)); +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterSlidePreview::disposing (const lang::EventObject& rEvent) +{ + if (rEvent.Source == mxWindow) + { + mxWindow = nullptr; + mxCanvas = nullptr; + mxPreview = nullptr; + } +} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL PresenterSlidePreview::setCurrentPage (const Reference& rxSlide) +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + SetSlide(rxSlide); +} + +Reference SAL_CALL PresenterSlidePreview::getCurrentPage() +{ + ThrowIfDisposed(); + return nullptr; +} + + +void PresenterSlidePreview::SetSlide (const Reference& rxPage) +{ + mxCurrentSlide = rxPage; + mxPreview = nullptr; + + // The preview is not transparent, therefore only this window, not its + // parent, has to be invalidated. + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); +} + +void PresenterSlidePreview::Paint (const awt::Rectangle& rBoundingBox) +{ + if ( ! mxWindow.is()) + return; + if ( ! mxCanvas.is()) + return; + if ( ! mxPreviewRenderer.is()) + return; + + // Make sure that a preview in the correct size exists. + awt::Rectangle aWindowBox (mxWindow->getPosSize()); + + bool bCustomAnimation = false; + bool bTransition = false; + if( mxCurrentSlide.is() ) + { + bCustomAnimation = PresenterController::HasCustomAnimation(mxCurrentSlide); + bTransition = PresenterController::HasTransition(mxCurrentSlide); + } + + if ( ! mxPreview.is() && mxCurrentSlide.is()) + { + // Create a new preview bitmap. + mxPreview = mxPreviewRenderer->createPreviewForCanvas( + mxCurrentSlide, + awt::Size(aWindowBox.Width, aWindowBox.Height), + gnSuperSampleFactor, + mxCanvas); + } + + // Determine the bounding box of the preview. + awt::Rectangle aPreviewBox; + if (mxPreview.is()) + { + const geometry::IntegerSize2D aPreviewSize (mxPreview->getSize()); + aPreviewBox = awt::Rectangle( + (aWindowBox.Width - aPreviewSize.Width)/2, + (aWindowBox.Height - aPreviewSize.Height)/2, + aPreviewSize.Width, + aPreviewSize.Height); + } + else + { + if (mnSlideAspectRatio > 0) + { + const awt::Size aPreviewSize (mxPreviewRenderer->calculatePreviewSize( + mnSlideAspectRatio,awt::Size(aWindowBox.Width, aWindowBox.Height))); + aPreviewBox = awt::Rectangle( + (aWindowBox.Width - aPreviewSize.Width)/2, + (aWindowBox.Height - aPreviewSize.Height)/2, + aPreviewSize.Width, + aPreviewSize.Height); + } + } + + // Paint the background. + mpPresenterController->GetCanvasHelper()->Paint( + mpPresenterController->GetViewBackground(mxViewId->getResourceURL()), + mxCanvas, + rBoundingBox, + awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height), + aPreviewBox); + + // Paint the preview. + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr); + + Sequence aBackgroundColor(4); + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1, 0, aPreviewBox.X, 0, 1, aPreviewBox.Y), + nullptr, + aBackgroundColor, + rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, 0x00000000); + if (mxPreview.is()) + { + mxCanvas->drawBitmap(mxPreview, aViewState, aRenderState); + if( bTransition ) + { + const awt::Rectangle aTransitionPreviewBox(5, aWindowBox.Height-20, 0, 0); + SharedBitmapDescriptor aTransitionDescriptor = mpBitmaps->GetBitmap("Transition"); + Reference xTransitionIcon (aTransitionDescriptor->GetNormalBitmap()); + rendering::RenderState aTransitionRenderState ( + geometry::AffineMatrix2D(1, 0, aTransitionPreviewBox.X, 0, 1, aTransitionPreviewBox.Y), + nullptr, + aBackgroundColor, + rendering::CompositeOperation::SOURCE); + mxCanvas->drawBitmap(xTransitionIcon, aViewState, aTransitionRenderState); + } + if( bCustomAnimation ) + { + const awt::Rectangle aAnimationPreviewBox(5, aWindowBox.Height-40, 0, 0); + SharedBitmapDescriptor aAnimationDescriptor = mpBitmaps->GetBitmap("Animation"); + Reference xAnimationIcon (aAnimationDescriptor->GetNormalBitmap()); + rendering::RenderState aAnimationRenderState ( + geometry::AffineMatrix2D(1, 0, aAnimationPreviewBox.X, 0, 1, aAnimationPreviewBox.Y), + nullptr, + aBackgroundColor, + rendering::CompositeOperation::SOURCE); + mxCanvas->drawBitmap(xAnimationIcon, aViewState, aAnimationRenderState); + } + } + else + { + if (mnSlideAspectRatio > 0) + { + Reference xPolygon ( + PresenterGeometryHelper::CreatePolygon(aPreviewBox, mxCanvas->getDevice())); + if (xPolygon.is()) + mxCanvas->fillPolyPolygon(xPolygon, aViewState, aRenderState); + } + } + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +void PresenterSlidePreview::Resize() +{ + if (mxPreviewRenderer.is() && mxPreview.is()) + { + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + const awt::Size aNewPreviewSize (mxPreviewRenderer->calculatePreviewSize( + mnSlideAspectRatio, + awt::Size(aWindowBox.Width, aWindowBox.Height))); + const geometry::IntegerSize2D aPreviewSize (mxPreview->getSize()); + if (aNewPreviewSize.Width==aPreviewSize.Width + && aNewPreviewSize.Height==aPreviewSize.Height) + { + // The size of the window may have changed but the preview would + // be painted in the same size (but not necessarily at the same + // position.) + return; + } + } + SetSlide(mxCurrentSlide); +} + +void PresenterSlidePreview::ThrowIfDisposed() +{ + if (PresenterSlidePreviewInterfaceBase::rBHelper.bDisposed || PresenterSlidePreviewInterfaceBase::rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterSlidePreview object has already been disposed", + static_cast(this)); + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSlidePreview.hxx b/sd/source/console/PresenterSlidePreview.hxx new file mode 100644 index 0000000000..85107693a9 --- /dev/null +++ b/sd/source/console/PresenterSlidePreview.hxx @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDEPREVIEW_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDEPREVIEW_HXX + +#include "PresenterController.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XView, + css::drawing::XDrawView, + css::awt::XPaintListener, + css::awt::XWindowListener +> PresenterSlidePreviewInterfaceBase; + +/** Static preview of a slide. Typically used for the preview of the next + slide. + This implementation shows a preview of the slide given to the + setCurrentSlide. For showing the next slide the PresenterViewFactory + uses a derived class that overrides the setCurrentSlide() method. +*/ +class PresenterSlidePreview + : private ::cppu::BaseMutex, + public PresenterSlidePreviewInterfaceBase +{ +public: + PresenterSlidePreview ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxViewId, + const css::uno::Reference& rxAnchorPane, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterSlidePreview() override; + PresenterSlidePreview(const PresenterSlidePreview&) = delete; + PresenterSlidePreview& operator=(const PresenterSlidePreview&) = delete; + virtual void SAL_CALL disposing() override; + + // XResourceId + + virtual css::uno::Reference SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // lang::XEventListener + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference& rxSlide) override; + + virtual css::uno::Reference SAL_CALL getCurrentPage() override; + +protected: + ::rtl::Reference mpPresenterController; + +private: + css::uno::Reference mxViewId; + css::uno::Reference mxPreviewRenderer; + + /** This Image holds the preview of the current slide. After resize + requests the image may be empty. This results eventually in a call + to ProvideSlide() in order to created a preview in the correct new + size. + */ + css::uno::Reference mxPreview; + std::shared_ptr mpBitmaps; + + /** The current slide for which a preview is displayed. This may or + may not be the same as the current slide of the PresenterView. + */ + css::uno::Reference mxCurrentSlide; + double mnSlideAspectRatio; + + css::uno::Reference mxWindow; + css::uno::Reference mxCanvas; + + /** Set the given slide as the current slide of the called PresenterSlidePreview + object. + */ + void SetSlide (const css::uno::Reference& rxPage); + + /** Paint the preview of the current slide centered in the window of the + anchor pane. + */ + void Paint (const css::awt::Rectangle& rBoundingBox); + + /** React to a resize of the anchor pane. + */ + void Resize(); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSlideShowView.cxx b/sd/source/console/PresenterSlideShowView.cxx new file mode 100644 index 0000000000..32693f1164 --- /dev/null +++ b/sd/source/console/PresenterSlideShowView.cxx @@ -0,0 +1,953 @@ + +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterSlideShowView.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterHelper.hxx" +#include "PresenterPaneContainer.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +//===== PresenterSlideShowView ================================================ + +PresenterSlideShowView::PresenterSlideShowView ( + css::uno::Reference xContext, + css::uno::Reference xViewId, + const rtl::Reference<::sd::DrawController>& rxController, + ::rtl::Reference xPresenterController) + : PresenterSlideShowViewInterfaceBase(m_aMutex), + mxComponentContext(std::move(xContext)), + mpPresenterController(std::move(xPresenterController)), + mxViewId(std::move(xViewId)), + mxController(rxController), + mxSlideShowController(PresenterHelper::GetSlideShowController(rxController)), + mbIsViewAdded(false), + mnPageAspectRatio(28.0/21.0), + maBroadcaster(m_aMutex), + mbIsForcedPaintPending(false), + mbIsPaintPending(true), + mbIsEndSlideVisible(false) +{ + if (mpPresenterController) + { + mnPageAspectRatio = mpPresenterController->GetSlideAspectRatio(); + mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL()); + } +} + +void PresenterSlideShowView::LateInit() +{ + mxSlideShow.set( mxSlideShowController->getSlideShow(), UNO_SET_THROW); + Reference xSlideShowComponent (mxSlideShow, UNO_QUERY); + xSlideShowComponent->addEventListener(static_cast(this)); + + Reference xFactory ( + mxComponentContext->getServiceManager(), UNO_SET_THROW); + mxPresenterHelper.set (xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + mxComponentContext), + UNO_QUERY_THROW); + + // Use view id and controller to retrieve window and canvas from + // configuration controller. + Reference xCC (mxController->getConfigurationController()); + + if (xCC.is()) + { + mxTopPane.set(xCC->getResource(mxViewId->getAnchor()->getAnchor()), UNO_QUERY); + + Reference xPane (xCC->getResource(mxViewId->getAnchor()), UNO_QUERY_THROW); + + mxWindow = xPane->getWindow(); + mxCanvas = xPane->getCanvas(); + + if (mxWindow.is()) + { + mxWindow->addPaintListener(this); + mxWindow->addWindowListener(this); + } + + // The window does not have to paint a background. We do + // that ourself. + Reference xPeer (mxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->setBackground(util::Color(0xff000000)); + } + + // Create a window for the actual slide show view. It is places + // centered and with maximal size inside the pane. + mxViewWindow = CreateViewWindow(mxWindow); + + mxViewCanvas = CreateViewCanvas(mxViewWindow); + + if (mxViewWindow.is()) + { + // Register listeners at window. + mxViewWindow->addPaintListener(this); + mxViewWindow->addMouseListener(this); + mxViewWindow->addMouseMotionListener(this); + } + + if (mxViewWindow.is()) + Resize(); + + if (mxWindow.is()) + mxWindow->setVisible(true); + + // Add the new slide show view to the slide show. + if (mxSlideShow.is() && ! mbIsViewAdded) + { + impl_addAndConfigureView(); + mbIsViewAdded = true; + } + + // Read text for one past last slide. + PresenterConfigurationAccess aConfiguration ( + mxComponentContext, + PresenterConfigurationAccess::msPresenterScreenRootName, + PresenterConfigurationAccess::READ_ONLY); + aConfiguration.GetConfigurationNode( + "Presenter/Views/CurrentSlidePreview/" + "Strings/ClickToExitPresentationText/String") + >>= msClickToExitPresentationText; + aConfiguration.GetConfigurationNode( + "Presenter/Views/CurrentSlidePreview/" + "Strings/ClickToExitPresentationTitle/String") + >>= msClickToExitPresentationTitle; +} + +PresenterSlideShowView::~PresenterSlideShowView() +{ +} + +void PresenterSlideShowView::disposing() +{ + // Tell all listeners that we are disposed. + lang::EventObject aEvent; + aEvent.Source = static_cast(this); + + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + pIterator->disposeAndClear(aEvent); + + // Do this for + // XPaintListener, XModifyListener,XMouseListener,XMouseMotionListener,XWindowListener? + + if (mxWindow.is()) + { + mxWindow->removePaintListener(this); + mxWindow->removeMouseListener(this); + mxWindow->removeMouseMotionListener(this); + mxWindow->removeWindowListener(this); + mxWindow = nullptr; + } + mxSlideShowController = nullptr; + mxSlideShow = nullptr; + if (mxViewCanvas.is()) + { + Reference xComponent (mxViewCanvas, UNO_QUERY); + mxViewCanvas = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + if (mxViewWindow.is()) + { + Reference xComponent = mxViewWindow; + mxViewWindow = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + if (mxPointer.is()) + { + Reference xComponent (mxPointer, UNO_QUERY); + mxPointer = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + if (mxBackgroundPolygon1.is()) + { + Reference xComponent (mxBackgroundPolygon1, UNO_QUERY); + mxBackgroundPolygon1 = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + if (mxBackgroundPolygon2.is()) + { + Reference xComponent (mxBackgroundPolygon2, UNO_QUERY); + mxBackgroundPolygon2 = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + mxComponentContext = nullptr; + mpPresenterController = nullptr; + mxViewId = nullptr; + mxController = nullptr; + mxCanvas = nullptr; + mpBackground.reset(); + msClickToExitPresentationText.clear(); + msClickToExitPresentationTitle.clear(); + msTitleTemplate.clear(); + mxCurrentSlide = nullptr; +} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL PresenterSlideShowView::setCurrentPage ( + const css::uno::Reference& rxSlide) +{ + mxCurrentSlide = rxSlide; + if (mpPresenterController + && mxSlideShowController.is() + && ! mpPresenterController->GetCurrentSlide().is() + && ! mxSlideShowController->isPaused()) + { + mbIsEndSlideVisible = true; + Reference xPeer (mxViewWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->invalidate(awt::InvalidateStyle::NOTRANSPARENT); + + // For the end slide we use a special title, without the (n of m) + // part. Save the title template for the case that the user goes + // backwards. + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + mpPresenterController->GetPaneContainer()->FindViewURL(mxViewId->getResourceURL())); + if (pDescriptor) + { + msTitleTemplate = pDescriptor->msTitleTemplate; + pDescriptor->msTitleTemplate = msClickToExitPresentationTitle; + mpPresenterController->UpdatePaneTitles(); + } + } + else if (mbIsEndSlideVisible) + { + mbIsEndSlideVisible = false; + + // Restore the title template. + PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( + mpPresenterController->GetPaneContainer()->FindViewURL(mxViewId->getResourceURL())); + if (pDescriptor) + { + pDescriptor->msTitleTemplate = msTitleTemplate; + pDescriptor->msTitle.clear(); + mpPresenterController->UpdatePaneTitles(); + } + } +} + +css::uno::Reference SAL_CALL PresenterSlideShowView::getCurrentPage() +{ + return mxCurrentSlide; +} + +//----- CachablePresenterView ------------------------------------------------- + +void PresenterSlideShowView::ReleaseView() +{ + if (mxSlideShow.is() && mbIsViewAdded) + { + mxSlideShow->removeView(this); + mbIsViewAdded = false; + } +} + +//----- XSlideShowView -------------------------------------------------------- + +Reference SAL_CALL PresenterSlideShowView::getCanvas() +{ + ThrowIfDisposed(); + + return Reference(mxViewCanvas, UNO_QUERY); +} + +void SAL_CALL PresenterSlideShowView::clear() +{ + ThrowIfDisposed(); + mbIsForcedPaintPending = false; + mbIsPaintPending = false; + + if (!(mxViewCanvas.is() && mxViewWindow.is())) + return; + + // Create a polygon for the window outline. + awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize()); + Reference xPolygon (PresenterGeometryHelper::CreatePolygon( + awt::Rectangle(0,0, aViewWindowBox.Width,aViewWindowBox.Height), + mxViewCanvas->getDevice())); + + rendering::ViewState aViewState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr); + double const aColor[4] = {0,0,0,0}; + rendering::RenderState aRenderState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + Sequence(aColor,4), + rendering::CompositeOperation::SOURCE); + mxViewCanvas->fillPolyPolygon(xPolygon, aViewState, aRenderState); +} + +geometry::AffineMatrix2D SAL_CALL PresenterSlideShowView::getTransformation() +{ + ThrowIfDisposed(); + + if (mxViewWindow.is()) + { + // When the mbIsInModifyNotification is set then a slightly modified + // version of the transformation is returned in order to get past + // optimizations the avoid updates when the transformation is + // unchanged (when the window size changes then due to the constant + // aspect ratio the size of the preview may remain the same while + // the position changes. The position, however, is represented by + // the position of the view window. This transformation is given + // relative to the view window and therefore does not contain the + // position.) + const awt::Rectangle aWindowBox = mxViewWindow->getPosSize(); + return geometry::AffineMatrix2D( + aWindowBox.Width-1, 0, 0, + 0, aWindowBox.Height-1, 0); + } + else + { + return geometry::AffineMatrix2D(1,0,0, 0,1,0); + } +} + +geometry::IntegerSize2D SAL_CALL PresenterSlideShowView::getTranslationOffset() +{ + ThrowIfDisposed(); + return geometry::IntegerSize2D(0,0); +} + +void SAL_CALL PresenterSlideShowView::addTransformationChangedListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.addListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::removeTransformationChangedListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.removeListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::addPaintListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.addListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::removePaintListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.removeListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::addMouseListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.addListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::removeMouseListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.removeListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::addMouseMotionListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.addListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::removeMouseMotionListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + maBroadcaster.removeListener( + cppu::UnoType::get(), + rxListener); +} + +void SAL_CALL PresenterSlideShowView::setMouseCursor(::sal_Int16 nPointerShape) +{ + ThrowIfDisposed(); + + // Create a pointer when it does not yet exist. + if ( ! mxPointer.is()) + { + mxPointer = awt::Pointer::create(mxComponentContext); + } + + // Set the pointer to the given shape and the window(peer) to the + // pointer. + Reference xPeer (mxViewWindow, UNO_QUERY); + if (mxPointer.is() && xPeer.is()) + { + mxPointer->setType(nPointerShape); + xPeer->setPointer(mxPointer); + } +} + +awt::Rectangle SAL_CALL PresenterSlideShowView::getCanvasArea( ) +{ + if( mxViewWindow.is() && mxTopPane.is() ) + return mxPresenterHelper->getWindowExtentsRelative( mxViewWindow, mxTopPane->getWindow() ); + + awt::Rectangle aRectangle; + + aRectangle.X = aRectangle.Y = aRectangle.Width = aRectangle.Height = 0; + + return aRectangle; +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterSlideShowView::disposing (const lang::EventObject& rEvent) +{ + if (rEvent.Source == mxViewWindow) + mxViewWindow = nullptr; + else if (rEvent.Source == mxSlideShow) + mxSlideShow = nullptr; +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterSlideShowView::windowPaint (const awt::PaintEvent& rEvent) +{ + // Deactivated views must not be painted. + if ( ! mbIsPresenterViewActive) + return; + + awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize()); + if (aViewWindowBox.Width <= 0 || aViewWindowBox.Height <= 0) + return; + + if (rEvent.Source == mxWindow) + PaintOuterWindow(rEvent.UpdateRect); + else if (mbIsEndSlideVisible) + PaintEndSlide(rEvent.UpdateRect); + else + PaintInnerWindow(rEvent); +} + +//----- XMouseListener -------------------------------------------------------- + +void SAL_CALL PresenterSlideShowView::mousePressed (const awt::MouseEvent& rEvent) +{ + awt::MouseEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XMouseListener::mousePressed, aEvent); + } + + // Only when the end slide is displayed we forward the mouse event to + // the PresenterController so that it switches to the next slide and + // ends the presentation. + if (mbIsEndSlideVisible) + if (mpPresenterController) + mpPresenterController->HandleMouseClick(rEvent); +} + +void SAL_CALL PresenterSlideShowView::mouseReleased (const awt::MouseEvent& rEvent) +{ + awt::MouseEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XMouseListener::mouseReleased, aEvent); + } +} + +void SAL_CALL PresenterSlideShowView::mouseEntered (const awt::MouseEvent& rEvent) +{ + awt::MouseEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XMouseListener::mouseEntered, aEvent); + } +} + +void SAL_CALL PresenterSlideShowView::mouseExited (const awt::MouseEvent& rEvent) +{ + awt::MouseEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XMouseListener::mouseExited, aEvent); + } +} + +//----- XMouseMotionListener -------------------------------------------------- + +void SAL_CALL PresenterSlideShowView::mouseDragged (const awt::MouseEvent& rEvent) +{ + awt::MouseEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XMouseMotionListener::mouseDragged, aEvent); + } +} + +void SAL_CALL PresenterSlideShowView::mouseMoved (const awt::MouseEvent& rEvent) +{ + awt::MouseEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XMouseMotionListener::mouseMoved, aEvent); + } +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterSlideShowView::windowResized (const awt::WindowEvent&) +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + + Resize(); +} + +void SAL_CALL PresenterSlideShowView::windowMoved (const awt::WindowEvent&) +{ + if ( ! mbIsPaintPending) + mbIsForcedPaintPending = true; +} + +void SAL_CALL PresenterSlideShowView::windowShown (const lang::EventObject&) +{ + Resize(); +} + +void SAL_CALL PresenterSlideShowView::windowHidden (const lang::EventObject&) {} + +//----- XView ----------------------------------------------------------------- + +Reference SAL_CALL PresenterSlideShowView::getResourceId() +{ + return mxViewId; +} + +sal_Bool SAL_CALL PresenterSlideShowView::isAnchorOnly() +{ + return false; +} + +//----- CachablePresenterView ------------------------------------------------- + +void PresenterSlideShowView::ActivatePresenterView() +{ + if (mxSlideShow.is() && ! mbIsViewAdded) + { + impl_addAndConfigureView(); + mbIsViewAdded = true; + } +} + +void PresenterSlideShowView::DeactivatePresenterView() +{ + if (mxSlideShow.is() && mbIsViewAdded) + { + mxSlideShow->removeView(this); + mbIsViewAdded = false; + } +} + + +void PresenterSlideShowView::PaintOuterWindow (const awt::Rectangle& rRepaintBox) +{ + if ( ! mxCanvas.is()) + return; + + if (!mpBackground) + return; + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + PresenterGeometryHelper::CreatePolygon(rRepaintBox, mxCanvas->getDevice())); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + Reference xBackgroundBitmap (mpBackground->GetNormalBitmap()); + if (xBackgroundBitmap.is()) + { + const geometry::IntegerSize2D aBitmapSize(xBackgroundBitmap->getSize()); + Sequence aTextures + { + { + geometry::AffineMatrix2D( aBitmapSize.Width,0,0, 0,aBitmapSize.Height,0), + 1, + 0, + xBackgroundBitmap, + nullptr, + nullptr, + rendering::StrokeAttributes(), + rendering::TexturingMode::REPEAT, + rendering::TexturingMode::REPEAT + } + }; + + if (mxBackgroundPolygon1.is()) + mxCanvas->fillTexturedPolyPolygon( + mxBackgroundPolygon1, + aViewState, + aRenderState, + aTextures); + if (mxBackgroundPolygon2.is()) + mxCanvas->fillTexturedPolyPolygon( + mxBackgroundPolygon2, + aViewState, + aRenderState, + aTextures); + } + else + { + PresenterCanvasHelper::SetDeviceColor(aRenderState, mpBackground->maReplacementColor); + + if (mxBackgroundPolygon1.is()) + mxCanvas->fillPolyPolygon(mxBackgroundPolygon1, aViewState, aRenderState); + if (mxBackgroundPolygon2.is()) + mxCanvas->fillPolyPolygon(mxBackgroundPolygon2, aViewState, aRenderState); + } +} + +void PresenterSlideShowView::PaintEndSlide (const awt::Rectangle& rRepaintBox) +{ + if ( ! mxCanvas.is()) + return; + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + PresenterGeometryHelper::CreatePolygon(rRepaintBox, mxCanvas->getDevice())); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x00000000)); + mxCanvas->fillPolyPolygon( + PresenterGeometryHelper::CreatePolygon(mxViewWindow->getPosSize(), mxCanvas->getDevice()), + aViewState, + aRenderState); + + do + { + if (!mpPresenterController) + break; + std::shared_ptr pTheme (mpPresenterController->GetTheme()); + if (pTheme == nullptr) + break; + + const OUString sViewStyle (pTheme->GetStyleName(mxViewId->getResourceURL())); + PresenterTheme::SharedFontDescriptor pFont (pTheme->GetFont(sViewStyle)); + if (!pFont) + break; + + /// this is responsible of the " presentation exit " text inside the slide windows + PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x00ffffff)); + aRenderState.AffineTransform.m02 = 20; + aRenderState.AffineTransform.m12 = 40; + const rendering::StringContext aContext ( + msClickToExitPresentationText, 0, msClickToExitPresentationText.getLength()); + pFont->PrepareFont(mxCanvas); + const Reference xLayout ( + pFont->mxFont->createTextLayout(aContext,rendering::TextDirection::WEAK_LEFT_TO_RIGHT,0)); + mxCanvas->drawTextLayout( + xLayout, + aViewState, + aRenderState); + } + while (false); + + // Finally, in double buffered environments, request the changes to be + // made visible. + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(true); +} + +void PresenterSlideShowView::PaintInnerWindow (const awt::PaintEvent& rEvent) +{ + // Forward window paint to listeners. + awt::PaintEvent aEvent (rEvent); + aEvent.Source = static_cast(this); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&awt::XPaintListener::windowPaint, aEvent); + } + + /** The slide show relies on the back buffer of the canvas not being + modified. With a shared canvas there are times when that can not be + guaranteed. + */ + if (mbIsForcedPaintPending && mxSlideShow.is() && mbIsViewAdded) + { + mxSlideShow->removeView(this); + impl_addAndConfigureView(); + } + + // Finally, in double buffered environments, request the changes to be + // made visible. + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(true); +} + +Reference PresenterSlideShowView::CreateViewWindow ( + const Reference& rxParentWindow) const +{ + Reference xViewWindow; + try + { + Reference xFactory (mxComponentContext->getServiceManager()); + if ( ! xFactory.is()) + return xViewWindow; + + Reference xToolkit = awt::Toolkit::create(mxComponentContext); + awt::WindowDescriptor aWindowDescriptor ( + awt::WindowClass_CONTAINER, + OUString(), + Reference(rxParentWindow,UNO_QUERY_THROW), + -1, // parent index not available + awt::Rectangle(0,0,10,10), + awt::WindowAttribute::SIZEABLE + | awt::WindowAttribute::MOVEABLE + | awt::WindowAttribute::NODECORATION); + xViewWindow.set( xToolkit->createWindow(aWindowDescriptor),UNO_QUERY_THROW); + + // Make the background transparent. The slide show paints its own background. + Reference xPeer (xViewWindow, UNO_QUERY_THROW); + xPeer->setBackground(0xff000000); + + xViewWindow->setVisible(true); + } + catch (RuntimeException&) + { + } + return xViewWindow; +} + +Reference PresenterSlideShowView::CreateViewCanvas ( + const Reference& rxViewWindow) const +{ + // Create a canvas for the view window. + return mxPresenterHelper->createSharedCanvas( + Reference(mxTopPane->getCanvas(), UNO_QUERY), + mxTopPane->getWindow(), + mxTopPane->getCanvas(), + mxTopPane->getWindow(), + rxViewWindow); +} + +void PresenterSlideShowView::Resize() +{ + if ( ! mxWindow.is() || ! mxViewWindow.is()) + return; + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + if (aWindowBox.Height > 0) + { + awt::Rectangle aViewWindowBox; + const double nWindowAspectRatio ( + double(aWindowBox.Width) / double(aWindowBox.Height)); + if (nWindowAspectRatio > mnPageAspectRatio) + { + // Slides will be painted with the full parent window height. + aViewWindowBox.Width = sal_Int32(aWindowBox.Height * mnPageAspectRatio + 0.5); + aViewWindowBox.Height = aWindowBox.Height; + aViewWindowBox.X = (aWindowBox.Width - aViewWindowBox.Width) / 2; + aViewWindowBox.Y = 0; + } + else + { + // Slides will be painted with the full parent window width. + aViewWindowBox.Width = aWindowBox.Width; + aViewWindowBox.Height = sal_Int32(aWindowBox.Width / mnPageAspectRatio + 0.5); + aViewWindowBox.X = 0; + aViewWindowBox.Y = (aWindowBox.Height - aViewWindowBox.Height) / 2; + } + mxViewWindow->setPosSize( + aViewWindowBox.X, + aViewWindowBox.Y, + aViewWindowBox.Width, + aViewWindowBox.Height, + awt::PosSize::POSSIZE); + } + + // Clear the background polygon so that on the next paint it is created + // for the new size. + CreateBackgroundPolygons(); + + // Notify listeners that the transformation that maps the view into the + // window has changed. + lang::EventObject aEvent (static_cast(this)); + ::cppu::OInterfaceContainerHelper* pIterator + = maBroadcaster.getContainer(cppu::UnoType::get()); + if (pIterator != nullptr) + { + pIterator->notifyEach(&util::XModifyListener::modified, aEvent); + } + + // Due to constant aspect ratio resizing may lead a preview that changes + // its position but not its size. This invalidates the back buffer and + // we have to enforce a complete repaint. + if ( ! mbIsPaintPending) + mbIsForcedPaintPending = true; +} + +void PresenterSlideShowView::CreateBackgroundPolygons() +{ + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + const awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize()); + if (aWindowBox.Height == aViewWindowBox.Height && aWindowBox.Width == aViewWindowBox.Width) + { + mxBackgroundPolygon1 = nullptr; + mxBackgroundPolygon2 = nullptr; + } + else if (aWindowBox.Height == aViewWindowBox.Height) + { + // Paint two boxes to the left and right of the view window. + mxBackgroundPolygon1 = PresenterGeometryHelper::CreatePolygon( + awt::Rectangle( + 0, + 0, + aViewWindowBox.X, + aWindowBox.Height), + mxCanvas->getDevice()); + mxBackgroundPolygon2 = PresenterGeometryHelper::CreatePolygon( + awt::Rectangle( + aViewWindowBox.X + aViewWindowBox.Width, + 0, + aWindowBox.Width - aViewWindowBox.X - aViewWindowBox.Width, + aWindowBox.Height), + mxCanvas->getDevice()); + } + else + { + // Paint two boxes above and below the view window. + mxBackgroundPolygon1 = PresenterGeometryHelper::CreatePolygon( + awt::Rectangle( + 0, + 0, + aWindowBox.Width, + aViewWindowBox.Y), + mxCanvas->getDevice()); + mxBackgroundPolygon2 = PresenterGeometryHelper::CreatePolygon( + awt::Rectangle( + 0, + aViewWindowBox.Y + aViewWindowBox.Height, + aWindowBox.Width, + aWindowBox.Height - aViewWindowBox.Y - aViewWindowBox.Height), + mxCanvas->getDevice()); + } +} + +void PresenterSlideShowView::ThrowIfDisposed() +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterSlideShowView object has already been disposed", + static_cast(this)); + } +} + +void PresenterSlideShowView::impl_addAndConfigureView() +{ + Reference xView (this); + mxSlideShow->addView(xView); + // Prevent embedded sounds being played twice at the same time by + // disabling sound for the new slide show view. + beans::PropertyValue aProperty; + aProperty.Name = "IsSoundEnabled"; + Sequence aValues{ Any(xView), Any(false) }; + aProperty.Value <<= aValues; + mxSlideShow->setProperty(aProperty); +} + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSlideShowView.hxx b/sd/source/console/PresenterSlideShowView.hxx new file mode 100644 index 0000000000..1506f940ea --- /dev/null +++ b/sd/source/console/PresenterSlideShowView.hxx @@ -0,0 +1,241 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESHOWVIEW_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESHOWVIEW_HXX + +#include "PresenterViewFactory.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +typedef cppu::WeakComponentImplHelper< + css::presentation::XSlideShowView, + css::awt::XPaintListener, + css::awt::XMouseListener, + css::awt::XMouseMotionListener, + css::awt::XWindowListener, + css::drawing::framework::XView, + css::drawing::XDrawView + > PresenterSlideShowViewInterfaceBase; + +/** Life view in a secondary window of a full screen slide show. +*/ +class PresenterSlideShowView + : protected ::cppu::BaseMutex, + public PresenterSlideShowViewInterfaceBase, + public CachablePresenterView +{ +public: + PresenterSlideShowView ( + css::uno::Reference xContext, + css::uno::Reference xViewId, + const rtl::Reference<::sd::DrawController>& rxController, + ::rtl::Reference xPresenterController); + virtual ~PresenterSlideShowView() override; + PresenterSlideShowView(const PresenterSlideShowView&) = delete; + PresenterSlideShowView& operator=(const PresenterSlideShowView&) = delete; + + void LateInit(); + virtual void SAL_CALL disposing() override; + + // CachablePresenterView + + virtual void ReleaseView() override; + + // XSlideShowView + + virtual css::uno::Reference< + css::rendering::XSpriteCanvas > SAL_CALL getCanvas() override; + + virtual void SAL_CALL clear() override; + + virtual css::geometry::AffineMatrix2D SAL_CALL getTransformation() override; + + virtual css::geometry::IntegerSize2D SAL_CALL getTranslationOffset() override; + + virtual void SAL_CALL addTransformationChangedListener( + const css::uno::Reference< + css::util::XModifyListener >& xListener) override; + + virtual void SAL_CALL removeTransformationChangedListener( + const css::uno::Reference< + css::util::XModifyListener >& xListener) override; + + virtual void SAL_CALL addPaintListener( + const css::uno::Reference< + css::awt::XPaintListener >& xListener) override; + + virtual void SAL_CALL removePaintListener( + const css::uno::Reference< + css::awt::XPaintListener >& xListener) override; + + virtual void SAL_CALL addMouseListener( + const css::uno::Reference< + css::awt::XMouseListener >& xListener) override; + + virtual void SAL_CALL removeMouseListener( + const css::uno::Reference< + css::awt::XMouseListener >& xListener) override; + + virtual void SAL_CALL addMouseMotionListener( + const css::uno::Reference< + css::awt::XMouseMotionListener >& xListener) override; + + virtual void SAL_CALL removeMouseMotionListener( + const css::uno::Reference< + css::awt::XMouseMotionListener >& xListener) override; + + virtual void SAL_CALL setMouseCursor(::sal_Int16 nPointerShape) override; + + virtual css::awt::Rectangle SAL_CALL getCanvasArea( ) override; + + // lang::XEventListener + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + // XPaintListener + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XMouseListener + virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override; + + // XMouseMotionListener + + virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XView + + virtual css::uno::Reference SAL_CALL + getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference& rxSlide) override; + + virtual css::uno::Reference SAL_CALL getCurrentPage() override; + + // CachablePresenterView + + virtual void ActivatePresenterView() override; + + virtual void DeactivatePresenterView() override; + +private: + css::uno::Reference mxComponentContext; + ::rtl::Reference mpPresenterController; + css::uno::Reference mxViewId; + rtl::Reference<::sd::DrawController> mxController; + css::uno::Reference mxSlideShowController; + css::uno::Reference mxSlideShow; + css::uno::Reference mxCanvas; + css::uno::Reference mxViewCanvas; + css::uno::Reference mxPointer; + css::uno::Reference mxWindow; + css::uno::Reference mxViewWindow; + css::uno::Reference mxTopPane; + css::uno::Reference mxPresenterHelper; + css::uno::Reference mxBackgroundPolygon1; + css::uno::Reference mxBackgroundPolygon2; + bool mbIsViewAdded; + + /** Aspect ratio of the current slide. + */ + double mnPageAspectRatio; + + /** This broadcast helper is used to notify listeners registered to a + SlideShowView object. + */ + ::cppu::OBroadcastHelper maBroadcaster; + + SharedBitmapDescriptor mpBackground; + + bool mbIsForcedPaintPending; + bool mbIsPaintPending; + OUString msClickToExitPresentationText; + OUString msClickToExitPresentationTitle; + OUString msTitleTemplate; + bool mbIsEndSlideVisible; + css::uno::Reference mxCurrentSlide; + + /** Create the window into which the slide show will render its + content. This window has the correct aspect ratio and is displayed centered + and as large as possible in its parent window. + */ + css::uno::Reference CreateViewWindow ( + const css::uno::Reference& rxParentWindow) const; + css::uno::Reference CreateViewCanvas ( + const css::uno::Reference& rxWindow) const; + + void Resize(); + + void PaintOuterWindow (const css::awt::Rectangle& rRepaintBox); + void PaintInnerWindow (const css::awt::PaintEvent& rEvent); + void PaintEndSlide (const css::awt::Rectangle& rRepaintBox); + + void CreateBackgroundPolygons(); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); + + void impl_addAndConfigureView(); +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSlideSorter.cxx b/sd/source/console/PresenterSlideSorter.cxx new file mode 100644 index 0000000000..85d7831b16 --- /dev/null +++ b/sd/source/console/PresenterSlideSorter.cxx @@ -0,0 +1,1928 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include "PresenterSlideSorter.hxx" +#include "PresenterButton.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterPaneBase.hxx" +#include "PresenterScrollBar.hxx" +#include "PresenterUIPainter.hxx" +#include "PresenterWindowManager.hxx" +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace { + const sal_Int32 gnVerticalGap (10); + const sal_Int32 gnVerticalBorder (10); + const sal_Int32 gnHorizontalGap (10); + const sal_Int32 gnHorizontalBorder (10); + + const double gnMinimalPreviewWidth (200); + const double gnPreferredPreviewWidth (300); + const double gnMaximalPreviewWidth (400); + const sal_Int32 gnPreferredColumnCount (6); + const double gnMinimalHorizontalPreviewGap(15); + const double gnPreferredHorizontalPreviewGap(25); + const double gnMaximalHorizontalPreviewGap(50); + const double gnPreferredVerticalPreviewGap(25); + + const sal_Int32 gnHorizontalLabelBorder (3); + const sal_Int32 gnHorizontalLabelPadding (5); + + const sal_Int32 gnVerticalButtonPadding (gnVerticalGap); +} + +namespace sdext::presenter { + +namespace { + sal_Int32 round (const double nValue) { return sal::static_int_cast(0.5 + nValue); } + sal_Int32 floor (const double nValue) { return sal::static_int_cast(nValue); } +} + +//===== PresenterSlideSorter::Layout ========================================== + +class PresenterSlideSorter::Layout +{ +public: + explicit Layout (::rtl::Reference xVerticalScrollBar); + + void Update (const geometry::RealRectangle2D& rBoundingBox, const double nSlideAspectRatio); + void SetupVisibleArea(); + void UpdateScrollBars(); + bool IsScrollBarNeeded (const sal_Int32 nSlideCount); + geometry::RealPoint2D GetLocalPosition (const geometry::RealPoint2D& rWindowPoint) const; + geometry::RealPoint2D GetWindowPosition(const geometry::RealPoint2D& rLocalPoint) const; + sal_Int32 GetColumn (const geometry::RealPoint2D& rLocalPoint) const; + sal_Int32 GetRow (const geometry::RealPoint2D& rLocalPoint, + const bool bReturnInvalidValue = false) const; + sal_Int32 GetSlideIndexForPosition (const css::geometry::RealPoint2D& rPoint) const; + css::geometry::RealPoint2D GetPoint ( + const sal_Int32 nSlideIndex, + const sal_Int32 nRelativeHorizontalPosition, + const sal_Int32 nRelativeVerticalPosition) const; + css::awt::Rectangle GetBoundingBox (const sal_Int32 nSlideIndex) const; + void ForAllVisibleSlides (const ::std::function& rAction); + sal_Int32 GetFirstVisibleSlideIndex() const; + sal_Int32 GetLastVisibleSlideIndex() const; + bool SetHorizontalOffset (const double nOffset); + bool SetVerticalOffset (const double nOffset); + + css::geometry::RealRectangle2D maBoundingBox; + css::geometry::IntegerSize2D maPreviewSize; + sal_Int32 mnHorizontalOffset; + sal_Int32 mnVerticalOffset; + sal_Int32 mnHorizontalGap; + sal_Int32 mnVerticalGap; + sal_Int32 mnHorizontalBorder; + sal_Int32 mnVerticalBorder; + sal_Int32 mnRowCount; + sal_Int32 mnColumnCount; + sal_Int32 mnSlideCount; + sal_Int32 mnFirstVisibleColumn; + sal_Int32 mnLastVisibleColumn; + sal_Int32 mnFirstVisibleRow; + sal_Int32 mnLastVisibleRow; + +private: + ::rtl::Reference mpVerticalScrollBar; + + sal_Int32 GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const; + sal_Int32 GetRow (const sal_Int32 nSlideIndex) const; + sal_Int32 GetColumn (const sal_Int32 nSlideIndex) const; +}; + +//==== PresenterSlideSorter::MouseOverManager ================================= + +class PresenterSlideSorter::MouseOverManager +{ +public: + MouseOverManager ( + const Reference& rxSlides, + const std::shared_ptr& rpTheme, + const Reference& rxInvalidateTarget, + std::shared_ptr xPaintManager); + MouseOverManager(const MouseOverManager&) = delete; + MouseOverManager& operator=(const MouseOverManager&) = delete; + + void Paint ( + const sal_Int32 nSlideIndex, + const Reference& rxCanvas, + const Reference& rxClip); + + void SetSlide ( + const sal_Int32 nSlideIndex, + const awt::Rectangle& rBox); + +private: + Reference mxCanvas; + const Reference mxSlides; + SharedBitmapDescriptor mpLeftLabelBitmap; + SharedBitmapDescriptor mpCenterLabelBitmap; + SharedBitmapDescriptor mpRightLabelBitmap; + PresenterTheme::SharedFontDescriptor mpFont; + sal_Int32 mnSlideIndex; + awt::Rectangle maSlideBoundingBox; + OUString msText; + Reference mxBitmap; + Reference mxInvalidateTarget; + std::shared_ptr mpPaintManager; + + void SetCanvas ( + const Reference& rxCanvas); + /** Create a bitmap that shows the given text and is not wider than the + given maximal width. + */ + Reference CreateBitmap ( + const OUString& rsText, + const sal_Int32 nMaximalWidth) const; + void Invalidate(); + geometry::IntegerSize2D CalculateLabelSize ( + const OUString& rsText) const; + OUString GetFittingText (const OUString& rsText, const double nMaximalWidth) const; + void PaintButtonBackground ( + const Reference& rxCanvas, + const geometry::IntegerSize2D& rSize) const; +}; + +//==== PresenterSlideSorter::CurrentSlideFrameRenderer ======================== + +class PresenterSlideSorter::CurrentSlideFrameRenderer +{ +public: + CurrentSlideFrameRenderer ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxCanvas); + + void PaintCurrentSlideFrame ( + const awt::Rectangle& rSlideBoundingBox, + const Reference& rxCanvas, + const geometry::RealRectangle2D& rClipBox); + + /** Enlarge the given rectangle to include the current slide indicator. + */ + awt::Rectangle GetBoundingBox ( + const awt::Rectangle& rSlideBoundingBox); + +private: + SharedBitmapDescriptor mpTopLeft; + SharedBitmapDescriptor mpTop; + SharedBitmapDescriptor mpTopRight; + SharedBitmapDescriptor mpLeft; + SharedBitmapDescriptor mpRight; + SharedBitmapDescriptor mpBottomLeft; + SharedBitmapDescriptor mpBottom; + SharedBitmapDescriptor mpBottomRight; + sal_Int32 mnTopFrameSize; + sal_Int32 mnLeftFrameSize; + sal_Int32 mnRightFrameSize; + sal_Int32 mnBottomFrameSize; + + static void PaintBitmapOnce( + const css::uno::Reference& rxBitmap, + const css::uno::Reference& rxCanvas, + const Reference& rxClip, + const double nX, + const double nY); + static void PaintBitmapTiled( + const css::uno::Reference& rxBitmap, + const css::uno::Reference& rxCanvas, + const geometry::RealRectangle2D& rClipBox, + const double nX, + const double nY, + const double nWidth, + const double nHeight); +}; + +//===== PresenterSlideSorter ================================================== + +PresenterSlideSorter::PresenterSlideSorter ( + const Reference& rxContext, + const Reference& rxViewId, + const rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController) + : PresenterSlideSorterInterfaceBase(m_aMutex), + mxComponentContext(rxContext), + mxViewId(rxViewId), + mpPresenterController(rpPresenterController), + mxSlideShowController(mpPresenterController->GetSlideShowController()), + mbIsLayoutPending(true), + mnSlideIndexMousePressed(-1), + mnCurrentSlideIndex(-1), + mnSeparatorY(0), + maSeparatorColor(0x00ffffff) +{ + if ( ! rxContext.is() + || ! rxViewId.is() + || ! rxController.is() + || ! rpPresenterController) + { + throw lang::IllegalArgumentException(); + } + + if ( ! mxSlideShowController.is()) + throw RuntimeException(); + + try + { + // Get pane and window. + Reference xCC ( + rxController->getConfigurationController(), UNO_SET_THROW); + Reference xFactory ( + mxComponentContext->getServiceManager(), UNO_SET_THROW); + + mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW); + mxWindow = mxPane->getWindow(); + + // Add window listener. + mxWindow->addWindowListener(this); + mxWindow->addPaintListener(this); + mxWindow->addMouseListener(this); + mxWindow->addMouseMotionListener(this); + mxWindow->setVisible(true); + + // Remember the current slide. + mnCurrentSlideIndex = mxSlideShowController->getCurrentSlideIndex(); + + // Create the scroll bar. + mpVerticalScrollBar.set( + new PresenterVerticalScrollBar( + rxContext, + mxWindow, + mpPresenterController->GetPaintManager(), + [this] (double const offset) { return this->SetVerticalOffset(offset); })); + + mpCloseButton = PresenterButton::Create( + rxContext, + mpPresenterController, + mpPresenterController->GetTheme(), + mxWindow, + mxCanvas, + "SlideSorterCloser"); + + if (mpPresenterController->GetTheme() != nullptr) + { + PresenterTheme::SharedFontDescriptor pFont ( + mpPresenterController->GetTheme()->GetFont("ButtonFont")); + if (pFont) + maSeparatorColor = pFont->mnColor; + } + + // Create the layout. + mpLayout = std::make_shared(mpVerticalScrollBar); + + // Create the preview cache. + mxPreviewCache.set( + xFactory->createInstanceWithContext( + "com.sun.star.drawing.PresenterPreviewCache", + mxComponentContext), + UNO_QUERY_THROW); + Reference xSlides (mxSlideShowController, UNO_QUERY); + mxPreviewCache->setDocumentSlides(xSlides, rxController->getModel()); + mxPreviewCache->addPreviewCreationNotifyListener(this); + if (xSlides.is()) + { + mpLayout->mnSlideCount = xSlides->getCount(); + } + + // Create the mouse over manager. + mpMouseOverManager.reset(new MouseOverManager( + Reference(mxSlideShowController, UNO_QUERY), + mpPresenterController->GetTheme(), + mxWindow, + mpPresenterController->GetPaintManager())); + + // Listen for changes of the current slide. + rxController->addPropertyChangeListener( + "CurrentPage", + this); + + // Move the current slide in the center of the window. + const awt::Rectangle aCurrentSlideBBox (mpLayout->GetBoundingBox(mnCurrentSlideIndex)); + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + SetHorizontalOffset(aCurrentSlideBBox.X - aWindowBox.Width/2.0); + } + catch (RuntimeException&) + { + disposing(); + throw; + } +} + +PresenterSlideSorter::~PresenterSlideSorter() +{ +} + +void SAL_CALL PresenterSlideSorter::disposing() +{ + mxComponentContext = nullptr; + mxViewId = nullptr; + mxPane = nullptr; + + if (mpVerticalScrollBar.is()) + { + Reference xComponent = mpVerticalScrollBar; + mpVerticalScrollBar = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + if (mpCloseButton.is()) + { + Reference xComponent = mpCloseButton; + mpCloseButton = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + if (mxCanvas.is()) + { + Reference xComponent (mxCanvas, UNO_QUERY); + if (xComponent.is()) + xComponent->removeEventListener(static_cast(this)); + mxCanvas = nullptr; + } + mpPresenterController = nullptr; + mxSlideShowController = nullptr; + mpLayout.reset(); + mpMouseOverManager.reset(); + + if (mxPreviewCache.is()) + { + mxPreviewCache->removePreviewCreationNotifyListener(this); + + Reference xComponent (mxPreviewCache, UNO_QUERY); + mxPreviewCache = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + if (mxWindow.is()) + { + mxWindow->removeWindowListener(this); + mxWindow->removePaintListener(this); + mxWindow->removeMouseListener(this); + mxWindow->removeMouseMotionListener(this); + } +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL PresenterSlideSorter::disposing (const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxWindow) + { + mxWindow = nullptr; + dispose(); + } + else if (rEventObject.Source == mxPreviewCache) + { + mxPreviewCache = nullptr; + dispose(); + } + else if (rEventObject.Source == mxCanvas) + { + mxCanvas = nullptr; + mbIsLayoutPending = true; + + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); + } +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterSlideSorter::windowResized (const awt::WindowEvent&) +{ + ThrowIfDisposed(); + mbIsLayoutPending = true; + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); +} + +void SAL_CALL PresenterSlideSorter::windowMoved (const awt::WindowEvent&) +{ + ThrowIfDisposed(); +} + +void SAL_CALL PresenterSlideSorter::windowShown (const lang::EventObject&) +{ + ThrowIfDisposed(); + mbIsLayoutPending = true; + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); +} + +void SAL_CALL PresenterSlideSorter::windowHidden (const lang::EventObject&) +{ + ThrowIfDisposed(); +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterSlideSorter::windowPaint (const css::awt::PaintEvent& rEvent) +{ + // Deactivated views must not be painted. + if ( ! mbIsPresenterViewActive) + return; + + Paint(rEvent.UpdateRect); + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +//----- XMouseListener -------------------------------------------------------- + +void SAL_CALL PresenterSlideSorter::mousePressed (const css::awt::MouseEvent& rEvent) +{ + css::awt::MouseEvent rTemp =rEvent; + /// check whether RTL interface or not + if(AllSettings::GetLayoutRTL()){ + awt::Rectangle aBox = mxWindow->getPosSize(); + rTemp.X=aBox.Width-rEvent.X; + } + const geometry::RealPoint2D aPosition(rTemp.X, rEvent.Y); + mnSlideIndexMousePressed = mpLayout->GetSlideIndexForPosition(aPosition); +} + +void SAL_CALL PresenterSlideSorter::mouseReleased (const css::awt::MouseEvent& rEvent) +{ + css::awt::MouseEvent rTemp =rEvent; + /// check whether RTL interface or not + if(AllSettings::GetLayoutRTL()){ + awt::Rectangle aBox = mxWindow->getPosSize(); + rTemp.X=aBox.Width-rEvent.X; + } + const geometry::RealPoint2D aPosition(rTemp.X, rEvent.Y); + const sal_Int32 nSlideIndex (mpLayout->GetSlideIndexForPosition(aPosition)); + + if (nSlideIndex != mnSlideIndexMousePressed || mnSlideIndexMousePressed < 0) + return; + + switch (rEvent.ClickCount) + { + case 1: + default: + GotoSlide(nSlideIndex); + break; + + case 2: + OSL_ASSERT(mpPresenterController); + OSL_ASSERT(mpPresenterController->GetWindowManager()); + mpPresenterController->GetWindowManager()->SetSlideSorterState(false); + GotoSlide(nSlideIndex); + break; + } +} + +void SAL_CALL PresenterSlideSorter::mouseEntered (const css::awt::MouseEvent&) {} + +void SAL_CALL PresenterSlideSorter::mouseExited (const css::awt::MouseEvent&) +{ + mnSlideIndexMousePressed = -1; + if (mpMouseOverManager != nullptr) + mpMouseOverManager->SetSlide(mnSlideIndexMousePressed, awt::Rectangle(0,0,0,0)); +} + +//----- XMouseMotionListener -------------------------------------------------- + +void SAL_CALL PresenterSlideSorter::mouseMoved (const css::awt::MouseEvent& rEvent) +{ + if (mpMouseOverManager == nullptr) + return; + + css::awt::MouseEvent rTemp =rEvent; + /// check whether RTL interface or not + if(AllSettings::GetLayoutRTL()){ + awt::Rectangle aBox = mxWindow->getPosSize(); + rTemp.X=aBox.Width-rEvent.X; + } + const geometry::RealPoint2D aPosition(rTemp.X, rEvent.Y); + sal_Int32 nSlideIndex (mpLayout->GetSlideIndexForPosition(aPosition)); + + if (nSlideIndex < 0) + { + mnSlideIndexMousePressed = -1; + mpMouseOverManager->SetSlide(nSlideIndex, awt::Rectangle(0,0,0,0)); + } + else + { + mpMouseOverManager->SetSlide( + nSlideIndex, + mpLayout->GetBoundingBox(nSlideIndex)); + } +} + +void SAL_CALL PresenterSlideSorter::mouseDragged (const css::awt::MouseEvent&) {} + +//----- XResourceId ----------------------------------------------------------- + +Reference SAL_CALL PresenterSlideSorter::getResourceId() +{ + ThrowIfDisposed(); + return mxViewId; +} + +sal_Bool SAL_CALL PresenterSlideSorter::isAnchorOnly() +{ + return false; +} + +//----- XPropertyChangeListener ----------------------------------------------- + +void SAL_CALL PresenterSlideSorter::propertyChange ( + const css::beans::PropertyChangeEvent&) +{} + +//----- XSlidePreviewCacheListener -------------------------------------------- + +void SAL_CALL PresenterSlideSorter::notifyPreviewCreation ( + sal_Int32 nSlideIndex) +{ + OSL_ASSERT(mpLayout != nullptr); + + awt::Rectangle aBBox (mpLayout->GetBoundingBox(nSlideIndex)); + mpPresenterController->GetPaintManager()->Invalidate(mxWindow, aBBox, true); +} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL PresenterSlideSorter::setCurrentPage (const Reference&) +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + + if (!mxSlideShowController.is()) + return; + + const sal_Int32 nNewCurrentSlideIndex (mxSlideShowController->getCurrentSlideIndex()); + if (nNewCurrentSlideIndex == mnCurrentSlideIndex) + return; + + mnCurrentSlideIndex = nNewCurrentSlideIndex; + + // Request a repaint of the previous current slide to hide its + // current slide indicator. + mpPresenterController->GetPaintManager()->Invalidate( + mxWindow, + maCurrentSlideFrameBoundingBox); + + // Request a repaint of the new current slide to show its + // current slide indicator. + maCurrentSlideFrameBoundingBox = mpCurrentSlideFrameRenderer->GetBoundingBox( + mpLayout->GetBoundingBox(mnCurrentSlideIndex)); + mpPresenterController->GetPaintManager()->Invalidate( + mxWindow, + maCurrentSlideFrameBoundingBox); +} + +Reference SAL_CALL PresenterSlideSorter::getCurrentPage() +{ + ThrowIfDisposed(); + return nullptr; +} + + +void PresenterSlideSorter::UpdateLayout() +{ + if ( ! mxWindow.is()) + return; + + mbIsLayoutPending = false; + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + sal_Int32 nLeftBorderWidth (aWindowBox.X); + + // Get border width. + PresenterPaneContainer::SharedPaneDescriptor pPane ( + mpPresenterController->GetPaneContainer()->FindViewURL( + mxViewId->getResourceURL())); + do + { + if (!pPane) + break; + if ( ! pPane->mxPane.is()) + break; + + Reference xBorderPainter ( + pPane->mxPane->GetPaneBorderPainter()); + if ( ! xBorderPainter.is()) + break; + xBorderPainter->addBorder ( + mxViewId->getAnchor()->getResourceURL(), + awt::Rectangle(0, 0, aWindowBox.Width, aWindowBox.Height), + drawing::framework::BorderType_INNER_BORDER); + } + while(false); + + // Place vertical separator. + mnSeparatorY = aWindowBox.Height - mpCloseButton->GetSize().Height - gnVerticalButtonPadding; + + PlaceCloseButton(pPane, aWindowBox, nLeftBorderWidth); + + geometry::RealRectangle2D aUpperBox( + gnHorizontalBorder, + gnVerticalBorder, + aWindowBox.Width - 2*gnHorizontalBorder, + mnSeparatorY - gnVerticalGap); + + // Determine whether the scroll bar has to be displayed. + aUpperBox = PlaceScrollBars(aUpperBox); + + mpLayout->Update(aUpperBox, GetSlideAspectRatio()); + mpLayout->SetupVisibleArea(); + mpLayout->UpdateScrollBars(); + + // Tell the preview cache about some of the values. + mxPreviewCache->setPreviewSize(mpLayout->maPreviewSize); + mxPreviewCache->setVisibleRange( + mpLayout->GetFirstVisibleSlideIndex(), + mpLayout->GetLastVisibleSlideIndex()); + + // Clear the frame polygon so that it is re-created on the next paint. + mxPreviewFrame = nullptr; +} + +geometry::RealRectangle2D PresenterSlideSorter::PlaceScrollBars ( + const geometry::RealRectangle2D& rUpperBox) +{ + mpLayout->Update(rUpperBox, GetSlideAspectRatio()); + bool bIsScrollBarNeeded (false); + Reference xSlides (mxSlideShowController, UNO_QUERY_THROW); + bIsScrollBarNeeded = mpLayout->IsScrollBarNeeded(xSlides->getCount()); + if (mpVerticalScrollBar) + { + if (bIsScrollBarNeeded) + { + if(AllSettings::GetLayoutRTL()) + { + mpVerticalScrollBar->SetPosSize(geometry::RealRectangle2D( + rUpperBox.X1, + rUpperBox.Y1, + rUpperBox.X1 + mpVerticalScrollBar->GetSize(), + rUpperBox.Y2)); + mpVerticalScrollBar->SetVisible(true); + // Reduce area covered by the scroll bar from the available + // space. + return geometry::RealRectangle2D( + rUpperBox.X1 + gnHorizontalGap + mpVerticalScrollBar->GetSize(), + rUpperBox.Y1, + rUpperBox.X2, + rUpperBox.Y2); + } + else + { + // if it's not RTL place vertical scroll bar at right border. + mpVerticalScrollBar->SetPosSize(geometry::RealRectangle2D( + rUpperBox.X2 - mpVerticalScrollBar->GetSize(), + rUpperBox.Y1, + rUpperBox.X2, + rUpperBox.Y2)); + mpVerticalScrollBar->SetVisible(true); + // Reduce area covered by the scroll bar from the available + // space. + return geometry::RealRectangle2D( + rUpperBox.X1, + rUpperBox.Y1, + rUpperBox.X2 - mpVerticalScrollBar->GetSize() - gnHorizontalGap, + rUpperBox.Y2); + } + } + else + mpVerticalScrollBar->SetVisible(false); + } + return rUpperBox; +} + +void PresenterSlideSorter::PlaceCloseButton ( + const PresenterPaneContainer::SharedPaneDescriptor& rpPane, + const awt::Rectangle& rCenterBox, + const sal_Int32 nLeftBorderWidth) +{ + // Place button. When the callout is near the center then the button is + // centered over the callout. Otherwise it is centered with respect to + // the whole window. + sal_Int32 nCloseButtonCenter (rCenterBox.Width/2); + if (rpPane && rpPane->mxPane.is()) + { + const sal_Int32 nCalloutCenter (-nLeftBorderWidth); + const sal_Int32 nDistanceFromWindowCenter (abs(nCalloutCenter - rCenterBox.Width/2)); + const sal_Int32 nButtonWidth (mpCloseButton->GetSize().Width); + const static sal_Int32 nMaxDistanceForCalloutCentering (nButtonWidth * 2); + if (nDistanceFromWindowCenter < nMaxDistanceForCalloutCentering) + { + if (nCalloutCenter < nButtonWidth/2) + nCloseButtonCenter = nButtonWidth/2; + else if (nCalloutCenter > rCenterBox.Width-nButtonWidth/2) + nCloseButtonCenter = rCenterBox.Width-nButtonWidth/2; + else + nCloseButtonCenter = nCalloutCenter; + } + } + mpCloseButton->SetCenter(geometry::RealPoint2D( + nCloseButtonCenter, + rCenterBox.Height - mpCloseButton->GetSize().Height/ 2)); +} + +void PresenterSlideSorter::ClearBackground ( + const Reference& rxCanvas, + const awt::Rectangle& rUpdateBox) +{ + OSL_ASSERT(rxCanvas.is()); + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + mpPresenterController->GetCanvasHelper()->Paint( + mpPresenterController->GetViewBackground(mxViewId->getResourceURL()), + rxCanvas, + rUpdateBox, + awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height), + awt::Rectangle()); +} + +double PresenterSlideSorter::GetSlideAspectRatio() const +{ + double nSlideAspectRatio (28.0/21.0); + + try + { + Reference xSlides(mxSlideShowController, UNO_QUERY_THROW); + if (mxSlideShowController.is() && xSlides->getCount()>0) + { + Reference xProperties(xSlides->getByIndex(0),UNO_QUERY_THROW); + sal_Int32 nWidth (28000); + sal_Int32 nHeight (21000); + if ((xProperties->getPropertyValue("Width") >>= nWidth) + && (xProperties->getPropertyValue("Height") >>= nHeight) + && nHeight > 0) + { + nSlideAspectRatio = double(nWidth) / double(nHeight); + } + } + } + catch (RuntimeException&) + { + OSL_ASSERT(false); + } + + return nSlideAspectRatio; +} + +Reference PresenterSlideSorter::GetPreview (const sal_Int32 nSlideIndex) +{ + if (nSlideIndex < 0 || nSlideIndex>=mpLayout->mnSlideCount) + return nullptr; + else if (mxPane.is()) + return mxPreviewCache->getSlidePreview(nSlideIndex, mxPane->getCanvas()); + else + return nullptr; +} + +void PresenterSlideSorter::PaintPreview ( + const Reference& rxCanvas, + const css::awt::Rectangle& rUpdateBox, + const sal_Int32 nSlideIndex) +{ + OSL_ASSERT(rxCanvas.is()); + + geometry::IntegerSize2D aSize (mpLayout->maPreviewSize); + + if (PresenterGeometryHelper::AreRectanglesDisjoint( + rUpdateBox, + mpLayout->GetBoundingBox(nSlideIndex))) + { + return; + } + + Reference xPreview (GetPreview(nSlideIndex)); + bool isRTL = AllSettings::GetLayoutRTL(); + + const geometry::RealPoint2D aTopLeft ( + mpLayout->GetWindowPosition( + mpLayout->GetPoint(nSlideIndex, isRTL?1:-1, -1))); + + PresenterBitmapContainer aContainer ( + "PresenterScreenSettings/ScrollBar/Bitmaps", + std::shared_ptr(), + mxComponentContext, + rxCanvas); + Reference xIndexAccess(mxSlideShowController, UNO_QUERY); + Reference xPage( xIndexAccess->getByIndex(nSlideIndex), UNO_QUERY); + bool bTransition = PresenterController::HasTransition(xPage); + bool bCustomAnimation = PresenterController::HasCustomAnimation(xPage); + + // Create clip rectangle as intersection of the current update area and + // the bounding box of all previews. + geometry::RealRectangle2D aBoundingBox (mpLayout->maBoundingBox); + aBoundingBox.Y2 += 1; + const geometry::RealRectangle2D aClipBox ( + PresenterGeometryHelper::Intersection( + PresenterGeometryHelper::ConvertRectangle(rUpdateBox), + aBoundingBox)); + Reference xClip ( + PresenterGeometryHelper::CreatePolygon(aClipBox, rxCanvas->getDevice())); + + const rendering::ViewState aViewState (geometry::AffineMatrix2D(1,0,0, 0,1,0), xClip); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D( + 1, 0, aTopLeft.X, + 0, 1, aTopLeft.Y), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + // Emphasize the current slide. + if (nSlideIndex == mnCurrentSlideIndex) + { + if (mpCurrentSlideFrameRenderer != nullptr) + { + const awt::Rectangle aSlideBoundingBox( + sal::static_int_cast(0.5 + aTopLeft.X), + sal::static_int_cast(0.5 + aTopLeft.Y), + aSize.Width, + aSize.Height); + maCurrentSlideFrameBoundingBox + = mpCurrentSlideFrameRenderer->GetBoundingBox(aSlideBoundingBox); + mpCurrentSlideFrameRenderer->PaintCurrentSlideFrame ( + aSlideBoundingBox, + mxCanvas, + aClipBox); + } + } + + // Paint the preview. + if (xPreview.is()) + { + aSize = xPreview->getSize(); + if (aSize.Width > 0 && aSize.Height > 0) + { + rxCanvas->drawBitmap(xPreview, aViewState, aRenderState); + if( bCustomAnimation ) + { + const awt::Rectangle aAnimationPreviewBox(aTopLeft.X+3, aTopLeft.Y+aSize.Height-40, 0, 0); + SharedBitmapDescriptor aAnimationDescriptor = aContainer.GetBitmap("Animation"); + Reference xAnimationIcon (aAnimationDescriptor->GetNormalBitmap()); + rendering::RenderState aAnimationRenderState ( + geometry::AffineMatrix2D( + 1, 0, aAnimationPreviewBox.X, + 0, 1, aAnimationPreviewBox.Y), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + rxCanvas->drawBitmap(xAnimationIcon, aViewState, aAnimationRenderState); + } + if( bTransition ) + { + const awt::Rectangle aTransitionPreviewBox(aTopLeft.X+3, aTopLeft.Y+aSize.Height-20, 0, 0); + SharedBitmapDescriptor aTransitionDescriptor = aContainer.GetBitmap("Transition"); + Reference xTransitionIcon (aTransitionDescriptor->GetNormalBitmap()); + rendering::RenderState aTransitionRenderState ( + geometry::AffineMatrix2D( + 1, 0, aTransitionPreviewBox.X, + 0, 1, aTransitionPreviewBox.Y), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + rxCanvas->drawBitmap(xTransitionIcon, aViewState, aTransitionRenderState); + } + } + } + + // Create a polygon that is used to paint a frame around previews. Its + // coordinates are chosen in the local coordinate system of a preview. + if ( ! mxPreviewFrame.is()) + mxPreviewFrame = PresenterGeometryHelper::CreatePolygon( + awt::Rectangle(-1, -1, aSize.Width+2, aSize.Height+2), + rxCanvas->getDevice()); + + // Paint a border around the preview. + if (mxPreviewFrame.is()) + { + const util::Color aFrameColor (0x00000000); + PresenterCanvasHelper::SetDeviceColor(aRenderState, aFrameColor); + rxCanvas->drawPolyPolygon(mxPreviewFrame, aViewState, aRenderState); + } + + // Paint mouse over effect. + mpMouseOverManager->Paint(nSlideIndex, mxCanvas, xClip); +} + +void PresenterSlideSorter::Paint (const awt::Rectangle& rUpdateBox) +{ + const bool bCanvasChanged ( ! mxCanvas.is()); + if ( ! ProvideCanvas()) + return; + + if (mpLayout->mnRowCount<=0 || mpLayout->mnColumnCount<=0) + { + OSL_ASSERT(mpLayout->mnRowCount>0 || mpLayout->mnColumnCount>0); + return; + } + + ClearBackground(mxCanvas, rUpdateBox); + + // Give the canvas to the controls. + if (bCanvasChanged) + { + if (mpVerticalScrollBar.is()) + mpVerticalScrollBar->SetCanvas(mxCanvas); + if (mpCloseButton.is()) + mpCloseButton->SetCanvas(mxCanvas, mxWindow); + } + + // Now that the controls have a canvas we can do the layouting. + if (mbIsLayoutPending) + UpdateLayout(); + + // Paint the horizontal separator. + rendering::RenderState aRenderState (geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, Sequence(4), rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, maSeparatorColor); + mxCanvas->drawLine( + geometry::RealPoint2D(0, mnSeparatorY), + geometry::RealPoint2D(mxWindow->getPosSize().Width, mnSeparatorY), + rendering::ViewState(geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr), + aRenderState); + + // Paint the slides. + if ( ! PresenterGeometryHelper::AreRectanglesDisjoint( + rUpdateBox, + PresenterGeometryHelper::ConvertRectangle(mpLayout->maBoundingBox))) + { + mpLayout->ForAllVisibleSlides( + [this, &rUpdateBox] (sal_Int32 const nIndex) { + return this->PaintPreview(this->mxCanvas, rUpdateBox, nIndex); + }); + } + + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +void PresenterSlideSorter::SetHorizontalOffset (const double nXOffset) +{ + if (mpLayout->SetHorizontalOffset(nXOffset)) + { + mxPreviewCache->setVisibleRange( + mpLayout->GetFirstVisibleSlideIndex(), + mpLayout->GetLastVisibleSlideIndex()); + + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); + } +} + +void PresenterSlideSorter::SetVerticalOffset (const double nYOffset) +{ + if (mpLayout->SetVerticalOffset(nYOffset)) + { + mxPreviewCache->setVisibleRange( + mpLayout->GetFirstVisibleSlideIndex(), + mpLayout->GetLastVisibleSlideIndex()); + + mpPresenterController->GetPaintManager()->Invalidate(mxWindow); + } +} + +void PresenterSlideSorter::GotoSlide (const sal_Int32 nSlideIndex) +{ + mxSlideShowController->gotoSlideIndex(nSlideIndex); +} + +bool PresenterSlideSorter::ProvideCanvas() +{ + if ( ! mxCanvas.is()) + { + if (mxPane.is()) + mxCanvas = mxPane->getCanvas(); + + // Register as event listener so that we are informed when the + // canvas is disposed (and we have to fetch another one). + Reference xComponent (mxCanvas, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener(static_cast(this)); + + mpCurrentSlideFrameRenderer = + std::make_shared(mxComponentContext, mxCanvas); + } + return mxCanvas.is(); +} + +void PresenterSlideSorter::ThrowIfDisposed() +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterSlideSorter has been already disposed", + static_cast(this)); + } +} + +//===== PresenterSlideSorter::Layout ========================================== + +PresenterSlideSorter::Layout::Layout ( + ::rtl::Reference xVerticalScrollBar) + : mnHorizontalOffset(0), + mnVerticalOffset(0), + mnHorizontalGap(0), + mnVerticalGap(0), + mnHorizontalBorder(0), + mnVerticalBorder(0), + mnRowCount(1), + mnColumnCount(1), + mnSlideCount(0), + mnFirstVisibleColumn(-1), + mnLastVisibleColumn(-1), + mnFirstVisibleRow(-1), + mnLastVisibleRow(-1), + mpVerticalScrollBar(std::move(xVerticalScrollBar)) +{ +} + +void PresenterSlideSorter::Layout::Update ( + const geometry::RealRectangle2D& rBoundingBox, + const double nSlideAspectRatio) +{ + maBoundingBox = rBoundingBox; + + mnHorizontalBorder = gnHorizontalBorder; + mnVerticalBorder = gnVerticalBorder; + + const double nWidth (rBoundingBox.X2 - rBoundingBox.X1 - 2*mnHorizontalBorder); + const double nHeight (rBoundingBox.Y2 - rBoundingBox.Y1 - 2*mnVerticalBorder); + if (nWidth<=0 || nHeight<=0) + return; + + double nPreviewWidth; + + // Determine column count, preview width, and horizontal gap (borders + // are half the gap). Try to use the preferred values. Try more to + // stay in the valid intervals. This last constraint may be not + // fulfilled in some cases. + const double nElementWidth = nWidth / gnPreferredColumnCount; + if (nElementWidth < gnMinimalPreviewWidth + gnMinimalHorizontalPreviewGap) + { + // The preferred column count is too large. + // Can we use the preferred preview width? + if (nWidth - gnMinimalHorizontalPreviewGap >= gnPreferredPreviewWidth) + { + // Yes. + nPreviewWidth = gnPreferredPreviewWidth; + mnColumnCount = floor((nWidth+gnPreferredHorizontalPreviewGap) + / (nPreviewWidth+gnPreferredHorizontalPreviewGap)); + mnHorizontalGap = round((nWidth - mnColumnCount*nPreviewWidth) / mnColumnCount); + } + else + { + // No. Set the column count to 1 and adapt preview width and + // gap. + mnColumnCount = 1; + mnHorizontalGap = floor(gnMinimalHorizontalPreviewGap); + if (nWidth - gnMinimalHorizontalPreviewGap >= gnPreferredPreviewWidth) + nPreviewWidth = nWidth - gnMinimalHorizontalPreviewGap; + else + nPreviewWidth = ::std::max(gnMinimalPreviewWidth, nWidth-mnHorizontalGap); + } + } + else if (nElementWidth > gnMaximalPreviewWidth + gnMaximalHorizontalPreviewGap) + { + // The preferred column count is too small. + nPreviewWidth = gnPreferredPreviewWidth; + mnColumnCount = floor((nWidth+gnPreferredHorizontalPreviewGap) + / (nPreviewWidth+gnPreferredHorizontalPreviewGap)); + mnHorizontalGap = round((nWidth - mnColumnCount*nPreviewWidth) / mnColumnCount); + } + else + { + // The preferred column count is possible. Determine gap and + // preview width. + mnColumnCount = gnPreferredColumnCount; + if (nElementWidth - gnPreferredPreviewWidth < gnMinimalHorizontalPreviewGap) + { + // Use the minimal gap and adapt the preview width. + mnHorizontalGap = floor(gnMinimalHorizontalPreviewGap); + nPreviewWidth = (nWidth - mnColumnCount*mnHorizontalGap) / mnColumnCount; + } + else if (nElementWidth - gnPreferredPreviewWidth <= gnMaximalHorizontalPreviewGap) + { + // Use the maximal gap and adapt the preview width. + mnHorizontalGap = round(gnMaximalHorizontalPreviewGap); + nPreviewWidth = (nWidth - mnColumnCount*mnHorizontalGap) / mnColumnCount; + } + else + { + // Use the preferred preview width and adapt the gap. + nPreviewWidth = gnPreferredPreviewWidth; + mnHorizontalGap = round((nWidth - mnColumnCount*nPreviewWidth) / mnColumnCount); + } + } + + // Now determine the row count, preview height, and vertical gap. + const double nPreviewHeight = nPreviewWidth / nSlideAspectRatio; + mnRowCount = ::std::max( + sal_Int32(1), + sal_Int32(ceil((nHeight+gnPreferredVerticalPreviewGap) + / (nPreviewHeight + gnPreferredVerticalPreviewGap)))); + mnVerticalGap = round(gnPreferredVerticalPreviewGap); + + maPreviewSize = geometry::IntegerSize2D(floor(nPreviewWidth), floor(nPreviewHeight)); + + // Reset the offset. + mnVerticalOffset = 0; + mnHorizontalOffset = round(-(nWidth + - mnColumnCount*maPreviewSize.Width + - (mnColumnCount-1)*mnHorizontalGap) + / 2); +} + +void PresenterSlideSorter::Layout::SetupVisibleArea() +{ + geometry::RealPoint2D aPoint (GetLocalPosition( + geometry::RealPoint2D(maBoundingBox.X1, maBoundingBox.Y1))); + mnFirstVisibleColumn = 0; + mnFirstVisibleRow = ::std::max(sal_Int32(0), GetRow(aPoint)); + + aPoint = GetLocalPosition(geometry::RealPoint2D( maBoundingBox.X2, maBoundingBox.Y2)); + mnLastVisibleColumn = mnColumnCount - 1; + mnLastVisibleRow = GetRow(aPoint, true); +} + +bool PresenterSlideSorter::Layout::IsScrollBarNeeded (const sal_Int32 nSlideCount) +{ + geometry::RealPoint2D aBottomRight = GetPoint( + mnColumnCount * (GetRow(nSlideCount)+1) - 1, +1, +1); + return aBottomRight.X > maBoundingBox.X2-maBoundingBox.X1 + || aBottomRight.Y > maBoundingBox.Y2-maBoundingBox.Y1; +} + +geometry::RealPoint2D PresenterSlideSorter::Layout::GetLocalPosition( + const geometry::RealPoint2D& rWindowPoint) const +{ + if(AllSettings::GetLayoutRTL()) + { + return css::geometry::RealPoint2D( + -rWindowPoint.X + maBoundingBox.X2 + mnHorizontalOffset, + rWindowPoint.Y - maBoundingBox.Y1 + mnVerticalOffset); + } + else + { + return css::geometry::RealPoint2D( + rWindowPoint.X - maBoundingBox.X1 + mnHorizontalOffset, + rWindowPoint.Y - maBoundingBox.Y1 + mnVerticalOffset); + } +} + +geometry::RealPoint2D PresenterSlideSorter::Layout::GetWindowPosition( + const geometry::RealPoint2D& rLocalPoint) const +{ + if(AllSettings::GetLayoutRTL()) + { + return css::geometry::RealPoint2D( + -rLocalPoint.X + mnHorizontalOffset + maBoundingBox.X2, + rLocalPoint.Y - mnVerticalOffset + maBoundingBox.Y1); + } + else + { + return css::geometry::RealPoint2D( + rLocalPoint.X - mnHorizontalOffset + maBoundingBox.X1, + rLocalPoint.Y - mnVerticalOffset + maBoundingBox.Y1); + } +} + +sal_Int32 PresenterSlideSorter::Layout::GetColumn ( + const css::geometry::RealPoint2D& rLocalPoint) const +{ + const sal_Int32 nColumn(floor( + (rLocalPoint.X + mnHorizontalGap/2.0) / (maPreviewSize.Width+mnHorizontalGap))); + if (nColumn>=mnFirstVisibleColumn && nColumn<=mnLastVisibleColumn) + { + return nColumn; + } + else + return -1; +} + +sal_Int32 PresenterSlideSorter::Layout::GetRow ( + const css::geometry::RealPoint2D& rLocalPoint, + const bool bReturnInvalidValue) const +{ + const sal_Int32 nRow (floor( + (rLocalPoint.Y + mnVerticalGap/2.0) / (maPreviewSize.Height+mnVerticalGap))); + if (bReturnInvalidValue + || (nRow>=mnFirstVisibleRow && nRow<=mnLastVisibleRow)) + { + return nRow; + } + else + return -1; +} + +sal_Int32 PresenterSlideSorter::Layout::GetSlideIndexForPosition ( + const css::geometry::RealPoint2D& rWindowPoint) const +{ + if ( ! PresenterGeometryHelper::IsInside(maBoundingBox, rWindowPoint)) + return -1; + + const css::geometry::RealPoint2D aLocalPosition (GetLocalPosition(rWindowPoint)); + const sal_Int32 nColumn (GetColumn(aLocalPosition)); + const sal_Int32 nRow (GetRow(aLocalPosition)); + + if (nColumn < 0 || nRow < 0) + return -1; + else + { + sal_Int32 nIndex (GetIndex(nRow, nColumn)); + if (nIndex >= mnSlideCount) + return -1; + else + return nIndex; + } +} + +geometry::RealPoint2D PresenterSlideSorter::Layout::GetPoint ( + const sal_Int32 nSlideIndex, + const sal_Int32 nRelativeHorizontalPosition, + const sal_Int32 nRelativeVerticalPosition) const +{ + sal_Int32 nColumn (GetColumn(nSlideIndex)); + sal_Int32 nRow (GetRow(nSlideIndex)); + + geometry::RealPoint2D aPosition ( + mnHorizontalBorder + nColumn*(maPreviewSize.Width+mnHorizontalGap), + mnVerticalBorder + nRow*(maPreviewSize.Height+mnVerticalGap)); + + if (nRelativeHorizontalPosition >= 0) + { + if (nRelativeHorizontalPosition > 0) + aPosition.X += maPreviewSize.Width; + else + aPosition.X += maPreviewSize.Width / 2.0; + } + if (nRelativeVerticalPosition >= 0) + { + if (nRelativeVerticalPosition > 0) + aPosition.Y += maPreviewSize.Height; + else + aPosition.Y += maPreviewSize.Height / 2.0; + } + + return aPosition; +} + +awt::Rectangle PresenterSlideSorter::Layout::GetBoundingBox (const sal_Int32 nSlideIndex) const +{ + bool isRTL = AllSettings::GetLayoutRTL(); + const geometry::RealPoint2D aWindowPosition(GetWindowPosition(GetPoint(nSlideIndex, isRTL?1:-1, -1))); + return PresenterGeometryHelper::ConvertRectangle( + geometry::RealRectangle2D( + aWindowPosition.X, + aWindowPosition.Y, + aWindowPosition.X + maPreviewSize.Width, + aWindowPosition.Y + maPreviewSize.Height)); +} + +void PresenterSlideSorter::Layout::ForAllVisibleSlides( + const ::std::function& rAction) +{ + for (sal_Int32 nRow=mnFirstVisibleRow; nRow<=mnLastVisibleRow; ++nRow) + { + for (sal_Int32 nColumn=mnFirstVisibleColumn; nColumn<=mnLastVisibleColumn; ++nColumn) + { + const sal_Int32 nSlideIndex (GetIndex(nRow, nColumn)); + if (nSlideIndex >= mnSlideCount) + return; + rAction(nSlideIndex); + } + } +} + +sal_Int32 PresenterSlideSorter::Layout::GetFirstVisibleSlideIndex() const +{ + return GetIndex(mnFirstVisibleRow, mnFirstVisibleColumn); +} + +sal_Int32 PresenterSlideSorter::Layout::GetLastVisibleSlideIndex() const +{ + return ::std::min( + GetIndex(mnLastVisibleRow, mnLastVisibleColumn), + mnSlideCount); +} + +bool PresenterSlideSorter::Layout::SetHorizontalOffset (const double nOffset) +{ + if (mnHorizontalOffset != nOffset) + { + mnHorizontalOffset = round(nOffset); + SetupVisibleArea(); + UpdateScrollBars(); + return true; + } + else + return false; +} + +bool PresenterSlideSorter::Layout::SetVerticalOffset (const double nOffset) +{ + if (mnVerticalOffset != nOffset) + { + mnVerticalOffset = round(nOffset); + SetupVisibleArea(); + UpdateScrollBars(); + return true; + } + else + return false; +} + +void PresenterSlideSorter::Layout::UpdateScrollBars() +{ + sal_Int32 nTotalRowCount = sal_Int32(ceil(double(mnSlideCount) / double(mnColumnCount))); + + if (mpVerticalScrollBar) + { + mpVerticalScrollBar->SetTotalSize( + nTotalRowCount * maPreviewSize.Height + + (nTotalRowCount-1) * mnVerticalGap + + 2*mnVerticalGap); + mpVerticalScrollBar->SetThumbPosition(mnVerticalOffset, false); + mpVerticalScrollBar->SetThumbSize(maBoundingBox.Y2 - maBoundingBox.Y1 + 1); + mpVerticalScrollBar->SetLineHeight(maPreviewSize.Height); + } + + // No place yet for the vertical scroll bar. +} + +sal_Int32 PresenterSlideSorter::Layout::GetIndex ( + const sal_Int32 nRow, + const sal_Int32 nColumn) const +{ + return nRow * mnColumnCount + nColumn; +} + +sal_Int32 PresenterSlideSorter::Layout::GetRow (const sal_Int32 nSlideIndex) const +{ + return nSlideIndex / mnColumnCount; +} + +sal_Int32 PresenterSlideSorter::Layout::GetColumn (const sal_Int32 nSlideIndex) const +{ + return nSlideIndex % mnColumnCount; +} + +//===== PresenterSlideSorter::MouseOverManager ================================ + +PresenterSlideSorter::MouseOverManager::MouseOverManager ( + const Reference& rxSlides, + const std::shared_ptr& rpTheme, + const Reference& rxInvalidateTarget, + std::shared_ptr xPaintManager) + : mxSlides(rxSlides), + mnSlideIndex(-1), + mxInvalidateTarget(rxInvalidateTarget), + mpPaintManager(std::move(xPaintManager)) +{ + if (rpTheme != nullptr) + { + std::shared_ptr pBitmaps (rpTheme->GetBitmapContainer()); + if (pBitmaps != nullptr) + { + mpLeftLabelBitmap = pBitmaps->GetBitmap("LabelLeft"); + mpCenterLabelBitmap = pBitmaps->GetBitmap("LabelCenter"); + mpRightLabelBitmap = pBitmaps->GetBitmap("LabelRight"); + } + + mpFont = rpTheme->GetFont("SlideSorterLabelFont"); + } +} + +void PresenterSlideSorter::MouseOverManager::Paint ( + const sal_Int32 nSlideIndex, + const Reference& rxCanvas, + const Reference& rxClip) +{ + if (nSlideIndex != mnSlideIndex) + return; + + if (mxCanvas != rxCanvas) + SetCanvas(rxCanvas); + if (rxCanvas == nullptr) + return; + + if ( ! mxBitmap.is()) + mxBitmap = CreateBitmap(msText, maSlideBoundingBox.Width); + if (!mxBitmap.is()) + return; + + geometry::IntegerSize2D aSize (mxBitmap->getSize()); + const double nXOffset (maSlideBoundingBox.X + + (maSlideBoundingBox.Width - aSize.Width) / 2.0); + const double nYOffset (maSlideBoundingBox.Y + + (maSlideBoundingBox.Height - aSize.Height) / 2.0); + rxCanvas->drawBitmap( + mxBitmap, + rendering::ViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + rxClip), + rendering::RenderState( + geometry::AffineMatrix2D(1,0,nXOffset, 0,1,nYOffset), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE)); +} + +void PresenterSlideSorter::MouseOverManager::SetCanvas ( + const Reference& rxCanvas) +{ + mxCanvas = rxCanvas; + if (mpFont) + mpFont->PrepareFont(mxCanvas); +} + +void PresenterSlideSorter::MouseOverManager::SetSlide ( + const sal_Int32 nSlideIndex, + const awt::Rectangle& rBox) +{ + if (mnSlideIndex == nSlideIndex) + return; + + mnSlideIndex = -1; + Invalidate(); + + maSlideBoundingBox = rBox; + mnSlideIndex = nSlideIndex; + + if (nSlideIndex >= 0) + { + if (mxSlides) + { + msText.clear(); + + Reference xSlideProperties(mxSlides->getByIndex(nSlideIndex), UNO_QUERY); + if (xSlideProperties.is()) + xSlideProperties->getPropertyValue("LinkDisplayName") >>= msText; + + if (msText.isEmpty()) + msText = "Slide " + OUString::number(nSlideIndex + 1); + } + } + else + { + msText.clear(); + } + mxBitmap = nullptr; + + Invalidate(); +} + +Reference PresenterSlideSorter::MouseOverManager::CreateBitmap ( + const OUString& rsText, + const sal_Int32 nMaximalWidth) const +{ + if ( ! mxCanvas.is()) + return nullptr; + + if (!mpFont || !mpFont->mxFont.is()) + return nullptr; + + // Long text has to be shortened. + const OUString sText (GetFittingText(rsText, nMaximalWidth + - 2*gnHorizontalLabelBorder + - 2*gnHorizontalLabelPadding)); + + // Determine the size of the label. Its height is defined by the + // bitmaps that are used to paints its background. The width is defined + // by the text. + geometry::IntegerSize2D aLabelSize (CalculateLabelSize(sText)); + + // Create a new bitmap that will contain the complete label. + Reference xBitmap ( + mxCanvas->getDevice()->createCompatibleAlphaBitmap(aLabelSize)); + + if ( ! xBitmap.is()) + return nullptr; + + Reference xBitmapCanvas (xBitmap, UNO_QUERY); + if ( ! xBitmapCanvas.is()) + return nullptr; + + // Paint the background. + PaintButtonBackground(xBitmapCanvas, aLabelSize); + + // Paint the text. + if (!sText.isEmpty()) + { + + const rendering::StringContext aContext (sText, 0, sText.getLength()); + const Reference xLayout (mpFont->mxFont->createTextLayout( + aContext, rendering::TextDirection::WEAK_LEFT_TO_RIGHT,0)); + const geometry::RealRectangle2D aTextBBox (xLayout->queryTextBounds()); + + const double nXOffset = (aLabelSize.Width - aTextBBox.X2 + aTextBBox.X1) / 2; + const double nYOffset = aLabelSize.Height + - (aLabelSize.Height - aTextBBox.Y2 + aTextBBox.Y1)/2 - aTextBBox.Y2; + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,nXOffset, 0,1,nYOffset), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor); + + xBitmapCanvas->drawTextLayout ( + xLayout, + aViewState, + aRenderState); + } + + return xBitmap; +} + +OUString PresenterSlideSorter::MouseOverManager::GetFittingText ( + const OUString& rsText, + const double nMaximalWidth) const +{ + const double nTextWidth ( + PresenterCanvasHelper::GetTextSize(mpFont->mxFont, rsText).Width); + if (nTextWidth > nMaximalWidth) + { + // Text is too wide. Shorten it by removing characters from the end + // and replacing them by ellipses. + + // Guess a start value of the final string length. + double nBestWidth (0); + OUString sBestCandidate; + sal_Int32 nLength (round(rsText.getLength() * nMaximalWidth / nTextWidth)); + static constexpr OUStringLiteral sEllipses (u"..."); + while (true) + { + const OUString sCandidate (rsText.subView(0,nLength) + sEllipses); + const double nWidth ( + PresenterCanvasHelper::GetTextSize(mpFont->mxFont, sCandidate).Width); + if (nWidth > nMaximalWidth) + { + // Candidate still too wide, shorten it. + nLength -= 1; + if (nLength <= 0) + break; + } + else if (nWidth < nMaximalWidth) + { + // Candidate short enough. + if (nWidth > nBestWidth) + { + // Best length so far. + sBestCandidate = sCandidate; + nBestWidth = nWidth; + nLength += 1; + if (nLength >= rsText.getLength()) + break; + } + else + break; + } + else + { + // Candidate is exactly as long as it may be. Use it + // without looking any further. + sBestCandidate = sCandidate; + break; + } + } + return sBestCandidate; + } + else + return rsText; +} + +geometry::IntegerSize2D PresenterSlideSorter::MouseOverManager::CalculateLabelSize ( + const OUString& rsText) const +{ + // Height is specified by the label bitmaps. + sal_Int32 nHeight (32); + if (mpCenterLabelBitmap) + { + Reference xBitmap (mpCenterLabelBitmap->GetNormalBitmap()); + if (xBitmap.is()) + nHeight = xBitmap->getSize().Height; + } + + // Width is specified by text width and maximal width. + const geometry::RealSize2D aTextSize ( + PresenterCanvasHelper::GetTextSize(mpFont->mxFont, rsText)); + + const sal_Int32 nWidth (round(aTextSize.Width + 2*gnHorizontalLabelPadding)); + + return geometry::IntegerSize2D(nWidth, nHeight); +} + +void PresenterSlideSorter::MouseOverManager::PaintButtonBackground ( + const Reference& rxCanvas, + const geometry::IntegerSize2D& rSize) const +{ + // Get the bitmaps for painting the label background. + Reference xLeftLabelBitmap; + if (mpLeftLabelBitmap) + xLeftLabelBitmap = mpLeftLabelBitmap->GetNormalBitmap(); + + Reference xCenterLabelBitmap; + if (mpCenterLabelBitmap) + xCenterLabelBitmap = mpCenterLabelBitmap->GetNormalBitmap(); + + Reference xRightLabelBitmap; + if (mpRightLabelBitmap) + xRightLabelBitmap = mpRightLabelBitmap->GetNormalBitmap(); + + PresenterUIPainter::PaintHorizontalBitmapComposite ( + rxCanvas, + awt::Rectangle(0,0, rSize.Width,rSize.Height), + awt::Rectangle(0,0, rSize.Width,rSize.Height), + xLeftLabelBitmap, + xCenterLabelBitmap, + xRightLabelBitmap); +} + +void PresenterSlideSorter::MouseOverManager::Invalidate() +{ + if (mpPaintManager != nullptr) + mpPaintManager->Invalidate(mxInvalidateTarget, maSlideBoundingBox, true); +} + +//===== PresenterSlideSorter::CurrentSlideFrameRenderer ======================= + +PresenterSlideSorter::CurrentSlideFrameRenderer::CurrentSlideFrameRenderer ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxCanvas) + : mnTopFrameSize(0), + mnLeftFrameSize(0), + mnRightFrameSize(0), + mnBottomFrameSize(0) +{ + PresenterConfigurationAccess aConfiguration ( + rxContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + Reference xBitmaps ( + aConfiguration.GetConfigurationNode( + "PresenterScreenSettings/SlideSorter/CurrentSlideBorderBitmaps"), + UNO_QUERY); + if ( ! xBitmaps.is()) + return; + + PresenterBitmapContainer aContainer ( + "PresenterScreenSettings/SlideSorter/CurrentSlideBorderBitmaps", + std::shared_ptr(), + rxContext, + rxCanvas); + + mpTopLeft = aContainer.GetBitmap("TopLeft"); + mpTop = aContainer.GetBitmap("Top"); + mpTopRight = aContainer.GetBitmap("TopRight"); + mpLeft = aContainer.GetBitmap("Left"); + mpRight = aContainer.GetBitmap("Right"); + mpBottomLeft = aContainer.GetBitmap("BottomLeft"); + mpBottom = aContainer.GetBitmap("Bottom"); + mpBottomRight = aContainer.GetBitmap("BottomRight"); + + // Determine size of frame. + if (mpTop) + mnTopFrameSize = mpTop->mnHeight; + if (mpLeft) + mnLeftFrameSize = mpLeft->mnWidth; + if (mpRight) + mnRightFrameSize = mpRight->mnWidth; + if (mpBottom) + mnBottomFrameSize = mpBottom->mnHeight; + + if (mpTopLeft) + { + mnTopFrameSize = ::std::max(mnTopFrameSize, mpTopLeft->mnHeight); + mnLeftFrameSize = ::std::max(mnLeftFrameSize, mpTopLeft->mnWidth); + } + if (mpTopRight) + { + mnTopFrameSize = ::std::max(mnTopFrameSize, mpTopRight->mnHeight); + mnRightFrameSize = ::std::max(mnRightFrameSize, mpTopRight->mnWidth); + } + if (mpBottomLeft) + { + mnLeftFrameSize = ::std::max(mnLeftFrameSize, mpBottomLeft->mnWidth); + mnBottomFrameSize = ::std::max(mnBottomFrameSize, mpBottomLeft->mnHeight); + } + if (mpBottomRight) + { + mnRightFrameSize = ::std::max(mnRightFrameSize, mpBottomRight->mnWidth); + mnBottomFrameSize = ::std::max(mnBottomFrameSize, mpBottomRight->mnHeight); + } +} + +void PresenterSlideSorter::CurrentSlideFrameRenderer::PaintCurrentSlideFrame ( + const awt::Rectangle& rSlideBoundingBox, + const Reference& rxCanvas, + const geometry::RealRectangle2D& rClipBox) +{ + if ( ! rxCanvas.is()) + return; + + const Reference xClip ( + PresenterGeometryHelper::CreatePolygon(rClipBox, rxCanvas->getDevice())); + + if (mpTop) + { + PaintBitmapTiled( + mpTop->GetNormalBitmap(), + rxCanvas, + rClipBox, + rSlideBoundingBox.X, + rSlideBoundingBox.Y - mpTop->mnHeight, + rSlideBoundingBox.Width, + mpTop->mnHeight); + } + if (mpLeft) + { + PaintBitmapTiled( + mpLeft->GetNormalBitmap(), + rxCanvas, + rClipBox, + rSlideBoundingBox.X - mpLeft->mnWidth, + rSlideBoundingBox.Y, + mpLeft->mnWidth, + rSlideBoundingBox.Height); + } + if (mpRight) + { + PaintBitmapTiled( + mpRight->GetNormalBitmap(), + rxCanvas, + rClipBox, + rSlideBoundingBox.X + rSlideBoundingBox.Width, + rSlideBoundingBox.Y, + mpRight->mnWidth, + rSlideBoundingBox.Height); + } + if (mpBottom) + { + PaintBitmapTiled( + mpBottom->GetNormalBitmap(), + rxCanvas, + rClipBox, + rSlideBoundingBox.X, + rSlideBoundingBox.Y + rSlideBoundingBox.Height, + rSlideBoundingBox.Width, + mpBottom->mnHeight); + } + if (mpTopLeft) + { + PaintBitmapOnce( + mpTopLeft->GetNormalBitmap(), + rxCanvas, + xClip, + rSlideBoundingBox.X - mpTopLeft->mnWidth, + rSlideBoundingBox.Y - mpTopLeft->mnHeight); + } + if (mpTopRight) + { + PaintBitmapOnce( + mpTopRight->GetNormalBitmap(), + rxCanvas, + xClip, + rSlideBoundingBox.X + rSlideBoundingBox.Width, + rSlideBoundingBox.Y - mpTopRight->mnHeight); + } + if (mpBottomLeft) + { + PaintBitmapOnce( + mpBottomLeft->GetNormalBitmap(), + rxCanvas, + xClip, + rSlideBoundingBox.X - mpBottomLeft->mnWidth, + rSlideBoundingBox.Y + rSlideBoundingBox.Height); + } + if (mpBottomRight) + { + PaintBitmapOnce( + mpBottomRight->GetNormalBitmap(), + rxCanvas, + xClip, + rSlideBoundingBox.X + rSlideBoundingBox.Width, + rSlideBoundingBox.Y + rSlideBoundingBox.Height); + } +} + +awt::Rectangle PresenterSlideSorter::CurrentSlideFrameRenderer::GetBoundingBox ( + const awt::Rectangle& rSlideBoundingBox) +{ + return awt::Rectangle( + rSlideBoundingBox.X - mnLeftFrameSize, + rSlideBoundingBox.Y - mnTopFrameSize, + rSlideBoundingBox.Width + mnLeftFrameSize + mnRightFrameSize, + rSlideBoundingBox.Height + mnTopFrameSize + mnBottomFrameSize); +} + +void PresenterSlideSorter::CurrentSlideFrameRenderer::PaintBitmapOnce( + const css::uno::Reference& rxBitmap, + const css::uno::Reference& rxCanvas, + const Reference& rxClip, + const double nX, + const double nY) +{ + OSL_ASSERT(rxCanvas.is()); + if ( ! rxBitmap.is()) + return; + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + rxClip); + + const rendering::RenderState aRenderState ( + geometry::AffineMatrix2D( + 1, 0, nX, + 0, 1, nY), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + rxCanvas->drawBitmap( + rxBitmap, + aViewState, + aRenderState); +} + +void PresenterSlideSorter::CurrentSlideFrameRenderer::PaintBitmapTiled( + const css::uno::Reference& rxBitmap, + const css::uno::Reference& rxCanvas, + const geometry::RealRectangle2D& rClipBox, + const double nX0, + const double nY0, + const double nWidth, + const double nHeight) +{ + OSL_ASSERT(rxCanvas.is()); + if ( ! rxBitmap.is()) + return; + + geometry::IntegerSize2D aSize (rxBitmap->getSize()); + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + PresenterGeometryHelper::CreatePolygon( + PresenterGeometryHelper::Intersection( + rClipBox, + geometry::RealRectangle2D(nX0,nY0,nX0+nWidth,nY0+nHeight)), + rxCanvas->getDevice())); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D( + 1, 0, nX0, + 0, 1, nY0), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + + const double nX1 = nX0 + nWidth; + const double nY1 = nY0 + nHeight; + for (double nY=nY0; nYdrawBitmap( + rxBitmap, + aViewState, + aRenderState); + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSlideSorter.hxx b/sd/source/console/PresenterSlideSorter.hxx new file mode 100644 index 0000000000..f1056fbeba --- /dev/null +++ b/sd/source/console/PresenterSlideSorter.hxx @@ -0,0 +1,189 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESORTER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESORTER_HXX + +#include +#include "PresenterController.hxx" +#include "PresenterPaneContainer.hxx" +#include "PresenterViewFactory.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +class PresenterButton; +class PresenterScrollBar; + +typedef cppu::WeakComponentImplHelper< + css::drawing::framework::XView, + css::awt::XWindowListener, + css::awt::XPaintListener, + css::beans::XPropertyChangeListener, + css::drawing::XSlidePreviewCacheListener, + css::awt::XMouseListener, + css::awt::XMouseMotionListener, + css::drawing::XDrawView + > PresenterSlideSorterInterfaceBase; + +/** A simple slide sorter for the presenter screen. It uses a preview cache + to create the slide previews. Painting is done via a canvas. +*/ +class PresenterSlideSorter + : private ::cppu::BaseMutex, + public PresenterSlideSorterInterfaceBase, + public CachablePresenterView +{ +public: + PresenterSlideSorter ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxViewId, + const rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterSlideSorter() override; + + virtual void SAL_CALL disposing() override; + + // lang::XEventListener + + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XMouseListener + + virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override; + + // XMouseMotionListener + + virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override; + + // XResourceId + + virtual css::uno::Reference SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + // XPropertyChangeListener + + virtual void SAL_CALL propertyChange ( + const css::beans::PropertyChangeEvent& rEvent) override; + + // XSlidePreviewCacheListener + + virtual void SAL_CALL notifyPreviewCreation ( + sal_Int32 nSlideIndex) override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference& rxSlide) override; + + virtual css::uno::Reference SAL_CALL getCurrentPage() override; + +private: + css::uno::Reference mxComponentContext; + css::uno::Reference mxViewId; + css::uno::Reference mxPane; + css::uno::Reference mxCanvas; + css::uno::Reference mxWindow; + ::rtl::Reference mpPresenterController; + css::uno::Reference mxSlideShowController; + css::uno::Reference mxPreviewCache; + bool mbIsLayoutPending; + class Layout; + std::shared_ptr mpLayout; + ::rtl::Reference mpVerticalScrollBar; + ::rtl::Reference mpCloseButton; + class MouseOverManager; + std::unique_ptr mpMouseOverManager; + sal_Int32 mnSlideIndexMousePressed; + sal_Int32 mnCurrentSlideIndex; + sal_Int32 mnSeparatorY; + css::util::Color maSeparatorColor; + css::awt::Rectangle maCurrentSlideFrameBoundingBox; + class CurrentSlideFrameRenderer; + std::shared_ptr mpCurrentSlideFrameRenderer; + css::uno::Reference mxPreviewFrame; + + void UpdateLayout(); + css::geometry::RealRectangle2D PlaceScrollBars ( + const css::geometry::RealRectangle2D& rUpperBox); + void PlaceCloseButton ( + const PresenterPaneContainer::SharedPaneDescriptor& rpPane, + const css::awt::Rectangle& rCenterBox, + const sal_Int32 nLeftFrameWidth); + void ClearBackground ( + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rRedrawArea); + double GetSlideAspectRatio() const; + css::uno::Reference GetPreview (const sal_Int32 nSlideIndex); + void PaintPreview ( + const css::uno::Reference& rxCanvas, + const css::awt::Rectangle& rUpdateBox, + const sal_Int32 nSlideIndex); + void Paint (const css::awt::Rectangle& rUpdateBox); + void SetHorizontalOffset (const double nXOffset); + void SetVerticalOffset (const double nYOffset); + void GotoSlide (const sal_Int32 nSlideIndex); + bool ProvideCanvas(); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSprite.cxx b/sd/source/console/PresenterSprite.cxx new file mode 100644 index 0000000000..0f7c8f8290 --- /dev/null +++ b/sd/source/console/PresenterSprite.cxx @@ -0,0 +1,163 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterSprite.hxx" + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::UNO_QUERY; + +namespace sdext::presenter { + +PresenterSprite::PresenterSprite() + : maSize(0,0), + maLocation(0,0), + mbIsVisible(false) +{ +} + +PresenterSprite::~PresenterSprite() +{ + if (mxSprite.is()) + { + mxSprite->hide(); + Reference xComponent (mxSprite, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + mxSprite = nullptr; + } +} + +void PresenterSprite::SetFactory ( + const css::uno::Reference& rxSpriteFactory) +{ + if (mxSpriteFactory != rxSpriteFactory) + { + DisposeSprite(); + mxSpriteFactory = rxSpriteFactory; + if (mbIsVisible) + ProvideSprite(); + } +} + +css::uno::Reference PresenterSprite::GetCanvas() +{ + ProvideSprite(); + if (mxSprite.is()) + return mxSprite->getContentCanvas(); + else + return nullptr; +} + +void PresenterSprite::Show() +{ + mbIsVisible = true; + if (mxSprite.is()) + mxSprite->show(); + else + ProvideSprite(); +} + +void PresenterSprite::Hide() +{ + mbIsVisible = false; + if (mxSprite.is()) + mxSprite->hide(); +} + +void PresenterSprite::Resize (const css::geometry::RealSize2D& rSize) +{ + maSize = rSize; + if (mxSprite.is()) + DisposeSprite(); + if (mbIsVisible) + ProvideSprite(); +} + +void PresenterSprite::MoveTo (const css::geometry::RealPoint2D& rLocation) +{ + maLocation = rLocation; + if (mxSprite.is()) + mxSprite->move( + maLocation, + rendering::ViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr), + rendering::RenderState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + uno::Sequence(4), + rendering::CompositeOperation::SOURCE) + ); +} + +void PresenterSprite::Update() +{ + if (mxSpriteFactory.is()) + mxSpriteFactory->updateScreen(false); +} + +void PresenterSprite::ProvideSprite() +{ + if ( !(! mxSprite.is() + && mxSpriteFactory.is() + && maSize.Width>0 + && maSize.Height>0)) + return; + + mxSprite = mxSpriteFactory->createCustomSprite(maSize); + if (!mxSprite.is()) + return; + + mxSprite->move(maLocation, + rendering::ViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr), + rendering::RenderState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + nullptr, + uno::Sequence(4), + rendering::CompositeOperation::SOURCE) + ); + mxSprite->setAlpha(1.0); + mxSprite->setPriority(0); + if (mbIsVisible) + mxSprite->show(); +} + +void PresenterSprite::DisposeSprite() +{ + if (mxSprite.is()) + { + mxSprite->hide(); + Reference xComponent (mxSprite, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + mxSprite = nullptr; + } +} + +} //end of namespace sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSprite.hxx b/sd/source/console/PresenterSprite.hxx new file mode 100644 index 0000000000..b550ec0a81 --- /dev/null +++ b/sd/source/console/PresenterSprite.hxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSPRITE_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSPRITE_HXX + +#include +#include + +namespace sdext::presenter +{ +/** A wrapper around a css::rendering::XCustomSprite that allows + not only setting values like size, location, and transformation but also + provides read access to them. + It also handles the showing and hiding of a sprite. This includes not + to show the sprite when its size is not yet defined (results in a crash) + and hiding a sprite before disposing it (results in zombie sprites.) +*/ +class PresenterSprite final +{ +public: + PresenterSprite(); + ~PresenterSprite(); + PresenterSprite(const PresenterSprite&) = delete; + PresenterSprite& operator=(const PresenterSprite&) = delete; + + /** The given sprite canvas is used as factory to create the sprite that + is wrapped by objects of this class. + It is also used to call updateScreen() at (wrapped by the Update() method). + */ + void SetFactory(const css::uno::Reference& rxSpriteFactory); + + css::uno::Reference GetCanvas(); + + void Show(); + void Hide(); + + void Resize(const css::geometry::RealSize2D& rSize); + void MoveTo(const css::geometry::RealPoint2D& rLocation); + + void Update(); + +private: + css::uno::Reference mxSpriteFactory; + css::uno::Reference mxSprite; + css::geometry::RealSize2D maSize; + css::geometry::RealPoint2D maLocation; + bool mbIsVisible; + + void ProvideSprite(); + void DisposeSprite(); +}; +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSpritePane.cxx b/sd/source/console/PresenterSpritePane.cxx new file mode 100644 index 0000000000..c90f250fb1 --- /dev/null +++ b/sd/source/console/PresenterSpritePane.cxx @@ -0,0 +1,173 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterController.hxx" +#include "PresenterSpritePane.hxx" +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +//===== PresenterSpritePane ========================================================= + +PresenterSpritePane::PresenterSpritePane (const Reference& rxContext, + const ::rtl::Reference& rpPresenterController) + : PresenterPaneBase(rxContext, rpPresenterController), + mpSprite(std::make_shared()) +{ + Reference xFactory ( + mxComponentContext->getServiceManager(), UNO_SET_THROW); + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + mxComponentContext), + UNO_QUERY_THROW); +} + +PresenterSpritePane::~PresenterSpritePane() +{ +} + +void PresenterSpritePane::disposing() +{ + mpSprite->SetFactory(nullptr); + mxParentCanvas = nullptr; + PresenterPaneBase::disposing(); +} + +//----- XPane ----------------------------------------------------------------- + +Reference SAL_CALL PresenterSpritePane::getWindow() +{ + ThrowIfDisposed(); + return mxContentWindow; +} + +Reference SAL_CALL PresenterSpritePane::getCanvas() +{ + ThrowIfDisposed(); + + if ( ! mxContentCanvas.is()) + UpdateCanvases(); + + return mxContentCanvas; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterSpritePane::windowResized (const awt::WindowEvent& rEvent) +{ + PresenterPaneBase::windowResized(rEvent); + + mpSprite->Resize(geometry::RealSize2D(rEvent.Width, rEvent.Height)); + LayoutContextWindow(); + UpdateCanvases(); +} + +void SAL_CALL PresenterSpritePane::windowMoved (const awt::WindowEvent& rEvent) +{ + PresenterPaneBase::windowMoved(rEvent); + + awt::Rectangle aBox ( + mxPresenterHelper->getWindowExtentsRelative(mxBorderWindow, mxParentWindow)); + mpSprite->MoveTo(geometry::RealPoint2D(aBox.X, aBox.Y)); + mpSprite->Update(); +} + +void SAL_CALL PresenterSpritePane::windowShown (const lang::EventObject& rEvent) +{ + PresenterPaneBase::windowShown(rEvent); + + mpSprite->Show(); + ToTop(); + + if (mxContentWindow.is()) + { + LayoutContextWindow(); + mxContentWindow->setVisible(true); + } +} + +void SAL_CALL PresenterSpritePane::windowHidden (const lang::EventObject& rEvent) +{ + PresenterPaneBase::windowHidden(rEvent); + + mpSprite->Hide(); + if (mxContentWindow.is()) + mxContentWindow->setVisible(false); +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterSpritePane::windowPaint (const awt::PaintEvent&) +{ + ThrowIfDisposed(); + + /* + Reference xSpriteCanvas (mxParentCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(sal_False); + */ +} + + +void PresenterSpritePane::UpdateCanvases() +{ + Reference xContentCanvasComponent (mxContentCanvas, UNO_QUERY); + if (xContentCanvasComponent.is()) + xContentCanvasComponent->dispose(); + + // The border canvas is the content canvas of the sprite. + mxBorderCanvas = mpSprite->GetCanvas(); + + // The content canvas is a wrapper of the border canvas. + if (mxBorderCanvas.is()) + mxContentCanvas = mxPresenterHelper->createSharedCanvas( + mxParentCanvas, + mxParentWindow, + mxBorderCanvas, + mxBorderWindow, + mxContentWindow); + + const awt::Rectangle aWindowBox (mxBorderWindow->getPosSize()); + PaintBorder(awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height)); +} + +void PresenterSpritePane::CreateCanvases ( + const css::uno::Reference& rxParentCanvas) +{ + OSL_ASSERT(!mxParentCanvas.is() || mxParentCanvas==rxParentCanvas); + mxParentCanvas = rxParentCanvas; + + mpSprite->SetFactory(mxParentCanvas); + if (mxBorderWindow.is()) + { + const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize()); + mpSprite->Resize(geometry::RealSize2D(aBorderBox.Width, aBorderBox.Height)); + } + + UpdateCanvases(); +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterSpritePane.hxx b/sd/source/console/PresenterSpritePane.hxx new file mode 100644 index 0000000000..1c2c923b94 --- /dev/null +++ b/sd/source/console/PresenterSpritePane.hxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "PresenterPaneBase.hxx" +#include "PresenterSprite.hxx" +#include +#include +#include +#include +#include + +namespace sdext::presenter +{ +/** Use a sprite to display the contents and the border of a pane. Windows + are still used to define the locations and sizes of both the border and + the pane content. Note that every resize results in a disposed canvas. + Therefore call getCanvas in every repaint or at least after every resize. +*/ +class PresenterSpritePane : public PresenterPaneBase +{ +public: + PresenterSpritePane(const css::uno::Reference& rxContext, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterSpritePane() override; + + virtual void SAL_CALL disposing() override; + + using PresenterPaneBase::disposing; + + // XPane + + virtual css::uno::Reference SAL_CALL getWindow() override; + + virtual css::uno::Reference SAL_CALL getCanvas() override; + + // XWindowListener + + virtual void SAL_CALL windowResized(const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved(const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown(const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden(const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint(const css::awt::PaintEvent& rEvent) override; + +private: + css::uno::Reference mxParentCanvas; + std::shared_ptr mpSprite; + + virtual void CreateCanvases( + const css::uno::Reference& rxParentCanvas) override; + void UpdateCanvases(); +}; + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterTextView.cxx b/sd/source/console/PresenterTextView.cxx new file mode 100644 index 0000000000..08d981fe6a --- /dev/null +++ b/sd/source/console/PresenterTextView.cxx @@ -0,0 +1,1193 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterTextView.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterTimer.hxx" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; +using namespace ::com::sun::star::uno; + +const sal_Int64 CaretBlinkInterval = 500 * 1000 * 1000; + +//#define SHOW_CHARACTER_BOXES + +namespace { + sal_Int32 Signum (const sal_Int32 nValue) + { + if (nValue < 0) + return -1; + else if (nValue > 0) + return +1; + else + return 0; + } +} + +namespace sdext::presenter { + +//===== PresenterTextView ===================================================== + +PresenterTextView::PresenterTextView ( + const Reference& rxContext, + const Reference& rxCanvas, + const ::std::function& rInvalidator) + : mxCanvas(rxCanvas), + maLocation(0,0), + maSize(0,0), + mpCaret(std::make_shared( + rxContext, + [this] (sal_Int32 const nParagraphIndex, sal_Int32 const nCharacterIndex) + { return this->GetCaretBounds(nParagraphIndex, nCharacterIndex); }, + rInvalidator)), + mnLeftOffset(0), + mnTopOffset(0), + mbIsFormatPending(false) +{ + Reference xFactory = + rxContext->getServiceManager(); + if ( ! xFactory.is()) + return; + + // Create the break iterator that we use to break text into lines. + mxBreakIterator = i18n::BreakIterator::create(rxContext); + + // Create the script type detector that is used to split paragraphs into + // portions of the same text direction. + mxScriptTypeDetector.set( + xFactory->createInstanceWithContext( + "com.sun.star.i18n.ScriptTypeDetector", + rxContext), + UNO_QUERY_THROW); +} + +void PresenterTextView::SetText (const Reference& rxText) +{ + maParagraphs.clear(); + + Reference xParagraphAccess (rxText, UNO_QUERY); + if ( ! xParagraphAccess.is()) + return; + + Reference xParagraphs = + xParagraphAccess->createEnumeration(); + if ( ! xParagraphs.is()) + return; + + if ( ! mpFont || ! mpFont->PrepareFont(mxCanvas)) + return; + + sal_Int32 nCharacterCount (0); + while (xParagraphs->hasMoreElements()) + { + SharedPresenterTextParagraph pParagraph = std::make_shared( + maParagraphs.size(), + mxBreakIterator, + mxScriptTypeDetector, + Reference(xParagraphs->nextElement(), UNO_QUERY), + mpCaret); + pParagraph->SetupCellArray(mpFont); + pParagraph->SetCharacterOffset(nCharacterCount); + nCharacterCount += pParagraph->GetCharacterCount(); + maParagraphs.push_back(pParagraph); + } + + if (mpCaret) + mpCaret->HideCaret(); + + RequestFormat(); +} + +void PresenterTextView::SetTextChangeBroadcaster ( + const ::std::function& rBroadcaster) +{ + maTextChangeBroadcaster = rBroadcaster; +} + +void PresenterTextView::SetLocation (const css::geometry::RealPoint2D& rLocation) +{ + maLocation = rLocation; + + for (auto& rxParagraph : maParagraphs) + { + rxParagraph->SetOrigin( + maLocation.X - mnLeftOffset, + maLocation.Y - mnTopOffset); + } +} + +void PresenterTextView::SetSize (const css::geometry::RealSize2D& rSize) +{ + maSize = rSize; + RequestFormat(); +} + +double PresenterTextView::GetTotalTextHeight() +{ + if (mbIsFormatPending) + { + if ( ! mpFont->PrepareFont(mxCanvas)) + return 0; + Format(); + } + + return std::accumulate(maParagraphs.begin(), maParagraphs.end(), double(0), + [](const double& nTotalHeight, const SharedPresenterTextParagraph& rxParagraph) { + return nTotalHeight + rxParagraph->GetTotalTextHeight(); + }); +} + +void PresenterTextView::SetFont (const PresenterTheme::SharedFontDescriptor& rpFont) +{ + mpFont = rpFont; + RequestFormat(); +} + +void PresenterTextView::SetOffset( + const double nLeft, + const double nTop) +{ + mnLeftOffset = nLeft; + mnTopOffset = nTop; + + // Trigger an update of the text origin stored at the individual paragraphs. + SetLocation(maLocation); +} + +void PresenterTextView::MoveCaret ( + const sal_Int32 nDistance, + const sal_Int16 nTextType) +{ + if ( ! mpCaret) + return; + + // When the caret has not been visible yet then move it to the beginning + // of the text. + if (mpCaret->GetParagraphIndex() < 0) + { + mpCaret->SetPosition(0,0); + return; + } + + sal_Int32 nParagraphIndex (mpCaret->GetParagraphIndex()); + sal_Int32 nCharacterIndex (mpCaret->GetCharacterIndex()); + switch (nTextType) + { + default: + case AccessibleTextType::CHARACTER: + nCharacterIndex += nDistance; + break; + + case AccessibleTextType::WORD: + { + sal_Int32 nRemainingDistance (nDistance); + while (nRemainingDistance != 0) + { + SharedPresenterTextParagraph pParagraph (GetParagraph(nParagraphIndex)); + if (pParagraph) + { + const sal_Int32 nDelta (Signum(nDistance)); + nCharacterIndex = pParagraph->GetWordBoundary(nCharacterIndex, nDelta); + if (nCharacterIndex < 0) + { + // Go to previous or next paragraph. + nParagraphIndex += nDelta; + if (nParagraphIndex < 0) + { + nParagraphIndex = 0; + nCharacterIndex = 0; + nRemainingDistance = 0; + } + else if (o3tl::make_unsigned(nParagraphIndex) >= maParagraphs.size()) + { + nParagraphIndex = maParagraphs.size()-1; + pParagraph = GetParagraph(nParagraphIndex); + if (pParagraph) + nCharacterIndex = pParagraph->GetCharacterCount(); + nRemainingDistance = 0; + } + else + { + nRemainingDistance -= nDelta; + + // Move caret one character to the end of + // the previous or the start of the next paragraph. + pParagraph = GetParagraph(nParagraphIndex); + if (pParagraph) + { + if (nDistance<0) + nCharacterIndex = pParagraph->GetCharacterCount(); + else + nCharacterIndex = 0; + } + } + } + else + nRemainingDistance -= nDelta; + } + else + break; + } + break; + } + } + + // Move the caret to the new position. + mpCaret->SetPosition(nParagraphIndex, nCharacterIndex); +} + +void PresenterTextView::Paint ( + const css::awt::Rectangle& rUpdateBox) +{ + if ( ! mxCanvas.is()) + return; + if ( ! mpFont->PrepareFont(mxCanvas)) + return; + + if (mbIsFormatPending) + Format(); + + // Setup the clipping rectangle. Horizontally we make it a little + // larger to allow characters (and the caret) to stick out of their + // bounding boxes. This can happen on some characters (like the + // uppercase J) for typographical reasons. + const sal_Int32 nAdditionalLeftBorder (10); + const sal_Int32 nAdditionalRightBorder (5); + double nX (maLocation.X - mnLeftOffset); + double nY (maLocation.Y - mnTopOffset); + const sal_Int32 nClipLeft (::std::max( + PresenterGeometryHelper::Round(maLocation.X)-nAdditionalLeftBorder, rUpdateBox.X)); + const sal_Int32 nClipTop (::std::max( + PresenterGeometryHelper::Round(maLocation.Y), rUpdateBox.Y)); + const sal_Int32 nClipRight (::std::min( + PresenterGeometryHelper::Round(maLocation.X+maSize.Width)+nAdditionalRightBorder, rUpdateBox.X+rUpdateBox.Width)); + const sal_Int32 nClipBottom (::std::min( + PresenterGeometryHelper::Round(maLocation.Y+maSize.Height), rUpdateBox.Y+rUpdateBox.Height)); + if (nClipLeft>=nClipRight || nClipTop>=nClipBottom) + return; + + const awt::Rectangle aClipBox( + nClipLeft, + nClipTop, + nClipRight - nClipLeft, + nClipBottom - nClipTop); + Reference xClipPolygon ( + PresenterGeometryHelper::CreatePolygon(aClipBox, mxCanvas->getDevice())); + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + xClipPolygon); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,nX, 0,1,nY), + nullptr, + Sequence(4), + rendering::CompositeOperation::SOURCE); + PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor); + + for (const auto& rxParagraph : maParagraphs) + { + rxParagraph->Paint( + mxCanvas, + maSize, + mpFont, + aViewState, + aRenderState, + mnTopOffset, + nClipTop, + nClipBottom); + } + + aRenderState.AffineTransform.m02 = 0; + aRenderState.AffineTransform.m12 = 0; + +#ifdef SHOW_CHARACTER_BOXES + PresenterCanvasHelper::SetDeviceColor(aRenderState, 0x00808080); + for (sal_Int32 nParagraphIndex(0), nParagraphCount(GetParagraphCount()); + nParagraphIndexGetCharacterCount()); + nCharacterIndexGetCharacterBounds(nCharacterIndex, false)); + mxCanvas->drawPolyPolygon ( + PresenterGeometryHelper::CreatePolygon( + aBox, + mxCanvas->getDevice()), + aViewState, + aRenderState); + } + } + PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor); +#endif + + if (mpCaret && mpCaret->IsVisible()) + { + mxCanvas->fillPolyPolygon ( + PresenterGeometryHelper::CreatePolygon( + mpCaret->GetBounds(), + mxCanvas->getDevice()), + aViewState, + aRenderState); + } +} + +const SharedPresenterTextCaret& PresenterTextView::GetCaret() const +{ + return mpCaret; +} + +awt::Rectangle PresenterTextView::GetCaretBounds ( + sal_Int32 nParagraphIndex, + const sal_Int32 nCharacterIndex) const +{ + SharedPresenterTextParagraph pParagraph (GetParagraph(nParagraphIndex)); + + if (pParagraph) + return pParagraph->GetCharacterBounds(nCharacterIndex, true); + else + return awt::Rectangle(0,0,0,0); +} + +//----- private --------------------------------------------------------------- + +void PresenterTextView::RequestFormat() +{ + mbIsFormatPending = true; +} + +void PresenterTextView::Format() +{ + mbIsFormatPending = false; + + double nY (0); + for (const auto& rxParagraph : maParagraphs) + { + rxParagraph->Format(nY, maSize.Width, mpFont); + nY += rxParagraph->GetTotalTextHeight(); + } + + if (maTextChangeBroadcaster) + maTextChangeBroadcaster(); +} + +sal_Int32 PresenterTextView::GetParagraphCount() const +{ + return maParagraphs.size(); +} + +SharedPresenterTextParagraph PresenterTextView::GetParagraph ( + const sal_Int32 nParagraphIndex) const +{ + if (nParagraphIndex < 0) + return SharedPresenterTextParagraph(); + else if (o3tl::make_unsigned(nParagraphIndex)>=maParagraphs.size()) + return SharedPresenterTextParagraph(); + else + return maParagraphs[nParagraphIndex]; +} + +//===== PresenterTextParagraph ================================================ + +PresenterTextParagraph::PresenterTextParagraph ( + const sal_Int32 nParagraphIndex, + const Reference& rxBreakIterator, + const Reference& rxScriptTypeDetector, + const Reference& rxTextRange, + SharedPresenterTextCaret xCaret) + : mnParagraphIndex(nParagraphIndex), + mpCaret(std::move(xCaret)), + mxBreakIterator(rxBreakIterator), + mxScriptTypeDetector(rxScriptTypeDetector), + mnVerticalOffset(0), + mnXOrigin(0), + mnYOrigin(0), + mnWidth(0), + mnAscent(0), + mnDescent(0), + mnLineHeight(-1), + mnWritingMode (text::WritingMode2::LR_TB), + mnCharacterOffset(0) +{ + if (!rxTextRange.is()) + return; + + Reference xProperties (rxTextRange, UNO_QUERY); + try + { + xProperties->getPropertyValue("WritingMode") >>= mnWritingMode; + } + catch(beans::UnknownPropertyException&) + { + // Ignore the exception. Use the default value. + } + + msParagraphText = rxTextRange->getString(); +} + +void PresenterTextParagraph::Paint ( + const Reference& rxCanvas, + const geometry::RealSize2D& rSize, + const PresenterTheme::SharedFontDescriptor& rpFont, + const rendering::ViewState& rViewState, + rendering::RenderState& rRenderState, + const double nTopOffset, + const double nClipTop, + const double nClipBottom) +{ + if (mnLineHeight <= 0) + return; + + sal_Int8 nTextDirection (GetTextDirection()); + + const double nSavedM12 (rRenderState.AffineTransform.m12); + + if ( ! IsTextReferencePointLeft()) + rRenderState.AffineTransform.m02 += rSize.Width; + +#ifdef SHOW_CHARACTER_BOXES + for (sal_Int32 nIndex=0,nCount=maLines.size(); + nIndex nClipBottom) + break; + rLine.ProvideLayoutedLine(msParagraphText, rpFont, nTextDirection); + + rRenderState.AffineTransform.m12 = nSavedM12 + rLine.mnBaseLine; + + rxCanvas->drawTextLayout ( + rLine.mxLayoutedLine, + rViewState, + rRenderState); + } + rRenderState.AffineTransform.m12 = nSavedM12; + + if ( ! IsTextReferencePointLeft()) + rRenderState.AffineTransform.m02 -= rSize.Width; +} + +void PresenterTextParagraph::Format ( + const double nY, + const double nWidth, + const PresenterTheme::SharedFontDescriptor& rpFont) +{ + // Make sure that the text view is in a valid and sane state. + if ( ! mxBreakIterator.is() || ! mxScriptTypeDetector.is()) + return; + if (nWidth<=0) + return; + if ( ! rpFont || ! rpFont->mxFont.is()) + return; + + sal_Int32 nPosition (0); + + mnWidth = nWidth; + maLines.clear(); + mnLineHeight = 0; + mnAscent = 0; + mnDescent = 0; + mnVerticalOffset = nY; + maWordBoundaries.clear(); + maWordBoundaries.push_back(0); + + const rendering::FontMetrics aMetrics (rpFont->mxFont->getFontMetrics()); + mnAscent = aMetrics.Ascent; + mnDescent = aMetrics.Descent; + mnLineHeight = aMetrics.Ascent + aMetrics.Descent + aMetrics.ExternalLeading; + nPosition = 0; + i18n::Boundary aCurrentLine(0,0); + while (true) + { + const i18n::Boundary aWordBoundary = mxBreakIterator->nextWord( + msParagraphText, + nPosition, + lang::Locale(), + i18n::WordType::ANYWORD_IGNOREWHITESPACES); + AddWord(nWidth, aCurrentLine, aWordBoundary.startPos, rpFont); + + // Remember the new word boundary for caret travelling by words. + // Prevent duplicates. + if (aWordBoundary.startPos > maWordBoundaries.back()) + maWordBoundaries.push_back(aWordBoundary.startPos); + + if (aWordBoundary.endPos>aWordBoundary.startPos) + AddWord(nWidth, aCurrentLine, aWordBoundary.endPos, rpFont); + + if (aWordBoundary.startPos<0 || aWordBoundary.endPos<0) + break; + if (nPosition >= aWordBoundary.endPos) + break; + nPosition = aWordBoundary.endPos; + } + + if (aCurrentLine.endPos>aCurrentLine.startPos) + AddLine(aCurrentLine); + +} + +sal_Int32 PresenterTextParagraph::GetWordBoundary( + const sal_Int32 nLocalCharacterIndex, + const sal_Int32 nDistance) +{ + OSL_ASSERT(nDistance==-1 || nDistance==+1); + + if (nLocalCharacterIndex < 0) + { + // The caller asked for the start or end position of the paragraph. + if (nDistance < 0) + return 0; + else + return GetCharacterCount(); + } + + sal_Int32 nIndex (0); + for (sal_Int32 nCount (maWordBoundaries.size()); nIndex= nLocalCharacterIndex) + { + // When inside the word (not at its start or end) then + // first move to the start or end before going the previous or + // next word. + if (maWordBoundaries[nIndex] > nLocalCharacterIndex) + if (nDistance > 0) + --nIndex; + break; + } + } + + nIndex += nDistance; + + if (nIndex < 0) + return -1; + else if (o3tl::make_unsigned(nIndex)>=maWordBoundaries.size()) + return -1; + else + return maWordBoundaries[nIndex]; +} + +sal_Int32 PresenterTextParagraph::GetCaretPosition() const +{ + if (mpCaret && mpCaret->GetParagraphIndex()==mnParagraphIndex) + return mpCaret->GetCharacterIndex(); + else + return -1; +} + +void PresenterTextParagraph::SetCaretPosition (const sal_Int32 nPosition) const +{ + if (mpCaret && mpCaret->GetParagraphIndex()==mnParagraphIndex) + return mpCaret->SetPosition(mnParagraphIndex, nPosition); +} + +void PresenterTextParagraph::SetOrigin (const double nXOrigin, const double nYOrigin) +{ + mnXOrigin = nXOrigin; + mnYOrigin = nYOrigin; +} + +awt::Point PresenterTextParagraph::GetRelativeLocation() const +{ + return awt::Point( + sal_Int32(mnXOrigin), + sal_Int32(mnYOrigin + mnVerticalOffset)); +} + +awt::Size PresenterTextParagraph::GetSize() const +{ + return awt::Size( + sal_Int32(mnWidth), + sal_Int32(GetTotalTextHeight())); +} + +void PresenterTextParagraph::AddWord ( + const double nWidth, + i18n::Boundary& rCurrentLine, + const sal_Int32 nWordBoundary, + const PresenterTheme::SharedFontDescriptor& rpFont) +{ + sal_Int32 nLineStart (0); + if ( ! maLines.empty()) + nLineStart = rCurrentLine.startPos; + + const OUString sLineCandidate ( + msParagraphText.copy(nLineStart, nWordBoundary-nLineStart)); + + css::geometry::RealRectangle2D aLineBox ( + PresenterCanvasHelper::GetTextBoundingBox ( + rpFont->mxFont, + sLineCandidate, + mnWritingMode)); + const double nLineWidth (aLineBox.X2 - aLineBox.X1); + + if (nLineWidth >= nWidth) + { + // Add new line with a single word (so far). + AddLine(rCurrentLine); + } + rCurrentLine.endPos = nWordBoundary; +} + +void PresenterTextParagraph::AddLine ( + i18n::Boundary& rCurrentLine) +{ + Line aLine (rCurrentLine.startPos, rCurrentLine.endPos); + + // Find the start and end of the line with respect to cells. + if (!maLines.empty()) + { + aLine.mnLineStartCellIndex = maLines.back().mnLineEndCellIndex; + aLine.mnBaseLine = maLines.back().mnBaseLine + mnLineHeight; + } + else + { + aLine.mnLineStartCellIndex = 0; + aLine.mnBaseLine = mnVerticalOffset + mnAscent; + } + sal_Int32 nCellIndex (aLine.mnLineStartCellIndex); + double nWidth (0); + for ( ; nCellIndex aLine.mnLineEndCharacterIndex) + break; + nWidth += rCell.mnCellWidth; + } + aLine.mnLineEndCellIndex = nCellIndex; + aLine.mnWidth = nWidth; + + maLines.push_back(aLine); + + rCurrentLine.startPos = rCurrentLine.endPos; +} + +double PresenterTextParagraph::GetTotalTextHeight() const +{ + return maLines.size() * mnLineHeight; +} + +void PresenterTextParagraph::SetCharacterOffset (const sal_Int32 nCharacterOffset) +{ + mnCharacterOffset = nCharacterOffset; +} + +sal_Int32 PresenterTextParagraph::GetCharacterCount() const +{ + return msParagraphText.getLength(); +} + +sal_Unicode PresenterTextParagraph::GetCharacter ( + const sal_Int32 nGlobalCharacterIndex) const +{ + if (nGlobalCharacterIndex=mnCharacterOffset+msParagraphText.getLength()) + { + return sal_Unicode(); + } + else + { + return msParagraphText[nGlobalCharacterIndex - mnCharacterOffset]; + } +} + +const OUString& PresenterTextParagraph::GetText() const +{ + return msParagraphText; +} + +TextSegment PresenterTextParagraph::GetTextSegment ( + const sal_Int32 nOffset, + const sal_Int32 nIndex, + const sal_Int16 nTextType) const +{ + switch(nTextType) + { + case AccessibleTextType::PARAGRAPH: + return TextSegment( + msParagraphText, + mnCharacterOffset, + mnCharacterOffset+msParagraphText.getLength()); + + case AccessibleTextType::SENTENCE: + if (mxBreakIterator.is()) + { + const sal_Int32 nStart (mxBreakIterator->beginOfSentence( + msParagraphText, nIndex-mnCharacterOffset, lang::Locale())); + const sal_Int32 nEnd (mxBreakIterator->endOfSentence( + msParagraphText, nIndex-mnCharacterOffset, lang::Locale())); + if (nStart < nEnd) + return TextSegment( + msParagraphText.copy(nStart, nEnd-nStart), + nStart+mnCharacterOffset, + nEnd+mnCharacterOffset); + } + break; + + case AccessibleTextType::WORD: + if (mxBreakIterator.is()) + return GetWordTextSegment(nOffset, nIndex); + break; + + case AccessibleTextType::LINE: + { + auto iLine = std::find_if(maLines.begin(), maLines.end(), + [nIndex](const Line& rLine) { return nIndex < rLine.mnLineEndCharacterIndex; }); + if (iLine != maLines.end()) + { + return TextSegment( + msParagraphText.copy( + iLine->mnLineStartCharacterIndex, + iLine->mnLineEndCharacterIndex - iLine->mnLineStartCharacterIndex), + iLine->mnLineStartCharacterIndex, + iLine->mnLineEndCharacterIndex); + } + } + break; + + // Handle GLYPH and ATTRIBUTE_RUN like CHARACTER because we can not + // do better at the moment. + case AccessibleTextType::CHARACTER: + case AccessibleTextType::GLYPH: + case AccessibleTextType::ATTRIBUTE_RUN: + return CreateTextSegment(nIndex+nOffset, nIndex+nOffset+1); + } + + return TextSegment(OUString(), 0,0); +} + +TextSegment PresenterTextParagraph::GetWordTextSegment ( + const sal_Int32 nOffset, + const sal_Int32 nIndex) const +{ + sal_Int32 nCurrentOffset (nOffset); + sal_Int32 nCurrentIndex (nIndex); + + i18n::Boundary aWordBoundary; + if (nCurrentOffset == 0) + aWordBoundary = mxBreakIterator->getWordBoundary( + msParagraphText, + nIndex, + lang::Locale(), + i18n::WordType::ANYWORD_IGNOREWHITESPACES, + true); + else if (nCurrentOffset < 0) + { + while (nCurrentOffset<0 && nCurrentIndex>0) + { + aWordBoundary = mxBreakIterator->previousWord( + msParagraphText, + nCurrentIndex, + lang::Locale(), + i18n::WordType::ANYWORD_IGNOREWHITESPACES); + nCurrentIndex = aWordBoundary.startPos; + ++nCurrentOffset; + } + } + else + { + while (nCurrentOffset>0 && nCurrentIndex<=GetCharacterCount()) + { + aWordBoundary = mxBreakIterator->nextWord( + msParagraphText, + nCurrentIndex, + lang::Locale(), + i18n::WordType::ANYWORD_IGNOREWHITESPACES); + nCurrentIndex = aWordBoundary.endPos; + --nCurrentOffset; + } + } + + return CreateTextSegment(aWordBoundary.startPos, aWordBoundary.endPos); +} + +TextSegment PresenterTextParagraph::CreateTextSegment ( + sal_Int32 nStartIndex, + sal_Int32 nEndIndex) const +{ + if (nEndIndex <= nStartIndex) + return TextSegment( + OUString(), + nStartIndex, + nEndIndex); + else + return TextSegment( + msParagraphText.copy(nStartIndex, nEndIndex-nStartIndex), + nStartIndex, + nEndIndex); +} + +awt::Rectangle PresenterTextParagraph::GetCharacterBounds ( + sal_Int32 nGlobalCharacterIndex, + const bool bCaretBox) +{ + // Find the line that contains the requested character and accumulate + // the previous line heights. + double nX (mnXOrigin); + double nY (mnYOrigin + mnVerticalOffset + mnAscent); + const sal_Int8 nTextDirection (GetTextDirection()); + for (sal_Int32 nLineIndex=0,nLineCount=maLines.size(); + nLineIndex= rLine.mnLineEndCharacterIndex) + // When in the last line then allow the index past the last char. + if (nLineIndex= rLine.maCellBoxes.getLength()) + nLeft = nRight-2; + if (nLeft < nX) + nLeft = nX; + nRight = nLeft+2; + } + else + { + nBottom = nTop + mnAscent + mnDescent; + } + const sal_Int32 nX1 = sal_Int32(floor(nLeft)); + const sal_Int32 nY1 = sal_Int32(floor(nTop)); + const sal_Int32 nX2 = sal_Int32(ceil(nRight)); + const sal_Int32 nY2 = sal_Int32(ceil(nBottom)); + + return awt::Rectangle(nX1,nY1,nX2-nX1+1,nY2-nY1+1); + } + + // We are still here. That means that the given index lies past the + // last character in the paragraph. + // Return an empty box that lies past the last character. Better than nothing. + return awt::Rectangle(sal_Int32(nX+0.5), sal_Int32(nY+0.5), 0, 0); +} + +sal_Int8 PresenterTextParagraph::GetTextDirection() const +{ + // Find first portion that has a non-neutral text direction. + sal_Int32 nPosition (0); + sal_Int32 nTextLength (msParagraphText.getLength()); + while (nPosition < nTextLength) + { + const sal_Int16 nScriptDirection ( + mxScriptTypeDetector->getScriptDirection( + msParagraphText, nPosition, i18n::ScriptDirection::NEUTRAL)); + switch (nScriptDirection) + { + case i18n::ScriptDirection::NEUTRAL: + // continue looping. + break; + case i18n::ScriptDirection::LEFT_TO_RIGHT: + return rendering::TextDirection::WEAK_LEFT_TO_RIGHT; + + case i18n::ScriptDirection::RIGHT_TO_LEFT: + return rendering::TextDirection::WEAK_RIGHT_TO_LEFT; + } + + nPosition = mxScriptTypeDetector->endOfScriptDirection( + msParagraphText, nPosition, nScriptDirection); + } + + // All text in paragraph is neutral. Fall back on writing mode taken + // from the XText (which may not be properly initialized.) + sal_Int8 nTextDirection(rendering::TextDirection::WEAK_LEFT_TO_RIGHT); + switch(mnWritingMode) + { + case text::WritingMode2::LR_TB: + nTextDirection = rendering::TextDirection::WEAK_LEFT_TO_RIGHT; + break; + + case text::WritingMode2::RL_TB: + nTextDirection = rendering::TextDirection::WEAK_RIGHT_TO_LEFT; + break; + + default: + case text::WritingMode2::TB_RL: + case text::WritingMode2::TB_LR: + // Can not handle this. Use default and hope for the best. + break; + } + return nTextDirection; +} + +bool PresenterTextParagraph::IsTextReferencePointLeft() const +{ + return mnWritingMode != text::WritingMode2::RL_TB; +} + +void PresenterTextParagraph::SetupCellArray ( + const PresenterTheme::SharedFontDescriptor& rpFont) +{ + maCells.clear(); + + if ( ! rpFont || ! rpFont->mxFont.is()) + return; + + sal_Int32 nPosition (0); + sal_Int32 nIndex (0); + const sal_Int32 nTextLength (msParagraphText.getLength()); + const sal_Int8 nTextDirection (GetTextDirection()); + while (nPosition < nTextLength) + { + const sal_Int32 nNewPosition (mxBreakIterator->nextCharacters( + msParagraphText, + nPosition, + lang::Locale(), + i18n::CharacterIteratorMode::SKIPCELL, + 1, + nIndex)); + + rendering::StringContext aContext (msParagraphText, nPosition, nNewPosition-nPosition); + Reference xLayout ( + rpFont->mxFont->createTextLayout(aContext, nTextDirection, 0)); + css::geometry::RealRectangle2D aCharacterBox (xLayout->queryTextBounds()); + + maCells.emplace_back( + nPosition, + nNewPosition-nPosition, + aCharacterBox.X2-aCharacterBox.X1); + + nPosition = nNewPosition; + } +} + +//===== PresenterTextCaret ================================================---- + +PresenterTextCaret::PresenterTextCaret ( + uno::Reference const& xContext, + ::std::function aCharacterBoundsAccess, + ::std::function aInvalidator) + : m_xContext(xContext) + , mnParagraphIndex(-1), + mnCharacterIndex(-1), + mnCaretBlinkTaskId(0), + mbIsCaretVisible(false), + maCharacterBoundsAccess(std::move(aCharacterBoundsAccess)), + maInvalidator(std::move(aInvalidator)) +{ +} + +PresenterTextCaret::~PresenterTextCaret() +{ + try + { + HideCaret(); + } + catch (uno::Exception const&) + { + TOOLS_WARN_EXCEPTION("sdext.presenter", "unexpected exception in ~PresenterTextCaret"); + } +} + +void PresenterTextCaret::ShowCaret() +{ + if (mnCaretBlinkTaskId == 0) + { + mnCaretBlinkTaskId = PresenterTimer::ScheduleRepeatedTask ( + m_xContext, + [this] (TimeValue const&) { return this->InvertCaret(); }, + CaretBlinkInterval, + CaretBlinkInterval); + } + mbIsCaretVisible = true; +} + +void PresenterTextCaret::HideCaret() +{ + if (mnCaretBlinkTaskId != 0) + { + PresenterTimer::CancelTask(mnCaretBlinkTaskId); + mnCaretBlinkTaskId = 0; + } + mbIsCaretVisible = false; + // Reset the caret position. + mnParagraphIndex = -1; + mnCharacterIndex = -1; +} + + +void PresenterTextCaret::SetPosition ( + const sal_Int32 nParagraphIndex, + const sal_Int32 nCharacterIndex) +{ + if (mnParagraphIndex == nParagraphIndex + && mnCharacterIndex == nCharacterIndex) + return; + + if (mnParagraphIndex >= 0) + maInvalidator(maCaretBounds); + + const sal_Int32 nOldParagraphIndex (mnParagraphIndex); + const sal_Int32 nOldCharacterIndex (mnCharacterIndex); + mnParagraphIndex = nParagraphIndex; + mnCharacterIndex = nCharacterIndex; + maCaretBounds = maCharacterBoundsAccess(mnParagraphIndex, mnCharacterIndex); + if (mnParagraphIndex >= 0) + ShowCaret(); + else + HideCaret(); + + if (mnParagraphIndex >= 0) + maInvalidator(maCaretBounds); + + if (maBroadcaster) + maBroadcaster( + nOldParagraphIndex, + nOldCharacterIndex, + mnParagraphIndex, + mnCharacterIndex); +} + + +void PresenterTextCaret::SetCaretMotionBroadcaster ( + const ::std::function& rBroadcaster) +{ + maBroadcaster = rBroadcaster; +} + +const css::awt::Rectangle& PresenterTextCaret::GetBounds() const +{ + return maCaretBounds; +} + +void PresenterTextCaret::InvertCaret() +{ + mbIsCaretVisible = !mbIsCaretVisible; + if (mnParagraphIndex >= 0) + maInvalidator(maCaretBounds); +} + +//===== PresenterTextParagraph::Cell ========================================== + +PresenterTextParagraph::Cell::Cell ( + const sal_Int32 nCharacterIndex, + const sal_Int32 nCharacterCount, + const double nCellWidth) + : mnCharacterIndex(nCharacterIndex), + mnCharacterCount(nCharacterCount), + mnCellWidth(nCellWidth) +{ +} + +//===== PresenterTextParagraph::Line ========================================== + +PresenterTextParagraph::Line::Line ( + const sal_Int32 nLineStartCharacterIndex, + const sal_Int32 nLineEndCharacterIndex) + : mnLineStartCharacterIndex(nLineStartCharacterIndex), + mnLineEndCharacterIndex(nLineEndCharacterIndex), + mnLineStartCellIndex(-1), mnLineEndCellIndex(-1), + mnBaseLine(0), mnWidth(0) +{ +} + +void PresenterTextParagraph::Line::ProvideCellBoxes() +{ + if ( mnLineStartCharacterIndex < mnLineEndCharacterIndex && !maCellBoxes.hasElements() ) + { + if (mxLayoutedLine.is()) + maCellBoxes = mxLayoutedLine->queryInkMeasures(); + else + { + OSL_ASSERT(mxLayoutedLine.is()); + } + } +} + +void PresenterTextParagraph::Line::ProvideLayoutedLine ( + const OUString& rsParagraphText, + const PresenterTheme::SharedFontDescriptor& rpFont, + const sal_Int8 nTextDirection) +{ + if ( ! mxLayoutedLine.is()) + { + const rendering::StringContext aContext ( + rsParagraphText, + mnLineStartCharacterIndex, + mnLineEndCharacterIndex - mnLineStartCharacterIndex); + + mxLayoutedLine = rpFont->mxFont->createTextLayout( + aContext, + nTextDirection, + 0); + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterTextView.hxx b/sd/source/console/PresenterTextView.hxx new file mode 100644 index 0000000000..6dd2da3b23 --- /dev/null +++ b/sd/source/console/PresenterTextView.hxx @@ -0,0 +1,279 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTEXTVIEW_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTEXTVIEW_HXX + +#include "PresenterTheme.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sdext::presenter { + +class PresenterTextCaret +{ +public: + PresenterTextCaret ( + css::uno::Reference const& xContext, + ::std::function + aCharacterBoundsAccess, + ::std::function + aInvalidator); + ~PresenterTextCaret(); + + void ShowCaret(); + void HideCaret(); + + sal_Int32 GetParagraphIndex() const { return mnParagraphIndex;} + sal_Int32 GetCharacterIndex() const { return mnCharacterIndex;} + void SetPosition ( + const sal_Int32 nParagraphIndex, + const sal_Int32 nCharacterIndex); + + bool IsVisible() const { return mbIsCaretVisible;} + + /** Set a (possibly empty) functor that broadcasts changes of the caret + position. This is used when a PresenterTextView object is set at + the accessibility object so that accessibility events can be sent + when the caret changes position. + */ + void SetCaretMotionBroadcaster ( + const ::std::function& rBroadcaster); + + const css::awt::Rectangle& GetBounds() const; + +private: + css::uno::Reference const& m_xContext; + sal_Int32 mnParagraphIndex; + sal_Int32 mnCharacterIndex; + sal_Int32 mnCaretBlinkTaskId; + bool mbIsCaretVisible; + const ::std::function maCharacterBoundsAccess; + const ::std::function maInvalidator; + ::std::function maBroadcaster; + css::awt::Rectangle maCaretBounds; + + void InvertCaret(); +}; +typedef std::shared_ptr SharedPresenterTextCaret; + +//===== PresenterTextParagraph ================================================ + +class PresenterTextParagraph +{ +public: + PresenterTextParagraph ( + const sal_Int32 nParagraphIndex, + const css::uno::Reference& rxBreakIterator, + const css::uno::Reference& rxScriptTypeDetector, + const css::uno::Reference& rxTextRange, + SharedPresenterTextCaret xCaret); + + void Paint ( + const css::uno::Reference& rxCanvas, + const css::geometry::RealSize2D& rSize, + const PresenterTheme::SharedFontDescriptor& rpFont, + const css::rendering::ViewState& rViewState, + css::rendering::RenderState& rRenderState, + const double nTopOffset, + const double nClipTop, + const double nClipBottom); + + double GetTotalTextHeight() const; + + void SetCharacterOffset (const sal_Int32 nCharacterOffset); + sal_Int32 GetCharacterCount() const; + sal_Unicode GetCharacter (const sal_Int32 nGlobalCharacterIndex) const; + const OUString& GetText() const; + css::accessibility::TextSegment GetTextSegment ( + const sal_Int32 nOffset, + const sal_Int32 nGlobalCharacterIndex, + const sal_Int16 nTextType) const; + css::accessibility::TextSegment GetWordTextSegment ( + const sal_Int32 nOffset, + const sal_Int32 nIndex) const; + css::accessibility::TextSegment CreateTextSegment ( + sal_Int32 nStartIndex, + sal_Int32 nEndIndex) const; + css::awt::Rectangle GetCharacterBounds ( + sal_Int32 nGlobalCharacterIndex, + const bool bCaretBox); + void SetupCellArray ( + const PresenterTheme::SharedFontDescriptor& rpFont); + void Format ( + const double nY, + const double nWidth, + const PresenterTheme::SharedFontDescriptor& rpFont); + sal_Int32 GetWordBoundary( + const sal_Int32 nLocalCharacterIndex, + const sal_Int32 nDistance); + sal_Int32 GetCaretPosition() const; + void SetCaretPosition (const sal_Int32 nPosition) const; + void SetOrigin (const double nXOrigin, const double nYOrigin); + css::awt::Point GetRelativeLocation() const; + css::awt::Size GetSize() const; + +private: + OUString msParagraphText; + const sal_Int32 mnParagraphIndex; + SharedPresenterTextCaret mpCaret; + + /** A portion of a string that encodes one unicode cell. It describes + number of characters in the unicode string that make up the cell and its + width in pixel (with respect to some configuration that is stored + externally or implicitly). + */ + class Cell + { + public: + Cell (const sal_Int32 nCharacterIndex, const sal_Int32 nCharacterCount, const double nCellWidth); + sal_Int32 mnCharacterIndex; + sal_Int32 mnCharacterCount; + double mnCellWidth; + }; + + class Line + { + public: + Line (const sal_Int32 nLineStartCharacterIndex, const sal_Int32 nLineEndCharacterIndex); + sal_Int32 mnLineStartCharacterIndex; + sal_Int32 mnLineEndCharacterIndex; + sal_Int32 mnLineStartCellIndex; + sal_Int32 mnLineEndCellIndex; + css::uno::Reference mxLayoutedLine; + double mnBaseLine; + double mnWidth; + css::uno::Sequence maCellBoxes; + + void ProvideLayoutedLine ( + const OUString& rsParagraphText, + const PresenterTheme::SharedFontDescriptor& rpFont, + const sal_Int8 nTextDirection); + void ProvideCellBoxes(); + }; + + css::uno::Reference mxBreakIterator; + css::uno::Reference mxScriptTypeDetector; + ::std::vector maLines; + ::std::vector maWordBoundaries; + // Offset of the top of the paragraph with respect to the origin of the + // whole text (specified by mnXOrigin and mnYOrigin). + double mnVerticalOffset; + double mnXOrigin; + double mnYOrigin; + double mnWidth; + double mnAscent; + double mnDescent; + double mnLineHeight; + sal_Int8 mnWritingMode; + /// The index of the first character in this paragraph with respect to + /// the whole text. + sal_Int32 mnCharacterOffset; + ::std::vector maCells; + + void AddWord ( + const double nWidth, + css::i18n::Boundary& rCurrentLine, + const sal_Int32 nWordBoundary, + const PresenterTheme::SharedFontDescriptor& rpFont); + void AddLine ( + css::i18n::Boundary& rCurrentLine); + sal_Int8 GetTextDirection() const; + bool IsTextReferencePointLeft() const; +}; +typedef std::shared_ptr SharedPresenterTextParagraph; + +/** A simple text view that paints text onto a given canvas. +*/ +class PresenterTextView +{ +public: + + PresenterTextView ( + const css::uno::Reference& rxContext, + const css::uno::Reference& rxCanvas, + const ::std::function& rInvalidator); + void SetText (const css::uno::Reference& rxText); + void SetTextChangeBroadcaster(const ::std::function& rBroadcaster); + + void SetLocation (const css::geometry::RealPoint2D& rLocation); + void SetSize (const css::geometry::RealSize2D& rSize); + double GetTotalTextHeight(); + + void SetFont (const PresenterTheme::SharedFontDescriptor& rpFont); + + void SetOffset ( + const double nLeft, + const double nTop); + + /** Move the caret forward or backward by character or by word. + @param nDistance + Should be either -1 or +1 to move caret backwards or forwards, + respectively. + @param nTextType + Valid values are the + css::accessibility::AccessibleTextType constants. + */ + void MoveCaret ( + const sal_Int32 nDistance, + const sal_Int16 nTextType); + + void Paint (const css::awt::Rectangle& rUpdateBox); + + const SharedPresenterTextCaret& GetCaret() const; + + sal_Int32 GetParagraphCount() const; + SharedPresenterTextParagraph GetParagraph (const sal_Int32 nParagraphIndex) const; + +private: + css::uno::Reference mxCanvas; + css::uno::Reference mxBreakIterator; + css::uno::Reference mxScriptTypeDetector; + css::geometry::RealPoint2D maLocation; + css::geometry::RealSize2D maSize; + PresenterTheme::SharedFontDescriptor mpFont; + ::std::vector maParagraphs; + SharedPresenterTextCaret mpCaret; + double mnLeftOffset; + double mnTopOffset; + bool mbIsFormatPending; + ::std::function maTextChangeBroadcaster; + + void RequestFormat(); + void Format(); + css::awt::Rectangle GetCaretBounds ( + const sal_Int32 nParagraphIndex, + const sal_Int32 nCharacterIndex) const; +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterTheme.cxx b/sd/source/console/PresenterTheme.cxx new file mode 100644 index 0000000000..4ea59a5fa8 --- /dev/null +++ b/sd/source/console/PresenterTheme.cxx @@ -0,0 +1,1060 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterTheme.hxx" +#include "PresenterBitmapContainer.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterConfigurationAccess.hxx" +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +namespace { + +class BorderSize +{ +public: + const static sal_Int32 mnInvalidValue = -10000; + + BorderSize() : mnLeft(mnInvalidValue), + mnTop(mnInvalidValue), + mnRight(mnInvalidValue), + mnBottom(mnInvalidValue) {} + + sal_Int32 mnLeft; + sal_Int32 mnTop; + sal_Int32 mnRight; + sal_Int32 mnBottom; + + std::vector ToVector() + { + return + { + mnLeft == mnInvalidValue ? 0 : mnLeft, + mnTop == mnInvalidValue ? 0 : mnTop, + mnRight == mnInvalidValue ? 0 : mnRight, + mnBottom == mnInvalidValue ? 0 : mnBottom + }; + }; + + void Merge (const BorderSize& rBorderSize) + { + if (mnLeft == mnInvalidValue) + mnLeft = rBorderSize.mnLeft; + if (mnTop == mnInvalidValue) + mnTop = rBorderSize.mnTop; + if (mnRight == mnInvalidValue) + mnRight = rBorderSize.mnRight; + if (mnBottom == mnInvalidValue) + mnBottom = rBorderSize.mnBottom; + } +}; + +/** Reading a theme from the configurations is done in various classes. The + ReadContext gives access to frequently used objects and functions to make + the configuration handling easier. +*/ +class ReadContext +{ +public: + Reference mxComponentContext; + Reference mxCanvas; + Reference mxPresenterHelper; + + ReadContext ( + const Reference& rxContext, + const Reference& rxCanvas); + + /** Read data describing a font from the node that can be reached from + the given root via the given path. + @param rsFontPath + May be empty. + */ + static PresenterTheme::SharedFontDescriptor ReadFont ( + const css::uno::Reference& rxTheme, + const PresenterTheme::SharedFontDescriptor& rpDefault); + static PresenterTheme::SharedFontDescriptor ReadFont ( + const Reference& rxFontProperties, + const PresenterTheme::SharedFontDescriptor& rpDefault); + + std::shared_ptr ReadTheme ( + PresenterConfigurationAccess& rConfiguration, + const OUString& rsThemeName); + + static BorderSize ReadBorderSize (const Reference& rxNode); + +private: + static Any GetByName ( + const Reference& rxNode, + const OUString& rsName); +}; + +/** A PaneStyle describes how a pane is rendered. +*/ +class PaneStyle +{ +public: + PaneStyle(); + + SharedBitmapDescriptor GetBitmap (const OUString& sBitmapName) const; + + OUString msStyleName; + std::shared_ptr mpParentStyle; + PresenterTheme::SharedFontDescriptor mpFont; + BorderSize maInnerBorderSize; + BorderSize maOuterBorderSize; + std::shared_ptr mpBitmaps; + + PresenterTheme::SharedFontDescriptor GetFont() const; +}; + +typedef std::shared_ptr SharedPaneStyle; + +class PaneStyleContainer +{ +private: + ::std::vector mStyles; + +public: + void Read ( + const ReadContext& rReadContext, + const Reference& rThemeRoot); + + SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const; + +private: + void ProcessPaneStyle ( + ReadContext const & rReadContext, + const ::std::vector& rValues); +}; + +/** A ViewStyle describes how a view is displayed. +*/ +class ViewStyle +{ +public: + ViewStyle(); + + SharedBitmapDescriptor GetBitmap (std::u16string_view sBitmapName) const; + + PresenterTheme::SharedFontDescriptor GetFont() const; + + OUString msStyleName; + std::shared_ptr mpParentStyle; + PresenterTheme::SharedFontDescriptor mpFont; + SharedBitmapDescriptor mpBackground; +}; + +typedef std::shared_ptr SharedViewStyle; + +class ViewStyleContainer +{ +private: + ::std::vector mStyles; + +public: + void Read ( + const ReadContext& rReadContext, + const Reference& rThemeRoot); + + SharedViewStyle GetViewStyle (const OUString& rsStyleName) const; + +private: + void ProcessViewStyle( + ReadContext const & rReadContext, + const Reference& rxProperties); +}; + +class StyleAssociationContainer +{ +public: + void Read ( + const Reference& rThemeRoot); + + OUString GetStyleName (const OUString& rsResourceName) const; + +private: + typedef std::map StyleAssociations; + StyleAssociations maStyleAssociations; + + void ProcessStyleAssociation( + const ::std::vector& rValues); +}; + +} // end of anonymous namespace + +class PresenterTheme::Theme +{ +public: + Theme ( + const Reference& rThemeRoot, + OUString sNodeName); + + void Read ( + PresenterConfigurationAccess& rConfiguration, + ReadContext& rReadContext); + + OUString msConfigurationNodeName; + std::shared_ptr mpParentTheme; + SharedBitmapDescriptor mpBackground; + PaneStyleContainer maPaneStyles; + ViewStyleContainer maViewStyles; + StyleAssociationContainer maStyleAssociations; + Reference mxThemeRoot; + std::shared_ptr mpIconContainer; + typedef std::map FontContainer; + FontContainer maFontContainer; + + SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const; + SharedViewStyle GetViewStyle (const OUString& rsStyleName) const; + +private: + void ProcessFont( + const OUString& rsKey, + const Reference& rxProperties); +}; + +//===== PresenterTheme ======================================================== + +PresenterTheme::PresenterTheme ( + css::uno::Reference xContext, + css::uno::Reference xCanvas) + : mxContext(std::move(xContext)), + mxCanvas(std::move(xCanvas)) +{ + mpTheme = ReadTheme(); +} + +PresenterTheme::~PresenterTheme() +{ +} + +std::shared_ptr PresenterTheme::ReadTheme() +{ + ReadContext aReadContext(mxContext, mxCanvas); + + PresenterConfigurationAccess aConfiguration ( + mxContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + + return aReadContext.ReadTheme(aConfiguration, OUString()); +} + +bool PresenterTheme::HasCanvas() const +{ + return mxCanvas.is(); +} + +void PresenterTheme::ProvideCanvas (const Reference& rxCanvas) +{ + if ( ! mxCanvas.is() && rxCanvas.is()) + { + mxCanvas = rxCanvas; + ReadTheme(); + } +} + +OUString PresenterTheme::GetStyleName (const OUString& rsResourceURL) const +{ + OUString sStyleName; + std::shared_ptr pTheme (mpTheme); + while (sStyleName.isEmpty() && pTheme != nullptr) + { + sStyleName = pTheme->maStyleAssociations.GetStyleName(rsResourceURL); + pTheme = pTheme->mpParentTheme; + } + return sStyleName; +} + +::std::vector PresenterTheme::GetBorderSize ( + const OUString& rsStyleName, + const bool bOuter) const +{ + OSL_ASSERT(mpTheme != nullptr); + + SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName)); + if (pPaneStyle) + if (bOuter) + return pPaneStyle->maOuterBorderSize.ToVector(); + else + return pPaneStyle->maInnerBorderSize.ToVector(); + else + { + return ::std::vector(4,0); + } +} + +PresenterTheme::SharedFontDescriptor PresenterTheme::ReadFont ( + const Reference& rxNode, + const PresenterTheme::SharedFontDescriptor& rpDefault) +{ + return ReadContext::ReadFont(rxNode, rpDefault); +} + +bool PresenterTheme::ConvertToColor ( + const Any& rColorSequence, + sal_uInt32& rColor) +{ + Sequence aByteSequence; + if (rColorSequence >>= aByteSequence) + { + rColor = std::accumulate(std::cbegin(aByteSequence), std::cend(aByteSequence), sal_uInt32(0), + [](const sal_uInt32 nRes, const sal_uInt8 nByte) { return (nRes << 8) | nByte; }); + return true; + } + else + return false; +} + +std::shared_ptr PresenterTheme::GetNodeForViewStyle ( + const OUString& rsStyleName) const +{ + if (mpTheme == nullptr) + return std::shared_ptr(); + + // Open configuration for writing. + auto pConfiguration = std::make_shared( + mxContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_WRITE); + + // Get configuration node for the view style container of the current + // theme. + if (pConfiguration->GoToChild( OUString( + "Presenter/Themes/" + mpTheme->msConfigurationNodeName + "/ViewStyles"))) + { + pConfiguration->GoToChild( + [&rsStyleName] (OUString const&, uno::Reference const& xProps) + { + return PresenterConfigurationAccess::IsStringPropertyEqual( + rsStyleName, "StyleName", xProps); + }); + } + return pConfiguration; +} + +SharedBitmapDescriptor PresenterTheme::GetBitmap ( + const OUString& rsStyleName, + const OUString& rsBitmapName) const +{ + if (mpTheme != nullptr) + { + if (rsStyleName.isEmpty()) + { + if (rsBitmapName == "Background") + { + std::shared_ptr pTheme (mpTheme); + while (pTheme != nullptr && !pTheme->mpBackground) + pTheme = pTheme->mpParentTheme; + if (pTheme != nullptr) + return pTheme->mpBackground; + else + return SharedBitmapDescriptor(); + } + } + else + { + SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName)); + if (pPaneStyle) + { + SharedBitmapDescriptor pBitmap (pPaneStyle->GetBitmap(rsBitmapName)); + if (pBitmap) + return pBitmap; + } + + SharedViewStyle pViewStyle (mpTheme->GetViewStyle(rsStyleName)); + if (pViewStyle) + { + SharedBitmapDescriptor pBitmap (pViewStyle->GetBitmap(rsBitmapName)); + if (pBitmap) + return pBitmap; + } + } + } + + return SharedBitmapDescriptor(); +} + +SharedBitmapDescriptor PresenterTheme::GetBitmap ( + const OUString& rsBitmapName) const +{ + if (mpTheme != nullptr) + { + if (rsBitmapName == "Background") + { + std::shared_ptr pTheme (mpTheme); + while (pTheme != nullptr && !pTheme->mpBackground) + pTheme = pTheme->mpParentTheme; + if (pTheme != nullptr) + return pTheme->mpBackground; + else + return SharedBitmapDescriptor(); + } + else + { + if (mpTheme->mpIconContainer != nullptr) + return mpTheme->mpIconContainer->GetBitmap(rsBitmapName); + } + } + + return SharedBitmapDescriptor(); +} + +std::shared_ptr PresenterTheme::GetBitmapContainer() const +{ + if (mpTheme != nullptr) + return mpTheme->mpIconContainer; + else + return std::shared_ptr(); +} + +PresenterTheme::SharedFontDescriptor PresenterTheme::GetFont ( + const OUString& rsStyleName) const +{ + if (mpTheme != nullptr) + { + SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName)); + if (pPaneStyle) + return pPaneStyle->GetFont(); + + SharedViewStyle pViewStyle (mpTheme->GetViewStyle(rsStyleName)); + if (pViewStyle) + return pViewStyle->GetFont(); + + std::shared_ptr pTheme (mpTheme); + while (pTheme != nullptr) + { + Theme::FontContainer::const_iterator iFont (pTheme->maFontContainer.find(rsStyleName)); + if (iFont != pTheme->maFontContainer.end()) + return iFont->second; + + pTheme = pTheme->mpParentTheme; + } + } + + return SharedFontDescriptor(); +} + +//===== FontDescriptor ======================================================== + +PresenterTheme::FontDescriptor::FontDescriptor ( + const std::shared_ptr& rpDescriptor) + : mnSize(12), + mnColor(0x00000000), + msAnchor(OUString("Left")), + mnXOffset(0), + mnYOffset(0) +{ + if (rpDescriptor != nullptr) + { + msFamilyName = rpDescriptor->msFamilyName; + msStyleName = rpDescriptor->msStyleName; + mnSize = rpDescriptor->mnSize; + mnColor = rpDescriptor->mnColor; + msAnchor = rpDescriptor->msAnchor; + mnXOffset = rpDescriptor->mnXOffset; + mnYOffset = rpDescriptor->mnYOffset; + } +} + +bool PresenterTheme::FontDescriptor::PrepareFont ( + const Reference& rxCanvas) +{ + if (mxFont.is()) + return true; + + if ( ! rxCanvas.is()) + return false; + + const double nCellSize (GetCellSizeForDesignSize(rxCanvas, mnSize)); + mxFont = CreateFont(rxCanvas, nCellSize); + + return mxFont.is(); +} + +Reference PresenterTheme::FontDescriptor::CreateFont ( + const Reference& rxCanvas, + const double nCellSize) const +{ + rendering::FontRequest aFontRequest; + aFontRequest.FontDescription.FamilyName = msFamilyName; + if (msFamilyName.isEmpty()) + aFontRequest.FontDescription.FamilyName = "Tahoma"; + aFontRequest.FontDescription.StyleName = msStyleName; + aFontRequest.CellSize = nCellSize; + + // Make an attempt at translating the style name(s)into a corresponding + // font description. + if (msStyleName == "Bold") + aFontRequest.FontDescription.FontDescription.Weight = rendering::PanoseWeight::HEAVY; + + return rxCanvas->createFont( + aFontRequest, + Sequence(), + geometry::Matrix2D(1,0,0,1)); +} + +double PresenterTheme::FontDescriptor::GetCellSizeForDesignSize ( + const Reference& rxCanvas, + const double nDesignSize) const +{ + // Use the given design size as initial value in calculating the cell + // size. + double nCellSize (nDesignSize); + + if ( ! rxCanvas.is()) + { + // We need the canvas to do the conversion. Return the design size, + // it is the our best guess in this circumstance. + return nDesignSize; + } + + Reference xFont (CreateFont(rxCanvas, nCellSize)); + if ( ! xFont.is()) + return nDesignSize; + + geometry::RealRectangle2D aBox (PresenterCanvasHelper::GetTextBoundingBox (xFont, "X")); + + const double nAscent (-aBox.Y1); + //tdf#112408 + if (nAscent == 0) + return nDesignSize; + const double nDescent (aBox.Y2); + const double nScale = (nAscent+nDescent) / nAscent; + return nDesignSize * nScale; +} + +//===== Theme ================================================================= + +PresenterTheme::Theme::Theme ( + const Reference& rxThemeRoot, + OUString sNodeName) + : msConfigurationNodeName(std::move(sNodeName)), + maPaneStyles(), + maViewStyles(), + maStyleAssociations(), + mxThemeRoot(rxThemeRoot) +{ +} + +void PresenterTheme::Theme::Read ( + PresenterConfigurationAccess& rConfiguration, + ReadContext& rReadContext) +{ + // Parent theme name. + OUString sParentThemeName; + if ((PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, "ParentTheme") + >>= sParentThemeName) + && !sParentThemeName.isEmpty()) + { + mpParentTheme = rReadContext.ReadTheme(rConfiguration, sParentThemeName); + } + + // Background. + mpBackground = PresenterBitmapContainer::LoadBitmap( + mxThemeRoot, + "Background", + rReadContext.mxPresenterHelper, + rReadContext.mxCanvas, + SharedBitmapDescriptor()); + + // Style associations. + maStyleAssociations.Read(mxThemeRoot); + + // Pane styles. + maPaneStyles.Read(rReadContext, mxThemeRoot); + + // View styles. + maViewStyles.Read(rReadContext, mxThemeRoot); + + // Read bitmaps. + mpIconContainer = std::make_shared( + Reference( + PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, "Bitmaps"), UNO_QUERY), + mpParentTheme != nullptr ? mpParentTheme->mpIconContainer + : std::shared_ptr(), + rReadContext.mxComponentContext, rReadContext.mxCanvas); + + // Read fonts. + Reference xFontNode( + PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, "Fonts"), + UNO_QUERY); + PresenterConfigurationAccess::ForAll( + xFontNode, + [this] (OUString const& rKey, uno::Reference const& xProps) + { + return this->ProcessFont(rKey, xProps); + }); +} + +SharedPaneStyle PresenterTheme::Theme::GetPaneStyle (const OUString& rsStyleName) const +{ + SharedPaneStyle pPaneStyle (maPaneStyles.GetPaneStyle(rsStyleName)); + if (pPaneStyle) + return pPaneStyle; + else if (mpParentTheme != nullptr) + return mpParentTheme->GetPaneStyle(rsStyleName); + else + return SharedPaneStyle(); +} + +SharedViewStyle PresenterTheme::Theme::GetViewStyle (const OUString& rsStyleName) const +{ + SharedViewStyle pViewStyle (maViewStyles.GetViewStyle(rsStyleName)); + if (pViewStyle) + return pViewStyle; + else if (mpParentTheme != nullptr) + return mpParentTheme->GetViewStyle(rsStyleName); + else + return SharedViewStyle(); +} + +void PresenterTheme::Theme::ProcessFont( + const OUString& rsKey, + const Reference& rxProperties) +{ + maFontContainer[rsKey] = ReadContext::ReadFont(rxProperties, SharedFontDescriptor()); +} + +namespace { + +//===== ReadContext =========================================================== + +ReadContext::ReadContext ( + const css::uno::Reference& rxContext, + const Reference& rxCanvas) + : mxComponentContext(rxContext), + mxCanvas(rxCanvas) +{ + Reference xFactory (rxContext->getServiceManager()); + if (xFactory.is()) + { + mxPresenterHelper.set( + xFactory->createInstanceWithContext( + "com.sun.star.comp.Draw.PresenterHelper", + rxContext), + UNO_QUERY_THROW); + } +} + +PresenterTheme::SharedFontDescriptor ReadContext::ReadFont ( + const Reference& rxNode, + const PresenterTheme::SharedFontDescriptor& rpDefault) +{ + if ( ! rxNode.is()) + return PresenterTheme::SharedFontDescriptor(); + + try + { + Reference xFont ( + PresenterConfigurationAccess::GetConfigurationNode( + rxNode, + /*rsFontPath*/""), + UNO_QUERY_THROW); + + Reference xProperties (xFont, UNO_QUERY_THROW); + return ReadFont(xProperties, rpDefault); + } + catch (Exception&) + { + OSL_ASSERT(false); + } + + return PresenterTheme::SharedFontDescriptor(); +} + +PresenterTheme::SharedFontDescriptor ReadContext::ReadFont ( + const Reference& rxProperties, + const PresenterTheme::SharedFontDescriptor& rpDefault) +{ + auto pDescriptor = std::make_shared(rpDefault); + + PresenterConfigurationAccess::GetProperty(rxProperties, "FamilyName") >>= pDescriptor->msFamilyName; + PresenterConfigurationAccess::GetProperty(rxProperties, "Style") >>= pDescriptor->msStyleName; + PresenterConfigurationAccess::GetProperty(rxProperties, "Size") >>= pDescriptor->mnSize; + PresenterTheme::ConvertToColor( + PresenterConfigurationAccess::GetProperty(rxProperties, "Color"), + pDescriptor->mnColor); + PresenterConfigurationAccess::GetProperty(rxProperties, "Anchor") >>= pDescriptor->msAnchor; + PresenterConfigurationAccess::GetProperty(rxProperties, "XOffset") >>= pDescriptor->mnXOffset; + PresenterConfigurationAccess::GetProperty(rxProperties, "YOffset") >>= pDescriptor->mnYOffset; + + return pDescriptor; +} + +Any ReadContext::GetByName ( + const Reference& rxNode, + const OUString& rsName) +{ + OSL_ASSERT(rxNode.is()); + if (rxNode->hasByName(rsName)) + return rxNode->getByName(rsName); + else + return Any(); +} + +std::shared_ptr ReadContext::ReadTheme ( + PresenterConfigurationAccess& rConfiguration, + const OUString& rsThemeName) +{ + std::shared_ptr pTheme; + + OUString sCurrentThemeName (rsThemeName); + if (sCurrentThemeName.isEmpty()) + { + // No theme name given. Look up the CurrentTheme property. + rConfiguration.GetConfigurationNode("Presenter/CurrentTheme") >>= sCurrentThemeName; + if (sCurrentThemeName.isEmpty()) + { + // Still no name. Use "DefaultTheme". + sCurrentThemeName = "DefaultTheme"; + } + } + + Reference xThemes ( + rConfiguration.GetConfigurationNode("Presenter/Themes"), + UNO_QUERY); + if (xThemes.is()) + { + // Iterate over all themes and search the one with the given name. + const Sequence aKeys (xThemes->getElementNames()); + for (const OUString& rsKey : aKeys) + { + Reference xTheme ( + xThemes->getByName(rsKey), UNO_QUERY); + if (xTheme.is()) + { + OUString sThemeName; + PresenterConfigurationAccess::GetConfigurationNode(xTheme, "ThemeName") + >>= sThemeName; + if (sThemeName == sCurrentThemeName) + { + pTheme = std::make_shared(xTheme,rsKey); + break; + } + } + } + } + + if (pTheme != nullptr) + { + pTheme->Read(rConfiguration, *this); + } + + return pTheme; +} + +BorderSize ReadContext::ReadBorderSize (const Reference& rxNode) +{ + BorderSize aBorderSize; + + if (rxNode.is()) + { + GetByName(rxNode, "Left") >>= aBorderSize.mnLeft; + GetByName(rxNode, "Top") >>= aBorderSize.mnTop; + GetByName(rxNode, "Right") >>= aBorderSize.mnRight; + GetByName(rxNode, "Bottom") >>= aBorderSize.mnBottom; + } + + return aBorderSize; +} + +//===== PaneStyleContainer ==================================================== + +void PaneStyleContainer::Read ( + const ReadContext& rReadContext, + const Reference& rxThemeRoot) +{ + Reference xPaneStyleList ( + PresenterConfigurationAccess::GetConfigurationNode( + rxThemeRoot, + "PaneStyles"), + UNO_QUERY); + if (!xPaneStyleList.is()) + return; + + ::std::vector aProperties; + aProperties.reserve(6); + aProperties.emplace_back("StyleName"); + aProperties.emplace_back("ParentStyle"); + aProperties.emplace_back("TitleFont"); + aProperties.emplace_back("InnerBorderSize"); + aProperties.emplace_back("OuterBorderSize"); + aProperties.emplace_back("BorderBitmapList"); + PresenterConfigurationAccess::ForAll( + xPaneStyleList, + aProperties, + [this, &rReadContext] (std::vector const& rValues) + { + return this->ProcessPaneStyle(rReadContext, rValues); + }); +} + +void PaneStyleContainer::ProcessPaneStyle( + ReadContext const & rReadContext, + const ::std::vector& rValues) +{ + if (rValues.size() != 6) + return; + + auto pStyle = std::make_shared(); + + rValues[0] >>= pStyle->msStyleName; + + OUString sParentStyleName; + if (rValues[1] >>= sParentStyleName) + { + // Find parent style. + auto iStyle = std::find_if(mStyles.begin(), mStyles.end(), + [&sParentStyleName](const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; }); + if (iStyle != mStyles.end()) + pStyle->mpParentStyle = *iStyle; + } + + Reference xFontNode (rValues[2], UNO_QUERY); + pStyle->mpFont = ReadContext::ReadFont( + xFontNode, PresenterTheme::SharedFontDescriptor()); + + Reference xInnerBorderSizeNode (rValues[3], UNO_QUERY); + pStyle->maInnerBorderSize = ReadContext::ReadBorderSize(xInnerBorderSizeNode); + Reference xOuterBorderSizeNode (rValues[4], UNO_QUERY); + pStyle->maOuterBorderSize = ReadContext::ReadBorderSize(xOuterBorderSizeNode); + + if (pStyle->mpParentStyle != nullptr) + { + pStyle->maInnerBorderSize.Merge(pStyle->mpParentStyle->maInnerBorderSize); + pStyle->maOuterBorderSize.Merge(pStyle->mpParentStyle->maOuterBorderSize); + } + + if (rReadContext.mxCanvas.is()) + { + Reference xBitmapsNode (rValues[5], UNO_QUERY); + pStyle->mpBitmaps = std::make_shared( + xBitmapsNode, + pStyle->mpParentStyle != nullptr ? pStyle->mpParentStyle->mpBitmaps + : std::shared_ptr(), + rReadContext.mxComponentContext, rReadContext.mxCanvas, + rReadContext.mxPresenterHelper); + } + + mStyles.push_back(pStyle); +} + +SharedPaneStyle PaneStyleContainer::GetPaneStyle (const OUString& rsStyleName) const +{ + auto iStyle = std::find_if(mStyles.begin(), mStyles.end(), + [&rsStyleName](const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; }); + if (iStyle != mStyles.end()) + return *iStyle; + return SharedPaneStyle(); +} + +//===== PaneStyle ============================================================= + +PaneStyle::PaneStyle() +{ +} + +SharedBitmapDescriptor PaneStyle::GetBitmap (const OUString& rsBitmapName) const +{ + if (mpBitmaps != nullptr) + { + SharedBitmapDescriptor pBitmap = mpBitmaps->GetBitmap(rsBitmapName); + if (pBitmap) + return pBitmap; + } + + if (mpParentStyle != nullptr) + return mpParentStyle->GetBitmap(rsBitmapName); + else + return SharedBitmapDescriptor(); +} + +PresenterTheme::SharedFontDescriptor PaneStyle::GetFont() const +{ + if (mpFont) + return mpFont; + else if (mpParentStyle != nullptr) + return mpParentStyle->GetFont(); + else + return PresenterTheme::SharedFontDescriptor(); +} + +//===== ViewStyleContainer ==================================================== + +void ViewStyleContainer::Read ( + const ReadContext& rReadContext, + const Reference& rxThemeRoot) +{ + Reference xViewStyleList ( + PresenterConfigurationAccess::GetConfigurationNode( + rxThemeRoot, + "ViewStyles"), + UNO_QUERY); + if (xViewStyleList.is()) + { + PresenterConfigurationAccess::ForAll( + xViewStyleList, + [this, &rReadContext] (OUString const&, uno::Reference const& xProps) + { + return this->ProcessViewStyle(rReadContext, xProps); + }); + } +} + +void ViewStyleContainer::ProcessViewStyle( + ReadContext const & rReadContext, + const Reference& rxProperties) +{ + auto pStyle = std::make_shared(); + + PresenterConfigurationAccess::GetProperty(rxProperties, "StyleName") + >>= pStyle->msStyleName; + + OUString sParentStyleName; + if (PresenterConfigurationAccess::GetProperty(rxProperties, "ParentStyle") + >>= sParentStyleName) + { + // Find parent style. + auto iStyle = std::find_if(mStyles.begin(), mStyles.end(), + [&sParentStyleName](const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; }); + if (iStyle != mStyles.end()) + { + pStyle->mpParentStyle = *iStyle; + pStyle->mpFont = (*iStyle)->mpFont; + pStyle->mpBackground = (*iStyle)->mpBackground; + } + } + + Reference xFontNode ( + PresenterConfigurationAccess::GetProperty(rxProperties, "Font"), UNO_QUERY); + PresenterTheme::SharedFontDescriptor pFont ( + ReadContext::ReadFont(xFontNode, PresenterTheme::SharedFontDescriptor())); + if (pFont) + pStyle->mpFont = pFont; + + Reference xBackgroundNode ( + PresenterConfigurationAccess::GetProperty(rxProperties, "Background"), + UNO_QUERY); + SharedBitmapDescriptor pBackground (PresenterBitmapContainer::LoadBitmap( + xBackgroundNode, + OUString(), + rReadContext.mxPresenterHelper, + rReadContext.mxCanvas, + SharedBitmapDescriptor())); + if (pBackground && pBackground->GetNormalBitmap().is()) + pStyle->mpBackground = pBackground; + + mStyles.push_back(pStyle); +} + +SharedViewStyle ViewStyleContainer::GetViewStyle (const OUString& rsStyleName) const +{ + auto iStyle = std::find_if(mStyles.begin(), mStyles.end(), + [&rsStyleName](const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; }); + if (iStyle != mStyles.end()) + return *iStyle; + return SharedViewStyle(); +} + +//===== ViewStyle ============================================================= + +ViewStyle::ViewStyle() +{ +} + +SharedBitmapDescriptor ViewStyle::GetBitmap (std::u16string_view rsBitmapName) const +{ + if (rsBitmapName == u"Background") + return mpBackground; + else + return SharedBitmapDescriptor(); +} + +PresenterTheme::SharedFontDescriptor ViewStyle::GetFont() const +{ + if (mpFont) + return mpFont; + else if (mpParentStyle != nullptr) + return mpParentStyle->GetFont(); + else + return PresenterTheme::SharedFontDescriptor(); +} + +//===== StyleAssociationContainer ============================================= + +void StyleAssociationContainer::Read ( + const Reference& rxThemeRoot) +{ + Reference xStyleAssociationList ( + PresenterConfigurationAccess::GetConfigurationNode( + rxThemeRoot, + "StyleAssociations"), + UNO_QUERY); + if (!xStyleAssociationList.is()) + return; + + ::std::vector aProperties { "ResourceURL", "StyleName" }; + PresenterConfigurationAccess::ForAll( + xStyleAssociationList, + aProperties, + [this] (std::vector const& rValues) + { + return this->ProcessStyleAssociation(rValues); + }); +} + +OUString StyleAssociationContainer::GetStyleName (const OUString& rsResourceName) const +{ + StyleAssociations::const_iterator iAssociation (maStyleAssociations.find(rsResourceName)); + if (iAssociation != maStyleAssociations.end()) + return iAssociation->second; + else + return OUString(); +} + +void StyleAssociationContainer::ProcessStyleAssociation( + const ::std::vector& rValues) +{ + if (rValues.size() != 2) + return; + + OUString sResourceURL; + OUString sStyleName; + if ((rValues[0] >>= sResourceURL) + && (rValues[1] >>= sStyleName)) + { + maStyleAssociations[sResourceURL] = sStyleName; + } +} + +} // end of anonymous namespace + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterTheme.hxx b/sd/source/console/PresenterTheme.hxx new file mode 100644 index 0000000000..ae92433a67 --- /dev/null +++ b/sd/source/console/PresenterTheme.hxx @@ -0,0 +1,134 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTHEME_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTHEME_HXX + +#include "PresenterBitmapContainer.hxx" +#include "PresenterConfigurationAccess.hxx" +#include +#include +#include +#include + +namespace sdext::presenter { + +/** A theme is a set of properties describing fonts, colors, and bitmaps to be used to draw + background, pane borders, and view content. + + At the moment the properties can be accessed via the getPropertyValue() method. + + For a resource URL of a pane or a view you get the name of the + associated PaneStyle or ViewStyle. + + For the name of pane or view style suffixed with and underscore and the + name of configuration property, and maybe additionally suffixed by + another underscore and sub property name you get the associated + property. + + Example: you want to access the top left bitmap of a pane border + (simplified code): + + OUString sStyleName = getPropertyValue("private:resource/pane/Presenter/Pane1"); + XBitmap xBitmap = getPropertyValue(sStyleName + "_TopLeftBitmap"); + + For the offset of the bitmap you can call + Point aOffset = getPropertyValue(sStyleName + "_TopLeftOffset"); + + This is work in progress. +*/ +class PresenterTheme +{ +public: + PresenterTheme ( + css::uno::Reference xContext, + css::uno::Reference xCanvas); + ~PresenterTheme(); + + bool HasCanvas() const; + void ProvideCanvas (const css::uno::Reference& rxCanvas); + + OUString GetStyleName (const OUString& rsResourceURL) const; + ::std::vector GetBorderSize ( + const OUString& rsStyleName, + const bool bOuter) const; + + class Theme; + class FontDescriptor + { + public: + explicit FontDescriptor (const std::shared_ptr& rpDescriptor); + + OUString msFamilyName; + OUString msStyleName; + sal_Int32 mnSize; + sal_uInt32 mnColor; + OUString msAnchor; + sal_Int32 mnXOffset; + sal_Int32 mnYOffset; + css::uno::Reference mxFont; + + bool PrepareFont (const css::uno::Reference& rxCanvas); + + private: + css::uno::Reference CreateFont ( + const css::uno::Reference& rxCanvas, + const double nCellSize) const; + double GetCellSizeForDesignSize ( + const css::uno::Reference& rxCanvas, + const double nDesignSize) const; + }; + typedef std::shared_ptr SharedFontDescriptor; + + SharedBitmapDescriptor GetBitmap ( + const OUString& rsStyleName, + const OUString& rsBitmapName) const; + + SharedBitmapDescriptor GetBitmap ( + const OUString& rsBitmapName) const; + + std::shared_ptr GetBitmapContainer() const; + + SharedFontDescriptor GetFont ( + const OUString& rsStyleName) const; + + static SharedFontDescriptor ReadFont ( + const css::uno::Reference& rxNode, + const SharedFontDescriptor& rDefaultFount); + + static bool ConvertToColor ( + const css::uno::Any& rColorSequence, + sal_uInt32& rColor); + + std::shared_ptr GetNodeForViewStyle ( + const OUString& rsStyleName) const; + +private: + css::uno::Reference mxContext; + std::shared_ptr mpTheme; + css::uno::Reference mxCanvas; + + std::shared_ptr ReadTheme(); +}; + +} // end of namespace ::sd::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterTimer.cxx b/sd/source/console/PresenterTimer.cxx new file mode 100644 index 0000000000..ed7be4cbc9 --- /dev/null +++ b/sd/source/console/PresenterTimer.cxx @@ -0,0 +1,572 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterTimer.hxx" + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sdext::presenter { + +namespace { +class TimerTask +{ +public: + TimerTask ( + PresenterTimer::Task aTask, + const TimeValue& rDueTime, + const sal_Int64 nRepeatInterval, + const sal_Int32 nTaskId); + + PresenterTimer::Task maTask; + TimeValue maDueTime; + const sal_Int64 mnRepeatInterval; + const sal_Int32 mnTaskId; + bool mbIsCanceled; +}; + +typedef std::shared_ptr SharedTimerTask; + +class TimerTaskComparator +{ +public: + bool operator() (const SharedTimerTask& rpTask1, const SharedTimerTask& rpTask2) const + { + return rpTask1->maDueTime.Seconds < rpTask2->maDueTime.Seconds + || (rpTask1->maDueTime.Seconds == rpTask2->maDueTime.Seconds + && rpTask1->maDueTime.Nanosec < rpTask2->maDueTime.Nanosec); + } +}; + +/** Queue all scheduled tasks and process them when their time has come. +*/ +class TimerScheduler + : public std::enable_shared_from_this, + public ::osl::Thread +{ +public: + static std::shared_ptr Instance( + uno::Reference const& xContext); + static SharedTimerTask CreateTimerTask ( + const PresenterTimer::Task& rTask, + const TimeValue& rDueTime, + const sal_Int64 nRepeatInterval); + + void ScheduleTask (const SharedTimerTask& rpTask); + void CancelTask (const sal_Int32 nTaskId); + + static bool GetCurrentTime (TimeValue& rCurrentTime); + static sal_Int64 GetTimeDifference ( + const TimeValue& rTargetTime, + const TimeValue& rCurrentTime); + static void ConvertToTimeValue ( + TimeValue& rTimeValue, + const sal_Int64 nTimeDifference); + static sal_Int64 ConvertFromTimeValue ( + const TimeValue& rTimeValue); + + static void NotifyTermination(); +#if !defined NDEBUG + static bool HasInstance() { return mpInstance != nullptr; } +#endif + +private: + static std::shared_ptr mpInstance; + static std::mutex maInstanceMutex; + std::shared_ptr mpLateDestroy; // for clean exit + static sal_Int32 mnTaskId; + + std::mutex maTaskContainerMutex; + typedef ::std::set TaskContainer; + TaskContainer maScheduledTasks; + std::mutex maCurrentTaskMutex; + SharedTimerTask mpCurrentTask; + ::osl::Condition m_Shutdown; + + TimerScheduler( + uno::Reference const& xContext); +public: + virtual void SAL_CALL run() override; + virtual void SAL_CALL onTerminated() override { mpLateDestroy.reset(); } +}; + +class TerminateListener + : public ::cppu::WeakImplHelper +{ + virtual ~TerminateListener() override + { + assert(!TimerScheduler::HasInstance()); + } + + virtual void SAL_CALL disposing(lang::EventObject const&) override + { + } + + virtual void SAL_CALL queryTermination(lang::EventObject const&) override + { + } + + virtual void SAL_CALL notifyTermination(lang::EventObject const&) override + { + TimerScheduler::NotifyTermination(); + } +}; + +} // end of anonymous namespace + +//===== PresenterTimer ======================================================== + +sal_Int32 PresenterTimer::ScheduleRepeatedTask ( + const uno::Reference& xContext, + const Task& rTask, + const sal_Int64 nDelay, + const sal_Int64 nInterval) +{ + assert(xContext.is()); + TimeValue aCurrentTime; + if (TimerScheduler::GetCurrentTime(aCurrentTime)) + { + TimeValue aDueTime; + TimerScheduler::ConvertToTimeValue( + aDueTime, + TimerScheduler::ConvertFromTimeValue (aCurrentTime) + nDelay); + SharedTimerTask pTask (TimerScheduler::CreateTimerTask(rTask, aDueTime, nInterval)); + TimerScheduler::Instance(xContext)->ScheduleTask(pTask); + return pTask->mnTaskId; + } + + return NotAValidTaskId; +} + +void PresenterTimer::CancelTask (const sal_Int32 nTaskId) +{ + auto const pInstance(TimerScheduler::Instance(nullptr)); + if (pInstance) + { + pInstance->CancelTask(nTaskId); + } +} + +//===== TimerScheduler ======================================================== + +std::shared_ptr TimerScheduler::mpInstance; +std::mutex TimerScheduler::maInstanceMutex; +sal_Int32 TimerScheduler::mnTaskId = PresenterTimer::NotAValidTaskId; + +std::shared_ptr TimerScheduler::Instance( + uno::Reference const& xContext) +{ + std::scoped_lock aGuard (maInstanceMutex); + if (mpInstance == nullptr) + { + if (!xContext.is()) + return nullptr; + mpInstance.reset(new TimerScheduler(xContext)); + mpInstance->create(); + } + return mpInstance; +} + +TimerScheduler::TimerScheduler( + uno::Reference const& xContext) +{ + uno::Reference const xDesktop( + frame::Desktop::create(xContext)); + uno::Reference const xListener( + new TerminateListener); + // assuming the desktop can take ownership + xDesktop->addTerminateListener(xListener); +} + +SharedTimerTask TimerScheduler::CreateTimerTask ( + const PresenterTimer::Task& rTask, + const TimeValue& rDueTime, + const sal_Int64 nRepeatInterval) +{ + return std::make_shared(rTask, rDueTime, nRepeatInterval, ++mnTaskId); +} + +void TimerScheduler::ScheduleTask (const SharedTimerTask& rpTask) +{ + if (!rpTask) + return; + if (rpTask->mbIsCanceled) + return; + + { + std::scoped_lock aTaskGuard (maTaskContainerMutex); + maScheduledTasks.insert(rpTask); + } +} + +void TimerScheduler::CancelTask (const sal_Int32 nTaskId) +{ + // Set of scheduled tasks is sorted after their due times, not their + // task ids. Therefore we have to do a linear search for the task to + // cancel. + { + std::scoped_lock aGuard (maTaskContainerMutex); + auto iTask = std::find_if(maScheduledTasks.begin(), maScheduledTasks.end(), + [nTaskId](const SharedTimerTask& rxTask) { return rxTask->mnTaskId == nTaskId; }); + if (iTask != maScheduledTasks.end()) + maScheduledTasks.erase(iTask); + } + + // The task that is to be canceled may be currently about to be + // processed. Mark it with a flag that a) prevents a repeating task + // from being scheduled again and b) tries to prevent its execution. + { + std::scoped_lock aGuard (maCurrentTaskMutex); + if (mpCurrentTask + && mpCurrentTask->mnTaskId == nTaskId) + mpCurrentTask->mbIsCanceled = true; + } + + // Let the main-loop cleanup in its own time +} + +void TimerScheduler::NotifyTermination() +{ + std::shared_ptr const pInstance(TimerScheduler::mpInstance); + if (!pInstance) + { + return; + } + + { + std::scoped_lock aGuard(pInstance->maTaskContainerMutex); + pInstance->maScheduledTasks.clear(); + } + + { + std::scoped_lock aGuard(pInstance->maCurrentTaskMutex); + if (pInstance->mpCurrentTask) + { + pInstance->mpCurrentTask->mbIsCanceled = true; + } + } + + pInstance->m_Shutdown.set(); + + // rhbz#1425304 join thread before shutdown + pInstance->join(); +} + +void SAL_CALL TimerScheduler::run() +{ + osl_setThreadName("sdext::presenter::TimerScheduler"); + + while (true) + { + // Get the current time. + TimeValue aCurrentTime; + if ( ! GetCurrentTime(aCurrentTime)) + { + // We can not get the current time and thus can not schedule anything. + break; + } + + // Restrict access to the maScheduledTasks member to one, mutex + // guarded, block. + SharedTimerTask pTask; + sal_Int64 nDifference = 0; + { + std::scoped_lock aGuard (maTaskContainerMutex); + + // There are no more scheduled task. Leave this loop, function and + // live of the TimerScheduler. + if (maScheduledTasks.empty()) + break; + + nDifference = GetTimeDifference( + (*maScheduledTasks.begin())->maDueTime, + aCurrentTime); + if (nDifference <= 0) + { + pTask = *maScheduledTasks.begin(); + maScheduledTasks.erase(maScheduledTasks.begin()); + } + } + + // Acquire a reference to the current task. + { + std::scoped_lock aGuard (maCurrentTaskMutex); + mpCurrentTask = pTask; + } + + if (!pTask) + { + // Wait until the first task becomes due. + TimeValue aTimeValue; + ConvertToTimeValue(aTimeValue, nDifference); + // wait on condition variable, so the thread can be stopped + m_Shutdown.wait(&aTimeValue); + } + else + { + // Execute task. + if (pTask->maTask && !pTask->mbIsCanceled) + { + pTask->maTask(aCurrentTime); + + // Re-schedule repeating tasks. + if (pTask->mnRepeatInterval > 0) + { + ConvertToTimeValue( + pTask->maDueTime, + ConvertFromTimeValue(pTask->maDueTime) + + pTask->mnRepeatInterval); + ScheduleTask(pTask); + } + } + + } + + // Release reference to the current task. + { + std::scoped_lock aGuard (maCurrentTaskMutex); + mpCurrentTask.reset(); + } + } + + // While holding maInstanceMutex + std::scoped_lock aInstance( maInstanceMutex ); + mpLateDestroy = mpInstance; + mpInstance.reset(); +} + +bool TimerScheduler::GetCurrentTime (TimeValue& rCurrentTime) +{ + TimeValue aSystemTime; + if (osl_getSystemTime(&aSystemTime)) + return osl_getLocalTimeFromSystemTime(&aSystemTime, &rCurrentTime); + return false; +} + +sal_Int64 TimerScheduler::GetTimeDifference ( + const TimeValue& rTargetTime, + const TimeValue& rCurrentTime) +{ + return ConvertFromTimeValue(rTargetTime) - ConvertFromTimeValue(rCurrentTime); +} + +void TimerScheduler::ConvertToTimeValue ( + TimeValue& rTimeValue, + const sal_Int64 nTimeDifference) +{ + rTimeValue.Seconds = sal::static_int_cast(nTimeDifference / 1000000000L); + rTimeValue.Nanosec = sal::static_int_cast(nTimeDifference % 1000000000L); +} + +sal_Int64 TimerScheduler::ConvertFromTimeValue ( + const TimeValue& rTimeValue) +{ + return sal_Int64(rTimeValue.Seconds) * 1000000000L + rTimeValue.Nanosec; +} + +//===== TimerTask ============================================================= + +namespace { + +TimerTask::TimerTask ( + PresenterTimer::Task aTask, + const TimeValue& rDueTime, + const sal_Int64 nRepeatInterval, + const sal_Int32 nTaskId) + : maTask(std::move(aTask)), + maDueTime(rDueTime), + mnRepeatInterval(nRepeatInterval), + mnTaskId(nTaskId), + mbIsCanceled(false) +{ +} + +} // end of anonymous namespace + +//===== PresenterTimer ======================================================== + +::rtl::Reference PresenterClockTimer::mpInstance; + +::rtl::Reference PresenterClockTimer::Instance ( + const css::uno::Reference& rxContext) +{ + ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex()); + + ::rtl::Reference pTimer; + if (mpInstance.is()) + { + pTimer = mpInstance; + } + if ( ! pTimer.is()) + { + pTimer.set(new PresenterClockTimer(rxContext)); + mpInstance = pTimer; + } + return pTimer; +} + +PresenterClockTimer::PresenterClockTimer (const Reference& rxContext) + : PresenterClockTimerInterfaceBase(m_aMutex), + maDateTime(), + mnTimerTaskId(PresenterTimer::NotAValidTaskId), + mbIsCallbackPending(false), + m_xContext(rxContext) +{ + assert(m_xContext.is()); + Reference xFactory = + rxContext->getServiceManager(); + if (xFactory.is()) + mxRequestCallback.set( + xFactory->createInstanceWithContext( + "com.sun.star.awt.AsyncCallback", + rxContext), + UNO_QUERY_THROW); +} + +PresenterClockTimer::~PresenterClockTimer() +{ + if (mnTimerTaskId != PresenterTimer::NotAValidTaskId) + { + PresenterTimer::CancelTask(mnTimerTaskId); + mnTimerTaskId = PresenterTimer::NotAValidTaskId; + } + + Reference xComponent (mxRequestCallback, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + mxRequestCallback = nullptr; +} + +void PresenterClockTimer::AddListener (const SharedListener& rListener) +{ + std::unique_lock aGuard (maMutex); + + maListeners.push_back(rListener); + + // Create a timer task when the first listener is added. + if (mnTimerTaskId==PresenterTimer::NotAValidTaskId) + { + mnTimerTaskId = PresenterTimer::ScheduleRepeatedTask( + m_xContext, + [this] (TimeValue const& rTime) { return this->CheckCurrentTime(rTime); }, + 0, + 250000000 /*ns*/); + } +} + +void PresenterClockTimer::RemoveListener (const SharedListener& rListener) +{ + std::unique_lock aGuard (maMutex); + + ListenerContainer::iterator iListener (::std::find( + maListeners.begin(), + maListeners.end(), + rListener)); + if (iListener != maListeners.end()) + maListeners.erase(iListener); + if (maListeners.empty()) + { + // We have no more clients and therefore are not interested in time changes. + if (mnTimerTaskId != PresenterTimer::NotAValidTaskId) + { + PresenterTimer::CancelTask(mnTimerTaskId); + mnTimerTaskId = PresenterTimer::NotAValidTaskId; + } + mpInstance = nullptr; + } +} + +oslDateTime PresenterClockTimer::GetCurrentTime() +{ + TimeValue aCurrentTime; + TimerScheduler::GetCurrentTime(aCurrentTime); + oslDateTime aDateTime; + osl_getDateTimeFromTimeValue(&aCurrentTime, &aDateTime); + return aDateTime; +} + +void PresenterClockTimer::CheckCurrentTime (const TimeValue& rCurrentTime) +{ + css::uno::Reference xRequestCallback; + css::uno::Reference xCallback; + { + std::unique_lock aGuard (maMutex); + + TimeValue aCurrentTime (rCurrentTime); + oslDateTime aDateTime; + if (osl_getDateTimeFromTimeValue(&aCurrentTime, &aDateTime)) + { + if (aDateTime.Seconds != maDateTime.Seconds + || aDateTime.Minutes != maDateTime.Minutes + || aDateTime.Hours != maDateTime.Hours) + { + // The displayed part of the current time has changed. + // Prepare to call the listeners. + maDateTime = aDateTime; + + // Schedule notification of listeners. + if (mxRequestCallback.is() && ! mbIsCallbackPending) + { + mbIsCallbackPending = true; + xRequestCallback = mxRequestCallback; + xCallback = this; + } + } + } + } + if (xRequestCallback.is() && xCallback.is()) + xRequestCallback->addCallback(xCallback, Any()); +} + +//----- XCallback ------------------------------------------------------------- + +void SAL_CALL PresenterClockTimer::notify (const css::uno::Any&) +{ + ListenerContainer aListenerCopy; + + { + std::unique_lock aGuard (maMutex); + + mbIsCallbackPending = false; + + aListenerCopy = maListeners; + } + + for (const auto& rxListener : aListenerCopy) + { + rxListener->TimeHasChanged(maDateTime); + } +} + +} // end of namespace ::sdext::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterTimer.hxx b/sd/source/console/PresenterTimer.hxx new file mode 100644 index 0000000000..8cba60a223 --- /dev/null +++ b/sd/source/console/PresenterTimer.hxx @@ -0,0 +1,122 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTIMER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTIMER_HXX + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace com::sun::star::uno { class XComponentContext; } + +namespace sdext::presenter { + +/** The timer allows tasks to be scheduled for execution at a specified time + in the future. +*/ +class PresenterTimer +{ +public: + /** A task is called with the current time. + */ + typedef ::std::function Task; + + static const sal_Int32 NotAValidTaskId = 0; + + /** Schedule a task to be executed repeatedly. The task is executed the + first time after nFirst nano-seconds (1000000000 corresponds to one + second). After that task is executed in intervals that are + nInterval ns long until CancelTask is called. + */ + static sal_Int32 ScheduleRepeatedTask ( + const css::uno::Reference& xContext, + const Task& rTask, + const sal_Int64 nFirst, + const sal_Int64 nInterval); + + static void CancelTask (const sal_Int32 nTaskId); +}; + +typedef cppu::WeakComponentImplHelper< + css::awt::XCallback + > PresenterClockTimerInterfaceBase; + +/** A timer that calls its listeners, typically clocks, every second to + update their current time value. +*/ +class PresenterClockTimer + : protected ::cppu::BaseMutex, + public PresenterClockTimerInterfaceBase +{ +public: + class Listener { + public: + virtual void TimeHasChanged (const oslDateTime& rCurrentTime) = 0; + + protected: + ~Listener() {} + }; + typedef std::shared_ptr SharedListener; + + static ::rtl::Reference Instance ( + const css::uno::Reference& rxContext); + + void AddListener (const SharedListener& rListener); + void RemoveListener (const SharedListener& rListener); + + static oslDateTime GetCurrentTime(); + + // XCallback + + virtual void SAL_CALL notify (const css::uno::Any& rUserData) override; + +private: + static ::rtl::Reference mpInstance; + + std::mutex maMutex; + typedef ::std::vector ListenerContainer; + ListenerContainer maListeners; + oslDateTime maDateTime; + sal_Int32 mnTimerTaskId; + bool mbIsCallbackPending; + css::uno::Reference mxRequestCallback; + const css::uno::Reference m_xContext; + + PresenterClockTimer ( + const css::uno::Reference& rxContext); + virtual ~PresenterClockTimer() override; + + void CheckCurrentTime (const TimeValue& rCurrentTime); +}; + +} // end of namespace ::sdext::presenter + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/console/PresenterToolBar.cxx b/sd/source/console/PresenterToolBar.cxx new file mode 100644 index 0000000000..5e7c770df2 --- /dev/null +++ b/sd/source/console/PresenterToolBar.cxx @@ -0,0 +1,2013 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include "PresenterToolBar.hxx" + +#include "PresenterBitmapContainer.hxx" +#include "PresenterCanvasHelper.hxx" +#include "PresenterGeometryHelper.hxx" +#include "PresenterPaintManager.hxx" +#include "PresenterTimer.hxx" +#include "PresenterWindowManager.hxx" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sdext::presenter { + +const sal_Int32 gnGapSize (20); + +namespace { + + class Text + { + public: + Text(); + Text ( + OUString sText, + PresenterTheme::SharedFontDescriptor pFont); + + void SetText (const OUString& rsText); + const OUString& GetText() const; + const PresenterTheme::SharedFontDescriptor& GetFont() const; + + void Paint ( + const Reference& rxCanvas, + const rendering::ViewState& rViewState, + const awt::Rectangle& rBoundingBox); + + geometry::RealRectangle2D GetBoundingBox ( + const Reference& rxCanvas); + + private: + OUString msText; + PresenterTheme::SharedFontDescriptor mpFont; + }; + + class ElementMode + { + public: + ElementMode(); + ElementMode(const ElementMode&) = delete; + ElementMode& operator=(const ElementMode&) = delete; + + SharedBitmapDescriptor mpIcon; + OUString msAction; + Text maText; + + void ReadElementMode ( + const Reference& rxProperties, + const OUString& rsModeName, + std::shared_ptr const & rpDefaultMode, + ::sdext::presenter::PresenterToolBar::Context const & rContext); + }; + typedef std::shared_ptr SharedElementMode; + +} // end of anonymous namespace + +class PresenterToolBar::Context +{ +public: + Context() = default; + Context(const Context&) = delete; + Context& operator=(const Context&) = delete; + Reference mxPresenterHelper; + css::uno::Reference mxCanvas; +}; + +//===== PresenterToolBar::Element ============================================= + +namespace { + typedef cppu::WeakComponentImplHelper< + css::document::XEventListener, + css::frame::XStatusListener + > ElementInterfaceBase; + + class Element + : private ::cppu::BaseMutex, + public ElementInterfaceBase + { + public: + explicit Element (::rtl::Reference pToolBar); + Element(const Element&) = delete; + Element& operator=(const Element&) = delete; + + virtual void SAL_CALL disposing() override; + + virtual void SetModes ( + const SharedElementMode& rpNormalMode, + const SharedElementMode& rpMouseOverMode, + const SharedElementMode& rpSelectedMode, + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode); + void CurrentSlideHasChanged(); + void SetLocation (const awt::Point& rLocation); + void SetSize (const geometry::RealSize2D& rSize); + virtual void Paint ( + const Reference& rxCanvas, + const rendering::ViewState& rViewState) = 0; + awt::Size const & GetBoundingSize ( + const Reference& rxCanvas); + awt::Rectangle GetBoundingBox() const; + virtual bool SetState (const bool bIsOver, const bool bIsPressed); + void Invalidate (const bool bSynchronous); + bool IsOutside (const awt::Rectangle& rBox); + virtual bool IsFilling() const; + void UpdateState(); + + // lang::XEventListener + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + // document::XEventListener + + virtual void SAL_CALL notifyEvent (const css::document::EventObject& rEvent) override; + + // frame::XStatusListener + + virtual void SAL_CALL statusChanged (const css::frame::FeatureStateEvent& rEvent) override; + + protected: + ::rtl::Reference mpToolBar; + awt::Point maLocation; + awt::Size maSize; + SharedElementMode mpNormal; + SharedElementMode mpMouseOver; + SharedElementMode mpSelected; + SharedElementMode mpDisabled; + SharedElementMode mpMouseOverSelected; + SharedElementMode mpMode; + bool mbIsOver; + bool mbIsPressed; + bool mbIsSelected; + + virtual awt::Size CreateBoundingSize ( + const Reference& rxCanvas) = 0; + + bool IsEnabled() const { return mbIsEnabled;} + private: + bool mbIsEnabled; + }; + +} // end of anonymous namespace + +class PresenterToolBar::ElementContainerPart + : public ::std::vector > +{ +}; + +//===== Button ================================================================ + +namespace { + + class Button : public Element + { + public: + static ::rtl::Reference Create ( + const ::rtl::Reference& rpToolBar); + + virtual void SAL_CALL disposing() override; + + virtual void Paint ( + const Reference& rxCanvas, + const rendering::ViewState& rViewState) override; + + // lang::XEventListener + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + protected: + virtual awt::Size CreateBoundingSize ( + const Reference& rxCanvas) override; + + private: + bool mbIsListenerRegistered; + + Button (const ::rtl::Reference& rpToolBar); + void Initialize(); + void PaintIcon ( + const Reference& rxCanvas, + const sal_Int32 nTextHeight, + const rendering::ViewState& rViewState); + PresenterBitmapDescriptor::Mode GetMode() const; + }; + +//===== Label ================================================================= + + class Label : public Element + { + public: + explicit Label (const ::rtl::Reference& rpToolBar); + + void SetText (const OUString& rsText); + virtual void Paint ( + const Reference& rxCanvas, + const rendering::ViewState& rViewState) override; + virtual bool SetState (const bool bIsOver, const bool bIsPressed) override; + + protected: + virtual awt::Size CreateBoundingSize ( + const Reference& rxCanvas) override; + }; + +// Some specialized controls. + + class TimeFormatter + { + public: + static OUString FormatTime (const oslDateTime& rTime); + }; + + class TimeLabel : public Label + { + public: + void ConnectToTimer(); + virtual void TimeHasChanged (const oslDateTime& rCurrentTime) = 0; + protected: + explicit TimeLabel(const ::rtl::Reference& rpToolBar); + using Element::disposing; + virtual void SAL_CALL disposing() override; + private: + class Listener : public PresenterClockTimer::Listener + { + public: + explicit Listener (::rtl::Reference xLabel) + : mxLabel(std::move(xLabel)) {} + virtual ~Listener() {} + virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override + { if (mxLabel.is()) mxLabel->TimeHasChanged(rCurrentTime); } + private: + ::rtl::Reference mxLabel; + }; + std::shared_ptr mpListener; + }; + + class CurrentTimeLabel : public TimeLabel + { + public: + static ::rtl::Reference Create ( + const ::rtl::Reference& rpToolBar); + virtual void SetModes ( + const SharedElementMode& rpNormalMode, + const SharedElementMode& rpMouseOverMode, + const SharedElementMode& rpSelectedMode, + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) override; + private: + CurrentTimeLabel (const ::rtl::Reference& rpToolBar); + virtual ~CurrentTimeLabel() override; + virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override; + }; + + class PresentationTimeLabel : public TimeLabel, public IPresentationTime + { + public: + static ::rtl::Reference Create ( + const ::rtl::Reference& rpToolBar); + virtual void SetModes ( + const SharedElementMode& rpNormalMode, + const SharedElementMode& rpMouseOverMode, + const SharedElementMode& rpSelectedMode, + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) override; + virtual void restart() override; + virtual bool isPaused() override; + virtual void setPauseStatus(const bool pauseStatus) override; + const TimeValue& getPauseTimeValue() const; + void setPauseTimeValue(const TimeValue pauseTime); + private: + TimeValue maStartTimeValue; + TimeValue pauseTimeValue; + PresentationTimeLabel (const ::rtl::Reference& rpToolBar); + bool paused; + virtual ~PresentationTimeLabel() override; + virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override; + }; + + class VerticalSeparator : public Element + { + public: + explicit VerticalSeparator (const ::rtl::Reference& rpToolBar); + virtual void Paint ( + const Reference& rxCanvas, + const rendering::ViewState& rViewState) override; + virtual bool IsFilling() const override; + + protected: + virtual awt::Size CreateBoundingSize ( + const Reference& rxCanvas) override; + }; + + class HorizontalSeparator : public Element + { + public: + explicit HorizontalSeparator (const ::rtl::Reference& rpToolBar); + virtual void Paint ( + const Reference& rxCanvas, + const rendering::ViewState& rViewState) override; + virtual bool IsFilling() const override; + + protected: + virtual awt::Size CreateBoundingSize ( + const Reference& rxCanvas) override; + }; +} // end of anonymous namespace + +//===== PresenterToolBar ====================================================== + +PresenterToolBar::PresenterToolBar ( + const Reference& rxContext, + css::uno::Reference xWindow, + css::uno::Reference xCanvas, + ::rtl::Reference pPresenterController, + const Anchor eAnchor) + : PresenterToolBarInterfaceBase(m_aMutex), + mxComponentContext(rxContext), + mxWindow(std::move(xWindow)), + mxCanvas(std::move(xCanvas)), + mpPresenterController(std::move(pPresenterController)), + mbIsLayoutPending(false), + meAnchor(eAnchor) +{ +} + +void PresenterToolBar::Initialize ( + const OUString& rsConfigurationPath) +{ + try + { + CreateControls(rsConfigurationPath); + + if (mxWindow.is()) + { + mxWindow->addWindowListener(this); + mxWindow->addPaintListener(this); + mxWindow->addMouseListener(this); + mxWindow->addMouseMotionListener(this); + + Reference xPeer (mxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->setBackground(util::Color(0xff000000)); + + mxWindow->setVisible(true); + } + + mxSlideShowController = mpPresenterController->GetSlideShowController(); + UpdateSlideNumber(); + mbIsLayoutPending = true; + } + catch (RuntimeException&) + { + mpCurrentContainerPart.reset(); + maElementContainer.clear(); + throw; + } +} + +PresenterToolBar::~PresenterToolBar() +{ +} + +void SAL_CALL PresenterToolBar::disposing() +{ + if (mxWindow.is()) + { + mxWindow->removeWindowListener(this); + mxWindow->removePaintListener(this); + mxWindow->removeMouseListener(this); + mxWindow->removeMouseMotionListener(this); + mxWindow = nullptr; + } + + // Dispose tool bar elements. + for (const auto& rxPart : maElementContainer) + { + OSL_ASSERT(rxPart != nullptr); + for (const rtl::Reference& pElement : *rxPart) + { + if (pElement) + { + Reference xComponent = pElement; + if (xComponent.is()) + xComponent->dispose(); + } + } + } + + mpCurrentContainerPart.reset(); + maElementContainer.clear(); +} + +void PresenterToolBar::InvalidateArea ( + const awt::Rectangle& rRepaintBox, + const bool bSynchronous) +{ + std::shared_ptr xManager(mpPresenterController->GetPaintManager()); + if (!xManager) + return; + xManager->Invalidate( + mxWindow, + rRepaintBox, + bSynchronous); +} + +void PresenterToolBar::RequestLayout() +{ + mbIsLayoutPending = true; + + std::shared_ptr xManager(mpPresenterController->GetPaintManager()); + if (!xManager) + return; + + xManager->Invalidate(mxWindow); +} + +geometry::RealSize2D const & PresenterToolBar::GetMinimalSize() +{ + if (mbIsLayoutPending) + Layout(mxCanvas); + return maMinimalSize; +} + +const ::rtl::Reference& PresenterToolBar::GetPresenterController() const +{ + return mpPresenterController; +} + +const Reference& PresenterToolBar::GetComponentContext() const +{ + return mxComponentContext; +} + +//----- lang::XEventListener ------------------------------------------------- + +void SAL_CALL PresenterToolBar::disposing (const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxWindow) + mxWindow = nullptr; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterToolBar::windowResized (const awt::WindowEvent&) +{ + mbIsLayoutPending = true; +} + +void SAL_CALL PresenterToolBar::windowMoved (const awt::WindowEvent&) {} + +void SAL_CALL PresenterToolBar::windowShown (const lang::EventObject&) +{ + mbIsLayoutPending = true; +} + +void SAL_CALL PresenterToolBar::windowHidden (const lang::EventObject&) {} + +//----- XPaintListener -------------------------------------------------------- +void SAL_CALL PresenterToolBar::windowPaint (const css::awt::PaintEvent& rEvent) +{ + if ( ! mxCanvas.is()) + return; + + if ( ! mbIsPresenterViewActive) + return; + + const rendering::ViewState aViewState ( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + PresenterGeometryHelper::CreatePolygon(rEvent.UpdateRect, mxCanvas->getDevice())); + + if (mbIsLayoutPending) + Layout(mxCanvas); + + Paint(rEvent.UpdateRect, aViewState); + + // Make the back buffer visible. + Reference xSpriteCanvas (mxCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + xSpriteCanvas->updateScreen(false); +} + +//----- XMouseListener -------------------------------------------------------- +void SAL_CALL PresenterToolBar::mousePressed (const css::awt::MouseEvent& rEvent) +{ + ThrowIfDisposed(); + CheckMouseOver(rEvent, true, true); +} + +void SAL_CALL PresenterToolBar::mouseReleased (const css::awt::MouseEvent& rEvent) +{ + ThrowIfDisposed(); + CheckMouseOver(rEvent, true); +} + +void SAL_CALL PresenterToolBar::mouseEntered (const css::awt::MouseEvent& rEvent) +{ + ThrowIfDisposed(); + CheckMouseOver(rEvent, true); +} + +void SAL_CALL PresenterToolBar::mouseExited (const css::awt::MouseEvent& rEvent) +{ + ThrowIfDisposed(); + CheckMouseOver(rEvent, false); + } + +//----- XMouseMotionListener -------------------------------------------------- + +void SAL_CALL PresenterToolBar::mouseMoved (const css::awt::MouseEvent& rEvent) +{ + ThrowIfDisposed(); + CheckMouseOver(rEvent, true); + } + +void SAL_CALL PresenterToolBar::mouseDragged (const css::awt::MouseEvent&) +{ + ThrowIfDisposed(); +} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL PresenterToolBar::setCurrentPage (const Reference& rxSlide) +{ + if (rxSlide != mxCurrentSlide) + { + mxCurrentSlide = rxSlide; + UpdateSlideNumber(); + } +} + +Reference SAL_CALL PresenterToolBar::getCurrentPage() +{ + return mxCurrentSlide; +} + + +void PresenterToolBar::CreateControls ( + const OUString& rsConfigurationPath) +{ + if ( ! mxWindow.is()) + return; + + // Expand the macro in the bitmap file names. + PresenterConfigurationAccess aConfiguration ( + mxComponentContext, + "/org.openoffice.Office.PresenterScreen/", + PresenterConfigurationAccess::READ_ONLY); + + mpCurrentContainerPart = std::make_shared(); + maElementContainer.clear(); + maElementContainer.push_back(mpCurrentContainerPart); + + Reference xToolBarNode ( + aConfiguration.GetConfigurationNode(rsConfigurationPath), + UNO_QUERY); + if (!xToolBarNode.is()) + return; + + Reference xEntries ( + PresenterConfigurationAccess::GetConfigurationNode(xToolBarNode, "Entries"), + UNO_QUERY); + Context aContext; + aContext.mxPresenterHelper = mpPresenterController->GetPresenterHelper(); + aContext.mxCanvas = mxCanvas; + if (xEntries.is() + && aContext.mxPresenterHelper.is() + && aContext.mxCanvas.is()) + { + PresenterConfigurationAccess::ForAll( + xEntries, + [this, &aContext] (OUString const&, uno::Reference const& xProps) + { + return this->ProcessEntry(xProps, aContext); + }); + } +} + +void PresenterToolBar::ProcessEntry ( + const Reference& rxProperties, + Context const & rContext) +{ + if ( ! rxProperties.is()) + return; + + // Type has to be present. + OUString sType; + if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties, "Type") >>= sType)) + return; + + // Read mode specific values. + SharedElementMode pNormalMode = std::make_shared(); + SharedElementMode pMouseOverMode = std::make_shared(); + SharedElementMode pSelectedMode = std::make_shared(); + SharedElementMode pDisabledMode = std::make_shared(); + SharedElementMode pMouseOverSelectedMode = std::make_shared(); + pNormalMode->ReadElementMode(rxProperties, "Normal", pNormalMode, rContext); + pMouseOverMode->ReadElementMode(rxProperties, "MouseOver", pNormalMode, rContext); + pSelectedMode->ReadElementMode(rxProperties, "Selected", pNormalMode, rContext); + pDisabledMode->ReadElementMode(rxProperties, "Disabled", pNormalMode, rContext); + pMouseOverSelectedMode->ReadElementMode(rxProperties, "MouseOverSelected", pSelectedMode, rContext); + + // Create new element. + ::rtl::Reference pElement; + if ( sType == "Button" ) + pElement = Button::Create(this); + else if ( sType == "CurrentTimeLabel" ) + pElement = CurrentTimeLabel::Create(this); + else if ( sType == "PresentationTimeLabel" ) + pElement = PresentationTimeLabel::Create(this); + else if ( sType == "VerticalSeparator" ) + pElement.set(new VerticalSeparator(this)); + else if ( sType == "HorizontalSeparator" ) + pElement.set(new HorizontalSeparator(this)); + else if ( sType == "Label" ) + pElement.set(new Label(this)); + else if ( sType == "ChangeOrientation" ) + { + mpCurrentContainerPart = std::make_shared(); + maElementContainer.push_back(mpCurrentContainerPart); + return; + } + if (pElement.is()) + { + pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode, pMouseOverSelectedMode); + pElement->UpdateState(); + if (mpCurrentContainerPart) + mpCurrentContainerPart->push_back(pElement); + } +} + +void PresenterToolBar::Layout ( + const Reference& rxCanvas) +{ + if (maElementContainer.empty()) + return; + + mbIsLayoutPending = false; + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + ::std::vector aPartSizes (maElementContainer.size()); + geometry::RealSize2D aTotalSize (0,0); + bool bIsHorizontal (true); + sal_Int32 nIndex (0); + double nTotalHorizontalGap (0); + sal_Int32 nGapCount (0); + for (const auto& rxPart : maElementContainer) + { + geometry::RealSize2D aSize (CalculatePartSize(rxCanvas, rxPart, bIsHorizontal)); + + // Remember the size of each part for later. + aPartSizes[nIndex] = aSize; + + // Add gaps between elements. + if (rxPart->size()>1 && bIsHorizontal) + { + nTotalHorizontalGap += (rxPart->size() - 1) * gnGapSize; + nGapCount += rxPart->size() - 1; + } + + // Orientation changes for each part. + bIsHorizontal = !bIsHorizontal; + // Width is accumulated. + aTotalSize.Width += aSize.Width; + // Height is the maximum height of all parts. + aTotalSize.Height = ::std::max(aTotalSize.Height, aSize.Height); + ++nIndex; + } + // Add gaps between parts. + if (maElementContainer.size() > 1) + { + nTotalHorizontalGap += (maElementContainer.size() - 1) * gnGapSize; + nGapCount += maElementContainer.size()-1; + } + + // Done to introduce gap between the end of the toolbar and the last button + aTotalSize.Width += gnGapSize/2; + + // Calculate the minimal size so that the window size of the tool bar + // can be adapted accordingly. + maMinimalSize = aTotalSize; + maMinimalSize.Width += nTotalHorizontalGap; + + // Calculate the gaps between elements. + double nGapWidth (0); + if (nGapCount > 0) + { + if (aTotalSize.Width + nTotalHorizontalGap > aWindowBox.Width) + nTotalHorizontalGap = aWindowBox.Width - aTotalSize.Width; + nGapWidth = nTotalHorizontalGap / nGapCount; + } + + // Determine the location of the left edge. + double nX (0); + switch (meAnchor) + { + case Left : nX = 0; break; + case Center: nX = (aWindowBox.Width - aTotalSize.Width - nTotalHorizontalGap) / 2; break; + } + + // Place the parts. + double nY ((aWindowBox.Height - aTotalSize.Height) / 2); + bIsHorizontal = true; + + /* push front or back ? ... */ + /// check whether RTL interface or not + if(!AllSettings::GetLayoutRTL()){ + nIndex = 0; + for (const auto& rxPart : maElementContainer) + { + geometry::RealRectangle2D aBoundingBox( + nX, nY, + nX+aPartSizes[nIndex].Width, nY+aTotalSize.Height); + + // Add space for gaps between elements. + if (rxPart->size() > 1 && bIsHorizontal) + aBoundingBox.X2 += (rxPart->size() - 1) * nGapWidth; + + LayoutPart(rxCanvas, rxPart, aBoundingBox, aPartSizes[nIndex], bIsHorizontal); + bIsHorizontal = !bIsHorizontal; + nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth; + ++nIndex; + } + } + else { + ElementContainer::iterator iPart; + ElementContainer::iterator iBegin (maElementContainer.begin()); + for (iPart=maElementContainer.end()-1, nIndex=2; iPart!=iBegin-1; --iPart, --nIndex) + { + geometry::RealRectangle2D aBoundingBox( + nX, nY, + nX+aPartSizes[nIndex].Width, nY+aTotalSize.Height); + + // Add space for gaps between elements. + if ((*iPart)->size() > 1) + if (bIsHorizontal) + aBoundingBox.X2 += ((*iPart)->size()-1) * nGapWidth; + + LayoutPart(rxCanvas, *iPart, aBoundingBox, aPartSizes[nIndex], bIsHorizontal); + bIsHorizontal = !bIsHorizontal; + nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth; + } + } + + // The whole window has to be repainted. + std::shared_ptr xManager(mpPresenterController->GetPaintManager()); + if (!xManager) + return; + xManager->Invalidate(mxWindow); +} + +geometry::RealSize2D PresenterToolBar::CalculatePartSize ( + const Reference& rxCanvas, + const SharedElementContainerPart& rpPart, + const bool bIsHorizontal) +{ + geometry::RealSize2D aTotalSize (0,0); + + if (mxWindow.is()) + { + // Calculate the summed width of all elements. + for (const auto& rxElement : *rpPart) + { + if (!rxElement) + continue; + + const awt::Size aBSize (rxElement->GetBoundingSize(rxCanvas)); + if (bIsHorizontal) + { + aTotalSize.Width += aBSize.Width; + if (aBSize.Height > aTotalSize.Height) + aTotalSize.Height = aBSize.Height; + } + else + { + aTotalSize.Height += aBSize.Height; + if (aBSize.Width > aTotalSize.Width) + aTotalSize.Width = aBSize.Width; + } + } + } + return aTotalSize; +} + +void PresenterToolBar::LayoutPart ( + const Reference& rxCanvas, + const SharedElementContainerPart& rpPart, + const geometry::RealRectangle2D& rBoundingBox, + const geometry::RealSize2D& rPartSize, + const bool bIsHorizontal) +{ + double nGap (0); + if (rpPart->size() > 1) + { + if (bIsHorizontal) + nGap = (rBoundingBox.X2 - rBoundingBox.X1 - rPartSize.Width) / (rpPart->size()-1); + else + nGap = (rBoundingBox.Y2 - rBoundingBox.Y1 - rPartSize.Height) / (rpPart->size()-1); + } + + // Place the elements. + double nX (rBoundingBox.X1); + double nY (rBoundingBox.Y1); + + /// check whether RTL interface or not + if(!AllSettings::GetLayoutRTL()){ + for (auto& rxElement : *rpPart) + { + if (!rxElement) + continue; + + const awt::Size aElementSize (rxElement->GetBoundingSize(rxCanvas)); + if (bIsHorizontal) + { + if (rxElement->IsFilling()) + { + nY = rBoundingBox.Y1; + rxElement->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1)); + } + else + nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2; + rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY))); + nX += aElementSize.Width + nGap; + } + else + { + if (rxElement->IsFilling()) + { + nX = rBoundingBox.X1; + rxElement->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aElementSize.Height)); + } + else + nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aElementSize.Width) / 2; + rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY))); + nY += aElementSize.Height + nGap; + } + } + } + else { + ElementContainerPart::const_iterator iElement; + ElementContainerPart::const_iterator iBegin (rpPart->begin()); + + for (iElement=rpPart->end()-1; iElement!=iBegin-1; --iElement) + { + if (iElement->get() == nullptr) + continue; + + const awt::Size aElementSize ((*iElement)->GetBoundingSize(rxCanvas)); + if (bIsHorizontal) + { + if ((*iElement)->IsFilling()) + { + nY = rBoundingBox.Y1; + (*iElement)->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1)); + } + else + nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2; + (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY))); + nX += aElementSize.Width + nGap; + } + else + { + // reverse presentation time with current time + if (iElement==iBegin){ + iElement=iBegin+2; + } + else if (iElement==iBegin+2){ + iElement=iBegin; + } + const awt::Size aNewElementSize ((*iElement)->GetBoundingSize(rxCanvas)); + if ((*iElement)->IsFilling()) + { + nX = rBoundingBox.X1; + (*iElement)->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aNewElementSize.Height)); + } + else + nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aNewElementSize.Width) / 2; + (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY))); + nY += aNewElementSize.Height + nGap; + + // return the index as it was before the reversing + if (iElement==iBegin) + iElement=iBegin+2; + else if (iElement==iBegin+2) + iElement=iBegin; + } + } + } +} + +void PresenterToolBar::Paint ( + const awt::Rectangle& rUpdateBox, + const rendering::ViewState& rViewState) +{ + OSL_ASSERT(mxCanvas.is()); + + for (const auto& rxPart : maElementContainer) + { + for (auto& rxElement : *rxPart) + { + if (rxElement) + { + if ( ! rxElement->IsOutside(rUpdateBox)) + rxElement->Paint(mxCanvas, rViewState); + } + } + } +} + +void PresenterToolBar::UpdateSlideNumber() +{ + if( mxSlideShowController.is() ) + { + for (const auto& rxPart : maElementContainer) + { + for (auto& rxElement : *rxPart) + { + if (rxElement) + rxElement->CurrentSlideHasChanged(); + } + } + } +} + +void PresenterToolBar::CheckMouseOver ( + const css::awt::MouseEvent& rEvent, + const bool bOverWindow, + const bool bMouseDown) +{ + css::awt::MouseEvent rTemp =rEvent; + if(AllSettings::GetLayoutRTL()){ + awt::Rectangle aWindowBox = mxWindow->getPosSize(); + rTemp.X=aWindowBox.Width-rTemp.X; + } + for (const auto& rxPart : maElementContainer) + { + for (auto& rxElement : *rxPart) + { + if (!rxElement) + continue; + + awt::Rectangle aBox (rxElement->GetBoundingBox()); + const bool bIsOver = bOverWindow + && aBox.X <= rTemp.X + && aBox.Width+aBox.X-1 >= rTemp.X + && aBox.Y <= rTemp.Y + && aBox.Height+aBox.Y-1 >= rTemp.Y; + rxElement->SetState( + bIsOver, + bIsOver && rTemp.Buttons!=0 && bMouseDown && rTemp.ClickCount>0); + } + } +} + +void PresenterToolBar::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ( + "PresenterToolBar has already been disposed", + const_cast(static_cast(this))); + } +} + +//===== PresenterToolBarView ================================================== + +PresenterToolBarView::PresenterToolBarView ( + const Reference& rxContext, + const Reference& rxViewId, + const rtl::Reference<::sd::DrawController>& rxController, + const ::rtl::Reference& rpPresenterController) + : PresenterToolBarViewInterfaceBase(m_aMutex), + mxViewId(rxViewId), + mpPresenterController(rpPresenterController) +{ + try + { + Reference xCC(rxController->getConfigurationController(),UNO_SET_THROW); + mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW); + + mxWindow = mxPane->getWindow(); + mxCanvas = mxPane->getCanvas(); + + mpToolBar = new PresenterToolBar( + rxContext, + mxWindow, + mxCanvas, + rpPresenterController, + PresenterToolBar::Center); + mpToolBar->Initialize("PresenterScreenSettings/ToolBars/ToolBar"); + + if (mxWindow.is()) + { + mxWindow->addPaintListener(this); + + Reference xPeer (mxWindow, UNO_QUERY); + if (xPeer.is()) + xPeer->setBackground(util::Color(0xff000000)); + + mxWindow->setVisible(true); + } + } + catch (RuntimeException&) + { + mxViewId = nullptr; + throw; + } +} + +PresenterToolBarView::~PresenterToolBarView() +{ +} + +void SAL_CALL PresenterToolBarView::disposing() +{ + Reference xComponent = mpToolBar; + mpToolBar = nullptr; + if (xComponent.is()) + xComponent->dispose(); + + if (mxWindow.is()) + { + mxWindow->removePaintListener(this); + mxWindow = nullptr; + } + mxCanvas = nullptr; + mxViewId = nullptr; + mxPane = nullptr; + mpPresenterController = nullptr; +} + +const ::rtl::Reference& PresenterToolBarView::GetPresenterToolBar() const +{ + return mpToolBar; +} + +//----- XPaintListener -------------------------------------------------------- + +void SAL_CALL PresenterToolBarView::windowPaint (const css::awt::PaintEvent& rEvent) +{ + awt::Rectangle aWindowBox (mxWindow->getPosSize()); + mpPresenterController->GetCanvasHelper()->Paint( + mpPresenterController->GetViewBackground(mxViewId->getResourceURL()), + mxCanvas, + rEvent.UpdateRect, + awt::Rectangle(0,0,aWindowBox.Width, aWindowBox.Height), + awt::Rectangle()); +} + +//----- lang::XEventListener ------------------------------------------------- + +void SAL_CALL PresenterToolBarView::disposing (const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxWindow) + mxWindow = nullptr; +} + +//----- XResourceId ----------------------------------------------------------- + +Reference SAL_CALL PresenterToolBarView::getResourceId() +{ + return mxViewId; +} + +sal_Bool SAL_CALL PresenterToolBarView::isAnchorOnly() +{ + return false; +} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL PresenterToolBarView::setCurrentPage (const Reference& rxSlide) +{ + Reference xToolBar = mpToolBar; + if (xToolBar.is()) + xToolBar->setCurrentPage(rxSlide); +} + +Reference SAL_CALL PresenterToolBarView::getCurrentPage() +{ + return nullptr; +} + +//===== PresenterToolBar::Element ============================================= + +namespace { + +Element::Element ( + ::rtl::Reference pToolBar) + : ElementInterfaceBase(m_aMutex), + mpToolBar(std::move(pToolBar)), + mbIsOver(false), + mbIsPressed(false), + mbIsSelected(false), + mbIsEnabled(true) +{ + if (mpToolBar) + { + OSL_ASSERT(mpToolBar->GetPresenterController().is()); + OSL_ASSERT(mpToolBar->GetPresenterController()->GetWindowManager().is()); + } +} + +void Element::SetModes ( + const SharedElementMode& rpNormalMode, + const SharedElementMode& rpMouseOverMode, + const SharedElementMode& rpSelectedMode, + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) +{ + mpNormal = rpNormalMode; + mpMouseOver = rpMouseOverMode; + mpSelected = rpSelectedMode; + mpDisabled = rpDisabledMode; + mpMouseOverSelected = rpMouseOverSelectedMode; + mpMode = rpNormalMode; +} + +void Element::disposing() +{ +} + +awt::Size const & Element::GetBoundingSize ( + const Reference& rxCanvas) +{ + maSize = CreateBoundingSize(rxCanvas); + return maSize; +} + +awt::Rectangle Element::GetBoundingBox() const +{ + return awt::Rectangle(maLocation.X,maLocation.Y, maSize.Width, maSize.Height); +} + +void Element::CurrentSlideHasChanged() +{ + UpdateState(); +} + +void Element::SetLocation (const awt::Point& rLocation) +{ + maLocation = rLocation; +} + +void Element::SetSize (const geometry::RealSize2D& rSize) +{ + maSize = awt::Size(sal_Int32(0.5+rSize.Width), sal_Int32(0.5+rSize.Height)); +} + +bool Element::SetState ( + const bool bIsOver, + const bool bIsPressed) +{ + bool bModified (mbIsOver != bIsOver || mbIsPressed != bIsPressed); + bool bClicked (mbIsPressed && bIsOver && ! bIsPressed); + + mbIsOver = bIsOver; + mbIsPressed = bIsPressed; + + // When the element is disabled then ignore mouse over or selection. + // When the element is selected then ignore mouse over. + if ( ! mbIsEnabled) + mpMode = mpDisabled; + else if (mbIsSelected && mbIsOver) + mpMode = mpMouseOverSelected; + else if (mbIsSelected) + mpMode = mpSelected; + else if (mbIsOver) + mpMode = mpMouseOver; + else + mpMode = mpNormal; + + if (bClicked && mbIsEnabled) + { + if (mpMode) + { + do + { + if (mpMode->msAction.isEmpty()) + break; + + if (!mpToolBar) + break; + + if (!mpToolBar->GetPresenterController()) + break; + + mpToolBar->GetPresenterController()->DispatchUnoCommand(mpMode->msAction); + mpToolBar->RequestLayout(); + } + while (false); + } + + } + else if (bModified) + { + Invalidate(true); + } + + return bModified; +} + +void Element::Invalidate (const bool bSynchronous) +{ + OSL_ASSERT(mpToolBar.is()); + mpToolBar->InvalidateArea(GetBoundingBox(), bSynchronous); +} + +bool Element::IsOutside (const awt::Rectangle& rBox) +{ + if (rBox.X >= maLocation.X+maSize.Width) + return true; + else if (rBox.Y >= maLocation.Y+maSize.Height) + return true; + else if (maLocation.X >= rBox.X+rBox.Width) + return true; + else if (maLocation.Y >= rBox.Y+rBox.Height) + return true; + else + return false; +} + + +bool Element::IsFilling() const +{ + return false; +} + +void Element::UpdateState() +{ + OSL_ASSERT(mpToolBar); + OSL_ASSERT(mpToolBar->GetPresenterController()); + + if (!mpMode) + return; + + util::URL aURL (mpToolBar->GetPresenterController()->CreateURLFromString(mpMode->msAction)); + Reference xDispatch (mpToolBar->GetPresenterController()->GetDispatch(aURL)); + if (xDispatch.is()) + { + xDispatch->addStatusListener(this, aURL); + xDispatch->removeStatusListener(this, aURL); + } +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL Element::disposing (const css::lang::EventObject&) {} + +//----- document::XEventListener ---------------------------------------------- + +void SAL_CALL Element::notifyEvent (const css::document::EventObject&) +{ + UpdateState(); +} + +//----- frame::XStatusListener ------------------------------------------------ + +void SAL_CALL Element::statusChanged (const css::frame::FeatureStateEvent& rEvent) +{ + bool bIsSelected (mbIsSelected); + bool bIsEnabled (rEvent.IsEnabled); + rEvent.State >>= bIsSelected; + + if (bIsSelected != mbIsSelected || bIsEnabled != mbIsEnabled) + { + mbIsEnabled = bIsEnabled; + mbIsSelected = bIsSelected; + SetState(mbIsOver, mbIsPressed); + mpToolBar->RequestLayout(); + } +} + +} // end of anonymous namespace + +//===== ElementMode =========================================================== + +namespace { + +ElementMode::ElementMode() +{ +} + +void ElementMode::ReadElementMode ( + const Reference& rxElementProperties, + const OUString& rsModeName, + std::shared_ptr const & rpDefaultMode, + ::sdext::presenter::PresenterToolBar::Context const & rContext) +{ + try + { + Reference xNode ( + PresenterConfigurationAccess::GetProperty(rxElementProperties, rsModeName), + UNO_QUERY); + Reference xProperties ( + PresenterConfigurationAccess::GetNodeProperties(xNode, OUString())); + if (!xProperties.is() && rpDefaultMode != nullptr) + { + // The mode is not specified. Use the given, possibly empty, + // default mode instead. + mpIcon = rpDefaultMode->mpIcon; + msAction = rpDefaultMode->msAction; + maText = rpDefaultMode->maText; + } + + // Read action. + if ( ! (PresenterConfigurationAccess::GetProperty(xProperties, "Action") >>= msAction)) + if (rpDefaultMode != nullptr) + msAction = rpDefaultMode->msAction; + + // Read text and font + OUString sText(rpDefaultMode != nullptr ? rpDefaultMode->maText.GetText() : OUString()); + PresenterConfigurationAccess::GetProperty(xProperties, "Text") >>= sText; + Reference xFontNode ( + PresenterConfigurationAccess::GetProperty(xProperties, "Font"), UNO_QUERY); + PresenterTheme::SharedFontDescriptor pFont(PresenterTheme::ReadFont( + xFontNode, rpDefaultMode != nullptr ? rpDefaultMode->maText.GetFont() + : PresenterTheme::SharedFontDescriptor())); + maText = Text(sText,pFont); + + // Read bitmaps to display as icons. + Reference xIconNode ( + PresenterConfigurationAccess::GetProperty(xProperties, "Icon"), UNO_QUERY); + mpIcon = PresenterBitmapContainer::LoadBitmap( + xIconNode, "", rContext.mxPresenterHelper, rContext.mxCanvas, + rpDefaultMode != nullptr ? rpDefaultMode->mpIcon : SharedBitmapDescriptor()); + } + catch(Exception&) + { + OSL_ASSERT(false); + } +} + +} // end of anonymous namespace + +//===== Button ================================================================ + +namespace { + +::rtl::Reference Button::Create ( + const ::rtl::Reference& rpToolBar) +{ + ::rtl::Reference
  • \r\n"); + } + } + while(nCurrentDepth >= 0) + { + aStr.append("
\r\n"); + nCurrentDepth--; + } + pOutliner->Clear(); +} + +void WriteTable(OUStringBuffer& aStr, SdrTableObj const * pTableObject, SdrOutliner* pOutliner) +{ + CellPos aStart, aEnd; + + aStart = SdrTableObj::getFirstCell(); + aEnd = pTableObject->getLastCell(); + + sal_Int32 nColCount = pTableObject->getColumnCount(); + aStr.append("\r\n"); + for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++) + { + aStr.append(" \r\n"); + for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++) + { + aStr.append(" \r\n"); + } + aStr.append(" \r\n"); + } + aStr.append("
\r\n"); + sal_Int32 nCellIndex = nRow * nColCount + nCol; + SdrText* pText = pTableObject->getText(nCellIndex); + + if (pText == nullptr) + continue; + WriteOutlinerParagraph(aStr, pOutliner, pText->GetOutlinerParaObject(), false); + aStr.append("
\r\n"); +} + +void WriteObjectGroup(OUStringBuffer& aStr, SdrObjGroup const * pObjectGroup, SdrOutliner* pOutliner, + bool bHeadLine) +{ + SdrObjListIter aGroupIterator(pObjectGroup->GetSubList(), SdrIterMode::DeepNoGroups); + while (aGroupIterator.IsMore()) + { + SdrObject* pCurrentObject = aGroupIterator.Next(); + if (pCurrentObject->GetObjIdentifier() == SdrObjKind::Group) + { + SdrObjGroup* pCurrentGroupObject = static_cast(pCurrentObject); + WriteObjectGroup(aStr, pCurrentGroupObject, pOutliner, bHeadLine); + } + else + { + OutlinerParaObject* pOutlinerParagraphObject = pCurrentObject->GetOutlinerParaObject(); + if (pOutlinerParagraphObject != nullptr) + { + WriteOutlinerParagraph(aStr, pOutliner, pOutlinerParagraphObject, bHeadLine); + } + } + } +} + +// get SdrTextObject with layout text of this page +SdrTextObj* GetLayoutTextObject(SdrPage const * pPage) +{ + SdrTextObj* pResult = nullptr; + + for (const rtl::Reference& pObject : *pPage) + { + if (pObject->GetObjInventor() == SdrInventor::Default && + pObject->GetObjIdentifier() == SdrObjKind::OutlineText) + { + pResult = static_cast(pObject.get()); + break; + } + } + return pResult; +} + + +/** creates an outliner text for the title objects of a page + */ +OUString CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage ) +{ + SdrTextObj* pTO = static_cast(pPage->GetPresObj(PresObjKind::Title)); + if(!pTO) + pTO = GetLayoutTextObject(pPage); + + if (pTO && !pTO->IsEmptyPresObj()) + { + OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject(); + if(pOPO && pOutliner->GetParagraphCount() != 0) + { + pOutliner->Clear(); + pOutliner->SetText(*pOPO); + return ParagraphToHTMLString(pOutliner, 0); + } + } + + return OUString(); +} + +// creates an outliner text for a page +OUString CreateTextForPage(SdrOutliner* pOutliner, SdPage const * pPage, + bool bHeadLine) +{ + OUStringBuffer aStr; + + for (const rtl::Reference& pObject : *pPage) + { + PresObjKind eKind = pPage->GetPresObjKind(pObject.get()); + + switch (eKind) + { + case PresObjKind::NONE: + { + if (pObject->GetObjIdentifier() == SdrObjKind::Group) + { + SdrObjGroup* pObjectGroup = static_cast(pObject.get()); + WriteObjectGroup(aStr, pObjectGroup, pOutliner, false); + } + else if (pObject->GetObjIdentifier() == SdrObjKind::Table) + { + SdrTableObj* pTableObject = static_cast(pObject.get()); + WriteTable(aStr, pTableObject, pOutliner); + } + else + { + if (pObject->GetOutlinerParaObject()) + { + WriteOutlinerParagraph(aStr, pOutliner, pObject->GetOutlinerParaObject(), false); + } + } + } + break; + + case PresObjKind::Table: + { + SdrTableObj* pTableObject = static_cast(pObject.get()); + WriteTable(aStr, pTableObject, pOutliner); + } + break; + + case PresObjKind::Text: + case PresObjKind::Outline: + { + SdrTextObj* pTextObject = static_cast(pObject.get()); + if (pTextObject->IsEmptyPresObj()) + continue; + WriteOutlinerParagraph(aStr, pOutliner, pTextObject->GetOutlinerParaObject(), bHeadLine); + } + break; + + default: + break; + } + } + return aStr.makeStringAndClear(); +} + +} // namespace + +constexpr OUStringLiteral gaHTMLHeader( + u"\r\n" + "\r\n\r\n" ); + +constexpr OUStringLiteral gaHTMLExtension = u"" STR_HTMLEXP_DEFAULT_EXTENSION; + +// constructor for the html export helper classes +HtmlExport::HtmlExport( + OUString aPath, + SdDrawDocument* pExpDoc, + sd::DrawDocShell* pDocShell ) + : maPath(std::move( aPath )), + mpDoc(pExpDoc), + mpDocSh( pDocShell ) +{ + bool bChange = mpDoc->IsChanged(); + + Init(); + + ExportSingleDocument(); + + mpDoc->SetChanged(bChange); +} + +HtmlExport::~HtmlExport() +{ +} + +void HtmlExport::Init() +{ + SdPage* pPage = mpDoc->GetSdPage(0, PageKind::Standard); + + // we come up with a destination... + INetURLObject aINetURLObj( maPath ); + DBG_ASSERT( aINetURLObj.GetProtocol() != INetProtocol::NotValid, "invalid URL" ); + + maExportPath = aINetURLObj.GetPartBeforeLastName(); // with trailing '/' + maIndex = aINetURLObj.GetLastName(); + + mnSdPageCount = mpDoc->GetSdPageCount( PageKind::Standard ); + for( sal_uInt16 nPage = 0; nPage < mnSdPageCount; nPage++ ) + { + pPage = mpDoc->GetSdPage( nPage, PageKind::Standard ); + + maPages.push_back( pPage ); + } + mnSdPageCount = maPages.size(); + + maDocFileName = maIndex; +} + +void HtmlExport::ExportSingleDocument() +{ + SdrOutliner* pOutliner = mpDoc->GetInternalOutliner(); + + mnPagesWritten = 0; + InitProgress(mnSdPageCount); + + OUStringBuffer aStr(gaHTMLHeader + + DocumentMetadata() + + "\r\n" + "\r\n" + "\r\n"); + + for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; ++nSdPage) + { + SdPage* pPage = maPages[nSdPage]; + + // page title + OUString sTitleText(CreateTextForTitle(pOutliner, pPage)); + OUString sStyle; + + if (nSdPage != 0) // First page - no need for a page break here + sStyle += "page-break-before:always; "; + sStyle += getParagraphStyle(pOutliner, 0); + + lclAppendStyle(aStr, u"h1", sStyle); + + aStr.append(sTitleText + "\r\n"); + + // write outline text + aStr.append(CreateTextForPage( pOutliner, pPage, true)); + + if (mpProgress) + mpProgress->SetState(++mnPagesWritten); + + } + + // close page + aStr.append("\r\n"); + + WriteHtml(maDocFileName, false, aStr); + + pOutliner->Clear(); + ResetProgress(); +} + +void HtmlExport::InitProgress( sal_uInt16 nProgrCount ) +{ + mpProgress.reset(new SfxProgress( mpDocSh, SdResId(STR_CREATE_PAGES), nProgrCount )); +} + +void HtmlExport::ResetProgress() +{ + mpProgress.reset(); +} + +OUString HtmlExport::DocumentMetadata() const +{ + SvMemoryStream aStream; + + uno::Reference xDocProps; + if (mpDocSh) + { + uno::Reference xDPS( + mpDocSh->GetModel(), uno::UNO_QUERY_THROW); + xDocProps.set(xDPS->getDocumentProperties()); + } + + SfxFrameHTMLWriter::Out_DocInfo(aStream, maDocFileName, xDocProps, + " "); + + const sal_uInt64 nLen = aStream.GetSize(); + OSL_ENSURE(nLen < o3tl::make_unsigned(SAL_MAX_INT32), "Stream can't fit in OString"); + std::string_view aData(static_cast(aStream.GetData()), static_cast(nLen)); + + return OStringToOUString(aData, RTL_TEXTENCODING_UTF8); +} + +/** exports the given html data into a non unicode file in the current export path with + the given filename */ +bool HtmlExport::WriteHtml( const OUString& rFileName, bool bAddExtension, std::u16string_view rHtmlData ) +{ + ErrCode nErr = ERRCODE_NONE; + + OUString aFileName( rFileName ); + if( bAddExtension ) + aFileName += gaHTMLExtension; + + EasyFile aFile; + SvStream* pStr; + OUString aFull(maExportPath + aFileName); + nErr = aFile.createStream(aFull , pStr); + if(nErr == ERRCODE_NONE) + { + OString aStr(OUStringToOString(rHtmlData, RTL_TEXTENCODING_UTF8)); + pStr->WriteOString( aStr ); + aFile.close(); + } + + if( nErr != ERRCODE_NONE ) + ErrorHandler::HandleError(nErr); + + return nErr == ERRCODE_NONE; +} + +EasyFile::EasyFile() : bOpen(false) +{ +} + +EasyFile::~EasyFile() +{ + if( bOpen ) + close(); +} + +ErrCode EasyFile::createStream( const OUString& rUrl, SvStream* &rpStr ) +{ + if(bOpen) + close(); + + OUString aFileName; + createFileName( rUrl, aFileName ); + + ErrCode nErr = ERRCODE_NONE; + pOStm = ::utl::UcbStreamHelper::CreateStream( aFileName, StreamMode::WRITE | StreamMode::TRUNC ); + if( pOStm ) + { + bOpen = true; + nErr = pOStm->GetError(); + } + else + { + nErr = ERRCODE_SFX_CANTCREATECONTENT; + } + + if( nErr != ERRCODE_NONE ) + { + bOpen = false; + pOStm.reset(); + } + + rpStr = pOStm.get(); + + return nErr; +} + +void EasyFile::createFileName( const OUString& rURL, OUString& rFileName ) +{ + if( bOpen ) + close(); + + INetURLObject aURL( rURL ); + + if( aURL.GetProtocol() == INetProtocol::NotValid ) + { + OUString aURLStr; + osl::FileBase::getFileURLFromSystemPath( rURL, aURLStr ); + aURL = INetURLObject( aURLStr ); + } + DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" ); + rFileName = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ); +} + +void EasyFile::close() +{ + pOStm.reset(); + bOpen = false; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/html/htmlex.hxx b/sd/source/filter/html/htmlex.hxx new file mode 100644 index 0000000000..719c8cf273 --- /dev/null +++ b/sd/source/filter/html/htmlex.hxx @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd { class DrawDocShell; } + +class OutlinerParaObject; +class SfxItemSet; +class SfxProgress; +class SdrOutliner; +class SdPage; +class HtmlState; +class SdrTextObj; +class SdrObjGroup; +namespace sdr::table { class SdrTableObj; } +class SdrPage; +class SdDrawDocument; + +/// this class exports an Impress Document as a HTML Presentation. +class HtmlExport final +{ + std::vector< SdPage* > maPages; + + OUString maPath; + + SdDrawDocument* mpDoc; + ::sd::DrawDocShell* mpDocSh; + + std::unique_ptr mpProgress; + sal_uInt16 mnSdPageCount; + sal_uInt16 mnPagesWritten; + OUString maIndex; + OUString maDocFileName; + + OUString maExportPath; ///< output directory or URL. + + void InitProgress( sal_uInt16 nProgrCount ); + void ResetProgress(); + + /// Output document metadata. + OUString DocumentMetadata() const; + + void Init(); + void ExportSingleDocument(); + + bool WriteHtml( const OUString& rFileName, bool bAddExtension, std::u16string_view rHtmlData ); + + public: + HtmlExport(OUString aPath, + SdDrawDocument* pExpDoc, + sd::DrawDocShell* pDocShell); + + ~HtmlExport(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/html/htmlpublishmode.hxx b/sd/source/filter/html/htmlpublishmode.hxx new file mode 100644 index 0000000000..3ba7eeb809 --- /dev/null +++ b/sd/source/filter/html/htmlpublishmode.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +enum HtmlPublishMode +{ + PUBLISH_HTML, + PUBLISH_FRAMES, + PUBLISH_WEBCAST, + PUBLISH_KIOSK, + PUBLISH_SINGLE_DOCUMENT +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/html/pubdlg.cxx b/sd/source/filter/html/pubdlg.cxx new file mode 100644 index 0000000000..5b42d3c8cf --- /dev/null +++ b/sd/source/filter/html/pubdlg.cxx @@ -0,0 +1,315 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "htmlattr.hxx" +#include "htmlpublishmode.hxx" +#include +#include "buttonset.hxx" +#include + +using namespace com::sun::star::uno; +using namespace com::sun::star::beans; + +#define NOOFPAGES 6 + +//ID for the config-data with the HTML-settings +const sal_uInt16 nMagic = sal_uInt16(0x1977); + +// Key for the soffice.ini +constexpr OUStringLiteral KEY_QUALITY = u"JPG-EXPORT-QUALITY"; + +static SvStream& operator>>(SvStream& rIn, SdPublishingDesign& rDesign); + +static SvStream& WriteSdPublishingDesign(SvStream& rOut, const SdPublishingDesign& rDesign); + +// This class has all the settings for the HTML-export autopilot +class SdPublishingDesign +{ +public: + OUString m_aDesignName; + + HtmlPublishMode m_eMode; + + // special WebCast options + PublishingScript m_eScript; + OUString m_aCGI; + OUString m_aURL; + + // special Kiosk options + bool m_bAutoSlide; + sal_uInt32 m_nSlideDuration; + bool m_bEndless; + + // special HTML options + bool m_bContentPage; + bool m_bNotes; + + // misc options + sal_uInt16 m_nResolution; + OUString m_aCompression; + PublishingFormat m_eFormat; + bool m_bSlideSound; + bool m_bHiddenSlides; + + // title page information + OUString m_aAuthor; + OUString m_aEMail; + OUString m_aWWW; + OUString m_aMisc; + bool m_bDownload; + bool m_bCreated; // not used + + // buttons and colorscheme + sal_Int16 m_nButtonThema; + bool m_bUserAttr; + Color m_aBackColor; + Color m_aTextColor; + Color m_aLinkColor; + Color m_aVLinkColor; + Color m_aALinkColor; + bool m_bUseAttribs; + bool m_bUseColor; + + SdPublishingDesign(); + + bool operator==(const SdPublishingDesign& rDesign) const; + friend SvStream& operator>>(SvStream& rIn, SdPublishingDesign& rDesign); + friend SvStream& WriteSdPublishingDesign(SvStream& rOut, const SdPublishingDesign& rDesign); +}; + +// load Default-settings +SdPublishingDesign::SdPublishingDesign() + : m_eMode(PUBLISH_HTML) + , m_eScript(SCRIPT_ASP) + , m_bAutoSlide(true) + , m_nSlideDuration(15) + , m_bEndless(true) + , m_bContentPage(true) + , m_bNotes(true) + , m_nResolution(PUB_LOWRES_WIDTH) + , m_eFormat(FORMAT_PNG) + , m_bSlideSound(true) + , m_bHiddenSlides(false) + , m_bDownload(false) + , m_bCreated(false) + , m_nButtonThema(-1) + , m_bUserAttr(false) + , m_aBackColor(COL_WHITE) + , m_aTextColor(COL_BLACK) + , m_aLinkColor(COL_BLUE) + , m_aVLinkColor(COL_LIGHTGRAY) + , m_aALinkColor(COL_GRAY) + , m_bUseAttribs(true) + , m_bUseColor(true) +{ + FilterConfigItem aFilterConfigItem(u"Office.Common/Filter/Graphic/Export/JPG"); + sal_Int32 nCompression = aFilterConfigItem.ReadInt32(KEY_QUALITY, 75); + m_aCompression = OUString::number(nCompression) + "%"; + + SvtUserOptions aUserOptions; + m_aAuthor = aUserOptions.GetFirstName(); + if (!m_aAuthor.isEmpty() && !aUserOptions.GetLastName().isEmpty()) + m_aAuthor += " "; + m_aAuthor += aUserOptions.GetLastName(); + m_aEMail = aUserOptions.GetEmail(); +} + +// Compares the values without paying attention to the name +bool SdPublishingDesign::operator==(const SdPublishingDesign& rDesign) const +{ + return ( + m_eMode == rDesign.m_eMode && m_nResolution == rDesign.m_nResolution + && m_aCompression == rDesign.m_aCompression && m_eFormat == rDesign.m_eFormat + && m_bHiddenSlides == rDesign.m_bHiddenSlides + && ( // compare html options + (m_eMode != PUBLISH_HTML && m_eMode != PUBLISH_FRAMES) + || (m_bContentPage == rDesign.m_bContentPage && m_bNotes == rDesign.m_bNotes + && m_aAuthor == rDesign.m_aAuthor && m_aEMail == rDesign.m_aEMail + && m_aWWW == rDesign.m_aWWW && m_aMisc == rDesign.m_aMisc + && m_bDownload == rDesign.m_bDownload && m_nButtonThema == rDesign.m_nButtonThema + && m_bUserAttr == rDesign.m_bUserAttr && m_aBackColor == rDesign.m_aBackColor + && m_aTextColor == rDesign.m_aTextColor && m_aLinkColor == rDesign.m_aLinkColor + && m_aVLinkColor == rDesign.m_aVLinkColor + && m_aALinkColor == rDesign.m_aALinkColor + && m_bUseAttribs == rDesign.m_bUseAttribs + && m_bSlideSound == rDesign.m_bSlideSound && m_bUseColor == rDesign.m_bUseColor)) + && ( // compare kiosk options + (m_eMode != PUBLISH_KIOSK) + || (m_bAutoSlide == rDesign.m_bAutoSlide && m_bSlideSound == rDesign.m_bSlideSound + && (!m_bAutoSlide + || (m_nSlideDuration == rDesign.m_nSlideDuration + && m_bEndless == rDesign.m_bEndless)))) + && ( // compare WebCast options + (m_eMode != PUBLISH_WEBCAST) + || (m_eScript == rDesign.m_eScript + && (m_eScript != SCRIPT_PERL + || (m_aURL == rDesign.m_aURL && m_aCGI == rDesign.m_aCGI))))); +} + +// Load the design from the stream +SvStream& operator>>(SvStream& rIn, SdPublishingDesign& rDesign) +{ + SdIOCompat aIO(rIn, StreamMode::READ); + + sal_uInt16 nTemp16; + tools::GenericTypeSerializer aSerializer(rIn); + + rDesign.m_aDesignName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rIn.ReadUInt16(nTemp16); + rDesign.m_eMode = static_cast(nTemp16); + rIn.ReadCharAsBool(rDesign.m_bContentPage); + rIn.ReadCharAsBool(rDesign.m_bNotes); + rIn.ReadUInt16(rDesign.m_nResolution); + rDesign.m_aCompression = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rIn.ReadUInt16(nTemp16); + rDesign.m_eFormat = static_cast(nTemp16); + rDesign.m_aAuthor = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rDesign.m_aEMail = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rDesign.m_aWWW = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rDesign.m_aMisc = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rIn.ReadCharAsBool(rDesign.m_bDownload); + rIn.ReadCharAsBool(rDesign.m_bCreated); // not used + rIn.ReadInt16(rDesign.m_nButtonThema); + rIn.ReadCharAsBool(rDesign.m_bUserAttr); + aSerializer.readColor(rDesign.m_aBackColor); + aSerializer.readColor(rDesign.m_aTextColor); + aSerializer.readColor(rDesign.m_aLinkColor); + aSerializer.readColor(rDesign.m_aVLinkColor); + aSerializer.readColor(rDesign.m_aALinkColor); + rIn.ReadCharAsBool(rDesign.m_bUseAttribs); + rIn.ReadCharAsBool(rDesign.m_bUseColor); + + rIn.ReadUInt16(nTemp16); + rDesign.m_eScript = static_cast(nTemp16); + rDesign.m_aURL = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + rDesign.m_aCGI = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn, RTL_TEXTENCODING_UTF8); + + rIn.ReadCharAsBool(rDesign.m_bAutoSlide); + rIn.ReadUInt32(rDesign.m_nSlideDuration); + rIn.ReadCharAsBool(rDesign.m_bEndless); + rIn.ReadCharAsBool(rDesign.m_bSlideSound); + rIn.ReadCharAsBool(rDesign.m_bHiddenSlides); + + return rIn; +} + +// Set the design to the stream +SvStream& WriteSdPublishingDesign(SvStream& rOut, const SdPublishingDesign& rDesign) +{ + // The last parameter is the versionnumber of the code + SdIOCompat aIO(rOut, StreamMode::WRITE, 0); + + tools::GenericTypeSerializer aSerializer(rOut); + + // Name + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aDesignName, + RTL_TEXTENCODING_UTF8); + + rOut.WriteUInt16(rDesign.m_eMode); + rOut.WriteBool(rDesign.m_bContentPage); + rOut.WriteBool(rDesign.m_bNotes); + rOut.WriteUInt16(rDesign.m_nResolution); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aCompression, + RTL_TEXTENCODING_UTF8); + rOut.WriteUInt16(rDesign.m_eFormat); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aAuthor, RTL_TEXTENCODING_UTF8); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aEMail, RTL_TEXTENCODING_UTF8); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aWWW, RTL_TEXTENCODING_UTF8); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aMisc, RTL_TEXTENCODING_UTF8); + rOut.WriteBool(rDesign.m_bDownload); + rOut.WriteBool(rDesign.m_bCreated); // not used + rOut.WriteInt16(rDesign.m_nButtonThema); + rOut.WriteBool(rDesign.m_bUserAttr); + aSerializer.writeColor(rDesign.m_aBackColor); + aSerializer.writeColor(rDesign.m_aTextColor); + aSerializer.writeColor(rDesign.m_aLinkColor); + aSerializer.writeColor(rDesign.m_aVLinkColor); + aSerializer.writeColor(rDesign.m_aALinkColor); + rOut.WriteBool(rDesign.m_bUseAttribs); + rOut.WriteBool(rDesign.m_bUseColor); + + rOut.WriteUInt16(rDesign.m_eScript); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aURL, RTL_TEXTENCODING_UTF8); + write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aCGI, RTL_TEXTENCODING_UTF8); + + rOut.WriteBool(rDesign.m_bAutoSlide); + rOut.WriteUInt32(rDesign.m_nSlideDuration); + rOut.WriteBool(rDesign.m_bEndless); + rOut.WriteBool(rDesign.m_bSlideSound); + rOut.WriteBool(rDesign.m_bHiddenSlides); + + return rOut; +} + +namespace +{ +// Dialog for the entry of the name of the design +class SdDesignNameDlg : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xEdit; + std::unique_ptr m_xBtnOK; + +public: + SdDesignNameDlg(weld::Window* pWindow, const OUString& aName); + OUString GetDesignName() const; + DECL_LINK(ModifyHdl, weld::Entry&, void); +}; +} + +// SdDesignNameDlg Methods +SdDesignNameDlg::SdDesignNameDlg(weld::Window* pWindow, const OUString& rName) + : GenericDialogController(pWindow, "modules/sdraw/ui/namedesign.ui", "NameDesignDialog") + , m_xEdit(m_xBuilder->weld_entry("entry")) + , m_xBtnOK(m_xBuilder->weld_button("ok")) +{ + m_xEdit->connect_changed(LINK(this, SdDesignNameDlg, ModifyHdl)); + m_xEdit->set_text(rName); + m_xBtnOK->set_sensitive(!rName.isEmpty()); +} + +OUString SdDesignNameDlg::GetDesignName() const { return m_xEdit->get_text(); } + +IMPL_LINK_NOARG(SdDesignNameDlg, ModifyHdl, weld::Entry&, void) +{ + m_xBtnOK->set_sensitive(!m_xEdit->get_text().isEmpty()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/html/sdhtmlfilter.cxx b/sd/source/filter/html/sdhtmlfilter.cxx new file mode 100644 index 0000000000..57053e6b8b --- /dev/null +++ b/sd/source/filter/html/sdhtmlfilter.cxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include "htmlex.hxx" +#include + +SdHTMLFilter::SdHTMLFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell) + : SdFilter(rMedium, rDocShell) +{ +} + +SdHTMLFilter::~SdHTMLFilter() {} + +bool SdHTMLFilter::Export() +{ + mrMedium.Close(); + mrMedium.Commit(); + + HtmlExport aExport(mrMedium.GetName(), &mrDocument, &mrDocShell); + + return true; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/pdf/sdpdffilter.cxx b/sd/source/filter/pdf/sdpdffilter.cxx new file mode 100644 index 0000000000..c0800010e1 --- /dev/null +++ b/sd/source/filter/pdf/sdpdffilter.cxx @@ -0,0 +1,204 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include + +using namespace css; + +SdPdfFilter::SdPdfFilter(SfxMedium& rMedium, sd::DrawDocShell& rDocShell) + : SdFilter(rMedium, rDocShell) +{ +} + +SdPdfFilter::~SdPdfFilter() {} + +bool SdPdfFilter::Import() +{ + const OUString aFileName( + mrMedium.GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::NONE)); + + std::vector aGraphics; + if (vcl::ImportPDFUnloaded(aFileName, aGraphics) == 0) + return false; + + bool bWasLocked = mrDocument.isLocked(); + mrDocument.setLock(true); + const bool bSavedUndoEnabled = mrDocument.IsUndoEnabled(); + mrDocument.EnableUndo(false); + + // Add as many pages as we need up-front. + mrDocument.CreateFirstPages(); + for (size_t i = 0; i < aGraphics.size() - 1; ++i) + { + mrDocument.DuplicatePage(0); + } + + for (vcl::PDFGraphicResult const& rPDFGraphicResult : aGraphics) + { + const Graphic& rGraphic = rPDFGraphicResult.GetGraphic(); + const Size& aSizeHMM = rPDFGraphicResult.GetSize(); + + const sal_Int32 nPageNumber = rGraphic.getPageNumber(); + assert(nPageNumber >= 0 && o3tl::make_unsigned(nPageNumber) < aGraphics.size()); + + // Create the page and insert the Graphic. + SdPage* pPage = mrDocument.GetSdPage(nPageNumber, PageKind::Standard); + if (!pPage) // failed to duplicate page, out of memory? + return false; + + // Make the page size match the rendered image. + pPage->SetSize(aSizeHMM); + + rtl::Reference pSdrGrafObj = new SdrGrafObj( + pPage->getSdrModelFromSdrPage(), rGraphic, tools::Rectangle(Point(), aSizeHMM)); + + pSdrGrafObj->SetResizeProtect(true); + pSdrGrafObj->SetMoveProtect(true); + + pPage->InsertObject(pSdrGrafObj.get()); + + for (auto const& rPDFAnnotation : rPDFGraphicResult.GetAnnotations()) + { + rtl::Reference xAnnotation; + pPage->createAnnotation(xAnnotation); + + xAnnotation->setAuthor(rPDFAnnotation.maAuthor); + + uno::Reference xText(xAnnotation->getTextRange()); + xText->setString(rPDFAnnotation.maText); + // position is in mm not 100thmm + geometry::RealPoint2D aUnoPosition(rPDFAnnotation.maRectangle.getMinX() / 100.0, + rPDFAnnotation.maRectangle.getMinY() / 100.00); + geometry::RealSize2D aUnoSize(rPDFAnnotation.maRectangle.getWidth() / 100.0, + rPDFAnnotation.maRectangle.getHeight() / 100.00); + xAnnotation->setPosition(aUnoPosition); + xAnnotation->setSize(aUnoSize); + xAnnotation->setDateTime(rPDFAnnotation.maDateTime); + + if (rPDFAnnotation.mpMarker) + { + xAnnotation->createCustomAnnotationMarker(); + sd::CustomAnnotationMarker& rCustomAnnotationMarker + = xAnnotation->getCustomAnnotationMarker(); + + rCustomAnnotationMarker.maLineColor = rPDFAnnotation.maColor; + + if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Polygon) + { + auto* pMarker = static_cast( + rPDFAnnotation.mpMarker.get()); + rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth; + rCustomAnnotationMarker.maFillColor = pMarker->maFillColor; + rCustomAnnotationMarker.maPolygons.push_back(pMarker->maPolygon); + } + else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Square) + { + auto* pMarker = static_cast( + rPDFAnnotation.mpMarker.get()); + basegfx::B2DPolygon aPoly + = basegfx::utils::createPolygonFromRect(rPDFAnnotation.maRectangle); + rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth; + rCustomAnnotationMarker.maFillColor = pMarker->maFillColor; + rCustomAnnotationMarker.maPolygons.push_back(aPoly); + } + else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Circle) + { + auto* pMarker = static_cast( + rPDFAnnotation.mpMarker.get()); + + basegfx::B2DPoint rCenter = rPDFAnnotation.maRectangle.getCenter(); + double fRadiusX = rPDFAnnotation.maRectangle.getWidth() / 2; + double fRadiusY = rPDFAnnotation.maRectangle.getHeight() / 2; + + basegfx::B2DPolygon aPoly + = basegfx::utils::createPolygonFromEllipse(rCenter, fRadiusX, fRadiusY); + rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth; + rCustomAnnotationMarker.maFillColor = pMarker->maFillColor; + rCustomAnnotationMarker.maPolygons.push_back(aPoly); + } + else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Ink) + { + auto* pMarker = static_cast( + rPDFAnnotation.mpMarker.get()); + rCustomAnnotationMarker.maPolygons.insert( + rCustomAnnotationMarker.maPolygons.end(), pMarker->maStrokes.begin(), + pMarker->maStrokes.end()); + rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth; + rCustomAnnotationMarker.maFillColor = pMarker->maFillColor; + } + else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Highlight) + { + if (!rCustomAnnotationMarker.maLineColor.IsTransparent()) + rCustomAnnotationMarker.maLineColor.SetAlpha(255 - 0x90); + auto* pMarker = static_cast( + rPDFAnnotation.mpMarker.get()); + rCustomAnnotationMarker.maPolygons.insert( + rCustomAnnotationMarker.maPolygons.end(), pMarker->maQuads.begin(), + pMarker->maQuads.end()); + rCustomAnnotationMarker.mnLineWidth = 1; + rCustomAnnotationMarker.maFillColor = rPDFAnnotation.maColor; + if (!rCustomAnnotationMarker.maFillColor.IsTransparent()) + rCustomAnnotationMarker.maFillColor.SetAlpha(255 - 0x90); + } + else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Line) + { + auto* pMarker = static_cast( + rPDFAnnotation.mpMarker.get()); + + basegfx::B2DPolygon aPoly; + aPoly.append(pMarker->maLineStart); + aPoly.append(pMarker->maLineEnd); + rCustomAnnotationMarker.maPolygons.push_back(aPoly); + + rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth; + rCustomAnnotationMarker.maFillColor = COL_TRANSPARENT; + } + } + else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::FreeText) + { + xAnnotation->setIsFreeText(true); + } + } + } + mrDocument.setLock(bWasLocked); + mrDocument.EnableUndo(bSavedUndoEnabled); + return true; +} + +bool SdPdfFilter::Export() { return false; } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/ppt97animations.cxx b/sd/source/filter/ppt/ppt97animations.cxx new file mode 100644 index 0000000000..db3a960a78 --- /dev/null +++ b/sd/source/filter/ppt/ppt97animations.cxx @@ -0,0 +1,682 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ppt97animations.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +void Ppt97AnimationInfoAtom::ReadStream( SvStream& rIn ) +{ + sal_uInt32 nTmp; + rIn.ReadUInt32( nTmp ); + nDimColor = Color(ColorTransparency, nTmp); + rIn.ReadUInt32( nFlags ); + rIn.ReadUInt32( nSoundRef ); + rIn.ReadInt32( nDelayTime ); + rIn.ReadUInt16( nOrderID ); + rIn.ReadUInt16( nSlideCount ); + rIn.ReadUChar( nBuildType ); + rIn.ReadUChar( nFlyMethod ); + rIn.ReadUChar( nFlyDirection ); + rIn.ReadUChar( nAfterEffect ); + rIn.ReadUChar( nSubEffect ); + rIn.ReadUChar( nOLEVerb ); + rIn.ReadUChar( nUnknown1 ); + rIn.ReadUChar( nUnknown2 ); +} + +Ppt97Animation::Ppt97Animation( SvStream& rInputStream ) + : m_aAtom() + , m_bDirtyCache(true) + , m_bHasSpecialDuration(false) + , m_fDurationInSeconds(0.001) +{ + m_aAtom.ReadStream( rInputStream ); +} + +bool Ppt97Animation::operator < ( const Ppt97Animation& rAnimation ) const +{ + return m_aAtom.nOrderID < rAnimation.m_aAtom.nOrderID; +} +bool Ppt97Animation::operator > ( const Ppt97Animation& rAnimation ) const +{ + return m_aAtom.nOrderID > rAnimation.m_aAtom.nOrderID; +} +bool Ppt97Animation::HasEffect() const +{ + return m_aAtom.nBuildType != 0; +} +bool Ppt97Animation::HasParagraphEffect() const +{ + return m_aAtom.nBuildType > 1; +} +sal_Int32 Ppt97Animation::GetParagraphLevel() const +{ + sal_Int32 nParagraphLevel = 0; + if(m_aAtom.nBuildType>1) + nParagraphLevel = m_aAtom.nBuildType-1; + return nParagraphLevel; +} +bool Ppt97Animation::HasSoundEffect() const +{ + return m_aAtom.nSoundRef && m_aAtom.nFlags & 0x0010; +} +bool Ppt97Animation::HasStopPreviousSound() const +{ + return m_aAtom.nFlags & 0x0040; +} +bool Ppt97Animation::HasReverseOrder() const +{ + return m_aAtom.nFlags & 0x001; +} +bool Ppt97Animation::HasAnimateAssociatedShape() const +{ + return m_aAtom.nFlags & 0x004000; +} +bool Ppt97Animation::HasAfterEffect() const +{ + return m_aAtom.nAfterEffect != 0; +} +bool Ppt97Animation::HasAfterEffect_ChangeColor() const +{ + return m_aAtom.nAfterEffect == 1; +} +bool Ppt97Animation::HasAfterEffect_DimAtNextEffect() const +{ + return m_aAtom.nAfterEffect == 2; +} +#ifdef FUTURE +bool Ppt97Animation::HasAfterEffect_DimAfterEffect() const +{ + return m_aAtom.nAfterEffect == 3; +} +#endif +void Ppt97Animation::SetSoundFileUrl( const OUString& rSoundFileUrl ) +{ + m_aSoundFileUrl = rSoundFileUrl; +} + +double Ppt97Animation::GetDelayTimeInSeconds() const +{ + return m_aAtom.nDelayTime != 0X7FFFFFFF ? m_aAtom.nDelayTime/1000.0 : 0.0; +} + +bool Ppt97Animation::GetSpecialDuration( double& rfDurationInSeconds ) const +{ + UpdateCacheData(); + if( m_bHasSpecialDuration ) + rfDurationInSeconds = m_fDurationInSeconds; + return m_bHasSpecialDuration; +} + +bool Ppt97Animation::GetSpecialTextIterationDelay( double& rfTextIterationDelay ) const +{ + bool bRet = false; + switch(GetTextAnimationType()) + { + case presentation::TextAnimationType::BY_LETTER: + rfTextIterationDelay = 0.075; + bRet = true; + break; + case presentation::TextAnimationType::BY_WORD: + rfTextIterationDelay = 0.3; + bRet = true; + break; + default: + break; + } + return bRet; +} + +void Ppt97Animation::SetDimColor( Color nDimColor ) +{ + m_aAtom.nDimColor = nDimColor; +} +void Ppt97Animation::SetAnimateAssociatedShape( bool bAnimate ) +{ + if( !bAnimate ) + { + //the appear effect cannot be animated without text + if( GetPresetId() == "ooo-entrance-appear" ) + return; + //the random effect may be the appear effect and then has the same problem + if( GetPresetId() == "ooo-entrance-random" ) + { + //this case is not 100% correct -> feel free to complete + //i consider this case as seldom and not that problematic and a simple correct fix is not in sight + SAL_INFO("sd", "you tried to deselect the animation of the form for random animation-> this has been refused"); + return; + } + + } + + if(bAnimate) + m_aAtom.nFlags = m_aAtom.nFlags | 0x004000; + else if( HasAnimateAssociatedShape() ) + { + m_aAtom.nFlags = m_aAtom.nFlags ^ 0x004000; + } +} + +sal_Int16 Ppt97Animation::GetEffectNodeType() const //see css::presentation::EffectNodeType +{ + sal_Int16 nRet = presentation::EffectNodeType::ON_CLICK; + if( m_aAtom.nFlags & 0x04 ) + { + nRet = presentation::EffectNodeType::AFTER_PREVIOUS; + } + return nRet; +} + +sal_Int16 Ppt97Animation::GetTextAnimationType() const +{ + sal_Int16 nRet = presentation::TextAnimationType::BY_PARAGRAPH; + switch( m_aAtom.nSubEffect ) + { + case 0: + break; + case 2: + nRet = presentation::TextAnimationType::BY_LETTER; + break; + default: + nRet = presentation::TextAnimationType::BY_WORD; + break; + } + return nRet; +} +OUString const & Ppt97Animation::GetPresetId() const +{ + UpdateCacheData(); + return m_aPresetId; +} +OUString const & Ppt97Animation::GetPresetSubType() const +{ + UpdateCacheData(); + return m_aSubType; +} + +void Ppt97Animation::ClearCacheData() const +{ + m_aPresetId.clear(); + m_aSubType.clear(); + m_bHasSpecialDuration = false; + m_fDurationInSeconds = 0.001; +} +void Ppt97Animation::UpdateCacheData() const +{ + if( !m_bDirtyCache ) + return; + + ClearCacheData(); + + if( !HasEffect() ) + { + m_bDirtyCache = false; + return; + } + + switch( m_aAtom.nFlyMethod ) + { + case 0x0: + m_aPresetId = "ooo-entrance-appear"; // --- appear --- + break; + case 0x01: + m_aPresetId = "ooo-entrance-random"; // --- random --- + break; + case 0x02: // --- blinds effect --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-venetian-blinds"; + m_aSubType = "horizontal"; // horizontal + break; + case 0x1: + m_aPresetId = "ooo-entrance-venetian-blinds"; + m_aSubType = "vertical"; // vertical + break; + } + } + break; + case 0x03: // --- (hor/ver) shifted appear --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-checkerboard"; + m_aSubType = "across"; // vertical ??? + break; + case 0x1: + m_aPresetId = "ooo-entrance-checkerboard"; + m_aSubType = "downward"; // horizontal ??? + break; + } + } + break; + case 0x05: + m_aPresetId = "ooo-entrance-dissolve-in"; + break; + case 0x08: // --- (hor/ver) lines --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-random-bars"; + m_aSubType = "vertical"; // horizontal ??? + break; + case 0x1: + m_aPresetId = "ooo-entrance-random-bars"; + m_aSubType = "horizontal"; // vertical ??? + break; + } + } + break; + case 0x09: // --- diagonal --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x4: + m_aPresetId = "ooo-entrance-diagonal-squares"; + m_aSubType = "left-to-top"; // to left top + break; + case 0x5: + m_aPresetId = "ooo-entrance-diagonal-squares"; + m_aSubType = "right-to-top"; // to right top + break; + case 0x6: + m_aPresetId = "ooo-entrance-diagonal-squares"; + m_aSubType = "left-to-bottom"; // to left bottom + break; + case 0x7: + m_aPresetId = "ooo-entrance-diagonal-squares"; + m_aSubType = "right-to-bottom"; // to right bottom + break; + } + } + break; + case 0x0a: // --- roll/wipe --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-wipe"; + m_aSubType = "from-right"; // from right + break; + case 0x1: + m_aPresetId = "ooo-entrance-wipe"; + m_aSubType = "from-bottom"; // from bottom + break; + case 0x2: + m_aPresetId = "ooo-entrance-wipe"; + m_aSubType = "from-left"; // from left + break; + case 0x3: + m_aPresetId = "ooo-entrance-wipe"; + m_aSubType = "from-top"; // from top + break; + } + } + break; + case 0x0b: //--- fade in --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-box"; + m_aSubType = "out"; // from center + break; + case 0x1: + m_aPresetId = "ooo-entrance-box"; + m_aSubType = "in"; // to center + break; + } + } + break; + case 0x0c: // --- text effects --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-left"; + + break; + case 0x1: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-top"; + break; + case 0x2: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-right"; + break; + case 0x3: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-bottom"; + break; + case 0x4: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-top-left"; + break; + case 0x5: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-top-right"; + break; + case 0x6: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-bottom-left"; + break; + case 0x7: + m_aPresetId = "ooo-entrance-fly-in"; + m_aSubType = "from-bottom-right"; + break; + case 0x8: // -- short text effects -- + m_aPresetId = "ooo-entrance-peek-in"; + m_aSubType = "from-left"; + break; + case 0x9: + m_aPresetId = "ooo-entrance-peek-in"; + m_aSubType = "from-bottom"; + break; + case 0xa: + m_aPresetId = "ooo-entrance-peek-in"; + m_aSubType = "from-right"; + break; + case 0xb: + m_aPresetId = "ooo-entrance-peek-in"; + m_aSubType = "from-top"; + break; + case 0xc: // -- slow text effects -- + { + m_aPresetId = "ooo-entrance-fly-in-slow"; + m_aSubType = "from-left"; + } + break; + case 0xd: + { + m_aPresetId = "ooo-entrance-fly-in-slow"; + m_aSubType = "from-top"; + } + break; + case 0xe: + { + m_aPresetId = "ooo-entrance-fly-in-slow"; + m_aSubType = "from-right"; + } + break; + case 0xf: + { + m_aPresetId = "ooo-entrance-fly-in-slow"; + m_aSubType = "from-bottom"; + } + break; + case 0x10: // --- zoom --- + m_aPresetId = "ooo-entrance-zoom"; + m_aSubType = "in"; + break; + case 0x11: + m_aPresetId = "ooo-entrance-zoom"; + m_aSubType = "in-slightly"; + break; + case 0x12: + m_aPresetId = "ooo-entrance-zoom"; + m_aSubType = "out"; + break; + case 0x13: + m_aPresetId = "ooo-entrance-zoom"; + m_aSubType = "out-slightly"; + break; + case 0x14: + m_aPresetId = "ooo-entrance-zoom"; + m_aSubType = "in-from-screen-center"; + break; + case 0x15: + m_aPresetId = "ooo-entrance-zoom"; + m_aSubType = "out-from-screen-center"; + break; + case 0x16: // --- stretch --- + m_aPresetId = "ooo-entrance-stretchy"; + m_aSubType = "across"; + break; + case 0x17: + m_aPresetId = "ooo-entrance-stretchy"; + m_aSubType = "from-left"; + break; + case 0x18: + m_aPresetId = "ooo-entrance-stretchy"; + m_aSubType = "from-top"; + break; + case 0x19: + m_aPresetId = "ooo-entrance-stretchy"; + m_aSubType = "from-right"; + break; + case 0x1a: + m_aPresetId = "ooo-entrance-stretchy"; + m_aSubType = "from-bottom"; + break; + case 0x1b: // --- rotate --- + m_aPresetId = "ooo-entrance-swivel"; + m_aSubType = "vertical"; + break; + case 0x1c: // --- spirale --- + m_aPresetId = "ooo-entrance-spiral-in"; + break; + } + } + break; + case 0x0d: // --- open/close --- + { + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: + m_aPresetId = "ooo-entrance-split"; + m_aSubType = "horizontal-out"; //horizontal open + break; + case 0x1: + m_aPresetId = "ooo-entrance-split"; + m_aSubType = "horizontal-in"; //horizontal close + break; + case 0x2: + m_aPresetId = "ooo-entrance-split"; + m_aSubType = "vertical-out"; // vertical open + break; + case 0x3: + m_aPresetId = "ooo-entrance-split"; + m_aSubType = "vertical-in"; // vertical close + break; + } + } + break; + case 0x0e: // --- blink --- + { + m_aPresetId = "ooo-entrance-flash-once"; + switch ( m_aAtom.nFlyDirection ) + { + case 0x0: //fast + m_fDurationInSeconds = 0.075; + m_bHasSpecialDuration = true; + break; + case 0x1: //medium + m_fDurationInSeconds = 0.5; + m_bHasSpecialDuration = true; + break; + case 0x2: //slow + m_fDurationInSeconds = 1.0; + m_bHasSpecialDuration = true; + break; + } + } + break; + default: + { + m_aPresetId = "ooo-entrance-appear"; + OSL_FAIL("no effect mapped"); + } + break; + } + m_bDirtyCache = false; +} + +void Ppt97Animation::createAndSetCustomAnimationEffect( SdrObject* pObj ) +{ + + if( !HasEffect() ) + return; + if( !pObj || !pObj->getSdrPageFromSdrObject() ) + { + OSL_FAIL("no valid SdrObject or page found for ppt import"); + return; + } + + uno::Reference< drawing::XShape > xShape = GetXShapeForSdrObject( pObj ); + if( !xShape.is() ) + { + OSL_FAIL("no XShape interface found for ppt import"); + return; + } + ::sd::MainSequencePtr pMainSequence = static_cast(pObj->getSdrPageFromSdrObject())->getMainSequence(); + if( !pMainSequence ) + { + OSL_FAIL("no MainSequence found for ppt import"); + return; + } + + const ::sd::CustomAnimationPresets& rPresets( ::sd::CustomAnimationPresets::getCustomAnimationPresets() ); + ::sd::CustomAnimationPresetPtr pPreset( rPresets.getEffectDescriptor( GetPresetId() ) ); + if( !pPreset ) + { + OSL_FAIL("no suitable preset found for ppt import"); + return; + } + + //--------------start doing something + + //1. ------ create an effect from the presets ------ + ::sd::CustomAnimationEffectPtr pEffect = std::make_shared<::sd::CustomAnimationEffect>( pPreset->create( GetPresetSubType() ) ); + + //2. ------ adapt the created effect ------ + + // set the shape targeted by this effect + pEffect->setTarget( css::uno::Any( xShape ) ); + + pEffect->setBegin( GetDelayTimeInSeconds() ); + + // some effects need a different duration than that of the mapped preset effect + double fDurationInSeconds = 1.0; //in seconds + if( GetSpecialDuration( fDurationInSeconds ) ) + pEffect->setDuration( fDurationInSeconds ); + + // set after effect + if( HasAfterEffect() ) + { + pEffect->setHasAfterEffect( true ); + if( HasAfterEffect_ChangeColor() ) + pEffect->setDimColor( uno::Any( GetDimColor() ) ); + else + pEffect->setAfterEffectOnNext( HasAfterEffect_DimAtNextEffect() ); + } + + // set sound effect + if( HasSoundEffect() ) + pEffect->createAudio( uno::Any( m_aSoundFileUrl ) ); + + // text iteration + pEffect->setIterateType( GetTextAnimationType() ); + + // some effects need a different delay between text iteration than that of the mapped preset effect + double fTextIterationDelay = 1.0; + if( GetSpecialTextIterationDelay( fTextIterationDelay ) ) + pEffect->setIterateInterval( fTextIterationDelay ); + + // is the effect started on click or after the last effect (Another possible value is EffectNodeType::WITH_PREVIOUS ) + pEffect->setNodeType( GetEffectNodeType() ); + + //set stop sound effect + if( HasStopPreviousSound() ) + pEffect->setStopAudio(); + + // append the effect to the main sequence + if( !HasParagraphEffect() ) + { + // TODO: !HasAnimateAssociatedShape() can possibly have this set to ONLY_TEXT - see i#42737 + pEffect->setTargetSubItem( presentation::ShapeAnimationSubType::AS_WHOLE ); + } + + //3. ------ put the created effect to the model and do some last changes fro paragraph effects ------ + pMainSequence->append( pEffect ); + if( HasParagraphEffect() ) + { + sal_Int32 nParagraphLevel = GetParagraphLevel(); + double fDelaySeconds = GetDelayTimeInSeconds(); + bool bAnimateAssociatedShape = HasAnimateAssociatedShape();//or only text + bool bTextReverse = HasReverseOrder(); + + // now create effects for each paragraph + ::sd::CustomAnimationTextGroupPtr pGroup = pMainSequence-> + createTextGroup( pEffect, nParagraphLevel, fDelaySeconds, bAnimateAssociatedShape, bTextReverse ); + + if( pGroup ) + { + const ::sd::EffectSequence& rEffects = pGroup->getEffects(); + + ::sd::CustomAnimationEffectPtr pLastEffect; + sal_Int32 nIndex = 0; + for( const auto& rxEffect : rEffects ) + { + ::sd::CustomAnimationEffectPtr pGroupEffect(rxEffect); + + ////todo? if( nIndex > 1 && pLastEffect && HasSoundEffect() ) + //// pLastEffect->setStopAudio(); + if( nIndex < 2 ) + { + pGroupEffect->setNodeType( GetEffectNodeType() ); + } + else if( nIndex > 0 ) + { + bool bAtParagraphBegin = false; + if(!bTextReverse) + bAtParagraphBegin = pGroupEffect->getParaDepth() < nParagraphLevel; + else + bAtParagraphBegin = !pLastEffect || pLastEffect->getParaDepth() < nParagraphLevel; + if( bAtParagraphBegin ) + pGroupEffect->setNodeType( GetEffectNodeType() ); + else if( GetTextAnimationType() == presentation::TextAnimationType::BY_PARAGRAPH ) + pGroupEffect->setNodeType( presentation::EffectNodeType::WITH_PREVIOUS ); + else + pGroupEffect->setNodeType( presentation::EffectNodeType::AFTER_PREVIOUS ); + } + pLastEffect = pGroupEffect; + nIndex++; + } + } + } + pMainSequence->rebuild(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/ppt97animations.hxx b/sd/source/filter/ppt/ppt97animations.hxx new file mode 100644 index 0000000000..1811d93a39 --- /dev/null +++ b/sd/source/filter/ppt/ppt97animations.hxx @@ -0,0 +1,156 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdrObject; +class SvStream; + +/// helper class for reading PPT AnimationInfoAtom +class Ppt97AnimationInfoAtom +{ + friend class Ppt97Animation; + +//-- member + Color nDimColor; + sal_uInt32 nFlags; ///< 0x0004: time instead of click + sal_uInt32 nSoundRef; + sal_Int32 nDelayTime; ///< 1/1000 sec + sal_uInt16 nOrderID; + sal_uInt16 nSlideCount; + sal_uInt8 nBuildType; + sal_uInt8 nFlyMethod; + sal_uInt8 nFlyDirection; + sal_uInt8 nAfterEffect; ///< nAfterEffect: 0: none; 1: change color; 2: dim on next effect; 3: dim after effect; + sal_uInt8 nSubEffect; + sal_uInt8 nOLEVerb; + + // unknown, because whole size needs to be 28 + sal_uInt8 nUnknown1; + sal_uInt8 nUnknown2; + +//-- methods + void ReadStream( SvStream& rIn ); +/* + nFlags: + decimal / hexadecimal / binary + 1040 0x00000410 10000010000 mouseclick + 17428 0x00004414 100010000010100 after previous 0 sec (animate form) + 17412 0x00004404 100010000000100 after previous 0 sec + 1088 0x00000440 10001000000 stop previous sound and mouseclick + 1044 0x00000414 10000010100 play sound automatic + 1041 0x00000411 10000010001 + | | | | | | + | | | | | reverse order + | | | | after previous + | | | sound + | | stop previous sound + | ? + animate form + + nAfterEffect: + 1: color + 0: nothing + 3: hide after animation + 2: hide at next mouse click +*/ +}; + +/** this is a helping class for import of PPT 97 animations + 1. use the constructor Ppt97Animation( SvStream& rIn ) to import information from the stream + 2. use the set methods to modify and complete the data + 3. use the method createAndSetCustomAnimationEffect( ) to create an effect in sd model + */ +class Ppt97Animation +{ + +public: //public methods + explicit Ppt97Animation( SvStream& rIn ); + + bool operator < ( const Ppt97Animation& rAnimation ) const;//later is greater + bool operator > ( const Ppt97Animation& rAnimation ) const;//later is greater + + //get methods + bool HasEffect() const; + bool HasParagraphEffect() const; + bool HasSoundEffect() const; + sal_Int32 GetDimColor() const { return static_cast(m_aAtom.nDimColor);} + sal_uInt32 GetSoundRef() const { return m_aAtom.nSoundRef;} + /// @return true if the shape should be animated in addition to the text + bool HasAnimateAssociatedShape() const; + + //set methods + void SetDimColor( Color nDimColor ); + void SetSoundFileUrl( const OUString& rSoundFileUrl ); + void SetAnimateAssociatedShape( bool bAnimate ); //true if the shape should be animated in addition to the text + + //action methods + /** this method creates a CustomAnimationEffect for the given SdrObject + from internal data and stores the created effect at the draw model + */ + void createAndSetCustomAnimationEffect( SdrObject* pObj ); + +private: //private methods + + //read methods + OUString const & GetPresetId() const; + OUString const & GetPresetSubType() const; + bool HasAfterEffect() const; + bool HasAfterEffect_ChangeColor() const; + bool HasAfterEffect_DimAtNextEffect() const; + bool HasStopPreviousSound() const; + + /// @return true if the text paragraphs should be animated in reverse order + bool HasReverseOrder() const; + + ///paragraph level that is animated ( that paragraph and higher levels ) + sal_Int32 GetParagraphLevel() const; + + ///@see css::presentation::TextAnimationType + sal_Int16 GetTextAnimationType() const; + + ///@see css::presentation::EffectNodeType + sal_Int16 GetEffectNodeType() const; + + /// @return -1 for start on mouseclick or >= 0 for a delay in seconds for automatic start + double GetDelayTimeInSeconds() const; + bool GetSpecialDuration( double& rfDurationInSeconds ) const; + bool GetSpecialTextIterationDelay( double& rfTextIterationDelay ) const; + + void UpdateCacheData() const; + void ClearCacheData() const; + +private: //private member + //input information: + Ppt97AnimationInfoAtom m_aAtom; ///< pure input from stream + OUString m_aSoundFileUrl; ///< this needs to be set in addition from outside as this class has not the knowledge to translate the sound bits to a file url + + //cached generated output information: + mutable bool m_bDirtyCache; + mutable OUString m_aPresetId; // m_aPresetId and m_aSubType match to the values in sd/xml/effects.xml + mutable OUString m_aSubType; + mutable bool m_bHasSpecialDuration; + mutable double m_fDurationInSeconds; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptanimations.hxx b/sd/source/filter/ppt/pptanimations.hxx new file mode 100644 index 0000000000..7fda1bb68d --- /dev/null +++ b/sd/source/filter/ppt/pptanimations.hxx @@ -0,0 +1,209 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +class SvStream; + +namespace ppt +{ + +// old transition types +#define PPT_TRANSITION_TYPE_NONE 0 +#define PPT_TRANSITION_TYPE_RANDOM 1 +#define PPT_TRANSITION_TYPE_BLINDS 2 +#define PPT_TRANSITION_TYPE_CHECKER 3 +#define PPT_TRANSITION_TYPE_COVER 4 +#define PPT_TRANSITION_TYPE_DISSOLVE 5 +#define PPT_TRANSITION_TYPE_FADE 6 +#define PPT_TRANSITION_TYPE_PULL 7 // Uncover in MS-PPT Specs +#define PPT_TRANSITION_TYPE_RANDOM_BARS 8 +#define PPT_TRANSITION_TYPE_STRIPS 9 +#define PPT_TRANSITION_TYPE_WIPE 10 +#define PPT_TRANSITION_TYPE_ZOOM 11 // Box In/Out in MS-PPT Specs +#define PPT_TRANSITION_TYPE_SPLIT 13 + +// effects, new in xp +#define PPT_TRANSITION_TYPE_DIAMOND 17 +#define PPT_TRANSITION_TYPE_PLUS 18 +#define PPT_TRANSITION_TYPE_WEDGE 19 +#define PPT_TRANSITION_TYPE_PUSH 20 +#define PPT_TRANSITION_TYPE_COMB 21 +#define PPT_TRANSITION_TYPE_NEWSFLASH 22 +#define PPT_TRANSITION_TYPE_SMOOTHFADE 23 // Alpha Fade in MS-PPT Specs +#define PPT_TRANSITION_TYPE_WHEEL 26 +#define PPT_TRANSITION_TYPE_CIRCLE 27 + +// undocumented(?) +#define PPT_TRANSITION_TYPE_FLASH 30 + +// atoms +#define DFF_msofbtAnimEvent 0xf125 +#define DFF_msofbtAnimNode 0xf127 +#define DFF_msofbtAnimTrigger 0xf128 +#define DFF_msofbtAnimValue 0xf129 +#define DFF_msofbtAnimateTarget 0xf12a +#define DFF_msofbtAnimate 0xf12b +#define DFF_msofbtAnimateColor 0xf12c +#define DFF_msofbtAnimateFilter 0xf12d +#define DFF_msofbtAnimateMotion 0xf12e +#define DFF_msofbtAnimateRotation 0xf12f +#define DFF_msofbtAnimateScale 0xf130 +#define DFF_msofbtAnimateSet 0xf131 +#define DFF_msofbtAnimCommand 0xf132 +#define DFF_msofbtAnimateTargetSettings 0xf133 +#define DFF_msofbtAnimateData 0xf134 +#define DFF_msofbtAnimateColorData 0xf135 +#define DFF_msofbtAnimateFilterData 0xf136 +#define DFF_msofbtAnimateMotionData 0xf137 +#define DFF_msofbtAnimateScaleData 0xf139 +#define DFF_msofbtAnimateSetData 0xf13a +#define DFF_msofbtCommandData 0xf13b +#define DFF_msofbtAnimateTargetElement 0xf13c +#define DFF_msofbtAnimPropertySet 0xf13d +#define DFF_msofbtAnimateAttributeNames 0xf13e +#define DFF_msofbtAnimKeyPoints 0xf13f +#define DFF_msofbtAnimIteration 0xf140 +#define DFF_msofbtAnimAction 0xf141 // correct name?? +#define DFF_msofbtAnimAttributeValue 0xf142 +#define DFF_msofbtAnimKeyTime 0xf143 +#define DFF_msofbtAnimGroup 0xf144 +#define DFF_msofbtAnimSubGoup 0xf145 +#define DFF_msofbtAnimateRotationData 0xf138 +#define DFF_msofbtAnimReference 0x2afb + +// property ids +#define DFF_ANIM_ID 1 +#define DFF_ANIM_RUNTIMECONTEXT 2 +#define DFF_ANIM_PATH_EDIT_MODE 3 +#define DFF_ANIM_COLORSPACE 4 +#define DFF_ANIM_DIRECTION 5 // TODO: Conflict? +#define DFF_ANIM_MASTERREL 5 // TODO: Conflict? +#define DFF_ANIM_OVERRIDE 6 +#define DFF_ANIM_PRESET_ID 9 +#define DFF_ANIM_PRESET_SUB_TYPE 10 +#define DFF_ANIM_PRESET_CLASS 11 +#define DFF_ANIM_AFTEREFFECT 13 +#define DFF_ANIM_ENDAFTERSLIDE 15 +#define DFF_ANIM_TIMEFILTER 16 +#define DFF_ANIM_EVENT_FILTER 17 +#define DFF_ANIM_GROUP_ID 19 +#define DFF_ANIM_NODE_TYPE 20 +#define DFF_ANIM_VOLUME 22 +#define DFF_ANIM_PROPERTY_ID_COUNT (DFF_ANIM_VOLUME + 1) + +// property types +#define DFF_ANIM_PROP_TYPE_BYTE 0 +#define DFF_ANIM_PROP_TYPE_INT32 1 +#define DFF_ANIM_PROP_TYPE_FLOAT 2 +#define DFF_ANIM_PROP_TYPE_UNISTRING 3 + +#define DFF_ANIM_PRESS_CLASS_USER_DEFINED 0 +#define DFF_ANIM_PRESS_CLASS_ENTRANCE 1 +#define DFF_ANIM_PRESS_CLASS_EXIT 2 +#define DFF_ANIM_PRESS_CLASS_EMPHASIS 3 +#define DFF_ANIM_PRESS_CLASS_MOTIONPATH 4 +#define DFF_ANIM_PRESS_CLASS_OLE_ACTION 5 +#define DFF_ANIM_PRESS_CLASS_MEDIACALL 6 + +// Effect node type. +#define DFF_ANIM_NODE_TYPE_ON_CLICK 1 +#define DFF_ANIM_NODE_TYPE_WITH_PREVIOUS 2 +#define DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS 3 +#define DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE 4 +#define DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ 5 +#define DFF_ANIM_NODE_TYPE_CLICK_PARALLEL 6 +#define DFF_ANIM_NODE_TYPE_WITH_GROUP 7 +#define DFF_ANIM_NODE_TYPE_AFTER_GROUP 8 +#define DFF_ANIM_NODE_TYPE_TIMING_ROOT 9 + +/* constants for fill entry in AnimationNode */ +const sal_Int32 mso_Anim_GroupType_PAR = 0; +const sal_Int32 mso_Anim_GroupType_SEQ = 1; +const sal_Int32 mso_Anim_GroupType_NODE = 3; +const sal_Int32 mso_Anim_GroupType_MEDIA = 4; + +/* constants for fill entry in AnimationNode */ +const sal_Int32 mso_Anim_Fill_ALWAYS = 1; +const sal_Int32 mso_Anim_Fill_WHENOFF = 2; +const sal_Int32 mso_Anim_Fill_NEVER = 3; + +/* constants for fill entry in AnimationNode */ +const sal_Int32 mso_Anim_Fill_REMOVE = 1; +const sal_Int32 mso_Anim_Fill_FREEZE = 2; +const sal_Int32 mso_Anim_Fill_HOLD = 3; + +/* constants for behaviour entry in PPTAnimationNode */ +const sal_Int32 mso_Anim_Behaviour_FILTER = 24; +const sal_Int32 mso_Anim_Behaviour_ANIMATION= 25; + +typedef ::std::map< sal_Int32, css::uno::Any > PropertySetMap_t; + +class PropertySet +{ +public: + PropertySetMap_t maProperties; + + bool hasProperty( sal_Int32 nProperty ) const; + css::uno::Any getProperty( sal_Int32 nProperty ) const; +}; + +/** this atom is the first entry in each animation group */ +struct AnimationNode +{ +public: + /** see mso_Anim_GroupType_? */ + sal_Int32 mnGroupType; + + /** see mso_Anim_Restart_? */ + sal_Int32 mnRestart; + + /** see mso_Anim_Fill_? */ + sal_Int32 mnFill; + + /** see mso_Anim_Behaviour_? */ + sal_Int32 mnNodeType; + + /** duration of this group in 1000th seconds */ + sal_Int32 mnDuration; + + sal_Int32 mnU1, mnU3, mnU4; + + AnimationNode() + : mnGroupType(0) + , mnRestart(0) + , mnFill(0) + , mnNodeType(0) + , mnDuration(0) + , mnU1(0), mnU3(0), mnU4(0) + { + } +public: + + friend SvStream& WriteAnimationNode(SvStream& rOut, AnimationNode const & rAtom); +}; + +} // namespace ppt + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptatom.cxx b/sd/source/filter/ppt/pptatom.cxx new file mode 100644 index 0000000000..24d87f0401 --- /dev/null +++ b/sd/source/filter/ppt/pptatom.cxx @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "pptatom.hxx" + +using namespace ppt; + +Atom::Atom( const DffRecordHeader& rRecordHeader, SvStream& rStream ) +: mrStream( rStream ) +, maRecordHeader( rRecordHeader ) +, mpFirstChild( nullptr ) +, mpNextAtom( nullptr ) +{ + if( isContainer() ) + { + if( seekToContent() ) + { + DffRecordHeader aChildHeader; + + Atom* pLastAtom = nullptr; + + // retrieve file size (to allow sanity checks) + sal_uInt64 const nStreamSize = mrStream.TellEnd(); + + while( mrStream.good() + && ( mrStream.Tell() < nStreamSize ) + && ( mrStream.Tell() < maRecordHeader.GetRecEndFilePos() ) ) + { + if (ReadDffRecordHeader(mrStream, aChildHeader)) + { + Atom* pAtom = new Atom( aChildHeader, mrStream ); + + if( pLastAtom ) + pLastAtom->mpNextAtom = pAtom; + if( mpFirstChild == nullptr ) + mpFirstChild = pAtom; + + pLastAtom = pAtom; + } + } + } + } + + if (!maRecordHeader.SeekToEndOfRecord(mrStream)) + mrStream.SetError(SVSTREAM_FILEFORMAT_ERROR); +} + +Atom::~Atom() +{ + Atom* pChild = mpFirstChild; + while( pChild ) + { + Atom* pNextChild = pChild->mpNextAtom; + delete pChild; + pChild = pNextChild; + } +} + +/** imports this atom and its child atoms */ +Atom* Atom::import( const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl ) +{ + Atom* pRootAtom = new Atom( rRootRecordHeader, rStCtrl ); + + if( rStCtrl.GetError() == ERRCODE_NONE ) + { + return pRootAtom; + } + else + { + delete pRootAtom; + return nullptr; + } +} + +/** returns the next child atom after pLast with nRecType or NULL */ +const Atom* Atom::findNextChildAtom( sal_uInt16 nRecType, const Atom* pLast ) const +{ + Atom* pChild = pLast != nullptr ? pLast->mpNextAtom : mpFirstChild; + while( pChild && pChild->maRecordHeader.nRecType != nRecType ) + { + pChild = pChild->mpNextAtom; + } + + return pChild; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptatom.hxx b/sd/source/filter/ppt/pptatom.hxx new file mode 100644 index 0000000000..55ee7f6874 --- /dev/null +++ b/sd/source/filter/ppt/pptatom.hxx @@ -0,0 +1,106 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace ppt +{ +class Atom +{ +public: + ~Atom(); + + /** imports this atom and its child atoms */ + static Atom* import(const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl); + + /** @return true if at least one atom with the given nRecType is found */ + inline bool hasChildAtom(sal_uInt16 nRecType) const; + + /** @return the first child atom with nRecType or NULL */ + inline const Atom* findFirstChildAtom(sal_uInt16 nRecType) const; + + /** @return the next child atom after pLast with nRecType or NULL */ + const Atom* findNextChildAtom(sal_uInt16 nRecType, const Atom* pLast) const; + + /** @return the first child atom or NULL */ + inline const Atom* findFirstChildAtom() const; + + /** @return the next child atom after pLast or NULL */ + static inline const Atom* findNextChildAtom(const Atom* pLast); + + /** @return true if this atom is a container */ + inline bool isContainer() const; + + /** seeks to the contents of this atom */ + inline bool seekToContent() const; + + /** @return the record type */ + inline sal_uInt16 getType() const; + + /** @return the record instance */ + inline sal_uInt16 getInstance() const; + + /** @return the record length */ + inline sal_uInt32 getLength() const; + +private: + Atom(const DffRecordHeader& rRecordHeader, SvStream& rStCtrl); + + SvStream& mrStream; + DffRecordHeader maRecordHeader; + Atom* mpFirstChild; + Atom* mpNextAtom; +}; + +inline bool Atom::hasChildAtom(sal_uInt16 nRecType) const +{ + return findFirstChildAtom(nRecType) != nullptr; +} + +inline const Atom* Atom::findFirstChildAtom(sal_uInt16 nRecType) const +{ + return findNextChildAtom(nRecType, nullptr); +} + +inline const Atom* Atom::findFirstChildAtom() const { return mpFirstChild; } + +inline const Atom* Atom::findNextChildAtom(const Atom* pLast) +{ + return pLast ? pLast->mpNextAtom : pLast; +} + +inline bool Atom::isContainer() const { return maRecordHeader.IsContainer(); } + +inline bool Atom::seekToContent() const +{ + maRecordHeader.SeekToContent(mrStream); + return mrStream.GetError() == ERRCODE_NONE; +} + +inline sal_uInt16 Atom::getType() const { return maRecordHeader.nRecType; } + +inline sal_uInt16 Atom::getInstance() const { return maRecordHeader.nRecInstance; } + +inline sal_uInt32 Atom::getLength() const { return maRecordHeader.nRecLen; } + +} // namespace ppt + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptin.cxx b/sd/source/filter/ppt/pptin.cxx new file mode 100644 index 0000000000..62a75a42f4 --- /dev/null +++ b/sd/source/filter/ppt/pptin.cxx @@ -0,0 +1,2808 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include "pptin.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "propread.hxx" +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#define MAX_USER_MOVE 2 + +#include "pptanimations.hxx" +#include "pptinanimations.hxx" +#include "ppt97animations.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +using namespace ::com::sun::star; + +SdPPTImport::SdPPTImport( SdDrawDocument* pDocument, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMedium ) + : maParam(rDocStream) +{ +#ifdef DBG_UTIL + std::unique_ptr pSummaryInformation(new PropRead( rStorage, "\005SummaryInformation" )); + if ( pSummaryInformation->IsValid() ) + { + pSummaryInformation->Read(); + sal_uInt8 const aPropSetGUID[ 16 ] + { + 0xe0, 0x85, 0x9f, 0xf2, 0xf9, 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 + }; + Section* pSection = const_cast(pSummaryInformation->GetSection( aPropSetGUID )); + if ( pSection ) + { + PropItem aPropItem; + if ( pSection->GetProperty( PID_COMMENTS, aPropItem ) ) + { + OUString aComment; + aPropItem.Read( aComment ); + if ( aComment.indexOf( "Applixware" ) >= 0 ) + { + maParam.nImportFlags |= PPT_IMPORTFLAGS_NO_TEXT_ASSERT; + } + } + } + } + pSummaryInformation.reset(); +#endif + + tools::SvRef pCurrentUserStream(rStorage.OpenSotStream("Current User", StreamMode::STD_READ)); + if (pCurrentUserStream) + { + ReadPptCurrentUserAtom(*pCurrentUserStream, maParam.aCurrentUserAtom); + } + + if( pDocument ) + { + // iterate over all styles + SdStyleSheetPool* pStyleSheetPool = pDocument->GetSdStyleSheetPool(); + std::shared_ptr aIter = + std::make_shared(pStyleSheetPool, SfxStyleFamily::All); + + for (SfxStyleSheetBase *pSheet = aIter->First(); pSheet; pSheet = aIter->Next()) + { + SfxItemSet& rSet = pSheet->GetItemSet(); + // if autokerning is set in style, override it, ppt has no autokerning + if( rSet.GetItemState( EE_CHAR_PAIRKERNING, false ) == SfxItemState::SET ) + rSet.ClearItem( EE_CHAR_PAIRKERNING ); + } + } + + pFilter.reset(new ImplSdPPTImport(pDocument, rStorage, rMedium, maParam)); +} + +bool SdPPTImport::Import() +{ + return pFilter->Import(); +} + +SdPPTImport::~SdPPTImport() +{ +} + +ImplSdPPTImport::ImplSdPPTImport( SdDrawDocument* pDocument, SotStorage& rStorage_, SfxMedium& rMedium, PowerPointImportParam& rParam ) + : SdrPowerPointImport(rParam, rMedium.GetBaseURL()) + , mrMed(rMedium) + , mrStorage(rStorage_) + , mbDocumentFound(false) + , mnFilterOptions(0) + , mpDoc(pDocument) + , mePresChange(PresChange::Manual) + , mnBackgroundObjectsLayerID(0) +{ + if ( !m_bOk ) + return; + + mbDocumentFound = SeekToDocument( &maDocHd ); // maDocHd = the latest DocumentHeader + while ( SeekToRec( rStCtrl, PPT_PST_Document, nStreamLen, &maDocHd ) ) + mbDocumentFound = true; + + sal_uInt32 nDggContainerOfs = 0; + + if ( mbDocumentFound ) + { + sal_uInt64 nOldPos = rStCtrl.Tell(); + + mxPicturesStream = rStorage_.OpenSotStream( "Pictures", StreamMode::STD_READ ); + pStData = mxPicturesStream.get(); + + rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); + sal_uLong nDocLen = maDocHd.GetRecEndFilePos(); + DffRecordHeader aPPDGHd; + if ( SeekToRec( rStCtrl, PPT_PST_PPDrawingGroup, nDocLen, &aPPDGHd ) ) + { + sal_uLong nPPDGLen = aPPDGHd.GetRecEndFilePos(); + if ( SeekToRec( rStCtrl, DFF_msofbtDggContainer, nPPDGLen ) ) + nDggContainerOfs = rStCtrl.Tell(); + } + rStCtrl.Seek( nOldPos ); + } + sal_uInt32 nSvxMSDffOLEConvFlags2 = 0; + + const SvtFilterOptions& rBasOpt = SvtFilterOptions::Get(); + if ( rBasOpt.IsLoadPPointBasicCode() ) + mnFilterOptions |= 1; + if ( rBasOpt.IsMathType2Math() ) + nSvxMSDffOLEConvFlags2 |= OLE_MATHTYPE_2_STARMATH; + if ( rBasOpt.IsWinWord2Writer() ) + nSvxMSDffOLEConvFlags2 |= OLE_WINWORD_2_STARWRITER; + if ( rBasOpt.IsExcel2Calc() ) + nSvxMSDffOLEConvFlags2 |= OLE_EXCEL_2_STARCALC; + if ( rBasOpt.IsPowerPoint2Impress() ) + nSvxMSDffOLEConvFlags2 |= OLE_POWERPOINT_2_STARIMPRESS; + + InitSvxMSDffManager( nDggContainerOfs, pStData, nSvxMSDffOLEConvFlags2 ); + SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS + | SVXMSDFF_SETTINGS_IMPORT_PPT ); + SetModel( mpDoc, 576 ); +} + +// Dtor +ImplSdPPTImport::~ImplSdPPTImport() +{ + pStData = nullptr; + mxPicturesStream.clear(); +} + +// Import +bool ImplSdPPTImport::Import() +{ + if ( !m_bOk ) + return false; + + bool bWasLocked = pSdrModel->isLocked(); + pSdrModel->setLock(true); + const bool bSavedUndoEnabled = pSdrModel->IsUndoEnabled(); + pSdrModel->EnableUndo(false); + + SdrOutliner& rOutl = mpDoc->GetDrawOutliner(); + EEControlBits nControlWord = rOutl.GetEditEngine().GetControlWord(); + nControlWord |= EEControlBits::ULSPACESUMMATION; + const_cast(rOutl.GetEditEngine()).SetControlWord( nControlWord ); + + SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin(); + mnBackgroundObjectsLayerID = rAdmin.GetLayerID( sUNO_LayerName_background_objects ); + + ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh(); + if ( pDocShell ) + SeekOle( pDocShell, mnFilterOptions ); + + // hyperlinks + std::unique_ptr pDInfoSec2(new PropRead( mrStorage, "\005DocumentSummaryInformation" )); + if ( pDInfoSec2->IsValid() ) + { + PropItem aPropItem; + + sal_uInt32 nType(0), nPropCount(0); + + pDInfoSec2->Read(); + + sal_uInt8 const aPropSetGUID[ 16 ] + { + 0x02, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae + }; + Section* pSection = const_cast(pDInfoSec2->GetSection( aPropSetGUID )); + if ( pSection ) + { + if ( pSection->GetProperty( PID_SLIDECOUNT, aPropItem ) ) + { + aPropItem.ReadUInt32( nType ); + if ( ( nType == VT_I4 ) || ( nType == VT_UI4 ) ) + { + // examine PID_HEADINGPAIR to get the correct entry for PID_DOCPARTS + sal_uInt32 nSlideCount(0), nVecCount(0); + aPropItem.ReadUInt32( nSlideCount ); + if ( nSlideCount && pSection->GetProperty( PID_HEADINGPAIR, aPropItem ) ) + { + sal_uInt32 nSlideTitleIndex = 0, nSlideTitleCount = 0; + + OUString aUString; + + aPropItem.ReadUInt32( nType ) + .ReadUInt32( nVecCount ); + + if ( ( nType == ( VT_VARIANT | VT_VECTOR ) ) && ( nVecCount ^ 1 ) ) + { + nVecCount >>= 1; + sal_uInt32 nEntryCount = 0; + for (sal_uInt32 i = 0; i < nVecCount; ++i) + { + if ( !aPropItem.Read( aUString, VT_EMPTY, false ) ) + break; + aPropItem.ReadUInt32( nType ); + if ( ( nType != VT_I4 ) && ( nType != VT_UI4 ) ) + break; + sal_uInt32 nTemp(0); + aPropItem.ReadUInt32( nTemp ); + if ( aUString == "Slide Titles" || aUString == "Folientitel" ) + { + nSlideTitleCount = nTemp; + nSlideTitleIndex = nEntryCount; + } + nEntryCount += nTemp; + } + } + if ( ( nSlideCount == nSlideTitleCount ) && pSection->GetProperty( PID_DOCPARTS, aPropItem ) ) + { + aPropItem.ReadUInt32( nType ) + .ReadUInt32( nVecCount ); + + bool bVecOk = ( ( nVecCount >= (nSlideTitleIndex + nSlideTitleCount) ) + && ( nType == ( VT_LPSTR | VT_VECTOR ) ) ); + + if (bVecOk) + { + for (sal_uInt32 i = 0; i != nSlideTitleIndex; ++i) + { + sal_uInt32 nTemp(0); + aPropItem.ReadUInt32(nTemp); + if (!aPropItem.good()) + { + bVecOk = false; + break; + } + auto nPos = aPropItem.Tell() + nTemp; + if (!checkSeek(aPropItem, nPos)) + { + bVecOk = false; + break; + } + } + } + if (bVecOk) + { + for (sal_uInt32 i = 0; i < nSlideTitleCount; ++i) + { + if (!aPropItem.Read(aUString, nType, false)) + break; + + OUString aString( aUString ); + if ( aString == "No Slide Title" ) + aString.clear(); + else + { + std::vector::const_iterator pIter = + std::find(maSlideNameList.begin(),maSlideNameList.end(),aString); + + if (pIter != maSlideNameList.end()) + aString.clear(); + } + maSlideNameList.push_back( aString ); + } + } + } + } + } + } + + sal_uInt8 const aUserPropSetGUID[ 16 ] + { + 0x05, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae + }; + pSection = const_cast(pDInfoSec2->GetSection( aUserPropSetGUID )); + if ( pSection ) + { + PropDictionary aDict; + pSection->GetDictionary(aDict); + if (!aDict.empty()) + { + auto iter = aDict.find( OUString("_PID_HLINKS") ); + + if ( iter != aDict.end() ) + { + if ( pSection->GetProperty( iter->second, aPropItem ) ) + { + aPropItem.Seek( STREAM_SEEK_TO_BEGIN ); + aPropItem.ReadUInt32( nType ); + if ( nType == VT_BLOB ) + { + sal_uInt32 nPropSize; + aPropItem.ReadUInt32( nPropSize ) + .ReadUInt32( nPropCount ); + + if ( ! ( nPropCount % 6 ) ) + { + sal_uInt32 i; + + nPropCount /= 6; // 6 properties per hyperlink + + for ( i = 0; i < nPropCount; i++ ) + { + SdHyperlinkEntry aHyperlink; + aHyperlink.nIndex = 0; + aPropItem.ReadUInt32( nType ); + if ( nType != VT_I4 ) + break; + aPropItem.ReadInt32( aHyperlink.nPrivate1 ) + .ReadUInt32( nType ); + if ( nType != VT_I4 ) + break; + aPropItem.ReadInt32( aHyperlink.nPrivate2 ) + .ReadUInt32( nType ); + if ( nType != VT_I4 ) + break; + aPropItem.ReadInt32( aHyperlink.nPrivate3 ) + .ReadUInt32( nType ); + if ( nType != VT_I4 ) + break; + aPropItem.ReadInt32( aHyperlink.nInfo ); + if ( !aPropItem.Read( aHyperlink.aTarget ) ) + break; + + // Convert '\\' notation to 'smb://' + INetURLObject aUrl( aHyperlink.aTarget, INetProtocol::File ); + aHyperlink.aTarget = aUrl.GetMainURL( INetURLObject::DecodeMechanism::NONE ); + + if ( !aPropItem.Read( aHyperlink.aSubAddress ) ) + break; + + if ( !aHyperlink.aSubAddress.isEmpty() ) // get the converted subaddress + { + sal_uInt32 nPageNumber = 0; + OUString aString( aHyperlink.aSubAddress ); + OString aStringAry[ 3 ]; + size_t nTokenCount = 0; + sal_Int32 nPos = 0; + do + { + aStringAry[nTokenCount] = + OUStringToOString(o3tl::getToken(aString, 0, ',', nPos ), RTL_TEXTENCODING_UTF8); + } + while ( ++nTokenCount < SAL_N_ELEMENTS(aStringAry) && nPos >= 0 ); + + bool bDocInternalSubAddress = false; + + // first pass, searching for a SlideId + for( size_t nToken = 0; nToken < nTokenCount; ++nToken ) + { + if (comphelper::string::isdigitAsciiString(aStringAry[nToken])) + { + sal_Int32 nNumber = aStringAry[ nToken ].toInt32(); + if ( nNumber & ~0xff ) + { + PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE ); + if ( pPageList ) + { + sal_uInt16 nPage = pPageList->FindPage( nNumber ); + if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND ) + { + nPageNumber = nPage; + bDocInternalSubAddress = true; + break; + } + } + } + } + } + if ( !bDocInternalSubAddress ) + { // second pass, searching for a SlideName + for ( size_t nToken = 0; nToken < nTokenCount; ++nToken ) + { + OUString aToken(OStringToOUString(aStringAry[nToken], RTL_TEXTENCODING_UTF8)); + std::vector::const_iterator pIter = + std::find(maSlideNameList.begin(),maSlideNameList.end(),aToken); + + if (pIter != maSlideNameList.end()) + { + nPageNumber = pIter - maSlideNameList.begin(); + bDocInternalSubAddress = true; + } + } + } + if ( !bDocInternalSubAddress ) + { // third pass, searching for a slide number + for ( size_t nToken = 0; nToken < nTokenCount; ++nToken ) + { + if (comphelper::string::isdigitAsciiString(aStringAry[nToken])) + { + sal_Int32 nNumber = aStringAry[ nToken ].toInt32(); + if ( ( nNumber & ~0xff ) == 0 ) + { + nPageNumber = static_cast(nNumber) - 1; + bDocInternalSubAddress = true; + break; + } + } + } + } + // if a document internal sub address + if ( bDocInternalSubAddress ) + { + if ( nPageNumber < maSlideNameList.size() ) + aHyperlink.aConvSubString = maSlideNameList[ nPageNumber ]; + if ( aHyperlink.aConvSubString.isEmpty() ) + { + aHyperlink.aConvSubString = SdResId( STR_PAGE ) + " " + mpDoc->CreatePageNumValue( static_cast(nPageNumber) + 1 ); + } + } else { + // if sub address is given but not internal, use it as it is + if ( aHyperlink.aConvSubString.isEmpty() ) + { + aHyperlink.aConvSubString = aString; + } + } + } + m_aHyperList.push_back( aHyperlink ); + } + } + } + } + } + } + } + } + } + pDInfoSec2.reset(); + + if ( mbDocumentFound ) + { + rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); + // read hyperlist / set indices of the entries + DffRecordHeader aHyperHd; + if ( SeekToRec( rStCtrl, PPT_PST_ExObjList, maDocHd.GetRecEndFilePos(), &aHyperHd ) ) + { + sal_uInt32 nExObjHyperListLen = aHyperHd.GetRecEndFilePos(); + for (SdHyperlinkEntry & entry : m_aHyperList) + { + DffRecordHeader aHyperE; + if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlink, nExObjHyperListLen, &aHyperE ) ) + break; + if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlinkAtom, nExObjHyperListLen ) ) + break; + rStCtrl.SeekRel( 8 ); + rStCtrl.ReadUInt32( entry.nIndex ); + if (!aHyperE.SeekToEndOfRecord(rStCtrl)) + break; + } + + if (m_aHyperList.size() == 0) + { + while(true) + { + + DffRecordHeader aHyperE; + if (!SeekToRec(rStCtrl, PPT_PST_ExHyperlink, nExObjHyperListLen, &aHyperE)) + break; + if (!SeekToRec(rStCtrl, PPT_PST_ExHyperlinkAtom, nExObjHyperListLen)) + continue; + + SdHyperlinkEntry aHyperlink; + + OUString aURLText; + OUString aURLLink; + rStCtrl.SeekRel(8); + rStCtrl.ReadUInt32(aHyperlink.nIndex); + + ReadString(aURLText); + ReadString(aURLLink); + aHyperlink.aTarget = aURLLink; + m_aHyperList.push_back(aHyperlink); + } + } + } + } + + if (pDocShell) + { + Size aVisAreaSize; + switch ( m_aUserEditAtom.eLastViewType ) + { + case PptViewTypeEnum::Notes: + case PptViewTypeEnum::NotesMaster: + aVisAreaSize = aDocAtom.GetNotesPageSize(); + break; + default : + aVisAreaSize = aDocAtom.GetSlidesPageSize(); + } + Scale( aVisAreaSize ); + pDocShell->SetVisArea( ::tools::Rectangle( Point(), aVisAreaSize ) ); + } + + // create master pages: + + std::unique_ptr xStbMgr; + if (!utl::ConfigManager::IsFuzzing()) + { + xStbMgr.reset(new SfxProgress(pDocShell, + SdResId( STR_POWERPOINT_IMPORT), + m_pMasterPages->size() + + m_pSlidePages->size() + m_pNotePages->size())); + } + + sal_uInt32 nImportedPages = 0; + { + sal_uInt16 nMasterCnt = GetPageCount( PPT_MASTERPAGE ); + + for ( sal_uInt16 nMasterNum = 0; nMasterNum < nMasterCnt; nMasterNum++ ) + { + SetPageNum( nMasterNum, PPT_MASTERPAGE ); + rtl::Reference pPage = static_cast(MakeBlankPage( true ).get()); + if ( pPage ) + { + bool bNotesMaster = (*GetPageList( m_eCurrentPageKind ) )[ m_nCurrentPageNum ].bNotesMaster; + bool bStarDrawFiller = (*GetPageList( m_eCurrentPageKind ) )[ m_nCurrentPageNum ].bStarDrawFiller; + + PageKind ePgKind = bNotesMaster ? PageKind::Notes : PageKind::Standard; + bool bHandout = (*GetPageList( m_eCurrentPageKind ) )[ m_nCurrentPageNum ].bHandoutMaster; + if ( bHandout ) + ePgKind = PageKind::Handout; + + pPage->SetPageKind( ePgKind ); + pSdrModel->InsertMasterPage( pPage.get() ); + if ( bNotesMaster && bStarDrawFiller ) + pPage->SetAutoLayout( AUTOLAYOUT_NOTES, true ); + if ( nMasterNum ) + { + std::optional< sal_Int16 > oStartNumbering; + SfxStyleSheet* pSheet; + if ( nMasterNum == 1 ) + { + // standardsheet + pSheet = static_cast(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_STANDARD_STYLESHEET_NAME), SfxStyleFamily::Para )); + if ( pSheet ) + { + SfxItemSet& rItemSet = pSheet->GetItemSet(); + PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 ); + PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 ); + aParagraph.AppendPortion( aPortion ); + aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast(*this), TSS_Type::Unknown ); + aPortion.ApplyTo( rItemSet, static_cast(*this), TSS_Type::Unknown ); + } + } + + // PSEUDO + pSheet = static_cast(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS), SfxStyleFamily::Pseudo )); + if ( pSheet ) + { + SfxItemSet& rItemSet = pSheet->GetItemSet(); + PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 ); + PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 ); + aParagraph.AppendPortion( aPortion ); + aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast(*this), TSS_Type::Unknown ); + aPortion.ApplyTo( rItemSet, static_cast(*this), TSS_Type::Unknown ); + } + + // create layoutstylesheets, set layoutname and stylesheet + // (only on standard and not pages) + + OUString aLayoutName( SdResId( STR_LAYOUT_DEFAULT_NAME ) ); + if ( nMasterNum > 2 ) + { + if ( ePgKind == PageKind::Standard ) + { // standard page: create new presentation layout + aLayoutName = SdResId( STR_LAYOUT_DEFAULT_TITLE_NAME ) + + OUString::number( static_cast( ( nMasterNum + 1 ) / 2 - 1 ) ); + static_cast( mpDoc->GetStyleSheetPool() )->CreateLayoutStyleSheets( aLayoutName ); + } + else // note page: use presentation layout of standard page + aLayoutName = static_cast( mpDoc->GetMasterPage( nMasterNum - 1 ) )->GetName(); + } + pPage->SetName( aLayoutName ); + aLayoutName += SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE; + pPage->SetLayoutName( aLayoutName ); + + // set stylesheets + if ( pPage->GetPageKind() == PageKind::Standard ) + { + TSS_Type nTitleInstance = TSS_Type::PageTitle; + TSS_Type nOutlinerInstance = TSS_Type::Body; + const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom(); + bool bSwapStyleSheet = pSlideLayout->eLayout == PptSlideLayout::TITLEMASTERSLIDE; + if ( bSwapStyleSheet ) + { + nTitleInstance = TSS_Type::Title; + nOutlinerInstance = TSS_Type::Subtitle; + } + + // titlestylesheet + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title ); + if ( pSheet ) + { + SfxItemSet& rItemSet = pSheet->GetItemSet(); + PPTParagraphObj aParagraph( *m_pPPTStyleSheet, nTitleInstance, 0 ); + PPTPortionObj aPortion( *m_pPPTStyleSheet, nTitleInstance, 0 ); + aParagraph.AppendPortion( aPortion ); + aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast(*this), TSS_Type::Unknown ); + aPortion.ApplyTo( rItemSet, static_cast(*this), TSS_Type::Unknown ); + } + + // outlinerstylesheet + sal_uInt16 nLevel; + PPTParagraphObj* pParagraphs[ 9 ]; + + for ( nLevel = 0; nLevel < 9; nLevel++ ) + { + OUString aName = pPage->GetLayoutName() + + " " + OUString::number( nLevel + 1 ); + SfxStyleSheet* pOutlineSheet = static_cast( mpDoc->GetStyleSheetPool()->Find( aName, SfxStyleFamily::Page ) ); + DBG_ASSERT( pOutlineSheet, "Template for outline object not found" ); + if ( pOutlineSheet ) + { + pParagraphs[ nLevel ] = new PPTParagraphObj( *m_pPPTStyleSheet, nOutlinerInstance, nLevel ); + SfxItemSet& rItemSet = pOutlineSheet->GetItemSet(); + PPTPortionObj aPortion( *m_pPPTStyleSheet, nOutlinerInstance, nLevel ); + pParagraphs[ nLevel ]->AppendPortion( aPortion ); + pParagraphs[ nLevel ]->ApplyTo( rItemSet, oStartNumbering, static_cast(*this), TSS_Type::Unknown ); + aPortion.ApplyTo( rItemSet, static_cast(*this), TSS_Type::Unknown ); + } + else + pParagraphs[ nLevel ] = nullptr; + } + for ( nLevel = 0; nLevel < 9; delete pParagraphs[ nLevel++ ] ) ; + + // subtitle stylesheet + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Text ); + if ( pSheet ) + { + SfxItemSet& rItemSet = pSheet->GetItemSet(); + PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::Subtitle, 0 ); + PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::Subtitle, 0 ); + aParagraph.AppendPortion( aPortion ); + aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast(*this), TSS_Type::Unknown ); + aPortion.ApplyTo( rItemSet, static_cast(*this), TSS_Type::Unknown ); + } + } + else if ( ePgKind == PageKind::Notes ) + { + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Notes ); + if ( pSheet ) + { + SfxItemSet& rItemSet = pSheet->GetItemSet(); + PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::Notes, 0 ); + PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::Notes, 0 ); + aParagraph.AppendPortion( aPortion ); + aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast(*this), TSS_Type::Unknown ); + aPortion.ApplyTo( rItemSet, static_cast(*this), TSS_Type::Unknown ); + } + } + } + } + } + } + for (sal_uInt16 i = 0; i < mpDoc->GetMasterPageCount(); ++i) + { + SdPage *const pMPage(static_cast(mpDoc->GetMasterPage(i))); + if (pMPage == nullptr) + break; + SetPageNum( i, PPT_MASTERPAGE ); + + // importing master page objects + PptSlidePersistList* pList = GetPageList( m_eCurrentPageKind ); + PptSlidePersistEntry* pPersist = ( pList && ( m_nCurrentPageNum < pList->size() ) ) + ? &(*pList)[ m_nCurrentPageNum ] : nullptr; + if ( pPersist ) + { + if ( pPersist->bStarDrawFiller && pPersist->bNotesMaster && ( m_nCurrentPageNum > 2 ) && ( ( m_nCurrentPageNum & 1 ) == 0 ) ) + { + pSdrModel->DeleteMasterPage( m_nCurrentPageNum ); + SdPage* pMasterPage2 = static_cast(pSdrModel->GetMasterPage( 2 )); + rtl::Reference pNotesClone = static_cast(pMasterPage2->CloneSdrPage(*pSdrModel).get()); + pSdrModel->InsertMasterPage( pNotesClone.get(), m_nCurrentPageNum ); + if ( pNotesClone ) + { + OUString aLayoutName( static_cast(pSdrModel->GetMasterPage( m_nCurrentPageNum - 1 ))->GetLayoutName() ); + pNotesClone->SetPresentationLayout( aLayoutName, false, false ); + pNotesClone->SetLayoutName( aLayoutName ); + } + } + else if ( !pPersist->bStarDrawFiller ) + { + PptSlidePersistEntry* pE = pPersist; + while( ( pE->aSlideAtom.nFlags & 4 ) && pE->aSlideAtom.nMasterId ) + { + auto nOrigMasterId = pE->aSlideAtom.nMasterId; + sal_uInt16 nNextMaster = m_pMasterPages->FindPage(nOrigMasterId); + if ( nNextMaster == PPTSLIDEPERSIST_ENTRY_NOTFOUND ) + break; + else + pE = &(*pList)[ nNextMaster ]; + if (pE->aSlideAtom.nMasterId == nOrigMasterId) + { + SAL_WARN("filter.ms", "loop in atom chain"); + break; + } + } + rtl::Reference pObj = ImportPageBackgroundObject( *pMPage, pE->nBackgroundOffset ); // import background + if ( pObj ) + pMPage->NbcInsertObject( pObj.get() ); + + bool bNewAnimationsUsed = false; + ProcessData aProcessData( (*pList)[ m_nCurrentPageNum ], SdPageCapsule(pMPage) ); + sal_uInt64 nOldFPos = rStCtrl.Tell(); + DffRecordHeader aPageHd; + if ( SeekToCurrentPage( &aPageHd ) ) + { + auto nEndRecPos = SanitizeEndPos(rStCtrl, aPageHd.GetRecEndFilePos()); + while( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nEndRecPos ) ) + { + DffRecordHeader aHd; + if (!ReadDffRecordHeader( rStCtrl, aHd )) + break; + switch( aHd.nRecType ) + { + case PPT_PST_PPDrawing : + { + aHd.SeekToBegOfRecord( rStCtrl ); + DffRecordHeader aPPDrawHd; + if ( SeekToRec( rStCtrl, PPT_PST_PPDrawing, aHd.GetRecEndFilePos(), &aPPDrawHd ) ) + { + sal_uInt32 nPPDrawEnd = aPPDrawHd.GetRecEndFilePos(); + DffRecordHeader aEscherF002Hd; + if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, nPPDrawEnd, &aEscherF002Hd ) ) + { + sal_uInt32 nEscherF002End = aEscherF002Hd.GetRecEndFilePos(); + DffRecordHeader aEscherObjListHd; + if ( SeekToRec( rStCtrl, DFF_msofbtSpgrContainer, nEscherF002End, &aEscherObjListHd ) ) + { + sal_uInt32 nObjCount = 0; + auto nListEndRecPos = SanitizeEndPos(rStCtrl, aEscherObjListHd.GetRecEndFilePos()); + while( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nListEndRecPos ) ) + { + DffRecordHeader aHd2; + ReadDffRecordHeader( rStCtrl, aHd2 ); + if ( ( aHd2.nRecType == DFF_msofbtSpContainer ) || ( aHd2.nRecType == DFF_msofbtSpgrContainer ) ) + { + if ( nObjCount++ ) // skipping the first object + { + ::tools::Rectangle aEmpty; + if (!aHd2.SeekToBegOfRecord(rStCtrl)) + break; + rtl::Reference pImpObj = ImportObj( rStCtrl, aProcessData, aEmpty, aEmpty, /*nCalledByGroup*/0, /*pShapeId*/ nullptr ); + if ( pImpObj ) + { + pImpObj->SetLayer( mnBackgroundObjectsLayerID ); + pMPage->NbcInsertObject( pImpObj.get() ); + } + } + } + if (!aHd2.SeekToEndOfRecord(rStCtrl)) + break; + } + } + } + } + } + break; + + case PPT_PST_ProgTags : + { + DffRecordHeader aProgTagHd; + if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) ) + { + auto nTagEndRecPos = SanitizeEndPos(rStCtrl, aProgTagHd.GetRecEndFilePos()); + while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nTagEndRecPos ) ) + { + DffRecordHeader aProgTagContentHd; + ReadDffRecordHeader( rStCtrl, aProgTagContentHd ); + switch( aProgTagContentHd.nRecType ) + { + case DFF_msofbtAnimGroup : + { + css::uno::Reference< css::drawing::XDrawPage > xPage( pMPage->getUnoPage(), css::uno::UNO_QUERY ); + ppt::AnimationImporter aImporter( this, rStCtrl ); + bNewAnimationsUsed = aImporter.import( xPage, aProgTagContentHd ) > 0; + } + break; + } + if (!aProgTagContentHd.SeekToEndOfRecord(rStCtrl)) + break; + } + } + } + break; + } + bool bSuccess = aHd.SeekToEndOfRecord(rStCtrl); + if (!bSuccess) + { + SAL_WARN("filter.ms", "Could not seek to end of record"); + break; + } + } + } + rStCtrl.Seek( nOldFPos ); + ImportPageEffect( pMPage, bNewAnimationsUsed ); + + // background object + pObj = pMPage->GetObj( 0 ); + if ( pObj && pObj->GetObjIdentifier() == SdrObjKind::Rectangle ) + { + if ( pMPage->GetPageKind() == PageKind::Standard ) + { + // transform data from imported background object to new form + // and delete the object. It was used as container to transport + // the attributes of the MasterPage background fill + SfxStyleSheet* pSheet = pMPage->GetStyleSheetForMasterPageBackground(); + + if(pSheet) + { + // if we have a StyleSheet (for Masterpages), set attributes there and use it + pSheet->GetItemSet().ClearItem(); + pSheet->GetItemSet().Put(pObj->GetMergedItemSet()); + pMPage->getSdrPageProperties().ClearItem(); + pMPage->getSdrPageProperties().SetStyleSheet(pSheet); + } + else + { + // without StyleSheet, set attributes directly. This + // should not be done at all and is an error (will be asserted by SdrPage) + pMPage->getSdrPageProperties().ClearItem(); + pMPage->getSdrPageProperties().PutItemSet(pObj->GetMergedItemSet()); + } + + pMPage->RemoveObject(pObj->GetOrdNum()); + pObj.clear(); + } + } + } + } + if (xStbMgr) + xStbMgr->SetState( nImportedPages++ ); + } + + // importing slide pages + { + sal_uInt64 nOldFPos = rStCtrl.Tell(); + PptPageKind ePageKind = m_eCurrentPageKind; + sal_uInt16 nPageNum = m_nCurrentPageNum; + + rtl::Reference pHandoutPage = static_cast(MakeBlankPage( false ).get()); + pHandoutPage->SetPageKind( PageKind::Handout ); + pSdrModel->InsertPage( pHandoutPage.get() ); + + sal_uInt16 nPageCnt = GetPageCount(); + if ( nPageCnt ) + { + for ( sal_uInt16 nPage = 0; nPage < nPageCnt; nPage++ ) + { + mePresChange = PresChange::SemiAuto; + SetPageNum( nPage ); + rtl::Reference pPage = static_cast(MakeBlankPage( false ).get()); + PptSlidePersistEntry* pMasterPersist = nullptr; + if ( HasMasterPage( nPage ) ) // try to get the LayoutName from the masterpage + { + sal_uInt16 nMasterNum = GetMasterPageIndex( m_nCurrentPageNum, m_eCurrentPageKind ); + pPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nMasterNum)); + PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE ); + if ( pPageList && nMasterNum < pPageList->size() ) + pMasterPersist = &(*pPageList)[ nMasterNum ]; + pPage->SetLayoutName(static_cast(pPage->TRG_GetMasterPage()).GetLayoutName()); + } + pPage->SetPageKind( PageKind::Standard ); + pSdrModel->InsertPage( pPage.get() ); // SJ: #i29625# because of form controls, the + ImportPage( pPage.get(), pMasterPersist ); // page must be inserted before importing + SetHeaderFooterPageSettings( pPage.get(), pMasterPersist ); + // CWS preseng01: pPage->SetPageKind( PageKind::Standard ); + + DffRecordHeader aPageHd; + if ( SeekToCurrentPage( &aPageHd ) ) + { + bool bNewAnimationsUsed = false; + + aPageHd.SeekToContent( rStCtrl ); + auto nEndRecPos = SanitizeEndPos(rStCtrl, aPageHd.GetRecEndFilePos()); + while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nEndRecPos ) ) + { + DffRecordHeader aHd; + ReadDffRecordHeader( rStCtrl, aHd ); + switch ( aHd.nRecType ) + { + case PPT_PST_ProgTags : + { + DffRecordHeader aProgTagHd; + if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) ) + { + auto nHdEndRecPos = SanitizeEndPos(rStCtrl, aProgTagHd.GetRecEndFilePos()); + while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nHdEndRecPos ) ) + { + DffRecordHeader aProgTagContentHd; + ReadDffRecordHeader( rStCtrl, aProgTagContentHd ); + switch( aProgTagContentHd.nRecType ) + { + case DFF_msofbtAnimGroup : + { + css::uno::Reference< css::drawing::XDrawPage > xPage( pPage->getUnoPage(), css::uno::UNO_QUERY ); + ppt::AnimationImporter aImporter( this, rStCtrl ); + bNewAnimationsUsed = aImporter.import( xPage, aProgTagContentHd ) > 0; + } + break; + + case PPT_PST_HashCodeAtom : // ??? + break; + + case PPT_PST_SlideTime10Atom : // ??? don't know, this atom is always 8 bytes big + break; // and is appearing in nearly every l10 progtag + } + if (!aProgTagContentHd.SeekToEndOfRecord(rStCtrl)) + break; + } + } + } + break; + + case PPT_PST_HeadersFooters : + case PPT_PST_PPDrawing : + default: + break; + } + + if (!aHd.SeekToEndOfRecord(rStCtrl)) + break; + } + ImportPageEffect( pPage.get(), bNewAnimationsUsed ); + } + + // creating the corresponding note page + m_eCurrentPageKind = PPT_NOTEPAGE; + rtl::Reference pNotesPage = static_cast(MakeBlankPage( false ).get()); + sal_uInt16 nNotesMasterNum = GetMasterPageIndex( nPage ) + 1; + sal_uInt32 nNotesPageId = GetNotesPageId( nPage ); + if ( nNotesPageId ) + { + nImportedPages++; + sal_uInt16 nNotesPageIndex = m_pNotePages->FindPage( nNotesPageId ); + if ( nNotesPageIndex == PPTSLIDEPERSIST_ENTRY_NOTFOUND ) + nNotesPageIndex = 0; + SetPageNum( nNotesPageIndex, PPT_NOTEPAGE ); + PptSlidePersistEntry* pMasterPersist2 = nullptr; + if ( HasMasterPage( nNotesPageIndex, PPT_NOTEPAGE ) ) // try to get the LayoutName from the masterpage + { + pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum)); + PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE ); + if ( pPageList && nNotesMasterNum < pPageList->size() ) + pMasterPersist2 = &(*pPageList)[ nNotesMasterNum ]; + pNotesPage->SetLayoutName( static_cast(pNotesPage->TRG_GetMasterPage()).GetLayoutName() ); + } + pNotesPage->SetPageKind( PageKind::Notes ); + pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum)); + pSdrModel->InsertPage( pNotesPage.get() ); // SJ: #i29625# because of form controls, the + ImportPage( pNotesPage.get(), pMasterPersist2 ); // page must be inserted before importing + SetHeaderFooterPageSettings( pNotesPage.get(), pMasterPersist2 ); + pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES ); + } + else + { + pNotesPage->SetPageKind( PageKind::Notes ); + pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum)); + pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES, true ); + pSdrModel->InsertPage( pNotesPage.get() ); + SdrObject* pPageObj = pNotesPage->GetPresObj( PresObjKind::Page ); + if ( pPageObj ) + static_cast(pPageObj)->SetReferencedPage(pSdrModel->GetPage(( nPage << 1 ) + 1)); + } + + if (xStbMgr) + xStbMgr->SetState( nImportedPages++ ); + } + } + else + { + // that can happen by document templates + m_eCurrentPageKind = PPT_SLIDEPAGE; + rtl::Reference pPage = static_cast(MakeBlankPage( false ).get()); + pSdrModel->InsertPage( pPage.get() ); + + // #i37397#, trying to set the title master for the first page + sal_uInt16 nMaster, nMasterCount = pSdrModel->GetMasterPageCount(); + SdPage* pFoundMaster = nullptr; + for ( nMaster = 1; nMaster < nMasterCount; nMaster++ ) + { + SdPage* pMaster = static_cast( pSdrModel->GetMasterPage( nMaster ) ); + if ( pMaster->GetPageKind() == PageKind::Standard ) + { + SetPageNum( nMaster, PPT_MASTERPAGE ); + if ( !pFoundMaster ) + pFoundMaster = pMaster; + else if ( GetSlideLayoutAtom()->eLayout == PptSlideLayout::TITLEMASTERSLIDE ) + pFoundMaster = pMaster; + if ( GetSlideLayoutAtom()->eLayout == PptSlideLayout::TITLEMASTERSLIDE ) + break; + } + } + if ( pFoundMaster ) + { + pPage->TRG_SetMasterPage( *pFoundMaster ); + pPage->SetLayoutName( pFoundMaster->GetLayoutName() ); + } + pPage->SetAutoLayout( AUTOLAYOUT_TITLE, true, true ); + + m_eCurrentPageKind = PPT_NOTEPAGE; + rtl::Reference pNPage = MakeBlankPage( false ); + pSdrModel->InsertPage( pNPage.get() ); + } + SetPageNum( nPageNum, ePageKind ); + rStCtrl.Seek( nOldFPos ); + } + + // create handout and note pages + m_bOk = mpDoc->CreateMissingNotesAndHandoutPages(); + if ( m_bOk ) + { + for ( sal_uInt16 i = 0; i < mpDoc->GetSdPageCount( PageKind::Standard ); i++ ) + { + + // set AutoLayout + SetPageNum( i ); + SdPage* pPage = mpDoc->GetSdPage( i, PageKind::Standard ); + AutoLayout eAutoLayout = AUTOLAYOUT_NONE; + const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom(); + if ( pSlideLayout ) + { + switch ( pSlideLayout->eLayout ) // presentation layout for standard pages + { + case PptSlideLayout::TITLEANDBODYSLIDE : + { + eAutoLayout = AUTOLAYOUT_TITLE_CONTENT; + PptPlaceholder nID1 = pSlideLayout->aPlaceholderId[ 1 ]; + switch ( nID1 ) + { + case PptPlaceholder::BODY : + eAutoLayout = AUTOLAYOUT_TITLE_CONTENT; + break; + case PptPlaceholder::TABLE : + eAutoLayout = AUTOLAYOUT_TAB; + break; + case PptPlaceholder::ORGANISZATIONCHART : + eAutoLayout = AUTOLAYOUT_ORG; + break; + case PptPlaceholder::GRAPH : + eAutoLayout = AUTOLAYOUT_CHART; + break; + case PptPlaceholder::OBJECT : + eAutoLayout = AUTOLAYOUT_OBJ; + break; + case PptPlaceholder::VERTICALTEXTBODY : + eAutoLayout = AUTOLAYOUT_TITLE_VCONTENT; + break; + default: break; + } + } + break; + + case PptSlideLayout::TWOCOLUMNSANDTITLE : + { + eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT; + PptPlaceholder nID1 = pSlideLayout->aPlaceholderId[ 1 ]; + PptPlaceholder nID2 = pSlideLayout->aPlaceholderId[ 2 ]; + if ( nID1 == PptPlaceholder::BODY && nID2 == PptPlaceholder::GRAPH ) + eAutoLayout = AUTOLAYOUT_TEXTCHART; + else if ( nID1 == PptPlaceholder::GRAPH && nID2 == PptPlaceholder::BODY ) + eAutoLayout = AUTOLAYOUT_CHARTTEXT; + else if ( nID1 == PptPlaceholder::BODY && nID2 == PptPlaceholder::CLIPART ) + eAutoLayout = AUTOLAYOUT_TEXTCLIP; + else if ( nID1 == PptPlaceholder::CLIPART && nID2 == PptPlaceholder::BODY ) + eAutoLayout = AUTOLAYOUT_CLIPTEXT; + else if ( nID1 == PptPlaceholder::CLIPART && nID2 == PptPlaceholder::VERTICALTEXTBODY ) + eAutoLayout = AUTOLAYOUT_TITLE_2VTEXT; + else if ( ( nID1 == PptPlaceholder::BODY ) + && ( ( nID2 == PptPlaceholder::OBJECT ) || ( nID2 == PptPlaceholder::MEDIACLIP ) ) ) + eAutoLayout = AUTOLAYOUT_TEXTOBJ; + else if ( ( nID2 == PptPlaceholder::BODY ) + && ( ( nID1 == PptPlaceholder::OBJECT ) || ( nID1 == PptPlaceholder::MEDIACLIP ) ) ) + eAutoLayout = AUTOLAYOUT_OBJTEXT; + else if ( ( nID1 == PptPlaceholder::OBJECT ) && ( nID2 == PptPlaceholder::OBJECT ) ) + eAutoLayout = AUTOLAYOUT_OBJ; + } + break; + + case PptSlideLayout::TWOROWSANDTITLE : + { + eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT; + PptPlaceholder nID1 = pSlideLayout->aPlaceholderId[ 1 ]; + PptPlaceholder nID2 = pSlideLayout->aPlaceholderId[ 2 ]; + if ( nID1 == PptPlaceholder::BODY && nID2 == PptPlaceholder::OBJECT ) + eAutoLayout = AUTOLAYOUT_TEXTOVEROBJ; + else if ( nID1 == PptPlaceholder::OBJECT && nID2 == PptPlaceholder::BODY ) + eAutoLayout = AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT; + } + break; + + case PptSlideLayout::TITLESLIDE : + eAutoLayout = AUTOLAYOUT_TITLE; + break; + case PptSlideLayout::ONLYTITLE : + eAutoLayout = AUTOLAYOUT_TITLE_ONLY; + break; + case PptSlideLayout::RIGHTCOLUMN2ROWS : + eAutoLayout = AUTOLAYOUT_TITLE_CONTENT_2CONTENT; + break; + case PptSlideLayout::LEFTCOLUMN2ROWS : + eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT_CONTENT; + break; + case PptSlideLayout::TOPROW2COLUMN : + eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT; + break; + case PptSlideLayout::FOUROBJECTS : + eAutoLayout = AUTOLAYOUT_TITLE_4CONTENT; + break; + case PptSlideLayout::BIGOBJECT : + eAutoLayout = AUTOLAYOUT_OBJ; + break; + case PptSlideLayout::TITLERIGHTBODYLEFT : + eAutoLayout = AUTOLAYOUT_VTITLE_VCONTENT; + break; + case PptSlideLayout::TITLERIGHT2BODIESLEFT : + eAutoLayout = AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT; + break; + + case PptSlideLayout::BOTTOMROW2COLUMNS : + case PptSlideLayout::BLANKSLIDE : + case PptSlideLayout::MASTERSLIDE : // layout of the standard and title master page + case PptSlideLayout::TITLEMASTERSLIDE : + case PptSlideLayout::MASTERNOTES : // layout of the note master page + case PptSlideLayout::NOTESTITLEBODY : // presentation layout for note pages + case PptSlideLayout::HANDOUTLAYOUT : // presentation layout for handout + eAutoLayout = AUTOLAYOUT_NONE; + break; + } + if ( eAutoLayout != AUTOLAYOUT_NONE ) + pPage->SetAutoLayout( eAutoLayout ); + } + } + + // handout master page: auto layout + SdPage* pHandoutMPage = mpDoc->GetMasterSdPage( 0, PageKind::Handout ); + pHandoutMPage->SetAutoLayout( AUTOLAYOUT_HANDOUT6, true, true ); + } + + sal_uInt32 nSlideCount = GetPageCount(); + for ( sal_uInt32 i = 0; ( i < nSlideCount) && ( i < maSlideNameList.size() ); i++ ) + { + SdPage* pPage = mpDoc->GetSdPage( i, PageKind::Standard ); + OUString &aName = maSlideNameList[ i ]; + if ( pPage ) + { + if ( !aName.isEmpty() ) + pPage->SetName( aName ); + else + aName = pPage->GetName(); + } + } + if ( mbDocumentFound ) + { + mpDoc->SetSummationOfParagraphs(); + if ( pDocShell ) + { + ::sd::FrameView* pFrameView = mpDoc->GetFrameView( 0 ); + if ( !pFrameView ) + { + std::vector> &rViews = mpDoc->GetFrameViewList(); + pFrameView = new ::sd::FrameView( mpDoc ); + rViews.push_back( std::unique_ptr(pFrameView) ); + } + sal_uInt16 nSelectedPage = 0; + PageKind ePageKind = PageKind::Standard; + EditMode eEditMode = EditMode::Page; + + switch ( m_aUserEditAtom.eLastViewType ) + { + case PptViewTypeEnum::Outline: + mrMed.GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, 3 ) ); + break; + case PptViewTypeEnum::SlideSorter: + mrMed.GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, 2 ) ); + break; + case PptViewTypeEnum::TitleMaster: + nSelectedPage = 1; + [[fallthrough]]; + case PptViewTypeEnum::SlideMaster: + { + ePageKind = PageKind::Standard; + eEditMode = EditMode::MasterPage; + } + break; + case PptViewTypeEnum::NotesMaster: + eEditMode = EditMode::MasterPage; + [[fallthrough]]; + case PptViewTypeEnum::Notes: + ePageKind = PageKind::Notes; + break; + case PptViewTypeEnum::Handout: + ePageKind = PageKind::Handout; + break; + default : + case PptViewTypeEnum::Slide: + break; + } + pFrameView->SetPageKind( ePageKind ); + pFrameView->SetSelectedPage( nSelectedPage ); + pFrameView->SetViewShEditMode( eEditMode ); + } + DffRecordHeader aCustomShowHeader; + // read and set custom show + rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); + if ( SeekToRec( rStCtrl, PPT_PST_NamedShows, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) ) + { + DffRecordHeader aCuHeader; + while( SeekToRec( rStCtrl, PPT_PST_NamedShow, aCustomShowHeader.GetRecEndFilePos(), &aCuHeader ) ) + { + DffRecordHeader aContent; + if ( SeekToRec( rStCtrl, PPT_PST_CString, aCuHeader.GetRecEndFilePos(), &aContent ) ) + { + OUString aCuShow; + aContent.SeekToBegOfRecord( rStCtrl ); + if ( ReadString( aCuShow ) ) + { + if ( SeekToRec( rStCtrl, PPT_PST_NamedShowSlides, aCuHeader.GetRecEndFilePos(), &aContent ) ) + { + PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE ); + const auto nRemainingSize = rStCtrl.remainingSize(); + sal_uInt32 nBCount = aContent.nRecLen; + if (nBCount > nRemainingSize) + { + SAL_WARN("filter.ms", "page number data len longer than remaining stream size"); + nBCount = nRemainingSize; + } + sal_uInt32 nSCount = nBCount >> 2; + + if ( pPageList && nSCount ) + { + SdCustomShowList* pList = mpDoc->GetCustomShowList( true ); + if ( pList ) + { + std::unique_ptr pSdCustomShow(new SdCustomShow); + pSdCustomShow->SetName( aCuShow ); + sal_uInt32 nFound = 0; + for ( sal_uInt32 nS = 0; nS < nSCount; nS++ ) + { + sal_uInt32 nPageNumber; + rStCtrl.ReadUInt32( nPageNumber ); + sal_uInt16 nPage = pPageList->FindPage( nPageNumber ); + if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND ) + { + SdPage* pPage = mpDoc->GetSdPage( nPage, PageKind::Standard ); + if ( pPage ) + { + pSdCustomShow->PagesVector().push_back( pPage ); + nFound++; + } + } + } + if ( nFound ) + pList->push_back( std::move(pSdCustomShow) ); + } + } + } + } + } + } + } + // this is defaulted, maybe there is no SSDocInfoAtom + OUStringBuffer aCustomShow; + sal_uInt32 nFlags = 1; // Bit 0: Auto advance + sal_uInt16 nStartSlide = 0; + + // read the pres. configuration + rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); + if ( SeekToRec( rStCtrl, PPT_PST_SSDocInfoAtom, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) ) + { + sal_uInt32 nPenColor = 0x1000000; + sal_Int32 nRestartTime = 0x7fffffff; + sal_Int16 nEndSlide = 0; + rStCtrl.ReadUInt32( nPenColor ) + .ReadInt32( nRestartTime ) + .ReadUInt16( nStartSlide ) + .ReadInt16( nEndSlide ); + + sal_Unicode nChar; + for ( sal_uInt32 i2 = 0; i2 < 32; i2++ ) + { + rStCtrl.ReadUtf16( nChar ); + if ( nChar ) + aCustomShow.append( nChar ); + else + { + rStCtrl.SeekRel( ( 31 - i2 ) << 1 ); + break; + } + } + rStCtrl.ReadUInt32( nFlags ); + } + // set the current custom show + if ( !aCustomShow.isEmpty() ) + { + SdCustomShowList* pList = mpDoc->GetCustomShowList(); + if ( pList ) + { + SdCustomShow* pPtr = nullptr; + OUString aCustomShowStr = aCustomShow.makeStringAndClear(); + for( pPtr = pList->First(); pPtr; pPtr = pList->Next() ) + { + if ( pPtr->GetName() == aCustomShowStr ) + break; + } + if ( !pPtr ) + pList->First(); + } + } + sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings(); + + rPresSettings.mbManual = ( nFlags & 1 ) == 0; + rPresSettings.mbAnimationAllowed = ( nFlags & 2 ) == 0; + rPresSettings.mbAll = ( nFlags & 4 ) == 0; + rPresSettings.mbCustomShow = ( nFlags & 8 ) != 0; + rPresSettings.mbEndless = ( nFlags & 0x80 ) != 0; + rPresSettings.mbFullScreen = ( nFlags & 0x10 ) == 0; + + if ( nStartSlide && ( nStartSlide <= GetPageCount() ) ) + { + SdPage* pPage = mpDoc->GetSdPage( nStartSlide - 1, PageKind::Standard ); + if ( pPage ) + rPresSettings.maPresPage = pPage->GetName(); + } + } + + xStbMgr.reset(); + + // read DocumentProperties + uno::Reference xDPS( + mpDoc->GetObjectShell()->GetModel(), uno::UNO_QUERY_THROW); + uno::Reference xDocProps + = xDPS->getDocumentProperties(); + sfx2::LoadOlePropertySet(xDocProps, &mrStorage); + xDocProps->setTemplateName(OUString()); + + pSdrModel->setLock(bWasLocked); + pSdrModel->EnableUndo(bSavedUndoEnabled); + return m_bOk; +} + +void ImplSdPPTImport::SetHeaderFooterPageSettings( SdPage* pPage, const PptSlidePersistEntry* pMasterPersist ) +{ + sal_uInt32 i; + PptSlidePersistList* pList = GetPageList( m_eCurrentPageKind ); + if ( ( !pList ) || ( pList->size() <= m_nCurrentPageNum ) ) + return; + PptSlidePersistEntry& rSlidePersist = (*pList)[ m_nCurrentPageNum ]; + HeaderFooterEntry* pHFE = rSlidePersist.xHeaderFooterEntry.get(); + if (!pHFE) + return; + + for ( i = 0; i < 4; i++ ) + { + bool bVisible = pHFE->IsToDisplay( i ); + if ( ( m_eCurrentPageKind == PPT_SLIDEPAGE ) + && ( rSlidePersist.aSlideAtom.aLayout.eLayout == PptSlideLayout::TITLESLIDE ) + && ( aDocAtom.bTitlePlaceholdersOmitted ) ) + { + bVisible = false; + } + if ( bVisible && pMasterPersist ) + { + sal_uInt32 nPosition = pHFE->NeedToImportInstance( i, rSlidePersist ); + if ( nPosition ) + { + ::tools::Rectangle aEmpty; + bVisible = false; + rStCtrl.Seek( nPosition ); + ProcessData aProcessData( rSlidePersist, SdPageCapsule(pPage) ); + rtl::Reference pObj = ImportObj( rStCtrl, aProcessData, aEmpty, aEmpty, /*nCalledByGroup*/0, /*pShapeId*/nullptr ); + if ( pObj ) + pPage->NbcInsertObject( pObj.get(), 0 ); + } + } + OUString aPlaceHolderString = pHFE->pPlaceholder[ i ]; + + sd::HeaderFooterSettings rHeaderFooterSettings( pPage->getHeaderFooterSettings() ); + switch( i ) + { + case 0 : + { + rHeaderFooterSettings.mbDateTimeVisible = bVisible; + rHeaderFooterSettings.mbDateTimeIsFixed = ( pHFE->nAtom & 0x20000 ) == 0; + rHeaderFooterSettings.maDateTimeText = aPlaceHolderString; + SvxDateFormat eDateFormat; + SvxTimeFormat eTimeFormat; + PPTFieldEntry::GetDateTime( pHFE->nAtom & 0xff, eDateFormat, eTimeFormat ); + rHeaderFooterSettings.meDateFormat = eDateFormat; + rHeaderFooterSettings.meTimeFormat = eTimeFormat; + } + break; + case 1 : + { + rHeaderFooterSettings.mbHeaderVisible = bVisible; + rHeaderFooterSettings.maHeaderText = aPlaceHolderString; + } + break; + case 2 : + { + rHeaderFooterSettings.mbFooterVisible = bVisible; + rHeaderFooterSettings.maFooterText = aPlaceHolderString; + } + break; + case 3 : + { + rHeaderFooterSettings.mbSlideNumberVisible = bVisible; + } + break; + } + pPage->setHeaderFooterSettings( rHeaderFooterSettings ); + } +} + +namespace { + +// Import of pages +struct Ppt97AnimationStlSortHelper +{ + bool operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 ); +}; + +} + +bool Ppt97AnimationStlSortHelper::operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 ) +{ + if( !p1.second || !p2.second ) + return p1.second.get() < p2.second.get(); + if( *p1.second < *p2.second ) + return true; + if( *p1.second > *p2.second ) + return false; + return p1.first->GetOrdNum() < p2.first->GetOrdNum(); +} + +void ImplSdPPTImport::ImportPageEffect( SdPage* pPage, const bool bNewAnimationsUsed ) +{ + sal_uInt64 nOldFilePos = rStCtrl.Tell(); + + // set PageKind at page (up to now only PageKind::Standard or PageKind::Notes) + if ( pPage->GetPageKind() == PageKind::Standard ) + { + PptSlidePersistList* pPersistList = GetPageList( m_eCurrentPageKind ); + PptSlidePersistEntry* pActualSlidePersist = ( pPersistList && ( m_nCurrentPageNum < pPersistList->size() ) ) + ? &(*pPersistList)[ m_nCurrentPageNum ] : nullptr; + + if ( pActualSlidePersist && ( m_eCurrentPageKind == PPT_SLIDEPAGE ) ) + { + if ( ! ( pActualSlidePersist->aSlideAtom.nFlags & 1 ) ) // do not follow master objects ? + { + if(pPage->TRG_HasMasterPage()) + { + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + aVisibleLayers.Set(mnBackgroundObjectsLayerID, false); + pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + } + } + DffRecordHeader aPageRecHd; + if ( SeekToCurrentPage( &aPageRecHd ) ) + { + sal_uLong nPageRecEnd = SanitizeEndPos(rStCtrl, aPageRecHd.GetRecEndFilePos()); + + bool bTryTwice = ( m_eCurrentPageKind == PPT_SLIDEPAGE ); + bool bSSSlideInfoAtom = false; + while ( true ) + { + while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nPageRecEnd ) ) + { + DffRecordHeader aHd; + ReadDffRecordHeader( rStCtrl, aHd ); + switch ( aHd.nRecType ) + { + case PPT_PST_SSSlideInfoAtom: + { + bSSSlideInfoAtom = true; + if ( m_eCurrentPageKind == PPT_MASTERPAGE ) + { + if ( pActualSlidePersist ) + pActualSlidePersist->aPersistAtom.nReserved = aHd.GetRecBegFilePos(); + } + else + { + sal_Int8 nDirection, nTransitionType, nByteDummy, nSpeed; + sal_Int16 nBuildFlags; + sal_Int32 nSlideTime, nSoundRef; + rStCtrl.ReadInt32( nSlideTime ) // time to show (in Ticks) + .ReadInt32( nSoundRef ) // Index of SoundCollection + .ReadSChar( nDirection ) // direction of fade effect + .ReadSChar( nTransitionType ) // fade effect + .ReadInt16( nBuildFlags ) // Buildflags (s.u.) + .ReadSChar( nSpeed ) // speed (slow, medium, fast) + .ReadSChar( nByteDummy ).ReadSChar( nByteDummy ).ReadSChar( nByteDummy ); + + switch ( nTransitionType ) + { + case PPT_TRANSITION_TYPE_BLINDS : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_VERTICAL_STRIPES ); // fade vertical + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_HORIZONTAL_STRIPES ); // fade horizontal + } + break; + case PPT_TRANSITION_TYPE_CHECKER : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_HORIZONTAL_CHECKERBOARD ); // fade vertical with offset ?? + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_VERTICAL_CHECKERBOARD ); // fade horizontal with offset ?? + } + break; + case PPT_TRANSITION_TYPE_COVER : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_RIGHT ); // overlay from right + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_BOTTOM ); // overlay from bottom + else if ( nDirection == 2 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_LEFT ); // overlay from left + else if ( nDirection == 3 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_TOP ); // overlay from top + else if ( nDirection == 4 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_LOWERRIGHT ); // overlay from bottom right ?? + else if ( nDirection == 5 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_LOWERLEFT ); // overlay from bottom left ?? + else if ( nDirection == 6 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_UPPERRIGHT ); // overlay from top right + else if ( nDirection == 7 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_UPPERLEFT ); // overlay from top left ?? + } + break; + case PPT_TRANSITION_TYPE_NONE : + { + if ( nBuildFlags ) + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_NONE ); // direct + else if ( nDirection == 1 ) + { + pPage->setTransitionType( animations::TransitionType::BARWIPE ); + pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR ); + pPage->setTransitionFadeColor( 0 ); + } + } + else + pPage->setTransitionType( 0 ); + } + break; + case PPT_TRANSITION_TYPE_DISSOLVE : + pPage->SetFadeEffect(css::presentation::FadeEffect_DISSOLVE); // dissolve + break; + case PPT_TRANSITION_TYPE_RANDOM_BARS : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_HORIZONTAL_LINES ); // horizontal lines + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_VERTICAL_LINES ); // vertical lines + } + break; + case PPT_TRANSITION_TYPE_SPLIT : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_OPEN_VERTICAL ); // open horizontal ?? + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_CLOSE_VERTICAL ); // close horizontal ?? + else if ( nDirection == 2 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_OPEN_HORIZONTAL ); // open vertical ?? + else if ( nDirection == 3 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_CLOSE_HORIZONTAL ); // close vertical ?? + } + break; + case PPT_TRANSITION_TYPE_STRIPS : + { + if ( nDirection == 4 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_LOWERRIGHT ); // diagonal to top left + else if ( nDirection == 5 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_LOWERLEFT ); // diagonal to top right + else if ( nDirection == 6 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_UPPERRIGHT ); // diagonal to bottom left + else if ( nDirection == 7 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_UPPERLEFT ); // diagonal to bottom right + } + break; + case PPT_TRANSITION_TYPE_PULL : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_LEFT ); // uncover to left + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_TOP ); // uncover to top + else if ( nDirection == 2 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_RIGHT ); // uncover to right + else if ( nDirection == 3 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_BOTTOM ); // uncover to bottom + else if ( nDirection == 4 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_UPPERLEFT ); // uncover to top left + else if ( nDirection == 5 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT ); // uncover to top right + else if ( nDirection == 6 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_LOWERLEFT ); // uncover to bottom left + else if ( nDirection == 7 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT ); // uncover to bottom right + } + break; + case PPT_TRANSITION_TYPE_WIPE : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_RIGHT ); // roll from right + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_BOTTOM ); // roll from bottom + else if ( nDirection == 2 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_LEFT ); // roll from left + else if ( nDirection == 3 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_TOP ); // roll from top + } + break; + case PPT_TRANSITION_TYPE_RANDOM : + pPage->SetFadeEffect( css::presentation::FadeEffect_RANDOM ); // automatic + break; + case PPT_TRANSITION_TYPE_FADE : + { + pPage->setTransitionType( animations::TransitionType::FADE ); + pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR ); + pPage->setTransitionFadeColor( 0 ); + } + break; + case PPT_TRANSITION_TYPE_ZOOM : + { + if ( nDirection == 0 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_CENTER ); // fade from center + else if ( nDirection == 1 ) + pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_TO_CENTER ); // fade from the outside + } + break; + case PPT_TRANSITION_TYPE_DIAMOND : + { + pPage->setTransitionType( animations::TransitionType::IRISWIPE ); + pPage->setTransitionSubtype( animations::TransitionSubType::DIAMOND ); + } + break; + case PPT_TRANSITION_TYPE_PLUS : + { + pPage->setTransitionType( animations::TransitionType::FOURBOXWIPE ); + pPage->setTransitionSubtype( animations::TransitionSubType::CORNERSOUT ); + } + break; + case PPT_TRANSITION_TYPE_CIRCLE : + { + pPage->setTransitionType( animations::TransitionType::ELLIPSEWIPE ); + pPage->setTransitionSubtype( animations::TransitionSubType::CIRCLE ); + } + break; + case PPT_TRANSITION_TYPE_WEDGE : + { + pPage->setTransitionType( animations::TransitionType::FANWIPE ); + pPage->setTransitionSubtype( animations::TransitionSubType::CENTERTOP ); + } + break; + case PPT_TRANSITION_TYPE_WHEEL : + { + pPage->setTransitionType( animations::TransitionType::PINWHEELWIPE ); + sal_Int16 nSubType; + switch( nDirection ) + { + default: + case 1 : nSubType = animations::TransitionSubType::ONEBLADE; break; + case 2 : nSubType = animations::TransitionSubType::TWOBLADEVERTICAL; break; + case 3 : nSubType = animations::TransitionSubType::THREEBLADE; break; + case 4 : nSubType = animations::TransitionSubType::FOURBLADE; break; + case 8 : nSubType = animations::TransitionSubType::EIGHTBLADE; break; + } + pPage->setTransitionSubtype( nSubType ); + } + break; + case PPT_TRANSITION_TYPE_PUSH : + { + pPage->setTransitionType( animations::TransitionType::PUSHWIPE ); + sal_Int16 nSubType; + switch( nDirection ) + { + default: + case 0 : nSubType = animations::TransitionSubType::FROMRIGHT; break; + case 1 : nSubType = animations::TransitionSubType::FROMBOTTOM; break; + case 2 : nSubType = animations::TransitionSubType::FROMLEFT; break; + case 3 : nSubType = animations::TransitionSubType::FROMTOP; break; + } + pPage->setTransitionSubtype( nSubType ); + } + break; + case PPT_TRANSITION_TYPE_COMB : + { + pPage->setTransitionType( animations::TransitionType::PUSHWIPE ); + pPage->setTransitionSubtype( nDirection ? animations::TransitionSubType::COMBVERTICAL : animations::TransitionSubType::COMBHORIZONTAL ); + } + break; + case PPT_TRANSITION_TYPE_NEWSFLASH : + { + pPage->setTransitionType( animations::TransitionType::ZOOM ); + pPage->setTransitionSubtype( animations::TransitionSubType::ROTATEIN ); + } + break; + case PPT_TRANSITION_TYPE_SMOOTHFADE : + { + pPage->setTransitionType( animations::TransitionType::FADE ); + pPage->setTransitionSubtype( animations::TransitionSubType::CROSSFADE ); + } + break; + } + + if ( nSpeed == 0 ) + pPage->setTransitionDuration( 1.0 ); // slow + else if ( nSpeed == 1 ) + pPage->setTransitionDuration( 0.75 ); // medium + else if ( nSpeed == 2 ) + pPage->setTransitionDuration( 0.5 ); // fast + + if ( nBuildFlags & 0x400 ) // slidechange by time + { // time to show (in Ticks) + pPage->SetPresChange( PresChange::Auto ); + pPage->SetTime( nSlideTime / 1000.0 ); + } + else + pPage->SetPresChange( mePresChange ); + + if ( nBuildFlags & 4 ) + pPage->SetExcluded( true ); // don't show slide + if ( nBuildFlags & 16 ) + { // slide with sound effect + pPage->SetSound( true ); + OUString aSoundFile( ReadSound( nSoundRef ) ); + pPage->SetSoundFile( aSoundFile ); + } + if ( nBuildFlags & ( 1 << 6 ) ) // Loop until next sound + pPage->SetLoopSound( true ); + if ( nBuildFlags & ( 1 << 8 ) ) // Stop the previous sound + pPage->SetStopSound( true ); + break; + } + } + } + if (!aHd.SeekToEndOfRecord(rStCtrl)) + break; + } + if ( bTryTwice && !bSSSlideInfoAtom ) + { + bTryTwice = false; + if ( HasMasterPage( m_nCurrentPageNum, m_eCurrentPageKind ) ) + { + sal_uInt16 nMasterNum = GetMasterPageIndex( m_nCurrentPageNum, m_eCurrentPageKind ); + PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE ); + if ( pPageList && ( nMasterNum < pPageList->size() ) ) + { + assert( !pPageList->is_null( nMasterNum ) ); + const PptSlidePersistEntry& rE = (*pPageList)[ nMasterNum ]; + sal_uInt32 nOfs = rE.aPersistAtom.nReserved; + if ( nOfs ) + { + rStCtrl.Seek( nOfs ); + nPageRecEnd = nOfs + 16; + continue; + } + } + + } + } + break; + } + } + } + + if ( !bNewAnimationsUsed ) + { + std::vector< std::pair< SdrObject*, Ppt97AnimationPtr > > aAnimationsOnThisPage; + + // add effects from page in correct order + SdrObjListIter aSdrIter( pPage, SdrIterMode::Flat ); + while ( aSdrIter.IsMore() ) + { + SdrObject* pObj = aSdrIter.Next(); + tAnimationMap::iterator aFound = maAnimations.find( pObj ); + if( aFound != maAnimations.end() ) + { + std::pair< SdrObject*, Ppt97AnimationPtr > aPair( (*aFound).first, (*aFound).second ); + aAnimationsOnThisPage.push_back( aPair ); + } + } + + std::sort( aAnimationsOnThisPage.begin(), aAnimationsOnThisPage.end(), Ppt97AnimationStlSortHelper() ); + + for( auto& rEntry : aAnimationsOnThisPage ) + { + Ppt97AnimationPtr pPpt97Animation = rEntry.second; + if( pPpt97Animation ) + pPpt97Animation->createAndSetCustomAnimationEffect( rEntry.first ); + } + } + rStCtrl.Seek( nOldFilePos ); +} + +// import of sounds + +// Not only the sounds are imported as string, they are also inserted to +// the gallery if they are not already there. +OUString ImplSdPPTImport::ReadSound(sal_uInt32 nSoundRef) const +{ + OUString aRetval; + sal_uInt64 nOldPos = rStCtrl.Tell(); + DffRecordHeader aDocHd; + if ( SeekToDocument( &aDocHd ) ) + { + sal_uInt32 nSoundLen = aDocHd.GetRecEndFilePos(); + DffRecordHeader aSoundBlockRecHd; + if( SeekToRec( rStCtrl, PPT_PST_SoundCollection, nSoundLen, &aSoundBlockRecHd ) ) + { + sal_uInt32 nDataLen = aSoundBlockRecHd.GetRecEndFilePos(); + DffRecordHeader aSoundRecHd; + bool bRefStrValid = false; + bool bDone = false; + + while( !bDone && SeekToRec( rStCtrl, PPT_PST_Sound, nDataLen, &aSoundRecHd ) ) + { + sal_uInt32 nStrLen = aSoundRecHd.GetRecEndFilePos(); + OUString aRefStr; + sal_uInt64 nOldPos2 = rStCtrl.Tell(); + if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen, nullptr, 2 ) ) + { + if ( ReadString( aRefStr ) ) + bRefStrValid = true; + } + if ( bRefStrValid ) + { + if ( std::u16string_view(OUString::number(nSoundRef)) == aRefStr ) + { + rStCtrl.Seek( nOldPos2 ); + if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen ) ) + { + ReadString( aRetval ); + bDone = true; + } + } + } + if ( bDone ) + { + // Check if this sound file already exists. + // If not, it is exported to our local sound directory. + bool bSoundExists = false; + ::std::vector< OUString > aSoundList; + + GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, aSoundList ); + GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, aSoundList ); + + for( size_t n = 0; ( n < aSoundList.size() ) && !bSoundExists; ++n ) + { + INetURLObject aURL( aSoundList[ n ] ); + + if (aURL.GetLastName() == aRetval) + { + aRetval = aSoundList[ n ]; + bSoundExists = true; + } + } + + aSoundList.clear(); + + if ( !bSoundExists ) + { + rStCtrl.Seek( nOldPos2 ); + DffRecordHeader aSoundDataRecHd; + if ( SeekToRec( rStCtrl, PPT_PST_SoundData, nStrLen, &aSoundDataRecHd ) ) + { + OUString aGalleryDir; + if (utl::ConfigManager::IsFuzzing()) + osl_getTempDirURL(&aGalleryDir.pData); + else + aGalleryDir = SvtPathOptions().GetGalleryPath(); + // Use last token delimited by ';'. copy(lastIndexOf+1) works whether + // string is empty or not and whether ';' is there or not. + INetURLObject aGalleryUserSound( aGalleryDir.subView(aGalleryDir.lastIndexOf(';')+1) ); + + aGalleryUserSound.Append( aRetval ); + const auto nRemainingSize = rStCtrl.remainingSize(); + sal_uInt32 nSoundDataLen = aSoundDataRecHd.nRecLen; + if (nSoundDataLen > nRemainingSize) + { + SAL_WARN("filter.ms", "sound data len longer than remaining stream size"); + nSoundDataLen = nRemainingSize; + } + std::vector aBuf(nSoundDataLen); + + rStCtrl.ReadBytes(aBuf.data(), nSoundDataLen); + std::unique_ptr pOStm = ::utl::UcbStreamHelper::CreateStream( aGalleryUserSound.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::WRITE | StreamMode::TRUNC ); + + if( pOStm ) + { + pOStm->WriteBytes(aBuf.data(), nSoundDataLen); + + if( pOStm->GetError() == ERRCODE_NONE ) + { + GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aGalleryUserSound.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ); + aRetval = aGalleryUserSound.GetMainURL( INetURLObject::DecodeMechanism::NONE ); + } + } + } + } + } + if ( !bDone ) + { + if (!aSoundRecHd.SeekToEndOfRecord(rStCtrl)) + break; + } + } + } + } + rStCtrl.Seek( nOldPos ); + return aRetval; +} + +// media object import, the return value is the url to the media object +OUString ImplSdPPTImport::ReadMedia( sal_uInt32 nMediaRef ) const +{ + OUString aRetVal; + DffRecordHeader* pHd( const_cast(this)->aDocRecManager.GetRecordHeader( PPT_PST_ExObjList ) ); + if ( pHd ) + { + pHd->SeekToContent( rStCtrl ); + auto nEndRecPos = SanitizeEndPos(rStCtrl, pHd->GetRecEndFilePos()); + while ( ( rStCtrl.Tell() < nEndRecPos ) && aRetVal.isEmpty() ) + { + DffRecordHeader aHdMovie; + ReadDffRecordHeader( rStCtrl, aHdMovie ); + switch( aHdMovie.nRecType ) + { + case PPT_PST_ExAviMovie : + case PPT_PST_ExMCIMovie : + { + DffRecordHeader aExVideoHd; + if ( SeekToRec( rStCtrl, PPT_PST_ExVideo, aHdMovie.GetRecEndFilePos(), &aExVideoHd ) ) + { + DffRecordHeader aExMediaAtomHd; + if ( SeekToRec( rStCtrl, PPT_PST_ExMediaAtom, aExVideoHd.GetRecEndFilePos(), &aExMediaAtomHd ) ) + { + sal_uInt32 nRef; + rStCtrl.ReadUInt32( nRef ); + if ( nRef == nMediaRef ) + { + aExVideoHd.SeekToContent( rStCtrl ); + auto nHdEndRecPos = SanitizeEndPos(rStCtrl, aExVideoHd.GetRecEndFilePos()); + while (rStCtrl.Tell() < nHdEndRecPos) + { + DffRecordHeader aHd; + ReadDffRecordHeader( rStCtrl, aHd ); + switch( aHd.nRecType ) + { + case PPT_PST_CString : + { + aHd.SeekToBegOfRecord( rStCtrl ); + OUString aStr; + if ( ReadString( aStr ) ) + { + if( osl::FileBase::getFileURLFromSystemPath( aStr, aRetVal ) + == osl::FileBase::E_None ) + { + aRetVal = INetURLObject( aRetVal ).GetMainURL( INetURLObject::DecodeMechanism::Unambiguous ); + }else{ + aRetVal = aStr; + } + } + } + break; + } + if (!aHd.SeekToEndOfRecord(rStCtrl)) + break; + } + break; + } + } + } + } + break; + } + if (!aHdMovie.SeekToEndOfRecord(rStCtrl)) + break; + } + } + return aRetVal; +} + +// import of objects +void ImplSdPPTImport::FillSdAnimationInfo(SdAnimationInfo* pInfo, const PptInteractiveInfoAtom& rIAtom, const OUString& rMacroName) +{ + // set local information into pInfo + if( rIAtom.nSoundRef ) + { + pInfo->SetBookmark( ReadSound( rIAtom.nSoundRef ) ); // path to sound file in MS DOS notation + pInfo->meClickAction = css::presentation::ClickAction_SOUND; // RunProgramAction + } + + switch ( rIAtom.nAction ) + { + + case 0x02 : // RunProgramAction + { + pInfo->meClickAction = css::presentation::ClickAction_PROGRAM; + pInfo->SetBookmark(rMacroName); // program name in aBookmark + } + break; + case 0x03 : // JumpAction + { + switch( rIAtom.nJump ) + { + case 0x01 : + pInfo->meClickAction = css::presentation::ClickAction_NEXTPAGE; // Next slide + break; + case 0x02 : + pInfo->meClickAction = css::presentation::ClickAction_PREVPAGE; // Previous slide + break; + case 0x03 : + pInfo->meClickAction = css::presentation::ClickAction_FIRSTPAGE; // First slide + break; + case 0x04 : + pInfo->meClickAction = css::presentation::ClickAction_LASTPAGE; // last Slide + break; + case 0x05 : + pInfo->meClickAction = css::presentation::ClickAction_PREVPAGE; // Last slide viewed + break; + case 0x06 : + pInfo->meClickAction = css::presentation::ClickAction_STOPPRESENTATION; // End show + break; + default : + pInfo->meClickAction = css::presentation::ClickAction_NONE; // 0x00: no action, else unknown + break; + } + } + break; + case 0x04 : + { + SdHyperlinkEntry* pPtr = nullptr; + for (SdHyperlinkEntry & entry : m_aHyperList) { + if ( entry.nIndex == rIAtom.nExHyperlinkId ) { + pPtr = &entry; + break; + } + } + if ( pPtr ) + { + switch( rIAtom.nHyperlinkType ) + { + case 9: + case 8: // hyperlink : URL + { + if ( !pPtr->aTarget.isEmpty() ) + { + ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh(); + SfxMedium* pMedium = pDocShell ? pDocShell->GetMedium() : nullptr; + if (pMedium) + { + OUString aBaseURL = pMedium->GetBaseURL(); + OUString aBookmarkURL( pInfo->GetBookmark() ); + INetURLObject aURL( pPtr->aTarget ); + if( INetProtocol::NotValid == aURL.GetProtocol() + && (osl::FileBase::getFileURLFromSystemPath( + pPtr->aTarget, aBookmarkURL) + != osl::FileBase::E_None) ) + aBookmarkURL.clear(); + if( aBookmarkURL.isEmpty() ) + aBookmarkURL = URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), pPtr->aTarget, URIHelper::GetMaybeFileHdl() ); + pInfo->SetBookmark( aBookmarkURL ); + pInfo->meClickAction = css::presentation::ClickAction_PROGRAM; + } + } + } + break; + + case 10: + break; + + case 7: // hyperlink to a page + { + if ( !pPtr->aConvSubString.isEmpty() ) + { + pInfo->meClickAction = css::presentation::ClickAction_BOOKMARK; + pInfo->SetBookmark( pPtr->aConvSubString ); + } + } + break; + } + } + } + break; + case 0x05 : // OLEAction ( OLEVerb to use, 0==first, 1==second, .. ) + case 0x06 : // MediaAction + case 0x07 : // CustomShowAction + default : // 0x00: no action, else unknown action + break; + } +} + +SdrObject* ImplSdPPTImport::ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pObj, SdPageCapsule pPageCapsule, + SfxStyleSheet* pSheet, SfxStyleSheet** ppStyleSheetAry ) const +{ + SdPage * pPage = static_cast(pPageCapsule.page); + SfxStyleSheet* pStyleSheetAry[ 9 ]; + SdrTextObj* pText = pObj; + SdrObject* pRet = pText; + + ppStyleSheetAry = nullptr; + + PresObjKind ePresKind = PresObjKind::NONE; + const std::optional& pPlaceHolder = pTextObj->GetOEPlaceHolderAtom(); + OUString aPresentationText; + if ( pPlaceHolder ) + { + switch( pPlaceHolder->nPlaceholderId ) + { + case PptPlaceholder::MASTERNOTESSLIDEIMAGE : + case PptPlaceholder::MASTERCENTEREDTITLE : + case PptPlaceholder::MASTERTITLE : + { + ePresKind = PresObjKind::Title; + aPresentationText = pPage->GetPresObjText( ePresKind ); + } + break; + case PptPlaceholder::MASTERBODY : + { + ePresKind = PresObjKind::Outline; + aPresentationText = pPage->GetPresObjText( ePresKind ); + } + break; + case PptPlaceholder::MASTERSUBTITLE : + { + ePresKind = PresObjKind::Text; + aPresentationText = pPage->GetPresObjText( ePresKind ); + } + break; + case PptPlaceholder::MASTERNOTESBODYIMAGE : + { + ePresKind = PresObjKind::Notes; + aPresentationText = pPage->GetPresObjText( ePresKind ); + } + break; + case PptPlaceholder::MASTERDATE : ePresKind = PresObjKind::DateTime; break; + case PptPlaceholder::MASTERSLIDENUMBER : ePresKind = PresObjKind::SlideNumber;break; + case PptPlaceholder::MASTERFOOTER : ePresKind = PresObjKind::Footer; break; + case PptPlaceholder::MASTERHEADER : ePresKind = PresObjKind::Header; break; + default: break; + } + } + switch ( pTextObj->GetDestinationInstance() ) + { + case TSS_Type::PageTitle : + case TSS_Type::Title : + { + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title ); + if ( pSheet ) + static_cast(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true ); + DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" ); + } + break; + case TSS_Type::Subtitle : + { + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Text ); + if ( pSheet ) + static_cast(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true ); + DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for subtitleobject (SJ)" ); + } + break; + case TSS_Type::Body : + case TSS_Type::HalfBody : + case TSS_Type::QuarterBody : + { + for ( sal_uInt16 nLevel = 9; nLevel; nLevel-- ) + { + OUString aName = pPage->GetLayoutName() + " " + OUString::number( nLevel ); + pSheet = static_cast(mpDoc->GetStyleSheetPool()->Find( aName, SfxStyleFamily::Page )); + if ( pSheet ) + pText->StartListening( *pSheet ); + pStyleSheetAry[ nLevel - 1 ] = pSheet; + } + DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for outlinerobject (SJ)" ); + if ( pSheet ) + static_cast(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true ); + ppStyleSheetAry = &pStyleSheetAry[ 0 ]; + } + break; + case TSS_Type::Notes : + { + if ( pPlaceHolder && ( ( pPlaceHolder->nPlaceholderId == PptPlaceholder::NOTESSLIDEIMAGE ) + || ( pPlaceHolder->nPlaceholderId == PptPlaceholder::MASTERNOTESSLIDEIMAGE ) ) ) + { + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title ); + if ( pSheet ) + static_cast(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true ); + DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" ); + } + else + { + pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Notes ); + DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for notesobj (SJ)" ); + if ( pSheet ) + static_cast(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true ); + } + } + break; + case TSS_Type::Unused : + case TSS_Type::TextInShape : + { + switch( ePresKind ) + { + case PresObjKind::DateTime : + case PresObjKind::SlideNumber : + case PresObjKind::Footer : + case PresObjKind::Header : + pSheet = static_cast(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS), SfxStyleFamily::Pseudo )); + break; + default : + pSheet = static_cast(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_STANDARD_STYLESHEET_NAME), SfxStyleFamily::Para )); + } + } + break; + default: break; + } + + pText = static_cast(SdrPowerPointImport::ApplyTextObj( pTextObj, pText, pPageCapsule, pSheet, ppStyleSheetAry )); + + if ( pPlaceHolder && pPlaceHolder->nPlaceholderId != PptPlaceholder::NONE ) + { + if ( m_eCurrentPageKind == PPT_MASTERPAGE ) + { + bool bCreatePlaceHolder = ( pTextObj->GetInstance() != TSS_Type::Unused ); + bool bIsHeaderFooter = ( ePresKind == PresObjKind::Header) || (ePresKind == PresObjKind::Footer) + || (ePresKind == PresObjKind::DateTime) || (ePresKind == PresObjKind::SlideNumber); + if ( bCreatePlaceHolder && ( pTextObj->GetInstance() == TSS_Type::TextInShape ) ) + bCreatePlaceHolder = bIsHeaderFooter; + if ( bCreatePlaceHolder ) + { + if ( !bIsHeaderFooter ) + { + pText->SetNotVisibleAsMaster( true ); + pText->SetEmptyPresObj( true ); + } + pText->SetUserCall( pPage ); + pPage->InsertPresObj( pText, ePresKind ); + SdrOutliner* pOutl = nullptr; + if ( pTextObj->GetInstance() == TSS_Type::Notes ) + pOutl = GetDrawOutliner( pText ); + if ( !aPresentationText.isEmpty() ) + pPage->SetObjText( pText, pOutl, ePresKind, aPresentationText ); + + if ( pPage->GetPageKind() != PageKind::Notes && pPage->GetPageKind() != PageKind::Handout) + { + SfxStyleSheet* pSheet2( pPage->GetStyleSheetForPresObj( ePresKind ) ); + if ( pSheet2 ) + { + SfxItemSet& rItemSet = pSheet2->GetItemSet(); + rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_LEFTDIST ) ); + rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_RIGHTDIST ) ); + rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_UPPERDIST ) ); + rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_LOWERDIST ) ); + rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_VERTADJUST ) ); + rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_HORZADJUST ) ); + if ( pTextObj->GetInstance() == TSS_Type::Title + || pTextObj->GetInstance() == TSS_Type::Subtitle) + { + rItemSet.Put( pText->GetMergedItemSet() ); + } + } + } + + SfxItemSet aTempAttr( mpDoc->GetPool() ); + SdrMetricItem aMinHeight( makeSdrTextMinFrameHeightItem(pText->GetLogicRect().GetSize().Height()) ); + aTempAttr.Put( aMinHeight ); + SdrOnOffItem aAutoGrowHeight( makeSdrTextAutoGrowHeightItem(false) ); + aTempAttr.Put( aAutoGrowHeight ); + pText->SetMergedItemSet(aTempAttr); + } + else + { + pRet = nullptr; + } + } + else + { + const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom(); + if ( pSlideLayout || ( m_eCurrentPageKind == PPT_NOTEPAGE ) ) + { + sal_uInt32 nPlacementId = pPlaceHolder->nPlacementId; + PptPlaceholder nPlaceholderId = pPlaceHolder->nPlaceholderId; + PresObjKind ePresObjKind = PresObjKind::NONE; + bool bEmptyPresObj = true; + bool bVertical = false; + if ( ( pTextObj->GetShapeType() == mso_sptRectangle ) || ( pTextObj->GetShapeType() == mso_sptTextBox ) ) + { + //if a placeholder with some custom attribute,the pTextObj will keep those attr,whose text size is zero, + //so sdPage should renew a PresObj to process placeholder. + bEmptyPresObj = ( pTextObj->Count() == 0 ) || ( pTextObj->Count() == 1 && pTextObj->First()->GetTextSize() == 0 ); + switch ( nPlaceholderId ) + { + case PptPlaceholder::NOTESBODY : ePresObjKind = PresObjKind::Notes; break; + case PptPlaceholder::VERTICALTEXTTITLE : + bVertical = true; + [[fallthrough]]; + case PptPlaceholder::TITLE : ePresObjKind = PresObjKind::Title; break; + case PptPlaceholder::VERTICALTEXTBODY : + bVertical = true; + [[fallthrough]]; + case PptPlaceholder::BODY : ePresObjKind = PresObjKind::Outline; break; + case PptPlaceholder::CENTEREDTITLE : ePresObjKind = PresObjKind::Title; break; + case PptPlaceholder::SUBTITLE : ePresObjKind = PresObjKind::Text; break; // PresObjKind::Outline + + default : + { + if ( pTextObj->Count() == 0 ) + { + switch ( nPlaceholderId ) + { + case PptPlaceholder::MEDIACLIP : + case PptPlaceholder::OBJECT : ePresObjKind = PresObjKind::Object; break; + case PptPlaceholder::GRAPH : ePresObjKind = PresObjKind::Chart; break; + case PptPlaceholder::TABLE : ePresObjKind = PresObjKind::Table; break; + case PptPlaceholder::CLIPART : ePresObjKind = PresObjKind::Graphic; break; + case PptPlaceholder::ORGANISZATIONCHART : ePresObjKind = PresObjKind::OrgChart; break; + default: break; + } + } + }; + } + } + else if ( pTextObj->GetShapeType() == mso_sptPictureFrame ) + { + if ( !pTextObj->Count() && dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr ) + { + bEmptyPresObj = false; + switch ( nPlaceholderId ) + { + case PptPlaceholder::MEDIACLIP : + case PptPlaceholder::OBJECT : ePresObjKind = PresObjKind::Object; break; + case PptPlaceholder::GRAPH : ePresObjKind = PresObjKind::Chart; break; + case PptPlaceholder::TABLE : ePresObjKind = PresObjKind::Calc; break; + case PptPlaceholder::CLIPART : ePresObjKind = PresObjKind::Graphic; break; + case PptPlaceholder::ORGANISZATIONCHART : ePresObjKind = PresObjKind::OrgChart; break; + default: break; + } + } + } + if ( ePresObjKind != PresObjKind::NONE ) + { + if ( !bEmptyPresObj ) + { + pPage->InsertPresObj( pRet, ePresObjKind ); + } + else + { + SdrObject* pPresObj = pPage->CreatePresObj( ePresObjKind, bVertical, pText->GetLogicRect() ); + pPresObj->SetUserCall( pPage ); + + SfxItemSet aSet( pSdrModel->GetItemPool() ); + ApplyAttributes( rStCtrl, aSet ); + pPresObj->SetLogicRect(pText->GetLogicRect()); + ApplyTextAnchorAttributes( *pTextObj, aSet ); + //set custom font attribute of the placeholder + if ( pTextObj->Count() == 1 ) + { + PPTParagraphObj* pPara = pTextObj->First(); + if ( pPara && pPara->GetTextSize() == 0 ) + { + if ( PPTPortionObj * pPor = pPara->First() ) + { + pPor->ApplyTo(aSet, const_cast(static_cast(*this)), pTextObj->GetDestinationInstance()); + } + } + } + pPresObj->SetMergedItemSet(aSet); + + if ((m_eCurrentPageKind != PPT_NOTEPAGE) && (nPlacementId != 0xffffffff) && pPage->TRG_HasMasterPage()) + { + SdrObject* pTitleObj = static_cast(pPage->TRG_GetMasterPage()).GetPresObj( PresObjKind::Title ); + SdrObject* pOutlineObj = static_cast(pPage->TRG_GetMasterPage()).GetPresObj( PresObjKind::Outline ); + + ::tools::Rectangle aTitleRect; + ::tools::Rectangle aOutlineRect; + Size aOutlineSize; + + if ( pTitleObj ) + aTitleRect = pTitleObj->GetLogicRect(); + if ( pOutlineObj ) + { + aOutlineRect = pOutlineObj->GetLogicRect(); + aOutlineSize = aOutlineRect.GetSize(); + } + ::tools::Rectangle aLogicRect( pPresObj->GetLogicRect() ); + Size aLogicSize( aLogicRect.GetSize() ); + + switch ( nPlacementId ) + { + case 0 : // position in title area + { + if ( aLogicRect != aTitleRect ) + pPresObj->SetUserCall( nullptr ); + } + break; + + case 1: + { + if ( pSlideLayout->eLayout == PptSlideLayout::TITLEANDBODYSLIDE ) + { // position in outline area + if ( aLogicRect != aOutlineRect ) + pPresObj->SetUserCall( nullptr ); + } + else if ( pSlideLayout->eLayout == PptSlideLayout::TWOCOLUMNSANDTITLE ) + { // position in outline area left + if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || + std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE || + std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE || + aOutlineSize.Width() == 0 || + static_cast(aLogicSize.Width()) / aOutlineSize.Width() < 0.48 || + static_cast(aLogicSize.Width()) / aOutlineSize.Width() > 0.5) + { + pPresObj->SetUserCall(nullptr); + } + } + else if ( pSlideLayout->eLayout == PptSlideLayout::TWOROWSANDTITLE ) + { // position in outline area top + if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || + std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE || + std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE) + { + pPresObj->SetUserCall( nullptr ); + } + } + else if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || + std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE) + { // position in outline area top left + pPresObj->SetUserCall( nullptr ); + } + } + break; + + case 2: + { + if ( pSlideLayout->eLayout == PptSlideLayout::TWOCOLUMNSANDTITLE ) + { // position in outline area right + if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE || + std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE || + std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE || + aOutlineSize.Width() == 0 || + static_cast(aLogicSize.Width()) / aOutlineSize.Width() < 0.48 || + static_cast(aLogicSize.Width()) / aOutlineSize.Width() > 0.5) + { + pPresObj->SetUserCall( nullptr ); + } + } + else if ( pSlideLayout->eLayout == PptSlideLayout::TWOROWSANDTITLE ) + { // position in outline area bottom + if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || + std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE || + std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE) + { + pPresObj->SetUserCall( nullptr ); + } + } + else if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE || + std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE) + { // position in outline area top right + pPresObj->SetUserCall(nullptr); + } + } + break; + + case 3: + { // position in outline area bottom left + if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || + std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE) + { + pPresObj->SetUserCall( nullptr ); + } + } + break; + + case 4: + { // position in outline area bottom right + if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE || + std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE) + { + pObj->SetUserCall( nullptr ); + } + } + break; + } + } + pRet = nullptr; // return zero cause this obj was already inserted by CreatePresObj + } + } + else if ( !pTextObj->Count() ) + pRet = nullptr; + } + } + } + return pRet; +} + +rtl::Reference ImplSdPPTImport::ProcessObj( SvStream& rSt, DffObjData& rData, SvxMSDffClientData& rClientData, ::tools::Rectangle& rTextRect, SdrObject* pRet ) +{ + rtl::Reference pObj = SdrPowerPointImport::ProcessObj( rSt, rData, rClientData, rTextRect, pRet ); + + // read animation effect of object + if ( pObj ) + { + // further setup placeholder objects + if (dynamic_cast(pObj.get())) + { + const ProcessData& rProcessData=static_cast(rClientData); + if(rProcessData.pPage.page) + static_cast(rProcessData.pPage.page)->InsertPresObj( + pObj.get(), PresObjKind::Page ); + } + + DffRecordHeader aMasterShapeHd; + + if ( maShapeRecords.SeekToContent( rSt, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) ) + { + bool bInhabitanceChecked = false; + bool bAnimationInfoFound = false; + + DffRecordHeader& rHdClientData = *maShapeRecords.Current(); + while( true ) + { + sal_uInt32 nClientDataLen = SanitizeEndPos(rSt, rHdClientData.GetRecEndFilePos()); + DffRecordHeader aHd; + do + { + ReadDffRecordHeader( rSt, aHd ); + sal_uInt32 nHdRecEnd = aHd.GetRecEndFilePos(); + switch ( aHd.nRecType ) + { + case PPT_PST_AnimationInfo : + { + DffRecordHeader aHdAnimInfoAtom; + if ( SeekToRec( rSt, PPT_PST_AnimationInfoAtom, nHdRecEnd, &aHdAnimInfoAtom ) ) + { + // read data from stream + Ppt97AnimationPtr pAnimation = std::make_shared( rSt ); + // store animation information + if( pAnimation->HasEffect() ) + { + // translate color to RGB + pAnimation->SetDimColor( MSO_CLR_ToColor(pAnimation->GetDimColor()) ); + // translate sound bits to file url + if( pAnimation->HasSoundEffect() ) + pAnimation->SetSoundFileUrl( ReadSound( pAnimation->GetSoundRef() ) ); + + bool bDontAnimateInvisibleShape = false; + { + SdrTextObj* pTextObj = DynCastSdrTextObj(pObj.get()); + + if( pTextObj && pTextObj->HasText() && + dynamic_cast< SdrObjGroup *>( pObj.get() ) == nullptr && + pAnimation->HasAnimateAssociatedShape() ) + { + const SfxItemSet& rObjItemSet = pObj->GetMergedItemSet(); + + drawing::FillStyle eFillStyle = rObjItemSet.Get(XATTR_FILLSTYLE).GetValue(); + drawing::LineStyle eLineStyle = rObjItemSet.Get(XATTR_LINESTYLE).GetValue(); + + if ( ( eFillStyle == drawing::FillStyle_NONE ) && ( eLineStyle == drawing::LineStyle_NONE ) ) + bDontAnimateInvisibleShape = true; + } + } + if( bDontAnimateInvisibleShape ) + pAnimation->SetAnimateAssociatedShape(false); + + //maybe some actions necessary to ensure that animations on master pages are played before animations on normal pages + //maybe todo in future: bool bIsEffectOnMasterPage = !bInhabitanceChecked;? + + maAnimations[pObj.get()] = pAnimation; + + bAnimationInfoFound = true; + } + } + } + break; + case PPT_PST_InteractiveInfo: + { + sal_uInt64 nOldFilePos2 = rSt.Tell(); + OUString aMacroName; + + if(SeekToRec( rSt, PPT_PST_CString, nHdRecEnd ) ) + ReadString(aMacroName); + + rSt.Seek( nOldFilePos2 ); + DffRecordHeader aHdInteractiveInfoAtom; + if ( SeekToRec( rSt, PPT_PST_InteractiveInfoAtom, nHdRecEnd, &aHdInteractiveInfoAtom ) ) + { + PptInteractiveInfoAtom aInteractiveInfoAtom; + if (ReadPptInteractiveInfoAtom(rSt, aInteractiveInfoAtom)) + { + // interactive object + SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj, true); + + FillSdAnimationInfo(pInfo, aInteractiveInfoAtom, aMacroName); + if ( aInteractiveInfoAtom.nAction == 6 ) // Sj -> media action + { + rHdClientData.SeekToContent( rStCtrl ); + DffRecordHeader aObjRefAtomHd; + if ( SeekToRec( rSt, PPT_PST_ExObjRefAtom, nHdRecEnd, &aObjRefAtomHd ) ) + { + sal_uInt32 nRef; + rSt.ReadUInt32( nRef ); + OUString aMediaURL( ReadMedia( nRef ) ); + if ( aMediaURL.isEmpty() ) + aMediaURL = ReadSound( nRef ); + if ( !aMediaURL.isEmpty() ) + { + rtl::Reference pMediaObj = new SdrMediaObj( + pObj->getSdrModelFromSdrObject(), + pObj->GetSnapRect()); + pMediaObj->SetMergedItemSet( pObj->GetMergedItemSet() ); + + //--remove object from maAnimations list and add the new object instead + Ppt97AnimationPtr pAnimation; + { + tAnimationMap::iterator aFound = maAnimations.find( pObj.get() ); + if( aFound != maAnimations.end() ) + { + pAnimation = (*aFound).second; + maAnimations.erase(aFound); + } + maAnimations[pMediaObj.get()] = pAnimation; + } + + pObj = pMediaObj; // SJ: hoping that pObj is not inserted in any list + pMediaObj->setURL( aMediaURL, ""/*TODO?*/ ); + } + } + } + } + } + } + break; + } + if (!aHd.SeekToEndOfRecord(rSt)) + break; + } + while( ( rSt.GetError() == ERRCODE_NONE ) && ( rSt.Tell() < nClientDataLen ) ); + + if ( bInhabitanceChecked || bAnimationInfoFound ) + break; + bInhabitanceChecked = true; + if ( ! ( IsProperty( DFF_Prop_hspMaster ) && SeekToShape( rSt, &rClientData, GetPropertyValue( DFF_Prop_hspMaster, 0 ) ) ) ) + break; + ReadDffRecordHeader( rSt, aMasterShapeHd ); + if ( !SeekToRec( rSt, DFF_msofbtClientData, aMasterShapeHd.GetRecEndFilePos(), &aMasterShapeHd ) ) + break; + aMasterShapeHd.SeekToContent( rSt ); + rHdClientData = aMasterShapeHd; + } + } + } + return pObj; +} + +bool +ImplSdPPTImport::ReadFormControl( tools::SvRef& rSrc1, css::uno::Reference< css::form::XFormComponent > & rFormComp ) const +{ + uno::Reference< frame::XModel > xModel; + if ( mpDoc->GetDocSh() ) + { + xModel = mpDoc->GetDocSh()->GetModel(); + oox::ole::MSConvertOCXControls aCtrlImporter( xModel ); + return aCtrlImporter.ReadOCXStorage( rSrc1, rFormComp ); + } + return false; +} + +// exported function +SAL_DLLPUBLIC_EXPORT bool ImportPPT( + SdDrawDocument* pDocument, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMedium ) +{ + std::unique_ptr pImport( new SdPPTImport( pDocument, rDocStream, rStorage, rMedium )); + return pImport->Import(); +} + +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportPPT(SvStream &rStream) +{ + bool bRet = false; + try + { + tools::SvRef xStorage(new SotStorage(rStream)); + if (xStorage->GetError()) + return false; + + tools::SvRef xDocStream(xStorage->OpenSotStream( "PowerPoint Document", StreamMode::STD_READ)); + if ( !xDocStream.is() ) + return false; + + SdDLL::Init(); + + SfxMedium aSrcMed("", StreamMode::STD_READ); + + xDocStream->SetVersion(xStorage->GetVersion()); + xDocStream->SetCryptMaskKey(xStorage->GetKey()); + + ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress); + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + + try + { + bRet = ImportPPT(pDoc, *xDocStream, *xStorage, aSrcMed); + } + catch (...) + { + } + + xDocShRef->DoClose(); + } + catch (...) + { + } + return bRet; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptin.hxx b/sd/source/filter/ppt/pptin.hxx new file mode 100644 index 0000000000..c0d239fd23 --- /dev/null +++ b/sd/source/filter/ppt/pptin.hxx @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +class SdDrawDocument; +class SfxMedium; + +/************************************************************************* +|* +|* local import +|* +\************************************************************************/ + +class SdPage; +class SdAnimationInfo; +class Ppt97Animation; + +typedef std::shared_ptr< Ppt97Animation > Ppt97AnimationPtr; +typedef ::std::map < SdrObject*, Ppt97AnimationPtr > tAnimationMap; + +class ImplSdPPTImport : public SdrPowerPointImport +{ + tools::SvRef mxPicturesStream; + SfxMedium& mrMed; + SotStorage& mrStorage; + DffRecordHeader maDocHd; + std::vector maSlideNameList; + bool mbDocumentFound; + sal_uInt32 mnFilterOptions; + SdDrawDocument* mpDoc; + PresChange mePresChange; + SdrLayerID mnBackgroundObjectsLayerID; + + tAnimationMap maAnimations; + void SetHeaderFooterPageSettings( SdPage* pPage, const PptSlidePersistEntry* pMasterPersist ); + void ImportPageEffect( SdPage* pPage, const bool bNewAnimationsUsed ); + + void FillSdAnimationInfo(SdAnimationInfo* pInfo, const PptInteractiveInfoAtom& rIAtom, const OUString& rMacroName); + + virtual rtl::Reference ProcessObj( SvStream& rSt, DffObjData& rData, SvxMSDffClientData& rClientData, ::tools::Rectangle& rTextRect, SdrObject* pObj ) override; + virtual SdrObject* ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pText, SdPageCapsule pPage, + SfxStyleSheet*, SfxStyleSheet** ) const override; + +public: + + OUString ReadSound( sal_uInt32 nSoundRef ) const; + OUString ReadMedia( sal_uInt32 nMediaRef ) const; + + ImplSdPPTImport( SdDrawDocument* pDoc, SotStorage& rStorage, SfxMedium& rMed, PowerPointImportParam& ); + virtual ~ImplSdPPTImport() override; + + bool Import(); + virtual bool ReadFormControl( tools::SvRef& rSrc1, css::uno::Reference< css::form::XFormComponent > & rFormComp ) const override; +}; + +class SdPPTImport +{ + PowerPointImportParam maParam; + std::unique_ptr pFilter; + +public: + + SdPPTImport( SdDrawDocument* pDoc, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMed ); + ~SdPPTImport(); + + bool Import(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptinanimations.cxx b/sd/source/filter/ppt/pptinanimations.cxx new file mode 100644 index 0000000000..07a36e0eec --- /dev/null +++ b/sd/source/filter/ppt/pptinanimations.cxx @@ -0,0 +1,3293 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "pptanimations.hxx" +#include "pptinanimations.hxx" +#include "pptatom.hxx" +#include "pptin.hxx" +#include + +#include +#include + +using ::com::sun::star::beans::NamedValue; +using ::com::sun::star::container::XEnumerationAccess; +using ::com::sun::star::container::XEnumeration; + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::animations; +using namespace ::com::sun::star::presentation; + +namespace ppt +{ + +static SvStream& operator>>(SvStream& rIn, AnimationNode& rNode ) +{ + rIn.ReadInt32( rNode.mnU1 ); + rIn.ReadInt32( rNode.mnRestart ); + rIn.ReadInt32( rNode.mnGroupType ); + rIn.ReadInt32( rNode.mnFill ); + rIn.ReadInt32( rNode.mnU3 ); + rIn.ReadInt32( rNode.mnU4 ); + rIn.ReadInt32( rNode.mnDuration ); + rIn.ReadInt32( rNode.mnNodeType ); + + return rIn; +} + +bool PropertySet::hasProperty( sal_Int32 nProperty ) const +{ + return maProperties.find( nProperty ) != maProperties.end(); +} + +Any PropertySet::getProperty( sal_Int32 nProperty ) const +{ + PropertySetMap_t::const_iterator aIter( maProperties.find( nProperty ) ); + if( aIter != maProperties.end() ) + return (*aIter).second; + else + return Any(); +} + +AnimationImporter::AnimationImporter( ImplSdPPTImport* pPPTImport, SvStream& rStCtrl ) +: mpPPTImport( pPPTImport ), mrStCtrl( rStCtrl ) +{ +} + +int AnimationImporter::import( const Reference< XDrawPage >& xPage, const DffRecordHeader& rProgTagContentHd ) +{ + int nNodes = 0; + +#ifdef DBG_ANIM_LOG + static int ppt_anim_debug_stream_number = 1; + OUString ppt_anim_debug_filename("ppt-animation-import-debug-output-"); + ppt_anim_debug_filename += OUString::number(ppt_anim_debug_stream_number++); + ppt_anim_debug_filename += ".xml"; + mpFile = fopen( OUStringToOString( ppt_anim_debug_filename, RTL_TEXTENCODING_UTF8).getStr() , "w+" ); +#endif + dump("\n"); + + Reference< XAnimationNodeSupplier > xNodeSupplier( xPage, UNO_QUERY ); + if( xNodeSupplier.is() ) + { + mxRootNode = xNodeSupplier->getAnimationNode(); + if( mxRootNode.is() ) + { + Reference< XAnimationNode > xParent; + + std::unique_ptr pAtom(Atom::import( rProgTagContentHd, mrStCtrl )); + if( pAtom ) + { + nNodes = importAnimationContainer( pAtom.get(), xParent ); + } + + std::for_each( maAfterEffectNodes.begin(), maAfterEffectNodes.end(), + sd::stl_process_after_effect_node_func ); + } + } + +#ifdef DBG_ANIM_LOG + fclose( mpFile ); +#endif + + return nNodes; +} + +Reference< XAnimationNode > AnimationImporter::createNode( const Atom* pAtom, const AnimationNode& rNode ) +{ + const char* pServiceName = nullptr; + + switch( rNode.mnGroupType ) + { + case mso_Anim_GroupType_PAR: + if( pAtom->hasChildAtom( DFF_msofbtAnimIteration ) ) + pServiceName = "com.sun.star.animations.IterateContainer"; + else + pServiceName = "com.sun.star.animations.ParallelTimeContainer"; + break; + case mso_Anim_GroupType_SEQ: + pServiceName = "com.sun.star.animations.SequenceTimeContainer"; + break; + case mso_Anim_GroupType_NODE: + { + switch( rNode.mnNodeType ) + { + case mso_Anim_Behaviour_FILTER: + case mso_Anim_Behaviour_ANIMATION: + if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) ) + pServiceName = "com.sun.star.animations.AnimateSet"; + else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) ) + pServiceName = "com.sun.star.animations.AnimateColor"; + else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) ) + pServiceName = "com.sun.star.animations.AnimateTransform"; + else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) ) + pServiceName = "com.sun.star.animations.AnimateTransform"; + else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) ) + pServiceName = "com.sun.star.animations.AnimateMotion"; + else if( pAtom->hasChildAtom( DFF_msofbtAnimateFilter ) ) + pServiceName = "com.sun.star.animations.TransitionFilter"; + else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) ) + pServiceName = "com.sun.star.animations.Command"; + else + pServiceName = "com.sun.star.animations.Animate"; + break; + } + break; + } + case mso_Anim_GroupType_MEDIA: + pServiceName = "com.sun.star.animations.Audio"; + break; + + default: + pServiceName = "com.sun.star.animations.Animate"; + break; + } + + Reference< XAnimationNode > xNode; + if( pServiceName ) + { + Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext(); + const OUString aServiceName( OUString::createFromAscii(pServiceName) ); + Reference< XInterface > xFac( xContext->getServiceManager()->createInstanceWithContext(aServiceName, xContext) ); + xNode.set(xFac , UNO_QUERY ); + } + + DBG_ASSERT( xNode.is(), "sd::AnimationImporter::createNode(), node creation failed!" ); + return xNode; +} + +static bool is_random( const AnimationNode& rNode, const PropertySet& rSet, sal_Int32& rPresetClass ) +{ + if( rNode.mnGroupType != mso_Anim_GroupType_PAR ) + return false; + + if( !rSet.hasProperty( DFF_ANIM_PRESET_ID ) || !rSet.hasProperty( DFF_ANIM_PRESET_CLASS ) ) + return false; + + sal_Int32 nPresetId = 0; + if( !(rSet.getProperty( DFF_ANIM_PRESET_ID ) >>= nPresetId) || (nPresetId != 24) ) + return false; + + sal_Int32 nPresetClass = 0; + if( !(rSet.getProperty( DFF_ANIM_PRESET_CLASS ) >>= nPresetClass) ) + return false; + + switch( nPresetClass ) + { + case DFF_ANIM_PRESS_CLASS_ENTRANCE: rPresetClass = EffectPresetClass::ENTRANCE; return true; + case DFF_ANIM_PRESS_CLASS_EXIT: rPresetClass = EffectPresetClass::EXIT; return true; + } + return false; +} + +int AnimationImporter::importAnimationContainer( const Atom* pAtom, const Reference< XAnimationNode >& xParent ) +{ + int nNodes = 0; + if( pAtom->seekToContent() ) + { + AnimationNode aNode; + const Atom* pAnimationNodeAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimNode ); + if( pAnimationNodeAtom && pAnimationNodeAtom->seekToContent() ) + mrStCtrl >> aNode; + + PropertySet aSet; + const Atom* pAnimationPropertySetAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimPropertySet ); + if( pAnimationPropertySetAtom ) + importPropertySetContainer( pAnimationPropertySetAtom, aSet ); + + Reference< XAnimationNode > xNode; + + if( xParent.is() ) + { + sal_Int32 nPresetClass; + if( is_random( aNode, aSet, nPresetClass ) ) + { + // create a random animation node with the given preset class + xNode.set( sd::RandomAnimationNode_createInstance( static_cast(nPresetClass) ), UNO_QUERY ); + } + + if( !xNode.is() ) + { + // create a node for the given atom + xNode = createNode( pAtom, aNode ); + } + } + else + { + // if we have no parent we fill the root node + xNode = mxRootNode; + } + + // import if we have a node and it's not random + if( xNode.is() ) + { + fillNode( xNode, aNode, aSet ); + + switch( aNode.mnGroupType ) + { + case mso_Anim_GroupType_PAR: + { + dump( "\n" ); + + // for iteration containers, map target from children to iteration + Reference< XIterateContainer > xIter( xNode, UNO_QUERY ); + if( xIter.is() ) + { + double fDuration = 0.0; + Any aTarget, aEmpty; + Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY ); + if( xEnumerationAccess.is() ) + { + Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration(); + if( xEnumeration.is() ) + { + while( xEnumeration->hasMoreElements() ) + { + Reference< XAnimate > xChildNode( xEnumeration->nextElement(), UNO_QUERY ); + if( xChildNode.is() ) + { + double fChildBegin = 0.0; + double fChildDuration = 0.0; + xChildNode->getBegin() >>= fChildBegin; + xChildNode->getDuration() >>= fChildDuration; + + fChildDuration += fChildBegin; + if( fChildDuration > fDuration ) + fDuration = fChildDuration; + + if( !aTarget.hasValue() ) + aTarget = xChildNode->getTarget(); + + xChildNode->setTarget( aEmpty ); + } + } + } + } + + xIter->setTarget( aTarget ); + + double fIterateInterval = xIter->getIterateInterval() * fDuration / 100; + xIter->setIterateInterval( fIterateInterval ); + } + } + break; + + case mso_Anim_GroupType_SEQ: + { + dump( "\n" ); + + if( aSet.hasProperty( DFF_ANIM_NODE_TYPE ) ) + { + sal_Int32 nPPTNodeType = 0; + if( aSet.getProperty( DFF_ANIM_NODE_TYPE ) >>= nPPTNodeType ) + { + switch(nPPTNodeType) + { + case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE: + oox::ppt::fixMainSequenceTiming( xNode ); + break; + case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ: + oox::ppt::fixInteractiveSequenceTiming( xNode ); + break; + } + } + } + } + break; + + case mso_Anim_GroupType_NODE: + { +#ifdef DBG_ANIM_LOG + if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimateColor ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimateScale ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimateRotation ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimateMotion ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimate ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimateFilter ) ) + { + dump( "hasChildAtom( DFF_msofbtAnimCommand ) ) + { + dump( "\n"); + + } + break; + + case mso_Anim_GroupType_MEDIA: + { + dump( "\n" ); + } + break; + + default: + OSL_FAIL( "unknown group atom!" ); + + dump_atom_header( pAtom, true, false ); + dump_atom( pAtom ); + dump_atom_header( pAtom, false, false ); + break; + + } + } + + if( xParent.is() && xNode.is() ) + { + Reference< XTimeContainer > xParentContainer( xParent, UNO_QUERY ); + DBG_ASSERT( xParentContainer.is(), "parent is no container, then why do I have a child here?" ); + if( xParentContainer.is() ) + { + xParentContainer->appendChild( xNode ); + } + } + } + + return nNodes; +} + +bool AnimationImporter::convertAnimationNode( const Reference< XAnimationNode >& xNode, const Reference< XAnimationNode >& xParent ) +{ + Reference< XAnimate > xAnimate( xNode, UNO_QUERY ); + if( !xAnimate.is() ) + return true; + + if( !xAnimate->getTarget().hasValue() ) + return false; + + const sal_Int16 nNodeType = xNode->getType(); + + if( nNodeType == AnimationNodeType::TRANSITIONFILTER ) + return true; + + OUString aAttributeName( xAnimate->getAttributeName() ); + + if( (nNodeType == AnimationNodeType::SET) && aAttributeName == "fill.on" ) + return false; + + const oox::ppt::ImplAttributeNameConversion* p = oox::ppt::getAttributeConversionList(); + + oox::ppt::AnimationAttributeEnum eAttribute = oox::ppt::AnimationAttributeEnum::UNKNOWN; + + if( (nNodeType == AnimationNodeType::ANIMATEMOTION) || + (nNodeType == AnimationNodeType::ANIMATETRANSFORM) ) + { + aAttributeName.clear(); + } + else + { + while( p->mpMSName ) + { + if( aAttributeName.equalsAscii( p->mpMSName ) ) + break; + + p++; + } + + DBG_ASSERT( p->mpMSName || aAttributeName.isEmpty(), "sd::AnimationImporter::convertAnimationNode(), unknown attribute!" ); +#ifdef DBG_ANIM_LOG + if( p->mpMSName == 0 ) dump( "\n" ); +#endif + + eAttribute = p->meAttribute; + + if( p->mpAPIName ) + aAttributeName = OUString::createFromAscii( p->mpAPIName ); + } + + xAnimate->setAttributeName( aAttributeName ); + + if(eAttribute != oox::ppt::AnimationAttributeEnum::UNKNOWN) + { + Any aAny( xAnimate->getFrom() ); + if( aAny.hasValue() ) + { + if(oox::ppt::convertAnimationValue(eAttribute, aAny)) + xAnimate->setFrom( aAny ); + } + + aAny = xAnimate->getBy(); + if( aAny.hasValue() ) + { + if(oox::ppt::convertAnimationValue(eAttribute, aAny)) + xAnimate->setBy( aAny ); + } + + aAny = xAnimate->getTo(); + if( aAny.hasValue() ) + { + if(oox::ppt::convertAnimationValue(eAttribute, aAny)) + xAnimate->setTo( aAny ); + } + + Sequence< Any > aValues( xAnimate->getValues() ); + if( aValues.hasElements() ) + { + for( Any& rValue : asNonConstRange(aValues) ) + oox::ppt::convertAnimationValue(eAttribute, rValue); + + xAnimate->setValues( aValues ); + } + + OUString aFormula( xAnimate->getFormula() ); + if( !aFormula.isEmpty() ) + { + if(oox::ppt::convertMeasure(aFormula)) + xAnimate->setFormula( aFormula ); + } + } + + // check for after-effect + Sequence< NamedValue > aUserData( xNode->getUserData() ); + NamedValue* pLastValue = aUserData.getArray(); + sal_Int32 nRemoved = 0; + + bool bAfterEffect = false; + sal_Int32 nMasterRel = 0; + for( const NamedValue& rValue : std::as_const(aUserData) ) + { + if ( rValue.Name == "after-effect" ) + { + rValue.Value >>= bAfterEffect; + nRemoved++; + } + else if ( rValue.Name == "master-rel" ) + { + rValue.Value >>= nMasterRel; + nRemoved++; + } + else + { + if( nRemoved ) + *pLastValue = rValue; + pLastValue++; + } + } + + if( nRemoved ) + { + aUserData.realloc( aUserData.getLength() - nRemoved ); + xNode->setUserData( aUserData ); + } + + // if it's an after effect node, add it to the list for + // later processing + // after effect nodes are not inserted at their import + // position, so return false in this case + if( bAfterEffect ) + { + if( nMasterRel != 2 ) + { + Event aEvent; + + aEvent.Source <<= xParent; + aEvent.Trigger = EventTrigger::END_EVENT; + aEvent.Repeat = 0; + + xNode->setBegin( Any( aEvent ) ); + } + + // add to after effect nodes for later processing + sd::AfterEffectNode aNode( xNode, xParent, nMasterRel == 2 ); + maAfterEffectNodes.push_back( aNode ); + return false; + } + + return true; +} + +void AnimationImporter::fillNode( Reference< XAnimationNode > const & xNode, const AnimationNode& rNode, const PropertySet& rSet ) +{ + bool bAfterEffect = false; + + // attribute Restart + if( rNode.mnRestart ) + { + sal_Int16 nRestart = AnimationRestart::DEFAULT; + switch( rNode.mnRestart ) + { + case 1: nRestart = AnimationRestart::ALWAYS; break; + case 2: nRestart = AnimationRestart::WHEN_NOT_ACTIVE; break; + case 3: nRestart = AnimationRestart::NEVER; break; + } + xNode->setRestart( nRestart ); + } + + // attribute Fill + if( rNode.mnFill ) + { + sal_Int16 nFill = AnimationFill::DEFAULT; + switch( rNode.mnFill ) + { + case 1: nFill = AnimationFill::REMOVE; break; + case 2: nFill = AnimationFill::FREEZE; break; + case 3: nFill = AnimationFill::HOLD; break; + case 4: nFill = AnimationFill::TRANSITION; break; + } + xNode->setFill( nFill ); + } + + // attribute Duration + if( rNode.mnDuration ) + { + Any aDuration; + if( rNode.mnDuration > 0 ) + { + aDuration <<= rNode.mnDuration / 1000.0; + } + else if( rNode.mnDuration < 0 ) + { + aDuration <<= Timing_INDEFINITE; + } + xNode->setDuration( aDuration ); + } + + // TODO: DFF_ANIM_PATH_EDIT_MODE + + // set user data + Sequence< NamedValue > aUserData; + + // attribute Type + if( rSet.hasProperty( DFF_ANIM_NODE_TYPE ) ) + { + sal_Int32 nPPTNodeType = 0; + if( rSet.getProperty( DFF_ANIM_NODE_TYPE ) >>= nPPTNodeType ) + { + sal_Int16 nNodeType = css::presentation::EffectNodeType::DEFAULT; + switch( nPPTNodeType ) + { + case DFF_ANIM_NODE_TYPE_CLICK_PARALLEL: [[fallthrough]]; + case DFF_ANIM_NODE_TYPE_ON_CLICK: nNodeType = css::presentation::EffectNodeType::ON_CLICK; break; + case DFF_ANIM_NODE_TYPE_WITH_GROUP: [[fallthrough]]; + case DFF_ANIM_NODE_TYPE_WITH_PREVIOUS: nNodeType = css::presentation::EffectNodeType::WITH_PREVIOUS; break; + case DFF_ANIM_NODE_TYPE_AFTER_GROUP: [[fallthrough]]; + case DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS: nNodeType = css::presentation::EffectNodeType::AFTER_PREVIOUS; break; + case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE: nNodeType = css::presentation::EffectNodeType::MAIN_SEQUENCE; break; + case DFF_ANIM_NODE_TYPE_TIMING_ROOT: nNodeType = css::presentation::EffectNodeType::TIMING_ROOT; break; + case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:nNodeType = css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE; break; + } + + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "node-type"; + pUserData[nSize].Value <<= nNodeType; + } + } + + if( rSet.hasProperty( DFF_ANIM_GROUP_ID ) ) + { + sal_Int32 nGroupId; + if( rSet.getProperty( DFF_ANIM_GROUP_ID ) >>= nGroupId ) + { + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "group-id"; + pUserData[nSize].Value <<= nGroupId; + } + } + + sal_Int16 nEffectPresetClass = EffectPresetClass::CUSTOM; + sal_Int32 nPresetId = 0; + + if( rSet.hasProperty( DFF_ANIM_PRESET_CLASS ) ) + { + sal_Int32 nPresetClass = 0; + if ( rSet.getProperty( DFF_ANIM_PRESET_CLASS ) >>= nPresetClass ) + { + switch( nPresetClass ) + { + case DFF_ANIM_PRESS_CLASS_ENTRANCE: nEffectPresetClass = EffectPresetClass::ENTRANCE; break; + case DFF_ANIM_PRESS_CLASS_EXIT: nEffectPresetClass = EffectPresetClass::EXIT; break; + case DFF_ANIM_PRESS_CLASS_EMPHASIS: nEffectPresetClass = EffectPresetClass::EMPHASIS; break; + case DFF_ANIM_PRESS_CLASS_MOTIONPATH: nEffectPresetClass = EffectPresetClass::MOTIONPATH; break; + case DFF_ANIM_PRESS_CLASS_OLE_ACTION: nEffectPresetClass = EffectPresetClass::OLEACTION; break; + case DFF_ANIM_PRESS_CLASS_MEDIACALL: nEffectPresetClass = EffectPresetClass::MEDIACALL; break; + } + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "preset-class"; + pUserData[nSize].Value <<= nEffectPresetClass; + } + } + + if( rSet.hasProperty( DFF_ANIM_PRESET_ID ) ) + { + if( rSet.getProperty( DFF_ANIM_PRESET_ID ) >>= nPresetId ) + { + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "preset-id"; + + const oox::ppt::preset_mapping* p = oox::ppt::preset_mapping::getList(); + while( p->mpStrPresetId && ((p->mnPresetClass != nEffectPresetClass) || (p->mnPresetId != nPresetId )) ) + p++; + + if( p->mpStrPresetId ) + { + pUserData[nSize].Value <<= OUString::createFromAscii( p->mpStrPresetId ); + } + else + { + OUStringBuffer sBuffer( "ppt_" ); + switch( nEffectPresetClass ) + { + case EffectPresetClass::ENTRANCE: sBuffer.append( "entrance_" ); break; + case EffectPresetClass::EXIT: sBuffer.append( "exit_" ); break; + case EffectPresetClass::EMPHASIS: sBuffer.append( "emphasis_" ); break; + case EffectPresetClass::MOTIONPATH: sBuffer.append( "motionpath_" ); break; + case EffectPresetClass::OLEACTION: sBuffer.append( "oleaction_" ); break; + case EffectPresetClass::MEDIACALL: sBuffer.append( "mediacall_" ); break; + } + sBuffer.append( nPresetId ); + + pUserData[nSize].Value <<= sBuffer.makeStringAndClear(); + } + } + } + + if( rSet.hasProperty( DFF_ANIM_PRESET_SUB_TYPE ) ) + { + sal_Int32 nPresetSubType = 0; + if( rSet.getProperty( DFF_ANIM_PRESET_SUB_TYPE ) >>= nPresetSubType ) + { + if( nPresetSubType ) + { + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "preset-sub-type"; + pUserData[nSize].Value <<= oox::ppt::getConvertedSubType( nEffectPresetClass, nPresetId, nPresetSubType ); + } + } + } + + if( rSet.hasProperty( DFF_ANIM_AFTEREFFECT ) ) + { + if( rSet.getProperty( DFF_ANIM_AFTEREFFECT ) >>= bAfterEffect ) + { + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "after-effect"; + pUserData[nSize].Value <<= bAfterEffect; + } + } + + if( bAfterEffect && rSet.hasProperty( DFF_ANIM_MASTERREL ) ) + { + sal_Int32 nMasterRel = 2; + if( rSet.getProperty( DFF_ANIM_MASTERREL ) >>= nMasterRel ) + { + sal_Int32 nSize = aUserData.getLength(); + aUserData.realloc(nSize+1); + auto pUserData = aUserData.getArray(); + pUserData[nSize].Name = "master-rel"; + pUserData[nSize].Value <<= nMasterRel; + } + } + + xNode->setUserData( aUserData ); + + // TODO: DFF_ANIM_ID + if( rSet.hasProperty( DFF_ANIM_ID ) ) + { + OUString aString; + rSet.getProperty( DFF_ANIM_ID ) >>= aString; + //if( !aString.isEmpty() ) + //{ + //} + } + + // TODO: DFF_ANIM_EVENT_FILTER + if( rSet.hasProperty( DFF_ANIM_EVENT_FILTER ) ) + { + OUString aString; + rSet.getProperty( DFF_ANIM_EVENT_FILTER ) >>= aString; + //if( !aString.isEmpty() ) + //{ + //} + } + + // DFF_ANIM_TIMEFILTER + if( rSet.hasProperty( DFF_ANIM_TIMEFILTER ) ) + { + Reference< XAnimate > xAnim( xNode, UNO_QUERY ); + if( xAnim.is() ) + { + OUString aString; + rSet.getProperty( DFF_ANIM_TIMEFILTER ) >>= aString; + if( !aString.isEmpty() ) + { + sal_Int32 nElements = 1; // a non empty string has at least one value + + sal_Int32 fromIndex = 0; + while(true) + { + fromIndex = aString.indexOf( ';', fromIndex ); + if( fromIndex == -1 ) + break; + + fromIndex++; + nElements++; + } + + Sequence< TimeFilterPair > aTimeFilter( nElements ); + + TimeFilterPair* pValues = aTimeFilter.getArray(); + sal_Int32 nIndex = 0; + while( (nElements--) && (nIndex >= 0) ) + { + const std::u16string_view aToken( o3tl::getToken(aString, 0, ';', nIndex ) ); + + size_t nPos = aToken.find( ',' ); + if( nPos != std::u16string_view::npos ) + { + pValues->Time = o3tl::toDouble(aToken.substr( 0, nPos )); + pValues->Progress = o3tl::toDouble(aToken.substr( nPos+1 )); + } + pValues++; + } + + xAnim->setTimeFilter( aTimeFilter ); + } + } + } + +// TODO: DFF_ANIM_ENDAFTERSLIDE / DFF_ANIM_VOLUME handling. git history has sample code + Reference< XAnimateColor > xColor( xNode, UNO_QUERY ); + if( !xColor.is() ) + return; + + if( rSet.hasProperty( DFF_ANIM_DIRECTION ) ) + { + bool bDirection = false; + if( rSet.getProperty( DFF_ANIM_DIRECTION ) >>= bDirection ) + xColor->setDirection( !bDirection ); + } + + if( rSet.hasProperty( DFF_ANIM_COLORSPACE ) ) + { + sal_Int32 nColorSpace = 0; + rSet.getProperty( DFF_ANIM_COLORSPACE ) >>= nColorSpace; + xColor->setColorInterpolation( (nColorSpace == 0) ? AnimationColorSpace::RGB : AnimationColorSpace::HSL ); + } +} + +int AnimationImporter::importTimeContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + int nNodes = 0; + + DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importTimeContainer()!"); + if( pAtom && xNode.is() ) + { + importAnimationEvents( pAtom, xNode ); + importAnimationValues( pAtom, xNode ); + importAnimationActions( pAtom, xNode ); + + dump(">\n"); + + // import sub containers + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimNode: + case DFF_msofbtAnimEvent: + case DFF_msofbtAnimValue: + case DFF_msofbtAnimAction: + case DFF_msofbtAnimPropertySet: + break; + + case DFF_msofbtAnimSubGoup : + { + if( pChildAtom->hasChildAtom( DFF_msofbtAnimCommand ) ) + { + Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext(); + Reference< XAnimationNode > xChildNode( Command::create(xContext), UNO_QUERY_THROW ); + nNodes += importAnimationNodeContainer( pChildAtom, xChildNode ); + Reference< XTimeContainer > xParentContainer( xNode, UNO_QUERY ); + if( xParentContainer.is() && xChildNode.is() ) + xParentContainer->appendChild( xChildNode ); + } + else + { + nNodes += importAnimationContainer( pChildAtom, xNode ); + } + } + break; + case DFF_msofbtAnimGroup : + { + nNodes += importAnimationContainer( pChildAtom, xNode ); + } + break; + case DFF_msofbtAnimIteration: + { + if( pChildAtom->seekToContent() ) + { + float fInterval(0.0); + sal_Int32 nTextUnitEffect(0), nU1(0), nU2(0), nU3(0); + + mrStCtrl.ReadFloat( fInterval ).ReadInt32( nTextUnitEffect ).ReadInt32( nU1 ).ReadInt32( nU2 ).ReadInt32( nU3 ); + + Reference< XIterateContainer > xIter( xNode, UNO_QUERY ); + if( xIter.is() ) + { + sal_Int16 nIterateType = TextAnimationType::BY_PARAGRAPH; + switch( nTextUnitEffect ) + { + case 1: nIterateType = TextAnimationType::BY_WORD; break; + case 2: nIterateType = TextAnimationType::BY_LETTER; break; + } + xIter->setIterateType( nIterateType ); + xIter->setIterateInterval( static_cast(fInterval) ); + } + + nNodes++; + + dump( "\n", nU3 ); + } + } + break; + + case 0xf136: + { +#ifdef DBG_ANIM_LOG + sal_uInt32 nU1, nU2; + mrStCtrl.ReadUInt32(nU1).ReadUInt32(nU2); + + fprintf( mpFile, "\n", nU1, nU2 ); +#endif + } + break; + + default: + { + dump_atom_header( pChildAtom, true, false ); + dump_atom( pChildAtom ); + dump_atom_header( pChildAtom, false, false ); + } + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } + } + + return nNodes; +} + +int AnimationImporter::importAnimationNodeContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + int nNodes = 0; + + DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importAnimationNodeContainer()!"); + if( pAtom && xNode.is() ) + { + importAnimationEvents( pAtom, xNode ); + importAnimationValues( pAtom, xNode ); + importAnimationActions( pAtom, xNode ); + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + nNodes ++; + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimNode: + case DFF_msofbtAnimEvent: + case DFF_msofbtAnimValue: + case DFF_msofbtAnimAction: + case DFF_msofbtAnimPropertySet: + break; + + case DFF_msofbtAnimateFilter: + importAnimateFilterContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimateSet: + importAnimateSetContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimate: + importAnimateContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimateScale: + importAnimateScaleContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimateColor: + importAnimateColorContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimateRotation: + importAnimateRotationContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimateMotion: + importAnimateMotionContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimCommand: + importCommandContainer( pChildAtom, xNode ); + break; + + default: + { + nNodes --; + dump_atom_header( pChildAtom, true, false ); + dump_atom( pChildAtom ); + dump_atom_header( pChildAtom, false, false ); + } + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } + } + + return nNodes; +} + +void AnimationImporter::importAnimateFilterContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XTransitionFilter > xFilter( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateFilter && xFilter.is(), "invalid call to ppt::AnimationImporter::importAnimateFilterContainer()!"); + if( !(pAtom && xFilter.is()) ) + return; + + sal_uInt32 nBits = 0; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateFilterData: + { + sal_uInt32 transition(0); + mrStCtrl.ReadUInt32( nBits ); + mrStCtrl.ReadUInt32( transition ); + + if( nBits & 1 ) + xFilter->setMode( transition == 0 ); + + dump( " transition=\"%s\"", (transition == 0) ? "in" : "out" ); + } + break; + + case DFF_msofbtAnimAttributeValue: + { + if( (nBits & 2 ) && ( pChildAtom->getInstance() == 1 ) ) + { + Any aAny; + if ( importAttributeValue( pChildAtom, aAny ) ) + { + OUString filter; + aAny >>= filter; + + dump( " filter=\"%s\"", filter ); + + const oox::ppt::transition* pTransition = oox::ppt::transition::find( filter ); + if( pTransition ) + { + xFilter->setTransition( pTransition->mnType ); + xFilter->setSubtype( pTransition->mnSubType ); + xFilter->setDirection( pTransition->mbDirection ); + } + else + { + OSL_FAIL( "unknown transition!" ); + } + } + } + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importAnimateAttributeTargetContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateTarget, "invalid call to ppt::AnimationImporter::importAnimateAttributeTargetContainer()!"); + + Any aTarget; + + Reference< XAnimate > xAnimate( xNode, UNO_QUERY ); + + bool bWrongContext = false; + + if( pAtom ) + { + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimPropertySet: + { + PropertySet aSet; + importPropertySetContainer( pChildAtom, aSet ); + if( aSet.hasProperty( DFF_ANIM_RUNTIMECONTEXT ) ) + { + OUString aContext; + if( aSet.getProperty( DFF_ANIM_RUNTIMECONTEXT ) >>= aContext ) + { + if( aContext != "PPT" ) + bWrongContext = true; + } + } + + dump( aSet ); + } + break; + + case DFF_msofbtAnimateTargetSettings: + { + if( xAnimate.is() ) + { + sal_uInt32 nBits(0); + sal_uInt32 nAdditive(0); + sal_uInt32 nAccumulate(0); + sal_uInt32 nTransformType(0); + + mrStCtrl.ReadUInt32( nBits ).ReadUInt32( nAdditive ).ReadUInt32( nAccumulate ).ReadUInt32( nTransformType ); + + // nBits %0001: additive, %0010: accumulate, %0100: attributeName, %1000: transformtype + // nAdditive 0 = base, 1 = sum, 2 = replace, 3 = multiply, 4 = none + // nAccumulate 0 = none, 1 = always + // nTransformType 0: "property" else "image" + + if( nBits & 3 && xAnimate.is() ) + { + if( nBits & 1 ) + { + sal_Int16 nTemp = AnimationAdditiveMode::BASE; + switch( nAdditive ) + { + case 1: nTemp = AnimationAdditiveMode::SUM; break; + case 2: nTemp = AnimationAdditiveMode::REPLACE; break; + case 3: nTemp = AnimationAdditiveMode::MULTIPLY; break; + case 4: nTemp = AnimationAdditiveMode::NONE; break; + } + xAnimate->setAdditive( nTemp ); + } + + if( nBits & 2 ) + { + xAnimate->setAccumulate( nAccumulate == 0 ); + } + } +#ifdef DBG_ANIM_LOG + if( nBits & 1 ) + fprintf( mpFile, " additive=\"%s\"", (nAdditive == 0) ? "base" : (nAdditive == 2) ? "replace" : (nAdditive == 1) ? "sum" : (nAdditive == 3 ) ? "multiply" : (nAdditive == 4) ? "none" : "unknown" ); + + if( nBits & 2 ) + fprintf( mpFile, " accumulate=\"%s\"", (nAccumulate == 0) ? "none" : "always" ); + + if( nBits & 8 ) + fprintf( mpFile, " transformType=\"%s\"", (nTransformType == 0) ? "property" : "image" ); +#endif + } + } + break; + + case DFF_msofbtAnimateAttributeNames: + { + if( xAnimate.is() ) + { + OUString aAttributeName; + importAttributeNamesContainer( pChildAtom, aAttributeName ); + if( xAnimate.is() ) + xAnimate->setAttributeName( aAttributeName ); + dump( " attributeName=\"%s\"", aAttributeName ); + } + } + break; + + case DFF_msofbtAnimateTargetElement: + { + sal_Int16 nSubType; + importTargetElementContainer( pChildAtom, aTarget, nSubType ); + if( xAnimate.is() ) + xAnimate->setSubItem( nSubType ); + + dump( " target=\"" ); + dump_target( aTarget ); + dump( "\"" ); + } + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } + } + + if( bWrongContext ) + aTarget.clear(); + + if( xAnimate.is() ) + xAnimate->setTarget( aTarget ); + else + { + Reference< XCommand > xCommand( xNode, UNO_QUERY ); + if( xCommand.is() ) + xCommand->setTarget( aTarget ); + } +} + +sal_Int16 AnimationImporter::implGetColorSpace( sal_Int32 nMode, sal_Int32 /*nA*/, sal_Int32 /*nB*/, sal_Int32 /*nC*/ ) +{ + switch( nMode ) + { + case 2: // index + default: + case 0: // rgb + return AnimationColorSpace::RGB; + + case 1: // hsl + return AnimationColorSpace::HSL; + } +} + +Any AnimationImporter::implGetColorAny( sal_Int32 nMode, sal_Int32 nA, sal_Int32 nB, sal_Int32 nC ) +{ + switch( nMode ) + { + case 0: // rgb + { + dump( "rgb(%ld", nA ); + dump( ",%ld", nB ); + dump( ",%ld)", nC ); + Color aColor( static_cast(nA), static_cast(nB), static_cast(nC) ); + return Any( static_cast(aColor.GetRGBColor()) ); + } + case 1: // hsl + { + dump( "hsl(%ld", nA ); + dump( ",%ld", nB ); + dump( ",%ld)", nC ); + Sequence< double > aHSL{ nA * 360.0/255.0, + nB / 255.0, + nC / 255.0 }; + return Any( aHSL ); + } + + case 2: // index + { + Color aColor; + mpPPTImport->GetColorFromPalette(static_cast(nA), aColor ); + dump( "index(%ld", nA ); + dump( " [%ld", static_cast(aColor.GetRed()) ); + dump( ",%ld", static_cast(aColor.GetGreen()) ); + dump( ",%ld])", static_cast(aColor.GetBlue()) ); + return Any( static_cast(aColor.GetRGBColor()) ); + } + + default: + { + dump( "unknown_%ld(", nMode ); + dump( "%ld", nA ); + dump( ",%ld", nB ); + dump( ",%ld)", nC ); + OSL_FAIL( "ppt::implGetColorAny(), unhandled color type" ); + + Any aAny; + return aAny; + } + } +} + +void AnimationImporter::importAnimateColorContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimateColor > xColor( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateColor && xColor.is(), "invalid call to ppt::AnimationImporter::importAnimateColorContainer()!"); + if( !(pAtom && xColor.is()) ) + return; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateColorData: + { + sal_uInt32 nBits; + sal_Int32 nByMode, nByA, nByB, nByC; + sal_Int32 nFromMode, nFromA, nFromB, nFromC; + sal_Int32 nToMode, nToA, nToB, nToC; + mrStCtrl.ReadUInt32( nBits ); + mrStCtrl.ReadInt32( nByMode ).ReadInt32( nByA ).ReadInt32( nByB ).ReadInt32( nByC ); + mrStCtrl.ReadInt32( nFromMode ).ReadInt32( nFromA ).ReadInt32( nFromB ).ReadInt32( nFromC ); + mrStCtrl.ReadInt32( nToMode ).ReadInt32( nToA ).ReadInt32( nToB ).ReadInt32( nToC ); + + if (!mrStCtrl.good()) + { + SAL_WARN("filter.ms", "DFF_msofbtAnimateColorData: short read"); + break; + } + + if( nBits & 1 ) + { + dump( " by=\"" ); + xColor->setBy( implGetColorAny( nByMode, nByA, nByB, nByC ) ); + xColor->setColorInterpolation( implGetColorSpace( nByMode, nByA, nByB, nByC ) ); + dump( "\""); + } + + if( nBits & 2 ) + { + dump( " from=\"" ); + xColor->setFrom( implGetColorAny( nFromMode, nFromA, nFromB, nFromC ) ); + xColor->setColorInterpolation( implGetColorSpace( nFromMode, nFromA, nFromB, nFromC ) ); + dump( "\""); + } + + if( nBits & 4 ) + { + dump( " to=\"" ); + xColor->setTo( implGetColorAny( nToMode, nToA, nToB, nToC ) ); + xColor->setColorInterpolation( implGetColorSpace( nToMode, nToA, nToB, nToC ) ); + dump( "\""); + } + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importAnimateSetContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimateSet > xSet( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateSet && xSet.is(), "invalid call to ppt::AnimationImporter::importAnimateSetContainer()!"); + if( !(pAtom && xSet.is()) ) + return; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateSetData: + { + sal_Int32 nU1, nU2; + mrStCtrl.ReadInt32( nU1 ).ReadInt32( nU2 ); + + dump( " set_1=\"%ld\"", nU1 ); + dump( " set_2=\"%ld\"", nU2 ); + } + break; + + case DFF_msofbtAnimAttributeValue: + { + Any aTo; + if ( importAttributeValue( pChildAtom, aTo ) ) + { + xSet->setTo( aTo ); + + dump( " value=\"" ); + dump( aTo ); + dump( "\"" ); + } + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importAnimateContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimate > xAnim( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimate && xAnim.is(), "invalid call to ppt::AnimationImporter::importAnimateContainer()!"); + if( !(pAtom && xAnim.is()) ) + return; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateData: + { + sal_uInt32 nCalcmode(0), nBits(0), nValueType(0); + mrStCtrl.ReadUInt32( nCalcmode ).ReadUInt32( nBits ).ReadUInt32( nValueType ); + + if( nBits & 0x08 ) + { + sal_Int16 n = (nCalcmode == 1) ? AnimationCalcMode::LINEAR : /* (nCalcmode == 2) ? AnimationCalcMode::FORMULA : */ AnimationCalcMode::DISCRETE; + xAnim->setCalcMode( n ); + dump( " calcmode=\"%s\"", (nCalcmode == 0) ? "discrete" : (nCalcmode == 1) ? "linear" : (nCalcmode == 2) ? "formula" : "unknown" ); + } + + if( nBits & 0x30 ) + { + sal_Int16 n = (nValueType == 1) ? AnimationValueType::NUMBER : (nValueType == 2 ) ? AnimationValueType::COLOR : AnimationValueType::STRING; + xAnim->setValueType( n ); + dump( " valueType=\"%s\"", (nValueType == 0) ? "string" : (nValueType == 1) ? "number" : (nValueType == 2) ? "color" : "unknown" ); + } + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimKeyPoints: + importAnimateKeyPoints( pChildAtom, xNode ); + break; + + case DFF_msofbtAnimAttributeValue: + { + Any a; + if ( importAttributeValue( pChildAtom, a ) ) + { + switch( pChildAtom->getInstance() ) + { + case 1: xAnim->setBy( a ); dump( " by=\"" ); break; + case 2: xAnim->setFrom( a ); dump( " from=\"" ); break; + case 3: xAnim->setTo( a ); dump( " to=\"" ); break; + default: + dump( " unknown_value=\"" ); + } + + dump( a ); + dump( "\"" ); + } + } + break; + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importAnimateMotionContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimateMotion > xMotion( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateMotion && xMotion.is(), "invalid call to ppt::AnimationImporter::importAnimateMotionContainer()!"); + if( !(pAtom && xMotion.is()) ) + return; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateMotionData: + { + sal_uInt32 nBits, nOrigin; + float fByX, fByY, fFromX, fFromY, fToX, fToY; + + mrStCtrl.ReadUInt32( nBits ).ReadFloat( fByX ).ReadFloat( fByY ).ReadFloat( fFromX ).ReadFloat( fFromY ).ReadFloat( fToX ).ReadFloat( fToY ).ReadUInt32( nOrigin ); + +#ifdef DBG_ANIM_LOG + if( nBits & 1 ) + fprintf( mpFile, " by=\"%g,%g\"", (double)fByX, (double)fByY ); + + if( nBits & 2 ) + fprintf( mpFile, " from=\"%g,%g\"", (double)fFromX, (double)fFromY ); + + if( nBits & 4 ) + fprintf( mpFile, " to=\"%g,%g\"", (double)fToX, (double)fToY ); + + if( nBits & 8 ) + fprintf( mpFile, " origin=\"%s\"", (nOrigin == 1) ? "parent" : (nOrigin == 2) ? "layout" : "unknown" ); + +#endif + } + break; + + case DFF_msofbtAnimAttributeValue: + { + Any aPath; + if ( importAttributeValue( pChildAtom, aPath ) ) + { + OUString aStr; + if ( aPath >>= aStr ) + { + // E can appear inside a number, so we only check for its presence at the end + aStr = aStr.trim(); + if (aStr.endsWith("E")) + aStr = aStr.copy(0, aStr.getLength() - 1); + aStr = aStr.trim(); + aPath <<= aStr; + xMotion->setPath( aPath ); + dump( " path=\"" ); + dump( aPath ); + dump( "\"" ); + } + } + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importCommandContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XCommand > xCommand( xNode, UNO_QUERY ); + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimCommand && xCommand.is(), "invalid call to ppt::AnimationImporter::importCommandContainer()!"); + if( !(pAtom && xCommand.is()) ) + return; + + sal_Int32 nBits = 0; + Any aValue; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtCommandData: + { + sal_Int32 nCommandType; + // looks like U1 is a bitset, bit 1 enables the type and bit 2 enables + // a propertyvalue that follows + mrStCtrl.ReadInt32( nBits ); + mrStCtrl.ReadInt32( nCommandType ); + + if( nBits & 1 ) + { + dump( " type=\"%s\"", (nCommandType == 0) ? "event" : ( nCommandType == 1) ? "call" : "verb" ); + } + } + break; + + case DFF_msofbtAnimAttributeValue: + { + if ( importAttributeValue( pChildAtom, aValue ) ) + { + if( nBits & 2 ) + { + dump( " cmd=\"" ); + dump( aValue ); + dump( "\"" ); + } + } + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } + + if( !(nBits & 3) ) + return; + + OUString aParam; + aValue >>= aParam; + + sal_Int16 nCommand = EffectCommands::CUSTOM; + + NamedValue aParamValue; + + if ( aParam == "onstopaudio" ) + { + nCommand = EffectCommands::STOPAUDIO; + } + else if ( aParam == "play" ) + { + nCommand = EffectCommands::PLAY; + } + else if( aParam.startsWith( "playFrom" ) ) + { + const std::u16string_view aMediaTime( aParam.subView( 9, aParam.getLength() - 10 ) ); + rtl_math_ConversionStatus eStatus; + double fMediaTime = ::rtl::math::stringToDouble( aMediaTime, u'.', u',', &eStatus ); + if( eStatus == rtl_math_ConversionStatus_Ok ) + { + aParamValue.Name = "MediaTime"; + aParamValue.Value <<= fMediaTime; + } + nCommand = EffectCommands::PLAY; + } + else if ( aParam == "togglePause" ) + { + nCommand = EffectCommands::TOGGLEPAUSE; + } + else if ( aParam == "stop" ) + { + nCommand = EffectCommands::STOP; + } + + xCommand->setCommand( nCommand ); + if( nCommand == EffectCommands::CUSTOM ) + { + OSL_FAIL("sd::AnimationImporter::importCommandContainer(), unknown command!"); + aParamValue.Name = "UserDefined"; + aParamValue.Value <<= aParam; + } + + if( aParamValue.Value.hasValue() ) + { + Sequence< NamedValue > aParamSeq( &aParamValue, 1 ); + xCommand->setParameter( Any( aParamSeq ) ); + } +} + +int AnimationImporter::importAudioContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + int nNodes = 0; + + Reference< XAudio > xAudio( xNode, UNO_QUERY ); + DBG_ASSERT( pAtom && xAudio.is() && + ( (pAtom->getType() == DFF_msofbtAnimGroup) || + (pAtom->getType() == DFF_msofbtAnimSubGoup) ), "invalid call to ppt::AnimationImporter::importAudioContainer()!"); + if( pAtom && xAudio.is() ) + { + importAnimationEvents( pAtom, xNode ); + importAnimationValues( pAtom, xNode ); + importAnimationActions( pAtom, xNode ); + + dump(">\n"); + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimNode: + case DFF_msofbtAnimEvent: + case DFF_msofbtAnimValue: + case DFF_msofbtAnimAction: + case DFF_msofbtAnimPropertySet: + break; + + case DFF_msofbtAnimAttributeValue: + { + Any aValue; + if ( importAttributeValue( pChildAtom, aValue ) ) + { + nNodes ++; + dump( " value=\"" ); + dump( aValue ); + dump( "\"" ); + } + } + break; + + case DFF_msofbtAnimateTargetElement: + { + sal_Int16 nSubType; + Any aSource; + importTargetElementContainer( pChildAtom, aSource, nSubType ); + if( xAudio.is() ) { + xAudio->setSource( aSource ); + nNodes ++; + } + } + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } + + // TODO: What to do with them? + Any aEmpty; + xAudio->setBegin( aEmpty ); + xAudio->setEnd( aEmpty ); + } + + return nNodes; +} + +void AnimationImporter::importAnimateScaleContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateScale && xTransform.is(), "invalid call to ppt::AnimationImporter::importAnimateScaleContainer()!"); + if( !(pAtom && xTransform.is()) ) + return; + + xTransform->setTransformType( AnimationTransformType::SCALE ); + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateScaleData: + { + sal_uInt32 nBits(0), nZoomContents(0); + float fByX(0.0), fByY(0.0), fFromX(0.0), fFromY(0.0), fToX(0.0), fToY(0.0); + + // nBits %001: by, %010: from, %100: to, %1000: zoomContents(bool) + mrStCtrl.ReadUInt32( nBits ).ReadFloat( fByX ).ReadFloat( fByY ).ReadFloat( fFromX ).ReadFloat( fFromY ).ReadFloat( fToX ).ReadFloat( fToY ).ReadUInt32( nZoomContents ); + + ValuePair aPair; + // 'from' value + if( nBits & 2 ) + { + aPair.First <<= static_cast(fFromX) / 100.0; + aPair.Second <<= static_cast(fFromY) / 100.0; + xTransform->setFrom( Any( aPair ) ); + } + + // 'to' value + if( nBits & 4 ) + { + aPair.First <<= static_cast(fToX) / 100.0; + aPair.Second <<= static_cast(fToY) / 100.0; + xTransform->setTo( Any( aPair ) ); + } + + // 'by' value + if( nBits & 1 ) + { + aPair.First <<= static_cast(fByX) / 100.0; + aPair.Second <<= static_cast(fByY) / 100.0; + + if( nBits & 2 ) + { + // 'from' value given, import normally + xTransform->setBy( Any( aPair ) ); + } + else + { + // mapping 'by' to 'to', if no 'from' is + // given. This is due to a non-conformity in + // PPT, which exports animateScale effects + // with a sole 'by' value, but with the + // semantics of a sole 'to' animation + xTransform->setTo( Any( aPair ) ); + } + } + +#ifdef DBG_ANIM_LOG + if( nBits & 1 ) + fprintf( mpFile, " by=\"%g,%g\"", (double)fByX, (double)fByY ); + + if( nBits & 2 ) + fprintf( mpFile, " from=\"%g,%g\"", (double)fFromX, (double)fFromY ); + + if( nBits & 4 ) + fprintf( mpFile, " to=\"%g,%g\"", (double)fToX, (double)fToY ); + + if( nBits & 8 ) + fprintf( mpFile, " zoomContents=\"%s\"", nZoomContents ? "true" : "false" ); +#endif + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importAnimateRotationContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateRotation && xTransform.is(), "invalid call to ppt::AnimationImporter::importAnimateRotationContainer()!"); + if( !(pAtom && xTransform.is()) ) + return; + + xTransform->setTransformType( AnimationTransformType::ROTATE ); + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + + while( pChildAtom ) + { + if( !pChildAtom->isContainer() ) + { + if( !pChildAtom->seekToContent() ) + break; + } + + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimateRotationData: + { + sal_uInt32 nBits(0), nU1(0); + float fBy(0.0), fFrom(0.0), fTo(0.0); + + // nBits %001: by, %010: from, %100: to, %1000: zoomContents(bool) + mrStCtrl.ReadUInt32( nBits ).ReadFloat( fBy ).ReadFloat( fFrom ).ReadFloat( fTo ).ReadUInt32( nU1 ); + + if( nBits & 1 ) + xTransform->setBy( Any( static_cast(fBy) ) ); + + if( nBits & 2 ) + xTransform->setFrom( Any( static_cast(fFrom) ) ); + + if( nBits & 4 ) + xTransform->setTo( Any( static_cast(fTo) ) ); + +#ifdef DBG_ANIM_LOG + if( nBits & 1 ) + fprintf( mpFile, " by=\"%g\"", (double)fBy ); + + if( nBits & 2 ) + fprintf( mpFile, " from=\"%g\"", (double)fFrom ); + + if( nBits & 4 ) + fprintf( mpFile, " to=\"%g\"", (double)fTo ); + + if( nU1 ) + fprintf( mpFile, " rotation_1=\"%" SAL_PRIdINT32 "\"", nU1 ); +#endif + } + break; + + case DFF_msofbtAnimateTarget: + importAnimateAttributeTargetContainer( pChildAtom, xNode ); + break; + + default: + dump( " unknown_atom=\"%ld\"", static_cast(pChildAtom->getType()) ); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +void AnimationImporter::importAttributeNamesContainer( const Atom* pAtom, OUString& rAttributeNames ) +{ + OUStringBuffer aNames; + + DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimateAttributeNames), "invalid call to ppt::AnimationImporter::importAttributeName()!" ); + if( pAtom ) + { + const Atom* pAttributeValueAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimAttributeValue ); + + while( pAttributeValueAtom ) + { + Any aAny; + if ( importAttributeValue( pAttributeValueAtom, aAny ) ) + { + OUString aName; + if( aAny >>= aName ) + { + if( !aNames.isEmpty() ) + aNames.append( ';' ); + + aNames.append( aName ); + } + } + else + { + OSL_FAIL( "error during ppt::AnimationImporter::importAttributeName()!" ); + } + + pAttributeValueAtom = pAtom->findNextChildAtom( DFF_msofbtAnimAttributeValue, pAttributeValueAtom ); + } + } + + rAttributeNames = aNames.makeStringAndClear(); +} + +void AnimationImporter::importAnimationValues( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + DBG_ASSERT( pAtom, "invalid call to ppt::AnimationImporter::importAnimationValues()!" ); + + if( !pAtom ) + return; + + const Atom* pValueAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimValue ); + + while( pValueAtom && pValueAtom->seekToContent() ) + { + sal_uInt32 nType(0); + mrStCtrl.ReadUInt32( nType ); + switch( nType ) + { + case 0: + { + float fRepeat(0.0); + mrStCtrl.ReadFloat( fRepeat ); + xNode->setRepeatCount( (fRepeat < (float(3.40282346638528860e+38))) ? Any( static_cast(fRepeat) ) : Any( Timing_INDEFINITE ) ); + +#ifdef DBG_ANIM_LOG + if( (fRepeat < ((float)3.40282346638528860e+38)) ) + { + dump( " repeat=\"%g\"", (double)fRepeat ); + } + else + { + dump( " repeat=\"indefinite\"" ); + } +#endif + } + break; + + case 3: + { + float faccelerate(0.0); + mrStCtrl.ReadFloat( faccelerate ); + xNode->setAcceleration( faccelerate ); + dump( " accelerate=\"%g\"", static_cast(faccelerate) ); + } + break; + + case 4: + { + float fdecelerate(0.0); + mrStCtrl.ReadFloat( fdecelerate ); + xNode->setDecelerate( fdecelerate ); + dump( " decelerate=\"%g\"", static_cast(fdecelerate) ); + } + break; + + case 5: + { + sal_Int32 nAutoreverse(0); + mrStCtrl.ReadInt32( nAutoreverse ); + xNode->setAutoReverse( nAutoreverse != 0 ); + dump( " autoreverse=\"%#lx\"", nAutoreverse ); + } + break; + + default: + { + sal_uInt32 nUnknown; + mrStCtrl.ReadUInt32( nUnknown ); +#ifdef DBG_ANIM_LOG + fprintf(mpFile, " attribute_%d=\"%#lx\"", nType, nUnknown ); +#endif + } + break; + } + + pValueAtom = pAtom->findNextChildAtom( DFF_msofbtAnimValue, pValueAtom ); + } +} + +void AnimationImporter::importAnimateKeyPoints( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + Reference< XAnimate > xAnim( xNode, UNO_QUERY ); + + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimKeyPoints && xAnim.is(), "invalid call to ppt::AnimationImporter::importAnimateKeyPoints()!" ); + + if( !(pAtom && xAnim.is()) ) + return; + + // first count keytimes + const Atom* pIter = nullptr; + int nKeyTimes = 0; + + while( (pIter = pAtom->findNextChildAtom( DFF_msofbtAnimKeyTime, pIter )) != nullptr ) + nKeyTimes++; + + Sequence< double > aKeyTimes( nKeyTimes ); + auto aKeyTimesRange = asNonConstRange(aKeyTimes); + Sequence< Any > aValues( nKeyTimes ); + auto aValuesRange = asNonConstRange(aValues); + OUString aFormula; + + pIter = pAtom->findFirstChildAtom(DFF_msofbtAnimKeyTime); + bool bToNormalize = false; + for( int nKeyTime = 0; (nKeyTime < nKeyTimes) && pIter; nKeyTime++ ) + { + if( pIter->seekToContent() ) + { + sal_Int32 nTemp(0); + mrStCtrl.ReadInt32(nTemp); + double fTemp = static_cast(nTemp) / 1000.0; + aKeyTimesRange[nKeyTime] = fTemp; + if( fTemp == -1 ) + bToNormalize = true; + + const Atom* pValue = Atom::findNextChildAtom(pIter); + if( pValue && pValue->getType() == DFF_msofbtAnimAttributeValue ) + { + Any aValue1, aValue2; + if( importAttributeValue( pValue, aValue1 ) ) + { + pValue = Atom::findNextChildAtom(pValue); + if( pValue && pValue->getType() == DFF_msofbtAnimAttributeValue ) + { + // Any occurrence of the formula becomes the formula of the whole list. + if (importAttributeValue(pValue, aValue2) && aFormula.isEmpty()) + aValue2 >>= aFormula; + } + aValuesRange[nKeyTime] = aValue1; + } + } + } + pIter = pAtom->findNextChildAtom(DFF_msofbtAnimKeyTime, pIter); + } + +#ifdef DBG_ANIM_LOG + dump( " keyTimes=\"" ); + for( int i=0; i>= aStr ) + dump( "%s", + OUStringToOString( aStr, + RTL_TEXTENCODING_ASCII_US ).getStr() ); + else if( aValues[i] >>= nVal ) + dump( "%f", nVal ); + else + { + ValuePair aValuePair; + + if( aValues[i] >>= aValuePair ) + { + if( aValuePair.First >>= aStr ) + dump( "%s", + OUStringToOString( aStr, + RTL_TEXTENCODING_ASCII_US ).getStr() ); + else if( aValuePair.First >>= nVal ) + dump( "%f", nVal ); + else + dump( "%X", (sal_Int64)&aValuePair.First ); + + if( aValuePair.Second >>= aStr ) + dump( ",%s", + OUStringToOString( aStr, + RTL_TEXTENCODING_ASCII_US ).getStr() ); + else if( aValuePair.Second >>= nVal ) + dump( ",%f", nVal ); + else + dump( ",%X", (sal_Int64)&aValuePair.Second ); + } + } + } + dump( "\"" ); +#endif + if( bToNormalize && nKeyTimes >= 2 ) + { + // if TimeAnimationValueList contains time -1000, key points must be evenly distributed between 0 and 1 ([MS-PPT] 2.8.31) + for( int nKeyTime = 0; nKeyTime < nKeyTimes; ++nKeyTime ) + { + aKeyTimesRange[nKeyTime] = static_cast(nKeyTime) / static_cast(nKeyTimes - 1); + } + } + + if (aValues.getLength() != aKeyTimes.getLength()) + throw css::io::WrongFormatException(); + + xAnim->setKeyTimes( aKeyTimes ); + xAnim->setValues( aValues ); + xAnim->setFormula( aFormula ); +} + +bool AnimationImporter::importAttributeValue( const Atom* pAtom, Any& rAny ) +{ + DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimAttributeValue, "invalid call to ppt::AnimationImporter::importAttributeValue()!" ); + + bool bOk = false; + + if( pAtom && pAtom->seekToContent() ) + { + sal_uInt32 nRecLen = pAtom->getLength(); + if ( nRecLen >= 1 ) + { + sal_Int8 nType(0); + mrStCtrl.ReadSChar( nType ); + switch( nType ) + { + case DFF_ANIM_PROP_TYPE_BYTE : + { + if ( nRecLen == 2 ) + { + sal_uInt8 nByte(0); + mrStCtrl.ReadUChar( nByte ); + rAny <<= nByte; + + bOk = true; + } + } + break; + + case DFF_ANIM_PROP_TYPE_INT32 : + { + if ( nRecLen == 5 ) + { + sal_uInt32 nInt32(0); + mrStCtrl.ReadUInt32( nInt32 ); + rAny <<= nInt32; + + bOk = true; + } + } + break; + + case DFF_ANIM_PROP_TYPE_FLOAT: + { + if( nRecLen == 5 ) + { + float fFloat(0.0); + mrStCtrl.ReadFloat( fFloat ); + rAny <<= static_cast(fFloat); + + bOk = true; + } + } + break; + + case DFF_ANIM_PROP_TYPE_UNISTRING : + { + if ( ( nRecLen & 1 ) && ( nRecLen > 1 ) ) + { + OUString aOUString = SvxMSDffManager::MSDFFReadZString( mrStCtrl, nRecLen - 1, true ); + rAny <<= aOUString; + + bOk = true; + } + } + break; + } + } + } + + DBG_ASSERT( bOk, "invalid value inside ppt::AnimationImporter::importAttributeValue()!" ); + return bOk; +} + +void AnimationImporter::importAnimationEvents( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + DBG_ASSERT( xNode.is() && pAtom, "invalid call to ppt::AnimationImporter::importAnimationEvents()!" ); + + Any aBegin, aEnd, aNext, aPrev; + + const Atom* pEventAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimEvent ); + while( pEventAtom ) + { + Any* pEvents = nullptr; + + switch( pEventAtom->getInstance() ) + { + case 1: pEvents = &aBegin; break; + case 2: pEvents = &aEnd; break; + case 3: pEvents = &aNext; break; + case 4: pEvents = &aPrev; break; + } + + if( pEvents ) + { + Event aEvent; + aEvent.Trigger = EventTrigger::NONE; + aEvent.Repeat = 0; + + const Atom* pChildAtom = pEventAtom->findFirstChildAtom(); + + while( pChildAtom && pChildAtom->seekToContent() ) + { + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimTrigger: + { + sal_Int32 nU1(0), nTrigger(0), nU3(0), nBegin(0); + mrStCtrl.ReadInt32( nU1 ); + mrStCtrl.ReadInt32( nTrigger ); + mrStCtrl.ReadInt32( nU3 ); + mrStCtrl.ReadInt32( nBegin ); + + switch( nTrigger ) + { + case 0: aEvent.Trigger = EventTrigger::NONE; break; + case 1: aEvent.Trigger = EventTrigger::ON_BEGIN; break; + case 2: aEvent.Trigger = EventTrigger::ON_END; break; + case 3: aEvent.Trigger = EventTrigger::BEGIN_EVENT; break; + case 4: aEvent.Trigger = EventTrigger::END_EVENT; break; + case 5: aEvent.Trigger = EventTrigger::ON_CLICK; break; + case 6: aEvent.Trigger = EventTrigger::ON_DBL_CLICK; break; + case 7: aEvent.Trigger = EventTrigger::ON_MOUSE_ENTER; break; + case 8: aEvent.Trigger = EventTrigger::ON_MOUSE_LEAVE; break; + case 9: aEvent.Trigger = EventTrigger::ON_NEXT; break; + case 10: aEvent.Trigger = EventTrigger::ON_PREV; break; + case 11: aEvent.Trigger = EventTrigger::ON_STOP_AUDIO; break; + } + + if( (nBegin != 0) || (aEvent.Trigger == EventTrigger::NONE) ) + aEvent.Offset = (nBegin == -1) ? Any( Timing_INDEFINITE ) : Any( nBegin / 1000.0 ); + } + break; + case DFF_msofbtAnimateTargetElement: + { + sal_Int16 nSubType; + importTargetElementContainer( pChildAtom, aEvent.Source, nSubType ); + } + break; + default: + { + OSL_FAIL("unknown atom inside ppt::AnimationImporter::importAnimationEvents()!"); + } + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } + + *pEvents = oox::addToSequence( *pEvents, (aEvent.Trigger == EventTrigger::NONE) ? aEvent.Offset : Any( aEvent ) ); + } + + pEventAtom = pAtom->findNextChildAtom( DFF_msofbtAnimEvent, pEventAtom ); + } + + xNode->setBegin( aBegin ); + xNode->setEnd( aEnd ); + // TODO: xNode->setNext( aNext ); + // TODO: xNode->setPrev( aNext ); + +#ifdef DBG_ANIM_LOG + if( aBegin.hasValue() ) + { + dump( " begin=\"" ); + dump( aBegin ); + dump( "\"" ); + } + + if( aEnd.hasValue() ) + { + dump( " end=\"" ); + dump( aEnd ); + dump( "\"" ); + } + + if( aNext.hasValue() ) + { + dump( " next=\"" ); + dump( aNext ); + dump( "\"" ); + } + + if( aPrev.hasValue() ) + { + dump( " prev=\"" ); + dump( aPrev ); + dump( "\"" ); + } +#endif +} + +void AnimationImporter::importAnimationActions( const Atom* pAtom, const Reference< XAnimationNode >& xNode ) +{ + DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importAnimationActions()!"); + + if( !pAtom ) + return; + + const Atom* pActionAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimAction ); + + if( !(pActionAtom && pActionAtom->seekToContent()) ) + return; + + sal_Int32 nConcurrent(0), nNextAction(0), nEndSync(0), nU4(0), nU5(0); + mrStCtrl.ReadInt32( nConcurrent ); + mrStCtrl.ReadInt32( nNextAction ); + mrStCtrl.ReadInt32( nEndSync ); + mrStCtrl.ReadInt32( nU4 ); + mrStCtrl.ReadInt32( nU5 ); + + if( nEndSync == 1 ) + xNode->setEndSync( Any( AnimationEndSync::ALL ) ); + +#ifdef DBG_ANIM_LOG + dump( " concurrent=\"%s\"", nConcurrent == 0 ? "disabled" : (nConcurrent == 1 ? "enabled" : "unknown") ); + + dump( " nextAction=\"%s\"", nNextAction == 0 ? "none" : (nNextAction == 1 ? "seek" : "unknown") ); + + if( nEndSync != 0 ) + { + dump( " endSync=\"%s\"", nEndSync == 1 ? "all" : "unknown" ); + } + + dump( " action_4=\"%#lx\"", nU4 ); + dump( " action_5=\"%#lx\"", nU5 ); +#endif +} + +void AnimationImporter::importTargetElementContainer( const Atom* pAtom, Any& rTarget, sal_Int16& rSubType ) +{ + rSubType = ShapeAnimationSubType::AS_WHOLE; + sal_Int32 nRefMode = -1; + + DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimateTargetElement), "invalid call to ppt::AnimationImporter::importTargetElementContainer()!" ); + if( !pAtom ) + return; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + while( pChildAtom && pChildAtom->seekToContent() ) + { + switch( pChildAtom->getType() ) + { + case DFF_msofbtAnimReference: + { + sal_Int32 nRefType(0), nRefId(0); + sal_Int32 begin(0), end(0); + mrStCtrl.ReadInt32( nRefMode ); + mrStCtrl.ReadInt32( nRefType ); + mrStCtrl.ReadInt32( nRefId ); + mrStCtrl.ReadInt32( begin ); + mrStCtrl.ReadInt32( end ); + + switch( nRefType ) + { + case 1: // shape + { + SdrObject* pSdrObject = mpPPTImport->getShapeForId( nRefId ); + if( pSdrObject == nullptr ) + break; + + rTarget <<= pSdrObject->getUnoShape(); + + switch( nRefMode ) + { + case 6: rSubType = ShapeAnimationSubType::ONLY_BACKGROUND; break; + case 8: rSubType = ShapeAnimationSubType::ONLY_TEXT; break; + case 2: // one paragraph + { + if((begin == -1) && (end == -1)) + break; + + SdrTextObj* pTextObj = DynCastSdrTextObj( pSdrObject ); + if(!pTextObj) + break; + + const OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject(); + if( pOPO == nullptr ) + break; + + const EditTextObject& rEditTextObject = pOPO->GetTextObject(); + + const sal_Int32 nParaCount = rEditTextObject.GetParagraphCount(); + + sal_Int32 nPara = 0; + + while( (nPara < nParaCount) && (begin > 0) ) + { + sal_Int32 nParaLength = rEditTextObject.GetText( nPara ).getLength() + 1; + begin -= nParaLength; + end -= nParaLength; + nPara++; + } + + if( nPara < nParaCount ) + { + ParagraphTarget aParaTarget; + rTarget >>= aParaTarget.Shape; + /* FIXME: Paragraph should be sal_Int32 as well */ + aParaTarget.Paragraph = static_cast(nPara); + rTarget <<= aParaTarget; + + rSubType = ShapeAnimationSubType::ONLY_TEXT; + dump( " paragraph %d,", nPara); + dump( " %d characters", end ); + } + } + } + } + break; + + case 2: // sound + { + OUString aSoundURL( mpPPTImport->ReadSound( nRefId ) ); + rTarget <<= aSoundURL; + dump( " srcRef=\"%s\"", aSoundURL ); + } + break; + case 3: // audio object + case 4: // video object + { + SdrObject* pSdrObject = mpPPTImport->getShapeForId( nRefId ); + if( pSdrObject == nullptr ) + break; + + rTarget <<= pSdrObject->getUnoShape(); + } + break; + default: + OSL_FAIL("unknown reference type"); + } + + } + break; + case 0x2b01: + { + sal_Int32 nU1; + mrStCtrl.ReadInt32( nU1 ); + } + break; + default: + OSL_FAIL("unknown atom inside ppt::AnimationImporter::importTargetElementContainer()!"); + break; + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + + } +} + +void AnimationImporter::importPropertySetContainer( const Atom* pAtom, PropertySet& rSet ) +{ + DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimPropertySet), "invalid call to ppt::AnimationImporter::importPropertySetContainer()!" ); + + if( !pAtom ) + return; + + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + while( pChildAtom ) + { + if( pChildAtom->getType() == DFF_msofbtAnimAttributeValue ) + { + Any aAny; + (void)importAttributeValue( pChildAtom, aAny ); + rSet.maProperties[ pChildAtom->getInstance() ] = aAny; + } + else + { + OSL_FAIL("unknown atom inside ppt::AnimationImporter::importPropertySetContainer()!"); + } + + pChildAtom = Atom::findNextChildAtom( pChildAtom ); + } +} + +#ifdef DBG_ANIM_LOG +void AnimationImporter::dump_atom_header( const Atom* pAtom, bool bOpen, bool bAppend ) +{ + if( pAtom ) + { + const char* pTitle; + + switch( pAtom->getType() ) + { + case DFF_msofbtAnimEvent: pTitle = "AnimEvent"; break; + case DFF_msofbtAnimTrigger: pTitle = "AnimTrigger"; break; + case DFF_msofbtAnimateMotion: pTitle = "AnimateMotion"; break; + case DFF_msofbtAnimPropertySet: pTitle = "AnimPropertySet"; break; + case DFF_msofbtAnimateAttributeNames: pTitle = "AnimAttributeName"; break; + case DFF_msofbtAnimAttributeValue: pTitle = "AnimAttributeValue"; break; + case DFF_msofbtAnimGroup: pTitle = "AnimGroup"; break; + case DFF_msofbtAnimNode: pTitle = "AnimNode"; break; + case DFF_msofbtAnimValue: pTitle = "AnimValue"; break; + case DFF_msofbtAnimateFilter: pTitle = "animateFilter"; break; + case DFF_msofbtAnimate: pTitle = "animate"; break; + case DFF_msofbtAnimateSet: pTitle = "set"; break; + case DFF_msofbtAnimKeyTime: pTitle = "AnimKeyTime"; break; + case DFF_msofbtAnimKeyPoints: pTitle = "AnimKeyPoints"; break; + case DFF_msofbtAnimReference: pTitle = "AnimReference"; break; + case DFF_msofbtAnimateTargetElement: pTitle = "AnimTargetElementContainer"; break; + case DFF_msofbtAnimAction: pTitle = "AnimAction"; break; + case DFF_msofbtAnimCommand: pTitle = "AnimCommand"; break; + case DFF_msofbtAnimateTarget: pTitle = "TransformationTarget"; break; + case DFF_msofbtAnimateTargetSettings: pTitle = "TransformationTargetSettings"; break; + case DFF_msofbtAnimIteration: pTitle = "iterate"; break; + case DFF_msofbtAnimateColorData: pTitle = "colorData"; break; + case DFF_msofbtAnimateScaleData: pTitle = "scaleData"; break; + case DFF_msofbtAnimateSetData: pTitle = "setData"; break; + + default: + { + static char buffer[128]; + sprintf( buffer, "unknown_%#x", pAtom->getType() ); + pTitle = buffer; + } + } + + if( bOpen ) + { + fprintf(mpFile, "<%s", pTitle ); + + fprintf(mpFile, " instance=\"%hu\"%s", + pAtom->getInstance(), + bAppend ? "" : ">\n"); + } + else + { + if( bAppend ) + fprintf(mpFile,"/>\n"); + else + fprintf(mpFile, "\n", pTitle ); + } + } +} + +void AnimationImporter::dump( sal_uInt32 nLen, bool bNewLine ) +{ + char * faul = "0123456789abcdef"; + + sal_uInt32 i = 0; + int b = 0; + char nData; + + for( i = 0; i < nLen; i++ ) + { + mrStCtrl.ReadChar(nData); + + fprintf( mpFile, "%c%c ", faul[ (nData >> 4) & 0x0f ], faul[ nData & 0x0f ] ); + + b++; + if( bNewLine && (b == 32) ) + { + fprintf(mpFile,"\n"); + b = 0; + } + } + if( (b != 0) && bNewLine ) + fprintf(mpFile,"\n"); +} + +void AnimationImporter::dump_atom( const Atom* pAtom, bool bNewLine ) +{ + if( pAtom ) + { + if( pAtom->isContainer() ) + { + const Atom* pChildAtom = pAtom->findFirstChildAtom(); + while( pChildAtom ) + { + if( pChildAtom->getType() == DFF_msofbtAnimAttributeValue ) + { + fprintf(mpFile, "getInstance() ); + + Any aValue; + if( importAttributeValue( pChildAtom, aValue ) ) + { + sal_Int32 nInt; + OUString aString; + double fDouble; + + if( aValue >>= nInt ) + { + fprintf(mpFile, " value=\"%" SAL_PRIdINT32 "\"", nInt ); + } + else if( aValue >>= aString ) + { + fprintf(mpFile, " value=\"%s\"", + OUStringToOString(aString, + RTL_TEXTENCODING_UTF8).getStr()); + } + else if( aValue >>= fDouble ) + { + fprintf(mpFile, " value=\"%g\"", fDouble ); + } + } + else + { + if( pChildAtom->seekToContent() ) + { + fprintf(mpFile, " value=\"" ); + dump_atom( pChildAtom, false ); + fprintf(mpFile, "\""); + } + } + + fprintf(mpFile, "/>\n" ); + } + else + { + dump_atom_header( pChildAtom, true, pChildAtom->getType() == DFF_msofbtAnimAttributeValue ); + dump_atom( pChildAtom ); + dump_atom_header( pChildAtom, false, pChildAtom->getType() == DFF_msofbtAnimAttributeValue ); + } + + pChildAtom = Atom::findNextChildAtom(pChildAtom); + } + } + else if( pAtom->seekToContent() ) + { + dump( pAtom->getLength(), bNewLine ); + } + } +} + +void AnimationImporter::dump_anim_group( const Atom* pAtom, const AnimationNode& rNode, const PropertySet& rSet, bool bOpen ) +{ + fprintf( mpFile, bOpen ? "<" : "hasChildAtom( DFF_msofbtAnimateSet ) ) + fprintf( mpFile, "set" ); + else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) ) + fprintf( mpFile, "animateColor" ); + else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) ) + fprintf( mpFile, "animateScale" ); + else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) ) + fprintf( mpFile, "animateRotation" ); + else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) ) + fprintf( mpFile, "animateMotion" ); + else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) ) + fprintf( mpFile, "command" ); + else + fprintf( mpFile, "animation" ); + break; + default: + { + fprintf( mpFile, "unknown_node_%#lx", rNode.mnNodeType ); + } + break; + } + break; + case mso_Anim_GroupType_MEDIA: + fprintf( mpFile, "media" ); + break; + default: + fprintf( mpFile, "unknown_group_%#lx", rNode.mnGroupType ); + break; + } + + if( bOpen ) + { + dump( rNode ); + dump( rSet ); + } + + fprintf(mpFile,">\n"); +} + +void AnimationImporter::dump( const AnimationNode& rNode ) +{ + // dump animation node + if( rNode.mnRestart != 0 ) + { + fprintf(mpFile," restart=\"%s\"", + rNode.mnRestart == 1 ? "always" : (rNode.mnRestart == 2 ? "whenOff" : (rNode.mnRestart == 3 ? "never" : "unknown")) ); + } + + if( rNode.mnFill ) + { + fprintf(mpFile," fill=\"%s\"", + rNode.mnFill == 1 ? "remove" : (rNode.mnFill == 3 ? "hold" : (rNode.mnFill == 2 ? "freeze" : "unknown")) ); + } + + if( rNode.mnDuration > 0 ) + { + double fSeconds = rNode.mnDuration; + fSeconds /= 1000.0; + fprintf(mpFile, " dur=\"%g\"", fSeconds); + } + else if( rNode.mnDuration < 0 ) + { + fprintf(mpFile, " dur=\"indefinite\"" ); + } + + if( rNode.mnU1 ) fprintf(mpFile," u1=\"%#lx\"", rNode.mnU1); + if( rNode.mnU3 ) fprintf(mpFile," u3=\"%#lx\"", rNode.mnU3); + if( rNode.mnU4 ) fprintf(mpFile," u4=\"%#lx\"", rNode.mnU4); +} + +void AnimationImporter::dump( Any& rAny ) +{ + Sequence< Any > aSeq; + sal_Int32 nInt; + double fDouble; + OUString aString; + sal_Bool bBool; + Event aEvent; + Timing aTiming; + + if( rAny >>= aSeq ) + { + const sal_Int32 nSize = aSeq.getLength(); + sal_Int32 nIndex = 0; + while( nIndex < nSize ) + { + dump( aSeq[nIndex++] ); + if(nIndex < nSize) + fprintf( mpFile, "," ); + } + } + else if( rAny >>= aString ) + { + fprintf( mpFile, "%s", OUStringToOString(aString, + RTL_TEXTENCODING_UTF8).getStr() ); + } + else if( rAny >>= nInt ) + { + fprintf( mpFile, "%" SAL_PRIdINT32, nInt ); + } + else if( rAny >>= bBool ) + { + fprintf( mpFile, "%s", bBool ? "true" : "false" ); + } + else if( rAny >>= fDouble ) + { + fprintf( mpFile, "%g", fDouble ); + } + else if( rAny >>= aTiming ) + { + fprintf( mpFile, "%s", aTiming == (Timing_INDEFINITE) ? "indefinite" : "media" ); + } + else if( rAny >>= aEvent ) + { + if( aEvent.Trigger != EventTrigger::NONE ) + { + static const char* triggers[] = + { + "none","onbegin","onend","begin", + "end","onclick","ondoubleclick","onmouseenter", + "onmouseleave","onpptnext","onpptprev","onstopaudio" + }; + + if( aEvent.Source.hasValue() ) + { + dump_target( aEvent.Source ); + dump( "." ); + } + + dump( triggers[ aEvent.Trigger ] ); + } + + if( aEvent.Offset.hasValue() ) + { + double fOffset; + if( aEvent.Offset >>= fOffset ) + fprintf( mpFile, "%g", fOffset ); + else + dump( "indefinite" ); + } + } +} + +void AnimationImporter::dump( const PropertySet& rSet ) +{ + // dump property set + + for( const auto& rProp : rSet.maProperties ) + { + bool bKnown = false; + + const sal_Int32 nInstance = rProp.first; + Any aAny( rProp.second ); + + switch ( nInstance ) + { + case DFF_ANIM_COLORSPACE: + { + sal_Int32 nColorSpace; + if( aAny >>= nColorSpace ) + { + fprintf( mpFile, " colorSpace=\"%s\"", (nColorSpace == 0) ? "rgb" : (nColorSpace == 1) ? "hsl" : "unknown" ); + bKnown = true; + } + } + break; + + case DFF_ANIM_DIRECTION: + { + sal_Bool bDirection; + if( aAny >>= bDirection ) + { + fprintf( mpFile, " direction=\"%s\"", bDirection ? "cclockwise" : "clockwise" ); + bKnown = true; + } + else + { + sal_Int32 nMasterRel; + if( aAny >>= nMasterRel ) + { + fprintf( mpFile, " direction=\"%s\"", nMasterRel == 0 ? "sameClick" : ( nMasterRel == 2 ? "nextClick" : "lastClick" ) ); + bKnown = true; + } + } + } + break; + + case DFF_ANIM_OVERRIDE: // TODO + { + sal_Int32 nOverride; + if( aAny >>= nOverride ) + { + fprintf( mpFile, " override=\"%s\"", (nOverride == 1) ? "childStyle" : (nOverride == 0) ? "normal" : "unknown" ); + bKnown = true; + } + } + break; + + case DFF_ANIM_PATH_EDIT_MODE: + { + sal_Bool bPathEditMode; + if( aAny >>= bPathEditMode ) + { + fprintf( mpFile, " pptPathEditMode=\"%s\"", bPathEditMode ? "relative" : "fixed" ); + bKnown = true; + } + } + break; + + case DFF_ANIM_PRESET_ID : + { + sal_Int32 nPresetId ; + if( aAny >>= nPresetId ) + { + fprintf(mpFile, " presetid=\"%" SAL_PRIdINT32 "\"", nPresetId ); + bKnown = true; + } + } + break; + + case DFF_ANIM_PRESET_SUB_TYPE : + { + sal_Int32 nPointsType ; + if( aAny >>= nPointsType ) + { + fprintf(mpFile, " presetSubType=\"%" SAL_PRIdINT32 "\"", nPointsType ); + bKnown = true; + } + } + break; + + case DFF_ANIM_PRESET_CLASS : + { + sal_Int32 nPresetClass; + if ( aAny >>= nPresetClass ) + { + const char* pMode; + switch( nPresetClass ) + { + case DFF_ANIM_PRESS_CLASS_USER_DEFINED: pMode = "userdefined"; break; + case DFF_ANIM_PRESS_CLASS_ENTRANCE: pMode = "entrance"; break; + case DFF_ANIM_PRESS_CLASS_EXIT: pMode = "exit"; break; + case DFF_ANIM_PRESS_CLASS_EMPHASIS: pMode = "emphasis"; break; + case DFF_ANIM_PRESS_CLASS_MOTIONPATH: pMode = "motionpath"; break; + case DFF_ANIM_PRESS_CLASS_OLE_ACTION: pMode = "oleaction"; break; + case DFF_ANIM_PRESS_CLASS_MEDIACALL: pMode = "mediacall"; break; + default: + pMode = nullptr; + break; + } + + if (pMode) + fprintf(mpFile, " class=\"%s\"", pMode); + else + fprintf(mpFile, " class =\"%" SAL_PRIdINT32 "\"", nPresetClass); + bKnown = true; + } + } + break; + + case DFF_ANIM_NODE_TYPE : + { + sal_Int32 nNodeType; + if ( aAny >>= nNodeType ) + { + const char* pNode; + switch( nNodeType ) + { + case DFF_ANIM_NODE_TYPE_ON_CLICK: pNode = "onclick"; break; + case DFF_ANIM_NODE_TYPE_WITH_PREVIOUS: pNode = "withprevious"; break; + case DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS: pNode = "afterprevious"; break; + case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE: pNode = "mainsequence"; break; + case DFF_ANIM_NODE_TYPE_TIMING_ROOT: pNode = "timingroot"; break; + case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:pNode = "interactivesequence"; break; + default : + { + static char buffer[128]; + sprintf( buffer, "%" SAL_PRIdINT32, nNodeType ); + pNode = buffer; + } + break; + } + + fprintf(mpFile, " nodeType=\"%s\"", pNode); + bKnown = true; + } + } + break; + + case DFF_ANIM_GROUP_ID: + { + sal_Int32 nGroupId; + if ( aAny >>= nGroupId ) + { + fprintf( mpFile, " groupId=\"%" SAL_PRIdINT32 "\"", nGroupId ); + bKnown = true; + } + } + break; + + case DFF_ANIM_ID: + { + OUString aString; + if( aAny >>= aString ) + { + fprintf( mpFile, " id=\"%s\"", + OUStringToOString(aString, + RTL_TEXTENCODING_UTF8).getStr() ); + bKnown = true; + } + } + break; + + case DFF_ANIM_EVENT_FILTER: + { + OUString aString; + if( aAny >>= aString ) + { + fprintf( mpFile, " eventFilter=\"%s\"", + OUStringToOString(aString, + RTL_TEXTENCODING_UTF8).getStr() ); + bKnown = true; + } + } + break; + + case DFF_ANIM_ENDAFTERSLIDE: + { + sal_Int32 nEndAfterSlide; + if( aAny >>= nEndAfterSlide ) + { + fprintf(mpFile, " endAfterSlide=\"%" SAL_PRIdINT32 "\"", nEndAfterSlide ); + bKnown = true; + } + } + + case DFF_ANIM_TIMEFILTER: + { + OUString aString; + if( aAny >>= aString ) + { + fprintf( mpFile, " timeFilter=\"%s\"", + OUStringToOString(aString, + RTL_TEXTENCODING_UTF8).getStr() ); + bKnown = true; + } + } + break; + + case DFF_ANIM_RUNTIMECONTEXT: + { + OUString aString; + if( aAny >>= aString ) + { + fprintf( mpFile, " runtimeContext=\"%s\"", + OUStringToOString(aString, + RTL_TEXTENCODING_UTF8).getStr() ); + bKnown = true; + } + } + break; + + case DFF_ANIM_VOLUME: + { + double fVolume(0.0); + if( aAny >>= fVolume ) + { + fprintf( mpFile, " volume=\"%g%%\"", (double)(fVolume * 100.0) ); + bKnown = true; + } + } + break; + + case DFF_ANIM_AFTEREFFECT: + { + sal_Bool bAfterEffect; + if( aAny >>= bAfterEffect ) + { + fprintf( mpFile, "afterEffect=\"%s\"", bAfterEffect ? "true" : "false" ); + bKnown = true; + } + } + break; + + } + + if( !bKnown ) + { + fprintf( mpFile, " unknown_%" SAL_PRIdINT32 "=\"", nInstance ); + dump( aAny ); + fprintf( mpFile, "\"" ); + } + } +} + +void AnimationImporter::dump_target( Any& rAny ) +{ + Any aSource, aSourceData; + Sequence< Any > aSeq; + if( rAny >>= aSeq ) + { + if( aSeq.getLength() >= 1 ) aSource = aSeq[0]; + if( aSeq.getLength() >= 2 ) aSourceData = aSeq[1]; + } + else + { + aSource = rAny; + } + + Reference< XShape > xShape; + aSource >>= xShape; + if( xShape.is() ) + { + OUString aStr( xShape->getShapeType() ); + dump( aStr ); + + if( aSourceData.hasValue() ) + { + dump( "(" ); + dump( aSourceData ); + dump( ")" ); + } + } +} + +void AnimationImporter::dump( const char * pText ) +{ + fprintf( mpFile, "%s", pText ); +} + +void AnimationImporter::dump( const OUString& rString ) +{ + fprintf( mpFile, OUStringToOString(rString, + RTL_TEXTENCODING_UTF8).getStr() ); +} + +void AnimationImporter::dump( const char * pText, sal_Int64 nInt ) +{ + fprintf( mpFile, pText, nInt ); +} + +void AnimationImporter::dump( const char * pText, sal_Int32 nInt ) +{ + fprintf( mpFile, pText, nInt ); +} + +void AnimationImporter::dump( const char * pText, double fDouble ) +{ + fprintf( mpFile, pText, fDouble ); +} + +void AnimationImporter::dump( const char * pText, const char * pText2 ) +{ + fprintf( mpFile, pText, pText2 ); +} + +void AnimationImporter::dump( const char * pText, const OUString& rString ) +{ + fprintf( mpFile, pText, OUStringToOString(rString, + RTL_TEXTENCODING_UTF8).getStr() ); +} + +#else + +void AnimationImporter::dump_atom_header( const Atom* , bool , bool ) +{ +} + +void AnimationImporter::dump_atom( const Atom* , bool ) +{ +} + +void AnimationImporter::dump_target( css::uno::Any& ) +{ +} + +void AnimationImporter::dump( css::uno::Any& ) +{ +} + +void AnimationImporter::dump( const PropertySet& ) +{ +} + +void AnimationImporter::dump( const AnimationNode& ) +{ +} + +void AnimationImporter::dump( const char * ) +{ +} + +void AnimationImporter::dump( const char * , sal_Int32 ) +{ +} + +void AnimationImporter::dump( const char * , double ) +{ +} + +void AnimationImporter::dump( const char * , const char * ) +{ +} + +void AnimationImporter::dump( const char * , std::u16string_view ) +{ +} + +#endif + +} // namespace ppt; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/pptinanimations.hxx b/sd/source/filter/ppt/pptinanimations.hxx new file mode 100644 index 0000000000..ed79144b96 --- /dev/null +++ b/sd/source/filter/ppt/pptinanimations.hxx @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +#ifdef DBG_ANIM_LOG +#include +#endif + +namespace com::sun::star::animations { class XAnimationNode; } +namespace com::sun::star::drawing { class XDrawPage; } +namespace ppt { struct AnimationNode; } + +class DffRecordHeader; +class SvStream; +class ImplSdPPTImport; + +namespace ppt +{ +class PropertySet; +class Atom; + +class AnimationImporter +{ +public: + AnimationImporter( ImplSdPPTImport* pPPTImport, SvStream& rStCtrl ); + + int import( const css::uno::Reference< css::drawing::XDrawPage >& xPage, const DffRecordHeader& rProgTagContentHd ); + +private: + int importAnimationContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xParent ); + int importTimeContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + int importAnimationNodeContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + + void importAnimateSetContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateFilterContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateScaleContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateColorContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateRotationContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateMotionContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importCommandContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + int importAudioContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + + void importAnimationEvents( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimationValues( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimationActions( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importAnimateAttributeTargetContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + + void importAnimateKeyPoints( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode ); + void importPropertySetContainer( const Atom* pAtom,PropertySet& rSet ); + bool importAttributeValue( const Atom* pAtom, css::uno::Any& rAny ); + void importAttributeNamesContainer( const Atom* pAtom, OUString& rAttributeNames ); + void importTargetElementContainer( const Atom* pAtom, css::uno::Any& rTarget, sal_Int16& nSubType ); + + static void fillNode( css::uno::Reference< css::animations::XAnimationNode > const & xTiming, const AnimationNode& rNode, const PropertySet& rSet ); + static css::uno::Reference< css::animations::XAnimationNode > createNode( const Atom* pAtom, const AnimationNode& rNode ); + + bool convertAnimationNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode, const css::uno::Reference< css::animations::XAnimationNode >& xParent ); + css::uno::Any implGetColorAny( sal_Int32 nMode, sal_Int32 nA, sal_Int32 nB, sal_Int32 nC ); + static sal_Int16 implGetColorSpace( sal_Int32 nMode, sal_Int32 nA, sal_Int32 nB, sal_Int32 nC ); + +private: + css::uno::Reference< css::animations::XAnimationNode > mxRootNode; + + ImplSdPPTImport* mpPPTImport; + SvStream& mrStCtrl; + + std::vector< sd::AfterEffectNode > maAfterEffectNodes; + +#ifdef DBG_ANIM_LOG + FILE * mpFile; + void dump_anim_group( const Atom* pAtom, const AnimationNode& rNode, const PropertySet& rSet, bool bOpen ); + void dump( const OUString& rString ); + void dump( sal_uInt32 nLen, bool bNewLine = true ); +#endif + + static void dump_atom_header( const Atom* pAtom, bool bOpen, bool bAppend ); + static void dump_atom( const Atom* pAtom, bool bNewLine = true ); + static void dump_target( css::uno::Any& rAny ); + static void dump( css::uno::Any& rAny ); + static void dump( const PropertySet& rSet ); + static void dump( const AnimationNode& rNode ); + static void dump( const char * pText ); + static void dump( const char * pText, sal_Int32 nInt ); + void dump( const char * pText, sal_Int64 nInt ); + static void dump( const char * pText, double fDouble ); + static void dump( const char * pText, const char * pText2 ); + static void dump( const char * pText, std::u16string_view rString ); +}; + +} // namespace ppt + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/propread.cxx b/sd/source/filter/ppt/propread.cxx new file mode 100644 index 0000000000..b9fb96f988 --- /dev/null +++ b/sd/source/filter/ppt/propread.cxx @@ -0,0 +1,615 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "propread.hxx" +#include +#include +#include +#include +#include +#include + +PropEntry::PropEntry( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize ) : + mnId ( nId ), + mnSize ( nBufSize ), + mpBuf ( new sal_uInt8[ nBufSize ] ) +{ + memcpy( mpBuf.get(), pBuf, nBufSize ); +}; + +PropEntry::PropEntry( const PropEntry& rProp ) : + mnId ( rProp.mnId ), + mnSize ( rProp.mnSize ), + mpBuf ( new sal_uInt8[ mnSize ] ) +{ + memcpy( mpBuf.get(), rProp.mpBuf.get(), mnSize ); +}; + +PropEntry& PropEntry::operator=(const PropEntry& rPropEntry) +{ + if ( this != &rPropEntry ) + { + mnId = rPropEntry.mnId; + mnSize = rPropEntry.mnSize; + mpBuf.reset( new sal_uInt8[ mnSize ] ); + memcpy( mpBuf.get(), rPropEntry.mpBuf.get(), mnSize ); + } + return *this; +} + +void PropItem::Clear() +{ + Seek( STREAM_SEEK_TO_BEGIN ); + delete[] static_cast(SwitchBuffer()); +} + +static sal_Int32 lcl_getMaxSafeStrLen(sal_uInt32 nSize) +{ + nSize -= 1; //Drop NULL terminator + + //If it won't fit in a string, clip it to the max size that does + if (nSize > SAL_MAX_INT32) + nSize = SAL_MAX_INT32; + + return static_cast< sal_Int32 >( nSize ); +} + +bool PropItem::Read( OUString& rString, sal_uInt32 nStringType, bool bAlign ) +{ + sal_uInt32 nType, nItemPos; + bool bRetValue = false; + + nItemPos = Tell(); + + if ( nStringType == VT_EMPTY ) + { + nType = VT_NULL; // Initialize in case stream fails. + ReadUInt32( nType ); + } + else + nType = nStringType & VT_TYPEMASK; + + sal_uInt32 nItemSize(0); // Initialize in case stream fails. + ReadUInt32(nItemSize); + + switch( nType ) + { + case VT_LPSTR : + { + if (nItemSize) + { + auto nMaxSizePossible = remainingSize(); + if (nItemSize > nMaxSizePossible) + { + SAL_WARN("sd.filter", "String of Len " << nItemSize << " claimed, only " << nMaxSizePossible << " possible"); + nItemSize = nMaxSizePossible; + } + } + + if (nItemSize) + { + try + { + std::unique_ptr pString( new char[ nItemSize ] ); + if ( mnTextEnc == RTL_TEXTENCODING_UCS2 ) + { + nItemSize >>= 1; + if ( nItemSize > 1 ) + { + sal_Unicode* pWString = reinterpret_cast(pString.get()); + for (sal_uInt32 i = 0; i < nItemSize; ++i) + ReadUtf16( pWString[ i ] ); + rString = OUString(pWString, lcl_getMaxSafeStrLen(nItemSize)); + } + else + rString.clear(); + bRetValue = true; + } + else + { + SvMemoryStream::ReadBytes(pString.get(), nItemSize); + if ( pString[ nItemSize - 1 ] == 0 ) + { + if ( nItemSize > 1 ) + rString = OUString(pString.get(), rtl_str_getLength(pString.get()), mnTextEnc); + else + rString.clear(); + bRetValue = true; + } + } + } + catch( const std::bad_alloc& ) + { + OSL_FAIL( "sd PropItem::Read bad alloc" ); + } + } + if ( bAlign ) + SeekRel( ( 4 - ( nItemSize & 3 ) ) & 3 ); // dword align + } + break; + + case VT_LPWSTR : + { + if (nItemSize) + { + auto nMaxSizePossible = remainingSize() / sizeof(sal_Unicode); + if (nItemSize > nMaxSizePossible) + { + SAL_WARN("sd.filter", "String of Len " << nItemSize << " claimed, only " << nMaxSizePossible << " possible"); + nItemSize = nMaxSizePossible; + } + } + + if (nItemSize) + { + try + { + std::unique_ptr pString( new sal_Unicode[ nItemSize ] ); + for (sal_uInt32 i = 0; i < nItemSize; ++i) + ReadUtf16( pString[ i ] ); + if ( pString[ nItemSize - 1 ] == 0 ) + { + if ( static_cast(nItemSize) > 1 ) + rString = OUString(pString.get(), lcl_getMaxSafeStrLen(nItemSize)); + else + rString.clear(); + bRetValue = true; + } + } + catch( const std::bad_alloc& ) + { + OSL_FAIL( "sd PropItem::Read bad alloc" ); + } + } + if ( bAlign && ( nItemSize & 1 ) ) + SeekRel( 2 ); // dword align + } + break; + } + if ( !bRetValue ) + Seek( nItemPos ); + return bRetValue; +} + +PropItem& PropItem::operator=( PropItem& rPropItem ) +{ + if ( this != &rPropItem ) + { + Seek( STREAM_SEEK_TO_BEGIN ); + delete[] static_cast(SwitchBuffer()); + + mnTextEnc = rPropItem.mnTextEnc; + SvMemoryStream::WriteBytes(rPropItem.GetData(), rPropItem.TellEnd()); + } + return *this; +} + +Section::Section( const Section& rSection ) + : mnTextEnc(rSection.mnTextEnc) +{ + for ( int i = 0; i < 16; i++ ) + aFMTID[ i ] = rSection.aFMTID[ i ]; + for(const std::unique_ptr& rEntry : rSection.maEntries) + maEntries.push_back(std::make_unique(*rEntry)); +} + +Section::Section( const sal_uInt8* pFMTID ) : mnTextEnc(RTL_TEXTENCODING_MS_1252) +{ + for ( int i = 0; i < 16; i++ ) + aFMTID[ i ] = pFMTID[ i ]; +} + +bool Section::GetProperty( sal_uInt32 nId, PropItem& rPropItem ) +{ + if ( nId ) + { + auto iter = std::find_if(maEntries.begin(), maEntries.end(), + [nId](const std::unique_ptr& rxEntry) { return rxEntry->mnId == nId; }); + + if (iter != maEntries.end()) + { + rPropItem.Clear(); + rPropItem.SetTextEncoding( mnTextEnc ); + rPropItem.WriteBytes( (*iter)->mpBuf.get(), (*iter)->mnSize ); + rPropItem.Seek( STREAM_SEEK_TO_BEGIN ); + return true; + } + } + return false; +} + +void Section::AddProperty( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize ) +{ + // just a simple id check + + if ( !nId ) + return; + if ( nId == 0xffffffff ) + nId = 0; + + // do not allow same PropId's, sort + auto iter = std::find_if(maEntries.begin(), maEntries.end(), + [nId](const std::unique_ptr& rxEntry) { return rxEntry->mnId >= nId; }); + if (iter != maEntries.end()) + { + if ( (*iter)->mnId == nId ) + (*iter).reset(new PropEntry( nId, pBuf, nBufSize )); + else + maEntries.insert( iter, std::make_unique( nId, pBuf, nBufSize )); + } + else + { + maEntries.push_back( std::make_unique( nId, pBuf, nBufSize ) ); + } +} + +void Section::GetDictionary(PropDictionary& rDict) +{ + auto iter = std::find_if(maEntries.begin(), maEntries.end(), + [](const std::unique_ptr& rxEntry) { return rxEntry->mnId == 0; }); + + if (iter == maEntries.end()) + return; + + SvMemoryStream aStream( (*iter)->mpBuf.get(), (*iter)->mnSize, StreamMode::READ ); + aStream.Seek( STREAM_SEEK_TO_BEGIN ); + sal_uInt32 nDictCount(0); + aStream.ReadUInt32( nDictCount ); + for (sal_uInt32 i = 0; i < nDictCount; ++i) + { + sal_uInt32 nId(0), nSize(0); + aStream.ReadUInt32(nId).ReadUInt32(nSize); + if (!aStream.good() || nSize > aStream.remainingSize()) + break; + if (mnTextEnc == RTL_TEXTENCODING_UCS2) + nSize >>= 1; + if (!nSize) + continue; + OUString aString; + try + { + if ( mnTextEnc == RTL_TEXTENCODING_UCS2 ) + { + std::unique_ptr pWString( new sal_Unicode[nSize] ); + for (sal_uInt32 j = 0; j < nSize; ++j) + aStream.ReadUtf16(pWString[j]); + aString = OUString(pWString.get(), lcl_getMaxSafeStrLen(nSize)); + } + else + { + std::unique_ptr pString( new char[nSize] ); + aStream.ReadBytes(pString.get(), nSize); + aString = OUString(pString.get(), lcl_getMaxSafeStrLen(nSize), mnTextEnc); + } + } + catch( const std::bad_alloc& ) + { + OSL_FAIL( "sd Section::GetDictionary bad alloc" ); + } + if (aString.isEmpty()) + break; + rDict.insert( std::make_pair(aString,nId) ); + } +} + +void Section::Read( SotStorageStream *pStrm ) +{ + sal_uInt64 nSecOfs = pStrm->Tell(); + sal_uInt64 nStrmSize = pStrm->remainingSize(); + + mnTextEnc = RTL_TEXTENCODING_MS_1252; + sal_uInt32 nSecSize(0), nPropCount(0); + pStrm->ReadUInt32(nSecSize).ReadUInt32(nPropCount); + if (nSecSize > nStrmSize) + { + SAL_WARN("sd.filter", "Section Len " << nSecSize << " claimed, only " << nStrmSize << " possible"); + nSecSize = nStrmSize; + } + + while (nPropCount--) + { + sal_uInt32 nPropId(0), nPropOfs(0); + pStrm->ReadUInt32(nPropId).ReadUInt32(nPropOfs); + if (!pStrm->good()) + break; + auto nCurrent = pStrm->Tell(); + sal_uInt64 nOffset = nPropOfs + nSecOfs; + if (!checkSeek(*pStrm, nOffset)) + break; + if ( nPropId ) // do not read dictionary + { + sal_uInt32 nPropType(0), nVectorCount(0); + pStrm->ReadUInt32(nPropType); + + sal_uInt32 nPropSize = 4; + if ( nPropType & VT_VECTOR ) + { + pStrm->ReadUInt32( nVectorCount ); + nPropType &=~VT_VECTOR; + nPropSize += 4; + } + else + nVectorCount = 1; + + bool bVariant = ( nPropType == VT_VARIANT ); + + o3tl::sorted_vector aVisitedOffsets; + + for (sal_uInt32 i = 0; nPropSize && i < nVectorCount && pStrm->good(); ++i) + { + if ( bVariant ) + { + pStrm->ReadUInt32( nPropType ); + nPropSize += 4; + } + sal_uInt32 nTemp(0); + switch( nPropType ) + { + case VT_UI1 : + nPropSize++; + break; + + case VT_I2 : + case VT_UI2 : + case VT_BOOL : + nPropSize += 2; + break; + + case VT_I4 : + case VT_R4 : + case VT_UI4 : + case VT_ERROR : + nPropSize += 4; + break; + + case VT_I8 : + case VT_R8 : + case VT_CY : + case VT_UI8 : + case VT_DATE : + case VT_FILETIME : + nPropSize += 8; + break; + + case VT_BSTR : + pStrm->ReadUInt32( nTemp ); + nPropSize += ( nTemp + 4 ); + break; + + case VT_LPSTR : + pStrm->ReadUInt32( nTemp ); + nPropSize += ( nTemp + 4 ); + break; + + case VT_LPWSTR : + { + pStrm->ReadUInt32( nTemp ); + // looks like these are aligned to 4 bytes + sal_uInt64 nLength = nPropOfs + nSecOfs + nPropSize + ( nTemp << 1 ) + 4; + nPropSize += ( nTemp << 1 ) + 4 + (nLength % 4); + } + break; + + case VT_BLOB_OBJECT : + case VT_BLOB : + case VT_CF : + pStrm->ReadUInt32( nTemp ); + nPropSize += ( nTemp + 4 ); + break; + + case VT_CLSID : + case VT_STREAM : + case VT_STORAGE : + case VT_STREAMED_OBJECT : + case VT_STORED_OBJECT : + case VT_VARIANT : + case VT_VECTOR : + default : + nPropSize = 0; + } + if ( nPropSize ) + { + if ( ( nVectorCount - i ) > 1 ) + { + nOffset = nPropOfs + nSecOfs + nPropSize; + if (!checkSeek(*pStrm, nOffset)) + break; + // inserts returns false if an equivalent element already existed + if (!aVisitedOffsets.insert(nOffset).second) + { + SAL_WARN("sd.filter", "loop in Section::Read property list"); + break; + } + } + } + else + break; + } + if ( nPropSize ) + { + if ( nPropSize > nStrmSize ) + { + break; + } + pStrm->Seek( nPropOfs + nSecOfs ); + // make sure we don't overflow the section size + if( nPropSize > nSecSize - nSecOfs ) + nPropSize = nSecSize - nSecOfs; + std::unique_ptr pBuf( new sal_uInt8[ nPropSize ] ); + nPropSize = pStrm->ReadBytes(pBuf.get(), nPropSize); + AddProperty( nPropId, pBuf.get(), nPropSize ); + } + if ( nPropId == 1 ) + { + PropItem aPropItem; + if ( GetProperty( 1, aPropItem ) ) + { + aPropItem.ReadUInt32( nPropType ); + if ( nPropType == VT_I2 ) + { + sal_uInt16 nCodePage(0); + aPropItem.ReadUInt16(nCodePage); + + if ( nCodePage == 1200 ) + { + mnTextEnc = RTL_TEXTENCODING_UCS2; + } + else + { + mnTextEnc = rtl_getTextEncodingFromWindowsCodePage( nCodePage ); + if ( mnTextEnc == RTL_TEXTENCODING_DONTKNOW ) + mnTextEnc = RTL_TEXTENCODING_MS_1252; + } + } + else + { + mnTextEnc = RTL_TEXTENCODING_MS_1252; + } + } + } + } + else + { + sal_uInt32 nDictCount(0); + pStrm->ReadUInt32(nDictCount); + auto nMaxRecordsPossible = pStrm->remainingSize() / (sizeof(sal_uInt32)*2); + if (nDictCount > nMaxRecordsPossible) + { + SAL_WARN("sd.filter", "Dictionary count of " << nDictCount << " claimed, only " << nMaxRecordsPossible << " possible"); + nDictCount = nMaxRecordsPossible; + } + for (sal_uInt32 i = 0; i < nDictCount; ++i) + { + sal_uInt32 nSize(0); + pStrm->ReadUInt32( nSize ).ReadUInt32( nSize ); + if (!pStrm->good()) + break; + sal_uInt64 nPos = pStrm->Tell() + nSize; + if (!checkSeek(*pStrm, nPos)) + break; + } + sal_uInt64 nSize = pStrm->Tell(); + pStrm->Seek( nPropOfs + nSecOfs ); + nSize -= pStrm->Tell(); + if ( nSize > nStrmSize ) + { + break; + } + std::unique_ptr pBuf( new sal_uInt8[ nSize ] ); + nSize = pStrm->ReadBytes(pBuf.get(), nSize); + AddProperty( 0xffffffff, pBuf.get(), nSize ); + } + pStrm->Seek(nCurrent); + } + pStrm->Seek(nSecOfs + nSecSize); +} + +Section& Section::operator=( const Section& rSection ) +{ + if ( this != &rSection ) + { + memcpy( static_cast(aFMTID), static_cast(rSection.aFMTID), 16 ); + + for(const std::unique_ptr& rEntry : rSection.maEntries) + maEntries.push_back(std::make_unique(*rEntry)); + } + return *this; +} + +PropRead::PropRead( SotStorage& rStorage, const OUString& rName ) : + mbStatus ( false ), + mnByteOrder ( 0xfffe ) +{ + if ( rStorage.IsStream( rName ) ) + { + mpSvStream = rStorage.OpenSotStream( rName, StreamMode::STD_READ ); + if ( mpSvStream.is() ) + { + mpSvStream->SetEndian( SvStreamEndian::LITTLE ); + memset( mApplicationCLSID, 0, 16 ); + mbStatus = true; + } + } +} + +const Section* PropRead::GetSection( const sal_uInt8* pFMTID ) +{ + auto it = std::find_if(maSections.begin(), maSections.end(), + [&pFMTID](const std::unique_ptr
& rxSection) { return memcmp( rxSection->GetFMTID(), pFMTID, 16 ) == 0; }); + if (it != maSections.end()) + return it->get(); + return nullptr; +} + +void PropRead::Read() +{ + maSections.clear(); + + if ( !mbStatus ) + return; + + sal_uInt16 mnVersionLo; + sal_uInt16 mnVersionHi; + sal_uInt16 mnFormat; + mpSvStream->ReadUInt16( mnByteOrder ).ReadUInt16( mnFormat ).ReadUInt16( mnVersionLo ).ReadUInt16( mnVersionHi ); + if ( mnByteOrder != 0xfffe ) + return; + + std::vector aSectCLSID(16); + mpSvStream->ReadBytes(mApplicationCLSID, 16); + sal_uInt32 nSections(0); + mpSvStream->ReadUInt32(nSections); + if ( nSections > 2 ) // sj: PowerPoint documents are containing max 2 sections + { + mbStatus = false; + } + else + for ( sal_uInt32 i = 0; i < nSections; i++ ) + { + mpSvStream->ReadBytes(aSectCLSID.data(), aSectCLSID.size()); + sal_uInt32 nSectionOfs(0); + mpSvStream->ReadUInt32( nSectionOfs ); + sal_uInt64 nCurrent = mpSvStream->Tell(); + if (checkSeek(*mpSvStream, nSectionOfs)) + { + Section aSection(aSectCLSID.data()); + aSection.Read(mpSvStream.get()); + maSections.push_back(std::make_unique
(aSection)); + } + mpSvStream->Seek( nCurrent ); + } +} + +PropRead& PropRead::operator=( const PropRead& rPropRead ) +{ + if ( this != &rPropRead ) + { + mbStatus = rPropRead.mbStatus; + mpSvStream = rPropRead.mpSvStream; + + mnByteOrder = rPropRead.mnByteOrder; + memcpy( mApplicationCLSID, rPropRead.mApplicationCLSID, 16 ); + + for(const std::unique_ptr
& rSection : rPropRead.maSections) + maSections.push_back(std::make_unique
(*rSection)); + } + return *this; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/ppt/propread.hxx b/sd/source/filter/ppt/propread.hxx new file mode 100644 index 0000000000..d5521a6020 --- /dev/null +++ b/sd/source/filter/ppt/propread.hxx @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +// SummaryInformation +#define PID_TITLE 0x02 +#define PID_SUBJECT 0x03 +#define PID_AUTHOR 0x04 +#define PID_KEYWORDS 0x05 +#define PID_COMMENTS 0x06 +#define PID_TEMPLATE 0x07 +#define PID_LASTAUTHOR 0x08 +#define PID_REVNUMBER 0x09 +#define PID_CREATE_DTM 0x0c + +// DocumentSummaryInformation +#define PID_SLIDECOUNT 0x07 +#define PID_HEADINGPAIR 0x0c +#define PID_DOCPARTS 0x0d + +#define VT_EMPTY 0 +#define VT_NULL 1 +#define VT_I2 2 +#define VT_I4 3 +#define VT_R4 4 +#define VT_R8 5 +#define VT_CY 6 +#define VT_DATE 7 +#define VT_BSTR 8 +#define VT_ERROR 10 +#define VT_BOOL 11 +#define VT_VARIANT 12 +#define VT_DECIMAL 14 +#define VT_I1 16 +#define VT_UI1 17 +#define VT_UI2 18 +#define VT_UI4 19 +#define VT_I8 20 +#define VT_UI8 21 +#define VT_INT 22 +#define VT_UINT 23 +#define VT_LPSTR 30 +#define VT_LPWSTR 31 +#define VT_FILETIME 64 +#define VT_BLOB 65 +#define VT_STREAM 66 +#define VT_STORAGE 67 +#define VT_STREAMED_OBJECT 68 +#define VT_STORED_OBJECT 69 +#define VT_BLOB_OBJECT 70 +#define VT_CF 71 +#define VT_CLSID 72 +#define VT_VECTOR 0x1000 +#define VT_ARRAY 0x2000 +#define VT_BYREF 0x4000 +#define VT_TYPEMASK 0xFFF + +typedef std::map PropDictionary; + +struct PropEntry +{ + sal_uInt32 mnId; + sal_uInt32 mnSize; + std::unique_ptr mpBuf; + + PropEntry( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize ); + PropEntry( const PropEntry& rProp ); + + PropEntry& operator=(const PropEntry& rPropEntry); +}; + +class PropItem : public SvMemoryStream +{ + sal_uInt16 mnTextEnc; + +public: + PropItem() + : mnTextEnc(RTL_TEXTENCODING_DONTKNOW) + { + } + void Clear(); + + void SetTextEncoding( sal_uInt16 nTextEnc ){ mnTextEnc = nTextEnc; }; + bool Read( OUString& rString, sal_uInt32 nType = VT_EMPTY, bool bDwordAlign = true ); + PropItem& operator=( PropItem& rPropItem ); +}; + +class Section final +{ + sal_uInt16 mnTextEnc; + std::vector > maEntries; + + sal_uInt8 aFMTID[ 16 ]; + + void AddProperty( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize ); + + public: + explicit Section( const sal_uInt8* pFMTID ); + Section( const Section& rSection ); + + Section& operator=( const Section& rSection ); + bool GetProperty( sal_uInt32 nId, PropItem& rPropItem ); + void GetDictionary( PropDictionary& rDict ); + const sal_uInt8* GetFMTID() const { return aFMTID; }; + void Read( SotStorageStream* pStrm ); +}; + +class PropRead +{ + bool mbStatus; + tools::SvRef mpSvStream; + + sal_uInt16 mnByteOrder; + sal_uInt8 mApplicationCLSID[ 16 ]; + std::vector > maSections; + + public: + PropRead( SotStorage& rSvStorage, const OUString& rName ); + + PropRead& operator=( const PropRead& rPropRead ); + const Section* GetSection( const sal_uInt8* pFMTID ); + bool IsValid() const { return mbStatus; }; + void Read(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/sdfilter.cxx b/sd/source/filter/sdfilter.cxx new file mode 100644 index 0000000000..ec95da771c --- /dev/null +++ b/sd/source/filter/sdfilter.cxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::task; + + +SdFilter::SdFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) +: mxModel( rDocShell.GetModel() ) +, mrMedium( rMedium ) +, mrDocShell( rDocShell ) +, mrDocument( *rDocShell.GetDoc() ) +, mbIsDraw( rDocShell.GetDocumentType() == DocumentType::Draw ) +{ +} + +SdFilter::~SdFilter() +{ +} + +void SdFilter::CreateStatusIndicator() +{ + // The status indicator must be retrieved from the provided medium arguments + const SfxUnoAnyItem* pStatusBarItem = + mrMedium.GetItemSet().GetItem(SID_PROGRESS_STATUSBAR_CONTROL); + + if ( pStatusBarItem ) + pStatusBarItem->GetValue() >>= mxStatusIndicator; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/sdpptwrp.cxx b/sd/source/filter/sdpptwrp.cxx new file mode 100644 index 0000000000..64a1fa1f19 --- /dev/null +++ b/sd/source/filter/sdpptwrp.cxx @@ -0,0 +1,329 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::frame; + +SdPPTFilter::SdPPTFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) : + SdFilter( rMedium, rDocShell ), + pBas ( nullptr ) +{ +} + +SdPPTFilter::~SdPPTFilter() +{ + delete pBas; // deleting the compressed basic storage +} + +static void lcl_getListOfStreams(SotStorage * pStorage, comphelper::SequenceAsHashMap& aStreamsData, std::u16string_view sPrefix) +{ + SvStorageInfoList aElements; + pStorage->FillInfoList(&aElements); + for (const auto & aElement : aElements) + { + OUString sStreamFullName = sPrefix.size() ? OUString::Concat(sPrefix) + "/" + aElement.GetName() : aElement.GetName(); + if (aElement.IsStorage()) + { + tools::SvRef xSubStorage = pStorage->OpenSotStorage(aElement.GetName(), StreamMode::STD_READ | StreamMode::SHARE_DENYALL); + lcl_getListOfStreams(xSubStorage.get(), aStreamsData, sStreamFullName); + } + else + { + // Read stream + tools::SvRef rStream = pStorage->OpenSotStream(aElement.GetName(), StreamMode::READ | StreamMode::SHARE_DENYALL); + if (rStream.is()) + { + sal_Int32 nStreamSize = rStream->GetSize(); + Sequence< sal_Int8 > oData; + oData.realloc(nStreamSize); + sal_Int32 nReadBytes = rStream->ReadBytes(oData.getArray(), nStreamSize); + if (nStreamSize == nReadBytes) + aStreamsData[sStreamFullName] <<= oData; + } + } + } +} + +static tools::SvRef lcl_DRMDecrypt(const SfxMedium& rMedium, const tools::SvRef& rStorage, std::shared_ptr& rNewStorageStrm) +{ + tools::SvRef aNewStorage; + + // We have DRM encrypted storage. We should try to decrypt it first, if we can + Sequence< Any > aArguments; + Reference xComponentContext(comphelper::getProcessComponentContext()); + Reference< css::packages::XPackageEncryption > xPackageEncryption( + xComponentContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.oox.crypto.DRMDataSpace", aArguments, xComponentContext), UNO_QUERY); + + if (!xPackageEncryption.is()) + { + // We do not know how to decrypt this + return aNewStorage; + } + + comphelper::SequenceAsHashMap aStreamsData; + lcl_getListOfStreams(rStorage.get(), aStreamsData, u""); + + try { + Sequence aStreams = aStreamsData.getAsConstNamedValueList(); + if (!xPackageEncryption->readEncryptionInfo(aStreams)) + { + // We failed with decryption + return aNewStorage; + } + + tools::SvRef rContentStream = rStorage->OpenSotStream("\011DRMContent", StreamMode::READ | StreamMode::SHARE_DENYALL); + if (!rContentStream.is()) + { + return aNewStorage; + } + + rNewStorageStrm = std::make_shared(); + + Reference xInputStream(new utl::OSeekableInputStreamWrapper(rContentStream.get(), false)); + Reference xDecryptedStream(new utl::OSeekableOutputStreamWrapper(*rNewStorageStrm)); + + if (!xPackageEncryption->decrypt(xInputStream, xDecryptedStream)) + { + // We failed with decryption + return aNewStorage; + } + + rNewStorageStrm->Seek(0); + + // Further reading is done from new document + aNewStorage = new SotStorage(*rNewStorageStrm); + + // Set the media descriptor data + Sequence aEncryptionData = xPackageEncryption->createEncryptionData(""); + rMedium.GetItemSet().Put(SfxUnoAnyItem(SID_ENCRYPTIONDATA, Any(aEncryptionData))); + } + catch (const std::exception&) + { + return aNewStorage; + } + + return aNewStorage; +} + +bool SdPPTFilter::Import() +{ + bool bRet = false; + std::shared_ptr aDecryptedStorageStrm; + tools::SvRef pStorage = new SotStorage( mrMedium.GetInStream(), false ); + if( !pStorage->GetError() ) + { + /* check if there is a dualstorage, then the + document is probably a PPT95 containing PPT97 */ + tools::SvRef xDualStorage; + OUString sDualStorage( "PP97_DUALSTORAGE" ); + if ( pStorage->IsContained( sDualStorage ) ) + { + xDualStorage = pStorage->OpenSotStorage( sDualStorage, StreamMode::STD_READ ); + pStorage = xDualStorage; + } + if (pStorage->IsContained("\011DRMContent")) + { + // Document is DRM encrypted + pStorage = lcl_DRMDecrypt(mrMedium, pStorage, aDecryptedStorageStrm); + } + tools::SvRef pDocStream(pStorage->OpenSotStream( "PowerPoint Document" , StreamMode::STD_READ )); + if( pDocStream ) + { + pDocStream->SetVersion( pStorage->GetVersion() ); + pDocStream->SetCryptMaskKey(pStorage->GetKey()); + + if ( pStorage->IsStream( "EncryptedSummary" ) ) + mrMedium.SetError(ERRCODE_SVX_READ_FILTER_PPOINT); + else + { + bRet = ImportPPT( &mrDocument, *pDocStream, *pStorage, mrMedium ); + + if ( !bRet ) + mrMedium.SetError(SVSTREAM_WRONGVERSION); + } + } + } + + return bRet; +} + +bool SdPPTFilter::Export() +{ + bool bRet = false; + + if( mxModel.is() ) + { + sal_uInt32 nCnvrtFlags = 0; + const SvtFilterOptions& rFilterOptions = SvtFilterOptions::Get(); + if ( rFilterOptions.IsMath2MathType() ) + nCnvrtFlags |= OLE_STARMATH_2_MATHTYPE; + if ( rFilterOptions.IsWriter2WinWord() ) + nCnvrtFlags |= OLE_STARWRITER_2_WINWORD; + if ( rFilterOptions.IsCalc2Excel() ) + nCnvrtFlags |= OLE_STARCALC_2_EXCEL; + if ( rFilterOptions.IsImpress2PowerPoint() ) + nCnvrtFlags |= OLE_STARIMPRESS_2_POWERPOINT; + if ( rFilterOptions.IsEnablePPTPreview() ) + nCnvrtFlags |= 0x8000; + + CreateStatusIndicator(); + + //OUString sBaseURI( "BaseURI"); + std::vector< PropertyValue > aProperties; + PropertyValue aProperty; + aProperty.Name = "BaseURI"; + aProperty.Value <<= mrMedium.GetBaseURL( true ); + aProperties.push_back( aProperty ); + + SvStream * pOutputStrm = mrMedium.GetOutStream(); + + Sequence< NamedValue > aEncryptionData; + Reference< css::packages::XPackageEncryption > xPackageEncryption; + const SfxUnoAnyItem* pEncryptionDataItem = mrMedium.GetItemSet().GetItem(SID_ENCRYPTIONDATA, false); + std::shared_ptr pMediaStrm; + if (pEncryptionDataItem && (pEncryptionDataItem->GetValue() >>= aEncryptionData)) + { + ::comphelper::SequenceAsHashMap aHashData(aEncryptionData); + OUString sCryptoType = aHashData.getUnpackedValueOrDefault("CryptoType", OUString()); + + if (sCryptoType.getLength()) + { + Reference xComponentContext(comphelper::getProcessComponentContext()); + Sequence aArguments{ + Any(NamedValue("Binary", Any(true))) }; + xPackageEncryption.set( + xComponentContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.oox.crypto." + sCryptoType, aArguments, xComponentContext), UNO_QUERY); + + if (xPackageEncryption.is()) + { + // We have an encryptor. Export document into memory stream and encrypt it later + pMediaStrm = std::make_shared(); + pOutputStrm = pMediaStrm.get(); + + // Temp removal of EncryptionData to avoid password protection triggering + mrMedium.GetItemSet().ClearItem(SID_ENCRYPTIONDATA); + } + } + } + + tools::SvRef xStorRef = new SotStorage(pOutputStrm, false); + + if (xStorRef.is()) + { + bRet = ExportPPT(aProperties, xStorRef, mxModel, mxStatusIndicator, pBas, nCnvrtFlags); + xStorRef->Commit(); + + if (xPackageEncryption.is()) + { + // Perform DRM encryption + pOutputStrm->Seek(0); + + xPackageEncryption->setupEncryption(aEncryptionData); + + Reference xInputStream(new utl::OSeekableInputStreamWrapper(pOutputStrm, false)); + Sequence aStreams = xPackageEncryption->encrypt(xInputStream); + + tools::SvRef xEncryptedRootStrg = new SotStorage(mrMedium.GetOutStream(), false); + for (const NamedValue & aStreamData : std::as_const(aStreams)) + { + // To avoid long paths split and open substorages recursively + // Splitting paths manually, since comphelper::string::split is trimming special characters like \0x01, \0x09 + tools::SvRef pStorage = xEncryptedRootStrg.get(); + OUString sFileName; + sal_Int32 idx = 0; + do + { + OUString sPathElem = aStreamData.Name.getToken(0, L'/', idx); + if (!sPathElem.isEmpty()) + { + if (idx < 0) + { + sFileName = sPathElem; + } + else + { + pStorage = pStorage->OpenSotStorage(sPathElem); + } + } + } while (pStorage && idx >= 0); + + if (!pStorage) + { + bRet = false; + break; + } + + tools::SvRef pStream = pStorage->OpenSotStream(sFileName); + if (!pStream) + { + bRet = false; + break; + } + Sequence aStreamContent; + aStreamData.Value >>= aStreamContent; + size_t nBytesWritten = pStream->WriteBytes(aStreamContent.getConstArray(), aStreamContent.getLength()); + if (nBytesWritten != static_cast(aStreamContent.getLength())) + { + bRet = false; + break; + } + } + xEncryptedRootStrg->Commit(); + + // Restore encryption data + mrMedium.GetItemSet().Put(SfxUnoAnyItem(SID_ENCRYPTIONDATA, Any(aEncryptionData))); + } + } + } + + return bRet; +} + +void SdPPTFilter::PreSaveBasic() +{ + const SvtFilterOptions& rFilterOptions = SvtFilterOptions::Get(); + if( rFilterOptions.IsLoadPPointBasicStorage() ) + { + SaveVBA( static_cast(mrDocShell), pBas ); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/xml/sdtransform.cxx b/sd/source/filter/xml/sdtransform.cxx new file mode 100644 index 0000000000..b69b60a113 --- /dev/null +++ b/sd/source/filter/xml/sdtransform.cxx @@ -0,0 +1,363 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "sdtransform.hxx" + +using namespace ::com::sun::star::style; + +namespace { + +class SdTransformOOo2xDocument +{ +public: + explicit SdTransformOOo2xDocument( SdDrawDocument& rDocument ); + + void transform(); + + void transformMasterPages(); + void transformDrawPages(); + + void transformStyles(); + void transformStyles( SfxStyleFamily eFam ); + void transformStyle( SfxStyleSheetBase& rSheet ); + + void transformShapes( SdrObjList const & rShapes ); + void transformShape( SdrObject& rObj ); + + void transformTextShape( SdrTextObj& rTextShape ); + + bool getBulletState( const SfxItemSet& rSet, SfxStyleSheetBase* pSheet, bool& rState ); + static bool getBulletState( const SfxItemSet& rSet, sal_uInt16 nWhich, bool& rState ); + + static bool transformItemSet( SfxItemSet& rSet, bool bNumbering ); + + static bool removeAlienAttributes( SfxItemSet& rSet ); + static bool removeAlienAttributes( SfxItemSet& rSet, sal_uInt16 nWhich ); + + SdDrawDocument& mrDocument; + SdrOutliner& mrOutliner; +}; + +} + +/** transforms the given model from OOo 2.x to OOo 3.x. This maps + the deprecated EE_PARA_BULLETSTATE and clears the EE_PARA_LRSPACE + if used together with a EE_PARA_NUMBULLET */ +void TransformOOo2xDocument( SdDrawDocument* pDocument ) +{ + if( pDocument ) + { + SdTransformOOo2xDocument aTransformer( *pDocument ); + aTransformer.transform(); + } +} + +constexpr OUString gsEnableNumbering( u"enable-numbering"_ustr ); +constexpr OUString gsTextNamespace( u"urn:oasis:names:tc:opendocument:xmlns:text:1.0"_ustr ); +constexpr OUStringLiteral gsTrue( u"true" ); + +SdTransformOOo2xDocument::SdTransformOOo2xDocument( SdDrawDocument& rDocument ) +: mrDocument( rDocument ) +, mrOutliner( rDocument.GetDrawOutliner() ) +{ +} + +void SdTransformOOo2xDocument::transform() +{ + transformMasterPages(); + transformDrawPages(); + transformStyles(); +} + +void SdTransformOOo2xDocument::transformMasterPages() +{ + sal_uInt16 nMasterPageCount = mrDocument.GetMasterPageCount(); + for( sal_uInt16 nMasterPage = 0; nMasterPage < nMasterPageCount; nMasterPage++ ) + { + SdrObjList* pPage = mrDocument.GetMasterPage( nMasterPage ); + if( pPage ) + transformShapes( *pPage ); + } +} + +void SdTransformOOo2xDocument::transformDrawPages() +{ + sal_uInt16 nPageCount = mrDocument.GetPageCount(); + for( sal_uInt16 nPage = 0; nPage < nPageCount; nPage++ ) + { + SdrObjList* pPage = mrDocument.GetPage( nPage ); + if( pPage ) + transformShapes( *pPage ); + } +} + +void SdTransformOOo2xDocument::transformStyles() +{ + transformStyles( SfxStyleFamily::Para ); + transformStyles( SfxStyleFamily::Page ); +} + +void SdTransformOOo2xDocument::transformStyles( SfxStyleFamily eFam ) +{ + + rtl::Reference< SfxStyleSheetBasePool > xStyleSheetPool( mrDocument.GetStyleSheetPool() ); + + SfxStyleSheetIterator aIter( xStyleSheetPool.get(), eFam ); + + SfxStyleSheetBase* pSheet = aIter.First(); + while( pSheet ) + { + transformStyle( *pSheet ); + pSheet = aIter.Next(); + } +} + +void SdTransformOOo2xDocument::transformStyle( SfxStyleSheetBase& rSheet ) +{ + SfxItemSet& rSet = rSheet.GetItemSet(); + + bool bState = false; + getBulletState( rSheet.GetItemSet(), rSheet.GetPool()->Find( rSheet.GetParent(), rSheet.GetFamily() ), bState ); + + transformItemSet( rSet, bState ); + removeAlienAttributes( rSet ); +} + +void SdTransformOOo2xDocument::transformShapes( SdrObjList const & rShapes ) +{ + for (const rtl::Reference& pObj : rShapes) + transformShape( *pObj ); +} + +void SdTransformOOo2xDocument::transformShape( SdrObject& rObj ) +{ + SdrTextObj* pTextShape = DynCastSdrTextObj( &rObj ); + if( pTextShape ) + { + transformTextShape( *pTextShape ); + return; + } + + SdrObjGroup* pGroupShape = dynamic_cast< SdrObjGroup* >( &rObj ); + if( pGroupShape ) + { + SdrObjList* pObjList = pGroupShape->GetSubList(); + if( pObjList ) + transformShapes( *pObjList ); + return; + } +} + +void SdTransformOOo2xDocument::transformTextShape( SdrTextObj& rTextShape ) +{ + + if(rTextShape.IsEmptyPresObj()) + return; + + OutlinerParaObject* pOPO = rTextShape.GetOutlinerParaObject(); + if (!pOPO) + return; + + mrOutliner.SetText( *pOPO ); + + sal_Int32 nCount = mrOutliner.GetParagraphCount(); + + bool bChange = false; + + for(sal_Int32 nPara = 0; nPara < nCount; nPara++) + { + SfxItemSet aParaSet( mrOutliner.GetParaAttribs( nPara ) ); + + bool bItemChange = false; + + bool bState = false; + const sal_Int16 nDepth = mrOutliner.GetDepth( nPara ); + if( (nDepth != -1) && (!getBulletState( aParaSet, mrOutliner.GetStyleSheet( nPara ), bState ) || !bState) ) + { + // disable bullet if text::enable-bullet="false" is found + if( (nDepth > 0 ) && (rTextShape.GetObjInventor() == SdrInventor::Default) && (rTextShape.GetObjIdentifier() == SdrObjKind::OutlineText) ) + { + // for outline object and level > 0 burn in the style sheet because it will be changed to "outline 1" + SfxStyleSheet* pStyleSheet = mrOutliner.GetStyleSheet( nPara ); + + if( pStyleSheet ) + { + // optimize me: only put items hard into paragraph that are not equal to "outline 1" style! + SfxItemSet& rStyleSet = pStyleSheet->GetItemSet(); + + SfxWhichIter aIter(aParaSet); + sal_uInt16 nWhich(aIter.FirstWhich()); + + // now set all none hard attributes from the style + while(nWhich) + { + if(SfxItemState::SET != aIter.GetItemState()) + { + aParaSet.Put(rStyleSet.Get(nWhich)); + bItemChange = true; + } + + nWhich = aIter.NextWhich(); + } + } + } + + mrOutliner.SetDepth( mrOutliner.GetParagraph( nPara ), -1 ); + + bChange = true; + } + + bItemChange |= transformItemSet( aParaSet, bState ); + + bItemChange |= removeAlienAttributes( aParaSet ); + + if( bItemChange ) + { + mrOutliner.SetParaAttribs( nPara, aParaSet ); + bChange = true; + } + } + + if( bChange ) + rTextShape.SetOutlinerParaObject(mrOutliner.CreateParaObject()); + + mrOutliner.Clear(); +} + +bool SdTransformOOo2xDocument::getBulletState( const SfxItemSet& rSet, SfxStyleSheetBase* pSheet, bool& rState ) +{ + if( getBulletState( rSet, EE_PARA_XMLATTRIBS, rState ) ) + return true; + + if( getBulletState( rSet, SDRATTR_XMLATTRIBUTES, rState ) ) + return true; + + if( pSheet && getBulletState( pSheet->GetItemSet(), pSheet->GetPool()->Find( pSheet->GetParent(), pSheet->GetFamily() ), rState ) ) + return true; + + return false; +} + +bool SdTransformOOo2xDocument::getBulletState( const SfxItemSet& rSet, sal_uInt16 nWhich, bool& rState ) +{ + if( rSet.GetItemState( nWhich ) == SfxItemState::SET ) + { + const SvXMLAttrContainerItem& rAttr = *rSet.GetItem( nWhich ); + + const sal_uInt16 nCount = rAttr.GetAttrCount(); + for( sal_uInt16 nItem = 0; nItem < nCount; nItem++ ) + { + if( ( rAttr.GetAttrLName( nItem ) == gsEnableNumbering ) && ( rAttr.GetAttrNamespace( nItem ) == gsTextNamespace ) ) + { + const OUString& sValue( rAttr.GetAttrValue( nItem ) ); + rState = sValue == gsTrue; + return true; + } + } + } + + return false; +} + +bool SdTransformOOo2xDocument::transformItemSet( SfxItemSet& rSet, bool bNumbering ) +{ + bool bRet = false; + const SvxLRSpaceItem* pItem = bNumbering ? rSet.GetItem(EE_PARA_LRSPACE) : nullptr; + if (pItem) + { + SvxLRSpaceItem aItem(*pItem); + if( (aItem.GetLeft() != 0) || (aItem.GetTextFirstLineOffset() != 0) ) + { + aItem.SetLeftValue( 0 ); + aItem.SetTextFirstLineOffset( 0 ); + rSet.Put( aItem ); + bRet = true; + } + } + + return bRet; +} + +bool SdTransformOOo2xDocument::removeAlienAttributes( SfxItemSet& rSet ) +{ + bool b = removeAlienAttributes( rSet, EE_PARA_XMLATTRIBS ); + b |= removeAlienAttributes( rSet, SDRATTR_XMLATTRIBUTES ); + return b; +} + +bool SdTransformOOo2xDocument::removeAlienAttributes( SfxItemSet& rSet, sal_uInt16 nWhich ) +{ + if( rSet.GetItemState( nWhich ) == SfxItemState::SET ) + { + const SvXMLAttrContainerItem& rAttr = *rSet.GetItem( nWhich ); + + const sal_uInt16 nCount = rAttr.GetAttrCount(); + for( sal_uInt16 nItem = 0; nItem < nCount; nItem++ ) + { + if( ( rAttr.GetAttrLName( nItem ) == gsEnableNumbering ) && ( rAttr.GetAttrNamespace( nItem ) == gsTextNamespace ) ) + { + if( nCount == 1 ) + { + rSet.ClearItem( nWhich ); + } + else + { + SvXMLAttrContainerItem aNewItem( nWhich ); + + const sal_uInt16 nFound = nItem; + for( nItem = 0; nItem < nCount; nItem++ ) + { + if( nItem != nFound ) + { + OUString const& rNamespace(rAttr.GetAttrNamespace(nItem)); + OUString const& rPrefix(rAttr.GetAttrPrefix(nItem)); + if (rPrefix.isEmpty()) + { + aNewItem.AddAttr(rAttr.GetAttrLName(nItem), rAttr.GetAttrValue(nItem)); + } + else + { + aNewItem.AddAttr(rPrefix, rNamespace, rAttr.GetAttrLName(nItem), rAttr.GetAttrValue(nItem)); + } + } + } + + rSet.Put( aNewItem ); + } + return true; + } + } + } + return false; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/xml/sdtransform.hxx b/sd/source/filter/xml/sdtransform.hxx new file mode 100644 index 0000000000..64bb1c0a1d --- /dev/null +++ b/sd/source/filter/xml/sdtransform.hxx @@ -0,0 +1,28 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +void TransformOOo2xDocument(SdDrawDocument* pDocument); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/xml/sdxmlwrp.cxx b/sd/source/filter/xml/sdxmlwrp.cxx new file mode 100644 index 0000000000..e102ce27e3 --- /dev/null +++ b/sd/source/filter/xml/sdxmlwrp.cxx @@ -0,0 +1,1046 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +// include necessary for XML progress bar at load time +#include +#include +#include + +#include +#include +#include +#include "sdtransform.hxx" +#include + +#include +#include +#include + +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::document; +using namespace comphelper; + +#define SD_XML_READERROR ErrCode(1234) + +char const sXML_export_impress_meta_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisMetaExporter"; +char const sXML_export_impress_styles_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisStylesExporter"; +char const sXML_export_impress_content_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisContentExporter"; +char const sXML_export_impress_settings_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisSettingsExporter"; + +char const sXML_export_draw_meta_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisMetaExporter"; +char const sXML_export_draw_styles_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisStylesExporter"; +char const sXML_export_draw_content_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisContentExporter"; +char const sXML_export_draw_settings_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisSettingsExporter"; + +char const sXML_import_impress_meta_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisMetaImporter"; +char const sXML_import_impress_styles_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisStylesImporter"; +char const sXML_import_impress_content_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisContentImporter"; +char const sXML_import_impress_settings_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisSettingsImporter"; + +char const sXML_import_draw_meta_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisMetaImporter"; +char const sXML_import_draw_styles_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisStylesImporter"; +char const sXML_import_draw_content_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisContentImporter"; +char const sXML_import_draw_settings_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisSettingsImporter"; + +// OOo +char const sXML_import_impress_meta_ooo_service[] = "com.sun.star.comp.Impress.XMLMetaImporter"; +char const sXML_import_impress_styles_ooo_service[] = "com.sun.star.comp.Impress.XMLStylesImporter"; +char const sXML_import_impress_content_ooo_service[] = "com.sun.star.comp.Impress.XMLContentImporter"; +char const sXML_import_impress_settings_ooo_service[] = "com.sun.star.comp.Impress.XMLSettingsImporter"; + +char const sXML_import_draw_meta_ooo_service[] = "com.sun.star.comp.Draw.XMLMetaImporter"; +char const sXML_import_draw_styles_ooo_service[] = "com.sun.star.comp.Draw.XMLStylesImporter"; +char const sXML_import_draw_content_ooo_service[] = "com.sun.star.comp.Draw.XMLContentImporter"; +char const sXML_import_draw_settings_ooo_service[] = "com.sun.star.comp.Draw.XMLSettingsImporter"; + +namespace { + +struct XML_SERVICEMAP +{ + const char* mpService; + const char* mpStream; +}; + +struct XML_SERVICES +{ + const char* mpMeta; + const char* mpStyles; + const char* mpContent; + const char* mpSettings; +}; + +} + +static XML_SERVICES const * getServices( bool bImport, bool bDraw, sal_uLong nStoreVer ) +{ + // Expect that export always sets nStoreVer to SOFFICE_FILEFORMAT_8. + assert(bImport || nStoreVer != SOFFICE_FILEFORMAT_60); + + static XML_SERVICES const gServices[] = + { + { sXML_import_impress_meta_oasis_service, sXML_import_impress_styles_oasis_service, sXML_import_impress_content_oasis_service, sXML_import_impress_settings_oasis_service }, + { sXML_import_draw_meta_oasis_service, sXML_import_draw_styles_oasis_service, sXML_import_draw_content_oasis_service, sXML_import_draw_settings_oasis_service }, + { sXML_export_impress_meta_oasis_service, sXML_export_impress_styles_oasis_service, sXML_export_impress_content_oasis_service, sXML_export_impress_settings_oasis_service }, + { sXML_export_draw_meta_oasis_service, sXML_export_draw_styles_oasis_service, sXML_export_draw_content_oasis_service, sXML_export_draw_settings_oasis_service }, + + { sXML_import_impress_meta_ooo_service, sXML_import_impress_styles_ooo_service, sXML_import_impress_content_ooo_service, sXML_import_impress_settings_ooo_service }, + { sXML_import_draw_meta_ooo_service, sXML_import_draw_styles_ooo_service, sXML_import_draw_content_ooo_service, sXML_import_draw_settings_ooo_service }, + }; + + return &gServices[ (bImport ? 0 : 2) + ((nStoreVer == SOFFICE_FILEFORMAT_60) ? 4 : 0) + (bDraw ? 1 : 0 ) ]; +} + + +SdXMLFilter::SdXMLFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell, SdXMLFilterMode eFilterMode, sal_uLong nStoreVer ) : + SdFilter( rMedium, rDocShell ), meFilterMode( eFilterMode ), mnStoreVer( nStoreVer ) +{ +} + +SdXMLFilter::~SdXMLFilter() +{ +} + +namespace +{ + +ErrCodeMsg ReadThroughComponent( + const Reference& xInputStream, + const Reference& xModelComponent, + const OUString& rStreamName, + Reference const & rxContext, + const char* pFilterName, + const Sequence& rFilterArguments, + const OUString& rName, + bool bMustBeSuccessful, + bool bEncrypted ) +{ + DBG_ASSERT(xInputStream.is(), "input stream missing"); + DBG_ASSERT(xModelComponent.is(), "document missing"); + DBG_ASSERT(rxContext.is(), "factory missing"); + DBG_ASSERT(nullptr != pFilterName,"I need a service name for the component!"); + + SAL_INFO( "sd.filter", "ReadThroughComponent" ); + + // prepare ParserInputSource + xml::sax::InputSource aParserInput; + aParserInput.sSystemId = rName; + aParserInput.aInputStream = xInputStream; + + // get filter + OUString aFilterName(OUString::createFromAscii(pFilterName)); + // the underlying SvXMLImport implements XFastParser, XImporter, XFastDocumentHandler + Reference< XInterface > xFilter( + rxContext->getServiceManager()->createInstanceWithArgumentsAndContext(aFilterName, rFilterArguments, rxContext), + UNO_QUERY ); + SAL_WARN_IF(!xFilter.is(), "sd.filter", "Can't instantiate filter component: " << aFilterName); + if( !xFilter.is() ) + return SD_XML_READERROR; + Reference< xml::sax::XFastParser > xFastParser(xFilter, UNO_QUERY); + Reference< xml::sax::XDocumentHandler > xDocumentHandler; + if (!xFastParser) + xDocumentHandler.set(xFilter, UNO_QUERY); + if (!xFastParser && !xDocumentHandler) + { + SAL_WARN("sd", "service does not implement XFastParser or XDocumentHandler"); + assert(false); + return SD_XML_READERROR; + } + SAL_INFO( "sd.filter", "" << pFilterName << " created" ); + + // connect model and filter + Reference < XImporter > xImporter( xFilter, UNO_QUERY ); + xImporter->setTargetDocument( xModelComponent ); + + // finally, parser the stream + SAL_INFO( "sd.filter", "parsing stream" ); + try + { + if (xFastParser) + xFastParser->parseStream( aParserInput ); + else + { + Reference< xml::sax::XParser > xParser = xml::sax::Parser::create(rxContext); + // connect parser and filter + xParser->setDocumentHandler( xDocumentHandler ); + xParser->parseStream( aParserInput ); + } + } + catch (const xml::sax::SAXParseException& r) + { + css::uno::Any ex( cppu::getCaughtException() ); + // sax parser sends wrapped exceptions, + // try to find the original one + xml::sax::SAXException aSaxEx = *static_cast(&r); + bool bTryChild = true; + + while( bTryChild ) + { + xml::sax::SAXException aTmp; + if ( aSaxEx.WrappedException >>= aTmp ) + aSaxEx = aTmp; + else + bTryChild = false; + } + + packages::zip::ZipIOException aBrokenPackage; + if ( aSaxEx.WrappedException >>= aBrokenPackage ) + return ERRCODE_IO_BROKENPACKAGE; + + if( bEncrypted ) + return ERRCODE_SFX_WRONGPASSWORD; + + SAL_WARN( "sd.filter", "SAX parse exception caught while importing: " << exceptionToString(ex)); + + OUString sErr = OUString::number( r.LineNumber ) + + "," + OUString::number( r.ColumnNumber ); + + if (!rStreamName.isEmpty()) + { + return ErrCodeMsg( + (bMustBeSuccessful ? ERR_FORMAT_FILE_ROWCOL + : WARN_FORMAT_FILE_ROWCOL), + rStreamName, sErr, + DialogMask::ButtonsOk | DialogMask::MessageError ); + } + else + { + DBG_ASSERT( bMustBeSuccessful, "Warnings are not supported" ); + return ErrCodeMsg( ERR_FORMAT_ROWCOL, sErr, + DialogMask::ButtonsOk | DialogMask::MessageError ); + } + } + catch (const xml::sax::SAXException& r) + { + css::uno::Any ex( cppu::getCaughtException() ); + packages::zip::ZipIOException aBrokenPackage; + if ( r.WrappedException >>= aBrokenPackage ) + return ERRCODE_IO_BROKENPACKAGE; + + if( bEncrypted ) + return ERRCODE_SFX_WRONGPASSWORD; + + SAL_WARN( "sd.filter", "SAX exception caught while importing: " << exceptionToString(ex)); + return SD_XML_READERROR; + } + catch (const packages::zip::ZipIOException&) + { + TOOLS_WARN_EXCEPTION( "sd.filter", "Zip exception caught while importing"); + return ERRCODE_IO_BROKENPACKAGE; + } + catch (const io::IOException&) + { + TOOLS_WARN_EXCEPTION( "sd.filter", "IO exception caught while importing"); + return SD_XML_READERROR; + } + catch (const uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd.filter", "uno exception caught while importing"); + return SD_XML_READERROR; + } + + // success! + return ERRCODE_NONE; +} + +ErrCodeMsg ReadThroughComponent( + const uno::Reference < embed::XStorage >& xStorage, + const Reference& xModelComponent, + const char* pStreamName, + Reference const & rxContext, + const char* pFilterName, + const Sequence& rFilterArguments, + const OUString& rName, + bool bMustBeSuccessful ) +{ + DBG_ASSERT(xStorage.is(), "Need storage!"); + DBG_ASSERT(nullptr != pStreamName, "Please, please, give me a name!"); + + // open stream (and set parser input) + OUString sStreamName = OUString::createFromAscii(pStreamName); + bool bContainsStream = false; + try + { + bContainsStream = xStorage->isStreamElement(sStreamName); + } + catch (const container::NoSuchElementException&) + { + } + + if (!bContainsStream ) + { + // stream name not found! return immediately with OK signal + return ERRCODE_NONE; + } + + // set Base URL + uno::Reference< beans::XPropertySet > xInfoSet; + if( rFilterArguments.hasElements() ) + rFilterArguments.getConstArray()[0] >>= xInfoSet; + DBG_ASSERT( xInfoSet.is(), "missing property set" ); + if( xInfoSet.is() ) + { + xInfoSet->setPropertyValue( "StreamName", Any( sStreamName ) ); + } + + try + { + // get input stream + Reference xStream = + xStorage->openStreamElement( sStreamName, embed::ElementModes::READ ); + Reference xProps( xStream, uno::UNO_QUERY ); + if ( !xStream.is() || ! xProps.is() ) + return SD_XML_READERROR; + + Any aAny = xProps->getPropertyValue( "Encrypted" ); + + bool bEncrypted = false; + aAny >>= bEncrypted; + + Reference xInputStream = xStream->getInputStream(); + + // read from the stream + return ReadThroughComponent( + xInputStream, xModelComponent, sStreamName, rxContext, + pFilterName, rFilterArguments, + rName, bMustBeSuccessful, bEncrypted ); + } + catch (const packages::WrongPasswordException&) + { + return ERRCODE_SFX_WRONGPASSWORD; + } + catch (const packages::zip::ZipIOException&) + { + return ERRCODE_IO_BROKENPACKAGE; + } + catch (const uno::Exception&) + {} + + return SD_XML_READERROR; +} + +} + +//PresObjKind::Outlines in master pages are the preview of the outline styles +//numbering format. Since fdo#78151 toggling bullets on and off changes +//the style they are a preview of, previously toggling bullets on and off +//would only affect the preview paragraph itself without an effect on the +//style. i.e. previews of numbering which don't match the real numbering +//they are supposed to be a preview of. +// +//But there exist documents which were saved previous to that modification +//so here we detect such cases and fix them up to ensure the previews +//numbering level matches that of the outline level it previews +static void fixupOutlinePlaceholderNumberingDepths(SdDrawDocument* pDoc) +{ + for (sal_uInt16 i = 0; i < pDoc->GetMasterSdPageCount(PageKind::Standard); ++i) + { + SdPage *pMasterPage = pDoc->GetMasterSdPage(i, PageKind::Standard); + SdrObject* pMasterOutline = pMasterPage->GetPresObj(PresObjKind::Outline); + if (!pMasterOutline) + continue; + OutlinerParaObject* pOutlParaObj = pMasterOutline->GetOutlinerParaObject(); + if (!pOutlParaObj) + continue; + SdOutliner* pOutliner = pDoc->GetInternalOutliner(); + pOutliner->Clear(); + pOutliner->SetText(*pOutlParaObj); + bool bInconsistent = false; + const sal_Int32 nParaCount = pOutliner->GetParagraphCount(); + for (sal_Int32 j = 0; j < nParaCount; ++j) + { + //Make sure the depth of the paragraph matches that of the outline style it previews + const sal_Int16 nExpectedDepth = j; + if (nExpectedDepth != pOutliner->GetDepth(j)) + { + Paragraph* p = pOutliner->GetParagraph(j); + pOutliner->SetDepth(p, nExpectedDepth); + bInconsistent = true; + } + + //If the preview has hard-coded bullets/numbering then they must + //be stripped to reveal the true underlying styles attributes + SfxItemSet aAttrs(pOutliner->GetParaAttribs(j)); + if (aAttrs.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET) + { + aAttrs.ClearItem(EE_PARA_NUMBULLET); + pOutliner->SetParaAttribs(j, aAttrs); + bInconsistent = true; + } + + } + if (bInconsistent) + { + SAL_WARN("sd.filter", "Fixing inconsistent outline numbering placeholder preview"); + pMasterOutline->SetOutlinerParaObject(pOutliner->CreateParaObject(0, nParaCount)); + } + pOutliner->Clear(); + } +} + +bool SdXMLFilter::Import( ErrCode& nError ) +{ + ErrCodeMsg nRet = ERRCODE_NONE; + + // Get service factory + Reference< uno::XComponentContext > rxContext = + comphelper::getProcessComponentContext(); + + SdDrawDocument* pDoc = mrDocShell.GetDoc(); + bool const bWasUndo(pDoc->IsUndoEnabled()); + pDoc->EnableUndo(false); + pDoc->NewOrLoadCompleted( DocCreationMode::New ); + pDoc->CreateFirstPages(); + pDoc->StopWorkStartupDelay(); + + mxModel->lockControllers(); + + /** property map for import info set */ + static PropertyMapEntry const aImportInfoMap[] = + { + // necessary properties for XML progress bar at load time + { OUString("ProgressRange"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("ProgressMax"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("ProgressCurrent"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("Preview"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("PageLayouts"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("PrivateData"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("BaseURI"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("StreamRelPath"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("StreamName"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("BuildId"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("OrganizerMode"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("SourceStorage"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + }; + + uno::Reference< beans::XPropertySet > xInfoSet( GenericPropertySet_CreateInstance( new PropertySetInfo( aImportInfoMap ) ) ); + xInfoSet->setPropertyValue( "Preview" , uno::Any( mrDocShell.GetDoc()->IsStarDrawPreviewMode() ) ); + + // ---- get BuildId from parent container if available + + uno::Reference< container::XChild > xChild( mxModel, uno::UNO_QUERY ); + if( xChild.is() ) + { + uno::Reference< beans::XPropertySet > xParentSet( xChild->getParent(), uno::UNO_QUERY ); + if( xParentSet.is() ) + { + uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xParentSet->getPropertySetInfo() ); + OUString sPropName( "BuildId" ); + if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(sPropName) ) + { + xInfoSet->setPropertyValue( sPropName, xParentSet->getPropertyValue(sPropName) ); + } + } + } + + uno::Reference xGraphicStorageHandler; + rtl::Reference xGraphicHelper; + Reference< document::XEmbeddedObjectResolver > xObjectResolver; + rtl::Reference xObjectHelper; + + Reference< lang::XComponent > xModelComp = mxModel; + + // try to get an XStatusIndicator from the Medium + { + const SfxUnoAnyItem* pItem = mrMedium.GetItemSet().GetItem(SID_PROGRESS_STATUSBAR_CONTROL); + if (pItem) + { + pItem->GetValue() >>= mxStatusIndicator; + } + + if(mxStatusIndicator.is()) + { + sal_Int32 nProgressRange(1000000); + OUString aMsg(SvxResId(RID_SVXSTR_DOC_LOAD)); + mxStatusIndicator->start(aMsg, nProgressRange); + + // set ProgressRange + uno::Any aProgRange; + aProgRange <<= nProgressRange; + xInfoSet->setPropertyValue( "ProgressRange" , aProgRange); + + // set ProgressCurrent + uno::Any aProgCurrent; + aProgCurrent <<= sal_Int32(0); + xInfoSet->setPropertyValue( "ProgressCurrent" , aProgCurrent); + } + } + + // get the input stream (storage or stream) + + uno::Reference < embed::XStorage > xStorage = mrMedium.GetStorage(); + + xInfoSet->setPropertyValue( "SourceStorage", Any( xStorage ) ); + + if( !xStorage.is() ) + nRet = SD_XML_READERROR; + + if( ERRCODE_NONE == nRet ) + { + xGraphicHelper = SvXMLGraphicHelper::Create( xStorage, + SvXMLGraphicHelperMode::Read ); + xGraphicStorageHandler = xGraphicHelper.get(); + xObjectHelper = SvXMLEmbeddedObjectHelper::Create( + xStorage, *pDoc->GetPersist(), + SvXMLEmbeddedObjectHelperMode::Read ); + xObjectResolver = xObjectHelper.get(); + } + + // Set base URI + OUString const baseURI(mrMedium.GetBaseURL()); + // needed for relative URLs, but in clipboard copy/paste there may be none + SAL_INFO_IF(baseURI.isEmpty(), "sd.filter", "SdXMLFilter: no base URL"); + xInfoSet->setPropertyValue("BaseURI", Any(baseURI)); + + if( ERRCODE_NONE == nRet && SfxObjectCreateMode::EMBEDDED == mrDocShell.GetCreateMode() ) + { + OUString aName; + const SfxStringItem* pDocHierarchItem = + mrMedium.GetItemSet().GetItem(SID_DOC_HIERARCHICALNAME); + if ( pDocHierarchItem ) + aName = pDocHierarchItem->GetValue(); + else + aName = "dummyObjectName" ; + + if( !aName.isEmpty() ) + xInfoSet->setPropertyValue( "StreamRelPath", Any( aName ) ); + } + + if (SdXMLFilterMode::Organizer == meFilterMode) + xInfoSet->setPropertyValue("OrganizerMode", uno::Any(true)); + + if( ERRCODE_NONE == nRet ) + { + + // prepare filter arguments + Sequence aFilterArgs( 4 ); + Any *pArgs = aFilterArgs.getArray(); + *pArgs++ <<= xInfoSet; + *pArgs++ <<= xGraphicStorageHandler; + *pArgs++ <<= xObjectResolver; + *pArgs++ <<= mxStatusIndicator; + + Sequence aEmptyArgs( 2 ); + pArgs = aEmptyArgs.getArray(); + *pArgs++ <<= xInfoSet; + *pArgs++ <<= mxStatusIndicator; + + const OUString aName( mrMedium.GetName() ); + + XML_SERVICES const * pServices = getServices( true, IsDraw(), mnStoreVer ); + + ErrCodeMsg nWarn = ERRCODE_NONE; + ErrCodeMsg nWarn2 = ERRCODE_NONE; + // read storage streams + // #i103539#: always read meta.xml for generator + nWarn = ReadThroughComponent( + xStorage, xModelComp, "meta.xml", rxContext, + pServices->mpMeta, + aEmptyArgs, aName, false ); + + if( meFilterMode != SdXMLFilterMode::Organizer ) + { + nWarn2 = ReadThroughComponent( + xStorage, xModelComp, "settings.xml", rxContext, + pServices->mpSettings, + aFilterArgs, aName, false ); + } + + nRet = ReadThroughComponent( + xStorage, xModelComp, "styles.xml", rxContext, + pServices->mpStyles, + aFilterArgs, aName, true ); + + if( !nRet && (meFilterMode != SdXMLFilterMode::Organizer) ) + nRet = ReadThroughComponent( + xStorage, xModelComp, "content.xml", rxContext, + pServices->mpContent, + aFilterArgs, aName, true ); + + if( !nRet ) + { + if( nWarn ) + nRet = nWarn; + else if( nWarn2 ) + nRet = nWarn2; + } + } + + if( xGraphicHelper ) + xGraphicHelper->dispose(); + xGraphicHelper.clear(); + xGraphicStorageHandler = nullptr; + if( xObjectHelper.is() ) + xObjectHelper->dispose(); + xObjectHelper.clear(); + xObjectResolver = nullptr; + + if( mxStatusIndicator.is() ) + mxStatusIndicator->end(); + + if( mxModel.is() ) + mxModel->unlockControllers(); + + if( nRet == ERRCODE_NONE ) + pDoc->UpdateAllLinks(); + + if( nRet == ERRCODE_NONE || nRet == SD_XML_READERROR ) + ; + else if( nRet == ERRCODE_IO_BROKENPACKAGE && xStorage.is() ) + nError = ERRCODE_IO_BROKENPACKAGE; + else + { + // TODO/LATER: this is completely wrong! Filter code should never call ErrorHandler directly! + ErrorHandler::HandleError( nRet ); + if( nRet.IsWarning() ) + nRet = ERRCODE_NONE; + } + + // clear unused named items from item pool + + ::svx::DropUnusedNamedItems(mxModel); + + // set BuildId on XModel for later OLE object loading + if( xInfoSet.is() ) + { + uno::Reference< beans::XPropertySet > xModelSet( mxModel, uno::UNO_QUERY ); + if( xModelSet.is() ) + { + uno::Reference< beans::XPropertySetInfo > xModelSetInfo( xModelSet->getPropertySetInfo() ); + static constexpr OUString sPropName( u"BuildId"_ustr ); + + OUString sBuildId; + xInfoSet->getPropertyValue(sPropName) >>= sBuildId; + + if( xModelSetInfo.is() && xModelSetInfo->hasPropertyByName(sPropName) ) + { + xModelSet->setPropertyValue( sPropName, Any( sBuildId ) ); + } + + bool bTransform = false; + + if( nRet == ERRCODE_NONE ) + { + if( !sBuildId.isEmpty() ) + { + sal_Int32 nIndex = sBuildId.indexOf('$'); + if (sBuildId.indexOf(';') == -1 && nIndex != -1) + { + sal_Int32 nUPD = o3tl::toInt32(sBuildId.subView( 0, nIndex )); + + if( nUPD == 300 ) + { + sal_Int32 nBuildId = o3tl::toInt32(sBuildId.subView( nIndex+1 )); + if( (nBuildId > 0) && (nBuildId < 9316) ) + bTransform = true; // treat OOo 3.0 beta1 as OOo 2.x + } + else if( (nUPD == 680) || ( nUPD >= 640 && nUPD <= 645 ) ) + bTransform = true; + } + } + else + { + // check for binary formats + std::shared_ptr pFilter = mrMedium.GetFilter(); + if( pFilter ) + { + OUString typeName(pFilter->GetRealTypeName()); + if( typeName.startsWith( "impress_StarImpress" ) || + typeName.startsWith( "draw_StarDraw" ) ) + { + bTransform = true; + } + } + } + } + + if( bTransform ) + TransformOOo2xDocument( pDoc ); + } + } + + fixupOutlinePlaceholderNumberingDepths(pDoc); + + pDoc->EnableUndo(bWasUndo); + mrDocShell.ClearUndoBuffer(); + return nRet == ERRCODE_NONE; +} + +bool SdXMLFilter::Export() +{ + rtl::Reference xObjectHelper; + rtl::Reference xGraphicHelper; + bool bDocRet = false; + + if( !mxModel.is() ) + { + SAL_WARN( "sd.filter","Got NO Model in XMLExport"); + return false; + } + + bool bLocked = mxModel->hasControllersLocked(); + + try + { + mxModel->lockControllers(); + + uno::Reference< lang::XServiceInfo > xServiceInfo( mxModel, uno::UNO_QUERY ); + + if( !xServiceInfo.is() || !xServiceInfo->supportsService( "com.sun.star.drawing.GenericDrawingDocument" ) ) + { + SAL_WARN( "sd.filter", "Model is no DrawingDocument in XMLExport" ); + return false; + } + + uno::Reference xContext( ::comphelper::getProcessComponentContext() ); + + uno::Reference< xml::sax::XWriter > xWriter = xml::sax::Writer::create( xContext ); + + /** property map for export info set */ + static PropertyMapEntry const aExportInfoMap[] = + { + { OUString("ProgressRange"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("ProgressMax"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("ProgressCurrent"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("UsePrettyPrinting"),0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("PageLayoutNames"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0}, + { OUString("BaseURI"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("StreamRelPath"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("StreamName"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("StyleNames"), 0, cppu::UnoType>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("StyleFamilies"), 0, cppu::UnoType>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + { OUString("TargetStorage"), 0, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 }, + }; + + uno::Reference< beans::XPropertySet > xInfoSet( GenericPropertySet_CreateInstance( new PropertySetInfo( aExportInfoMap ) ) ); + + bool bUsePrettyPrinting = officecfg::Office::Common::Save::Document::PrettyPrinting::get(); + xInfoSet->setPropertyValue( "UsePrettyPrinting", Any( bUsePrettyPrinting ) ); + + const uno::Reference < embed::XStorage >& xStorage = mrMedium.GetOutputStorage(); + + // Set base URI + OUString sPropName( "BaseURI" ); + xInfoSet->setPropertyValue( sPropName, Any( mrMedium.GetBaseURL( true ) ) ); + + xInfoSet->setPropertyValue( "TargetStorage", Any( xStorage ) ); + + if( SfxObjectCreateMode::EMBEDDED == mrDocShell.GetCreateMode() ) + { + OUString aName; + const SfxStringItem* pDocHierarchItem = + mrMedium.GetItemSet().GetItem(SID_DOC_HIERARCHICALNAME); + if ( pDocHierarchItem ) + aName = pDocHierarchItem->GetValue(); + + if( !aName.isEmpty() ) + { + sPropName = "StreamRelPath"; + xInfoSet->setPropertyValue( sPropName, Any( aName ) ); + } + } + + // initialize descriptor + uno::Sequence< beans::PropertyValue > aDescriptor( 1 ); + beans::PropertyValue* pProps = aDescriptor.getArray(); + + pProps[0].Name = "FileName"; + pProps[0].Value <<= mrMedium.GetName(); + + { + uno::Reference< document::XEmbeddedObjectResolver > xObjectResolver; + uno::Reference xGraphicStorageHandler; + + // create helper for graphic and ole export if we have a storage + if( xStorage.is() ) + { + xObjectHelper = SvXMLEmbeddedObjectHelper::Create( xStorage, *mrDocShell.GetDoc()->GetPersist(), SvXMLEmbeddedObjectHelperMode::Write ); + xObjectResolver = xObjectHelper.get(); + + xGraphicHelper = SvXMLGraphicHelper::Create( xStorage, SvXMLGraphicHelperMode::Write ); + xGraphicStorageHandler = xGraphicHelper.get(); + } + + CreateStatusIndicator(); + if(mxStatusIndicator.is()) + { + sal_Int32 nProgressRange(1000000); + OUString aMsg(SdResId(STR_SAVE_DOC)); + mxStatusIndicator->start(aMsg, nProgressRange); + + // set ProgressRange + uno::Any aProgRange; + aProgRange <<= nProgressRange; + xInfoSet->setPropertyValue( "ProgressRange" , aProgRange); + + // set ProgressCurrent + uno::Any aProgCurrent; + aProgCurrent <<= sal_Int32(0); + xInfoSet->setPropertyValue( "ProgressCurrent" , aProgCurrent); + } + + XML_SERVICES const * pServiceNames = getServices( false, IsDraw(), mnStoreVer ); + + XML_SERVICEMAP aServices[5]; sal_uInt16 i = 0; + aServices[i ].mpService = pServiceNames->mpStyles; + aServices[i++].mpStream = "styles.xml"; + + aServices[i ].mpService = pServiceNames->mpContent; + aServices[i++].mpStream = "content.xml"; + + aServices[i ].mpService = pServiceNames->mpSettings; + aServices[i++].mpStream = "settings.xml"; + + if( mrDocShell.GetCreateMode() != SfxObjectCreateMode::EMBEDDED ) + { + aServices[i ].mpService = pServiceNames->mpMeta; + aServices[i++].mpStream = "meta.xml"; + }; + + aServices[i].mpService = nullptr; + aServices[i].mpStream = nullptr; + + XML_SERVICEMAP* pServices = aServices; + + // doc export + do + { + SAL_INFO( "sd.filter", "exporting substream " << pServices->mpStream ); + + uno::Reference xDocOut; + if( xStorage.is() ) + { + const OUString sDocName( OUString::createFromAscii( pServices->mpStream ) ); + uno::Reference xStream = + xStorage->openStreamElement( sDocName, + embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE ); + + DBG_ASSERT(xStream.is(), "Can't create output stream in package!"); + if( !xStream.is() ) + return false; + + xDocOut = xStream->getOutputStream(); + Reference xProps( xStream, uno::UNO_QUERY ); + if( !xDocOut.is() || !xProps.is() ) + return false; + + xProps->setPropertyValue( "MediaType", Any(OUString( "text/xml"))); + + // encrypt all streams + xProps->setPropertyValue( "UseCommonStoragePasswordEncryption", + uno::Any( true ) ); + + xInfoSet->setPropertyValue( "StreamName", Any( sDocName ) ); + } + + xWriter->setOutputStream( xDocOut ); + + uno::Sequence< uno::Any > aArgs( 2 + ( mxStatusIndicator.is() ? 1 : 0 ) + ( xGraphicStorageHandler.is() ? 1 : 0 ) + ( xObjectResolver.is() ? 1 : 0 ) ); + uno::Any* pArgs = aArgs.getArray(); + *pArgs++ <<= xInfoSet; + if (xGraphicStorageHandler.is()) + *pArgs++ <<= xGraphicStorageHandler; + if (xObjectResolver.is()) + *pArgs++ <<= xObjectResolver; + if (mxStatusIndicator.is()) + *pArgs++ <<= mxStatusIndicator; + + *pArgs <<= xWriter; + + uno::Reference< document::XFilter > xFilter( xContext->getServiceManager()->createInstanceWithArgumentsAndContext( OUString::createFromAscii( pServices->mpService ), aArgs, xContext ), uno::UNO_QUERY ); + if( xFilter.is() ) + { + uno::Reference< document::XExporter > xExporter( xFilter, uno::UNO_QUERY ); + if( xExporter.is() ) + { + xExporter->setSourceDocument( mxModel ); + // outputstream will be closed by SAX parser + bDocRet = xFilter->filter( aDescriptor ); + } + } + + pServices++; + } + while( bDocRet && pServices->mpService ); + + if(mxStatusIndicator.is()) + mxStatusIndicator->end(); + } + } + catch (const uno::Exception &) + { + TOOLS_WARN_EXCEPTION( "sd.filter", "uno Exception caught while exporting"); + bDocRet = false; + } + if ( !bLocked ) + mxModel->unlockControllers(); + + if( xGraphicHelper ) + xGraphicHelper->dispose(); + xGraphicHelper.clear(); + + if( xObjectHelper ) + xObjectHelper->dispose(); + xObjectHelper.clear(); + + return bDocRet; +} + +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportFODP(SvStream &rStream) +{ + SdDLL::Init(); + + sd::DrawDocShellRef xDocSh(new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress)); + xDocSh->DoInitNew(); + uno::Reference xModel(xDocSh->GetModel()); + + uno::Reference xMultiServiceFactory(comphelper::getProcessServiceFactory()); + uno::Reference xStream(new ::utl::OSeekableInputStreamWrapper(rStream)); + uno::Reference xInterface(xMultiServiceFactory->createInstance("com.sun.star.comp.Writer.XmlFilterAdaptor"), uno::UNO_SET_THROW); + + css::uno::Sequence aUserData + { + "com.sun.star.comp.filter.OdfFlatXml", + "", + "com.sun.star.comp.Impress.XMLOasisImporter", + "com.sun.star.comp.Impress.XMLOasisExporter", + "", + "", + "true" + }; + uno::Sequence aAdaptorArgs(comphelper::InitPropertySequence( + { + { "UserData", uno::Any(aUserData) }, + })); + css::uno::Sequence aOuterArgs{ uno::Any(aAdaptorArgs) }; + + uno::Reference xInit(xInterface, uno::UNO_QUERY_THROW); + xInit->initialize(aOuterArgs); + + uno::Reference xImporter(xInterface, uno::UNO_QUERY_THROW); + uno::Sequence aArgs(comphelper::InitPropertySequence( + { + { "InputStream", uno::Any(xStream) }, + { "URL", uno::Any(OUString("private:stream")) }, + })); + xImporter->setTargetDocument(xModel); + + uno::Reference xFilter(xInterface, uno::UNO_QUERY_THROW); + //SetLoading hack because the document properties will be re-initted + //by the xml filter and during the init, while it's considered uninitialized, + //setting a property will inform the document it's modified, which attempts + //to update the properties, which throws cause the properties are uninitialized + xDocSh->SetLoading(SfxLoadedFlags::NONE); + bool ret = xFilter->filter(aArgs); + xDocSh->SetLoading(SfxLoadedFlags::ALL); + + xDocSh->DoClose(); + + return ret; +} + +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportPPTX(SvStream &rStream) +{ + SdDLL::Init(); + + sd::DrawDocShellRef xDocSh(new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress)); + xDocSh->DoInitNew(); + uno::Reference xModel(xDocSh->GetModel()); + + uno::Reference xMultiServiceFactory(comphelper::getProcessServiceFactory()); + uno::Reference xStream(new utl::OSeekableInputStreamWrapper(rStream)); + + uno::Reference xFilter(xMultiServiceFactory->createInstance("com.sun.star.comp.oox.ppt.PowerPointImport"), uno::UNO_QUERY_THROW); + + uno::Reference xImporter(xFilter, uno::UNO_QUERY_THROW); + uno::Sequence aArgs(comphelper::InitPropertySequence( + { + { "InputStream", uno::Any(xStream) }, + { "InputMode", uno::Any(true) }, + })); + xImporter->setTargetDocument(xModel); + + //SetLoading hack because the document properties will be re-initted + //by the xml filter and during the init, while it's considered uninitialized, + //setting a property will inform the document it's modified, which attempts + //to update the properties, which throws cause the properties are uninitialized + xDocSh->SetLoading(SfxLoadedFlags::NONE); + bool ret = false; + try + { + ret = xFilter->filter(aArgs); + } + catch (...) + { + } + xDocSh->SetLoading(SfxLoadedFlags::ALL); + + xDocSh->DoClose(); + + return ret; +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/helper/simplereferencecomponent.cxx b/sd/source/helper/simplereferencecomponent.cxx new file mode 100644 index 0000000000..612e7c6254 --- /dev/null +++ b/sd/source/helper/simplereferencecomponent.cxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +using com::sun::star::uno::RuntimeException; +using sd::SimpleReferenceComponent; + +SimpleReferenceComponent::SimpleReferenceComponent() + : m_nCount(0) + , mbDisposed(false) +{ +} + +SimpleReferenceComponent::~SimpleReferenceComponent() +{ + OSL_ASSERT(m_nCount == 0); + OSL_ASSERT(mbDisposed); +} + +void SimpleReferenceComponent::acquire() { osl_atomic_increment(&m_nCount); } + +void SimpleReferenceComponent::release() +{ + if ((1 == m_nCount) && !mbDisposed) + { + try + { + Dispose(); + } + catch (RuntimeException const&) // don't break throw () + { + TOOLS_WARN_EXCEPTION("sd", ""); + } + } + + if (osl_atomic_decrement(&m_nCount) == 0) + delete this; +} + +void SimpleReferenceComponent::Dispose() +{ + if (!mbDisposed) + { + mbDisposed = true; + disposing(); + } +} + +void SimpleReferenceComponent::disposing() {} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx new file mode 100644 index 0000000000..1b0f87caa5 --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx @@ -0,0 +1,777 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; +using ::com::sun::star::uno::Reference; + +namespace accessibility { + +//===== internal ============================================================ +AccessibleDocumentViewBase::AccessibleDocumentViewBase ( + ::sd::Window* pSdWindow, + ::sd::ViewShell* pViewShell, + uno::Reference xController, + const uno::Reference& rxParent) + : AccessibleContextBase (rxParent, + pViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress ? + AccessibleRole::DOCUMENT_PRESENTATION : + AccessibleRole::DOCUMENT), + mxController (std::move(xController)), + maViewForwarder ( + static_cast(pViewShell->GetView()), + *pSdWindow->GetOutDev()) +{ + if (mxController.is()) + mxModel = mxController->getModel(); + + // Fill the shape tree info. + maShapeTreeInfo.SetModelBroadcaster ( + uno::Reference( + mxModel, uno::UNO_QUERY_THROW)); + maShapeTreeInfo.SetController (mxController); + maShapeTreeInfo.SetSdrView (pViewShell->GetView()); + maShapeTreeInfo.SetWindow (pSdWindow); + maShapeTreeInfo.SetViewForwarder (&maViewForwarder); + + mxWindow = ::VCLUnoHelper::GetInterface (pSdWindow); + mpViewShell = pViewShell; +} + +AccessibleDocumentViewBase::~AccessibleDocumentViewBase() +{ + // At this place we should be disposed. You may want to add a + // corresponding assertion into the destructor of a derived class. +} + +void AccessibleDocumentViewBase::Init() +{ + // Finish the initialization of the shape tree info container. + maShapeTreeInfo.SetDocumentWindow (this); + + // Register as window listener to stay up to date with its size and + // position. + mxWindow->addWindowListener (this); + // Register as focus listener to + mxWindow->addFocusListener (this); + + // Determine the list of shapes on the current page. + uno::Reference xShapeList; + uno::Reference xView (mxController, uno::UNO_QUERY); + if (xView.is()) + xShapeList = xView->getCurrentPage(); + + // Register this object as dispose event listener at the model. + if (mxModel.is()) + mxModel->addEventListener ( + static_cast(this)); + + // Register as property change listener at the controller. + uno::Reference xSet (mxController, uno::UNO_QUERY); + if (xSet.is()) + xSet->addPropertyChangeListener ( + "", + static_cast(this)); + + // Register this object as dispose event listener at the controller. + if (mxController.is()) + mxController->addEventListener ( + static_cast(this)); + + // Register at VCL Window to be informed of activated and deactivated + // OLE objects. + vcl::Window* pWindow = maShapeTreeInfo.GetWindow(); + if (pWindow != nullptr) + { + maWindowLink = LINK( + this, AccessibleDocumentViewBase, WindowChildEventListener); + + pWindow->AddChildEventListener (maWindowLink); + + sal_uInt16 nCount = pWindow->GetChildCount(); + for (sal_uInt16 i=0; iGetChild (i); + if (pChildWindow && + (AccessibleRole::EMBEDDED_OBJECT + ==pChildWindow->GetAccessibleRole())) + { + SetAccessibleOLEObject (pChildWindow->GetAccessible()); + } + } + } + SfxObjectShell* pObjShell = mpViewShell->GetViewFrame()->GetObjectShell(); + if(!pObjShell->IsReadOnly()) + SetState(AccessibleStateType::EDITABLE); +} + +IMPL_LINK(AccessibleDocumentViewBase, WindowChildEventListener, + VclWindowEvent&, rEvent, void) +{ + // DBG_ASSERT( pVclEvent->GetWindow(), "Window???" ); + switch (rEvent.GetId()) + { + case VclEventId::ObjectDying: + { + // Window is dying. Unregister from VCL Window. + // This is also attempted in the disposing() method. + vcl::Window* pWindow = maShapeTreeInfo.GetWindow(); + vcl::Window* pDyingWindow = rEvent.GetWindow(); + if (pWindow==pDyingWindow && pWindow!=nullptr && maWindowLink.IsSet()) + { + pWindow->RemoveChildEventListener (maWindowLink); + maWindowLink = Link(); + } + } + break; + + case VclEventId::WindowShow: + { + // A new window has been created. Is it an OLE object? + vcl::Window* pChildWindow = static_cast( + rEvent.GetData()); + if (pChildWindow!=nullptr + && (pChildWindow->GetAccessibleRole() + == AccessibleRole::EMBEDDED_OBJECT)) + { + SetAccessibleOLEObject (pChildWindow->GetAccessible()); + } + } + break; + + case VclEventId::WindowHide: + { + // A window has been destroyed. Has that been an OLE + // object? + vcl::Window* pChildWindow = static_cast( + rEvent.GetData()); + if (pChildWindow!=nullptr + && (pChildWindow->GetAccessibleRole() + == AccessibleRole::EMBEDDED_OBJECT)) + { + SetAccessibleOLEObject (nullptr); + } + } + break; + + default: break; + } +} + +//===== IAccessibleViewForwarderListener ==================================== + +void AccessibleDocumentViewBase::ViewForwarderChanged() +{ + // Empty +} + +//===== XAccessibleContext ================================================== + +Reference SAL_CALL + AccessibleDocumentViewBase::getAccessibleParent() +{ + ThrowIfDisposed (); + + return AccessibleContextBase::getAccessibleParent(); +} + +sal_Int64 SAL_CALL + AccessibleDocumentViewBase::getAccessibleChildCount() +{ + ThrowIfDisposed (); + + if (mxAccessibleOLEObject.is()) + return 1; + else + return 0; +} + +Reference SAL_CALL + AccessibleDocumentViewBase::getAccessibleChild (sal_Int64 nIndex) +{ + ThrowIfDisposed (); + + ::osl::MutexGuard aGuard (m_aMutex); + if (mxAccessibleOLEObject.is()) + if (nIndex == 0) + return mxAccessibleOLEObject; + + throw lang::IndexOutOfBoundsException ( "no child with index " + OUString::number(nIndex) ); +} + +//===== XAccessibleComponent ================================================ + +/** Iterate over all children and test whether the specified point lies + within one of their bounding boxes. Return the first child for which + this is true. +*/ +uno::Reference SAL_CALL + AccessibleDocumentViewBase::getAccessibleAtPoint ( + const awt::Point& aPoint) +{ + ThrowIfDisposed (); + + ::osl::MutexGuard aGuard (m_aMutex); + uno::Reference xChildAtPosition; + + sal_Int64 nChildCount = getAccessibleChildCount (); + for (sal_Int64 i=nChildCount-1; i>=0; --i) + { + Reference xChild (getAccessibleChild (i)); + if (xChild.is()) + { + Reference xChildComponent ( + xChild->getAccessibleContext(), uno::UNO_QUERY); + if (xChildComponent.is()) + { + awt::Rectangle aBBox (xChildComponent->getBounds()); + if ( (aPoint.X >= aBBox.X) + && (aPoint.Y >= aBBox.Y) + && (aPoint.X < aBBox.X+aBBox.Width) + && (aPoint.Y < aBBox.Y+aBBox.Height) ) + { + xChildAtPosition = xChild; + break; + } + } + } + } + + // Have not found a child under the given point. Returning empty + // reference to indicate this. + return xChildAtPosition; +} + +awt::Rectangle SAL_CALL + AccessibleDocumentViewBase::getBounds() +{ + ThrowIfDisposed (); + + // Transform visible area into screen coordinates. + ::tools::Rectangle aVisibleArea ( + maShapeTreeInfo.GetViewForwarder()->GetVisibleArea()); + ::Point aPixelTopLeft ( + maShapeTreeInfo.GetViewForwarder()->LogicToPixel ( + aVisibleArea.TopLeft())); + ::Point aPixelSize ( + maShapeTreeInfo.GetViewForwarder()->LogicToPixel ( + aVisibleArea.BottomRight()) + - aPixelTopLeft); + + // Prepare to subtract the parent position to transform into relative + // coordinates. + awt::Point aParentPosition; + Reference xParent = getAccessibleParent (); + if (xParent.is()) + { + Reference xParentComponent ( + xParent->getAccessibleContext(), uno::UNO_QUERY); + if (xParentComponent.is()) + aParentPosition = xParentComponent->getLocationOnScreen(); + } + + return awt::Rectangle ( + aPixelTopLeft.X() - aParentPosition.X, + aPixelTopLeft.Y() - aParentPosition.Y, + aPixelSize.X(), + aPixelSize.Y()); +} + +awt::Point SAL_CALL + AccessibleDocumentViewBase::getLocation() +{ + ThrowIfDisposed (); + awt::Rectangle aBoundingBox (getBounds()); + return awt::Point (aBoundingBox.X, aBoundingBox.Y); +} + +awt::Point SAL_CALL + AccessibleDocumentViewBase::getLocationOnScreen() +{ + ThrowIfDisposed (); + ::Point aLogicalPoint (maShapeTreeInfo.GetViewForwarder()->GetVisibleArea().TopLeft()); + ::Point aPixelPoint (maShapeTreeInfo.GetViewForwarder()->LogicToPixel (aLogicalPoint)); + return awt::Point (aPixelPoint.X(), aPixelPoint.Y()); +} + +awt::Size SAL_CALL + AccessibleDocumentViewBase::getSize() +{ + ThrowIfDisposed (); + + // Transform visible area into screen coordinates. + ::tools::Rectangle aVisibleArea ( + maShapeTreeInfo.GetViewForwarder()->GetVisibleArea()); + ::Point aPixelTopLeft ( + maShapeTreeInfo.GetViewForwarder()->LogicToPixel ( + aVisibleArea.TopLeft())); + ::Point aPixelSize ( + maShapeTreeInfo.GetViewForwarder()->LogicToPixel ( + aVisibleArea.BottomRight()) + - aPixelTopLeft); + + return awt::Size (aPixelSize.X(), aPixelSize.Y()); +} + +//===== XInterface ========================================================== + +uno::Any SAL_CALL + AccessibleDocumentViewBase::queryInterface (const uno::Type & rType) +{ + uno::Any aReturn = AccessibleContextBase::queryInterface (rType); + if ( ! aReturn.hasValue()) + aReturn = ::cppu::queryInterface (rType, + static_cast(this), + static_cast(this), + static_cast( + static_cast(this)), + static_cast(this), + static_cast(this), + static_cast(this) + ,static_cast(this) + ); + return aReturn; +} + +void SAL_CALL + AccessibleDocumentViewBase::acquire() + noexcept +{ + AccessibleContextBase::acquire (); +} + +void SAL_CALL + AccessibleDocumentViewBase::release() + noexcept +{ + AccessibleContextBase::release (); +} + +// XServiceInfo + +OUString SAL_CALL + AccessibleDocumentViewBase::getImplementationName() +{ + return "AccessibleDocumentViewBase"; +} + +css::uno::Sequence< OUString> SAL_CALL + AccessibleDocumentViewBase::getSupportedServiceNames() +{ + ThrowIfDisposed (); + return AccessibleContextBase::getSupportedServiceNames (); +} + +//===== XTypeProvider ======================================================= + +css::uno::Sequence< css::uno::Type> SAL_CALL + AccessibleDocumentViewBase::getTypes() +{ + ThrowIfDisposed (); + + return comphelper::concatSequences( + // Get list of types from the context base implementation, ... + AccessibleContextBase::getTypes(), + // ... get list of types from component base implementation, ... + AccessibleComponentBase::getTypes(), + // ...and add the additional type for the component, ... + css::uno::Sequence { + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get() }); +} + +void AccessibleDocumentViewBase::impl_dispose() +{ + // Unregister from VCL Window. + vcl::Window* pWindow = maShapeTreeInfo.GetWindow(); + if (maWindowLink.IsSet()) + { + if (pWindow) + pWindow->RemoveChildEventListener (maWindowLink); + maWindowLink = Link(); + } + else + { + DBG_ASSERT (pWindow, "AccessibleDocumentViewBase::disposing"); + } + + // Unregister from window. + if (mxWindow.is()) + { + mxWindow->removeWindowListener (this); + mxWindow->removeFocusListener (this); + mxWindow = nullptr; + } + + // Unregister from the model. + if (mxModel.is()) + mxModel->removeEventListener ( + static_cast(this)); + + // Unregister from the controller. + if (mxController.is()) + { + uno::Reference xSet (mxController, uno::UNO_QUERY); + if (xSet.is()) + xSet->removePropertyChangeListener ("", static_cast(this)); + + mxController->removeEventListener ( + static_cast(this)); + } + + // Propagate change of controller down the shape tree. + maShapeTreeInfo.SetModelBroadcaster (nullptr); + + // Reset the model reference. + mxModel = nullptr; + // Reset the model reference. + mxController = nullptr; + + maShapeTreeInfo.SetDocumentWindow (nullptr); + maShapeTreeInfo.dispose(); + mxAccessibleOLEObject.clear(); +} + +//===== XEventListener ====================================================== + +void SAL_CALL + AccessibleDocumentViewBase::disposing (const lang::EventObject& rEventObject) +{ + ThrowIfDisposed (); + + // Register this object as dispose event and document::XEventListener + // listener at the model. + + if ( ! rEventObject.Source.is()) + { + // Paranoia. Can this really happen? + } + else if (rEventObject.Source == mxModel || rEventObject.Source == mxController) + { + impl_dispose(); + } +} + +//===== XPropertyChangeListener ============================================= + +void SAL_CALL AccessibleDocumentViewBase::propertyChange (const beans::PropertyChangeEvent& ) +{ + // Empty +} + +//===== XWindowListener ===================================================== + +void SAL_CALL + AccessibleDocumentViewBase::windowResized (const css::awt::WindowEvent& ) +{ + if( IsDisposed() ) + return; + + ViewForwarderChanged(); +} + +void SAL_CALL + AccessibleDocumentViewBase::windowMoved (const css::awt::WindowEvent& ) +{ + if( IsDisposed() ) + return; + + ViewForwarderChanged(); +} + +void SAL_CALL + AccessibleDocumentViewBase::windowShown (const css::lang::EventObject& ) +{ + if( IsDisposed() ) + return; + + ViewForwarderChanged(); +} + +void SAL_CALL + AccessibleDocumentViewBase::windowHidden (const css::lang::EventObject& ) +{ + if( IsDisposed() ) + return; + + ViewForwarderChanged(); +} + +//===== XFocusListener ================================================== + +void AccessibleDocumentViewBase::focusGained (const css::awt::FocusEvent& e) +{ + ThrowIfDisposed (); + if (e.Source == mxWindow) + Activated (); +} + +void AccessibleDocumentViewBase::focusLost (const css::awt::FocusEvent& e) +{ + ThrowIfDisposed (); + if (e.Source == mxWindow) + Deactivated (); +} + +//===== protected internal ================================================== + +// This method is called from the component helper base class while disposing. +void SAL_CALL AccessibleDocumentViewBase::disposing() +{ + impl_dispose(); + + AccessibleContextBase::disposing (); +} + +/// Create a name for this view. +OUString + AccessibleDocumentViewBase::CreateAccessibleName() +{ + return "AccessibleDocumentViewBase"; +} + +void AccessibleDocumentViewBase::Activated() +{ + // Empty. Overwrite to do something useful. +} + +void AccessibleDocumentViewBase::Deactivated() +{ + // Empty. Overwrite to do something useful. +} + +void AccessibleDocumentViewBase::SetAccessibleOLEObject ( + const Reference & xOLEObject) +{ + // Send child event about removed accessible OLE object if necessary. + if (mxAccessibleOLEObject != xOLEObject) + if (mxAccessibleOLEObject.is()) + CommitChange ( + AccessibleEventId::CHILD, + uno::Any(), + uno::Any (mxAccessibleOLEObject), -1); + + // Assume that the accessible OLE Object disposes itself correctly. + + { + ::osl::MutexGuard aGuard (m_aMutex); + mxAccessibleOLEObject = xOLEObject; + } + + // Send child event about new accessible OLE object if necessary. + if (mxAccessibleOLEObject.is()) + CommitChange ( + AccessibleEventId::CHILD, + uno::Any (mxAccessibleOLEObject), + uno::Any(), -1); +} + +//===== methods from AccessibleSelectionBase ================================================== + +// return the member maMutex; +::osl::Mutex& + AccessibleDocumentViewBase::implGetMutex() +{ + return m_aMutex; +} + +// return ourself as context in default case +uno::Reference< XAccessibleContext > + AccessibleDocumentViewBase::implGetAccessibleContext() +{ + return this; +} + +// return false in default case +bool + AccessibleDocumentViewBase::implIsSelected( sal_Int64 ) +{ + return false; +} + +// do nothing in default case +void + AccessibleDocumentViewBase::implSelect( sal_Int64, bool ) +{ +} + +uno::Any SAL_CALL AccessibleDocumentViewBase::getExtendedAttributes() +{ + ::osl::MutexGuard aGuard (m_aMutex); + + uno::Any anyAttribute; + OUStringBuffer sValue; + if (auto pDrViewSh = dynamic_cast<::sd::DrawViewShell* > (mpViewShell)) + { + OUString sDisplay; + OUString sName = "page-name:"; + // MT IA2: Not used... + // SdPage* pCurrPge = pDrViewSh->getCurrentPage(); + SdDrawDocument* pDoc = pDrViewSh->GetDoc(); + sDisplay = pDrViewSh->getCurrentPage()->GetName(); + sDisplay = sDisplay.replaceFirst( "\\", "\\\\" ); + sDisplay = sDisplay.replaceFirst( "=", "\\=" ); + sDisplay = sDisplay.replaceFirst( ";", "\\;" ); + sDisplay = sDisplay.replaceFirst( ",", "\\," ); + sDisplay = sDisplay.replaceFirst( ":", "\\:" ); + sValue = sName + sDisplay + + ";page-number:" + + OUString::number(static_cast(static_cast((pDrViewSh->getCurrentPage()->GetPageNum()-1)>>1) + 1)) + + ";total-pages:" + + OUString::number(static_cast(pDrViewSh->GetPageTabControl().GetPageCount())) + + ";"; + if(pDrViewSh->IsLayerModeActive() && pDrViewSh->GetLayerTabControl()) // #i87182# + { + sName = "page-name:"; + sValue = sName; + OUString sLayerName(pDrViewSh->GetLayerTabControl()->GetLayerName(pDrViewSh->GetLayerTabControl()->GetCurPageId()) ); + sDisplay = pDrViewSh->GetLayerTabControl()->GetPageText(pDrViewSh->GetLayerTabControl()->GetCurPageId()); + if( pDoc ) + { + SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin(); + SdrLayer* aSdrLayer = rLayerAdmin.GetLayer(sLayerName); + if( aSdrLayer ) + { + const OUString& layerAltText = aSdrLayer->GetTitle(); + if (!layerAltText.isEmpty()) + { + sName = " "; + sDisplay += sName + layerAltText; + } + } + } + sDisplay = sDisplay.replaceFirst( "\\", "\\\\" ); + sDisplay = sDisplay.replaceFirst( "=", "\\=" ); + sDisplay = sDisplay.replaceFirst( ";", "\\;" ); + sDisplay = sDisplay.replaceFirst( ",", "\\," ); + sDisplay = sDisplay.replaceFirst( ":", "\\:" ); + sValue.append(sDisplay + + ";page-number:" + + OUString::number(static_cast(pDrViewSh->GetActiveTabLayerIndex()+1)) + + ";total-pages:" + + OUString::number(static_cast(pDrViewSh->GetLayerTabControl()->GetPageCount())) + + ";"); + } + } + if (auto pPresViewSh = dynamic_cast<::sd::PresentationViewShell* >(mpViewShell)) + { + SdPage* pCurrPge = pPresViewSh->getCurrentPage(); + SdDrawDocument* pDoc = pPresViewSh->GetDoc(); + SdPage* pNotesPge = pDoc->GetSdPage((pCurrPge->GetPageNum()-1)>>1, PageKind::Notes); + if (pNotesPge) + { + SdrObject* pNotesObj = pNotesPge->GetPresObj(PresObjKind::Notes); + if (pNotesObj) + { + OutlinerParaObject* pPara = pNotesObj->GetOutlinerParaObject(); + if (pPara) + { + sValue.append("note:"); + const EditTextObject& rEdit = pPara->GetTextObject(); + for (sal_Int32 i=0;i(mpViewShell ) != nullptr ) + { + SdPage* pCurrPge = mpViewShell->GetActualPage(); + SdDrawDocument* pDoc = mpViewShell->GetDoc(); + if(pCurrPge && pDoc) + { + OUString sDisplay; + sDisplay = pCurrPge->GetName(); + sDisplay = sDisplay.replaceFirst( "=", "\\=" ); + sDisplay = sDisplay.replaceFirst( ";", "\\;" ); + sDisplay = sDisplay.replaceFirst( ",", "\\," ); + sDisplay = sDisplay.replaceFirst( ":", "\\:" ); + sValue = "page-name:" + sDisplay + + ";page-number:" + + OUString::number(static_cast(static_cast((pCurrPge->GetPageNum()-1)>>1) + 1)) + + ";total-pages:" + + OUString::number(static_cast(pDoc->GetSdPageCount(PageKind::Standard))) + + ";"; + } + } + if (sValue.getLength()) + anyAttribute <<= sValue.makeStringAndClear(); + return anyAttribute; +} + +sal_Int32 SAL_CALL AccessibleDocumentViewBase::getForeground( ) +{ + return sal_Int32(COL_BLACK); +} + +sal_Int32 SAL_CALL AccessibleDocumentViewBase::getBackground( ) +{ + ThrowIfDisposed (); + ::osl::MutexGuard aGuard (m_aMutex); + return sal_Int32(mpViewShell->GetView()->getColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor); +} +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx b/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx new file mode 100644 index 0000000000..3ec3efb2be --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx @@ -0,0 +1,778 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::accessibility; + +namespace accessibility { + +namespace { + +struct XShapePosCompareHelper +{ + bool operator() ( const uno::Reference& xshape1, + const uno::Reference& xshape2 ) const + { + // modify the compare method to return the Z-Order, not layout order + SdrObject* pObj1 = SdrObject::getSdrObjectFromXShape(xshape1); + SdrObject* pObj2 = SdrObject::getSdrObjectFromXShape(xshape2); + if(pObj1 && pObj2) + return pObj1->GetOrdNum() < pObj2->GetOrdNum(); + else + return false; + } +}; + +} + +//===== internal ============================================================ + +AccessibleDrawDocumentView::AccessibleDrawDocumentView ( + ::sd::Window* pSdWindow, + ::sd::ViewShell* pViewShell, + const uno::Reference& rxController, + const uno::Reference& rxParent) + : AccessibleDocumentViewBase (pSdWindow, pViewShell, rxController, rxParent), + mpSdViewSh( pViewShell ) +{ + UpdateAccessibleName(); +} + +AccessibleDrawDocumentView::~AccessibleDrawDocumentView() +{ + DBG_ASSERT (rBHelper.bDisposed || rBHelper.bInDispose, + "~AccessibleDrawDocumentView: object has not been disposed"); +} + +void AccessibleDrawDocumentView::Init() +{ + AccessibleDocumentViewBase::Init (); + + // Determine the list of shapes on the current page. + uno::Reference xShapeList; + uno::Reference xView (mxController, uno::UNO_QUERY); + if (xView.is()) + xShapeList = xView->getCurrentPage(); + + // Create the children manager. + mpChildrenManager.reset(new ChildrenManager(this, xShapeList, maShapeTreeInfo, *this)); + + rtl::Reference xPage(CreateDrawPageShape()); + if (xPage.is()) + { + xPage->Init(); + mpChildrenManager->AddAccessibleShape (xPage); + mpChildrenManager->Update (); + } + + mpChildrenManager->UpdateSelection (); +} + +void AccessibleDrawDocumentView::ViewForwarderChanged() +{ + AccessibleDocumentViewBase::ViewForwarderChanged(); + if (mpChildrenManager != nullptr) + mpChildrenManager->ViewForwarderChanged(); +} + +/** The page shape is created on every call at the moment (provided that + everything goes well). +*/ +rtl::Reference AccessibleDrawDocumentView::CreateDrawPageShape() +{ + rtl::Reference xShape; + + // Create a shape that represents the actual draw page. + uno::Reference xView (mxController, uno::UNO_QUERY); + if (xView.is()) + { + uno::Reference xSet ( + uno::Reference (xView->getCurrentPage(), uno::UNO_QUERY)); + if (xSet.is()) + { + // Create a rectangle shape that will represent the draw page. + uno::Reference xFactory (mxModel, uno::UNO_QUERY); + uno::Reference xRectangle; + if (xFactory.is()) + xRectangle.set(xFactory->createInstance ("com.sun.star.drawing.RectangleShape"), + uno::UNO_QUERY); + + // Set the shape's size and position. + if (xRectangle.is()) + { + uno::Any aValue; + awt::Point aPosition; + awt::Size aSize; + + // Set size and position of the shape to those of the draw + // page. + aValue = xSet->getPropertyValue ("BorderLeft"); + aValue >>= aPosition.X; + aValue = xSet->getPropertyValue ("BorderTop"); + aValue >>= aPosition.Y; + xRectangle->setPosition (aPosition); + + aValue = xSet->getPropertyValue ("Width"); + aValue >>= aSize.Width; + aValue = xSet->getPropertyValue ("Height"); + aValue >>= aSize.Height; + xRectangle->setSize (aSize); + + // Create the accessible object for the shape and + // initialize it. + xShape = new AccessiblePageShape ( + xView->getCurrentPage(), this, maShapeTreeInfo); + } + } + } + return xShape; +} + +//===== XAccessibleContext ================================================== + +sal_Int64 SAL_CALL + AccessibleDrawDocumentView::getAccessibleChildCount() +{ + ThrowIfDisposed (); + + sal_Int64 nChildCount = AccessibleDocumentViewBase::getAccessibleChildCount(); + + // Forward request to children manager. + if (mpChildrenManager != nullptr) + nChildCount += mpChildrenManager->GetChildCount(); + + return nChildCount; +} + +uno::Reference SAL_CALL + AccessibleDrawDocumentView::getAccessibleChild (sal_Int64 nIndex) +{ + ThrowIfDisposed (); + + ::osl::ClearableMutexGuard aGuard (m_aMutex); + + // Take care of children of the base class. + sal_Int64 nCount = AccessibleDocumentViewBase::getAccessibleChildCount(); + if (nCount > 0) + { + if (nIndex < nCount) + return AccessibleDocumentViewBase::getAccessibleChild(nIndex); + else + nIndex -= nCount; + } + + // Create a copy of the pointer to the children manager and release the + // mutex before calling any of its methods. + ChildrenManager* pChildrenManager = mpChildrenManager.get(); + aGuard.clear(); + + // Forward request to children manager. + if (pChildrenManager == nullptr) + throw lang::IndexOutOfBoundsException ( + "no accessible child with index " + OUString::number(nIndex), + static_cast(this)); + + return pChildrenManager->GetChild (nIndex); +} + +OUString SAL_CALL + AccessibleDrawDocumentView::getAccessibleName() +{ + SolarMutexGuard g; + + OUString sName = SdResId(SID_SD_A11Y_D_PRESENTATION); + ::sd::View* pSdView = static_cast< ::sd::View* >( maShapeTreeInfo.GetSdrView() ); + if ( pSdView ) + { + SdDrawDocument& rDoc = pSdView->GetDoc(); + OUString sFileName = rDoc.getDocAccTitle(); + if ( !sFileName.getLength() ) + { + ::sd::DrawDocShell* pDocSh = pSdView->GetDocSh(); + if ( pDocSh ) + { + sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME ); + } + } + + OUString sReadOnly; + if(rDoc.getDocReadOnly()) + { + sReadOnly = SdResId(SID_SD_A11Y_D_PRESENTATION_READONLY); + } + + if ( sFileName.getLength() ) + { + sName = sFileName + sReadOnly + " - " + sName; + } + } + + return sName; +} + +//===== XEventListener ====================================================== + +void SAL_CALL + AccessibleDrawDocumentView::disposing (const lang::EventObject& rEventObject) +{ + ThrowIfDisposed (); + + AccessibleDocumentViewBase::disposing (rEventObject); + if (rEventObject.Source == mxModel) + { + ::osl::Guard< ::osl::Mutex> aGuard (::osl::Mutex::getGlobalMutex()); + // maShapeTreeInfo has been modified in base class. + if (mpChildrenManager != nullptr) + mpChildrenManager->SetInfo (maShapeTreeInfo); + } +} + +//===== XPropertyChangeListener ============================================= + +void SAL_CALL + AccessibleDrawDocumentView::propertyChange (const beans::PropertyChangeEvent& rEventObject) +{ + ThrowIfDisposed (); + + AccessibleDocumentViewBase::propertyChange (rEventObject); + + // add page switch event for slide show mode + if (rEventObject.PropertyName == "CurrentPage" || + rEventObject.PropertyName == "PageChange") + { + // Update the accessible name to reflect the current slide. + UpdateAccessibleName(); + + // The current page changed. Update the children manager accordingly. + uno::Reference xView (mxController, uno::UNO_QUERY); + if (xView.is() && mpChildrenManager!=nullptr) + { + // Inform the children manager to forget all children and give + // him the new ones. + mpChildrenManager->ClearAccessibleShapeList (); + mpChildrenManager->SetShapeList (xView->getCurrentPage()); + + rtl::Reference xPage(CreateDrawPageShape ()); + if (xPage.is()) + { + xPage->Init(); + mpChildrenManager->AddAccessibleShape (xPage); + mpChildrenManager->Update (false); + } + } + else + SAL_WARN("sd", "View invalid"); + CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue,rEventObject.OldValue, -1); + } + else if ( rEventObject.PropertyName == "VisibleArea" ) + { + if (mpChildrenManager != nullptr) + mpChildrenManager->ViewForwarderChanged(); + } + else if (rEventObject.PropertyName == "ActiveLayer") + { + CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue,rEventObject.OldValue, -1); + } + else if (rEventObject.PropertyName == "UpdateAcc") + { + // The current page changed. Update the children manager accordingly. + uno::Reference xView (mxController, uno::UNO_QUERY); + if (xView.is() && mpChildrenManager!=nullptr) + { + // Inform the children manager to forget all children and give + // him the new ones. + mpChildrenManager->ClearAccessibleShapeList (); + // update the slide show page's accessible info + //mpChildrenManager->SetShapeList (uno::Reference ( + // xView->getCurrentPage(), uno::UNO_QUERY)); + rtl::Reference< sd::SlideShow > xSlideshow( sd::SlideShow::GetSlideShow( mpSdViewSh->GetViewShellBase() ) ); + if( xSlideshow.is() && xSlideshow->isRunning() && xSlideshow->isFullScreen() ) + { + css::uno::Reference< drawing::XDrawPage > xSlide; + // MT IA2: Not used... + // sal_Int32 currentPageIndex = xSlideshow->getCurrentPageIndex(); + css::uno::Reference< css::presentation::XSlideShowController > xSlideController = xSlideshow->getController(); + if( xSlideController.is() ) + { + xSlide = xSlideController->getCurrentSlide(); + if (xSlide.is()) + { + mpChildrenManager->SetShapeList (xSlide); + } + } + } + rtl::Reference xPage(CreateDrawPageShape ()); + if (xPage.is()) + { + xPage->Init(); + mpChildrenManager->AddAccessibleShape (xPage); + mpChildrenManager->Update (false); + } + } + } + else + { + SAL_INFO("sd", "unhandled"); + } +} + +// XServiceInfo + +OUString SAL_CALL + AccessibleDrawDocumentView::getImplementationName() +{ + return "AccessibleDrawDocumentView"; +} + +css::uno::Sequence< OUString> SAL_CALL + AccessibleDrawDocumentView::getSupportedServiceNames() +{ + ThrowIfDisposed(); + const css::uno::Sequence vals { "com.sun.star.drawing.AccessibleDrawDocumentView" }; + uno::Sequence aServiceNames = + AccessibleDocumentViewBase::getSupportedServiceNames(); + + return comphelper::concatSequences(aServiceNames, vals); +} + +//===== XInterface ========================================================== + +uno::Any SAL_CALL + AccessibleDrawDocumentView::queryInterface (const uno::Type & rType) +{ + uno::Any aReturn = AccessibleDocumentViewBase::queryInterface (rType); + if ( ! aReturn.hasValue()) + aReturn = ::cppu::queryInterface (rType, + static_cast(this) + ); + return aReturn; +} + +void SAL_CALL + AccessibleDrawDocumentView::acquire() + noexcept +{ + AccessibleDocumentViewBase::acquire (); +} +void SAL_CALL + AccessibleDrawDocumentView::release() + noexcept +{ + AccessibleDocumentViewBase::release (); +} +//===== XAccessibleGroupPosition ========================================= +uno::Sequence< sal_Int32 > SAL_CALL + AccessibleDrawDocumentView::getGroupPosition( const uno::Any& rAny ) +{ + SolarMutexGuard g; + + // we will return the: + // [0] group level(always be 0 now) + // [1] similar items counts in the group + // [2] the position of the object in the group + uno::Sequence< sal_Int32 > aRet( 3 ); + //get the xShape of the current selected drawing object + uno::Reference xAccContent; + rAny >>= xAccContent; + if ( !xAccContent.is() ) + { + return aRet; + } + AccessibleShape* pAcc = comphelper::getFromUnoTunnel( xAccContent ); + if ( !pAcc ) + { + return aRet; + } + uno::Reference< drawing::XShape > xCurShape = pAcc->GetXShape(); + if ( !xCurShape.is() ) + { + return aRet; + } + //find all the child in the page, insert them into a vector and sort + if ( mpChildrenManager == nullptr ) + { + return aRet; + } + std::vector< uno::Reference > vXShapes; + sal_Int32 nCount = mpChildrenManager->GetChildCount(); + //get pointer of SdView & SdrPageView for further use. + SdrPageView* pPV = nullptr; + ::sd::View* pSdView = nullptr; + if ( mpSdViewSh ) + { + pSdView = mpSdViewSh->GetView(); + pPV = pSdView->GetSdrPageView(); + } + for ( sal_Int32 i = 0; i < nCount; i++ ) + { + uno::Reference< drawing::XShape > xShape = mpChildrenManager->GetChildShape(i); + if ( xShape.is() ) + { + //if the object is visible in the page, we add it into the group list. + SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape); + if ( pObj && pPV && pSdView && pSdView->IsObjMarkable( pObj, pPV ) ) + { + vXShapes.push_back( xShape ); + } + } + } + std::sort( vXShapes.begin(), vXShapes.end(), XShapePosCompareHelper() ); + //get the index of the selected object in the group + auto aIter = std::find_if(vXShapes.begin(), vXShapes.end(), + [&xCurShape](const uno::Reference& rxShape) { return rxShape.get() == xCurShape.get(); }); + if (aIter != vXShapes.end()) + { + sal_Int32* pArray = aRet.getArray(); + pArray[0] = 1; //it should be 1 based, not 0 based. + pArray[1] = vXShapes.size(); + pArray[2] = static_cast(std::distance(vXShapes.begin(), aIter)) + 1; //we start counting position from 1 + } + return aRet; +} + +OUString AccessibleDrawDocumentView::getObjectLink( const uno::Any& rAny ) +{ + SolarMutexGuard g; + + OUString aRet; + //get the xShape of the current selected drawing object + uno::Reference xAccContent; + rAny >>= xAccContent; + if ( !xAccContent.is() ) + { + return aRet; + } + AccessibleShape* pAcc = comphelper::getFromUnoTunnel( xAccContent ); + if ( !pAcc ) + { + return aRet; + } + uno::Reference< drawing::XShape > xCurShape = pAcc->GetXShape(); + if ( !xCurShape.is() ) + { + return aRet; + } + SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xCurShape); + if (pObj) + { + SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj); + if( pInfo && (pInfo->meClickAction == presentation::ClickAction_DOCUMENT) ) + aRet = pInfo->GetBookmark(); + } + return aRet; +} + +/// Create a name for this view. +OUString AccessibleDrawDocumentView::CreateAccessibleName() +{ + OUString sName; + + uno::Reference xInfo (mxController, uno::UNO_QUERY); + if (xInfo.is()) + { + uno::Sequence< OUString > aServices( xInfo->getSupportedServiceNames() ); + OUString sFirstService = aServices[0]; + if ( sFirstService == "com.sun.star.drawing.DrawingDocumentDrawView" ) + { + if( aServices.getLength() >= 2 && aServices[1] == "com.sun.star.presentation.PresentationView") + { + SolarMutexGuard aGuard; + + sName = SdResId(SID_SD_A11Y_I_DRAWVIEW_N); + } + else + { + SolarMutexGuard aGuard; + + sName = SdResId(SID_SD_A11Y_D_DRAWVIEW_N); + } + } + else if ( sFirstService == "com.sun.star.presentation.NotesView" ) + { + SolarMutexGuard aGuard; + + sName = SdResId(SID_SD_A11Y_I_NOTESVIEW_N); + } + else if ( sFirstService == "com.sun.star.presentation.HandoutView" ) + { + SolarMutexGuard aGuard; + + sName = SdResId(SID_SD_A11Y_I_HANDOUTVIEW_N); + } + else + { + sName = sFirstService; + } + } + else + { + sName = "AccessibleDrawDocumentView"; + } + return sName; +} + +/** Return selection state of specified child +*/ +bool + AccessibleDrawDocumentView::implIsSelected( sal_Int64 nAccessibleChildIndex ) +{ + const SolarMutexGuard aSolarGuard; + uno::Reference< view::XSelectionSupplier > xSel( mxController, uno::UNO_QUERY ); + bool bRet = false; + + OSL_ENSURE( 0 <= nAccessibleChildIndex, "AccessibleDrawDocumentView::implIsSelected: invalid index!" ); + + if( xSel.is() && ( 0 <= nAccessibleChildIndex ) ) + { + uno::Any aAny( xSel->getSelection() ); + uno::Reference< drawing::XShapes > xShapes; + + aAny >>= xShapes; + + if( xShapes.is() ) + { + AccessibleShape* pAcc = comphelper::getFromUnoTunnel( getAccessibleChild( nAccessibleChildIndex ) ); + + if( pAcc ) + { + uno::Reference< drawing::XShape > xShape( pAcc->GetXShape() ); + + if( xShape.is() ) + { + for( sal_Int32 i = 0, nCount = xShapes->getCount(); ( i < nCount ) && !bRet; ++i ) + if( xShapes->getByIndex( i ) == xShape ) + bRet = true; + } + } + } + } + + return bRet; +} + +/** Select or deselect the specified shapes. The corresponding accessible + shapes are notified over the selection change listeners registered with + the XSelectionSupplier of the controller. +*/ +void + AccessibleDrawDocumentView::implSelect( sal_Int64 nAccessibleChildIndex, bool bSelect ) +{ + const SolarMutexGuard aSolarGuard; + uno::Reference< view::XSelectionSupplier > xSel( mxController, uno::UNO_QUERY ); + + if( !xSel.is() ) + return; + + uno::Any aAny; + + if( ACCESSIBLE_SELECTION_CHILD_ALL == nAccessibleChildIndex ) + { + // Select or deselect all children. + + if( !bSelect ) + xSel->select( aAny ); + else + { + uno::Reference< drawing::XShapes > xShapes = drawing::ShapeCollection::create( + comphelper::getProcessComponentContext()); + + for(sal_Int64 i = 0, nCount = getAccessibleChildCount(); i < nCount; ++i ) + { + AccessibleShape* pAcc = comphelper::getFromUnoTunnel( getAccessibleChild( i ) ); + + if( pAcc && pAcc->GetXShape().is() ) + xShapes->add( pAcc->GetXShape() ); + } + + if( xShapes->getCount() ) + { + xSel->select( Any(xShapes) ); + } + } + } + else if( nAccessibleChildIndex >= 0 ) + { + // Select or deselect only the child with index + // nAccessibleChildIndex. + + AccessibleShape* pAcc = comphelper::getFromUnoTunnel( + getAccessibleChild( nAccessibleChildIndex )); + + // Add or remove the shape that is made accessible from the + // selection of the controller. + if( pAcc ) + { + uno::Reference< drawing::XShape > xShape( pAcc->GetXShape() ); + + if( xShape.is() ) + { + uno::Reference< drawing::XShapes > xShapes; + bool bFound = false; + + aAny = xSel->getSelection(); + aAny >>= xShapes; + + // Search shape to be selected in current selection. + if (xShapes.is()) + { + sal_Int32 nCount = xShapes->getCount(); + for (sal_Int32 i=0; ( i < nCount ) && !bFound; ++i ) + if( xShapes->getByIndex( i ) == xShape ) + bFound = true; + } + else + // Create an empty selection to add the shape to. + xShapes = drawing::ShapeCollection::create( + comphelper::getProcessComponentContext()); + + // Update the selection. + if( !bFound && bSelect ) + xShapes->add( xShape ); + else if( bFound && !bSelect ) + xShapes->remove( xShape ); + + xSel->select( Any(xShapes) ); + } + } + } +} + +void AccessibleDrawDocumentView::Activated() +{ + if (mpChildrenManager == nullptr) + return; + + bool bChange = false; + // When none of the children has the focus then claim it for the + // view. + if ( ! mpChildrenManager->HasFocus()) + { + SetState (AccessibleStateType::FOCUSED); + bChange = true; + } + else + ResetState (AccessibleStateType::FOCUSED); + mpChildrenManager->UpdateSelection(); + // if the child gets focus in UpdateSelection(), needs to reset the focus on document. + if (mpChildrenManager->HasFocus() && bChange) + ResetState (AccessibleStateType::FOCUSED); +} + +void AccessibleDrawDocumentView::Deactivated() +{ + if (mpChildrenManager != nullptr) + mpChildrenManager->RemoveFocus(); + ResetState (AccessibleStateType::FOCUSED); +} + +void AccessibleDrawDocumentView::impl_dispose() +{ + mpChildrenManager.reset(); + AccessibleDocumentViewBase::impl_dispose(); +} + +/** This method is called from the component helper base class while + disposing. +*/ +void SAL_CALL AccessibleDrawDocumentView::disposing() +{ + // Release resources. + mpChildrenManager.reset(); + + // Forward call to base classes. + AccessibleDocumentViewBase::disposing (); +} + +void AccessibleDrawDocumentView::UpdateAccessibleName() +{ + OUString sNewName (CreateAccessibleName() + ": "); + + // Add the number of the current slide. + uno::Reference xView (mxController, uno::UNO_QUERY); + if (xView.is()) + { + uno::Reference xProperties (xView->getCurrentPage(), UNO_QUERY); + if (xProperties.is()) + try + { + sal_Int16 nPageNumber (0); + if (xProperties->getPropertyValue("Number") >>= nPageNumber) + { + sNewName += OUString::number(nPageNumber); + } + } + catch (const beans::UnknownPropertyException&) + { + } + } + + // Add the number of pages/slides. + Reference xPagesSupplier (mxModel, UNO_QUERY); + if (xPagesSupplier.is()) + { + Reference xPages = xPagesSupplier->getDrawPages(); + if (xPages.is()) + { + sNewName += " / " + OUString::number(xPages->getCount()); + } + } + + SetAccessibleName (sNewName, AutomaticallyCreated); +} + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx b/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx new file mode 100644 index 0000000000..90c3776ac6 --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx @@ -0,0 +1,199 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +namespace accessibility +{ + + AccessibleOutlineEditSource::AccessibleOutlineEditSource( + SdrOutliner& rOutliner, + SdrView& rView, + OutlinerView& rOutlView, + const vcl::Window& rViewWindow ) + : mrView( rView ), + mrWindow( rViewWindow ), + mpOutliner( &rOutliner ), + mpOutlinerView( &rOutlView ), + mTextForwarder( rOutliner, false ), + mViewForwarder( rOutlView ) + { + // register as listener - need to broadcast state change messages + // Moved to ::GetTextForwarder() + //rOutliner.SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) ); + StartListening(rOutliner); + } + + AccessibleOutlineEditSource::~AccessibleOutlineEditSource() + { + if( mpOutliner ) + mpOutliner->SetNotifyHdl( Link() ); + Broadcast( TextHint( SfxHintId::Dying ) ); + } + + std::unique_ptr AccessibleOutlineEditSource::Clone() const + { + return std::unique_ptr(new AccessibleOutlineEditSource(*mpOutliner, mrView, *mpOutlinerView, mrWindow)); + } + + SvxTextForwarder* AccessibleOutlineEditSource::GetTextForwarder() + { + // TODO: maybe suboptimal + if( IsValid() ) + { + // Moved here to make sure that + // the NotifyHandler was set on the current object. + mpOutliner->SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) ); + return &mTextForwarder; + } + else + return nullptr; + } + + SvxViewForwarder* AccessibleOutlineEditSource::GetViewForwarder() + { + // TODO: maybe suboptimal + if( IsValid() ) + return this; + else + return nullptr; + } + + SvxEditViewForwarder* AccessibleOutlineEditSource::GetEditViewForwarder( bool ) + { + // TODO: maybe suboptimal + if( IsValid() ) + { + // ignore parameter, we're always in edit mode here + return &mViewForwarder; + } + else + return nullptr; + } + + void AccessibleOutlineEditSource::UpdateData() + { + // NOOP, since we're always working on the 'real' outliner, + // i.e. changes are immediately reflected on the screen + } + + SfxBroadcaster& AccessibleOutlineEditSource::GetBroadcaster() const + { + return * const_cast< AccessibleOutlineEditSource* > (this); + } + + bool AccessibleOutlineEditSource::IsValid() const + { + if( mpOutliner && mpOutlinerView ) + { + // Our view still on outliner? + sal_uLong nCurrView, nViews; + + for( nCurrView=0, nViews=mpOutliner->GetViewCount(); nCurrViewGetView(nCurrView) == mpOutlinerView ) + return true; + } + } + + return false; + } + + Point AccessibleOutlineEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const + { + if (IsValid()) + { + Point aPoint( OutputDevice::LogicToLogic( rPoint, rMapMode, + MapMode(mrView.GetModel().GetScaleUnit()) ) ); + MapMode aMapMode(mrWindow.GetMapMode()); + aMapMode.SetOrigin(Point()); + return mrWindow.LogicToPixel( aPoint, aMapMode ); + } + + return Point(); + } + + Point AccessibleOutlineEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const + { + if (IsValid()) + { + MapMode aMapMode(mrWindow.GetMapMode()); + aMapMode.SetOrigin(Point()); + Point aPoint( mrWindow.PixelToLogic( rPoint, aMapMode ) ); + return OutputDevice::LogicToLogic( aPoint, + MapMode(mrView.GetModel().GetScaleUnit()), + rMapMode ); + } + + return Point(); + } + + void AccessibleOutlineEditSource::Notify( SfxBroadcaster& rBroadcaster, const SfxHint& rHint ) + { + bool bDispose = false; + + if( &rBroadcaster == mpOutliner ) + { + if( rHint.GetId() == SfxHintId::Dying ) + { + bDispose = true; + mpOutliner = nullptr; + } + } + else + { + if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint) + { + const SdrHint* pSdrHint = static_cast< const SdrHint* >( &rHint ); + if( pSdrHint->GetKind() == SdrHintKind::ModelCleared ) + { + // model is dying under us, going defunc + bDispose = true; + } + } + } + + if( bDispose ) + { + if( mpOutliner ) + mpOutliner->SetNotifyHdl( Link() ); + mpOutliner = nullptr; + mpOutlinerView = nullptr; + Broadcast( TextHint( SfxHintId::Dying ) ); + } + } + + IMPL_LINK(AccessibleOutlineEditSource, NotifyHdl, EENotify&, rNotify, void) + { + ::std::unique_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( &rNotify) ); + + if (aHint) + { + Broadcast(*aHint); + } + } + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleOutlineView.cxx b/sd/source/ui/accessibility/AccessibleOutlineView.cxx new file mode 100644 index 0000000000..9d2e82c1b1 --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleOutlineView.cxx @@ -0,0 +1,238 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; + +namespace accessibility { + +//===== internal ============================================================ + +AccessibleOutlineView::AccessibleOutlineView ( + ::sd::Window* pSdWindow, + ::sd::OutlineViewShell* pViewShell, + const uno::Reference& rxController, + const uno::Reference& rxParent) + : AccessibleDocumentViewBase (pSdWindow, pViewShell, rxController, rxParent), + maTextHelper( ::std::unique_ptr< SvxEditSource >() ) +{ + SolarMutexGuard aGuard; + + // Beware! Here we leave the paths of the UNO API and descend into the + // depths of the core. Necessary for making the edit engine accessible. + if (!pSdWindow) + return; + + ::sd::View* pView = pViewShell->GetView(); + + auto pShellView = dynamic_cast<::sd::OutlineView* >( pView ); + if(!pShellView) + return; + + OutlinerView* pOutlineView = pShellView->GetViewByWindow( pSdWindow ); + SdOutliner& rOutliner = pShellView->GetOutliner(); + + if( pOutlineView ) + { + maTextHelper.SetEditSource( ::std::unique_ptr< SvxEditSource >( new AccessibleOutlineEditSource( + rOutliner, *pView, *pOutlineView, *pSdWindow ) ) ); + } +} + +AccessibleOutlineView::~AccessibleOutlineView() +{ +} + +void AccessibleOutlineView::Init() +{ + // Set event source _before_ starting to listen + maTextHelper.SetEventSource(this); + + AccessibleDocumentViewBase::Init (); +} + +void AccessibleOutlineView::ViewForwarderChanged() +{ + AccessibleDocumentViewBase::ViewForwarderChanged(); + + UpdateChildren(); +} + +//===== XAccessibleContext ================================================== + +sal_Int64 SAL_CALL + AccessibleOutlineView::getAccessibleChildCount() +{ + ThrowIfDisposed (); + + // forward + return maTextHelper.GetChildCount(); +} + +uno::Reference SAL_CALL + AccessibleOutlineView::getAccessibleChild (sal_Int64 nIndex) +{ + ThrowIfDisposed (); + // Forward request to children manager. + return maTextHelper.GetChild(nIndex); +} + +OUString SAL_CALL + AccessibleOutlineView::getAccessibleName() +{ + SolarMutexGuard g; + + OUString sName = SdResId(SID_SD_A11Y_D_PRESENTATION); + ::sd::View* pSdView = static_cast< ::sd::View* >( maShapeTreeInfo.GetSdrView() ); + if ( pSdView ) + { + SdDrawDocument& rDoc = pSdView->GetDoc(); + OUString sFileName = rDoc.getDocAccTitle(); + if (sFileName.isEmpty()) + { + ::sd::DrawDocShell* pDocSh = pSdView->GetDocSh(); + if ( pDocSh ) + { + sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME ); + } + } + if (!sFileName.isEmpty()) + { + sName = sFileName + " - " + sName; + } + } + return sName; +} + +//===== XAccessibleEventBroadcaster ======================================== + +void SAL_CALL AccessibleOutlineView::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) +{ + // delegate listener handling to children manager. + if ( ! IsDisposed()) + maTextHelper.AddEventListener(xListener); + AccessibleContextBase::addEventListener(xListener); +} + +void SAL_CALL AccessibleOutlineView::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) +{ + // forward + if ( ! IsDisposed()) + maTextHelper.RemoveEventListener(xListener); + AccessibleContextBase::removeEventListener(xListener); +} + +// XServiceInfo + +OUString SAL_CALL + AccessibleOutlineView::getImplementationName() +{ + return "AccessibleOutlineView"; +} + +//===== XEventListener ====================================================== + +//===== protected internal ================================================== + +void AccessibleOutlineView::Activated() +{ + SolarMutexGuard aGuard; + + // delegate listener handling to children manager. + maTextHelper.SetFocus(); +} + +void AccessibleOutlineView::Deactivated() +{ + SolarMutexGuard aGuard; + + // delegate listener handling to children manager. + maTextHelper.SetFocus(false); +} + +void SAL_CALL AccessibleOutlineView::disposing() +{ + // dispose children + maTextHelper.Dispose(); + + AccessibleDocumentViewBase::disposing (); +} + +//===== XPropertyChangeListener ============================================= + +void SAL_CALL + AccessibleOutlineView::propertyChange (const beans::PropertyChangeEvent& rEventObject) +{ + ThrowIfDisposed (); + + AccessibleDocumentViewBase::propertyChange (rEventObject); + + //add page switch event for slide show mode + if (rEventObject.PropertyName == "CurrentPage" || + rEventObject.PropertyName == "PageChange") + { + // The current page changed. Update the children accordingly. + UpdateChildren(); + CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue, rEventObject.OldValue, -1); + } + else if ( rEventObject.PropertyName == "VisibleArea" ) + { + // The visible area changed. Update the children accordingly. + UpdateChildren(); + } + else + { + SAL_INFO("sd", "unhandled"); + } +} + +/// Create a name for this view. +OUString AccessibleOutlineView::CreateAccessibleName() +{ + return SdResId(SID_SD_A11Y_I_OUTLINEVIEW_N); +} + +void AccessibleOutlineView::UpdateChildren() +{ + SolarMutexGuard aGuard; + + // Update visible children + maTextHelper.UpdateChildren(); +} + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessiblePageShape.cxx b/sd/source/ui/accessibility/AccessiblePageShape.cxx new file mode 100644 index 0000000000..894f7b724b --- /dev/null +++ b/sd/source/ui/accessibility/AccessiblePageShape.cxx @@ -0,0 +1,262 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::accessibility; +using ::com::sun::star::uno::Reference; + +namespace accessibility { + +//===== internal ============================================================ + +AccessiblePageShape::AccessiblePageShape ( + uno::Reference xPage, + const uno::Reference& rxParent, + const AccessibleShapeTreeInfo& rShapeTreeInfo) + : AccessibleShape (AccessibleShapeInfo (nullptr, rxParent), rShapeTreeInfo), + mxPage (std::move(xPage)) +{ + // The main part of the initialization is done in the init method which + // has to be called from this constructor's caller. +} + +AccessiblePageShape::~AccessiblePageShape() +{ +} + +//===== XAccessibleContext ================================================== + +sal_Int64 SAL_CALL + AccessiblePageShape::getAccessibleChildCount() +{ + return 0; +} + +/** Forward the request to the shape. Return the requested shape or throw + an exception for a wrong index. +*/ +uno::Reference SAL_CALL + AccessiblePageShape::getAccessibleChild( sal_Int64 ) +{ + throw lang::IndexOutOfBoundsException ("page shape has no children", + static_cast(this)); +} + +//===== XAccessibleComponent ================================================ + +awt::Rectangle SAL_CALL AccessiblePageShape::getBounds() +{ + ThrowIfDisposed (); + + awt::Rectangle aBoundingBox; + + if (maShapeTreeInfo.GetViewForwarder() != nullptr) + { + uno::Reference xSet (mxPage, uno::UNO_QUERY); + if (xSet.is()) + { + uno::Any aValue; + + aValue = xSet->getPropertyValue ("BorderLeft"); + aValue >>= aBoundingBox.X; + aValue = xSet->getPropertyValue ("BorderTop"); + aValue >>= aBoundingBox.Y; + + aValue = xSet->getPropertyValue ("Width"); + aValue >>= aBoundingBox.Width; + aValue = xSet->getPropertyValue ("Height"); + aValue >>= aBoundingBox.Height; + } + + // Transform coordinates from internal to pixel. + ::Size aPixelSize = maShapeTreeInfo.GetViewForwarder()->LogicToPixel ( + ::Size (aBoundingBox.Width, aBoundingBox.Height)); + ::Point aPixelPosition = maShapeTreeInfo.GetViewForwarder()->LogicToPixel ( + ::Point (aBoundingBox.X, aBoundingBox.Y)); + + // Clip the shape's bounding box with the bounding box of its parent. + Reference xParentComponent ( + getAccessibleParent(), uno::UNO_QUERY); + if (xParentComponent.is()) + { + // Make the coordinates relative to the parent. + awt::Point aParentLocation (xParentComponent->getLocationOnScreen()); + int x = aPixelPosition.getX() - aParentLocation.X; + int y = aPixelPosition.getY() - aParentLocation.Y; + + // Clip with parent (with coordinates relative to itself). + ::tools::Rectangle aBBox ( + x, y, x + aPixelSize.getWidth(), y + aPixelSize.getHeight()); + awt::Size aParentSize (xParentComponent->getSize()); + ::tools::Rectangle aParentBBox (0,0, aParentSize.Width, aParentSize.Height); + aBBox = aBBox.GetIntersection (aParentBBox); + aBoundingBox = awt::Rectangle ( + aBBox.Left(), + aBBox.Top(), + aBBox.getOpenWidth(), + aBBox.getOpenHeight()); + } + else + aBoundingBox = awt::Rectangle ( + aPixelPosition.getX(), aPixelPosition.getY(), + aPixelSize.getWidth(), aPixelSize.getHeight()); + } + + return aBoundingBox; +} + +sal_Int32 SAL_CALL AccessiblePageShape::getForeground() +{ + ThrowIfDisposed (); + sal_Int32 nColor (0x0ffffffL); + + try + { + uno::Reference aSet (mxPage, uno::UNO_QUERY); + if (aSet.is()) + { + uno::Any aColor = aSet->getPropertyValue ("LineColor"); + aColor >>= nColor; + } + } + catch (const css::beans::UnknownPropertyException&) + { + // Ignore exception and return default color. + } + return nColor; +} + +/** Extract the background color from the Background property of the + draw page or its master page. +*/ +sal_Int32 SAL_CALL AccessiblePageShape::getBackground() +{ + ThrowIfDisposed (); + sal_Int32 nColor (0x01020ffL); + + try + { + uno::Reference xSet (mxPage, uno::UNO_QUERY); + if (xSet.is()) + { + uno::Any aBGSet = xSet->getPropertyValue ("Background"); + Reference xBGSet (aBGSet, uno::UNO_QUERY); + if ( ! xBGSet.is()) + { + // Draw page has no Background property. Try the master + // page instead. + Reference xTarget (mxPage, uno::UNO_QUERY); + if (xTarget.is()) + { + xSet.set(xTarget->getMasterPage(), uno::UNO_QUERY); + aBGSet = xSet->getPropertyValue ("Background"); + xBGSet.set(aBGSet, uno::UNO_QUERY); + } + } + // Fetch the fill color. Has to be extended to cope with + // gradients, hashes, and bitmaps. + if (xBGSet.is()) + { + uno::Any aColor = xBGSet->getPropertyValue ("FillColor"); + aColor >>= nColor; + } + else + SAL_WARN("sd", "no Background property in page"); + } + } + catch (const css::beans::UnknownPropertyException&) + { + TOOLS_WARN_EXCEPTION("sd", "caught exception due to unknown property"); + // Ignore exception and return default color. + } + return nColor; +} + +// XServiceInfo + +OUString SAL_CALL + AccessiblePageShape::getImplementationName() +{ + ThrowIfDisposed (); + return "AccessiblePageShape"; +} + +css::uno::Sequence< OUString> SAL_CALL + AccessiblePageShape::getSupportedServiceNames() +{ + ThrowIfDisposed (); + return AccessibleShape::getSupportedServiceNames(); +} + +//===== XComponent ========================================================== + +void AccessiblePageShape::dispose() +{ + // Cleanup. + mxShape = nullptr; + + // Call base classes. + AccessibleContextBase::dispose (); +} + +//===== protected internal ================================================== + +OUString + AccessiblePageShape::CreateAccessibleBaseName() +{ + return "PageShape"; +} + +OUString + AccessiblePageShape::CreateAccessibleName() +{ + Reference xPageProperties (mxPage, UNO_QUERY); + + // Get name of the current slide. + OUString sCurrentSlideName; + try + { + if (xPageProperties.is()) + { + xPageProperties->getPropertyValue( "LinkDisplayName" ) >>= sCurrentSlideName; + } + } + catch (const beans::UnknownPropertyException&) + { + } + + return CreateAccessibleBaseName()+": "+sCurrentSlideName; +} + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx b/sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx new file mode 100644 index 0000000000..a8c37fa892 --- /dev/null +++ b/sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; + +namespace accessibility +{ +//===== internal ============================================================ + +AccessiblePresentationGraphicShape::AccessiblePresentationGraphicShape( + const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo) + : AccessibleGraphicShape(rShapeInfo, rShapeTreeInfo) +{ +} + +AccessiblePresentationGraphicShape::~AccessiblePresentationGraphicShape() {} + +// XServiceInfo + +OUString SAL_CALL AccessiblePresentationGraphicShape::getImplementationName() +{ + return "AccessiblePresentationGraphicShape"; +} + +/// Set this object's name if is different to the current name. +OUString AccessiblePresentationGraphicShape::CreateAccessibleBaseName() +{ + OUString sName; + + ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape); + switch (nShapeType) + { + case PRESENTATION_GRAPHIC_OBJECT: + sName = "ImpressGraphicObject"; + break; + default: + sName = "UnknownAccessibleImpressShape"; + if (mxShape.is()) + sName += ": " + mxShape->getShapeType(); + } + + return sName; +} + +sal_Int16 SAL_CALL AccessiblePresentationGraphicShape::getAccessibleRole() +{ + return AccessibleRole::GRAPHIC; +} +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx b/sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx new file mode 100644 index 0000000000..411d04af15 --- /dev/null +++ b/sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; + +namespace accessibility +{ +//===== internal ============================================================ + +AccessiblePresentationOLEShape::AccessiblePresentationOLEShape( + const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo) + : AccessibleOLEShape(rShapeInfo, rShapeTreeInfo) +{ +} + +AccessiblePresentationOLEShape::~AccessiblePresentationOLEShape() {} + +// XServiceInfo + +OUString SAL_CALL AccessiblePresentationOLEShape::getImplementationName() +{ + return "AccessiblePresentationOLEShape"; +} + +/// Set this object's name if it is different to the current name. +OUString AccessiblePresentationOLEShape::CreateAccessibleBaseName() +{ + OUString sName; + + ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape); + switch (nShapeType) + { + case PRESENTATION_OLE: + sName = "ImpressOLE"; + break; + case PRESENTATION_CHART: + sName = "ImpressChart"; + break; + case PRESENTATION_TABLE: + sName = "ImpressTable"; + break; + default: + sName = "UnknownAccessibleImpressOLEShape"; + if (mxShape.is()) + sName += ": " + mxShape->getShapeType(); + } + + return sName; +} + +// Return this object's role. +sal_Int16 SAL_CALL AccessiblePresentationOLEShape::getAccessibleRole() +{ + return AccessibleRole::EMBEDDED_OBJECT; +} + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessiblePresentationShape.cxx b/sd/source/ui/accessibility/AccessiblePresentationShape.cxx new file mode 100644 index 0000000000..e4afe7e9a2 --- /dev/null +++ b/sd/source/ui/accessibility/AccessiblePresentationShape.cxx @@ -0,0 +1,146 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; + +namespace accessibility +{ +//===== internal ============================================================ + +AccessiblePresentationShape::AccessiblePresentationShape( + const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo) + : AccessibleShape(rShapeInfo, rShapeTreeInfo) +{ +} + +AccessiblePresentationShape::~AccessiblePresentationShape() {} + +// XServiceInfo + +OUString SAL_CALL AccessiblePresentationShape::getImplementationName() +{ + return "AccessiblePresentationShape"; +} + +/// Set this object's name if is different to the current name. +OUString AccessiblePresentationShape::CreateAccessibleBaseName() +{ + OUString sName; + + ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape); + switch (nShapeType) + { + case PRESENTATION_TITLE: + sName = SdResId(SID_SD_A11Y_P_TITLE_N); + break; + case PRESENTATION_OUTLINER: + sName = SdResId(SID_SD_A11Y_P_OUTLINER_N); + break; + case PRESENTATION_SUBTITLE: + sName = SdResId(SID_SD_A11Y_P_SUBTITLE_N); + break; + case PRESENTATION_PAGE: + sName = SdResId(SID_SD_A11Y_P_PAGE_N); + break; + case PRESENTATION_NOTES: + sName = SdResId(SID_SD_A11Y_P_NOTES_N); + break; + case PRESENTATION_HANDOUT: + sName = SdResId(SID_SD_A11Y_P_HANDOUT_N); + break; + case PRESENTATION_HEADER: + sName = SdResId(SID_SD_A11Y_P_HEADER_N); + break; + case PRESENTATION_FOOTER: + sName = SdResId(SID_SD_A11Y_P_FOOTER_N); + break; + case PRESENTATION_DATETIME: + sName = SdResId(SID_SD_A11Y_P_DATE_N); + break; + case PRESENTATION_PAGENUMBER: + sName = SdResId(SID_SD_A11Y_P_NUMBER_N); + break; + default: + sName = SdResId(SID_SD_A11Y_P_UNKNOWN_N); + if (mxShape.is()) + sName += ": " + mxShape->getShapeType(); + } + + return sName; +} + +OUString AccessiblePresentationShape::GetStyle() const +{ + OUString sName; + + ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape); + switch (nShapeType) + { + case PRESENTATION_TITLE: + sName = SdResId(SID_SD_A11Y_P_TITLE_N_STYLE); + break; + case PRESENTATION_OUTLINER: + sName = SdResId(SID_SD_A11Y_P_OUTLINER_N_STYLE); + break; + case PRESENTATION_SUBTITLE: + sName = SdResId(SID_SD_A11Y_P_SUBTITLE_N_STYLE); + break; + case PRESENTATION_PAGE: + sName = SdResId(SID_SD_A11Y_P_PAGE_N_STYLE); + break; + case PRESENTATION_NOTES: + sName = SdResId(SID_SD_A11Y_P_NOTES_N_STYLE); + break; + case PRESENTATION_HANDOUT: + sName = SdResId(SID_SD_A11Y_P_HANDOUT_N_STYLE); + break; + case PRESENTATION_FOOTER: + sName = SdResId(SID_SD_A11Y_P_FOOTER_N_STYLE); + break; + case PRESENTATION_HEADER: + sName = SdResId(SID_SD_A11Y_P_HEADER_N_STYLE); + break; + case PRESENTATION_DATETIME: + sName = SdResId(SID_SD_A11Y_P_DATE_N_STYLE); + break; + case PRESENTATION_PAGENUMBER: + sName = SdResId(SID_SD_A11Y_P_NUMBER_N_STYLE); + break; + default: + sName = SdResId(SID_SD_A11Y_P_UNKNOWN_N_STYLE); + if (mxShape.is()) + sName += ": " + mxShape->getShapeType(); + } + + return sName; +} +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx b/sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx new file mode 100644 index 0000000000..c22077fe42 --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx @@ -0,0 +1,428 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::accessibility; + +namespace accessibility { + +AccessibleSlideSorterObject::AccessibleSlideSorterObject( + const Reference& rxParent, + ::sd::slidesorter::SlideSorter& rSlideSorter, + sal_uInt16 nPageNumber) + : mxParent(rxParent), + mnPageNumber(nPageNumber), + mrSlideSorter(rSlideSorter), + mnClientId(0) +{ +} + +AccessibleSlideSorterObject::~AccessibleSlideSorterObject() +{ + if ( ! IsDisposed()) + dispose(); +} + +void AccessibleSlideSorterObject::FireAccessibleEvent ( + short nEventId, + const uno::Any& rOldValue, + const uno::Any& rNewValue) +{ + if (mnClientId != 0) + { + AccessibleEventObject aEventObject; + + aEventObject.Source = Reference(this); + aEventObject.EventId = nEventId; + aEventObject.NewValue = rNewValue; + aEventObject.OldValue = rOldValue; + + comphelper::AccessibleEventNotifier::addEvent(mnClientId, aEventObject); + } +} + +void AccessibleSlideSorterObject::disposing(std::unique_lock&) +{ + // Send a disposing to all listeners. + if (mnClientId != 0) + { + comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing(mnClientId, *this); + mnClientId = 0; + } +} + +//===== XAccessible =========================================================== + +Reference SAL_CALL + AccessibleSlideSorterObject::getAccessibleContext() +{ + ThrowIfDisposed(); + return this; +} + +//===== XAccessibleContext ==================================================== + +sal_Int64 SAL_CALL AccessibleSlideSorterObject::getAccessibleChildCount() +{ + ThrowIfDisposed(); + return 0; +} + +Reference SAL_CALL AccessibleSlideSorterObject::getAccessibleChild (sal_Int64 ) +{ + ThrowIfDisposed(); + throw lang::IndexOutOfBoundsException(); +} + +Reference SAL_CALL AccessibleSlideSorterObject::getAccessibleParent() +{ + ThrowIfDisposed(); + return mxParent; +} + +sal_Int64 SAL_CALL AccessibleSlideSorterObject::getAccessibleIndexInParent() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + sal_Int64 nIndexInParent(-1); + + if (mxParent.is()) + { + Reference xParentContext (mxParent->getAccessibleContext()); + if (xParentContext.is()) + { + sal_Int64 nChildCount (xParentContext->getAccessibleChildCount()); + for (sal_Int64 i=0; igetAccessibleChild(i).get() + == static_cast(this)) + { + nIndexInParent = i; + break; + } + } + } + + return nIndexInParent; +} + +sal_Int16 SAL_CALL AccessibleSlideSorterObject::getAccessibleRole() +{ + ThrowIfDisposed(); + return AccessibleRole::SHAPE; +} + +OUString SAL_CALL AccessibleSlideSorterObject::getAccessibleDescription() +{ + ThrowIfDisposed(); + return SdResId(STR_PAGE); +} + +OUString SAL_CALL AccessibleSlideSorterObject::getAccessibleName() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + + SdPage* pPage = GetPage(); + if (pPage != nullptr) + return pPage->GetName(); + else + return OUString(); +} + +Reference SAL_CALL + AccessibleSlideSorterObject::getAccessibleRelationSet() +{ + ThrowIfDisposed(); + return Reference(); +} + +sal_Int64 SAL_CALL + AccessibleSlideSorterObject::getAccessibleStateSet() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + sal_Int64 nStateSet = 0; + + if (mxParent.is()) + { + // Unconditional states. + nStateSet |= AccessibleStateType::SELECTABLE; + nStateSet |= AccessibleStateType::FOCUSABLE; + nStateSet |= AccessibleStateType::ENABLED; + nStateSet |= AccessibleStateType::VISIBLE; + nStateSet |= AccessibleStateType::SHOWING; + nStateSet |= AccessibleStateType::ACTIVE; + nStateSet |= AccessibleStateType::SENSITIVE; + + // Conditional states. + if (mrSlideSorter.GetController().GetPageSelector().IsPageSelected(mnPageNumber)) + nStateSet |= AccessibleStateType::SELECTED; + if (mrSlideSorter.GetController().GetFocusManager().GetFocusedPageIndex() == mnPageNumber) + if (mrSlideSorter.GetController().GetFocusManager().IsFocusShowing()) + nStateSet |= AccessibleStateType::FOCUSED; + } + + return nStateSet; +} + +lang::Locale SAL_CALL AccessibleSlideSorterObject::getLocale() +{ + ThrowIfDisposed(); + // Delegate request to parent. + if (mxParent.is()) + { + Reference xParentContext (mxParent->getAccessibleContext()); + if (xParentContext.is()) + return xParentContext->getLocale (); + } + + // No locale and no parent. Therefore throw exception to indicate this + // cluelessness. + throw IllegalAccessibleComponentStateException(); +} + +//===== XAccessibleEventBroadcaster =========================================== + +void SAL_CALL AccessibleSlideSorterObject::addAccessibleEventListener( + const Reference& rxListener) +{ + if (!rxListener.is()) + return; + + const std::unique_lock aGuard(m_aMutex); + + if (IsDisposed()) + { + uno::Reference x (static_cast(this), uno::UNO_QUERY); + rxListener->disposing (lang::EventObject (x)); + } + else + { + if (mnClientId == 0) + mnClientId = comphelper::AccessibleEventNotifier::registerClient(); + comphelper::AccessibleEventNotifier::addEventListener(mnClientId, rxListener); + } +} + +void SAL_CALL AccessibleSlideSorterObject::removeAccessibleEventListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + if (!(rxListener.is() && mnClientId)) + return; + + const std::unique_lock aGuard(m_aMutex); + + sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, rxListener ); + if ( !nListenerCount ) + { + // no listeners anymore + // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client), + // and at least to us not firing any events anymore, in case somebody calls + // NotifyAccessibleEvent, again + comphelper::AccessibleEventNotifier::revokeClient( mnClientId ); + mnClientId = 0; + } +} + +//===== XAccessibleComponent ================================================== + +sal_Bool SAL_CALL AccessibleSlideSorterObject::containsPoint(const awt::Point& aPoint) +{ + ThrowIfDisposed(); + const awt::Size aSize (getSize()); + return (aPoint.X >= 0) + && (aPoint.X < aSize.Width) + && (aPoint.Y >= 0) + && (aPoint.Y < aSize.Height); +} + +Reference SAL_CALL + AccessibleSlideSorterObject::getAccessibleAtPoint(const awt::Point& ) +{ + return nullptr; +} + +awt::Rectangle SAL_CALL AccessibleSlideSorterObject::getBounds() +{ + ThrowIfDisposed (); + + const SolarMutexGuard aSolarGuard; + + ::tools::Rectangle aBBox ( + mrSlideSorter.GetView().GetLayouter().GetPageObjectLayouter()->GetBoundingBox( + mrSlideSorter.GetModel().GetPageDescriptor(mnPageNumber), + ::sd::slidesorter::view::PageObjectLayouter::Part::PageObject, + ::sd::slidesorter::view::PageObjectLayouter::WindowCoordinateSystem)); + + if (mxParent.is()) + { + Reference xParentComponent(mxParent->getAccessibleContext(), UNO_QUERY); + if (xParentComponent.is()) + { + awt::Rectangle aParentBBox (xParentComponent->getBounds()); + aBBox.Intersection(::tools::Rectangle( + aParentBBox.X, + aParentBBox.Y, + aParentBBox.Width, + aParentBBox.Height)); + } + } + + return awt::Rectangle( + aBBox.Left(), + aBBox.Top(), + aBBox.GetWidth(), + aBBox.GetHeight()); +} + +awt::Point SAL_CALL AccessibleSlideSorterObject::getLocation () +{ + ThrowIfDisposed (); + const awt::Rectangle aBBox (getBounds()); + return awt::Point(aBBox.X, aBBox.Y); +} + +awt::Point SAL_CALL AccessibleSlideSorterObject::getLocationOnScreen() +{ + ThrowIfDisposed (); + + const SolarMutexGuard aSolarGuard; + + awt::Point aLocation (getLocation()); + + if (mxParent.is()) + { + Reference xParentComponent(mxParent->getAccessibleContext(),UNO_QUERY); + if (xParentComponent.is()) + { + const awt::Point aParentLocationOnScreen(xParentComponent->getLocationOnScreen()); + aLocation.X += aParentLocationOnScreen.X; + aLocation.Y += aParentLocationOnScreen.Y; + } + } + + return aLocation; +} + +awt::Size SAL_CALL AccessibleSlideSorterObject::getSize() +{ + ThrowIfDisposed (); + const awt::Rectangle aBBox (getBounds()); + return awt::Size(aBBox.Width,aBBox.Height); +} + +void SAL_CALL AccessibleSlideSorterObject::grabFocus() +{ + // nothing to do +} + +sal_Int32 SAL_CALL AccessibleSlideSorterObject::getForeground() +{ + ThrowIfDisposed (); + svtools::ColorConfig aColorConfig; + Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; + return static_cast(nColor); +} + +sal_Int32 SAL_CALL AccessibleSlideSorterObject::getBackground() +{ + ThrowIfDisposed (); + Color nColor = Application::GetSettings().GetStyleSettings().GetWindowColor(); + return sal_Int32(nColor); +} + +// XServiceInfo +OUString SAL_CALL + AccessibleSlideSorterObject::getImplementationName() +{ + return "AccessibleSlideSorterObject"; +} + +sal_Bool SAL_CALL AccessibleSlideSorterObject::supportsService (const OUString& sServiceName) +{ + return cppu::supportsService(this, sServiceName); +} + +uno::Sequence< OUString> SAL_CALL + AccessibleSlideSorterObject::getSupportedServiceNames() +{ + ThrowIfDisposed (); + + return uno::Sequence { + OUString("com.sun.star.accessibility.Accessible"), + OUString("com.sun.star.accessibility.AccessibleContext") + }; +} + +void AccessibleSlideSorterObject::ThrowIfDisposed() +{ + if (m_bDisposed) + { + SAL_WARN("sd", "Calling disposed object. Throwing exception:"); + throw lang::DisposedException ("object has been already disposed", + static_cast(this)); + } +} + +bool AccessibleSlideSorterObject::IsDisposed() const +{ + return m_bDisposed; +} + +SdPage* AccessibleSlideSorterObject::GetPage() const +{ + ::sd::slidesorter::model::SharedPageDescriptor pDescriptor( + mrSlideSorter.GetModel().GetPageDescriptor(mnPageNumber)); + if (pDescriptor) + return pDescriptor->GetPage(); + else + return nullptr; +} + +} // end of namespace ::accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx b/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx new file mode 100644 index 0000000000..7ab8b0d033 --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx @@ -0,0 +1,962 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::accessibility; + +namespace accessibility { + +/** Inner implementation class of the AccessibleSlideSorterView. + + Note that some event broadcasting is done asynchronously because + otherwise it could lead to deadlocks on (at least) some Solaris + machines. Probably (but unverified) this can happen on all GTK based + systems. The asynchronous broadcasting is just a workaround for a + poorly understood problem. +*/ +class AccessibleSlideSorterView::Implementation + : public SfxListener +{ +public: + Implementation ( + AccessibleSlideSorterView& rAccessibleSlideSorter, + ::sd::slidesorter::SlideSorter& rSlideSorter, + vcl::Window* pWindow); + virtual ~Implementation() override; + + void RequestUpdateChildren(); + void Clear(); + sal_Int32 GetVisibleChildCount() const; + AccessibleSlideSorterObject* GetAccessibleChild (sal_Int32 nIndex); + AccessibleSlideSorterObject* GetVisibleChild (sal_Int32 nIndex); + + void ConnectListeners(); + void ReleaseListeners(); + void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override; + DECL_LINK(WindowEventListener, VclWindowEvent&, void); + DECL_LINK(SelectionChangeListener, LinkParamNone*, void); + DECL_LINK(BroadcastSelectionChange, void*, void); + DECL_LINK(FocusChangeListener, LinkParamNone*, void); + DECL_LINK(VisibilityChangeListener, LinkParamNone*, void); + DECL_LINK(UpdateChildrenCallback, void*, void); + + void Activated(); +private: + AccessibleSlideSorterView& mrAccessibleSlideSorter; + ::sd::slidesorter::SlideSorter& mrSlideSorter; + typedef ::std::vector > PageObjectList; + PageObjectList maPageObjects; + sal_Int32 mnFirstVisibleChild; + sal_Int32 mnLastVisibleChild; + bool mbListeningToDocument; + VclPtr mpWindow; + sal_Int32 mnFocusedIndex; + bool mbModelChangeLocked; + ImplSVEvent * mnUpdateChildrenUserEventId; + ImplSVEvent * mnSelectionChangeUserEventId; + + void UpdateChildren(); +}; + +//===== AccessibleSlideSorterView ============================================= + +AccessibleSlideSorterView::AccessibleSlideSorterView( + ::sd::slidesorter::SlideSorter& rSlideSorter, + vcl::Window* pContentWindow) + : AccessibleSlideSorterViewBase(m_aMutex), + mrSlideSorter(rSlideSorter), + mnClientId(0), + mpContentWindow(pContentWindow) +{ +} + +void AccessibleSlideSorterView::Init() +{ + mpImpl.reset(new Implementation(*this,mrSlideSorter,mpContentWindow)); +} + +AccessibleSlideSorterView::~AccessibleSlideSorterView() +{ + Destroyed (); +} + +void AccessibleSlideSorterView::FireAccessibleEvent ( + short nEventId, + const uno::Any& rOldValue, + const uno::Any& rNewValue ) +{ + if (mnClientId != 0) + { + AccessibleEventObject aEventObject; + + aEventObject.Source = Reference(this); + aEventObject.EventId = nEventId; + aEventObject.NewValue = rNewValue; + aEventObject.OldValue = rOldValue; + aEventObject.IndexHint = -1; + + comphelper::AccessibleEventNotifier::addEvent (mnClientId, aEventObject); + } +} + +void SAL_CALL AccessibleSlideSorterView::disposing() +{ + if (mnClientId != 0) + { + comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this ); + mnClientId = 0; + } + mpImpl.reset(); +} + +AccessibleSlideSorterObject* AccessibleSlideSorterView::GetAccessibleChildImplementation ( + sal_Int32 nIndex) +{ + AccessibleSlideSorterObject* pResult = nullptr; + ::osl::MutexGuard aGuard (m_aMutex); + + if (nIndex>=0 && nIndexGetVisibleChildCount()) + pResult = mpImpl->GetVisibleChild(nIndex); + + return pResult; +} + +void AccessibleSlideSorterView::Destroyed() +{ + ::osl::MutexGuard aGuard (m_aMutex); + + // Send a disposing to all listeners. + if (mnClientId != 0) + { + comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this ); + mnClientId = 0; + } +} + +//===== XAccessible ========================================================= + +Reference SAL_CALL + AccessibleSlideSorterView::getAccessibleContext() +{ + ThrowIfDisposed (); + return this; +} + +//===== XAccessibleContext ================================================== + +sal_Int64 SAL_CALL AccessibleSlideSorterView::getAccessibleChildCount() +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (m_aMutex); + return mpImpl->GetVisibleChildCount(); +} + +Reference SAL_CALL + AccessibleSlideSorterView::getAccessibleChild (sal_Int64 nIndex) +{ + ThrowIfDisposed(); + ::osl::MutexGuard aGuard (m_aMutex); + + if (nIndex<0 || nIndex>=mpImpl->GetVisibleChildCount()) + throw lang::IndexOutOfBoundsException(); + + return mpImpl->GetVisibleChild(nIndex); +} + +Reference SAL_CALL AccessibleSlideSorterView::getAccessibleParent() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + Reference xParent; + + if (mpContentWindow != nullptr) + { + vcl::Window* pParent = mpContentWindow->GetAccessibleParentWindow(); + if (pParent != nullptr) + xParent = pParent->GetAccessible(); + } + + return xParent; +} + +sal_Int64 SAL_CALL AccessibleSlideSorterView::getAccessibleIndexInParent() +{ + OSL_ASSERT(getAccessibleParent().is()); + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + sal_Int64 nIndexInParent(-1); + + Reference xParentContext (getAccessibleParent()->getAccessibleContext()); + if (xParentContext.is()) + { + sal_Int64 nChildCount (xParentContext->getAccessibleChildCount()); + for (sal_Int64 i=0; igetAccessibleChild(i).get() + == static_cast(this)) + { + nIndexInParent = i; + break; + } + } + + return nIndexInParent; +} + +sal_Int16 SAL_CALL AccessibleSlideSorterView::getAccessibleRole() +{ + ThrowIfDisposed(); + return AccessibleRole::DOCUMENT; +} + +OUString SAL_CALL AccessibleSlideSorterView::getAccessibleDescription() +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + return SdResId(SID_SD_A11Y_I_SLIDEVIEW_D); +} + +OUString SAL_CALL AccessibleSlideSorterView::getAccessibleName() +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + return SdResId(SID_SD_A11Y_I_SLIDEVIEW_N); +} + +Reference SAL_CALL + AccessibleSlideSorterView::getAccessibleRelationSet() +{ + return Reference(); +} + +sal_Int64 SAL_CALL AccessibleSlideSorterView::getAccessibleStateSet() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + sal_Int64 nStateSet = 0; + + nStateSet |= AccessibleStateType::FOCUSABLE; + nStateSet |= AccessibleStateType::SELECTABLE; + nStateSet |= AccessibleStateType::ENABLED; + nStateSet |= AccessibleStateType::ACTIVE; + nStateSet |= AccessibleStateType::MULTI_SELECTABLE; + nStateSet |= AccessibleStateType::OPAQUE; + if (mpContentWindow!=nullptr) + { + if (mpContentWindow->IsVisible()) + nStateSet |= AccessibleStateType::VISIBLE; + if (mpContentWindow->IsReallyVisible()) + nStateSet |= AccessibleStateType::SHOWING; + } + + return nStateSet; +} + +lang::Locale SAL_CALL AccessibleSlideSorterView::getLocale() +{ + ThrowIfDisposed (); + Reference xParentContext; + Reference xParent (getAccessibleParent()); + if (xParent.is()) + xParentContext = xParent->getAccessibleContext(); + + if (xParentContext.is()) + return xParentContext->getLocale(); + else + // Strange, no parent! Anyway, return the default locale. + return Application::GetSettings().GetLanguageTag().getLocale(); +} + +void SAL_CALL AccessibleSlideSorterView::addAccessibleEventListener( + const Reference& rxListener) +{ + if (!rxListener.is()) + return; + + const osl::MutexGuard aGuard(m_aMutex); + + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + uno::Reference x (static_cast(this), uno::UNO_QUERY); + rxListener->disposing (lang::EventObject (x)); + } + else + { + if ( ! mnClientId) + mnClientId = comphelper::AccessibleEventNotifier::registerClient(); + comphelper::AccessibleEventNotifier::addEventListener(mnClientId, rxListener); + } +} + +void SAL_CALL AccessibleSlideSorterView::removeAccessibleEventListener( + const Reference& rxListener) +{ + ThrowIfDisposed(); + if (!rxListener.is()) + return; + + const osl::MutexGuard aGuard(m_aMutex); + + if (mnClientId == 0) + return; + + sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( + mnClientId, rxListener ); + if ( !nListenerCount ) + { + // no listeners anymore -> revoke ourself. This may lead to + // the notifier thread dying (if we were the last client), + // and at least to us not firing any events anymore, in case + // somebody calls NotifyAccessibleEvent, again + comphelper::AccessibleEventNotifier::revokeClient( mnClientId ); + mnClientId = 0; + } +} + +//===== XAccessibleComponent ================================================== + +sal_Bool SAL_CALL AccessibleSlideSorterView::containsPoint (const awt::Point& aPoint) +{ + ThrowIfDisposed(); + const awt::Rectangle aBBox (getBounds()); + return (aPoint.X >= 0) + && (aPoint.X < aBBox.Width) + && (aPoint.Y >= 0) + && (aPoint.Y < aBBox.Height); +} + +Reference SAL_CALL + AccessibleSlideSorterView::getAccessibleAtPoint (const awt::Point& aPoint) +{ + ThrowIfDisposed(); + Reference xAccessible; + const SolarMutexGuard aSolarGuard; + + const Point aTestPoint (aPoint.X, aPoint.Y); + ::sd::slidesorter::model::SharedPageDescriptor pHitDescriptor ( + mrSlideSorter.GetController().GetPageAt(aTestPoint)); + if (pHitDescriptor) + xAccessible = mpImpl->GetAccessibleChild( + (pHitDescriptor->GetPage()->GetPageNum()-1)/2); + + return xAccessible; +} + +awt::Rectangle SAL_CALL AccessibleSlideSorterView::getBounds() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + awt::Rectangle aBBox; + + if (mpContentWindow != nullptr) + { + const Point aPosition (mpContentWindow->GetPosPixel()); + const Size aSize (mpContentWindow->GetOutputSizePixel()); + + aBBox.X = aPosition.X(); + aBBox.Y = aPosition.Y(); + aBBox.Width = aSize.Width(); + aBBox.Height = aSize.Height(); + } + + return aBBox; +} + +awt::Point SAL_CALL AccessibleSlideSorterView::getLocation() +{ + ThrowIfDisposed(); + awt::Point aLocation; + + if (mpContentWindow != nullptr) + { + const Point aPosition (mpContentWindow->GetPosPixel()); + aLocation.X = aPosition.X(); + aLocation.Y = aPosition.Y(); + } + + return aLocation; +} + +/** Calculate the location on screen from the parent's location on screen + and our own relative location. +*/ +awt::Point SAL_CALL AccessibleSlideSorterView::getLocationOnScreen() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + awt::Point aParentLocationOnScreen; + + Reference xParent (getAccessibleParent()); + if (xParent.is()) + { + Reference xParentComponent ( + xParent->getAccessibleContext(), uno::UNO_QUERY); + if (xParentComponent.is()) + aParentLocationOnScreen = xParentComponent->getLocationOnScreen(); + } + + awt::Point aLocationOnScreen (getLocation()); + aLocationOnScreen.X += aParentLocationOnScreen.X; + aLocationOnScreen.Y += aParentLocationOnScreen.Y; + + return aLocationOnScreen; +} + +awt::Size SAL_CALL AccessibleSlideSorterView::getSize() +{ + ThrowIfDisposed(); + awt::Size aSize; + + if (mpContentWindow != nullptr) + { + const Size aOutputSize (mpContentWindow->GetOutputSizePixel()); + aSize.Width = aOutputSize.Width(); + aSize.Height = aOutputSize.Height(); + } + + return aSize; +} + +void SAL_CALL AccessibleSlideSorterView::grabFocus() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + + if (mpContentWindow) + mpContentWindow->GrabFocus(); +} + +sal_Int32 SAL_CALL AccessibleSlideSorterView::getForeground() +{ + ThrowIfDisposed(); + svtools::ColorConfig aColorConfig; + Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; + return static_cast(nColor); +} + +sal_Int32 SAL_CALL AccessibleSlideSorterView::getBackground() +{ + ThrowIfDisposed(); + Color nColor = Application::GetSettings().GetStyleSettings().GetWindowColor(); + return sal_Int32(nColor); +} + +//===== XAccessibleSelection ================================================== + +void SAL_CALL AccessibleSlideSorterView::selectAccessibleChild (sal_Int64 nChildIndex) +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + + if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount()) + throw lang::IndexOutOfBoundsException(); + + AccessibleSlideSorterObject* pChild = mpImpl->GetAccessibleChild(nChildIndex); + if (pChild == nullptr) + throw lang::IndexOutOfBoundsException(); + + mrSlideSorter.GetController().GetPageSelector().SelectPage(pChild->GetPageNumber()); +} + +sal_Bool SAL_CALL AccessibleSlideSorterView::isAccessibleChildSelected (sal_Int64 nChildIndex) +{ + ThrowIfDisposed(); + bool bIsSelected = false; + const SolarMutexGuard aSolarGuard; + + if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount()) + throw lang::IndexOutOfBoundsException(); + + AccessibleSlideSorterObject* pChild = mpImpl->GetAccessibleChild(nChildIndex); + if (pChild == nullptr) + throw lang::IndexOutOfBoundsException(); + + bIsSelected = mrSlideSorter.GetController().GetPageSelector().IsPageSelected( + pChild->GetPageNumber()); + + return bIsSelected; +} + +void SAL_CALL AccessibleSlideSorterView::clearAccessibleSelection() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); +} + +void SAL_CALL AccessibleSlideSorterView::selectAllAccessibleChildren() +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + + mrSlideSorter.GetController().GetPageSelector().SelectAllPages(); +} + +sal_Int64 SAL_CALL AccessibleSlideSorterView::getSelectedAccessibleChildCount() +{ + ThrowIfDisposed (); + const SolarMutexGuard aSolarGuard; + return mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount(); +} + +Reference SAL_CALL + AccessibleSlideSorterView::getSelectedAccessibleChild (sal_Int64 nSelectedChildIndex ) +{ + ThrowIfDisposed (); + const SolarMutexGuard aSolarGuard; + + if (nSelectedChildIndex < 0 || nSelectedChildIndex >= getSelectedAccessibleChildCount()) + throw lang::IndexOutOfBoundsException(); + + Reference xChild; + + ::sd::slidesorter::controller::PageSelector& rSelector ( + mrSlideSorter.GetController().GetPageSelector()); + sal_Int32 nPageCount(rSelector.GetPageCount()); + sal_Int32 nSelectedCount = 0; + for (sal_Int32 i=0; iGetAccessibleChild(i); + break; + } + ++nSelectedCount; + } + + if ( ! xChild.is() ) + throw lang::IndexOutOfBoundsException(); + + return xChild; +} + +void SAL_CALL AccessibleSlideSorterView::deselectAccessibleChild (sal_Int64 nChildIndex) +{ + ThrowIfDisposed(); + const SolarMutexGuard aSolarGuard; + + if (nChildIndex < 0 || nChildIndex >= getAccessibleChildCount()) + throw lang::IndexOutOfBoundsException(); + + AccessibleSlideSorterObject* pChild = mpImpl->GetAccessibleChild(nChildIndex); + if (pChild == nullptr) + throw lang::IndexOutOfBoundsException(); + + mrSlideSorter.GetController().GetPageSelector().DeselectPage(pChild->GetPageNumber()); +} + +// XServiceInfo +OUString SAL_CALL + AccessibleSlideSorterView::getImplementationName() +{ + return "AccessibleSlideSorterView"; +} + +sal_Bool SAL_CALL AccessibleSlideSorterView::supportsService (const OUString& sServiceName) +{ + return cppu::supportsService(this, sServiceName); +} + +uno::Sequence< OUString> SAL_CALL + AccessibleSlideSorterView::getSupportedServiceNames() +{ + ThrowIfDisposed (); + + return uno::Sequence { + OUString("com.sun.star.accessibility.Accessible"), + OUString("com.sun.star.accessibility.AccessibleContext"), + OUString("com.sun.star.drawing.AccessibleSlideSorterView") + }; +} + +void AccessibleSlideSorterView::ThrowIfDisposed() +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + SAL_WARN("sd", "Calling disposed object. Throwing exception:"); + throw lang::DisposedException ("object has been already disposed", + static_cast(this)); + } +} + +//===== AccessibleSlideSorterView::Implementation ============================= + +AccessibleSlideSorterView::Implementation::Implementation ( + AccessibleSlideSorterView& rAccessibleSlideSorter, + ::sd::slidesorter::SlideSorter& rSlideSorter, + vcl::Window* pWindow) + : mrAccessibleSlideSorter(rAccessibleSlideSorter), + mrSlideSorter(rSlideSorter), + mnFirstVisibleChild(0), + mnLastVisibleChild(-1), + mbListeningToDocument(false), + mpWindow(pWindow), + mnFocusedIndex(-1), + mbModelChangeLocked(false), + mnUpdateChildrenUserEventId(nullptr), + mnSelectionChangeUserEventId(nullptr) +{ + ConnectListeners(); + UpdateChildren(); +} + +AccessibleSlideSorterView::Implementation::~Implementation() +{ + if (mnUpdateChildrenUserEventId != nullptr) + Application::RemoveUserEvent(mnUpdateChildrenUserEventId); + if (mnSelectionChangeUserEventId != nullptr) + Application::RemoveUserEvent(mnSelectionChangeUserEventId); + ReleaseListeners(); + Clear(); +} + +void AccessibleSlideSorterView::Implementation::RequestUpdateChildren() +{ + if (mnUpdateChildrenUserEventId == nullptr) + mnUpdateChildrenUserEventId = Application::PostUserEvent( + LINK(this, AccessibleSlideSorterView::Implementation, + UpdateChildrenCallback)); +} + +void AccessibleSlideSorterView::Implementation::UpdateChildren() +{ + //By default, all children should be accessible. So here workaround is to make all children visible. + // MT: This was in UpdateVisibility, which has some similarity, and hg merge automatically has put it here. Correct?! + // In the IA2 CWS, also setting mnFirst/LastVisibleChild was commented out! + mnLastVisibleChild = maPageObjects.size(); + + if (mbModelChangeLocked) + { + // Do nothing right now. When the flag is reset, this method is + // called again. + return; + } + + const Range aRange (mrSlideSorter.GetView().GetVisiblePageRange()); + mnFirstVisibleChild = aRange.Min(); + mnLastVisibleChild = aRange.Max(); + + // Release all children. + Clear(); + + // Create new children for the modified visible range. + maPageObjects.resize(mrSlideSorter.GetModel().GetPageCount()); + + // No Visible children + if (mnFirstVisibleChild == -1 && mnLastVisibleChild == -1) + return; + + for (sal_Int32 nIndex(mnFirstVisibleChild); nIndex<=mnLastVisibleChild; ++nIndex) + GetAccessibleChild(nIndex); +} + +void AccessibleSlideSorterView::Implementation::Clear() +{ + for (auto& rxPageObject : maPageObjects) + if (rxPageObject != nullptr) + { + mrAccessibleSlideSorter.FireAccessibleEvent( + AccessibleEventId::CHILD, + Any(Reference(rxPageObject)), + Any()); + + Reference xComponent (Reference(rxPageObject), UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + rxPageObject = nullptr; + } + maPageObjects.clear(); +} + +sal_Int32 AccessibleSlideSorterView::Implementation::GetVisibleChildCount() const +{ + if (mnFirstVisibleChild<=mnLastVisibleChild && mnFirstVisibleChild>=0) + return mnLastVisibleChild - mnFirstVisibleChild + 1; + else + return 0; +} + +AccessibleSlideSorterObject* AccessibleSlideSorterView::Implementation::GetVisibleChild ( + sal_Int32 nIndex) +{ + assert(nIndex>=0 && nIndex=0 && o3tl::make_unsigned(nIndex)GetPage()->GetPageNum()-1)/2); + + mrAccessibleSlideSorter.FireAccessibleEvent( + AccessibleEventId::CHILD, + Any(), + Any(Reference(maPageObjects[nIndex]))); + } + + } + + pChild = maPageObjects[nIndex].get(); + } + else + { + OSL_ASSERT(nIndex>=0 && o3tl::make_unsigned(nIndex)AddEventListener( + LINK(this,AccessibleSlideSorterView::Implementation,WindowEventListener)); + + mrSlideSorter.GetController().GetSelectionManager()->AddSelectionChangeListener( + LINK(this,AccessibleSlideSorterView::Implementation,SelectionChangeListener)); + mrSlideSorter.GetController().GetFocusManager().AddFocusChangeListener( + LINK(this,AccessibleSlideSorterView::Implementation,FocusChangeListener)); + mrSlideSorter.GetView().AddVisibilityChangeListener( + LINK(this,AccessibleSlideSorterView::Implementation,VisibilityChangeListener)); +} + +void AccessibleSlideSorterView::Implementation::ReleaseListeners() +{ + mrSlideSorter.GetController().GetFocusManager().RemoveFocusChangeListener( + LINK(this,AccessibleSlideSorterView::Implementation,FocusChangeListener)); + mrSlideSorter.GetController().GetSelectionManager()->RemoveSelectionChangeListener( + LINK(this,AccessibleSlideSorterView::Implementation,SelectionChangeListener)); + mrSlideSorter.GetView().RemoveVisibilityChangeListener( + LINK(this,AccessibleSlideSorterView::Implementation,VisibilityChangeListener)); + + if (mpWindow != nullptr) + mpWindow->RemoveEventListener( + LINK(this,AccessibleSlideSorterView::Implementation,WindowEventListener)); + + if (mbListeningToDocument) + { + if (mrSlideSorter.GetViewShell() != nullptr && !IsListening(*mrSlideSorter.GetViewShell())) + { // ??? is it even possible that ConnectListeners is called with no + // view shell and this one with a view shell? + StartListening(*mrSlideSorter.GetViewShell()); + } + EndListening (*mrSlideSorter.GetModel().GetDocument()); + mbListeningToDocument = false; + } +} + +void AccessibleSlideSorterView::Implementation::Notify ( + SfxBroadcaster&, + const SfxHint& rHint) +{ + if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint) + { + const SdrHint* pSdrHint = static_cast(&rHint); + switch (pSdrHint->GetKind()) + { + case SdrHintKind::PageOrderChange: + RequestUpdateChildren(); + break; + default: + break; + } + } + else if (auto pViewShellHint = dynamic_cast(&rHint)) + { + switch (pViewShellHint->GetHintId()) + { + case sd::ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START: + mbModelChangeLocked = true; + break; + + case sd::ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END: + mbModelChangeLocked = false; + RequestUpdateChildren(); + break; + default: + break; + } + } +} + +void AccessibleSlideSorterView::SwitchViewActivated() +{ + // Firstly, set focus to view + FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, + Any(), + Any(AccessibleStateType::FOCUSED)); + + mpImpl->Activated(); +} + +void AccessibleSlideSorterView::Implementation::Activated() +{ + mrSlideSorter.GetController().GetFocusManager().ShowFocus(); + +} + +IMPL_LINK(AccessibleSlideSorterView::Implementation, WindowEventListener, VclWindowEvent&, rEvent, void) +{ + switch (rEvent.GetId()) + { + case VclEventId::WindowMove: + case VclEventId::WindowResize: + RequestUpdateChildren(); + break; + + case VclEventId::WindowGetFocus: + case VclEventId::WindowLoseFocus: + mrAccessibleSlideSorter.FireAccessibleEvent( + AccessibleEventId::SELECTION_CHANGED, + Any(), + Any()); + break; + default: + break; + } +} + +IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, SelectionChangeListener, LinkParamNone*, void) +{ + if (mnSelectionChangeUserEventId == nullptr) + mnSelectionChangeUserEventId = Application::PostUserEvent( + LINK(this, AccessibleSlideSorterView::Implementation, BroadcastSelectionChange)); +} + +IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, BroadcastSelectionChange, void*, void) +{ + mnSelectionChangeUserEventId = nullptr; + mrAccessibleSlideSorter.FireAccessibleEvent( + AccessibleEventId::SELECTION_CHANGED, + Any(), + Any()); +} + +IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, FocusChangeListener, LinkParamNone*, void) +{ + sal_Int32 nNewFocusedIndex ( + mrSlideSorter.GetController().GetFocusManager().GetFocusedPageIndex()); + + bool bHasFocus = mrSlideSorter.GetController().GetFocusManager().IsFocusShowing(); + if (!bHasFocus) + nNewFocusedIndex = -1; + + // add a checker whether the focus event is sent out. Only after sent, the mnFocusedIndex should be updated. + bool bSentFocus = false; + if (nNewFocusedIndex == mnFocusedIndex) + return; + + if (mnFocusedIndex >= 0) + { + AccessibleSlideSorterObject* pObject = GetAccessibleChild(mnFocusedIndex); + if (pObject != nullptr) + { + pObject->FireAccessibleEvent( + AccessibleEventId::STATE_CHANGED, + Any(AccessibleStateType::FOCUSED), + Any()); + bSentFocus = true; + } + } + if (nNewFocusedIndex >= 0) + { + AccessibleSlideSorterObject* pObject = GetAccessibleChild(nNewFocusedIndex); + if (pObject != nullptr) + { + pObject->FireAccessibleEvent( + AccessibleEventId::STATE_CHANGED, + Any(), + Any(AccessibleStateType::FOCUSED)); + bSentFocus = true; + } + } + if (bSentFocus) + mnFocusedIndex = nNewFocusedIndex; +} + +IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, UpdateChildrenCallback, void*, void) +{ + mnUpdateChildrenUserEventId = nullptr; + UpdateChildren(); +} + +IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, VisibilityChangeListener, LinkParamNone*, void) +{ + UpdateChildren(); +} + +} // end of namespace ::accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/AccessibleViewForwarder.cxx b/sd/source/ui/accessibility/AccessibleViewForwarder.cxx new file mode 100644 index 0000000000..d28e69217e --- /dev/null +++ b/sd/source/ui/accessibility/AccessibleViewForwarder.cxx @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +namespace accessibility +{ +/** For the time being, the implementation of this class will not use the + member mrDevice. Instead the device is retrieved from the view + every time it is used. This is necessary because the device has to stay + up-to-date with the current view and the class has to stay compatible. + May change in the future. +*/ + +AccessibleViewForwarder::AccessibleViewForwarder(SdrPaintView* pView, const OutputDevice& rDevice) + : mpView(pView) + , mnWindowId(0) +{ + // Search the output device to determine its id. + for (sal_uInt32 a(0); a < mpView->PaintWindowCount(); a++) + { + SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(a); + OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); + + if (&rOutDev == &rDevice) + { + mnWindowId = static_cast(a); + break; + } + } +} + +AccessibleViewForwarder::~AccessibleViewForwarder() +{ + // empty +} + +::tools::Rectangle AccessibleViewForwarder::GetVisibleArea() const +{ + ::tools::Rectangle aVisibleArea; + + if (static_cast(mnWindowId) < mpView->PaintWindowCount()) + { + SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(static_cast(mnWindowId)); + aVisibleArea = pPaintWindow->GetVisibleArea(); + } + + return aVisibleArea; +} + +/** Transform the given point into pixel coordinates. After the pixel + coordinates of the window origin are added to make the point coordinates + absolute. +*/ +Point AccessibleViewForwarder::LogicToPixel(const Point& rPoint) const +{ + OSL_ASSERT(mpView != nullptr); + if (static_cast(mnWindowId) < mpView->PaintWindowCount()) + { + SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(static_cast(mnWindowId)); + OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); + ::tools::Rectangle aBBox(rOutDev.GetOwnerWindow()->GetWindowExtentsAbsolute()); + return rOutDev.LogicToPixel(rPoint) + aBBox.TopLeft(); + } + else + return Point(); +} + +Size AccessibleViewForwarder::LogicToPixel(const Size& rSize) const +{ + OSL_ASSERT(mpView != nullptr); + if (static_cast(mnWindowId) < mpView->PaintWindowCount()) + { + SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(static_cast(mnWindowId)); + OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); + return rOutDev.LogicToPixel(rSize); + } + else + return Size(); +} + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/accessibility/SdShapeTypes.cxx b/sd/source/ui/accessibility/SdShapeTypes.cxx new file mode 100644 index 0000000000..7fab0961ee --- /dev/null +++ b/sd/source/ui/accessibility/SdShapeTypes.cxx @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +namespace accessibility { + +static rtl::Reference + CreateSdAccessibleShape ( + const AccessibleShapeInfo& rShapeInfo, + const AccessibleShapeTreeInfo& rShapeTreeInfo, + ShapeTypeId nId) +{ + switch (nId) + { + case PRESENTATION_TITLE: + case PRESENTATION_OUTLINER: + case PRESENTATION_SUBTITLE: + case PRESENTATION_PAGE: + case PRESENTATION_NOTES: + case PRESENTATION_HANDOUT: + case PRESENTATION_HEADER: + case PRESENTATION_FOOTER: + case PRESENTATION_DATETIME: + case PRESENTATION_PAGENUMBER: + return new AccessiblePresentationShape (rShapeInfo, rShapeTreeInfo); + + case PRESENTATION_GRAPHIC_OBJECT: + return new AccessiblePresentationGraphicShape (rShapeInfo, rShapeTreeInfo); + + case PRESENTATION_OLE: + case PRESENTATION_CHART: + case PRESENTATION_TABLE: + return new AccessiblePresentationOLEShape (rShapeInfo, rShapeTreeInfo); + + default: + return new AccessibleShape (rShapeInfo, rShapeTreeInfo); + } +} + +void RegisterImpressShapeTypes() +{ + /** List of shape type descriptors corresponding to the + SdShapeTypes enum. + */ + ShapeTypeDescriptor aSdShapeTypeList[] = { + ShapeTypeDescriptor ( + PRESENTATION_OUTLINER, + "com.sun.star.presentation.OutlinerShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_SUBTITLE, + "com.sun.star.presentation.SubtitleShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_GRAPHIC_OBJECT, + "com.sun.star.presentation.GraphicObjectShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_PAGE, + "com.sun.star.presentation.PageShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_OLE, + "com.sun.star.presentation.OLE2Shape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_CHART, + "com.sun.star.presentation.ChartShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_TABLE, + "com.sun.star.presentation.TableShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_NOTES, + "com.sun.star.presentation.NotesShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_TITLE, + "com.sun.star.presentation.TitleTextShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_HANDOUT, + "com.sun.star.presentation.HandoutShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_HEADER, + "com.sun.star.presentation.HeaderShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_FOOTER, + "com.sun.star.presentation.FooterShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_DATETIME, + "com.sun.star.presentation.DateTimeShape", + CreateSdAccessibleShape ), + ShapeTypeDescriptor ( + PRESENTATION_PAGENUMBER, + "com.sun.star.presentation.SlideNumberShape", + CreateSdAccessibleShape ) + }; + + ShapeTypeHandler::Instance().AddShapeTypeList ( + PRESENTATION_PAGENUMBER - PRESENTATION_OUTLINER + 1, + aSdShapeTypeList); +} + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/CustomAnimationDialog.cxx b/sd/source/ui/animations/CustomAnimationDialog.cxx new file mode 100644 index 0000000000..7ed2f45904 --- /dev/null +++ b/sd/source/ui/animations/CustomAnimationDialog.cxx @@ -0,0 +1,2082 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include "CustomAnimationDialog.hxx" +#include +#include "STLPropertySet.hxx" +#include + +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::animations; +using namespace ::com::sun::star::presentation; + +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::drawing::XShape; +using ::com::sun::star::drawing::XDrawPage; +using ::com::sun::star::beans::XPropertySet; + +namespace sd { + +SdPropertySubControl::SdPropertySubControl(weld::Container* pParent) + : mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationfragment.ui", + false, reinterpret_cast(SfxViewShell::Current()))) + , mxContainer(mxBuilder->weld_container("EffectFragment")) + , mpParent(pParent) +{ +} + +SdPropertySubControl::~SdPropertySubControl() +{ + mpParent->move(mxContainer.get(), nullptr); +} + +namespace { + +class SdPresetPropertyBox : public SdPropertySubControl +{ +public: + SdPresetPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const OUString& aPresetId, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& rPresetId ) override; + +private: + std::vector maPropertyValues; + Link maModifyLink; + std::unique_ptr mxControl; + + DECL_LINK(OnSelect, weld::ComboBox&, void); +}; + +} + +SdPresetPropertyBox::SdPresetPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const OUString& aPresetId, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyLink(rModifyHdl) + , mxControl(mxBuilder->weld_combo_box("combo")) +{ + mxControl->connect_changed(LINK(this, SdPresetPropertyBox, OnSelect)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX); + mxControl->show(); + pLabel->set_mnemonic_widget(mxControl.get()); + setValue(rValue, aPresetId); +} + +IMPL_LINK_NOARG(SdPresetPropertyBox, OnSelect, weld::ComboBox&, void) +{ + maModifyLink.Call(nullptr); +} + +void SdPresetPropertyBox::setValue( const Any& rValue, const OUString& rPresetId ) +{ + if (!mxControl) + return; + + mxControl->freeze(); + mxControl->clear(); + maPropertyValues.clear(); + int nPos = -1; + + const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets(); + CustomAnimationPresetPtr pDescriptor = rPresets.getEffectDescriptor( rPresetId ); + if( pDescriptor ) + { + + OUString aPropertyValue; + rValue >>= aPropertyValue; + + std::vector aSubTypes( pDescriptor->getSubTypes() ); + + mxControl->set_sensitive(!aSubTypes.empty()); + + for( const auto& aSubType : aSubTypes ) + { + mxControl->append_text(rPresets.getUINameForProperty(aSubType)); + maPropertyValues.push_back(aSubType); + if (aSubType == aPropertyValue) + nPos = maPropertyValues.size() - 1; + } + } + else + { + mxControl->set_sensitive(false); + } + mxControl->thaw(); + if (nPos != -1) + mxControl->set_active(nPos); +} + +Any SdPresetPropertyBox::getValue() +{ + const int nIndex = mxControl->get_active(); + if (nIndex == -1) + return Any(); + return Any(maPropertyValues[nIndex]); +} + +namespace { + +class SdColorPropertyBox : public SdPropertySubControl +{ +public: + SdColorPropertyBox(weld::Label* pLabel, weld::Container* pParent, weld::Window* pTopLevel, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& rPresetId ) override; + +private: + Link maModifyLink; + std::unique_ptr mxControl; + + DECL_LINK(OnSelect, ColorListBox&, void); +}; + +} + +SdColorPropertyBox::SdColorPropertyBox(weld::Label* pLabel, weld::Container* pParent, weld::Window* pTopLevel, const Any& rValue, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyLink(rModifyHdl) + , mxControl(new ColorListBox(mxBuilder->weld_menu_button("color"), [pTopLevel]{ return pTopLevel; })) +{ + mxControl->SetSelectHdl(LINK(this, SdColorPropertyBox, OnSelect)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX); + pLabel->set_mnemonic_widget(&mxControl->get_widget()); + mxControl->show(); + + Color nColor; + rValue >>= nColor; + mxControl->SelectEntry(nColor); +} + +IMPL_LINK_NOARG(SdColorPropertyBox, OnSelect, ColorListBox&, void) +{ + maModifyLink.Call(nullptr); +} + +void SdColorPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if (mxControl) + { + Color nColor; + rValue >>= nColor; + + mxControl->SetNoSelection(); + mxControl->SelectEntry(nColor); + } +} + +Any SdColorPropertyBox::getValue() +{ + return Any(sal_Int32(mxControl->GetSelectEntryColor().GetRGBColor())); +} + +namespace { + +class SdFontPropertyBox : public SdPropertySubControl +{ +public: + SdFontPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue(const Any& rValue, const OUString& rPresetId) override; + +private: + Link maModifyHdl; + std::unique_ptr mxControl; + + DECL_LINK(ControlSelectHdl, weld::ComboBox&, void); +}; + +} + +SdFontPropertyBox::SdFontPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyHdl(rModifyHdl) + , mxControl(mxBuilder->weld_combo_box("fontname")) +{ + mxControl->connect_changed(LINK(this, SdFontPropertyBox, ControlSelectHdl)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX); + mxControl->show(); + pLabel->set_mnemonic_widget(mxControl.get()); + + const FontList* pFontList = nullptr; + bool bMustDelete = false; + + if (SfxObjectShell* pDocSh = SfxObjectShell::Current()) + { + auto pItem = pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST ); + if (pItem) + pFontList = static_cast(pItem)->GetFontList(); + } + + if (!pFontList) + { + pFontList = new FontList(Application::GetDefaultDevice(), nullptr); + bMustDelete = true; + } + + mxControl->freeze(); + + sal_uInt16 nFontCount = pFontList->GetFontNameCount(); + for (sal_uInt16 i = 0; i < nFontCount; ++i) + { + const FontMetric& rFontMetric = pFontList->GetFontName(i); + mxControl->append_text(rFontMetric.GetFamilyName()); + } + + mxControl->thaw(); + + if( bMustDelete ) + delete pFontList; + + setValue( rValue, OUString() ); +} + +IMPL_LINK_NOARG(SdFontPropertyBox, ControlSelectHdl, weld::ComboBox&, void) +{ + maModifyHdl.Call(nullptr); +} + +void SdFontPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if (mxControl) + { + OUString aFontName; + rValue >>= aFontName; + mxControl->set_entry_text(aFontName); + } +} + +Any SdFontPropertyBox::getValue() +{ + OUString aFontName(mxControl->get_active_text()); + return Any(aFontName); +} + +namespace { + +class SdCharHeightPropertyBox : public SdPropertySubControl +{ +public: + SdCharHeightPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& ) override; + + DECL_LINK(implMenuSelectHdl, const OUString& rIdent, void); + +private: + Link maModifyHdl; + std::unique_ptr mxMetric; + std::unique_ptr mxControl; + + DECL_LINK(EditModifyHdl, weld::MetricSpinButton&, void); +}; + +} + +SdCharHeightPropertyBox::SdCharHeightPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyHdl(rModifyHdl) + , mxMetric(mxBuilder->weld_metric_spin_button("fontsize", FieldUnit::PERCENT)) + , mxControl(mxBuilder->weld_menu_button("fontsizemenu")) +{ + mxMetric->connect_value_changed(LINK(this, SdCharHeightPropertyBox, EditModifyHdl)); + mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX); + mxMetric->show(); + pLabel->set_mnemonic_widget(&mxMetric->get_widget()); + + mxControl->connect_selected(LINK(this, SdCharHeightPropertyBox, implMenuSelectHdl)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX); + mxControl->show(); + + setValue(rValue, OUString()); +} + +IMPL_LINK_NOARG(SdCharHeightPropertyBox, EditModifyHdl, weld::MetricSpinButton&, void) +{ + maModifyHdl.Call(nullptr); +} + +IMPL_LINK(SdCharHeightPropertyBox, implMenuSelectHdl, const OUString&, rIdent, void) +{ + sal_Int32 nValue = rIdent.toInt32(); + mxMetric->set_value(nValue, FieldUnit::PERCENT); + EditModifyHdl(*mxMetric); +} + +void SdCharHeightPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if (mxMetric) + { + double fValue = 0.0; + rValue >>= fValue; + mxMetric->set_value(static_cast<::tools::Long>(fValue * 100.0), FieldUnit::PERCENT); + } +} + +Any SdCharHeightPropertyBox::getValue() +{ + return Any(static_cast(mxMetric->get_value(FieldUnit::PERCENT)) / 100.0); +} + +namespace { + +class SdTransparencyPropertyBox : public SdPropertySubControl +{ +public: + SdTransparencyPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& rPresetId ) override; + + DECL_LINK(implMenuSelectHdl, const OUString&, void); + DECL_LINK(implModifyHdl, weld::MetricSpinButton&, void); + + void updateMenu(); + +private: + Link maModifyHdl; + + std::unique_ptr mxMetric; + std::unique_ptr mxControl; +}; + +} + +SdTransparencyPropertyBox::SdTransparencyPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyHdl(rModifyHdl) + , mxMetric(mxBuilder->weld_metric_spin_button("transparent", FieldUnit::PERCENT)) + , mxControl(mxBuilder->weld_menu_button("transparentmenu")) +{ + for (sal_Int32 i = 25; i < 101; i += 25) + { + OUString aStr(unicode::formatPercent(i, + Application::GetSettings().GetUILanguageTag())); + mxControl->append_item_check(OUString::number(i), aStr); + } + + mxControl->connect_selected(LINK(this, SdTransparencyPropertyBox, implMenuSelectHdl)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX); + mxControl->show(); + + mxMetric->connect_value_changed(LINK(this, SdTransparencyPropertyBox, implModifyHdl)); + mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX); + mxMetric->show(); + pLabel->set_mnemonic_widget(&mxMetric->get_widget()); + + setValue(rValue, OUString()); +} + +void SdTransparencyPropertyBox::updateMenu() +{ + sal_Int64 nValue = mxMetric->get_value(FieldUnit::PERCENT); + for (sal_uInt16 i = 25; i < 101; i += 25) + mxControl->set_item_active(OUString::number(i), nValue == i); +} + +IMPL_LINK_NOARG(SdTransparencyPropertyBox, implModifyHdl, weld::MetricSpinButton&, void) +{ + updateMenu(); + maModifyHdl.Call(nullptr); +} + +IMPL_LINK(SdTransparencyPropertyBox, implMenuSelectHdl, const OUString&, rIdent, void) +{ + auto nValue = rIdent.toInt32(); + if (nValue != mxMetric->get_value(FieldUnit::PERCENT)) + { + mxMetric->set_value(nValue, FieldUnit::PERCENT); + implModifyHdl(*mxMetric); + } +} + +void SdTransparencyPropertyBox::setValue(const Any& rValue, const OUString&) +{ + if (mxMetric) + { + double fValue = 0.0; + rValue >>= fValue; + ::tools::Long nValue = static_cast<::tools::Long>(fValue * 100); + mxMetric->set_value(nValue, FieldUnit::PERCENT); + updateMenu(); + } +} + +Any SdTransparencyPropertyBox::getValue() +{ + return Any(static_cast(mxMetric->get_value(FieldUnit::PERCENT)) / 100.0); +} + +namespace { + +class SdRotationPropertyBox : public SdPropertySubControl +{ +public: + SdRotationPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& ) override; + + DECL_LINK(implMenuSelectHdl, const OUString&, void); + DECL_LINK(implModifyHdl, weld::MetricSpinButton&, void); + + void updateMenu(); + +private: + Link maModifyHdl; + + std::unique_ptr mxMetric; + std::unique_ptr mxControl; +}; + +} + +SdRotationPropertyBox::SdRotationPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyHdl(rModifyHdl) + , mxMetric(mxBuilder->weld_metric_spin_button("rotate", FieldUnit::DEGREE)) + , mxControl(mxBuilder->weld_menu_button("rotatemenu")) +{ + mxMetric->connect_value_changed(LINK( this, SdRotationPropertyBox, implModifyHdl)); + mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX); + mxMetric->show(); + pLabel->set_mnemonic_widget(&mxMetric->get_widget()); + + mxControl->connect_selected(LINK(this, SdRotationPropertyBox, implMenuSelectHdl)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX); + mxControl->show(); + + setValue(rValue, OUString()); +} + +void SdRotationPropertyBox::updateMenu() +{ + sal_Int64 nValue = mxMetric->get_value(FieldUnit::DEGREE); + bool bDirection = nValue >= 0; + nValue = (nValue < 0 ? -nValue : nValue); + + mxControl->set_item_active("90", nValue == 90); + mxControl->set_item_active("180", nValue == 180); + mxControl->set_item_active("360", nValue == 360); + mxControl->set_item_active("720", nValue == 720); + + mxControl->set_item_active("clockwise", bDirection); + mxControl->set_item_active("counterclock", !bDirection); +} + +IMPL_LINK_NOARG(SdRotationPropertyBox, implModifyHdl, weld::MetricSpinButton&, void) +{ + updateMenu(); + maModifyHdl.Call(nullptr); +} + +IMPL_LINK(SdRotationPropertyBox, implMenuSelectHdl, const OUString&, rIdent, void) +{ + auto nValue = mxMetric->get_value(FieldUnit::DEGREE); + bool bDirection = nValue >= 0; + nValue = (nValue < 0 ? -nValue : nValue); + + if (rIdent == "clockwise") + bDirection = true; + else if (rIdent == "counterclock") + bDirection = false; + else + nValue = rIdent.toInt32(); + + if( !bDirection ) + nValue = -nValue; + + if (nValue != mxMetric->get_value(FieldUnit::DEGREE)) + { + mxMetric->set_value(nValue, FieldUnit::DEGREE); + implModifyHdl(*mxMetric); + } +} + +void SdRotationPropertyBox::setValue( const Any& rValue, const OUString& ) +{ + if (mxMetric) + { + double fValue = 0.0; + rValue >>= fValue; + ::tools::Long nValue = static_cast<::tools::Long>(fValue); + mxMetric->set_value(nValue, FieldUnit::DEGREE); + updateMenu(); + } +} + +Any SdRotationPropertyBox::getValue() +{ + return Any(static_cast(mxMetric->get_value(FieldUnit::DEGREE))); +} + +namespace { + +class SdScalePropertyBox : public SdPropertySubControl +{ +public: + SdScalePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& ) override; + + DECL_LINK(implMenuSelectHdl, const OUString&, void); + DECL_LINK(implModifyHdl, weld::MetricSpinButton&, void); + + void updateMenu(); + +private: + Link maModifyHdl; + int mnDirection; + + std::unique_ptr mxMetric; + std::unique_ptr mxControl; +}; + +} + +SdScalePropertyBox::SdScalePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl) + : SdPropertySubControl(pParent) + , maModifyHdl( rModifyHdl ) + , mxMetric(mxBuilder->weld_metric_spin_button("scale", FieldUnit::PERCENT)) + , mxControl(mxBuilder->weld_menu_button("scalemenu")) +{ + mxControl->connect_selected(LINK(this, SdScalePropertyBox, implMenuSelectHdl)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX); + mxControl->show(); + + mxMetric->connect_value_changed(LINK(this, SdScalePropertyBox, implModifyHdl)); + mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX); + mxMetric->show(); + pLabel->set_mnemonic_widget(&mxMetric->get_widget()); + + setValue(rValue, OUString()); +} + +void SdScalePropertyBox::updateMenu() +{ + auto nValue = mxMetric->get_value(FieldUnit::PERCENT); + + mxControl->set_item_active("25scale", nValue == 25); + mxControl->set_item_active("50scale", nValue == 50); + mxControl->set_item_active("150scale", nValue == 150); + mxControl->set_item_active("400scale", nValue == 400); + + mxControl->set_item_active("hori", mnDirection == 1); + mxControl->set_item_active("vert", mnDirection == 2); + mxControl->set_item_active("both", mnDirection == 3); +} + +IMPL_LINK_NOARG(SdScalePropertyBox, implModifyHdl, weld::MetricSpinButton&, void) +{ + updateMenu(); + maModifyHdl.Call(nullptr); +} + +IMPL_LINK(SdScalePropertyBox, implMenuSelectHdl, const OUString&, rIdent, void) +{ + auto nValue = mxMetric->get_value(FieldUnit::PERCENT); + + int nDirection = mnDirection; + + if (rIdent == "hori") + nDirection = 1; + else if (rIdent == "vert") + nDirection = 2; + else if (rIdent == "both") + nDirection = 3; + else + nValue = rIdent.toInt32(); // Getting here indicates a UI bug and should be handled better + + bool bModified = false; + + if( nDirection != mnDirection ) + { + mnDirection = nDirection; + bModified = true; + } + + if (nValue != mxMetric->get_value(FieldUnit::PERCENT)) + { + mxMetric->set_value(nValue, FieldUnit::PERCENT); + bModified = true; + } + + if(bModified) + { + implModifyHdl(*mxMetric); + updateMenu(); + } +} + +void SdScalePropertyBox::setValue(const Any& rValue, const OUString&) +{ + if (!mxMetric) + return; + + ValuePair aValues; + rValue >>= aValues; + + double fValue1 = 0.0; + double fValue2 = 0.0; + + aValues.First >>= fValue1; + aValues.Second >>= fValue2; + + // 'Size' drop down menu set by mnDirection when loading Grow and Shrink Animation + // Shouldn't compare a float directly to zero... should be fixed with delta epsilon compare + // Might be better to just have a flag in the content.xml for this + if( (fValue1 == 0.0) && (fValue2 == 0.0) ) + mnDirection = 3; // assume 'Both' scaling option when both are zero + else if( (fValue1 != 0.0) && (fValue2 == 0.0) ) + mnDirection = 1; + else if( (fValue1 == 0.0) && (fValue2 != 0.0) ) + mnDirection = 2; + else + mnDirection = 3; + + // Grow and Shrink Animation is a relative change with value stored in content.xml under tag + // smil:by=*,* + // An offset of 1 must be added to properly translate from content.xml to UI value displayed + // e.g. if in content.xml smil:by=0.5,0.5 then 1 + (0.5,0.5) = (1.5,1.5) => grow by 150% of the + // size horizontal and vertical + // e.g. if in content.xml smil:by=-0.5,-0.5 then 1 + (-0.5,-0.5) = (0.5,0.5) => shrink by 50% + // of the size horizontal and vertical + fValue1 += 1; + fValue2 += 1; + + // Determine value from file for UI 'Size' field based on determined mnDirection + ::tools::Long nValue; + if( mnDirection == 1 ) + nValue = static_cast<::tools::Long>(fValue1 * 100.0); + else if( mnDirection == 2 ) + nValue = static_cast<::tools::Long>(fValue2 * 100.0); + else if( mnDirection == 3 ){ + if (fValue1 >= fValue2) + nValue = static_cast<::tools::Long>(fValue1 * 100.0); + else + nValue = static_cast<::tools::Long>(fValue2 * 100.0); + } + else + nValue = static_cast<::tools::Long>(100.0); // default to 100% in UI if something goes wrong + + mxMetric->set_value(nValue, FieldUnit::PERCENT); + updateMenu(); +} + +Any SdScalePropertyBox::getValue() +{ + double fValue1 = static_cast(mxMetric->get_value(FieldUnit::PERCENT)) / 100.0; + + // Grow and Shrink Animation is a relative change with value stored in content.xml under tag + // smil:by=*,* + // An offset of 1 must be subtracted to properly translate UI value displayed and save to + // content.xml + // e.g. if UI value is 150% then 1.5 - 1 = 0.5 and is set to smil:by=0.5,0.5 in content.xml + // e.g. if UI value is 50% then 0.5 - 1 = -0.5 and is set to smil:by=-0.5,-0.5 in content.xml + fValue1 -= 1; + + double fValue2 = fValue1; + + // mnDirection set by 'Size' drop down menu and used to zero out either horizontal or vertical + // scaling depending on what option is selected + if( mnDirection == 1 ) + fValue2 = 0.0; + else if( mnDirection == 2 ) + fValue1 = 0.0; + + ValuePair aValues; + aValues.First <<= fValue1; + aValues.Second <<= fValue2; + + return Any( aValues ); +} + +namespace { + +class SdFontStylePropertyBox : public SdPropertySubControl +{ +public: + SdFontStylePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl); + + virtual Any getValue() override; + virtual void setValue( const Any& rValue, const OUString& ) override; + + DECL_LINK(implMenuSelectHdl, const OUString&, void); + + void update(); + +private: + float mfFontWeight; + awt::FontSlant meFontSlant; + sal_Int16 mnFontUnderline; + Link maModifyHdl; + + std::unique_ptr mxEdit; + std::unique_ptr mxControl; +}; + +} + +SdFontStylePropertyBox::SdFontStylePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link& rModifyHdl ) + : SdPropertySubControl(pParent) + , maModifyHdl( rModifyHdl ) + , mxEdit(mxBuilder->weld_entry("entry")) + , mxControl(mxBuilder->weld_menu_button("entrymenu")) +{ + mxEdit->set_text(SdResId(STR_CUSTOMANIMATION_SAMPLE)); + mxEdit->set_help_id(HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX); + pLabel->set_mnemonic_widget(mxEdit.get()); + mxEdit->show(); + + mxControl->connect_selected(LINK(this, SdFontStylePropertyBox, implMenuSelectHdl)); + mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX); + mxControl->show(); + + setValue(rValue, OUString()); +} + +void SdFontStylePropertyBox::update() +{ + // update menu + mxControl->set_item_active("bold", mfFontWeight == awt::FontWeight::BOLD); + mxControl->set_item_active("italic", meFontSlant == awt::FontSlant_ITALIC); + mxControl->set_item_active("underline", mnFontUnderline != awt::FontUnderline::NONE ); + + // update sample edit + vcl::Font aFont(mxEdit->get_font()); + aFont.SetWeight(mfFontWeight == awt::FontWeight::BOLD ? WEIGHT_BOLD : WEIGHT_NORMAL); + aFont.SetItalic(meFontSlant == awt::FontSlant_ITALIC ? ITALIC_NORMAL : ITALIC_NONE); + aFont.SetUnderline(mnFontUnderline == awt::FontUnderline::NONE ? LINESTYLE_NONE : LINESTYLE_SINGLE); + mxEdit->set_font(aFont); +} + +IMPL_LINK(SdFontStylePropertyBox, implMenuSelectHdl, const OUString&, rIdent, void) +{ + if (rIdent == "bold") + { + if( mfFontWeight == awt::FontWeight::BOLD ) + mfFontWeight = awt::FontWeight::NORMAL; + else + mfFontWeight = awt::FontWeight::BOLD; + } + else if (rIdent == "italic") + { + if( meFontSlant == awt::FontSlant_ITALIC ) + meFontSlant = awt::FontSlant_NONE; + else + meFontSlant = awt::FontSlant_ITALIC; + } + else if (rIdent == "underline") + { + if( mnFontUnderline == awt::FontUnderline::SINGLE ) + mnFontUnderline = awt::FontUnderline::NONE; + else + mnFontUnderline = awt::FontUnderline::SINGLE; + } + + update(); + maModifyHdl.Call(nullptr); +} + +void SdFontStylePropertyBox::setValue( const Any& rValue, const OUString& ) +{ + Sequence aValues; + rValue >>= aValues; + + aValues[0] >>= mfFontWeight; + aValues[1] >>= meFontSlant; + aValues[2] >>= mnFontUnderline; + + update(); +} + +Any SdFontStylePropertyBox::getValue() +{ + Sequence aValues{ Any(mfFontWeight), Any(meFontSlant), Any(mnFontUnderline) }; + return Any( aValues ); +} + +class CustomAnimationEffectTabPage +{ +public: + CustomAnimationEffectTabPage(weld::Container* pParent, weld::Window* pDialog, const STLPropertySet* pSet); + + void update( STLPropertySet* pSet ); + DECL_LINK(implSelectHdl, weld::ComboBox&, void); + DECL_LINK(implClickHdl, weld::Button&, void); + void implHdl(const weld::Widget*); + +private: + void updateControlStates(); + void fillSoundListBox(); + void clearSoundListBox(); + sal_Int32 getSoundObject( std::u16string_view rStr ); + void openSoundFileDialog(); + void onSoundPreview(); + weld::Window* GetFrameWeld() const { return mpDialog; } + +private: + ::std::vector< OUString > maSoundList; + bool mbHasText; + const STLPropertySet* mpSet; + css::uno::Reference mxPlayer; + + weld::Window* mpDialog; + std::unique_ptr mxBuilder; + std::unique_ptr mxContainer; + std::unique_ptr mxSettings; + std::unique_ptr mxFTProperty1; + std::unique_ptr mxPlaceholderBox; + std::unique_ptr mxCBSmoothStart; + std::unique_ptr mxCBSmoothEnd; + std::unique_ptr mxFTSound; + std::unique_ptr mxLBSound; + std::unique_ptr mxPBSoundPreview; + std::unique_ptr mxLBAfterEffect; + std::unique_ptr mxFTDimColor; + std::unique_ptr mxCLBDimColor; + std::unique_ptr mxFTTextAnim; + std::unique_ptr mxLBTextAnim; + std::unique_ptr mxMFTextDelay; + std::unique_ptr mxFTTextDelay; + std::unique_ptr mxLBSubControl; +}; + +CustomAnimationEffectTabPage::CustomAnimationEffectTabPage(weld::Container* pParent, weld::Window* pDialog, const STLPropertySet* pSet) + : mbHasText(false) + , mpSet(pSet) + , mpDialog(pDialog) + , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationeffecttab.ui")) + , mxContainer(mxBuilder->weld_container("EffectTab")) + , mxSettings(mxBuilder->weld_widget("settings")) + , mxFTProperty1(mxBuilder->weld_label("prop_label1")) + , mxPlaceholderBox(mxBuilder->weld_container("placeholder")) + , mxCBSmoothStart(mxBuilder->weld_check_button("smooth_start")) + , mxCBSmoothEnd(mxBuilder->weld_check_button("smooth_end")) + , mxFTSound(mxBuilder->weld_label("sound_label")) + , mxLBSound(mxBuilder->weld_combo_box("sound_list")) + , mxPBSoundPreview(mxBuilder->weld_button("sound_preview")) + , mxLBAfterEffect(mxBuilder->weld_combo_box("aeffect_list")) + , mxFTDimColor(mxBuilder->weld_label("dim_color_label")) + , mxCLBDimColor(new ColorListBox(mxBuilder->weld_menu_button("dim_color_list"), [pDialog]{ return pDialog; })) + , mxFTTextAnim(mxBuilder->weld_label("text_animation_label")) + , mxLBTextAnim(mxBuilder->weld_combo_box("text_animation_list")) + , mxMFTextDelay(mxBuilder->weld_metric_spin_button("text_delay", FieldUnit::PERCENT)) + , mxFTTextDelay(mxBuilder->weld_label("text_delay_label")) +{ + mxCLBDimColor->SelectEntry(COL_BLACK); + + // fill the soundbox + fillSoundListBox(); + + mxLBSound->connect_changed(LINK(this, CustomAnimationEffectTabPage, implSelectHdl)); + mxPBSoundPreview->connect_clicked(LINK(this, CustomAnimationEffectTabPage, implClickHdl)); + + // only show settings if all selected effects have the same preset-id + if( pSet->getPropertyState( nHandlePresetId ) != STLPropertyState::Ambiguous ) + { + OUString aPresetId; + pSet->getPropertyValue( nHandlePresetId ) >>= aPresetId; + + // property 1 + + if( pSet->getPropertyState( nHandleProperty1Type ) != STLPropertyState::Ambiguous ) + { + sal_Int32 nType = 0; + pSet->getPropertyValue( nHandleProperty1Type ) >>= nType; + + if( nType != nPropertyTypeNone ) + { + // set ui name for property at fixed text + OUString aPropertyName( getPropertyName( nType ) ); + + if( !aPropertyName.isEmpty() ) + { + mxSettings->show(); + mxFTProperty1->set_label(aPropertyName); + } + + // get property value + const Any aValue( pSet->getPropertyValue( nHandleProperty1Value ) ); + + // create property sub control + mxLBSubControl = SdPropertySubControl::create(nType, mxFTProperty1.get(), mxPlaceholderBox.get(), mpDialog, aValue, aPresetId, Link()); + } + } + + mxFTProperty1->set_sensitive(mxPlaceholderBox->get_sensitive()); + + // accelerate & decelerate + + if( pSet->getPropertyState( nHandleAccelerate ) == STLPropertyState::Direct ) + { + mxCBSmoothStart->show(); + mxCBSmoothEnd->show(); + + double fTemp = 0.0; + pSet->getPropertyValue( nHandleAccelerate ) >>= fTemp; + mxCBSmoothStart->set_active( fTemp > 0.0 ); + + pSet->getPropertyValue( nHandleDecelerate ) >>= fTemp; + mxCBSmoothEnd->set_active( fTemp > 0.0 ); + } + } + + // init after effect controls + + mxLBAfterEffect->connect_changed(LINK(this, CustomAnimationEffectTabPage, implSelectHdl)); + mxLBTextAnim->connect_changed(LINK(this, CustomAnimationEffectTabPage, implSelectHdl)); + + if( (pSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState::Ambiguous) && + (pSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState::Ambiguous) && + (pSet->getPropertyState( nHandleDimColor ) != STLPropertyState::Ambiguous)) + { + bool bHasAfterEffect = false; + pSet->getPropertyValue( nHandleHasAfterEffect ) >>= bHasAfterEffect; + + sal_Int32 nPos = 0; + if( bHasAfterEffect ) + { + nPos++; + + bool bAfterEffectOnNextClick = false; + pSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bAfterEffectOnNextClick; + Any aDimColor( pSet->getPropertyValue( nHandleDimColor ) ); + + if( aDimColor.hasValue() ) + { + Color aColor; + aDimColor >>= aColor; + mxCLBDimColor->SelectEntry(aColor); + } + else + { + nPos++; + if( bAfterEffectOnNextClick ) + nPos++; + } + } + + mxLBAfterEffect->set_active(nPos); + } + + if( pSet->getPropertyState( nHandleHasText ) != STLPropertyState::Ambiguous ) + pSet->getPropertyValue( nHandleHasText ) >>= mbHasText; + + if( mbHasText ) + { + if( pSet->getPropertyState( nHandleIterateType ) != STLPropertyState::Ambiguous) + { + int nPos = -1; + + sal_Int32 nIterateType = 0; + pSet->getPropertyValue( nHandleIterateType ) >>= nIterateType; + switch( nIterateType ) + { + case TextAnimationType::BY_PARAGRAPH: nPos = 0; break; + case TextAnimationType::BY_WORD: nPos = 1; break; + case TextAnimationType::BY_LETTER: nPos = 2; break; + } + + mxLBTextAnim->set_active(nPos); + } + + if( pSet->getPropertyState( nHandleIterateInterval ) != STLPropertyState::Default ) + { + double fIterateInterval = 0.0; + pSet->getPropertyValue( nHandleIterateInterval ) >>= fIterateInterval; + mxMFTextDelay->set_value(static_cast<::tools::Long>(fIterateInterval*10), FieldUnit::NONE); + } + } + else + { + mxFTTextAnim->set_sensitive(false); + mxLBTextAnim->set_sensitive(false); + mxMFTextDelay->set_sensitive(false); + mxFTTextDelay->set_sensitive(false); + + } + + if( pSet->getPropertyState( nHandleSoundURL ) != STLPropertyState::Ambiguous ) + { + sal_Int32 nPos = 0; + + const Any aValue( pSet->getPropertyValue( nHandleSoundURL ) ); + + if( aValue.getValueType() == ::cppu::UnoType::get() ) + { + nPos = 1; + } + else + { + OUString aSoundURL; + aValue >>= aSoundURL; + + if( !aSoundURL.isEmpty() ) + { + sal_uLong i; + for( i = 0; i < maSoundList.size(); i++ ) + { + OUString aString = maSoundList[ i ]; + if( aString == aSoundURL ) + { + nPos = static_cast(i)+2; + break; + } + } + + if( nPos == 0 ) + { + nPos = static_cast(maSoundList.size())+2; + maSoundList.push_back( aSoundURL ); + INetURLObject aURL( aSoundURL ); + mxLBSound->insert_text(nPos, aURL.GetBase()); + } + } + } + + if( nPos != -1) + mxLBSound->set_active(nPos); + } + + updateControlStates(); + +} + +void CustomAnimationEffectTabPage::updateControlStates() +{ + auto nPos = mxLBAfterEffect->get_active(); + mxCLBDimColor->set_sensitive( nPos == 1 ); + mxFTDimColor->set_sensitive( nPos == 1 ); + + if( mbHasText ) + { + nPos = mxLBTextAnim->get_active(); + mxMFTextDelay->set_sensitive( nPos != 0 ); + mxFTTextDelay->set_sensitive( nPos != 0 ); + } + + if (comphelper::LibreOfficeKit::isActive()) + { + mxFTSound->hide(); + mxLBSound->hide(); + mxPBSoundPreview->hide(); + } + else + { + nPos = mxLBSound->get_active(); + mxPBSoundPreview->set_sensitive( nPos >= 2 ); + } + +} + +IMPL_LINK(CustomAnimationEffectTabPage, implClickHdl, weld::Button&, rBtn, void) +{ + implHdl(&rBtn); +} + +IMPL_LINK(CustomAnimationEffectTabPage, implSelectHdl, weld::ComboBox&, rListBox, void) +{ + implHdl(&rListBox); +} + +void CustomAnimationEffectTabPage::implHdl(const weld::Widget* pControl) +{ + if (pControl == mxLBTextAnim.get()) + { + if (mxMFTextDelay->get_value(FieldUnit::NONE) == 0) + mxMFTextDelay->set_value(100, FieldUnit::NONE); + } + else if (pControl == mxLBSound.get()) + { + auto nPos = mxLBSound->get_active(); + if (nPos == (mxLBSound->get_count() - 1)) + { + openSoundFileDialog(); + } + } + else if (pControl == mxPBSoundPreview.get()) + { + onSoundPreview(); + } + + updateControlStates(); +} + +void CustomAnimationEffectTabPage::update( STLPropertySet* pSet ) +{ + if (mxLBSubControl) + { + Any aNewValue(mxLBSubControl->getValue()); + Any aOldValue; + if( mpSet->getPropertyState( nHandleProperty1Value ) != STLPropertyState::Ambiguous) + aOldValue = mpSet->getPropertyValue( nHandleProperty1Value ); + + if( aOldValue != aNewValue ) + pSet->setPropertyValue( nHandleProperty1Value, aNewValue ); + } + + if (mxCBSmoothStart->get_visible()) + { + // set selected value for accelerate if different than in original set + + double fTemp = mxCBSmoothStart->get_active() ? 0.5 : 0.0; + + double fOldTemp = 0.0; + if(mpSet->getPropertyState( nHandleAccelerate ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleAccelerate ) >>= fOldTemp; + else + fOldTemp = -2.0; + + if( fOldTemp != fTemp ) + pSet->setPropertyValue( nHandleAccelerate, Any( fTemp ) ); + + // set selected value for decelerate if different than in original set + fTemp = mxCBSmoothEnd->get_active() ? 0.5 : 0.0; + + if(mpSet->getPropertyState( nHandleDecelerate ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleDecelerate ) >>= fOldTemp; + else + fOldTemp = -2.0; + + if( fOldTemp != fTemp ) + pSet->setPropertyValue( nHandleDecelerate, Any( fTemp ) ); + } + + auto nPos = mxLBAfterEffect->get_active(); + if (nPos != -1) + { + bool bAfterEffect = nPos != 0; + + bool bOldAfterEffect = false; + + if(mpSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleHasAfterEffect ) >>= bOldAfterEffect; + else + bOldAfterEffect = !bAfterEffect; + + if( bOldAfterEffect != bAfterEffect ) + pSet->setPropertyValue( nHandleHasAfterEffect, Any( bAfterEffect ) ); + + Any aDimColor; + if( nPos == 1 ) + { + Color aSelectedColor = mxCLBDimColor->GetSelectEntryColor(); + aDimColor <<= aSelectedColor.GetRGBColor(); + } + + if( (mpSet->getPropertyState( nHandleDimColor ) == STLPropertyState::Ambiguous) || + (mpSet->getPropertyValue( nHandleDimColor ) != aDimColor) ) + pSet->setPropertyValue( nHandleDimColor, aDimColor ); + + bool bAfterEffectOnNextEffect = nPos != 2; + bool bOldAfterEffectOnNextEffect = !bAfterEffectOnNextEffect; + + if( mpSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bOldAfterEffectOnNextEffect; + + if( bAfterEffectOnNextEffect != bOldAfterEffectOnNextEffect ) + pSet->setPropertyValue( nHandleAfterEffectOnNextEffect, Any( bAfterEffectOnNextEffect ) ); + } + + nPos = mxLBTextAnim->get_active(); + if (nPos != -1) + { + sal_Int16 nIterateType; + + switch( nPos ) + { + case 1: nIterateType = TextAnimationType::BY_WORD; break; + case 2: nIterateType = TextAnimationType::BY_LETTER; break; + default: + nIterateType = TextAnimationType::BY_PARAGRAPH; + } + + sal_Int16 nOldIterateType = nIterateType-1; + + if(mpSet->getPropertyState( nHandleIterateType ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleIterateType ) >>= nOldIterateType; + + if( nIterateType != nOldIterateType ) + pSet->setPropertyValue( nHandleIterateType, Any( nIterateType ) ); + } + + { + double fIterateInterval = static_cast(mxMFTextDelay->get_value(FieldUnit::NONE)) / 10; + double fOldIterateInterval = -1.0; + + if( mpSet->getPropertyState( nHandleIterateInterval ) != STLPropertyState::Ambiguous ) + mpSet->getPropertyValue( nHandleIterateInterval ) >>= fOldIterateInterval; + + if( fIterateInterval != fOldIterateInterval ) + pSet->setPropertyValue( nHandleIterateInterval, Any( fIterateInterval ) ); + } + + nPos = mxLBSound->get_active(); + if (nPos == -1) + return; + + Any aNewSoundURL, aOldSoundURL( Any( sal_Int32(0) ) ); + + if( nPos == 0 ) + { + // 0 means no sound, so leave any empty + } + else if( nPos == 1 ) + { + // this means stop sound + aNewSoundURL <<= true; + } + else + { + OUString aSoundURL( maSoundList[ nPos-2 ] ); + aNewSoundURL <<= aSoundURL; + } + + if( mpSet->getPropertyState( nHandleSoundURL ) != STLPropertyState::Ambiguous ) + aOldSoundURL = mpSet->getPropertyValue( nHandleSoundURL ); + + if( aNewSoundURL != aOldSoundURL ) + pSet->setPropertyValue( nHandleSoundURL, aNewSoundURL ); +} + +void CustomAnimationEffectTabPage::fillSoundListBox() +{ + GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, maSoundList ); + GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, maSoundList ); + + mxLBSound->append_text( SdResId(STR_CUSTOMANIMATION_NO_SOUND) ); + mxLBSound->append_text( SdResId(STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND) ); + for(const OUString & rString : maSoundList) + { + INetURLObject aURL( rString ); + mxLBSound->append_text( aURL.GetBase() ); + } + mxLBSound->append_text( SdResId(STR_CUSTOMANIMATION_BROWSE_SOUND) ); +} + +void CustomAnimationEffectTabPage::clearSoundListBox() +{ + maSoundList.clear(); + mxLBSound->clear(); +} + +sal_Int32 CustomAnimationEffectTabPage::getSoundObject( std::u16string_view rStr ) +{ + size_t i; + const size_t nCount = maSoundList.size(); + for( i = 0; i < nCount; i++ ) + { + if( maSoundList[ i ].equalsIgnoreAsciiCase(rStr) ) + return i+2; + } + + return -1; +} + +void CustomAnimationEffectTabPage::openSoundFileDialog() +{ + SdOpenSoundFileDialog aFileDialog(GetFrameWeld()); + + bool bValidSoundFile = false; + bool bQuitLoop = false; + ::tools::Long nPos = 0; + + while( !bQuitLoop && (aFileDialog.Execute() == ERRCODE_NONE) ) + { + OUString aFile = aFileDialog.GetPath(); + nPos = getSoundObject( aFile ); + + if( nPos < 0 ) // not in Soundliste + { + // try to insert in Gallery + if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile ) ) + { + clearSoundListBox(); + fillSoundListBox(); + + nPos = getSoundObject( aFile ); + DBG_ASSERT( nPos >= 0, "sd::CustomAnimationEffectTabPage::openSoundFileDialog(), Recently inserted sound not in list!" ); + + bValidSoundFile=true; + bQuitLoop=true; + } + else + { + OUString aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE)); + aStrWarning = aStrWarning.replaceFirst("%", aFile); + std::unique_ptr xWarn(Application::CreateMessageDialog(nullptr, + VclMessageType::Warning, VclButtonsType::NONE, + aStrWarning)); + xWarn->add_button(GetStandardText(StandardButtonType::Retry), RET_RETRY); + xWarn->add_button(GetStandardText(StandardButtonType::Cancel), RET_CANCEL); + bQuitLoop = xWarn->run() != RET_RETRY; + + bValidSoundFile=false; + } + } + else + { + bValidSoundFile=true; + bQuitLoop=true; + } + } + + if( !bValidSoundFile ) + nPos = 0; + + mxLBSound->set_active(nPos); +} + +void CustomAnimationEffectTabPage::onSoundPreview() +{ +#if HAVE_FEATURE_AVMEDIA + const auto nPos = mxLBSound->get_active(); + + if( nPos >= 2 ) try + { + const OUString aSoundURL( maSoundList[ nPos-2 ] ); + mxPlayer.set( avmedia::MediaWindow::createPlayer( aSoundURL, "" ), uno::UNO_SET_THROW ); + mxPlayer->start(); + } + catch( uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "CustomAnimationEffectTabPage::onSoundPreview()" ); + } +#endif +} + +class CustomAnimationDurationTabPage +{ +public: + CustomAnimationDurationTabPage(weld::Container* pParent, const STLPropertySet* pSet); + + void update( STLPropertySet* pSet ); + + DECL_LINK(implControlHdl, weld::ComboBox&, void); + DECL_LINK(DurationModifiedHdl, weld::MetricSpinButton&, void); + +private: + const STLPropertySet* mpSet; + + std::unique_ptr mxBuilder; + std::unique_ptr mxContainer; + std::unique_ptr mxLBStart; + std::unique_ptr mxMFStartDelay; + std::unique_ptr mxFTDuration; + std::unique_ptr mxCBXDuration; + std::unique_ptr mxFTRepeat; + std::unique_ptr mxCBRepeat; + std::unique_ptr mxCBXRewind; + std::unique_ptr mxRBClickSequence; + std::unique_ptr mxRBInteractive; + std::unique_ptr mxLBTrigger; +}; + +CustomAnimationDurationTabPage::CustomAnimationDurationTabPage(weld::Container* pParent, const STLPropertySet* pSet) + : mpSet(pSet) + , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationtimingtab.ui")) + , mxContainer(mxBuilder->weld_container("TimingTab")) + , mxLBStart(mxBuilder->weld_combo_box("start_list")) + , mxMFStartDelay(mxBuilder->weld_metric_spin_button("delay_value", FieldUnit::SECOND)) + , mxFTDuration(mxBuilder->weld_label("duration_label")) + , mxCBXDuration(mxBuilder->weld_metric_spin_button("anim_duration", FieldUnit::SECOND)) + , mxFTRepeat(mxBuilder->weld_label("repeat_label")) + , mxCBRepeat(mxBuilder->weld_combo_box("repeat_list")) + , mxCBXRewind(mxBuilder->weld_check_button("rewind")) + , mxRBClickSequence(mxBuilder->weld_radio_button("rb_click_sequence")) + , mxRBInteractive(mxBuilder->weld_radio_button("rb_interactive")) + , mxLBTrigger(mxBuilder->weld_combo_box("trigger_list")) +{ + mxLBTrigger->set_size_request(mxLBTrigger->get_approximate_digit_width() * 20, -1); + + fillRepeatComboBox(*mxCBRepeat); + + mxLBTrigger->connect_changed(LINK(this, CustomAnimationDurationTabPage, implControlHdl)); + mxCBXDuration->connect_value_changed(LINK( this, CustomAnimationDurationTabPage, DurationModifiedHdl)); + + if( pSet->getPropertyState( nHandleStart ) != STLPropertyState::Ambiguous ) + { + sal_Int16 nStart = 0; + pSet->getPropertyValue( nHandleStart ) >>= nStart; + sal_Int32 nPos = 0; + switch( nStart ) + { + case EffectNodeType::WITH_PREVIOUS: nPos = 1; break; + case EffectNodeType::AFTER_PREVIOUS: nPos = 2; break; + } + mxLBStart->set_active(nPos); + } + + if( pSet->getPropertyState( nHandleBegin ) != STLPropertyState::Ambiguous ) + { + double fBegin = 0.0; + pSet->getPropertyValue( nHandleBegin ) >>= fBegin; + mxMFStartDelay->set_value(static_cast<::tools::Long>(fBegin*10), FieldUnit::NONE); + } + + if( pSet->getPropertyState( nHandleDuration ) != STLPropertyState::Ambiguous ) + { + double fDuration = 0.0; + pSet->getPropertyValue( nHandleDuration ) >>= fDuration; + + if( fDuration == 0.001 ) + { + mxFTDuration->set_sensitive(false); + mxCBXDuration->set_sensitive(false); + mxFTRepeat->set_sensitive(false); + mxCBRepeat->set_sensitive(false); + mxCBXRewind->set_sensitive(false); + } + else + { + mxCBXDuration->set_value(fDuration * 100.0, FieldUnit::NONE); + } + } + + if( pSet->getPropertyState( nHandleRepeat ) != STLPropertyState::Ambiguous ) + { + Any aRepeatCount( pSet->getPropertyValue( nHandleRepeat ) ); + if( (aRepeatCount.getValueType() == ::cppu::UnoType::get()) || !aRepeatCount.hasValue() ) + { + double fRepeat = 0.0; + if( aRepeatCount.hasValue() ) + aRepeatCount >>= fRepeat; + + auto nPos = -1; + + if( fRepeat == 0 ) + nPos = 0; + else if( fRepeat == 2.0 ) + nPos = 1; + else if( fRepeat == 3.0 ) + nPos = 2; + else if( fRepeat == 4.0 ) + nPos = 3; + else if( fRepeat == 5.0 ) + nPos = 4; + else if( fRepeat == 10.0 ) + nPos = 5; + + if (nPos != -1) + mxCBRepeat->set_active(nPos); + else + mxCBRepeat->set_entry_text(OUString::number(fRepeat)); + } + else if( aRepeatCount.getValueType() == ::cppu::UnoType::get() ) + { + Any aEnd; + if( pSet->getPropertyState( nHandleEnd ) != STLPropertyState::Ambiguous ) + aEnd = pSet->getPropertyValue( nHandleEnd ); + + mxCBRepeat->set_active(aEnd.hasValue() ? 6 : 7); + } + } + + if( pSet->getPropertyState( nHandleRewind ) != STLPropertyState::Ambiguous ) + { + sal_Int16 nFill = 0; + if( pSet->getPropertyValue( nHandleRewind ) >>= nFill ) + { + mxCBXRewind->set_active(nFill == AnimationFill::REMOVE); + } + else + { + mxCBXRewind->set_state(TRISTATE_INDET); + } + } + + Reference< XShape > xTrigger; + + if( pSet->getPropertyState( nHandleTrigger ) != STLPropertyState::Ambiguous ) + { + pSet->getPropertyValue( nHandleTrigger ) >>= xTrigger; + + mxRBInteractive->set_active(xTrigger.is()); + mxRBClickSequence->set_active(!xTrigger.is()); + } + + Reference< XDrawPage > xCurrentPage; + pSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage; + if( !xCurrentPage.is() ) + return; + + static constexpr OUString aStrIsEmptyPresObj( u"IsEmptyPresentationObject"_ustr ); + + sal_Int32 nShape, nCount = xCurrentPage->getCount(); + for( nShape = 0; nShape < nCount; nShape++ ) + { + Reference< XShape > xShape( xCurrentPage->getByIndex( nShape ), UNO_QUERY ); + + if( !xShape.is() ) + continue; + + Reference< XPropertySet > xSet( xShape, UNO_QUERY ); + if( xSet.is() && xSet->getPropertySetInfo()->hasPropertyByName( aStrIsEmptyPresObj ) ) + { + bool bIsEmpty = false; + xSet->getPropertyValue( aStrIsEmptyPresObj ) >>= bIsEmpty; + if( bIsEmpty ) + continue; + } + + OUString aDescription( getShapeDescription( xShape, true ) ); + mxLBTrigger->append(OUString::number(nShape), aDescription); + auto nPos = mxLBTrigger->get_count() - 1; + if (xShape == xTrigger) + mxLBTrigger->set_active(nPos); + } +} + +IMPL_LINK_NOARG(CustomAnimationDurationTabPage, implControlHdl, weld::ComboBox&, void) +{ + mxRBInteractive->set_active(true); + assert(!mxRBClickSequence->get_active()); +} + +IMPL_LINK_NOARG(CustomAnimationDurationTabPage, DurationModifiedHdl, weld::MetricSpinButton&, void) +{ + if (!mxCBXDuration->get_text().isEmpty()) + { + double duration_value = static_cast(mxCBXDuration->get_value(FieldUnit::NONE)); + if(duration_value <= 0.0) + mxCBXDuration->set_value(1, FieldUnit::NONE); + else + mxCBXDuration->set_value(duration_value, FieldUnit::NONE); + } +} + +void CustomAnimationDurationTabPage::update( STLPropertySet* pSet ) +{ + auto nPos = mxLBStart->get_active(); + if (nPos != -1) + { + sal_Int16 nStart; + sal_Int16 nOldStart = -1; + + switch( nPos ) + { + case 1: nStart = EffectNodeType::WITH_PREVIOUS; break; + case 2: nStart = EffectNodeType::AFTER_PREVIOUS; break; + default: + nStart = EffectNodeType::ON_CLICK; break; + } + + if(mpSet->getPropertyState( nHandleStart ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleStart ) >>= nOldStart; + + if( nStart != nOldStart ) + pSet->setPropertyValue( nHandleStart, Any( nStart ) ); + } + + { + double fBegin = static_cast(mxMFStartDelay->get_value(FieldUnit::NONE)) / 10.0; + double fOldBegin = -1.0; + + if( mpSet->getPropertyState( nHandleBegin ) != STLPropertyState::Ambiguous ) + mpSet->getPropertyValue( nHandleBegin ) >>= fOldBegin; + + if( fBegin != fOldBegin ) + pSet->setPropertyValue( nHandleBegin, Any( fBegin ) ); + } + + nPos = mxCBRepeat->get_active(); + if (nPos != -1 || !mxCBRepeat->get_active_text().isEmpty()) + { + Any aRepeatCount; + Any aEnd; + + switch( nPos ) + { + case 0: + break; + + case 6: + { + Event aEvent; + aEvent.Trigger = EventTrigger::ON_NEXT; + aEvent.Repeat = 0; + aEnd <<= aEvent; + } + [[fallthrough]]; + case 7: + aRepeatCount <<= Timing_INDEFINITE; + break; + default: + { + OUString aText(mxCBRepeat->get_text(nPos)); + if( !aText.isEmpty() ) + aRepeatCount <<= aText.toDouble(); + } + } + + Any aOldRepeatCount( aRepeatCount ); + if( mpSet->getPropertyState( nHandleRepeat ) != STLPropertyState::Ambiguous ) + aOldRepeatCount = mpSet->getPropertyValue( nHandleRepeat ); + + if( aRepeatCount != aOldRepeatCount ) + pSet->setPropertyValue( nHandleRepeat, aRepeatCount ); + + Any aOldEnd( aEnd ); + if( mpSet->getPropertyState( nHandleEnd ) != STLPropertyState::Ambiguous ) + aOldEnd = mpSet->getPropertyValue( nHandleEnd ); + + if( aEnd != aOldEnd ) + pSet->setPropertyValue( nHandleEnd, aEnd ); + } + + double fDuration = -1.0; + + if (!mxCBXDuration->get_text().isEmpty()) + { + double duration_value = static_cast(mxCBXDuration->get_value(FieldUnit::NONE)); + + if(duration_value > 0) + fDuration = duration_value/100.0; + } + + if( fDuration != -1.0 ) + { + double fOldDuration = -1; + + if( mpSet->getPropertyState( nHandleDuration ) != STLPropertyState::Ambiguous ) + mpSet->getPropertyValue( nHandleDuration ) >>= fOldDuration; + + if( fDuration != fOldDuration ) + pSet->setPropertyValue( nHandleDuration, Any( fDuration ) ); + } + + if (mxCBXRewind->get_state() != TRISTATE_INDET) + { + sal_Int16 nFill = mxCBXRewind->get_active() ? AnimationFill::REMOVE : AnimationFill::HOLD; + + bool bSet = true; + + if( mpSet->getPropertyState( nHandleRewind ) != STLPropertyState::Ambiguous ) + { + sal_Int16 nOldFill = 0; + mpSet->getPropertyValue( nHandleRewind ) >>= nOldFill; + bSet = nFill != nOldFill; + } + + if( bSet ) + pSet->setPropertyValue( nHandleRewind, Any( nFill ) ); + } + + Reference< XShape > xTrigger; + + if (mxRBInteractive->get_active()) + { + nPos = mxLBTrigger->get_active(); + if (nPos != -1) + { + sal_Int32 nShape = mxLBTrigger->get_id(nPos).toInt32(); + + Reference< XDrawPage > xCurrentPage; + mpSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage; + + if( xCurrentPage.is() && (nShape >= 0) && (nShape < xCurrentPage->getCount()) ) + xCurrentPage->getByIndex( nShape ) >>= xTrigger; + } + } + + if (xTrigger.is() || mxRBClickSequence->get_active()) + { + Any aNewValue( xTrigger ); + Any aOldValue; + + if( mpSet->getPropertyState( nHandleTrigger ) != STLPropertyState::Ambiguous ) + aOldValue = mpSet->getPropertyValue( nHandleTrigger ); + + if( aNewValue != aOldValue ) + pSet->setPropertyValue( nHandleTrigger, aNewValue ); + } +} + +class CustomAnimationTextAnimTabPage +{ +public: + CustomAnimationTextAnimTabPage(weld::Container* pParent, const STLPropertySet* pSet); + + void update( STLPropertySet* pSet ); + + void updateControlStates(); + DECL_LINK(implSelectHdl, weld::ComboBox&, void); + +private: + const STLPropertySet* mpSet; + bool mbHasVisibleShapes; + + std::unique_ptr mxBuilder; + std::unique_ptr mxContainer; + std::unique_ptr mxLBGroupText; + std::unique_ptr mxCBXGroupAuto; + std::unique_ptr mxMFGroupAuto; + std::unique_ptr mxCBXAnimateForm; + std::unique_ptr mxCBXReverse; +}; + +CustomAnimationTextAnimTabPage::CustomAnimationTextAnimTabPage(weld::Container* pParent, const STLPropertySet* pSet) + : mpSet(pSet) + , mbHasVisibleShapes(true) + , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationtexttab.ui")) + , mxContainer(mxBuilder->weld_container("TextAnimationTab")) + , mxLBGroupText(mxBuilder->weld_combo_box("group_text_list")) + , mxCBXGroupAuto(mxBuilder->weld_check_button("auto_after")) + , mxMFGroupAuto(mxBuilder->weld_metric_spin_button("auto_after_value",FieldUnit::SECOND)) + , mxCBXAnimateForm(mxBuilder->weld_check_button("animate_shape")) + , mxCBXReverse(mxBuilder->weld_check_button("reverse_order")) +{ + mxLBGroupText->connect_changed(LINK(this, CustomAnimationTextAnimTabPage, implSelectHdl)); + + if( pSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState::Ambiguous ) + { + sal_Int32 nTextGrouping = 0; + if( pSet->getPropertyValue( nHandleTextGrouping ) >>= nTextGrouping ) + mxLBGroupText->set_active(nTextGrouping + 1); + } + + if( pSet->getPropertyState( nHandleHasVisibleShape ) != STLPropertyState::Ambiguous ) + pSet->getPropertyValue( nHandleHasVisibleShape ) >>= mbHasVisibleShapes; + + if( pSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState::Ambiguous ) + { + double fTextGroupingAuto = 0.0; + if( pSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fTextGroupingAuto ) + { + mxCBXGroupAuto->set_active(fTextGroupingAuto >= 0.0); + if( fTextGroupingAuto >= 0.0 ) + mxMFGroupAuto->set_value(static_cast<::tools::Long>(fTextGroupingAuto*10), FieldUnit::NONE); + } + } + else + { + mxCBXGroupAuto->set_state( TRISTATE_INDET ); + } + + mxCBXAnimateForm->set_state( TRISTATE_INDET ); + if( pSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState::Ambiguous ) + { + bool bAnimateForm = false; + if( pSet->getPropertyValue( nHandleAnimateForm ) >>= bAnimateForm ) + { + mxCBXAnimateForm->set_active( bAnimateForm ); + } + } + else + { + mxCBXAnimateForm->set_sensitive(false); + } + + mxCBXReverse->set_state(TRISTATE_INDET); + if( pSet->getPropertyState( nHandleTextReverse ) != STLPropertyState::Ambiguous ) + { + bool bTextReverse = false; + if( pSet->getPropertyValue( nHandleTextReverse ) >>= bTextReverse ) + { + mxCBXReverse->set_active( bTextReverse ); + } + } + + if( pSet->getPropertyState( nHandleMaxParaDepth ) == STLPropertyState::Direct ) + { + sal_Int32 nMaxParaDepth = 0; + pSet->getPropertyValue( nHandleMaxParaDepth ) >>= nMaxParaDepth; + nMaxParaDepth += 1; + + sal_Int32 nPos = 6; + while( (nPos > 2) && (nPos > nMaxParaDepth) ) + { + mxLBGroupText->remove(nPos); + nPos--; + } + } + + updateControlStates(); +} + +void CustomAnimationTextAnimTabPage::update( STLPropertySet* pSet ) +{ + auto nPos = mxLBGroupText->get_active(); + if (nPos != -1) + { + sal_Int32 nTextGrouping = nPos - 1; + sal_Int32 nOldGrouping = -2; + + if(mpSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleTextGrouping ) >>= nOldGrouping; + + if( nTextGrouping != nOldGrouping ) + pSet->setPropertyValue( nHandleTextGrouping, Any( nTextGrouping ) ); + } + + if (nPos != 0) + { + bool bTextReverse = mxCBXReverse->get_active(); + bool bOldTextReverse = !bTextReverse; + + if(mpSet->getPropertyState( nHandleTextReverse ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleTextReverse ) >>= bOldTextReverse; + + if( bTextReverse != bOldTextReverse ) + pSet->setPropertyValue( nHandleTextReverse, Any( bTextReverse ) ); + + if( nPos > 1 ) + { + double fTextGroupingAuto = mxCBXGroupAuto->get_active() ? mxMFGroupAuto->get_value(FieldUnit::NONE) / 10.0 : -1.0; + double fOldTextGroupingAuto = -2.0; + + if(mpSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fOldTextGroupingAuto; + + if( fTextGroupingAuto != fOldTextGroupingAuto ) + pSet->setPropertyValue( nHandleTextGroupingAuto, Any( fTextGroupingAuto ) ); + } + } + //#i120049# impress crashes when modifying the "Random effects" animation + //effect's trigger condition to "Start effect on click of". + //If this control is disabled, we should ignore its value + if (mxCBXAnimateForm->get_sensitive()) + { + bool bAnimateForm = mxCBXAnimateForm->get_active(); + bool bOldAnimateForm = !bAnimateForm; + + if(mpSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState::Ambiguous) + mpSet->getPropertyValue( nHandleAnimateForm ) >>= bOldAnimateForm; + + if( bAnimateForm != bOldAnimateForm ) + pSet->setPropertyValue( nHandleAnimateForm, Any( bAnimateForm ) ); + } +} + +void CustomAnimationTextAnimTabPage::updateControlStates() +{ + auto nPos = mxLBGroupText->get_active(); + + mxCBXGroupAuto->set_sensitive( nPos > 1 ); + mxMFGroupAuto->set_sensitive( nPos > 1 ); + mxCBXReverse->set_sensitive( nPos > 0 ); + + if( !mbHasVisibleShapes && nPos > 0 ) + { + mxCBXAnimateForm->set_active(false); + mxCBXAnimateForm->set_sensitive(false); + } + else + { + mxCBXAnimateForm->set_sensitive(true); + } +} + +IMPL_LINK_NOARG(CustomAnimationTextAnimTabPage, implSelectHdl, weld::ComboBox&, void) +{ + updateControlStates(); +} + +CustomAnimationDialog::CustomAnimationDialog(weld::Window* pParent, std::unique_ptr pSet, const OUString& rPage) + : GenericDialogController(pParent, "modules/simpress/ui/customanimationproperties.ui", "CustomAnimationProperties") + , mxSet(std::move(pSet)) + , mxTabControl(m_xBuilder->weld_notebook("tabcontrol")) + , mxDurationTabPage(new CustomAnimationDurationTabPage(mxTabControl->get_page("timing"), mxSet.get())) + , mxEffectTabPage(new CustomAnimationEffectTabPage(mxTabControl->get_page("effect"), m_xDialog.get(), mxSet.get())) +{ + bool bHasText = false; + if( mxSet->getPropertyState( nHandleHasText ) != STLPropertyState::Ambiguous ) + mxSet->getPropertyValue( nHandleHasText ) >>= bHasText; + + if( bHasText ) + { + mxTextAnimTabPage.reset(new CustomAnimationTextAnimTabPage(mxTabControl->get_page("textanim"), mxSet.get())); + } + else + { + mxTabControl->remove_page("textanim"); + } + + if (!rPage.isEmpty()) + mxTabControl->set_current_page(rPage); +} + +CustomAnimationDialog::~CustomAnimationDialog() +{ +} + +STLPropertySet* CustomAnimationDialog::getResultSet() +{ + mxResultSet = createDefaultSet(); + + mxEffectTabPage->update( mxResultSet.get() ); + mxDurationTabPage->update( mxResultSet.get() ); + if (mxTextAnimTabPage) + mxTextAnimTabPage->update( mxResultSet.get() ); + + return mxResultSet.get(); +} + +std::unique_ptr CustomAnimationDialog::createDefaultSet() +{ + Any aEmpty; + + std::unique_ptr pSet(new STLPropertySet()); + pSet->setPropertyDefaultValue( nHandleMaxParaDepth, Any( sal_Int32(-1) ) ); + + pSet->setPropertyDefaultValue( nHandleHasAfterEffect, Any( false ) ); + pSet->setPropertyDefaultValue( nHandleAfterEffectOnNextEffect, Any( false ) ); + pSet->setPropertyDefaultValue( nHandleDimColor, aEmpty ); + pSet->setPropertyDefaultValue( nHandleIterateType, Any( sal_Int16(0) ) ); + pSet->setPropertyDefaultValue( nHandleIterateInterval, Any( 0.0 ) ); + + pSet->setPropertyDefaultValue( nHandleStart, Any( sal_Int16(EffectNodeType::ON_CLICK) ) ); + pSet->setPropertyDefaultValue( nHandleBegin, Any( 0.0 ) ); + pSet->setPropertyDefaultValue( nHandleDuration, Any( 2.0 ) ); + pSet->setPropertyDefaultValue( nHandleRepeat, aEmpty ); + pSet->setPropertyDefaultValue( nHandleRewind, Any( AnimationFill::HOLD ) ); + + pSet->setPropertyDefaultValue( nHandleEnd, aEmpty ); + + pSet->setPropertyDefaultValue( nHandlePresetId, aEmpty ); + pSet->setPropertyDefaultValue( nHandleProperty1Type, Any( nPropertyTypeNone ) ); + pSet->setPropertyDefaultValue( nHandleProperty1Value, aEmpty ); + pSet->setPropertyDefaultValue( nHandleProperty2Type, Any( nPropertyTypeNone ) ); + pSet->setPropertyDefaultValue( nHandleProperty2Value, aEmpty ); + pSet->setPropertyDefaultValue( nHandleAccelerate, aEmpty ); + pSet->setPropertyDefaultValue( nHandleDecelerate, aEmpty ); + pSet->setPropertyDefaultValue( nHandleAutoReverse, aEmpty ); + pSet->setPropertyDefaultValue( nHandleTrigger, aEmpty ); + + pSet->setPropertyDefaultValue( nHandleHasText, Any( false ) ); + pSet->setPropertyDefaultValue( nHandleHasVisibleShape, Any( false ) ); + pSet->setPropertyDefaultValue( nHandleTextGrouping, Any( sal_Int32(-1) ) ); + pSet->setPropertyDefaultValue( nHandleAnimateForm, Any( true ) ); + pSet->setPropertyDefaultValue( nHandleTextGroupingAuto, Any( -1.0 ) ); + pSet->setPropertyDefaultValue( nHandleTextReverse, Any( false ) ); + + pSet->setPropertyDefaultValue( nHandleCurrentPage, aEmpty ); + + pSet->setPropertyDefaultValue( nHandleSoundURL, aEmpty ); + pSet->setPropertyDefaultValue( nHandleSoundVolume, Any( 1.0) ); + pSet->setPropertyDefaultValue( nHandleSoundEndAfterSlide, Any( sal_Int32(0) ) ); + + pSet->setPropertyDefaultValue( nHandleCommand, Any( sal_Int16(0) ) ); + return pSet; +} + +std::unique_ptr SdPropertySubControl::create(sal_Int32 nType, weld::Label* pLabel, weld::Container* pParent, weld::Window* pTopLevel, const Any& rValue, const OUString& rPresetId, const Link& rModifyHdl) +{ + std::unique_ptr pSubControl; + switch( nType ) + { + case nPropertyTypeDirection: + case nPropertyTypeSpokes: + case nPropertyTypeZoom: + pSubControl.reset( new SdPresetPropertyBox( pLabel, pParent, rValue, rPresetId, rModifyHdl ) ); + break; + + case nPropertyTypeColor: + case nPropertyTypeFillColor: + case nPropertyTypeFirstColor: + case nPropertyTypeCharColor: + case nPropertyTypeLineColor: + pSubControl.reset( new SdColorPropertyBox( pLabel, pParent, pTopLevel, rValue, rModifyHdl ) ); + break; + + case nPropertyTypeFont: + pSubControl.reset( new SdFontPropertyBox( pLabel, pParent, rValue, rModifyHdl ) ); + break; + + case nPropertyTypeCharHeight: + pSubControl.reset( new SdCharHeightPropertyBox( pLabel, pParent, rValue, rModifyHdl ) ); + break; + + case nPropertyTypeRotate: + pSubControl.reset( new SdRotationPropertyBox( pLabel, pParent, rValue, rModifyHdl ) ); + break; + + case nPropertyTypeTransparency: + pSubControl.reset( new SdTransparencyPropertyBox( pLabel, pParent, rValue, rModifyHdl ) ); + break; + + case nPropertyTypeScale: + pSubControl.reset( new SdScalePropertyBox( pLabel, pParent, rValue, rModifyHdl ) ); + break; + + case nPropertyTypeCharDecoration: + pSubControl.reset( new SdFontStylePropertyBox( pLabel, pParent, rValue, rModifyHdl ) ); + break; + } + + return pSubControl; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/CustomAnimationDialog.hxx b/sd/source/ui/animations/CustomAnimationDialog.hxx new file mode 100644 index 0000000000..34101fbc1f --- /dev/null +++ b/sd/source/ui/animations/CustomAnimationDialog.hxx @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd { + +// property handles +const sal_Int32 nHandleSound = 0; +const sal_Int32 nHandleHasAfterEffect = 1; +const sal_Int32 nHandleIterateType = 2; +const sal_Int32 nHandleIterateInterval = 3; +const sal_Int32 nHandleStart = 4; +const sal_Int32 nHandleBegin = 5; +const sal_Int32 nHandleDuration = 6; +const sal_Int32 nHandleRepeat = 7; +const sal_Int32 nHandleRewind = 8; +const sal_Int32 nHandleEnd = 9; +const sal_Int32 nHandleAfterEffectOnNextEffect = 10; +const sal_Int32 nHandleDimColor = 11; +const sal_Int32 nHandleMaxParaDepth = 12; +const sal_Int32 nHandlePresetId = 13; +const sal_Int32 nHandleProperty1Type = 14; +const sal_Int32 nHandleProperty1Value = 15; +const sal_Int32 nHandleProperty2Type = 16; +const sal_Int32 nHandleProperty2Value = 17; + +const sal_Int32 nHandleAccelerate = 18; +const sal_Int32 nHandleDecelerate = 19; +const sal_Int32 nHandleAutoReverse = 20; +const sal_Int32 nHandleTrigger = 21; + +const sal_Int32 nHandleHasText = 22; +const sal_Int32 nHandleTextGrouping = 23; +const sal_Int32 nHandleAnimateForm = 24; +const sal_Int32 nHandleTextGroupingAuto = 25; +const sal_Int32 nHandleTextReverse = 26; + +const sal_Int32 nHandleCurrentPage = 27; +const sal_Int32 nHandleSoundURL = 28; +const sal_Int32 nHandleSoundVolume = 29; +const sal_Int32 nHandleSoundEndAfterSlide = 30; + +const sal_Int32 nHandleCommand = 31; + +const sal_Int32 nHandleHasVisibleShape = 32; + +const sal_Int32 nPropertyTypeNone = 0; +const sal_Int32 nPropertyTypeDirection = 1; +const sal_Int32 nPropertyTypeSpokes = 2; +const sal_Int32 nPropertyTypeFirstColor = 3; +const sal_Int32 nPropertyTypeSecondColor = 4; +const sal_Int32 nPropertyTypeZoom = 5; +const sal_Int32 nPropertyTypeFillColor = 6; +const sal_Int32 nPropertyTypeColorStyle = 7; +const sal_Int32 nPropertyTypeFont = 8; +const sal_Int32 nPropertyTypeCharHeight = 9; +const sal_Int32 nPropertyTypeCharColor = 10; +const sal_Int32 nPropertyTypeCharHeightStyle = 11; +const sal_Int32 nPropertyTypeCharDecoration = 12; +const sal_Int32 nPropertyTypeLineColor = 13; +const sal_Int32 nPropertyTypeRotate = 14; +const sal_Int32 nPropertyTypeColor = 15; +const sal_Int32 nPropertyTypeAccelerate = 16; +const sal_Int32 nPropertyTypeDecelerate = 17; +const sal_Int32 nPropertyTypeAutoReverse = 18; +const sal_Int32 nPropertyTypeTransparency = 19; +const sal_Int32 nPropertyTypeFontStyle = 20; +const sal_Int32 nPropertyTypeScale = 21; + +class SdPropertySubControl +{ +public: + explicit SdPropertySubControl(weld::Container* pParent); + virtual ~SdPropertySubControl(); + + virtual css::uno::Any getValue() = 0; + virtual void setValue( const css::uno::Any& rValue, const OUString& rPresetId ) = 0; + + static std::unique_ptr + create( sal_Int32 nType, + weld::Label* pLabel, + weld::Container* pParent, + weld::Window* pTopLevel, + const css::uno::Any& rValue, + const OUString& rPresetId, + const Link& rModifyHdl ); + +protected: + std::unique_ptr mxBuilder; + std::unique_ptr mxContainer; + weld::Container* mpParent; +}; + +class CustomAnimationDurationTabPage; +class CustomAnimationEffectTabPage; +class CustomAnimationTextAnimTabPage; +class STLPropertySet; + +class CustomAnimationDialog : public weld::GenericDialogController +{ +public: + CustomAnimationDialog(weld::Window* pParent, std::unique_ptr pSet, const OUString& Page); + virtual ~CustomAnimationDialog() override; + + STLPropertySet* getResultSet(); + STLPropertySet* getPropertySet() const { return mxSet.get(); } + + static std::unique_ptr createDefaultSet(); + +private: + std::unique_ptr mxSet; + std::unique_ptr mxResultSet; + + std::unique_ptr mxTabControl; + std::unique_ptr mxDurationTabPage; + std::unique_ptr mxEffectTabPage; + std::unique_ptr mxTextAnimTabPage; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/CustomAnimationList.cxx b/sd/source/ui/animations/CustomAnimationList.cxx new file mode 100644 index 0000000000..39b3d488d2 --- /dev/null +++ b/sd/source/ui/animations/CustomAnimationList.cxx @@ -0,0 +1,1232 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::presentation; + +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::uno::XInterface; +using ::com::sun::star::text::XTextRange; +using ::com::sun::star::drawing::XShape; +using ::com::sun::star::drawing::XShapes; +using ::com::sun::star::drawing::XDrawPage; +using ::com::sun::star::container::XChild; +using ::com::sun::star::container::XIndexAccess; +using ::com::sun::star::container::XEnumerationAccess; +using ::com::sun::star::container::XEnumeration; +using ::com::sun::star::beans::XPropertySet; +using ::com::sun::star::beans::XPropertySetInfo; + +namespace sd { + +// go recursively through all shapes in the given XShapes collection and return true as soon as the +// given shape is found. nIndex is incremented for each shape with the same shape type as the given +// shape is found until the given shape is found. +static bool getShapeIndex( const Reference< XShapes >& xShapes, const Reference< XShape >& xShape, sal_Int32& nIndex ) +{ + const sal_Int32 nCount = xShapes->getCount(); + sal_Int32 n; + for( n = 0; n < nCount; n++ ) + { + Reference< XShape > xChild; + xShapes->getByIndex( n ) >>= xChild; + if( xChild == xShape ) + return true; + + if( xChild->getShapeType() == xShape->getShapeType() ) + nIndex++; + + Reference< XShapes > xChildContainer( xChild, UNO_QUERY ); + if( xChildContainer.is() ) + { + if( getShapeIndex( xChildContainer, xShape, nIndex ) ) + return true; + } + } + + return false; +} + +// returns the index of the shape type from the given shape +static sal_Int32 getShapeIndex( const Reference< XShape >& xShape ) +{ + Reference< XChild > xChild( xShape, UNO_QUERY ); + Reference< XShapes > xPage; + + while( xChild.is() && !xPage.is() ) + { + Reference< XInterface > x( xChild->getParent() ); + xChild.set( x, UNO_QUERY ); + Reference< XDrawPage > xTestPage( x, UNO_QUERY ); + if( xTestPage.is() ) + xPage.set( x, UNO_QUERY ); + } + + sal_Int32 nIndex = 1; + + if( xPage.is() && getShapeIndex( xPage, xShape, nIndex ) ) + return nIndex; + else + return -1; +} + +OUString getShapeDescription( const Reference< XShape >& xShape, bool bWithText ) +{ + OUString aDescription; + Reference< XPropertySet > xSet( xShape, UNO_QUERY ); + bool bAppendIndex = true; + + if(xSet.is()) try + { + Reference xInfo(xSet->getPropertySetInfo()); + if (xInfo.is()) + { + static constexpr OUString aPropName1(u"Name"_ustr); + if(xInfo->hasPropertyByName(aPropName1)) + xSet->getPropertyValue(aPropName1) >>= aDescription; + + bAppendIndex = aDescription.isEmpty(); + + static constexpr OUString aPropName2(u"UINameSingular"_ustr); + if(xInfo->hasPropertyByName(aPropName2)) + xSet->getPropertyValue(aPropName2) >>= aDescription; + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::getShapeDescription()" ); + } + + if (bAppendIndex) + { + aDescription += " " + OUString::number(getShapeIndex(xShape)); + } + + if( bWithText ) + { + Reference< XTextRange > xText( xShape, UNO_QUERY ); + if( xText.is() ) + { + OUString aText( xText->getString() ); + if( !aText.isEmpty() ) + { + aDescription += ": "; + + aText = aText.replace( '\n', ' ' ); + aText = aText.replace( '\r', ' ' ); + + aDescription += aText; + } + } + } + return aDescription; +} + +static OUString getDescription( const Any& rTarget, bool bWithText ) +{ + OUString aDescription; + + if( rTarget.getValueType() == ::cppu::UnoType::get() ) + { + ParagraphTarget aParaTarget; + rTarget >>= aParaTarget; + + css::uno::Reference xLockable(aParaTarget.Shape, css::uno::UNO_QUERY); + if (xLockable.is()) + xLockable->addActionLock(); + comphelper::ScopeGuard aGuard([&xLockable]() + { + if (xLockable.is()) + xLockable->removeActionLock(); + }); + + Reference< XEnumerationAccess > xText( aParaTarget.Shape, UNO_QUERY_THROW ); + Reference< XEnumeration > xEnumeration( xText->createEnumeration(), css::uno::UNO_SET_THROW ); + sal_Int32 nPara = aParaTarget.Paragraph; + + while( xEnumeration->hasMoreElements() && nPara ) + { + xEnumeration->nextElement(); + nPara--; + } + + DBG_ASSERT( xEnumeration->hasMoreElements(), "sd::CustomAnimationEffect::prepareText(), paragraph out of range!" ); + + if( xEnumeration->hasMoreElements() ) + { + Reference< XTextRange > xParagraph; + xEnumeration->nextElement() >>= xParagraph; + + if( xParagraph.is() ) + aDescription = xParagraph->getString(); + } + } + else + { + Reference< XShape > xShape; + rTarget >>= xShape; + if( xShape.is() ) + aDescription = getShapeDescription( xShape, bWithText ); + } + + return aDescription; +} + +class CustomAnimationListEntryItem +{ +public: + CustomAnimationListEntryItem(OUString aDescription, + CustomAnimationEffectPtr pEffect); + const CustomAnimationEffectPtr& getEffect() const { return mpEffect; } + + Size GetSize(const vcl::RenderContext& rRenderContext); + void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected); + void PaintEffect(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected); + void PaintTrigger(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect); + +private: + OUString msDescription; + OUString msEffectName; + CustomAnimationEffectPtr mpEffect; + +public: + static const ::tools::Long nIconWidth = 19; + static const ::tools::Long nItemMinHeight = 38; +}; + +CustomAnimationListEntryItem::CustomAnimationListEntryItem(OUString aDescription, CustomAnimationEffectPtr pEffect) + : msDescription(std::move(aDescription)) + , mpEffect(std::move(pEffect)) +{ + if (!mpEffect) + return; + switch (mpEffect->getPresetClass()) + { + case EffectPresetClass::ENTRANCE: + msEffectName = SdResId(STR_CUSTOMANIMATION_ENTRANCE); break; + case EffectPresetClass::EXIT: + msEffectName = SdResId(STR_CUSTOMANIMATION_EXIT); break; + case EffectPresetClass::EMPHASIS: + msEffectName = SdResId(STR_CUSTOMANIMATION_EMPHASIS); break; + case EffectPresetClass::MOTIONPATH: + msEffectName = SdResId(STR_CUSTOMANIMATION_MOTION_PATHS); break; + default: + msEffectName = SdResId(STR_CUSTOMANIMATION_MISC); break; + } + msEffectName = msEffectName.replaceFirst( "%1" , CustomAnimationPresets::getCustomAnimationPresets().getUINameForPresetId(mpEffect->getPresetId())); +} + +IMPL_STATIC_LINK(CustomAnimationList, CustomRenderHdl, weld::TreeView::render_args, aPayload, void) +{ + vcl::RenderContext& rRenderContext = std::get<0>(aPayload); + const ::tools::Rectangle& rRect = std::get<1>(aPayload); + bool bSelected = std::get<2>(aPayload); + const OUString& rId = std::get<3>(aPayload); + + CustomAnimationListEntryItem* pItem = weld::fromId(rId); + + pItem->Paint(rRenderContext, rRect, bSelected); +} + +IMPL_STATIC_LINK(CustomAnimationList, CustomGetSizeHdl, weld::TreeView::get_size_args, aPayload, Size) +{ + vcl::RenderContext& rRenderContext = aPayload.first; + const OUString& rId = aPayload.second; + + CustomAnimationListEntryItem* pItem = weld::fromId(rId); + if (!pItem) + return Size(CustomAnimationListEntryItem::nIconWidth, CustomAnimationListEntryItem::nItemMinHeight); + return pItem->GetSize(rRenderContext); +} + +Size CustomAnimationListEntryItem::GetSize(const vcl::RenderContext& rRenderContext) +{ + auto width = rRenderContext.GetTextWidth( msDescription ) + nIconWidth; + if (width < (rRenderContext.GetTextWidth( msEffectName ) + 2*nIconWidth)) + width = rRenderContext.GetTextWidth( msEffectName ) + 2*nIconWidth; + + Size aSize(width, rRenderContext.GetTextHeight()); + if (aSize.Height() < nItemMinHeight) + aSize.setHeight(nItemMinHeight); + return aSize; +} + +void CustomAnimationListEntryItem::PaintTrigger(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) +{ + Size aSize(rRect.GetSize()); + + ::tools::Rectangle aOutRect(rRect); + + // fill the background + Color aColor(rRenderContext.GetSettings().GetStyleSettings().GetDialogColor()); + + rRenderContext.Push(); + rRenderContext.SetFillColor(aColor); + rRenderContext.SetLineColor(); + rRenderContext.DrawRect(aOutRect); + + // Erase the four corner pixels to make the rectangle appear rounded. + rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetWindowColor()); + rRenderContext.DrawPixel(aOutRect.TopLeft()); + rRenderContext.DrawPixel(Point(aOutRect.Right(), aOutRect.Top())); + rRenderContext.DrawPixel(Point(aOutRect.Left(), aOutRect.Bottom())); + rRenderContext.DrawPixel(Point(aOutRect.Right(), aOutRect.Bottom())); + + // draw the category title + + int nVertBorder = ((aSize.Height() - rRenderContext.GetTextHeight()) >> 1); + int nHorzBorder = rRenderContext.LogicToPixel(Size(3, 3), MapMode(MapUnit::MapAppFont)).Width(); + + aOutRect.AdjustLeft(nHorzBorder ); + aOutRect.AdjustRight( -nHorzBorder ); + aOutRect.AdjustTop( nVertBorder ); + aOutRect.AdjustBottom( -nVertBorder ); + + rRenderContext.DrawText(aOutRect, rRenderContext.GetEllipsisString(msDescription, aOutRect.GetWidth())); + rRenderContext.Pop(); +} + +void CustomAnimationListEntryItem::PaintEffect(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected) +{ + rRenderContext.Push(vcl::PushFlags::TEXTCOLOR); + const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); + if (bSelected) + rRenderContext.SetTextColor(rStyleSettings.GetHighlightTextColor()); + else + rRenderContext.SetTextColor(rStyleSettings.GetDialogTextColor()); + + Point aPos(rRect.TopLeft()); + int nItemHeight = rRect.GetHeight(); + + sal_Int16 nNodeType = mpEffect->getNodeType(); + if (nNodeType == EffectNodeType::ON_CLICK ) + { + rRenderContext.DrawImage(aPos, Image(StockImage::Yes, BMP_CUSTOMANIMATION_ON_CLICK)); + } + else if (nNodeType == EffectNodeType::AFTER_PREVIOUS) + { + rRenderContext.DrawImage(aPos, Image(StockImage::Yes, BMP_CUSTOMANIMATION_AFTER_PREVIOUS)); + } + else if (nNodeType == EffectNodeType::WITH_PREVIOUS) + { + //FIXME With previous image not defined in CustomAnimation.src + } + + aPos.AdjustX(nIconWidth); + + //TODO, full width of widget ? + rRenderContext.DrawText(aPos, rRenderContext.GetEllipsisString(msDescription, rRect.GetWidth())); + + aPos.AdjustY(nIconWidth); + + OUString sImage; + switch (mpEffect->getPresetClass()) + { + case EffectPresetClass::ENTRANCE: + sImage = BMP_CUSTOMANIMATION_ENTRANCE_EFFECT; break; + case EffectPresetClass::EXIT: + sImage = BMP_CUSTOMANIMATION_EXIT_EFFECT; break; + case EffectPresetClass::EMPHASIS: + sImage = BMP_CUSTOMANIMATION_EMPHASIS_EFFECT; break; + case EffectPresetClass::MOTIONPATH: + sImage = BMP_CUSTOMANIMATION_MOTION_PATH; break; + case EffectPresetClass::OLEACTION: + sImage = BMP_CUSTOMANIMATION_OLE; break; + case EffectPresetClass::MEDIACALL: + switch (mpEffect->getCommand()) + { + case EffectCommands::TOGGLEPAUSE: + sImage = BMP_CUSTOMANIMATION_MEDIA_PAUSE; break; + case EffectCommands::STOP: + sImage = BMP_CUSTOMANIMATION_MEDIA_STOP; break; + case EffectCommands::PLAY: + default: + sImage = BMP_CUSTOMANIMATION_MEDIA_PLAY; break; + } + break; + default: + break; + } + + if (!sImage.isEmpty()) + { + Image aImage(StockImage::Yes, sImage); + Point aImagePos(aPos); + aImagePos.AdjustY((nItemHeight/2 - aImage.GetSizePixel().Height()) >> 1 ); + rRenderContext.DrawImage(aImagePos, aImage); + } + + aPos.AdjustX(nIconWidth ); + aPos.AdjustY((nItemHeight/2 - rRenderContext.GetTextHeight()) >> 1 ); + + rRenderContext.DrawText(aPos, rRenderContext.GetEllipsisString(msEffectName, rRect.GetWidth())); + rRenderContext.Pop(); +} + +void CustomAnimationListEntryItem::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected) +{ + if (mpEffect) + PaintEffect(rRenderContext, rRect, bSelected); + else + PaintTrigger(rRenderContext, rRect); +} + +CustomAnimationList::CustomAnimationList(std::unique_ptr xTreeView, + std::unique_ptr xLabel, + std::unique_ptr xScrolledWindow) + : mxTreeView(std::move(xTreeView)) + , maDropTargetHelper(*this) + , mxEmptyLabel(std::move(xLabel)) + , mxEmptyLabelParent(std::move(xScrolledWindow)) + , mbIgnorePaint(false) + , mpController(nullptr) + , mnLastGroupId(0) + , mnPostExpandEvent(nullptr) + , mnPostCollapseEvent(nullptr) +{ + mxEmptyLabel->set_stack_background(); + + mxTreeView->set_selection_mode(SelectionMode::Multiple); + mxTreeView->connect_changed(LINK(this, CustomAnimationList, SelectHdl)); + mxTreeView->connect_key_press(LINK(this, CustomAnimationList, KeyInputHdl)); + mxTreeView->connect_popup_menu(LINK(this, CustomAnimationList, CommandHdl)); + mxTreeView->connect_row_activated(LINK(this, CustomAnimationList, DoubleClickHdl)); + mxTreeView->connect_expanding(LINK(this, CustomAnimationList, ExpandHdl)); + mxTreeView->connect_collapsing(LINK(this, CustomAnimationList, CollapseHdl)); + mxTreeView->connect_drag_begin(LINK(this, CustomAnimationList, DragBeginHdl)); + mxTreeView->connect_custom_get_size(LINK(this, CustomAnimationList, CustomGetSizeHdl)); + mxTreeView->connect_custom_render(LINK(this, CustomAnimationList, CustomRenderHdl)); + mxTreeView->set_column_custom_renderer(1, true); +} + +CustomAnimationListDropTarget::CustomAnimationListDropTarget(CustomAnimationList& rTreeView) + : DropTargetHelper(rTreeView.get_widget().get_drop_target()) + , m_rTreeView(rTreeView) +{ +} + +sal_Int8 CustomAnimationListDropTarget::AcceptDrop(const AcceptDropEvent& rEvt) +{ + sal_Int8 nAccept = m_rTreeView.AcceptDrop(rEvt); + + if (nAccept != DND_ACTION_NONE) + { + // to enable the autoscroll when we're close to the edges + weld::TreeView& rWidget = m_rTreeView.get_widget(); + rWidget.get_dest_row_at_pos(rEvt.maPosPixel, nullptr, true); + } + + return nAccept; +} + +sal_Int8 CustomAnimationListDropTarget::ExecuteDrop(const ExecuteDropEvent& rEvt) +{ + return m_rTreeView.ExecuteDrop(rEvt); +} + +// D'n'D #1: Record selected effects for drag'n'drop. +IMPL_LINK(CustomAnimationList, DragBeginHdl, bool&, rUnsetDragIcon, bool) +{ + rUnsetDragIcon = false; + + // Record which effects are selected: + // Since NextSelected(..) iterates through the selected items in the order they + // were selected, create a sorted list for simpler drag'n'drop algorithms. + mDndEffectsSelected.clear(); + mxTreeView->selected_foreach([this](weld::TreeIter& rEntry){ + mDndEffectsSelected.emplace_back(mxTreeView->make_iterator(&rEntry)); + return false; + }); + + // Note: pEntry is the effect with focus (if multiple effects are selected) + mxDndEffectDragging = mxTreeView->make_iterator(); + if (!mxTreeView->get_cursor(mxDndEffectDragging.get())) + mxDndEffectDragging.reset(); + + // Allow normal processing. + return false; +} + +// D'n'D #3: Called each time mouse moves during drag +sal_Int8 CustomAnimationList::AcceptDrop( const AcceptDropEvent& rEvt ) +{ + sal_Int8 ret = DND_ACTION_NONE; + + const bool bIsMove = DND_ACTION_MOVE == rEvt.mnAction; + if (mxDndEffectDragging && !rEvt.mbLeaving && bIsMove) + ret = DND_ACTION_MOVE; + return ret; +} + +// D'n'D #5: Tell model to update effect order. +sal_Int8 CustomAnimationList::ExecuteDrop(const ExecuteDropEvent& rEvt) +{ + std::unique_ptr xDndEffectInsertBefore(mxTreeView->make_iterator()); + if (!mxTreeView->get_dest_row_at_pos(rEvt.maPosPixel, xDndEffectInsertBefore.get(), true)) + xDndEffectInsertBefore.reset(); + + const bool bMovingEffect = ( mxDndEffectDragging != nullptr ); + const bool bMoveNotSelf = !xDndEffectInsertBefore || (mxDndEffectDragging && mxTreeView->iter_compare(*xDndEffectInsertBefore, *mxDndEffectDragging) != 0); + const bool bHaveSequence(mpMainSequence); + + if( bMovingEffect && bMoveNotSelf && bHaveSequence ) + { + CustomAnimationListEntryItem* pTarget = xDndEffectInsertBefore ? + weld::fromId(mxTreeView->get_id(*xDndEffectInsertBefore)) : + nullptr; + + // Build list of effects + std::vector< CustomAnimationEffectPtr > aEffects; + for( const auto &pEntry : mDndEffectsSelected ) + { + CustomAnimationListEntryItem* pCustomAnimationEffect = weld::fromId(mxTreeView->get_id(*pEntry)); + aEffects.push_back(pCustomAnimationEffect->getEffect()); + } + + // Callback to observer to have it update the model. + // If pTarget is null, pass nullptr to indicate end of list. + mpController->onDragNDropComplete( + std::move(aEffects), + pTarget ? pTarget->getEffect() : nullptr ); + + // Reset selection + mxTreeView->select(*mxDndEffectDragging); + Select(); + } + + // NOTE: Don't call default handler because all required + // move operations have been completed here to update the model. + return DND_ACTION_NONE; +} + +CustomAnimationList::~CustomAnimationList() +{ + if (mnPostExpandEvent) + { + Application::RemoveUserEvent(mnPostExpandEvent); + mnPostExpandEvent = nullptr; + } + + if (mnPostCollapseEvent) + { + Application::RemoveUserEvent(mnPostCollapseEvent); + mnPostCollapseEvent = nullptr; + } + + if( mpMainSequence ) + mpMainSequence->removeListener( this ); + + clear(); +} + +IMPL_LINK(CustomAnimationList, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + const int nKeyCode = rKEvt.GetKeyCode().GetCode(); + switch (nKeyCode) + { + case KEY_DELETE: + mpController->onContextMenu("remove"); + return true; + case KEY_INSERT: + mpController->onContextMenu("create"); + return true; + case KEY_SPACE: + { + std::unique_ptr xEntry = mxTreeView->make_iterator(); + if (mxTreeView->get_cursor(xEntry.get())) + { + auto aRect = mxTreeView->get_row_area(*xEntry); + const Point aPos(aRect.getOpenWidth() / 2, aRect.getOpenHeight() / 2); + const CommandEvent aCEvt(aPos, CommandEventId::ContextMenu); + CommandHdl(aCEvt); + return true; + } + } + } + return false; +} + +/** selects or deselects the given effect. + Selections of other effects are not changed */ +void CustomAnimationList::select( const CustomAnimationEffectPtr& pEffect ) +{ + CustomAnimationListEntryItem* pEntry = nullptr; + + std::unique_ptr xEntry = mxTreeView->make_iterator(); + if (mxTreeView->get_iter_first(*xEntry)) + { + do + { + CustomAnimationListEntryItem* pTestEntry = weld::fromId(mxTreeView->get_id(*xEntry)); + if (pTestEntry->getEffect() == pEffect) + { + mxTreeView->select(*xEntry); + mxTreeView->scroll_to_row(*xEntry); + pEntry = pTestEntry; + break; + } + } while (mxTreeView->iter_next(*xEntry)); + } + + if( !pEntry ) + { + append( pEffect ); + select( pEffect ); + } +} + +void CustomAnimationList::clear() +{ + mxEntries.clear(); + mxTreeView->clear(); + + mxEmptyLabelParent->show(); + mxTreeView->hide(); + + mxLastParentEntry.reset(); + mxLastTargetShape = nullptr; +} + +void CustomAnimationList::update( const MainSequencePtr& pMainSequence ) +{ + if( mpMainSequence ) + mpMainSequence->removeListener( this ); + + mpMainSequence = pMainSequence; + update(); + + if( mpMainSequence ) + mpMainSequence->addListener( this ); +} + +struct stl_append_effect_func +{ + explicit stl_append_effect_func( CustomAnimationList& rList ) : mrList( rList ) {} + void operator()(const CustomAnimationEffectPtr& pEffect); + CustomAnimationList& mrList; +}; + +void stl_append_effect_func::operator()(const CustomAnimationEffectPtr& pEffect) +{ + mrList.append( pEffect ); +} + +void CustomAnimationList::update() +{ + mbIgnorePaint = true; + + std::vector< CustomAnimationEffectPtr > aVisible; + std::vector< CustomAnimationEffectPtr > aSelected; + CustomAnimationEffectPtr aCurrent; + + CustomAnimationEffectPtr pFirstSelEffect; + CustomAnimationEffectPtr pLastSelEffect; + ::tools::Long nFirstVis = -1; + ::tools::Long nLastVis = -1; + ::tools::Long nFirstSelOld = -1; + ::tools::Long nLastSelOld = -1; + + std::unique_ptr xEntry = mxTreeView->make_iterator(); + + if( mpMainSequence ) + { + std::unique_ptr xLastSelectedEntry; + std::unique_ptr xLastVisibleEntry; + + // save selection, current, and expand (visible) states + mxTreeView->all_foreach([this, &aVisible, &nFirstVis, &xLastVisibleEntry, + &aSelected, &nFirstSelOld, &pFirstSelEffect, &xLastSelectedEntry](weld::TreeIter& rEntry){ + CustomAnimationListEntryItem* pEntry = weld::fromId(mxTreeView->get_id(rEntry)); + CustomAnimationEffectPtr pEffect(pEntry->getEffect()); + if (pEffect) + { + if (weld::IsEntryVisible(*mxTreeView, rEntry)) + { + aVisible.push_back(pEffect); + // save scroll position + if (nFirstVis == -1) + nFirstVis = weld::GetAbsPos(*mxTreeView, rEntry); + if (!xLastVisibleEntry) + xLastVisibleEntry = mxTreeView->make_iterator(&rEntry); + else + mxTreeView->copy_iterator(rEntry, *xLastVisibleEntry); + } + + if (mxTreeView->is_selected(rEntry)) + { + aSelected.push_back(pEffect); + if (nFirstSelOld == -1) + { + pFirstSelEffect = pEffect; + nFirstSelOld = weld::GetAbsPos(*mxTreeView, rEntry); + } + if (!xLastSelectedEntry) + xLastSelectedEntry = mxTreeView->make_iterator(&rEntry); + else + mxTreeView->copy_iterator(rEntry, *xLastSelectedEntry); + } + } + + return false; + }); + + if (xLastSelectedEntry) + { + CustomAnimationListEntryItem* pEntry = weld::fromId(mxTreeView->get_id(*xLastSelectedEntry)); + pLastSelEffect = pEntry->getEffect(); + nLastSelOld = weld::GetAbsPos(*mxTreeView, *xLastSelectedEntry); + } + + if (xLastVisibleEntry) + nLastVis = weld::GetAbsPos(*mxTreeView, *xLastVisibleEntry); + + if (mxTreeView->get_cursor(xEntry.get())) + { + CustomAnimationListEntryItem* pEntry = weld::fromId(mxTreeView->get_id(*xEntry)); + aCurrent = pEntry->getEffect(); + } + } + + // rebuild list + + mxTreeView->freeze(); + + clear(); + + if (mpMainSequence) + { + std::for_each( mpMainSequence->getBegin(), mpMainSequence->getEnd(), stl_append_effect_func( *this ) ); + mxLastParentEntry.reset(); + + auto rInteractiveSequenceVector = mpMainSequence->getInteractiveSequenceVector(); + + for (InteractiveSequencePtr const& pIS : rInteractiveSequenceVector) + { + Reference< XShape > xShape( pIS->getTriggerShape() ); + if( xShape.is() ) + { + OUString aDescription = SdResId(STR_CUSTOMANIMATION_TRIGGER) + ": " + + getShapeDescription( xShape, false ); + + mxEntries.emplace_back(std::make_unique(aDescription, nullptr)); + + OUString sId(weld::toId(mxEntries.back().get())); + mxTreeView->insert(nullptr, -1, &aDescription, &sId, nullptr, nullptr, false, nullptr); + std::for_each( pIS->getBegin(), pIS->getEnd(), stl_append_effect_func( *this ) ); + mxLastParentEntry.reset(); + } + } + } + + mxTreeView->thaw(); + + if (mxTreeView->n_children()) + { + mxEmptyLabelParent->hide(); + mxTreeView->show(); + } + + if (mpMainSequence) + { + ::tools::Long nFirstSelNew = -1; + ::tools::Long nLastSelNew = -1; + + std::vector> aNewSelection; + + // restore selection state, expand state, and current-entry (under cursor) + if (mxTreeView->get_iter_first(*xEntry)) + { + do + { + CustomAnimationListEntryItem* pEntry = weld::fromId(mxTreeView->get_id(*xEntry)); + + CustomAnimationEffectPtr pEffect( pEntry->getEffect() ); + if (pEffect) + { + // Any effects that were visible should still be visible, so expand their parents. + // (a previously expanded parent may have moved leaving a child to now be the new parent to expand) + if( std::find( aVisible.begin(), aVisible.end(), pEffect ) != aVisible.end() ) + { + if (mxTreeView->get_iter_depth(*xEntry)) + { + std::unique_ptr xParentEntry = mxTreeView->make_iterator(xEntry.get()); + mxTreeView->iter_parent(*xParentEntry); + mxTreeView->expand_row(*xParentEntry); + } + } + + if( std::find( aSelected.begin(), aSelected.end(), pEffect ) != aSelected.end() ) + aNewSelection.emplace_back(mxTreeView->make_iterator(xEntry.get())); + + // Restore the cursor, as it may deselect other effects wait until + // after the loop to reset the selection + if( pEffect == aCurrent ) + mxTreeView->set_cursor(*xEntry); + + if (pEffect == pFirstSelEffect) + nFirstSelNew = weld::GetAbsPos(*mxTreeView, *xEntry); + + if (pEffect == pLastSelEffect) + nLastSelNew = weld::GetAbsPos(*mxTreeView, *xEntry); + } + } while (mxTreeView->iter_next(*xEntry)); + } + + // tdf#147032 unselect what previous set_cursor may have caused to get selected as a side-effect + mxTreeView->unselect_all(); + for (const auto& rEntry : aNewSelection) + mxTreeView->select(*rEntry); + + // Scroll to a selected entry, depending on where the selection moved. + const bool bMoved = nFirstSelNew != nFirstSelOld; + const bool bMovedUp = nFirstSelNew < nFirstSelOld; + const bool bMovedDown = nFirstSelNew > nFirstSelOld; + + if( bMoved && nLastSelOld < nFirstVis && nLastSelNew < nFirstVis ) + { + // The selection is above the visible area. + // Scroll up to show the last few selected entries. + if( nLastSelNew - (nLastVis - nFirstVis) > nFirstSelNew) + { + // The entries in the selection range can't fit in view. + // Scroll so the last selected entry is last in view. + mxTreeView->vadjustment_set_value(nLastSelNew - (nLastVis - nFirstVis)); + } + else + mxTreeView->vadjustment_set_value(nFirstSelNew); + } + else if( bMoved && nFirstSelOld > nLastVis && nFirstSelNew > nLastVis ) + { + // The selection is below the visible area. + // Scroll down to the first few selected entries. + mxTreeView->vadjustment_set_value(nFirstSelNew); + } + else if( bMovedUp && nFirstSelOld <= nFirstVis ) + { + // A visible entry has moved up out of view; scroll up one. + mxTreeView->vadjustment_set_value(nFirstVis - 1); + } + else if( bMovedDown && nLastSelOld >= nLastVis ) + { + // An entry has moved down out of view; scroll down one. + mxTreeView->vadjustment_set_value(nFirstVis + 1); + } + else if ( nFirstVis != -1 ) + { + // The selection is still in view, or it hasn't moved. + mxTreeView->vadjustment_set_value(nFirstVis); + } + } + + mbIgnorePaint = false; + + Select(); +} + +void CustomAnimationList::append( CustomAnimationEffectPtr pEffect ) +{ + Any aTarget( pEffect->getTarget() ); + if( !aTarget.hasValue() ) + return; + + try + { + // create a ui description + OUString aDescription = getDescription(aTarget, pEffect->getTargetSubItem() != ShapeAnimationSubType::ONLY_BACKGROUND); + + std::unique_ptr xParentEntry; + + Reference< XShape > xTargetShape( pEffect->getTargetShape() ); + sal_Int32 nGroupId = pEffect->getGroupId(); + + // if this effect has the same target and group-id as the last root effect, + // the last root effect is also this effects parent + if (mxLastParentEntry && nGroupId != -1 && mxLastTargetShape == xTargetShape && mnLastGroupId == nGroupId) + xParentEntry = mxTreeView->make_iterator(mxLastParentEntry.get()); + + // create an entry for the effect + std::unique_ptr xEntry = mxTreeView->make_iterator(); + + mxEntries.emplace_back(std::make_unique(aDescription, pEffect)); + + OUString sId(weld::toId(mxEntries.back().get())); + + if (xParentEntry) + { + // add a subentry + mxTreeView->insert(xParentEntry.get(), -1, &aDescription, &sId, nullptr, nullptr, false, xEntry.get()); + } + else + { + // add a root entry + mxTreeView->insert(nullptr, -1, &aDescription, &sId, nullptr, nullptr, false, xEntry.get()); + + // and the new root entry becomes the possible next group header + mxLastTargetShape = xTargetShape; + mnLastGroupId = nGroupId; + mxLastParentEntry = std::move(xEntry); + } + } + catch (const Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationList::append()" ); + } +} + +static void selectShape(weld::TreeView* pTreeList, const Reference< XShape >& xShape ) +{ + std::unique_ptr xEntry = pTreeList->make_iterator(); + if (!pTreeList->get_iter_first(*xEntry)) + return; + + bool bFirstEntry = true; + + do + { + CustomAnimationListEntryItem* pEntry = weld::fromId(pTreeList->get_id(*xEntry)); + CustomAnimationEffectPtr pEffect(pEntry->getEffect()); + if (pEffect) + { + if (pEffect->getTarget() == xShape) + { + pTreeList->select(*xEntry); + if (bFirstEntry) + { + pTreeList->scroll_to_row(*xEntry); + bFirstEntry = false; + } + } + } + } while (pTreeList->iter_next(*xEntry)); +} + +void CustomAnimationList::onSelectionChanged(const Any& rSelection) +{ + try + { + mxTreeView->unselect_all(); + + if (rSelection.hasValue()) + { + Reference< XIndexAccess > xShapes(rSelection, UNO_QUERY); + if( xShapes.is() ) + { + sal_Int32 nCount = xShapes->getCount(); + sal_Int32 nIndex; + for( nIndex = 0; nIndex < nCount; nIndex++ ) + { + Reference< XShape > xShape( xShapes->getByIndex( nIndex ), UNO_QUERY ); + if( xShape.is() ) + selectShape(mxTreeView.get(), xShape); + } + } + else + { + Reference< XShape > xShape(rSelection, UNO_QUERY); + if( xShape.is() ) + selectShape(mxTreeView.get(), xShape); + } + } + + Select(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationList::onSelectionChanged()" ); + } +} + +IMPL_LINK_NOARG(CustomAnimationList, SelectHdl, weld::TreeView&, void) +{ + Select(); +} + +// Notify controller to refresh UI when we are notified of selection change from base class +void CustomAnimationList::Select() +{ + if( mbIgnorePaint ) + return; + mpController->onSelect(); +} + +IMPL_LINK_NOARG(CustomAnimationList, PostExpandHdl, void*, void) +{ + std::unique_ptr xEntry = mxTreeView->make_iterator(); + if (mxTreeView->get_selected(xEntry.get())) + { + for (bool bChild = mxTreeView->iter_children(*xEntry); bChild; bChild = mxTreeView->iter_next_sibling(*xEntry)) + { + if (!mxTreeView->is_selected(*xEntry)) + mxTreeView->select(*xEntry); + } + } + + // Notify controller that selection has changed (it should update the UI) + mpController->onSelect(); + + mnPostExpandEvent = nullptr; +} + +IMPL_LINK(CustomAnimationList, ExpandHdl, const weld::TreeIter&, rParent, bool) +{ + // If expanded entry is selected, then select its children too afterwards. + if (mxTreeView->is_selected(rParent) && !mnPostExpandEvent) { + mnPostExpandEvent = Application::PostUserEvent(LINK(this, CustomAnimationList, PostExpandHdl)); + } + + return true; +} + +IMPL_LINK_NOARG(CustomAnimationList, PostCollapseHdl, void*, void) +{ + // Deselect all entries as SvTreeListBox::Collapse selects the last + // entry to have focus (or its parent), which is not desired + mxTreeView->unselect_all(); + + // Restore selection state for entries which are still visible + for (const auto &pEntry : lastSelectedEntries) + { + if (weld::IsEntryVisible(*mxTreeView, *pEntry)) + mxTreeView->select(*pEntry); + } + + lastSelectedEntries.clear(); + + // Notify controller that selection has changed (it should update the UI) + mpController->onSelect(); + + mnPostCollapseEvent = nullptr; +} + +IMPL_LINK_NOARG(CustomAnimationList, CollapseHdl, const weld::TreeIter&, bool) +{ + if (!mnPostCollapseEvent) + { + // weld::TreeView::collapse() discards multi-selection state + // of list entries, so first save current selection state + mxTreeView->selected_foreach([this](weld::TreeIter& rEntry){ + lastSelectedEntries.emplace_back(mxTreeView->make_iterator(&rEntry)); + return false; + }); + + mnPostCollapseEvent = Application::PostUserEvent(LINK(this, CustomAnimationList, PostCollapseHdl)); + } + + // Execute collapse on base class + return true; +} + +bool CustomAnimationList::isExpanded( const CustomAnimationEffectPtr& pEffect ) const +{ + bool bExpanded = true; // we assume expanded by default + + std::unique_ptr xEntry = mxTreeView->make_iterator(); + if (mxTreeView->get_iter_first(*xEntry)) + { + do + { + CustomAnimationListEntryItem* pEntry = + weld::fromId(mxTreeView->get_id(*xEntry)); + if (pEntry->getEffect() == pEffect) + { + if (mxTreeView->get_iter_depth(*xEntry)) // no parent, keep expanded default of true + { + std::unique_ptr xParentEntry = mxTreeView->make_iterator(xEntry.get()); + if (mxTreeView->iter_parent(*xParentEntry)) + bExpanded = mxTreeView->get_row_expanded(*xParentEntry); + } + break; + } + } while (mxTreeView->iter_next(*xEntry)); + } + + return bExpanded; +} + +bool CustomAnimationList::isVisible(const CustomAnimationEffectPtr& pEffect) const +{ + std::unique_ptr xEntry = mxTreeView->make_iterator(); + if (mxTreeView->get_iter_first(*xEntry)) + { + do + { + CustomAnimationListEntryItem* pTestEntry = weld::fromId(mxTreeView->get_id(*xEntry)); + if (pTestEntry->getEffect() == pEffect) + return weld::IsEntryVisible(*mxTreeView, *xEntry); + } while (mxTreeView->iter_next(*xEntry)); + } + return true; +} + +EffectSequence CustomAnimationList::getSelection() const +{ + EffectSequence aSelection; + + mxTreeView->selected_foreach([this, &aSelection](weld::TreeIter& rEntry){ + CustomAnimationListEntryItem* pEntry = weld::fromId(mxTreeView->get_id(rEntry)); + CustomAnimationEffectPtr pEffect(pEntry->getEffect()); + if (pEffect) + aSelection.push_back(pEffect); + + // if the selected effect is not expanded and has children + // we say that the children are automatically selected + if (!mxTreeView->get_row_expanded(rEntry) && mxTreeView->iter_has_child(rEntry)) + { + std::unique_ptr xChild = mxTreeView->make_iterator(&rEntry); + (void)mxTreeView->iter_children(*xChild); + + do + { + if (!mxTreeView->is_selected(*xChild)) + { + CustomAnimationListEntryItem* pChild = weld::fromId(mxTreeView->get_id(*xChild)); + const CustomAnimationEffectPtr& pChildEffect( pChild->getEffect() ); + if( pChildEffect ) + aSelection.push_back( pChildEffect ); + } + } while (mxTreeView->iter_next_sibling(*xChild)); + } + + return false; + }); + + return aSelection; +} + +IMPL_LINK_NOARG(CustomAnimationList, DoubleClickHdl, weld::TreeView&, bool) +{ + mpController->onDoubleClick(); + return false; +} + +IMPL_LINK(CustomAnimationList, CommandHdl, const CommandEvent&, rCEvt, bool) +{ + if (rCEvt.GetCommand() != CommandEventId::ContextMenu) + return false; + + if (rCEvt.IsMouseEvent()) + { + ::Point aPos = rCEvt.GetMousePosPixel(); + std::unique_ptr xIter(mxTreeView->make_iterator()); + if (mxTreeView->get_dest_row_at_pos(aPos, xIter.get(), false) && !mxTreeView->is_selected(*xIter)) + { + mxTreeView->unselect_all(); + mxTreeView->set_cursor(*xIter); + mxTreeView->select(*xIter); + SelectHdl(*mxTreeView); + } + } + + if (!mxTreeView->get_selected(nullptr)) + return false; + + std::unique_ptr xBuilder(Application::CreateBuilder(mxTreeView.get(), "modules/simpress/ui/effectmenu.ui")); + std::unique_ptr xMenu = xBuilder->weld_menu("menu"); + + sal_Int16 nNodeType = -1; + sal_Int16 nEntries = 0; + + mxTreeView->selected_foreach([this, &nNodeType, &nEntries](weld::TreeIter& rEntry){ + CustomAnimationListEntryItem* pEntry = weld::fromId(mxTreeView->get_id(rEntry)); + CustomAnimationEffectPtr pEffect(pEntry->getEffect()); + + nEntries++; + if (pEffect) + { + if( nNodeType == -1 ) + { + nNodeType = pEffect->getNodeType(); + } + else + { + if( nNodeType != pEffect->getNodeType() ) + { + nNodeType = -1; + return true; + } + } + } + + return false; + }); + + xMenu->set_active("onclick", nNodeType == EffectNodeType::ON_CLICK); + xMenu->set_active("withprev", nNodeType == EffectNodeType::WITH_PREVIOUS); + xMenu->set_active("afterprev", nNodeType == EffectNodeType::AFTER_PREVIOUS); + xMenu->set_sensitive("options", nEntries == 1); + xMenu->set_sensitive("timing", nEntries == 1); + + OUString sCommand = xMenu->popup_at_rect(mxTreeView.get(), ::tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1))); + if (!sCommand.isEmpty()) + ExecuteContextMenuAction(sCommand); + + return true; +} + +void CustomAnimationList::ExecuteContextMenuAction(const OUString& rIdent) +{ + mpController->onContextMenu(rIdent); +} + +void CustomAnimationList::notify_change() +{ + update(); + mpController->onSelect(); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/CustomAnimationPane.cxx b/sd/source/ui/animations/CustomAnimationPane.cxx new file mode 100644 index 0000000000..7eb6231387 --- /dev/null +++ b/sd/source/ui/animations/CustomAnimationPane.cxx @@ -0,0 +1,2578 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "STLPropertySet.hxx" +#include +#include "CustomAnimationDialog.hxx" +#include +#include "motionpathtag.hxx" +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::animations; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::text; + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using ::com::sun::star::view::XSelectionSupplier; +using ::com::sun::star::beans::XPropertySet; +using ::com::sun::star::container::XIndexAccess; +using ::com::sun::star::container::XEnumerationAccess; +using ::com::sun::star::container::XEnumeration; +using ::com::sun::star::text::XText; +using ::sd::framework::FrameworkHelper; +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; + +namespace sd { + +void fillRepeatComboBox(weld::ComboBox& rBox) +{ + OUString aNone( SdResId( STR_CUSTOMANIMATION_REPEAT_NONE ) ); + rBox.append_text(aNone); + rBox.append_text(OUString::number(2)); + rBox.append_text(OUString::number(3)); + rBox.append_text(OUString::number(4)); + rBox.append_text(OUString::number(5)); + rBox.append_text(OUString::number(10)); + + OUString aUntilClick( SdResId( STR_CUSTOMANIMATION_REPEAT_UNTIL_NEXT_CLICK ) ); + rBox.append_text(aUntilClick); + + OUString aEndOfSlide( SdResId( STR_CUSTOMANIMATION_REPEAT_UNTIL_END_OF_SLIDE ) ); + rBox.append_text(aEndOfSlide); +} + +CustomAnimationPane::CustomAnimationPane( weld::Widget* pParent, ViewShellBase& rBase ) + : PanelLayout(pParent, "CustomAnimationsPanel", "modules/simpress/ui/customanimationspanel.ui") + , mrBase(rBase) + // load resources + , mxFTAnimation(m_xBuilder->weld_label("effectlabel")) + , mxCustomAnimationList(new CustomAnimationList(m_xBuilder->weld_tree_view("custom_animation_list"), + m_xBuilder->weld_label("custom_animation_label"), + m_xBuilder->weld_widget("custom_animation_label_parent"))) + , mxPBAddEffect(m_xBuilder->weld_button("add_effect")) + , mxPBRemoveEffect(m_xBuilder->weld_button("remove_effect")) + , mxPBMoveUp(m_xBuilder->weld_button("move_up")) + , mxPBMoveDown(m_xBuilder->weld_button("move_down")) + , mxFTCategory(m_xBuilder->weld_label("categorylabel")) + , mxLBCategory(m_xBuilder->weld_combo_box("categorylb")) + , mxFTEffect(m_xBuilder->weld_label("effect_label")) + , mxLBAnimation(m_xBuilder->weld_tree_view("effect_list")) + , mxFTStart(m_xBuilder->weld_label("start_effect")) + , mxLBStart(m_xBuilder->weld_combo_box("start_effect_list")) + , mxFTProperty(m_xBuilder->weld_label("effect_property")) + , mxPlaceholderBox(m_xBuilder->weld_container("placeholder")) + , mxPBPropertyMore(m_xBuilder->weld_button("more_properties")) + , mxFTDuration(m_xBuilder->weld_label("effect_duration")) + , mxCBXDuration(m_xBuilder->weld_metric_spin_button("anim_duration", FieldUnit::SECOND)) + , mxFTStartDelay(m_xBuilder->weld_label("delay_label")) + , mxMFStartDelay(m_xBuilder->weld_metric_spin_button("delay_value", FieldUnit::SECOND)) + , mxCBAutoPreview(m_xBuilder->weld_check_button("auto_preview")) + , mxPBPlay(m_xBuilder->weld_button("play")) + , maIdle("sd idle treeview select") + , mnLastSelectedAnimation(-1) + , mnPropertyType(nPropertyTypeNone) + , mnCurvePathPos(-1) + , mnPolygonPathPos(-1) + , mnFreeformPathPos(-1) + , maLateInitTimer("sd CustomAnimationPane maLateInitTimer") +{ + initialize(); +} + +css::ui::LayoutSize CustomAnimationPane::GetHeightForWidth(const sal_Int32 /*nWidth*/) +{ + sal_Int32 nMinimumHeight = get_preferred_size().Height(); + return css::ui::LayoutSize(nMinimumHeight, -1, nMinimumHeight); +} + +void CustomAnimationPane::initialize() +{ + mxLBAnimation->connect_changed(LINK(this, CustomAnimationPane, AnimationSelectHdl)); + mxCustomAnimationList->setController( static_cast ( this ) ); + mxCustomAnimationList->set_size_request(mxCustomAnimationList->get_approximate_digit_width() * 15, + mxCustomAnimationList->get_height_rows(4)); + + mxLBAnimation->set_size_request(mxLBAnimation->get_approximate_digit_width() * 15, + mxLBAnimation->get_height_rows(4)); + + maStrProperty = mxFTProperty->get_label(); + + mxPBAddEffect->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) ); + mxPBRemoveEffect->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) ); + mxLBStart->connect_changed( LINK( this, CustomAnimationPane, implControlListBoxHdl ) ); + mxCBXDuration->connect_value_changed(LINK( this, CustomAnimationPane, DurationModifiedHdl)); + mxPBPropertyMore->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) ); + mxPBMoveUp->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) ); + mxPBMoveDown->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) ); + mxPBPlay->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) ); + mxCBAutoPreview->connect_toggled( LINK( this, CustomAnimationPane, implToggleHdl ) ); + mxLBCategory->connect_changed( LINK(this, CustomAnimationPane, UpdateAnimationLB) ); + mxMFStartDelay->connect_value_changed( LINK(this, CustomAnimationPane, DelayModifiedHdl) ); + mxMFStartDelay->connect_focus_out(LINK( this, CustomAnimationPane, DelayLoseFocusHdl)); + + maIdle.SetPriority(TaskPriority::DEFAULT); + maIdle.SetInvokeHandler(LINK(this, CustomAnimationPane, SelectionHandler)); + + maStrModify = mxFTEffect->get_label(); + + // get current controller and initialize listeners + try + { + mxView.set(mrBase.GetController(), UNO_QUERY); + addListener(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::CustomAnimationPane()" ); + } + + // tdf#137637 keep user selection during initialization + ScopeLockGuard aGuard(maSelectionLock); + // get current page and update custom animation list + onChangeCurrentPage(); + + // Wait a short time before the presets list is created. This gives the + // system time to paint the control. + maLateInitTimer.SetTimeout(100); + maLateInitTimer.SetInvokeHandler(LINK(this, CustomAnimationPane, lateInitCallback)); + maLateInitTimer.Start(); +} + +CustomAnimationPane::~CustomAnimationPane() +{ + maLateInitTimer.Stop(); + + removeListener(); + + MotionPathTagVector aTags; + aTags.swap( maMotionPathTags ); + for (auto const& tag : aTags) + tag->Dispose(); + + mxPBAddEffect.reset(); + mxPBRemoveEffect.reset(); + mxFTEffect.reset(); + mxFTStart.reset(); + mxLBStart.reset(); + mxLBSubControl.reset(); + mxFTProperty.reset(); + mxPlaceholderBox.reset(); + mxPBPropertyMore.reset(); + mxFTDuration.reset(); + mxCBXDuration.reset(); + mxFTStartDelay.reset(); + mxMFStartDelay.reset(); + mxCustomAnimationList.reset(); + mxPBMoveUp.reset(); + mxPBMoveDown.reset(); + mxPBPlay.reset(); + mxCBAutoPreview.reset(); + mxFTCategory.reset(); + mxLBCategory.reset(); + mxFTAnimation.reset(); + mxLBAnimation.reset(); +} + +void CustomAnimationPane::addUndo() +{ + SfxUndoManager* pManager = mrBase.GetDocShell()->GetUndoManager(); + if( pManager ) + { + SdPage* pPage = SdPage::getImplementation( mxCurrentPage ); + if( pPage ) + pManager->AddUndoAction( std::make_unique( mrBase.GetDocShell()->GetDoc(), pPage ) ); + } +} + +void CustomAnimationPane::addListener() +{ + Link aLink( LINK(this,CustomAnimationPane,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->AddEventListener(aLink); +} + +void CustomAnimationPane::removeListener() +{ + Link aLink( LINK(this,CustomAnimationPane,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); +} + +IMPL_LINK(CustomAnimationPane,EventMultiplexerListener, + tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::EditViewSelection: + onSelectionChanged(); + break; + + case EventMultiplexerEventId::CurrentPageChanged: + onChangeCurrentPage(); + break; + + case EventMultiplexerEventId::MainViewAdded: + // At this moment the controller may not yet been set at model + // or ViewShellBase. Take it from the view shell passed with + // the event. + if (mrBase.GetMainViewShell() != nullptr) + { + if( mrBase.GetMainViewShell()->GetShellType() == ViewShell::ST_IMPRESS ) + { + mxView = mrBase.GetDrawController(); + onSelectionChanged(); + onChangeCurrentPage(); + break; + } + } + [[fallthrough]]; + case EventMultiplexerEventId::MainViewRemoved: + mxView = nullptr; + mxCurrentPage = nullptr; + updateControls(); + break; + + case EventMultiplexerEventId::Disposing: + mxView.clear(); + onSelectionChanged(); + onChangeCurrentPage(); + break; + case EventMultiplexerEventId::EndTextEdit: + if (mpMainSequence && rEvent.mpUserData) + mxCustomAnimationList->update( mpMainSequence ); + break; + default: break; + } +} + +static sal_Int32 getPropertyType( std::u16string_view rProperty ) +{ + if ( rProperty == u"Direction" ) + return nPropertyTypeDirection; + + if ( rProperty == u"Spokes" ) + return nPropertyTypeSpokes; + + if ( rProperty == u"Zoom" ) + return nPropertyTypeZoom; + + if ( rProperty == u"Accelerate" ) + return nPropertyTypeAccelerate; + + if ( rProperty == u"Decelerate" ) + return nPropertyTypeDecelerate; + + if ( rProperty == u"Color1" ) + return nPropertyTypeFirstColor; + + if ( rProperty == u"Color2" ) + return nPropertyTypeSecondColor; + + if ( rProperty == u"FillColor" ) + return nPropertyTypeFillColor; + + if ( rProperty == u"ColorStyle" ) + return nPropertyTypeColorStyle; + + if ( rProperty == u"AutoReverse" ) + return nPropertyTypeAutoReverse; + + if ( rProperty == u"FontStyle" ) + return nPropertyTypeFont; + + if ( rProperty == u"CharColor" ) + return nPropertyTypeCharColor; + + if ( rProperty == u"CharHeight" ) + return nPropertyTypeCharHeight; + + if ( rProperty == u"CharDecoration" ) + return nPropertyTypeCharDecoration; + + if ( rProperty == u"LineColor" ) + return nPropertyTypeLineColor; + + if ( rProperty == u"Rotate" ) + return nPropertyTypeRotate; + + if ( rProperty == u"Transparency" ) + return nPropertyTypeTransparency; + + if ( rProperty == u"Color" ) + return nPropertyTypeColor; + + if ( rProperty == u"Scale" ) + return nPropertyTypeScale; + + return nPropertyTypeNone; +} + +OUString getPropertyName( sal_Int32 nPropertyType ) +{ + switch( nPropertyType ) + { + case nPropertyTypeDirection: + return SdResId(STR_CUSTOMANIMATION_DIRECTION_PROPERTY); + + case nPropertyTypeSpokes: + return SdResId(STR_CUSTOMANIMATION_SPOKES_PROPERTY); + + case nPropertyTypeFirstColor: + return SdResId(STR_CUSTOMANIMATION_FIRST_COLOR_PROPERTY); + + case nPropertyTypeSecondColor: + return SdResId(STR_CUSTOMANIMATION_SECOND_COLOR_PROPERTY); + + case nPropertyTypeZoom: + return SdResId(STR_CUSTOMANIMATION_ZOOM_PROPERTY); + + case nPropertyTypeFillColor: + return SdResId(STR_CUSTOMANIMATION_FILL_COLOR_PROPERTY); + + case nPropertyTypeColorStyle: + return SdResId(STR_CUSTOMANIMATION_STYLE_PROPERTY); + + case nPropertyTypeFont: + return SdResId(STR_CUSTOMANIMATION_FONT_PROPERTY); + + case nPropertyTypeCharHeight: + return SdResId(STR_CUSTOMANIMATION_SIZE_PROPERTY); + + case nPropertyTypeCharColor: + return SdResId(STR_CUSTOMANIMATION_FONT_COLOR_PROPERTY); + + case nPropertyTypeCharHeightStyle: + return SdResId(STR_CUSTOMANIMATION_FONT_SIZE_STYLE_PROPERTY); + + case nPropertyTypeCharDecoration: + return SdResId(STR_CUSTOMANIMATION_FONT_STYLE_PROPERTY); + + case nPropertyTypeLineColor: + return SdResId(STR_CUSTOMANIMATION_LINE_COLOR_PROPERTY); + + case nPropertyTypeRotate: + return SdResId(STR_CUSTOMANIMATION_AMOUNT_PROPERTY); + + case nPropertyTypeColor: + return SdResId(STR_CUSTOMANIMATION_COLOR_PROPERTY); + + case nPropertyTypeTransparency: + return SdResId(STR_CUSTOMANIMATION_AMOUNT_PROPERTY); + + case nPropertyTypeScale: + return SdResId(STR_CUSTOMANIMATION_SCALE_PROPERTY); + } + + return OUString(); +} + +void CustomAnimationPane::updateControls() +{ + mxFTDuration->set_sensitive(mxView.is()); + mxCBXDuration->set_sensitive(mxView.is()); + mxCustomAnimationList->set_sensitive(mxView.is()); + if (comphelper::LibreOfficeKit::isActive()) + { + mxPBPlay->hide(); + mxCBAutoPreview->set_active(false); + mxCBAutoPreview->hide(); + } + else + { + mxPBPlay->set_sensitive(mxView.is()); + mxCBAutoPreview->set_sensitive(mxView.is()); + } + + if (!mxView.is()) + { + mxPBAddEffect->set_sensitive(false); + mxPBRemoveEffect->set_sensitive(false); + mxFTStart->set_sensitive(false); + mxLBStart->set_sensitive(false); + mxPBPropertyMore->set_sensitive(false); + mxPlaceholderBox->set_sensitive(false); + mxFTProperty->set_sensitive(false); + mxFTCategory->set_sensitive(false); + mxLBCategory->set_sensitive(false); + mxFTAnimation->set_sensitive(false); + mxLBAnimation->set_sensitive(false); + mxFTStartDelay->set_sensitive(false); + mxMFStartDelay->set_sensitive(false); + mxLBAnimation->clear(); + mnLastSelectedAnimation = -1; + mxCustomAnimationList->clear(); + return; + } + + const int nSelectionCount = maListSelection.size(); + + mxPBAddEffect->set_sensitive( maViewSelection.hasValue() ); + mxPBRemoveEffect->set_sensitive(nSelectionCount != 0); + bool bIsSelected = (nSelectionCount > 0); + + if(bIsSelected) + { + mxFTAnimation->set_sensitive(true); + mxLBAnimation->set_sensitive(true); + } + else + { + mxFTAnimation->set_sensitive(false); + mxLBAnimation->set_sensitive(false); + mxLBAnimation->clear(); + mnLastSelectedAnimation = -1; + } + + mxLBCategory->set_sensitive(bIsSelected); + mxFTCategory->set_sensitive(bIsSelected); + + mxFTStart->set_sensitive(nSelectionCount > 0); + mxLBStart->set_sensitive(nSelectionCount > 0); + mxPlaceholderBox->set_sensitive(nSelectionCount > 0); + mxPBPropertyMore->set_sensitive(nSelectionCount > 0); + mxFTStartDelay->set_sensitive(nSelectionCount > 0); + mxMFStartDelay->set_sensitive(nSelectionCount > 0); + + mxFTProperty->set_label(maStrProperty); + + sal_Int32 nOldPropertyType = mnPropertyType; + + mnPropertyType = nPropertyTypeNone; + + if(bIsSelected) + { + CustomAnimationEffectPtr pEffect = maListSelection.front(); + + OUString aUIName( CustomAnimationPresets::getCustomAnimationPresets().getUINameForPresetId( pEffect->getPresetId() ) ); + + OUString aTemp( maStrModify ); + + if( !aUIName.isEmpty() ) + { + aTemp += " " + aUIName; + mxFTEffect->set_label( aTemp ); + } + + Any aValue; + CustomAnimationPresetPtr pDescriptor = CustomAnimationPresets::getCustomAnimationPresets().getEffectDescriptor( pEffect->getPresetId() ); + if (pDescriptor) + { + std::vector aProperties( pDescriptor->getProperties() ); + if( !aProperties.empty() ) + { + mnPropertyType = getPropertyType( aProperties.front() ); + + mxFTProperty->set_label( getPropertyName( mnPropertyType ) ); + + aValue = getProperty1Value( mnPropertyType, pEffect ); + } + } + + sal_Int32 nNewPropertyType = mnPropertyType; + // if there is no value, then the control will be disabled, just show a disabled Direction box in that + // case to have something to fill the space + if (!aValue.hasValue()) + nNewPropertyType = nPropertyTypeDirection; + + if (!mxLBSubControl || nOldPropertyType != nNewPropertyType) + { + // for LOK destroy old widgets first + mxLBSubControl.reset(nullptr); + // then create new control, to keep correct pointers for actions + mxLBSubControl = SdPropertySubControl::create(nNewPropertyType, mxFTProperty.get(), mxPlaceholderBox.get(), GetFrameWeld(), aValue, pEffect->getPresetId(), LINK(this, CustomAnimationPane, implPropertyHdl)); + } + else + { + mxLBSubControl->setValue(aValue, pEffect->getPresetId()); + } + + bool bEnable = aValue.hasValue(); + mxPlaceholderBox->set_sensitive( bEnable ); + mxFTProperty->set_sensitive( bEnable ); + + if (!pDescriptor) + { + mxPBPropertyMore->set_sensitive( false ); + mxFTStartDelay->set_sensitive( false ); + mxMFStartDelay->set_sensitive( false ); + } + sal_Int32 nCategoryPos = -1; + switch(pEffect->getPresetClass()) + { + case EffectPresetClass::ENTRANCE: nCategoryPos = 0; break; + case EffectPresetClass::EMPHASIS: nCategoryPos = 1; break; + case EffectPresetClass::EXIT: nCategoryPos = 2; break; + case EffectPresetClass::MOTIONPATH: nCategoryPos = 3; break; + default: + break; + } + switch(pEffect->getCommand()) + { + case EffectCommands::TOGGLEPAUSE: + case EffectCommands::STOP: + case EffectCommands::PLAY: + nCategoryPos = 4; break; + default: + break; + } + mxLBCategory->set_active(nCategoryPos); + + fillAnimationLB( pEffect->hasText() ); + + OUString rsPresetId = pEffect->getPresetId(); + sal_Int32 nAnimationPos = mxLBAnimation->n_children(); + while( nAnimationPos-- ) + { + auto pEntryData = weld::fromId(mxLBAnimation->get_id(nAnimationPos)); + if (pEntryData) + { + CustomAnimationPresetPtr& pPtr = *pEntryData; + if( pPtr && pPtr->getPresetId() == rsPresetId ) + { + mxLBAnimation->select( nAnimationPos ); + mnLastSelectedAnimation = nAnimationPos; + break; + } + } + } + + // If preset id is missing and category is motion path. + if (nAnimationPos < 0 && nCategoryPos == 3) + { + if (rsPresetId == "libo-motionpath-curve") + { + mxLBAnimation->select(mnCurvePathPos); + mnLastSelectedAnimation = mnCurvePathPos; + } + else if (rsPresetId == "libo-motionpath-polygon") + { + mxLBAnimation->select(mnPolygonPathPos); + mnLastSelectedAnimation = mnPolygonPathPos; + } + else if (rsPresetId == "libo-motionpath-freeform-line") + { + mxLBAnimation->select(mnFreeformPathPos); + mnLastSelectedAnimation = mnFreeformPathPos; + } + } + + sal_uInt16 nPos = 0xffff; + + sal_Int16 nNodeType = pEffect->getNodeType(); + switch( nNodeType ) + { + case EffectNodeType::ON_CLICK: nPos = 0; break; + case EffectNodeType::WITH_PREVIOUS: nPos = 1; break; + case EffectNodeType::AFTER_PREVIOUS: nPos = 2; break; + } + + mxLBStart->set_active( nPos ); + + double fDuration = pEffect->getDuration(); + const bool bHasSpeed = fDuration > 0.001; + + mxFTDuration->set_sensitive(bHasSpeed); + mxCBXDuration->set_sensitive(bHasSpeed); + + if( bHasSpeed ) + { + mxCBXDuration->set_value(fDuration*100.0, FieldUnit::NONE); + } + + mxPBPropertyMore->set_sensitive(true); + + mxFTStartDelay->set_sensitive(true); + mxMFStartDelay->set_sensitive(true); + double fBegin = pEffect->getBegin(); + mxMFStartDelay->set_value(fBegin*10.0, FieldUnit::NONE); + } + else + { + // use an empty direction box to fill the space + if (!mxLBSubControl || (nOldPropertyType != nPropertyTypeDirection && nOldPropertyType != nPropertyTypeNone)) + { + // for LOK destroy old widgets first + mxLBSubControl.reset(nullptr); + // then create new control, to keep correct pointers for actions + mxLBSubControl = SdPropertySubControl::create(nPropertyTypeDirection, mxFTProperty.get(), mxPlaceholderBox.get(), GetFrameWeld(), uno::Any(), OUString(), LINK(this, CustomAnimationPane, implPropertyHdl)); + } + else + mxLBSubControl->setValue(uno::Any(), OUString()); + + mxPlaceholderBox->set_sensitive(false); + mxFTProperty->set_sensitive(false); + mxFTStartDelay->set_sensitive(false); + mxMFStartDelay->set_sensitive(false); + mxPBPropertyMore->set_sensitive(false); + mxFTDuration->set_sensitive(false); + mxCBXDuration->set_sensitive(false); + mxCBXDuration->set_text(OUString()); + mxFTEffect->set_label(maStrModify); + } + + bool bEnableUp = true; + bool bEnableDown = true; + if( nSelectionCount == 0 ) + { + bEnableUp = false; + bEnableDown = false; + } + else + { + if( mpMainSequence->find( maListSelection.front() ) == mpMainSequence->getBegin() ) + bEnableUp = false; + + EffectSequence::iterator aIter( mpMainSequence->find( maListSelection.back() ) ); + if( aIter == mpMainSequence->getEnd() ) + { + bEnableDown = false; + } + else + { + do + { + ++aIter; + } + while( (aIter != mpMainSequence->getEnd()) && !(mxCustomAnimationList->isExpanded(*aIter) ) ); + + if( aIter == mpMainSequence->getEnd() ) + bEnableDown = false; + } + + if( bEnableUp || bEnableDown ) + { + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + EffectSequenceHelper* pSequence = nullptr; + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + if( pEffect ) + { + if( pSequence == nullptr ) + { + pSequence = pEffect->getEffectSequence(); + } + else + { + if( pSequence != pEffect->getEffectSequence() ) + { + bEnableUp = false; + bEnableDown = false; + break; + } + } + } + } + } + } + + mxPBMoveUp->set_sensitive(mxView.is() && bEnableUp); + mxPBMoveDown->set_sensitive(mxView.is() && bEnableDown); + + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + mxCBAutoPreview->set_active(pOptions->IsPreviewChangedEffects()); + + updateMotionPathTags(); +} + +static bool updateMotionPathImpl( CustomAnimationPane& rPane, ::sd::View& rView, EffectSequence::iterator aIter, const EffectSequence::iterator& aEnd, MotionPathTagVector& rOldTags, MotionPathTagVector& rNewTags ) +{ + bool bChanges = false; + while( aIter != aEnd ) + { + CustomAnimationEffectPtr pEffect( *aIter++ ); + if( pEffect && pEffect->getPresetClass() == css::presentation::EffectPresetClass::MOTIONPATH ) + { + rtl::Reference< MotionPathTag > xMotionPathTag; + // first try to find if there is already a tag for this + auto aMIter = std::find_if(rOldTags.begin(), rOldTags.end(), + [&pEffect](const rtl::Reference& xTag) { return xTag->getEffect() == pEffect; }); + if (aMIter != rOldTags.end()) + { + rtl::Reference< MotionPathTag > xTag( *aMIter ); + if( !xTag->isDisposed() ) + { + xMotionPathTag = xTag; + rOldTags.erase( aMIter ); + } + } + + // if not found, create new one + if( !xMotionPathTag.is() ) + { + xMotionPathTag.set( new MotionPathTag( rPane, rView, pEffect ) ); + bChanges = true; + } + + if( xMotionPathTag.is() ) + rNewTags.push_back( xMotionPathTag ); + } + } + + return bChanges; +} + +void CustomAnimationPane::updateMotionPathTags() +{ + bool bChanges = false; + + MotionPathTagVector aTags; + aTags.swap( maMotionPathTags ); + + ::sd::View* pView = nullptr; + + if( mxView.is() ) + { + std::shared_ptr xViewShell( mrBase.GetMainViewShell() ); + if( xViewShell ) + pView = xViewShell->GetView(); + } + + if (mpMainSequence && pView) + { + bChanges = updateMotionPathImpl( *this, *pView, mpMainSequence->getBegin(), mpMainSequence->getEnd(), aTags, maMotionPathTags ); + + auto rInteractiveSequenceVector = mpMainSequence->getInteractiveSequenceVector(); + for (InteractiveSequencePtr const& pIS : rInteractiveSequenceVector) + { + bChanges |= updateMotionPathImpl( *this, *pView, pIS->getBegin(), pIS->getEnd(), aTags, maMotionPathTags ); + } + } + + if( !aTags.empty() ) + { + bChanges = true; + for( rtl::Reference< MotionPathTag >& xTag : aTags ) + { + xTag->Dispose(); + } + } + + if( bChanges && pView ) + pView->updateHandles(); +} + +void CustomAnimationPane::onSelectionChanged() +{ + if( maSelectionLock.isLocked() ) + return; + + ScopeLockGuard aGuard( maSelectionLock ); + + if( mxView.is() ) try + { + Reference< XSelectionSupplier > xSel( mxView, UNO_QUERY_THROW ); + maViewSelection = xSel->getSelection(); + mxCustomAnimationList->onSelectionChanged( maViewSelection ); + updateControls(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::onSelectionChanged()" ); + } +} + +void CustomAnimationPane::onDoubleClick() +{ + showOptions(); +} + +void CustomAnimationPane::onContextMenu(const OUString &rIdent) +{ + if (rIdent == "onclick") + onChangeStart( EffectNodeType::ON_CLICK ); + else if (rIdent == "withprev") + onChangeStart( EffectNodeType::WITH_PREVIOUS ); + else if (rIdent == "afterprev") + onChangeStart( EffectNodeType::AFTER_PREVIOUS ); + else if (rIdent == "options") + showOptions(); + else if (rIdent == "timing") + showOptions("timing"); + else if (rIdent == "remove") + onRemove(); + else if (rIdent == "create" && maViewSelection.hasValue()) + onAdd(); + updateControls(); +} + +static void addValue( const std::unique_ptr& pSet, sal_Int32 nHandle, const Any& rValue ) +{ + switch( pSet->getPropertyState( nHandle ) ) + { + case STLPropertyState::Ambiguous: + // value is already ambiguous, do nothing + break; + case STLPropertyState::Direct: + // set to ambiguous if existing value is different + if( rValue != pSet->getPropertyValue( nHandle ) ) + pSet->setPropertyState( nHandle, STLPropertyState::Ambiguous ); + break; + case STLPropertyState::Default: + // just set new value + pSet->setPropertyValue( nHandle, rValue ); + break; + } +} + +static sal_Int32 calcMaxParaDepth( const Reference< XShape >& xTargetShape ) +{ + sal_Int32 nMaxParaDepth = -1; + + if( xTargetShape.is() ) + { + Reference< XEnumerationAccess > xText( xTargetShape, UNO_QUERY ); + if( xText.is() ) + { + Reference< XPropertySet > xParaSet; + + Reference< XEnumeration > xEnumeration( xText->createEnumeration(), UNO_SET_THROW ); + while( xEnumeration->hasMoreElements() ) + { + xEnumeration->nextElement() >>= xParaSet; + if( xParaSet.is() ) + { + sal_Int32 nParaDepth = 0; + xParaSet->getPropertyValue( "NumberingLevel" ) >>= nParaDepth; + + if( nParaDepth > nMaxParaDepth ) + nMaxParaDepth = nParaDepth; + } + } + } + } + + return nMaxParaDepth + 1; +} + +Any CustomAnimationPane::getProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect ) +{ + switch( nType ) + { + case nPropertyTypeDirection: + case nPropertyTypeSpokes: + case nPropertyTypeZoom: + return Any( pEffect->getPresetSubType() ); + + case nPropertyTypeColor: + case nPropertyTypeFillColor: + case nPropertyTypeFirstColor: + case nPropertyTypeSecondColor: + case nPropertyTypeCharColor: + case nPropertyTypeLineColor: + { + const sal_Int32 nIndex = (nPropertyTypeFirstColor == nType) ? 0 : 1; + return pEffect->getColor( nIndex ); + } + + case nPropertyTypeFont: + return pEffect->getProperty( AnimationNodeType::SET, u"CharFontName" , EValue::To ); + + case nPropertyTypeCharHeight: + { + static constexpr OUString aAttributeName( u"CharHeight"_ustr ); + Any aValue( pEffect->getProperty( AnimationNodeType::SET, aAttributeName, EValue::To ) ); + if( !aValue.hasValue() ) + aValue = pEffect->getProperty( AnimationNodeType::ANIMATE, aAttributeName, EValue::To ); + return aValue; + } + + case nPropertyTypeRotate: + return pEffect->getTransformationProperty( AnimationTransformType::ROTATE, EValue::By); + + case nPropertyTypeTransparency: + return pEffect->getProperty( AnimationNodeType::SET, u"Opacity" , EValue::To ); + + case nPropertyTypeScale: + return pEffect->getTransformationProperty( AnimationTransformType::SCALE, EValue::By ); + + case nPropertyTypeCharDecoration: + { + Sequence< Any > aValues{ + pEffect->getProperty( AnimationNodeType::SET, u"CharWeight" , EValue::To ), + pEffect->getProperty( AnimationNodeType::SET, u"CharPosture" , EValue::To ), + pEffect->getProperty( AnimationNodeType::SET, u"CharUnderline" , EValue::To ) + }; + return Any( aValues ); + } + } + + Any aAny; + return aAny; +} + +bool CustomAnimationPane::setProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect, const Any& rValue ) +{ + bool bEffectChanged = false; + switch( nType ) + { + case nPropertyTypeDirection: + case nPropertyTypeSpokes: + case nPropertyTypeZoom: + { + OUString aPresetSubType; + rValue >>= aPresetSubType; + if( aPresetSubType != pEffect->getPresetSubType() ) + { + CustomAnimationPresets::getCustomAnimationPresets().changePresetSubType( pEffect, aPresetSubType ); + bEffectChanged = true; + } + } + break; + + case nPropertyTypeFillColor: + case nPropertyTypeColor: + case nPropertyTypeFirstColor: + case nPropertyTypeSecondColor: + case nPropertyTypeCharColor: + case nPropertyTypeLineColor: + { + const sal_Int32 nIndex = (nPropertyTypeFirstColor == nType) ? 0 : 1; + Any aOldColor( pEffect->getColor( nIndex ) ); + if( aOldColor != rValue ) + { + pEffect->setColor( nIndex, rValue ); + bEffectChanged = true; + } + } + break; + + case nPropertyTypeFont: + bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, u"CharFontName" , EValue::To, rValue ); + break; + + case nPropertyTypeCharHeight: + { + static constexpr OUString aAttributeName( u"CharHeight"_ustr ); + bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, aAttributeName, EValue::To, rValue ); + if( !bEffectChanged ) + bEffectChanged = pEffect->setProperty( AnimationNodeType::ANIMATE, aAttributeName, EValue::To, rValue ); + } + break; + case nPropertyTypeRotate: + bEffectChanged = pEffect->setTransformationProperty( AnimationTransformType::ROTATE, EValue::By , rValue ); + break; + + case nPropertyTypeTransparency: + bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, u"Opacity" , EValue::To, rValue ); + break; + + case nPropertyTypeScale: + bEffectChanged = pEffect->setTransformationProperty( AnimationTransformType::SCALE, EValue::By, rValue ); + break; + + case nPropertyTypeCharDecoration: + { + Sequence< Any > aValues(3); + rValue >>= aValues; + bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, u"CharWeight" , EValue::To, aValues[0] ); + bEffectChanged |= pEffect->setProperty( AnimationNodeType::SET, u"CharPosture" , EValue::To, aValues[1] ); + bEffectChanged |= pEffect->setProperty( AnimationNodeType::SET, u"CharUnderline" , EValue::To, aValues[2] ); + } + break; + + } + + return bEffectChanged; +} + +static bool hasVisibleShape( const Reference< XShape >& xShape ) +{ + try + { + const OUString sShapeType( xShape->getShapeType() ); + + if( sShapeType == "com.sun.star.presentation.TitleTextShape" || sShapeType == "com.sun.star.presentation.OutlinerShape" || + sShapeType == "com.sun.star.presentation.SubtitleShape" || sShapeType == "com.sun.star.drawing.TextShape" ) + { + Reference< XPropertySet > xSet( xShape, UNO_QUERY_THROW ); + + FillStyle eFillStyle; + xSet->getPropertyValue( "FillStyle" ) >>= eFillStyle; + + css::drawing::LineStyle eLineStyle; + xSet->getPropertyValue( "LineStyle" ) >>= eLineStyle; + + return eFillStyle != FillStyle_NONE || eLineStyle != css::drawing::LineStyle_NONE; + } + } + catch( Exception& ) + { + } + return true; +} + +std::unique_ptr CustomAnimationPane::createSelectionSet() +{ + std::unique_ptr pSet = CustomAnimationDialog::createDefaultSet(); + + pSet->setPropertyValue( nHandleCurrentPage, Any( mxCurrentPage ) ); + + sal_Int32 nMaxParaDepth = 0; + + // get options from selected effects + const CustomAnimationPresets& rPresets (CustomAnimationPresets::getCustomAnimationPresets()); + for( CustomAnimationEffectPtr& pEffect : maListSelection ) + { + EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence(); + if( !pEffectSequence ) + pEffectSequence = mpMainSequence.get(); + + if( pEffect->hasText() ) + { + sal_Int32 n = calcMaxParaDepth(pEffect->getTargetShape()); + if( n > nMaxParaDepth ) + nMaxParaDepth = n; + } + + addValue( pSet, nHandleHasAfterEffect, Any( pEffect->hasAfterEffect() ) ); + addValue( pSet, nHandleAfterEffectOnNextEffect, Any( pEffect->IsAfterEffectOnNext() ) ); + addValue( pSet, nHandleDimColor, pEffect->getDimColor() ); + addValue( pSet, nHandleIterateType, Any( pEffect->getIterateType() ) ); + + // convert absolute time to percentage value + // This calculation is done in float to avoid some rounding artifacts. + float fIterateInterval = static_cast(pEffect->getIterateInterval()); + if( pEffect->getDuration() ) + fIterateInterval = static_cast(fIterateInterval / pEffect->getDuration() ); + fIterateInterval *= 100.0; + addValue( pSet, nHandleIterateInterval, Any( static_cast(fIterateInterval) ) ); + + addValue( pSet, nHandleBegin, Any( pEffect->getBegin() ) ); + addValue( pSet, nHandleDuration, Any( pEffect->getDuration() ) ); + addValue( pSet, nHandleStart, Any( pEffect->getNodeType() ) ); + addValue( pSet, nHandleRepeat, pEffect->getRepeatCount() ); + addValue( pSet, nHandleEnd, pEffect->getEnd() ); + addValue( pSet, nHandleRewind, Any( pEffect->getFill() ) ); + + addValue( pSet, nHandlePresetId, Any( pEffect->getPresetId() ) ); + + addValue( pSet, nHandleHasText, Any( pEffect->hasText() ) ); + + addValue( pSet, nHandleHasVisibleShape, Any( hasVisibleShape( pEffect->getTargetShape() ) ) ); + + Any aSoundSource; + if( pEffect->getAudio().is() ) + { + aSoundSource = pEffect->getAudio()->getSource(); + addValue( pSet, nHandleSoundVolume, Any( pEffect->getAudio()->getVolume() ) ); +// todo addValue( pSet, nHandleSoundEndAfterSlide, makeAny( pEffect->getAudio()->getEndAfterSlide() ) ); +// this is now stored at the XCommand parameter sequence + } + else if( pEffect->getCommand() == EffectCommands::STOPAUDIO ) + { + aSoundSource <<= true; + } + addValue( pSet, nHandleSoundURL, aSoundSource ); + + sal_Int32 nGroupId = pEffect->getGroupId(); + CustomAnimationTextGroupPtr pTextGroup; + if( nGroupId != -1 ) + pTextGroup = pEffectSequence->findGroup( nGroupId ); + + addValue( pSet, nHandleTextGrouping, Any( pTextGroup ? pTextGroup->getTextGrouping() : sal_Int32(-1) ) ); + addValue( pSet, nHandleAnimateForm, Any( !pTextGroup || pTextGroup->getAnimateForm() ) ); + addValue( pSet, nHandleTextGroupingAuto, Any( pTextGroup ? pTextGroup->getTextGroupingAuto() : -1.0 ) ); + addValue( pSet, nHandleTextReverse, Any( pTextGroup && pTextGroup->getTextReverse() ) ); + + if( pEffectSequence->getSequenceType() == EffectNodeType::INTERACTIVE_SEQUENCE ) + { + InteractiveSequence* pIS = static_cast< InteractiveSequence* >( pEffectSequence ); + addValue( pSet, nHandleTrigger, Any( pIS->getTriggerShape() ) ); + } + + CustomAnimationPresetPtr pDescriptor = rPresets.getEffectDescriptor( pEffect->getPresetId() ); + if( pDescriptor ) + { + sal_Int32 nType = nPropertyTypeNone; + + std::vector aProperties( pDescriptor->getProperties() ); + if( !aProperties.empty() ) + nType = getPropertyType( aProperties.front() ); + + if( nType != nPropertyTypeNone ) + { + addValue( pSet, nHandleProperty1Type, Any( nType ) ); + addValue( pSet, nHandleProperty1Value, getProperty1Value( nType, pEffect ) ); + } + + if( pDescriptor->hasProperty( u"Accelerate" ) ) + { + addValue( pSet, nHandleAccelerate, Any( pEffect->getAcceleration() ) ); + } + + if( pDescriptor->hasProperty( u"Decelerate" ) ) + { + addValue( pSet, nHandleDecelerate, Any( pEffect->getDecelerate() ) ); + } + + if( pDescriptor->hasProperty( u"AutoReverse" ) ) + { + addValue( pSet, nHandleAutoReverse, Any( pEffect->getAutoReverse() ) ); + } + } + } + + addValue( pSet, nHandleMaxParaDepth, Any( nMaxParaDepth ) ); + + return pSet; +} + +void CustomAnimationPane::changeSelection( STLPropertySet const * pResultSet, STLPropertySet const * pOldSet ) +{ + // change selected effect + bool bChanged = false; + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + for( CustomAnimationEffectPtr& pEffect : maListSelection ) + { + DBG_ASSERT( pEffect->getEffectSequence(), "sd::CustomAnimationPane::changeSelection(), dead effect in selection!" ); + if( !pEffect->getEffectSequence() ) + continue; + + double fDuration = 0.0; // we might need this for iterate-interval + if( pResultSet->getPropertyState( nHandleDuration ) == STLPropertyState::Direct ) + { + pResultSet->getPropertyValue( nHandleDuration ) >>= fDuration; + } + else + { + fDuration = pEffect->getDuration(); + } + + if( pResultSet->getPropertyState( nHandleIterateType ) == STLPropertyState::Direct ) + { + sal_Int16 nIterateType = 0; + pResultSet->getPropertyValue( nHandleIterateType ) >>= nIterateType; + if( pEffect->getIterateType() != nIterateType ) + { + pEffect->setIterateType( nIterateType ); + bChanged = true; + } + } + + if( pEffect->getIterateType() ) + { + if( pResultSet->getPropertyState( nHandleIterateInterval ) == STLPropertyState::Direct ) + { + double fIterateInterval = 0.0; + pResultSet->getPropertyValue( nHandleIterateInterval ) >>= fIterateInterval; + if( pEffect->getIterateInterval() != fIterateInterval ) + { + const double f = fIterateInterval * pEffect->getDuration() / 100; + pEffect->setIterateInterval( f ); + bChanged = true; + } + } + } + + double fBegin = 0.0; + + if( pResultSet->getPropertyState( nHandleBegin ) == STLPropertyState::Direct ) + pResultSet->getPropertyValue( nHandleBegin ) >>= fBegin; + else + fBegin = pEffect->getBegin(); + + if( pEffect->getBegin() != fBegin && pResultSet->getPropertyState( nHandleBegin ) == STLPropertyState::Direct) + { + pEffect->setBegin( fBegin ); + bChanged = true; + } + + if( pResultSet->getPropertyState( nHandleDuration ) == STLPropertyState::Direct ) + { + if( pEffect->getDuration() != fDuration ) + { + pEffect->setDuration( fDuration ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleStart ) == STLPropertyState::Direct ) + { + sal_Int16 nNodeType = 0; + pResultSet->getPropertyValue( nHandleStart ) >>= nNodeType; + if( pEffect->getNodeType() != nNodeType ) + { + pEffect->setNodeType( nNodeType ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleRepeat ) == STLPropertyState::Direct ) + { + Any aRepeatCount( pResultSet->getPropertyValue( nHandleRepeat ) ); + if( aRepeatCount != pEffect->getRepeatCount() ) + { + pEffect->setRepeatCount( aRepeatCount ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleEnd ) == STLPropertyState::Direct ) + { + Any aEndValue( pResultSet->getPropertyValue( nHandleEnd ) ); + if( pEffect->getEnd() != aEndValue ) + { + pEffect->setEnd( aEndValue ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleRewind ) == STLPropertyState::Direct ) + { + sal_Int16 nFill = 0; + pResultSet->getPropertyValue( nHandleRewind ) >>= nFill; + if( pEffect->getFill() != nFill ) + { + pEffect->setFill( nFill ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleHasAfterEffect ) == STLPropertyState::Direct ) + { + bool bHasAfterEffect = false; + if( pResultSet->getPropertyValue( nHandleHasAfterEffect ) >>= bHasAfterEffect ) + { + if( pEffect->hasAfterEffect() != bHasAfterEffect ) + { + pEffect->setHasAfterEffect( bHasAfterEffect ); + bChanged = true; + } + } + } + + if( pResultSet->getPropertyState( nHandleAfterEffectOnNextEffect ) == STLPropertyState::Direct ) + { + bool bAfterEffectOnNextEffect = false; + if( (pResultSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bAfterEffectOnNextEffect) + && (pEffect->IsAfterEffectOnNext() != bAfterEffectOnNextEffect) ) + { + pEffect->setAfterEffectOnNext( bAfterEffectOnNextEffect ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleDimColor ) == STLPropertyState::Direct ) + { + Any aDimColor( pResultSet->getPropertyValue( nHandleDimColor ) ); + if( pEffect->getDimColor() != aDimColor ) + { + pEffect->setDimColor( aDimColor ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleAccelerate ) == STLPropertyState::Direct ) + { + double fAccelerate = 0.0; + pResultSet->getPropertyValue( nHandleAccelerate ) >>= fAccelerate; + if( pEffect->getAcceleration() != fAccelerate ) + { + pEffect->setAcceleration( fAccelerate ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleDecelerate ) == STLPropertyState::Direct ) + { + double fDecelerate = 0.0; + pResultSet->getPropertyValue( nHandleDecelerate ) >>= fDecelerate; + if( pEffect->getDecelerate() != fDecelerate ) + { + pEffect->setDecelerate( fDecelerate ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleAutoReverse ) == STLPropertyState::Direct ) + { + bool bAutoReverse = false; + pResultSet->getPropertyValue( nHandleAutoReverse ) >>= bAutoReverse; + if( pEffect->getAutoReverse() != bAutoReverse ) + { + pEffect->setAutoReverse( bAutoReverse ); + bChanged = true; + } + } + + if( pResultSet->getPropertyState( nHandleProperty1Value ) == STLPropertyState::Direct ) + { + sal_Int32 nType = 0; + pOldSet->getPropertyValue( nHandleProperty1Type ) >>= nType; + + bChanged |= setProperty1Value( nType, pEffect, pResultSet->getPropertyValue( nHandleProperty1Value ) ); + } + + if( pResultSet->getPropertyState( nHandleSoundURL ) == STLPropertyState::Direct ) + { + const Any aSoundSource( pResultSet->getPropertyValue( nHandleSoundURL ) ); + + if( aSoundSource.getValueType() == ::cppu::UnoType::get() ) + { + pEffect->setStopAudio(); + bChanged = true; + } + else + { + OUString aSoundURL; + aSoundSource >>= aSoundURL; + + if( !aSoundURL.isEmpty() ) + { + if( !pEffect->getAudio().is() ) + { + pEffect->createAudio( aSoundSource ); + bChanged = true; + } + else + { + if( pEffect->getAudio()->getSource() != aSoundSource ) + { + pEffect->getAudio()->setSource( aSoundSource ); + bChanged = true; + } + } + } + else + { + if( pEffect->getAudio().is() || pEffect->getStopAudio() ) + { + pEffect->removeAudio(); + bChanged = true; + } + } + } + } + + if( pResultSet->getPropertyState( nHandleTrigger ) == STLPropertyState::Direct ) + { + Reference< XShape > xTriggerShape; + pResultSet->getPropertyValue( nHandleTrigger ) >>= xTriggerShape; + bChanged |= mpMainSequence->setTrigger( pEffect, xTriggerShape ); + } + } + + const bool bHasTextGrouping = pResultSet->getPropertyState( nHandleTextGrouping ) == STLPropertyState::Direct; + const bool bHasAnimateForm = pResultSet->getPropertyState( nHandleAnimateForm ) == STLPropertyState::Direct; + const bool bHasTextGroupingAuto = pResultSet->getPropertyState( nHandleTextGroupingAuto ) == STLPropertyState::Direct; + const bool bHasTextReverse = pResultSet->getPropertyState( nHandleTextReverse ) == STLPropertyState::Direct; + + if( bHasTextGrouping || bHasAnimateForm || bHasTextGroupingAuto || bHasTextReverse ) + { + // we need to do a second pass for text grouping options + // since changing them can cause effects to be removed + // or replaced, we do this after we applied all other options + // above + + sal_Int32 nTextGrouping = 0; + bool bAnimateForm = true, bTextReverse = false; + double fTextGroupingAuto = -1.0; + + if( bHasTextGrouping ) + pResultSet->getPropertyValue(nHandleTextGrouping) >>= nTextGrouping; + else + pOldSet->getPropertyValue(nHandleTextGrouping) >>= nTextGrouping; + + if( bHasAnimateForm ) + pResultSet->getPropertyValue(nHandleAnimateForm) >>= bAnimateForm; + else + pOldSet->getPropertyValue(nHandleAnimateForm) >>= bAnimateForm; + + if( bHasTextGroupingAuto ) + pResultSet->getPropertyValue(nHandleTextGroupingAuto) >>= fTextGroupingAuto; + else + pOldSet->getPropertyValue(nHandleTextGroupingAuto) >>= fTextGroupingAuto; + + if( bHasTextReverse ) + pResultSet->getPropertyValue(nHandleTextReverse) >>= bTextReverse; + else + pOldSet->getPropertyValue(nHandleTextReverse) >>= bTextReverse; + + EffectSequence const aSelectedEffects( maListSelection ); + for( CustomAnimationEffectPtr const& pEffect : aSelectedEffects ) + { + EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence(); + if( !pEffectSequence ) + pEffectSequence = mpMainSequence.get(); + + sal_Int32 nGroupId = pEffect->getGroupId(); + CustomAnimationTextGroupPtr pTextGroup; + if( nGroupId != -1 ) + { + // use existing group + pTextGroup = pEffectSequence->findGroup( nGroupId ); + } + else + { + // somethings changed so we need a group now + pTextGroup = pEffectSequence->createTextGroup( pEffect, nTextGrouping, fTextGroupingAuto, bAnimateForm, bTextReverse ); + bChanged = true; + } + + //#i119988# + /************************************************************************/ + /* + Note, the setAnimateForm means set the animation from TextGroup to Object's Shape + And on the UI in means "Animate attached shape" in "Effect Option" dialog + The setTextGrouping means set animation to Object's Text, + the nTextGrouping is Text Animation Type + nTextGrouping = -1 is "As one Object", means no text animation. + + The previous call order first do the setTextGrouping and then do the setAnimateForm, + that will cause such defect: in the setTextGrouping, the effect has been removed, + but in setAnimateForm still need this effect, then a NULL pointer of that effect will + be gotten, and cause crash. + + []bHasAnimateForm means the UI has changed, bAnimateForm is it value + + So if create a new textgroup animation, the following animation will never be run! + Since the \A1\B0Animate attached shape\A1\B1 is default checked. + And the bHasAnimateForm default is false, and if user uncheck it the value bAnimateForm will be false, + it same as the TextGroup\A1\AFs default value, also could not be run setAnimateForm. + if( bHasAnimateForm ) + { + if( pTextGroup->getAnimateForm() != bAnimateForm ) + { + pEffectSequence->setAnimateForm( pTextGroup, bAnimateForm ); + bChanged = true; + } + } + + In setTextGrouping, there are three case: + 1. Create new text effects for empty TextGroup + 2. Remove all text effects of TextGroup (nTextGrouping == -1) + 3. Change all the text effects\A1\AF start type + + So here is the right logic: + If set the animation from text to shape and remove text animation, + should do setAnimateForm first, then do setTextGrouping. + Other case,do setTextGrouping first, then do setAnimateForm. + + */ + /************************************************************************/ + + bool bDoSetAnimateFormFirst = false; + bool bNeedDoSetAnimateForm = false; + + if( bHasAnimateForm ) + { + if( pTextGroup && pTextGroup->getAnimateForm() != bAnimateForm ) + { + if( (pTextGroup->getTextGrouping() >= 0) && (nTextGrouping == -1 ) ) + { + bDoSetAnimateFormFirst = true; + } + bNeedDoSetAnimateForm = true; + } + } + + if (bDoSetAnimateFormFirst) + { + pEffectSequence->setAnimateForm( pTextGroup, bAnimateForm ); + bChanged = true; + } + + if( bHasTextGrouping ) + { + if( pTextGroup && pTextGroup->getTextGrouping() != nTextGrouping ) + { + pEffectSequence->setTextGrouping( pTextGroup, nTextGrouping ); + + // All the effects of the outline object is removed so we need to + // put it back. OTOH, the shape object that still has effects + // in the text group is fine. + if (nTextGrouping == -1 && pTextGroup->getEffects().empty()) + { + pEffect->setTarget(Any(pEffect->getTargetShape())); + pEffect->setGroupId(-1); + mpMainSequence->append(pEffect); + } + + bChanged = true; + } + } + + if (!bDoSetAnimateFormFirst && bNeedDoSetAnimateForm) + { + if( pTextGroup ) + { + pEffectSequence->setAnimateForm( pTextGroup, bAnimateForm ); + bChanged = true; + } + } + + if( bHasTextGroupingAuto ) + { + if( pTextGroup && pTextGroup->getTextGroupingAuto() != fTextGroupingAuto ) + { + pEffectSequence->setTextGroupingAuto( pTextGroup, fTextGroupingAuto ); + bChanged = true; + } + } + + if( bHasTextReverse ) + { + if( pTextGroup && pTextGroup->getTextReverse() != bTextReverse ) + { + pEffectSequence->setTextReverse( pTextGroup, bTextReverse ); + bChanged = true; + } + } + } + } + + if( bChanged ) + { + mpMainSequence->rebuild(); + updateControls(); + mrBase.GetDocShell()->SetModified(); + } +} + +void CustomAnimationPane::showOptions(const OUString& rPage) +{ + std::unique_ptr xSet = createSelectionSet(); + + auto xDlg = std::make_shared(GetFrameWeld(), std::move(xSet), rPage); + + weld::DialogController::runAsync(xDlg, [xDlg, this](sal_Int32 nResult){ + if (nResult ) + { + addUndo(); + changeSelection(xDlg->getResultSet(), xDlg->getPropertySet()); + updateControls(); + } + }); +} + +void CustomAnimationPane::onChangeCurrentPage() +{ + if( !mxView.is() ) + return; + + try + { + Reference< XDrawPage > xNewPage( mxView->getCurrentPage() ); + if( xNewPage != mxCurrentPage ) + { + mxCurrentPage = xNewPage; + SdPage* pPage = SdPage::getImplementation( mxCurrentPage ); + if( pPage ) + { + mpMainSequence = pPage->getMainSequence(); + mxCustomAnimationList->update( mpMainSequence ); + } + updateControls(); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::onChangeCurrentPage()" ); + } +} + +static bool getTextSelection( const Any& rSelection, Reference< XShape >& xShape, std::vector< sal_Int16 >& rParaList ) +{ + Reference< XTextRange > xSelectedText; + rSelection >>= xSelectedText; + if( xSelectedText.is() ) try + { + xShape.set( xSelectedText->getText(), UNO_QUERY_THROW ); + + css::uno::Reference xLockable(xShape, css::uno::UNO_QUERY); + if (xLockable.is()) + xLockable->addActionLock(); + comphelper::ScopeGuard aGuard([&xLockable]() + { + if (xLockable.is()) + xLockable->removeActionLock(); + }); + + Reference< XTextRangeCompare > xTextRangeCompare( xShape, UNO_QUERY_THROW ); + Reference< XEnumerationAccess > xParaEnumAccess( xShape, UNO_QUERY_THROW ); + Reference< XEnumeration > xParaEnum( xParaEnumAccess->createEnumeration(), UNO_SET_THROW ); + Reference< XTextRange > xRange; + Reference< XTextRange > xStart( xSelectedText->getStart() ); + Reference< XTextRange > xEnd( xSelectedText->getEnd() ); + + if( xTextRangeCompare->compareRegionEnds( xStart, xEnd ) < 0 ) + { + Reference< XTextRange > xTemp( xStart ); + xStart = xEnd; + xEnd = xTemp; + } + + sal_Int16 nPara = 0; + while( xParaEnum->hasMoreElements() ) + { + xParaEnum->nextElement() >>= xRange; + + // break if start of selection is prior to end of current paragraph + if( xRange.is() && (xTextRangeCompare->compareRegionEnds( xStart, xRange ) >= 0 ) ) + break; + + nPara++; + } + + while( xRange.is() ) + { + if( xRange.is() && !xRange->getString().isEmpty() ) + rParaList.push_back( nPara ); + + // break if end of selection is before or at end of current paragraph + if( xRange.is() && xTextRangeCompare->compareRegionEnds( xEnd, xRange ) >= 0 ) + break; + + nPara++; + + if( xParaEnum->hasMoreElements() ) + xParaEnum->nextElement() >>= xRange; + else + xRange.clear(); + } + + return true; + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::getTextSelection()" ); + } + + return false; +} + +namespace +{ + Reference getTargetShape(const Any& rTarget) + { + Reference xShape; + rTarget >>= xShape; + if( !xShape.is() ) + { + ParagraphTarget aParaTarget; + if (rTarget >>= aParaTarget) + xShape = aParaTarget.Shape; + } + return xShape; + } +} + +void CustomAnimationPane::onAdd() +{ + bool bHasText = true; + + // first create vector of targets for dialog preview + std::vector< Any > aTargets; + + // gather shapes from the selection + Reference< XSelectionSupplier > xSel( mxView, UNO_QUERY_THROW ); + maViewSelection = xSel->getSelection(); + + if( maViewSelection.getValueType() == cppu::UnoType::get()) + { + Reference< XIndexAccess > xShapes; + maViewSelection >>= xShapes; + + sal_Int32 nCount = xShapes->getCount(); + aTargets.reserve( nCount ); + for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) + { + Any aTarget( xShapes->getByIndex( nIndex ) ); + aTargets.push_back( aTarget ); + if( bHasText ) + { + Reference< XText > xText; + aTarget >>= xText; + if( !xText.is() || xText->getString().isEmpty() ) + bHasText = false; + } + } + } + else if ( maViewSelection.getValueType() == cppu::UnoType::get()) + { + aTargets.push_back( maViewSelection ); + Reference< XText > xText; + maViewSelection >>= xText; + if( !xText.is() || xText->getString().isEmpty() ) + bHasText = false; + } + else if ( maViewSelection.getValueType() == cppu::UnoType::get()) + { + Reference< XShape > xShape; + std::vector< sal_Int16 > aParaList; + if( getTextSelection( maViewSelection, xShape, aParaList ) ) + { + ParagraphTarget aParaTarget; + aParaTarget.Shape = xShape; + + for( const auto& rPara : aParaList ) + { + aParaTarget.Paragraph = rPara; + aTargets.push_back( Any( aParaTarget ) ); + } + } + } + else + { + OSL_FAIL("sd::CustomAnimationPane::onAdd(), unknown view selection!" ); + return; + } + + CustomAnimationPresetPtr pDescriptor; + mxFTCategory->set_sensitive(true); + mxFTAnimation->set_sensitive(true); + + bool bCategoryReset = false; + + if (!mxLBCategory->get_sensitive() || mxLBCategory->get_active() == -1) + { + mxLBCategory->set_sensitive(true); + mxLBCategory->set_active(0); + bCategoryReset = true; + } + + if (bCategoryReset || !mxLBAnimation->get_sensitive() || + mxLBAnimation->get_selected_index() == -1) + { + mxLBAnimation->set_sensitive(true); + + sal_Int32 nFirstEffect = fillAnimationLB(bHasText); + if (nFirstEffect == -1) + return; + + mxLBAnimation->select(nFirstEffect); + mnLastSelectedAnimation = nFirstEffect; + } + + auto pEntryData = weld::fromId(mxLBAnimation->get_selected_id()); + if (pEntryData) + pDescriptor = *pEntryData; + + if( pDescriptor ) + { + const double fDuration = pDescriptor->getDuration(); + mxCBXDuration->set_value(fDuration*100.0, FieldUnit::NONE); + bool bHasSpeed = pDescriptor->getDuration() > 0.001; + mxCBXDuration->set_sensitive( bHasSpeed ); + mxFTDuration->set_sensitive( bHasSpeed ); + + mxCustomAnimationList->unselect_all(); + + // gather shapes from the selection + bool bFirst = true; + for( const auto& rTarget : aTargets ) + { + css::uno::Reference xLockable(getTargetShape(rTarget), css::uno::UNO_QUERY); + if (xLockable.is()) + xLockable->addActionLock(); + comphelper::ScopeGuard aGuard([&xLockable]() + { + if (xLockable.is()) + xLockable->removeActionLock(); + }); + + CustomAnimationEffectPtr pCreated = mpMainSequence->append( pDescriptor, rTarget, fDuration ); + + // if only one shape with text and no fill or outline is selected, animate only by first level paragraphs + if( bHasText && (aTargets.size() == 1) ) + { + Reference< XShape > xShape( rTarget, UNO_QUERY ); + if( xShape.is() && !hasVisibleShape( xShape ) ) + { + mpMainSequence->createTextGroup( pCreated, 1, -1.0, false, false ); + } + } + + if( bFirst ) + bFirst = false; + else + pCreated->setNodeType( EffectNodeType::WITH_PREVIOUS ); + + if( pCreated ) + mxCustomAnimationList->select( pCreated ); + } + } + + PathKind ePathKind = getCreatePathKind(); + + if (ePathKind != PathKind::NONE) + { + createPath( ePathKind, aTargets, 0.0 ); + updateMotionPathTags(); + } + + addUndo(); + mrBase.GetDocShell()->SetModified(); + + updateControls(); + + SlideShow::Stop( mrBase ); +} + +void CustomAnimationPane::onRemove() +{ + if( maListSelection.empty() ) + return; + + addUndo(); + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + EffectSequence aList( maListSelection ); + + for( CustomAnimationEffectPtr& pEffect : aList ) + { + if( pEffect->getEffectSequence() ) + pEffect->getEffectSequence()->remove( pEffect ); + } + + maListSelection.clear(); + mrBase.GetDocShell()->SetModified(); +} + +void CustomAnimationPane::remove( CustomAnimationEffectPtr const & pEffect ) +{ + if( pEffect->getEffectSequence() ) + { + addUndo(); + pEffect->getEffectSequence()->remove( pEffect ); + mrBase.GetDocShell()->SetModified(); + } +} + +void CustomAnimationPane::onChangeStart() +{ + sal_Int16 nNodeType; + switch( mxLBStart->get_active() ) + { + case 0: nNodeType = EffectNodeType::ON_CLICK; break; + case 1: nNodeType = EffectNodeType::WITH_PREVIOUS; break; + case 2: nNodeType = EffectNodeType::AFTER_PREVIOUS; break; + default: + return; + } + + onChangeStart( nNodeType ); +} + +void CustomAnimationPane::onChangeStart( sal_Int16 nNodeType ) +{ + addUndo(); + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + bool bNeedRebuild = false; + + for( CustomAnimationEffectPtr& pEffect : maListSelection ) + { + if( pEffect->getNodeType() != nNodeType ) + { + pEffect->setNodeType( nNodeType ); + bNeedRebuild = true; + } + } + + if( bNeedRebuild ) + { + mpMainSequence->rebuild(); + updateControls(); + mrBase.GetDocShell()->SetModified(); + } +} + +void CustomAnimationPane::onChangeSpeed() +{ + double fDuration = getDuration(); + + if(fDuration < 0) + return; + else + { + addUndo(); + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + // change selected effect + for( CustomAnimationEffectPtr& pEffect : maListSelection ) + { + pEffect->setDuration( fDuration ); + } + + mpMainSequence->rebuild(); + updateControls(); + mrBase.GetDocShell()->SetModified(); + } +} + +double CustomAnimationPane::getDuration() const +{ + double fDuration = 0; + + if (!mxCBXDuration->get_text().isEmpty()) + fDuration = mxCBXDuration->get_value(FieldUnit::NONE) / 100.0; + + return fDuration; +} + +PathKind CustomAnimationPane::getCreatePathKind() const +{ + PathKind eKind = PathKind::NONE; + + if (mxLBAnimation->count_selected_rows() == 1 && + mxLBCategory->get_active() == gnMotionPathPos) + { + const sal_Int32 nPos = mxLBAnimation->get_selected_index(); + if( nPos == mnCurvePathPos ) + { + eKind = PathKind::CURVE; + } + else if( nPos == mnPolygonPathPos ) + { + eKind = PathKind::POLYGON; + } + else if( nPos == mnFreeformPathPos ) + { + eKind = PathKind::FREEFORM; + } + } + + return eKind; +} + +void CustomAnimationPane::createPath( PathKind eKind, std::vector< Any >& rTargets, double fDuration) +{ + sal_uInt16 nSID = 0; + + switch( eKind ) + { + case PathKind::CURVE: nSID = SID_DRAW_BEZIER_NOFILL; break; + case PathKind::POLYGON: nSID = SID_DRAW_POLYGON_NOFILL; break; + case PathKind::FREEFORM: nSID = SID_DRAW_FREELINE_NOFILL; break; + default: break; + } + + if( !nSID ) + return; + + DrawViewShell* pViewShell = dynamic_cast< DrawViewShell* >( + FrameworkHelper::Instance(mrBase)->GetViewShell(FrameworkHelper::msCenterPaneURL).get()); + + if( pViewShell ) + { + DrawView* pView = pViewShell->GetDrawView(); + if( pView ) + pView->UnmarkAllObj(); + + std::vector< Any > aTargets( 1, Any( fDuration ) ); + aTargets.insert( aTargets.end(), rTargets.begin(), rTargets.end() ); + Sequence< Any > aTargetSequence( comphelper::containerToSequence( aTargets ) ); + const SfxUnoAnyItem aItem( SID_ADD_MOTION_PATH, Any( aTargetSequence ) ); + pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( nSID, SfxCallMode::ASYNCHRON, {&aItem} ); + } +} + + +/// this link is called when the property box is modified by the user +IMPL_LINK_NOARG(CustomAnimationPane, implPropertyHdl, LinkParamNone*, void) +{ + if (!mxLBSubControl) + return; + + addUndo(); + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + const Any aValue(mxLBSubControl->getValue()); + + bool bNeedUpdate = false; + + // change selected effect + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + if( setProperty1Value( mnPropertyType, pEffect, aValue ) ) + bNeedUpdate = true; + } + + if( bNeedUpdate ) + { + mpMainSequence->rebuild(); + updateControls(); + mrBase.GetDocShell()->SetModified(); + } + + onPreview( false ); +} + +IMPL_LINK_NOARG(CustomAnimationPane, DelayModifiedHdl, weld::MetricSpinButton&, void) +{ + addUndo(); +} + +IMPL_LINK_NOARG(CustomAnimationPane, DelayLoseFocusHdl, weld::Widget&, void) +{ + double fBegin = mxMFStartDelay->get_value(FieldUnit::NONE); + + //sequence rebuild only when the control loses focus + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + // change selected effect + for( CustomAnimationEffectPtr& pEffect : maListSelection ) + { + pEffect->setBegin( fBegin/10.0 ); + } + + mpMainSequence->rebuild(); + updateControls(); + mrBase.GetDocShell()->SetModified(); +} + +IMPL_LINK_NOARG(CustomAnimationPane, AnimationSelectHdl, weld::TreeView&, void) +{ + maIdle.Start(); +} + +IMPL_LINK_NOARG(CustomAnimationPane, SelectionHandler, Timer*, void) +{ + if (mxLBAnimation->has_grab()) // tdf#136474 try again later + { + maIdle.Start(); + return; + } + + int nSelected = mxLBAnimation->get_selected_index(); + if (nSelected == -1) + return; + + // tdf#99137, the selected entry may also be a subcategory title, so not an effect + // just skip it and move to the next one in this case + if (mxLBAnimation->get_text_emphasis(nSelected, 0)) + { + if (nSelected == 0 || nSelected > mnLastSelectedAnimation) + mxLBAnimation->select(++nSelected); + else + mxLBAnimation->select(--nSelected); + } + + mnLastSelectedAnimation = nSelected; + + CustomAnimationPresetPtr* pPreset = weld::fromId(mxLBAnimation->get_id(nSelected)); + PathKind ePathKind = getCreatePathKind(); + + if ( ePathKind != PathKind::NONE ) + { + std::vector< Any > aTargets; + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + aTargets.push_back( pEffect->getTarget() ); + + EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence(); + if( !pEffectSequence ) + pEffectSequence = mpMainSequence.get(); + + // delete the old animation, new one will be appended + // by createPath and SID_ADD_MOTION_PATH therein + pEffectSequence->remove( pEffect ); + } + + createPath( ePathKind, aTargets, 0.0 ); + updateMotionPathTags(); + return; + } + + CustomAnimationPresetPtr pDescriptor(*pPreset); + const double fDuration = (*pPreset)->getDuration(); + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + // get selected effect + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + // Dispose the deprecated motion path tag. It will be rebuilt later. + if (pEffect->getPresetClass() == css::presentation::EffectPresetClass::MOTIONPATH) + { + for (auto const& xTag: maMotionPathTags) + { + if(xTag->getEffect() == pEffect && !xTag->isDisposed()) + xTag->Dispose(); + } + } + + EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence(); + if( !pEffectSequence ) + pEffectSequence = mpMainSequence.get(); + + pEffectSequence->replace( pEffect, pDescriptor, fDuration ); + } + + addUndo(); + onPreview(false); +} + +IMPL_LINK_NOARG(CustomAnimationPane, UpdateAnimationLB, weld::ComboBox&, void) +{ + //FIXME: first effect only? what if there is more? + CustomAnimationEffectPtr pEffect = maListSelection.front(); + fillAnimationLB( pEffect->hasText() ); +} + +IMPL_LINK_NOARG(CustomAnimationPane, DurationModifiedHdl, weld::MetricSpinButton&, void) +{ + if (!mxCBXDuration->get_text().isEmpty()) + { + double duration_value = static_cast(mxCBXDuration->get_value(FieldUnit::NONE)); + if(duration_value <= 0.0) + { + mxCBXDuration->set_value(1, FieldUnit::NONE); + } + onChangeSpeed(); + } +} + +namespace +{ + void InsertCategory(weld::TreeView& rLBAnimation, const OUString& rMotionPathLabel) + { + int nRow = rLBAnimation.n_children(); + rLBAnimation.append_text(rMotionPathLabel); + rLBAnimation.set_text_emphasis(nRow, true, 0); + rLBAnimation.set_text_align(nRow, 0.5, 0); + } +} + +sal_Int32 CustomAnimationPane::fillAnimationLB( bool bHasText ) +{ + PresetCategoryList rCategoryList; + sal_uInt16 nPosition = mxLBCategory->get_active(); + const CustomAnimationPresets& rPresets (CustomAnimationPresets::getCustomAnimationPresets()); + switch(nPosition) + { + case 0:rCategoryList = rPresets.getEntrancePresets();break; + case 1:rCategoryList = rPresets.getEmphasisPresets();break; + case 2:rCategoryList = rPresets.getExitPresets();break; + case 3:rCategoryList = rPresets.getMotionPathsPresets();break; + case 4:rCategoryList = rPresets.getMiscPresets();break; + } + + sal_Int32 nFirstEffect = -1; + + int nOldEntryCount = mxLBAnimation->n_children(); + int nOldScrollPos = mxLBAnimation->vadjustment_get_value(); + + mxLBAnimation->freeze(); + mxLBAnimation->clear(); + mnLastSelectedAnimation = -1; + + if (nPosition == gnMotionPathPos) + { + OUString sMotionPathLabel( SdResId( STR_CUSTOMANIMATION_USERPATH ) ); + InsertCategory(*mxLBAnimation, sMotionPathLabel); + mnCurvePathPos = mxLBAnimation->n_children(); + mxLBAnimation->append_text( SvxResId(STR_ObjNameSingulCOMBLINE) ); + mxLBAnimation->set_text_emphasis(mnCurvePathPos, false, 0); + mnPolygonPathPos = mnCurvePathPos + 1; + mxLBAnimation->append_text( SvxResId(STR_ObjNameSingulPOLY) ); + mxLBAnimation->set_text_emphasis(mnPolygonPathPos, false, 0); + mnFreeformPathPos = mnPolygonPathPos + 1; + mxLBAnimation->append_text( SvxResId(STR_ObjNameSingulFREELINE) ); + mxLBAnimation->set_text_emphasis(mnFreeformPathPos, false, 0); + } + + for (const PresetCategoryPtr& pCategory : rCategoryList) + { + if( pCategory ) + { + InsertCategory(*mxLBAnimation, pCategory->maLabel); + + int nPos = mxLBAnimation->n_children(); + + std::vector< CustomAnimationPresetPtr > aSortedVector = + pCategory->maEffects; + + for( const CustomAnimationPresetPtr& pDescriptor : aSortedVector ) + { + // ( !isTextOnly || ( isTextOnly && bHasText ) ) <=> !isTextOnly || bHasText + if( pDescriptor && ( !pDescriptor->isTextOnly() || bHasText ) ) + { + auto pCustomPtr = new CustomAnimationPresetPtr(pDescriptor); + OUString sId = weld::toId(pCustomPtr); + mxLBAnimation->append(sId, pDescriptor->getLabel()); + mxLBAnimation->set_text_emphasis(nPos, false, 0); + + if (nFirstEffect == -1) + nFirstEffect = nPos; + + ++nPos; + } + } + } + } + + mxLBAnimation->thaw(); + + if (mxLBAnimation->n_children() == nOldEntryCount) + mxLBAnimation->vadjustment_set_value(nOldScrollPos); + + return nFirstEffect; +} + +IMPL_LINK(CustomAnimationPane, implToggleHdl, weld::Toggleable&, rBtn, void) +{ + implControlHdl(&rBtn); +} + +IMPL_LINK(CustomAnimationPane, implClickHdl, weld::Button&, rBtn, void) +{ + implControlHdl(&rBtn); +} + +IMPL_LINK( CustomAnimationPane, implControlListBoxHdl, weld::ComboBox&, rListBox, void ) +{ + implControlHdl(&rListBox); +} + +/// this link is called when one of the controls is modified +void CustomAnimationPane::implControlHdl(const weld::Widget* pControl) +{ + if (pControl == mxPBAddEffect.get()) + onAdd(); + else if (pControl == mxPBRemoveEffect.get()) + onRemove(); + else if (pControl == mxLBStart.get()) + onChangeStart(); + else if (pControl == mxPBPropertyMore.get()) + showOptions(); + else if (pControl == mxPBMoveUp.get()) + moveSelection( true ); + else if (pControl == mxPBMoveDown.get()) + moveSelection( false ); + else if (pControl == mxPBPlay.get()) + onPreview( true ); + else if (pControl == mxCBAutoPreview.get()) + { + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + pOptions->SetPreviewChangedEffects(mxCBAutoPreview->get_active()); + } +} + +IMPL_LINK_NOARG(CustomAnimationPane, lateInitCallback, Timer *, void) +{ + // Call getPresets() to initiate the (expensive) construction of the + // presets list. + CustomAnimationPresets::getCustomAnimationPresets(); + + // update selection and control states + onSelectionChanged(); +} + +void CustomAnimationPane::moveSelection( bool bUp ) +{ + if( maListSelection.empty() ) + return; + + EffectSequenceHelper* pSequence = maListSelection.front()->getEffectSequence(); + if( pSequence == nullptr ) + return; + + addUndo(); + + bool bChanged = false; + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + EffectSequence& rEffectSequence = pSequence->getSequence(); + + if( bUp ) + { + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + EffectSequence::iterator aUpEffectPos( pSequence->find( pEffect ) ); + // coverity[copy_paste_error : FALSE] - this is correct, checking if it exists + if( aUpEffectPos != rEffectSequence.end() ) + { + EffectSequence::iterator aInsertPos( rEffectSequence.erase( aUpEffectPos ) ); + + if( aInsertPos != rEffectSequence.begin() ) + { + --aInsertPos; + while( (aInsertPos != rEffectSequence.begin()) && !mxCustomAnimationList->isExpanded(*aInsertPos)) + --aInsertPos; + rEffectSequence.insert( aInsertPos, pEffect ); + } + else + { + rEffectSequence.push_front( pEffect ); + } + bChanged = true; + } + } + } + else + { + EffectSequence::reverse_iterator aIter( maListSelection.rbegin() ); + const EffectSequence::reverse_iterator aEnd( maListSelection.rend() ); + + while( aIter != aEnd ) + { + CustomAnimationEffectPtr pEffect = *aIter++; + + EffectSequence::iterator aDownEffectPos( pSequence->find( pEffect ) ); + // coverity[copy_paste_error : FALSE] - this is correct, checking if it exists + if( aDownEffectPos != rEffectSequence.end() ) + { + EffectSequence::iterator aInsertPos( rEffectSequence.erase( aDownEffectPos ) ); + + if( aInsertPos != rEffectSequence.end() ) + { + ++aInsertPos; + // Advance over rolled-up (un-expanded) items, unless we just moved it there. + while( (aInsertPos != rEffectSequence.end()) + && !mxCustomAnimationList->isExpanded(*aInsertPos) + && (std::find(maListSelection.begin(), maListSelection.end(), *aInsertPos) + == maListSelection.end()) + ) + ++aInsertPos; + rEffectSequence.insert( aInsertPos, pEffect ); + } + else + { + rEffectSequence.push_back( pEffect ); + } + bChanged = true; + } + } + } + + if( bChanged ) + { + mpMainSequence->rebuild(); + updateControls(); + mrBase.GetDocShell()->SetModified(); + } +} + +void CustomAnimationPane::onPreview( bool bForcePreview ) +{ + if (!bForcePreview && !mxCBAutoPreview->get_active()) + return; + + // No preview in LOK. + if (comphelper::LibreOfficeKit::isActive()) + return; + + if( maListSelection.empty() ) + { + rtl::Reference< MotionPathTag > xMotionPathTag; + auto aIter = std::find_if(maMotionPathTags.begin(), maMotionPathTags.end(), + [](const MotionPathTagVector::value_type& rxMotionPathTag) { return rxMotionPathTag->isSelected(); }); + if (aIter != maMotionPathTags.end()) + xMotionPathTag = *aIter; + + if( xMotionPathTag.is() ) + { + MainSequencePtr pSequence = std::make_shared(); + pSequence->append( xMotionPathTag->getEffect()->clone() ); + preview( pSequence->getRootNode() ); + } + else + { + Reference< XAnimationNodeSupplier > xNodeSupplier( mxCurrentPage, UNO_QUERY ); + if( !xNodeSupplier.is() ) + return; + + preview( xNodeSupplier->getAnimationNode() ); + } + } + else + { + MainSequencePtr pSequence = std::make_shared(); + + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + pSequence->append( pEffect->clone() ); + } + + preview( pSequence->getRootNode() ); + } +} + +void CustomAnimationPane::preview( const Reference< XAnimationNode >& xAnimationNode ) +{ + Reference< XParallelTimeContainer > xRoot = ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ); + Sequence< css::beans::NamedValue > aUserData + { { "node-type", css::uno::Any(css::presentation::EffectNodeType::TIMING_ROOT) } }; + xRoot->setUserData( aUserData ); + xRoot->appendChild( xAnimationNode ); + + SlideShow::StartPreview( mrBase, mxCurrentPage, xRoot ); +} + +// ICustomAnimationListController +void CustomAnimationPane::onSelect() +{ + maListSelection = mxCustomAnimationList->getSelection(); + updateControls(); + + // mark shapes from selected effects + if( maSelectionLock.isLocked() ) + return; + + // tdf#145030 if nothing is selected in the effects list, leave the selection of + // objects in the slide untouched + if (maListSelection.empty()) + return; + + ScopeLockGuard aGuard( maSelectionLock ); + DrawViewShell* pViewShell = dynamic_cast< DrawViewShell* >( + FrameworkHelper::Instance(mrBase)->GetViewShell(FrameworkHelper::msCenterPaneURL).get()); + DrawView* pView = pViewShell ? pViewShell->GetDrawView() : nullptr; + + if( pView ) + { + pView->UnmarkAllObj(); + for( const CustomAnimationEffectPtr& pEffect : maListSelection ) + { + Reference< XShape > xShape( pEffect->getTargetShape() ); + SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape); + if( pObj ) + pView->MarkObj(pObj, pView->GetSdrPageView()); + } + } +} + +// ICustomAnimationListController +// pEffectInsertBefore may be null if moving to end of list. +void CustomAnimationPane::onDragNDropComplete(std::vector< CustomAnimationEffectPtr > pEffectsDragged, CustomAnimationEffectPtr pEffectInsertBefore) +{ + if ( !mpMainSequence ) + return; + + addUndo(); + + MainSequenceRebuildGuard aGuard( mpMainSequence ); + + // Move all selected effects + for( auto const& pEffectDragged : pEffectsDragged ) + { + // Move this dragged effect and any hidden sub-effects + EffectSequence::iterator aIter = mpMainSequence->find( pEffectDragged ); + const EffectSequence::iterator aEnd( mpMainSequence->getEnd() ); + + while( aIter != aEnd ) + { + CustomAnimationEffectPtr pEffect = *aIter++; + + // Update model with new location (function triggers a rebuild) + // target may be null, which will insert at the end. + mpMainSequence->moveToBeforeEffect( pEffect, pEffectInsertBefore ); + // Done moving effect and its hidden sub-effects when *next* effect is visible. + if (aIter != aEnd && mxCustomAnimationList->isVisible(*aIter)) + break; + } + } + + updateControls(); + mrBase.GetDocShell()->SetModified(); +} + +void CustomAnimationPane::updatePathFromMotionPathTag( const rtl::Reference< MotionPathTag >& xTag ) +{ + MainSequenceRebuildGuard aGuard( mpMainSequence ); + if( !xTag.is() ) + return; + + SdrPathObj* pPathObj = xTag->getPathObj(); + CustomAnimationEffectPtr pEffect = xTag->getEffect(); + if( (pPathObj != nullptr) && pEffect ) + { + SfxUndoManager* pManager = mrBase.GetDocShell()->GetUndoManager(); + if( pManager ) + { + SdPage* pPage = SdPage::getImplementation( mxCurrentPage ); + if( pPage ) + pManager->AddUndoAction( std::make_unique( mrBase.GetDocShell()->GetDoc(), pPage, pEffect->getNode() ) ); + } + + pEffect->updatePathFromSdrPathObj( *pPathObj ); + } +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/STLPropertySet.cxx b/sd/source/ui/animations/STLPropertySet.cxx new file mode 100644 index 0000000000..592d7639cd --- /dev/null +++ b/sd/source/ui/animations/STLPropertySet.cxx @@ -0,0 +1,113 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "STLPropertySet.hxx" +#include + +using com::sun::star::uno::Any; + +namespace sd +{ + +STLPropertySet::STLPropertySet() +{ +} + +STLPropertySet::~STLPropertySet() +{ +} + +void STLPropertySet::setPropertyDefaultValue( sal_Int32 nHandle, const Any& rValue ) +{ + STLPropertyMapEntry aEntry( rValue ); + maPropertyMap[ nHandle ] = aEntry; +} + +void STLPropertySet::setPropertyValue( sal_Int32 nHandle, const Any& rValue ) +{ + PropertyMapIter aIter; + if( findProperty( nHandle, aIter ) ) + { + (*aIter).second.mnState = STLPropertyState::Direct; + (*aIter).second.maValue = rValue; + } + else + { + SAL_WARN("sd", "sd::STLPropertySet::setPropertyValue(), unknown property!"); + } +} + +Any STLPropertySet::getPropertyValue( sal_Int32 nHandle ) const +{ + PropertyMapConstIter aIter; + if( findProperty( nHandle, aIter ) ) + { + return (*aIter).second.maValue; + } + else + { + SAL_WARN("sd", "sd::STLPropertySet::getPropertyValue(), unknown property!"); + + Any aAny; + return aAny; + } +} + +STLPropertyState STLPropertySet::getPropertyState( sal_Int32 nHandle ) const +{ + PropertyMapConstIter aIter; + if( findProperty( nHandle, aIter ) ) + { + return (*aIter).second.mnState; + } + else + { + SAL_WARN("sd", "sd::STLPropertySet::getPropertyState(), unknown property!"); + return STLPropertyState::Ambiguous; + } +} + +void STLPropertySet::setPropertyState( sal_Int32 nHandle, STLPropertyState nState ) +{ + PropertyMapIter aIter; + if( findProperty( nHandle, aIter ) ) + { + (*aIter).second.mnState = nState; + } + else + { + SAL_WARN("sd","sd::STLPropertySet::setPropertyState(), unknown property!"); + } +} + +bool STLPropertySet::findProperty( sal_Int32 nHandle, PropertyMapIter& rIter ) +{ + rIter = maPropertyMap.find(nHandle); + return( rIter != maPropertyMap.end() ); +} + +bool STLPropertySet::findProperty( sal_Int32 nHandle, PropertyMapConstIter& rIter ) const +{ + rIter = maPropertyMap.find(nHandle); + return( rIter != maPropertyMap.end() ); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/STLPropertySet.hxx b/sd/source/ui/animations/STLPropertySet.hxx new file mode 100644 index 0000000000..e2e088cd5a --- /dev/null +++ b/sd/source/ui/animations/STLPropertySet.hxx @@ -0,0 +1,74 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd +{ + +enum class STLPropertyState { + Default = 0, + Direct = 1, + Ambiguous = 3 +}; + +struct STLPropertyMapEntry +{ + css::uno::Any maValue; + STLPropertyState mnState; + + STLPropertyMapEntry() + : mnState( STLPropertyState::Ambiguous ) {} + explicit STLPropertyMapEntry(css::uno::Any aValue) + : maValue(std::move( aValue )), mnState( STLPropertyState::Default ) {} + +}; + +typedef std::map PropertyMap; +typedef PropertyMap::iterator PropertyMapIter; +typedef PropertyMap::const_iterator PropertyMapConstIter; + +class STLPropertySet +{ +public: + STLPropertySet(); + ~STLPropertySet(); + + void setPropertyDefaultValue( sal_Int32 nHandle, const css::uno::Any& rValue ); + void setPropertyValue( sal_Int32 nHandle, const css::uno::Any& rValue ); + css::uno::Any getPropertyValue( sal_Int32 nHandle ) const; + + STLPropertyState getPropertyState( sal_Int32 nHandle ) const; + void setPropertyState( sal_Int32 nHandle, STLPropertyState nState ); + +private: + bool findProperty( sal_Int32 nHandle, PropertyMapIter& rIter ); + bool findProperty( sal_Int32 nHandle, PropertyMapConstIter& rIter ) const; + +private: + PropertyMap maPropertyMap; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/SlideTransitionPane.cxx b/sd/source/ui/animations/SlideTransitionPane.cxx new file mode 100644 index 0000000000..e2c954623e --- /dev/null +++ b/sd/source/ui/animations/SlideTransitionPane.cxx @@ -0,0 +1,1153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +using namespace ::com::sun::star; + +using ::com::sun::star::uno::Reference; + + +namespace sd::impl +{ +struct TransitionEffect +{ + TransitionEffect() : + mnType( 0 ), + mnSubType( 0 ), + mbDirection( true ), + mnFadeColor( 0 ) + { + init(); + } + explicit TransitionEffect( const ::sd::TransitionPreset & rPreset ) : + mnType( rPreset.getTransition()), + mnSubType( rPreset.getSubtype()), + mbDirection( rPreset.getDirection()), + mnFadeColor( rPreset.getFadeColor()) + { + init(); + } + explicit TransitionEffect( const SdPage & rPage ) : + mnType( rPage.getTransitionType() ), + mnSubType( rPage.getTransitionSubtype() ), + mbDirection( rPage.getTransitionDirection() ), + mnFadeColor( rPage.getTransitionFadeColor() ) + { + init(); + + mfDuration = rPage.getTransitionDuration(); + mfTime = rPage.GetTime(); + mePresChange = rPage.GetPresChange(); + mbSoundOn = rPage.IsSoundOn(); + maSound = rPage.GetSoundFile(); + mbLoopSound = rPage.IsLoopSound(); + mbStopSound = rPage.IsStopSound(); + } + + void init() + { + mfDuration = 2.0; + mfTime = 0.0; + mePresChange = PresChange::Manual; + mbSoundOn = false; + mbLoopSound = false; + mbStopSound = false; + + mbEffectAmbiguous = false; + mbDurationAmbiguous = false; + mbTimeAmbiguous = false; + mbPresChangeAmbiguous = false; + mbSoundAmbiguous = false; + mbLoopSoundAmbiguous = false; + } + + void setAllAmbiguous() + { + mbEffectAmbiguous = true; + mbDurationAmbiguous = true; + mbTimeAmbiguous = true; + mbPresChangeAmbiguous = true; + mbSoundAmbiguous = true; + mbLoopSoundAmbiguous = true; + } + + bool operator == ( const ::sd::TransitionPreset & rPreset ) const + { + return + (mnType == rPreset.getTransition()) && + (mnSubType == rPreset.getSubtype()) && + (mbDirection == rPreset.getDirection()) && + (mnFadeColor == rPreset.getFadeColor()); + } + + void applyTo( SdPage & rOutPage ) const + { + if( ! mbEffectAmbiguous ) + { + rOutPage.setTransitionType( mnType ); + rOutPage.setTransitionSubtype( mnSubType ); + rOutPage.setTransitionDirection( mbDirection ); + rOutPage.setTransitionFadeColor( mnFadeColor ); + } + + if( ! mbDurationAmbiguous ) + rOutPage.setTransitionDuration( mfDuration ); + if( ! mbTimeAmbiguous ) + rOutPage.SetTime( mfTime ); + if( ! mbPresChangeAmbiguous ) + rOutPage.SetPresChange( mePresChange ); + if( ! mbSoundAmbiguous ) + { + if( mbStopSound ) + { + rOutPage.SetStopSound( true ); + rOutPage.SetSound( false ); + } + else + { + rOutPage.SetStopSound( false ); + rOutPage.SetSound( mbSoundOn ); + rOutPage.SetSoundFile( maSound ); + } + } + if( ! mbLoopSoundAmbiguous ) + rOutPage.SetLoopSound( mbLoopSound ); + } + + void compareWith( const SdPage & rPage ) + { + TransitionEffect aOtherEffect( rPage ); + mbEffectAmbiguous = mbEffectAmbiguous || aOtherEffect.mbEffectAmbiguous + || (mnType != aOtherEffect.mnType) + || (mnSubType != aOtherEffect.mnSubType) + || (mbDirection != aOtherEffect.mbDirection) + || (mnFadeColor != aOtherEffect.mnFadeColor); + + mbDurationAmbiguous = mbDurationAmbiguous || aOtherEffect.mbDurationAmbiguous || mfDuration != aOtherEffect.mfDuration; + mbTimeAmbiguous = mbTimeAmbiguous || aOtherEffect.mbTimeAmbiguous || mfTime != aOtherEffect.mfTime; + mbPresChangeAmbiguous = mbPresChangeAmbiguous || aOtherEffect.mbPresChangeAmbiguous || mePresChange != aOtherEffect.mePresChange; + mbSoundAmbiguous = mbSoundAmbiguous || aOtherEffect.mbSoundAmbiguous || mbSoundOn != aOtherEffect.mbSoundOn; +#if 0 + // Weird leftover isolated expression with no effect, introduced in 2007 in + // CWS impress122. Ifdeffed out to avoid compiler warning, kept here in case + // somebody who understands this code notices and understands what the + // "right" thing to do might be. + (!mbStopSound && !aOtherEffect.mbStopSound && maSound != aOtherEffect.maSound) || (mbStopSound != aOtherEffect.mbStopSound); +#endif + mbLoopSoundAmbiguous = mbLoopSoundAmbiguous || aOtherEffect.mbLoopSoundAmbiguous || mbLoopSound != aOtherEffect.mbLoopSound; + } + + // effect + sal_Int16 mnType; + sal_Int16 mnSubType; + bool mbDirection; + sal_Int32 mnFadeColor; + + // other settings + double mfDuration; + double mfTime; + PresChange mePresChange; + bool mbSoundOn; + OUString maSound; + bool mbLoopSound; + bool mbStopSound; + + bool mbEffectAmbiguous; + bool mbDurationAmbiguous; + bool mbTimeAmbiguous; + bool mbPresChangeAmbiguous; + bool mbSoundAmbiguous; + bool mbLoopSoundAmbiguous; +}; + +} // namespace sd::impl + +// Local Helper Functions +namespace +{ + +void lcl_ApplyToPages( + const ::sd::slidesorter::SharedPageSelection& rpPages, + const ::sd::impl::TransitionEffect & rEffect ) +{ + for( const auto& rpPage : *rpPages ) + { + rEffect.applyTo( *rpPage ); + } +} + +void lcl_CreateUndoForPages( + const ::sd::slidesorter::SharedPageSelection& rpPages, + ::sd::ViewShellBase const & rBase ) +{ + ::sd::DrawDocShell* pDocSh = rBase.GetDocShell(); + if (!pDocSh) + return; + SfxUndoManager* pManager = pDocSh->GetUndoManager(); + if (!pManager) + return; + SdDrawDocument* pDoc = pDocSh->GetDoc(); + if (!pDoc) + return; + + OUString aComment( SdResId(STR_UNDO_SLIDE_PARAMS) ); + pManager->EnterListAction(aComment, aComment, 0, rBase.GetViewShellId()); + std::unique_ptr pUndoGroup(new SdUndoGroup( pDoc )); + pUndoGroup->SetComment( aComment ); + + for( const auto& rpPage : *rpPages ) + { + pUndoGroup->AddAction( new sd::UndoTransition( pDoc, rpPage ) ); + } + + pManager->AddUndoAction( std::move(pUndoGroup) ); + pManager->LeaveListAction(); +} + +struct lcl_EqualsSoundFileName +{ + explicit lcl_EqualsSoundFileName( OUString aStr ) : + maStr(std::move( aStr )) + {} + + bool operator() ( const OUString & rStr ) const + { + // note: formerly this was a case insensitive search for all + // platforms. It seems more sensible to do this platform-dependent + INetURLObject aURL(rStr); +#if defined(_WIN32) + return maStr.equalsIgnoreAsciiCase( aURL.GetBase() ); +#else + return maStr == aURL.GetBase(); +#endif + } + +private: + OUString maStr; +}; + +// returns -1 if no object was found +bool lcl_findSoundInList( const ::std::vector< OUString > & rSoundList, + std::u16string_view rFileName, + ::std::vector< OUString >::size_type & rOutPosition ) +{ + INetURLObject aURL(rFileName); + ::std::vector< OUString >::const_iterator aIt = + ::std::find_if( rSoundList.begin(), rSoundList.end(), + lcl_EqualsSoundFileName( aURL.GetBase())); + if( aIt != rSoundList.end()) + { + rOutPosition = ::std::distance( rSoundList.begin(), aIt ); + return true; + } + + return false; +} + +OUString lcl_getSoundFileURL( + const ::std::vector< OUString > & rSoundList, + const weld::ComboBox& rListBox ) +{ + sal_Int32 nPos = rListBox.get_active(); + // the first three entries are no actual sounds + if( nPos >= 3 ) + { + DBG_ASSERT( static_cast(rListBox.get_count() - 3) == rSoundList.size(), + "Sound list-box is not synchronized to sound list" ); + nPos -= 3; + if( rSoundList.size() > o3tl::make_unsigned(nPos) ) + return rSoundList[ nPos ]; + } + + return OUString(); +} + +struct lcl_AppendSoundToListBox +{ + explicit lcl_AppendSoundToListBox(weld::ComboBox& rListBox) + : mrListBox( rListBox ) + {} + + void operator() ( std::u16string_view rString ) const + { + INetURLObject aURL( rString ); + mrListBox.append_text( aURL.GetBase() ); + } + +private: + weld::ComboBox& mrListBox; +}; + +void lcl_FillSoundListBox( + const ::std::vector< OUString > & rSoundList, + weld::ComboBox& rOutListBox ) +{ + sal_Int32 nCount = rOutListBox.get_count(); + + // keep first three entries + for( sal_Int32 i=nCount - 1; i>=3; --i ) + rOutListBox.remove( i ); + + ::std::for_each( rSoundList.begin(), rSoundList.end(), + lcl_AppendSoundToListBox( rOutListBox )); +} + +/// Returns an offset into the list of transition presets +size_t getPresetOffset( const sd::impl::TransitionEffect &rEffect ) +{ + const sd::TransitionPresetList& rPresetList = + sd::TransitionPreset::getTransitionPresetList(); + + size_t nIdx = 0; + for( const auto& aIt: rPresetList ) + { + if( rEffect.operator==( *aIt )) + break; + nIdx++; + } + return nIdx; +} + +} // anonymous namespace + +namespace sd +{ + +class TransitionPane : public ValueSet +{ +public: + explicit TransitionPane(std::unique_ptr pScrolledWindow) + : ValueSet(std::move(pScrolledWindow)) + { + } + + void Recalculate() + { + GetScrollBar()->set_vpolicy(VclPolicyType::AUTOMATIC); + RecalculateItemSizes(); + } + + virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override + { + Size aSize = pDrawingArea->get_ref_device().LogicToPixel(Size(70, 88), MapMode(MapUnit::MapAppFont)); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + ValueSet::SetDrawingArea(pDrawingArea); + SetOutputSizePixel(aSize); + + SetStyle(GetStyle() | WB_ITEMBORDER | WB_FLATVALUESET | WB_VSCROLL); + EnableFullItemMode( false ); + SetColCount(3); + } +}; + +// SlideTransitionPane +SlideTransitionPane::SlideTransitionPane( + weld::Widget* pParent, + ViewShellBase & rBase) : + PanelLayout( pParent, "SlideTransitionsPanel", "modules/simpress/ui/slidetransitionspanel.ui" ), + mrBase( rBase ), + mpDrawDoc( rBase.GetDocShell() ? rBase.GetDocShell()->GetDoc() : nullptr ), + mbHasSelection( false ), + mbUpdatingControls( false ), + mbIsMainViewChangePending( false ), + maLateInitTimer("sd SlideTransitionPane maLateInitTimer") +{ + Initialize(mpDrawDoc); +} + +css::ui::LayoutSize SlideTransitionPane::GetHeightForWidth(const sal_Int32 /*nWidth*/) +{ + sal_Int32 nMinimumHeight = get_preferred_size().Height(); + return css::ui::LayoutSize(nMinimumHeight, -1, nMinimumHeight); +} + +constexpr sal_uInt16 nNoneId = std::numeric_limits::max(); + +void SlideTransitionPane::Initialize(SdDrawDocument* pDoc) +{ + mxLB_VARIANT = m_xBuilder->weld_combo_box("variant_list"); + mxCBX_duration = m_xBuilder->weld_metric_spin_button("transition_duration", FieldUnit::SECOND); + mxFT_SOUND = m_xBuilder->weld_label("sound_label"); + mxLB_SOUND = m_xBuilder->weld_combo_box("sound_list"); + mxCB_LOOP_SOUND = m_xBuilder->weld_check_button("loop_sound"); + mxRB_ADVANCE_ON_MOUSE = m_xBuilder->weld_radio_button("rb_mouse_click"); + mxRB_ADVANCE_AUTO = m_xBuilder->weld_radio_button("rb_auto_after"); + mxMF_ADVANCE_AUTO_AFTER = m_xBuilder->weld_metric_spin_button("auto_after_value", FieldUnit::SECOND); + mxPB_APPLY_TO_ALL = m_xBuilder->weld_button("apply_to_all"); + mxPB_PLAY = m_xBuilder->weld_button("play"); + mxCB_AUTO_PREVIEW = m_xBuilder->weld_check_button("auto_preview"); + + auto nMax = mxMF_ADVANCE_AUTO_AFTER->get_max(FieldUnit::SECOND); + mxMF_ADVANCE_AUTO_AFTER->set_max(99, FieldUnit::SECOND); + int nWidthChars = mxMF_ADVANCE_AUTO_AFTER->get_width_chars(); + mxMF_ADVANCE_AUTO_AFTER->set_max(nMax, FieldUnit::SECOND); + mxMF_ADVANCE_AUTO_AFTER->set_width_chars(nWidthChars); + mxCBX_duration->set_width_chars(nWidthChars); + + mxVS_TRANSITION_ICONS.reset(new TransitionPane(m_xBuilder->weld_scrolled_window("transitions_iconswin", true))); + mxVS_TRANSITION_ICONSWin.reset(new weld::CustomWeld(*m_xBuilder, "transitions_icons", *mxVS_TRANSITION_ICONS)); + + if( pDoc ) + mxModel = pDoc->getUnoModel(); + // TODO: get correct view + if( mxModel.is()) + mxView.set( mxModel->getCurrentController(), uno::UNO_QUERY ); + + // dummy list box of slide transitions for startup. + mxVS_TRANSITION_ICONS->InsertItem( + nNoneId, Image( StockImage::Yes, "sd/cmd/transition-none.png" ), + SdResId( STR_SLIDETRANSITION_NONE ), + VALUESET_APPEND, /* show legend */ true ); + mxVS_TRANSITION_ICONS->Recalculate(); + + // set defaults + mxCB_AUTO_PREVIEW->set_active(true); // automatic preview on + + // update control states before adding handlers + updateControls(); + + // set handlers + mxPB_APPLY_TO_ALL->connect_clicked( LINK( this, SlideTransitionPane, ApplyToAllButtonClicked )); + mxPB_PLAY->connect_clicked( LINK( this, SlideTransitionPane, PlayButtonClicked )); + + mxVS_TRANSITION_ICONS->SetSelectHdl( LINK( this, SlideTransitionPane, TransitionSelected )); + + mxLB_VARIANT->connect_changed( LINK( this, SlideTransitionPane, VariantListBoxSelected )); + mxCBX_duration->connect_value_changed(LINK( this, SlideTransitionPane, DurationModifiedHdl)); + mxCBX_duration->connect_focus_out(LINK( this, SlideTransitionPane, DurationLoseFocusHdl)); + mxLB_SOUND->connect_changed( LINK( this, SlideTransitionPane, SoundListBoxSelected )); + mxCB_LOOP_SOUND->connect_toggled( LINK( this, SlideTransitionPane, LoopSoundBoxChecked )); + + mxRB_ADVANCE_ON_MOUSE->connect_toggled( LINK( this, SlideTransitionPane, AdvanceSlideRadioButtonToggled )); + mxRB_ADVANCE_AUTO->connect_toggled( LINK( this, SlideTransitionPane, AdvanceSlideRadioButtonToggled )); + mxMF_ADVANCE_AUTO_AFTER->connect_value_changed( LINK( this, SlideTransitionPane, AdvanceTimeModified )); + mxCB_AUTO_PREVIEW->connect_toggled( LINK( this, SlideTransitionPane, AutoPreviewClicked )); + addListener(); + + maLateInitTimer.SetTimeout(200); + maLateInitTimer.SetInvokeHandler(LINK(this, SlideTransitionPane, LateInitCallback)); + maLateInitTimer.Start(); +} + +SlideTransitionPane::~SlideTransitionPane() +{ + maLateInitTimer.Stop(); + removeListener(); + mxVS_TRANSITION_ICONSWin.reset(); + mxVS_TRANSITION_ICONS.reset(); + mxLB_VARIANT.reset(); + mxCBX_duration.reset(); + mxFT_SOUND.reset(); + mxLB_SOUND.reset(); + mxCB_LOOP_SOUND.reset(); + mxRB_ADVANCE_ON_MOUSE.reset(); + mxRB_ADVANCE_AUTO.reset(); + mxMF_ADVANCE_AUTO_AFTER.reset(); + mxPB_APPLY_TO_ALL.reset(); + mxPB_PLAY.reset(); + mxCB_AUTO_PREVIEW.reset(); +} + +void SlideTransitionPane::onSelectionChanged() +{ + updateControls(); +} + +void SlideTransitionPane::onChangeCurrentPage() +{ + updateControls(); +} + +::sd::slidesorter::SharedPageSelection SlideTransitionPane::getSelectedPages() const +{ + ::sd::slidesorter::SlideSorterViewShell * pSlideSorterViewShell + = ::sd::slidesorter::SlideSorterViewShell::GetSlideSorter(mrBase); + std::shared_ptr pSelection; + + if( pSlideSorterViewShell ) + { + pSelection = pSlideSorterViewShell->GetPageSelection(); + } + else + { + pSelection = std::make_shared(); + if( mxView.is() ) + { + SdPage* pPage = SdPage::getImplementation( mxView->getCurrentPage() ); + if( pPage ) + pSelection->push_back(pPage); + } + } + + return pSelection; +} + +void SlideTransitionPane::updateControls() +{ + ::sd::slidesorter::SharedPageSelection pSelectedPages(getSelectedPages()); + if( pSelectedPages->empty()) + { + mbHasSelection = false; + return; + } + mbHasSelection = true; + + DBG_ASSERT( ! mbUpdatingControls, "Multiple Control Updates" ); + mbUpdatingControls = true; + + // get model data for first page + SdPage * pFirstPage = pSelectedPages->front(); + DBG_ASSERT( pFirstPage, "Invalid Page" ); + + impl::TransitionEffect aEffect( *pFirstPage ); + + // merge with other pages + + // start with second page (note aIt != aEndIt, because ! aSelectedPages.empty()) + for( const auto& rpPage : *pSelectedPages ) + { + if( rpPage ) + aEffect.compareWith( *rpPage ); + } + + // detect current slide effect + if( aEffect.mbEffectAmbiguous ) + { + SAL_WARN( "sd.transitions", "Unusual, ambiguous transition effect" ); + mxVS_TRANSITION_ICONS->SelectItem(nNoneId); + } + else + { + // ToDo: That 0 is "no transition" is documented nowhere except in the + // CTOR of sdpage + if( aEffect.mnType == 0 ) + mxVS_TRANSITION_ICONS->SelectItem(nNoneId); + else + updateVariants( getPresetOffset( aEffect ) ); + } + + if( aEffect.mbDurationAmbiguous ) + { + mxCBX_duration->set_text(""); +//TODO mxCBX_duration->SetNoSelection(); + } + else + { + mxCBX_duration->set_value( (aEffect.mfDuration)*100.0, FieldUnit::SECOND ); + } + + if( aEffect.mbSoundAmbiguous ) + { + mxLB_SOUND->set_active(-1); + maCurrentSoundFile.clear(); + } + else + { + maCurrentSoundFile.clear(); + if( aEffect.mbStopSound ) + { + mxLB_SOUND->set_active( 1 ); + } + else if( aEffect.mbSoundOn && !aEffect.maSound.isEmpty() ) + { + std::vector::size_type nPos = 0; + if( lcl_findSoundInList( maSoundList, aEffect.maSound, nPos )) + { + mxLB_SOUND->set_active( nPos + 3 ); + maCurrentSoundFile = aEffect.maSound; + } + } + else + { + mxLB_SOUND->set_active( 0 ); + } + } + + if( aEffect.mbLoopSoundAmbiguous ) + { + mxCB_LOOP_SOUND->set_state(TRISTATE_INDET); + } + else + { + mxCB_LOOP_SOUND->set_active(aEffect.mbLoopSound); + } + + if( aEffect.mbPresChangeAmbiguous ) + { + mxRB_ADVANCE_ON_MOUSE->set_active( false ); + mxRB_ADVANCE_AUTO->set_active( false ); + } + else + { + mxRB_ADVANCE_ON_MOUSE->set_active( aEffect.mePresChange == PresChange::Manual ); + mxRB_ADVANCE_AUTO->set_active( aEffect.mePresChange == PresChange::Auto ); + mxMF_ADVANCE_AUTO_AFTER->set_value(aEffect.mfTime * 100.0, FieldUnit::SECOND); + } + + if (comphelper::LibreOfficeKit::isActive()) + { + mxPB_PLAY->hide(); + mxCB_AUTO_PREVIEW->set_active(false); + mxCB_AUTO_PREVIEW->hide(); + mxFT_SOUND->hide(); + mxLB_SOUND->hide(); + mxCB_LOOP_SOUND->hide(); + } + else + { + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + mxCB_AUTO_PREVIEW->set_active( pOptions->IsPreviewTransitions() ); + } + + mbUpdatingControls = false; + + updateControlState(); +} + +void SlideTransitionPane::updateControlState() +{ + mxVS_TRANSITION_ICONSWin->set_sensitive( mbHasSelection ); + mxLB_VARIANT->set_sensitive( mbHasSelection && mxLB_VARIANT->get_count() > 0 ); + mxCBX_duration->set_sensitive( mbHasSelection ); + mxLB_SOUND->set_sensitive( mbHasSelection ); + mxCB_LOOP_SOUND->set_sensitive( mbHasSelection && (mxLB_SOUND->get_active() > 2)); + mxRB_ADVANCE_ON_MOUSE->set_sensitive( mbHasSelection ); + mxRB_ADVANCE_AUTO->set_sensitive( mbHasSelection ); + mxMF_ADVANCE_AUTO_AFTER->set_sensitive( mbHasSelection && mxRB_ADVANCE_AUTO->get_active()); + + mxPB_APPLY_TO_ALL->set_sensitive( mbHasSelection ); + mxPB_PLAY->set_sensitive( mbHasSelection ); + mxCB_AUTO_PREVIEW->set_sensitive( mbHasSelection ); +} + +void SlideTransitionPane::updateSoundList() +{ + maSoundList.clear(); + + GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, maSoundList ); + GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, maSoundList ); + + lcl_FillSoundListBox( maSoundList, *mxLB_SOUND ); +} + +void SlideTransitionPane::openSoundFileDialog() +{ + if( ! mxLB_SOUND->get_sensitive()) + return; + + weld::Window* pDialogParent(GetFrameWeld()); + SdOpenSoundFileDialog aFileDialog(pDialogParent); + + DBG_ASSERT( mxLB_SOUND->get_active() == 2, + "Dialog should only open when \"Other sound\" is selected" ); + + bool bValidSoundFile( false ); + bool bQuitLoop( false ); + + while( ! bQuitLoop && + aFileDialog.Execute() == ERRCODE_NONE ) + { + OUString aFile = aFileDialog.GetPath(); + std::vector::size_type nPos = 0; + bValidSoundFile = lcl_findSoundInList( maSoundList, aFile, nPos ); + + if( bValidSoundFile ) + { + bQuitLoop = true; + } + else // not in sound list + { + // try to insert into gallery + if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile ) ) + { + updateSoundList(); + bValidSoundFile = lcl_findSoundInList( maSoundList, aFile, nPos ); + DBG_ASSERT( bValidSoundFile, "Adding sound to gallery failed" ); + + bQuitLoop = true; + } + else + { + OUString aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE)); + aStrWarning = aStrWarning.replaceFirst("%", aFile); + std::unique_ptr xWarn(Application::CreateMessageDialog(pDialogParent, + VclMessageType::Warning, VclButtonsType::NONE, + aStrWarning)); + xWarn->add_button(GetStandardText(StandardButtonType::Retry), RET_RETRY); + xWarn->add_button(GetStandardText(StandardButtonType::Cancel), RET_CANCEL); + bQuitLoop = (xWarn->run() != RET_RETRY); + + bValidSoundFile = false; + } + } + + if( bValidSoundFile ) + // skip first three entries in list + mxLB_SOUND->set_active( nPos + 3 ); + } + + if( bValidSoundFile ) + return; + + if( !maCurrentSoundFile.isEmpty() ) + { + std::vector::size_type nPos = 0; + if( lcl_findSoundInList( maSoundList, maCurrentSoundFile, nPos )) + mxLB_SOUND->set_active( nPos + 3 ); + else + mxLB_SOUND->set_active( 0 ); // NONE + } + else + mxLB_SOUND->set_active( 0 ); // NONE +} + +impl::TransitionEffect SlideTransitionPane::getTransitionEffectFromControls() const +{ + impl::TransitionEffect aResult; + aResult.setAllAmbiguous(); + + bool bNoneSelected = mxVS_TRANSITION_ICONS->IsNoSelection() || mxVS_TRANSITION_ICONS->GetSelectedItemId() == nNoneId; + + // check first (aResult might be overwritten) + if( mxVS_TRANSITION_ICONSWin->get_sensitive() && + !bNoneSelected && + mxVS_TRANSITION_ICONS->GetSelectedItemId() > 0 ) + { + const sd::TransitionPresetList& rPresetList = sd::TransitionPreset::getTransitionPresetList(); + auto aSelected = rPresetList.begin(); + std::advance( aSelected, mxVS_TRANSITION_ICONS->GetSelectedItemId() - 1); + + if (mxLB_VARIANT->get_active() == -1) + { + // Transition with just one effect. + aResult = impl::TransitionEffect( **aSelected ); + aResult.setAllAmbiguous(); + } + else + { + int nVariant = 0; + bool bFound = false; + for( const auto& aIter: rPresetList ) + { + if( aIter->getSetId() == (*aSelected)->getSetId() ) + { + if( mxLB_VARIANT->get_active() == nVariant) + { + aResult = impl::TransitionEffect( *aIter ); + aResult.setAllAmbiguous(); + bFound = true; + break; + } + else + { + nVariant++; + } + } + } + if( !bFound ) + { + aResult.mnType = 0; + } + } + aResult.mbEffectAmbiguous = false; + } + else if (bNoneSelected) + { + aResult.mbEffectAmbiguous = false; + } + + //duration + + if( mxCBX_duration->get_sensitive() && (!(mxCBX_duration->get_text()).isEmpty()) ) + { + aResult.mfDuration = static_cast(mxCBX_duration->get_value(FieldUnit::SECOND))/100.0; + aResult.mbDurationAmbiguous = false; + } + + // slide-advance mode + if( mxRB_ADVANCE_ON_MOUSE->get_sensitive() && mxRB_ADVANCE_AUTO->get_sensitive() && + (mxRB_ADVANCE_ON_MOUSE->get_active() || mxRB_ADVANCE_AUTO->get_active())) + { + if( mxRB_ADVANCE_ON_MOUSE->get_active()) + aResult.mePresChange = PresChange::Manual; + else + { + aResult.mePresChange = PresChange::Auto; + if( mxMF_ADVANCE_AUTO_AFTER->get_sensitive()) + { + aResult.mfTime = static_cast(mxMF_ADVANCE_AUTO_AFTER->get_value(FieldUnit::SECOND) ) / 100.0 ; + aResult.mbTimeAmbiguous = false; + } + } + + aResult.mbPresChangeAmbiguous = false; + } + + // sound + if( mxLB_SOUND->get_sensitive()) + { + maCurrentSoundFile.clear(); + sal_Int32 nPos = mxLB_SOUND->get_active(); + if (nPos != -1) + { + aResult.mbStopSound = nPos == 1; + aResult.mbSoundOn = nPos > 1; + if( aResult.mbStopSound ) + { + aResult.maSound.clear(); + aResult.mbSoundAmbiguous = false; + } + else + { + aResult.maSound = lcl_getSoundFileURL(maSoundList, *mxLB_SOUND); + aResult.mbSoundAmbiguous = false; + maCurrentSoundFile = aResult.maSound; + } + } + } + + // sound loop + if( mxCB_LOOP_SOUND->get_sensitive() ) + { + aResult.mbLoopSound = mxCB_LOOP_SOUND->get_active(); + aResult.mbLoopSoundAmbiguous = false; + } + + return aResult; +} + +void SlideTransitionPane::applyToSelectedPages(bool bPreview = true) +{ + if( mbUpdatingControls ) + return; + + vcl::Window *pFocusWindow = Application::GetFocusWindow(); + + ::sd::slidesorter::SharedPageSelection pSelectedPages( getSelectedPages()); + impl::TransitionEffect aEffect = getTransitionEffectFromControls(); + if( ! pSelectedPages->empty()) + { + lcl_CreateUndoForPages( pSelectedPages, mrBase ); + lcl_ApplyToPages( pSelectedPages, aEffect ); + mrBase.GetDocShell()->SetModified(); + } + if( mxCB_AUTO_PREVIEW->get_sensitive() && + mxCB_AUTO_PREVIEW->get_active() && bPreview) + { + if (aEffect.mnType) // mnType = 0 denotes no transition + playCurrentEffect(); + else if( mxView.is() ) + SlideShow::Stop( mrBase ); + } + + if (pFocusWindow) + pFocusWindow->GrabFocus(); +} + +void SlideTransitionPane::playCurrentEffect() +{ + if( mxView.is() ) + { + + Reference< css::animations::XAnimationNode > xNode; + SlideShow::StartPreview( mrBase, mxView->getCurrentPage(), xNode ); + } +} + +void SlideTransitionPane::addListener() +{ + Link aLink( LINK(this,SlideTransitionPane,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->AddEventListener( aLink ); +} + +void SlideTransitionPane::removeListener() +{ + Link aLink( LINK(this,SlideTransitionPane,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); +} + +IMPL_LINK(SlideTransitionPane,EventMultiplexerListener, + tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::EditViewSelection: + onSelectionChanged(); + break; + + case EventMultiplexerEventId::CurrentPageChanged: + case EventMultiplexerEventId::SlideSortedSelection: + onChangeCurrentPage(); + break; + + case EventMultiplexerEventId::MainViewRemoved: + mxView.clear(); + onSelectionChanged(); + onChangeCurrentPage(); + break; + + case EventMultiplexerEventId::MainViewAdded: + mbIsMainViewChangePending = true; + break; + + case EventMultiplexerEventId::ConfigurationUpdated: + if (mbIsMainViewChangePending) + { + mbIsMainViewChangePending = false; + + // At this moment the controller may not yet been set at + // model or ViewShellBase. Take it from the view shell + // passed with the event. + if (mrBase.GetMainViewShell() != nullptr) + { + mxView.set(mrBase.GetController(), css::uno::UNO_QUERY); + onSelectionChanged(); + onChangeCurrentPage(); + } + } + break; + + default: + if (rEvent.meEventId != EventMultiplexerEventId::Disposing) + { + onSelectionChanged(); + onChangeCurrentPage(); + } + break; + } +} + +IMPL_LINK_NOARG(SlideTransitionPane, ApplyToAllButtonClicked, weld::Button&, void) +{ + DBG_ASSERT( mpDrawDoc, "Invalid Draw Document!" ); + if( !mpDrawDoc ) + return; + + ::sd::slidesorter::SharedPageSelection pPages = + std::make_shared<::sd::slidesorter::SlideSorterViewShell::PageSelection>(); + + sal_uInt16 nPageCount = mpDrawDoc->GetSdPageCount( PageKind::Standard ); + pPages->reserve( nPageCount ); + for( sal_uInt16 i=0; iGetSdPage( i, PageKind::Standard ); + if( pPage ) + pPages->push_back( pPage ); + } + + if( ! pPages->empty()) + { + lcl_CreateUndoForPages( pPages, mrBase ); + lcl_ApplyToPages( pPages, getTransitionEffectFromControls() ); + } +} + +IMPL_LINK_NOARG(SlideTransitionPane, PlayButtonClicked, weld::Button&, void) +{ + playCurrentEffect(); +} + +IMPL_LINK_NOARG(SlideTransitionPane, TransitionSelected, ValueSet*, void) +{ + updateVariants( mxVS_TRANSITION_ICONS->GetSelectedItemId() - 1 ); + applyToSelectedPages(); +} + +/// we use an integer offset into the list of transition presets +void SlideTransitionPane::updateVariants( size_t nPresetOffset ) +{ + const sd::TransitionPresetList& rPresetList = sd::TransitionPreset::getTransitionPresetList(); + mxLB_VARIANT->clear(); + mxVS_TRANSITION_ICONS->SelectItem(nNoneId); + + if( nPresetOffset >= rPresetList.size() ) + { + mxLB_VARIANT->set_sensitive( false ); + } + else + { + auto pFound = rPresetList.begin(); + std::advance( pFound, nPresetOffset ); + + // Fill in the variant listbox + size_t nFirstItem = 0, nItem = 1; + for( const auto& aIt: rPresetList ) + { + if( aIt->getSetId() == (*pFound)->getSetId() ) + { + if (!nFirstItem) + nFirstItem = nItem; + if( !aIt->getVariantLabel().isEmpty() ) + { + mxLB_VARIANT->append_text( aIt->getVariantLabel() ); + if( *pFound == aIt ) + mxLB_VARIANT->set_active( mxLB_VARIANT->get_count()-1 ); + } + } + nItem++; + } + + if( mxLB_VARIANT->get_count() == 0 ) + mxLB_VARIANT->set_sensitive( false ); + else + mxLB_VARIANT->set_sensitive(true); + + // item has the id of the first transition from this set. + mxVS_TRANSITION_ICONS->SelectItem( nFirstItem ); + } +} + +IMPL_LINK_NOARG(SlideTransitionPane, AdvanceSlideRadioButtonToggled, weld::Toggleable&, void) +{ + updateControlState(); + applyToSelectedPages(false); +} + +IMPL_LINK_NOARG(SlideTransitionPane, AdvanceTimeModified, weld::MetricSpinButton&, void) +{ + applyToSelectedPages(false); +} + +IMPL_LINK_NOARG(SlideTransitionPane, VariantListBoxSelected, weld::ComboBox&, void) +{ + applyToSelectedPages(); +} + +IMPL_LINK_NOARG(SlideTransitionPane, DurationModifiedHdl, weld::MetricSpinButton&, void) +{ + double duration_value = static_cast(mxCBX_duration->get_value(FieldUnit::SECOND)); + if (duration_value <= 0.0) + mxCBX_duration->set_value(0, FieldUnit::SECOND); + else + mxCBX_duration->set_value(duration_value, FieldUnit::SECOND); + + applyToSelectedPages(); +} + +IMPL_LINK_NOARG(SlideTransitionPane, DurationLoseFocusHdl, weld::Widget&, void) +{ + applyToSelectedPages(); +} + +IMPL_LINK_NOARG(SlideTransitionPane, SoundListBoxSelected, weld::ComboBox&, void) +{ + sal_Int32 nPos = mxLB_SOUND->get_active(); + if( nPos == 2 ) + { + // other sound... + openSoundFileDialog(); + } + updateControlState(); + applyToSelectedPages(); +} + +IMPL_LINK_NOARG(SlideTransitionPane, LoopSoundBoxChecked, weld::Toggleable&, void) +{ + applyToSelectedPages(); +} + +IMPL_LINK_NOARG(SlideTransitionPane, AutoPreviewClicked, weld::Toggleable&, void) +{ + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + pOptions->SetPreviewTransitions( mxCB_AUTO_PREVIEW->get_active() ); +} + +IMPL_LINK_NOARG(SlideTransitionPane, LateInitCallback, Timer *, void) +{ + const TransitionPresetList& rPresetList = TransitionPreset::getTransitionPresetList(); + + size_t nPresetOffset = 0; + for( const TransitionPresetPtr& pPreset: rPresetList ) + { + const OUString sLabel( pPreset->getSetLabel() ); + if( !sLabel.isEmpty() ) + { + if( m_aNumVariants.find( pPreset->getSetId() ) == m_aNumVariants.end() ) + { + OUString sImageName("sd/cmd/transition-" + pPreset->getSetId() + ".png"); + BitmapEx aIcon( sImageName ); + if ( aIcon.IsEmpty() ) // need a fallback + sImageName = "sd/cmd/transition-none.png"; + + mxVS_TRANSITION_ICONS->InsertItem( + nPresetOffset + 1, Image(StockImage::Yes, sImageName), sLabel, + VALUESET_APPEND, /* show legend */ true ); + + m_aNumVariants[ pPreset->getSetId() ] = 1; + } + else + { + m_aNumVariants[ pPreset->getSetId() ]++; + } + } + nPresetOffset++; + } + mxVS_TRANSITION_ICONS->Recalculate(); + + SAL_INFO( "sd.transitions", "Item transition offsets in ValueSet:"); + for( size_t i = 0; i < mxVS_TRANSITION_ICONS->GetItemCount(); ++i ) + SAL_INFO( "sd.transitions", i << ":" << mxVS_TRANSITION_ICONS->GetItemId( i ) ); + + nPresetOffset = 0; + SAL_INFO( "sd.transitions", "Transition presets by offsets:"); + for( const auto& aIter: rPresetList ) + { + SAL_INFO( "sd.transitions", nPresetOffset++ << " " << + aIter->getPresetId() << ": " << aIter->getSetId() ); + } + + updateSoundList(); + updateControls(); +} + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/motionpathtag.cxx b/sd/source/ui/animations/motionpathtag.cxx new file mode 100644 index 0000000000..d3153f892b --- /dev/null +++ b/sd/source/ui/animations/motionpathtag.cxx @@ -0,0 +1,1197 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "motionpathtag.hxx" +#include +#include + +#include +#include +#include + +using sdr::PolyPolygonEditor; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::util; +using namespace ::com::sun::star::drawing; + +namespace sd +{ + +const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32; +const int DRGPIX = 2; // Drag MinMove in Pixel + +namespace { + +class PathDragMove : public SdrDragMove +{ +private: + basegfx::B2DPolyPolygon maPathPolyPolygon; + +protected: + virtual void createSdrDragEntries() override; + +public: + PathDragMove(SdrDragView& rNewView, + rtl::Reference xTag, + basegfx::B2DPolyPolygon aPathPolyPolygon) + : SdrDragMove(rNewView), + maPathPolyPolygon(std::move(aPathPolyPolygon)), + mxTag(std::move( xTag )) + {} + + PathDragMove(SdrDragView& rNewView, + rtl::Reference xTag) + : SdrDragMove(rNewView), + mxTag(std::move( xTag )) + {} + + virtual bool BeginSdrDrag() override; + virtual bool EndSdrDrag(bool bCopy) override; + + rtl::Reference mxTag; +}; + +} + +void PathDragMove::createSdrDragEntries() +{ + // call parent + SdrDragMove::createSdrDragEntries(); + + if(maPathPolyPolygon.count()) + { + addSdrDragEntry(std::unique_ptr(new SdrDragEntryPolyPolygon(maPathPolyPolygon))); + } +} + +bool PathDragMove::BeginSdrDrag() +{ + if( mxTag.is() ) + { + SdrPathObj* pPathObj = mxTag->getPathObj(); + if( pPathObj ) + { + DragStat().SetActionRect(pPathObj->GetCurrentBoundRect()); + } + } + Show(); + return true; +} + +bool PathDragMove::EndSdrDrag(bool /*bCopy*/) +{ + Hide(); + if( mxTag.is() ) + mxTag->MovePath( DragStat().GetDX(), DragStat().GetDY() ); + return true; +} + +namespace { + +class PathDragResize : public SdrDragResize +{ +private: + basegfx::B2DPolyPolygon maPathPolyPolygon; + +protected: + virtual void createSdrDragEntries() override; + +public: + PathDragResize(SdrDragView& rNewView, + rtl::Reference xTag, + basegfx::B2DPolyPolygon aPathPolyPolygon) + : SdrDragResize(rNewView), + maPathPolyPolygon(std::move(aPathPolyPolygon)), + mxTag(std::move( xTag )) + {} + + PathDragResize(SdrDragView& rNewView, + rtl::Reference xTag) + : SdrDragResize(rNewView), + mxTag(std::move( xTag )) + {} + + virtual bool EndSdrDrag(bool bCopy) override; + rtl::Reference mxTag; +}; + +} + +void PathDragResize::createSdrDragEntries() +{ + // call parent + SdrDragResize::createSdrDragEntries(); + + if(maPathPolyPolygon.count()) + { + addSdrDragEntry(std::unique_ptr(new SdrDragEntryPolyPolygon(maPathPolyPolygon))); + } +} + +bool PathDragResize::EndSdrDrag(bool /*bCopy*/) +{ + Hide(); + if( mxTag.is() ) + { + SdrPathObj* pPathObj = mxTag->getPathObj(); + if( pPathObj ) + { + const Point aRef( DragStat().GetRef1() ); + basegfx::B2DHomMatrix aTrans(basegfx::utils::createTranslateB2DHomMatrix(-aRef.X(), -aRef.Y())); + aTrans.scale(double(aXFact), double(aYFact)); + aTrans.translate(aRef.X(), aRef.Y()); + basegfx::B2DPolyPolygon aDragPoly(pPathObj->GetPathPoly()); + aDragPoly.transform(aTrans); + pPathObj->SetPathPoly( aDragPoly ); + } + } + return true; +} + +namespace { + +class PathDragObjOwn : public SdrDragObjOwn +{ +private: + basegfx::B2DPolyPolygon maPathPolyPolygon; + +protected: + virtual void createSdrDragEntries() override; + +public: + PathDragObjOwn(SdrDragView& rNewView, + basegfx::B2DPolyPolygon aPathPolyPolygon) + : SdrDragObjOwn(rNewView), + maPathPolyPolygon(std::move(aPathPolyPolygon)) + {} + + explicit PathDragObjOwn(SdrDragView& rNewView) + : SdrDragObjOwn(rNewView) + {} + + virtual bool EndSdrDrag(bool bCopy) override; +}; + +} + +void PathDragObjOwn::createSdrDragEntries() +{ + // call parent + SdrDragObjOwn::createSdrDragEntries(); + + if(maPathPolyPolygon.count()) + { + addSdrDragEntry(std::unique_ptr(new SdrDragEntryPolyPolygon(maPathPolyPolygon))); + } +} + +bool PathDragObjOwn::EndSdrDrag(bool /*bCopy*/) +{ + Hide(); + + SdrObject* pObj = GetDragObj(); + + if(pObj && pObj->applySpecialDrag(DragStat())) + { + pObj->SetChanged(); + pObj->BroadcastObjectChange(); + return true; + } + else + { + return false; + } +} + +namespace { + +class SdPathHdl : public SmartHdl +{ +public: + SdPathHdl( const SmartTagReference& xTag, SdrPathObj* mpPathObj ); + + virtual void CreateB2dIAObject() override; + virtual bool IsFocusHdl() const override; + +private: + SdrPathObj* mpPathObj; +}; + +} + +SdPathHdl::SdPathHdl( const SmartTagReference& xTag, SdrPathObj* pPathObj ) +: SmartHdl( xTag, pPathObj->GetCurrentBoundRect().TopLeft(), SdrHdlKind::SmartTag ) +, mpPathObj( pPathObj ) +{ +} + +void SdPathHdl::CreateB2dIAObject() +{ + // first throw away old one + GetRidOfIAObject(); + + if(!m_pHdlList) + return; + + SdrMarkView* pView = m_pHdlList->GetView(); + + if(!pView || pView->areMarkHandlesHidden()) + return; + + SdrPageView* pPageView = pView->GetSdrPageView(); + + if(!pPageView) + return; + + for(sal_uInt32 b(0); b < pPageView->PageWindowCount(); b++) + { + const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b); + + if(rPageWindow.GetPaintWindow().OutputToWindow()) + { + const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager(); + if (xManager.is() && mpPathObj) + { + const sdr::contact::ViewContact& rVC = mpPathObj->GetViewContact(); + drawinglayer::primitive2d::Primitive2DContainer aSequence; + rVC.getViewIndependentPrimitive2DContainer(aSequence); + std::unique_ptr pNew(new sdr::overlay::OverlayPrimitive2DSequenceObject(std::move(aSequence))); + + // OVERLAYMANAGER + insertNewlyCreatedOverlayObjectForSdrHdl( + std::move(pNew), + rPageWindow.GetObjectContact(), + *xManager); + } + } + } +} + +bool SdPathHdl::IsFocusHdl() const +{ + return false; +} + +MotionPathTag::MotionPathTag( CustomAnimationPane& rPane, ::sd::View& rView, const CustomAnimationEffectPtr& pEffect ) +: SmartTag( rView ) +, mrPane( rPane ) +, mpEffect( pEffect ) +, mxOrigin( pEffect->getTargetShape() ) +, msLastPath( pEffect->getPath() ) +, mbInUpdatePath( false ) +{ + mpPathObj = mpEffect->createSdrPathObjFromPath(rView.getSdrModelFromSdrView()); + mxPolyPoly = mpPathObj->GetPathPoly(); + if (mxOrigin.is()) + maOriginPos = mxOrigin->getPosition(); + + XDash aDash( css::drawing::DashStyle_RECT, 1, 80, 1, 80, 80); + OUString aEmpty( "?" ); + mpPathObj->SetMergedItem( XLineDashItem( aEmpty, aDash ) ); + mpPathObj->SetMergedItem( XLineStyleItem( drawing::LineStyle_DASH ) ); + mpPathObj->SetMergedItem( XLineColorItem(aEmpty, COL_GRAY) ); + mpPathObj->SetMergedItem( XFillStyleItem( drawing::FillStyle_NONE ) ); + + ::basegfx::B2DPolygon aStartArrow; + aStartArrow.append(::basegfx::B2DPoint(20.0, 0.0)); + aStartArrow.append(::basegfx::B2DPoint(0.0, 0.0)); + aStartArrow.append(::basegfx::B2DPoint(10.0, 30.0)); + aStartArrow.setClosed(true); + mpPathObj->SetMergedItem(XLineStartItem(aEmpty,::basegfx::B2DPolyPolygon(aStartArrow))); + mpPathObj->SetMergedItem(XLineStartWidthItem(400)); + mpPathObj->SetMergedItem(XLineStartCenterItem(true)); + + updatePathAttributes(); + + mpPathObj->SetMergedItem(XLineTransparenceItem(50)); + + mpMark.reset(new SdrMark( mpPathObj.get(), mrView.GetSdrPageView() )); + + mpPathObj->AddListener( *this ); + + Reference< XChangesNotifier > xNotifier( mpEffect->getNode(), UNO_QUERY ); + if( xNotifier.is() ) + { + xNotifier->addChangesListener( this ); + } +} + +MotionPathTag::~MotionPathTag() +{ + DBG_ASSERT( mpPathObj == nullptr, "sd::MotionPathTag::~MotionPathTag(), dispose me first!" ); + Dispose(); +} + +void MotionPathTag::updatePathAttributes() +{ + ::basegfx::B2DPolygon aCandidate; + if( mxPolyPoly.count() ) + { + aCandidate = mxPolyPoly.getB2DPolygon(0); + ::basegfx::utils::checkClosed( aCandidate ); + } + + if( !aCandidate.isClosed() ) + { + ::basegfx::B2DPolygon aEndArrow; + aEndArrow.append(::basegfx::B2DPoint(10.0, 0.0)); + aEndArrow.append(::basegfx::B2DPoint(0.0, 30.0)); + aEndArrow.append(::basegfx::B2DPoint(20.0, 30.0)); + aEndArrow.setClosed(true); + mpPathObj->SetMergedItem(XLineEndItem("?",::basegfx::B2DPolyPolygon(aEndArrow))); + mpPathObj->SetMergedItem(XLineEndWidthItem(400)); + mpPathObj->SetMergedItem(XLineEndCenterItem(true)); + } + else + { + mpPathObj->SetMergedItem(XLineEndItem()); + } +} + +void MotionPathTag::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) +{ + if( !(mpPathObj && !mbInUpdatePath && rHint.GetId() == SfxHintId::ThisIsAnSdrHint && mpEffect) ) + return; + + if( mxPolyPoly != mpPathObj->GetPathPoly() ) + { + mbInUpdatePath = true; + mxPolyPoly = mpPathObj->GetPathPoly(); + rtl::Reference< MotionPathTag > xTag( this ); + mrPane.updatePathFromMotionPathTag( xTag ); + msLastPath = mpEffect->getPath(); + updatePathAttributes(); + mbInUpdatePath = false; + } +} + +void MotionPathTag::MovePath( int nDX, int nDY ) +{ + if( mpPathObj ) + { + mpPathObj->Move( Size( nDX, nDY ) ); + mrView.updateHandles(); + } +} + +/** returns true if the MotionPathTag handled the event. */ +bool MotionPathTag::MouseButtonDown( const MouseEvent& rMEvt, SmartHdl& rHdl ) +{ + if( !mpPathObj ) + return false; + + if( !isSelected() ) + { + SmartTagReference xTag( this ); + mrView.getSmartTags().select( xTag ); + selectionChanged(); + return true; + } + else + { + if( rMEvt.IsLeft() && (rMEvt.GetClicks() == 2) ) + { + mrView.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(SID_BEZIER_EDIT, SfxCallMode::ASYNCHRON); + return true; + } + else if( rMEvt.IsLeft() ) + { + OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow()->GetOutDev(); + Point aMDPos( pOut->PixelToLogic( rMEvt.GetPosPixel() ) ); + + if( !mrView.IsFrameDragSingles() && mrView.IsInsObjPointMode() && (rHdl.GetObjHdlNum() == SMART_TAG_HDL_NUM) ) + { + // insert a point in edit mode + const bool bNewObj = rMEvt.IsMod1(); + + mrView.BrkAction(); + + Point aPt(aMDPos); // - pMarkedPV->GetOffset()); + + if(bNewObj) + aPt = mrView.GetSnapPos(aPt,mrView.GetSdrPageView()); + + bool bClosed0(mpPathObj->IsClosedObj()); + + sal_uInt32 nInsPointNum = mpPathObj->NbcInsPointOld(aPt, bNewObj); + + if(bClosed0 != mpPathObj->IsClosedObj()) + { + // Obj was closed implicit + // object changed + mpPathObj->SetChanged(); + mpPathObj->BroadcastObjectChange(); + } + + if(0xffffffff != nInsPointNum) + { + mrView.UnmarkAllPoints(); + mrView.updateHandles(); + + bool bRet = mrView.BegDragObj(aMDPos, pOut, mrView.GetHdl(nInsPointNum+1), 0, new PathDragObjOwn( mrView ) ); + + if (bRet) + { + const_cast< SdrDragStat* >( &mrView.GetDragStat() )->SetMinMoved(); + mrView.MovDragObj(aMDPos); + } + } + return true; + } + else + { + SmartHdl* pHdl = &rHdl; + if (!mrView.IsPointMarked(*pHdl) || rMEvt.IsShift()) + { + if (!rMEvt.IsShift()) + { + mrView.UnmarkAllPoints(); + pHdl = dynamic_cast< SmartHdl* >( mrView.PickHandle(aMDPos) ); + } + else + { + if (mrView.IsPointMarked(*pHdl) ) + { + mrView.UnmarkPoint(*pHdl); + pHdl = nullptr; + } + else + { + pHdl = dynamic_cast< SmartHdl* >( mrView.PickHandle(aMDPos) ); + } + } + + if (pHdl) + mrView.MarkPoint(*pHdl); + } + + if( pHdl && !rMEvt.IsRight() ) + { + mrView.BrkAction(); + const sal_uInt16 nDrgLog = static_cast(pOut->PixelToLogic(Size(DRGPIX,0)).Width()); + + rtl::Reference< MotionPathTag > xTag( this ); + SdrDragMethod* pDragMethod; + + // #i95646# add DragPoly as geometry to each local SdrDragMethod to be able + // to create the needed local SdrDragEntry for it in createSdrDragEntries() + basegfx::B2DPolyPolygon aDragPoly(mpPathObj->GetPathPoly()); + + if( (pHdl->GetKind() == SdrHdlKind::Move) || (pHdl->GetKind() == SdrHdlKind::SmartTag) ) + { + pDragMethod = new PathDragMove( mrView, xTag, aDragPoly ); + pHdl->SetPos( aMDPos ); + } + else if( pHdl->GetKind() == SdrHdlKind::Poly ) + { + pDragMethod = new PathDragObjOwn( mrView, aDragPoly ); + } + else + { + pDragMethod = new PathDragResize( mrView, xTag, std::move(aDragPoly) ); + } + + mrView.BegDragObj(aMDPos, nullptr, pHdl, nDrgLog, pDragMethod ); + } + return true; + } + } + } + + return false; +} + +/** returns true if the SmartTag consumes this event. */ +bool MotionPathTag::KeyInput( const KeyEvent& rKEvt ) +{ + if( !mpPathObj ) + return false; + + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + switch( nCode ) + { + case KEY_DELETE: + return OnDelete(); + + case KEY_DOWN: + case KEY_UP: + case KEY_LEFT: + case KEY_RIGHT: + return OnMove( rKEvt ); + + case KEY_ESCAPE: + { + SmartTagReference xThis( this ); + mrView.getSmartTags().deselect(); + return true; + } + + case KEY_TAB: + return OnTabHandles( rKEvt ); + + case KEY_SPACE: + return OnMarkHandle( rKEvt ); + + default: + break; + } + return false; +} + +bool MotionPathTag::OnDelete() +{ + mrPane.remove( mpEffect ); + return true; +} + +bool MotionPathTag::OnTabHandles( const KeyEvent& rKEvt ) +{ + if(rKEvt.GetKeyCode().IsMod1() || rKEvt.GetKeyCode().IsMod2()) + { + const SdrHdlList& rHdlList = mrView.GetHdlList(); + bool bForward(!rKEvt.GetKeyCode().IsShift()); + + const_cast(rHdlList).TravelFocusHdl(bForward); + + // guarantee visibility of focused handle + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + if(pHdl) + { + Window* pWindow = mrView.GetViewShell()->GetActiveWindow(); + if( pWindow ) + { + Point aHdlPosition(pHdl->GetPos()); + ::tools::Rectangle aVisRect(aHdlPosition - Point(100, 100), Size(200, 200)); + mrView.MakeVisible(aVisRect, *pWindow); + } + } + + return true; + } + + return false; +} + +bool MotionPathTag::OnMarkHandle( const KeyEvent& rKEvt ) +{ + const SdrHdlList& rHdlList = mrView.GetHdlList(); + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + if(pHdl && pHdl->GetKind() == SdrHdlKind::Poly ) + { + // rescue ID of point with focus + sal_uInt32 nPol(pHdl->GetPolyNum()); + sal_uInt32 nPnt(pHdl->GetPointNum()); + + if(mrView.IsPointMarked(*pHdl)) + { + if(rKEvt.GetKeyCode().IsShift()) + { + mrView.UnmarkPoint(*pHdl); + } + } + else + { + if(!rKEvt.GetKeyCode().IsShift()) + { + mrView.UnmarkAllPoints(); + } + mrView.MarkPoint(*pHdl); + } + + if(nullptr == rHdlList.GetFocusHdl()) + { + // restore point with focus + SdrHdl* pNewOne = nullptr; + + for(size_t a = 0; !pNewOne && a < rHdlList.GetHdlCount(); ++a) + { + SdrHdl* pAct = rHdlList.GetHdl(a); + + if(pAct && pAct->GetKind() == SdrHdlKind::Poly && pAct->GetPolyNum() == nPol && pAct->GetPointNum() == nPnt) + pNewOne = pAct; + } + + if(pNewOne) + const_cast(rHdlList).SetFocusHdl(pNewOne); + } + } + + return true; +} + +bool MotionPathTag::OnMove( const KeyEvent& rKEvt ) +{ + ::tools::Long nX = 0; + ::tools::Long nY = 0; + + switch( rKEvt.GetKeyCode().GetCode() ) + { + case KEY_UP: nY = -1; break; + case KEY_DOWN: nY = 1; break; + case KEY_LEFT: nX = -1; break; + case KEY_RIGHT: nX = 1; break; + default: break; + } + + if(rKEvt.GetKeyCode().IsMod2()) + { + OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow()->GetOutDev(); + Size aLogicSizeOnePixel = pOut ? pOut->PixelToLogic(Size(1,1)) : Size(100, 100); + nX *= aLogicSizeOnePixel.Width(); + nY *= aLogicSizeOnePixel.Height(); + } + else + { + // old, fixed move distance + nX *= 100; + nY *= 100; + } + + if( nX || nY ) + { + // in point edit mode move the handle with the focus + const SdrHdlList& rHdlList = mrView.GetHdlList(); + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + if(pHdl) + { + // now move the Handle (nX, nY) + Point aStartPoint(pHdl->GetPos()); + Point aEndPoint(pHdl->GetPos() + Point(nX, nY)); + + // start dragging + rtl::Reference< MotionPathTag > xTag( this ); + SdrDragMethod* pDragMethod = nullptr; + if( (pHdl->GetKind() == SdrHdlKind::Move) || (pHdl->GetKind() == SdrHdlKind::SmartTag) ) + { + pDragMethod = new PathDragMove( mrView, xTag ); + } + else if( pHdl->GetKind() == SdrHdlKind::Poly ) + { + pDragMethod = new PathDragObjOwn( mrView ); + } + else if( pHdl->GetKind() != SdrHdlKind::BezierWeight ) + { + pDragMethod = new PathDragResize( mrView, xTag ); + } + mrView.BegDragObj(aStartPoint, nullptr, pHdl, 0, pDragMethod); + + if(mrView.IsDragObj()) + { + bool bWasNoSnap = mrView.GetDragStat().IsNoSnap(); + bool bWasSnapEnabled = mrView.IsSnapEnabled(); + + // switch snapping off + if(!bWasNoSnap) + const_cast(mrView.GetDragStat()).SetNoSnap(); + if(bWasSnapEnabled) + mrView.SetSnapEnabled(false); + + mrView.MovAction(aEndPoint); + mrView.EndDragObj(); + + // restore snap + if(!bWasNoSnap) + const_cast(mrView.GetDragStat()).SetNoSnap(bWasNoSnap); + if(bWasSnapEnabled) + mrView.SetSnapEnabled(bWasSnapEnabled); + } + } + else + { + // move the path + MovePath( nX, nY ); + } + } + + return true; +} + +sal_Int32 MotionPathTag::GetMarkablePointCount() const +{ + if( mpPathObj && isSelected() ) + { + return mpPathObj->GetPointCount(); + } + else + { + return 0; + } +} + +sal_Int32 MotionPathTag::GetMarkedPointCount() const +{ + if( mpMark ) + { + const SdrUShortCont& rPts = mpMark->GetMarkedPoints(); + return rPts.size(); + } + else + { + return 0; + } +} + +bool MotionPathTag::MarkPoint(SdrHdl& rHdl, bool bUnmark ) +{ + bool bRet=false; + if( mpPathObj && mrView.IsPointMarkable( rHdl ) && (rHdl.GetKind() != SdrHdlKind::SmartTag) ) + { + SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( &rHdl ); + if( pSmartHdl && pSmartHdl->getTag().get() == this ) + { + if (mrView.MarkPointHelper(&rHdl,mpMark.get(),bUnmark)) + { + mrView.MarkListHasChanged(); + bRet=true; + } + } + } + return bRet; +} + +bool MotionPathTag::MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark ) +{ + bool bChgd=false; + + if( mpPathObj && isSelected() ) + { + size_t nHdlNum = mrView.GetHdlList().GetHdlCount(); + if ( nHdlNum <= 1 ) + return false; + + while( --nHdlNum > 0 ) + { + SmartHdl* pHdl = dynamic_cast< SmartHdl* >( mrView.GetHdl( nHdlNum ) ); + + if( pHdl && (pHdl->getTag().get() == this) && mrView.IsPointMarkable(*pHdl) && pHdl->IsSelected() == bUnmark) + { + Point aPos(pHdl->GetPos()); + if( pRect==nullptr || pRect->Contains(aPos)) + { + if( mrView.MarkPointHelper(pHdl,mpMark.get(),bUnmark) ) + bChgd=true; + } + } + } + + if(bChgd) + mrView.MarkListHasChanged(); + } + + return bChgd; +} + +bool MotionPathTag::getContext( SdrViewContext& rContext ) +{ + if( mpPathObj && isSelected() && !mrView.IsFrameDragSingles() ) + { + rContext = SdrViewContext::PointEdit; + return true; + } + else + { + return false; + } +} + +void MotionPathTag::CheckPossibilities() +{ + if( !(mpPathObj && isSelected()) ) + return; + + mrView.SetMoveAllowed( true ); + mrView.SetMoveProtected( false ); + mrView.SetResizeFreeAllowed( true ); + mrView.SetResizePropAllowed( true ); + mrView.SetResizeProtected( false ); + + if( !mrView.IsFrameDragSingles() ) + { + bool b1stSmooth(true); + bool b1stSegm(true); + bool bCurve(false); + bool bSmoothFuz(false); + bool bSegmFuz(false); + basegfx::B2VectorContinuity eSmooth = basegfx::B2VectorContinuity::NONE; + + mrView.CheckPolyPossibilitiesHelper( mpMark.get(), b1stSmooth, b1stSegm, bCurve, bSmoothFuz, bSegmFuz, eSmooth ); + } +} + +void MotionPathTag::addCustomHandles( SdrHdlList& rHandlerList ) +{ + if( !mpPathObj ) + return; + + css::awt::Point aPos; + if (mxOrigin.is()) + aPos = mxOrigin->getPosition(); + if( (aPos.X != maOriginPos.X) || (aPos.Y != maOriginPos.Y) ) + { + const basegfx::B2DHomMatrix aTransform(basegfx::utils::createTranslateB2DHomMatrix( + aPos.X - maOriginPos.X, aPos.Y - maOriginPos.Y)); + mxPolyPoly.transform( aTransform ); + mpPathObj->SetPathPoly( mxPolyPoly ); + maOriginPos = aPos; + } + + SmartTagReference xThis( this ); + std::unique_ptr pHdl(new SdPathHdl( xThis, mpPathObj.get() )); + pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM ); + pHdl->SetPageView( mrView.GetSdrPageView() ); + pHdl->SetObj(mpPathObj.get()); + rHandlerList.AddHdl( std::move(pHdl) ); + + if( !isSelected() ) + return; + + mrView.GetSdrPageView()->SetHasMarkedObj(true); + + if( !mrView.IsFrameDragSingles() ) + { + SdrHdlList aTemp( rHandlerList.GetView() ); + mpPathObj->AddToHdlList( aTemp ); + const SdrUShortCont& rMrkPnts = mpMark->GetMarkedPoints(); + + for( size_t nHandle = 0; nHandle < aTemp.GetHdlCount(); ++nHandle ) + { + SdrHdl* pTempHdl = aTemp.GetHdl( nHandle ); + + SmartHdl* pSmartHdl = new SmartHdl( xThis, mpPathObj.get(), pTempHdl->GetPos(), pTempHdl->GetKind() ); + pSmartHdl->SetObjHdlNum( static_cast(nHandle) ); + pSmartHdl->SetPolyNum( pTempHdl->GetPolyNum() ); + pSmartHdl->SetPointNum( pTempHdl->GetPointNum() ); + pSmartHdl->SetPlusHdl( pTempHdl->IsPlusHdl() ); + pSmartHdl->SetSourceHdlNum( pTempHdl->GetSourceHdlNum() ); + pSmartHdl->SetPageView( mrView.GetSdrPageView() ); + + rHandlerList.AddHdl( std::unique_ptr(pSmartHdl) ); + + const bool bSelected = rMrkPnts.find( sal_uInt16(nHandle) ) != rMrkPnts.end(); + pSmartHdl->SetSelected(bSelected); + + if( mrView.IsPlusHandlesAlwaysVisible() || bSelected ) + { + SdrHdlList plusList(nullptr); + mpPathObj->AddToPlusHdlList(plusList, *pSmartHdl); + sal_uInt32 nPlusHdlCnt=plusList.GetHdlCount(); + for (sal_uInt32 nPlusNum=0; nPlusNumSetObj(mpPathObj.get()); + pPlusHdl->SetPageView(mrView.GetSdrPageView()); + pPlusHdl->SetPlusHdl(true); + } + plusList.MoveTo(rHandlerList); + } + } + } + else + { + ::tools::Rectangle aRect(mpPathObj->GetCurrentBoundRect()); + + if(!aRect.IsEmpty()) + { + size_t nCount = rHandlerList.GetHdlCount(); + + bool bWdt0=aRect.Left()==aRect.Right(); + bool bHgt0=aRect.Top()==aRect.Bottom(); + if (bWdt0 && bHgt0) + { + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.TopLeft(),SdrHdlKind::UpperLeft)); + } + else if (bWdt0 || bHgt0) + { + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.TopLeft() ,SdrHdlKind::UpperLeft)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.BottomRight(),SdrHdlKind::LowerRight)); + } + else // !bWdt0 && !bHgt0 + { + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.TopLeft() ,SdrHdlKind::UpperLeft)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.TopCenter() ,SdrHdlKind::Upper)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.TopRight() ,SdrHdlKind::UpperRight)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.LeftCenter() ,SdrHdlKind::Left )); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.RightCenter() ,SdrHdlKind::Right)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.BottomLeft() ,SdrHdlKind::LowerLeft)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.BottomCenter(),SdrHdlKind::Lower)); + rHandlerList.AddHdl(std::make_unique( xThis, mpPathObj.get(), aRect.BottomRight() ,SdrHdlKind::LowerRight)); + } + + while( nCount < rHandlerList.GetHdlCount() ) + { + rHandlerList.GetHdl(nCount++)->SetPageView( mrView.GetSdrPageView() ); + } + } + } +} + +void MotionPathTag::disposing() +{ + Reference< XChangesNotifier > xNotifier( mpEffect->getNode(), UNO_QUERY ); + if( xNotifier.is() ) + { + xNotifier->removeChangesListener( this ); + } + + if( mpPathObj ) + { + mpPathObj = nullptr; + mrView.updateHandles(); + } + + mpMark.reset(); + + SmartTag::disposing(); +} + +void MotionPathTag::deselect() +{ + SmartTag::deselect(); + + if( mpMark ) + { + SdrUShortCont& rPts = mpMark->GetMarkedPoints(); + rPts.clear(); + } + + selectionChanged(); +} + +void MotionPathTag::selectionChanged() +{ + if( mrView.GetViewShell() && mrView.GetViewShell()->GetViewFrame() ) + { + SfxBindings& rBindings = mrView.GetViewShell()->GetViewFrame()->GetBindings(); + rBindings.InvalidateAll(true); + } +} + +// IPolyPolygonEditorController + +void MotionPathTag::DeleteMarkedPoints() +{ + if( !(mpPathObj && IsDeleteMarkedPointsPossible()) ) + return; + + mrView.BrkAction(); + + SdrUShortCont& rPts = mpMark->GetMarkedPoints(); + PolyPolygonEditor aEditor( mpPathObj->GetPathPoly()); + if (aEditor.DeletePoints(rPts)) + { + if( aEditor.GetPolyPolygon().count() ) + { + mpPathObj->SetPathPoly( aEditor.GetPolyPolygon() ); + } + + mrView.UnmarkAllPoints(); + mrView.MarkListHasChanged(); + mrView.updateHandles(); + } +} + +bool MotionPathTag::IsDeleteMarkedPointsPossible() const +{ + return mpPathObj && isSelected() && (GetMarkedPointCount() != 0); +} + +void MotionPathTag::RipUpAtMarkedPoints() +{ + // not supported for motion path +} + +bool MotionPathTag::IsRipUpAtMarkedPointsPossible() const +{ + // not supported for motion path + return false; +} + +bool MotionPathTag::IsSetMarkedSegmentsKindPossible() const +{ + if( mpPathObj ) + return mrView.IsSetMarkedSegmentsKindPossible(); + else + return false; +} + +SdrPathSegmentKind MotionPathTag::GetMarkedSegmentsKind() const +{ + if( mpPathObj ) + return mrView.GetMarkedSegmentsKind(); + else + return SdrPathSegmentKind::Line; +} + +void MotionPathTag::SetMarkedSegmentsKind(SdrPathSegmentKind eKind) +{ + if(mpPathObj && isSelected() && (GetMarkedPointCount() != 0)) + { + SdrUShortCont& rPts = mpMark->GetMarkedPoints(); + PolyPolygonEditor aEditor( mpPathObj->GetPathPoly() ); + if (aEditor.SetSegmentsKind(eKind, rPts)) + { + mpPathObj->SetPathPoly(aEditor.GetPolyPolygon()); + mrView.MarkListHasChanged(); + mrView.updateHandles(); + } + } +} + +bool MotionPathTag::IsSetMarkedPointsSmoothPossible() const +{ + if( mpPathObj ) + return mrView.IsSetMarkedPointsSmoothPossible(); + else + return false; +} + +SdrPathSmoothKind MotionPathTag::GetMarkedPointsSmooth() const +{ + if( mpPathObj ) + return mrView.GetMarkedPointsSmooth(); + else + return SdrPathSmoothKind::Angular; +} + +void MotionPathTag::SetMarkedPointsSmooth(SdrPathSmoothKind eKind) +{ + basegfx::B2VectorContinuity eFlags; + + if(SdrPathSmoothKind::Angular == eKind) + { + eFlags = basegfx::B2VectorContinuity::NONE; + } + else if(SdrPathSmoothKind::Asymmetric == eKind) + { + eFlags = basegfx::B2VectorContinuity::C1; + } + else if(SdrPathSmoothKind::Symmetric == eKind) + { + eFlags = basegfx::B2VectorContinuity::C2; + } + else + { + return; + } + + if(mpPathObj && mpMark && isSelected() && (GetMarkedPointCount() != 0)) + { + SdrUShortCont& rPts = mpMark->GetMarkedPoints(); + PolyPolygonEditor aEditor( mpPathObj->GetPathPoly()); + if (aEditor.SetPointsSmooth(eFlags, rPts)) + { + mpPathObj->SetPathPoly(aEditor.GetPolyPolygon()); + mrView.MarkListHasChanged(); + mrView.updateHandles(); + } + } +} + +bool MotionPathTag::IsOpenCloseMarkedObjectsPossible() const +{ + // not supported for motion path + return false; +} + +SdrObjClosedKind MotionPathTag::GetMarkedObjectsClosedState() const +{ + // not supported for motion path + return SdrObjClosedKind::Open; +} + +// XChangesListener +void SAL_CALL MotionPathTag::changesOccurred( const ChangesEvent& /*Event*/ ) +{ + if( mpPathObj && !mbInUpdatePath && (mpEffect->getPath() != msLastPath) ) + { + mbInUpdatePath =true; + msLastPath = mpEffect->getPath(); + mpEffect->updateSdrPathObjFromPath( *mpPathObj ); + mbInUpdatePath = false; + updatePathAttributes(); + mrView.updateHandles(); + } +} + +void SAL_CALL MotionPathTag::disposing( const EventObject& /*Source*/ ) +{ + if( mpPathObj ) + Dispose(); +} + +Any SAL_CALL MotionPathTag::queryInterface( const css::uno::Type& aType ) +{ + if( aType == cppu::UnoType::get() ) + return Any( Reference< XChangesListener >( this ) ); + if( aType == cppu::UnoType::get() ) + return Any( Reference< XEventListener >( this ) ); + if( aType == cppu::UnoType::get() ) + return Any( Reference< XInterface >( this ) ); + + return Any(); +} + +void SAL_CALL MotionPathTag::acquire() noexcept +{ + SimpleReferenceComponent::acquire(); +} + +void SAL_CALL MotionPathTag::release( ) noexcept +{ + SimpleReferenceComponent::release(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/animations/motionpathtag.hxx b/sd/source/ui/animations/motionpathtag.hxx new file mode 100644 index 0000000000..7e7973385c --- /dev/null +++ b/sd/source/ui/animations/motionpathtag.hxx @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::drawing { class XShape; } +class SdrPathObj; + +namespace sd { + +class View; +class CustomAnimationPane; + +/// Base class for all functions. +class MotionPathTag final : public SmartTag, public IPolyPolygonEditorController, public SfxListener, public css::util::XChangesListener +{ +public: + MotionPathTag( CustomAnimationPane& rPane, ::sd::View& rView, const CustomAnimationEffectPtr& pEffect ); + virtual ~MotionPathTag() override; + + SdrPathObj* getPathObj() const { return mpPathObj.get(); } + + /// @return true if the SmartTag handled the event. + virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ) override; + + /// @return true if the SmartTag consumes this event. + virtual bool KeyInput( const KeyEvent& rKEvt ) override; + + // callbacks from sdr view + virtual sal_Int32 GetMarkablePointCount() const override; + virtual sal_Int32 GetMarkedPointCount() const override; + virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark) override; + virtual void CheckPossibilities() override; + virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) override; + + const CustomAnimationEffectPtr& getEffect() const { return mpEffect; } + + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + // IPolyPolygonEditorController + virtual void DeleteMarkedPoints() override; + virtual bool IsDeleteMarkedPointsPossible() const override; + + virtual void RipUpAtMarkedPoints() override; + virtual bool IsRipUpAtMarkedPointsPossible() const override; + + virtual bool IsSetMarkedSegmentsKindPossible() const override; + virtual SdrPathSegmentKind GetMarkedSegmentsKind() const override; + virtual void SetMarkedSegmentsKind(SdrPathSegmentKind eKind) override; + + virtual bool IsSetMarkedPointsSmoothPossible() const override; + virtual SdrPathSmoothKind GetMarkedPointsSmooth() const override; + virtual void SetMarkedPointsSmooth(SdrPathSmoothKind eKind) override; + + virtual bool IsOpenCloseMarkedObjectsPossible() const override; + virtual SdrObjClosedKind GetMarkedObjectsClosedState() const override; + + void MovePath( int nDX, int nDY ); + bool OnDelete(); + bool OnTabHandles( const KeyEvent& rKEvt ); + bool OnMarkHandle( const KeyEvent& rKEvt ); + bool OnMove( const KeyEvent& rKEvt ); + + // XChangesListener + virtual void SAL_CALL changesOccurred( const css::util::ChangesEvent& Event ) override; + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override; + virtual void SAL_CALL acquire( ) noexcept override; + virtual void SAL_CALL release( ) noexcept override; + +private: + virtual void addCustomHandles( SdrHdlList& rHandlerList ) override; + virtual bool getContext( SdrViewContext& rContext ) override; + virtual void disposing() override; + virtual void deselect() override; + + void updatePathAttributes(); + void selectionChanged(); + + CustomAnimationPane& mrPane; + CustomAnimationEffectPtr mpEffect; + ::basegfx::B2DPolyPolygon mxPolyPoly; + css::uno::Reference< css::drawing::XShape > mxOrigin; + rtl::Reference mpPathObj; + css::awt::Point maOriginPos; + std::unique_ptr mpMark; + OUString msLastPath; + bool mbInUpdatePath; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx new file mode 100644 index 0000000000..dbd9768b55 --- /dev/null +++ b/sd/source/ui/annotations/annotationmanager.cxx @@ -0,0 +1,1231 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include "annotationmanagerimpl.hxx" +#include "annotationwindow.hxx" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::geometry; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::view; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::ui; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::office; + +namespace sd { + +SfxItemPool* GetAnnotationPool() +{ + static rtl::Reference s_pAnnotationPool; + if( !s_pAnnotationPool ) + { + s_pAnnotationPool = EditEngine::CreatePool(); + s_pAnnotationPool->SetPoolDefaultItem(SvxFontHeightItem(423,100,EE_CHAR_FONTHEIGHT)); + + vcl::Font aAppFont( Application::GetSettings().GetStyleSettings().GetAppFont() ); + s_pAnnotationPool->SetPoolDefaultItem(SvxFontItem(aAppFont.GetFamilyType(),aAppFont.GetFamilyName(),"",PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO)); + } + + return s_pAnnotationPool.get(); +} + +static SfxBindings* getBindings( ViewShellBase const & rBase ) +{ + if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() ) + return &rBase.GetMainViewShell()->GetViewFrame()->GetBindings(); + + return nullptr; +} + +static SfxDispatcher* getDispatcher( ViewShellBase const & rBase ) +{ + if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() ) + return rBase.GetMainViewShell()->GetViewFrame()->GetDispatcher(); + + return nullptr; +} + +css::util::DateTime getCurrentDateTime() +{ + DateTime aCurrentDate( DateTime::SYSTEM ); + return css::util::DateTime( 0, aCurrentDate.GetSec(), + aCurrentDate.GetMin(), aCurrentDate.GetHour(), + aCurrentDate.GetDay(), aCurrentDate.GetMonth(), + aCurrentDate.GetYear(), false ); +} + +OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation ) +{ + OUString sRet; + if( xAnnotation.is() ) + { + const SvtSysLocale aSysLocale; + const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData(); + + css::util::DateTime aDateTime( xAnnotation->getDateTime() ); + + Date aSysDate( Date::SYSTEM ); + Date aDate( aDateTime.Day, aDateTime.Month, aDateTime.Year ); + if (aDate==aSysDate) + sRet = SdResId(STR_ANNOTATION_TODAY); + else if (aDate == (aSysDate-1)) + sRet = SdResId(STR_ANNOTATION_YESTERDAY); + else if (aDate.IsValidAndGregorian() ) + sRet = rLocalData.getDate(aDate); + + ::tools::Time aTime( aDateTime ); + if(aTime.GetTime() != 0) + sRet += " " + rLocalData.getTime( aTime,false ); + } + return sRet; +} + +AnnotationManagerImpl::AnnotationManagerImpl( ViewShellBase& rViewShellBase ) +: mrBase( rViewShellBase ) +, mpDoc( rViewShellBase.GetDocument() ) +, mbShowAnnotations( true ) +, mnUpdateTagsEvent( nullptr ) +{ + SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType()); + if( pOptions ) + mbShowAnnotations = pOptions->IsShowComments(); +} + +void AnnotationManagerImpl::init() +{ + // get current controller and initialize listeners + try + { + addListener(); + mxView.set(mrBase.GetController(), UNO_QUERY); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::AnnotationManagerImpl::AnnotationManagerImpl()" ); + } + + try + { + Reference xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW ); + Reference xListener( this ); + xModel->addEventListener( xListener ); + } + catch( Exception& ) + { + } +} + +// WeakComponentImplHelper +void AnnotationManagerImpl::disposing (std::unique_lock&) +{ + try + { + Reference xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW ); + Reference xListener( this ); + xModel->removeEventListener( xListener ); + } + catch( Exception& ) + { + } + + removeListener(); + DisposeTags(); + + if( mnUpdateTagsEvent ) + { + Application::RemoveUserEvent( mnUpdateTagsEvent ); + mnUpdateTagsEvent = nullptr; + } + + mxView.clear(); + mxCurrentPage.clear(); +} + +// XEventListener +void SAL_CALL AnnotationManagerImpl::notifyEvent( const css::document::EventObject& aEvent ) +{ + if( !(aEvent.EventName == "OnAnnotationInserted" || aEvent.EventName == "OnAnnotationRemoved" || aEvent.EventName == "OnAnnotationChanged") ) + return; + + // AnnotationInsertion and modification is not handled here because when + // a new annotation is inserted, it consists of OnAnnotationInserted + // followed by a chain of OnAnnotationChanged (called for setting each + // of the annotation attributes - author, text etc.). This is not what a + // LOK client wants. So only handle removal here as annotation removal + // consists of only one event - 'OnAnnotationRemoved' + if ( aEvent.EventName == "OnAnnotationRemoved" ) + { + Reference< XAnnotation > xAnnotation( aEvent.Source, uno::UNO_QUERY ); + if ( xAnnotation.is() ) + { + LOKCommentNotify(CommentNotificationType::Remove, &mrBase, xAnnotation); + } + } + + UpdateTags(); +} + +void SAL_CALL AnnotationManagerImpl::disposing( const css::lang::EventObject& /*Source*/ ) +{ +} + +rtl::Reference AnnotationManagerImpl::GetAnnotationById(sal_uInt32 nAnnotationId) +{ + SdPage* pPage = nullptr; + do + { + pPage = GetNextPage(pPage, true); + if( pPage && !pPage->getAnnotations().empty() ) + { + AnnotationVector aAnnotations(pPage->getAnnotations()); + auto iter = std::find_if(aAnnotations.begin(), aAnnotations.end(), + [nAnnotationId](const Reference& xAnnotation) { + return sd::getAnnotationId(xAnnotation) == nAnnotationId; + }); + if (iter != aAnnotations.end()) + return *iter; + } + } while( pPage ); + + rtl::Reference xAnnotationEmpty; + return xAnnotationEmpty; +} + +void AnnotationManagerImpl::ShowAnnotations( bool bShow ) +{ + // enforce show annotations if a new annotation is inserted + if( mbShowAnnotations != bShow ) + { + mbShowAnnotations = bShow; + + SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType()); + if( pOptions ) + pOptions->SetShowComments( mbShowAnnotations ); + + UpdateTags(); + } +} + +void AnnotationManagerImpl::ExecuteAnnotation(SfxRequest const & rReq ) +{ + switch( rReq.GetSlot() ) + { + case SID_INSERT_POSTIT: + ExecuteInsertAnnotation( rReq ); + break; + case SID_DELETE_POSTIT: + case SID_DELETEALL_POSTIT: + case SID_DELETEALLBYAUTHOR_POSTIT: + ExecuteDeleteAnnotation( rReq ); + break; + case SID_EDIT_POSTIT: + ExecuteEditAnnotation( rReq ); + break; + case SID_PREVIOUS_POSTIT: + case SID_NEXT_POSTIT: + SelectNextAnnotation( rReq.GetSlot() == SID_NEXT_POSTIT ); + break; + case SID_REPLYTO_POSTIT: + ExecuteReplyToAnnotation( rReq ); + break; + case SID_TOGGLE_NOTES: + ShowAnnotations( !mbShowAnnotations ); + break; + } +} + +void AnnotationManagerImpl::ExecuteInsertAnnotation(SfxRequest const & rReq) +{ + if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledAnnotations()) + ShowAnnotations(true); + + const SfxItemSet* pArgs = rReq.GetArgs(); + OUString sText; + if (pArgs) + { + if (const SfxStringItem* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_TEXT)) + { + sText = pPoolItem->GetValue(); + } + } + + InsertAnnotation(sText); +} + +void AnnotationManagerImpl::ExecuteDeleteAnnotation(SfxRequest const & rReq) +{ + ShowAnnotations( true ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + + switch( rReq.GetSlot() ) + { + case SID_DELETEALL_POSTIT: + DeleteAllAnnotations(); + break; + case SID_DELETEALLBYAUTHOR_POSTIT: + if( pArgs ) + { + const SfxPoolItem* pPoolItem = nullptr; + if( SfxItemState::SET == pArgs->GetItemState( SID_DELETEALLBYAUTHOR_POSTIT, true, &pPoolItem ) ) + { + OUString sAuthor( static_cast( pPoolItem )->GetValue() ); + DeleteAnnotationsByAuthor( sAuthor ); + } + } + break; + case SID_DELETE_POSTIT: + { + rtl::Reference< Annotation > xAnnotation; + sal_uInt32 nId = 0; + if( pArgs ) + { + const SfxPoolItem* pPoolItem = nullptr; + if( SfxItemState::SET == pArgs->GetItemState( SID_DELETE_POSTIT, true, &pPoolItem ) ) + { + uno::Reference xTmpAnnotation; + if (static_cast(pPoolItem)->GetValue() >>= xTmpAnnotation) + { + xAnnotation = dynamic_cast(xTmpAnnotation.get()); + assert(bool(xAnnotation) == bool(xTmpAnnotation) && "must be of concrete type sd::Annotation"); + } + } + if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_ID, true, &pPoolItem ) ) + nId = static_cast(pPoolItem)->GetValue().toUInt32(); + } + + if (nId != 0) + xAnnotation = GetAnnotationById(nId); + else if( !xAnnotation.is() ) + GetSelectedAnnotation( xAnnotation ); + + DeleteAnnotation( xAnnotation ); + } + break; + } + + UpdateTags(); +} + +void AnnotationManagerImpl::ExecuteEditAnnotation(SfxRequest const & rReq) +{ + const SfxItemSet* pArgs = rReq.GetArgs(); + Reference< XAnnotation > xAnnotation; + OUString sText; + sal_Int32 nPositionX = -1; + sal_Int32 nPositionY = -1; + + if (!pArgs) + return; + + if (mpDoc->IsUndoEnabled()) + mpDoc->BegUndo(SdResId(STR_ANNOTATION_UNDO_EDIT)); + + if (const SvxPostItIdItem* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_ID)) + { + sal_uInt32 nId = pPoolItem->GetValue().toUInt32(); + xAnnotation = GetAnnotationById(nId); + } + if (const SfxStringItem* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_TEXT)) + sText = pPoolItem->GetValue(); + + if (const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_POSITION_X)) + nPositionX = pPoolItem->GetValue(); + + if (const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_POSITION_Y)) + nPositionY = pPoolItem->GetValue(); + + if (xAnnotation.is()) + { + CreateChangeUndo(xAnnotation); + + if (nPositionX >= 0 && nPositionY >= 0) + { + double fX = convertTwipToMm100(nPositionX) / 100.0; + double fY = convertTwipToMm100(nPositionY) / 100.0; + xAnnotation->setPosition({fX, fY}); + } + + if (!sText.isEmpty()) + { + // TODO: Not allow other authors to change others' comments ? + Reference xText(xAnnotation->getTextRange()); + xText->setString(sText); + } + + LOKCommentNotifyAll(CommentNotificationType::Modify, xAnnotation); + } + + if (mpDoc->IsUndoEnabled()) + mpDoc->EndUndo(); + + UpdateTags(true); +} + +void AnnotationManagerImpl::InsertAnnotation(const OUString& rText) +{ + SdPage* pPage = GetCurrentPage(); + if( !pPage ) + return; + + if( mpDoc->IsUndoEnabled() ) + mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_INSERT ) ); + + // find free space for new annotation + int y = 0, x = 0; + + AnnotationVector aAnnotations( pPage->getAnnotations() ); + if( !aAnnotations.empty() ) + { + const int page_width = pPage->GetSize().Width(); + const int width = 1000; + const int height = 800; + ::tools::Rectangle aTagRect; + + while( true ) + { + ::tools::Rectangle aNewRect( x, y, x + width - 1, y + height - 1 ); + bool bFree = true; + + for( const auto& rxAnnotation : aAnnotations ) + { + RealPoint2D aPoint( rxAnnotation->getPosition() ); + aTagRect.SetLeft( sal::static_int_cast< ::tools::Long >( aPoint.X * 100.0 ) ); + aTagRect.SetTop( sal::static_int_cast< ::tools::Long >( aPoint.Y * 100.0 ) ); + aTagRect.SetRight( aTagRect.Left() + width - 1 ); + aTagRect.SetBottom( aTagRect.Top() + height - 1 ); + + if( aNewRect.Overlaps( aTagRect ) ) + { + bFree = false; + break; + } + } + + if( !bFree ) + { + x += width; + if( x > page_width ) + { + x = 0; + y += height; + } + } + else + { + break; + } + } + } + + rtl::Reference< Annotation > xAnnotation; + pPage->createAnnotation( xAnnotation ); + + OUString sAuthor; + if (comphelper::LibreOfficeKit::isActive()) + sAuthor = mrBase.GetMainViewShell()->GetView()->GetAuthor(); + else + { + SvtUserOptions aUserOptions; + sAuthor = aUserOptions.GetFullName(); + xAnnotation->setInitials( aUserOptions.GetID() ); + } + + if (!rText.isEmpty()) + { + Reference xText(xAnnotation->getTextRange()); + xText->setString(rText); + } + + // set current author to new annotation + xAnnotation->setAuthor( sAuthor ); + // set current time to new annotation + xAnnotation->setDateTime( getCurrentDateTime() ); + + // set position + RealPoint2D aPos( static_cast(x) / 100.0, static_cast(y) / 100.0 ); + xAnnotation->setPosition( aPos ); + + if( mpDoc->IsUndoEnabled() ) + mpDoc->EndUndo(); + + // Tell our LOK clients about new comment added + LOKCommentNotifyAll(CommentNotificationType::Add, xAnnotation); + + UpdateTags(true); + SelectAnnotation( xAnnotation, true ); +} + +void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest const & rReq ) +{ + rtl::Reference< Annotation > xAnnotation; + const SfxItemSet* pArgs = rReq.GetArgs(); + OUString sReplyText; + if( pArgs ) + { + const SfxPoolItem* pPoolItem = nullptr; + if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_ID, true, &pPoolItem ) ) + { + sal_uInt32 nReplyId = 0; // Id of the comment to reply to + nReplyId = static_cast(pPoolItem)->GetValue().toUInt32(); + xAnnotation = GetAnnotationById(nReplyId); + } + else if( SfxItemState::SET == pArgs->GetItemState( rReq.GetSlot(), true, &pPoolItem ) ) + { + uno::Reference xTmpAnnotation; + if (static_cast(pPoolItem)->GetValue() >>= xTmpAnnotation) + { + xAnnotation = dynamic_cast(xTmpAnnotation.get()); + assert(bool(xAnnotation) == bool(xTmpAnnotation) && "must be of concrete type sd::Annotation"); + } + } + + if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_TEXT, true, &pPoolItem ) ) + sReplyText = static_cast( pPoolItem )->GetValue(); + } + + TextApiObject* pTextApi = getTextApiObject( xAnnotation ); + if( !pTextApi ) + return; + + ::Outliner aOutliner( GetAnnotationPool(),OutlinerMode::TextObject ); + + SdDrawDocument::SetCalcFieldValueHdl( &aOutliner ); + aOutliner.SetUpdateLayout( true ); + + OUString aStr(SdResId(STR_ANNOTATION_REPLY)); + OUString sAuthor( xAnnotation->getAuthor() ); + if( sAuthor.isEmpty() ) + sAuthor = SdResId( STR_ANNOTATION_NOAUTHOR ); + + aStr = aStr.replaceFirst("%1", sAuthor) + + " (" + getAnnotationDateTimeString( xAnnotation ) + "): \""; + + OUString sQuote( pTextApi->GetText() ); + + if( sQuote.isEmpty() ) + sQuote = "..."; + aStr += sQuote + "\"\n"; + + for( sal_Int32 nIdx = 0; nIdx >= 0; ) + aOutliner.Insert( aStr.getToken( 0, '\n', nIdx ), EE_PARA_APPEND, -1 ); + + if( aOutliner.GetParagraphCount() > 1 ) + { + SfxItemSet aAnswerSet( aOutliner.GetEmptyItemSet() ); + aAnswerSet.Put(SvxPostureItem(ITALIC_NORMAL,EE_CHAR_ITALIC)); + + ESelection aSel; + aSel.nEndPara = aOutliner.GetParagraphCount()-2; + aSel.nEndPos = aOutliner.GetText( aOutliner.GetParagraph( aSel.nEndPara ) ).getLength(); + + aOutliner.QuickSetAttribs( aAnswerSet, aSel ); + } + + if (!sReplyText.isEmpty()) + aOutliner.Insert(sReplyText); + + std::optional< OutlinerParaObject > pOPO( aOutliner.CreateParaObject() ); + pTextApi->SetText(*pOPO); + + OUString sReplyAuthor; + if (comphelper::LibreOfficeKit::isActive()) + sReplyAuthor = mrBase.GetMainViewShell()->GetView()->GetAuthor(); + else + { + SvtUserOptions aUserOptions; + sReplyAuthor = aUserOptions.GetFullName(); + xAnnotation->setInitials( aUserOptions.GetID() ); + } + + xAnnotation->setAuthor( sReplyAuthor ); + // set current time to reply + xAnnotation->setDateTime( getCurrentDateTime() ); + + // Tell our LOK clients about this (comment modification) + LOKCommentNotifyAll(CommentNotificationType::Modify, xAnnotation); + + UpdateTags(true); + SelectAnnotation( xAnnotation, true ); +} + +void AnnotationManagerImpl::DeleteAnnotation( const rtl::Reference< Annotation >& xAnnotation ) +{ + SdPage* pPage = GetCurrentPage(); + + if( xAnnotation.is() && pPage ) + { + if( mpDoc->IsUndoEnabled() ) + mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_DELETE ) ); + + pPage->removeAnnotation( xAnnotation ); + + if( mpDoc->IsUndoEnabled() ) + mpDoc->EndUndo(); + + UpdateTags(); + } +} + +void AnnotationManagerImpl::DeleteAnnotationsByAuthor( std::u16string_view sAuthor ) +{ + if( mpDoc->IsUndoEnabled() ) + mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_DELETE ) ); + + SdPage* pPage = nullptr; + do + { + pPage = GetNextPage( pPage, true ); + + if( pPage ) + { + for( const rtl::Reference< Annotation >& xAnnotation : pPage->getAnnotations() ) + { + if( xAnnotation->getAuthor() == sAuthor ) + { + if( mxSelectedAnnotation == xAnnotation ) + mxSelectedAnnotation.clear(); + pPage->removeAnnotation( xAnnotation ); + } + } + } + } while( pPage ); + + if( mpDoc->IsUndoEnabled() ) + mpDoc->EndUndo(); +} + +void AnnotationManagerImpl::DeleteAllAnnotations() +{ + if( mpDoc->IsUndoEnabled() ) + mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_DELETE ) ); + + SdPage* pPage = nullptr; + do + { + pPage = GetNextPage( pPage, true ); + + if( pPage && !pPage->getAnnotations().empty() ) + { + + AnnotationVector aAnnotations( pPage->getAnnotations() ); + for( const auto& rxAnnotation : aAnnotations ) + { + pPage->removeAnnotation( rxAnnotation ); + } + } + } + while( pPage ); + + mxSelectedAnnotation.clear(); + + if( mpDoc->IsUndoEnabled() ) + mpDoc->EndUndo(); +} + +void AnnotationManagerImpl::GetAnnotationState(SfxItemSet& rSet) +{ + SdPage* pCurrentPage = GetCurrentPage(); + + const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly(); + const bool bWrongPageKind = (pCurrentPage == nullptr) || (pCurrentPage->GetPageKind() != PageKind::Standard); + + const SvtSaveOptions::ODFSaneDefaultVersion nCurrentODFVersion( GetODFSaneDefaultVersion() ); + + if (bReadOnly || bWrongPageKind || (nCurrentODFVersion <= SvtSaveOptions::ODFSVER_012)) + rSet.DisableItem( SID_INSERT_POSTIT ); + + rSet.Put(SfxBoolItem(SID_TOGGLE_NOTES, mbShowAnnotations)); + + rtl::Reference< Annotation > xAnnotation; + GetSelectedAnnotation( xAnnotation ); + + // Don't disable these slot in case of LOK, as postit doesn't need to + // selected before doing an operation on it in LOK + if( (!xAnnotation.is() && !comphelper::LibreOfficeKit::isActive()) || bReadOnly ) + { + rSet.DisableItem( SID_DELETE_POSTIT ); + rSet.DisableItem( SID_EDIT_POSTIT ); + } + + SdPage* pPage = nullptr; + + bool bHasAnnotations = false; + do + { + pPage = GetNextPage( pPage, true ); + + if( pPage && !pPage->getAnnotations().empty() ) + bHasAnnotations = true; + } + while( pPage && !bHasAnnotations ); + + if( !bHasAnnotations || bReadOnly ) + { + rSet.DisableItem( SID_DELETEALL_POSTIT ); + } + + if( bWrongPageKind || !bHasAnnotations ) + { + rSet.DisableItem( SID_PREVIOUS_POSTIT ); + rSet.DisableItem( SID_NEXT_POSTIT ); + } +} + +void AnnotationManagerImpl::SelectNextAnnotation(bool bForward) +{ + ShowAnnotations( true ); + + rtl::Reference< Annotation > xCurrent; + GetSelectedAnnotation( xCurrent ); + SdPage* pPage = GetCurrentPage(); + if( !pPage ) + return; + + AnnotationVector aAnnotations( pPage->getAnnotations() ); + + if( bForward ) + { + if( xCurrent.is() ) + { + auto iter = std::find(aAnnotations.begin(), aAnnotations.end(), xCurrent); + if (iter != aAnnotations.end()) + { + ++iter; + if( iter != aAnnotations.end() ) + { + SelectAnnotation( *iter ); + return; + } + } + } + else if( !aAnnotations.empty() ) + { + SelectAnnotation( *(aAnnotations.begin()) ); + return; + } + } + else + { + if( xCurrent.is() ) + { + auto iter = std::find(aAnnotations.begin(), aAnnotations.end(), xCurrent); + if (iter != aAnnotations.end() && iter != aAnnotations.begin()) + { + --iter; + SelectAnnotation( *iter ); + return; + } + } + else if( !aAnnotations.empty() ) + { + AnnotationVector::iterator iter( aAnnotations.end() ); + SelectAnnotation( *(--iter) ); + return; + } + } + + mxSelectedAnnotation.clear(); + do + { + do + { + pPage = GetNextPage( pPage, bForward ); + + if( pPage && !pPage->getAnnotations().empty() ) + { + // switch to next/previous slide with annotations + std::shared_ptr pDrawViewShell(std::dynamic_pointer_cast(mrBase.GetMainViewShell())); + if (pDrawViewShell != nullptr) + { + pDrawViewShell->ChangeEditMode(pPage->IsMasterPage() ? EditMode::MasterPage : EditMode::Page, false); + pDrawViewShell->SwitchPage((pPage->GetPageNum() - 1) >> 1); + + SfxDispatcher* pDispatcher = getDispatcher( mrBase ); + if( pDispatcher ) + pDispatcher->Execute( bForward ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT ); + + return; + } + } + } + while( pPage ); + + // The question text depends on the search direction. + bool bImpress = mpDoc->GetDocumentType() == DocumentType::Impress; + TranslateId pStringId; + if(bForward) + pStringId = bImpress ? STR_ANNOTATION_WRAP_FORWARD : STR_ANNOTATION_WRAP_FORWARD_DRAW; + else + pStringId = bImpress ? STR_ANNOTATION_WRAP_BACKWARD : STR_ANNOTATION_WRAP_BACKWARD_DRAW; + + // Pop up question box that asks the user whether to wrap around. + // The dialog is made modal with respect to the whole application. + std::unique_ptr xQueryBox(Application::CreateMessageDialog(nullptr, + VclMessageType::Question, VclButtonsType::YesNo, + SdResId(pStringId))); + xQueryBox->set_default_response(RET_YES); + if (xQueryBox->run() != RET_YES) + break; + } + while( true ); +} + +void AnnotationManagerImpl::onTagSelected( AnnotationTag const & rTag ) +{ + mxSelectedAnnotation = rTag.GetAnnotation(); + invalidateSlots(); +} + +void AnnotationManagerImpl::onTagDeselected( AnnotationTag const & rTag ) +{ + if( rTag.GetAnnotation() == mxSelectedAnnotation ) + { + mxSelectedAnnotation.clear(); + invalidateSlots(); + } +} + +void AnnotationManagerImpl::SelectAnnotation( const rtl::Reference< Annotation >& xAnnotation, bool bEdit /* = sal_False */ ) +{ + mxSelectedAnnotation = xAnnotation; + + auto iter = std::find_if(maTagVector.begin(), maTagVector.end(), + [&xAnnotation](const rtl::Reference& rxTag) { return rxTag->GetAnnotation() == xAnnotation; }); + if (iter != maTagVector.end()) + { + SmartTagReference xTag( *iter ); + mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag ); + (*iter)->OpenPopup( bEdit ); + } +} + +void AnnotationManagerImpl::GetSelectedAnnotation( rtl::Reference< Annotation >& xAnnotation ) +{ + xAnnotation = mxSelectedAnnotation; +} + +void AnnotationManagerImpl::invalidateSlots() +{ + SfxBindings* pBindings = getBindings( mrBase ); + if( pBindings ) + { + pBindings->Invalidate( SID_INSERT_POSTIT ); + pBindings->Invalidate( SID_DELETE_POSTIT ); + pBindings->Invalidate( SID_DELETEALL_POSTIT ); + pBindings->Invalidate( SID_PREVIOUS_POSTIT ); + pBindings->Invalidate( SID_NEXT_POSTIT ); + pBindings->Invalidate( SID_UNDO ); + pBindings->Invalidate( SID_REDO ); + } +} + +void AnnotationManagerImpl::onSelectionChanged() +{ + if( !(mxView.is() && mrBase.GetDrawView()) ) + return; + + try + { + rtl::Reference< SdPage > xPage = mrBase.GetMainViewShell()->getCurrentPage(); + + if( xPage != mxCurrentPage ) + { + mxCurrentPage = xPage; + + UpdateTags(true); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::AnnotationManagerImpl::onSelectionChanged()" ); + } +} + +void AnnotationManagerImpl::UpdateTags( bool bSynchron ) +{ + if( bSynchron ) + { + if( mnUpdateTagsEvent ) + Application::RemoveUserEvent( mnUpdateTagsEvent ); + + UpdateTagsHdl(nullptr); + } + else + { + if( !mnUpdateTagsEvent && mxView.is() ) + mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, AnnotationManagerImpl, UpdateTagsHdl ) ); + } +} + +IMPL_LINK_NOARG(AnnotationManagerImpl, UpdateTagsHdl, void*, void) +{ + mnUpdateTagsEvent = nullptr; + DisposeTags(); + + if( mbShowAnnotations ) + CreateTags(); + + if( mrBase.GetDrawView() ) + static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles(); + + invalidateSlots(); +} + +void AnnotationManagerImpl::CreateTags() +{ + if( !(mxCurrentPage.is() && mpDoc) ) + return; + + auto xViewShell = mrBase.GetMainViewShell(); + if (!xViewShell) + return; + + try + { + int nIndex = 1; + maFont = Application::GetSettings().GetStyleSettings().GetAppFont(); + + rtl::Reference< AnnotationTag > xSelectedTag; + + for (const rtl::Reference< Annotation > & xAnnotation : mxCurrentPage->getAnnotations() ) + { + Color aColor( GetColorLight( mpDoc->GetAnnotationAuthorIndex( xAnnotation->getAuthor() ) ) ); + rtl::Reference< AnnotationTag > xTag( new AnnotationTag( *this, *xViewShell->GetView(), xAnnotation, aColor, nIndex++, maFont ) ); + maTagVector.push_back(xTag); + + if( xAnnotation == mxSelectedAnnotation ) + { + xSelectedTag = xTag; + } + } + + if( xSelectedTag.is() ) + { + SmartTagReference xTag( xSelectedTag ); + mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag ); + } + else + { + // no tag, no selection! + mxSelectedAnnotation.clear(); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::AnnotationManagerImpl::onSelectionChanged()" ); + } +} + +void AnnotationManagerImpl::DisposeTags() +{ + for (auto& rxTag : maTagVector) + { + rxTag->Dispose(); + } + + maTagVector.clear(); +} + +void AnnotationManagerImpl::addListener() +{ + Link aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->AddEventListener(aLink); +} + +void AnnotationManagerImpl::removeListener() +{ + Link aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); +} + +IMPL_LINK(AnnotationManagerImpl,EventMultiplexerListener, + tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::CurrentPageChanged: + case EventMultiplexerEventId::EditViewSelection: + onSelectionChanged(); + break; + + case EventMultiplexerEventId::MainViewRemoved: + mxView.clear(); + onSelectionChanged(); + break; + + case EventMultiplexerEventId::MainViewAdded: + mxView.set( mrBase.GetController(), UNO_QUERY ); + onSelectionChanged(); + break; + + default: break; + } +} + +void AnnotationManagerImpl::ExecuteAnnotationTagContextMenu(const rtl::Reference& xAnnotation, weld::Widget* pParent, const ::tools::Rectangle& rContextRect) +{ + SfxDispatcher* pDispatcher( getDispatcher( mrBase ) ); + if( !pDispatcher ) + return; + + const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly(); + + if (bReadOnly) + return; + + std::unique_ptr xBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/annotationtagmenu.ui")); + std::unique_ptr xMenu(xBuilder->weld_menu("menu")); + + SvtUserOptions aUserOptions; + OUString sCurrentAuthor( aUserOptions.GetFullName() ); + OUString sAuthor( xAnnotation->getAuthor() ); + + OUString aStr(xMenu->get_label(".uno:DeleteAllAnnotationByAuthor")); + OUString aReplace( sAuthor ); + if( aReplace.isEmpty() ) + aReplace = SdResId( STR_ANNOTATION_NOAUTHOR ); + aStr = aStr.replaceFirst("%1", aReplace); + xMenu->set_label(".uno:DeleteAllAnnotationByAuthor", aStr); + + bool bShowReply = sAuthor != sCurrentAuthor; + xMenu->set_visible(".uno:ReplyToAnnotation", bShowReply); + xMenu->set_visible("separator", bShowReply); + xMenu->set_visible(".uno:DeleteAnnotation", xAnnotation.is()); + + auto sId = xMenu->popup_at_rect(pParent, rContextRect); + + if (sId == ".uno:ReplyToAnnotation") + { + const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( css::uno::Reference(static_cast(xAnnotation.get())) ) ); + pDispatcher->ExecuteList(SID_REPLYTO_POSTIT, + SfxCallMode::ASYNCHRON, { &aItem }); + } + else if (sId == ".uno:DeleteAnnotation") + { + const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( css::uno::Reference(static_cast(xAnnotation.get())) ) ); + pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON, + { &aItem }); + } + else if (sId == ".uno:DeleteAllAnnotationByAuthor") + { + const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, sAuthor ); + pDispatcher->ExecuteList( SID_DELETEALLBYAUTHOR_POSTIT, + SfxCallMode::ASYNCHRON, { &aItem }); + } + else if (sId == ".uno:DeleteAllAnnotation") + pDispatcher->Execute( SID_DELETEALL_POSTIT ); +} + +Color AnnotationManagerImpl::GetColor(sal_uInt16 aAuthorIndex) +{ + if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode()) + { + static const Color aArrayNormal[] = { + COL_AUTHOR1_NORMAL, COL_AUTHOR2_NORMAL, COL_AUTHOR3_NORMAL, + COL_AUTHOR4_NORMAL, COL_AUTHOR5_NORMAL, COL_AUTHOR6_NORMAL, + COL_AUTHOR7_NORMAL, COL_AUTHOR8_NORMAL, COL_AUTHOR9_NORMAL }; + + return aArrayNormal[ aAuthorIndex % SAL_N_ELEMENTS( aArrayNormal ) ]; + } + + return COL_WHITE; +} + +Color AnnotationManagerImpl::GetColorLight(sal_uInt16 aAuthorIndex) +{ + if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode()) + { + static const Color aArrayLight[] = { + COL_AUTHOR1_LIGHT, COL_AUTHOR2_LIGHT, COL_AUTHOR3_LIGHT, + COL_AUTHOR4_LIGHT, COL_AUTHOR5_LIGHT, COL_AUTHOR6_LIGHT, + COL_AUTHOR7_LIGHT, COL_AUTHOR8_LIGHT, COL_AUTHOR9_LIGHT }; + + return aArrayLight[ aAuthorIndex % SAL_N_ELEMENTS( aArrayLight ) ]; + } + + return COL_WHITE; +} + +Color AnnotationManagerImpl::GetColorDark(sal_uInt16 aAuthorIndex) +{ + if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode()) + { + static const Color aArrayAnkor[] = { + COL_AUTHOR1_DARK, COL_AUTHOR2_DARK, COL_AUTHOR3_DARK, + COL_AUTHOR4_DARK, COL_AUTHOR5_DARK, COL_AUTHOR6_DARK, + COL_AUTHOR7_DARK, COL_AUTHOR8_DARK, COL_AUTHOR9_DARK }; + + return aArrayAnkor[ aAuthorIndex % SAL_N_ELEMENTS( aArrayAnkor ) ]; + } + + return COL_WHITE; +} + +SdPage* AnnotationManagerImpl::GetNextPage( SdPage const * pPage, bool bForward ) +{ + if( pPage == nullptr ) + { + if (bForward) + return mpDoc->GetSdPage(0, PageKind::Standard ); // first page + else + return mpDoc->GetMasterSdPage( mpDoc->GetMasterSdPageCount(PageKind::Standard) - 1, PageKind::Standard ); // last page + } + + sal_uInt16 nPageNum = (pPage->GetPageNum() - 1) >> 1; + + // first all non master pages + if( !pPage->IsMasterPage() ) + { + if( bForward ) + { + if( nPageNum >= mpDoc->GetSdPageCount(PageKind::Standard)-1 ) + { + // we reached end of draw pages, start with master pages (skip handout master for draw) + return mpDoc->GetMasterSdPage( (mpDoc->GetDocumentType() == DocumentType::Impress) ? 0 : 1, PageKind::Standard ); + } + nPageNum++; + } + else + { + if( nPageNum == 0 ) + return nullptr; // we are already on the first draw page, finished + + nPageNum--; + } + return mpDoc->GetSdPage(nPageNum, PageKind::Standard); + } + else + { + if( bForward ) + { + if( nPageNum >= mpDoc->GetMasterSdPageCount(PageKind::Standard)-1 ) + { + return nullptr; // we reached the end, there is nothing more to see here + } + nPageNum++; + } + else + { + if( nPageNum == (mpDoc->GetDocumentType() == DocumentType::Impress ? 0 : 1) ) + { + // we reached beginning of master pages, start with end if pages + return mpDoc->GetSdPage( mpDoc->GetSdPageCount(PageKind::Standard)-1, PageKind::Standard ); + } + + nPageNum--; + } + return mpDoc->GetMasterSdPage(nPageNum,PageKind::Standard); + } +} + +SdPage* AnnotationManagerImpl::GetCurrentPage() +{ + if (mrBase.GetMainViewShell()) + return mrBase.GetMainViewShell()->getCurrentPage(); + return nullptr; +} + +AnnotationManager::AnnotationManager( ViewShellBase& rViewShellBase ) +: mxImpl( new AnnotationManagerImpl( rViewShellBase ) ) +{ + mxImpl->init(); +} + +AnnotationManager::~AnnotationManager() +{ + mxImpl->dispose(); +} + +void AnnotationManager::ExecuteAnnotation(SfxRequest const & rRequest) +{ + mxImpl->ExecuteAnnotation( rRequest ); +} + +void AnnotationManager::GetAnnotationState(SfxItemSet& rItemSet) +{ + mxImpl->GetAnnotationState(rItemSet); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/annotations/annotationmanagerimpl.hxx b/sd/source/ui/annotations/annotationmanagerimpl.hxx new file mode 100644 index 0000000000..bbcd5a8521 --- /dev/null +++ b/sd/source/ui/annotations/annotationmanagerimpl.hxx @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include + +#include "annotationtag.hxx" + +namespace com::sun::star::drawing { class XDrawView; } +namespace com::sun::star::office { class XAnnotationAccess; } +namespace com::sun::star::office { class XAnnotation; } + +class SfxRequest; +class SdPage; +class SdDrawDocument; +struct ImplSVEvent; + +namespace sd +{ +class Annotation; +class ViewShellBase; + +namespace tools { +class EventMultiplexerEvent; +} + +typedef comphelper::WeakComponentImplHelper < + css::document::XEventListener + > AnnotationManagerImplBase; + +class AnnotationManagerImpl : public AnnotationManagerImplBase +{ +public: + explicit AnnotationManagerImpl( ViewShellBase& rViewShellBase ); + + void init(); + + // WeakComponentImplHelper + virtual void disposing (std::unique_lock&) override; + + // XEventListener + virtual void SAL_CALL notifyEvent( const css::document::EventObject& Event ) override; + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + void ExecuteAnnotation (SfxRequest const & rRequest); + void GetAnnotationState (SfxItemSet& rItemSet); + + void ExecuteInsertAnnotation(SfxRequest const & rReq); + void ExecuteDeleteAnnotation(SfxRequest const & rReq); + void ExecuteEditAnnotation(SfxRequest const & rReq); + void ExecuteReplyToAnnotation(SfxRequest const & rReq); + + void SelectNextAnnotation(bool bForward); + + void SelectAnnotation( const rtl::Reference< Annotation >& xAnnotation, bool bEdit = false ); + void GetSelectedAnnotation( rtl::Reference< Annotation >& xAnnotation ); + + void InsertAnnotation(const OUString& rText); + void DeleteAnnotation( const rtl::Reference< Annotation >& xAnnotation ); + void DeleteAnnotationsByAuthor( std::u16string_view sAuthor ); + void DeleteAllAnnotations(); + + void ExecuteAnnotationTagContextMenu(const rtl::Reference& xAnnotation, weld::Widget* pParent, const ::tools::Rectangle& rContextRect); + + static Color GetColorDark(sal_uInt16 aAuthorIndex); + static Color GetColorLight(sal_uInt16 aAuthorIndex); + static Color GetColor(sal_uInt16 aAuthorIndex); + + // callbacks + void onTagSelected( AnnotationTag const & rTag ); + void onTagDeselected( AnnotationTag const & rTag ); + + void onSelectionChanged(); + + void addListener(); + void removeListener(); + + void invalidateSlots(); + + DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void); + DECL_LINK(UpdateTagsHdl, void *, void); + + void UpdateTags(bool bSynchron = false); + void CreateTags(); + void DisposeTags(); + + SdPage* GetNextPage( SdPage const * pPage, bool bForward ); + + SdPage* GetCurrentPage(); + + SdDrawDocument* GetDoc() { return mpDoc; } + + void ShowAnnotations(bool bShow); + +private: + ViewShellBase& mrBase; + SdDrawDocument* mpDoc; + + std::vector< rtl::Reference< AnnotationTag > > maTagVector; + + css::uno::Reference< css::drawing::XDrawView > mxView; + rtl::Reference< SdPage > mxCurrentPage; + rtl::Reference< Annotation > mxSelectedAnnotation; + + bool mbShowAnnotations; + ImplSVEvent * mnUpdateTagsEvent; + vcl::Font maFont; + + rtl::Reference GetAnnotationById(sal_uInt32 nAnnotationId); +}; + +OUString getAnnotationDateTimeString( const css::uno::Reference< css::office::XAnnotation >& xAnnotation ); + +SfxItemPool* GetAnnotationPool(); + +css::util::DateTime getCurrentDateTime(); + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/annotations/annotationtag.cxx b/sd/source/ui/annotations/annotationtag.cxx new file mode 100644 index 0000000000..6bea249272 --- /dev/null +++ b/sd/source/ui/annotations/annotationtag.cxx @@ -0,0 +1,671 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "annotationmanagerimpl.hxx" +#include "annotationwindow.hxx" +#include "annotationtag.hxx" +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::office; +using namespace ::com::sun::star::geometry; + +namespace sd +{ + +const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32; +const int DRGPIX = 2; // Drag MinMove in Pixel + +static OUString getInitials( const OUString& rName ) +{ + OUStringBuffer sInitials; + + const sal_Unicode * pStr = rName.getStr(); + sal_Int32 nLength = rName.getLength(); + + while( nLength ) + { + // skip whitespace + while( nLength && (*pStr <= ' ') ) + { + nLength--; pStr++; + } + + // take letter + if( nLength ) + { + sInitials.append(*pStr); + nLength--; pStr++; + } + + // skip letters until whitespace + while( nLength && (*pStr > ' ') ) + { + nLength--; pStr++; + } + } + + return sInitials.makeStringAndClear(); +} + +namespace { + +class AnnotationDragMove : public SdrDragMove +{ +public: + AnnotationDragMove(SdrDragView& rNewView, rtl::Reference xTag); + virtual bool BeginSdrDrag() override; + virtual bool EndSdrDrag(bool bCopy) override; + virtual void MoveSdrDrag(const Point& rNoSnapPnt) override; + virtual void CancelSdrDrag() override; + +private: + rtl::Reference mxTag; + Point maOrigin; +}; + +} + +AnnotationDragMove::AnnotationDragMove(SdrDragView& rNewView, rtl::Reference xTag) +: SdrDragMove(rNewView) +, mxTag(std::move( xTag )) +{ +} + +bool AnnotationDragMove::BeginSdrDrag() +{ + DragStat().SetRef1(GetDragHdl()->GetPos()); + DragStat().SetShown(!DragStat().IsShown()); + + maOrigin = GetDragHdl()->GetPos(); + DragStat().SetActionRect(::tools::Rectangle(maOrigin,maOrigin)); + + return true; +} + +void AnnotationDragMove::MoveSdrDrag(const Point& rNoSnapPnt) +{ + Point aPnt(rNoSnapPnt); + + if (DragStat().CheckMinMoved(rNoSnapPnt)) + { + if (aPnt!=DragStat().GetNow()) + { + Hide(); + DragStat().NextMove(aPnt); + GetDragHdl()->SetPos( maOrigin + Point( DragStat().GetDX(), DragStat().GetDY() ) ); + Show(); + DragStat().SetActionRect(::tools::Rectangle(aPnt,aPnt)); + } + } +} + +bool AnnotationDragMove::EndSdrDrag(bool /*bCopy*/) +{ + Hide(); + if( mxTag.is() ) + mxTag->Move( DragStat().GetDX(), DragStat().GetDY() ); + return true; +} + +void AnnotationDragMove::CancelSdrDrag() +{ + Hide(); +} + +namespace { + +class AnnotationHdl : public SmartHdl +{ +public: + AnnotationHdl( const SmartTagReference& xTag, const rtl::Reference< Annotation >& xAnnotation, const Point& rPnt ); + + virtual void CreateB2dIAObject() override; + virtual bool IsFocusHdl() const override; + +private: + rtl::Reference< sd::Annotation > mxAnnotation; + rtl::Reference< AnnotationTag > mxTag; +}; + +} + +AnnotationHdl::AnnotationHdl( const SmartTagReference& xTag, const rtl::Reference< Annotation >& xAnnotation, const Point& rPnt ) +: SmartHdl( xTag, rPnt, SdrHdlKind::SmartTag ) +, mxAnnotation( xAnnotation ) +, mxTag( dynamic_cast< AnnotationTag* >( xTag.get() ) ) +{ +} + +void AnnotationHdl::CreateB2dIAObject() +{ + // first throw away old one + GetRidOfIAObject(); + + if (!mxAnnotation.is()) + return; + + const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); + + const Point aTagPos( GetPos() ); + basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() ); + + const bool bFocused = IsFocusHdl() && m_pHdlList && (m_pHdlList->GetFocusHdl() == this); + + BitmapEx aBitmapEx( mxTag->CreateAnnotationBitmap(mxTag->isSelected()) ); + BitmapEx aBitmapEx2; + if( bFocused ) + aBitmapEx2 = mxTag->CreateAnnotationBitmap(!mxTag->isSelected() ); + + if(!m_pHdlList) + return; + + SdrMarkView* pView = m_pHdlList->GetView(); + + if(!pView || pView->areMarkHandlesHidden()) + return; + + SdrPageView* pPageView = pView->GetSdrPageView(); + + if(!pPageView) + return; + + for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++) + { + // const SdrPageViewWinRec& rPageViewWinRec = rPageViewWinList[b]; + const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b); + + SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow(); + const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager(); + if(rPaintWindow.OutputToWindow() && xManager.is() ) + { + std::unique_ptr pOverlayObject; + + if (mxAnnotation && mxAnnotation->hasCustomAnnotationMarker()) + { + CustomAnnotationMarker& rCustomAnnotationMarker = mxAnnotation->getCustomAnnotationMarker(); + + auto& rPolygons = rCustomAnnotationMarker.maPolygons; + if (!rPolygons.empty()) + { + basegfx::B2DPolyPolygon aPolyPolygon; + for (auto const & rPolygon : rPolygons) + aPolyPolygon.append(rPolygon); + + pOverlayObject.reset(new sdr::overlay::OverlayPolyPolygon( + std::move(aPolyPolygon), + rCustomAnnotationMarker.maLineColor, + rCustomAnnotationMarker.mnLineWidth, + rCustomAnnotationMarker.maFillColor)); + } + } + else + { + // animate focused handles + if(bFocused) + { + const sal_uInt64 nBlinkTime = rStyleSettings.GetCursorBlinkTime(); + + pOverlayObject.reset(new sdr::overlay::OverlayAnimatedBitmapEx(aPosition, aBitmapEx, aBitmapEx2, nBlinkTime, 0, 0, 0, 0 )); + } + else + { + pOverlayObject.reset(new sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 )); + } + } + + // OVERLAYMANAGER + insertNewlyCreatedOverlayObjectForSdrHdl( + std::move(pOverlayObject), + rPageWindow.GetObjectContact(), + *xManager); + } + } +} + +bool AnnotationHdl::IsFocusHdl() const +{ + return true; +} + +AnnotationTag::AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const rtl::Reference< Annotation >& xAnnotation, Color const & rColor, int nIndex, const vcl::Font& rFont ) +: SmartTag( rView ) +, mrManager( rManager ) +, mxAnnotation( xAnnotation ) +, maColor( rColor ) +, mnIndex( nIndex ) +, mrFont( rFont ) +, mpListenWindow( nullptr ) +{ +} + +AnnotationTag::~AnnotationTag() +{ + DBG_ASSERT( !mxAnnotation.is(), "sd::AnnotationTag::~AnnotationTag(), dispose me first!" ); + Dispose(); +} + +/** returns true if the AnnotationTag handled the event. */ +bool AnnotationTag::MouseButtonDown( const MouseEvent& rMEvt, SmartHdl& /*rHdl*/ ) +{ + if( !mxAnnotation.is() ) + return false; + + bool bRet = false; + if( !isSelected() ) + { + SmartTagReference xTag( this ); + mrView.getSmartTags().select( xTag ); + bRet = true; + } + + if( rMEvt.IsLeft() && !rMEvt.IsRight() ) + { + vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow(); + if( pWindow ) + { + maMouseDownPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() ); + + if( mpListenWindow ) + mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler)); + + mpListenWindow = pWindow; + mpListenWindow->AddEventListener( LINK(this, AnnotationTag, WindowEventHandler)); + } + + bRet = true; + } + + return bRet; +} + +/** returns true if the SmartTag consumes this event. */ +bool AnnotationTag::KeyInput( const KeyEvent& rKEvt ) +{ + if( !mxAnnotation.is() ) + return false; + + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + switch( nCode ) + { + case KEY_DELETE: + mrManager.DeleteAnnotation( mxAnnotation ); + return true; + + case KEY_DOWN: + case KEY_UP: + case KEY_LEFT: + case KEY_RIGHT: + return OnMove( rKEvt ); + + case KEY_ESCAPE: + { + SmartTagReference xThis( this ); + mrView.getSmartTags().deselect(); + return true; + } + + case KEY_TAB: + mrManager.SelectNextAnnotation(!rKEvt.GetKeyCode().IsShift()); + return true; + + case KEY_RETURN: + case KEY_SPACE: + OpenPopup( true ); + return true; + + default: + return false; + } +} + +/** returns true if the SmartTag consumes this event. */ +bool AnnotationTag::Command( const CommandEvent& rCEvt ) +{ + if (rCEvt.GetCommand() != CommandEventId::ContextMenu) + return false; + if (vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow()) + { + ::tools::Rectangle aContextRect(rCEvt.GetMousePosPixel(),Size(1,1)); + weld::Window* pParent = weld::GetPopupParent(*pWindow, aContextRect); + mrManager.ExecuteAnnotationTagContextMenu(mxAnnotation, pParent, aContextRect); + return true; + } + return false; +} + +void AnnotationTag::Move( int nDX, int nDY ) +{ + if( !mxAnnotation.is() ) + return; + + if( mrManager.GetDoc()->IsUndoEnabled() ) + mrManager.GetDoc()->BegUndo( SdResId( STR_ANNOTATION_UNDO_MOVE ) ); + + RealPoint2D aPosition( mxAnnotation->getPosition() ); + aPosition.X += static_cast(nDX) / 100.0; + aPosition.Y += static_cast(nDY) / 100.0; + mxAnnotation->setPosition( aPosition ); + + if( mrManager.GetDoc()->IsUndoEnabled() ) + mrManager.GetDoc()->EndUndo(); + + mrView.updateHandles(); +} + +bool AnnotationTag::OnMove( const KeyEvent& rKEvt ) +{ + ::tools::Long nX = 0; + ::tools::Long nY = 0; + + switch( rKEvt.GetKeyCode().GetCode() ) + { + case KEY_UP: nY = -1; break; + case KEY_DOWN: nY = 1; break; + case KEY_LEFT: nX = -1; break; + case KEY_RIGHT: nX = 1; break; + default: break; + } + + if(rKEvt.GetKeyCode().IsMod2()) + { + OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow()->GetOutDev(); + Size aLogicSizeOnePixel = pOut ? pOut->PixelToLogic(Size(1,1)) : Size(100, 100); + nX *= aLogicSizeOnePixel.Width(); + nY *= aLogicSizeOnePixel.Height(); + } + else + { + // old, fixed move distance + nX *= 100; + nY *= 100; + } + + if( nX || nY ) + { + // move the annotation + Move( nX, nY ); + } + + return true; +} + +void AnnotationTag::CheckPossibilities() +{ +} + +sal_Int32 AnnotationTag::GetMarkablePointCount() const +{ + return 0; +} + +sal_Int32 AnnotationTag::GetMarkedPointCount() const +{ + return 0; +} + +bool AnnotationTag::MarkPoint(SdrHdl& /*rHdl*/, bool /*bUnmark*/ ) +{ + return false; +} + +bool AnnotationTag::MarkPoints(const ::tools::Rectangle* /*pRect*/, bool /*bUnmark*/ ) +{ + return false; +} + +bool AnnotationTag::getContext( SdrViewContext& /*rContext*/ ) +{ + return false; +} + +void AnnotationTag::addCustomHandles( SdrHdlList& rHandlerList ) +{ + if( !mxAnnotation.is() ) + return; + + SmartTagReference xThis( this ); + std::unique_ptr pHdl(new AnnotationHdl( xThis, mxAnnotation, Point() )); + pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM ); + pHdl->SetPageView( mrView.GetSdrPageView() ); + + RealPoint2D aPosition( mxAnnotation->getPosition() ); + Point aBasePos( static_cast<::tools::Long>(aPosition.X * 100.0), static_cast<::tools::Long>(aPosition.Y * 100.0) ); + pHdl->SetPos( aBasePos ); + + rHandlerList.AddHdl( std::move(pHdl) ); +} + +void AnnotationTag::disposing() +{ + if( mpListenWindow ) + { + mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler)); + } + + mxAnnotation.clear(); + ClosePopup(); + SmartTag::disposing(); +} + +void AnnotationTag::select() +{ + SmartTag::select(); + + mrManager.onTagSelected( *this ); + + vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow(); + if( pWindow ) + { + RealPoint2D aPosition( mxAnnotation->getPosition() ); + Point aPos( static_cast<::tools::Long>(aPosition.X * 100.0), static_cast<::tools::Long>(aPosition.Y * 100.0) ); + + ::tools::Rectangle aVisRect( aPos, pWindow->PixelToLogic(maSize) ); + mrView.MakeVisible(aVisRect, *pWindow); + } +} + +void AnnotationTag::deselect() +{ + SmartTag::deselect(); + + ClosePopup(); + + mrManager.onTagDeselected( *this ); +} + +BitmapEx AnnotationTag::CreateAnnotationBitmap( bool bSelected ) +{ + ScopedVclPtrInstance< VirtualDevice > pVDev; + + OUString sText; + if (mxAnnotation && mxAnnotation->isFreeText()) + { + sText = mxAnnotation->getTextRange()->getString(); + } + else + { + OUString sInitials(mxAnnotation->getInitials()); + if (sInitials.isEmpty()) + { + sInitials = getInitials(mxAnnotation->getAuthor()); + } + + sText = sInitials + " " + OUString::number(mnIndex); + } + + pVDev->SetFont( mrFont ); + + const int BORDER_X = 4; // pixels + const int BORDER_Y = 4; // pixels + + maSize = Size(pVDev->GetTextWidth(sText) + 2 * BORDER_X, pVDev->GetTextHeight() + 2 * BORDER_Y); + pVDev->SetOutputSizePixel( maSize, false ); + + Color aBorderColor( maColor ); + + if( bSelected ) + { + aBorderColor.Invert(); + } + else + { + if( maColor.IsDark() ) + { + aBorderColor.IncreaseLuminance( 32 ); + } + else + { + aBorderColor.DecreaseLuminance( 32 ); + } + } + + Point aPos; + ::tools::Rectangle aBorderRect( aPos, maSize ); + pVDev->SetLineColor(aBorderColor); + pVDev->SetFillColor(maColor); + pVDev->DrawRect( aBorderRect ); + + pVDev->SetTextColor( maColor.IsDark() ? COL_WHITE : COL_BLACK ); + pVDev->DrawText(Point(BORDER_X, BORDER_Y), sText); + + return pVDev->GetBitmapEx( aPos, maSize ); +} + +void AnnotationTag::OpenPopup( bool bEdit ) +{ + if( !mxAnnotation.is() ) + return; + + if( !mpAnnotationWindow ) + { + OutputDevice* pOut = getView().GetFirstOutputDevice(); + vcl::Window* pWindow = pOut ? pOut->GetOwnerWindow() : nullptr; + if( pWindow ) + { + RealPoint2D aPosition( mxAnnotation->getPosition() ); + Point aPos(pWindow->LogicToPixel( Point( static_cast<::tools::Long>(aPosition.X * 100.0), static_cast<::tools::Long>(aPosition.Y * 100.0) ) ) ); + + aPos.AdjustX(4 ); // magic! + aPos.AdjustY(1 ); + + ::tools::Rectangle aRect( aPos, maSize ); + + weld::Window* pParent = weld::GetPopupParent(*pWindow, aRect); + mpAnnotationWindow.reset(new AnnotationWindow(pParent, aRect, mrView.GetDocSh(), mxAnnotation)); + mpAnnotationWindow->connect_closed(LINK(this, AnnotationTag, PopupModeEndHdl)); + } + } + + if (bEdit && mpAnnotationWindow) + mpAnnotationWindow->StartEdit(); +} + +IMPL_LINK_NOARG(AnnotationTag, PopupModeEndHdl, weld::Popover&, void) +{ + ClosePopup(); +} + +void AnnotationTag::ClosePopup() +{ + if (mpAnnotationWindow) + { + mpAnnotationWindow->SaveToDocument(); + mpAnnotationWindow.reset(); + } +} + +IMPL_LINK(AnnotationTag, WindowEventHandler, VclWindowEvent&, rEvent, void) +{ + vcl::Window* pWindow = rEvent.GetWindow(); + + if( !pWindow ) + return; + + if( pWindow != mpListenWindow ) + return; + + switch( rEvent.GetId() ) + { + case VclEventId::WindowMouseButtonUp: + { + // if we stop pressing the button without a mouse move we open the popup + mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler)); + mpListenWindow = nullptr; + if( !mpAnnotationWindow ) + OpenPopup(false); + } + break; + case VclEventId::WindowMouseMove: + { + // if we move the mouse after a button down we want to start dragging + mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler)); + mpListenWindow = nullptr; + + SdrHdl* pHdl = mrView.PickHandle(maMouseDownPos); + if( pHdl ) + { + mrView.BrkAction(); + const sal_uInt16 nDrgLog = static_cast(pWindow->PixelToLogic(Size(DRGPIX,0)).Width()); + + rtl::Reference< AnnotationTag > xTag( this ); + + SdrDragMethod* pDragMethod = new AnnotationDragMove( mrView, xTag ); + mrView.BegDragObj(maMouseDownPos, nullptr, pHdl, nDrgLog, pDragMethod ); + } + } + break; + case VclEventId::ObjectDying: + mpListenWindow = nullptr; + break; + default: break; + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/annotations/annotationtag.hxx b/sd/source/ui/annotations/annotationtag.hxx new file mode 100644 index 0000000000..b5807a4b08 --- /dev/null +++ b/sd/source/ui/annotations/annotationtag.hxx @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include "annotationwindow.hxx" + +namespace com::sun::star::office { class XAnnotation; } + +namespace sd { +class Annotation; +class View; +class AnnotationManagerImpl; + +class AnnotationTag final : public SmartTag +{ +public: + AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const rtl::Reference< Annotation >& xAnnotation, Color const & rColor, int nIndex, const vcl::Font& rFont ); + virtual ~AnnotationTag() override; + + /// @return true if the SmartTag handled the event. + virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ) override; + + /// @return true if the SmartTag consumes this event. + virtual bool KeyInput( const KeyEvent& rKEvt ) override; + + /// @return true if the SmartTag consumes this event. + virtual bool Command( const CommandEvent& rCEvt ) override; + + // callbacks from sdr view + virtual sal_Int32 GetMarkablePointCount() const override; + virtual sal_Int32 GetMarkedPointCount() const override; + virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark) override; + virtual void CheckPossibilities() override; + virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) override; + + void Move( int nDX, int nDY ); + bool OnMove( const KeyEvent& rKEvt ); + + BitmapEx CreateAnnotationBitmap(bool); + + const rtl::Reference< Annotation >& GetAnnotation() const { return mxAnnotation; } + + void OpenPopup( bool bEdit ); + void ClosePopup(); + +private: + virtual void addCustomHandles( SdrHdlList& rHandlerList ) override; + virtual bool getContext( SdrViewContext& rContext ) override; + virtual void disposing() override; + virtual void select() override; + virtual void deselect() override; + + DECL_LINK( WindowEventHandler, VclWindowEvent&, void ); + DECL_LINK(PopupModeEndHdl, weld::Popover&, void); + + AnnotationManagerImpl& mrManager; + rtl::Reference< Annotation > mxAnnotation; + std::unique_ptr mpAnnotationWindow; + Color maColor; + int mnIndex; + const vcl::Font& mrFont; + Size maSize; + VclPtr mpListenWindow; + Point maMouseDownPos; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/annotations/annotationwindow.cxx b/sd/source/ui/annotations/annotationwindow.cxx new file mode 100644 index 0000000000..02495794ae --- /dev/null +++ b/sd/source/ui/annotations/annotationwindow.cxx @@ -0,0 +1,800 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "annotationwindow.hxx" +#include "annotationmanagerimpl.hxx" + +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::sd; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::office; +using namespace ::com::sun::star::text; + +#define METABUTTON_WIDTH 16 +#define METABUTTON_HEIGHT 18 +#define POSTIT_META_HEIGHT sal_Int32(30) + +namespace sd { + +void AnnotationTextWindow::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) +{ + Size aSize = GetOutputSizePixel(); + + const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode(); + if (!bHighContrast) + { + rRenderContext.DrawGradient(::tools::Rectangle(Point(0,0), rRenderContext.PixelToLogic(aSize)), + Gradient(css::awt::GradientStyle_LINEAR, mrContents.maColorLight, mrContents.maColor)); + } + + DoPaint(rRenderContext, rRect); +} + +void AnnotationTextWindow::EditViewScrollStateChange() +{ + mrContents.SetScrollbar(); +} + +bool AnnotationTextWindow::KeyInput(const KeyEvent& rKeyEvt) +{ + const vcl::KeyCode& rKeyCode = rKeyEvt.GetKeyCode(); + sal_uInt16 nKey = rKeyCode.GetCode(); + + bool bDone = false; + + if ((rKeyCode.IsMod1() && rKeyCode.IsMod2()) && ((nKey == KEY_PAGEUP) || (nKey == KEY_PAGEDOWN))) + { + SfxDispatcher* pDispatcher = mrContents.DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher(); + if( pDispatcher ) + pDispatcher->Execute( nKey == KEY_PAGEDOWN ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT ); + bDone = true; + } + else if (nKey == KEY_INSERT) + { + if (!rKeyCode.IsMod1() && !rKeyCode.IsMod2()) + mrContents.ToggleInsMode(); + bDone = true; + } + else + { + ::tools::Long aOldHeight = mrContents.GetPostItTextHeight(); + + /// HACK: need to switch off processing of Undo/Redo in Outliner + if ( !( (nKey == KEY_Z || nKey == KEY_Y) && rKeyCode.IsMod1()) ) + { + bool bIsProtected = mrContents.IsProtected(); + if (!bIsProtected || !EditEngine::DoesKeyChangeText(rKeyEvt) ) + { + if (EditView* pEditView = GetEditView()) + { + bDone = pEditView->PostKeyEvent(rKeyEvt); + if (!bDone && rKeyEvt.GetKeyCode().IsMod1() && !rKeyEvt.GetKeyCode().IsMod2()) + { + if (nKey == KEY_A) + { + EditEngine* pEditEngine = GetEditEngine(); + sal_Int32 nPar = pEditEngine->GetParagraphCount(); + if (nPar) + { + sal_Int32 nLen = pEditEngine->GetTextLen(nPar - 1); + pEditView->SetSelection(ESelection(0, 0, nPar - 1, nLen)); + } + bDone = true; + } + } + } + } + } + if (bDone) + { + mrContents.ResizeIfNecessary(aOldHeight, mrContents.GetPostItTextHeight()); + } + } + + return bDone; +} + +AnnotationTextWindow::AnnotationTextWindow(AnnotationWindow& rContents) + : mrContents(rContents) +{ +} + +EditView* AnnotationTextWindow::GetEditView() const +{ + OutlinerView* pOutlinerView = mrContents.GetOutlinerView(); + if (!pOutlinerView) + return nullptr; + return &pOutlinerView->GetEditView(); +} + +EditEngine* AnnotationTextWindow::GetEditEngine() const +{ + OutlinerView* pOutlinerView = mrContents.GetOutlinerView(); + if (!pOutlinerView) + return nullptr; + return pOutlinerView->GetEditView().GetEditEngine(); +} + +void AnnotationTextWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + Size aSize(0, 0); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + + SetOutputSizePixel(aSize); + + weld::CustomWidgetController::SetDrawingArea(pDrawingArea); + + EnableRTL(false); + + const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); + Color aBgColor = rStyleSettings.GetWindowColor(); + + OutputDevice& rDevice = pDrawingArea->get_ref_device(); + + rDevice.SetMapMode(MapMode(MapUnit::Map100thMM)); + rDevice.SetBackground(aBgColor); + + Size aOutputSize(rDevice.PixelToLogic(aSize)); + + EditView* pEditView = GetEditView(); + pEditView->setEditViewCallbacks(this); + + EditEngine* pEditEngine = GetEditEngine(); + pEditEngine->SetPaperSize(aOutputSize); + pEditEngine->SetRefDevice(&rDevice); + + pEditView->SetOutputArea(::tools::Rectangle(Point(0, 0), aOutputSize)); + pEditView->SetBackgroundColor(aBgColor); + + pDrawingArea->set_cursor(PointerStyle::Text); + + InitAccessible(); +} + +// see SwAnnotationWin in sw for something similar +AnnotationWindow::AnnotationWindow(weld::Window* pParent, const ::tools::Rectangle& rRect, + DrawDocShell* pDocShell, + const Reference& xAnnotation) + : mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/annotation.ui")) + , mxPopover(mxBuilder->weld_popover("Annotation")) + , mxContainer(mxBuilder->weld_widget("container")) + , mpDocShell(pDocShell) + , mpDoc(pDocShell->GetDoc()) + , mbReadonly(pDocShell->IsReadOnly()) + , mbProtected(false) +{ + mxContainer->set_size_request(320, 240); + mxPopover->popup_at_rect(pParent, rRect); + + InitControls(); + setAnnotation(xAnnotation); + FillMenuButton(); + + DoResize(); + + mxTextControl->GrabFocus(); +} + +AnnotationWindow::~AnnotationWindow() +{ +} + +void AnnotationWindow::InitControls() +{ + // window control for author and date + mxMeta = mxBuilder->weld_label("meta"); + mxMeta->set_direction(AllSettings::GetLayoutRTL()); + + maLabelFont = Application::GetSettings().GetStyleSettings().GetLabelFont(); + maLabelFont.SetFontHeight(8); + + // we should leave this setting alone, but for this we need a better layout algo + // with variable meta size height + mxMeta->set_font(maLabelFont); + + mpOutliner.reset( new ::Outliner(GetAnnotationPool(),OutlinerMode::TextObject) ); + SdDrawDocument::SetCalcFieldValueHdl( mpOutliner.get() ); + mpOutliner->SetUpdateLayout( true ); + + if (OutputDevice* pDev = mpDoc->GetRefDevice()) + mpOutliner->SetRefDevice( pDev ); + + mpOutlinerView.reset( new OutlinerView ( mpOutliner.get(), nullptr) ); + mpOutliner->InsertView(mpOutlinerView.get() ); + + //create Scrollbars + mxVScrollbar = mxBuilder->weld_scrolled_window("scrolledwindow", true); + + // actual window which holds the user text + mxTextControl.reset(new AnnotationTextWindow(*this)); + mxTextControlWin.reset(new weld::CustomWeld(*mxBuilder, "editview", *mxTextControl)); + mxTextControl->SetPointer(PointerStyle::Text); + + Rescale(); + OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device(); + + mxVScrollbar->set_direction(false); + mxVScrollbar->connect_vadjustment_changed(LINK(this, AnnotationWindow, ScrollHdl)); + + mpOutlinerView->SetBackgroundColor(COL_TRANSPARENT); + mpOutlinerView->SetOutputArea(rDevice.PixelToLogic(::tools::Rectangle(0, 0, 1, 1))); + + mxMenuButton = mxBuilder->weld_menu_button("menubutton"); + if (mbReadonly) + mxMenuButton->hide(); + else + { + mxMenuButton->set_size_request(METABUTTON_WIDTH, METABUTTON_HEIGHT); + mxMenuButton->connect_selected(LINK(this, AnnotationWindow, MenuItemSelectedHdl)); + } + + EEControlBits nCntrl = mpOutliner->GetControlWord(); + nCntrl |= EEControlBits::PASTESPECIAL | EEControlBits::AUTOCORRECT | EEControlBits::USECHARATTRIBS | EEControlBits::NOCOLORS; + mpOutliner->SetControlWord(nCntrl); + + mpOutliner->SetModifyHdl( Link() ); + mpOutliner->EnableUndo( false ); + + mpOutliner->ClearModifyFlag(); + mpOutliner->GetUndoManager().Clear(); + mpOutliner->EnableUndo( true ); + + SetLanguage(SvxLanguageItem(mpDoc->GetLanguage(EE_CHAR_LANGUAGE), SID_ATTR_LANGUAGE)); + + mxTextControl->GrabFocus(); +} + +IMPL_LINK(AnnotationWindow, MenuItemSelectedHdl, const OUString&, rIdent, void) +{ + SfxDispatcher* pDispatcher = mpDocShell->GetViewShell()->GetViewFrame()->GetDispatcher(); + if (!pDispatcher) + return; + + if (rIdent == ".uno:ReplyToAnnotation") + { + const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( mxAnnotation ) ); + pDispatcher->ExecuteList(SID_REPLYTO_POSTIT, + SfxCallMode::ASYNCHRON, { &aItem }); + } + else if (rIdent == ".uno:DeleteAnnotation") + { + const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( mxAnnotation ) ); + pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON, + { &aItem }); + } + else if (rIdent == ".uno:DeleteAllAnnotationByAuthor") + { + const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, mxAnnotation->getAuthor() ); + pDispatcher->ExecuteList( SID_DELETEALLBYAUTHOR_POSTIT, + SfxCallMode::ASYNCHRON, { &aItem }); + } + else if (rIdent == ".uno:DeleteAllAnnotation") + pDispatcher->Execute( SID_DELETEALL_POSTIT ); +} + +void AnnotationWindow::FillMenuButton() +{ + SvtUserOptions aUserOptions; + OUString sCurrentAuthor( aUserOptions.GetFullName() ); + OUString sAuthor( mxAnnotation->getAuthor() ); + + OUString aStr(mxMenuButton->get_item_label(".uno:DeleteAllAnnotationByAuthor")); + OUString aReplace( sAuthor ); + if( aReplace.isEmpty() ) + aReplace = SdResId( STR_ANNOTATION_NOAUTHOR ); + aStr = aStr.replaceFirst("%1", aReplace); + mxMenuButton->set_item_label(".uno:DeleteAllAnnotationByAuthor", aStr); + + bool bShowReply = sAuthor != sCurrentAuthor && !mbReadonly; + mxMenuButton->set_item_visible(".uno:ReplyToAnnotation", bShowReply); + mxMenuButton->set_item_visible("separator", bShowReply); + mxMenuButton->set_item_visible(".uno:DeleteAnnotation", mxAnnotation.is() && !mbReadonly); + mxMenuButton->set_item_visible(".uno:DeleteAllAnnotationByAuthor", !mbReadonly); + mxMenuButton->set_item_visible(".uno:DeleteAllAnnotation", !mbReadonly); +} + +void AnnotationWindow::StartEdit() +{ + GetOutlinerView()->SetSelection(ESelection(EE_PARA_MAX_COUNT,EE_TEXTPOS_MAX_COUNT,EE_PARA_MAX_COUNT,EE_TEXTPOS_MAX_COUNT)); + GetOutlinerView()->ShowCursor(); +} + +void AnnotationWindow::SetMapMode(const MapMode& rNewMapMode) +{ + OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device(); + rDevice.SetMapMode(rNewMapMode); +} + +void AnnotationWindow::Rescale() +{ + MapMode aMode(MapUnit::Map100thMM); + aMode.SetOrigin( Point() ); + mpOutliner->SetRefMapMode( aMode ); + SetMapMode( aMode ); + + if (mxMeta) + { + vcl::Font aFont = maLabelFont; + sal_Int32 nHeight = ::tools::Long(aFont.GetFontHeight() * aMode.GetScaleY()); + aFont.SetFontHeight( nHeight ); + mxMeta->set_font(aFont); + } +} + +void AnnotationWindow::DoResize() +{ + OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device(); + + ::tools::Long aHeight = mxContainer->get_preferred_size().Height(); + ::tools::ULong aWidth = mxContainer->get_preferred_size().Width(); + + aHeight -= POSTIT_META_HEIGHT; + + mpOutliner->SetPaperSize( rDevice.PixelToLogic( Size(aWidth, aHeight) ) ) ; + ::tools::Long aTextHeight = rDevice.LogicToPixel(mpOutliner->CalcTextSize()).Height(); + + if( aTextHeight > aHeight ) + { + const int nThickness = mxVScrollbar->get_scroll_thickness(); + if (nThickness) + { + // we need vertical scrollbars and have to reduce the width + aWidth -= nThickness; + mpOutliner->SetPaperSize(rDevice.PixelToLogic(Size(aWidth, aHeight))); + } + mxVScrollbar->set_vpolicy(VclPolicyType::ALWAYS); + } + else + { + mxVScrollbar->set_vpolicy(VclPolicyType::NEVER); + } + + ::tools::Rectangle aOutputArea = rDevice.PixelToLogic(::tools::Rectangle(0, 0, aWidth, aHeight)); + if (mxVScrollbar->get_vpolicy() == VclPolicyType::NEVER) + { + // if we do not have a scrollbar anymore, we want to see the complete text + mpOutlinerView->SetVisArea(aOutputArea); + } + mpOutlinerView->SetOutputArea(aOutputArea); + mpOutlinerView->ShowCursor(true, true); + + int nUpper = mpOutliner->GetTextHeight(); + int nCurrentDocPos = mpOutlinerView->GetVisArea().Top(); + int nStepIncrement = mpOutliner->GetTextHeight() / 10; + int nPageIncrement = rDevice.PixelToLogic(Size(0,aHeight)).Height() * 8 / 10; + int nPageSize = rDevice.PixelToLogic(Size(0,aHeight)).Height(); + + /* limit the page size to below nUpper because gtk's gtk_scrolled_window_start_deceleration has + effectively... + + lower = gtk_adjustment_get_lower + upper = gtk_adjustment_get_upper - gtk_adjustment_get_page_size + + and requires that upper > lower or the deceleration animation never ends + */ + nPageSize = std::min(nPageSize, nUpper); + + mxVScrollbar->vadjustment_configure(nCurrentDocPos, 0, nUpper, + nStepIncrement, nPageIncrement, nPageSize); +} + +void AnnotationWindow::SetScrollbar() +{ + mxVScrollbar->vadjustment_set_value(mpOutlinerView->GetVisArea().Top()); +} + +void AnnotationWindow::ResizeIfNecessary(::tools::Long aOldHeight, ::tools::Long aNewHeight) +{ + if (aOldHeight != aNewHeight) + DoResize(); + else + SetScrollbar(); +} + +void AnnotationWindow::SetLanguage(const SvxLanguageItem &aNewItem) +{ + mpOutliner->SetModifyHdl( Link() ); + ESelection aOld = GetOutlinerView()->GetSelection(); + + ESelection aNewSelection( 0, 0, mpOutliner->GetParagraphCount()-1, EE_TEXTPOS_ALL ); + GetOutlinerView()->SetSelection( aNewSelection ); + SfxItemSet aEditAttr(GetOutlinerView()->GetAttribs()); + aEditAttr.Put(aNewItem); + GetOutlinerView()->SetAttribs( aEditAttr ); + + GetOutlinerView()->SetSelection(aOld); + + mxTextControl->Invalidate(); +} + +void AnnotationWindow::ToggleInsMode() +{ + if( mpOutlinerView ) + { + SfxBindings &rBnd = mpDocShell->GetViewShell()->GetViewFrame()->GetBindings(); + rBnd.Invalidate(SID_ATTR_INSERT); + rBnd.Update(SID_ATTR_INSERT); + } +} + +::tools::Long AnnotationWindow::GetPostItTextHeight() +{ + OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device(); + return mpOutliner ? rDevice.LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0; +} + +IMPL_LINK(AnnotationWindow, ScrollHdl, weld::ScrolledWindow&, rScrolledWindow, void) +{ + ::tools::Long nDiff = GetOutlinerView()->GetEditView().GetVisArea().Top() - rScrolledWindow.vadjustment_get_value(); + GetOutlinerView()->Scroll( 0, nDiff ); +} + +TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation ) +{ + if( xAnnotation.is() ) + { + Reference< XText > xText( xAnnotation->getTextRange() ); + return TextApiObject::getImplementation( xText ); + } + return nullptr; +} + +void AnnotationWindow::setAnnotation( const Reference< XAnnotation >& xAnnotation ) +{ + if( (xAnnotation == mxAnnotation) || !xAnnotation.is() ) + return; + + mxAnnotation = xAnnotation; + + SetColor(); + + SvtUserOptions aUserOptions; + mbProtected = aUserOptions.GetFullName() != xAnnotation->getAuthor(); + + mpOutliner->Clear(); + TextApiObject* pTextApi = getTextApiObject( mxAnnotation ); + + if( pTextApi ) + { + std::optional< OutlinerParaObject > pOPO( pTextApi->CreateText() ); + mpOutliner->SetText(*pOPO); + } + + mpOutliner->ClearModifyFlag(); + mpOutliner->GetUndoManager().Clear(); + +//TODO Invalidate(); + + OUString sMeta( xAnnotation->getAuthor() ); + OUString sDateTime( getAnnotationDateTimeString(xAnnotation) ); + + if( !sDateTime.isEmpty() ) + { + if( !sMeta.isEmpty() ) + sMeta += "\n"; + + sMeta += sDateTime; + } + mxMeta->set_label(sMeta); +} + +void AnnotationWindow::SetColor() +{ + sal_uInt16 nAuthorIdx = mpDoc->GetAnnotationAuthorIndex( mxAnnotation->getAuthor() ); + + const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); + const bool bHighContrast = rStyleSettings.GetHighContrastMode(); + if( bHighContrast ) + { + maColor = rStyleSettings.GetWindowColor(); + maColorDark = maColor; + maColorLight = rStyleSettings.GetWindowTextColor(); + } + else + { + maColor = AnnotationManagerImpl::GetColor( nAuthorIdx ); + maColorDark = AnnotationManagerImpl::GetColorDark( nAuthorIdx ); + maColorLight = AnnotationManagerImpl::GetColorLight( nAuthorIdx ); + } + + mpOutliner->ForceAutoColor( bHighContrast || SvtAccessibilityOptions::GetIsAutomaticFontColor() ); + + mxPopover->set_background(maColor); + mxMenuButton->set_background(maColor); + + mxMeta->set_font_color(bHighContrast ? maColorLight : maColorDark); + + mxVScrollbar->customize_scrollbars(maColorLight, + maColorDark, + maColor); + mxVScrollbar->set_scroll_thickness(GetPrefScrollbarWidth()); +} + +void AnnotationWindow::SaveToDocument() +{ + Reference< XAnnotation > xAnnotation( mxAnnotation ); + + // write changed text back to annotation + if (mpOutliner->IsModified()) + { + TextApiObject* pTextApi = getTextApiObject( xAnnotation ); + + if( pTextApi ) + { + std::optional pOPO = mpOutliner->CreateParaObject(); + if( pOPO ) + { + if( mpDoc->IsUndoEnabled() ) + mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_EDIT ) ); + + pTextApi->SetText( *pOPO ); + pOPO.reset(); + + // set current time to changed annotation + xAnnotation->setDateTime( getCurrentDateTime() ); + + if( mpDoc->IsUndoEnabled() ) + mpDoc->EndUndo(); + + mpDocShell->SetModified(); + } + + } + } + mpOutliner->ClearModifyFlag(); + + mpOutliner->GetUndoManager().Clear(); +} + +bool AnnotationTextWindow::Command(const CommandEvent& rCEvt) +{ + if (rCEvt.GetCommand() == CommandEventId::ContextMenu) + { + const bool bReadOnly = mrContents.DocShell()->IsReadOnly(); + if (bReadOnly) + return true; + + SfxDispatcher* pDispatcher = mrContents.DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher(); + if( !pDispatcher ) + return true; + + if (IsMouseCaptured()) + { + // so the menu can capture it and the EditView doesn't get the button release and change its + // selection on a successful button click + ReleaseMouse(); + } + + ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(1, 1)); + weld::Widget* pPopupParent = GetDrawingArea(); + std::unique_ptr xBuilder(Application::CreateBuilder(pPopupParent, "modules/simpress/ui/annotationtagmenu.ui")); + std::unique_ptr xMenu(xBuilder->weld_menu("menu")); + + auto xAnnotation = mrContents.getAnnotation(); + + SvtUserOptions aUserOptions; + OUString sCurrentAuthor( aUserOptions.GetFullName() ); + OUString sAuthor( xAnnotation->getAuthor() ); + + OUString aStr(xMenu->get_label(".uno:DeleteAllAnnotationByAuthor")); + OUString aReplace( sAuthor ); + if( aReplace.isEmpty() ) + aReplace = SdResId( STR_ANNOTATION_NOAUTHOR ); + aStr = aStr.replaceFirst("%1", aReplace); + xMenu->set_label(".uno:DeleteAllAnnotationByAuthor", aStr); + + bool bShowReply = sAuthor != sCurrentAuthor && !bReadOnly; + xMenu->set_visible(".uno:ReplyToAnnotation", bShowReply); + xMenu->set_visible("separator", bShowReply); + xMenu->set_visible(".uno:DeleteAnnotation", xAnnotation.is() && !bReadOnly); + xMenu->set_visible(".uno:DeleteAllAnnotationByAuthor", !bReadOnly); + xMenu->set_visible(".uno:DeleteAllAnnotation", !bReadOnly); + + int nInsertPos = 2; + + auto xFrame = mrContents.DocShell()->GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface(); + OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(xFrame)); + + bool bEditable = !mrContents.IsProtected() && !bReadOnly; + if (bEditable) + { + SfxItemSet aSet(mrContents.GetOutlinerView()->GetAttribs()); + + xMenu->insert(nInsertPos++, ".uno:Bold", + vcl::CommandInfoProvider::GetMenuLabelForCommand( + vcl::CommandInfoProvider::GetCommandProperties(".uno:Bold", aModuleName)), + nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Bold", xFrame), + TRISTATE_TRUE); + + if ( aSet.GetItemState( EE_CHAR_WEIGHT ) == SfxItemState::SET ) + { + if( aSet.Get( EE_CHAR_WEIGHT ).GetWeight() == WEIGHT_BOLD ) + xMenu->set_active(".uno:Bold", true); + } + + xMenu->insert(nInsertPos++, ".uno:Italic", + vcl::CommandInfoProvider::GetMenuLabelForCommand( + vcl::CommandInfoProvider::GetCommandProperties(".uno:Italic", aModuleName)), + nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Italic", xFrame), + TRISTATE_TRUE); + + if ( aSet.GetItemState( EE_CHAR_ITALIC ) == SfxItemState::SET ) + { + if( aSet.Get( EE_CHAR_ITALIC ).GetPosture() != ITALIC_NONE ) + xMenu->set_active(".uno:Italic", true); + + } + + xMenu->insert(nInsertPos++, ".uno:Underline", + vcl::CommandInfoProvider::GetMenuLabelForCommand( + vcl::CommandInfoProvider::GetCommandProperties(".uno:Underline", aModuleName)), + nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Underline", xFrame), + TRISTATE_TRUE); + + if ( aSet.GetItemState( EE_CHAR_UNDERLINE ) == SfxItemState::SET ) + { + if( aSet.Get( EE_CHAR_UNDERLINE ).GetLineStyle() != LINESTYLE_NONE ) + xMenu->set_active(".uno:Underline", true); + } + + xMenu->insert(nInsertPos++, ".uno:Strikeout", + vcl::CommandInfoProvider::GetMenuLabelForCommand( + vcl::CommandInfoProvider::GetCommandProperties(".uno:Strikeout", aModuleName)), + nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Strikeout", xFrame), + TRISTATE_TRUE); + + if ( aSet.GetItemState( EE_CHAR_STRIKEOUT ) == SfxItemState::SET ) + { + if( aSet.Get( EE_CHAR_STRIKEOUT ).GetStrikeout() != STRIKEOUT_NONE ) + xMenu->set_active(".uno:Strikeout", true); + } + + xMenu->insert_separator(nInsertPos++, "separator2"); + } + + xMenu->insert(nInsertPos++, ".uno:Copy", + vcl::CommandInfoProvider::GetMenuLabelForCommand( + vcl::CommandInfoProvider::GetCommandProperties(".uno:Copy", aModuleName)), + nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Copy", xFrame), + TRISTATE_INDET); + + xMenu->insert(nInsertPos++, ".uno:Paste", + vcl::CommandInfoProvider::GetMenuLabelForCommand( + vcl::CommandInfoProvider::GetCommandProperties(".uno:Paste", aModuleName)), + nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Paste", xFrame), + TRISTATE_INDET); + + bool bCanPaste = false; + if (bEditable) + { + TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromClipboard(GetClipboard())); + bCanPaste = aDataHelper.GetFormatCount() != 0; + } + + xMenu->insert_separator(nInsertPos++, "separator3"); + + xMenu->set_sensitive(".uno:Copy", mrContents.GetOutlinerView()->HasSelection()); + xMenu->set_sensitive(".uno:Paste", bCanPaste); + + auto sId = xMenu->popup_at_rect(pPopupParent, aRect); + + if (sId == ".uno:ReplyToAnnotation") + { + const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( xAnnotation ) ); + pDispatcher->ExecuteList(SID_REPLYTO_POSTIT, + SfxCallMode::ASYNCHRON, { &aItem }); + } + else if (sId == ".uno:DeleteAnnotation") + { + const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( xAnnotation ) ); + pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON, + { &aItem }); + } + else if (sId == ".uno:DeleteAllAnnotationByAuthor") + { + const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, sAuthor ); + pDispatcher->ExecuteList( SID_DELETEALLBYAUTHOR_POSTIT, + SfxCallMode::ASYNCHRON, { &aItem }); + } + else if (sId == ".uno:DeleteAllAnnotation") + pDispatcher->Execute( SID_DELETEALL_POSTIT ); + else if (sId == ".uno:Copy") + { + mrContents.GetOutlinerView()->Copy(); + } + else if (sId == ".uno:Paste") + { + mrContents.GetOutlinerView()->PasteSpecial(); + mrContents.DoResize(); + } + else if (!sId.isEmpty()) + { + SfxItemSet aEditAttr(mrContents.GetOutlinerView()->GetAttribs()); + SfxItemSet aNewAttr(mrContents.GetOutliner()->GetEmptyItemSet()); + + if (sId == ".uno:Bold") + { + FontWeight eFW = aEditAttr.Get( EE_CHAR_WEIGHT ).GetWeight(); + aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) ); + } + else if (sId == ".uno:Italic") + { + FontItalic eFI = aEditAttr.Get( EE_CHAR_ITALIC ).GetPosture(); + aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) ); + } + else if (sId == ".uno:Underline") + { + FontLineStyle eFU = aEditAttr. Get( EE_CHAR_UNDERLINE ).GetLineStyle(); + aNewAttr.Put( SvxUnderlineItem( eFU == LINESTYLE_SINGLE ? LINESTYLE_NONE : LINESTYLE_SINGLE, EE_CHAR_UNDERLINE ) ); + } + else if (sId == ".uno:Strikeout") + { + FontStrikeout eFSO = aEditAttr.Get( EE_CHAR_STRIKEOUT ).GetStrikeout(); + aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) ); + } + + mrContents.GetOutlinerView()->SetAttribs( aNewAttr ); + } + + return true; + } + return WeldEditView::Command(rCEvt); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/annotations/annotationwindow.hxx b/sd/source/ui/annotations/annotationwindow.hxx new file mode 100644 index 0000000000..a150ebf1c8 --- /dev/null +++ b/sd/source/ui/annotations/annotationwindow.hxx @@ -0,0 +1,143 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::office { class XAnnotation; } + +class OutlinerView; +class Outliner; +class SvxLanguageItem; +class SdDrawDocument; + +namespace sd { + +class AnnotationManagerImpl; +class DrawDocShell; +class TextApiObject; + +class AnnotationWindow; + +class AnnotationTextWindow : public WeldEditView +{ +private: + AnnotationWindow& mrContents; + +public: + AnnotationTextWindow(AnnotationWindow& rContents); + + virtual EditView* GetEditView() const override; + + virtual EditEngine* GetEditEngine() const override; + + virtual void EditViewScrollStateChange() override; + + void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; + + virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override; + virtual bool KeyInput(const KeyEvent& rKeyEvt) override; + virtual bool Command(const CommandEvent& rCEvt) override; +}; + +class AnnotationWindow final +{ +private: + std::unique_ptr mxBuilder; + std::unique_ptr mxPopover; + std::unique_ptr mxContainer; + + DrawDocShell* mpDocShell; + SdDrawDocument* mpDoc; + + bool mbReadonly; + bool mbProtected; + + css::uno::Reference< css::office::XAnnotation > mxAnnotation; + +public: + Color maColor; + Color maColorDark; + Color maColorLight; + +private: + vcl::Font maLabelFont; + + std::unique_ptr mpOutlinerView; + std::unique_ptr<::Outliner> mpOutliner; + + std::unique_ptr mxVScrollbar; + std::unique_ptr mxTextControl; + std::unique_ptr mxTextControlWin; + std::unique_ptr mxMeta; + std::unique_ptr mxMenuButton; + + DECL_LINK(ScrollHdl, weld::ScrolledWindow&, void); + DECL_LINK(MenuItemSelectedHdl, const OUString&, void); + + void FillMenuButton(); + void InitControls(); + + void SetMapMode(const MapMode& rNewMapMode); + void setAnnotation(const css::uno::Reference& xAnnotation); + + static sal_Int32 GetPrefScrollbarWidth() { return 16; } +public: + AnnotationWindow(weld::Window* pParent, const ::tools::Rectangle& rRect, DrawDocShell* pDocShell, + const css::uno::Reference& xAnnotation); + + void connect_closed(const Link& rLink) { mxPopover->connect_closed(rLink); } + + void DoResize(); + void ResizeIfNecessary(::tools::Long aOldHeight, ::tools::Long aNewHeight); + void SetScrollbar(); + void StartEdit(); + + const css::uno::Reference& getAnnotation() const { return mxAnnotation; } + + void SaveToDocument(); + + ::tools::Long GetPostItTextHeight(); + + DrawDocShell* DocShell() { return mpDocShell; } + + void SetLanguage(const SvxLanguageItem &aNewItem); + + void Rescale(); + + void ToggleInsMode(); + + bool IsProtected() const { return mbProtected; } + + OutlinerView* GetOutlinerView() { return mpOutlinerView.get();} + ::Outliner* GetOutliner() { return mpOutliner.get();} + ~AnnotationWindow(); + + void SetColor(); +}; + +TextApiObject* getTextApiObject( const css::uno::Reference< css::office::XAnnotation >& xAnnotation ); + + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/optsitem.cxx b/sd/source/ui/app/optsitem.cxx new file mode 100644 index 0000000000..9fd8d453bb --- /dev/null +++ b/sd/source/ui/app/optsitem.cxx @@ -0,0 +1,1399 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::utl; +using namespace ::com::sun::star::uno; + +template< class T > static T getSafeValue( const Any& rAny ) +{ + T value = T(); + bool bOk = (rAny >>= value); + + DBG_ASSERT( bOk, "SdOptionsItem, wrong type from configuration!" ); + + return value; +} + + +SdOptionsItem::SdOptionsItem( const SdOptionsGeneric& rParent, const OUString& rSubTree ) : + ConfigItem ( rSubTree ), + mrParent ( rParent ) +{ +} + +SdOptionsItem::~SdOptionsItem() +{ +} + +void SdOptionsItem::ImplCommit() +{ + if( IsModified() ) + mrParent.Commit( *this ); +}; + +void SdOptionsItem::Notify( const css::uno::Sequence& ) +{} + +Sequence< Any > SdOptionsItem::GetProperties( const Sequence< OUString >& rNames ) +{ + return ConfigItem::GetProperties( rNames ); +} + +bool SdOptionsItem::PutProperties( const Sequence< OUString >& rNames, const Sequence< Any>& rValues ) +{ + return ConfigItem::PutProperties( rNames, rValues ); +} + +SdOptionsGeneric::SdOptionsGeneric(bool bImpress, const OUString& rSubTree) + : maSubTree(rSubTree) + , mbImpress(bImpress) + , mbInit(rSubTree.isEmpty()) + , mbEnableModify(false) +{ +} + +SdOptionsGeneric::SdOptionsGeneric(SdOptionsGeneric const & rSource) +{ + operator=(rSource); +} + +SdOptionsGeneric& SdOptionsGeneric::operator=(SdOptionsGeneric const & rSource) +{ + if (this != &rSource) + { + maSubTree = rSource.maSubTree; + mpCfgItem.reset(rSource.mpCfgItem ? new SdOptionsItem(*rSource.mpCfgItem) : nullptr ); + mbImpress = rSource.mbImpress; + mbInit = rSource.mbInit; + mbEnableModify = rSource.mbEnableModify; + } + return *this; +} + +void SdOptionsGeneric::Init() const +{ + if( mbInit ) + return; + + SdOptionsGeneric* pThis = const_cast(this); + + if( !mpCfgItem ) + pThis->mpCfgItem.reset( new SdOptionsItem( *this, maSubTree ) ); + assert(mpCfgItem && "mpCfgItem is set by now"); + + const Sequence< OUString > aNames( GetPropertyNames() ); + const Sequence< Any > aValues = mpCfgItem->GetProperties( aNames ); + + if( aNames.hasElements() && ( aValues.getLength() == aNames.getLength() ) ) + { + const Any* pValues = aValues.getConstArray(); + + pThis->EnableModify( false ); + pThis->mbInit = pThis->ReadData( pValues ); + pThis->EnableModify( true ); + } + else + pThis->mbInit = true; +} + +SdOptionsGeneric::~SdOptionsGeneric() +{ +} + +void SdOptionsGeneric::Commit( SdOptionsItem& rCfgItem ) const +{ + const Sequence< OUString > aNames( GetPropertyNames() ); + Sequence< Any > aValues( aNames.getLength() ); + + if( aNames.hasElements() ) + { + if( WriteData( aValues.getArray() ) ) + rCfgItem.PutProperties( aNames, aValues ); + else + { + OSL_FAIL( "PutProperties failed" ); + } + } +} + +Sequence< OUString > SdOptionsGeneric::GetPropertyNames() const +{ + sal_uLong nCount; + const char** ppPropNames; + + GetPropNameArray( ppPropNames, nCount ); + + Sequence< OUString > aNames( nCount ); + OUString* pNames = aNames.getArray(); + + for( sal_uLong i = 0; i < nCount; i++ ) + pNames[ i ] = OUString::createFromAscii( ppPropNames[ i ] ); + + return aNames; +} + +void SdOptionsGeneric::Store() +{ + if( mpCfgItem ) + mpCfgItem->Commit(); +} + +bool SdOptionsGeneric::isMetricSystem() +{ + SvtSysLocale aSysLocale; + MeasurementSystem eSys = aSysLocale.GetLocaleData().getMeasurementSystemEnum(); + + return ( eSys == MeasurementSystem::Metric ); +} + +/************************************************************************* +|* +|* SdOptionsLayout +|* +\************************************************************************/ + +SdOptionsLayout::SdOptionsLayout(bool bImpress, bool bUseConfig) : + SdOptionsGeneric( bImpress, bUseConfig ? + ( bImpress ? + OUString( "Office.Impress/Layout" ) : + OUString( "Office.Draw/Layout" ) ) : + OUString() ), + bRuler( true ), + bMoveOutline( true ), + bDragStripes( false ), + bHandlesBezier( false ), + bHelplines( true ), + nMetric(static_cast(isMetricSystem() ? FieldUnit::CM : FieldUnit::INCH)), + nDefTab( 1250 ) +{ + EnableModify( true ); +} + +bool SdOptionsLayout::operator==( const SdOptionsLayout& rOpt ) const +{ + return( IsRulerVisible() == rOpt.IsRulerVisible() && + IsMoveOutline() == rOpt.IsMoveOutline() && + IsDragStripes() == rOpt.IsDragStripes() && + IsHandlesBezier() == rOpt.IsHandlesBezier() && + IsHelplines() == rOpt.IsHelplines() && + GetMetric() == rOpt.GetMetric() && + GetDefTab() == rOpt.GetDefTab() ); +} + +void SdOptionsLayout::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + if( isMetricSystem() ) + { + static const char* aPropNamesMetric[] = + { + "Display/Ruler", + "Display/Bezier", + "Display/Contour", + "Display/Guide", + "Display/Helpline", + "Other/MeasureUnit/Metric", + "Other/TabStop/Metric" + }; + ppNames = aPropNamesMetric; + rCount = SAL_N_ELEMENTS(aPropNamesMetric); + } + else + { + static const char* aPropNamesNonMetric[] = + { + "Display/Ruler", + "Display/Bezier", + "Display/Contour", + "Display/Guide", + "Display/Helpline", + "Other/MeasureUnit/NonMetric", + "Other/TabStop/NonMetric" + }; + ppNames = aPropNamesNonMetric; + rCount = SAL_N_ELEMENTS(aPropNamesNonMetric); + } +} + +bool SdOptionsLayout::ReadData( const Any* pValues ) +{ + if( pValues[0].hasValue() ) SetRulerVisible( *o3tl::doAccess(pValues[ 0 ]) ); + if( pValues[1].hasValue() ) SetHandlesBezier( *o3tl::doAccess(pValues[ 1 ]) ); + if( pValues[2].hasValue() ) SetMoveOutline( *o3tl::doAccess(pValues[ 2 ]) ); + if( pValues[3].hasValue() ) SetDragStripes( *o3tl::doAccess(pValues[ 3 ]) ); + if( pValues[4].hasValue() ) SetHelplines( *o3tl::doAccess(pValues[ 4 ]) ); + if( pValues[5].hasValue() ) SetMetric( static_cast(*o3tl::doAccess(pValues[ 5 ])) ); + if( pValues[6].hasValue() ) SetDefTab( static_cast(*o3tl::doAccess(pValues[ 6 ])) ); + + return true; +} + +bool SdOptionsLayout::WriteData( Any* pValues ) const +{ + pValues[ 0 ] <<= IsRulerVisible(); + pValues[ 1 ] <<= IsHandlesBezier(); + pValues[ 2 ] <<= IsMoveOutline(); + pValues[ 3 ] <<= IsDragStripes(); + pValues[ 4 ] <<= IsHelplines(); + pValues[ 5 ] <<= static_cast(GetMetric()); + pValues[ 6 ] <<= static_cast(GetDefTab()); + + return true; +} + +/************************************************************************* +|* +|* SdOptionsLayoutItem +|* +\************************************************************************/ + +SdOptionsLayoutItem::SdOptionsLayoutItem() +: SfxPoolItem ( ATTR_OPTIONS_LAYOUT ) +, maOptionsLayout ( false, false ) +{ +} + +SdOptionsLayoutItem::SdOptionsLayoutItem( SdOptions const * pOpts, ::sd::FrameView const * pView ) +: SfxPoolItem ( ATTR_OPTIONS_LAYOUT ) +, maOptionsLayout ( false, false ) +{ + if( pOpts ) + { + maOptionsLayout.SetMetric( pOpts->GetMetric() ); + maOptionsLayout.SetDefTab( pOpts->GetDefTab() ); + } + + if( pView ) + { + maOptionsLayout.SetRulerVisible( pView->HasRuler() ); + maOptionsLayout.SetMoveOutline( !pView->IsNoDragXorPolys() ); + maOptionsLayout.SetDragStripes( pView->IsDragStripes() ); + maOptionsLayout.SetHandlesBezier( pView->IsPlusHandlesAlwaysVisible() ); + maOptionsLayout.SetHelplines( pView->IsHlplVisible() ); + } + else if( pOpts ) + { + maOptionsLayout.SetRulerVisible( pOpts->IsRulerVisible() ); + maOptionsLayout.SetMoveOutline( pOpts->IsMoveOutline() ); + maOptionsLayout.SetDragStripes( pOpts->IsDragStripes() ); + maOptionsLayout.SetHandlesBezier( pOpts->IsHandlesBezier() ); + maOptionsLayout.SetHelplines( pOpts->IsHelplines() ); + } +} + +SdOptionsLayoutItem* SdOptionsLayoutItem::Clone( SfxItemPool* ) const +{ + return new SdOptionsLayoutItem( *this ); +} + +bool SdOptionsLayoutItem::operator==( const SfxPoolItem& rAttr ) const +{ + assert(SfxPoolItem::operator==(rAttr)); + return maOptionsLayout == static_cast(rAttr).maOptionsLayout; +} + +void SdOptionsLayoutItem::SetOptions( SdOptions* pOpts ) const +{ + if( pOpts ) + { + pOpts->SetRulerVisible( maOptionsLayout.IsRulerVisible() ); + pOpts->SetMoveOutline( maOptionsLayout.IsMoveOutline() ); + pOpts->SetDragStripes( maOptionsLayout.IsDragStripes() ); + pOpts->SetHandlesBezier( maOptionsLayout.IsHandlesBezier() ); + pOpts->SetHelplines( maOptionsLayout.IsHelplines() ); + pOpts->SetMetric( maOptionsLayout.GetMetric() ); + pOpts->SetDefTab( maOptionsLayout.GetDefTab() ); + } +} + +/************************************************************************* +|* +|* SdOptionsContents +|* +\************************************************************************/ + +SdOptionsContents::SdOptionsContents(bool bImpress) : + SdOptionsGeneric( bImpress, bImpress ? + OUString( "Office.Impress/Content" ) : + OUString( "Office.Draw/Content" ) ) +{ + EnableModify( true ); +} + +bool SdOptionsContents::operator==(const SdOptionsContents&) const +{ + return true; +} + +void SdOptionsContents::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + static const char* aPropNames[] = + { + "Display/PicturePlaceholder", + "Display/ContourMode", + "Display/LineContour", + "Display/TextPlaceholder" + }; + + rCount = SAL_N_ELEMENTS(aPropNames); + ppNames = aPropNames; +} + +bool SdOptionsContents::ReadData(const Any*) +{ + return true; +} + +bool SdOptionsContents::WriteData( Any* pValues ) const +{ + //#i80528# no draft anymore + pValues[ 0 ] <<= false; + pValues[ 1 ] <<= false; + pValues[ 2 ] <<= false; + pValues[ 3 ] <<= false; + + return true; +} +/************************************************************************* +|* +|* SdOptionsMisc +|* +\************************************************************************/ + +SdOptionsMisc::SdOptionsMisc( bool bImpress, bool bUseConfig ) : + SdOptionsGeneric( bImpress, bUseConfig ? + ( bImpress ? + OUString( "Office.Impress/Misc" ) : + OUString( "Office.Draw/Misc" ) ) : + OUString() ), + nDefaultObjectSizeWidth(8000), + nDefaultObjectSizeHeight(5000), + bStartWithTemplate( false ), + bMarkedHitMovesAlways( true ), + bMoveOnlyDragging( false ), + bCrookNoContortion( false ), + bQuickEdit( IsImpress() ), + bMasterPageCache( true ), + bDragWithCopy( false ), + bPickThrough( true ), + bDoubleClickTextEdit( true ), + bClickChangeRotation( false ), + bSolidDragging( true ), + bSummationOfParagraphs( false ), + bTabBarVisible( true ), + bShowUndoDeleteWarning( true ), + bSlideshowRespectZOrder( true ), + bShowComments( true ), + bPreviewNewEffects( true ), + bPreviewChangedEffects( false ), + bPreviewTransitions( true ), + mnDisplay( 0 ), + mnPenColor( 0xff0000 ), + mnPenWidth( 150.0 ), + + // The default for 6.1-and-above documents is to use printer-independent + // formatting. + mnPrinterIndependentLayout (1), + mnDragThresholdPixels(6) +{ + EnableModify( true ); +} + +bool SdOptionsMisc::operator==( const SdOptionsMisc& rOpt ) const +{ + return( IsStartWithTemplate() == rOpt.IsStartWithTemplate() && + IsMarkedHitMovesAlways() == rOpt.IsMarkedHitMovesAlways() && + IsMoveOnlyDragging() == rOpt.IsMoveOnlyDragging() && + IsCrookNoContortion() == rOpt.IsCrookNoContortion() && + IsQuickEdit() == rOpt.IsQuickEdit() && + IsMasterPagePaintCaching() == rOpt.IsMasterPagePaintCaching() && + IsDragWithCopy() == rOpt.IsDragWithCopy() && + IsPickThrough() == rOpt.IsPickThrough() && + IsDoubleClickTextEdit() == rOpt.IsDoubleClickTextEdit() && + IsClickChangeRotation() == rOpt.IsClickChangeRotation() && + IsSummationOfParagraphs() == rOpt.IsSummationOfParagraphs() && + IsTabBarVisible() == rOpt.IsTabBarVisible() && + IsSolidDragging() == rOpt.IsSolidDragging() && + IsShowUndoDeleteWarning() == rOpt.IsShowUndoDeleteWarning() && + IsSlideshowRespectZOrder() == rOpt.IsSlideshowRespectZOrder() && + GetPrinterIndependentLayout() == rOpt.GetPrinterIndependentLayout() && + GetDefaultObjectSizeWidth() == rOpt.GetDefaultObjectSizeWidth() && + GetDefaultObjectSizeHeight() == rOpt.GetDefaultObjectSizeHeight() && + + IsPreviewNewEffects() == rOpt.IsPreviewNewEffects() && + IsPreviewChangedEffects() == rOpt.IsPreviewChangedEffects() && + IsPreviewTransitions() == rOpt.IsPreviewTransitions() && + GetDisplay() == rOpt.GetDisplay() && + IsShowComments() == rOpt.IsShowComments() && + GetPresentationPenColor() == rOpt.GetPresentationPenColor() && + GetPresentationPenWidth() == rOpt.GetPresentationPenWidth() && + GetDragThresholdPixels() == rOpt.GetDragThresholdPixels() + ); +} + +void SdOptionsMisc::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + static const char* aPropNames[] = + { + "ObjectMoveable", + "NoDistort", + "TextObject/QuickEditing", + "BackgroundCache", + "CopyWhileMoving", + "TextObject/Selectable", + "DclickTextedit", + "RotateClick", + "Preview", + "ModifyWithAttributes", + "DefaultObjectSize/Width", + "DefaultObjectSize/Height", + + "Compatibility/PrinterIndependentLayout", + + "ShowComments", + "DragThresholdPixels", + + // just for impress + "NewDoc/AutoPilot", + "Compatibility/AddBetween", + "ShowUndoDeleteWarning", + "SlideshowRespectZOrder", + + "PreviewNewEffects", + "PreviewChangedEffects", + "PreviewTransitions", + + "Display", + + "PenColor", + "PenWidth", + "TabBarVisible" + }; + + rCount = ( IsImpress() ? SAL_N_ELEMENTS(aPropNames) : 16 ); + ppNames = aPropNames; +} + +bool SdOptionsMisc::ReadData( const Any* pValues ) +{ + if( pValues[0].hasValue() ) SetMarkedHitMovesAlways( *o3tl::doAccess(pValues[ 0 ]) ); + if( pValues[1].hasValue() ) SetCrookNoContortion( *o3tl::doAccess(pValues[ 1 ]) ); + if( pValues[2].hasValue() ) SetQuickEdit( *o3tl::doAccess(pValues[ 2 ]) ); + if( pValues[3].hasValue() ) SetMasterPagePaintCaching( *o3tl::doAccess(pValues[ 3 ]) ); + if( pValues[4].hasValue() ) SetDragWithCopy( *o3tl::doAccess(pValues[ 4 ]) ); + if( pValues[5].hasValue() ) SetPickThrough( *o3tl::doAccess(pValues[ 5 ]) ); + if( pValues[6].hasValue() ) SetDoubleClickTextEdit( *o3tl::doAccess(pValues[ 6 ]) ); + if( pValues[7].hasValue() ) SetClickChangeRotation( *o3tl::doAccess(pValues[ 7 ]) ); + if( pValues[9].hasValue() ) SetSolidDragging( *o3tl::doAccess(pValues[ 9 ]) ); + if( pValues[10].hasValue() ) SetDefaultObjectSizeWidth( *o3tl::doAccess(pValues[ 10 ]) ); + if( pValues[11].hasValue() ) SetDefaultObjectSizeHeight( *o3tl::doAccess(pValues[ 11 ]) ); + if( pValues[12].hasValue() ) SetPrinterIndependentLayout( *o3tl::doAccess(pValues[ 12 ]) ); + + if( pValues[13].hasValue() ) + SetShowComments( *o3tl::doAccess(pValues[ 13 ]) ); + if (pValues[14].hasValue()) + SetDragThreshold(*o3tl::doAccess(pValues[ 14 ])); + + // just for Impress + if (IsImpress()) + { + if( pValues[15].hasValue() ) + SetStartWithTemplate( *o3tl::doAccess(pValues[ 15 ]) ); + if( pValues[16].hasValue() ) + SetSummationOfParagraphs( *o3tl::doAccess(pValues[ 16 ]) ); + if( pValues[17].hasValue() ) + SetShowUndoDeleteWarning( *o3tl::doAccess(pValues[ 17 ]) ); + + if( pValues[18].hasValue() ) + SetSlideshowRespectZOrder(*o3tl::doAccess(pValues[ 18 ])); + + if( pValues[19].hasValue() ) + SetPreviewNewEffects(*o3tl::doAccess(pValues[ 19 ])); + + if( pValues[20].hasValue() ) + SetPreviewChangedEffects(*o3tl::doAccess(pValues[ 20 ])); + + if( pValues[21].hasValue() ) + SetPreviewTransitions(*o3tl::doAccess(pValues[ 21 ])); + + if( pValues[22].hasValue() ) + SetDisplay(*o3tl::doAccess(pValues[ 22 ])); + + if( pValues[23].hasValue() ) + SetPresentationPenColor( getSafeValue< sal_Int32 >( pValues[ 23 ] ) ); + + if( pValues[24].hasValue() ) + SetPresentationPenWidth( getSafeValue< double >( pValues[ 24 ] ) ); + + if( pValues[25].hasValue() ) { + SetTabBarVisible( *o3tl::doAccess(pValues[ 25 ]) ); + } + } + + return true; +} + +bool SdOptionsMisc::WriteData( Any* pValues ) const +{ + pValues[ 0 ] <<= IsMarkedHitMovesAlways(); + pValues[ 1 ] <<= IsCrookNoContortion(); + pValues[ 2 ] <<= IsQuickEdit(); + pValues[ 3 ] <<= IsMasterPagePaintCaching(); + pValues[ 4 ] <<= IsDragWithCopy(); + pValues[ 5 ] <<= IsPickThrough(); + pValues[ 6 ] <<= IsDoubleClickTextEdit(); + pValues[ 7 ] <<= IsClickChangeRotation(); + // The preview is not supported anymore. Use a dummy value. + pValues[ 8 ] <<= double(0);// GetPreviewQuality(); + pValues[ 9 ] <<= IsSolidDragging(); + pValues[ 10 ] <<= GetDefaultObjectSizeWidth(); + pValues[ 11 ] <<= GetDefaultObjectSizeHeight(); + pValues[ 12 ] <<= GetPrinterIndependentLayout(); + pValues[ 13 ] <<= IsShowComments(); + pValues[ 14 ] <<= GetDragThresholdPixels(); + + // just for Impress + if (IsImpress()) + { + pValues[ 15 ] <<= IsStartWithTemplate(); + pValues[ 16 ] <<= IsSummationOfParagraphs(); + pValues[ 17 ] <<= IsShowUndoDeleteWarning(); + pValues[ 18 ] <<= IsSlideshowRespectZOrder(); + + pValues[ 19 ] <<= IsPreviewNewEffects(); + pValues[ 20 ] <<= IsPreviewChangedEffects(); + pValues[ 21 ] <<= IsPreviewTransitions(); + + pValues[ 22 ] <<= GetDisplay(); + + pValues[ 23 ] <<= GetPresentationPenColor(); + pValues[ 24 ] <<= GetPresentationPenWidth(); + pValues[ 25 ] <<= IsTabBarVisible(); + } + + return true; +} + +/************************************************************************* +|* +|* SdOptionsMiscItem +|* +\************************************************************************/ + +SdOptionsMiscItem::SdOptionsMiscItem() +: SfxPoolItem ( ATTR_OPTIONS_MISC ) +, maOptionsMisc ( false, false ) +{ +} + +SdOptionsMiscItem::SdOptionsMiscItem( SdOptions const * pOpts, ::sd::FrameView const * pView ) +: SfxPoolItem ( ATTR_OPTIONS_MISC ) +, maOptionsMisc ( false, false ) +{ + if( pOpts ) + { + maOptionsMisc.SetStartWithTemplate( pOpts->IsStartWithTemplate() ); + maOptionsMisc.SetSummationOfParagraphs( pOpts->IsSummationOfParagraphs() ); + maOptionsMisc.SetTabBarVisible( pOpts->IsTabBarVisible() ); + maOptionsMisc.SetShowUndoDeleteWarning( pOpts->IsShowUndoDeleteWarning() ); + maOptionsMisc.SetPrinterIndependentLayout( pOpts->GetPrinterIndependentLayout() ); + maOptionsMisc.SetDefaultObjectSizeWidth( pOpts->GetDefaultObjectSizeWidth() ); + maOptionsMisc.SetDefaultObjectSizeHeight( pOpts->GetDefaultObjectSizeHeight() ); + + maOptionsMisc.SetPreviewNewEffects(pOpts->IsPreviewNewEffects()); + maOptionsMisc.SetPreviewChangedEffects(pOpts->IsPreviewChangedEffects()); + maOptionsMisc.SetPreviewTransitions(pOpts->IsPreviewTransitions()); + + maOptionsMisc.SetDisplay(pOpts->GetDisplay()); + maOptionsMisc.SetShowComments( pOpts->IsShowComments() ); + + maOptionsMisc.SetPresentationPenColor(pOpts->GetPresentationPenColor() ); + maOptionsMisc.SetPresentationPenWidth(pOpts->GetPresentationPenWidth() ); + } + + if( pView ) + { + maOptionsMisc.SetMarkedHitMovesAlways( pView->IsMarkedHitMovesAlways() ); + maOptionsMisc.SetMoveOnlyDragging( pView->IsMoveOnlyDragging() ); + maOptionsMisc.SetCrookNoContortion( pView->IsCrookNoContortion() ); + maOptionsMisc.SetQuickEdit( pView->IsQuickEdit() ); + + // #i26631# + maOptionsMisc.SetMasterPagePaintCaching( pView->IsMasterPagePaintCaching() ); + + maOptionsMisc.SetDragWithCopy( pView->IsDragWithCopy() ); + maOptionsMisc.SetPickThrough(pView->GetModel().IsPickThroughTransparentTextFrames()); + maOptionsMisc.SetDoubleClickTextEdit( pView->IsDoubleClickTextEdit() ); + maOptionsMisc.SetClickChangeRotation( pView->IsClickChangeRotation() ); + maOptionsMisc.SetSolidDragging( pView->IsSolidDragging() ); + maOptionsMisc.SetDragThreshold(pView->GetDragThresholdPixels()); + } + else if( pOpts ) + { + maOptionsMisc.SetMarkedHitMovesAlways( pOpts->IsMarkedHitMovesAlways() ); + maOptionsMisc.SetMoveOnlyDragging( pOpts->IsMoveOnlyDragging() ); + maOptionsMisc.SetCrookNoContortion( pOpts->IsCrookNoContortion() ); + maOptionsMisc.SetQuickEdit( pOpts->IsQuickEdit() ); + maOptionsMisc.SetMasterPagePaintCaching( pOpts->IsMasterPagePaintCaching() ); + maOptionsMisc.SetDragWithCopy( pOpts->IsDragWithCopy() ); + maOptionsMisc.SetPickThrough( pOpts->IsPickThrough() ); + maOptionsMisc.SetDoubleClickTextEdit( pOpts->IsDoubleClickTextEdit() ); + maOptionsMisc.SetClickChangeRotation( pOpts->IsClickChangeRotation() ); + maOptionsMisc.SetSolidDragging( pOpts->IsSolidDragging() ); + maOptionsMisc.SetDragThreshold(pOpts->GetDragThresholdPixels()); + } +} + +SdOptionsMiscItem* SdOptionsMiscItem::Clone( SfxItemPool* ) const +{ + return new SdOptionsMiscItem( *this ); +} + +bool SdOptionsMiscItem::operator==( const SfxPoolItem& rAttr ) const +{ + assert(SfxPoolItem::operator==(rAttr)); + return maOptionsMisc == static_cast(rAttr).maOptionsMisc; +} + +void SdOptionsMiscItem::SetOptions( SdOptions* pOpts ) const +{ + if( !pOpts ) + return; + + pOpts->SetStartWithTemplate( maOptionsMisc.IsStartWithTemplate() ); + pOpts->SetMarkedHitMovesAlways( maOptionsMisc.IsMarkedHitMovesAlways() ); + pOpts->SetMoveOnlyDragging( maOptionsMisc.IsMoveOnlyDragging() ); + pOpts->SetCrookNoContortion( maOptionsMisc.IsCrookNoContortion() ); + pOpts->SetQuickEdit( maOptionsMisc.IsQuickEdit() ); + pOpts->SetMasterPagePaintCaching( maOptionsMisc.IsMasterPagePaintCaching() ); + pOpts->SetDragWithCopy( maOptionsMisc.IsDragWithCopy() ); + pOpts->SetPickThrough( maOptionsMisc.IsPickThrough() ); + pOpts->SetDoubleClickTextEdit( maOptionsMisc.IsDoubleClickTextEdit() ); + pOpts->SetClickChangeRotation( maOptionsMisc.IsClickChangeRotation() ); + pOpts->SetSummationOfParagraphs( maOptionsMisc.IsSummationOfParagraphs() ); + pOpts->SetTabBarVisible( maOptionsMisc.IsTabBarVisible() ); + + pOpts->SetSolidDragging( maOptionsMisc.IsSolidDragging() ); + pOpts->SetShowUndoDeleteWarning( maOptionsMisc.IsShowUndoDeleteWarning() ); + pOpts->SetPrinterIndependentLayout( maOptionsMisc.GetPrinterIndependentLayout() ); + pOpts->SetShowComments( maOptionsMisc.IsShowComments() ); + pOpts->SetDefaultObjectSizeWidth( maOptionsMisc.GetDefaultObjectSizeWidth() ); + pOpts->SetDefaultObjectSizeHeight( maOptionsMisc.GetDefaultObjectSizeHeight() ); + + pOpts->SetPreviewNewEffects( maOptionsMisc.IsPreviewNewEffects() ); + pOpts->SetPreviewChangedEffects( maOptionsMisc.IsPreviewChangedEffects() ); + pOpts->SetPreviewTransitions( maOptionsMisc.IsPreviewTransitions() ); + + pOpts->SetDisplay( maOptionsMisc.GetDisplay() ); + + pOpts->SetPresentationPenColor( maOptionsMisc.GetPresentationPenColor() ); + pOpts->SetPresentationPenWidth( maOptionsMisc.GetPresentationPenWidth() ); + + pOpts->SetDragThreshold( maOptionsMisc.GetDragThresholdPixels() ); +} + +/************************************************************************* +|* +|* SdOptionsSnap +|* +\************************************************************************/ + +SdOptionsSnap::SdOptionsSnap( bool bImpress, bool bUseConfig ) : + SdOptionsGeneric( bImpress, bUseConfig ? + ( bImpress ? + OUString( "Office.Impress/Snap" ) : + OUString( "Office.Draw/Snap" ) ) : + OUString() ), + bSnapHelplines( true ), + bSnapBorder( true ), + bSnapFrame( false ), + bSnapPoints( false ), + bOrtho( false ), + bBigOrtho( true ), + bRotate( false ), + nSnapArea( 5 ), + nAngle( 1500 ), + nBezAngle( 1500 ) + +{ + EnableModify( true ); +} + +bool SdOptionsSnap::operator==( const SdOptionsSnap& rOpt ) const +{ + return( IsSnapHelplines() == rOpt.IsSnapHelplines() && + IsSnapBorder() == rOpt.IsSnapBorder() && + IsSnapFrame() == rOpt.IsSnapFrame() && + IsSnapPoints() == rOpt.IsSnapPoints() && + IsOrtho() == rOpt.IsOrtho() && + IsBigOrtho() == rOpt.IsBigOrtho() && + IsRotate() == rOpt.IsRotate() && + GetSnapArea() == rOpt.GetSnapArea() && + GetAngle() == rOpt.GetAngle() && + GetEliminatePolyPointLimitAngle() == rOpt.GetEliminatePolyPointLimitAngle() ); +} + +void SdOptionsSnap::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + static const char* aPropNames[] = + { + "Object/SnapLine", + "Object/PageMargin", + "Object/ObjectFrame", + "Object/ObjectPoint", + "Position/CreatingMoving", + "Position/ExtendEdges", + "Position/Rotating", + "Object/Range", + "Position/RotatingValue", + "Position/PointReduction" + }; + + rCount = SAL_N_ELEMENTS(aPropNames); + ppNames = aPropNames; +} + +bool SdOptionsSnap::ReadData( const Any* pValues ) +{ + if( pValues[0].hasValue() ) SetSnapHelplines( *o3tl::doAccess(pValues[ 0 ]) ); + if( pValues[1].hasValue() ) SetSnapBorder( *o3tl::doAccess(pValues[ 1 ]) ); + if( pValues[2].hasValue() ) SetSnapFrame( *o3tl::doAccess(pValues[ 2 ]) ); + if( pValues[3].hasValue() ) SetSnapPoints( *o3tl::doAccess(pValues[ 3 ]) ); + if( pValues[4].hasValue() ) SetOrtho( *o3tl::doAccess(pValues[ 4 ]) ); + if( pValues[5].hasValue() ) SetBigOrtho( *o3tl::doAccess(pValues[ 5 ]) ); + if( pValues[6].hasValue() ) SetRotate( *o3tl::doAccess(pValues[ 6 ]) ); + if( pValues[7].hasValue() ) SetSnapArea( static_cast(*o3tl::doAccess(pValues[ 7 ])) ); + if( pValues[8].hasValue() ) SetAngle( Degree100(*o3tl::doAccess(pValues[ 8 ])) ); + if( pValues[9].hasValue() ) SetEliminatePolyPointLimitAngle( Degree100(*o3tl::doAccess(pValues[ 9 ])) ); + + return true; +} + +bool SdOptionsSnap::WriteData( Any* pValues ) const +{ + pValues[ 0 ] <<= IsSnapHelplines(); + pValues[ 1 ] <<= IsSnapBorder(); + pValues[ 2 ] <<= IsSnapFrame(); + pValues[ 3 ] <<= IsSnapPoints(); + pValues[ 4 ] <<= IsOrtho(); + pValues[ 5 ] <<= IsBigOrtho(); + pValues[ 6 ] <<= IsRotate(); + pValues[ 7 ] <<= static_cast(GetSnapArea()); + pValues[ 8 ] <<= static_cast(GetAngle().get()); + pValues[ 9 ] <<= static_cast(GetEliminatePolyPointLimitAngle().get()); + + return true; +} + +/************************************************************************* +|* +|* SdOptionsSnapItem +|* +\************************************************************************/ + +SdOptionsSnapItem::SdOptionsSnapItem() +: SfxPoolItem ( ATTR_OPTIONS_SNAP ) +, maOptionsSnap ( false, false ) +{ +} + +SdOptionsSnapItem::SdOptionsSnapItem( SdOptions const * pOpts, ::sd::FrameView const * pView ) +: SfxPoolItem ( ATTR_OPTIONS_SNAP ) +, maOptionsSnap ( false, false ) +{ + if( pView ) + { + maOptionsSnap.SetSnapHelplines( pView->IsHlplSnap() ); + maOptionsSnap.SetSnapBorder( pView->IsBordSnap() ); + maOptionsSnap.SetSnapFrame( pView->IsOFrmSnap() ); + maOptionsSnap.SetSnapPoints( pView->IsOPntSnap() ); + maOptionsSnap.SetOrtho( pView->IsOrtho() ); + maOptionsSnap.SetBigOrtho( pView->IsBigOrtho() ); + maOptionsSnap.SetRotate( pView->IsAngleSnapEnabled() ); + maOptionsSnap.SetSnapArea( pView->GetSnapMagneticPixel() ); + maOptionsSnap.SetAngle( pView->GetSnapAngle() ); + maOptionsSnap.SetEliminatePolyPointLimitAngle( pView->GetEliminatePolyPointLimitAngle() ); + } + else if( pOpts ) + { + maOptionsSnap.SetSnapHelplines( pOpts->IsSnapHelplines() ); + maOptionsSnap.SetSnapBorder( pOpts->IsSnapBorder() ); + maOptionsSnap.SetSnapFrame( pOpts->IsSnapFrame() ); + maOptionsSnap.SetSnapPoints( pOpts->IsSnapPoints() ); + maOptionsSnap.SetOrtho( pOpts->IsOrtho() ); + maOptionsSnap.SetBigOrtho( pOpts->IsBigOrtho() ); + maOptionsSnap.SetRotate( pOpts->IsRotate() ); + maOptionsSnap.SetSnapArea( pOpts->GetSnapArea() ); + maOptionsSnap.SetAngle( pOpts->GetAngle() ); + maOptionsSnap.SetEliminatePolyPointLimitAngle( pOpts->GetEliminatePolyPointLimitAngle() ); + } +} + +SdOptionsSnapItem* SdOptionsSnapItem::Clone( SfxItemPool* ) const +{ + return new SdOptionsSnapItem( *this ); +} + +bool SdOptionsSnapItem::operator==( const SfxPoolItem& rAttr ) const +{ + assert(SfxPoolItem::operator==(rAttr)); + return maOptionsSnap == static_cast(rAttr).maOptionsSnap; +} + +void SdOptionsSnapItem::SetOptions( SdOptions* pOpts ) const +{ + if( !pOpts ) + return; + + pOpts->SetSnapHelplines( maOptionsSnap.IsSnapHelplines() ); + pOpts->SetSnapBorder( maOptionsSnap.IsSnapBorder() ); + pOpts->SetSnapFrame( maOptionsSnap.IsSnapFrame() ); + pOpts->SetSnapPoints( maOptionsSnap.IsSnapPoints() ); + pOpts->SetOrtho( maOptionsSnap.IsOrtho() ); + pOpts->SetBigOrtho( maOptionsSnap.IsBigOrtho() ); + pOpts->SetRotate( maOptionsSnap.IsRotate() ); + pOpts->SetSnapArea( maOptionsSnap.GetSnapArea() ); + pOpts->SetAngle( maOptionsSnap.GetAngle() ); + pOpts->SetEliminatePolyPointLimitAngle( maOptionsSnap.GetEliminatePolyPointLimitAngle() ); +} + +/************************************************************************* +|* +|* SdOptionsZoom +|* +\************************************************************************/ + +SdOptionsZoom::SdOptionsZoom( bool bImpress ) : + SdOptionsGeneric( bImpress, bImpress ? + OUString() : + OUString("Office.Draw/Zoom") ), + nX( 1 ), + nY( 1 ) + +{ + EnableModify( true ); +} + +void SdOptionsZoom::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + static const char* aPropNames[] = + { + "ScaleX", + "ScaleY" + }; + + rCount = !IsImpress() ? SAL_N_ELEMENTS(aPropNames) : 0; + ppNames = aPropNames; +} + +bool SdOptionsZoom::ReadData( const Any* pValues ) +{ + sal_Int32 x = 1, y = 1; + + if( pValues[0].hasValue() ) x = *o3tl::doAccess(pValues[ 0 ]); + if( pValues[1].hasValue() ) y = *o3tl::doAccess(pValues[ 1 ]); + + SetScale( x, y ); + + return true; +} + +bool SdOptionsZoom::WriteData( Any* pValues ) const +{ + sal_Int32 x, y; + + GetScale( x, y ); + + pValues[ 0 ] <<= x; + pValues[ 1 ] <<= y; + + return true; +} + +/************************************************************************* +|* +|* SdOptionsGrid +|* +\************************************************************************/ + +SdOptionsGrid::SdOptionsGrid(bool bImpress) : + SdOptionsGeneric( bImpress, + bImpress ? + OUString( "Office.Impress/Grid" ) : + OUString( "Office.Draw/Grid" ) + ) +{ + EnableModify( false ); + SetDefaults(); + EnableModify( true ); +} + +SdOptionsGrid::~SdOptionsGrid() +{ +} + +void SdOptionsGrid::SetDefaults() +{ + const sal_uInt32 nVal = 1000; + + SetFieldDivisionX( nVal ); + SetFieldDivisionY( nVal ); + SetFieldDrawX( nVal ); + SetFieldDrawY( nVal ); + SetUseGridSnap( false ); + SetSynchronize( true ); + SetGridVisible( false ); + SetEqualGrid( true ); +} + +void SdOptionsGrid::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + if( isMetricSystem() ) + { + static const char* aPropNamesMetric[] = + { + "Resolution/XAxis/Metric", + "Resolution/YAxis/Metric", + "Subdivision/XAxis", + "Subdivision/YAxis", + "Option/SnapToGrid", + "Option/Synchronize", + "Option/VisibleGrid", + "SnapGrid/Size" + }; + ppNames = aPropNamesMetric; + rCount = SAL_N_ELEMENTS(aPropNamesMetric); + } + else + { + static const char* aPropNamesNonMetric[] = + { + "Resolution/XAxis/NonMetric", + "Resolution/YAxis/NonMetric", + "Subdivision/XAxis", + "Subdivision/YAxis", + "Option/SnapToGrid", + "Option/Synchronize", + "Option/VisibleGrid", + "SnapGrid/Size" + }; + ppNames = aPropNamesNonMetric; + rCount = SAL_N_ELEMENTS(aPropNamesNonMetric); + } +} + +bool SdOptionsGrid::ReadData( const Any* pValues ) +{ + if( pValues[0].hasValue() ) SetFieldDrawX( *o3tl::doAccess(pValues[ 0 ]) ); + if( pValues[1].hasValue() ) SetFieldDrawY( *o3tl::doAccess(pValues[ 1 ]) ); + + if( pValues[2].hasValue() ) + { + const sal_uInt32 nDivX = FRound( *o3tl::doAccess(pValues[ 2 ]) ); + SetFieldDivisionX( SvxOptionsGrid::GetFieldDrawX() / ( nDivX + 1 ) ); + } + + if( pValues[3].hasValue() ) + { + const sal_uInt32 nDivY = FRound( *o3tl::doAccess(pValues[ 3 ]) ); + SetFieldDivisionY( SvxOptionsGrid::GetFieldDrawY() / ( nDivY + 1 ) ); + } + if( pValues[4].hasValue() ) SetUseGridSnap( *o3tl::doAccess(pValues[ 4 ]) ); + if( pValues[5].hasValue() ) SetSynchronize( *o3tl::doAccess(pValues[ 5 ]) ); + if( pValues[6].hasValue() ) SetGridVisible( *o3tl::doAccess(pValues[ 6 ]) ); + if( pValues[7].hasValue() ) SetEqualGrid( *o3tl::doAccess(pValues[ 7 ]) ); + + return true; +} + +bool SdOptionsGrid::WriteData( Any* pValues ) const +{ + pValues[ 0 ] <<= static_cast(GetFieldDrawX()); + pValues[ 1 ] <<= static_cast(GetFieldDrawY()); + pValues[ 2 ] <<= ( GetFieldDivisionX() ? ( static_cast(GetFieldDrawX()) / GetFieldDivisionX() - 1.0 ) : double(0) ); + pValues[ 3 ] <<= ( GetFieldDivisionY() ? ( static_cast(GetFieldDrawY()) / GetFieldDivisionY() - 1.0 ) : double(0) ); + pValues[ 4 ] <<= IsUseGridSnap(); + pValues[ 5 ] <<= IsSynchronize(); + pValues[ 6 ] <<= IsGridVisible(); + pValues[ 7 ] <<= IsEqualGrid(); + + return true; +} + +/************************************************************************* +|* +|* SdOptionsGridItem +|* +\************************************************************************/ + +SdOptionsGridItem::SdOptionsGridItem( SdOptions const * pOpts ) : + SvxGridItem( SID_ATTR_GRID_OPTIONS ) +{ + SetSynchronize( pOpts->IsSynchronize() ); + SetEqualGrid( pOpts->IsEqualGrid() ); + + SetFieldDrawX( pOpts->GetFieldDrawX() ); + SetFieldDrawY( pOpts->GetFieldDrawY() ); + SetFieldDivisionX( pOpts->GetFieldDivisionX() ? ( pOpts->GetFieldDrawX() / pOpts->GetFieldDivisionX() - 1 ) : 0 ); + SetFieldDivisionY( pOpts->GetFieldDivisionY() ? ( pOpts->GetFieldDrawY() / pOpts->GetFieldDivisionY() - 1 ) : 0 ); + SetUseGridSnap( pOpts->IsUseGridSnap() ); + SetGridVisible( pOpts->IsGridVisible() ); +} + +void SdOptionsGridItem::SetOptions( SdOptions* pOpts ) const +{ + pOpts->SetFieldDrawX( GetFieldDrawX() ); + pOpts->SetFieldDivisionX( GetFieldDrawX() / ( GetFieldDivisionX() + 1 ) ); + pOpts->SetFieldDrawY( GetFieldDrawY() ); + pOpts->SetFieldDivisionY( GetFieldDrawY() / ( GetFieldDivisionY() + 1 ) ); + pOpts->SetUseGridSnap( GetUseGridSnap() ); + pOpts->SetSynchronize( GetSynchronize() ); + pOpts->SetGridVisible( GetGridVisible() ); + pOpts->SetEqualGrid( GetEqualGrid() ); +} + +/************************************************************************* +|* +|* SdOptionsPrint +|* +\************************************************************************/ + +SdOptionsPrint::SdOptionsPrint( bool bImpress, bool bUseConfig ) : + SdOptionsGeneric( bImpress, bUseConfig ? + ( bImpress ? + OUString( "Office.Impress/Print" ) : + OUString( "Office.Draw/Print" ) ) : + OUString() ), + bDraw( true ), + bNotes( false ), + bHandout( false ), + bOutline( false ), + bDate( false ), + bTime( false ), + bPagename( false ), + bHiddenPages( true ), + bPagesize( false ), + bPagetile( false ), + bWarningPrinter( true ), + bWarningSize( false ), + bWarningOrientation( false ), + bBooklet( false ), + bFront( true ), + bBack( true ), + bCutPage( false ), + bPaperbin( false ), + mbHandoutHorizontal( true ), + mnHandoutPages( 6 ), + nQuality( 0 ) +{ + EnableModify( true ); +} + +bool SdOptionsPrint::operator==( const SdOptionsPrint& rOpt ) const +{ + return( IsDraw() == rOpt.IsDraw() && + IsNotes() == rOpt.IsNotes() && + IsHandout() == rOpt.IsHandout() && + IsOutline() == rOpt.IsOutline() && + IsDate() == rOpt.IsDate() && + IsTime() == rOpt.IsTime() && + IsPagename() == rOpt.IsPagename() && + IsHiddenPages() == rOpt.IsHiddenPages() && + IsPagesize() == rOpt.IsPagesize() && + IsPagetile() == rOpt.IsPagetile() && + IsWarningPrinter() == rOpt.IsWarningPrinter() && + IsWarningSize() == rOpt.IsWarningSize() && + IsWarningOrientation() == rOpt.IsWarningOrientation() && + IsBooklet() == rOpt.IsBooklet() && + IsFrontPage() == rOpt.IsFrontPage() && + IsBackPage() == rOpt.IsBackPage() && + IsCutPage() == rOpt.IsCutPage() && + IsPaperbin() == rOpt.IsPaperbin() && + GetOutputQuality() == rOpt.GetOutputQuality() && + IsHandoutHorizontal() == rOpt.IsHandoutHorizontal() && + GetHandoutPages() == rOpt.GetHandoutPages() ); +} + +void SdOptionsPrint::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const +{ + if (IsImpress()) + { + static const char* aImpressPropNames[] = + { + "Other/Date", + "Other/Time", + "Other/PageName", + "Other/HiddenPage", + "Page/PageSize", + "Page/PageTile", + // bWarningPrinter + // bWarningSize + // bWarningOrientation + "Page/Booklet", + "Page/BookletFront", + "Page/BookletBack", + // bCutPage + "Other/FromPrinterSetup", + "Other/Quality", + "Content/Presentation", + "Content/Note", + "Content/Handout", + "Content/Outline", + "Other/HandoutHorizontal", + "Other/PagesPerHandout" + }; + rCount = SAL_N_ELEMENTS(aImpressPropNames); + ppNames = aImpressPropNames; + } + else + { + static const char* aDrawPropNames[] = + { + "Other/Date", + "Other/Time", + "Other/PageName", + "Other/HiddenPage", + "Page/PageSize", + "Page/PageTile", + // bWarningPrinter + // bWarningSize + // bWarningOrientation + "Page/Booklet", + "Page/BookletFront", + "Page/BookletBack", + // bCutPage + "Other/FromPrinterSetup", + "Other/Quality", + "Content/Drawing", + }; + rCount = SAL_N_ELEMENTS(aDrawPropNames); + ppNames = aDrawPropNames; + } +} + +bool SdOptionsPrint::ReadData( const Any* pValues ) +{ + if( pValues[0].hasValue() ) SetDate( *o3tl::doAccess(pValues[ 0 ]) ); + if( pValues[1].hasValue() ) SetTime( *o3tl::doAccess(pValues[ 1 ]) ); + if( pValues[2].hasValue() ) SetPagename( *o3tl::doAccess(pValues[ 2 ]) ); + if( pValues[3].hasValue() ) SetHiddenPages( *o3tl::doAccess(pValues[ 3 ]) ); + if( pValues[4].hasValue() ) SetPagesize( *o3tl::doAccess(pValues[ 4 ]) ); + if( pValues[5].hasValue() ) SetPagetile( *o3tl::doAccess(pValues[ 5 ]) ); + if( pValues[6].hasValue() ) SetBooklet( *o3tl::doAccess(pValues[ 6 ]) ); + if( pValues[7].hasValue() ) SetFrontPage( *o3tl::doAccess(pValues[ 7 ]) ); + if( pValues[8].hasValue() ) SetBackPage( *o3tl::doAccess(pValues[ 8 ]) ); + if( pValues[9].hasValue() ) SetPaperbin( *o3tl::doAccess(pValues[ 9 ]) ); + if( pValues[10].hasValue() ) SetOutputQuality( static_cast(*o3tl::doAccess(pValues[ 10 ])) ); + if( pValues[11].hasValue() ) SetDraw( *o3tl::doAccess(pValues[ 11 ]) ); + + // just for impress + if (IsImpress()) + { + if( pValues[12].hasValue() ) SetNotes( *o3tl::doAccess(pValues[ 12 ]) ); + if( pValues[13].hasValue() ) SetHandout( *o3tl::doAccess(pValues[ 13 ]) ); + if( pValues[14].hasValue() ) SetOutline( *o3tl::doAccess(pValues[ 14 ]) ); + if( pValues[15].hasValue() ) SetHandoutHorizontal( *o3tl::doAccess(pValues[15]) ); + if( pValues[16].hasValue() ) SetHandoutPages( static_cast(*o3tl::doAccess(pValues[16])) ); + } + + return true; +} + +bool SdOptionsPrint::WriteData( Any* pValues ) const +{ + pValues[ 0 ] <<= IsDate(); + pValues[ 1 ] <<= IsTime(); + pValues[ 2 ] <<= IsPagename(); + pValues[ 3 ] <<= IsHiddenPages(); + pValues[ 4 ] <<= IsPagesize(); + pValues[ 5 ] <<= IsPagetile(); + pValues[ 6 ] <<= IsBooklet(); + pValues[ 7 ] <<= IsFrontPage(); + pValues[ 8 ] <<= IsBackPage(); + pValues[ 9 ] <<= IsPaperbin(); + pValues[ 10 ] <<= static_cast(GetOutputQuality()); + pValues[ 11 ] <<= IsDraw(); + + // just for impress + if (IsImpress()) + { + pValues[ 12 ] <<= IsNotes(); + pValues[ 13 ] <<= IsHandout(); + pValues[ 14 ] <<= IsOutline(); + pValues[ 15 ] <<= IsHandoutHorizontal(); + pValues[ 16 ] <<= GetHandoutPages(); + } + + return true; +} + +/************************************************************************* +|* +|* SdOptionsPrintItem +|* +\************************************************************************/ + +SdOptionsPrintItem::SdOptionsPrintItem() +: SfxPoolItem ( ATTR_OPTIONS_PRINT ) +, maOptionsPrint ( false, false ) +{ +} + +SdOptionsPrintItem::SdOptionsPrintItem( SdOptions const * pOpts ) +: SfxPoolItem ( ATTR_OPTIONS_PRINT ) +, maOptionsPrint ( false, false ) +{ + if( !pOpts ) + return; + + maOptionsPrint.SetDraw( pOpts->IsDraw() ); + maOptionsPrint.SetNotes( pOpts->IsNotes() ); + maOptionsPrint.SetHandout( pOpts->IsHandout() ); + maOptionsPrint.SetOutline( pOpts->IsOutline() ); + maOptionsPrint.SetDate( pOpts->IsDate() ); + maOptionsPrint.SetTime( pOpts->IsTime() ); + maOptionsPrint.SetPagename( pOpts->IsPagename() ); + maOptionsPrint.SetHiddenPages( pOpts->IsHiddenPages() ); + maOptionsPrint.SetPagesize( pOpts->IsPagesize() ); + maOptionsPrint.SetPagetile( pOpts->IsPagetile() ); + maOptionsPrint.SetWarningPrinter( pOpts->IsWarningPrinter() ); + maOptionsPrint.SetWarningSize( pOpts->IsWarningSize() ); + maOptionsPrint.SetWarningOrientation( pOpts->IsWarningOrientation() ); + maOptionsPrint.SetBooklet( pOpts->IsBooklet() ); + maOptionsPrint.SetFrontPage( pOpts->IsFrontPage() ); + maOptionsPrint.SetBackPage( pOpts->IsBackPage() ); + maOptionsPrint.SetCutPage( pOpts->IsCutPage() ); + maOptionsPrint.SetPaperbin( pOpts->IsPaperbin() ); + maOptionsPrint.SetOutputQuality( pOpts->GetOutputQuality() ); +} + +SdOptionsPrintItem* SdOptionsPrintItem::Clone( SfxItemPool* ) const +{ + return new SdOptionsPrintItem( *this ); +} + +bool SdOptionsPrintItem::operator==( const SfxPoolItem& rAttr ) const +{ + assert(SfxPoolItem::operator==(rAttr)); + return maOptionsPrint == static_cast(rAttr).maOptionsPrint; +} + +void SdOptionsPrintItem::SetOptions( SdOptions* pOpts ) const +{ + if( !pOpts ) + return; + + pOpts->SetDraw( maOptionsPrint.IsDraw() ); + pOpts->SetNotes( maOptionsPrint.IsNotes() ); + pOpts->SetHandout( maOptionsPrint.IsHandout() ); + pOpts->SetOutline( maOptionsPrint.IsOutline() ); + pOpts->SetDate( maOptionsPrint.IsDate() ); + pOpts->SetTime( maOptionsPrint.IsTime() ); + pOpts->SetPagename( maOptionsPrint.IsPagename() ); + pOpts->SetHiddenPages( maOptionsPrint.IsHiddenPages() ); + pOpts->SetPagesize( maOptionsPrint.IsPagesize() ); + pOpts->SetPagetile( maOptionsPrint.IsPagetile() ); + pOpts->SetWarningPrinter( maOptionsPrint.IsWarningPrinter() ); + pOpts->SetWarningSize( maOptionsPrint.IsWarningSize() ); + pOpts->SetWarningOrientation( maOptionsPrint.IsWarningOrientation() ); + pOpts->SetBooklet( maOptionsPrint.IsBooklet() ); + pOpts->SetFrontPage( maOptionsPrint.IsFrontPage() ); + pOpts->SetBackPage( maOptionsPrint.IsBackPage() ); + pOpts->SetCutPage( maOptionsPrint.IsCutPage() ); + pOpts->SetPaperbin( maOptionsPrint.IsPaperbin() ); + pOpts->SetOutputQuality( maOptionsPrint.GetOutputQuality() ); +} + +/************************************************************************* +|* +|* SdOptions +|* +\************************************************************************/ + +SdOptions::SdOptions(bool bImpress) : + SdOptionsLayout( bImpress, true ), + SdOptionsContents( bImpress ), + SdOptionsMisc( bImpress, true ), + SdOptionsSnap( bImpress, true ), + SdOptionsZoom( bImpress ), + SdOptionsGrid( bImpress ), + SdOptionsPrint( bImpress, true ) +{ +} + +SdOptions::~SdOptions() +{ +} + +void SdOptions::StoreConfig() +{ + SdOptionsLayout::Store(); + SdOptionsContents::Store(); + SdOptionsMisc::Store(); + SdOptionsSnap::Store(); + SdOptionsZoom::Store(); + SdOptionsGrid::Store(); + SdOptionsPrint::Store(); +} + +sal_Int32 SdOptionsMisc::GetDragThresholdPixels() const +{ + Init(); + return mnDragThresholdPixels; +} + +void SdOptionsMisc::SetDragThreshold(sal_Int32 nDragThresholdPixels) +{ + if (mnDragThresholdPixels != nDragThresholdPixels) + { + OptionsChanged(); + mnDragThresholdPixels = nDragThresholdPixels; + } +} + +sal_Int32 SdOptionsMisc::GetDisplay() const +{ + Init(); + return mnDisplay; +} + +void SdOptionsMisc::SetDisplay( sal_Int32 nDisplay ) +{ + if( mnDisplay != nDisplay ) + { + OptionsChanged(); + mnDisplay = nDisplay; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/scalectrl.cxx b/sd/source/ui/app/scalectrl.cxx new file mode 100644 index 0000000000..c2d3f034a0 --- /dev/null +++ b/sd/source/ui/app/scalectrl.cxx @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +SFX_IMPL_STATUSBAR_CONTROL(SdScaleControl, SfxStringItem); + +// class SdScaleControl ------------------------------------------ +SdScaleControl::SdScaleControl(sal_uInt16 _nSlotId, sal_uInt16 _nId, StatusBar& rStb) + : SfxStatusBarControl(_nSlotId, _nId, rStb) +{ + GetStatusBar().SetQuickHelpText(GetId(), SdResId(STR_SCALE_TOOLTIP)); +} + +SdScaleControl::~SdScaleControl() {} + +void SdScaleControl::StateChangedAtStatusBarControl(sal_uInt16 /*nSID*/, SfxItemState eState, + const SfxPoolItem* pState) +{ + if (eState != SfxItemState::DEFAULT || SfxItemState::DISABLED == eState) + return; + + auto pStringItem = dynamic_cast(pState); + if (!pStringItem) + { + SAL_WARN("sd", "Item wasn't a SfxStringItem"); + return; + } + GetStatusBar().SetItemText(GetId(), pStringItem->GetValue()); +} + +void SdScaleControl::Command(const CommandEvent& rCEvt) +{ + if (rCEvt.GetCommand() != CommandEventId::ContextMenu + || GetStatusBar().GetItemText(GetId()).isEmpty()) + return; + + SfxViewFrame* pViewFrame = SfxViewFrame::Current(); + + sd::ViewShellBase* pViewShellBase = sd::ViewShellBase::GetViewShellBase(pViewFrame); + if (!pViewShellBase) + return; + + SdDrawDocument* pDoc = pViewShellBase->GetDocument(); + if (!pDoc) + return; + + std::unique_ptr xBuilder( + Application::CreateBuilder(nullptr, "modules/simpress/ui/masterpagemenu.ui")); + std::unique_ptr xPopup(xBuilder->weld_menu("menu")); + + sal_uInt16 aTable[12] = { 1, 2, 4, 5, 8, 10, 16, 20, 30, 40, 50, 100 }; + + for (sal_uInt16 i = 11; i > 0; i--) + xPopup->append(OUString::number(12 - i), OUString::number(aTable[i]) + ":1"); + for (sal_uInt16 i = 0; i < 12; i++) + xPopup->append(OUString::number(12 + i), "1:" + OUString::number(aTable[i])); + + ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(1, 1)); + weld::Window* pParent = weld::GetPopupParent(GetStatusBar(), aRect); + OUString sResult = xPopup->popup_at_rect(pParent, aRect); + if (sResult.isEmpty()) + return; + + sal_Int32 i = sResult.toUInt32(); + sal_Int32 nX; + sal_Int32 nY; + if (i > 11) + nX = 1; + else + nX = aTable[(12 - i) % 12]; + if (i > 11) + nY = aTable[i % 12]; + else + nY = 1; + pDoc->SetUIScale(Fraction(nX, nY)); + + SfxBindings& pBindings = pViewFrame->GetBindings(); + pBindings.Invalidate(SID_SCALE); //update statusbar + pBindings.Invalidate(SID_ATTR_METRIC); //update sidebar + pViewShellBase->UpdateBorder(true); // update ruler +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx new file mode 100644 index 0000000000..b4734310a3 --- /dev/null +++ b/sd/source/ui/app/sddll.cxx @@ -0,0 +1,280 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +// Register all Factories +void SdDLL::RegisterFactorys() +{ + if (utl::ConfigManager::IsFuzzing() || SvtModuleOptions().IsImpress()) + { + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::IMPRESS_FACTORY_ID); + if (comphelper::LibreOfficeKit::isActive()) + { + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::SLIDE_SORTER_FACTORY_ID); + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::OUTLINE_FACTORY_ID); + ::sd::ImpressViewShellBase::RegisterFactory ( + ::sd::PRESENTATION_FACTORY_ID); + } + else + { + ::sd::SlideSorterViewShellBase::RegisterFactory ( + ::sd::SLIDE_SORTER_FACTORY_ID); + ::sd::OutlineViewShellBase::RegisterFactory ( + ::sd::OUTLINE_FACTORY_ID); + ::sd::PresentationViewShellBase::RegisterFactory ( + ::sd::PRESENTATION_FACTORY_ID); + } + } + if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw()) + { + ::sd::GraphicViewShellBase::RegisterFactory (::sd::DRAW_FACTORY_ID); + } +} + +// Register all Interfaces + +void SdDLL::RegisterInterfaces(const SdModule* pMod) +{ + // Module + SdModule::RegisterInterface(pMod); + + // View shell base. + ::sd::ViewShellBase::RegisterInterface(pMod); + + // DocShells + ::sd::DrawDocShell::RegisterInterface(pMod); + ::sd::GraphicDocShell::RegisterInterface(pMod); + + // Impress ViewShells + ::sd::DrawViewShell::RegisterInterface(pMod); + ::sd::OutlineViewShell::RegisterInterface(pMod); + ::sd::PresentationViewShell::RegisterInterface(pMod); + + // Draw ViewShell + ::sd::GraphicViewShell::RegisterInterface(pMod); + + // Impress ObjectShells + ::sd::BezierObjectBar::RegisterInterface(pMod); + ::sd::TextObjectBar::RegisterInterface(pMod); + ::sd::GraphicObjectBar::RegisterInterface(pMod); + + // Media ObjectShell + ::sd::MediaObjectBar::RegisterInterface(pMod); + + // Table ObjectShell + ::sd::ui::table::RegisterInterfaces(pMod); + + // View shells for the side panes. + ::sd::slidesorter::SlideSorterViewShell::RegisterInterface (pMod); +} + +// Register all Controllers + +void SdDLL::RegisterControllers(SdModule* pMod) +{ + SdTbxCtlDiaPages::RegisterControl( SID_PAGES_PER_ROW, pMod ); + SdTbxCtlGlueEscDir::RegisterControl( SID_GLUE_ESCDIR, pMod ); + + ::sd::AnimationChildWindow::RegisterChildWindow(false, pMod); + + Svx3DChildWindow::RegisterChildWindow(false, pMod); + SvxFontWorkChildWindow::RegisterChildWindow(false, pMod); + SvxColorChildWindow::RegisterChildWindow(false, pMod, SfxChildWindowFlags::TASK); + SvxSearchDialogWrapper::RegisterChildWindow(false, pMod); + SvxBmpMaskChildWindow::RegisterChildWindow(false, pMod); + SvxIMapDlgChildWindow::RegisterChildWindow(false, pMod); + SvxHlinkDlgWrapper::RegisterChildWindow(false, pMod); + ::sd::SpellDialogChildWindow::RegisterChildWindow( + false, pMod, comphelper::LibreOfficeKit::isActive() ? SfxChildWindowFlags::NEVERCLONE + : SfxChildWindowFlags::NONE); +#if HAVE_FEATURE_AVMEDIA + ::avmedia::MediaPlayer::RegisterChildWindow(false, pMod); +#endif + ::sd::LeftPaneImpressChildWindow::RegisterChildWindow(false, pMod); + ::sd::LeftPaneDrawChildWindow::RegisterChildWindow(false, pMod); + ::sfx2::sidebar::SidebarChildWindow::RegisterChildWindow(false, pMod); + DevelopmentToolChildWindow::RegisterChildWindow(false, pMod); + + ::sd::SdNavigatorWrapper::RegisterChildWindow(false, pMod, SfxChildWindowFlags::NEVERHIDE); + + SvxFillToolBoxControl::RegisterControl(0, pMod); + SvxLineWidthToolBoxControl::RegisterControl(0, pMod); + + SvxGrafModeToolBoxControl::RegisterControl( SID_ATTR_GRAF_MODE, pMod ); + SvxGrafRedToolBoxControl::RegisterControl( SID_ATTR_GRAF_RED, pMod ); + SvxGrafGreenToolBoxControl::RegisterControl( SID_ATTR_GRAF_GREEN, pMod ); + SvxGrafBlueToolBoxControl::RegisterControl( SID_ATTR_GRAF_BLUE, pMod ); + SvxGrafLuminanceToolBoxControl::RegisterControl( SID_ATTR_GRAF_LUMINANCE, pMod ); + SvxGrafContrastToolBoxControl::RegisterControl( SID_ATTR_GRAF_CONTRAST, pMod ); + SvxGrafGammaToolBoxControl::RegisterControl( SID_ATTR_GRAF_GAMMA, pMod ); + SvxGrafTransparenceToolBoxControl::RegisterControl( SID_ATTR_GRAF_TRANSPARENCE, pMod ); + + // register StatusBarControls + SvxZoomPageStatusBarControl::RegisterControl( SID_ZOOM_ENTIRE_PAGE, pMod ); + SvxZoomStatusBarControl::RegisterControl( SID_ATTR_ZOOM, pMod ); + SvxPosSizeStatusBarControl::RegisterControl( SID_ATTR_SIZE, pMod ); + SvxModifyControl::RegisterControl( SID_DOC_MODIFIED, pMod ); + SvxZoomSliderControl::RegisterControl( SID_ATTR_ZOOMSLIDER, pMod ); + + svx::FormatPaintBrushToolBoxControl::RegisterControl(SID_FORMATPAINTBRUSH, pMod ); + + SvxClipBoardControl::RegisterControl( SID_PASTE, pMod ); + SvxClipBoardControl::RegisterControl( SID_PASTE_UNFORMATTED, pMod ); + +#if HAVE_FEATURE_AVMEDIA + ::avmedia::MediaToolBoxControl::RegisterControl( SID_AVMEDIA_TOOLBOX, pMod ); +#endif + XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE, pMod ); + SdTemplateControl::RegisterControl( SID_STATUS_LAYOUT, pMod ); + SdScaleControl::RegisterControl( SID_SCALE, pMod ); + SvxTbxCtlDraw::RegisterControl(SID_INSERT_DRAW, pMod ); +} + +void SdDLL::Init() +{ + if ( SfxApplication::GetModule(SfxToolsModule::Draw) ) // Module already active + return; + + SfxObjectFactory* pDrawFact = nullptr; + SfxObjectFactory* pImpressFact = nullptr; + + if (utl::ConfigManager::IsFuzzing() || SvtModuleOptions().IsImpress()) + pImpressFact = &::sd::DrawDocShell::Factory(); + + if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw()) + pDrawFact = &::sd::GraphicDocShell::Factory(); + + auto pUniqueModule = std::make_unique(pImpressFact, pDrawFact); + SdModule* pModule = pUniqueModule.get(); + SfxApplication::SetModule(SfxToolsModule::Draw, std::move(pUniqueModule)); + + if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsImpress()) + { + // Register the Impress shape types in order to make the shapes accessible. + ::accessibility::RegisterImpressShapeTypes (); + ::sd::DrawDocShell::Factory().SetDocumentServiceName( "com.sun.star.presentation.PresentationDocument" ); + } + + if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw()) + { + ::sd::GraphicDocShell::Factory().SetDocumentServiceName( "com.sun.star.drawing.DrawingDocument" ); + } + + // register your view-factories here + RegisterFactorys(); + + // register your shell-interfaces here + RegisterInterfaces(pModule); + + // register your controllers here + RegisterControllers(pModule); + + // register 3D-object-factory + E3dObjFactory(); + + // register css::form::component::Form-Object-Factory + FmFormObjFactory(); + + // register your exotic remote controls here +#ifdef ENABLE_SDREMOTE + if (!utl::ConfigManager::IsFuzzing() && !Application::IsHeadlessModeEnabled()) + RegisterRemotes(); +#endif +} + +#ifndef DISABLE_DYNLOADING + +extern "C" SAL_DLLPUBLIC_EXPORT +void lok_preload_hook() +{ + SdAbstractDialogFactory::Create(); +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/sdmod.cxx b/sd/source/ui/app/sdmod.cxx new file mode 100644 index 0000000000..22f566706c --- /dev/null +++ b/sd/source/ui/app/sdmod.cxx @@ -0,0 +1,216 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#define ShellClass_SdModule +#include + +SFX_IMPL_INTERFACE(SdModule, SfxModule) + +void SdModule::InitInterface_Impl() +{ + GetStaticInterface()->RegisterStatusBar(StatusBarId::DrawStatusBar); +} + +// Ctor +SdModule::SdModule(SfxObjectFactory* pFact1, SfxObjectFactory* pFact2 ) +: SfxModule("sd"_ostr, {pFact1, pFact2}), + pTransferClip(nullptr), + pTransferDrag(nullptr), + pTransferSelection(nullptr), + pImpressOptions(nullptr), + pDrawOptions(nullptr), + bWaterCan(false), + mbEventListenerAdded(false), + mpColorConfig(new svtools::ColorConfig) +{ + SetName( "StarDraw" ); // Do not translate! + pSearchItem.reset( new SvxSearchItem(SID_SEARCH_ITEM) ); + pSearchItem->SetAppFlag(SvxSearchApp::DRAW); + StartListening( *SfxGetpApp() ); + SvxErrorHandler::ensure(); + mpErrorHdl.reset( new SfxErrorHandler(RID_SD_ERRHDL, ErrCodeArea::Sd, ErrCodeArea::Sd, GetResLocale()) ); + + // Create a new ref device and (by calling SetReferenceDevice()) + // set its resolution to 600 DPI. This leads to a visually better + // formatting of text in small sizes (6 point and below.) + mpVirtualRefDevice.reset(VclPtr::Create()); + mpVirtualRefDevice->SetMapMode(MapMode(MapUnit::Map100thMM)); + mpVirtualRefDevice->SetReferenceDevice ( VirtualDevice::RefDevMode::Dpi600 ); +} + +OUString SdResId(TranslateId aId) +{ + return Translate::get(aId, SD_MOD()->GetResLocale()); +} + +OUString SdResId(TranslateNId aContextSingularPlural, int nCardinality) +{ + return Translate::nget(aContextSingularPlural, nCardinality, SD_MOD()->GetResLocale()); +} + +// Dtor +SdModule::~SdModule() +{ + pSearchItem.reset(); + pNumberFormatter.reset(); + + if (mbEventListenerAdded) + { + Application::RemoveEventListener( LINK( this, SdModule, EventListenerHdl ) ); + } + + mpErrorHdl.reset(); + mpVirtualRefDevice.disposeAndClear(); +} + +void SdModule::SetSearchItem(std::unique_ptr pItem) +{ + pSearchItem = std::move(pItem); +} + +/// get notifications +void SdModule::Notify( SfxBroadcaster&, const SfxHint& rHint ) +{ + if( rHint.GetId() == SfxHintId::Deinitializing ) + { + delete pImpressOptions; + pImpressOptions = nullptr; + delete pDrawOptions; + pDrawOptions = nullptr; + } +} + +/// Return options +SdOptions* SdModule::GetSdOptions(DocumentType eDocType) +{ + SdOptions* pOptions = nullptr; + + if (eDocType == DocumentType::Draw) + { + if (!pDrawOptions) + pDrawOptions = new SdOptions(false); + + pOptions = pDrawOptions; + } + else if (eDocType == DocumentType::Impress) + { + if (!pImpressOptions) + pImpressOptions = new SdOptions(true); + + pOptions = pImpressOptions; + } + if( pOptions ) + { + sal_uInt16 nMetric = pOptions->GetMetric(); + + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + SdDrawDocument* pDoc = nullptr; + if (pDocSh) + pDoc = pDocSh->GetDoc(); + + if( nMetric != 0xffff && pDoc && eDocType == pDoc->GetDocumentType() ) + PutItem( SfxUInt16Item( SID_ATTR_METRIC, nMetric ) ); + } + + return pOptions; +} + +/** + * Open and return option stream for internal options; + * if the stream is opened for reading but does not exist, an 'empty' + * RefObject is returned + */ +tools::SvRef SdModule::GetOptionStream( std::u16string_view rOptionName, + SdOptionStreamMode eMode ) +{ + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + tools::SvRef xStm; + + if( pDocSh ) + { + DocumentType eType = pDocSh->GetDoc()->GetDocumentType(); + + if( !xOptionStorage.is() ) + { + INetURLObject aURL( SvtPathOptions().GetUserConfigPath() ); + + aURL.Append( u"drawing.cfg" ); + + std::unique_ptr pStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READWRITE ); + + if( pStm ) + xOptionStorage = new SotStorage( pStm.release(), true ); + } + + OUString aStmName; + + if( DocumentType::Draw == eType ) + aStmName = "Draw_"; + else + aStmName = "Impress_"; + + aStmName += rOptionName; + + if( SdOptionStreamMode::Store == eMode || xOptionStorage->IsContained( aStmName ) ) + xStm = xOptionStorage->OpenSotStream( aStmName ); + } + + return xStm; +} + +SvNumberFormatter* SdModule::GetNumberFormatter() +{ + if( !pNumberFormatter ) + pNumberFormatter.reset( new SvNumberFormatter( ::comphelper::getProcessComponentContext(), LANGUAGE_SYSTEM ) ); + + return pNumberFormatter.get(); +} + +svtools::ColorConfig& SdModule::GetColorConfig() +{ + return *mpColorConfig; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/sdmod1.cxx b/sd/source/ui/app/sdmod1.cxx new file mode 100644 index 0000000000..0d9e82f278 --- /dev/null +++ b/sd/source/ui/app/sdmod1.cxx @@ -0,0 +1,645 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::sd::framework::FrameworkHelper; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::frame::XFrame; + +namespace { + +class OutlineToImpressFinalizer final +{ +public: + OutlineToImpressFinalizer ( + ::sd::ViewShellBase& rBase, + SdDrawDocument& rDocument, + SvLockBytes const & rBytes); + void operator() (bool bEventSeen); +private: + ::sd::ViewShellBase& mrBase; + SdDrawDocument& mrDocument; + std::shared_ptr mpStream; +}; + +} //end of anonymous namespace + +void SdModule::Execute(SfxRequest& rReq) +{ + const SfxItemSet* pSet = rReq.GetArgs(); + sal_uInt16 nSlotId = rReq.GetSlot(); + + switch ( nSlotId ) + { + case SID_NEWDOC: + { + SfxGetpApp()->ExecuteSlot(rReq, SfxGetpApp()->GetInterface()); + } + break; + + case SID_AUTOSPELL_CHECK: + { + // automatic spell checker + const SfxBoolItem* pItem; + if( pSet && (pItem = pSet->GetItemIfSet( SID_AUTOSPELL_CHECK, false ) ) ) + { + bool bOnlineSpelling = pItem->GetValue(); + // save at document: + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocSh ) + { + SdDrawDocument* pDoc = pDocSh->GetDoc(); + pDoc->SetOnlineSpell( bOnlineSpelling ); + } + } + } + break; + + case SID_ATTR_METRIC: + { + const SfxUInt16Item* pItem; + if ( pSet && (pItem = pSet->GetItemIfSet( SID_ATTR_METRIC ) ) ) + { + FieldUnit eUnit = static_cast(pItem->GetValue()); + switch( eUnit ) + { + case FieldUnit::MM: // only the units which are also in the dialog + case FieldUnit::CM: + case FieldUnit::INCH: + case FieldUnit::PICA: + case FieldUnit::POINT: + { + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if(pDocSh) + { + DocumentType eDocType = pDocSh->GetDoc()->GetDocumentType(); + + PutItem( *pItem ); + SdOptions* pOptions = GetSdOptions( eDocType ); + if(pOptions) + pOptions->SetMetric( static_cast(eUnit) ); + rReq.Done(); + } + } + break; + default: + break; + } + } + + } + break; + + case SID_ATTR_LANGUAGE: + case SID_ATTR_CHAR_CJK_LANGUAGE: + case SID_ATTR_CHAR_CTL_LANGUAGE: + { + const SfxPoolItem* pItem; + if( pSet && + ( + SfxItemState::SET == pSet->GetItemState(SID_ATTR_LANGUAGE, false, &pItem ) || + SfxItemState::SET == pSet->GetItemState(SID_ATTR_CHAR_CJK_LANGUAGE, false, &pItem ) || + SfxItemState::SET == pSet->GetItemState(SID_ATTR_CHAR_CTL_LANGUAGE, false, &pItem ) + ) + ) + { + // save at the document: + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if ( pDocSh ) + { + LanguageType eLanguage = static_cast(pItem)->GetValue(); + SdDrawDocument* pDoc = pDocSh->GetDoc(); + + if( nSlotId == SID_ATTR_CHAR_CJK_LANGUAGE ) + pDoc->SetLanguage( eLanguage, EE_CHAR_LANGUAGE_CJK ); + else if( nSlotId == SID_ATTR_CHAR_CTL_LANGUAGE ) + pDoc->SetLanguage( eLanguage, EE_CHAR_LANGUAGE_CTL ); + else + pDoc->SetLanguage( eLanguage, EE_CHAR_LANGUAGE ); + + if( pDoc->GetOnlineSpell() ) + { + pDoc->StopOnlineSpelling(); + pDoc->StartOnlineSpelling(); + } + } + } + } + break; + + case SID_NEWSD: + { + SfxFrame* pFrame = ExecuteNewDocument( rReq ); + // if a frame was created, set it as return value + if(pFrame) + rReq.SetReturnValue(SfxFrameItem(0, pFrame)); + } + + break; + + case SID_OPENHYPERLINK: + case SID_OPENDOC: + { + bool bIntercept = false; + ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + ::sd::ViewShell* pViewShell = pDocShell ? pDocShell->GetViewShell() : nullptr; + if (pViewShell) + { + if( sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ) ) + { + // Prevent documents from opening while the slide + // show is running, except when this request comes + // from a shape interaction. + if (rReq.GetArgs() == nullptr) + { + bIntercept = true; + } + } + } + + if (!bIntercept) + { + if (const SfxStringItem* pURLItem = rReq.GetArg(SID_FILE_NAME)) + { + if (!pViewShell || !SfxObjectShell::AllowedLinkProtocolFromDocument(pURLItem->GetValue(), + pViewShell->GetObjectShell(), + pViewShell->GetFrameWeld())) + { + return; + } + } + SfxGetpApp()->ExecuteSlot(rReq, SfxGetpApp()->GetInterface()); + } + else + { + std::unique_ptr xErrorBox(Application::CreateMessageDialog(rReq.GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_CANT_PERFORM_IN_LIVEMODE))); + + xErrorBox->run(); + + const SfxLinkItem* pLinkItem = rReq.GetArg(SID_DONELINK); + if( pLinkItem ) + pLinkItem->GetValue().Call( nullptr ); + } + } + break; + + case SID_OUTLINE_TO_IMPRESS: + OutlineToImpress (rReq); + break; + + default: + break; + } +} + +bool SdModule::OutlineToImpress(SfxRequest const & rRequest) +{ + const SfxItemSet* pSet = rRequest.GetArgs(); + + if (pSet) + { + SvLockBytes* pBytes = static_cast(pSet->Get(SID_OUTLINE_TO_IMPRESS)).GetValue(); + + if (pBytes) + { + SfxObjectShellLock xDocShell; + ::sd::DrawDocShell* pDocSh; + xDocShell = pDocSh = new ::sd::DrawDocShell( + SfxObjectCreateMode::STANDARD, false, DocumentType::Impress); + + pDocSh->DoInitNew(); + SdDrawDocument* pDoc = pDocSh->GetDoc(); + if(pDoc) + { + pDoc->CreateFirstPages(); + pDoc->StopWorkStartupDelay(); + } + + const SfxFrameItem* pFrmItem = rRequest.GetArg(SID_DOCFRAME); + SfxViewFrame::LoadDocumentIntoFrame( *pDocSh, pFrmItem, ::sd::OUTLINE_FACTORY_ID ); + + ::sd::ViewShell* pViewSh = pDocSh->GetViewShell(); + + if (pViewSh && pDoc) + { + // AutoLayouts have to be finished + pDoc->StopWorkStartupDelay(); + + SfxViewFrame* pViewFrame = pViewSh->GetViewFrame(); + + // When the view frame has not been just created we have + // to switch synchronously to the outline view. + // (Otherwise the request will be ignored anyway.) + ::sd::ViewShellBase* pBase + = dynamic_cast< ::sd::ViewShellBase*>(pViewFrame->GetViewShell()); + if (pBase != nullptr) + { + std::shared_ptr pHelper ( + FrameworkHelper::Instance(*pBase)); + pHelper->RequestView( + FrameworkHelper::msOutlineViewURL, + FrameworkHelper::msCenterPaneURL); + + pHelper->RunOnResourceActivation( + FrameworkHelper::CreateResourceId( + FrameworkHelper::msOutlineViewURL, + FrameworkHelper::msCenterPaneURL), + OutlineToImpressFinalizer(*pBase, *pDoc, *pBytes)); + } + } + } + } + + return rRequest.IsDone(); +} + +void SdModule::GetState(SfxItemSet& rItemSet) +{ + if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_METRIC ) ) + { + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if(pDocSh) + { + DocumentType eDocType = pDocSh->GetDoc()->GetDocumentType(); + + SdOptions* pOptions = GetSdOptions(eDocType); + rItemSet.Put( SfxUInt16Item( SID_ATTR_METRIC, pOptions->GetMetric() ) ); + } + } + + // state of SID_OPENDOC is determined by the base class + if (rItemSet.GetItemState(SID_OPENDOC) != SfxItemState::UNKNOWN) + { + const SfxPoolItemHolder aItem(SfxGetpApp()->GetSlotState(SID_OPENDOC, SfxGetpApp()->GetInterface())); + if (nullptr != aItem.getItem()) + rItemSet.Put(*aItem.getItem()); + } + + // state of SID_OPENHYPERLINK is determined by the base class + if (rItemSet.GetItemState(SID_OPENHYPERLINK) != SfxItemState::UNKNOWN) + { + const SfxPoolItemHolder aItem(SfxGetpApp()->GetSlotState(SID_OPENHYPERLINK, SfxGetpApp()->GetInterface())); + if (nullptr != aItem.getItem()) + rItemSet.Put(*aItem.getItem()); + } + + if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_AUTOSPELL_CHECK ) ) + { + ::sd::DrawDocShell* pDocSh = + dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocSh ) + { + SdDrawDocument* pDoc = pDocSh->GetDoc(); + rItemSet.Put( SfxBoolItem( SID_AUTOSPELL_CHECK, pDoc->GetOnlineSpell() ) ); + } + } + + if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_LANGUAGE ) ) + { + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocSh ) + rItemSet.Put( SvxLanguageItem( pDocSh->GetDoc()->GetLanguage( EE_CHAR_LANGUAGE ), SID_ATTR_LANGUAGE ) ); + } + + if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_CHAR_CJK_LANGUAGE ) ) + { + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocSh ) + rItemSet.Put( SvxLanguageItem( pDocSh->GetDoc()->GetLanguage( EE_CHAR_LANGUAGE_CJK ), SID_ATTR_CHAR_CJK_LANGUAGE ) ); + } + + if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_CHAR_CTL_LANGUAGE ) ) + { + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocSh ) + rItemSet.Put( SvxLanguageItem( pDocSh->GetDoc()->GetLanguage( EE_CHAR_LANGUAGE_CTL ), SID_ATTR_CHAR_CTL_LANGUAGE ) ); + } + + if ( mbEventListenerAdded ) + return; + + ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocShell ) // Impress or Draw ? + { + ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); + + if( pViewShell && (pDocShell->GetDocumentType() == DocumentType::Impress) ) + { + // add our event listener as soon as possible + Application::AddEventListener( LINK( this, SdModule, EventListenerHdl ) ); + mbEventListenerAdded = true; + } + } +} + +IMPL_STATIC_LINK( SdModule, EventListenerHdl, VclSimpleEvent&, rSimpleEvent, void ) +{ + if( !((rSimpleEvent.GetId() == VclEventId::WindowCommand) && static_cast(&rSimpleEvent)->GetData()) ) + return; + + const CommandEvent& rEvent = *static_cast(static_cast(&rSimpleEvent)->GetData()); + + if( rEvent.GetCommand() != CommandEventId::Media ) + return; + + CommandMediaData* pMediaData = rEvent.GetMediaData(); + pMediaData->SetPassThroughToOS(false); + switch (pMediaData->GetMediaId()) + { + case MediaCommand::Play: + { + ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + if( pDocShell ) // Impress or Draw ? + { + ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); + + // #i97925# start the presentation if and only if an Impress document is focused + if( pViewShell && (pDocShell->GetDocumentType() == DocumentType::Impress) ) + pViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION ); + } + break; + } + default: + pMediaData->SetPassThroughToOS(true); + break; + } +} + + +SfxFrame* SdModule::CreateFromTemplate(const OUString& rTemplatePath, const Reference& i_rFrame, + const bool bReplaceable) +{ + SfxFrame* pFrame = nullptr; + + SfxObjectShellLock xDocShell; + + std::unique_ptr pSet(new SfxAllItemSet( SfxGetpApp()->GetPool() )); + pSet->Put( SfxBoolItem( SID_TEMPLATE, true ) ); + + ErrCodeMsg lErr = SfxGetpApp()->LoadTemplate( xDocShell, rTemplatePath, std::move(pSet) ); + + SfxObjectShell* pDocShell = xDocShell; + + if( lErr ) + { + ErrorHandler::HandleError(lErr); + } + else if( pDocShell ) + { + if (pDocShell->GetMedium()) + pDocShell->GetMedium()->GetItemSet().Put(SfxBoolItem(SID_REPLACEABLE, bReplaceable)); + SfxViewFrame* pViewFrame = SfxViewFrame::LoadDocumentIntoFrame( *pDocShell, i_rFrame ); + OSL_ENSURE( pViewFrame, "SdModule::CreateFromTemplate: no view frame - was the document really loaded?" ); + pFrame = pViewFrame ? &pViewFrame->GetFrame() : nullptr; + } + + return pFrame; + +} + +SfxFrame* SdModule::ExecuteNewDocument( SfxRequest const & rReq ) +{ + SfxFrame* pFrame = nullptr; + if ( SvtModuleOptions().IsImpress() ) + { + Reference< XFrame > xTargetFrame; + const SfxUnoFrameItem* pFrmItem = rReq.GetArg(SID_FILLFRAME); + if ( pFrmItem ) + xTargetFrame = pFrmItem->GetFrame(); + + SdOptions* pOpt = GetSdOptions(DocumentType::Impress); + bool bStartWithTemplate = pOpt->IsStartWithTemplate(); + + bool bNewDocDirect = rReq.GetSlot() == SID_NEWSD; + + if( bNewDocDirect ) + { + //we start without wizard + + //check whether we should load a template document + OUString aStandardTemplate( SfxObjectFactory::GetStandardTemplate( u"com.sun.star.presentation.PresentationDocument" ) ); + + if( !aStandardTemplate.isEmpty() ) + { + //load a template document + pFrame = CreateFromTemplate(aStandardTemplate, xTargetFrame, true); + } + else + { + //create an empty document + pFrame = CreateEmptyDocument( xTargetFrame ); + } + } + + if (bStartWithTemplate) + { + //Launch TemplateSelectionDialog + SfxTemplateSelectionDlg aTemplDlg(SfxGetpApp()->GetTopWindow()); + aTemplDlg.run(); + + //check to disable the dialog + pOpt->SetStartWithTemplate( aTemplDlg.IsStartWithTemplate() ); + + //pFrame is loaded with the desired template + if (!aTemplDlg.getTemplatePath().isEmpty()) + pFrame = CreateFromTemplate(aTemplDlg.getTemplatePath(), xTargetFrame, false); + + // show tip-of-the-day dialog if it was deferred because SfxTemplateSelectionDlg + // was open + if (pFrame && SfxApplication::IsTipOfTheDayDue() && !SfxApplication::IsHeadlessOrUITest()) + { + if (SfxDispatcher* pDispatcher = GetDispatcher()) + { + // tdf#127946 pass in argument for dialog parent + SfxUnoFrameItem aDocFrame(SID_FILLFRAME, pFrame->GetFrameInterface()); + pDispatcher->ExecuteList(SID_TIPOFTHEDAY, SfxCallMode::SLOT, {}, { &aDocFrame }); + } + } + } + } + + return pFrame; +} + +SfxFrame* SdModule::CreateEmptyDocument( const Reference< XFrame >& i_rFrame ) +{ + SfxFrame* pFrame = nullptr; + + SfxObjectShellLock xDocShell; + ::sd::DrawDocShell* pNewDocSh; + xDocShell = pNewDocSh = new ::sd::DrawDocShell(SfxObjectCreateMode::STANDARD,false,DocumentType::Impress); + pNewDocSh->DoInitNew(); + SdDrawDocument* pDoc = pNewDocSh->GetDoc(); + if (pDoc) + { + pDoc->CreateFirstPages(); + pDoc->StopWorkStartupDelay(); + } + if (pNewDocSh->GetMedium()) + pNewDocSh->GetMedium()->GetItemSet().Put(SfxBoolItem(SID_REPLACEABLE, true)); + + SfxViewFrame* pViewFrame = SfxViewFrame::LoadDocumentIntoFrame( *pNewDocSh, i_rFrame ); + OSL_ENSURE( pViewFrame, "SdModule::CreateEmptyDocument: no view frame - was the document really loaded?" ); + pFrame = pViewFrame ? &pViewFrame->GetFrame() : nullptr; + + return pFrame; +} + +//===== OutlineToImpressFinalize ============================================== + +namespace { + +OutlineToImpressFinalizer::OutlineToImpressFinalizer ( + ::sd::ViewShellBase& rBase, + SdDrawDocument& rDocument, + SvLockBytes const & rBytes) + : mrBase(rBase), + mrDocument(rDocument) +{ + // The given stream has a lifetime shorter than this new + // OutlineToImpressFinalizer object. Therefore a local copy of the + // stream is created. + const SvStream* pStream (rBytes.GetStream()); + if (pStream == nullptr) + return; + + // Create a memory stream and prepare to fill it with the content of + // the original stream. + mpStream = std::make_shared(); + static const std::size_t nBufferSize = 4096; + ::std::unique_ptr pBuffer (new sal_Int8[nBufferSize]); + + sal_uInt64 nReadPosition(0); + bool bLoop (true); + while (bLoop) + { + // Read the next part of the original stream. + std::size_t nReadByteCount (0); + const ErrCode nErrorCode ( + rBytes.ReadAt( + nReadPosition, + pBuffer.get(), + nBufferSize, + &nReadByteCount)); + + // Check the error code and stop copying the stream data when an + // error has occurred. + if (nErrorCode == ERRCODE_NONE) + { + if (nReadByteCount == 0) + bLoop = false; + } + else if (nErrorCode == ERRCODE_IO_PENDING) + ; + else + { + bLoop = false; + nReadByteCount = 0; + } + + // Append the read bytes to the end of the memory stream. + if (nReadByteCount > 0) + { + mpStream->WriteBytes(pBuffer.get(), nReadByteCount); + nReadPosition += nReadByteCount; + } + } + + // Rewind the memory stream so that in the operator() method its + // content is properly read. + mpStream->Seek(STREAM_SEEK_TO_BEGIN); +} + +void OutlineToImpressFinalizer::operator() (bool) +{ + // Fetch the new outline view shell. + ::sd::OutlineViewShell* pOutlineShell + = dynamic_cast(FrameworkHelper::Instance(mrBase)->GetViewShell(FrameworkHelper::msCenterPaneURL).get()); + + if (pOutlineShell != nullptr && mpStream != nullptr) + { + sd::OutlineView* pView = static_cast(pOutlineShell->GetView()); + // mba: the stream can't contain any relative URLs, because we don't + // have any information about a BaseURL! + pOutlineShell->ReadRtf(*mpStream); + + // Call UpdatePreview once for every slide to resync the + // document with the outliner of the OutlineViewShell. + sal_uInt16 nPageCount (mrDocument.GetSdPageCount(PageKind::Standard)); + for (sal_uInt16 nIndex=0; nIndexSetActualPage(pPage); + pOutlineShell->UpdatePreview(pPage); + } + // Select the first slide. + SdPage* pPage = mrDocument.GetSdPage(0, PageKind::Standard); + pView->SetActualPage(pPage); + pOutlineShell->UpdatePreview(pPage); + } + + // Undo-Stack needs to be cleared, else the user may remove the + // only drawpage and this is a state we cannot handle ATM. + ::sd::DrawDocShell* pDocShell = mrDocument.GetDocSh(); + if( pDocShell ) + pDocShell->ClearUndoBuffer(); +} + +} // end of anonymous namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/sdmod2.cxx b/sd/source/ui/app/sdmod2.cxx new file mode 100644 index 0000000000..8a6424d162 --- /dev/null +++ b/sd/source/ui/app/sdmod2.cxx @@ -0,0 +1,816 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** retrieves the page that is currently painted. This will only be the master page + if the current drawn view only shows the master page*/ +static SdPage* GetCurrentPage( sd::ViewShell const * pViewSh, EditFieldInfo const * pInfo, bool& bMasterView ) +{ + if( !pInfo ) + return nullptr; + + bMasterView = false; + SdPage* pPage = dynamic_cast< SdPage* >( pInfo->GetSdrPage() ); + SdrOutliner* pOutliner = dynamic_cast< SdrOutliner* >( pInfo->GetOutliner() ); + + // special case, someone already set the current page on the EditFieldInfo + // This is used from the svx::UnoGraphicsExporter f.e. + if( pPage ) + { + bMasterView = false; + return pPage; + } + + // first try to check if we are inside the outline view + sd::OutlineView* pSdView = nullptr; + if( auto pOutlineViewShell = dynamic_cast(pViewSh) ) + pSdView = static_cast(pOutlineViewShell->GetView()); + + if (pSdView != nullptr && (pOutliner == &pSdView->GetOutliner())) + { + // outline mode + int nPgNum = 0; + Outliner& rOutl = pSdView->GetOutliner(); + tools::Long nPos = pInfo->GetPara(); + sal_Int32 nParaPos = 0; + + for( Paragraph* pPara = rOutl.GetParagraph( 0 ); pPara && nPos >= 0; pPara = rOutl.GetParagraph( ++nParaPos ), nPos-- ) + { + if( Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) ) + nPgNum++; + } + + pPage = pViewSh->GetDoc()->GetSdPage( static_cast(nPgNum), PageKind::Standard ); + } + else + { + // draw mode, slide mode and preview. Get the processed page from the outliner + if(pOutliner) + { + pPage = dynamic_cast< SdPage* >(const_cast< SdrPage* >(pOutliner->getVisualizedPage())); + } + + // The path using GetPaintingPageView() and GetCurrentPaintingDisplayInfo() + // is no longer needed. I debugged and checked all usages of PageNumber decompositions + // which all use the new possibility of setting the visualized page at the SdrOutliner. + + // if all else failed, geht the current page from the object that is + // currently formatted from the document + if(!pPage) + { + const SdrTextObj* pTextObj = (pViewSh && pViewSh->GetDoc()) ? pViewSh->GetDoc()->GetFormattingTextObj() : nullptr; + + if( pTextObj ) + { + pPage = dynamic_cast< SdPage* >( pTextObj->getSdrPageFromSdrObject() ); + } + } + + if(pPage) + { + bMasterView = pPage->IsMasterPage(); + } + } + + return pPage; +} + +/** + * Link for CalcFieldValue of Outliners + */ +IMPL_LINK(SdModule, CalcFieldValueHdl, EditFieldInfo*, pInfo, void) +{ + if (!pInfo) + return; + + const SvxFieldData* pField = pInfo->GetField().GetField(); + ::sd::DrawDocShell* pDocShell = nullptr; + SdDrawDocument* pDoc = nullptr; + + SdrOutliner* pSdrOutliner = dynamic_cast< SdrOutliner* >( pInfo->GetOutliner() ); + if( pSdrOutliner ) + { + const SdrTextObj* pTextObj = pSdrOutliner->GetTextObj(); + + if( pTextObj ) + pDoc = dynamic_cast< SdDrawDocument* >( &pTextObj->getSdrModelFromSdrObject() ); + + if( pDoc ) + pDocShell = pDoc->GetDocSh(); + } + + if( !pDocShell ) + pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + + const SvxDateField* pDateField = nullptr; + const SvxExtTimeField* pExtTimeField = nullptr; + const SvxExtFileField* pExtFileField = nullptr; + const SvxAuthorField* pAuthorField = nullptr; + const SvxURLField* pURLField = nullptr; + + const editeng::CustomPropertyField* pCustomPropertyField = nullptr; + + if( (pDateField = dynamic_cast< const SvxDateField* >(pField)) != nullptr ) + { + LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() ); + pInfo->SetRepresentation( pDateField->GetFormatted( *GetNumberFormatter(), eLang ) ); + } + else if( (pExtTimeField = dynamic_cast< const SvxExtTimeField *>(pField)) != nullptr ) + { + LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() ); + pInfo->SetRepresentation( pExtTimeField->GetFormatted( *GetNumberFormatter(), eLang ) ); + } + else if( (pExtFileField = dynamic_cast< const SvxExtFileField * >(pField)) != nullptr ) + { + if( pDocShell && (pExtFileField->GetType() != SvxFileType::Fix) ) + { + OUString aName; + if( pDocShell->HasName() ) + aName = pDocShell->GetMedium()->GetName(); + else + aName = pDocShell->GetName(); + + const_cast< SvxExtFileField* >(pExtFileField)->SetFile( aName ); + } + pInfo->SetRepresentation( pExtFileField->GetFormatted() ); + + } + else if( (pAuthorField = dynamic_cast< const SvxAuthorField* >( pField )) != nullptr ) + { + if( pAuthorField->GetType() != SvxAuthorType::Fix ) + { + SvtUserOptions aUserOptions; + SvxAuthorField aAuthorField( + aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID(), + pAuthorField->GetType(), pAuthorField->GetFormat() ); + + *const_cast< SvxAuthorField* >(pAuthorField) = aAuthorField; + } + pInfo->SetRepresentation( pAuthorField->GetFormatted() ); + + } + else if( dynamic_cast< const SvxPageField* >(pField) ) + { + OUString aRepresentation(" "); + + ::sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr; + if(pViewSh == nullptr) + { + ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase *>( SfxViewShell::Current() ); + if(pBase) + pViewSh = pBase->GetMainViewShell().get(); + } + if( !pDoc && pViewSh ) + pDoc = pViewSh->GetDoc(); + + bool bMasterView; + SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView ); + + if( pPage && pDoc && !bMasterView ) + { + int nPgNum; + + if( (pPage->GetPageKind() == PageKind::Handout) && pViewSh ) + { + nPgNum = pViewSh->GetPrintedHandoutPageNum(); + } + else + { + nPgNum = (pPage->GetPageNum() - 1) / 2 + 1; + } + aRepresentation = pDoc->CreatePageNumValue(static_cast(nPgNum)); + } + else + aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_NUMBER); + + pInfo->SetRepresentation( aRepresentation ); + } + else if( dynamic_cast< const SvxPageTitleField* >(pField) ) + { + OUString aRepresentation(" "); + + ::sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr; + if(pViewSh == nullptr) + { + ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase *>( SfxViewShell::Current() ); + if(pBase) + pViewSh = pBase->GetMainViewShell().get(); + } + if( !pDoc && pViewSh ) + pDoc = pViewSh->GetDoc(); + + bool bMasterView; + SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView ); + + if( pPage && pDoc && !bMasterView ) + { + aRepresentation = pPage->GetName(); + } + else + { + DocumentType eDocType = pDoc ? pDoc->GetDocumentType() : DocumentType::Impress; + aRepresentation = ( ( eDocType == DocumentType::Impress ) + ? SdResId(STR_FIELD_PLACEHOLDER_SLIDENAME) + : SdResId(STR_FIELD_PLACEHOLDER_PAGENAME) ); + } + + pInfo->SetRepresentation( aRepresentation ); + } + else if( dynamic_cast< const SvxPagesField* >(pField) ) + { + OUString aRepresentation(" "); + + ::sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr; + if(pViewSh == nullptr) + { + ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase *>( SfxViewShell::Current() ); + if(pBase) + pViewSh = pBase->GetMainViewShell().get(); + } + if( !pDoc && pViewSh ) + pDoc = pViewSh->GetDoc(); + + bool bMasterView; + SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView ); + + sal_uInt16 nPageCount = 0; + + if( !bMasterView ) + { + if( pPage && (pPage->GetPageKind() == PageKind::Handout) && pViewSh ) + { + nPageCount = pViewSh->GetPrintedHandoutPageCount(); + } + else if( pDoc ) + { + nPageCount = pDoc->GetActiveSdPageCount(); + } + } + + if( nPageCount > 0 ) + aRepresentation = pDoc->CreatePageNumValue(nPageCount); + else + aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_COUNT); + + pInfo->SetRepresentation( aRepresentation ); + } + else if( (pURLField = dynamic_cast< const SvxURLField* >(pField)) != nullptr ) + { + switch ( pURLField->GetFormat() ) + { + case SvxURLFormat::AppDefault: //!!! adjustable at App??? + case SvxURLFormat::Repr: + pInfo->SetRepresentation( pURLField->GetRepresentation() ); + break; + + case SvxURLFormat::Url: + pInfo->SetRepresentation( pURLField->GetURL() ); + break; + } + + const OUString& aURL = pURLField->GetURL(); + + svtools::ColorConfig aConfig; + svtools::ColorConfigEntry eEntry = + INetURLHistory::GetOrCreate()->QueryUrl( aURL ) ? svtools::LINKSVISITED : svtools::LINKS; + pInfo->SetTextColor( aConfig.GetColorValue(eEntry).nColor ); + } + else if ( dynamic_cast< const SdrMeasureField* >(pField)) + { + pInfo->SetFieldColor(std::optional()); // clear the field color + } + else if ((pCustomPropertyField = dynamic_cast(pField)) != nullptr) + { + try + { + SfxObjectShell* pObjSh = SfxObjectShell::Current(); + if (pObjSh && pObjSh->IsLoadingFinished()) + { + auto pNonConstCustomPropertyField = const_cast(pCustomPropertyField); + OUString sCurrent = pNonConstCustomPropertyField->GetFormatted(pObjSh->getDocProperties()); + pInfo->SetRepresentation(sCurrent); + } + else + pInfo->SetRepresentation(pCustomPropertyField->GetCurrentPresentation()); + } + catch (...) + { + pInfo->SetRepresentation(pCustomPropertyField->GetCurrentPresentation()); + } + } + else + { + OUString aRepresentation; + + bool bHeaderField = dynamic_cast< const SvxHeaderField* >( pField ) != nullptr; + bool bFooterField = !bHeaderField && (dynamic_cast< const SvxFooterField* >( pField ) != nullptr ); + bool bDateTimeField = !bHeaderField && !bFooterField && (dynamic_cast< const SvxDateTimeField* >( pField ) != nullptr); + + if( bHeaderField || bFooterField || bDateTimeField ) + { + sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr; + bool bMasterView = false; + SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView ); + + if( (pPage == nullptr) || bMasterView ) + { + if( bHeaderField ) + aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_HEADER); + else if (bFooterField ) + aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_FOOTER); + else if (bDateTimeField ) + aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_DATETIME); + } + else + { + const sd::HeaderFooterSettings &rSettings = pPage->getHeaderFooterSettings(); + + if( bHeaderField ) + { + aRepresentation = rSettings.maHeaderText; + } + else if( bFooterField ) + { + aRepresentation = rSettings.maFooterText; + } + else if( bDateTimeField ) + { + if( rSettings.mbDateTimeIsFixed ) + { + aRepresentation = rSettings.maDateTimeText; + } + else + { + DateTime aDateTime( DateTime::SYSTEM ); + LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() ); + aRepresentation = SvxDateTimeField::GetFormatted( aDateTime, aDateTime, + rSettings.meDateFormat, rSettings.meTimeFormat, *GetNumberFormatter(), eLang ); + } + } + } + } + else + { + OSL_FAIL("sd::SdModule::CalcFieldValueHdl(), unknown field type!"); + } + + if( aRepresentation.isEmpty() ) // TODO: Edit engine doesn't handle empty fields? + aRepresentation = " "; + pInfo->SetRepresentation( aRepresentation ); + } +} + +/** + * virtual methods for option dialog + */ +std::optional SdModule::CreateItemSet( sal_uInt16 nSlot ) +{ + ::sd::FrameView* pFrameView = nullptr; + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + SdDrawDocument* pDoc = nullptr; + + // Here we set the DocType of the option dialog (not document!) + DocumentType eDocType = DocumentType::Impress; + if( nSlot == SID_SD_GRAPHIC_OPTIONS ) + eDocType = DocumentType::Draw; + + if (pDocSh) + { + pDoc = pDocSh->GetDoc(); + + // If the option dialog is identical to the document type, + // we can pass the FrameView too: + if( pDoc && eDocType == pDoc->GetDocumentType() ) + pFrameView = pDocSh->GetFrameView(); + + ::sd::ViewShell* pViewShell = pDocSh->GetViewShell(); + if (pViewShell != nullptr) + pViewShell->WriteFrameViewData(); + } + + SdOptions* pOptions = GetSdOptions(eDocType); + + // Pool has by default MapUnit Twips (Awgh!) + SfxItemPool& rPool = GetPool(); + rPool.SetDefaultMetric( MapUnit::Map100thMM ); + + SfxItemSetFixed< + SID_ATTR_GRID_OPTIONS, SID_ATTR_GRID_OPTIONS, + SID_ATTR_METRIC, SID_ATTR_METRIC, + SID_ATTR_DEFTABSTOP, SID_ATTR_DEFTABSTOP, + ATTR_OPTIONS_LAYOUT, ATTR_OPTIONS_SCALE_END> aRet(rPool); + + // TP_OPTIONS_LAYOUT: + aRet.Put( SdOptionsLayoutItem( pOptions, pFrameView ) ); + + sal_uInt16 nDefTab = 0; + if( pFrameView) + nDefTab = pDoc->GetDefaultTabulator(); + else + nDefTab = pOptions->GetDefTab(); + aRet.Put( SfxUInt16Item( SID_ATTR_DEFTABSTOP, nDefTab ) ); + + FieldUnit nMetric = FieldUnit(0xffff); + if( pFrameView) + nMetric = pDoc->GetUIUnit(); + else + nMetric = static_cast(pOptions->GetMetric()); + + if( nMetric == FieldUnit(0xffff) ) + nMetric = GetFieldUnit(); + + aRet.Put( SfxUInt16Item( SID_ATTR_METRIC, static_cast(nMetric) ) ); + + // TP_OPTIONS_MISC: + SdOptionsMiscItem aSdOptionsMiscItem( pOptions, pFrameView ); + if ( pFrameView ) + { + aSdOptionsMiscItem.GetOptionsMisc().SetSummationOfParagraphs( pDoc->IsSummationOfParagraphs() ); + aSdOptionsMiscItem.GetOptionsMisc().SetPrinterIndependentLayout ( + static_cast(pDoc->GetPrinterIndependentLayout())); + } + aRet.Put( aSdOptionsMiscItem ); + + // TP_OPTIONS_SNAP: + aRet.Put( SdOptionsSnapItem( pOptions, pFrameView ) ); + + // TP_SCALE: + sal_uInt32 nW = 10; + sal_uInt32 nH = 10; + sal_Int32 nX; + sal_Int32 nY; + if( pDocSh ) + { + SdrPage* pPage = pDoc->GetSdPage(0, PageKind::Standard); + Size aSize(pPage->GetSize()); + nW = aSize.Width(); + nH = aSize.Height(); + } + + if(pFrameView) + { + const Fraction& rFraction = pDoc->GetUIScale(); + nX=rFraction.GetNumerator(); + nY=rFraction.GetDenominator(); + } + else + { + // Get options from configuration file + pOptions->GetScale( nX, nY ); + } + + aRet.Put( SfxInt32Item( ATTR_OPTIONS_SCALE_X, nX ) ); + aRet.Put( SfxInt32Item( ATTR_OPTIONS_SCALE_Y, nY ) ); + aRet.Put( SfxUInt32Item( ATTR_OPTIONS_SCALE_WIDTH, nW ) ); + aRet.Put( SfxUInt32Item( ATTR_OPTIONS_SCALE_HEIGHT, nH ) ); + + // TP_OPTIONS_PRINT: + aRet.Put( SdOptionsPrintItem( pOptions ) ); + + // RID_SVXPAGE_GRID: + aRet.Put( SdOptionsGridItem( pOptions ) ); + + return aRet; +} + +void SdModule::ApplyItemSet( sal_uInt16 nSlot, const SfxItemSet& rSet ) +{ + bool bNewDefTab = false; + bool bNewPrintOptions = false; + bool bMiscOptions = false; + + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + SdDrawDocument* pDoc = nullptr; + // Here we set the DocType of the option dialog (not document!) + DocumentType eDocType = DocumentType::Impress; + if( nSlot == SID_SD_GRAPHIC_OPTIONS ) + eDocType = DocumentType::Draw; + + ::sd::ViewShell* pViewShell = nullptr; + + if (pDocSh) + { + pDoc = pDocSh->GetDoc(); + + pViewShell = pDocSh->GetViewShell(); + if (pViewShell != nullptr) + pViewShell->WriteFrameViewData(); + } + SdOptions* pOptions = GetSdOptions(eDocType); + // Grid + if( const SdOptionsGridItem* pGridItem = static_cast(rSet.GetItemIfSet( SID_ATTR_GRID_OPTIONS, false )) ) + { + pGridItem->SetOptions( pOptions ); + } + + // Layout + if( const SdOptionsLayoutItem* pLayoutItem = rSet.GetItemIfSet( ATTR_OPTIONS_LAYOUT, false )) + { + pLayoutItem->SetOptions( pOptions ); + } + + // Metric + if( const SfxUInt16Item* pItem = rSet.GetItemIfSet( SID_ATTR_METRIC, false ) ) + { + if( pDoc && eDocType == pDoc->GetDocumentType() ) + PutItem( *pItem ); + pOptions->SetMetric( pItem->GetValue() ); + } + sal_uInt16 nDefTab = pOptions->GetDefTab(); + // Default-Tabulator + if( const SfxUInt16Item* pItem = rSet.GetItemIfSet( SID_ATTR_DEFTABSTOP, false ) ) + { + nDefTab = pItem->GetValue(); + pOptions->SetDefTab( nDefTab ); + + bNewDefTab = true; + } + + // Scale + if( const SfxInt32Item* pItem = rSet.GetItemIfSet( ATTR_OPTIONS_SCALE_X, false ) ) + { + sal_Int32 nX = pItem->GetValue(); + pItem = rSet.GetItemIfSet( ATTR_OPTIONS_SCALE_Y, false ); + if( pItem ) + { + sal_Int32 nY = pItem->GetValue(); + pOptions->SetScale( nX, nY ); + + // Apply to document only if doc type match + if( pDocSh && pDoc && eDocType == pDoc->GetDocumentType() ) + { + pDoc->SetUIScale( Fraction( nX, nY ) ); + if( pViewShell ) + pViewShell->SetRuler( pViewShell->HasRuler() ); + } + } + } + + // Misc + const SdOptionsMiscItem* pMiscItem = rSet.GetItemIfSet( ATTR_OPTIONS_MISC, false); + if( pMiscItem ) + { + pMiscItem->SetOptions( pOptions ); + bMiscOptions = true; + } + + // Snap + const SdOptionsSnapItem* pSnapItem = rSet.GetItemIfSet( ATTR_OPTIONS_SNAP, false ); + if( pSnapItem ) + { + pSnapItem->SetOptions( pOptions ); + } + + SfxItemSetFixed aPrintSet( GetPool() ); + + // Print + const SdOptionsPrintItem* pPrintItem = rSet.GetItemIfSet( ATTR_OPTIONS_PRINT, false); + if( pPrintItem ) + { + pPrintItem->SetOptions( pOptions ); + + // set PrintOptionsSet + SdOptionsPrintItem aPrintItem( pOptions ); + SfxFlagItem aFlagItem( SID_PRINTER_CHANGESTODOC ); + SfxPrinterChangeFlags nFlags = + (aPrintItem.GetOptionsPrint().IsWarningSize() ? SfxPrinterChangeFlags::CHG_SIZE : SfxPrinterChangeFlags::NONE) | + (aPrintItem.GetOptionsPrint().IsWarningOrientation() ? SfxPrinterChangeFlags::CHG_ORIENTATION : SfxPrinterChangeFlags::NONE); + aFlagItem.SetValue( static_cast(nFlags) ); + + aPrintSet.Put( aPrintItem ); + aPrintSet.Put( SfxBoolItem( SID_PRINTER_NOTFOUND_WARN, aPrintItem.GetOptionsPrint().IsWarningPrinter() ) ); + aPrintSet.Put( aFlagItem ); + + bNewPrintOptions = true; + } + + // Only if also the document type matches... + if( pDocSh && pDoc && eDocType == pDoc->GetDocumentType() ) + { + if( bNewPrintOptions ) + { + pDocSh->GetPrinter(true)->SetOptions( aPrintSet ); + } + + // set DefTab at Model + if( bNewDefTab ) + { + SdDrawDocument* pDocument = pDocSh->GetDoc(); + pDocument->SetDefaultTabulator( nDefTab ); + + SdOutliner* pOutl = pDocument->GetOutliner( false ); + if( pOutl ) + pOutl->SetDefTab( nDefTab ); + + SdOutliner* pInternalOutl = pDocument->GetInternalOutliner( false ); + if( pInternalOutl ) + pInternalOutl->SetDefTab( nDefTab ); + } + if ( bMiscOptions ) + { + pDoc->SetSummationOfParagraphs( pMiscItem->GetOptionsMisc().IsSummationOfParagraphs() ); + EEControlBits nSum = pMiscItem->GetOptionsMisc().IsSummationOfParagraphs() ? EEControlBits::ULSPACESUMMATION : EEControlBits::NONE; + EEControlBits nCntrl; + + SdDrawDocument* pDocument = pDocSh->GetDoc(); + SdrOutliner& rOutl = pDocument->GetDrawOutliner(); + nCntrl = rOutl.GetControlWord() &~ EEControlBits::ULSPACESUMMATION; + rOutl.SetControlWord( nCntrl | nSum ); + SdOutliner* pOutl = pDocument->GetOutliner( false ); + if( pOutl ) + { + nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION; + pOutl->SetControlWord( nCntrl | nSum ); + } + pOutl = pDocument->GetInternalOutliner( false ); + if( pOutl ) + { + nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION; + pOutl->SetControlWord( nCntrl | nSum ); + } + + // Set printer independent layout mode. + if( pDoc->GetPrinterIndependentLayout() != pMiscItem->GetOptionsMisc().GetPrinterIndependentLayout() ) + pDoc->SetPrinterIndependentLayout (pMiscItem->GetOptionsMisc().GetPrinterIndependentLayout()); + } + } + + pOptions->StoreConfig(); + + // Only if also the document type matches... + if( pDocSh && pDoc && eDocType == pDoc->GetDocumentType() ) + { + FieldUnit eUIUnit = static_cast(pOptions->GetMetric()); + pDoc->SetUIUnit(eUIUnit); + + if (pViewShell) + { + // make sure no one is in text edit mode, cause there + // are some pointers remembered else (!) + if(pViewShell->GetView()) + pViewShell->GetView()->SdrEndTextEdit(); + + ::sd::FrameView* pFrame = pViewShell->GetFrameView(); + pFrame->Update(pOptions); + pViewShell->ReadFrameViewData(pFrame); + pViewShell->SetUIUnit(eUIUnit); + pViewShell->SetDefTabHRuler( nDefTab ); + } + } + + if( pViewShell && pViewShell->GetViewFrame() ) + pViewShell->GetViewFrame()->GetBindings().InvalidateAll( true ); +} + +std::unique_ptr SdModule::CreateTabPage( sal_uInt16 nId, weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet ) +{ + std::unique_ptr xRet; + SfxAllItemSet aSet(*(rSet.GetPool())); + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + + switch(nId) + { + case SID_SD_TP_CONTENTS: + case SID_SI_TP_CONTENTS: + { + ::CreateTabPage fnCreatePage = pFact->GetSdOptionsContentsTabPageCreatorFunc(); + if( fnCreatePage ) + { + xRet = (*fnCreatePage)( pPage, pController, &rSet ); + if (SID_SD_TP_CONTENTS == nId) + aSet.Put(SfxUInt32Item(SID_SDMODE_FLAG, SD_DRAW_MODE)); + else + aSet.Put(SfxUInt32Item(SID_SDMODE_FLAG, SD_IMPRESS_MODE)); + xRet->PageCreated(aSet); + } + } + break; + case SID_SD_TP_SNAP: + case SID_SI_TP_SNAP: + { + ::CreateTabPage fnCreatePage = pFact->GetSdOptionsSnapTabPageCreatorFunc(); + if( fnCreatePage ) + xRet = (*fnCreatePage)( pPage, pController, &rSet ); + } + break; + case SID_SD_TP_PRINT: + case SID_SI_TP_PRINT: + { + ::CreateTabPage fnCreatePage = pFact->GetSdPrintOptionsTabPageCreatorFunc(); + if( fnCreatePage ) + { + xRet = (*fnCreatePage)( pPage, pController, &rSet ); + if(SID_SD_TP_PRINT == nId) + aSet.Put (SfxUInt32Item(SID_SDMODE_FLAG,SD_DRAW_MODE)); + xRet->PageCreated(aSet); + } + } + break; + case SID_SI_TP_MISC: + case SID_SD_TP_MISC: + { + ::CreateTabPage fnCreatePage = pFact->GetSdOptionsMiscTabPageCreatorFunc(); + if( fnCreatePage ) + { + xRet = (*fnCreatePage)( pPage, pController, &rSet ); + if(SID_SD_TP_MISC == nId) + aSet.Put (SfxUInt32Item(SID_SDMODE_FLAG,SD_DRAW_MODE)); + else + aSet.Put (SfxUInt32Item(SID_SDMODE_FLAG,SD_IMPRESS_MODE)); + xRet->PageCreated(aSet); + } + } + break; + case RID_SVXPAGE_TEXTANIMATION : + { + SfxAbstractDialogFactory* pSfxFact = SfxAbstractDialogFactory::Create(); + ::CreateTabPage fnCreatePage = pSfxFact->GetTabPageCreatorFunc( nId ); + if ( fnCreatePage ) + xRet = (*fnCreatePage)( pPage, pController, &rSet ); + } + break; + } + DBG_ASSERT( xRet, "SdModule::CreateTabPage(): no valid ID for TabPage!" ); + + return xRet; +} + +std::optional SdModule::CreateStyleFamilies() +{ + SfxStyleFamilies aStyleFamilies; + + aStyleFamilies.emplace_back(SfxStyleFamily::Para, + SdResId(STR_GRAPHICS_STYLE_FAMILY), + BMP_STYLES_FAMILY_GRAPHICS, + RID_GRAPHICSTYLEFAMILY, SD_MOD()->GetResLocale()); + + aStyleFamilies.emplace_back(SfxStyleFamily::Pseudo, + SdResId(STR_PRESENTATIONS_STYLE_FAMILY), + BMP_STYLES_FAMILY_PRESENTATIONS, + RID_PRESENTATIONSTYLEFAMILY, SD_MOD()->GetResLocale()); + + return aStyleFamilies; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/sdpopup.cxx b/sd/source/ui/app/sdpopup.cxx new file mode 100644 index 0000000000..a303817eeb --- /dev/null +++ b/sd/source/ui/app/sdpopup.cxx @@ -0,0 +1,318 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/* + * Popup menu for editing of field command + */ +SdFieldPopup::SdFieldPopup(const SvxFieldData* pInField, LanguageType eLanguage) + : m_xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/fieldmenu.ui")) + , m_xPopup(m_xBuilder->weld_menu("menu")) + , m_pField(pInField) +{ + Fill(eLanguage); +} + +SdFieldPopup::~SdFieldPopup() +{ +} + +void SdFieldPopup::Fill( LanguageType eLanguage ) +{ + sal_uInt16 nID = 1; + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FIX)); + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_VAR)); + m_xPopup->append_separator("separator1"); + + if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) ) + { + SvxDateField aDateField( *pDateField ); + + if (pDateField->GetType() == SvxDateType::Fix) + m_xPopup->set_active("1", true); + else + m_xPopup->set_active("2", true); + + //SvxDateFormat::AppDefault, // is not used + //SvxDateFormat::System, // is not used + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_STANDARD_SMALL)); + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_STANDARD_BIG)); + + SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter(); + aDateField.SetFormat( SvxDateFormat::A ); // 13.02.96 + m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage)); + aDateField.SetFormat( SvxDateFormat::B ); // 13.02.1996 + m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage)); + aDateField.SetFormat( SvxDateFormat::C ); // 13.Feb 1996 + m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage)); + + aDateField.SetFormat( SvxDateFormat::D ); // 13.Februar 1996 + m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage)); + aDateField.SetFormat( SvxDateFormat::E ); // Die, 13.Februar 1996 + m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage)); + aDateField.SetFormat( SvxDateFormat::F ); // Dienstag, 13.Februar 1996 + m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage)); + + m_xPopup->set_active(OUString::number(static_cast( pDateField->GetFormat() ) + 1), true); // - 2 + 3 ! + } + else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) ) + { + SvxExtTimeField aTimeField( *pTimeField ); + + if( pTimeField->GetType() == SvxTimeType::Fix ) + m_xPopup->set_active("1", true); + else + m_xPopup->set_active("2", true); + + //SvxTimeFormat::AppDefault, // is not used + //SvxTimeFormat::System, // is not used + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_STANDARD_NORMAL)); + + SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter(); + aTimeField.SetFormat( SvxTimeFormat::HH24_MM ); // 13:49 + m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage)); + aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS ); // 13:49:38 + m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage)); + aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS_00 ); // 13:49:38.78 + m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage)); + + aTimeField.SetFormat( SvxTimeFormat::HH12_MM ); // 01:49 + m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage)); + aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS ); // 01:49:38 + m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage)); + aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS_00 ); // 01:49:38.78 + m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage)); + //SvxTimeFormat::HH12_MM_AMPM, // 01:49 PM + //SvxTimeFormat::HH12_MM_SS_AMPM, // 01:49:38 PM + //SvxTimeFormat::HH12_MM_SS_00_AMPM // 01:49:38.78 PM + + m_xPopup->set_active(OUString::number(static_cast( pTimeField->GetFormat() ) + 1), true); // - 2 + 3 ! + } + else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) ) + { + //SvxExtFileField aFileField( *pFileField ); + + if( pFileField->GetType() == SvxFileType::Fix ) + m_xPopup->set_active("1", true); + else + m_xPopup->set_active("2", true); + + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_NAME_EXT)); + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_FULLPATH)); + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_PATH)); + m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_NAME)); + + m_xPopup->set_active(OUString::number(static_cast( pFileField->GetFormat() ) + 3), true); + } + else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) ) + { + SvxAuthorField aAuthorField( *pAuthorField ); + + if( pAuthorField->GetType() == SvxAuthorType::Fix ) + m_xPopup->set_active("1", true); + else + m_xPopup->set_active("2", true); + + for( sal_uInt16 i = 0; i < 4; i++ ) + { + aAuthorField.SetFormat( static_cast(i) ); + m_xPopup->append_radio(OUString::number(nID++), aAuthorField.GetFormatted()); + } + m_xPopup->set_active(OUString::number(static_cast( pAuthorField->GetFormat() ) + 3), true); + } +} + +void SdFieldPopup::Execute(weld::Window* pParent, const tools::Rectangle& rRect) +{ + OUString sIdent = m_xPopup->popup_at_rect(pParent, rRect); + if (sIdent.isEmpty()) + return; + + if (sIdent == "1" || sIdent == "2") + { + m_xPopup->set_active("1", sIdent == "1"); + m_xPopup->set_active("2", sIdent == "2"); + } + else + { + int nCount = m_xPopup->n_children(); + for (int i = 3; i < nCount; i++) + m_xPopup->set_active( + OUString::number(i), sIdent == std::u16string_view(OUString::number(i))); + } +} + +/** + * Returns a new field, owned by caller. + * Returns NULL if nothing changed. + */ +SvxFieldData* SdFieldPopup::GetField() +{ + SvxFieldData* pNewField = nullptr; + + sal_uInt16 nCount = m_xPopup->n_children(); + + if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) ) + { + SvxDateType eType; + SvxDateFormat eFormat; + sal_uInt16 i; + + if (m_xPopup->get_active("1")) + eType = SvxDateType::Fix; + else + eType = SvxDateType::Var; + + for( i = 3; i < nCount; i++ ) + { + if (m_xPopup->get_active(OUString::number(i))) + break; + } + eFormat = static_cast( i - 1 ); + + if( pDateField->GetFormat() != eFormat || + pDateField->GetType() != eType ) + { + pNewField = new SvxDateField( *pDateField ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + + if( (pDateField->GetType() == SvxDateType::Var) && (eType == SvxDateType::Fix) ) + { + Date aDate( Date::SYSTEM ); + static_cast( pNewField )->SetFixDate( aDate ); + } + } + } + else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) ) + { + SvxTimeType eType; + SvxTimeFormat eFormat; + sal_uInt16 i; + + if (m_xPopup->get_active("1")) + eType = SvxTimeType::Fix; + else + eType = SvxTimeType::Var; + + for( i = 3; i < nCount; i++ ) + { + if (m_xPopup->get_active(OUString::number(i))) + break; + } + eFormat = static_cast( i - 1 ); + + if( pTimeField->GetFormat() != eFormat || + pTimeField->GetType() != eType ) + { + pNewField = new SvxExtTimeField( *pTimeField ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + + if( (pTimeField->GetType() == SvxTimeType::Var) && (eType == SvxTimeType::Fix) ) + { + tools::Time aTime( tools::Time::SYSTEM ); + static_cast( pNewField )->SetFixTime( aTime ); + } + + } + } + else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) ) + { + SvxFileType eType; + SvxFileFormat eFormat; + sal_uInt16 i; + + if (m_xPopup->get_active("1")) + eType = SvxFileType::Fix; + else + eType = SvxFileType::Var; + + for( i = 3; i < nCount; i++ ) + { + if (m_xPopup->get_active(OUString::number(i))) + break; + } + eFormat = static_cast( i - 3 ); + + if( pFileField->GetFormat() != eFormat || + pFileField->GetType() != eType ) + { + ::sd::DrawDocShell* pDocSh = dynamic_cast<::sd::DrawDocShell* >( SfxObjectShell::Current() ); + + if( pDocSh ) + { + OUString aName; + if( pDocSh->HasName() ) + aName = pDocSh->GetMedium()->GetName(); + + // Get current filename, not the one stored in the old field + pNewField = new SvxExtFileField( aName ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + } + } + } + else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) ) + { + SvxAuthorType eType; + SvxAuthorFormat eFormat; + sal_uInt16 i; + + if (m_xPopup->get_active("1")) + eType = SvxAuthorType::Fix; + else + eType = SvxAuthorType::Var; + + for( i = 3; i < nCount; i++ ) + { + if (m_xPopup->get_active(OUString::number(i))) + break; + } + eFormat = static_cast( i - 3 ); + + if( pAuthorField->GetFormat() != eFormat || + pAuthorField->GetType() != eType ) + { + // Get current state of address, not the old one + SvtUserOptions aUserOptions; + pNewField = new SvxAuthorField( aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + } + } + return pNewField; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/sdxfer.cxx b/sd/source/ui/app/sdxfer.cxx new file mode 100644 index 0000000000..74728dd0e6 --- /dev/null +++ b/sd/source/ui/app/sdxfer.cxx @@ -0,0 +1,780 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::datatransfer; +using namespace ::com::sun::star::datatransfer::clipboard; + +constexpr sal_uInt32 SDTRANSFER_OBJECTTYPE_DRAWMODEL = 1; +constexpr sal_uInt32 SDTRANSFER_OBJECTTYPE_DRAWOLE = 2; + +SdTransferable::SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, bool bInitOnGetData ) +: mpPageDocShell( nullptr ) +, mpSdView( pWorkView ) +, mpSdViewIntern( pWorkView ) +, mpSdDrawDocument( nullptr ) +, mpSdDrawDocumentIntern( nullptr ) +, mpSourceDoc( pSrcDoc ) +, mpVDev( nullptr ) +, mbInternalMove( false ) +, mbOwnDocument( false ) +, mbOwnView( false ) +, mbLateInit( bInitOnGetData ) +, mbPageTransferable( false ) +, mbPageTransferablePersistent( false ) +{ + if( mpSourceDoc ) + StartListening( *mpSourceDoc ); + + if( pWorkView ) + StartListening( *pWorkView ); + + if( !mbLateInit ) + CreateData(); +} + +SdTransferable::~SdTransferable() +{ + SolarMutexGuard g; + + if( mpSourceDoc ) + EndListening( *mpSourceDoc ); + + if( mpSdView ) + EndListening( *const_cast< sd::View *>( mpSdView) ); + + ObjectReleased(); + + if( mbOwnView ) + delete mpSdViewIntern; + + mpOLEDataHelper.reset(); + + if( maDocShellRef.is() ) + { + SfxObjectShell* pObj = maDocShellRef.get(); + ::sd::DrawDocShell* pDocSh = static_cast< ::sd::DrawDocShell*>(pObj); + pDocSh->DoClose(); + } + + maDocShellRef.clear(); + + if( mbOwnDocument ) + delete mpSdDrawDocumentIntern; + + moGraphic.reset(); + moBookmark.reset(); + mpImageMap.reset(); + + mpVDev.disposeAndClear(); + mpObjDesc.reset(); + + //call explicitly at end of dtor to be covered by above SolarMutex + maUserData.clear(); +} + +void SdTransferable::CreateObjectReplacement( SdrObject* pObj ) +{ + if( !pObj ) + return; + + mpOLEDataHelper.reset(); + moGraphic.reset(); + moBookmark.reset(); + mpImageMap.reset(); + + if( auto pOleObj = dynamic_cast< SdrOle2Obj* >( pObj ) ) + { + try + { + uno::Reference < embed::XEmbeddedObject > xObj = pOleObj->GetObjRef(); + uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY ); + if( xObj.is() && xPersist.is() && xPersist->hasEntry() ) + { + mpOLEDataHelper.reset( new TransferableDataHelper( new SvEmbedTransferHelper( xObj, pOleObj->GetGraphic(), pOleObj->GetAspect() ) ) ); + + // TODO/LATER: the standalone handling of the graphic should not be used any more in future + // The EmbedDataHelper should bring the graphic in future + const Graphic* pObjGr = pOleObj->GetGraphic(); + if ( pObjGr ) + moGraphic.emplace(*pObjGr); + } + } + catch( uno::Exception& ) + {} + } + else if( dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr && (mpSourceDoc && !SdDrawDocument::GetAnimationInfo( pObj )) ) + { + moGraphic.emplace( static_cast< SdrGrafObj* >( pObj )->GetTransformedGraphic() ); + } + else if( pObj->IsUnoObj() && SdrInventor::FmForm == pObj->GetObjInventor() && ( pObj->GetObjIdentifier() == SdrObjKind::FormButton ) ) + { + SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pObj ); + + if (SdrInventor::FmForm == pUnoCtrl->GetObjInventor()) + { + const Reference< css::awt::XControlModel >& xControlModel( pUnoCtrl->GetUnoControlModel() ); + + if( !xControlModel.is() ) + return; + + Reference< css::beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY ); + + if( !xPropSet.is() ) + return; + + css::form::FormButtonType eButtonType; + Any aTmp( xPropSet->getPropertyValue( "ButtonType" ) ); + + if( aTmp >>= eButtonType ) + { + OUString aLabel, aURL; + + xPropSet->getPropertyValue( "Label" ) >>= aLabel; + xPropSet->getPropertyValue( "TargetURL" ) >>= aURL; + + moBookmark.emplace( aURL, aLabel ); + } + } + } + else if( auto pTextObj = DynCastSdrTextObj( pObj ) ) + { + const OutlinerParaObject* pPara; + + if( (pPara = pTextObj->GetOutlinerParaObject()) != nullptr ) + { + const SvxFieldItem* pField; + + if( (pField = pPara->GetTextObject().GetField()) != nullptr ) + { + const SvxFieldData* pData = pField->GetField(); + + if( auto pURL = dynamic_cast< const SvxURLField *>( pData ) ) + { + // #i63399# This special code identifies TextFrames which have just a URL + // as content and directly add this to the clipboard, probably to avoid adding + // an unnecessary DrawObject to the target where paste may take place. This is + // wanted only for SdrObjects with no fill and no line, else it is necessary to + // use the whole SdrObject. Test here for Line/FillStyle and take shortcut only + // when both are unused + if(!pObj->HasFillStyle() && !pObj->HasLineStyle()) + { + moBookmark.emplace( pURL->GetURL(), pURL->GetRepresentation() ); + } + } + } + } + } + + SvxIMapInfo* pInfo = SvxIMapInfo::GetIMapInfo( pObj ); + + if( pInfo ) + mpImageMap.reset( new ImageMap( pInfo->GetImageMap() ) ); +} + +void SdTransferable::CreateData() +{ + if( mpSdDrawDocument && !mpSdViewIntern ) + { + mbOwnView = true; + + SdPage* pPage = mpSdDrawDocument->GetSdPage(0, PageKind::Standard); + + if( pPage && 1 == pPage->GetObjCount() ) + CreateObjectReplacement( pPage->GetObj( 0 ) ); + + mpVDev = VclPtr::Create( *Application::GetDefaultDevice() ); + mpVDev->SetMapMode(MapMode(mpSdDrawDocumentIntern->GetScaleUnit())); + mpSdViewIntern = new ::sd::View( *mpSdDrawDocumentIntern, mpVDev ); + mpSdViewIntern->EndListening(*mpSdDrawDocumentIntern ); + mpSdViewIntern->hideMarkHandles(); + SdrPageView* pPageView = mpSdViewIntern->ShowSdrPage(pPage); + mpSdViewIntern->MarkAllObj(pPageView); + } + else if( mpSdView && !mpSdDrawDocumentIntern ) + { + const SdrMarkList& rMarkList = mpSdView->GetMarkedObjectList(); + + if( rMarkList.GetMarkCount() == 1 ) + CreateObjectReplacement( rMarkList.GetMark( 0 )->GetMarkedSdrObj() ); + + if( mpSourceDoc ) + mpSourceDoc->CreatingDataObj(this); + mpSdDrawDocumentIntern = static_cast( mpSdView->CreateMarkedObjModel().release() ); + if( mpSourceDoc ) + mpSourceDoc->CreatingDataObj(nullptr); + + if( !maDocShellRef.is() && mpSdDrawDocumentIntern->GetDocSh() ) + maDocShellRef = mpSdDrawDocumentIntern->GetDocSh(); + + if( !maDocShellRef.is() ) + { + OSL_FAIL( "SdTransferable::CreateData(), failed to create a model with persist, clipboard operation will fail for OLE objects!" ); + mbOwnDocument = true; + } + + // Use dimension of source page + SdrPageView* pPgView = mpSdView->GetSdrPageView(); + SdPage* pOldPage = static_cast( pPgView->GetPage() ); + SdStyleSheetPool* pOldStylePool = static_cast(mpSdView->GetModel().GetStyleSheetPool()); + SdStyleSheetPool* pNewStylePool = static_cast( mpSdDrawDocumentIntern->GetStyleSheetPool() ); + SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PageKind::Standard ); + OUString aOldLayoutName( pOldPage->GetLayoutName() ); + + pPage->SetSize( pOldPage->GetSize() ); + pPage->SetLayoutName( aOldLayoutName ); + pNewStylePool->CopyGraphicSheets( *pOldStylePool ); + pNewStylePool->CopyCellSheets( *pOldStylePool ); + pNewStylePool->CopyTableStyles( *pOldStylePool ); + sal_Int32 nPos = aOldLayoutName.indexOf( SD_LT_SEPARATOR ); + if( nPos != -1 ) + aOldLayoutName = aOldLayoutName.copy( 0, nPos ); + StyleSheetCopyResultVector aCreatedSheets; + pNewStylePool->CopyLayoutSheets( aOldLayoutName, *pOldStylePool, aCreatedSheets ); + } + + // set VisArea and adjust objects if necessary + if( !(maVisArea.IsEmpty() && + mpSdDrawDocumentIntern && mpSdViewIntern && + mpSdDrawDocumentIntern->GetPageCount()) ) + return; + + SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PageKind::Standard ); + + if( 1 == mpSdDrawDocumentIntern->GetPageCount() ) + { + // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get + // fat lines correctly + maVisArea = mpSdViewIntern->GetAllMarkedBoundRect(); + Point aOrigin( maVisArea.TopLeft() ); + Size aVector( -aOrigin.X(), -aOrigin.Y() ); + + for (const rtl::Reference& pObj : *pPage) + pObj->NbcMove( aVector ); + } + else + maVisArea.SetSize( pPage->GetSize() ); + + // output is at the zero point + maVisArea.SetPos( Point() ); +} + +static bool lcl_HasOnlyControls( SdrModel* pModel ) +{ + bool bOnlyControls = false; // default if there are no objects + + if ( pModel ) + { + SdrPage* pPage = pModel->GetPage(0); + if (pPage) + { + SdrObjListIter aIter( pPage, SdrIterMode::DeepNoGroups ); + SdrObject* pObj = aIter.Next(); + if ( pObj ) + { + bOnlyControls = true; // only set if there are any objects at all + while ( pObj ) + { + if (dynamic_cast< const SdrUnoObj *>( pObj ) == nullptr) + { + bOnlyControls = false; + break; + } + pObj = aIter.Next(); + } + } + } + } + + return bOnlyControls; +} + +static bool lcl_HasOnlyOneTable( SdrModel* pModel ) +{ + if ( pModel ) + { + SdrPage* pPage = pModel->GetPage(0); + if (pPage && pPage->GetObjCount() == 1 ) + { + if( dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) ) != nullptr ) + return true; + } + } + return false; +} + +void SdTransferable::AddSupportedFormats() +{ + if( mbPageTransferable && !mbPageTransferablePersistent ) + return; + + if( !mbLateInit ) + CreateData(); + + if( mpObjDesc ) + AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR ); + + if( mpOLEDataHelper ) + { + AddFormat( SotClipboardFormatId::EMBED_SOURCE ); + + DataFlavorExVector aVector( mpOLEDataHelper->GetDataFlavorExVector() ); + + for( const auto& rItem : aVector ) + AddFormat( rItem ); + } + else if( moGraphic ) + { + // #i25616# + AddFormat( SotClipboardFormatId::DRAWING ); + + AddFormat( SotClipboardFormatId::SVXB ); + + if( moGraphic->GetType() == GraphicType::Bitmap ) + { + AddFormat( SotClipboardFormatId::PNG ); + AddFormat( SotClipboardFormatId::BITMAP ); + AddFormat( SotClipboardFormatId::GDIMETAFILE ); + } + else + { + AddFormat( SotClipboardFormatId::GDIMETAFILE ); + AddFormat( SotClipboardFormatId::PNG ); + AddFormat( SotClipboardFormatId::BITMAP ); + } + } + else if( moBookmark ) + { + AddFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ); + AddFormat( SotClipboardFormatId::STRING ); + } + else + { + AddFormat( SotClipboardFormatId::EMBED_SOURCE ); + AddFormat( SotClipboardFormatId::DRAWING ); + if( !mpSdDrawDocument || !lcl_HasOnlyControls( mpSdDrawDocument ) ) + { + AddFormat( SotClipboardFormatId::GDIMETAFILE ); + AddFormat( SotClipboardFormatId::PNG ); + AddFormat( SotClipboardFormatId::BITMAP ); + } + + if( lcl_HasOnlyOneTable( mpSdDrawDocument ) ) { + AddFormat( SotClipboardFormatId::RTF ); + AddFormat( SotClipboardFormatId::RICHTEXT ); + } + } + + if( mpImageMap ) + AddFormat( SotClipboardFormatId::SVIM ); +} + +bool SdTransferable::GetData( const DataFlavor& rFlavor, const OUString& rDestDoc ) +{ + if (SD_MOD()==nullptr) + return false; + + SotClipboardFormatId nFormat = SotExchange::GetFormat( rFlavor ); + bool bOK = false; + + CreateData(); + + if( nFormat == SotClipboardFormatId::RTF && lcl_HasOnlyOneTable( mpSdDrawDocument ) ) + { + bOK = SetTableRTF( mpSdDrawDocument ); + } + else if( mpOLEDataHelper && mpOLEDataHelper->HasFormat( rFlavor ) ) + { + // TODO/LATER: support all the graphical formats, the embedded object scenario should not have separated handling + if( nFormat == SotClipboardFormatId::GDIMETAFILE && moGraphic ) + bOK = SetGDIMetaFile( moGraphic->GetGDIMetaFile() ); + else + bOK = SetAny( mpOLEDataHelper->GetAny(rFlavor, rDestDoc) ); + } + else if( HasFormat( nFormat ) ) + { + if( ( nFormat == SotClipboardFormatId::LINKSRCDESCRIPTOR || nFormat == SotClipboardFormatId::OBJECTDESCRIPTOR ) && mpObjDesc ) + { + bOK = SetTransferableObjectDescriptor( *mpObjDesc ); + } + else if( nFormat == SotClipboardFormatId::DRAWING ) + { + SfxObjectShellRef aOldRef( maDocShellRef ); + + maDocShellRef.clear(); + + if( mpSdViewIntern ) + { + SdDrawDocument& rInternDoc = mpSdViewIntern->GetDoc(); + rInternDoc.CreatingDataObj(this); + SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( mpSdViewIntern->CreateMarkedObjModel().release() ); + rInternDoc.CreatingDataObj(nullptr); + + bOK = SetObject( pDoc, SDTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor ); + + if( maDocShellRef.is() ) + { + maDocShellRef->DoClose(); + } + else + { + delete pDoc; + } + } + + maDocShellRef = aOldRef; + } + else if( nFormat == SotClipboardFormatId::GDIMETAFILE ) + { + if (mpSdViewIntern) + { + const bool bToggleOnlineSpell = mpSdDrawDocumentIntern && mpSdDrawDocumentIntern->GetOnlineSpell(); + if (bToggleOnlineSpell) + mpSdDrawDocumentIntern->SetOnlineSpell(false); + bOK = SetGDIMetaFile( mpSdViewIntern->GetMarkedObjMetaFile( true ) ); + if (bToggleOnlineSpell) + mpSdDrawDocumentIntern->SetOnlineSpell(true); + } + } + else if( SotClipboardFormatId::BITMAP == nFormat || SotClipboardFormatId::PNG == nFormat ) + { + if (mpSdViewIntern) + { + const bool bToggleOnlineSpell = mpSdDrawDocumentIntern && mpSdDrawDocumentIntern->GetOnlineSpell(); + if (bToggleOnlineSpell) + mpSdDrawDocumentIntern->SetOnlineSpell(false); + bOK = SetBitmapEx( mpSdViewIntern->GetMarkedObjBitmapEx(true), rFlavor ); + if (bToggleOnlineSpell) + mpSdDrawDocumentIntern->SetOnlineSpell(true); + } + } + else if( ( nFormat == SotClipboardFormatId::STRING ) && moBookmark ) + { + bOK = SetString( moBookmark->GetURL() ); + } + else if( ( nFormat == SotClipboardFormatId::SVXB ) && moGraphic ) + { + bOK = SetGraphic( *moGraphic ); + } + else if( ( nFormat == SotClipboardFormatId::SVIM ) && mpImageMap ) + { + bOK = SetImageMap( *mpImageMap ); + } + else if( moBookmark ) + { + bOK = SetINetBookmark( *moBookmark, rFlavor ); + } + else if( nFormat == SotClipboardFormatId::EMBED_SOURCE ) + { + if( mpSdDrawDocumentIntern ) + { + if( !maDocShellRef.is() ) + { + maDocShellRef = new ::sd::DrawDocShell( + mpSdDrawDocumentIntern, + SfxObjectCreateMode::EMBEDDED, + true, + mpSdDrawDocumentIntern->GetDocumentType()); + mbOwnDocument = false; + maDocShellRef->DoInitNew(); + } + + maDocShellRef->SetVisArea( maVisArea ); + bOK = SetObject( maDocShellRef.get(), SDTRANSFER_OBJECTTYPE_DRAWOLE, rFlavor ); + } + } + } + + return bOK; +} + +bool SdTransferable::WriteObject( tools::SvRef& rxOStm, void* pObject, sal_uInt32 nObjectType, const DataFlavor& ) +{ + bool bRet = false; + + switch( nObjectType ) + { + case SDTRANSFER_OBJECTTYPE_DRAWMODEL: + { + try + { + static const bool bDontBurnInStyleSheet = ( getenv( "AVOID_BURN_IN_FOR_GALLERY_THEME" ) != nullptr ); + SdDrawDocument* pDoc = static_cast(pObject); + if ( !bDontBurnInStyleSheet ) + pDoc->BurnInStyleSheetAttributes(); + rxOStm->SetBufferSize( 16348 ); + + rtl::Reference< SdXImpressDocument > xComponent( new SdXImpressDocument( pDoc, true ) ); + pDoc->setUnoModel( xComponent ); + + { + css::uno::Reference xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) ); + SvxDrawingLayerExport( pDoc, xDocOut, xComponent, (pDoc->GetDocumentType() == DocumentType::Impress) ? "com.sun.star.comp.Impress.XMLClipboardExporter" : "com.sun.star.comp.DrawingLayer.XMLExporter" ); + } + + xComponent->dispose(); + bRet = ( rxOStm->GetError() == ERRCODE_NONE ); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SdTransferable::WriteObject()" ); + bRet = false; + } + } + break; + + case SDTRANSFER_OBJECTTYPE_DRAWOLE: + { + SfxObjectShell* pEmbObj = static_cast(pObject); + ::utl::TempFileFast aTempFile; + SvStream* pTempStream = aTempFile.GetStream(StreamMode::READWRITE); + + try + { + uno::Reference< embed::XStorage > xWorkStore = + ::comphelper::OStorageHelper::GetStorageFromStream( new utl::OStreamWrapper(*pTempStream), embed::ElementModes::READWRITE ); + + // write document storage + pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, false ); + // mba: no relative URLs for clipboard! + SfxMedium aMedium( xWorkStore, OUString() ); + pEmbObj->DoSaveObjectAs( aMedium, false ); + pEmbObj->DoSaveCompleted(); + + uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY ); + if ( xTransact.is() ) + xTransact->commit(); + + rxOStm->SetBufferSize( 0xff00 ); + rxOStm->WriteStream( *pTempStream ); + + bRet = true; + } + catch ( Exception& ) + {} + } + + break; + + default: + break; + } + + return bRet; +} + +void SdTransferable::DragFinished( sal_Int8 nDropAction ) +{ + if( mpSdView ) + const_cast< ::sd::View* >(mpSdView)->DragFinished( nDropAction ); +} + +void SdTransferable::ObjectReleased() +{ + SdModule *pModule = SD_MOD(); + if (!pModule) + return; + + if( this == pModule->pTransferClip ) + pModule->pTransferClip = nullptr; + + if( this == pModule->pTransferDrag ) + pModule->pTransferDrag = nullptr; + + if( this == pModule->pTransferSelection ) + pModule->pTransferSelection = nullptr; +} + +void SdTransferable::SetObjectDescriptor( std::unique_ptr pObjDesc ) +{ + mpObjDesc = std::move(pObjDesc); + PrepareOLE( *mpObjDesc ); +} + +void SdTransferable::SetPageBookmarks( std::vector && rPageBookmarks, bool bPersistent ) +{ + if( !mpSourceDoc ) + return; + + if( mpSdViewIntern ) + mpSdViewIntern->HideSdrPage(); + + mpSdDrawDocument->ClearModel(false); + + mpPageDocShell = nullptr; + + maPageBookmarks.clear(); + + if( bPersistent ) + { + mpSdDrawDocument->CreateFirstPages(mpSourceDoc); + mpSdDrawDocument->InsertBookmarkAsPage( rPageBookmarks, nullptr, false, true, 1, true, + mpSourceDoc->GetDocSh(), true, true, false ); + } + else + { + mpPageDocShell = mpSourceDoc->GetDocSh(); + maPageBookmarks = std::move(rPageBookmarks); + } + + if( mpSdViewIntern ) + { + SdPage* pPage = mpSdDrawDocument->GetSdPage( 0, PageKind::Standard ); + + if( pPage ) + { + mpSdViewIntern->MarkAllObj( mpSdViewIntern->ShowSdrPage( pPage ) ); + } + } + + // set flags for page transferable; if ( mbPageTransferablePersistent == sal_False ), + // don't offer any formats => it's just for internal purposes + mbPageTransferable = true; + mbPageTransferablePersistent = bPersistent; +} + +void SdTransferable::AddUserData (const std::shared_ptr& rpData) +{ + maUserData.push_back(rpData); +} + +sal_Int32 SdTransferable::GetUserDataCount() const +{ + return maUserData.size(); +} + +std::shared_ptr SdTransferable::GetUserData (const sal_Int32 nIndex) const +{ + if (nIndex>=0 && o3tl::make_unsigned(nIndex)(); +} + +SdTransferable* SdTransferable::getImplementation( const Reference< XInterface >& rxData ) noexcept +{ + return dynamic_cast(rxData.get()); +} + +void SdTransferable::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) +{ + if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint) + { + const SdrHint* pSdrHint = static_cast< const SdrHint* >( &rHint ); + if( SdrHintKind::ModelCleared == pSdrHint->GetKind() ) + { + EndListening(*mpSourceDoc); + mpSourceDoc = nullptr; + } + } + else + { + if( rHint.GetId() == SfxHintId::Dying ) + { + if( &rBC == mpSourceDoc ) + mpSourceDoc = nullptr; + if( &rBC == mpSdViewIntern ) + mpSdViewIntern = nullptr; + if( &rBC == mpSdView ) + mpSdView = nullptr; + } + } +} + +void SdTransferable::SetView(const ::sd::View* pView) +{ + if (mpSdView) + EndListening(*const_cast(mpSdView)); + mpSdView = pView; + if (mpSdView) + StartListening(*const_cast(mpSdView)); +} + +bool SdTransferable::SetTableRTF( SdDrawDocument* pModel ) +{ + if ( pModel ) + { + SdrPage* pPage = pModel->GetPage(0); + if (pPage && pPage->GetObjCount() == 1 ) + { + sdr::table::SdrTableObj* pTableObj = dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) ); + if( pTableObj ) + { + SvMemoryStream aMemStm( 65535, 65535 ); + sdr::table::ExportAsRTF( aMemStm, *pTableObj ); + return SetAny( Any( Sequence< sal_Int8 >( static_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.TellEnd() ) ) ); + } + } + } + + return false; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/app/tmplctrl.cxx b/sd/source/ui/app/tmplctrl.cxx new file mode 100644 index 0000000000..ffc79e923c --- /dev/null +++ b/sd/source/ui/app/tmplctrl.cxx @@ -0,0 +1,111 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +SFX_IMPL_STATUSBAR_CONTROL( SdTemplateControl, SfxStringItem ); + +// class SdTemplateControl ------------------------------------------ +SdTemplateControl::SdTemplateControl( sal_uInt16 _nSlotId, + sal_uInt16 _nId, + StatusBar& rStb ) : + SfxStatusBarControl( _nSlotId, _nId, rStb ) +{ + GetStatusBar().SetQuickHelpText(GetId(), SdResId(STR_STATUSBAR_MASTERPAGE)); +} + +SdTemplateControl::~SdTemplateControl() +{ +} + +void SdTemplateControl::StateChangedAtStatusBarControl( + sal_uInt16 /*nSID*/, SfxItemState eState, const SfxPoolItem* pState ) +{ + if (eState != SfxItemState::DEFAULT || SfxItemState::DISABLED == eState) + GetStatusBar().SetItemText( GetId(), OUString() ); + + else if ( auto pStringItem = dynamic_cast< const SfxStringItem *>( pState ) ) + { + msTemplate = pStringItem->GetValue(); + GetStatusBar().SetItemText( GetId(), msTemplate ); + } +} + +void SdTemplateControl::Paint( const UserDrawEvent& ) +{ +} + +void SdTemplateControl::Command( const CommandEvent& rCEvt ) +{ + if ( rCEvt.GetCommand() != CommandEventId::ContextMenu || GetStatusBar().GetItemText( GetId() ).isEmpty() ) + return; + + SfxViewFrame* pViewFrame = SfxViewFrame::Current(); + + sd::ViewShellBase* pViewShellBase = sd::ViewShellBase::GetViewShellBase( pViewFrame ); + if( !pViewShellBase ) + return; + + SdDrawDocument* pDoc = pViewShellBase->GetDocument(); + if( !pDoc ) + return; + + std::unique_ptr xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/masterpagemenu.ui")); + std::unique_ptr xPopup(xBuilder->weld_menu("menu")); + + const sal_uInt16 nMasterCount = pDoc->GetMasterSdPageCount(PageKind::Standard); + + for (sal_uInt16 nPage = 0; nPage < nMasterCount; ++nPage) + { + SdPage* pMaster = pDoc->GetMasterSdPage(nPage, PageKind::Standard); + if (!pMaster) + continue; + xPopup->append(OUString::number(nPage), pMaster->GetName()); + } + + ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(1, 1)); + weld::Window* pParent = weld::GetPopupParent(GetStatusBar(), aRect); + OUString sResult = xPopup->popup_at_rect(pParent, aRect); + if (!sResult.isEmpty()) + { + sal_uInt16 nCurrId = sResult.toUInt32(); + SdPage* pMaster = pDoc->GetMasterSdPage(nCurrId, PageKind::Standard); + SfxStringItem aStyle( ATTR_PRESLAYOUT_NAME, pMaster->GetName() ); + pViewFrame->GetDispatcher()->ExecuteList( + SID_PRESENTATION_LAYOUT, SfxCallMode::SLOT, { &aStyle }); + pViewFrame->GetBindings().Invalidate(SID_PRESENTATION_LAYOUT); + pViewFrame->GetBindings().Invalidate(SID_STATUS_LAYOUT); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/controller/displaymodecontroller.cxx b/sd/source/ui/controller/displaymodecontroller.cxx new file mode 100644 index 0000000000..81ad2d19e4 --- /dev/null +++ b/sd/source/ui/controller/displaymodecontroller.cxx @@ -0,0 +1,264 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include + +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::beans; + +namespace sd +{ + +// Component to select which display mode has to be used. +// Composed of a dropdown button in the toolbar and a +// popup menu to select the value + +namespace { + +class DisplayModeController : public svt::PopupWindowController +{ +public: + explicit DisplayModeController( const css::uno::Reference< css::uno::XComponentContext >& rxContext ); + + virtual std::unique_ptr weldPopupWindow() override; + virtual VclPtr createVclPopupWindow( vcl::Window* pParent ) override; + + // XInitialization + virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + void setToolboxItemImage(const OUString& rImage); +}; + +class DisplayModeToolbarMenu final : public WeldToolbarPopup +{ +public: + DisplayModeToolbarMenu(DisplayModeController* pControl, weld::Widget* pParent); + virtual void GrabFocus() override + { + mxDisplayModeSet1->GrabFocus(); + } + +private: + rtl::Reference mxControl; + std::unique_ptr mxFrame1; + std::unique_ptr mxDisplayModeSet1; + std::unique_ptr mxDisplayModeSetWin1; + std::unique_ptr mxFrame2; + std::unique_ptr mxDisplayModeSet2; + std::unique_ptr mxDisplayModeSetWin2; + + DECL_LINK(SelectValueSetHdl, ValueSet*, void); +}; + +struct snew_slide_value_info +{ + sal_uInt16 mnId; + OUString msBmpResId; + TranslateId mpStrResId; + const char* msUnoCommand; +}; + +} + +const snew_slide_value_info editmodes[] = +{ + {1, + BMP_DISPLAYMODE_SLIDE, + STR_NORMAL_MODE, + ".uno:NormalMultiPaneGUI" }, + {2, + BMP_DISPLAYMODE_OUTLINE, + STR_OUTLINE_MODE, + ".uno:OutlineMode" }, + {3, + BMP_DISPLAYMODE_NOTES, + STR_NOTES_MODE, + ".uno:NotesMode" }, + {4, + BMP_DISPLAYMODE_SLIDE_SORTER, + STR_SLIDE_SORTER_MODE, + ".uno:DiaMode" }, + {0, "", {}, "" } +}; + +const snew_slide_value_info mastermodes[] = +{ + {5, + BMP_DISPLAYMODE_SLIDE_MASTER, + STR_SLIDE_MASTER_MODE, + ".uno:SlideMasterPage" }, + {6, + BMP_DISPLAYMODE_NOTES_MASTER, + STR_NOTES_MASTER_MODE, + ".uno:NotesMasterPage" }, + {7, + BMP_DISPLAYMODE_HANDOUT_MASTER, + STR_HANDOUT_MASTER_MODE, + ".uno:HandoutMode" }, + {0, "", {}, "" } +}; + + +static void fillLayoutValueSet(ValueSet* pValue, const snew_slide_value_info* pInfo) +{ + Size aLayoutItemSize; + for( ; pInfo->mnId; pInfo++ ) + { + OUString aText(SdResId(pInfo->mpStrResId)); + BitmapEx aBmp(pInfo->msBmpResId); + + pValue->InsertItem(pInfo->mnId, Image(aBmp), aText); + + aLayoutItemSize.setWidth( std::max( aLayoutItemSize.Width(), aBmp.GetSizePixel().Width() ) ); + aLayoutItemSize.setHeight( std::max( aLayoutItemSize.Height(), aBmp.GetSizePixel().Height() ) ); + } + + aLayoutItemSize = pValue->CalcItemSizePixel( aLayoutItemSize ); + Size aSize(pValue->CalcWindowSizePixel(aLayoutItemSize)); + + const sal_Int32 LAYOUT_BORDER_PIX = 7; + aSize.AdjustWidth((pValue->GetColCount() + 1) * LAYOUT_BORDER_PIX ); + aSize.AdjustHeight((pValue->GetLineCount() +1) * LAYOUT_BORDER_PIX ); + + pValue->GetDrawingArea()->set_size_request(aSize.Width(), aSize.Height()); + pValue->SetOutputSizePixel(aSize); +} + +DisplayModeToolbarMenu::DisplayModeToolbarMenu(DisplayModeController* pControl, weld::Widget* pParent) + : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "modules/simpress/ui/displaywindow.ui", "DisplayWindow") + , mxControl(pControl) + , mxFrame1(m_xBuilder->weld_frame("editframe")) + , mxDisplayModeSet1(new ValueSet(nullptr)) + , mxDisplayModeSetWin1(new weld::CustomWeld(*m_xBuilder, "valueset1", *mxDisplayModeSet1)) + , mxFrame2(m_xBuilder->weld_frame("masterframe")) + , mxDisplayModeSet2(new ValueSet(nullptr)) + , mxDisplayModeSetWin2(new weld::CustomWeld(*m_xBuilder, "valueset2", *mxDisplayModeSet2)) +{ + mxDisplayModeSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT); + mxDisplayModeSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT); + + mxDisplayModeSet1->SetSelectHdl( LINK( this, DisplayModeToolbarMenu, SelectValueSetHdl ) ); + mxDisplayModeSet2->SetSelectHdl( LINK( this, DisplayModeToolbarMenu, SelectValueSetHdl ) ); + + sal_Int16 nColCount = 2; + + mxDisplayModeSet1->SetColCount( nColCount ); + fillLayoutValueSet( mxDisplayModeSet1.get(), &editmodes[0] ); + + mxDisplayModeSet2->SetColCount( nColCount ); + fillLayoutValueSet( mxDisplayModeSet2.get(), &mastermodes[0] ); +} + +IMPL_LINK( DisplayModeToolbarMenu, SelectValueSetHdl, ValueSet*, pControl, void ) +{ + OUString sCommandURL; + OUString sImage; + + if( pControl == mxDisplayModeSet1.get() ) { + sCommandURL = OUString::createFromAscii(editmodes[mxDisplayModeSet1->GetSelectedItemId() - 1 ].msUnoCommand); + sImage = editmodes[mxDisplayModeSet1->GetSelectedItemId() - 1 ].msBmpResId; + } + else if( pControl == mxDisplayModeSet2.get() ) { + sCommandURL = OUString::createFromAscii(mastermodes[mxDisplayModeSet2->GetSelectedItemId() - 5 ].msUnoCommand); + sImage = mastermodes[mxDisplayModeSet2->GetSelectedItemId() - 5 ].msBmpResId; + } + + if (!sCommandURL.isEmpty()) + mxControl->dispatchCommand( sCommandURL, Sequence< PropertyValue >() ); + + mxControl->setToolboxItemImage(sImage); + mxControl->EndPopupMode(); +} + +DisplayModeController::DisplayModeController( const css::uno::Reference< css::uno::XComponentContext >& rxContext ) +: svt::PopupWindowController( rxContext, Reference< frame::XFrame >(), OUString() ) +{ +} + +void SAL_CALL DisplayModeController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) +{ + svt::PopupWindowController::initialize( aArguments ); + ToolBox* pToolBox = nullptr; + ToolBoxItemId nId; + if ( getToolboxId( nId, &pToolBox ) ) + pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY ); + setToolboxItemImage(BMP_DISPLAYMODE_SLIDE); +} + +std::unique_ptr DisplayModeController::weldPopupWindow() +{ + return std::make_unique(this, m_pToolbar); +} + +VclPtr DisplayModeController::createVclPopupWindow( vcl::Window* pParent ) +{ + mxInterimPopover = VclPtr::Create(getFrameInterface(), pParent, + std::make_unique(this, pParent->GetFrameWeld())); + + mxInterimPopover->Show(); + + return mxInterimPopover; +} + +void DisplayModeController::setToolboxItemImage(const OUString& rImage) +{ + ToolBoxItemId nId; + ToolBox* pToolBox = nullptr; + if (!getToolboxId( nId, &pToolBox )) + return; + + BitmapEx aBmp(rImage); + int targetSize = (pToolBox->GetToolboxButtonSize() == ToolBoxButtonSize::Large) ? 32 : 16; + double scale = 1.0f; + Size size = aBmp.GetSizePixel(); + if (size.Width() > targetSize) + scale = static_cast(targetSize) / static_cast(size.Width()); + if (size.Height() > targetSize) + scale = ::std::min( scale, static_cast(targetSize) / static_cast(size.Height()) ); + aBmp.Scale( scale, scale ); + pToolBox->SetItemImage( nId, Image( aBmp ) ); +} + +// XServiceInfo + +OUString SAL_CALL DisplayModeController::getImplementationName() +{ + return "com.sun.star.comp.sd.DisplayModeController"; +} + +Sequence< OUString > SAL_CALL DisplayModeController::getSupportedServiceNames( ) +{ + css::uno::Sequence aRet { "com.sun.star.frame.ToolbarController" }; + return aRet; +} + +} + +extern "C" SAL_DLLPUBLIC_EXPORT ::com::sun::star::uno::XInterface* +com_sun_star_comp_sd_DisplayModeController_get_implementation( css::uno::XComponentContext* context, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::DisplayModeController(context)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/controller/slidelayoutcontroller.cxx b/sd/source/ui/controller/slidelayoutcontroller.cxx new file mode 100644 index 0000000000..aecd1d93db --- /dev/null +++ b/sd/source/ui/controller/slidelayoutcontroller.cxx @@ -0,0 +1,380 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +#include + +#include + +#include +#include +#include "slidelayoutcontroller.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::beans; + +namespace sd +{ + +namespace { + +class LayoutToolbarMenu : public WeldToolbarPopup +{ +public: + LayoutToolbarMenu(SlideLayoutController* pController, weld::Widget* pParent, const bool bInsertPage, const OUString& rCommand); + virtual void GrabFocus() override + { + mxLayoutSet1->GrabFocus(); + } + +protected: + DECL_LINK(SelectToolbarMenuHdl, weld::Button&, void); + DECL_LINK(SelectValueSetHdl, ValueSet*, void); + void SelectHdl(AutoLayout eLayout); +private: + rtl::Reference mxControl; + bool const mbInsertPage; + std::unique_ptr mxFrame1; + std::unique_ptr mxLayoutSet1; + std::unique_ptr mxLayoutSetWin1; + std::unique_ptr mxFrame2; + std::unique_ptr mxLayoutSet2; + std::unique_ptr mxLayoutSetWin2; + std::unique_ptr mxMoreButton; +}; + +struct snew_slide_value_info_layout +{ + OUString msBmpResId; + TranslateId mpStrResId; + AutoLayout maAutoLayout; +}; + +} + +constexpr OUString EMPTY = u""_ustr; + +constexpr snew_slide_value_info_layout notes[] = +{ + {BMP_SLIDEN_01, STR_AUTOLAYOUT_NOTES, AUTOLAYOUT_NOTES}, + {EMPTY, {}, AUTOLAYOUT_NONE}, +}; + +constexpr snew_slide_value_info_layout handout[] = +{ + {BMP_SLIDEH_01, STR_AUTOLAYOUT_HANDOUT1, AUTOLAYOUT_HANDOUT1}, + {BMP_SLIDEH_02, STR_AUTOLAYOUT_HANDOUT2, AUTOLAYOUT_HANDOUT2}, + {BMP_SLIDEH_03, STR_AUTOLAYOUT_HANDOUT3, AUTOLAYOUT_HANDOUT3}, + {BMP_SLIDEH_04, STR_AUTOLAYOUT_HANDOUT4, AUTOLAYOUT_HANDOUT4}, + {BMP_SLIDEH_06, STR_AUTOLAYOUT_HANDOUT6, AUTOLAYOUT_HANDOUT6}, + {BMP_SLIDEH_09, STR_AUTOLAYOUT_HANDOUT9, AUTOLAYOUT_HANDOUT9}, + {EMPTY, {}, AUTOLAYOUT_NONE}, +}; + +constexpr snew_slide_value_info_layout standard[] = +{ + {BMP_LAYOUT_EMPTY, STR_AUTOLAYOUT_NONE, AUTOLAYOUT_NONE }, + {BMP_LAYOUT_HEAD03, STR_AUTOLAYOUT_TITLE, AUTOLAYOUT_TITLE }, + {BMP_LAYOUT_HEAD02, STR_AUTOLAYOUT_CONTENT, AUTOLAYOUT_TITLE_CONTENT }, + {BMP_LAYOUT_HEAD02A, STR_AUTOLAYOUT_2CONTENT, AUTOLAYOUT_TITLE_2CONTENT }, + {BMP_LAYOUT_HEAD01, STR_AUTOLAYOUT_ONLY_TITLE, AUTOLAYOUT_TITLE_ONLY }, + {BMP_LAYOUT_TEXTONLY, STR_AUTOLAYOUT_ONLY_TEXT, AUTOLAYOUT_ONLY_TEXT }, + {BMP_LAYOUT_HEAD03B, STR_AUTOLAYOUT_2CONTENT_CONTENT, AUTOLAYOUT_TITLE_2CONTENT_CONTENT }, + {BMP_LAYOUT_HEAD03C, STR_AUTOLAYOUT_CONTENT_2CONTENT, AUTOLAYOUT_TITLE_CONTENT_2CONTENT }, + {BMP_LAYOUT_HEAD03A, STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT,AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT }, + {BMP_LAYOUT_HEAD02B, STR_AUTOLAYOUT_CONTENT_OVER_CONTENT, AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT }, + {BMP_LAYOUT_HEAD04, STR_AUTOLAYOUT_4CONTENT, AUTOLAYOUT_TITLE_4CONTENT }, + {BMP_LAYOUT_HEAD06, STR_AUTOLAYOUT_6CONTENT, AUTOLAYOUT_TITLE_6CONTENT }, + {EMPTY, {}, AUTOLAYOUT_NONE} +}; + +constexpr snew_slide_value_info_layout v_standard[] = +{ + // vertical + {BMP_LAYOUT_VERTICAL02, STR_AL_VERT_TITLE_TEXT_CHART, AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT }, + {BMP_LAYOUT_VERTICAL01, STR_AL_VERT_TITLE_VERT_OUTLINE, AUTOLAYOUT_VTITLE_VCONTENT }, + {BMP_LAYOUT_HEAD02, STR_AL_TITLE_VERT_OUTLINE, AUTOLAYOUT_TITLE_VCONTENT }, + {BMP_LAYOUT_HEAD02A, STR_AL_TITLE_VERT_OUTLINE_CLIPART, AUTOLAYOUT_TITLE_2VTEXT }, + {EMPTY, {}, AUTOLAYOUT_NONE} +}; + +static void fillLayoutValueSet( ValueSet* pValue, const snew_slide_value_info_layout* pInfo ) +{ + Size aLayoutItemSize; + for( ; pInfo->mpStrResId; pInfo++ ) + { + OUString aText(SdResId(pInfo->mpStrResId)); + Image aImg(StockImage::Yes, pInfo->msBmpResId); + pValue->InsertItem(static_cast(pInfo->maAutoLayout)+1, aImg, aText); + aLayoutItemSize.setWidth( std::max( aLayoutItemSize.Width(), aImg.GetSizePixel().Width() ) ); + aLayoutItemSize.setHeight( std::max( aLayoutItemSize.Height(), aImg.GetSizePixel().Height() ) ); + } + + aLayoutItemSize = pValue->CalcItemSizePixel( aLayoutItemSize ); + Size aSize(pValue->CalcWindowSizePixel(aLayoutItemSize)); + + const sal_Int32 LAYOUT_BORDER_PIX = 7; + + aSize.AdjustWidth((pValue->GetColCount() + 1) * LAYOUT_BORDER_PIX); + aSize.AdjustHeight((pValue->GetLineCount() +1) * LAYOUT_BORDER_PIX); + + pValue->GetDrawingArea()->set_size_request(aSize.Width(), aSize.Height()); + pValue->SetOutputSizePixel(aSize); +} + +LayoutToolbarMenu::LayoutToolbarMenu(SlideLayoutController* pControl, weld::Widget* pParent, const bool bInsertPage, const OUString& rCommand) + : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "modules/simpress/ui/layoutwindow.ui", "LayoutWindow") + , mxControl(pControl) + , mbInsertPage(bInsertPage) + , mxFrame1(m_xBuilder->weld_frame("horiframe")) + , mxLayoutSet1(new ValueSet(nullptr)) + , mxLayoutSetWin1(new weld::CustomWeld(*m_xBuilder, "valueset1", *mxLayoutSet1)) + , mxFrame2(m_xBuilder->weld_frame("vertframe")) + , mxLayoutSet2(new ValueSet(nullptr)) + , mxLayoutSetWin2(new weld::CustomWeld(*m_xBuilder, "valueset2", *mxLayoutSet2)) + , mxMoreButton(m_xBuilder->weld_button("more")) +{ + mxLayoutSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT); + mxLayoutSet2->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT); + + DrawViewMode eMode = DrawViewMode_DRAW; + + // find out which view is running + if( m_xFrame.is() ) try + { + Reference< XPropertySet > xControllerSet( m_xFrame->getController(), UNO_QUERY_THROW ); + xControllerSet->getPropertyValue( "DrawViewMode" ) >>= eMode; + } + catch( Exception& ) + { + OSL_ASSERT(false); + } + + const bool bVerticalEnabled = SvtCJKOptions::IsVerticalTextEnabled(); + + mxLayoutSet1->SetSelectHdl( LINK( this, LayoutToolbarMenu, SelectValueSetHdl ) ); + + const snew_slide_value_info_layout* pInfo = nullptr; + sal_Int16 nColCount = 4; + switch( eMode ) + { + case DrawViewMode_DRAW: pInfo = &standard[0]; break; + case DrawViewMode_HANDOUT: pInfo = &handout[0]; nColCount = 2; break; + case DrawViewMode_NOTES: pInfo = ¬es[0]; nColCount = 1; break; + default: assert(false); // can't happen, will crash later otherwise + } + + mxLayoutSet1->SetColCount( nColCount ); + + fillLayoutValueSet( mxLayoutSet1.get(), pInfo ); + + bool bUseUILabel = (bVerticalEnabled && eMode == DrawViewMode_DRAW); + if (!bUseUILabel) + { + auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(rCommand, mxControl->getModuleName()); + mxFrame1->set_label(vcl::CommandInfoProvider::GetLabelForCommand(aProperties)); + } + + if (bVerticalEnabled && eMode == DrawViewMode_DRAW) + { + mxLayoutSet2->SetSelectHdl( LINK( this, LayoutToolbarMenu, SelectValueSetHdl ) ); + mxLayoutSet2->SetColCount( 4 ); + mxLayoutSet2->EnableFullItemMode( false ); + + fillLayoutValueSet( mxLayoutSet2.get(), &v_standard[0] ); + + mxFrame2->show(); + } + + if( eMode != DrawViewMode_DRAW ) + return; + + if( !m_xFrame.is() ) + return; + + OUString sSlotStr; + + if( bInsertPage ) + sSlotStr = ".uno:DuplicatePage"; + else + sSlotStr = ".uno:Undo"; + + css::uno::Reference xSlotImage = vcl::CommandInfoProvider::GetXGraphicForCommand(sSlotStr, m_xFrame); + + OUString sSlotTitle; + if( bInsertPage ) + { + auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(sSlotStr, mxControl->getModuleName()); + sSlotTitle = vcl::CommandInfoProvider::GetLabelForCommand(aProperties); + } + else + sSlotTitle = SdResId( STR_RESET_LAYOUT ); + + mxMoreButton->set_label(sSlotTitle); + mxMoreButton->set_image(xSlotImage); + mxMoreButton->connect_clicked(LINK(this, LayoutToolbarMenu, SelectToolbarMenuHdl)); + mxMoreButton->show(); +} + +IMPL_LINK(LayoutToolbarMenu, SelectValueSetHdl, ValueSet*, pLayoutSet, void) +{ + SelectHdl(static_cast(pLayoutSet->GetSelectedItemId()-1)); +} + +IMPL_LINK_NOARG(LayoutToolbarMenu, SelectToolbarMenuHdl, weld::Button&, void) +{ + SelectHdl(AUTOLAYOUT_END); +} + +void LayoutToolbarMenu::SelectHdl(AutoLayout eLayout) +{ + Sequence< PropertyValue > aArgs; + + OUString sCommandURL( mxControl->getCommandURL() ); + + if( eLayout != AUTOLAYOUT_END ) + { + aArgs = { comphelper::makePropertyValue("WhatLayout", static_cast(eLayout)) }; + } + else if( mbInsertPage ) + { + sCommandURL = ".uno:DuplicatePage"; + } + + mxControl->dispatchCommand( sCommandURL, aArgs ); + + mxControl->EndPopupMode(); +} + + +/// @throws css::uno::RuntimeException +static OUString SlideLayoutController_getImplementationName() +{ + return "com.sun.star.comp.sd.SlideLayoutController"; +} + +/// @throws RuntimeException +static Sequence< OUString > SlideLayoutController_getSupportedServiceNames() +{ + Sequence aSNS { "com.sun.star.frame.ToolbarController" }; + return aSNS; +} + +/// @throws css::uno::RuntimeException +static OUString InsertSlideController_getImplementationName() +{ + return "com.sun.star.comp.sd.InsertSlideController"; +} + +/// @throws RuntimeException +static Sequence< OUString > InsertSlideController_getSupportedServiceNames() +{ + Sequence aSNS { "com.sun.star.frame.ToolbarController" }; + return aSNS; +} + +SlideLayoutController::SlideLayoutController(const Reference< uno::XComponentContext >& rxContext, bool bInsertPage) + : svt::PopupWindowController(rxContext, nullptr, OUString()) + , mbInsertPage(bInsertPage) +{ +} + +void SAL_CALL SlideLayoutController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) +{ + svt::PopupWindowController::initialize( aArguments ); + + ToolBox* pToolBox = nullptr; + ToolBoxItemId nId; + if ( getToolboxId( nId, &pToolBox ) ) + { + if ( mbInsertPage ) + pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWN ); + else + pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY ); + } +} + +std::unique_ptr SlideLayoutController::weldPopupWindow() +{ + return std::make_unique(this, m_pToolbar, mbInsertPage, m_aCommandURL); +} + +VclPtr SlideLayoutController::createVclPopupWindow( vcl::Window* pParent ) +{ + mxInterimPopover = VclPtr::Create(getFrameInterface(), pParent, + std::make_unique(this, pParent->GetFrameWeld(), mbInsertPage, m_aCommandURL)); + + mxInterimPopover->Show(); + + return mxInterimPopover; +} + +// XServiceInfo + +OUString SAL_CALL SlideLayoutController::getImplementationName() +{ + if( mbInsertPage ) + return InsertSlideController_getImplementationName(); + else + return SlideLayoutController_getImplementationName(); +} + +Sequence< OUString > SAL_CALL SlideLayoutController::getSupportedServiceNames( ) +{ + if( mbInsertPage ) + return InsertSlideController_getSupportedServiceNames(); + else + return SlideLayoutController_getSupportedServiceNames(); +} + +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_sd_SlideLayoutController_get_implementation(css::uno::XComponentContext* context, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::SlideLayoutController(context, false)); +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_sd_InsertSlideController_get_implementation(css::uno::XComponentContext* context, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::SlideLayoutController(context, true)); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/controller/slidelayoutcontroller.hxx b/sd/source/ui/controller/slidelayoutcontroller.hxx new file mode 100644 index 0000000000..ae4a3a09fa --- /dev/null +++ b/sd/source/ui/controller/slidelayoutcontroller.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ +class SlideLayoutController : public svt::PopupWindowController +{ +public: + SlideLayoutController(const css::uno::Reference& rxContext, + bool bInsertPage); + + virtual std::unique_ptr weldPopupWindow() override; + virtual VclPtr createVclPopupWindow(vcl::Window* pParent) override; + + // XInitialization + virtual void SAL_CALL initialize(const css::uno::Sequence& aArguments) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual css::uno::Sequence SAL_CALL getSupportedServiceNames() override; + +private: + bool mbInsertPage; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/AnimationChildWindow.cxx b/sd/source/ui/dlg/AnimationChildWindow.cxx new file mode 100644 index 0000000000..2f221fc9ef --- /dev/null +++ b/sd/source/ui/dlg/AnimationChildWindow.cxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +namespace sd { + +SFX_IMPL_DOCKINGWINDOW_WITHID(AnimationChildWindow, SID_ANIMATION_OBJECTS) + +/** + * Derivative from SfxChildWindow as "container" for animator + */ +AnimationChildWindow::AnimationChildWindow( + vcl::Window* _pParent, + sal_uInt16 nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo ) + : SfxChildWindow( _pParent, nId ) +{ + VclPtr pAnimWin = VclPtr::Create(pBindings, this, _pParent); + SetWindow(pAnimWin); + + pAnimWin->Initialize( pInfo ); + + SetHideNotDelete( true ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/BulletAndPositionDlg.cxx b/sd/source/ui/dlg/BulletAndPositionDlg.cxx new file mode 100644 index 0000000000..95f7d68a57 --- /dev/null +++ b/sd/source/ui/dlg/BulletAndPositionDlg.cxx @@ -0,0 +1,1292 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SHOW_NUMBERING 0 +#define SHOW_BULLET 1 +#define SHOW_BITMAP 2 + +#define MAX_BMP_WIDTH 16 +#define MAX_BMP_HEIGHT 16 + +static bool bLastRelative = false; + +static const vcl::Font& lcl_GetDefaultBulletFont() +{ + static vcl::Font aDefBulletFont = []() { + vcl::Font tmp("OpenSymbol", "", Size(0, 14)); + tmp.SetCharSet(RTL_TEXTENCODING_SYMBOL); + tmp.SetFamily(FAMILY_DONTKNOW); + tmp.SetPitch(PITCH_DONTKNOW); + tmp.SetWeight(WEIGHT_DONTKNOW); + tmp.SetTransparent(true); + return tmp; + }(); + return aDefBulletFont; +} + +class SdDrawDocument; + +SvxBulletAndPositionDlg::SvxBulletAndPositionDlg(weld::Window* pWindow, const SfxItemSet& rSet, + const ::sd::View* pView) + : GenericDialogController(pWindow, "cui/ui/bulletandposition.ui", "BulletAndPosition") + , aInvalidateTimer("sd SvxBulletAndPositionDlg aInvalidateTimer") + , rFirstStateSet(rSet) + , bLastWidthModified(false) + , bModified(false) + , bInInitControl(false) + , bLabelAlignmentPosAndSpaceModeActive(false) + , bApplyToMaster(false) + , nBullet(0xff) + , nActNumLvl(1) + , p_Window(pWindow) + , nNumItemId(SID_ATTR_NUMBERING_RULE) + , m_xGrid(m_xBuilder->weld_widget("grid2")) + , m_xLevelLB(m_xBuilder->weld_tree_view("levellb")) + , m_xFmtLB(m_xBuilder->weld_combo_box("numfmtlb")) + , m_xPrefixFT(m_xBuilder->weld_label("prefixft")) + , m_xPrefixED(m_xBuilder->weld_entry("prefix")) + , m_xSuffixFT(m_xBuilder->weld_label("suffixft")) + , m_xSuffixED(m_xBuilder->weld_entry("suffix")) + , m_xBeforeAfter(m_xBuilder->weld_frame("beforeafter")) + , m_xBulColorFT(m_xBuilder->weld_label("colorft")) + , m_xBulColLB(new ColorListBox(m_xBuilder->weld_menu_button("color"), + [this] { return m_xDialog.get(); })) + , m_xBulRelSizeFT(m_xBuilder->weld_label("relsizeft")) + , m_xBulRelSizeMF(m_xBuilder->weld_metric_spin_button("relsize", FieldUnit::PERCENT)) + , m_xStartFT(m_xBuilder->weld_label("startatft")) + , m_xStartED(m_xBuilder->weld_spin_button("startat")) + , m_xBulletFT(m_xBuilder->weld_label("bulletft")) + , m_xBulletPB(m_xBuilder->weld_button("bullet")) + , m_xBitmapMB(m_xBuilder->weld_menu_button("bitmap")) + , m_xWidthFT(m_xBuilder->weld_label("widthft")) + , m_xWidthMF(m_xBuilder->weld_metric_spin_button("widthmf", FieldUnit::CM)) + , m_xHeightFT(m_xBuilder->weld_label("heightft")) + , m_xHeightMF(m_xBuilder->weld_metric_spin_button("heightmf", FieldUnit::CM)) + , m_xRatioCB(m_xBuilder->weld_check_button("keepratio")) + , m_xPreviewWIN(new weld::CustomWeld(*m_xBuilder, "preview", m_aPreviewWIN)) + , m_xDistBorderFT(m_xBuilder->weld_label("indent")) + , m_xDistBorderMF(m_xBuilder->weld_metric_spin_button("indentmf", FieldUnit::CM)) + , m_xRelativeCB(m_xBuilder->weld_check_button("relative")) + , m_xIndentMF(m_xBuilder->weld_metric_spin_button("numberingwidthmf", FieldUnit::CM)) + , m_xLeftTB(m_xBuilder->weld_toggle_button("left")) + , m_xCenterTB(m_xBuilder->weld_toggle_button("center")) + , m_xRightTB(m_xBuilder->weld_toggle_button("right")) + , m_xSlideRB(m_xBuilder->weld_radio_button("sliderb")) + , m_xSelectionRB(m_xBuilder->weld_radio_button("selectionrb")) + , m_xApplyToMaster(m_xBuilder->weld_toggle_button("applytomaster")) + , m_xReset(m_xBuilder->weld_button("reset")) +{ + m_xBulColLB->SetSlotId(SID_ATTR_CHAR_COLOR); + m_xBulRelSizeMF->set_min(SVX_NUM_REL_SIZE_MIN, FieldUnit::PERCENT); + m_xBulRelSizeMF->set_increments(5, 50, FieldUnit::PERCENT); + aActBulletFont = lcl_GetDefaultBulletFont(); + + m_xBulletPB->connect_clicked(LINK(this, SvxBulletAndPositionDlg, BulletHdl_Impl)); + m_xFmtLB->connect_changed(LINK(this, SvxBulletAndPositionDlg, NumberTypeSelectHdl_Impl)); + m_xBitmapMB->connect_selected(LINK(this, SvxBulletAndPositionDlg, GraphicHdl_Impl)); + m_xBitmapMB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, PopupActivateHdl_Impl)); + m_xLevelLB->set_selection_mode(SelectionMode::Multiple); + m_xLevelLB->connect_changed(LINK(this, SvxBulletAndPositionDlg, LevelHdl_Impl)); + m_xWidthMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SizeHdl_Impl)); + m_xHeightMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SizeHdl_Impl)); + m_xRatioCB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, RatioHdl_Impl)); + m_xStartED->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SpinModifyHdl_Impl)); + m_xPrefixED->connect_changed(LINK(this, SvxBulletAndPositionDlg, EditModifyHdl_Impl)); + m_xSuffixED->connect_changed(LINK(this, SvxBulletAndPositionDlg, EditModifyHdl_Impl)); + m_xBulRelSizeMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, BulRelSizeHdl_Impl)); + m_xBulColLB->SetSelectHdl(LINK(this, SvxBulletAndPositionDlg, BulColorHdl_Impl)); + m_xLeftTB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, SelectLeftAlignmentHdl_Impl)); + m_xCenterTB->connect_toggled( + LINK(this, SvxBulletAndPositionDlg, SelectCenterAlignmentHdl_Impl)); + m_xRightTB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, SelectRightAlignmentHdl_Impl)); + m_xApplyToMaster->connect_toggled(LINK(this, SvxBulletAndPositionDlg, ApplyToMasterHdl_Impl)); + m_xReset->connect_clicked(LINK(this, SvxBulletAndPositionDlg, ResetHdl_Impl)); + + aInvalidateTimer.SetInvokeHandler( + LINK(this, SvxBulletAndPositionDlg, PreviewInvalidateHdl_Impl)); + aInvalidateTimer.SetTimeout(50); + + eCoreUnit = rSet.GetPool()->GetMetric(rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE)); + + // Fill ListBox with predefined / translated numbering types. + sal_uInt32 nCount = SvxNumberingTypeTable::Count(); + for (sal_uInt32 i = 0; i < nCount; ++i) + { + m_xFmtLB->append(OUString::number(SvxNumberingTypeTable::GetValue(i)), + SvxNumberingTypeTable::GetString(i)); + } + + // Get advanced numbering types from the component. + // Watch out for the ugly + // 136 == 0x88 == SVX_NUM_BITMAP|0x80 == SVX_NUM_BITMAP|LINK_TOKEN + // to not remove that. + SvxNumOptionsTabPageHelper::GetI18nNumbering(*m_xFmtLB, (SVX_NUM_BITMAP | LINK_TOKEN)); + + m_xFmtLB->set_active(0); + m_xRelativeCB->set_active(true); + + Link aLk3 + = LINK(this, SvxBulletAndPositionDlg, DistanceHdl_Impl); + m_xDistBorderMF->connect_value_changed(aLk3); + m_xIndentMF->connect_value_changed(aLk3); + + m_xRelativeCB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, RelativeHdl_Impl)); + m_xRelativeCB->set_active(bLastRelative); + + Size aSize(m_xGrid->get_preferred_size()); + m_xGrid->set_size_request(aSize.Width(), -1); + + // PageCreated + FieldUnit eMetric = pView->GetDoc().GetUIUnit(); + SfxAllItemSet aSet(*(rSet.GetPool())); + aSet.Put(SfxUInt16Item(SID_METRIC_ITEM, static_cast(eMetric))); + + const SfxStringItem* pNumCharFmt = aSet.GetItem(SID_NUM_CHAR_FMT, false); + const SfxUInt16Item* pMetricItem = aSet.GetItem(SID_METRIC_ITEM, false); + + if (pNumCharFmt) + SetCharFmt(pNumCharFmt->GetValue()); + + if (pMetricItem) + SetMetric(static_cast(pMetricItem->GetValue())); + + // tdf#130526: Hide "Apply To Master"-button in Draw and rename "Slide" to "Page" + DocumentType aDocumentType = pView->GetDoc().GetDocumentType(); + if (aDocumentType == DocumentType::Draw) + { + m_xApplyToMaster->hide(); + m_xSlideRB->set_label(SdResId(STR_PAGE_NAME)); + } + // tdf#137406: Crash when clicking "Apply to Master" in Slide Master mode on Bullets and Numbering dialog + EditMode aEditmode = static_cast<::sd::DrawViewShell*>(pView->GetViewShell())->GetEditMode(); + if (aDocumentType == DocumentType::Impress && aEditmode == EditMode::MasterPage) + m_xApplyToMaster->hide(); + + // End PageCreated + + Reset(&rSet); + + // ActivatePage part + + const SfxItemSet* pExampleSet = &rSet; + sal_uInt16 nTmpNumLvl = 1; + bool bPreset = false; + if (pExampleSet) + { + if (const SfxBoolItem* pItem = pExampleSet->GetItemIfSet(SID_PARAM_NUM_PRESET, false)) + bPreset = pItem->GetValue(); + if (const SfxUInt16Item* pItem = pExampleSet->GetItemIfSet(SID_PARAM_CUR_NUM_LEVEL, false)) + nTmpNumLvl = pItem->GetValue(); + } + if (const SvxNumBulletItem* pItem = rSet.GetItemIfSet(nNumItemId, false)) + { + pSaveNum.reset(new SvxNumRule(pItem->GetNumRule())); + } + + bModified = (!pActNum->Get(0) || bPreset); + if (*pActNum != *pSaveNum || nActNumLvl != nTmpNumLvl) + { + nActNumLvl = nTmpNumLvl; + sal_uInt16 nMask = 1; + if (nActNumLvl == SAL_MAX_UINT16) + m_xLevelLB->select(pActNum->GetLevelCount()); + if (nActNumLvl != SAL_MAX_UINT16) + { + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + m_xLevelLB->select(i); + nMask <<= 1; + } + } + *pActNum = *pSaveNum; + + m_xRelativeCB->set_sensitive(nActNumLvl != 1); + + InitPosAndSpaceMode(); + InitControls(); + } + + m_aPreviewWIN.SetLevel(nActNumLvl); + m_aPreviewWIN.Invalidate(); + + // End of the ActivatePage part +} + +SvxBulletAndPositionDlg::~SvxBulletAndPositionDlg() {} + +void SvxBulletAndPositionDlg::SetMetric(FieldUnit eMetric) +{ + if (eMetric == FieldUnit::MM) + { + m_xWidthMF->set_digits(1); + m_xHeightMF->set_digits(1); + m_xDistBorderMF->set_digits(1); + m_xIndentMF->set_digits(1); + } + m_xWidthMF->set_unit(eMetric); + m_xHeightMF->set_unit(eMetric); + m_xDistBorderMF->set_unit(eMetric); + m_xIndentMF->set_unit(eMetric); +} + +SfxItemSet* SvxBulletAndPositionDlg::GetOutputItemSet(SfxItemSet* pSet) +{ + pSet->Put(SfxUInt16Item(SID_PARAM_CUR_NUM_LEVEL, nActNumLvl)); + if (bModified && pActNum) + { + *pSaveNum = *pActNum; + pSet->Put(SvxNumBulletItem(*pSaveNum, nNumItemId)); + pSet->Put(SfxBoolItem(SID_PARAM_NUM_PRESET, false)); + } + return pSet; +}; + +bool SvxBulletAndPositionDlg::IsApplyToMaster() const { return bApplyToMaster; } +bool SvxBulletAndPositionDlg::IsSlideScope() const { return m_xSlideRB->get_active(); } + +void SvxBulletAndPositionDlg::Reset(const SfxItemSet* rSet) +{ + const SvxNumBulletItem* pItem = rSet->GetItemIfSet(SID_ATTR_NUMBERING_RULE, false); + // in Draw the item exists as WhichId, in Writer only as SlotId + if (!pItem) + { + nNumItemId = rSet->GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE); + pItem = rSet->GetItemIfSet(nNumItemId, false); + + if (!pItem) + { + pItem = &rSet->Get(nNumItemId); + } + } + DBG_ASSERT(pItem, "no item found!"); + pSaveNum.reset(new SvxNumRule(pItem->GetNumRule())); + + // insert levels + if (!m_xLevelLB->n_children()) + { + for (sal_uInt16 i = 1; i <= pSaveNum->GetLevelCount(); i++) + m_xLevelLB->append_text(OUString::number(i)); + if (pSaveNum->GetLevelCount() > 1) + { + OUString sEntry = "1 - " + OUString::number(pSaveNum->GetLevelCount()); + m_xLevelLB->append_text(sEntry); + m_xLevelLB->select_text(sEntry); + } + else + m_xLevelLB->select(0); + } + else + m_xLevelLB->select(m_xLevelLB->n_children() - 1); + + sal_uInt16 nMask = 1; + m_xLevelLB->unselect_all(); + if (nActNumLvl == SAL_MAX_UINT16) + { + m_xLevelLB->select(pSaveNum->GetLevelCount()); + } + else + { + for (sal_uInt16 i = 0; i < pSaveNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + m_xLevelLB->select(i); + nMask <<= 1; + } + } + + if (!pActNum) + pActNum.reset(new SvxNumRule(*pSaveNum)); + else if (*pSaveNum != *pActNum) + *pActNum = *pSaveNum; + m_aPreviewWIN.SetNumRule(pActNum.get()); + + bool bContinuous = pActNum->IsFeatureSupported(SvxNumRuleFlags::CONTINUOUS); + + // again misusage: in Draw there is numeration only until the bitmap + // without SVX_NUM_NUMBER_NONE + //remove types that are unsupported by Draw/Impress + if (!bContinuous) + { + sal_Int32 nFmtCount = m_xFmtLB->get_count(); + for (sal_Int32 i = nFmtCount; i; i--) + { + sal_uInt16 nEntryData = m_xFmtLB->get_id(i - 1).toUInt32(); + if (/*SVX_NUM_NUMBER_NONE == nEntryData ||*/ + (SVX_NUM_BITMAP | LINK_TOKEN) == nEntryData) + m_xFmtLB->remove(i - 1); + } + } + //one must be enabled + if (!pActNum->IsFeatureSupported(SvxNumRuleFlags::ENABLE_LINKED_BMP)) + { + auto nPos = m_xFmtLB->find_id(OUString::number(SVX_NUM_BITMAP | LINK_TOKEN)); + if (nPos != -1) + m_xFmtLB->remove(nPos); + } + else if (!pActNum->IsFeatureSupported(SvxNumRuleFlags::ENABLE_EMBEDDED_BMP)) + { + auto nPos = m_xFmtLB->find_id(OUString::number(SVX_NUM_BITMAP)); + if (nPos != -1) + m_xFmtLB->remove(nPos); + } + + // MegaHack: because of a not-fixable 'design mistake/error' in Impress + // delete all kinds of numeric enumerations + if (pActNum->IsFeatureSupported(SvxNumRuleFlags::NO_NUMBERS)) + { + sal_Int32 nFmtCount = m_xFmtLB->get_count(); + for (sal_Int32 i = nFmtCount; i; i--) + { + sal_uInt16 nEntryData = m_xFmtLB->get_id(i - 1).toUInt32(); + if (/*nEntryData >= SVX_NUM_CHARS_UPPER_LETTER &&*/ nEntryData <= SVX_NUM_NUMBER_NONE) + m_xFmtLB->remove(i - 1); + } + } + + InitPosAndSpaceMode(); + + InitControls(); + bModified = false; +} + +void SvxBulletAndPositionDlg::InitControls() +{ + bInInitControl = true; + + const bool bRelative = !bLabelAlignmentPosAndSpaceModeActive && m_xRelativeCB->get_sensitive() + && m_xRelativeCB->get_active(); + const bool bSingleSelection + = m_xLevelLB->count_selected_rows() == 1 && SAL_MAX_UINT16 != nActNumLvl; + + m_xDistBorderMF->set_sensitive(!bLabelAlignmentPosAndSpaceModeActive + && (bSingleSelection || bRelative)); + m_xDistBorderFT->set_sensitive(!bLabelAlignmentPosAndSpaceModeActive + && (bSingleSelection || bRelative)); + + bool bShowBullet = true; + bool bShowBitmap = true; + bool bSameType = true; + bool bSameStart = true; + bool bSamePrefix = true; + bool bSameSuffix = true; + bool bSameSize = true; + bool bSameBulColor = true; + bool bSameBulRelSize = true; + bool bSameDistBorderNum = !bLabelAlignmentPosAndSpaceModeActive; + bool bSetDistEmpty = false; + bool bSameIndent = !bLabelAlignmentPosAndSpaceModeActive; + + const SvxNumberFormat* aNumFmtArr[SVX_MAX_NUM]; + SvxAdjust eFirstAdjust = SvxAdjust::Left; + Size aFirstSize(0, 0); + sal_uInt16 nMask = 1; + sal_uInt16 nLvl = SAL_MAX_UINT16; + + bool bBullColor = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_COLOR); + bool bBullRelSize = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_REL_SIZE); + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + aNumFmtArr[i] = &pActNum->GetLevel(i); + + if (nActNumLvl & nMask) + { + bShowBullet &= aNumFmtArr[i]->GetNumberingType() == SVX_NUM_CHAR_SPECIAL; + bShowBitmap &= (aNumFmtArr[i]->GetNumberingType() & (~LINK_TOKEN)) == SVX_NUM_BITMAP; + eFirstAdjust = aNumFmtArr[i]->GetNumAdjust(); + if (SAL_MAX_UINT16 == nLvl) + { + nLvl = i; + if (bShowBitmap) + aFirstSize = aNumFmtArr[i]->GetGraphicSize(); + } + if (i > nLvl) + { + bSameType + &= aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[nLvl]->GetNumberingType(); + bSameStart = aNumFmtArr[i]->GetStart() == aNumFmtArr[nLvl]->GetStart(); + + bSamePrefix = aNumFmtArr[i]->GetPrefix() == aNumFmtArr[nLvl]->GetPrefix(); + bSameSuffix = aNumFmtArr[i]->GetSuffix() == aNumFmtArr[nLvl]->GetSuffix(); + //bSameAdjust &= eFirstAdjust == aNumFmtArr[i]->GetNumAdjust(); + if (bShowBitmap && bSameSize) + bSameSize &= aNumFmtArr[i]->GetGraphicSize() == aFirstSize; + bSameBulColor + &= aNumFmtArr[i]->GetBulletColor() == aNumFmtArr[nLvl]->GetBulletColor(); + bSameBulRelSize + &= aNumFmtArr[i]->GetBulletRelSize() == aNumFmtArr[nLvl]->GetBulletRelSize(); + bSameIndent //? + &= aNumFmtArr[i]->GetFirstLineOffset() + == aNumFmtArr[nLvl]->GetFirstLineOffset(); + } + } + + nMask <<= 1; + } + SwitchNumberType(bShowBullet ? 1 : bShowBitmap ? 2 : 0); + + sal_uInt16 nNumberingType; + if (nLvl != SAL_MAX_UINT16) + nNumberingType = aNumFmtArr[nLvl]->GetNumberingType(); + else + { + nNumberingType = SVX_NUM_NUMBER_NONE; + bSameDistBorderNum = false; + bSameIndent = false; + bSameBulRelSize = false; + bSameBulColor = false; + bSameStart = false; + bSamePrefix = false; + bSameSuffix = false; + } + + CheckForStartValue_Impl(nNumberingType); + + if (bShowBitmap) + { + if (bSameSize) + { + SetMetricValue(*m_xHeightMF, aFirstSize.Height(), eCoreUnit); + SetMetricValue(*m_xWidthMF, aFirstSize.Width(), eCoreUnit); + } + else + { + m_xHeightMF->set_text(""); + m_xWidthMF->set_text(""); + } + } + + if (bSameType) + { + sal_uInt16 nLBData = nNumberingType; + m_xFmtLB->set_active_id(OUString::number(nLBData)); + } + else + m_xFmtLB->set_active(-1); + + if (bBullRelSize) + { + if (bSameBulRelSize) + m_xBulRelSizeMF->set_value(aNumFmtArr[nLvl]->GetBulletRelSize(), FieldUnit::PERCENT); + else + m_xBulRelSizeMF->set_text(""); + } + if (bBullColor) + { + if (bSameBulColor) + m_xBulColLB->SelectEntry(aNumFmtArr[nLvl]->GetBulletColor()); + else + m_xBulColLB->SetNoSelection(); + } + switch (nBullet) + { + case SHOW_NUMBERING: + if (bSameStart) + { + m_xStartED->set_value(aNumFmtArr[nLvl]->GetStart()); + } + else + m_xStartED->set_text(""); + break; + case SHOW_BULLET: + break; + case SHOW_BITMAP: + break; + } + + switch (eFirstAdjust) + { + case SvxAdjust::Left: + m_xLeftTB->set_active(true); + m_xCenterTB->set_active(false); + m_xRightTB->set_active(false); + break; + case SvxAdjust::Center: + m_xLeftTB->set_active(false); + m_xCenterTB->set_active(true); + m_xRightTB->set_active(false); + break; + case SvxAdjust::Right: + m_xLeftTB->set_active(false); + m_xCenterTB->set_active(false); + m_xRightTB->set_active(true); + break; + default: + break; + } + + if (bSamePrefix) + m_xPrefixED->set_text(aNumFmtArr[nLvl]->GetPrefix()); + else + m_xPrefixED->set_text(""); + if (bSameSuffix) + m_xSuffixED->set_text(aNumFmtArr[nLvl]->GetSuffix()); + else + m_xSuffixED->set_text(""); + + if (bSameDistBorderNum) + { + tools::Long nDistBorderNum; + if (bRelative) + { + nDistBorderNum = static_cast(aNumFmtArr[nLvl]->GetAbsLSpace()) + + aNumFmtArr[nLvl]->GetFirstLineOffset(); + if (nLvl) + nDistBorderNum -= static_cast(aNumFmtArr[nLvl - 1]->GetAbsLSpace()) + + aNumFmtArr[nLvl - 1]->GetFirstLineOffset(); + } + else + { + nDistBorderNum = static_cast(aNumFmtArr[nLvl]->GetAbsLSpace()) + + aNumFmtArr[nLvl]->GetFirstLineOffset(); + } + SetMetricValue(*m_xDistBorderMF, nDistBorderNum, eCoreUnit); + } + else + bSetDistEmpty = true; + + if (bSetDistEmpty) + m_xDistBorderMF->set_text(""); + + if (bSameIndent) + SetMetricValue(*m_xIndentMF, -aNumFmtArr[nLvl]->GetFirstLineOffset(), eCoreUnit); + else + m_xIndentMF->set_text(""); + + m_xSelectionRB->set_active(true); + + m_aPreviewWIN.SetLevel(nActNumLvl); + m_aPreviewWIN.Invalidate(); + bInInitControl = false; +} + +// 0 - Number; 1 - Bullet; 2 - Bitmap +void SvxBulletAndPositionDlg::SwitchNumberType(sal_uInt8 nType) +{ + if (nBullet == nType) + return; + nBullet = nType; + bool bBullet = (nType == SHOW_BULLET); + bool bBitmap = (nType == SHOW_BITMAP); + bool bEnableBitmap = (nType == SHOW_BITMAP); + bool bNumeric = !(bBitmap || bBullet); + m_xPrefixFT->set_visible(bNumeric); + m_xPrefixED->set_visible(bNumeric); + m_xSuffixFT->set_visible(bNumeric); + m_xSuffixED->set_visible(bNumeric); + m_xBeforeAfter->set_visible(bNumeric); + + m_xStartFT->set_visible(!(bBullet || bBitmap)); + m_xStartED->set_visible(!(bBullet || bBitmap)); + + m_xBulletFT->set_visible(bBullet); + m_xBulletPB->set_visible(bBullet); + bool bBullColor = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_COLOR); + m_xBulColorFT->set_visible(!bBitmap && bBullColor); + m_xBulColLB->set_visible(!bBitmap && bBullColor); + bool bBullResSize = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_REL_SIZE); + m_xBulRelSizeFT->set_visible(!bBitmap && bBullResSize); + m_xBulRelSizeMF->set_visible(!bBitmap && bBullResSize); + + m_xBitmapMB->set_visible(bBitmap); + + m_xWidthFT->set_visible(bBitmap); + m_xWidthMF->set_visible(bBitmap); + m_xHeightFT->set_visible(bBitmap); + m_xHeightMF->set_visible(bBitmap); + m_xRatioCB->set_visible(bBitmap); + + m_xWidthFT->set_sensitive(bEnableBitmap); + m_xWidthMF->set_sensitive(bEnableBitmap); + m_xHeightFT->set_sensitive(bEnableBitmap); + m_xHeightMF->set_sensitive(bEnableBitmap); + m_xRatioCB->set_sensitive(bEnableBitmap); +} + +void SvxBulletAndPositionDlg::CheckForStartValue_Impl(sal_uInt16 nNumberingType) +{ + bool bIsNull = m_xStartED->get_value() == 0; + bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC + || SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType + || SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType; + m_xStartED->set_min(bNoZeroAllowed ? 1 : 0); + if (bIsNull && bNoZeroAllowed) + SpinModifyHdl_Impl(*m_xStartED); +} + +IMPL_LINK(SvxBulletAndPositionDlg, LevelHdl_Impl, weld::TreeView&, rBox, void) +{ + sal_uInt16 nSaveNumLvl = nActNumLvl; + nActNumLvl = 0; + auto aSelectedRows = rBox.get_selected_rows(); + if (std::find(aSelectedRows.begin(), aSelectedRows.end(), pActNum->GetLevelCount()) + != aSelectedRows.end() + && (aSelectedRows.size() == 1 || nSaveNumLvl != 0xffff)) + { + nActNumLvl = 0xFFFF; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + rBox.unselect(i); + } + else if (!aSelectedRows.empty()) + { + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (std::find(aSelectedRows.begin(), aSelectedRows.end(), i) != aSelectedRows.end()) + nActNumLvl |= nMask; + nMask <<= 1; + } + rBox.unselect(pActNum->GetLevelCount()); + } + else + nActNumLvl = nSaveNumLvl; + + InitControls(); +} + +IMPL_LINK_NOARG(SvxBulletAndPositionDlg, PreviewInvalidateHdl_Impl, Timer*, void) +{ + m_aPreviewWIN.Invalidate(); +} + +IMPL_LINK(SvxBulletAndPositionDlg, NumberTypeSelectHdl_Impl, weld::ComboBox&, rBox, void) +{ + bool bBmp = false; + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + // PAGEDESC does not exist + SvxNumType nNumType = static_cast(rBox.get_active_id().toUInt32()); + aNumFmt.SetNumberingType(nNumType); + sal_uInt16 nNumberingType = aNumFmt.GetNumberingType(); + if (SVX_NUM_BITMAP == (nNumberingType & (~LINK_TOKEN))) + { + bBmp |= nullptr != aNumFmt.GetBrush(); + aNumFmt.SetIncludeUpperLevels(0); + aNumFmt.SetListFormat("", "", i); + if (!bBmp) + aNumFmt.SetGraphic(""); + pActNum->SetLevel(i, aNumFmt); + SwitchNumberType(SHOW_BITMAP); + } + else if (SVX_NUM_CHAR_SPECIAL == nNumberingType) + { + aNumFmt.SetIncludeUpperLevels(0); + aNumFmt.SetListFormat("", "", i); + if (!aNumFmt.GetBulletFont()) + aNumFmt.SetBulletFont(&aActBulletFont); + if (!aNumFmt.GetBulletChar()) + aNumFmt.SetBulletChar(SVX_DEF_BULLET); + pActNum->SetLevel(i, aNumFmt); + SwitchNumberType(SHOW_BULLET); + // allocation of the drawing pattern is automatic + } + else + { + aNumFmt.SetListFormat(m_xPrefixED->get_text(), m_xSuffixED->get_text(), i); + SwitchNumberType(SHOW_NUMBERING); + pActNum->SetLevel(i, aNumFmt); + CheckForStartValue_Impl(nNumberingType); + + // allocation of the drawing pattern is automatic + } + } + nMask <<= 1; + } + + SetModified(); +} + +IMPL_LINK(SvxBulletAndPositionDlg, BulColorHdl_Impl, ColorListBox&, rColorBox, void) +{ + Color nSetColor = rColorBox.GetSelectEntryColor(); + + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + aNumFmt.SetBulletColor(nSetColor); + pActNum->SetLevel(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); +} + +IMPL_LINK(SvxBulletAndPositionDlg, BulRelSizeHdl_Impl, weld::MetricSpinButton&, rField, void) +{ + sal_uInt16 nRelSize = rField.get_value(FieldUnit::PERCENT); + + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + aNumFmt.SetBulletRelSize(nRelSize); + pActNum->SetLevel(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); +} + +IMPL_LINK(SvxBulletAndPositionDlg, GraphicHdl_Impl, const OUString&, rIdent, void) +{ + OUString aGrfName; + Size aSize; + bool bSucc(false); + SvxOpenGraphicDialog aGrfDlg(SdResId(RID_SVXSTR_EDIT_GRAPHIC), p_Window); + + OUString sNumber; + if (rIdent.startsWith("gallery", &sNumber)) + { + auto idx = sNumber.toUInt32(); + if (idx < aGrfNames.size()) + { + aGrfName = aGrfNames[idx]; + Graphic aGraphic; + if (GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, idx, &aGraphic)) + { + aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic); + bSucc = true; + } + } + } + else if (rIdent == "fromfile") + { + aGrfDlg.EnableLink(false); + aGrfDlg.AsLink(false); + if (!aGrfDlg.Execute()) + { + // memorize selected filter + aGrfName = aGrfDlg.GetPath(); + + Graphic aGraphic; + if (!aGrfDlg.GetGraphic(aGraphic)) + { + aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic); + bSucc = true; + } + } + } + if (!bSucc) + return; + + aSize = OutputDevice::LogicToLogic(aSize, MapMode(MapUnit::Map100thMM), MapMode(eCoreUnit)); + + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + aNumFmt.SetCharFormatName(m_sNumCharFmtName); + aNumFmt.SetGraphic(aGrfName); + + // set size for a later comparison + const SvxBrushItem* pBrushItem = aNumFmt.GetBrush(); + // initiate asynchronous loading + sal_Int16 eOrient = aNumFmt.GetVertOrient(); + aNumFmt.SetGraphicBrush(pBrushItem, &aSize, &eOrient); + aInitSize[i] = aNumFmt.GetGraphicSize(); + + pActNum->SetLevel(i, aNumFmt); + } + nMask <<= 1; + } + m_xRatioCB->set_sensitive(true); + m_xWidthFT->set_sensitive(true); + m_xHeightFT->set_sensitive(true); + m_xWidthMF->set_sensitive(true); + m_xHeightMF->set_sensitive(true); + SetMetricValue(*m_xWidthMF, aSize.Width(), eCoreUnit); + SetMetricValue(*m_xHeightMF, aSize.Height(), eCoreUnit); + + SetModified(); + //needed due to asynchronous loading of graphics in the SvxBrushItem + aInvalidateTimer.Start(); +} + +IMPL_LINK_NOARG(SvxBulletAndPositionDlg, PopupActivateHdl_Impl, weld::Toggleable&, void) +{ + if (m_xGalleryMenu) + return; + + m_xGalleryMenu = m_xBuilder->weld_menu("gallerysubmenu"); + weld::WaitObject aWait(p_Window); + + if (!GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames)) + return; + + GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS); + + Graphic aGraphic; + OUString sGrfName; + ScopedVclPtrInstance pVD; + size_t i = 0; + for (const auto& grfName : aGrfNames) + { + sGrfName = grfName; + OUString sItemId = "gallery" + OUString::number(i); + INetURLObject aObj(sGrfName); + if (aObj.GetProtocol() == INetProtocol::File) + sGrfName = aObj.PathToFileName(); + if (GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, i, &aGraphic)) + { + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + Size aSize(aBitmap.GetSizePixel()); + if (aSize.Width() > MAX_BMP_WIDTH || aSize.Height() > MAX_BMP_HEIGHT) + { + bool bWidth = aSize.Width() > aSize.Height(); + double nScale = bWidth + ? double(MAX_BMP_WIDTH) / static_cast(aSize.Width()) + : double(MAX_BMP_HEIGHT) / static_cast(aSize.Height()); + aBitmap.Scale(nScale, nScale); + } + pVD->SetOutputSizePixel(aBitmap.GetSizePixel(), false); + pVD->DrawBitmapEx(Point(), aBitmap); + + // We want to show only icon names not full path. + aObj.removeExtension(); + OUString sIconName = aObj.GetLastName(INetURLObject::DecodeMechanism::WithCharset); + + m_xGalleryMenu->append(sItemId, sIconName, *pVD); + } + else + { + m_xGalleryMenu->append(sItemId, sGrfName); + } + ++i; + } + GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS); +} + +IMPL_LINK_NOARG(SvxBulletAndPositionDlg, BulletHdl_Impl, weld::Button&, void) +{ + SvxCharacterMap aMap(p_Window, nullptr, nullptr); + + sal_uInt16 nMask = 1; + std::optional pFmtFont; + bool bSameBullet = true; + sal_UCS4 cBullet = 0; + bool bFirst = true; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + const SvxNumberFormat& rCurFmt = pActNum->GetLevel(i); + if (bFirst) + { + cBullet = rCurFmt.GetBulletChar(); + } + else if (rCurFmt.GetBulletChar() != cBullet) + { + bSameBullet = false; + break; + } + if (!pFmtFont) + pFmtFont = rCurFmt.GetBulletFont(); + bFirst = false; + } + nMask <<= 1; + } + + if (pFmtFont) + aMap.SetCharFont(*pFmtFont); + else + aMap.SetCharFont(aActBulletFont); + if (bSameBullet) + aMap.SetChar(cBullet); + if (aMap.run() != RET_OK) + return; + + // change Font Numrules + aActBulletFont = aMap.GetCharFont(); + + sal_uInt16 _nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & _nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + aNumFmt.SetBulletFont(&aActBulletFont); + aNumFmt.SetBulletChar(aMap.GetChar()); + pActNum->SetLevel(i, aNumFmt); + } + _nMask <<= 1; + } + + SetModified(); +} + +IMPL_LINK(SvxBulletAndPositionDlg, SizeHdl_Impl, weld::MetricSpinButton&, rField, void) +{ + bool bWidth = &rField == m_xWidthMF.get(); + bLastWidthModified = bWidth; + bool bRatio = m_xRatioCB->get_active(); + tools::Long nWidthVal = static_cast( + m_xWidthMF->denormalize(m_xWidthMF->get_value(FieldUnit::MM_100TH))); + tools::Long nHeightVal = static_cast( + m_xHeightMF->denormalize(m_xHeightMF->get_value(FieldUnit::MM_100TH))); + nWidthVal = OutputDevice::LogicToLogic(nWidthVal, MapUnit::Map100thMM, eCoreUnit); + nHeightVal = OutputDevice::LogicToLogic(nHeightVal, MapUnit::Map100thMM, eCoreUnit); + double fSizeRatio; + + bool bRepaint = false; + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + if (SVX_NUM_BITMAP == (aNumFmt.GetNumberingType() & (~LINK_TOKEN))) + { + Size aSize(aNumFmt.GetGraphicSize()); + Size aSaveSize(aSize); + + if (aInitSize[i].Height()) + fSizeRatio = static_cast(aInitSize[i].Width()) + / static_cast(aInitSize[i].Height()); + else + fSizeRatio = double(1); + + if (bWidth) + { + tools::Long nDelta = nWidthVal - aInitSize[i].Width(); + aSize.setWidth(nWidthVal); + if (bRatio) + { + aSize.setHeight( + aInitSize[i].Height() + + static_cast(static_cast(nDelta) / fSizeRatio)); + m_xHeightMF->set_value(m_xHeightMF->normalize(OutputDevice::LogicToLogic( + aSize.Height(), eCoreUnit, MapUnit::Map100thMM)), + FieldUnit::MM_100TH); + } + } + else + { + tools::Long nDelta = nHeightVal - aInitSize[i].Height(); + aSize.setHeight(nHeightVal); + if (bRatio) + { + aSize.setWidth( + aInitSize[i].Width() + + static_cast(static_cast(nDelta) * fSizeRatio)); + m_xWidthMF->set_value(m_xWidthMF->normalize(OutputDevice::LogicToLogic( + aSize.Width(), eCoreUnit, MapUnit::Map100thMM)), + FieldUnit::MM_100TH); + } + } + const SvxBrushItem* pBrushItem = aNumFmt.GetBrush(); + sal_Int16 eOrient = aNumFmt.GetVertOrient(); + if (aSize != aSaveSize) + bRepaint = true; + aNumFmt.SetGraphicBrush(pBrushItem, &aSize, &eOrient); + pActNum->SetLevel(i, aNumFmt); + } + } + nMask <<= 1; + } + SetModified(bRepaint); +} + +IMPL_LINK(SvxBulletAndPositionDlg, RatioHdl_Impl, weld::Toggleable&, rBox, void) +{ + if (rBox.get_active()) + { + if (bLastWidthModified) + SizeHdl_Impl(*m_xWidthMF); + else + SizeHdl_Impl(*m_xHeightMF); + } +} + +IMPL_LINK(SvxBulletAndPositionDlg, SelectLeftAlignmentHdl_Impl, weld::Toggleable&, rButton, void) +{ + if (rButton.get_active()) + { + SetAlignmentHdl_Impl(SvxAdjust::Left); + + m_xCenterTB->set_active(false); + m_xRightTB->set_active(false); + + SetModified(); + } +} + +IMPL_LINK(SvxBulletAndPositionDlg, SelectCenterAlignmentHdl_Impl, weld::Toggleable&, rButton, void) +{ + if (rButton.get_active()) + { + SetAlignmentHdl_Impl(SvxAdjust::Center); + + m_xLeftTB->set_active(false); + m_xRightTB->set_active(false); + + SetModified(); + } +} + +IMPL_LINK(SvxBulletAndPositionDlg, SelectRightAlignmentHdl_Impl, weld::Toggleable&, rButton, void) +{ + if (rButton.get_active()) + { + SetAlignmentHdl_Impl(SvxAdjust::Right); + + m_xLeftTB->set_active(false); + m_xCenterTB->set_active(false); + + SetModified(); + } +} + +void SvxBulletAndPositionDlg::SetAlignmentHdl_Impl(SvxAdjust eAdjust) +{ + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + aNumFmt.SetNumAdjust(eAdjust); + pActNum->SetLevel(i, aNumFmt); + } + nMask <<= 1; + } +} + +IMPL_LINK(SvxBulletAndPositionDlg, ApplyToMasterHdl_Impl, weld::Toggleable&, rButton, void) +{ + bApplyToMaster = rButton.get_active(); +} + +IMPL_LINK_NOARG(SvxBulletAndPositionDlg, ResetHdl_Impl, weld::Button&, void) +{ + Reset(&rFirstStateSet); +} + +IMPL_LINK(SvxBulletAndPositionDlg, EditModifyHdl_Impl, weld::Entry&, rEdit, void) +{ + EditModifyHdl_Impl(&rEdit); +} + +IMPL_LINK(SvxBulletAndPositionDlg, SpinModifyHdl_Impl, weld::SpinButton&, rSpinButton, void) +{ + EditModifyHdl_Impl(&rSpinButton); +} + +IMPL_LINK(SvxBulletAndPositionDlg, DistanceHdl_Impl, weld::MetricSpinButton&, rFld, void) +{ + if (bInInitControl) + return; + tools::Long nValue = GetCoreValue(rFld, eCoreUnit); + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + if (&rFld == m_xDistBorderMF.get()) + { + if (m_xRelativeCB->get_active()) + { + if (0 == i) + { + auto const nTmp = aNumFmt.GetFirstLineOffset(); + aNumFmt.SetAbsLSpace(nValue - nTmp); + } + else + { + tools::Long nTmp = pActNum->GetLevel(i - 1).GetAbsLSpace() + + pActNum->GetLevel(i - 1).GetFirstLineOffset() + - pActNum->GetLevel(i).GetFirstLineOffset(); + + aNumFmt.SetAbsLSpace(nValue + nTmp); + } + } + else + { + aNumFmt.SetAbsLSpace(nValue - aNumFmt.GetFirstLineOffset()); + } + } + else if (&rFld == m_xIndentMF.get()) + { + // together with the FirstLineOffset the AbsLSpace must be changed, too + tools::Long nDiff = nValue + aNumFmt.GetFirstLineOffset(); + auto const nAbsLSpace = aNumFmt.GetAbsLSpace(); + aNumFmt.SetAbsLSpace(nAbsLSpace + nDiff); + aNumFmt.SetFirstLineOffset(-nValue); + } + + pActNum->SetLevel(i, aNumFmt); + } + nMask <<= 1; + } + + SetModified(); + if (!m_xDistBorderMF->get_sensitive()) + { + m_xDistBorderMF->set_text(""); + } + + sal_Int32 aLastLevelLSpace + = pActNum->GetLevel(pActNum->GetLevelCount() - 1).GetAbsLSpace() / 40; + m_aPreviewWIN.set_size_request(aLastLevelLSpace, 300); +} + +IMPL_LINK(SvxBulletAndPositionDlg, RelativeHdl_Impl, weld::Toggleable&, rBox, void) +{ + bool bOn = rBox.get_active(); + bool bSingleSelection = m_xLevelLB->count_selected_rows() == 1 && SAL_MAX_UINT16 != nActNumLvl; + bool bSetValue = false; + tools::Long nValue = 0; + if (bOn || bSingleSelection) + { + sal_uInt16 nMask = 1; + bool bFirst = true; + bSetValue = true; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + const SvxNumberFormat& rNumFmt = pActNum->GetLevel(i); + if (bFirst) + { + nValue = rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset(); + if (bOn && i) + nValue -= (pActNum->GetLevel(i - 1).GetAbsLSpace() + + pActNum->GetLevel(i - 1).GetFirstLineOffset()); + } + else + bSetValue = nValue + == (rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset()) + - (pActNum->GetLevel(i - 1).GetAbsLSpace() + + pActNum->GetLevel(i - 1).GetFirstLineOffset()); + bFirst = false; + } + nMask <<= 1; + } + } + if (bSetValue) + SetMetricValue(*m_xDistBorderMF, nValue, eCoreUnit); + else + m_xDistBorderMF->set_text(""); + m_xDistBorderMF->set_sensitive(bOn || bSingleSelection); + m_xDistBorderFT->set_sensitive(bOn || bSingleSelection); + bLastRelative = bOn; +} + +void SvxBulletAndPositionDlg::EditModifyHdl_Impl(const weld::Entry* pEdit) +{ + bool bPrefixOrSuffix = (pEdit == m_xPrefixED.get()) || (pEdit == m_xSuffixED.get()); + bool bStart = pEdit == m_xStartED.get(); + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + if (bPrefixOrSuffix) + aNumFmt.SetListFormat(m_xPrefixED->get_text(), m_xSuffixED->get_text(), i); + else if (bStart) + aNumFmt.SetStart(m_xStartED->get_value()); + pActNum->SetLevel(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); +} + +void SvxBulletAndPositionDlg::SetModified(bool bRepaint) +{ + bModified = true; + if (bRepaint) + { + m_aPreviewWIN.SetLevel(nActNumLvl); + m_aPreviewWIN.Invalidate(); + } +} + +void SvxBulletAndPositionDlg::InitPosAndSpaceMode() +{ + if (pActNum == nullptr) + { + SAL_WARN("cui.tabpages", " - misusage of " + "method -> has to be already set!"); + return; + } + + SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode = SvxNumberFormat::LABEL_ALIGNMENT; + sal_uInt16 nMask = 1; + for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i) + { + if (nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); + ePosAndSpaceMode = aNumFmt.GetPositionAndSpaceMode(); + if (ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT) + { + break; + } + } + nMask <<= 1; + } + + bLabelAlignmentPosAndSpaceModeActive = ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/LayerTabBar.cxx b/sd/source/ui/dlg/LayerTabBar.cxx new file mode 100644 index 0000000000..96b96068f3 --- /dev/null +++ b/sd/source/ui/dlg/LayerTabBar.cxx @@ -0,0 +1,438 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +/** + * default constructor + */ +LayerTabBar::LayerTabBar(DrawViewShell* pViewSh, vcl::Window* pParent) + : TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL ) ), + DropTargetHelper( this ), + pDrViewSh(pViewSh) +{ + EnableEditMode(); + SetSizePixel(Size(0, 0)); + SetMaxPageWidth( 150 ); + SetHelpId( HID_SD_TABBAR_LAYERS ); +} + +LayerTabBar::~LayerTabBar() +{ + disposeOnce(); +} + +void LayerTabBar::dispose() +{ + DropTargetHelper::dispose(); + TabBar::dispose(); +} + +OUString LayerTabBar::convertToLocalizedName(const OUString& rName) +{ + if ( rName == sUNO_LayerName_background ) + return SdResId( STR_LAYER_BCKGRND ); + + if ( rName == sUNO_LayerName_background_objects ) + return SdResId( STR_LAYER_BCKGRNDOBJ ); + + if ( rName == sUNO_LayerName_layout ) + return SdResId( STR_LAYER_LAYOUT ); + + if ( rName == sUNO_LayerName_controls ) + return SdResId( STR_LAYER_CONTROLS ); + + if ( rName == sUNO_LayerName_measurelines ) + return SdResId( STR_LAYER_MEASURELINES ); + + return rName; +} + +// Use a method name, that is specific to LayerTabBar to make code better readable +OUString LayerTabBar::GetLayerName(sal_uInt16 nPageId) const +{ + return GetAuxiliaryText(nPageId); +} + +void LayerTabBar::SetLayerName( sal_uInt16 nPageId, const OUString& rText ) +{ + SetAuxiliaryText(nPageId, rText); +} + +// Here "Page" is a tab in the LayerTabBar. +void LayerTabBar::InsertPage( sal_uInt16 nPageId, const OUString& rText, + TabBarPageBits nBits, sal_uInt16 nPos) +{ + OUString sLocalizedName(convertToLocalizedName(rText)); + TabBar::InsertPage(nPageId, sLocalizedName, nBits, nPos ); + SetLayerName(nPageId, rText); +} + +void LayerTabBar::SetPageText( sal_uInt16 nPageId, const OUString& rText ) +{ + OUString sLocalizedName(convertToLocalizedName(rText)); + SetLayerName(nPageId, rText); + TabBar::SetPageText(nPageId, sLocalizedName); +} + +bool LayerTabBar::IsLocalizedNameOfStandardLayer(std::u16string_view rName) +{ + return ( rName == SdResId(STR_LAYER_LAYOUT) + || rName == SdResId(STR_LAYER_CONTROLS) + || rName == SdResId(STR_LAYER_MEASURELINES) + || rName == SdResId(STR_LAYER_BCKGRND) + || rName == SdResId(STR_LAYER_BCKGRNDOBJ) ); +} + +bool LayerTabBar::IsRealNameOfStandardLayer(std::u16string_view rName) +{ + return ( rName == sUNO_LayerName_layout + || rName == sUNO_LayerName_controls + || rName == sUNO_LayerName_measurelines + || rName == sUNO_LayerName_background + || rName == sUNO_LayerName_background_objects ); +} + +void LayerTabBar::Select() +{ + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHLAYER, SfxCallMode::SYNCHRON); +} + +void LayerTabBar::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bSetPageID=false; + + if (rMEvt.IsLeft()) + { + Point aPosPixel = rMEvt.GetPosPixel(); + sal_uInt16 aTabId = GetPageId( PixelToLogic(aPosPixel) ); + if (aTabId == 0) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_INSERTLAYER, SfxCallMode::SYNCHRON); + + bSetPageID=true; + } + else if (rMEvt.IsMod2()) + { + // direct editing of tab text + // make sure the clicked tab is the current tab otherwise Edit() acts on the wrong tab + if ( aTabId != GetCurPageId()) + { + MouseEvent aSyntheticEvent (rMEvt.GetPosPixel(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, 0); + TabBar::MouseButtonDown(aSyntheticEvent); + } + } + else if (rMEvt.IsMod1() || rMEvt.IsShift()) + { + // keyboard Shortcuts to change layer attributes + + OUString aName(GetLayerName(aTabId)); + SdrPageView* pPV = pDrViewSh->GetView()->GetSdrPageView(); + + // Save old state + + bool bOldPrintable = pPV->IsLayerPrintable(aName); + bool bOldVisible = pPV->IsLayerVisible(aName); + bool bOldLocked = pPV->IsLayerLocked(aName); + + bool bNewPrintable = bOldPrintable; + bool bNewVisible = bOldVisible; + bool bNewLocked = bOldLocked; + + if (rMEvt.IsMod1() && rMEvt.IsShift()) + { + // Shift+Ctrl: Toggle between layer printable / not printable + bNewPrintable = !bOldPrintable; + pPV->SetLayerPrintable(aName, bNewPrintable); + } + else if (rMEvt.IsShift()) + { + // Shift: Toggle between layer visible / hidden + // see also SID_TOGGLELAYERVISIBILITY / tdf#113439 + bNewVisible = !bOldVisible; + pPV->SetLayerVisible(aName, bNewVisible); + } + else // if (rMEvt.IsMod1()) + { + // Ctrl: Toggle between layer locked / unlocked + bNewLocked = !bOldLocked; + pPV->SetLayerLocked(aName, bNewLocked); + } + + pDrViewSh->ResetActualLayer(); + + // Add Undo action + + ::sd::View* pView = pDrViewSh->GetView(); + DrawView* pDrView = dynamic_cast(pView); + + SdDrawDocument& rDoc = pView->GetDoc(); + SdrLayer* pLayer = rDoc.GetLayerAdmin().GetLayer(aName); + + if (pLayer) + { + assert (pDrView && "Change layer attribute undo action is only working with a SdDrawView"); + if(pDrView) + { + SfxUndoManager* pManager = rDoc.GetDocSh()->GetUndoManager(); + std::unique_ptr pAction(new SdLayerModifyUndoAction( + &rDoc, + pLayer, + aName, + pLayer->GetTitle(), + pLayer->GetDescription(), + bOldVisible, + bOldLocked, + bOldPrintable, + aName, + pLayer->GetTitle(), + pLayer->GetDescription(), + bNewVisible, + bNewLocked, + bNewPrintable + )); + pManager->AddUndoAction(std::move(pAction)); + } + } + + // Mark document changed + + pView->GetDoc().SetChanged(); + } + } + + // If you insert a new layer you must not call TabBar::MouseButtonDown(rMEvt); + // because you want to activate the new layer + if( !bSetPageID ) + TabBar::MouseButtonDown(rMEvt); +} + +void LayerTabBar::DoubleClick() +{ + if (GetCurPageId() != 0) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute( SID_MODIFYLAYER, SfxCallMode::SYNCHRON ); + } +} + +/** + * AcceptDrop-Event + */ + +sal_Int8 LayerTabBar::AcceptDrop( const AcceptDropEvent& rEvt ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( rEvt.mbLeaving ) + EndSwitchPage(); + + if( !pDrViewSh->GetDocSh()->IsReadOnly() ) + { + Point aPos( PixelToLogic( rEvt.maPosPixel ) ); + OUString sLayerName( GetLayerName(GetPageId(aPos)) ); + SdrLayerID nLayerId = pDrViewSh->GetView()->GetDoc().GetLayerAdmin().GetLayerID(sLayerName); + + nRet = pDrViewSh->AcceptDrop( rEvt, *this, nullptr, SDRPAGE_NOTFOUND, nLayerId ); + + SwitchPage( aPos ); + } + + return nRet; +} + +/** + * ExecuteDrop-Event + */ +sal_Int8 LayerTabBar::ExecuteDrop( const ExecuteDropEvent& rEvt ) +{ + Point aPos( PixelToLogic(rEvt.maPosPixel) ); + OUString sLayerName( GetLayerName(GetPageId(aPos)) ); + SdrLayerID nLayerId = pDrViewSh->GetView()->GetDoc().GetLayerAdmin().GetLayerID(sLayerName); + + sal_Int8 nRet = pDrViewSh->ExecuteDrop( rEvt, *this, nullptr, SDRPAGE_NOTFOUND, nLayerId ); + + EndSwitchPage(); + + return nRet; + +} + +void LayerTabBar::Command(const CommandEvent& rCEvt) +{ + if ( rCEvt.GetCommand() == CommandEventId::ContextMenu ) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->ExecutePopup("layertab"); + } +} + +bool LayerTabBar::StartRenaming() +{ + bool bOK = true; + OUString aLayerName = GetLayerName( GetEditPageId() ); + + if ( IsRealNameOfStandardLayer(aLayerName)) + { + // It is not allowed to change these names + bOK = false; + } + else + { + ::sd::View* pView = pDrViewSh->GetView(); + + if ( pView->IsTextEdit() ) + { + pView->SdrEndTextEdit(); + } + } + + return bOK; +} + +TabBarAllowRenamingReturnCode LayerTabBar::AllowRenaming() +{ + bool bOK = true; + + // Check if names already exists + ::sd::View* pView = pDrViewSh->GetView(); + SdDrawDocument& rDoc = pView->GetDoc(); + OUString aLayerName = pView->GetActiveLayer(); + SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin(); + OUString aNewName( GetEditText() ); + + if (aNewName.isEmpty() || + (rLayerAdmin.GetLayer( aNewName ) && aLayerName != aNewName) ) + { + // Name already exists. + std::unique_ptr xWarn(Application::CreateMessageDialog(pDrViewSh->GetViewFrame()->GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_WARN_NAME_DUPLICATE))); + xWarn->run(); + bOK = false; + } + + if (bOK) + { + if ( IsLocalizedNameOfStandardLayer(aNewName) || IsRealNameOfStandardLayer(aNewName) ) + { + // Standard layer names may not be changed. + bOK = false; + } + } + + return bOK ? TABBAR_RENAMING_YES : TABBAR_RENAMING_NO; +} + +void LayerTabBar::EndRenaming() +{ + if( IsEditModeCanceled() ) + return; + + ::sd::View* pView = pDrViewSh->GetView(); + DrawView* pDrView = dynamic_cast( pView ); + + SdDrawDocument& rDoc = pView->GetDoc(); + OUString aLayerName = pView->GetActiveLayer(); + SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin(); + SdrLayer* pLayer = rLayerAdmin.GetLayer(aLayerName); + + if (!pLayer) + return; + + OUString aNewName( GetEditText() ); + assert (pDrView && "Rename layer undo action is only working with a SdDrawView"); + if( pDrView ) + { + SfxUndoManager* pManager = rDoc.GetDocSh()->GetUndoManager(); + std::unique_ptr pAction(new SdLayerModifyUndoAction( + &rDoc, + pLayer, + aLayerName, + pLayer->GetTitle(), + pLayer->GetDescription(), + pDrView->IsLayerVisible(aLayerName), + pDrView->IsLayerLocked(aLayerName), + pDrView->IsLayerPrintable(aLayerName), + aNewName, + pLayer->GetTitle(), + pLayer->GetDescription(), + pDrView->IsLayerVisible(aLayerName), + pDrView->IsLayerLocked(aLayerName), + pDrView->IsLayerPrintable(aLayerName) + )); + pManager->AddUndoAction( std::move(pAction) ); + } + + // First notify View since SetName() calls ResetActualLayer() and + // the View then already has to know the Layer + pView->SetActiveLayer(aNewName); + pLayer->SetName(aNewName); + rDoc.SetChanged(); +} + +void LayerTabBar::ActivatePage() +{ + if (pDrViewSh!=nullptr) + { + + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHLAYER, SfxCallMode::ASYNCHRON); + } +} + +void LayerTabBar::SendActivatePageEvent() +{ + CallEventListeners (VclEventId::TabbarPageActivated, + reinterpret_cast(GetCurPageId())); +} + +void LayerTabBar::SendDeactivatePageEvent() +{ + CallEventListeners (VclEventId::TabbarPageDeactivated, + reinterpret_cast(GetCurPageId())); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/NavigatorChildWindow.cxx b/sd/source/ui/dlg/NavigatorChildWindow.cxx new file mode 100644 index 0000000000..a9746b6076 --- /dev/null +++ b/sd/source/ui/dlg/NavigatorChildWindow.cxx @@ -0,0 +1,101 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +static void RequestNavigatorUpdate (SfxBindings const * pBindings) +{ + if (pBindings != nullptr + && pBindings->GetDispatcher() != nullptr) + { + SfxBoolItem aItem (SID_NAVIGATOR_INIT, true); + pBindings->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_INIT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aItem }); + } +} + +SdNavigatorFloat::SdNavigatorFloat(SfxBindings* _pBindings, SfxChildWindow* _pMgr, + vcl::Window* _pParent, SfxChildWinInfo* pInfo) + : SfxNavigator(_pBindings, _pMgr, _pParent, pInfo) + , m_xNavWin(std::make_unique(m_xContainer.get(), _pBindings, this)) + , m_bSetInitialFocusOnActivate(true) +{ + m_xNavWin->SetUpdateRequestFunctor( + [_pBindings] () { return RequestNavigatorUpdate(_pBindings); }); + + SetMinOutputSizePixel(GetOptimalSize()); +} + +void SdNavigatorFloat::Activate() +{ + SfxNavigator::Activate(); + // tdf#141708 defer grabbing focus to preferred widget until the float is + // first activated + if (m_bSetInitialFocusOnActivate) + { + m_xNavWin->FirstFocus(); + m_bSetInitialFocusOnActivate = false; + } +} + +void SdNavigatorFloat::InitTreeLB(const SdDrawDocument* pDoc) +{ + m_xNavWin->InitTreeLB(pDoc); +} + +void SdNavigatorFloat::FreshTree(const SdDrawDocument* pDoc) +{ + m_xNavWin->FreshTree(pDoc); +} + +void SdNavigatorFloat::dispose() +{ + m_xNavWin.reset(); + SfxNavigator::dispose(); +} + +SdNavigatorFloat::~SdNavigatorFloat() +{ + disposeOnce(); +} + +SFX_IMPL_DOCKINGWINDOW(SdNavigatorWrapper, SID_NAVIGATOR); + +SdNavigatorWrapper::SdNavigatorWrapper(vcl::Window *_pParent, sal_uInt16 nId, + SfxBindings* pBindings, SfxChildWinInfo* pInfo) + : SfxNavigatorWrapper(_pParent, nId) +{ + SetWindow(VclPtr::Create(pBindings, this, _pParent, pInfo)); + Initialize(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/PaneChildWindows.cxx b/sd/source/ui/dlg/PaneChildWindows.cxx new file mode 100644 index 0000000000..320ce2a74b --- /dev/null +++ b/sd/source/ui/dlg/PaneChildWindows.cxx @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace sd { + + +SFX_IMPL_DOCKINGWINDOW_WITHID(LeftPaneImpressChildWindow, SID_LEFT_PANE_IMPRESS) +SFX_IMPL_DOCKINGWINDOW_WITHID(LeftPaneDrawChildWindow, SID_LEFT_PANE_DRAW) + +//===== PaneChildWindow ======================================================= +PaneChildWindow::PaneChildWindow ( + vcl::Window* pParentWindow, + sal_uInt16 nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo, + TranslateId pTitleBarResId) + : SfxChildWindow (pParentWindow, nId) +{ + SetWindow( VclPtr::Create( + pBindings, + this, + pParentWindow, + SdResId(pTitleBarResId))); + SetAlignment(SfxChildAlignment::LEFT); + SfxDockingWindow* pDockingWindow = static_cast(GetWindow()); + pDockingWindow->EnableInput(); + pDockingWindow->Initialize(pInfo); + SetHideNotDelete(true); + + ViewShellBase* pBase = ViewShellBase::GetViewShellBase(pBindings->GetDispatcher()->GetFrame()); + if (pBase != nullptr) + { + framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration(); + } +} + +PaneChildWindow::~PaneChildWindow() +{ + ViewShellBase* pBase = nullptr; + TitledDockingWindow* pDockingWindow = dynamic_cast(GetWindow()); + if (pDockingWindow != nullptr) + pBase = ViewShellBase::GetViewShellBase( + pDockingWindow->GetBindings().GetDispatcher()->GetFrame()); + if (pBase != nullptr) + framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration(); +} + +//===== LeftPaneImpressChildWindow ============================================ +LeftPaneImpressChildWindow::LeftPaneImpressChildWindow ( + vcl::Window* pParentWindow, + sal_uInt16 nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo) + : PaneChildWindow( + pParentWindow, + nId, + pBindings, + pInfo, + STR_LEFT_PANE_IMPRESS_TITLE) +{ +} + +//===== LeftPaneDrawChildWindow =============================================== +LeftPaneDrawChildWindow::LeftPaneDrawChildWindow ( + vcl::Window* pParentWindow, + sal_uInt16 nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo) + : PaneChildWindow( + pParentWindow, + nId, + pBindings, + pInfo, + STR_LEFT_PANE_DRAW_TITLE) +{ +} + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/PaneShells.cxx b/sd/source/ui/dlg/PaneShells.cxx new file mode 100644 index 0000000000..77e411aaed --- /dev/null +++ b/sd/source/ui/dlg/PaneShells.cxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include + +namespace sd { + +//===== LeftImpressPaneShell ================================================== + +static SfxSlot aLeftImpressPaneShellSlots_Impl[] = +{ + { 0, SfxGroupId::NONE, SfxSlotMode::NONE, 0, 0, nullptr, nullptr, nullptr, nullptr, nullptr, 0, SfxDisableFlags::NONE, "" } +}; + +SFX_IMPL_INTERFACE(LeftImpressPaneShell, SfxShell) + +void LeftImpressPaneShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterChildWindow(::sd::LeftPaneImpressChildWindow::GetChildWindowId()); +} + + +LeftImpressPaneShell::LeftImpressPaneShell() +{ + SetName("LeftImpressPane"); +} + +LeftImpressPaneShell::~LeftImpressPaneShell() +{ +} + +//===== LeftDrawPaneShell ===================================================== + +static SfxSlot aLeftDrawPaneShellSlots_Impl[] = +{ + { 0, SfxGroupId::NONE, SfxSlotMode::NONE, 0, 0, nullptr, nullptr, nullptr, nullptr, nullptr, 0, SfxDisableFlags::NONE, "" } +}; + +SFX_IMPL_INTERFACE(LeftDrawPaneShell, SfxShell) + +void LeftDrawPaneShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterChildWindow(::sd::LeftPaneDrawChildWindow::GetChildWindowId()); +} + + +LeftDrawPaneShell::LeftDrawPaneShell() +{ + SetName("LeftDrawPane"); +} + +LeftDrawPaneShell::~LeftDrawPaneShell() +{ +} + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.cxx b/sd/source/ui/dlg/PhotoAlbumDialog.cxx new file mode 100644 index 0000000000..8e1e1bb5b0 --- /dev/null +++ b/sd/source/ui/dlg/PhotoAlbumDialog.cxx @@ -0,0 +1,775 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* +* This file is part of the LibreOffice project. +* +* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PhotoAlbumDialog.hxx" +#include +#include +#include +#include + +namespace sd +{ + +SdPhotoAlbumDialog::SdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pActDoc) + : GenericDialogController(pWindow, "modules/simpress/ui/photoalbum.ui", "PhotoAlbumCreatorDialog") + , m_pDoc(pActDoc) + , m_aImg(m_xDialog.get()) + , m_xCancelBtn(m_xBuilder->weld_button("cancel")) + , m_xCreateBtn(m_xBuilder->weld_button("ok")) + , m_xAddBtn(m_xBuilder->weld_button("add_btn")) + , m_xUpBtn(m_xBuilder->weld_button("up_btn")) + , m_xDownBtn(m_xBuilder->weld_button("down_btn")) + , m_xRemoveBtn(m_xBuilder->weld_button("rem_btn")) + , m_xImagesLst(m_xBuilder->weld_tree_view("images_tree")) + , m_xImg(new weld::CustomWeld(*m_xBuilder, "preview_img", m_aImg)) + , m_xInsTypeCombo(m_xBuilder->weld_combo_box("opt_combo")) + , m_xASRCheck(m_xBuilder->weld_check_button("asr_check")) + , m_xASRCheckCrop(m_xBuilder->weld_check_button("asr_check_crop")) + , m_xCapCheck(m_xBuilder->weld_check_button("cap_check")) + , m_xInsertAsLinkCheck(m_xBuilder->weld_check_button("insert_as_link_check")) +{ + m_xCancelBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, CancelHdl)); + m_xCreateBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, CreateHdl)); + + m_xAddBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, FileHdl)); + m_xUpBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, UpHdl)); + m_xUpBtn->set_sensitive(false); + m_xDownBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, DownHdl)); + m_xDownBtn->set_sensitive(false); + m_xRemoveBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, RemoveHdl)); + m_xRemoveBtn->set_sensitive(false); + m_xImagesLst->connect_changed(LINK(this, SdPhotoAlbumDialog, SelectHdl)); + m_xInsTypeCombo->connect_changed(LINK(this, SdPhotoAlbumDialog, TypeSelectHdl)); + + m_pGraphicFilter = new GraphicFilter; + m_xAddBtn->grab_focus(); +} + +SdPhotoAlbumDialog::~SdPhotoAlbumDialog() +{ +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, CancelHdl, weld::Button&, void) +{ + m_xDialog->response(RET_CANCEL); +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, CreateHdl, weld::Button&, void) +{ + if (m_xImagesLst->n_children() == 0) + { + std::unique_ptr xWarn(Application::CreateMessageDialog(m_xDialog.get(), + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_PHOTO_ALBUM_EMPTY_WARNING))); + xWarn->run(); + } + else + { + Reference< drawing::XDrawPagesSupplier > xDPS( m_pDoc->getUnoModel(), uno::UNO_QUERY ); + Reference< drawing::XDrawPages > xDrawPages = xDPS->getDrawPages(); + Reference< lang::XMultiServiceFactory > xShapeFactory( m_pDoc->getUnoModel(), uno::UNO_QUERY ); + + Reference< XComponentContext > xContext(::comphelper::getProcessComponentContext()); + Reference< graphic::XGraphicProvider> xProvider(graphic::GraphicProvider::create(xContext)); + + // determine if to use Captions (use TitleObject) and choose the correct AutoLayout + // from the beginning + const bool bCreateCaptions(m_xCapCheck->get_active()); + const bool bInsertAsLink(m_xInsertAsLinkCheck->get_active()); + const AutoLayout aAutoLayout(bCreateCaptions ? AUTOLAYOUT_TITLE_ONLY : AUTOLAYOUT_NONE); + + // get the option + const int nOpt = m_xInsTypeCombo->get_active(); + if (nOpt == ONE_IMAGE) + { + for( sal_Int32 i = 0; i < m_xImagesLst->n_children(); ++i ) + { + OUString sUrl = m_xImagesLst->get_id(i); + + Reference< drawing::XDrawPage > xSlide = appendNewSlide(aAutoLayout, xDrawPages); + Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY ); + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl); + + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Size aPageSize; + + xSlideProps->getPropertyValue( + "Width") >>= aPageSize.Width; + xSlideProps->getPropertyValue( + "Height") >>= aPageSize.Height; + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active() && !m_xASRCheckCrop->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, aPageSize); + } + else if (m_xASRCheckCrop->get_active()) + { + aPicSize = createASRSizeCrop(aPicSize, aPageSize); + } + + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width - aPicSize.Width)/2; + aPicPos.Y = (aPageSize.Height - aPicSize.Height)/2; + + xShape->setPosition(aPicPos); + try + { + xSlide->add(xShape); + if (bCreateCaptions) + createCaption( aPageSize ); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + } + else if( nOpt == TWO_IMAGES ) + { + for( sal_Int32 i = 0; i < m_xImagesLst->n_children(); i+=2 ) + { + // create the slide + Reference< drawing::XDrawPage > xSlide = appendNewSlide(aAutoLayout, xDrawPages); + Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY ); + //Slide dimensions + ::awt::Size aPageSize; + + xSlideProps->getPropertyValue( + "Width") >>= aPageSize.Width; + xSlideProps->getPropertyValue( + "Height") >>= aPageSize.Height; + + // grab the left one + OUString sUrl1 = m_xImagesLst->get_id(i); + // grab the right one + OUString sUrl2 = m_xImagesLst->get_id(i+1); + + if( !sUrl1.isEmpty() ) + { + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl1, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl1); + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100)); + } + else + { + aPicSize.Width = aPageSize.Width/2 - 100; + aPicSize.Height = aPageSize.Height/2 - 100; + } + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2); + aPicPos.Y = aPageSize.Height/2 - aPicSize.Height/2; + + xShape->setPosition(aPicPos); + try + { + xSlide->add(xShape); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + + if( !sUrl2.isEmpty() ) + { + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl2, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl2); + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100)); + } + else + { + aPicSize.Width = aPageSize.Width/2 - 100; + aPicSize.Height = aPageSize.Height/2 - 100; + } + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2) + aPageSize.Width/2; + aPicPos.Y = aPageSize.Height/2 - aPicSize.Height/2; + + xShape->setPosition(aPicPos); + + try + { + xSlide->add(xShape); + if(bCreateCaptions) + createCaption( aPageSize ); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + } + } + else if( nOpt == FOUR_IMAGES ) + { + for( sal_Int32 i = 0; i < m_xImagesLst->n_children(); i+=4 ) + { + // create the slide + Reference< drawing::XDrawPage > xSlide = appendNewSlide(aAutoLayout, xDrawPages); + Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY ); + //Slide dimensions + ::awt::Size aPageSize; + + xSlideProps->getPropertyValue( + "Width") >>= aPageSize.Width; + xSlideProps->getPropertyValue( + "Height") >>= aPageSize.Height; + + // grab the upper left one + OUString sUrl1 = m_xImagesLst->get_id(i); + + // grab the upper right one + OUString sUrl2 = m_xImagesLst->get_id(i+1); + + // grab the lower left one + OUString sUrl3 = m_xImagesLst->get_id(i+2); + + // grab the lower right one + OUString sUrl4 = m_xImagesLst->get_id(i+3); + + if( !sUrl1.isEmpty() ) + { + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl1, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl1); + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100)); + } + else + { + aPicSize.Width = aPageSize.Width/2 - 100; + aPicSize.Height = aPageSize.Height/2 - 100; + } + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2); + aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2; + + xShape->setPosition(aPicPos); + try + { + xSlide->add(xShape); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + if( !sUrl2.isEmpty() ) + { + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl2, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl2); + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100)); + } + else + { + aPicSize.Width = aPageSize.Width/2 - 100; + aPicSize.Height = aPageSize.Height/2 - 100; + } + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2) + aPageSize.Width/2; + aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2; + + xShape->setPosition(aPicPos); + try + { + xSlide->add(xShape); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + if( !sUrl3.isEmpty() ) + { + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl3, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl3); + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100)); + } + else + { + aPicSize.Width = aPageSize.Width/2 - 100; + aPicSize.Height = aPageSize.Height/2 - 100; + } + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2); + aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2 + aPageSize.Height/2; + + xShape->setPosition(aPicPos); + try + { + xSlide->add(xShape); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + if( !sUrl4.isEmpty() ) + { + Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl4, xProvider); + + Graphic aGraphic(xGraphic); + if (bInsertAsLink) + aGraphic.setOriginURL(sUrl4); + // Save the original size, multiplied with 100 + ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100); + + Reference< drawing::XShape > xShape( + xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), + uno::UNO_QUERY); + + Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); + xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic)); + + ::awt::Point aPicPos; + + if (m_xASRCheck->get_active()) + { + // Resize the image, with keeping ASR + aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100)); + } + else + { + aPicSize.Width = aPageSize.Width/2 - 100; + aPicSize.Height = aPageSize.Height/2 - 100; + } + xShape->setSize(aPicSize); + aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2) + aPageSize.Width/2; + aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2 + aPageSize.Height/2; + + xShape->setPosition(aPicPos); + try + { + xSlide->add(xShape); + if(bCreateCaptions) + createCaption( aPageSize ); + } + catch (const css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + } + } + else + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(m_xDialog.get(), + VclMessageType::Info, VclButtonsType::Ok, + "Function is not implemented!")); + xInfoBox->run(); + } + m_xDialog->response(RET_OK); + } +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, FileHdl, weld::Button&, void) +{ + ::sfx2::FileDialogHelper aDlg( + css::ui::dialogs::TemplateDescription::FILEOPEN_PREVIEW, + FileDialogFlags::Graphic | FileDialogFlags::MultiSelection, m_xDialog.get()); + aDlg.SetContext(sfx2::FileDialogHelper::ImpressPhotoDialog); + + if ( aDlg.Execute() == ERRCODE_NONE ) + { + const Sequence< OUString > aFilesArr = aDlg.GetSelectedFiles(); + for ( const auto& rFile : aFilesArr ) + { + // Store full path, show filename only. Use INetURLObject to display spaces in filename correctly + INetURLObject aUrl(rFile); + m_xImagesLst->append(aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE), aUrl.GetLastName(INetURLObject::DecodeMechanism::WithCharset), ""); + } + } + EnableDisableButtons(); +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, UpHdl, weld::Button&, void) +{ + const int nActPos = m_xImagesLst->get_selected_index(); + if (nActPos != -1 && nActPos != 0) + { + OUString sActEntry(m_xImagesLst->get_text(nActPos)); + // actual data + OUString sAct(m_xImagesLst->get_id(nActPos)); + + OUString sUpperEntry(m_xImagesLst->get_text(nActPos - 1)); + // upper data + OUString sUpper(m_xImagesLst->get_id(nActPos - 1)); + + m_xImagesLst->remove_text(sActEntry); + m_xImagesLst->remove_text(sUpperEntry); + + m_xImagesLst->insert(nActPos - 1, sActEntry, &sAct, nullptr, nullptr); + m_xImagesLst->insert(nActPos, sUpperEntry, &sUpper, nullptr, nullptr); + + m_xImagesLst->select(nActPos - 1); + } + + EnableDisableButtons(); +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, DownHdl, weld::Button&, void) +{ + const int nActPos = m_xImagesLst->get_selected_index(); + if (!m_xImagesLst->get_text(nActPos + 1).isEmpty()) + { + OUString sActEntry(m_xImagesLst->get_selected_text()); + OUString sAct(m_xImagesLst->get_selected_id()); + + OUString sDownEntry(m_xImagesLst->get_text(nActPos + 1)); + OUString sDown(m_xImagesLst->get_id(nActPos + 1)); + + m_xImagesLst->remove_text(sActEntry); + m_xImagesLst->remove_text(sDownEntry); + + m_xImagesLst->insert(nActPos, sDownEntry, &sDown, nullptr, nullptr); + m_xImagesLst->insert(nActPos + 1, sActEntry, &sAct, nullptr, nullptr); + + m_xImagesLst->select(nActPos + 1); + } + EnableDisableButtons(); +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, RemoveHdl, weld::Button&, void) +{ + m_xImagesLst->remove(m_xImagesLst->get_selected_index()); + m_aImg.SetGraphic(Graphic()); + + EnableDisableButtons(); +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, SelectHdl, weld::TreeView&, void) +{ + OUString sImgUrl = m_xImagesLst->get_selected_id(); + + if (sImgUrl != SdResId(STR_PHOTO_ALBUM_TEXTBOX)) + { + Graphic aGraphic; + INetURLObject aURLObj( sImgUrl ); + + sal_uInt16 nFilter = GRFILTER_FORMAT_DONTKNOW; + + if ( aURLObj.HasError() || INetProtocol::NotValid == aURLObj.GetProtocol() ) + { + aURLObj.SetSmartProtocol( INetProtocol::File ); + aURLObj.SetSmartURL( sImgUrl ); + } + + GraphicFilterImportFlags nFilterImportFlags = GraphicFilterImportFlags::SetLogsizeForJpeg; + // remote? + if ( INetProtocol::File != aURLObj.GetProtocol() ) + { + std::unique_ptr pStream = ::utl::UcbStreamHelper::CreateStream( sImgUrl, StreamMode::READ ); + + if( pStream ) + m_pGraphicFilter->ImportGraphic( aGraphic, sImgUrl, *pStream, nFilter, nullptr, nFilterImportFlags ); + else + m_pGraphicFilter->ImportGraphic( aGraphic, aURLObj, nFilter, nullptr, nFilterImportFlags ); + } + else + { + m_pGraphicFilter->ImportGraphic( aGraphic, aURLObj, nFilter, nullptr, nFilterImportFlags ); + } + + BitmapEx aBmp = aGraphic.GetBitmapEx(); + sal_Int32 nBmpWidth = aBmp.GetSizePixel().Width(); + sal_Int32 nBmpHeight = aBmp.GetSizePixel().Height(); + + double nXRatio = double(200) / nBmpWidth; + double nYRatio = double(150) / nBmpHeight; + if ( nXRatio < nYRatio ) + aBmp.Scale( nXRatio, nXRatio ); + else + aBmp.Scale( nYRatio, nYRatio ); + + aBmp.Convert( BmpConversion::N24Bit ); + m_aImg.SetGraphic(Graphic(aBmp)); + } + else + { + m_aImg.SetGraphic(Graphic()); + } + EnableDisableButtons(); +} + +IMPL_LINK_NOARG(SdPhotoAlbumDialog, TypeSelectHdl, weld::ComboBox&, void) +{ + // Enable "Fill Slide" only for one image + // If we want to have it for other images too, we need to implement the actual cropping. + bool const bEnable = m_xInsTypeCombo->get_active() == ONE_IMAGE; + m_xASRCheckCrop->set_sensitive(bEnable); + if (!bEnable) + m_xASRCheckCrop->set_active(false); +} + +Reference< drawing::XDrawPage > SdPhotoAlbumDialog::appendNewSlide(AutoLayout aLayout, + const Reference< drawing::XDrawPages >& xDrawPages +) +{ + // Create the slide + Reference< drawing::XDrawPage > xSlide = xDrawPages->insertNewByIndex( xDrawPages->getCount() ); + SdPage* pSlide = m_pDoc->GetSdPage( m_pDoc->GetSdPageCount(PageKind::Standard)-1, PageKind::Standard); + pSlide->SetAutoLayout(aLayout, true); // Set the layout here + return xSlide; +} + +awt::Size SdPhotoAlbumDialog::createASRSize(const awt::Size& aPicSize, const awt::Size& aMaxSize) +{ + double resizeWidth = aPicSize.Width; + double resizeHeight = aPicSize.Height; + double aspect = resizeWidth/resizeHeight; + + if( resizeWidth > aMaxSize.Width ) + { + resizeWidth = aMaxSize.Width; + resizeHeight = resizeWidth / aspect; + } + + if( resizeHeight > aMaxSize.Height ) + { + aspect = resizeWidth/resizeHeight; + resizeHeight = aMaxSize.Height; + resizeWidth = resizeHeight * aspect; + } + return awt::Size(resizeWidth, resizeHeight); +} + +awt::Size SdPhotoAlbumDialog::createASRSizeCrop(const awt::Size& aPicSize, const awt::Size& aMaxSize) +{ + double resizeWidth = aPicSize.Width; + double resizeHeight = aPicSize.Height; + double imgAspect = resizeWidth / resizeHeight; + double windowAspectRatio = static_cast(aMaxSize.Width) / aMaxSize.Height ; + + + //When both sides of an image are bigger than canvas size, image would be downscaled. + if( resizeWidth > aMaxSize.Width && resizeHeight > aMaxSize.Height ) + { + if( imgAspect > windowAspectRatio ) + { + resizeHeight = aMaxSize.Height; + resizeWidth = aMaxSize.Height * imgAspect; + } + else + { + resizeHeight = aMaxSize.Width / imgAspect; + resizeWidth = aMaxSize.Width; + } + + } + //In all other cases image is upscaled + else + { + if( imgAspect > windowAspectRatio ) + { + resizeHeight = aMaxSize.Height; + resizeWidth = aMaxSize.Height * imgAspect; + } + else + { + resizeWidth = aMaxSize.Width; + resizeHeight = aMaxSize.Width / imgAspect; + } + } + return awt::Size(resizeWidth, resizeHeight); +} + +void SdPhotoAlbumDialog::createCaption(const awt::Size& aPageSize ) +{ + Point CapPos; + Size CapSize; + + CapSize.setWidth( aPageSize.Width ); + CapSize.setHeight( aPageSize.Height/6 ); + CapPos.setX( 0 ); + CapPos.setY( aPageSize.Height - CapSize.Height() ); + SdPage* pSlide = m_pDoc->GetSdPage( m_pDoc->GetSdPageCount(PageKind::Standard)-1, PageKind::Standard ); + + // try to get existing PresObj + const ::tools::Rectangle rRect(CapPos,CapSize); + SdrObject* pSdrObj = pSlide->GetPresObj(PresObjKind::Title); + + if(!pSdrObj) + { + // if not exists, create. Beware: It is already inserted to the SdPage + pSdrObj = pSlide->CreatePresObj(PresObjKind::Title,false,rRect); + } + else + { + // if exists, bring to front and position it + const size_t nObjNum(pSlide->GetObjCount()); + + if(nObjNum) + { + pSlide->SetObjectOrdNum(pSdrObj->GetOrdNum(), nObjNum - 1); + } + + pSdrObj->SetSnapRect(rRect); + } + + if(pSdrObj) + { + // set color, style and some transparency + SfxItemSet aSet(m_pDoc->GetItemPool() ); + + aSet.Put( XFillStyleItem(drawing::FillStyle_SOLID) ); + aSet.Put( XFillColorItem( "", COL_BLACK ) ); + aSet.Put( XFillTransparenceItem( 20 ) ); + pSdrObj->SetMergedItemSetAndBroadcast(aSet); + } +} + +Reference< graphic::XGraphic> SdPhotoAlbumDialog::createXGraphicFromUrl(const OUString& sUrl, + const Reference< graphic::XGraphicProvider>& xProvider +) +{ + // The same as above, except this returns an XGraphic from the image URL + ::comphelper::NamedValueCollection aMediaProperties; + aMediaProperties.put( "URL", sUrl ); + Reference< graphic::XGraphic> xGraphic = + xProvider->queryGraphic( aMediaProperties.getPropertyValues() ); + return xGraphic; +} + +void SdPhotoAlbumDialog::EnableDisableButtons() +{ + m_xRemoveBtn->set_sensitive(m_xImagesLst->count_selected_rows() > 0); + m_xUpBtn->set_sensitive(m_xImagesLst->count_selected_rows() > 0 && + m_xImagesLst->get_selected_index() != 0); + m_xDownBtn->set_sensitive(m_xImagesLst->count_selected_rows() > 0 && + m_xImagesLst->get_selected_index() < m_xImagesLst->n_children() - 1); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.hxx b/sd/source/ui/dlg/PhotoAlbumDialog.hxx new file mode 100644 index 0000000000..f84ff5cc37 --- /dev/null +++ b/sd/source/ui/dlg/PhotoAlbumDialog.hxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* +* This file is part of the LibreOffice project. +* +* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#pragma once + +#include + +#include +#include +#include + +#include + +namespace com::sun::star::drawing { class XDrawPage; } +namespace com::sun::star::drawing { class XDrawPages; } +namespace com::sun::star::graphic { class XGraphicProvider; } + +class SdDrawDocument; +class GraphicFilter; + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd +{ + +class SdPhotoAlbumDialog : public weld::GenericDialogController +{ +public: + SdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pActDoc); + virtual ~SdPhotoAlbumDialog() override; + +private: + SdDrawDocument* m_pDoc; + GraphicFilter* m_pGraphicFilter; + + GraphCtrl m_aImg; + + std::unique_ptr m_xCancelBtn; + std::unique_ptr m_xCreateBtn; + std::unique_ptr m_xAddBtn; + std::unique_ptr m_xUpBtn; + std::unique_ptr m_xDownBtn; + std::unique_ptr m_xRemoveBtn; + std::unique_ptr m_xImagesLst; + std::unique_ptr m_xImg; + std::unique_ptr m_xInsTypeCombo; + std::unique_ptr m_xASRCheck; + std::unique_ptr m_xASRCheckCrop; + std::unique_ptr m_xCapCheck; + std::unique_ptr m_xInsertAsLinkCheck; + + DECL_LINK(CancelHdl, weld::Button&, void); + DECL_LINK(CreateHdl, weld::Button&, void); + + DECL_LINK(FileHdl, weld::Button&, void); + DECL_LINK(UpHdl, weld::Button&, void); + DECL_LINK(DownHdl, weld::Button&, void); + DECL_LINK(RemoveHdl, weld::Button&, void); + + DECL_LINK(SelectHdl, weld::TreeView&, void); + DECL_LINK(TypeSelectHdl, weld::ComboBox&, void); + + Reference< drawing::XDrawPage > appendNewSlide(AutoLayout aLayout, + const Reference< drawing::XDrawPages >& xDrawPages); + + static awt::Size createASRSize(const awt::Size& aPicSize, const awt::Size& aMaxSize); + static awt::Size createASRSizeCrop(const awt::Size& aPicSize, const awt::Size& aMaxSize); + void createCaption(const awt::Size& aPageSize); + static Reference< graphic::XGraphic> createXGraphicFromUrl(const OUString& sUrl, + const Reference< graphic::XGraphicProvider>& xProvider); + + void EnableDisableButtons(); + + enum SlideImageLayout + { + ONE_IMAGE=0, + TWO_IMAGES, + FOUR_IMAGES + }; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/RemoteDialog.cxx b/sd/source/ui/dlg/RemoteDialog.cxx new file mode 100644 index 0000000000..6a66c2acfd --- /dev/null +++ b/sd/source/ui/dlg/RemoteDialog.cxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "RemoteDialog.hxx" +#include + +using namespace ::sd; + +RemoteDialog::RemoteDialog(weld::Window* pWindow) + : GenericDialogController(pWindow, "modules/simpress/ui/remotedialog.ui", "RemoteDialog") + , m_xButtonConnect(m_xBuilder->weld_button("ok")) + , m_xClientBox(new sd::ClientBox(m_xBuilder->weld_scrolled_window("scroll"), + m_xBuilder->weld_container("tree"))) +{ + m_xButtonConnect->connect_clicked(LINK(this, RemoteDialog, HandleConnectButton)); +} + +RemoteDialog::~RemoteDialog() {} + +IMPL_LINK_NOARG(RemoteDialog, HandleConnectButton, weld::Button&, void) +{ + weld::WaitObject(m_xDialog.get()); +#if defined(ENABLE_SDREMOTE) + auto xEntry = m_xClientBox->GetActiveEntry(); + if (!xEntry) + return; + OUString aPin = xEntry->m_xPinBox->get_text(); + if (IPRemoteServer::connectClient(xEntry->m_xClientInfo, aPin)) + m_xDialog->response(RET_OK); +#endif +} + +short RemoteDialog::run() +{ + short nRet = weld::GenericDialogController::run(); +#ifdef ENABLE_SDREMOTE + RemoteServer::restoreDiscoverable(); +#endif + return nRet; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/RemoteDialog.hxx b/sd/source/ui/dlg/RemoteDialog.hxx new file mode 100644 index 0000000000..6c3f94ff86 --- /dev/null +++ b/sd/source/ui/dlg/RemoteDialog.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include + +#include "RemoteDialogClientBox.hxx" + +namespace sd +{ +class RemoteDialog : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xButtonConnect; + std::unique_ptr m_xClientBox; + + DECL_LINK(HandleConnectButton, weld::Button&, void); + +public: + explicit RemoteDialog(weld::Window* pWindow); + virtual short run() override; + virtual ~RemoteDialog() override; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.cxx b/sd/source/ui/dlg/RemoteDialogClientBox.cxx new file mode 100644 index 0000000000..44e2c6f650 --- /dev/null +++ b/sd/source/ui/dlg/RemoteDialogClientBox.cxx @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include "RemoteDialogClientBox.hxx" +#include + +#include + +namespace sd { + +// struct ClientBoxEntry + +ClientBoxEntry::ClientBoxEntry(ClientBox* pClientBox, + std::shared_ptr pClientInfo) + : m_xBuilder(Application::CreateBuilder(pClientBox->GetContainer(), "modules/simpress/ui/clientboxfragment.ui")) + , m_xContainer(m_xBuilder->weld_container("ClientboxFragment")) + , m_xDeviceName(m_xBuilder->weld_label("name")) + , m_xPinLabel(m_xBuilder->weld_label("pinlabel")) + , m_xPinBox(m_xBuilder->weld_entry("pin")) + , m_xDeauthoriseButton(m_xBuilder->weld_button("button")) + , m_xClientInfo(std::move(pClientInfo)) + , m_pClientBox(pClientBox) +{ + m_xDeviceName->set_label(m_xClientInfo->mName); + m_xDeauthoriseButton->connect_clicked(LINK(this, ClientBoxEntry, DeauthoriseHdl)); + m_xDeauthoriseButton->set_visible(m_xClientInfo->mbIsAlreadyAuthorised); + m_xPinBox->set_visible(!m_xClientInfo->mbIsAlreadyAuthorised); + m_xPinLabel->set_visible(!m_xClientInfo->mbIsAlreadyAuthorised); + + m_xDeauthoriseButton->connect_focus_in(LINK(this, ClientBoxEntry, FocusHdl)); + m_xPinBox->connect_focus_in(LINK(this, ClientBoxEntry, FocusHdl)); +} + +ClientBoxEntry::~ClientBoxEntry() +{ + m_pClientBox->GetContainer()->move(m_xContainer.get(), nullptr); +} + +// ClientBox +ClientBox::ClientBox(std::unique_ptr xScroll, + std::unique_ptr xContents) + : m_xScroll(std::move(xScroll)) + , m_xContents(std::move(xContents)) + , m_pActive(nullptr) +{ + Size aSize(m_xScroll->get_approximate_digit_width() * 40, + m_xScroll->get_text_height() * 16); + m_xScroll->set_size_request(aSize.Width(), aSize.Height()); + + m_xContents->set_stack_background(); + + populateEntries(); +} + +ClientBox::~ClientBox() +{ +} + +ClientBoxEntry* ClientBox::GetActiveEntry() +{ + return m_pActive; +} + +void ClientBox::addEntry( const std::shared_ptr& pClientInfo ) +{ + TClientBoxEntry xEntry = std::make_shared(this, pClientInfo); + m_vEntries.push_back(xEntry); +} + +void ClientBox::setActive(ClientBoxEntry* pClientEntry) +{ + m_pActive = pClientEntry; +} + +void ClientBox::clearEntries() +{ + m_vEntries.clear(); + m_pActive = nullptr; +} + +void ClientBox::populateEntries() +{ + clearEntries(); + +#ifdef ENABLE_SDREMOTE + RemoteServer::ensureDiscoverable(); + + std::vector> const aClients(IPRemoteServer::getClients()); + + for ( const auto& rxClient : aClients ) + { + addEntry( rxClient ); + } +#endif + +} + +IMPL_LINK_NOARG(ClientBoxEntry, DeauthoriseHdl, weld::Button&, void) +{ +#ifdef ENABLE_SDREMOTE + IPRemoteServer::deauthoriseClient(m_xClientInfo); +#endif + m_pClientBox->populateEntries(); +} + +IMPL_LINK_NOARG(ClientBoxEntry, FocusHdl, weld::Widget&, void) +{ + if (ClientBoxEntry* pOldEntry = m_pClientBox->GetActiveEntry()) + pOldEntry->m_xContainer->set_stack_background(); + m_pClientBox->setActive(this); + m_xContainer->set_highlight_background(); +} + +} //namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.hxx b/sd/source/ui/dlg/RemoteDialogClientBox.hxx new file mode 100644 index 0000000000..e11d5af950 --- /dev/null +++ b/sd/source/ui/dlg/RemoteDialogClientBox.hxx @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +namespace sd { + +#define SMALL_ICON_SIZE 16 +#define TOP_OFFSET 5 +#define ICON_HEIGHT 42 +#define ICON_WIDTH 47 +#define ICON_OFFSET 72 +#define RIGHT_ICON_OFFSET 5 +#define SPACE_BETWEEN 3 + +class ClientBox; +struct ClientBoxEntry; +struct ClientInfo; + +typedef std::shared_ptr TClientBoxEntry; + +struct ClientBoxEntry +{ + std::unique_ptr m_xBuilder; + std::unique_ptr m_xContainer; + std::unique_ptr m_xDeviceName; + std::unique_ptr m_xPinLabel; + std::unique_ptr m_xPinBox; + std::unique_ptr m_xDeauthoriseButton; + + std::shared_ptr m_xClientInfo; + ClientBox* m_pClientBox; + + DECL_LINK(DeauthoriseHdl, weld::Button&, void); + DECL_LINK(FocusHdl, weld::Widget&, void); + + ClientBoxEntry(ClientBox* pClientBox, std::shared_ptr pClientInfo); + ~ClientBoxEntry(); +}; + +class ClientBox +{ + std::unique_ptr m_xScroll; + std::unique_ptr m_xContents; + + std::vector< TClientBoxEntry > m_vEntries; + ClientBoxEntry* m_pActive; + +public: + ClientBox(std::unique_ptr xScroll, std::unique_ptr xContents); + weld::Container* GetContainer() { return m_xContents.get(); } + ~ClientBox(); + + ClientBoxEntry* GetActiveEntry(); + + void addEntry(const std::shared_ptr& pClientInfo); + void setActive(ClientBoxEntry* pClientData); + void clearEntries(); + + void populateEntries(); +}; + +} // end namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/SpellDialogChildWindow.cxx b/sd/source/ui/dlg/SpellDialogChildWindow.cxx new file mode 100644 index 0000000000..c879193463 --- /dev/null +++ b/sd/source/ui/dlg/SpellDialogChildWindow.cxx @@ -0,0 +1,172 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace sd { + +SFX_IMPL_CHILDWINDOW_WITHID(SpellDialogChildWindow, SID_SPELL_DIALOG) + +SpellDialogChildWindow::SpellDialogChildWindow ( + vcl::Window* _pParent, + sal_uInt16 nId, + SfxBindings* pBindings, + SAL_UNUSED_PARAMETER SfxChildWinInfo* /*pInfo*/) + : svx::SpellDialogChildWindow (_pParent, nId, pBindings), + mpSdOutliner (nullptr), + mbOwnOutliner (false) +{ + ProvideOutliner(); +} + +SpellDialogChildWindow::~SpellDialogChildWindow() +{ + EndSpellingAndClearOutliner(); +} + +SfxChildWinInfo SpellDialogChildWindow::GetInfo() const +{ + return svx::SpellDialogChildWindow::GetInfo(); +} + +void SpellDialogChildWindow::InvalidateSpellDialog() +{ + svx::SpellDialogChildWindow::InvalidateSpellDialog(); +} + +svx::SpellPortions SpellDialogChildWindow::GetNextWrongSentence( bool /*bRecheck*/ ) +{ + svx::SpellPortions aResult; + + if (mpSdOutliner != nullptr) + { + ProvideOutliner(); + aResult = mpSdOutliner->GetNextSpellSentence(); + } + return aResult; +} + +void SpellDialogChildWindow::ApplyChangedSentence ( + const svx::SpellPortions& rChanged, bool bRecheck ) +{ + if (mpSdOutliner != nullptr) + { + OutlinerView* pOutlinerView = mpSdOutliner->GetView(0); + if (pOutlinerView != nullptr) + mpSdOutliner->ApplyChangedSentence ( + pOutlinerView->GetEditView(), + rChanged, bRecheck); + } +} + +void SpellDialogChildWindow::GetFocus() +{ + // In order to detect a cursor movement we could compare the + // currently selected text shape with the one that was selected + // when LoseFocus() was called the last time. + // For the time being we instead rely on the DetectChange() method + // in the SdOutliner class. +} + +void SpellDialogChildWindow::LoseFocus() +{ +} + +void SpellDialogChildWindow::EndSpellingAndClearOutliner() +{ + if (!mpSdOutliner) + return; + EndListening(*mpSdOutliner->GetDoc()); + mpSdOutliner->EndSpelling(); + if (mbOwnOutliner) + delete mpSdOutliner; + mpSdOutliner = nullptr; + mbOwnOutliner = false; +} + +void SpellDialogChildWindow::Notify(SfxBroadcaster&, const SfxHint& rHint) +{ + if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint) + return; + const SdrHint* pSdrHint = static_cast(&rHint); + if (SdrHintKind::ModelCleared == pSdrHint->GetKind()) + { + EndSpellingAndClearOutliner(); + } +} + +void SpellDialogChildWindow::ProvideOutliner() +{ + ViewShellBase* pViewShellBase = dynamic_cast( SfxViewShell::Current() ); + + if (pViewShellBase == nullptr) + return; + + ViewShell* pViewShell = pViewShellBase->GetMainViewShell().get(); + // If there already exists an outliner that has been created + // for another view shell then destroy it first. + if (mpSdOutliner != nullptr) + if(( dynamic_cast< const DrawViewShell *>( pViewShell ) != nullptr && ! mbOwnOutliner) + || (dynamic_cast< const OutlineViewShell *>( pViewShell ) != nullptr && mbOwnOutliner)) + { + EndSpellingAndClearOutliner(); + } + + // Now create/get an outliner if none is present. + if (mpSdOutliner != nullptr) + return; + + if( dynamic_cast< const DrawViewShell *>( pViewShell ) != nullptr) + { + // We need an outliner for the spell check so we have + // to create one. + mbOwnOutliner = true; + SdDrawDocument *pDoc = pViewShell->GetDoc(); + mpSdOutliner = new SdOutliner(pDoc, OutlinerMode::TextObject); + StartListening(*pDoc); + } + else if( dynamic_cast< const OutlineViewShell *>( pViewShell ) != nullptr) + { + // An outline view is already visible. The SdOutliner + // will use it instead of creating its own. + mbOwnOutliner = false; + SdDrawDocument *pDoc = pViewShell->GetDoc(); + mpSdOutliner = pDoc->GetOutliner(); + StartListening(*pDoc); + } + + // Initialize spelling. + if (mpSdOutliner != nullptr) + { + mpSdOutliner->PrepareSpelling(); + mpSdOutliner->StartSpelling(); + } +} + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/TemplateScanner.cxx b/sd/source/ui/dlg/TemplateScanner.cxx new file mode 100644 index 0000000000..e1291eaa96 --- /dev/null +++ b/sd/source/ui/dlg/TemplateScanner.cxx @@ -0,0 +1,343 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace { + +constexpr OUString TITLE = u"Title"_ustr; + +class FolderDescriptor +{ +public: + FolderDescriptor ( + int nPriority, + OUString sContentIdentifier, + const Reference& rxFolderEnvironment) + : mnPriority(nPriority), + msContentIdentifier(std::move(sContentIdentifier)), + mxFolderEnvironment(rxFolderEnvironment) + { } + int mnPriority; + OUString msContentIdentifier; + // Reference mxFolderResultSet; + Reference mxFolderEnvironment; + + class Comparator + { + public: + bool operator() (const FolderDescriptor& r1, const FolderDescriptor& r2) const + { return r1.mnPriority < r2.mnPriority; } + }; +}; + +/** Use a heuristic based on the URL of a top-level template folder to + assign a priority that is used to sort the folders. +*/ +int Classify (std::u16string_view rsURL) +{ + int nPriority (0); + + if (rsURL.empty()) + nPriority = 100; + else if (rsURL.find(u"presnt") != std::u16string_view::npos) + { + nPriority = 30; + } + else if (rsURL.find(u"layout") != std::u16string_view::npos) + { + nPriority = 20; + } + else if (rsURL.find(u"educate") != std::u16string_view::npos) + { + nPriority = 40; + } + else if (rsURL.find(u"finance") != std::u16string_view::npos) + { + nPriority = 40; + } + else + { + // All other folders are taken for user supplied and have the + // highest priority. + nPriority = 10; + } + + return nPriority; +} + +} // end of anonymous namespace + +namespace sd +{ + +class TemplateScanner::FolderDescriptorList + : public ::std::multiset +{ +}; + +TemplateScanner::TemplateScanner() + : meState(INITIALIZE_SCANNING), + mpFolderDescriptors(new FolderDescriptorList) +{ + // empty; +} + +TemplateScanner::~TemplateScanner() +{ +} + +TemplateScanner::State TemplateScanner::GetTemplateRoot() +{ + Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext(); + Reference xTemplates = frame::DocumentTemplates::create(xContext); + mxTemplateRoot = xTemplates->getContent(); + + return INITIALIZE_FOLDER_SCANNING; +} + +TemplateScanner::State TemplateScanner::InitializeEntryScanning() +{ + State eNextState (SCAN_ENTRY); + + if (maFolderContent.isFolder()) + { + mxEntryEnvironment.clear(); + + // Create a cursor to iterate over the templates in this folders. + // We are interested only in three properties: the entry's name, + // its URL, and its content type. + mxEntryResultSet.set( maFolderContent.createCursor({ TITLE, "TargetURL", "TypeDescription" }, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY)); + } + else + eNextState = ERROR; + + return eNextState; +} + +TemplateScanner::State TemplateScanner::ScanEntry() +{ + State eNextState (ERROR); + + Reference xContentAccess (mxEntryResultSet, UNO_QUERY); + Reference xRow (mxEntryResultSet, UNO_QUERY); + + if (xContentAccess.is() && xRow.is() && mxEntryResultSet.is()) + { + if (mxEntryResultSet->next()) + { + OUString sTitle (xRow->getString (1)); + OUString sTargetURL (xRow->getString (2)); + OUString sContentType (xRow->getString (3)); + + OUString aId = xContentAccess->queryContentIdentifierString(); + ::ucbhelper::Content aContent(aId, mxEntryEnvironment, comphelper::getProcessComponentContext()); + if (aContent.isDocument ()) + { + // Check whether the entry is an impress template. If so + // add a new entry to the resulting list (which is created + // first if necessary). + // These strings are used to find impress templates in the tree of + // template files. Should probably be determined dynamically. + if ( (sContentType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE_ASCII) + || (sContentType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_ASCII) + || (sContentType == "application/vnd.stardivision.impress") + || (sContentType == MIMETYPE_VND_SUN_XML_IMPRESS_ASCII) + // The following id comes from the bugdoc in #i2764#. + || (sContentType == "Impress 2.0")) + { + OUString sLocalisedTitle = SfxDocumentTemplates::ConvertResourceString(sTitle); + mpTemplateEntries.push_back(std::make_unique(sLocalisedTitle, sTargetURL)); + } + } + + // Continue scanning entries. + eNextState = SCAN_ENTRY; + } + else + { + // Continue with scanning the next folder. + eNextState = SCAN_FOLDER; + } + } + + return eNextState; +} + +TemplateScanner::State TemplateScanner::InitializeFolderScanning() +{ + State eNextState (ERROR); + + mxFolderResultSet.clear(); + + try + { + // Create content for template folders. + mxFolderEnvironment.clear(); + ::ucbhelper::Content aTemplateDir (mxTemplateRoot, mxFolderEnvironment, comphelper::getProcessComponentContext()); + + // Create a cursor to iterate over the template folders. + mxFolderResultSet.set( aTemplateDir.createCursor({ TITLE, "TargetDirURL" }, ::ucbhelper::INCLUDE_FOLDERS_ONLY)); + if (mxFolderResultSet.is()) + eNextState = GATHER_FOLDER_LIST; + } + catch (css::uno::Exception&) + { + eNextState = ERROR; + } + + return eNextState; +} + +TemplateScanner::State TemplateScanner::GatherFolderList() +{ + State eNextState (ERROR); + + Reference xContentAccess (mxFolderResultSet, UNO_QUERY); + if (xContentAccess.is() && mxFolderResultSet.is()) + { + while (mxFolderResultSet->next()) + { + Reference xRow (mxFolderResultSet, UNO_QUERY); + if (xRow.is()) + { + OUString sTargetDir (xRow->getString (2)); + OUString aId = xContentAccess->queryContentIdentifierString(); + + mpFolderDescriptors->insert( + FolderDescriptor( + Classify(sTargetDir), + aId, + mxFolderEnvironment)); + } + } + + eNextState = SCAN_FOLDER; + } + + return eNextState; +} + +TemplateScanner::State TemplateScanner::ScanFolder() +{ + State eNextState (ERROR); + + if (!mpFolderDescriptors->empty()) + { + FolderDescriptor aDescriptor (*mpFolderDescriptors->begin()); + mpFolderDescriptors->erase(mpFolderDescriptors->begin()); + + OUString aId (aDescriptor.msContentIdentifier); + + maFolderContent = ::ucbhelper::Content (aId, aDescriptor.mxFolderEnvironment, comphelper::getProcessComponentContext()); + if (maFolderContent.isFolder()) + { + // Scan the folder and insert it into the list of template + // folders. + // Continue with scanning all entries in the folder. + mpTemplateEntries.clear(); + eNextState = INITIALIZE_ENTRY_SCAN; + } + } + else + { + eNextState = DONE; + } + + return eNextState; +} + +void TemplateScanner::RunNextStep() +{ + switch (meState) + { + case INITIALIZE_SCANNING: + meState = GetTemplateRoot(); + break; + + case INITIALIZE_FOLDER_SCANNING: + meState = InitializeFolderScanning(); + break; + + case SCAN_FOLDER: + meState = ScanFolder(); + break; + + case GATHER_FOLDER_LIST: + meState = GatherFolderList(); + break; + + case INITIALIZE_ENTRY_SCAN: + meState = InitializeEntryScanning(); + break; + + case SCAN_ENTRY: + meState = ScanEntry(); + break; + default: + break; + } + + switch (meState) + { + case DONE: + case ERROR: + mxTemplateRoot.clear(); + mxFolderEnvironment.clear(); + mxEntryEnvironment.clear(); + mxFolderResultSet.clear(); + mxEntryResultSet.clear(); + break; + default: + break; + } +} + +bool TemplateScanner::HasNextStep() +{ + switch (meState) + { + case DONE: + case ERROR: + return false; + + default: + return true; + } +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/UndoThemeChange.cxx b/sd/source/ui/dlg/UndoThemeChange.cxx new file mode 100644 index 0000000000..1270dc06ca --- /dev/null +++ b/sd/source/ui/dlg/UndoThemeChange.cxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +namespace sd +{ +UndoThemeChange::UndoThemeChange(SdDrawDocument* pDocument, SdrPage* pMasterPage, + std::shared_ptr const& pOldColorSet, + std::shared_ptr const& pNewColorSet) + : SdUndoAction(pDocument) + , mpMasterPage(pMasterPage) + , mpOldColorSet(pOldColorSet) + , mpNewColorSet(pNewColorSet) +{ + SetComment(SvxResId(RID_SVXSTR_UNDO_THEME_COLOR_CHANGE)); +} + +namespace +{ +std::shared_ptr getTheme(SdrPage* pMasterPage) +{ + auto pTheme = pMasterPage->getSdrPageProperties().getTheme(); + if (!pTheme) + { + pTheme = std::make_shared("Office"); + pMasterPage->getSdrPageProperties().setTheme(pTheme); + } + return pTheme; +} +} + +void UndoThemeChange::Undo() +{ + auto pTheme = getTheme(mpMasterPage); + pTheme->setColorSet(mpOldColorSet); +} + +void UndoThemeChange::Redo() +{ + auto pTheme = getTheme(mpMasterPage); + pTheme->setColorSet(mpNewColorSet); +} + +} // end sd namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/animobjs.cxx b/sd/source/ui/dlg/animobjs.cxx new file mode 100644 index 0000000000..1ab24e241c --- /dev/null +++ b/sd/source/ui/dlg/animobjs.cxx @@ -0,0 +1,1125 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include + +using namespace ::com::sun::star; + +namespace sd { + +/** + * SdDisplay - Control + */ +SdDisplay::SdDisplay() + : aScale(1, 1) +{ +} + +SdDisplay::~SdDisplay() +{ +} + +void SdDisplay::SetBitmapEx( BitmapEx const * pBmpEx ) +{ + if( pBmpEx ) + { + aBitmapEx = *pBmpEx; + } + else + { + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + const Color aFillColor = rStyles.GetFieldColor(); + aBitmapEx.Erase(aFillColor); + } +} + +void SdDisplay::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&) +{ + rRenderContext.Push(vcl::PushFlags::MAPMODE); + + rRenderContext.SetMapMode(MapMode(MapUnit::MapPixel)); + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + rRenderContext.SetBackground( Wallpaper( rStyles.GetFieldColor() ) ); + rRenderContext.Erase(); + + Point aPt; + Size aSize = GetOutputSizePixel(); + + Size aBmpSize = aBitmapEx.GetBitmap().GetSizePixel(); + aBmpSize.setWidth( static_cast<::tools::Long>( static_cast(aBmpSize.Width()) * static_cast(aScale) ) ); + aBmpSize.setHeight( static_cast<::tools::Long>( static_cast(aBmpSize.Height()) * static_cast(aScale) ) ); + + if( aBmpSize.Width() < aSize.Width() ) + aPt.setX( ( aSize.Width() - aBmpSize.Width() ) / 2 ); + if( aBmpSize.Height() < aSize.Height() ) + aPt.setY( ( aSize.Height() - aBmpSize.Height() ) / 2 ); + + aBitmapEx.Draw(&rRenderContext, aPt, aBmpSize); + + rRenderContext.Pop(); +} + +void SdDisplay::SetScale( const Fraction& rFrac ) +{ + aScale = rFrac; +} + +void SdDisplay::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + CustomWidgetController::SetDrawingArea(pDrawingArea); + Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(147, 87), MapMode(MapUnit::MapAppFont))); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + SetOutputSizePixel(aSize); +} + +const size_t AnimationWindow::EMPTY_FRAMELIST = std::numeric_limits::max(); + +/** + * AnimationWindow - FloatingWindow + */ +AnimationWindow::AnimationWindow(SfxBindings* pInBindings, SfxChildWindow *pCW, vcl::Window* pParent) + : SfxDockingWindow(pInBindings, pCW, pParent, + "DockingAnimation", "modules/simpress/ui/dockinganimation.ui") + , m_xCtlDisplay(new SdDisplay) + , m_xCtlDisplayWin(new weld::CustomWeld(*m_xBuilder, "preview", *m_xCtlDisplay)) + , m_xBtnFirst(m_xBuilder->weld_button("first")) + , m_xBtnReverse(m_xBuilder->weld_button("prev")) + , m_xBtnStop(m_xBuilder->weld_button("stop")) + , m_xBtnPlay(m_xBuilder->weld_button("next")) + , m_xBtnLast(m_xBuilder->weld_button("last")) + , m_xNumFldBitmap(m_xBuilder->weld_spin_button("numbitmap")) + , m_xTimeField(m_xBuilder->weld_formatted_spin_button("duration")) + , m_xFormatter(new weld::TimeFormatter(*m_xTimeField)) + , m_xLbLoopCount(m_xBuilder->weld_combo_box("loopcount")) + , m_xBtnGetOneObject(m_xBuilder->weld_button("getone")) + , m_xBtnGetAllObjects(m_xBuilder->weld_button("getall")) + , m_xBtnRemoveBitmap(m_xBuilder->weld_button("delone")) + , m_xBtnRemoveAll(m_xBuilder->weld_button("delall")) + , m_xFiCount(m_xBuilder->weld_label("count")) + , m_xRbtGroup(m_xBuilder->weld_radio_button("group")) + , m_xRbtBitmap(m_xBuilder->weld_radio_button("bitmap")) + , m_xFtAdjustment(m_xBuilder->weld_label("alignmentft")) + , m_xLbAdjustment(m_xBuilder->weld_combo_box("alignment")) + , m_xBtnCreateGroup(m_xBuilder->weld_button("create")) + , m_xBtnHelp(m_xBuilder->weld_button("help")) + , m_nCurrentFrame(EMPTY_FRAMELIST) + , bMovie(false) + , bAllObjects(false) +{ + SetText(SdResId(STR_ANIMATION_DIALOG_TITLE)); + + m_xFormatter->SetDuration(true); + m_xFormatter->SetTimeFormat(TimeFieldFormat::F_SEC_CS); + m_xFormatter->EnableEmptyField(false); + + // create new document with page + pMyDoc.reset( new SdDrawDocument(DocumentType::Impress, nullptr) ); + rtl::Reference pPage = pMyDoc->AllocSdPage(false); + pMyDoc->InsertPage(pPage.get()); + + pControllerItem.reset( new AnimationControllerItem( SID_ANIMATOR_STATE, this, pInBindings ) ); + + m_xBtnFirst->connect_clicked( LINK( this, AnimationWindow, ClickFirstHdl ) ); + m_xBtnReverse->connect_clicked( LINK( this, AnimationWindow, ClickPlayHdl ) ); + m_xBtnStop->connect_clicked( LINK( this, AnimationWindow, ClickStopHdl ) ); + m_xBtnPlay->connect_clicked( LINK( this, AnimationWindow, ClickPlayHdl ) ); + m_xBtnLast->connect_clicked( LINK( this, AnimationWindow, ClickLastHdl ) ); + + m_xBtnGetOneObject->connect_clicked( LINK( this, AnimationWindow, ClickGetObjectHdl ) ); + m_xBtnGetAllObjects->connect_clicked( LINK( this, AnimationWindow, ClickGetObjectHdl ) ); + m_xBtnRemoveBitmap->connect_clicked( LINK( this, AnimationWindow, ClickRemoveBitmapHdl ) ); + m_xBtnRemoveAll->connect_clicked( LINK( this, AnimationWindow, ClickRemoveBitmapHdl ) ); + + m_xRbtGroup->connect_toggled( LINK( this, AnimationWindow, ClickRbtHdl ) ); + m_xRbtBitmap->connect_toggled( LINK( this, AnimationWindow, ClickRbtHdl ) ); + m_xBtnCreateGroup->connect_clicked( LINK( this, AnimationWindow, ClickCreateGroupHdl ) ); + m_xBtnHelp->connect_clicked( LINK( this, AnimationWindow, ClickHelpHdl ) ); + m_xNumFldBitmap->connect_value_changed( LINK( this, AnimationWindow, ModifyBitmapHdl ) ); + m_xTimeField->connect_value_changed( LINK( this, AnimationWindow, ModifyTimeHdl ) ); + + SetMinOutputSizePixel(GetOptimalSize()); + + ResetAttrs(); + + // the animator is empty; no animation group can be created + m_xBtnCreateGroup->set_sensitive(false); +} + +AnimationWindow::~AnimationWindow() +{ + disposeOnce(); +} + +void AnimationWindow::dispose() +{ + pControllerItem.reset(); + + m_FrameList.clear(); + m_nCurrentFrame = EMPTY_FRAMELIST; + + // delete the clones + pMyDoc.reset(); + + m_xCtlDisplayWin.reset(); + m_xCtlDisplay.reset(); + m_xBtnFirst.reset(); + m_xBtnReverse.reset(); + m_xBtnStop.reset(); + m_xBtnPlay.reset(); + m_xBtnLast.reset(); + m_xNumFldBitmap.reset(); + m_xFormatter.reset(); + m_xTimeField.reset(); + m_xLbLoopCount.reset(); + m_xBtnGetOneObject.reset(); + m_xBtnGetAllObjects.reset(); + m_xBtnRemoveBitmap.reset(); + m_xBtnRemoveAll.reset(); + m_xFiCount.reset(); + m_xRbtGroup.reset(); + m_xRbtBitmap.reset(); + m_xFtAdjustment.reset(); + m_xLbAdjustment.reset(); + m_xBtnCreateGroup.reset(); + m_xBtnHelp.reset(); + SfxDockingWindow::dispose(); +} + +IMPL_LINK_NOARG(AnimationWindow, ClickFirstHdl, weld::Button&, void) +{ + m_nCurrentFrame = (m_FrameList.empty()) ? EMPTY_FRAMELIST : 0; + UpdateControl(); +} + +IMPL_LINK_NOARG(AnimationWindow, ClickStopHdl, weld::Button&, void) +{ + bMovie = false; +} + +IMPL_LINK( AnimationWindow, ClickPlayHdl, weld::Button&, rButton, void ) +{ + ScopeLockGuard aGuard( maPlayLock ); + + bMovie = true; + bool bDisableCtrls = false; + size_t const nCount = m_FrameList.size(); + bool bReverse = &rButton == m_xBtnReverse.get(); + + // it is difficult to find it later on + bool bRbtGroupEnabled = m_xRbtGroup->get_sensitive(); + bool bBtnGetAllObjectsEnabled = m_xBtnGetAllObjects->get_sensitive(); + bool bBtnGetOneObjectEnabled = m_xBtnGetOneObject->get_sensitive(); + + // calculate overall time + ::tools::Time aTime( 0 ); + ::tools::Long nFullTime; + if( m_xRbtBitmap->get_active() ) + { + for (size_t i = 0; i < nCount; ++i) + { + aTime += m_FrameList[i].second; + } + nFullTime = aTime.GetMSFromTime(); + } + else + { + nFullTime = nCount * 100; + aTime.MakeTimeFromMS( nFullTime ); + } + + // StatusBarManager from 1 second + std::unique_ptr pProgress; + if( nFullTime >= 1000 ) + { + bDisableCtrls = true; + m_xBtnStop->set_sensitive(true); + pProgress.reset(new SfxProgress( nullptr, "Animator:", nFullTime )); // "Animator:" here we should think about something smart + } + + sal_uLong nTmpTime = 0; + size_t i = 0; + bool bCount = i < nCount; + if( bReverse ) + { + i = nCount - 1; + } + while( bCount && bMovie ) + { + // make list and view consistent + assert(i < m_FrameList.size()); + m_nCurrentFrame = i; + + UpdateControl(bDisableCtrls); + + if( m_xRbtBitmap->get_active() ) + { + ::tools::Time const & rTime = m_FrameList[i].second; + + m_xFormatter->SetTime( rTime ); + sal_uLong nTime = rTime.GetMSFromTime(); + + WaitInEffect( nTime, nTmpTime, pProgress.get() ); + nTmpTime += nTime; + } + else + { + WaitInEffect( 100, nTmpTime, pProgress.get() ); + nTmpTime += 100; + } + if( bReverse ) + { + if (i == 0) + { + // Terminate loop. + bCount = false; + } + else + { + --i; + } + } + else + { + i++; + if (i >= nCount) + { + // Terminate loop. + bCount = false; + // Move i back into valid range. + i = nCount - 1; + } + } + } + + // to re-enable the controls + bMovie = false; + if (nCount > 0) + { + assert(i == m_nCurrentFrame); + UpdateControl(); + } + + if( pProgress ) + { + pProgress.reset(); + m_xBtnStop->set_sensitive(false); + } + + m_xRbtGroup->set_sensitive( bRbtGroupEnabled ); + m_xBtnGetAllObjects->set_sensitive( bBtnGetAllObjectsEnabled ); + m_xBtnGetOneObject->set_sensitive( bBtnGetOneObjectEnabled ); +} + +IMPL_LINK_NOARG(AnimationWindow, ClickLastHdl, weld::Button&, void) +{ + m_nCurrentFrame = + (m_FrameList.empty()) ? EMPTY_FRAMELIST : m_FrameList.size() - 1 ; + UpdateControl(); +} + +IMPL_LINK_NOARG(AnimationWindow, ClickRbtHdl, weld::Toggleable&, void) +{ + if (m_FrameList.empty() || m_xRbtGroup->get_active()) + { + m_xTimeField->set_text( OUString() ); + m_xTimeField->set_sensitive( false ); + m_xLbLoopCount->set_sensitive( false ); + } + else if (m_xRbtBitmap->get_active()) + { + sal_uLong n = m_xNumFldBitmap->get_value(); + if( n > 0 ) + { + ::tools::Time const & rTime = m_FrameList[n - 1].second; + m_xFormatter->SetTime( rTime ); + m_xFormatter->ReFormat(); + } + m_xTimeField->set_sensitive(true); + m_xLbLoopCount->set_sensitive(true); + } +} + +IMPL_LINK(AnimationWindow, ClickHelpHdl, weld::Button&, rButton, void) +{ + if (Help* pHelp = Application::GetHelp()) + pHelp->Start(m_xContainer->get_help_id(), &rButton); +} + +IMPL_LINK( AnimationWindow, ClickGetObjectHdl, weld::Button&, rBtn, void ) +{ + bAllObjects = &rBtn == m_xBtnGetAllObjects.get(); + + // Code now in AddObj() + SfxBoolItem aItem( SID_ANIMATOR_ADD, true ); + + GetBindings().GetDispatcher()->ExecuteList( + SID_ANIMATOR_ADD, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); +} + +IMPL_LINK( AnimationWindow, ClickRemoveBitmapHdl, weld::Button&, rBtn, void ) +{ + SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard); + rtl::Reference pObject; + + // tdf#95298 check m_nCurrentFrame for EMPTY_FRAMELIST to avoid out-of-bound array access + if (&rBtn == m_xBtnRemoveBitmap.get() && EMPTY_FRAMELIST != m_nCurrentFrame) + { + m_FrameList.erase(m_FrameList.begin() + m_nCurrentFrame); + + pObject = pPage->GetObj(m_nCurrentFrame); + // Through acquisition of the AnimatedGIFs, objects does not need to + // exist. + if( pObject ) + { + pObject = pPage->RemoveObject(m_nCurrentFrame); + DBG_ASSERT(pObject, "Clone not found during deletion"); + pObject.clear(); + pPage->RecalcObjOrdNums(); + } + + if (m_nCurrentFrame >= m_FrameList.size()) + { + // tdf#95298 last frame was deleted, try to use the one before it or go on empty state + m_nCurrentFrame = m_FrameList.empty() ? EMPTY_FRAMELIST : m_FrameList.size() - 1; + } + } + else // delete everything + { + std::unique_ptr xWarn(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::YesNo, + SdResId(STR_ASK_DELETE_ALL_PICTURES))); + short nReturn = xWarn->run(); + + if( nReturn == RET_YES ) + { + // clear frame list + for (size_t i = m_FrameList.size(); i > 0; ) + { + --i; + pObject = pPage->GetObj( i ); + if( pObject ) + { + pObject = pPage->RemoveObject( i ); + DBG_ASSERT(pObject, "Clone not found during deletion"); + pObject.clear(); + //pPage->RecalcObjOrdNums(); + } + } + m_FrameList.clear(); + m_nCurrentFrame = EMPTY_FRAMELIST; + } + } + + // can we create an animation group + if (m_FrameList.empty()) + { + m_xBtnCreateGroup->set_sensitive(false); + // if previous disabled by acquisition of AnimatedGIFs: + //m_xRbtBitmap->set_sensitive(true); + m_xRbtGroup->set_sensitive(true); + } + + // calculate and set zoom for DisplayWin + Fraction aFrac(GetScale()); + m_xCtlDisplay->SetScale(aFrac); + + UpdateControl(); +} + +IMPL_LINK_NOARG(AnimationWindow, ClickCreateGroupHdl, weld::Button&, void) +{ + // Code now in CreatePresObj() + SfxBoolItem aItem( SID_ANIMATOR_CREATE, true ); + + GetBindings().GetDispatcher()->ExecuteList(SID_ANIMATOR_CREATE, + SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); +} + +IMPL_LINK_NOARG(AnimationWindow, ModifyBitmapHdl, weld::SpinButton&, void) +{ + sal_uLong nBmp = m_xNumFldBitmap->get_value(); + + if (nBmp > m_FrameList.size()) + { + nBmp = m_FrameList.size(); + } + + m_nCurrentFrame = nBmp - 1; + + UpdateControl(); +} + +IMPL_LINK_NOARG(AnimationWindow, ModifyTimeHdl, weld::FormattedSpinButton&, void) +{ + sal_uLong nPos = m_xNumFldBitmap->get_value() - 1; + + ::tools::Time & rTime = m_FrameList[nPos].second; + + rTime = m_xFormatter->GetTime(); +} + +void AnimationWindow::UpdateControl(bool const bDisableCtrls) +{ + // tdf#95298 check m_nCurrentFrame for EMPTY_FRAMELIST to avoid out-of-bound array access + if (!m_FrameList.empty() && EMPTY_FRAMELIST != m_nCurrentFrame) + { + BitmapEx aBmp(m_FrameList[m_nCurrentFrame].first); + + SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard); + SdrObject *const pObject = pPage->GetObj(m_nCurrentFrame); + if( pObject ) + { + ScopedVclPtrInstance< VirtualDevice > pVD; + ::tools::Rectangle aObjRect( pObject->GetCurrentBoundRect() ); + Size aObjSize( aObjRect.GetSize() ); + Point aOrigin( -aObjRect.Left(), -aObjRect.Top() ); + MapMode aMap( pVD->GetMapMode() ); + aMap.SetMapUnit( MapUnit::Map100thMM ); + aMap.SetOrigin( aOrigin ); + pVD->SetMapMode( aMap ); + pVD->SetOutputSize( aObjSize ); + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + pVD->SetBackground( Wallpaper( rStyles.GetFieldColor() ) ); + pVD->SetDrawMode( rStyles.GetHighContrastMode() + ? sd::OUTPUT_DRAWMODE_CONTRAST + : sd::OUTPUT_DRAWMODE_COLOR ); + pVD->Erase(); + pObject->SingleObjectPainter( *pVD ); + aBmp = pVD->GetBitmapEx( aObjRect.TopLeft(), aObjSize ); + } + + m_xCtlDisplay->SetBitmapEx(&aBmp); + } + else + { + m_xCtlDisplay->SetBitmapEx(nullptr); + } + + m_xCtlDisplay->Invalidate(); + + m_xFiCount->set_label(OUString::number( + m_FrameList.size())); + + if (!m_FrameList.empty() && !bMovie) + { + size_t nIndex = m_nCurrentFrame + 1; + m_xNumFldBitmap->set_value(nIndex); + + // if there is at least 1 object in the list + m_xBtnFirst->set_sensitive(true); + m_xBtnReverse->set_sensitive(true); + m_xBtnPlay->set_sensitive(true); + m_xBtnLast->set_sensitive(true); + m_xNumFldBitmap->set_sensitive(true); + m_xTimeField->set_sensitive(true); + m_xLbLoopCount->set_sensitive(true); + m_xBtnRemoveBitmap->set_sensitive(true); + m_xBtnRemoveAll->set_sensitive(true); + } + else + { + // if no object is in the list + m_xBtnFirst->set_sensitive( false ); + m_xBtnReverse->set_sensitive( false ); + m_xBtnPlay->set_sensitive( false ); + m_xBtnLast->set_sensitive( false ); + m_xNumFldBitmap->set_sensitive( false ); + m_xTimeField->set_sensitive( false ); + m_xLbLoopCount->set_sensitive( false ); + m_xBtnRemoveBitmap->set_sensitive( false ); + m_xBtnRemoveAll->set_sensitive( false ); + } + + if( bMovie && bDisableCtrls ) + { + m_xBtnGetOneObject->set_sensitive( false ); + m_xBtnGetAllObjects->set_sensitive( false ); + m_xRbtGroup->set_sensitive( false ); + m_xRbtBitmap->set_sensitive( false ); + m_xBtnCreateGroup->set_sensitive( false ); + m_xFtAdjustment->set_sensitive( false ); + m_xLbAdjustment->set_sensitive( false ); + } + else + { + // enable 'group object' only if it is not an Animated GIF + if (m_FrameList.empty()) + { + m_xRbtGroup->set_sensitive(true); + } + + m_xRbtBitmap->set_sensitive(true); + m_xBtnCreateGroup->set_sensitive(!m_FrameList.empty()); + m_xFtAdjustment->set_sensitive(true); + m_xLbAdjustment->set_sensitive(true); + } + + ClickRbtHdl(*m_xRbtGroup); +} + +void AnimationWindow::ResetAttrs() +{ + m_xRbtGroup->set_active(true); + m_xLbAdjustment->set_active( BA_CENTER ); + // LoopCount + m_xLbLoopCount->set_active( m_xLbLoopCount->get_count() - 1); + + UpdateControl(); +} + +void AnimationWindow::WaitInEffect( sal_uLong nMilliSeconds, sal_uLong nTime, + SfxProgress* pProgress ) const +{ + sal_uInt64 aEnd = ::tools::Time::GetSystemTicks() + nMilliSeconds; + sal_uInt64 aCurrent = ::tools::Time::GetSystemTicks(); + while (aCurrent < aEnd) + { + aCurrent = ::tools::Time::GetSystemTicks(); + + if( pProgress ) + pProgress->SetState( nTime + nMilliSeconds + aCurrent - aEnd ); + + Application::Reschedule(); + + if( !bMovie ) + return; + } +} + +Fraction AnimationWindow::GetScale() +{ + Fraction aFrac; + size_t const nCount = m_FrameList.size(); + if (nCount > 0) + { + Size aBmpSize(0, 0); + for (size_t i = 0; i < nCount; i++) + { + BitmapEx const & rBitmap = m_FrameList[i].first; + Size aTempSize( rBitmap.GetBitmap().GetSizePixel() ); + aBmpSize.setWidth( std::max( aBmpSize.Width(), aTempSize.Width() ) ); + aBmpSize.setHeight( std::max( aBmpSize.Height(), aTempSize.Height() ) ); + } + + aBmpSize.AdjustWidth(10 ); + aBmpSize.AdjustHeight(10 ); + + Size aDisplaySize(m_xCtlDisplay->GetOutputSizePixel()); + + aFrac = Fraction( std::min( static_cast(aDisplaySize.Width()) / static_cast(aBmpSize.Width()), + static_cast(aDisplaySize.Height()) / static_cast(aBmpSize.Height()) ) ); + } + return aFrac; +} + +void AnimationWindow::Resize() +{ + SfxDockingWindow::Resize(); + Fraction aFrac(GetScale()); + m_xCtlDisplay->SetScale(aFrac); +} + +bool AnimationWindow::Close() +{ + if( maPlayLock.isLocked() ) + { + return false; + } + else + { + SfxBoolItem aItem( SID_ANIMATION_OBJECTS, false ); + + GetBindings().GetDispatcher()->ExecuteList( + SID_ANIMATION_OBJECTS, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aItem }); + + SfxDockingWindow::Close(); + + return true; + } +} + +void AnimationWindow::AddObj (::sd::View& rView ) +{ + // finish text entry mode to ensure that bitmap is identical with object + if( rView.IsTextEdit() ) + rView.SdrEndTextEdit(); + + // clone object(s) and insert the clone(s) into the list + const SdrMarkList& rMarkList = rView.GetMarkedObjectList(); + const size_t nMarkCount = rMarkList.GetMarkCount(); + SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard); + const size_t nCloneCount = pPage->GetObjCount(); + + if (nMarkCount <= 0) + return; + + // If it is ONE animation object or one group object, which was + // 'individually taken', we insert the objects separately + bool bAnimObj = false; + if( nMarkCount == 1 ) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObject = pMark->GetMarkedSdrObj(); + SdAnimationInfo* pAnimInfo = SdDrawDocument::GetAnimationInfo( pObject ); + SdrInventor nInv = pObject->GetObjInventor(); + SdrObjKind nId = pObject->GetObjIdentifier(); + + // Animated Bitmap (GIF) + if( nInv == SdrInventor::Default && nId == SdrObjKind::Graphic && static_cast( pObject )->IsAnimated() ) + { + const SdrGrafObj* pGrafObj = static_cast(pObject); + Graphic aGraphic( pGrafObj->GetTransformedGraphic() ); + sal_uInt16 nCount = 0; + + if( aGraphic.IsAnimated() ) + nCount = aGraphic.GetAnimation().Count(); + + if( nCount > 0 ) + { + const Animation aAnimation( aGraphic.GetAnimation() ); + + for( sal_uInt16 i = 0; i < nCount; i++ ) + { + const AnimationFrame& rAnimationFrame = aAnimation.Get( i ); + + // LoopCount + if( i == 0 ) + { + sal_uInt32 nLoopCount = aAnimation.GetLoopCount(); + + if( !nLoopCount ) // endless + m_xLbLoopCount->set_active( m_xLbLoopCount->get_count() - 1); + else + m_xLbLoopCount->set_active_text(OUString::number( nLoopCount ) ); + } + + ::tools::Long nTime = rAnimationFrame.mnWait; + ::tools::Time aTime( 0, 0, nTime / 100, nTime % 100 ); + size_t nIndex = m_nCurrentFrame + 1; + m_FrameList.insert( + m_FrameList.begin() + nIndex, + ::std::make_pair(rAnimationFrame.maBitmapEx, aTime)); + + // increment => next one inserted after this one + ++m_nCurrentFrame; + } + // if an animated GIF is taken, only such one can be created + m_xRbtBitmap->set_active(true); + m_xRbtGroup->set_sensitive( false ); + bAnimObj = true; + } + } + else if( bAllObjects || ( pAnimInfo && pAnimInfo->mbIsMovie ) ) + { + // several objects + SdrObjList* pObjList = static_cast(pObject)->GetSubList(); + + for (const rtl::Reference& pSnapShot : *pObjList) + { + BitmapEx aBitmapEx(SdrExchangeView::GetObjGraphic(*pSnapShot).GetBitmapEx()); + size_t nIndex = m_nCurrentFrame + 1; + m_FrameList.insert( + m_FrameList.begin() + nIndex, + ::std::make_pair(aBitmapEx, m_xFormatter->GetTime())); + + // increment => next one inserted after this one + ++m_nCurrentFrame; + + // Clone + pPage->InsertObject( + pSnapShot->CloneSdrObject(pPage->getSdrModelFromSdrPage()).get(), + m_nCurrentFrame); + } + bAnimObj = true; + } + } + // also one single animated object + if( !bAnimObj && !( bAllObjects && nMarkCount > 1 ) ) + { + BitmapEx aBitmapEx(rView.GetAllMarkedGraphic().GetBitmapEx()); + + ::tools::Time aTime( m_xFormatter->GetTime() ); + + size_t nIndex = m_nCurrentFrame + 1; + m_FrameList.insert( + m_FrameList.begin() + nIndex, + ::std::make_pair(aBitmapEx, aTime)); + } + + // one single object + if( nMarkCount == 1 && !bAnimObj ) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObject = pMark->GetMarkedSdrObj(); + rtl::Reference pClone(pObject->CloneSdrObject(pPage->getSdrModelFromSdrPage())); + size_t nIndex = m_nCurrentFrame + 1; + pPage->InsertObject(pClone.get(), nIndex); + } + // several objects: group the clones + else if (nMarkCount > 1) + { + // take objects separately + if( bAllObjects ) + { + for( size_t nObject= 0; nObject < nMarkCount; ++nObject ) + { + // Clone + SdrObject* pObject(rMarkList.GetMark(nObject)->GetMarkedSdrObj()); + BitmapEx aBitmapEx(SdrExchangeView::GetObjGraphic(*pObject).GetBitmapEx()); + size_t nIndex = m_nCurrentFrame + 1; + m_FrameList.insert( + m_FrameList.begin() + nIndex, + ::std::make_pair(aBitmapEx, m_xFormatter->GetTime())); + + // increment => next one inserted after this one + ++m_nCurrentFrame; + + pPage->InsertObject( + pObject->CloneSdrObject(pPage->getSdrModelFromSdrPage()).get(), + m_nCurrentFrame); + } + bAnimObj = true; // that we don't change again + } + else + { + rtl::Reference pCloneGroup = new SdrObjGroup(rView.getSdrModelFromSdrView()); + SdrObjList* pObjList = pCloneGroup->GetSubList(); + + for (size_t nObject= 0; nObject < nMarkCount; ++nObject) + { + pObjList->InsertObject( + rMarkList.GetMark(nObject)->GetMarkedSdrObj()->CloneSdrObject( + pPage->getSdrModelFromSdrPage()).get()); + } + + size_t nIndex = m_nCurrentFrame + 1; + pPage->InsertObject(pCloneGroup.get(), nIndex); + } + } + + if( !bAnimObj ) + { + ++m_nCurrentFrame; + } + + // if there was nothing in the animator before but now is something + // there, we can create an animation group + if (nCloneCount == 0 && !m_FrameList.empty()) + { + m_xBtnCreateGroup->set_sensitive(true); + } + + // calculate and set zoom for DisplayWin + Fraction aFrac( GetScale() ); + m_xCtlDisplay->SetScale(aFrac); + + UpdateControl(); +} + +void AnimationWindow::CreateAnimObj (::sd::View& rView ) +{ + vcl::Window* pOutWin = rView.GetFirstOutputDevice()->GetOwnerWindow(); // GetWin( 0 ); + DBG_ASSERT( pOutWin, "Window does not exist!" ); + + // find window center + const MapMode aMap100( MapUnit::Map100thMM ); + Size aMaxSizeLog; + Size aMaxSizePix; + Size aTemp( pOutWin->GetOutputSizePixel() ); + const Point aWindowCenter( pOutWin->PixelToLogic( Point( aTemp.Width() >> 1, aTemp.Height() >> 1 ) ) ); + const OutputDevice* pDefDev = Application::GetDefaultDevice(); + const size_t nCount = m_FrameList.size(); + BitmapAdjustment eBA = static_cast(m_xLbAdjustment->get_active()); + + // find biggest bitmap + for (size_t i = 0; i < nCount; ++i) + { + const BitmapEx& rBmpEx = m_FrameList[i].first; + const Graphic aGraphic( rBmpEx ); + Size aTmpSizeLog; + const Size aTmpSizePix( rBmpEx.GetSizePixel() ); + + if ( aGraphic.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel ) + aTmpSizeLog = pDefDev->PixelToLogic( aGraphic.GetPrefSize(), aMap100 ); + else + aTmpSizeLog = OutputDevice::LogicToLogic( aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), aMap100 ); + + aMaxSizeLog.setWidth( std::max( aMaxSizeLog.Width(), aTmpSizeLog.Width() ) ); + aMaxSizeLog.setHeight( std::max( aMaxSizeLog.Height(), aTmpSizeLog.Height() ) ); + + aMaxSizePix.setWidth( std::max( aMaxSizePix.Width(), aTmpSizePix.Width() ) ); + aMaxSizePix.setHeight( std::max( aMaxSizePix.Height(), aTmpSizePix.Height() ) ); + } + + SdrPageView* pPV = rView.GetSdrPageView(); + + if( m_xRbtBitmap->get_active() ) + { + // create bitmap group (Animated GIF) + Animation aAnimation; + Point aPt; + + for (size_t i = 0; i < nCount; ++i) + { + ::tools::Time const & rTime = m_FrameList[i].second; + ::tools::Long nTime = rTime.GetNanoSec(); + nTime += rTime.GetSec() * 100; + + BitmapEx const & rBitmapEx = m_FrameList[i].first; + + // calculate offset for the specified direction + const Size aBitmapSize( rBitmapEx.GetSizePixel() ); + + switch( eBA ) + { + case BA_LEFT_UP: + break; + + case BA_LEFT: + aPt.setY( (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1 ); + break; + + case BA_LEFT_DOWN: + aPt.setY( aMaxSizePix.Height() - aBitmapSize.Height() ); + break; + + case BA_UP: + aPt.setX( (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1 ); + break; + + case BA_CENTER: + aPt.setX( (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1 ); + aPt.setY( (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1 ); + break; + + case BA_DOWN: + aPt.setX( (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1 ); + aPt.setY( aMaxSizePix.Height() - aBitmapSize.Height() ); + break; + + case BA_RIGHT_UP: + aPt.setX( aMaxSizePix.Width() - aBitmapSize.Width() ); + break; + + case BA_RIGHT: + aPt.setX( aMaxSizePix.Width() - aBitmapSize.Width() ); + aPt.setY( (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1 ); + break; + + case BA_RIGHT_DOWN: + aPt.setX( aMaxSizePix.Width() - aBitmapSize.Width() ); + aPt.setY( aMaxSizePix.Height() - aBitmapSize.Height() ); + break; + + } + + // find LoopCount (number of passes) + AnimationFrame aAnimationFrame; + sal_uInt32 nLoopCount = 0; + sal_Int32 nPos = m_xLbLoopCount->get_active(); + + if( nPos != -1 && nPos != m_xLbLoopCount->get_count() - 1 ) // endless + nLoopCount = m_xLbLoopCount->get_active_text().toUInt32(); + + aAnimationFrame.maBitmapEx = rBitmapEx; + aAnimationFrame.maPositionPixel = aPt; + aAnimationFrame.maSizePixel = aBitmapSize; + aAnimationFrame.mnWait = nTime; + aAnimationFrame.meDisposal = Disposal::Back; + aAnimationFrame.mbUserInput = false; + + aAnimation.Insert( aAnimationFrame ); + aAnimation.SetDisplaySizePixel( aMaxSizePix ); + aAnimation.SetLoopCount( nLoopCount ); + } + + rtl::Reference pGrafObj = new SdrGrafObj( + rView.getSdrModelFromSdrView(), + Graphic(aAnimation)); + const Point aOrg( aWindowCenter.X() - ( aMaxSizeLog.Width() >> 1 ), aWindowCenter.Y() - ( aMaxSizeLog.Height() >> 1 ) ); + + pGrafObj->SetLogicRect( ::tools::Rectangle( aOrg, aMaxSizeLog ) ); + rView.InsertObjectAtView( pGrafObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER); + } + else + { + // calculate offset for the specified direction + Size aOffset; + SdrObject * pClone = nullptr; + SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard); + + for (size_t i = 0; i < nCount; ++i) + { + pClone = pPage->GetObj(i); + ::tools::Rectangle aRect( pClone->GetSnapRect() ); + + switch( eBA ) + { + case BA_LEFT_UP: + break; + + case BA_LEFT: + aOffset.setHeight( (aMaxSizeLog.Height() - aRect.GetHeight()) / 2 ); + break; + + case BA_LEFT_DOWN: + aOffset.setHeight( aMaxSizeLog.Height() - aRect.GetHeight() ); + break; + + case BA_UP: + aOffset.setWidth( (aMaxSizeLog.Width() - aRect.GetWidth()) / 2 ); + break; + + case BA_CENTER: + aOffset.setWidth( (aMaxSizeLog.Width() - aRect.GetWidth()) / 2 ); + aOffset.setHeight( (aMaxSizeLog.Height() - aRect.GetHeight()) / 2 ); + break; + + case BA_DOWN: + aOffset.setWidth( (aMaxSizeLog.Width() - aRect.GetWidth()) / 2 ); + aOffset.setHeight( aMaxSizeLog.Height() - aRect.GetHeight() ); + break; + + case BA_RIGHT_UP: + aOffset.setWidth( aMaxSizeLog.Width() - aRect.GetWidth() ); + break; + + case BA_RIGHT: + aOffset.setWidth( aMaxSizeLog.Width() - aRect.GetWidth() ); + aOffset.setHeight( (aMaxSizeLog.Height() - aRect.GetHeight()) / 2 ); + break; + + case BA_RIGHT_DOWN: + aOffset.setWidth( aMaxSizeLog.Width() - aRect.GetWidth() ); + aOffset.setHeight( aMaxSizeLog.Height() - aRect.GetHeight() ); + break; + + } + // Unfortunately, SetSnapRect is not implemented for ellipses !!! + Point aMovePt( aWindowCenter + Point( aOffset.Width(), aOffset.Height() ) - aRect.TopLeft() ); + Size aMoveSize( aMovePt.X(), aMovePt.Y() ); + pClone->NbcMove( aMoveSize ); + } + + // #i42894# Caution(!) variable pPage looks right, but it is a page from the local + // document the dialog is using (!), so get the target page from the target view + SdPage* pTargetSdPage = dynamic_cast< SdPage* >(rView.GetSdrPageView() ? rView.GetSdrPageView()->GetPage() : nullptr); + + if(pTargetSdPage) + { + // create animation group + rtl::Reference pGroup = new SdrObjGroup(rView.getSdrModelFromSdrView()); + SdrObjList* pObjList = pGroup->GetSubList(); + + for (size_t i = 0; i < nCount; ++i) + { + // the clone remains in the animation; we insert a clone of the + // clone into the group + pClone = pPage->GetObj(i); + rtl::Reference pCloneOfClone(pClone->CloneSdrObject(pTargetSdPage->getSdrModelFromSdrPage())); + //SdrObject* pCloneOfClone = pPage->GetObj(i)->Clone(); + pObjList->InsertObject(pCloneOfClone.get()); + } + + // until now the top left corner of the group is in the window center; + // correct the position by half of the size of the group + aTemp = aMaxSizeLog; + aTemp.setHeight( - aTemp.Height() / 2 ); + aTemp.setWidth( - aTemp.Width() / 2 ); + pGroup->NbcMove(aTemp); + + // #i42894# create needed SMIL stuff and move child objects to page directly (see + // comments at EffectMigration::CreateAnimatedGroup why this has to be done). + EffectMigration::CreateAnimatedGroup(*pGroup, *pTargetSdPage); + } + } + + ClickFirstHdl(*m_xBtnFirst); +} + +void AnimationWindow::DataChanged( const DataChangedEvent& rDCEvt ) +{ + SfxDockingWindow::DataChanged( rDCEvt ); + + if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) ) + { + UpdateControl(); + } +} + +/** + * ControllerItem for Animator + */ +AnimationControllerItem::AnimationControllerItem( + sal_uInt16 _nId, + AnimationWindow* pAnimWin, + SfxBindings* _pBindings) + : SfxControllerItem( _nId, *_pBindings ), + pAnimationWin( pAnimWin ) +{ +} + +void AnimationControllerItem::StateChangedAtToolBoxControl( sal_uInt16 nSId, + SfxItemState eState, const SfxPoolItem* pItem ) +{ + if( eState >= SfxItemState::DEFAULT && nSId == SID_ANIMATOR_STATE ) + { + const SfxUInt16Item* pStateItem = dynamic_cast< const SfxUInt16Item*>( pItem ); + assert(pStateItem); //SfxUInt16Item expected + if (pStateItem) + { + sal_uInt16 nState = pStateItem->GetValue(); + pAnimationWin->m_xBtnGetOneObject->set_sensitive( nState & 1 ); + pAnimationWin->m_xBtnGetAllObjects->set_sensitive( nState & 2 ); + } + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/brkdlg.cxx b/sd/source/ui/dlg/brkdlg.cxx new file mode 100644 index 0000000000..bc1d0f5cff --- /dev/null +++ b/sd/source/ui/dlg/brkdlg.cxx @@ -0,0 +1,156 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace sd { + +/** + * dialog to split metafiles + */ + +BreakDlg::BreakDlg(weld::Window* pWindow, DrawView* pDrView, DrawDocShell* pShell, + sal_uLong nSumActionCount, sal_uLong nObjCount) + : SfxDialogController(pWindow, "modules/sdraw/ui/breakdialog.ui", "BreakDialog") + , m_xFiObjInfo(m_xBuilder->weld_label("metafiles")) + , m_xFiActInfo(m_xBuilder->weld_label("metaobjects")) + , m_xFiInsInfo(m_xBuilder->weld_label("drawingobjects")) + , m_xBtnCancel(m_xBuilder->weld_button("cancel")) + , m_pDrView(pDrView) + , m_bCancel(false) + , m_aUpdateIdle( "sd::BreakDlg m_aUpdateIdle" ) +{ + m_aUpdateIdle.SetPriority( TaskPriority::REPAINT ); + m_aUpdateIdle.SetInvokeHandler( LINK( this, BreakDlg, InitialUpdate ) ); + + m_xBtnCancel->connect_clicked(LINK(this, BreakDlg, CancelButtonHdl)); + + m_xProgress.reset(new SfxProgress(pShell, SdResId(STR_BREAK_METAFILE), nSumActionCount*3)); + + m_xProgrInfo.reset(new SvdProgressInfo(LINK(this, BreakDlg, UpDate))); + // every action is edited 3 times in DoImport() + m_xProgrInfo->Init( nObjCount ); +} + +// Control-Handler for cancel button +IMPL_LINK_NOARG(BreakDlg, CancelButtonHdl, weld::Button&, void) +{ + m_bCancel = true; + m_xBtnCancel->set_sensitive(false); +} + +/** + * The working function has to call the UpDate method periodically. + * With the first call, the overall number of actions is provided. + * Every following call should contain the finished actions since the + * last call of UpDate. + */ +IMPL_LINK( BreakDlg, UpDate, void*, nInit, bool ) +{ + if (!m_xProgrInfo) + return true; + + // update status bar or show an error message? + if(nInit == reinterpret_cast(1)) + { + std::unique_ptr xErrBox(Application::CreateMessageDialog(m_xDialog.get(), + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_BREAK_FAIL))); + xErrBox->run(); + } + else + { + if (m_xProgress) + m_xProgress->SetState(m_xProgrInfo->GetSumCurAction()); + } + + // which object is shown at the moment? + OUString info = OUString::number(m_xProgrInfo->GetCurObj()) + + "/" + + OUString::number(m_xProgrInfo->GetObjCount()); + m_xFiObjInfo->set_label(info); + + // how many actions are started? + if (m_xProgrInfo->GetActionCount() == 0) + { + m_xFiActInfo->set_label( OUString() ); + } + else + { + info = OUString::number(m_xProgrInfo->GetCurAction()) + + "/" + + OUString::number(m_xProgrInfo->GetActionCount()); + m_xFiActInfo->set_label(info); + } + + // and inserted???? + if (m_xProgrInfo->GetInsertCount() == 0) + { + m_xFiInsInfo->set_label( OUString() ); + } + else + { + info = OUString::number(m_xProgrInfo->GetCurInsert()) + + "/" + + OUString::number(m_xProgrInfo->GetInsertCount()); + m_xFiInsInfo->set_label(info); + } + + // make sure dialog gets painted, it is intended to + // show the progress to the user. Also necessary to + // provide a clickable cancel button + Scheduler::ProcessEventsToIdle(); + + // return okay-value (-> !cancel) + return !m_bCancel; +} + +/** + * open a modal dialog and start a timer which calls the working function after + * the opening of the dialog + */ +short BreakDlg::run() +{ + m_aUpdateIdle.Start(); + return SfxDialogController::run(); +} + +/** + * link-method which starts the working function + */ +IMPL_LINK_NOARG(BreakDlg, InitialUpdate, Timer *, void) +{ + m_pDrView->DoImportMarkedMtf(m_xProgrInfo.get()); + m_xDialog->response(RET_OK); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/copydlg.cxx b/sd/source/ui/dlg/copydlg.cxx new file mode 100644 index 0000000000..44ad8703e9 --- /dev/null +++ b/sd/source/ui/dlg/copydlg.cxx @@ -0,0 +1,263 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + + +namespace sd { + +constexpr char TOKEN = ';'; + +CopyDlg::CopyDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View* pInView) + : SfxDialogController(pWindow, "modules/sdraw/ui/copydlg.ui", "DuplicateDialog") + , mrOutAttrs(rInAttrs) + , maUIScale(pInView->GetDoc().GetUIScale()) + , mpView(pInView) + , m_xNumFldCopies(m_xBuilder->weld_spin_button("copies")) + , m_xBtnSetViewData(m_xBuilder->weld_button("viewdata")) + , m_xMtrFldMoveX(m_xBuilder->weld_metric_spin_button("x", FieldUnit::CM)) + , m_xMtrFldMoveY(m_xBuilder->weld_metric_spin_button("y", FieldUnit::CM)) + , m_xMtrFldAngle(m_xBuilder->weld_metric_spin_button("angle", FieldUnit::DEGREE)) + , m_xMtrFldWidth(m_xBuilder->weld_metric_spin_button("width", FieldUnit::CM)) + , m_xMtrFldHeight(m_xBuilder->weld_metric_spin_button("height", FieldUnit::CM)) + , m_xFtEndColor(m_xBuilder->weld_label("endlabel")) + , m_xBtnSetDefault(m_xBuilder->weld_button("default")) + , m_xLbStartColor(new ColorListBox(m_xBuilder->weld_menu_button("start"), [this]{ return m_xDialog.get(); } )) + , m_xLbEndColor(new ColorListBox(m_xBuilder->weld_menu_button("end"), [this]{ return m_xDialog.get(); } )) +{ + m_xLbStartColor->SetSelectHdl( LINK( this, CopyDlg, SelectColorHdl ) ); + m_xBtnSetViewData->connect_clicked( LINK( this, CopyDlg, SetViewData ) ); + m_xBtnSetDefault->connect_clicked( LINK( this, CopyDlg, SetDefault ) ); + + FieldUnit eFUnit( SfxModule::GetCurrentFieldUnit() ); + + SetFieldUnit( *m_xMtrFldMoveX, eFUnit, true ); + SetFieldUnit( *m_xMtrFldMoveY, eFUnit, true ); + SetFieldUnit( *m_xMtrFldWidth, eFUnit, true ); + SetFieldUnit( *m_xMtrFldHeight, eFUnit, true ); + + Reset(); +} + +CopyDlg::~CopyDlg() +{ + SvtViewOptions aDlgOpt(EViewType::Dialog, m_xDialog->get_help_id()); + OUString sStr = + OUString::number(m_xNumFldCopies->get_value()) + OUStringChar(TOKEN) + + OUString::number(m_xMtrFldMoveX->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) + + OUString::number(m_xMtrFldMoveY->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) + + OUString::number(m_xMtrFldAngle->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) + + OUString::number(m_xMtrFldWidth->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) + + OUString::number(m_xMtrFldHeight->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) + + OUString::number(static_cast(m_xLbStartColor->GetSelectEntryColor())) + OUStringChar(TOKEN) + + OUString::number(static_cast(m_xLbEndColor->GetSelectEntryColor())); + aDlgOpt.SetUserItem("UserItem", css::uno::Any(sStr)); +} + +/** + * reads provided item set or evaluate ini string + */ +void CopyDlg::Reset() +{ + // Set Min/Max values + ::tools::Rectangle aRect = mpView->GetAllMarkedRect(); + Size aPageSize = mpView->GetSdrPageView()->GetPage()->GetSize(); + + // tdf#125011 draw/impress sizes are in mm_100th already, "normalize" to + // decimal shift by number of decimal places the widgets are using (2) then + // scale by the ui scaling factor + auto nPageWidth = tools::Long(m_xMtrFldMoveX->normalize(aPageSize.Width()) / maUIScale); + auto nPageHeight = tools::Long(m_xMtrFldMoveX->normalize(aPageSize.Height()) / maUIScale); + auto nRectWidth = tools::Long(m_xMtrFldMoveX->normalize(aRect.GetWidth()) / maUIScale); + auto nRectHeight = tools::Long(m_xMtrFldMoveX->normalize(aRect.GetHeight()) / maUIScale); + + m_xMtrFldMoveX->set_range(-nPageWidth, nPageWidth, FieldUnit::MM_100TH); + m_xMtrFldMoveY->set_range(-nPageHeight, nPageHeight, FieldUnit::MM_100TH); + m_xMtrFldWidth->set_range(-nRectWidth, nPageWidth, FieldUnit::MM_100TH); + m_xMtrFldHeight->set_range(-nRectHeight, nPageHeight, FieldUnit::MM_100TH); + + OUString aStr; + SvtViewOptions aDlgOpt(EViewType::Dialog, m_xDialog->get_help_id()); + if (aDlgOpt.Exists()) + { + css::uno::Any aUserItem = aDlgOpt.GetUserItem("UserItem"); + aUserItem >>= aStr; + } + + if (aStr.isEmpty()) + { + if( const SfxUInt16Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_NUMBER ) ) + m_xNumFldCopies->set_value(pPoolItem->GetValue()); + else + m_xNumFldCopies->set_value(1); + + tools::Long nMoveX = 500; + if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_MOVE_X ) ) + nMoveX = pPoolItem->GetValue(); + SetMetricValue( *m_xMtrFldMoveX, tools::Long(nMoveX / maUIScale), MapUnit::Map100thMM); + + tools::Long nMoveY = 500; + if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_MOVE_Y ) ) + nMoveY = pPoolItem->GetValue(); + SetMetricValue( *m_xMtrFldMoveY, tools::Long(nMoveY / maUIScale), MapUnit::Map100thMM); + + if( const SdrAngleItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_ANGLE ) ) + m_xMtrFldAngle->set_value( pPoolItem->GetValue().get(), FieldUnit::NONE); + else + m_xMtrFldAngle->set_value(0, FieldUnit::NONE); + + tools::Long nWidth = 0; + if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_WIDTH ) ) + nWidth = pPoolItem->GetValue(); + SetMetricValue( *m_xMtrFldWidth, tools::Long(nWidth / maUIScale), MapUnit::Map100thMM); + + tools::Long nHeight = 0; + if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_HEIGHT ) ) + nHeight = pPoolItem->GetValue(); + SetMetricValue( *m_xMtrFldHeight, tools::Long(nHeight / maUIScale), MapUnit::Map100thMM); + + if( const XColorItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_START_COLOR ) ) + { + Color aColor = pPoolItem->GetColorValue(); + m_xLbStartColor->SelectEntry( aColor ); + m_xLbEndColor->SelectEntry( aColor ); + } + else + { + m_xLbStartColor->SetNoSelection(); + m_xLbEndColor->SetNoSelection(); + m_xLbEndColor->set_sensitive(false); + m_xFtEndColor->set_sensitive(false); + } + } + else + { + sal_Int32 nIdx {0}; + m_xNumFldCopies->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx))); + m_xMtrFldMoveX->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE); + m_xMtrFldMoveY->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE); + m_xMtrFldAngle->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE); + m_xMtrFldWidth->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE); + m_xMtrFldHeight->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE); + m_xLbStartColor->SelectEntry( Color( ColorTransparency, o3tl::toUInt32(o3tl::getToken(aStr, 0, TOKEN, nIdx)) ) ); + m_xLbEndColor->SelectEntry( Color( ColorTransparency, o3tl::toUInt32(o3tl::getToken(aStr, 0, TOKEN, nIdx)) ) ); + } + +} + +/** + * fills provided item set with dialog box attributes + */ +void CopyDlg::GetAttr( SfxItemSet& rOutAttrs ) +{ + tools::Long nMoveX = tools::Long( GetCoreValue( *m_xMtrFldMoveX, MapUnit::Map100thMM) * maUIScale); + tools::Long nMoveY = tools::Long( GetCoreValue( *m_xMtrFldMoveY, MapUnit::Map100thMM) * maUIScale); + tools::Long nHeight = tools::Long( GetCoreValue( *m_xMtrFldHeight, MapUnit::Map100thMM) * maUIScale); + tools::Long nWidth = tools::Long( GetCoreValue( *m_xMtrFldWidth, MapUnit::Map100thMM) * maUIScale); + + rOutAttrs.Put( SfxUInt16Item( ATTR_COPY_NUMBER, static_cast(m_xNumFldCopies->get_value()) ) ); + rOutAttrs.Put( SfxInt32Item( ATTR_COPY_MOVE_X, nMoveX ) ); + rOutAttrs.Put( SfxInt32Item( ATTR_COPY_MOVE_Y, nMoveY ) ); + rOutAttrs.Put( SdrAngleItem( ATTR_COPY_ANGLE, Degree100(static_cast(m_xMtrFldAngle->get_value(FieldUnit::DEGREE))) ) ); + rOutAttrs.Put( SfxInt32Item( ATTR_COPY_WIDTH, nWidth ) ); + rOutAttrs.Put( SfxInt32Item( ATTR_COPY_HEIGHT, nHeight ) ); + + NamedColor aColor = m_xLbStartColor->GetSelectedEntry(); + rOutAttrs.Put(XColorItem(ATTR_COPY_START_COLOR, aColor.m_aName, aColor.m_aColor)); + aColor = m_xLbEndColor->GetSelectedEntry(); + rOutAttrs.Put(XColorItem(ATTR_COPY_END_COLOR, aColor.m_aName, aColor.m_aColor)); +} + +/** + * enables and selects end color LB + */ +IMPL_LINK_NOARG(CopyDlg, SelectColorHdl, ColorListBox&, void) +{ + const Color aColor = m_xLbStartColor->GetSelectEntryColor(); + + if (!m_xLbEndColor->get_sensitive()) + { + m_xLbEndColor->SelectEntry(aColor); + m_xLbEndColor->set_sensitive(true); + m_xFtEndColor->set_sensitive(true); + } +} + +/** + * sets values of selection + */ +IMPL_LINK_NOARG(CopyDlg, SetViewData, weld::Button&, void) +{ + ::tools::Rectangle aRect = mpView->GetAllMarkedRect(); + + SetMetricValue( *m_xMtrFldMoveX, tools::Long( aRect.GetWidth() / + maUIScale ), MapUnit::Map100thMM); + SetMetricValue( *m_xMtrFldMoveY, tools::Long( aRect.GetHeight() / + maUIScale ), MapUnit::Map100thMM); + + // sets color attribute + if( const XColorItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_START_COLOR ) ) + { + Color aColor = pPoolItem->GetColorValue(); + m_xLbStartColor->SelectEntry( aColor ); + } +} + +/** + * resets values to default + */ +IMPL_LINK_NOARG(CopyDlg, SetDefault, weld::Button&, void) +{ + m_xNumFldCopies->set_value(1); + + tools::Long nValue = 500; + SetMetricValue( *m_xMtrFldMoveX, tools::Long(nValue / maUIScale), MapUnit::Map100thMM); + SetMetricValue( *m_xMtrFldMoveY, tools::Long(nValue / maUIScale), MapUnit::Map100thMM); + + nValue = 0; + m_xMtrFldAngle->set_value(nValue, FieldUnit::DEGREE); + SetMetricValue( *m_xMtrFldWidth, tools::Long(nValue / maUIScale), MapUnit::Map100thMM); + SetMetricValue( *m_xMtrFldHeight, tools::Long(nValue / maUIScale), MapUnit::Map100thMM); + + // set color attribute + if( const XColorItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_START_COLOR ) ) + { + Color aColor = pPoolItem->GetColorValue(); + m_xLbStartColor->SelectEntry( aColor ); + m_xLbEndColor->SelectEntry( aColor ); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/custsdlg.cxx b/sd/source/ui/dlg/custsdlg.cxx new file mode 100644 index 0000000000..6628a9ac9c --- /dev/null +++ b/sd/source/ui/dlg/custsdlg.cxx @@ -0,0 +1,474 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// SdCustomShowDlg +SdCustomShowDlg::SdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc) + : GenericDialogController(pWindow, "modules/simpress/ui/customslideshows.ui", "CustomSlideShows") + , rDoc(rDrawDoc) + , pCustomShowList(nullptr) + , m_xLbCustomShows(m_xBuilder->weld_tree_view("customshowlist")) + , m_xBtnNew(m_xBuilder->weld_button("new")) + , m_xBtnEdit(m_xBuilder->weld_button("edit")) + , m_xBtnRemove(m_xBuilder->weld_button("delete")) + , m_xBtnCopy(m_xBuilder->weld_button("copy")) + , m_xBtnStartShow(m_xBuilder->weld_button("startshow")) +{ + m_xLbCustomShows->set_size_request(m_xLbCustomShows->get_approximate_digit_width() * 32, + m_xLbCustomShows->get_height_rows(8)); + + Link aLink( LINK( this, SdCustomShowDlg, ClickButtonHdl ) ); + m_xBtnNew->connect_clicked( aLink ); + m_xBtnEdit->connect_clicked( aLink ); + m_xBtnRemove->connect_clicked( aLink ); + m_xBtnCopy->connect_clicked( aLink ); + m_xLbCustomShows->connect_changed( LINK( this, SdCustomShowDlg, SelectListBoxHdl ) ); + + m_xBtnStartShow->connect_clicked( LINK( this, SdCustomShowDlg, StartShowHdl ) ); // for test + + // get CustomShow list of docs + pCustomShowList = rDoc.GetCustomShowList(); + if( pCustomShowList ) + { + tools::Long nPosToSelect = pCustomShowList->GetCurPos(); + // fill ListBox with CustomShows + for( SdCustomShow* pCustomShow = pCustomShowList->First(); + pCustomShow != nullptr; + pCustomShow = pCustomShowList->Next() ) + { + m_xLbCustomShows->append_text(pCustomShow->GetName()); + } + m_xLbCustomShows->select(nPosToSelect); + pCustomShowList->Seek( nPosToSelect ); + } + + CheckState(); +} + +SdCustomShowDlg::~SdCustomShowDlg() +{ +} + +void SdCustomShowDlg::CheckState() +{ + int nPos = m_xLbCustomShows->get_selected_index(); + + bool bEnable = nPos != -1; + m_xBtnEdit->set_sensitive( bEnable ); + m_xBtnRemove->set_sensitive( bEnable ); + m_xBtnCopy->set_sensitive( bEnable ); + m_xBtnStartShow->set_sensitive(bEnable); + + if (bEnable && pCustomShowList) + pCustomShowList->Seek( nPos ); +} + +IMPL_LINK( SdCustomShowDlg, ClickButtonHdl, weld::Button&, r, void ) +{ + SelectHdl(&r); +} + +IMPL_LINK( SdCustomShowDlg, SelectListBoxHdl, weld::TreeView&, rListBox, void ) +{ + SelectHdl(&rListBox); +} + +void SdCustomShowDlg::SelectHdl(void const *p) +{ + // new CustomShow + if (p == m_xBtnNew.get()) + { + std::unique_ptr pCustomShow; + SdDefineCustomShowDlg aDlg(m_xDialog.get(), rDoc, pCustomShow); + if (aDlg.run() == RET_OK) + { + if( pCustomShow ) + { + if( !pCustomShowList ) + pCustomShowList = rDoc.GetCustomShowList( true ); + + SdCustomShow* pCustomShowTmp = pCustomShow.get(); + pCustomShowList->push_back( std::move(pCustomShow) ); + pCustomShowList->Last(); + m_xLbCustomShows->append_text( pCustomShowTmp->GetName() ); + m_xLbCustomShows->select_text( pCustomShowTmp->GetName() ); + } + } + } + // edit CustomShow + else if( p == m_xBtnEdit.get() ) + { + int nPos = m_xLbCustomShows->get_selected_index(); + if (nPos != -1) + { + DBG_ASSERT( pCustomShowList, "pCustomShowList does not exist" ); + std::unique_ptr& pCustomShow = (*pCustomShowList)[ nPos ]; + SdDefineCustomShowDlg aDlg(m_xDialog.get(), rDoc, pCustomShow); + + if (aDlg.run() == RET_OK) + { + pCustomShowList->Seek(nPos); + m_xLbCustomShows->remove(nPos); + m_xLbCustomShows->insert_text(nPos, pCustomShow->GetName()); + m_xLbCustomShows->select(nPos); + } + } + } + // delete CustomShow + else if( p == m_xBtnRemove.get() ) + { + int nPos = m_xLbCustomShows->get_selected_index(); + if (nPos != -1) + { + pCustomShowList->erase( pCustomShowList->begin() + nPos ); + m_xLbCustomShows->remove(nPos); + m_xLbCustomShows->select(nPos == 0 ? nPos : nPos - 1); + } + } + // copy CustomShow + else if( p == m_xBtnCopy.get() ) + { + int nPos = m_xLbCustomShows->get_selected_index(); + if (nPos != -1) + { + std::unique_ptr pShow(new SdCustomShow( *(*pCustomShowList)[nPos] )); + OUString aStr( pShow->GetName() ); + OUString aStrCopy( SdResId( STR_COPY_CUSTOMSHOW ) ); + + sal_Int32 nStrPos = aStr.indexOf( aStrCopy ); + sal_Int32 nNum = 1; + if( nStrPos < 0 ) + { + aStr += " (" + aStrCopy + OUString::number( nNum ) + ")"; + nStrPos = aStr.indexOf( aStrCopy ); + } + nStrPos = nStrPos + aStrCopy.getLength(); + // that we do not access into the nirvana (--> endless loop) + if( nStrPos >= aStr.getLength() ) + { + aStr += " " + OUString::number( nNum ); + } + + // check name... + bool bDifferent = false; + //long nPosToSelect = pCustomShowList->GetCurPos(); + while( !bDifferent ) + { + bDifferent = true; + for( SdCustomShow* pCustomShow = pCustomShowList->First(); + pCustomShow != nullptr && bDifferent; + pCustomShow = pCustomShowList->Next() ) + { + if( aStr == pCustomShow->GetName() ) + bDifferent = false; + } + if( !bDifferent ) + { + // replace number by a number increased by 1 + + const std::optional& pCharClass = rDoc.GetCharClass(); + while( pCharClass->isDigit( aStr, nStrPos ) ) + aStr = aStr.replaceAt( nStrPos, 1, u"" ); + aStr = aStr.subView( 0, nStrPos) + OUString::number( ++nNum ) + aStr.subView( nStrPos); + } + + } + //pCustomShowList->Seek( nPosToSelect ); + pShow->SetName( aStr ); + + auto pShowTmp = pShow.get(); + pCustomShowList->push_back( std::move(pShow) ); + pCustomShowList->Last(); + m_xLbCustomShows->append_text(pShowTmp->GetName()); + m_xLbCustomShows->select_text(pShowTmp->GetName()); + } + } + else if( p == m_xLbCustomShows.get() ) + { + int nPos = m_xLbCustomShows->get_selected_index(); + if (nPos != -1) + pCustomShowList->Seek(nPos); + } + + CheckState(); +} + +// StartShow-Hdl +IMPL_LINK_NOARG(SdCustomShowDlg, StartShowHdl, weld::Button&, void) +{ + m_xDialog->response(RET_YES); +} + +// CheckState +bool SdCustomShowDlg::IsCustomShow() const +{ + if (!pCustomShowList->empty()) + return true; + else + return false; +} + +// SdDefineCustomShowDlg +SdDefineCustomShowDlg::SdDefineCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc, std::unique_ptr& rpCS) + : GenericDialogController(pWindow, "modules/simpress/ui/definecustomslideshow.ui", "DefineCustomSlideShow") + , rDoc(rDrawDoc) + , rpCustomShow(rpCS) + , bModified(false) + , m_xEdtName(m_xBuilder->weld_entry("customname")) + , m_xLbPages(m_xBuilder->weld_tree_view("pages")) + , m_xBtnAdd(m_xBuilder->weld_button("add")) + , m_xBtnRemove(m_xBuilder->weld_button("remove")) + , m_xLbCustomPages(m_xBuilder->weld_tree_view("custompages")) + , m_xDropTargetHelper(new weld::ReorderingDropTarget(*m_xLbCustomPages)) + , m_xBtnOK(m_xBuilder->weld_button("ok")) +{ + Link aLink = LINK( this, SdDefineCustomShowDlg, ClickButtonHdl ); + m_xBtnAdd->connect_clicked( aLink ); + m_xBtnRemove->connect_clicked( aLink ); + m_xEdtName->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonEditHdl ) ); + m_xLbPages->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonHdl4 ) ); // because of status + m_xLbCustomPages->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonHdl3 ) ); // because of status + + m_xBtnOK->connect_clicked( LINK( this, SdDefineCustomShowDlg, OKHdl ) ); + + m_xLbPages->set_selection_mode(SelectionMode::Multiple); + + // shape 'em a bit + m_xLbPages->set_size_request(m_xLbPages->get_approximate_digit_width() * 24, m_xLbPages->get_height_rows(10)); + m_xLbCustomPages->set_size_request(m_xLbPages->get_approximate_digit_width() * 24, m_xLbCustomPages->get_height_rows(10)); + + // fill Listbox with page names of Docs + for( tools::Long nPage = 0; + nPage < rDoc.GetSdPageCount( PageKind::Standard ); + nPage++ ) + { + SdPage* pPage = rDoc.GetSdPage( static_cast(nPage), PageKind::Standard ); + m_xLbPages->append_text(pPage->GetName()); + } + // aLbPages.SelectEntryPos( 0 ); + + if( rpCustomShow ) + { + aOldName = rpCustomShow->GetName(); + m_xEdtName->set_text( aOldName ); + + // fill ListBox with CustomShow pages + for( const auto& rpPage : rpCustomShow->PagesVector() ) + { + m_xLbCustomPages->append(weld::toId(rpPage), rpPage->GetName(), ""); + } + } + else + { + rpCustomShow.reset(new SdCustomShow); + m_xEdtName->set_text( SdResId( STR_NEW_CUSTOMSHOW ) ); + m_xEdtName->select_region(0, -1); + rpCustomShow->SetName( m_xEdtName->get_text() ); + } + + m_xBtnOK->set_sensitive( false ); + CheckState(); +} + +SdDefineCustomShowDlg::~SdDefineCustomShowDlg() +{ +} + +// CheckState +void SdDefineCustomShowDlg::CheckState() +{ + bool bPages = m_xLbPages->count_selected_rows() > 0; + bool bCSPages = m_xLbCustomPages->get_selected_index() != -1; + bool bCount = m_xLbCustomPages->n_children() > 0; + + m_xBtnOK->set_sensitive( bCount ); + m_xBtnAdd->set_sensitive( bPages ); + m_xBtnRemove->set_sensitive( bCSPages ); +} + +IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl, weld::Button&, rWidget, void ) +{ + ClickButtonHdl2(&rWidget); +} + +IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl3, weld::TreeView&, rWidget, void ) +{ + ClickButtonHdl2(&rWidget); +} + +IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl4, weld::TreeView&, rListBox, void ) +{ + ClickButtonHdl2(&rListBox); +} + +IMPL_LINK( SdDefineCustomShowDlg, ClickButtonEditHdl, weld::Entry&, rEdit, void ) +{ + ClickButtonHdl2(&rEdit); +} + +// ButtonHdl() +void SdDefineCustomShowDlg::ClickButtonHdl2(void const * p) +{ + if( p == m_xBtnAdd.get() ) + { + auto aRows = m_xLbPages->get_selected_rows(); + if (!aRows.empty()) + { + int nPosCP = m_xLbCustomPages->get_selected_index(); + if (nPosCP != -1) + ++nPosCP; + + for (auto i : aRows) + { + OUString aStr = m_xLbPages->get_text(i); + SdPage* pPage = rDoc.GetSdPage(i, PageKind::Standard); + OUString sId(weld::toId(pPage)); + m_xLbCustomPages->insert(nPosCP, aStr, &sId, nullptr, nullptr); + m_xLbCustomPages->select(nPosCP != -1 ? nPosCP : m_xLbCustomPages->n_children() - 1); + + if (nPosCP != -1) + ++nPosCP; + } + bModified = true; + } + } + else if (p == m_xBtnRemove.get()) + { + int nPos = m_xLbCustomPages->get_selected_index(); + if (nPos != -1) + { + m_xLbCustomPages->remove(nPos); + m_xLbCustomPages->select(nPos == 0 ? nPos : nPos - 1); + bModified = true; + } + } + else if( p == m_xEdtName.get() ) + { + bModified = true; + } + + CheckState(); +} + +/** + * Checks the page pointer of the Show since entries can be moved and copied + * by TreeLB. + */ +void SdDefineCustomShowDlg::CheckCustomShow() +{ + bool bDifferent = false; + + // compare count + size_t nCount = m_xLbCustomPages->n_children(); + if (rpCustomShow->PagesVector().size() != nCount) + { + rpCustomShow->PagesVector().clear(); + bDifferent = true; + } + + // compare page pointer + if( !bDifferent ) + { + size_t i = 0; + for (const auto& rpPage : rpCustomShow->PagesVector()) + { + SdPage* pPage = weld::fromId(m_xLbCustomPages->get_id(i)); + if (rpPage != pPage) + { + rpCustomShow->PagesVector().clear(); + bDifferent = true; + break; + } + + ++i; + } + } + + // set new page pointer + if( bDifferent ) + { + for (size_t i = 0; i < nCount; ++i) + { + SdPage* pPage = weld::fromId(m_xLbCustomPages->get_id(i)); + rpCustomShow->PagesVector().push_back(pPage); + } + bModified = true; + } + + // compare name and set name if necessary + OUString aStr( m_xEdtName->get_text() ); + if( rpCustomShow->GetName() != aStr ) + { + rpCustomShow->SetName( aStr ); + bModified = true; + } +} + +// OK-Hdl +IMPL_LINK_NOARG(SdDefineCustomShowDlg, OKHdl, weld::Button&, void) +{ + // check name... + bool bDifferent = true; + SdCustomShowList* pCustomShowList = rDoc.GetCustomShowList(); + if( pCustomShowList ) + { + OUString aName( m_xEdtName->get_text() ); + SdCustomShow* pCustomShow; + + tools::Long nPosToSelect = pCustomShowList->GetCurPos(); + for( pCustomShow = pCustomShowList->First(); + pCustomShow != nullptr; + pCustomShow = pCustomShowList->Next() ) + { + if( aName == pCustomShow->GetName() && aName != aOldName ) + bDifferent = false; + } + pCustomShowList->Seek( nPosToSelect ); + } + + if( bDifferent ) + { + CheckCustomShow(); + + m_xDialog->response(RET_OK); + } + else + { + std::unique_ptr xWarn(Application::CreateMessageDialog(m_xDialog.get(), + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_WARN_NAME_DUPLICATE))); + xWarn->run(); + m_xEdtName->grab_focus(); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/diactrl.cxx b/sd/source/ui/dlg/diactrl.cxx new file mode 100644 index 0000000000..d2dea8ad76 --- /dev/null +++ b/sd/source/ui/dlg/diactrl.cxx @@ -0,0 +1,186 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include + +using namespace ::com::sun::star; + +SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaPages, SfxUInt16Item ) + +namespace +{ + OUString format_number(int nSlides) + { + OUString aSlides(SdResId(STR_SLIDES, nSlides)); + return aSlides.replaceFirst("%1", OUString::number(nSlides)); + } +} + +// SdPagesField +SdPagesField::SdPagesField( vcl::Window* pParent, + uno::Reference< frame::XFrame > xFrame ) + : InterimItemWindow(pParent, "modules/simpress/ui/pagesfieldbox.ui", "PagesFieldBox") + , m_xWidget(m_xBuilder->weld_spin_button("pagesfield")) + , m_xFrame(std::move(xFrame)) +{ + InitControlBase(m_xWidget.get()); + + // set parameter of MetricFields + m_xWidget->set_digits(0); + m_xWidget->set_range(1, 15); + m_xWidget->set_increments(1, 5); + m_xWidget->connect_value_changed(LINK(this, SdPagesField, ModifyHdl)); + m_xWidget->connect_output(LINK(this, SdPagesField, OutputHdl)); + m_xWidget->connect_input(LINK(this, SdPagesField, spin_button_input)); + m_xWidget->connect_key_press(LINK(this, SdPagesField, KeyInputHdl)); + + auto width = std::max(m_xWidget->get_pixel_size(format_number(1)).Width(), + m_xWidget->get_pixel_size(format_number(15)).Width()); + int chars = ceil(width / m_xWidget->get_approximate_digit_width()); + m_xWidget->set_width_chars(chars); + + SetSizePixel(m_xWidget->get_preferred_size()); +} + +IMPL_LINK(SdPagesField, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + return ChildKeyInput(rKEvt); +} + +void SdPagesField::dispose() +{ + m_xWidget.reset(); + InterimItemWindow::dispose(); +} + +SdPagesField::~SdPagesField() +{ + disposeOnce(); +} + +void SdPagesField::set_sensitive(bool bSensitive) +{ + Enable(bSensitive); + m_xWidget->set_sensitive(bSensitive); + if (!bSensitive) + m_xWidget->set_text(""); +} + +void SdPagesField::UpdatePagesField( const SfxUInt16Item* pItem ) +{ + if (pItem) + m_xWidget->set_value(pItem->GetValue()); + else + m_xWidget->set_text(OUString()); +} + +IMPL_STATIC_LINK(SdPagesField, OutputHdl, weld::SpinButton&, rSpinButton, void) +{ + rSpinButton.set_text(format_number(rSpinButton.get_value())); +} + +IMPL_LINK(SdPagesField, spin_button_input, int*, result, bool) +{ + const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetLocaleDataWrapper(); + double fResult(0.0); + bool bRet = vcl::TextToValue(m_xWidget->get_text(), fResult, 0, m_xWidget->get_digits(), rLocaleData, FieldUnit::NONE); + if (bRet) + { + if (fResult > SAL_MAX_INT32) + fResult = SAL_MAX_INT32; + else if (fResult < SAL_MIN_INT32) + fResult = SAL_MIN_INT32; + *result = fResult; + } + return bRet; +} + +IMPL_LINK_NOARG(SdPagesField, ModifyHdl, weld::SpinButton&, void) +{ + SfxUInt16Item aItem(SID_PAGES_PER_ROW, m_xWidget->get_value()); + + uno::Any a; + aItem.QueryValue( a ); + uno::Sequence< beans::PropertyValue > aArgs{ comphelper::makePropertyValue("PagesPerRow", a) }; + SfxToolBoxControl::Dispatch( ::uno::Reference< ::frame::XDispatchProvider >( m_xFrame->getController(), ::uno::UNO_QUERY ), + ".uno:PagesPerRow", + aArgs ); +} + +SdTbxCtlDiaPages::SdTbxCtlDiaPages( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : + SfxToolBoxControl( nSlotId, nId, rTbx ) +{ +} + +SdTbxCtlDiaPages::~SdTbxCtlDiaPages() +{ +} + +void SdTbxCtlDiaPages::StateChangedAtToolBoxControl( sal_uInt16, + SfxItemState eState, const SfxPoolItem* pState ) +{ + SdPagesField* pFld = static_cast( GetToolBox().GetItemWindow( GetId() ) ); + DBG_ASSERT( pFld, "Window not found" ); + + if ( eState == SfxItemState::DISABLED ) + { + pFld->set_sensitive(false); + } + else + { + pFld->set_sensitive(true); + + const SfxUInt16Item* pItem = nullptr; + if ( eState == SfxItemState::DEFAULT ) + { + pItem = dynamic_cast< const SfxUInt16Item* >( pState ); + DBG_ASSERT( pItem, "sd::SdTbxCtlDiaPages::StateChanged(), wrong item type!" ); + } + + pFld->UpdatePagesField( pItem ); + } +} + +VclPtr SdTbxCtlDiaPages::CreateItemWindow( vcl::Window* pParent ) +{ + VclPtr pWindow = VclPtr::Create(pParent, m_xFrame); + pWindow->Show(); + + return pWindow; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/dlgchar.cxx b/sd/source/ui/dlg/dlgchar.cxx new file mode 100644 index 0000000000..074f5d7d13 --- /dev/null +++ b/sd/source/ui/dlg/dlgchar.cxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +/** + * Constructor of tab dialog: append pages to dialog + */ +SdCharDlg::SdCharDlg(weld::Window* pParent, const SfxItemSet* pAttr, + const SfxObjectShell* pDocShell) + : SfxTabDialogController(pParent, "modules/sdraw/ui/drawchardialog.ui", + "DrawCharDialog", pAttr) + , rDocShell(*pDocShell) +{ + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + + AddTabPage("RID_SVXPAGE_CHAR_NAME", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_NAME), nullptr); + AddTabPage("RID_SVXPAGE_CHAR_EFFECTS", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_EFFECTS), nullptr); + AddTabPage("RID_SVXPAGE_CHAR_POSITION", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_POSITION), nullptr); + AddTabPage("RID_SVXPAGE_BKG", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_BKG), nullptr); +} + +void SdCharDlg::PageCreated(const OUString& rId, SfxTabPage &rPage) +{ + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + if (rId == "RID_SVXPAGE_CHAR_NAME") + { + SvxFontListItem aItem(* static_cast( rDocShell.GetItem( SID_ATTR_CHAR_FONTLIST) ) ); + + aSet.Put (SvxFontListItem( aItem.GetFontList(), SID_ATTR_CHAR_FONTLIST)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_CHAR_EFFECTS") + { + // Opt in for character transparency. + aSet.Put(SfxUInt32Item(SID_FLAG_TYPE, SVX_ENABLE_CHAR_TRANSPARENCY)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_BKG") + { + aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR))); + rPage.PageCreated(aSet); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/dlgfield.cxx b/sd/source/ui/dlg/dlgfield.cxx new file mode 100644 index 0000000000..844008310b --- /dev/null +++ b/sd/source/ui/dlg/dlgfield.cxx @@ -0,0 +1,302 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +/** + * dialog to edit field commands + */ +SdModifyFieldDlg::SdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, SfxItemSet aSet) + : GenericDialogController(pWindow, "modules/simpress/ui/dlgfield.ui", "EditFieldsDialog") + , m_aInputSet(std::move(aSet)) + , m_pField(pInField) + , m_xRbtFix(m_xBuilder->weld_radio_button("fixedRB")) + , m_xRbtVar(m_xBuilder->weld_radio_button("varRB")) + , m_xLbLanguage(new SvxLanguageBox(m_xBuilder->weld_combo_box("languageLB"))) + , m_xLbFormat(m_xBuilder->weld_combo_box("formatLB")) +{ + m_xLbLanguage->SetLanguageList( SvxLanguageListFlags::ALL|SvxLanguageListFlags::ONLY_KNOWN, false ); + m_xLbLanguage->connect_changed(LINK(this, SdModifyFieldDlg, LanguageChangeHdl)); + FillControls(); +} + +SdModifyFieldDlg::~SdModifyFieldDlg() +{ +} + +/** + * Returns the new field, owned by caller. + * Returns NULL if nothing has changed. + */ +SvxFieldData* SdModifyFieldDlg::GetField() +{ + SvxFieldData* pNewField = nullptr; + + if( m_xRbtFix->get_state_changed_from_saved() || + m_xRbtVar->get_state_changed_from_saved() || + m_xLbFormat->get_value_changed_from_saved() ) + { + if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) ) + { + SvxDateType eType; + SvxDateFormat eFormat; + + if( m_xRbtFix->get_active() ) + eType = SvxDateType::Fix; + else + eType = SvxDateType::Var; + + eFormat = static_cast( m_xLbFormat->get_active() + 2 ); + + pNewField = new SvxDateField( *pDateField ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + } + else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) ) + { + SvxTimeType eType; + SvxTimeFormat eFormat; + + if( m_xRbtFix->get_active() ) + eType = SvxTimeType::Fix; + else + eType = SvxTimeType::Var; + + eFormat = static_cast( m_xLbFormat->get_active() + 2 ); + + pNewField = new SvxExtTimeField( *pTimeField ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + } + else if( dynamic_cast< const SvxExtFileField *>( m_pField ) != nullptr ) + { + SvxFileType eType; + SvxFileFormat eFormat; + + if( m_xRbtFix->get_active() ) + eType = SvxFileType::Fix; + else + eType = SvxFileType::Var; + + eFormat = static_cast( m_xLbFormat->get_active() ); + + ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell* >(SfxObjectShell::Current() ); + + if( pDocSh ) + { + OUString aName; + if( pDocSh->HasName() ) + aName = pDocSh->GetMedium()->GetName(); + + // Get current filename, not the one stored in the old field + pNewField = new SvxExtFileField( aName ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + } + } + else if( dynamic_cast< const SvxAuthorField *>( m_pField ) != nullptr ) + { + SvxAuthorType eType; + SvxAuthorFormat eFormat; + + if( m_xRbtFix->get_active() ) + eType = SvxAuthorType::Fix; + else + eType = SvxAuthorType::Var; + + eFormat = static_cast( m_xLbFormat->get_active() ); + + // Get current state of address, not the old one + SvtUserOptions aUserOptions; + pNewField = new SvxAuthorField( aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() ); + static_cast( pNewField )->SetType( eType ); + static_cast( pNewField )->SetFormat( eFormat ); + } + } + + return pNewField; +} + +void SdModifyFieldDlg::FillFormatList() +{ + LanguageType eLangType = m_xLbLanguage->get_active_id(); + + m_xLbFormat->clear(); + + if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) ) + { + SvxDateField aDateField( *pDateField ); + + //SvxDateFormat::AppDefault, // not used + //SvxDateFormat::System, // not used + m_xLbFormat->append_text( SdResId( STR_STANDARD_SMALL ) ); + m_xLbFormat->append_text( SdResId( STR_STANDARD_BIG ) ); + + SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter(); + aDateField.SetFormat( SvxDateFormat::A ); // 13.02.96 + m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) ); + aDateField.SetFormat( SvxDateFormat::B ); // 13.02.1996 + m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) ); + aDateField.SetFormat( SvxDateFormat::C ); // 13.Feb 1996 + m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) ); + aDateField.SetFormat( SvxDateFormat::D ); // 13.February 1996 + m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) ); + aDateField.SetFormat( SvxDateFormat::E ); // Tue, 13.February 1996 + m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) ); + aDateField.SetFormat( SvxDateFormat::F ); // Tuesday, 13.February 1996 + m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) ); + + m_xLbFormat->set_active( static_cast(pDateField->GetFormat()) - 2 ); + } + else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) ) + { + SvxExtTimeField aTimeField( *pTimeField ); + + //SvxTimeFormat::AppDefault, // not used + //SvxTimeFormat::System, // not used + m_xLbFormat->append_text( SdResId( STR_STANDARD_NORMAL ) ); + + SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter(); + aTimeField.SetFormat( SvxTimeFormat::HH24_MM ); // 13:49 + m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) ); + aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS ); // 13:49:38 + m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) ); + aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS_00 ); // 13:49:38.78 + m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) ); + aTimeField.SetFormat( SvxTimeFormat::HH12_MM ); // 01:49 + m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) ); + aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS ); // 01:49:38 + m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) ); + aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS_00 ); // 01:49:38.78 + m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) ); + //SvxTimeFormat::HH12_MM_AMPM, // 01:49 PM + //SvxTimeFormat::HH12_MM_SS_AMPM, // 01:49:38 PM + //SvxTimeFormat::HH12_MM_SS_00_AMPM // 01:49:38.78 PM + + m_xLbFormat->set_active( static_cast(pTimeField->GetFormat()) - 2 ); + } + else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) ) + { + m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_NAME_EXT ) ); + m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_FULLPATH ) ); + m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_PATH ) ); + m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_NAME ) ); + + m_xLbFormat->set_active( static_cast( pFileField->GetFormat() ) ); + } + else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) ) + { + SvxAuthorField aAuthorField( *pAuthorField ); + + for( sal_uInt16 i = 0; i < 4; i++ ) + { + aAuthorField.SetFormat( static_cast(i) ); + m_xLbFormat->append_text( aAuthorField.GetFormatted() ); + } + + m_xLbFormat->set_active( static_cast( pAuthorField->GetFormat() ) ); + + } + +} + +void SdModifyFieldDlg::FillControls() +{ + m_xLbFormat->clear(); + + if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) ) + { + if( pDateField->GetType() == SvxDateType::Fix ) + m_xRbtFix->set_active(true); + else + m_xRbtVar->set_active(true); + } + else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) ) + { + if( pTimeField->GetType() == SvxTimeType::Fix ) + m_xRbtFix->set_active(true); + else + m_xRbtVar->set_active(true); + } + else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) ) + { + if( pFileField->GetType() == SvxFileType::Fix ) + m_xRbtFix->set_active(true); + else + m_xRbtVar->set_active(true); + } + else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) ) + { + if( pAuthorField->GetType() == SvxAuthorType::Fix ) + m_xRbtFix->set_active(true); + else + m_xRbtVar->set_active(true); + } + m_xRbtFix->save_state(); + m_xRbtVar->save_state(); + + if( const SvxLanguageItem* pItem = m_aInputSet.GetItemIfSet(EE_CHAR_LANGUAGE ) ) + m_xLbLanguage->set_active_id(pItem->GetLanguage()); + + m_xLbLanguage->save_active_id(); + + FillFormatList(); + m_xLbFormat->save_value(); +} + +IMPL_LINK_NOARG(SdModifyFieldDlg, LanguageChangeHdl, weld::ComboBox&, void) +{ + FillFormatList(); +} + +SfxItemSet SdModifyFieldDlg::GetItemSet() const +{ + SfxItemSet aOutput( *m_aInputSet.GetPool(), svl::Items ); + + if (m_xLbLanguage->get_active_id_changed_from_saved()) + { + LanguageType eLangType = m_xLbLanguage->get_active_id(); + SvxLanguageItem aItem( eLangType, EE_CHAR_LANGUAGE ); + aOutput.Put( aItem ); + + SvxLanguageItem aItemCJK( eLangType, EE_CHAR_LANGUAGE_CJK ); + aOutput.Put( aItemCJK ); + + SvxLanguageItem aItemCTL( eLangType, EE_CHAR_LANGUAGE_CTL ); + aOutput.Put( aItemCTL ); + } + + return aOutput; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/dlgolbul.cxx b/sd/source/ui/dlg/dlgolbul.cxx new file mode 100644 index 0000000000..edc867785b --- /dev/null +++ b/sd/source/ui/dlg/dlgolbul.cxx @@ -0,0 +1,172 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd { + +/** + * Constructor of tab dialog: append pages to the dialog + */ +OutlineBulletDlg::OutlineBulletDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) + : SfxTabDialogController(pParent, "modules/sdraw/ui/bulletsandnumbering.ui", "BulletsAndNumberingDialog") + , m_aInputSet(*pAttr) + , m_bTitle(false) + , m_pSdView(pView) +{ + m_aInputSet.MergeRange(SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL); + m_aInputSet.Put(*pAttr); + + m_xOutputSet.reset( new SfxItemSet( *pAttr ) ); + m_xOutputSet->ClearItem(); + + bool bOutliner = false; + + // special treatment if a title object is selected + if (pView) + { + const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + for(size_t nNum = 0; nNum < nCount; ++nNum) + { + SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj(); + if( pObj->GetObjInventor() == SdrInventor::Default ) + { + switch(pObj->GetObjIdentifier()) + { + case SdrObjKind::TitleText: + m_bTitle = true; + break; + case SdrObjKind::OutlineText: + bOutliner = true; + break; + default: + break; + } + } + } + } + + if( SfxItemState::SET != m_aInputSet.GetItemState(EE_PARA_NUMBULLET)) + { + const SvxNumBulletItem *pItem = nullptr; + if(bOutliner) + { + SfxStyleSheetBasePool* pSSPool = pView->GetDocSh()->GetStyleSheetPool(); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( STR_LAYOUT_OUTLINE + " 1", SfxStyleFamily::Pseudo); + if( pFirstStyleSheet ) + pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false); + } + + if( pItem == nullptr ) + pItem = m_aInputSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET); + + DBG_ASSERT( pItem, "No EE_PARA_NUMBULLET in Pool! [CL]" ); + + m_aInputSet.Put(pItem->CloneSetWhich(EE_PARA_NUMBULLET)); + } + + if (m_bTitle && m_aInputSet.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET ) + { + const SvxNumBulletItem* pItem = m_aInputSet.GetItem(EE_PARA_NUMBULLET); + const SvxNumRule& rRule = pItem->GetNumRule(); + SvxNumRule aNewRule( rRule ); + aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS ); + + SvxNumBulletItem aNewItem( std::move(aNewRule), EE_PARA_NUMBULLET ); + m_aInputSet.Put(aNewItem); + } + + SetInputSet(&m_aInputSet); + + if (m_bTitle) + RemoveTabPage("singlenum"); + + AddTabPage("customize", RID_SVXPAGE_NUM_OPTIONS); + AddTabPage("position", RID_SVXPAGE_NUM_POSITION); +} + +OutlineBulletDlg::~OutlineBulletDlg() +{ +} + +void OutlineBulletDlg::PageCreated(const OUString& rId, SfxTabPage &rPage) +{ + if (!m_pSdView) + return; + if (rId == "customize") + { + FieldUnit eMetric = m_pSdView->GetDoc().GetUIUnit(); + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + aSet.Put ( SfxUInt16Item(SID_METRIC_ITEM,static_cast(eMetric))); + rPage.PageCreated(aSet); + } + else if (rId == "position") + { + FieldUnit eMetric = m_pSdView->GetDoc().GetUIUnit(); + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + aSet.Put ( SfxUInt16Item(SID_METRIC_ITEM,static_cast(eMetric))); + rPage.PageCreated(aSet); + } +} + +const SfxItemSet* OutlineBulletDlg::GetBulletOutputItemSet() const +{ + SfxItemSet aSet(*GetOutputItemSet()); + m_xOutputSet->Put(aSet); + + const SfxPoolItem *pItem = nullptr; + if( SfxItemState::SET == m_xOutputSet->GetItemState(m_xOutputSet->GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE), false, &pItem )) + { + SdBulletMapper::MapFontsInNumRule(const_cast(static_cast(pItem)->GetNumRule()), *m_xOutputSet); + // #i35937 - removed EE_PARA_BULLETSTATE setting + } + + if (m_bTitle && m_xOutputSet->GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET) + { + const SvxNumBulletItem* pBulletItem = m_xOutputSet->GetItem(EE_PARA_NUMBULLET); + SvxNumRule& rRule = const_cast(pBulletItem->GetNumRule()); + rRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS, false ); + } + + return m_xOutputSet.get(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/dlgpage.cxx b/sd/source/ui/dlg/dlgpage.cxx new file mode 100644 index 0000000000..833328659b --- /dev/null +++ b/sd/source/ui/dlg/dlgpage.cxx @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +/** + * Constructor of tab dialog: appends pages to the dialog + */ +SdPageDlg::SdPageDlg(SfxObjectShell const* pDocSh, weld::Window* pParent, const SfxItemSet* pAttr, + bool bAreaPage, bool bIsImpressDoc) + : SfxTabDialogController(pParent, "modules/sdraw/ui/drawpagedialog.ui", "DrawPageDialog", pAttr) + , mbIsImpressDoc(bIsImpressDoc) +{ + SvxColorListItem const* pColorListItem = pDocSh->GetItem(SID_COLOR_TABLE); + SvxGradientListItem const* pGradientListItem = pDocSh->GetItem(SID_GRADIENT_LIST); + SvxBitmapListItem const* pBitmapListItem = pDocSh->GetItem(SID_BITMAP_LIST); + SvxPatternListItem const* pPatternListItem = pDocSh->GetItem(SID_PATTERN_LIST); + SvxHatchListItem const* pHatchListItem = pDocSh->GetItem(SID_HATCH_LIST); + + mpColorList = pColorListItem->GetColorList(); + mpGradientList = pGradientListItem->GetGradientList(); + mpHatchingList = pHatchListItem->GetHatchList(); + mpBitmapList = pBitmapListItem->GetBitmapList(); + mpPatternList = pPatternListItem->GetPatternList(); + + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + + AddTabPage("RID_SVXPAGE_PAGE", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_PAGE), nullptr); + AddTabPage("RID_SVXPAGE_AREA", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_AREA), nullptr); + AddTabPage("RID_SVXPAGE_TRANSPARENCE", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_TRANSPARENCE), + nullptr); + + if (!bAreaPage) // I have to add the page before I remove it ! + { + RemoveTabPage("RID_SVXPAGE_AREA"); + RemoveTabPage("RID_SVXPAGE_TRANSPARENCE"); + } + + if (mbIsImpressDoc) + { + set_title(SdResId(STR_SLIDE_SETUP_TITLE)); + m_xTabCtrl->set_tab_label_text("RID_SVXPAGE_PAGE", SdResId(STR_SLIDE_NAME)); + } +} + +void SdPageDlg::PageCreated(const OUString& rId, SfxTabPage& rPage) +{ + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + if (rId == "RID_SVXPAGE_PAGE") + { + aSet.Put(SfxUInt16Item(SID_ENUM_PAGE_MODE, SVX_PAGE_MODE_PRESENTATION)); + aSet.Put(SfxUInt16Item(SID_PAPER_START, PAPER_A0)); + aSet.Put(SfxUInt16Item(SID_PAPER_END, PAPER_E)); + + if (mbIsImpressDoc) + aSet.Put(SfxBoolItem(SID_IMPRESS_DOC, true)); + + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_AREA") + { + aSet.Put(SvxColorListItem(mpColorList, SID_COLOR_TABLE)); + aSet.Put(SvxGradientListItem(mpGradientList, SID_GRADIENT_LIST)); + aSet.Put(SvxHatchListItem(mpHatchingList, SID_HATCH_LIST)); + aSet.Put(SvxBitmapListItem(mpBitmapList, SID_BITMAP_LIST)); + aSet.Put(SvxPatternListItem(mpPatternList, SID_PATTERN_LIST)); + aSet.Put(SfxUInt16Item(SID_PAGE_TYPE, 0)); + aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1)); + aSet.Put(SfxUInt16Item(SID_TABPAGE_POS, 0)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_TRANSPARENCE") + { + aSet.Put(SfxUInt16Item(SID_PAGE_TYPE, 0)); + aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1)); + rPage.PageCreated(aSet); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/dlgsnap.cxx b/sd/source/ui/dlg/dlgsnap.cxx new file mode 100644 index 0000000000..9f16a5fa53 --- /dev/null +++ b/sd/source/ui/dlg/dlgsnap.cxx @@ -0,0 +1,185 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/** + * dialog to adjust grid (scarcely ESO!) + */ +SdSnapLineDlg::SdSnapLineDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View const * pView) + : GenericDialogController(pWindow, "modules/sdraw/ui/dlgsnap.ui", "SnapObjectDialog") + , aUIScale(pView->GetDoc().GetUIScale()) + , m_xFtX(m_xBuilder->weld_label("xlabel")) + , m_xMtrFldX(m_xBuilder->weld_metric_spin_button("x", FieldUnit::CM)) + , m_xFtY(m_xBuilder->weld_label("ylabel")) + , m_xMtrFldY(m_xBuilder->weld_metric_spin_button("y", FieldUnit::CM)) + , m_xRadioGroup(m_xBuilder->weld_widget("radiogroup")) + , m_xRbPoint(m_xBuilder->weld_radio_button("point")) + , m_xRbVert(m_xBuilder->weld_radio_button("vert")) + , m_xRbHorz(m_xBuilder->weld_radio_button("horz")) + , m_xBtnDelete(m_xBuilder->weld_button("delete")) +{ + m_xRbHorz->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl)); + m_xRbVert->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl)); + m_xRbPoint->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl)); + + m_xBtnDelete->connect_clicked(LINK(this, SdSnapLineDlg, ClickHdl)); + + FieldUnit eUIUnit = pView->GetDoc().GetUIUnit(); + SetFieldUnit(*m_xMtrFldX, eUIUnit, true); + SetFieldUnit(*m_xMtrFldY, eUIUnit, true); + + // get WorkArea + ::tools::Rectangle aWorkArea = pView->GetWorkArea(); + + // determine PoolUnit + SfxItemPool* pPool = rInAttrs.GetPool(); + DBG_ASSERT( pPool, "Where's the Pool?" ); + MapUnit ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH ); + + // #i48497# Consider page origin + SdrPageView* pPV = pView->GetSdrPageView(); + Point aLeftTop(aWorkArea.Left()+1, aWorkArea.Top()+1); + pPV->LogicToPagePos(aLeftTop); + Point aRightBottom(aWorkArea.Right()-2, aWorkArea.Bottom()-2); + pPV->LogicToPagePos(aRightBottom); + + // determine max and min values depending on + // WorkArea, PoolUnit and FieldUnit: + auto const map = [ePoolUnit](std::unique_ptr const & msb, tools::Long value) { + auto const n1 = OutputDevice::LogicToLogic(value, ePoolUnit, MapUnit::Map100thMM); + auto const n2 = msb->normalize(n1); + auto const n3 = msb->convert_value_from(n2, FieldUnit::MM_100TH); + auto const n4 = msb->convert_value_to(n3, FieldUnit::NONE); + return n4; + }; + m_xMtrFldX->set_range(map(m_xMtrFldX, sal_Int32(aLeftTop.X() / aUIScale)), + map(m_xMtrFldX, sal_Int32(aRightBottom.X() / aUIScale)), + FieldUnit::NONE); + m_xMtrFldY->set_range(map(m_xMtrFldY, sal_Int32(aLeftTop.Y() / aUIScale)), + map(m_xMtrFldY, sal_Int32(aRightBottom.Y() / aUIScale)), + FieldUnit::NONE); + + // set values + nXValue = rInAttrs.Get(ATTR_SNAPLINE_X).GetValue(); + nYValue = rInAttrs.Get(ATTR_SNAPLINE_Y).GetValue(); + nXValue = sal_Int32(nXValue / aUIScale); + nYValue = sal_Int32(nYValue / aUIScale); + SetMetricValue(*m_xMtrFldX, nXValue, MapUnit::Map100thMM); + SetMetricValue(*m_xMtrFldY, nYValue, MapUnit::Map100thMM); + + m_xRbPoint->set_active(true); +} + +SdSnapLineDlg::~SdSnapLineDlg() +{ +} + +/** + * fills provided item sets with dialog box attributes + */ +IMPL_LINK(SdSnapLineDlg, ToggleHdl, weld::Toggleable&, rBtn, void) +{ + if (!rBtn.get_active()) + return; + if (m_xRbPoint->get_active()) + SetInputFields(true, true); + else if (m_xRbHorz->get_active()) + SetInputFields(false, true); + else if (m_xRbVert->get_active()) + SetInputFields(true, false); +} + +IMPL_LINK( SdSnapLineDlg, ClickHdl, weld::Button&, rBtn, void ) +{ + if (&rBtn == m_xBtnDelete.get()) + m_xDialog->response(RET_SNAP_DELETE); +} + +/** + * fills provided item sets with dialog box attributes + */ +void SdSnapLineDlg::GetAttr(SfxItemSet& rOutAttrs) +{ + SnapKind eKind; + + if (m_xRbHorz->get_active()) eKind = SnapKind::Horizontal; + else if (m_xRbVert->get_active()) eKind = SnapKind::Vertical; + else eKind = SnapKind::Point; + + nXValue = sal_Int32(GetCoreValue(*m_xMtrFldX, MapUnit::Map100thMM) * aUIScale); + nYValue = sal_Int32(GetCoreValue(*m_xMtrFldY, MapUnit::Map100thMM) * aUIScale); + + rOutAttrs.Put(SfxUInt16Item(ATTR_SNAPLINE_KIND, static_cast(eKind))); + rOutAttrs.Put(SfxInt32Item(ATTR_SNAPLINE_X, nXValue)); + rOutAttrs.Put(SfxInt32Item(ATTR_SNAPLINE_Y, nYValue)); +} + +void SdSnapLineDlg::HideRadioGroup() +{ + m_xRadioGroup->hide(); +} + +/** + * disable X or Y input fields + */ +void SdSnapLineDlg::SetInputFields(bool bEnableX, bool bEnableY) +{ + if ( bEnableX ) + { + if (!m_xMtrFldX->get_sensitive()) + m_xMtrFldX->set_value(nXValue, FieldUnit::NONE); + m_xMtrFldX->set_sensitive(true); + m_xFtX->set_sensitive(true); + } + else if (m_xMtrFldX->get_sensitive()) + { + nXValue = m_xMtrFldX->get_value(FieldUnit::NONE); + m_xMtrFldX->set_text(OUString()); + m_xMtrFldX->set_sensitive(false); + m_xFtX->set_sensitive(false); + } + if ( bEnableY ) + { + if (!m_xMtrFldY->get_sensitive()) + m_xMtrFldY->set_value(nYValue, FieldUnit::NONE); + m_xMtrFldY->set_sensitive(true); + m_xFtY->set_sensitive(true); + } + else if (m_xMtrFldY->get_sensitive()) + { + nYValue = m_xMtrFldY->get_value(FieldUnit::NONE); + m_xMtrFldY->set_text(OUString()); + m_xMtrFldY->set_sensitive(false); + m_xFtY->set_sensitive(false); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/filedlg.cxx b/sd/source/ui/dlg/filedlg.cxx new file mode 100644 index 0000000000..b2087c408a --- /dev/null +++ b/sd/source/ui/dlg/filedlg.cxx @@ -0,0 +1,267 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ----------- SdFileDialog_Imp --------------------------- + +class SdFileDialog_Imp : public sfx2::FileDialogHelper +{ +private: + friend class SdOpenSoundFileDialog; + + css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess; + + css::uno::Reference< css::media::XPlayer > mxPlayer; + ImplSVEvent * mnPlaySoundEvent; + bool mbLabelPlaying; + Idle maUpdateIdle; + + DECL_LINK( PlayMusicHdl, void *, void ); + DECL_LINK( IsMusicStoppedHdl, Timer *, void ); + +public: + explicit SdFileDialog_Imp(weld::Window *pParent); + virtual ~SdFileDialog_Imp() override; + + // overwritten from FileDialogHelper, to receive user feedback + virtual void ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent ) override; +}; + +void SdFileDialog_Imp::ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent ) +{ + SolarMutexGuard aGuard; + + switch( aEvent.ElementId ) + { + case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY: + if( mxControlAccess.is() ) + { + if( mnPlaySoundEvent ) + Application::RemoveUserEvent( mnPlaySoundEvent ); + + mnPlaySoundEvent = Application::PostUserEvent( LINK( this, SdFileDialog_Imp, PlayMusicHdl ) ); + } + break; + } +} + +IMPL_LINK_NOARG(SdFileDialog_Imp, PlayMusicHdl, void*, void) +{ + maUpdateIdle.Stop(); + mnPlaySoundEvent = nullptr; + + if (mxPlayer.is()) + { + if (mxPlayer->isPlaying()) + mxPlayer->stop(); + mxPlayer.clear(); + } + +#if HAVE_FEATURE_AVMEDIA + if( mbLabelPlaying ) + { + try + { + mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, + SdResId( STR_PLAY ) ); + mbLabelPlaying = false; + } + catch(const css::lang::IllegalArgumentException&) + { +#ifdef DBG_UTIL + OSL_FAIL( "Cannot access play button" ); +#endif + } + } + else + { + OUString aUrl( GetPath() ); + if ( !aUrl.isEmpty() ) + { + try + { + mxPlayer.set( avmedia::MediaWindow::createPlayer( aUrl, "" ), css::uno::UNO_SET_THROW ); + mxPlayer->start(); + maUpdateIdle.Start(); + } + catch (const css::uno::Exception&) + { + mxPlayer.clear(); + } + + if (mxPlayer.is()) + { + try + { + mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, + SdResId( STR_STOP ) ); + mbLabelPlaying = true; + } + catch (const css::lang::IllegalArgumentException&) + { +#ifdef DBG_UTIL + OSL_FAIL( "Cannot access play button" ); +#endif + } + } + } + } +#endif +} + +IMPL_LINK_NOARG(SdFileDialog_Imp, IsMusicStoppedHdl, Timer *, void) +{ + SolarMutexGuard aGuard; + + if (mxPlayer.is() && mxPlayer->isPlaying() && + mxPlayer->getMediaTime() < mxPlayer->getDuration()) + { + maUpdateIdle.Start(); + return; + } + + if( !mxControlAccess.is() ) + return; + + try + { + mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, + SdResId( STR_PLAY ) ); + mbLabelPlaying = false; + } + catch (const css::lang::IllegalArgumentException&) + { +#ifdef DBG_UTIL + OSL_FAIL( "Cannot access play button" ); +#endif + } +} + +SdFileDialog_Imp::SdFileDialog_Imp(weld::Window* pParent) + : FileDialogHelper(css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PLAY, FileDialogFlags::NONE, pParent) + , mnPlaySoundEvent(nullptr) + , mbLabelPlaying(false) + , maUpdateIdle( "SdFileDialog_Imp maUpdateIdle" ) +{ + maUpdateIdle.SetInvokeHandler(LINK(this, SdFileDialog_Imp, IsMusicStoppedHdl)); + + css::uno::Reference < css::ui::dialogs::XFilePicker3 > xFileDlg = GetFilePicker(); + + // get the control access + mxControlAccess.set( xFileDlg, css::uno::UNO_QUERY ); + + if( !mxControlAccess.is() ) + return; + + try + { + mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, + SdResId( STR_PLAY ) ); + } + catch (const css::lang::IllegalArgumentException&) + { +#ifdef DBG_UTIL + OSL_FAIL( "Cannot set play button label" ); +#endif + } +} + +SdFileDialog_Imp::~SdFileDialog_Imp() +{ + if( mnPlaySoundEvent ) + Application::RemoveUserEvent( mnPlaySoundEvent ); +} + +// ----------- SdOpenSoundFileDialog ----------------------- + +// these are simple forwarders +SdOpenSoundFileDialog::SdOpenSoundFileDialog(weld::Window *pParent) + : mpImpl(new SdFileDialog_Imp(pParent)) +{ + OUString aDescr = SdResId(STR_ALL_FILES); + mpImpl->AddFilter( aDescr, "*.*"); + mpImpl->SetContext(sfx2::FileDialogHelper::DrawImpressOpenSound); + + // setup filter +#if defined UNX + aDescr = SdResId(STR_AU_FILE); + mpImpl->AddFilter( aDescr, "*.au;*.snd"); + aDescr = SdResId(STR_VOC_FILE); + mpImpl->AddFilter( aDescr, "*.voc"); + aDescr = SdResId(STR_WAV_FILE); + mpImpl->AddFilter( aDescr, "*.wav"); + aDescr = SdResId(STR_AIFF_FILE); + mpImpl->AddFilter( aDescr, "*.aiff"); + aDescr = SdResId(STR_SVX_FILE); + mpImpl->AddFilter( aDescr, "*.svx"); +#else + aDescr = SdResId(STR_WAV_FILE); + mpImpl->AddFilter( aDescr, "*.wav;*.mp3;*.ogg" ); + aDescr = SdResId(STR_MIDI_FILE); + mpImpl->AddFilter( aDescr, "*.mid" ); +#endif +} + +SdOpenSoundFileDialog::~SdOpenSoundFileDialog() +{ +} + +ErrCode SdOpenSoundFileDialog::Execute() +{ + return mpImpl->Execute(); +} + +OUString SdOpenSoundFileDialog::GetPath() const +{ + return mpImpl->GetPath(); +} + +void SdOpenSoundFileDialog::SetPath( const OUString& rPath ) +{ + mpImpl->SetDisplayDirectory( rPath ); +} + +// WIP, please don't remove, dear Clang plugins +bool SdOpenSoundFileDialog::IsInsertAsLinkSelected() const +{ + bool bInsertAsLinkSelected = false; + css::uno::Reference const xFilePicker(mpImpl->GetFilePicker()); + css::uno::Reference const xControlAccess(xFilePicker, css::uno::UNO_QUERY_THROW); + xControlAccess->getValue(css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0) >>= bInsertAsLinkSelected; + return bInsertAsLinkSelected; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/gluectrl.cxx b/sd/source/ui/dlg/gluectrl.cxx new file mode 100644 index 0000000000..a6baf3e920 --- /dev/null +++ b/sd/source/ui/dlg/gluectrl.cxx @@ -0,0 +1,200 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::frame; + +// at the moment, Joe only supports the methods specified below +#define ESCDIR_COUNT 5 +const SdrEscapeDirection aEscDirArray[] = +{ + SdrEscapeDirection::SMART, + SdrEscapeDirection::LEFT, + SdrEscapeDirection::RIGHT, + SdrEscapeDirection::TOP, + SdrEscapeDirection::BOTTOM +}; + +SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlGlueEscDir, SfxUInt16Item ) + +/** + * Constructor for gluepoint escape direction Listbox + */ +GlueEscDirLB::GlueEscDirLB(vcl::Window* pParent, const Reference& rFrame) + : InterimItemWindow(pParent, "modules/simpress/ui/gluebox.ui", "GlueBox") + , m_xFrame(rFrame) + , m_xWidget(m_xBuilder->weld_combo_box("gluetype")) +{ + InitControlBase(m_xWidget.get()); + + Fill(); + + m_xWidget->connect_changed(LINK(this, GlueEscDirLB, SelectHdl)); + m_xWidget->connect_key_press(LINK(this, GlueEscDirLB, KeyInputHdl)); + + SetSizePixel(m_xWidget->get_preferred_size()); + + Show(); +} + +void GlueEscDirLB::dispose() +{ + m_xWidget.reset(); + InterimItemWindow::dispose(); +} + +GlueEscDirLB::~GlueEscDirLB() +{ + disposeOnce(); +} + +void GlueEscDirLB::set_sensitive(bool bSensitive) +{ + Enable(bSensitive); + m_xWidget->set_sensitive(bSensitive); +} + +IMPL_LINK(GlueEscDirLB, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + return ChildKeyInput(rKEvt); +} + +/** + * Determines the escape direction and sends the corresponding slot + */ +IMPL_LINK(GlueEscDirLB, SelectHdl, weld::ComboBox&, rBox, void) +{ + sal_Int32 nPos = rBox.get_active(); + SfxUInt16Item aItem( SID_GLUE_ESCDIR, static_cast(aEscDirArray[ nPos ]) ); + + if ( m_xFrame.is() ) + { + Any a; + aItem.QueryValue( a ); + Sequence< PropertyValue > aArgs{ comphelper::makePropertyValue("GlueEscapeDirection", a) }; + SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ), + ".uno:GlueEscapeDirection", + aArgs ); + } +} + +/** + * Fills the Listbox with strings + */ +void GlueEscDirLB::Fill() +{ + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_SMART ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_LEFT ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_RIGHT ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_TOP ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_BOTTOM ) ); + /* + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_LO ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_LU ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_RO ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_RU ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_HORZ ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_VERT ) ); + m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_ALL ) ); + */ +} + +/** + * Constructor for gluepoint escape direction toolbox control + */ +SdTbxCtlGlueEscDir::SdTbxCtlGlueEscDir( + sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : + SfxToolBoxControl( nSlotId, nId, rTbx ) +{ +} + +/** + * Represents state in the listbox of the controller + */ +void SdTbxCtlGlueEscDir::StateChangedAtToolBoxControl( sal_uInt16 nSId, + SfxItemState eState, const SfxPoolItem* pState ) +{ + if( eState == SfxItemState::DEFAULT ) + { + GlueEscDirLB* pGlueEscDirLB = static_cast ( GetToolBox(). + GetItemWindow( GetId() ) ); + if( pGlueEscDirLB ) + { + if( pState ) + { + pGlueEscDirLB->set_sensitive(true); + if ( IsInvalidItem( pState ) ) + { + pGlueEscDirLB->set_active(-1); + } + else + { + SdrEscapeDirection nEscDir = static_cast(static_cast( pState )->GetValue()); + pGlueEscDirLB->set_active( GetEscDirPos( nEscDir ) ); + } + } + else + { + pGlueEscDirLB->set_sensitive(false); + pGlueEscDirLB->set_active(-1); + } + } + } + + SfxToolBoxControl::StateChangedAtToolBoxControl( nSId, eState, pState ); +} + +VclPtr SdTbxCtlGlueEscDir::CreateItemWindow( vcl::Window *pParent ) +{ + if( GetSlotId() == SID_GLUE_ESCDIR ) + return VclPtr::Create( pParent, m_xFrame ).get(); + + return VclPtr(); +} + +/** + * Returns position in the array for EscDir (Mapping for Listbox) + */ +sal_uInt16 SdTbxCtlGlueEscDir::GetEscDirPos( SdrEscapeDirection nEscDir ) +{ + for( sal_uInt16 i = 0; i < ESCDIR_COUNT; i++ ) + { + if( aEscDirArray[ i ] == nEscDir ) + return i; + } + return 99; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/headerfooterdlg.cxx b/sd/source/ui/dlg/headerfooterdlg.cxx new file mode 100644 index 0000000000..8401ec38cd --- /dev/null +++ b/sd/source/ui/dlg/headerfooterdlg.cxx @@ -0,0 +1,759 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// preview control for presentation layout +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +namespace sd +{ + +namespace { + +class PresLayoutPreview : public weld::CustomWidgetController +{ +private: + SdPage* mpMaster; + HeaderFooterSettings maSettings; + Size maPageSize; + ::tools::Rectangle maOutRect; + +private: + void Paint(vcl::RenderContext& rRenderContext, SdrTextObj const * pObj, bool bVisible, bool bDotted = false); + +public: + explicit PresLayoutPreview(); + + virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; + + virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override; + + void init(SdPage* pMaster); + void update(HeaderFooterSettings const & rSettings); +}; + +} + +} + +// tab page for slide & header'n'notes + +namespace sd +{ + +const int nDateTimeFormatsCount = 12; + +namespace { + +struct DateAndTimeFormat { + SvxDateFormat meDateFormat; + SvxTimeFormat meTimeFormat; +}; + +} + +DateAndTimeFormat const nDateTimeFormats[nDateTimeFormatsCount] = +{ + { SvxDateFormat::A, SvxTimeFormat::AppDefault }, + { SvxDateFormat::B, SvxTimeFormat::AppDefault }, + { SvxDateFormat::C, SvxTimeFormat::AppDefault }, + { SvxDateFormat::D, SvxTimeFormat::AppDefault }, + { SvxDateFormat::E, SvxTimeFormat::AppDefault }, + { SvxDateFormat::F, SvxTimeFormat::AppDefault }, + + { SvxDateFormat::A, SvxTimeFormat::HH24_MM }, + { SvxDateFormat::A, SvxTimeFormat::HH12_MM }, + + { SvxDateFormat::AppDefault, SvxTimeFormat::HH24_MM }, + { SvxDateFormat::AppDefault, SvxTimeFormat::HH24_MM_SS }, + + { SvxDateFormat::AppDefault, SvxTimeFormat::HH12_MM }, + { SvxDateFormat::AppDefault, SvxTimeFormat::HH12_MM_SS }, +}; + +class HeaderFooterTabPage +{ +private: + SdDrawDocument* mpDoc; + LanguageType meOldLanguage; + bool mbHandoutMode; + + std::unique_ptr mxBuilder; + std::unique_ptr mxContainer; + std::unique_ptr mxFTIncludeOn; + std::unique_ptr mxCBHeader; + std::unique_ptr mxHeaderBox; + std::unique_ptr mxTBHeader; + std::unique_ptr mxCBDateTime; + std::unique_ptr mxRBDateTimeFixed; + std::unique_ptr mxRBDateTimeAutomatic; + std::unique_ptr mxTBDateTimeFixed; + std::unique_ptr mxCBDateTimeFormat; + std::unique_ptr mxFTDateTimeLanguage; + std::unique_ptr mxCBDateTimeLanguage; + std::unique_ptr mxCBFooter; + std::unique_ptr mxFooterBox; + std::unique_ptr mxTBFooter; + std::unique_ptr mxCBSlideNumber; + std::unique_ptr mxCBNotOnTitle; + std::unique_ptr mxReplacementA; + std::unique_ptr mxReplacementB; + std::unique_ptr mxCTPreview; + std::unique_ptr mxCTPreviewWin; + + + DECL_LINK( UpdateOnToggleHdl, weld::Toggleable&, void ); + DECL_LINK( LanguageChangeHdl, weld::ComboBox&, void ); + + void FillFormatList(sal_Int32 nSelectedPos); + void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet ); + void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage ); + +public: + HeaderFooterTabPage(weld::Container* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode ); + + void init( const HeaderFooterSettings& rSettings, bool bNotOnTitle ); + void getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle ); + void update(); +}; + +} + +using namespace ::sd; + +HeaderFooterDialog::HeaderFooterDialog(ViewShell* pViewShell, weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) + : GenericDialogController(pParent, "modules/simpress/ui/headerfooterdialog.ui", "HeaderFooterDialog") + , mpDoc( pDoc ) + , mpCurrentPage( pCurrentPage ) + , mpViewShell( pViewShell ) + , mxTabCtrl(m_xBuilder->weld_notebook("tabcontrol")) + , mxPBApplyToAll(m_xBuilder->weld_button("apply_all")) + , mxPBApply(m_xBuilder->weld_button("apply")) + , mxPBCancel(m_xBuilder->weld_button("cancel")) +{ + SdPage* pSlide; + SdPage* pNotes; + if( pCurrentPage->GetPageKind() == PageKind::Standard ) + { + pSlide = pCurrentPage; + pNotes = static_cast(pDoc->GetPage( pCurrentPage->GetPageNum() + 1 )); + } + else if( pCurrentPage->GetPageKind() == PageKind::Notes ) + { + pNotes = pCurrentPage; + pSlide = static_cast(pDoc->GetPage( pCurrentPage->GetPageNum() -1 )); + mpCurrentPage = pSlide; + } + else + { + // handout + pSlide = pDoc->GetSdPage( 0, PageKind::Standard ); + pNotes = pDoc->GetSdPage( 0, PageKind::Notes ); + mpCurrentPage = nullptr; + } + + mxSlideTabPage.reset(new HeaderFooterTabPage(mxTabCtrl->get_page("slides"), pDoc, pSlide, false)); + mxNotesHandoutsTabPage.reset(new HeaderFooterTabPage(mxTabCtrl->get_page("notes"), pDoc, pNotes, true)); + + pDoc->StopWorkStartupDelay(); + mxTabCtrl->show(); + + ActivatePageHdl(mxTabCtrl->get_current_page_ident()); + + mxTabCtrl->connect_enter_page( LINK( this, HeaderFooterDialog, ActivatePageHdl ) ); + + mxPBApplyToAll->connect_clicked( LINK( this, HeaderFooterDialog, ClickApplyToAllHdl ) ); + mxPBApply->connect_clicked( LINK( this, HeaderFooterDialog, ClickApplyHdl ) ); + mxPBCancel->connect_clicked( LINK( this, HeaderFooterDialog, ClickCancelHdl ) ); + + maSlideSettings = pSlide->getHeaderFooterSettings(); + + const HeaderFooterSettings& rTitleSettings = mpDoc->GetSdPage(0, PageKind::Standard)->getHeaderFooterSettings(); + bool bNotOnTitle = !rTitleSettings.mbFooterVisible && !rTitleSettings.mbSlideNumberVisible && !rTitleSettings.mbDateTimeVisible; + + mxSlideTabPage->init( maSlideSettings, bNotOnTitle ); + + maNotesHandoutSettings = pNotes->getHeaderFooterSettings(); + mxNotesHandoutsTabPage->init( maNotesHandoutSettings, false ); +} + +HeaderFooterDialog::~HeaderFooterDialog() +{ +} + +IMPL_LINK(HeaderFooterDialog, ActivatePageHdl, const OUString&, rIdent, void) +{ + mxPBApply->set_visible(rIdent == "slides"); + mxPBApply->set_sensitive(mpCurrentPage != nullptr); +} + +IMPL_LINK_NOARG(HeaderFooterDialog, ClickApplyToAllHdl, weld::Button&, void) +{ + ApplyToAll(); +} + +IMPL_LINK_NOARG(HeaderFooterDialog, ClickApplyHdl, weld::Button&, void) +{ + Apply(); +} + +IMPL_LINK_NOARG(HeaderFooterDialog, ClickCancelHdl, weld::Button&, void) +{ + m_xDialog->response(RET_CANCEL); +} + +short HeaderFooterDialog::run() +{ + short nRet = GenericDialogController::run(); + if (nRet) + mpViewShell->GetDocSh()->SetModified(); + return nRet; +} + +void HeaderFooterDialog::ApplyToAll() +{ + OUString tabId = mxTabCtrl->get_current_page_ident(); + apply(true, tabId == "slides"); + m_xDialog->response(RET_OK); +} + +void HeaderFooterDialog::Apply() +{ + OUString tabId = mxTabCtrl->get_current_page_ident(); + apply(false, tabId == "slides"); + m_xDialog->response(RET_OK); +} + +void HeaderFooterDialog::apply( bool bToAll, bool bForceSlides ) +{ + std::unique_ptr pUndoGroup(new SdUndoGroup(mpDoc)); + OUString aComment( m_xDialog->get_title() ); + pUndoGroup->SetComment( aComment ); + + HeaderFooterSettings aNewSettings; + bool bNewNotOnTitle; + + // change slide settings first ... + + mxSlideTabPage->getData( aNewSettings, bNewNotOnTitle ); + + // only if we pressed apply or apply all on the slide tab page or if the slide settings + // have been changed + if( bForceSlides || !(aNewSettings == maSlideSettings) ) + { + // apply to all slides + if( bToAll ) + { + int nPageCount = mpDoc->GetSdPageCount( PageKind::Standard ); + int nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + SdPage* pPage = mpDoc->GetSdPage( static_cast(nPage), PageKind::Standard ); + change( pUndoGroup.get(), pPage, aNewSettings ); + } + } + else + { + // apply only to the current slide + DBG_ASSERT( mpCurrentPage && mpCurrentPage->GetPageKind() == PageKind::Standard, "no current page to apply to!" ); + if( mpCurrentPage && (mpCurrentPage->GetPageKind() == PageKind::Standard) ) + { + change( pUndoGroup.get(), mpCurrentPage, aNewSettings ); + } + } + } + + // if we don't want to have header&footer on the first slide + if( bNewNotOnTitle ) + { + // just hide them, plain simple UI feature + HeaderFooterSettings aTempSettings = mpDoc->GetSdPage( 0, PageKind::Standard )->getHeaderFooterSettings(); + + aTempSettings.mbFooterVisible = false; + aTempSettings.mbSlideNumberVisible = false; + aTempSettings.mbDateTimeVisible = false; + + change( pUndoGroup.get(), mpDoc->GetSdPage( 0, PageKind::Standard ), aTempSettings ); + } + + // now notes settings + + mxNotesHandoutsTabPage->getData( aNewSettings, bNewNotOnTitle ); + + // only if we pressed apply or apply all on the notes tab page or if the notes settings + // have been changed + if( !bForceSlides || !(aNewSettings == maNotesHandoutSettings) ) + { + // first set to all notes pages + int nPageCount = mpDoc->GetSdPageCount( PageKind::Notes ); + int nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + SdPage* pPage = mpDoc->GetSdPage( static_cast(nPage), PageKind::Notes ); + + change( pUndoGroup.get(), pPage, aNewSettings ); + } + + // and last but not least to the handout page + change( pUndoGroup.get(), mpDoc->GetMasterSdPage( 0, PageKind::Handout ), aNewSettings ); + } + + // give the undo group to the undo manager + mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager()->AddUndoAction(std::move(pUndoGroup)); +} + +void HeaderFooterDialog::change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings ) +{ + pUndoGroup->AddAction(new SdHeaderFooterUndoAction(mpDoc, pPage, rNewSettings )); + pPage->setHeaderFooterSettings( rNewSettings ); +} + +HeaderFooterTabPage::HeaderFooterTabPage(weld::Container* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode) + : mpDoc(pDoc) + , mbHandoutMode(bHandoutMode) + , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/headerfootertab.ui")) + , mxContainer(mxBuilder->weld_container("HeaderFooterTab")) + , mxFTIncludeOn(mxBuilder->weld_label("include_label")) + , mxCBHeader(mxBuilder->weld_check_button("header_cb" )) + , mxHeaderBox(mxBuilder->weld_widget("header_box")) + , mxTBHeader(mxBuilder->weld_entry("header_text")) + , mxCBDateTime(mxBuilder->weld_check_button("datetime_cb")) + , mxRBDateTimeFixed(mxBuilder->weld_radio_button("rb_fixed")) + , mxRBDateTimeAutomatic(mxBuilder->weld_radio_button("rb_auto")) + , mxTBDateTimeFixed(mxBuilder->weld_entry("datetime_value")) + , mxCBDateTimeFormat(mxBuilder->weld_combo_box("datetime_format_list")) + , mxFTDateTimeLanguage(mxBuilder->weld_label("language_label")) + , mxCBDateTimeLanguage(new SvxLanguageBox(mxBuilder->weld_combo_box("language_list"))) + , mxCBFooter(mxBuilder->weld_check_button("footer_cb")) + , mxFooterBox(mxBuilder->weld_widget("footer_box" )) + , mxTBFooter(mxBuilder->weld_entry("footer_text")) + , mxCBSlideNumber(mxBuilder->weld_check_button("slide_number")) + , mxCBNotOnTitle(mxBuilder->weld_check_button("not_on_title")) + , mxReplacementA(mxBuilder->weld_label("replacement_a")) + , mxReplacementB(mxBuilder->weld_label("replacement_b")) + , mxCTPreview(new PresLayoutPreview) + , mxCTPreviewWin(new weld::CustomWeld(*mxBuilder, "preview", *mxCTPreview)) +{ + mxCTPreview->init( pActualPage ? + (pActualPage->IsMasterPage() ? pActualPage : static_cast(&(pActualPage->TRG_GetMasterPage()))) : + (pDoc->GetMasterSdPage( 0, bHandoutMode ? PageKind::Notes : PageKind::Standard )) ); + + if( mbHandoutMode ) + { + OUString sPageNo = mxReplacementA->get_label(); + mxCBSlideNumber->set_label( sPageNo ); + + OUString sFrameTitle = mxReplacementB->get_label(); + mxFTIncludeOn->set_label( sFrameTitle ); + } + + mxCBHeader->set_visible( mbHandoutMode ); + mxHeaderBox->set_visible( mbHandoutMode ); + mxCBNotOnTitle->set_visible( !mbHandoutMode ); + + mxCBDateTime->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) ); + mxRBDateTimeFixed->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) ); + mxRBDateTimeAutomatic->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) ); + mxCBFooter->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) ); + mxCBHeader->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) ); + mxCBSlideNumber->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) ); + + mxCBDateTimeLanguage->SetLanguageList( SvxLanguageListFlags::ALL|SvxLanguageListFlags::ONLY_KNOWN, false, false ); + mxCBDateTimeLanguage->connect_changed( LINK( this, HeaderFooterTabPage, LanguageChangeHdl ) ); + + GetOrSetDateTimeLanguage( meOldLanguage, false ); + meOldLanguage = MsLangId::getRealLanguage( meOldLanguage ); + mxCBDateTimeLanguage->set_active_id( meOldLanguage ); + + FillFormatList(0); +} + +IMPL_LINK_NOARG(HeaderFooterTabPage, LanguageChangeHdl, weld::ComboBox&, void) +{ + FillFormatList( mxCBDateTimeFormat->get_active() ); +} + +void HeaderFooterTabPage::FillFormatList( sal_Int32 nSelectedPos ) +{ + LanguageType eLanguage = mxCBDateTimeLanguage->get_active_id(); + + mxCBDateTimeFormat->clear(); + + DateTime aDateTime( DateTime::SYSTEM ); + + for (int nFormat = 0; nFormat < nDateTimeFormatsCount; ++nFormat) + { + OUString aStr( SvxDateTimeField::GetFormatted( + aDateTime, aDateTime, + nDateTimeFormats[nFormat].meDateFormat, nDateTimeFormats[nFormat].meTimeFormat, + *(SD_MOD()->GetNumberFormatter()), eLanguage ) ); + mxCBDateTimeFormat->append_text(aStr); + if (nFormat == nSelectedPos) + mxCBDateTimeFormat->set_active(nFormat); + } +} + +void HeaderFooterTabPage::init( const HeaderFooterSettings& rSettings, bool bNotOnTitle ) +{ + mxCBDateTime->set_active( rSettings.mbDateTimeVisible ); + mxRBDateTimeFixed->set_active( rSettings.mbDateTimeIsFixed ); + mxRBDateTimeAutomatic->set_active( !rSettings.mbDateTimeIsFixed ); + mxTBDateTimeFixed->set_text( rSettings.maDateTimeText ); + + mxCBHeader->set_active( rSettings.mbHeaderVisible ); + mxTBHeader->set_text( rSettings.maHeaderText ); + + mxCBFooter->set_active( rSettings.mbFooterVisible ); + mxTBFooter->set_text( rSettings.maFooterText ); + + mxCBSlideNumber->set_active( rSettings.mbSlideNumberVisible ); + + mxCBNotOnTitle->set_active( bNotOnTitle ); + + mxCBDateTimeLanguage->set_active_id( meOldLanguage ); + + for (sal_Int32 nPos = 0, nEntryCount = mxCBDateTimeFormat->get_count(); nPos < nEntryCount; ++nPos) + { + if( nDateTimeFormats[nPos].meDateFormat == rSettings.meDateFormat && nDateTimeFormats[nPos].meTimeFormat == rSettings.meTimeFormat ) + { + mxCBDateTimeFormat->set_active(nPos); + break; + } + } + + update(); +} + +void HeaderFooterTabPage::getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle ) +{ + rSettings.mbDateTimeVisible = mxCBDateTime->get_active(); + rSettings.mbDateTimeIsFixed = mxRBDateTimeFixed->get_active(); + rSettings.maDateTimeText = mxTBDateTimeFixed->get_text(); + rSettings.mbFooterVisible = mxCBFooter->get_active(); + rSettings.maFooterText = mxTBFooter->get_text(); + rSettings.mbSlideNumberVisible = mxCBSlideNumber->get_active(); + rSettings.mbHeaderVisible = mxCBHeader->get_active(); + rSettings.maHeaderText = mxTBHeader->get_text(); + + int nPos = mxCBDateTimeFormat->get_active(); + if (nPos != -1) + { + rSettings.meDateFormat = nDateTimeFormats[nPos].meDateFormat; + rSettings.meTimeFormat = nDateTimeFormats[nPos].meTimeFormat; + } + + LanguageType eLanguage = mxCBDateTimeLanguage->get_active_id(); + if( eLanguage != meOldLanguage ) + GetOrSetDateTimeLanguage( eLanguage, true ); + + rNotOnTitle = mxCBNotOnTitle->get_active(); +} + +void HeaderFooterTabPage::update() +{ + mxRBDateTimeFixed->set_sensitive( mxCBDateTime->get_active() ); + mxTBDateTimeFixed->set_sensitive( mxRBDateTimeFixed->get_active() && mxCBDateTime->get_active() ); + mxRBDateTimeAutomatic->set_sensitive( mxCBDateTime->get_active() ); + mxCBDateTimeFormat->set_sensitive( mxCBDateTime->get_active() && mxRBDateTimeAutomatic->get_active() ); + mxFTDateTimeLanguage->set_sensitive( mxCBDateTime->get_active() && mxRBDateTimeAutomatic->get_active() ); + mxCBDateTimeLanguage->set_sensitive( mxCBDateTime->get_active() && mxRBDateTimeAutomatic->get_active() ); + mxFooterBox->set_sensitive( mxCBFooter->get_active() ); + mxHeaderBox->set_sensitive( mxCBHeader->get_active() ); + + HeaderFooterSettings aSettings; + bool bNotOnTitle; + getData( aSettings, bNotOnTitle ); + mxCTPreview->update( aSettings ); +} + +IMPL_LINK_NOARG(HeaderFooterTabPage, UpdateOnToggleHdl, weld::Toggleable&, void) +{ + update(); +} + +void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet ) +{ + if( mbHandoutMode ) + { + // if set, set it on all notes master pages + if( bSet ) + { + sal_uInt16 nPageCount = mpDoc->GetMasterSdPageCount( PageKind::Notes ); + sal_uInt16 nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PageKind::Notes ) ); + } + } + + // #i119985# and set it, or just get it from the notes master page + GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( 0, PageKind::Notes ) ); + } + else + { + // get the language from the first master page + // or set it to all master pages + sal_uInt16 nPageCount = bSet ? mpDoc->GetMasterSdPageCount( PageKind::Notes ) : 1; + sal_uInt16 nPage; + for( nPage = 0; nPage < nPageCount; nPage++ ) + { + GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PageKind::Standard ) ); + } + } +} + +void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage ) +{ + if( !pPage ) + return; + + SdrTextObj* pObj = static_cast(pPage->GetPresObj( PresObjKind::DateTime )); + if( !pObj ) + return; + + Outliner* pOutl = mpDoc->GetInternalOutliner(); + pOutl->Init( OutlinerMode::TextObject ); + OutlinerMode nOutlMode = pOutl->GetOutlinerMode(); + + EditEngine* pEdit = const_cast< EditEngine* >(&pOutl->GetEditEngine()); + + OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); + if( pOPO ) + pOutl->SetText( *pOPO ); + + EPosition aDateFieldPosition; + bool bHasDateFieldItem = false; + + sal_Int32 nParaCount = pEdit->GetParagraphCount(); + for (sal_Int32 nPara = 0; (nPara < nParaCount) && !bHasDateFieldItem; ++nPara) + { + sal_uInt16 nFieldCount = pEdit->GetFieldCount(nPara); + for (sal_uInt16 nField = 0; (nField < nFieldCount); ++nField) + { + EFieldInfo aFieldInfo = pEdit->GetFieldInfo(nPara, nField); + if (aFieldInfo.pFieldItem) + { + const SvxFieldData* pFieldData = aFieldInfo.pFieldItem->GetField(); + if (dynamic_cast(pFieldData) != nullptr || + dynamic_cast(pFieldData) != nullptr) + { + bHasDateFieldItem = true; + aDateFieldPosition = aFieldInfo.aPosition; + break; + } + } + } + } + + if (bHasDateFieldItem) + { + if( bSet ) + { + SfxItemSet aSet(pEdit->GetAttribs(aDateFieldPosition.nPara, + aDateFieldPosition.nIndex, + aDateFieldPosition.nIndex+1, + GetAttribsFlags::CHARATTRIBS)); + + SvxLanguageItem aItem( rLanguage, EE_CHAR_LANGUAGE ); + aSet.Put( aItem ); + + SvxLanguageItem aItemCJK( rLanguage, EE_CHAR_LANGUAGE_CJK ); + aSet.Put( aItemCJK ); + + SvxLanguageItem aItemCTL( rLanguage, EE_CHAR_LANGUAGE_CTL ); + aSet.Put( aItemCTL ); + + ESelection aSel(aDateFieldPosition.nPara, aDateFieldPosition.nIndex, + aDateFieldPosition.nPara, aDateFieldPosition.nIndex+1 ); + pEdit->QuickSetAttribs( aSet, aSel ); + + pObj->SetOutlinerParaObject( pOutl->CreateParaObject() ); + pOutl->UpdateFields(); + } + else + { + rLanguage = pOutl->GetLanguage(aDateFieldPosition.nPara, + aDateFieldPosition.nIndex ); + } + } + + pOutl->Clear(); + pOutl->Init( nOutlMode ); +} + +PresLayoutPreview::PresLayoutPreview() + : mpMaster(nullptr) +{ +} + +void PresLayoutPreview::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(80, 80), MapMode(MapUnit::MapAppFont))); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + CustomWidgetController::SetDrawingArea(pDrawingArea); + SetOutputSizePixel(aSize); +} + +void PresLayoutPreview::init( SdPage *pMaster ) +{ + mpMaster = pMaster; + maPageSize = pMaster->GetSize(); +} + +void PresLayoutPreview::update( HeaderFooterSettings const & rSettings ) +{ + maSettings = rSettings; + Invalidate(); +} + +void PresLayoutPreview::Paint(vcl::RenderContext& rRenderContext, SdrTextObj const * pObj, bool bVisible, bool bDotted /* = false*/ ) +{ + // get object transformation + basegfx::B2DHomMatrix aObjectTransform; + basegfx::B2DPolyPolygon aObjectPolyPolygon; + pObj->TRGetBaseGeometry(aObjectTransform, aObjectPolyPolygon); + + // build complete transformation by adding view transformation from + // logic page coordinates to local pixel coordinates + const double fScaleX(static_cast(maOutRect.getOpenWidth()) / static_cast(maPageSize.Width())); + const double fScaleY(static_cast(maOutRect.getOpenHeight()) / static_cast(maPageSize.Height())); + aObjectTransform.scale(fScaleX, fScaleY); + aObjectTransform.translate(maOutRect.Left(), maOutRect.Top()); + + // create geometry using unit range and object transform + basegfx::B2DPolyPolygon aGeometry(basegfx::utils::createUnitPolygon()); + aGeometry.transform(aObjectTransform); + + // apply line pattern if wanted + if (bDotted) + { + static const double fFactor(1.0); + std::vector aPattern + { + 3.0 * fFactor, + 1.0 * fFactor + }; + + basegfx::B2DPolyPolygon aDashed; + basegfx::utils::applyLineDashing(aGeometry, aPattern, &aDashed); + aGeometry = aDashed; + } + + // determine line color + svtools::ColorConfig aColorConfig; + svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( bVisible ? svtools::FONTCOLOR : svtools::OBJECTBOUNDARIES ) ); + + // paint at OutDev + rRenderContext.SetLineColor(aColor.nColor); + rRenderContext.SetFillColor(); + + for (sal_uInt32 a(0); a < aGeometry.count(); a++) + { + rRenderContext.DrawPolyLine(aGeometry.getB2DPolygon(a)); + } +} + +void PresLayoutPreview::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&) +{ + rRenderContext.Push(); + + maOutRect = ::tools::Rectangle(Point(0,0), rRenderContext.GetOutputSize()); + + // calculate page size with correct aspect ratio + int nWidth, nHeight; + if( maPageSize.Width() > maPageSize.Height() ) + { + nWidth = maOutRect.GetWidth(); + nHeight = maPageSize.Width() == 0 ? 0 : tools::Long( static_cast(nWidth * maPageSize.Height()) / static_cast(maPageSize.Width()) ); + } + else + { + nHeight = maOutRect.GetHeight(); + nWidth = maPageSize.Height() == 0 ? 0 : tools::Long( static_cast(nHeight * maPageSize.Width()) / static_cast(maPageSize.Height()) ); + } + + maOutRect.AdjustLeft((maOutRect.GetWidth() - nWidth) >> 1 ); + maOutRect.SetRight( maOutRect.Left() + nWidth - 1 ); + maOutRect.AdjustTop((maOutRect.GetHeight() - nHeight) >> 1 ); + maOutRect.SetBottom( maOutRect.Top() + nHeight - 1 ); + + // draw decoration frame + DecorationView aDecoView(&rRenderContext); + maOutRect = aDecoView.DrawFrame(maOutRect, DrawFrameStyle::In); + + // draw page background + rRenderContext.SetFillColor(COL_WHITE); + rRenderContext.DrawRect(maOutRect); + + // paint presentation objects from masterpage + if (nullptr != mpMaster) + { + SdrTextObj* pMasterTitle = static_cast(mpMaster->GetPresObj(PresObjKind::Title)); + SdrTextObj* pMasterOutline = static_cast(mpMaster->GetPresObj(mpMaster->GetPageKind() == PageKind::Notes ? PresObjKind::Notes : PresObjKind::Outline)); + SdrTextObj* pHeader = static_cast(mpMaster->GetPresObj(PresObjKind::Header)); + SdrTextObj* pFooter = static_cast(mpMaster->GetPresObj(PresObjKind::Footer)); + SdrTextObj* pDate = static_cast(mpMaster->GetPresObj(PresObjKind::DateTime)); + SdrTextObj* pNumber = static_cast(mpMaster->GetPresObj(PresObjKind::SlideNumber)); + + if (pMasterTitle) + Paint(rRenderContext, pMasterTitle, true, true); + if (pMasterOutline) + Paint(rRenderContext, pMasterOutline, true, true); + if (pHeader) + Paint(rRenderContext, pHeader, maSettings.mbHeaderVisible); + if (pFooter) + Paint(rRenderContext, pFooter, maSettings.mbFooterVisible); + if (pDate) + Paint(rRenderContext, pDate, maSettings.mbDateTimeVisible); + if (pNumber) + Paint(rRenderContext, pNumber, maSettings.mbSlideNumberVisible); + } + + rRenderContext.Pop(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/ins_paste.cxx b/sd/source/ui/dlg/ins_paste.cxx new file mode 100644 index 0000000000..f1020c0cb2 --- /dev/null +++ b/sd/source/ui/dlg/ins_paste.cxx @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +SdInsertPasteDlg::SdInsertPasteDlg(weld::Window* pWindow) + : GenericDialogController(pWindow, "modules/simpress/ui/insertslides.ui", "InsertSlidesDialog") + , m_xRbBefore(m_xBuilder->weld_radio_button("before")) + , m_xRbAfter(m_xBuilder->weld_radio_button("after")) +{ + m_xRbAfter->set_active(true); +} + +SdInsertPasteDlg::~SdInsertPasteDlg() {} + +bool SdInsertPasteDlg::IsInsertBefore() const { return m_xRbBefore->get_active(); } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/inspagob.cxx b/sd/source/ui/dlg/inspagob.cxx new file mode 100644 index 0000000000..5c984dd232 --- /dev/null +++ b/sd/source/ui/dlg/inspagob.cxx @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include +#include +#include +#include +#include + +SdInsertPagesObjsDlg::SdInsertPagesObjsDlg( + weld::Window* pWindow, const SdDrawDocument* pInDoc, + SfxMedium* pSfxMedium, const OUString& rFileName ) + : GenericDialogController(pWindow, "modules/sdraw/ui/insertslidesdialog.ui", "InsertSlidesDialog") + , m_pMedium(pSfxMedium) + , m_pDoc(pInDoc) + , m_rName(rFileName) + , m_xLbTree(new SdPageObjsTLV(m_xBuilder->weld_tree_view("tree"))) + , m_xCbxLink(m_xBuilder->weld_check_button("links")) + , m_xCbxMasters(m_xBuilder->weld_check_button("backgrounds")) +{ + m_xLbTree->set_size_request(m_xLbTree->get_approximate_digit_width() * 48, + m_xLbTree->get_height_rows(12)); + + m_xLbTree->SetViewFrame( pInDoc->GetDocSh()->GetViewShell()->GetViewFrame() ); + + m_xLbTree->connect_changed(LINK(this, SdInsertPagesObjsDlg, SelectObjectHdl)); + + // insert text + if (!m_pMedium) + m_xDialog->set_title(SdResId(STR_INSERT_TEXT)); + else if (m_pDoc && m_pDoc->GetDocumentType() == DocumentType::Draw) + m_xDialog->set_title(SdResId(STR_INSERT_PAGES)); + + Reset(); +} + +SdInsertPagesObjsDlg::~SdInsertPagesObjsDlg() +{ +} + +/** + * Fills the TreeLB dependent on the medium. Is not medium available, then + * it is a text and not a draw document. + */ +void SdInsertPagesObjsDlg::Reset() +{ + if( m_pMedium ) + { + m_xLbTree->set_selection_mode(SelectionMode::Multiple); + + // transfer ownership of Medium + m_xLbTree->Fill( m_pDoc, m_pMedium, m_rName ); + } + else + { + m_xLbTree->InsertEntry(m_rName, BMP_DOC_TEXT); + } + + m_xCbxMasters->set_active(true); +} + +std::vector SdInsertPagesObjsDlg::GetList( const sal_uInt16 nType ) +{ + // With Draw documents, we have to return NULL on selection of the document + if( m_pMedium ) + { + // to ensure that bookmarks are opened + // (when the whole document is selected) + m_xLbTree->GetBookmarkDoc(); + + // If the document is selected (too) or nothing is selected, + // the whole document is inserted (but not more!) + std::unique_ptr xIter(m_xLbTree->make_iterator()); + if (!m_xLbTree->get_iter_first(*xIter) || m_xLbTree->is_selected(*xIter)) + return std::vector(); + } + + return m_xLbTree->GetSelectEntryList( nType ); +} + +/** + * is link checked + */ +bool SdInsertPagesObjsDlg::IsLink() const +{ + return m_xCbxLink->get_active(); +} + +/** + * is link checked + */ +bool SdInsertPagesObjsDlg::IsRemoveUnnecessaryMasterPages() const +{ + return m_xCbxMasters->get_active(); +} + +/** + * Enabled and selects end-color-LB + */ +IMPL_LINK_NOARG(SdInsertPagesObjsDlg, SelectObjectHdl, weld::TreeView&, void) +{ + m_xCbxLink->set_sensitive(m_xLbTree->IsLinkableSelected()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/layeroptionsdlg.cxx b/sd/source/ui/dlg/layeroptionsdlg.cxx new file mode 100644 index 0000000000..fae355ae97 --- /dev/null +++ b/sd/source/ui/dlg/layeroptionsdlg.cxx @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +SdInsertLayerDlg::SdInsertLayerDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, + bool bDeletable, const OUString& rStr) + : GenericDialogController(pWindow, "modules/sdraw/ui/insertlayer.ui", "InsertLayerDialog") + , m_xEdtName(m_xBuilder->weld_entry("name")) + , m_xEdtTitle(m_xBuilder->weld_entry("title")) + , m_xEdtDesc(m_xBuilder->weld_text_view("textview")) + , m_xCbxVisible(m_xBuilder->weld_check_button("visible")) + , m_xCbxPrintable(m_xBuilder->weld_check_button("printable")) + , m_xCbxLocked(m_xBuilder->weld_check_button("locked")) + , m_xNameFrame(m_xBuilder->weld_widget("nameframe")) +{ + m_xDialog->set_title(rStr); + + m_xEdtName->set_text( rInAttrs.Get( ATTR_LAYER_NAME ).GetValue() ); + m_xEdtTitle->set_text( rInAttrs.Get( ATTR_LAYER_TITLE ).GetValue() ); + m_xEdtDesc->set_text( rInAttrs.Get( ATTR_LAYER_DESC ).GetValue() ); + m_xEdtDesc->set_size_request(-1, m_xEdtDesc->get_height_rows(4)); + m_xCbxVisible->set_active( static_cast( rInAttrs.Get( ATTR_LAYER_VISIBLE ) ).GetValue() ); + m_xCbxPrintable->set_active( static_cast( rInAttrs.Get( ATTR_LAYER_PRINTABLE ) ).GetValue() ); + m_xCbxLocked->set_active( static_cast( rInAttrs.Get( ATTR_LAYER_LOCKED ) ).GetValue() ); + m_xNameFrame->set_sensitive(bDeletable); +} + +SdInsertLayerDlg::~SdInsertLayerDlg() +{ +} + +void SdInsertLayerDlg::GetAttr( SfxItemSet& rAttrs ) +{ + rAttrs.Put( makeSdAttrLayerName( m_xEdtName->get_text() ) ); + rAttrs.Put( makeSdAttrLayerTitle( m_xEdtTitle->get_text() ) ); + rAttrs.Put( makeSdAttrLayerDesc( m_xEdtDesc->get_text() ) ); + rAttrs.Put( makeSdAttrLayerVisible( m_xCbxVisible->get_active() ) ); + rAttrs.Put( makeSdAttrLayerPrintable( m_xCbxPrintable->get_active() ) ); + rAttrs.Put( makeSdAttrLayerLocked( m_xCbxLocked->get_active() ) ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/masterlayoutdlg.cxx b/sd/source/ui/dlg/masterlayoutdlg.cxx new file mode 100644 index 0000000000..ce4e069b07 --- /dev/null +++ b/sd/source/ui/dlg/masterlayoutdlg.cxx @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +using namespace ::sd; + +MasterLayoutDialog::MasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) + : GenericDialogController(pParent, "modules/simpress/ui/masterlayoutdlg.ui", "MasterLayoutDialog") + , mpDoc(pDoc) + , mpCurrentPage(pCurrentPage) + , mxCBDate(m_xBuilder->weld_check_button("datetime")) + , mxCBPageNumber(m_xBuilder->weld_check_button("pagenumber")) + , mxCBSlideNumber(m_xBuilder->weld_check_button("slidenumber")) + , mxCBHeader(m_xBuilder->weld_check_button("header")) + , mxCBFooter(m_xBuilder->weld_check_button("footer")) +{ + if( mpCurrentPage && !mpCurrentPage->IsMasterPage() ) + { + mpCurrentPage = static_cast(&(mpCurrentPage->TRG_GetMasterPage())); + } + + if( mpCurrentPage == nullptr ) + { + mpCurrentPage = pDoc->GetMasterSdPage( 0, PageKind::Standard ); + OSL_FAIL( "MasterLayoutDialog::MasterLayoutDialog() - no current page?" ); + } + + switch( mpCurrentPage->GetPageKind() ) + { + case PageKind::Standard: + { + mxCBHeader->set_sensitive(false); + mxCBPageNumber->set_label(mxCBSlideNumber->get_label()); + break; + } + case PageKind::Notes: + break; + case PageKind::Handout: + break; + } + + mbOldHeader = mpCurrentPage->GetPresObj( PresObjKind::Header ) != nullptr; + mbOldDate = mpCurrentPage->GetPresObj( PresObjKind::DateTime ) != nullptr; + mbOldFooter = mpCurrentPage->GetPresObj( PresObjKind::Footer ) != nullptr; + mbOldPageNumber = mpCurrentPage->GetPresObj( PresObjKind::SlideNumber ) != nullptr; + + mxCBHeader->set_active( mbOldHeader ); + mxCBDate->set_active( mbOldDate ); + mxCBFooter->set_active( mbOldFooter ); + mxCBPageNumber->set_active( mbOldPageNumber ); +} + +MasterLayoutDialog::~MasterLayoutDialog() +{ +} + +short MasterLayoutDialog::run() +{ + if (GenericDialogController::run() == RET_OK) + applyChanges(); + return RET_OK; +} + +void MasterLayoutDialog::applyChanges() +{ + mpDoc->BegUndo(m_xDialog->get_title()); + + if( (mpCurrentPage->GetPageKind() != PageKind::Standard) && (mbOldHeader != mxCBHeader->get_active() ) ) + { + if( mbOldHeader ) + remove( PresObjKind::Header ); + else + create( PresObjKind::Header ); + } + + if( mbOldFooter != mxCBFooter->get_active() ) + { + if( mbOldFooter ) + remove( PresObjKind::Footer ); + else + create( PresObjKind::Footer ); + } + + if( mbOldDate != mxCBDate->get_active() ) + { + if( mbOldDate ) + remove( PresObjKind::DateTime ); + else + create( PresObjKind::DateTime ); + } + + if( mbOldPageNumber != mxCBPageNumber->get_active() ) + { + if( mbOldPageNumber ) + remove( PresObjKind::SlideNumber ); + else + create( PresObjKind::SlideNumber ); + } + + mpDoc->EndUndo(); +} + +void MasterLayoutDialog::create(PresObjKind eKind) +{ + mpCurrentPage->CreateDefaultPresObj(eKind); +} + +void MasterLayoutDialog::remove( PresObjKind eKind ) +{ + mpCurrentPage->DestroyDefaultPresObj(eKind); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/morphdlg.cxx b/sd/source/ui/dlg/morphdlg.cxx new file mode 100644 index 0000000000..c0d7f4e5af --- /dev/null +++ b/sd/source/ui/dlg/morphdlg.cxx @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + +MorphDlg::MorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2 ) + : GenericDialogController(pParent, "modules/sdraw/ui/crossfadedialog.ui", "CrossFadeDialog") + , m_xMtfSteps(m_xBuilder->weld_spin_button("increments")) + , m_xCbxAttributes(m_xBuilder->weld_check_button("attributes")) + , m_xCbxOrientation(m_xBuilder->weld_check_button("orientation")) +{ + LoadSettings(); + + SfxItemPool & rPool = pObj1->GetObjectItemPool(); + SfxItemSet aSet1( rPool ); + SfxItemSet aSet2( rPool ); + + aSet1.Put(pObj1->GetMergedItemSet()); + aSet2.Put(pObj2->GetMergedItemSet()); + + const drawing::LineStyle eLineStyle1 = aSet1.Get( XATTR_LINESTYLE ).GetValue(); + const drawing::LineStyle eLineStyle2 = aSet2.Get( XATTR_LINESTYLE ).GetValue(); + const drawing::FillStyle eFillStyle1 = aSet1.Get( XATTR_FILLSTYLE ).GetValue(); + const drawing::FillStyle eFillStyle2 = aSet2.Get( XATTR_FILLSTYLE ).GetValue(); + + if ( ( ( eLineStyle1 == drawing::LineStyle_NONE ) || ( eLineStyle2 == drawing::LineStyle_NONE ) ) && + ( ( eFillStyle1 != drawing::FillStyle_SOLID ) || ( eFillStyle2 != drawing::FillStyle_SOLID ) ) ) + { + m_xCbxAttributes->set_sensitive(false); + } +} + +MorphDlg::~MorphDlg() +{ +} + +void MorphDlg::LoadSettings() +{ + tools::SvRef xIStm( SD_MOD()->GetOptionStream( SD_OPTION_MORPHING , + SdOptionStreamMode::Load ) ); + sal_uInt16 nSteps; + bool bOrient, bAttrib; + + if( xIStm.is() ) + { + SdIOCompat aCompat( *xIStm, StreamMode::READ ); + + xIStm->ReadUInt16( nSteps ).ReadCharAsBool( bOrient ).ReadCharAsBool( bAttrib ); + } + else + { + nSteps = 16; + bOrient = bAttrib = true; + } + + m_xMtfSteps->set_value(nSteps); + m_xCbxOrientation->set_active(bOrient); + m_xCbxAttributes->set_active(bAttrib); +} + +void MorphDlg::SaveSettings() const +{ + tools::SvRef xOStm( SD_MOD()->GetOptionStream( SD_OPTION_MORPHING , + SdOptionStreamMode::Store ) ); + + if( xOStm.is() ) + { + SdIOCompat aCompat( *xOStm, StreamMode::WRITE, 1 ); + + xOStm->WriteUInt16( m_xMtfSteps->get_value() ) + .WriteBool( m_xCbxOrientation->get_active() ) + .WriteBool( m_xCbxAttributes->get_active() ); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/navigatr.cxx b/sd/source/ui/dlg/navigatr.cxx new file mode 100644 index 0000000000..f1a4a66c1e --- /dev/null +++ b/sd/source/ui/dlg/navigatr.cxx @@ -0,0 +1,890 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +/** + * SdNavigatorWin - FloatingWindow + */ +SdNavigatorWin::SdNavigatorWin(weld::Widget* pParent, SfxBindings* pInBindings, SfxNavigator* pNavigatorDlg) + : PanelLayout(pParent, "NavigatorPanel", "modules/simpress/ui/navigatorpanel.ui") + , mxToolbox(m_xBuilder->weld_toolbar("toolbox")) + , mxTlbObjects(new SdPageObjsTLV(m_xBuilder->weld_tree_view("tree"))) + , mxLbDocs(m_xBuilder->weld_combo_box("documents")) + , mxDragModeMenu(m_xBuilder->weld_menu("dragmodemenu")) + , mxShapeMenu(m_xBuilder->weld_menu("shapemenu")) + , mxNavigatorDlg(pNavigatorDlg) + , mbDocImported ( false ) + // On changes of the DragType: adjust SelectionMode of TLB! + , meDragType ( NAVIGATOR_DRAGTYPE_EMBEDDED ) + , mpBindings ( pInBindings ) +{ + mxTlbObjects->SetViewFrame( mpBindings->GetDispatcher()->GetFrame() ); + + mxTlbObjects->connect_row_activated(LINK(this, SdNavigatorWin, ClickObjectHdl)); + mxTlbObjects->set_selection_mode(SelectionMode::Multiple); + mxTlbObjects->connect_mouse_release(LINK(this, SdNavigatorWin, MouseReleaseHdl)); + mxTlbObjects->connect_popup_menu(LINK(this, SdNavigatorWin, CommandHdl)); + + mxToolbox->connect_clicked(LINK(this, SdNavigatorWin, SelectToolboxHdl)); + mxToolbox->connect_menu_toggled(LINK(this, SdNavigatorWin, DropdownClickToolBoxHdl)); + + mxToolbox->set_item_menu("dragmode", mxDragModeMenu.get()); + mxDragModeMenu->connect_activate(LINK(this, SdNavigatorWin, MenuSelectHdl)); + + // Shape filter drop down menu. + mxToolbox->set_item_menu("shapes", mxShapeMenu.get()); + mxShapeMenu->connect_activate(LINK(this, SdNavigatorWin, ShapeFilterCallback)); + + mxTlbObjects->SetSdNavigator(this); + + // DragTypeListBox + mxLbDocs->set_size_request(42, -1); // set a nominal width so it takes width of surroundings + mxLbDocs->connect_changed(LINK(this, SdNavigatorWin, SelectDocumentHdl)); + + SetDragImage(); + + mxToolbox->connect_key_press(LINK(this, SdNavigatorWin, KeyInputHdl)); + mxTlbObjects->connect_key_press(LINK(this, SdNavigatorWin, KeyInputHdl)); + mxLbDocs->connect_key_press(LINK(this, SdNavigatorWin, KeyInputHdl)); + if(comphelper::LibreOfficeKit::isActive()) + { + mxToolbox->hide(); + mxLbDocs->hide(); + } +} + +void SdNavigatorWin::FirstFocus() +{ + // set focus to listbox, otherwise it is in the toolbox which is only useful + // for keyboard navigation + mxTlbObjects->grab_focus(); +} + +weld::Window* SdNavigatorWin::GetFrameWeld() const +{ + if (mxNavigatorDlg) + return mxNavigatorDlg->GetFrameWeld(); + return PanelLayout::GetFrameWeld(); +} + +void SdNavigatorWin::SetUpdateRequestFunctor(const UpdateRequestFunctor& rUpdateRequest) +{ + mpNavigatorCtrlItem.reset( new SdNavigatorControllerItem(SID_NAVIGATOR_STATE, this, mpBindings, rUpdateRequest) ); + mpPageNameCtrlItem.reset( new SdPageNameControllerItem(SID_NAVIGATOR_PAGENAME, this, mpBindings) ); + + // InitTlb; is initiated over Slot + if (rUpdateRequest) + rUpdateRequest(); +} + +SdNavigatorWin::~SdNavigatorWin() +{ + mpNavigatorCtrlItem.reset(); + mpPageNameCtrlItem.reset(); + mxDragModeMenu.reset(); + mxShapeMenu.reset(); + mxToolbox.reset(); + mxTlbObjects.reset(); + mxLbDocs.reset(); +} + +static void lcl_select_marked_object(const sd::ViewShell* pViewShell, SdPageObjsTLV* pTlbObjects) +{ + if (const SdrView* pView = pViewShell->GetDrawView()) + { + auto vMarkedObjects = pView->GetMarkedObjects(); + if (vMarkedObjects.size()) + { + pTlbObjects->unselect_all(); + for (auto rMarkedObject: vMarkedObjects) + pTlbObjects->SelectEntry(rMarkedObject); + } + else + pTlbObjects->SelectEntry(pViewShell->GetName()); + } +} + +//when object is marked , fresh the corresponding entry tree . +void SdNavigatorWin::FreshTree( const SdDrawDocument* pDoc ) +{ + SdDrawDocument* pNonConstDoc = const_cast(pDoc); // const as const can... + sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh(); + const OUString& aDocShName( pDocShell->GetName() ); + OUString aDocName = pDocShell->GetMedium()->GetName(); + if (!mxTlbObjects->IsEqualToDoc(pDoc)) + { + mxTlbObjects->Fill( pDoc, false, aDocName ); // Only normal pages + RefreshDocumentLB(); + mxLbDocs->set_active_text(aDocShName); + } + if (const sd::ViewShell* pViewShell = pDocShell->GetViewShell()) + lcl_select_marked_object(pViewShell, mxTlbObjects.get()); +} + +void SdNavigatorWin::InitTreeLB( const SdDrawDocument* pDoc ) +{ + SdDrawDocument* pNonConstDoc = const_cast(pDoc); // const as const can... + ::sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh(); + OUString aDocShName( pDocShell->GetName() ); + ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); + + // Restore the 'ShowAllShapes' flag from the last time (in this session) + // that the navigator was shown. + if (pViewShell != nullptr) + { + ::sd::FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView != nullptr) + mxTlbObjects->SetShowAllShapes(pFrameView->IsNavigatorShowingAllShapes(), false); + } + + // Disable the shape filter drop down menu when there is a running slide + // show. + if (pViewShell!=nullptr && sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() )) + mxToolbox->set_item_sensitive("shapes", false); + else + mxToolbox->set_item_sensitive("shapes", true); + + if( !mxTlbObjects->IsEqualToDoc( pDoc ) ) + { + OUString aDocName = pDocShell->GetMedium()->GetName(); + mxTlbObjects->clear(); + mxTlbObjects->Fill( pDoc, false, aDocName ); // only normal pages + + RefreshDocumentLB(); + mxLbDocs->set_active_text(aDocShName); + } + else + { + mxLbDocs->set_active(-1); + mxLbDocs->set_active_text(aDocShName); + +// commented in order to fix 30246 +// if( mxLbDocs->get_active() == -1 ) + { + RefreshDocumentLB(); + mxLbDocs->set_active_text(aDocShName); + } + } + + if (pViewShell) + lcl_select_marked_object(pViewShell, mxTlbObjects.get()); + + SfxViewFrame* pViewFrame = ( ( pViewShell && pViewShell->GetViewFrame() ) ? pViewShell->GetViewFrame() : SfxViewFrame::Current() ); + if( pViewFrame ) + pViewFrame->GetBindings().Invalidate(SID_NAVIGATOR_PAGENAME, true, true); +} + +/** + * DragType is set on dependence if a Drag is even possible. For example, + * under certain circumstances, it is not allowed to drag graphics (#31038#). + */ +NavigatorDragType SdNavigatorWin::GetNavigatorDragType() +{ + NavigatorDragType eDT = meDragType; + NavDocInfo* pInfo = GetDocInfo(); + + if( ( eDT == NAVIGATOR_DRAGTYPE_LINK ) && ( ( pInfo && !pInfo->HasName() ) || !mxTlbObjects->IsLinkableSelected() ) ) + eDT = NAVIGATOR_DRAGTYPE_NONE; + + return eDT; +} + +SdPageObjsTLV& SdNavigatorWin::GetObjects() +{ + return *mxTlbObjects; +} + +IMPL_STATIC_LINK_NOARG(SdNavigatorWin, MouseReleaseHdl, const MouseEvent&, bool) +{ + return true; +} + +IMPL_LINK(SdNavigatorWin, CommandHdl, const CommandEvent&, rCEvt, bool) +{ + if (rCEvt.GetCommand() != CommandEventId::ContextMenu) + return false; + weld::TreeView& rTreeView = GetObjects().get_treeview(); + std::unique_ptr xBuilder(Application::CreateBuilder(&rTreeView, + "modules/sdraw/ui/navigatorcontextmenu.ui")); + std::unique_ptr xPop = xBuilder->weld_menu("navmenu"); + OUString sCommand = xPop->popup_at_rect(&rTreeView, + tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1))); + if (!sCommand.isEmpty()) + ExecuteContextMenuAction(sCommand); + return true; +} + +void SdNavigatorWin::ExecuteContextMenuAction(std::u16string_view rSelectedPopupEntry) +{ + if (rSelectedPopupEntry == u"rename" && mpBindings) + { + weld::TreeView& rTreeView = GetObjects().get_treeview(); + std::unique_ptr xIter(rTreeView.make_iterator()); + if (rTreeView.get_selected(xIter.get())) + { + if (rTreeView.get_iter_depth(*xIter) > 0) + mpBindings->Execute(SID_NAME_GROUP); + else + mpBindings->Execute(SID_RENAMEPAGE); + } + } +} + +IMPL_LINK(SdNavigatorWin, SelectToolboxHdl, const OUString&, rCommand, void) +{ + PageJump ePage = PAGE_NONE; + + if (rCommand == "first") + ePage = PAGE_FIRST; + else if (rCommand == "previous") + ePage = PAGE_PREVIOUS; + else if (rCommand == "next") + ePage = PAGE_NEXT; + else if (rCommand == "last") + ePage = PAGE_LAST; + else if (rCommand == "dragmode") + mxToolbox->set_menu_item_active("dragmode", !mxToolbox->get_menu_item_active("dragmode")); + else if (rCommand == "shapes") + mxToolbox->set_menu_item_active("shapes", !mxToolbox->get_menu_item_active("shapes")); + + if (ePage != PAGE_NONE) + { + SfxUInt16Item aItem( SID_NAVIGATOR_PAGE, static_cast(ePage) ); + mpBindings->GetDispatcher()->ExecuteList(SID_NAVIGATOR_PAGE, + SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + } +} + +IMPL_LINK(SdNavigatorWin, DropdownClickToolBoxHdl, const OUString&, rCommand, void) +{ + if (!mxToolbox->get_menu_item_active(rCommand)) + return; + + if (rCommand == "dragmode") + { + NavDocInfo* pInfo = GetDocInfo(); + if( ( pInfo && !pInfo->HasName() ) || !mxTlbObjects->IsLinkableSelected() ) + { + mxDragModeMenu->set_sensitive(OUString::number(NAVIGATOR_DRAGTYPE_LINK), false); + mxDragModeMenu->set_sensitive(OUString::number(NAVIGATOR_DRAGTYPE_URL), false); + meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED; + } + + mxDragModeMenu->set_active(OUString::number(meDragType), true); + } + else if (rCommand == "shapes") + { + bool bAll = mxTlbObjects->GetShowAllShapes(); + mxShapeMenu->set_active("named", !bAll); + mxShapeMenu->set_active("all", bAll); + bool bOrderFrontToBack = mxTlbObjects->GetOrderFrontToBack(); + mxShapeMenu->set_active("fronttoback", bOrderFrontToBack); + mxShapeMenu->set_active("backtofront", !bOrderFrontToBack); + } +} + +IMPL_LINK_NOARG(SdNavigatorWin, ClickObjectHdl, weld::TreeView&, bool) +{ + if( !mbDocImported || mxLbDocs->get_active() != 0 ) + { + NavDocInfo* pInfo = GetDocInfo(); + + // if it is the active window, we jump to the page + if( pInfo && pInfo->IsActive() ) + { + OUString aStr(mxTlbObjects->get_cursor_text()); + + if( !aStr.isEmpty() ) + { + sd::DrawDocShell* pDocShell = pInfo->mpDocShell; + if (!pDocShell) + return false; + sd::ViewShell* pViewShell = pDocShell->GetViewShell(); + if (!pViewShell) + return false; + SdrView* pDrawView = pViewShell->GetDrawView(); + if (!pDrawView) + return false; + + // Save the selected tree entries re-mark the objects in the view after navigation. + auto vSelectedEntryIds = mxTlbObjects->GetSelectedEntryIds(); + + // Page entries in the tree have id value 1. Object entries have id value of + // the address of the pointer to the object. + const auto& rCursorEntryId = mxTlbObjects->get_cursor_id(); + auto nCursorEntryId = rCursorEntryId.toInt64(); + SdrObject* pCursorEntryObject = weld::fromId(rCursorEntryId); + + bool bIsCursorEntrySelected(std::find(vSelectedEntryIds.begin(), + vSelectedEntryIds.end(), + rCursorEntryId) != vSelectedEntryIds.end()); + + if (bIsCursorEntrySelected) + { + // Set a temporary name, if need be, so the object can be navigated to. + bool bCursorEntryObjectHasEmptyName = false; + if (nCursorEntryId != 1 && pCursorEntryObject + && pCursorEntryObject->GetName().isEmpty()) + { + bCursorEntryObjectHasEmptyName = true; + bool bUndo = pCursorEntryObject->getSdrModelFromSdrObject().IsUndoEnabled(); + pCursorEntryObject->getSdrModelFromSdrObject().EnableUndo(false); + pCursorEntryObject->SetName(aStr, false); + pCursorEntryObject->getSdrModelFromSdrObject().EnableUndo(bUndo); + } + + // All objects are unmarked when navigating to an object. + SfxStringItem aItem(SID_NAVIGATOR_OBJECT, aStr); + mpBindings->GetDispatcher()->ExecuteList(SID_NAVIGATOR_OBJECT, + SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + + if (bCursorEntryObjectHasEmptyName) + { + bool bUndo = pCursorEntryObject->getSdrModelFromSdrObject().IsUndoEnabled(); + pCursorEntryObject->getSdrModelFromSdrObject().EnableUndo(false); + pCursorEntryObject->SetName(OUString(), false); + pCursorEntryObject->getSdrModelFromSdrObject().EnableUndo(bUndo); + } + + // re-mark the objects + if (bIsCursorEntrySelected) + { + // Mark the objects in the view that are selected in the Navigator tree. + for (auto& rEntryId: vSelectedEntryIds) + { + if (rEntryId != "1") + { + SdrObject* pEntryObject = weld::fromId(rEntryId); + if (pEntryObject) + pDrawView->MarkObj(pEntryObject, pDrawView->GetSdrPageView()); + } + } + } + } + else if (nCursorEntryId != 1 && pCursorEntryObject) + { + // unmark + pDrawView->MarkObj(pCursorEntryObject, pDrawView->GetSdrPageView(), true); + } + + // moved here from SetGetFocusHdl. Reset the + // focus only if something has been selected in the + // document. + SfxViewShell* pCurSh = SfxViewShell::Current(); + + if ( pCurSh ) + { + vcl::Window* pShellWnd = pCurSh->GetWindow(); + if ( pShellWnd ) + pShellWnd->GrabFocus(); + } + + // We navigated to an object, but the current shell may be + // still the slide sorter. Explicitly try to grab the draw + // shell focus, so follow-up operations work with the object + // and not with the whole slide. + vcl::Window* pWindow = pViewShell->GetActiveWindow(); + if (pWindow) + pWindow->GrabFocus(); + + if (!mxTlbObjects->IsNavigationGrabsFocus()) + { + // This is the case when keyboard navigation inside the + // navigator should continue to work. + if (mxNavigatorDlg) + mxNavigatorDlg->GrabFocus(); + mxTlbObjects->grab_focus(); + } + } + } + } + return false; +} + +IMPL_LINK_NOARG(SdNavigatorWin, SelectDocumentHdl, weld::ComboBox&, void) +{ + OUString aStrLb = mxLbDocs->get_active_text(); + tools::Long nPos = mxLbDocs->get_active(); + bool bFound = false; + ::sd::DrawDocShell* pDocShell = nullptr; + NavDocInfo* pInfo = GetDocInfo(); + + // is it a dragged object? + if( mbDocImported && nPos == 0 ) + { + // construct document in TLB + InsertFile( aStrLb ); + } + else if (pInfo) + { + pDocShell = pInfo->mpDocShell; + + bFound = true; + } + + if( bFound ) + { + SdDrawDocument* pDoc = pDocShell->GetDoc(); + if( !mxTlbObjects->IsEqualToDoc( pDoc ) ) + { + SdDrawDocument* pNonConstDoc = pDoc; // const as const can... + ::sd::DrawDocShell* pNCDocShell = pNonConstDoc->GetDocSh(); + OUString aDocName = pNCDocShell->GetMedium()->GetName(); + mxTlbObjects->clear(); + mxTlbObjects->Fill( pDoc, false, aDocName ); // only normal pages + } + } + + // check if link or url is possible + if( ( pInfo && !pInfo->HasName() ) || !mxTlbObjects->IsLinkableSelected() || ( meDragType != NAVIGATOR_DRAGTYPE_EMBEDDED ) ) + { + meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED; + SetDragImage(); + } +} + +/** + * Set DrageType and set image accordingly to it. + */ +IMPL_LINK(SdNavigatorWin, MenuSelectHdl, const OUString&, rIdent, void) +{ + sal_uInt32 nMenuId = rIdent.toUInt32(); + + NavigatorDragType eDT = static_cast(nMenuId); + if( meDragType == eDT ) + return; + + meDragType = eDT; + SetDragImage(); + + if( meDragType == NAVIGATOR_DRAGTYPE_URL ) + { + // patch, prevents endless loop + if (mxTlbObjects->count_selected_rows() > 1) + mxTlbObjects->unselect_all(); + + mxTlbObjects->set_selection_mode(SelectionMode::Single); + } + else + mxTlbObjects->set_selection_mode(SelectionMode::Multiple); +} + +IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, const OUString&, rIdent, void ) +{ + bool bShowAllShapes(mxTlbObjects->GetShowAllShapes()); + bool bOrderFrontToBack(mxTlbObjects->GetOrderFrontToBack()); + if (rIdent == "named") + bShowAllShapes = false; + else if (rIdent == "all") + bShowAllShapes = true; + else if (rIdent == "fronttoback") + bOrderFrontToBack = true; + else if (rIdent == "backtofront") + bOrderFrontToBack = false; + else + OSL_FAIL("SdNavigatorWin::ShapeFilterCallback called for unknown menu entry"); + + mxTlbObjects->SetOrderFrontToBack(bOrderFrontToBack); + mxTlbObjects->SetShowAllShapes(bShowAllShapes, true); + + // Remember the selection in the FrameView. + NavDocInfo* pInfo = GetDocInfo(); + if (pInfo == nullptr) + return; + + ::sd::DrawDocShell* pDocShell = pInfo->mpDocShell; + if (pDocShell != nullptr) + { + ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); + if (pViewShell != nullptr) + { + ::sd::FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView != nullptr) + { + pFrameView->SetIsNavigatorShowingAllShapes(bShowAllShapes); + } + lcl_select_marked_object(pViewShell, mxTlbObjects.get()); + } + } +} + +bool SdNavigatorWin::InsertFile(const OUString& rFileName) +{ + INetURLObject aURL( rFileName ); + + if( aURL.GetProtocol() == INetProtocol::NotValid ) + { + OUString aURLStr; + osl::FileBase::getFileURLFromSystemPath( rFileName, aURLStr ); + aURL = INetURLObject( aURLStr ); + } + + // get adjusted FileName + OUString aFileName( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ); + + if (aFileName.isEmpty()) + { + // show actual document again + maDropFileName = aFileName; + } + else + { + // show dragged-in document + std::shared_ptr pFilter; + ErrCode nErr = ERRCODE_NONE; + + if (aFileName != maDropFileName) + { + SfxMedium aMed(aFileName, (StreamMode::READ | StreamMode::SHARE_DENYNONE)); + SfxFilterMatcher aMatch( "simpress" ); + aMed.UseInteractionHandler( true ); + nErr = aMatch.GuessFilter(aMed, pFilter); + } + + if ((pFilter && !nErr) || aFileName == maDropFileName) + { + // The medium may be opened with READ/WRITE. Therefore, we first + // check if it contains a Storage. + std::unique_ptr xMedium(new SfxMedium(aFileName, + StreamMode::READ | StreamMode::NOCREATE)); + + if (xMedium->IsStorage()) + { + // Now depending on mode: + // mxTlbObjects->set_selection_mode(SelectionMode::Multiple); + // handover of ownership of xMedium; + SdDrawDocument* pDropDoc = mxTlbObjects->GetBookmarkDoc(xMedium.release()); + + if (pDropDoc) + { + mxTlbObjects->clear(); + maDropFileName = aFileName; + + if( !mxTlbObjects->IsEqualToDoc( pDropDoc ) ) + { + // only normal pages + mxTlbObjects->Fill(pDropDoc, false, maDropFileName); + RefreshDocumentLB( &maDropFileName ); + } + } + } + else + { + return false; + } + } + else + { + return false; + } + } + + return true; +} + +void SdNavigatorWin::RefreshDocumentLB( const OUString* pDocName ) +{ + sal_Int32 nPos = 0; + + if( pDocName ) + { + if( mbDocImported ) + mxLbDocs->remove(0); + + mxLbDocs->insert_text(0, *pDocName); + mbDocImported = true; + } + else + { + nPos = mxLbDocs->get_active(); + if (nPos == -1) + nPos = 0; + + OUString aStr; + if( mbDocImported ) + aStr = mxLbDocs->get_text(0); + + mxLbDocs->clear(); + + // delete list of DocInfos + maDocList.clear(); + + if( mbDocImported ) + mxLbDocs->insert_text(0, aStr); + + ::sd::DrawDocShell* pCurrentDocShell = + dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() ); + SfxObjectShell* pSfxDocShell = SfxObjectShell::GetFirst([](const SfxObjectShell*){return true;}, false); + while( pSfxDocShell ) + { + ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( pSfxDocShell ); + if( pDocShell && !pDocShell->IsInDestruction() && ( pDocShell->GetCreateMode() != SfxObjectCreateMode::EMBEDDED ) ) + { + NavDocInfo aInfo ; + aInfo.mpDocShell = pDocShell; + + SfxMedium *pMedium = pDocShell->GetMedium(); + aStr = pMedium ? pMedium->GetName() : OUString(); + if( !aStr.isEmpty() ) + aInfo.SetName( true ); + else + aInfo.SetName( false ); + // at the moment, we use the name of the shell again (i.e. + // without path) since Koose thinks it is an error if the path + // is shown in url notation! + aStr = pDocShell->GetName(); + + mxLbDocs->append_text(aStr); + + if( pDocShell == pCurrentDocShell ) + aInfo.SetActive( true ); + else + aInfo.SetActive( false ); + + maDocList.push_back( aInfo ); + } + pSfxDocShell = SfxObjectShell::GetNext( *pSfxDocShell, [](const SfxObjectShell*){return true;}, false ); + } + } + mxLbDocs->set_active(nPos); +} + +OUString SdNavigatorWin::GetDragTypeSdBmpId(NavigatorDragType eDT) +{ + switch( eDT ) + { + case NAVIGATOR_DRAGTYPE_NONE: + return OUString(); + case NAVIGATOR_DRAGTYPE_URL: + return BMP_HYPERLINK; + case NAVIGATOR_DRAGTYPE_EMBEDDED: + return BMP_EMBEDDED; + case NAVIGATOR_DRAGTYPE_LINK: + return BMP_LINK; + default: OSL_FAIL( "No resource for DragType available!" ); + } + return OUString(); +} + +NavDocInfo* SdNavigatorWin::GetDocInfo() +{ + sal_uInt32 nPos = mxLbDocs->get_active(); + + if( mbDocImported ) + { + if( nPos == 0 ) + { + return nullptr; + } + nPos--; + } + + return nPos < maDocList.size() ? &(maDocList[ nPos ]) : nullptr; +} + +/** + * catch ESCAPE in order to end show + */ +IMPL_LINK(SdNavigatorWin, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + bool bConsumed = false; + + if (KEY_ESCAPE == rKEvt.GetKeyCode().GetCode()) + { + // during drag'n'drop we just stop the drag but do not close the navigator + if (!SdPageObjsTLV::IsInDrag() && !GetObjects().IsEditingActive()) + { + ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame()); + if (pBase) + sd::SlideShow::Stop(*pBase); + bConsumed = true; + } + } + + return bConsumed; +} + +void SdNavigatorWin::SetDragImage() +{ + mxToolbox->set_item_icon_name("dragmode", GetDragTypeSdBmpId(meDragType)); +} + +/** + * ControllerItem for Navigator + */ +SdNavigatorControllerItem::SdNavigatorControllerItem( + sal_uInt16 _nId, + SdNavigatorWin* pNavWin, + SfxBindings* _pBindings, + SdNavigatorWin::UpdateRequestFunctor aUpdateRequest) + : SfxControllerItem( _nId, *_pBindings ), + pNavigatorWin( pNavWin ), + maUpdateRequest(std::move(aUpdateRequest)) +{ +} + +void SdNavigatorControllerItem::StateChangedAtToolBoxControl( sal_uInt16 nSId, + SfxItemState eState, const SfxPoolItem* pItem ) +{ + if( eState < SfxItemState::DEFAULT || nSId != SID_NAVIGATOR_STATE ) + return; + + // only if doc in LB is the active + NavDocInfo* pInfo = pNavigatorWin->GetDocInfo(); + if( !(pInfo && pInfo->IsActive()) ) + return; + + if (::sd::DrawDocShell* pDrawDocShell = pInfo->GetDrawDocShell()) + { + const auto pDrawViewShell = + static_cast<::sd::DrawViewShell *>(pDrawDocShell->GetViewShell()); + if (pDrawViewShell) + { + pNavigatorWin->FreshTree(pDrawDocShell->GetDoc()); + bool bEditModePage(pDrawViewShell->GetEditMode() == EditMode::Page); + pNavigatorWin->mxToolbox->set_sensitive(bEditModePage); + pNavigatorWin->mxLbDocs->set_sensitive(bEditModePage); + pNavigatorWin->mxTlbObjects->set_sensitive(bEditModePage); + } + } + + const SfxUInt32Item& rStateItem = dynamic_cast(*pItem); + NavState nState = static_cast(rStateItem.GetValue()); + + // First + if (nState & NavState::BtnFirstEnabled && + !pNavigatorWin->mxToolbox->get_item_sensitive("first")) + pNavigatorWin->mxToolbox->set_item_sensitive("first", true); + if (nState & NavState::BtnFirstDisabled && + pNavigatorWin->mxToolbox->get_item_sensitive("first")) + pNavigatorWin->mxToolbox->set_item_sensitive("first", false); + + // Prev + if (nState & NavState::BtnPrevEnabled && + !pNavigatorWin->mxToolbox->get_item_sensitive("previous")) + pNavigatorWin->mxToolbox->set_item_sensitive("previous", true); + if (nState & NavState::BtnPrevDisabled && + pNavigatorWin->mxToolbox->get_item_sensitive("previous")) + pNavigatorWin->mxToolbox->set_item_sensitive("previous", false); + + // Last + if (nState & NavState::BtnLastEnabled && + !pNavigatorWin->mxToolbox->get_item_sensitive("last")) + pNavigatorWin->mxToolbox->set_item_sensitive("last", true); + if (nState & NavState::BtnLastDisabled && + pNavigatorWin->mxToolbox->get_item_sensitive("last")) + pNavigatorWin->mxToolbox->set_item_sensitive("last", false); + + // Next + if (nState & NavState::BtnNextEnabled && + !pNavigatorWin->mxToolbox->get_item_sensitive("next")) + pNavigatorWin->mxToolbox->set_item_sensitive("next", true); + if (nState & NavState::BtnNextDisabled && + pNavigatorWin->mxToolbox->get_item_sensitive("next")) + pNavigatorWin->mxToolbox->set_item_sensitive("next", false); + + if (nState & NavState::TableUpdate) + { + // InitTlb; is initiated by Slot + if (maUpdateRequest && !pNavigatorWin->GetObjects().get_treeview().has_focus()) + maUpdateRequest(); + } +} + +/** + * ControllerItem for Navigator to show page in TreeLB + */ +SdPageNameControllerItem::SdPageNameControllerItem( + sal_uInt16 _nId, + SdNavigatorWin* pNavWin, + SfxBindings* _pBindings) + : SfxControllerItem( _nId, *_pBindings ), + pNavigatorWin( pNavWin ) +{ +} + +void SdPageNameControllerItem::StateChangedAtToolBoxControl( sal_uInt16 nSId, + SfxItemState eState, const SfxPoolItem* pItem ) +{ + if( eState < SfxItemState::DEFAULT || nSId != SID_NAVIGATOR_PAGENAME ) + return; + + // only if doc in LB is the active + NavDocInfo* pInfo = pNavigatorWin->GetDocInfo(); + if( !(pInfo && pInfo->IsActive()) ) + return; + + // Without a test for marked objects the page name entry is not selected when there are no + // marked objects. The HasSelectedChildren test is required when in 'Named Shapes' mode in + // order to select the page name when none of the marked objects have a name. + bool bDrawViewHasMarkedObjects = false; + if (pInfo->GetDrawDocShell() && pInfo->GetDrawDocShell()->GetViewShell()) + { + const SdrView* pDrawView = pInfo->GetDrawDocShell()->GetViewShell()->GetDrawView(); + if (pDrawView && pDrawView->GetMarkedObjectCount()) + bDrawViewHasMarkedObjects = true; + } + + const SfxStringItem& rStateItem = dynamic_cast(*pItem); + const OUString& aPageName = rStateItem.GetValue(); + + if (!bDrawViewHasMarkedObjects || !pNavigatorWin->mxTlbObjects->HasSelectedChildren(aPageName)) + { + if (pNavigatorWin->mxTlbObjects->get_selection_mode() == SelectionMode::Multiple) + { + // because otherwise it is always additional select + pNavigatorWin->mxTlbObjects->unselect_all(); + } + pNavigatorWin->mxTlbObjects->SelectEntry( aPageName ); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/paragr.cxx b/sd/source/ui/dlg/paragr.cxx new file mode 100644 index 0000000000..66ac466431 --- /dev/null +++ b/sd/source/ui/dlg/paragr.cxx @@ -0,0 +1,169 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +namespace { + +class SdParagraphNumTabPage : public SfxTabPage +{ +public: + SdParagraphNumTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet); + static std::unique_ptr Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet ); + + static WhichRangesContainer GetRanges(); + + virtual bool FillItemSet( SfxItemSet* rSet ) override; + virtual void Reset( const SfxItemSet* rSet ) override; + +private: + bool mbModified; + std::unique_ptr m_xNewStartCB; + std::unique_ptr m_xNewStartNumberCB; + std::unique_ptr m_xNewStartNF; + + DECL_LINK( ImplNewStartHdl, weld::Toggleable&, void ); +}; + +} + +SdParagraphNumTabPage::SdParagraphNumTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttr) + : SfxTabPage(pPage, pController, "modules/sdraw/ui/paranumberingtab.ui", "DrawParaNumbering", &rAttr) + , mbModified(false) + , m_xNewStartCB(m_xBuilder->weld_check_button("checkbuttonCB_NEW_START")) + , m_xNewStartNumberCB(m_xBuilder->weld_check_button("checkbuttonCB_NUMBER_NEW_START")) + , m_xNewStartNF(m_xBuilder->weld_spin_button("spinbuttonNF_NEW_START")) +{ + m_xNewStartCB->connect_toggled(LINK(this, SdParagraphNumTabPage, ImplNewStartHdl)); + m_xNewStartNumberCB->connect_toggled(LINK(this, SdParagraphNumTabPage, ImplNewStartHdl)); +} + +std::unique_ptr SdParagraphNumTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet * rAttrSet) +{ + return std::make_unique(pPage, pController, *rAttrSet); +} + +WhichRangesContainer SdParagraphNumTabPage::GetRanges() +{ + return WhichRangesContainer(svl::Items); +} + +bool SdParagraphNumTabPage::FillItemSet( SfxItemSet* rSet ) +{ + if (m_xNewStartCB->get_state_changed_from_saved() || + m_xNewStartNumberCB->get_state_changed_from_saved()|| + m_xNewStartNF->get_value_changed_from_saved()) + { + mbModified = true; + bool bNewStartChecked = TRISTATE_TRUE == m_xNewStartCB->get_state(); + bool bNumberNewStartChecked = TRISTATE_TRUE == m_xNewStartNumberCB->get_state(); + rSet->Put(SfxBoolItem(ATTR_NUMBER_NEWSTART, bNewStartChecked)); + + const sal_Int16 nStartAt = static_cast(m_xNewStartNF->get_value()); + rSet->Put(SfxInt16Item(ATTR_NUMBER_NEWSTART_AT, bNumberNewStartChecked && bNewStartChecked ? nStartAt : -1)); + } + + return mbModified; +} + +void SdParagraphNumTabPage::Reset( const SfxItemSet* rSet ) +{ + SfxItemState eItemState = rSet->GetItemState( ATTR_NUMBER_NEWSTART ); + if(eItemState > SfxItemState::DEFAULT ) + { + const SfxBoolItem& rStart = rSet->Get(ATTR_NUMBER_NEWSTART); + m_xNewStartCB->set_state( rStart.GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE ); + } + else + { + m_xNewStartCB->set_state(TRISTATE_INDET); + m_xNewStartCB->set_sensitive(false); + } + m_xNewStartCB->save_state(); + + eItemState = rSet->GetItemState( ATTR_NUMBER_NEWSTART_AT); + if( eItemState > SfxItemState::DEFAULT ) + { + sal_Int16 nNewStart = rSet->Get(ATTR_NUMBER_NEWSTART_AT).GetValue(); + m_xNewStartNumberCB->set_active(-1 != nNewStart); + if(-1 == nNewStart) + nNewStart = 1; + + m_xNewStartNF->set_value(nNewStart); + } + else + { + m_xNewStartCB->set_state(TRISTATE_INDET); + } + ImplNewStartHdl(*m_xNewStartCB); + m_xNewStartNF->save_value(); + m_xNewStartNumberCB->save_state(); + mbModified = false; +} + +IMPL_LINK_NOARG(SdParagraphNumTabPage, ImplNewStartHdl, weld::Toggleable&, void) +{ + bool bEnable = m_xNewStartCB->get_active(); + m_xNewStartNumberCB->set_sensitive(bEnable); + m_xNewStartNF->set_sensitive(bEnable && m_xNewStartNumberCB->get_active()); +} + +SdParagraphDlg::SdParagraphDlg(weld::Window* pParent, const SfxItemSet* pAttr) + : SfxTabDialogController(pParent, "modules/sdraw/ui/drawparadialog.ui", + "DrawParagraphPropertiesDialog", pAttr) +{ + AddTabPage( "labelTP_PARA_STD", RID_SVXPAGE_STD_PARAGRAPH); + + if( SvtCJKOptions::IsAsianTypographyEnabled() ) + AddTabPage( "labelTP_PARA_ASIAN", RID_SVXPAGE_PARA_ASIAN); + else + RemoveTabPage( "labelTP_PARA_ASIAN" ); + + AddTabPage( "labelTP_PARA_ALIGN", RID_SVXPAGE_ALIGN_PARAGRAPH); + + static const bool bShowParaNumbering = ( getenv( "SD_SHOW_NUMBERING_PAGE" ) != nullptr ); + if( bShowParaNumbering ) + AddTabPage( "labelNUMBERING", SdParagraphNumTabPage::Create, SdParagraphNumTabPage::GetRanges ); + else + RemoveTabPage( "labelNUMBERING" ); + + AddTabPage("labelTP_TABULATOR", RID_SVXPAGE_TABULATOR); +} + +void SdParagraphDlg::PageCreated(const OUString& rId, SfxTabPage &rPage) +{ + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + if (rId == "labelTP_PARA_STD") + { + aSet.Put(SfxUInt32Item(SID_SVXSTDPARAGRAPHTABPAGE_ABSLINEDIST, MM50/2)); + rPage.PageCreated(aSet); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/present.cxx b/sd/source/ui/dlg/present.cxx new file mode 100644 index 0000000000..27b9ee3458 --- /dev/null +++ b/sd/source/ui/dlg/present.cxx @@ -0,0 +1,404 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; + +namespace +{ +enum PresenterConsoleMode +{ + FullScreen = 0, + Windowed = 1, + Disabled = 2 +}; +} + +SdStartPresentationDlg::SdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, + const std::vector &rPageNames, SdCustomShowList* pCSList) + : GenericDialogController(pWindow, "modules/simpress/ui/presentationdialog.ui", "PresentationDialog") + , pCustomShowList(pCSList) + , rOutAttrs(rInAttrs) + , mnMonitors(0) + , m_xRbtAll(m_xBuilder->weld_radio_button("allslides")) + , m_xRbtAtDia(m_xBuilder->weld_radio_button("from")) + , m_xRbtCustomshow(m_xBuilder->weld_radio_button("customslideshow")) + , m_xLbDias(m_xBuilder->weld_combo_box("from_cb")) + , m_xLbCustomshow(m_xBuilder->weld_combo_box("customslideshow_cb")) + , m_xRbtStandard(m_xBuilder->weld_radio_button("default")) + , m_xRbtWindow(m_xBuilder->weld_radio_button("window")) + , m_xRbtAuto(m_xBuilder->weld_radio_button("auto")) + , m_xTmfPause(m_xBuilder->weld_formatted_spin_button("pauseduration")) + , m_xFormatter(new weld::TimeFormatter(*m_xTmfPause)) + , m_xCbxAutoLogo(m_xBuilder->weld_check_button("showlogo")) + , m_xCbxManuel(m_xBuilder->weld_check_button("manualslides")) + , m_xCbxMousepointer(m_xBuilder->weld_check_button("pointervisible")) + , m_xCbxPen(m_xBuilder->weld_check_button("pointeraspen")) + , m_xCbxAnimationAllowed(m_xBuilder->weld_check_button("animationsallowed")) + , m_xCbxChangePage(m_xBuilder->weld_check_button("changeslidesbyclick")) + , m_xCbxAlwaysOnTop(m_xBuilder->weld_check_button("alwaysontop")) + , m_xCbxShowNavigationButton(m_xBuilder->weld_check_button("shownavigationbutton")) + , m_xLbNavigationButtonsSize(m_xBuilder->weld_combo_box("navigation_buttons_size_cb")) + , m_xFtNavigationButtonsSize(m_xBuilder->weld_label("navbar_btn_size_label")) + , m_xFrameEnableRemote(m_xBuilder->weld_frame("frameremote")) + , m_xCbxEnableRemote(m_xBuilder->weld_check_button("enableremote")) + , m_xCbxEnableRemoteInsecure(m_xBuilder->weld_check_button("enableremoteinsecure")) + , m_xLbConsole(m_xBuilder->weld_combo_box("console_cb")) + , m_xFtMonitor(m_xBuilder->weld_label("presdisplay_label")) + , m_xLBMonitor(m_xBuilder->weld_combo_box("presdisplay_cb")) + , m_xMonitor(m_xBuilder->weld_label("monitor_str")) + , m_xAllMonitors(m_xBuilder->weld_label("allmonitors_str")) + , m_xMonitorExternal(m_xBuilder->weld_label("externalmonitor_str")) + , m_xExternal(m_xBuilder->weld_label("external_str")) +{ + m_xFormatter->SetExtFormat(ExtTimeFieldFormat::LongDuration); + m_xFormatter->EnableEmptyField(false); + + Link aLink( LINK( this, SdStartPresentationDlg, ChangeRangeHdl ) ); + + m_xRbtAll->connect_toggled( aLink ); + m_xRbtAtDia->connect_toggled( aLink ); + m_xRbtCustomshow->connect_toggled( aLink ); + + aLink = LINK( this, SdStartPresentationDlg, ClickWindowPresentationHdl ); + m_xRbtStandard->connect_toggled( aLink ); + m_xRbtWindow->connect_toggled( aLink ); + m_xRbtAuto->connect_toggled( aLink ); + m_xCbxShowNavigationButton->connect_toggled( aLink ); + + m_xTmfPause->connect_value_changed( LINK( this, SdStartPresentationDlg, ChangePauseHdl ) ); + + // fill Listbox with page names + for (const auto& rPageName : rPageNames) + m_xLbDias->append_text(rPageName); + + if( pCustomShowList ) + { + sal_uInt16 nPosToSelect = pCustomShowList->GetCurPos(); + SdCustomShow* pCustomShow; + // fill Listbox with CustomShows + for( pCustomShow = pCustomShowList->First(); + pCustomShow != nullptr; + pCustomShow = pCustomShowList->Next() ) + { + m_xLbCustomshow->append_text( pCustomShow->GetName() ); + } + m_xLbCustomshow->set_active( nPosToSelect ); + pCustomShowList->Seek( nPosToSelect ); + } + else + m_xRbtCustomshow->set_sensitive(false); + + if( static_cast( rOutAttrs.Get( ATTR_PRESENT_CUSTOMSHOW ) ).GetValue() && pCSList ) + m_xRbtCustomshow->set_active(true); + else if( static_cast( rOutAttrs.Get( ATTR_PRESENT_ALL ) ).GetValue() ) + m_xRbtAll->set_active(true); + else + m_xRbtAtDia->set_active(true); + + m_xLbDias->set_active_text( rOutAttrs.Get( ATTR_PRESENT_DIANAME ).GetValue() ); + m_xCbxManuel->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_MANUEL ) ).GetValue() ); + m_xCbxMousepointer->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_MOUSE ) ).GetValue() ); + m_xCbxPen->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_PEN ) ).GetValue() ); + m_xCbxAnimationAllowed->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_ANIMATION_ALLOWED ) ).GetValue() ); + m_xCbxChangePage->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_CHANGE_PAGE ) ).GetValue() ); + m_xCbxAlwaysOnTop->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_ALWAYS_ON_TOP ) ).GetValue() ); + + const sal_Int32 nActiveNavigationBtnScale = officecfg::Office::Impress::Layout::Display::NavigationBtnScale::get(); + const bool bShowNavbar = officecfg::Office::Impress::Misc::Start::ShowNavigationPanel::get(); + m_xCbxShowNavigationButton->set_active( bShowNavbar ); + if (nActiveNavigationBtnScale != -1) + { + m_xLbNavigationButtonsSize->set_active(nActiveNavigationBtnScale); + } + m_xLbNavigationButtonsSize->set_sensitive( bShowNavbar ); + m_xFtNavigationButtonsSize->set_sensitive( bShowNavbar ); + + const bool bEndless = static_cast( rOutAttrs.Get( ATTR_PRESENT_ENDLESS ) ).GetValue(); + const bool bWindow = !static_cast( rOutAttrs.Get( ATTR_PRESENT_FULLSCREEN ) ).GetValue(); + const tools::Long nPause = rOutAttrs.Get( ATTR_PRESENT_PAUSE_TIMEOUT ).GetValue(); + + m_xFormatter->SetTime( tools::Time( 0, 0, nPause ) ); + // set cursor in timefield to end + m_xTmfPause->set_position(-1); + + m_xCbxAutoLogo->set_active( static_cast( rOutAttrs.Get( ATTR_PRESENT_SHOW_PAUSELOGO ) ).GetValue() ); + + if( bWindow ) + m_xRbtWindow->set_active(true); + else if( bEndless ) + m_xRbtAuto->set_active(true); + else + m_xRbtStandard->set_active(true); + + if (!officecfg::Office::Impress::Misc::Start::EnablePresenterScreen::get()) + m_xLbConsole->set_active(PresenterConsoleMode::Disabled); + else if (officecfg::Office::Impress::Misc::Start::PresenterScreenFullScreen::get()) + m_xLbConsole->set_active(PresenterConsoleMode::FullScreen); + else + m_xLbConsole->set_active(PresenterConsoleMode::Windowed); + +#ifdef ENABLE_SDREMOTE + m_xCbxEnableRemote->connect_toggled( LINK(this, SdStartPresentationDlg, ChangeRemoteHdl) ); + m_xCbxEnableRemote->set_active(officecfg::Office::Impress::Misc::Start::EnableSdremote::get()); + ChangeRemoteHdl(*m_xCbxEnableRemote); + m_xCbxEnableRemoteInsecure->set_active(m_xCbxEnableRemote->get_active() + && officecfg::Office::Security::Net::AllowInsecureImpressRemoteWiFi::get()); +#else + m_xFrameEnableRemote->hide(); +#endif + + InitMonitorSettings(); + + ChangeRangeHdl(*m_xRbtCustomshow); + + ClickWindowPresentationHdl(*m_xRbtStandard); + ChangePause(); +} + +SdStartPresentationDlg::~SdStartPresentationDlg() +{ +} + +short SdStartPresentationDlg::run() +{ + short nRet = GenericDialogController::run(); + if (nRet == RET_OK) + { + std::shared_ptr batch( + comphelper::ConfigurationChanges::create()); + auto nActive = m_xLbConsole->get_active(); + bool bEnabled = nActive != PresenterConsoleMode::Disabled; + officecfg::Office::Impress::Misc::Start::EnablePresenterScreen::set(bEnabled, batch); + if (bEnabled) + { + officecfg::Office::Impress::Misc::Start::PresenterScreenFullScreen::set( + nActive == PresenterConsoleMode::FullScreen, batch); + } + officecfg::Office::Impress::Misc::Start::ShowNavigationPanel::set( + m_xCbxShowNavigationButton->get_active(), batch); + officecfg::Office::Impress::Layout::Display::NavigationBtnScale::set( + m_xLbNavigationButtonsSize->get_active(), batch); + +#ifdef ENABLE_SDREMOTE + officecfg::Office::Impress::Misc::Start::EnableSdremote::set(m_xCbxEnableRemote->get_active(), batch); + officecfg::Office::Security::Net::AllowInsecureImpressRemoteWiFi::set(m_xCbxEnableRemoteInsecure->get_active(), batch); +#endif + batch->commit(); + } + return nRet; +} + +OUString SdStartPresentationDlg::GetDisplayName( sal_Int32 nDisplay, + DisplayType eType ) +{ + OUString aName; + + switch ( eType ) + { + case EXTERNAL_IS_NUMBER: + aName = m_xExternal->get_label(); + break; + case MONITOR_IS_EXTERNAL: + aName = m_xMonitorExternal->get_label(); + break; + default: + case MONITOR_NORMAL: + aName = m_xMonitor->get_label(); + break; + } + aName = aName.replaceFirst( "%1", OUString::number( nDisplay ) ); + + return aName; +} + +/// Store display index together with name in user data +sal_Int32 SdStartPresentationDlg::InsertDisplayEntry(const OUString &aName, + sal_Int32 nDisplay) +{ + m_xLBMonitor->append(OUString::number(nDisplay), aName); + return m_xLBMonitor->get_count() - 1; +} + +void SdStartPresentationDlg::InitMonitorSettings() +{ + try + { + m_xFtMonitor->show(); + m_xLBMonitor->show(); + + mnMonitors = Application::GetScreenCount(); + + if( mnMonitors <= 1 ) + { + m_xFtMonitor->set_sensitive( false ); + m_xLBMonitor->set_sensitive( false ); + } + else + { + sal_Int32 nExternalIndex = Application::GetDisplayExternalScreen(); + + sal_Int32 nSelectedIndex (-1); + sal_Int32 nDefaultExternalIndex (-1); + const sal_Int32 nDefaultSelectedDisplay ( + rOutAttrs.Get( ATTR_PRESENT_DISPLAY ).GetValue()); + + // Un-conditionally add a version for '0' the default external display + sal_Int32 nInsertedEntry; + + // Initial entry - the auto-detected external monitor + OUString aName = GetDisplayName( nExternalIndex + 1, EXTERNAL_IS_NUMBER); + nInsertedEntry = InsertDisplayEntry( aName, 0 ); + if( nDefaultSelectedDisplay == 0) + nSelectedIndex = nInsertedEntry; + + // The user data contains the real setting + for( sal_Int32 nDisplay = 0; nDisplay < mnMonitors; nDisplay++ ) + { + aName = GetDisplayName( nDisplay + 1, + nDisplay == nExternalIndex ? + MONITOR_IS_EXTERNAL : MONITOR_NORMAL ); + nInsertedEntry = InsertDisplayEntry( aName, nDisplay + 1 ); + + // Remember the index of the default selection. + if( nDisplay + 1 == nDefaultSelectedDisplay ) + nSelectedIndex = nInsertedEntry; + + // Remember index of the default display. + if( nDisplay == nExternalIndex ) + nDefaultExternalIndex = nInsertedEntry; + } + + nInsertedEntry = InsertDisplayEntry( m_xAllMonitors->get_label(), -1 ); + if( nDefaultSelectedDisplay == -1 ) + nSelectedIndex = nInsertedEntry; + + if (nSelectedIndex < 0) + { + if (nExternalIndex < 0) + nSelectedIndex = 0; + else + nSelectedIndex = nDefaultExternalIndex; + } + + m_xLBMonitor->set_active(nSelectedIndex); + } + } + catch( Exception& ) + { + } +} + +/** + * sets the selected attributes of the dialog + */ +void SdStartPresentationDlg::GetAttr( SfxItemSet& rAttr ) +{ + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ALL, m_xRbtAll->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_CUSTOMSHOW, m_xRbtCustomshow->get_active() ) ); + rAttr.Put( SfxStringItem ( ATTR_PRESENT_DIANAME, m_xLbDias->get_active_text() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_MANUEL, m_xCbxManuel->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_MOUSE, m_xCbxMousepointer->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_PEN, m_xCbxPen->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ANIMATION_ALLOWED, m_xCbxAnimationAllowed->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_CHANGE_PAGE, m_xCbxChangePage->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ALWAYS_ON_TOP, m_xCbxAlwaysOnTop->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_FULLSCREEN, !m_xRbtWindow->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ENDLESS, m_xRbtAuto->get_active() ) ); + rAttr.Put( SfxUInt32Item ( ATTR_PRESENT_PAUSE_TIMEOUT, m_xFormatter->GetTime().GetMSFromTime() / 1000 ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_SHOW_PAUSELOGO, m_xCbxAutoLogo->get_active() ) ); + + int nPos = m_xLBMonitor->get_active(); + if (nPos != -1) + rAttr.Put(SfxInt32Item(ATTR_PRESENT_DISPLAY, m_xLBMonitor->get_id(nPos).toInt32())); + + nPos = m_xLbCustomshow->get_active(); + if (nPos != -1) + pCustomShowList->Seek( nPos ); +} + +IMPL_LINK_NOARG(SdStartPresentationDlg, ChangeRemoteHdl, weld::Toggleable&, void) +{ + m_xCbxEnableRemoteInsecure->set_sensitive(m_xCbxEnableRemote->get_active()); +} + +/** + * Handler: Enabled/Disabled Listbox "Dias" + */ +IMPL_LINK_NOARG(SdStartPresentationDlg, ChangeRangeHdl, weld::Toggleable&, void) +{ + m_xLbDias->set_sensitive( m_xRbtAtDia->get_active() ); + m_xLbCustomshow->set_sensitive( m_xRbtCustomshow->get_active() ); +} + +/** + * Handler: Enabled/Disabled Checkbox "AlwaysOnTop" + */ +IMPL_LINK_NOARG(SdStartPresentationDlg, ClickWindowPresentationHdl, weld::Toggleable&, void) +{ + const bool bAuto = m_xRbtAuto->get_active(); + const bool bWindow = m_xRbtWindow->get_active(); + + m_xTmfPause->set_sensitive( bAuto ); + m_xCbxAutoLogo->set_sensitive( bAuto && ( m_xFormatter->GetTime().GetMSFromTime() > 0 ) ); + + const bool bDisplay = !bWindow && ( mnMonitors > 1 ); + m_xFtMonitor->set_sensitive( bDisplay ); + m_xLBMonitor->set_sensitive( bDisplay ); + + const bool bShowNavbar = m_xCbxShowNavigationButton->get_active(); + m_xLbNavigationButtonsSize->set_sensitive( bShowNavbar ); + m_xFtNavigationButtonsSize->set_sensitive( bShowNavbar ); + + if( bWindow ) + { + m_xCbxAlwaysOnTop->set_sensitive(false); + m_xCbxAlwaysOnTop->set_active(false); + } + else + m_xCbxAlwaysOnTop->set_sensitive(true); +} + +/** + * Handler: Enabled/Disabled Checkbox "AlwaysOnTop" + */ +IMPL_LINK_NOARG(SdStartPresentationDlg, ChangePauseHdl, weld::FormattedSpinButton&, void) +{ + ChangePause(); +} + +void SdStartPresentationDlg::ChangePause() +{ + m_xCbxAutoLogo->set_sensitive(m_xRbtAuto->get_active() && ( m_xFormatter->GetTime().GetMSFromTime() > 0 )); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/prltempl.cxx b/sd/source/ui/dlg/prltempl.cxx new file mode 100644 index 0000000000..d7305eb446 --- /dev/null +++ b/sd/source/ui/dlg/prltempl.cxx @@ -0,0 +1,304 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define IS_OUTLINE(x) (x >= PresentationObjects::Outline_1 && x <= PresentationObjects::Outline_9) + +/** + * Constructor of Tab dialog: appends pages to the dialog + */ +SdPresLayoutTemplateDlg::SdPresLayoutTemplateDlg(SfxObjectShell const * pDocSh, + weld::Window* pParent, + bool bBackground, + SfxStyleSheetBase& rStyleBase, + PresentationObjects _ePO, + SfxStyleSheetBasePool* pSSPool) + : SfxTabDialogController(pParent, "modules/sdraw/ui/drawprtldialog.ui", "DrawPRTLDialog") + , mpDocShell(pDocSh) + , ePO(_ePO) + , aInputSet(*rStyleBase.GetItemSet().GetPool(), svl::Items) +{ + const SfxItemSet* pOrgSet(&rStyleBase.GetItemSet()); + + if( IS_OUTLINE(ePO)) + { + // Unfortunately, the Itemsets of our style sheets are not discrete... + const WhichRangesContainer& pPtr = pOrgSet->GetRanges(); + sal_uInt16 p1, p2; + for( sal_Int32 i = 0; i < pPtr.size(); ++i ) + { + p1 = pPtr[i].first; + p2 = pPtr[i].second; + + // first, we make it discrete + while(i < pPtr.size() - 1 && (pPtr[i+1].first - p2 == 1)) + { + p2 = pPtr[i+1].second; + ++i; + } + aInputSet.MergeRange( p1, p2 ); + } + + aInputSet.Put( rStyleBase.GetItemSet() ); + + // need parent-relationship + const SfxItemSet* pParentItemSet = rStyleBase.GetItemSet().GetParent(); + if( pParentItemSet ) + aInputSet.SetParent( pParentItemSet ); + + pOutSet.reset( new SfxItemSet( rStyleBase.GetItemSet() ) ); + pOutSet->ClearItem(); + + // If there is no bullet item in this stylesheet, we get it + // from 'Outline 1' style sheet. + const SfxPoolItem *pItem = nullptr; + if( SfxItemState::SET != aInputSet.GetItemState(EE_PARA_NUMBULLET, false, &pItem )) + { + OUString aStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " 1"); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( aStyleName, SfxStyleFamily::Pseudo); + + if(pFirstStyleSheet) + if( SfxItemState::SET == pFirstStyleSheet->GetItemSet().GetItemState(EE_PARA_NUMBULLET, false, &pItem) ) + aInputSet.Put( *pItem ); + } + + // preselect selected layer in dialog + aInputSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, 1<GetItem( SID_COLOR_TABLE ); + SvxGradientListItem const *pGradientListItem = mpDocShell->GetItem( SID_GRADIENT_LIST ); + SvxBitmapListItem const *pBitmapListItem = mpDocShell->GetItem( SID_BITMAP_LIST ); + SvxPatternListItem const *pPatternListItem = mpDocShell->GetItem( SID_PATTERN_LIST ); + SvxHatchListItem const *pHatchListItem = mpDocShell->GetItem( SID_HATCH_LIST ); + SvxDashListItem const *pDashListItem = mpDocShell->GetItem( SID_DASH_LIST ); + SvxLineEndListItem const *pLineEndListItem = mpDocShell->GetItem( SID_LINEEND_LIST ); + + pColorTab = pColorListItem->GetColorList(); + pDashList = pDashListItem->GetDashList(); + pLineEndList = pLineEndListItem->GetLineEndList(); + pGradientList = pGradientListItem->GetGradientList(); + pHatchingList = pHatchListItem->GetHatchList(); + pBitmapList = pBitmapListItem->GetBitmapList(); + pPatternList = pPatternListItem->GetPatternList(); + + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + + AddTabPage( "RID_SVXPAGE_LINE", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_LINE ), nullptr ); + AddTabPage( "RID_SVXPAGE_AREA", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_AREA ), nullptr ); + AddTabPage( "RID_SVXPAGE_SHADOW", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_SHADOW ), nullptr ); + AddTabPage( "RID_SVXPAGE_TRANSPARENCE", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_TRANSPARENCE ), nullptr ); + AddTabPage( "RID_SVXPAGE_CHAR_NAME", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_NAME ), nullptr ); + AddTabPage( "RID_SVXPAGE_CHAR_EFFECTS", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_EFFECTS ), nullptr ); + AddTabPage( "RID_SVXPAGE_STD_PARAGRAPH", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_STD_PARAGRAPH ), nullptr ); + AddTabPage( "RID_SVXPAGE_TEXTATTR", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_TEXTATTR ), nullptr ); + AddTabPage( "RID_SVXPAGE_PICK_BULLET", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PICK_BULLET ), nullptr ); + AddTabPage( "RID_SVXPAGE_PICK_SINGLE_NUM", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PICK_SINGLE_NUM ), nullptr ); + AddTabPage( "RID_SVXPAGE_PICK_BMP", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PICK_BMP ), nullptr ); + AddTabPage( "RID_SVXPAGE_NUM_OPTIONS", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_NUM_OPTIONS ), nullptr ); + AddTabPage( "RID_SVXPAGE_TABULATOR", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_TABULATOR ), nullptr ); + AddTabPage( "RID_SVXPAGE_PARA_ASIAN", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PARA_ASIAN ), nullptr ); + AddTabPage( "RID_SVXPAGE_ALIGN_PARAGRAPH", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_ALIGN_PARAGRAPH ), nullptr ); + AddTabPage( "RID_SVXPAGE_BKG", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BKG ), nullptr); + + if (!SvtCJKOptions::IsAsianTypographyEnabled() || bBackground) + RemoveTabPage( "RID_SVXPAGE_PARA_ASIAN" ); + + if (bBackground) + { + RemoveTabPage( "RID_SVXPAGE_LINE"); + + RemoveTabPage( "RID_SVXPAGE_SHADOW"); + RemoveTabPage( "RID_SVXPAGE_TRANSPARENCE"); + RemoveTabPage( "RID_SVXPAGE_CHAR_NAME"); + RemoveTabPage( "RID_SVXPAGE_CHAR_EFFECTS"); + RemoveTabPage( "RID_SVXPAGE_STD_PARAGRAPH"); + RemoveTabPage( "RID_SVXPAGE_TEXTATTR"); + RemoveTabPage( "RID_SVXPAGE_PICK_BULLET"); + RemoveTabPage( "RID_SVXPAGE_PICK_SINGLE_NUM"); + RemoveTabPage( "RID_SVXPAGE_PICK_BMP"); + RemoveTabPage( "RID_SVXPAGE_NUM_OPTIONS"); + RemoveTabPage( "RID_SVXPAGE_TABULATOR"); + RemoveTabPage( "RID_SVXPAGE_ALIGN_PARAGRAPH"); + RemoveTabPage( "RID_SVXPAGE_BKG" ); + } + + // set title and add corresponding pages to dialog + OUString aTitle; + + switch( ePO ) + { + case PresentationObjects::Title: + aTitle = SdResId(STR_PSEUDOSHEET_TITLE); + break; + + case PresentationObjects::Subtitle: + aTitle = SdResId(STR_PSEUDOSHEET_SUBTITLE); + break; + + case PresentationObjects::Background: + aTitle = SdResId(STR_PSEUDOSHEET_BACKGROUND); + break; + + case PresentationObjects::BackgroundObjects: + aTitle = SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS); + break; + + case PresentationObjects::Outline_1: + case PresentationObjects::Outline_2: + case PresentationObjects::Outline_3: + case PresentationObjects::Outline_4: + case PresentationObjects::Outline_5: + case PresentationObjects::Outline_6: + case PresentationObjects::Outline_7: + case PresentationObjects::Outline_8: + case PresentationObjects::Outline_9: + aTitle = SdResId(STR_PSEUDOSHEET_OUTLINE) + " " + + OUString::number( static_cast(ePO) - static_cast(PresentationObjects::Outline_1) + 1 ); + break; + + case PresentationObjects::Notes: + aTitle = SdResId(STR_PSEUDOSHEET_NOTES); + break; + } + m_xDialog->set_title(aTitle); +} + +SdPresLayoutTemplateDlg::~SdPresLayoutTemplateDlg() +{ +} + +void SdPresLayoutTemplateDlg::PageCreated(const OUString& rId, SfxTabPage &rPage) +{ + SfxAllItemSet aSet(*(aInputSet.GetPool())); + + if (rId == "RID_SVXPAGE_LINE") + { + aSet.Put (SvxColorListItem(pColorTab,SID_COLOR_TABLE)); + aSet.Put (SvxDashListItem(pDashList,SID_DASH_LIST)); + aSet.Put (SvxLineEndListItem(pLineEndList,SID_LINEEND_LIST)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_AREA") + { + aSet.Put (SvxColorListItem(pColorTab,SID_COLOR_TABLE)); + aSet.Put (SvxGradientListItem(pGradientList,SID_GRADIENT_LIST)); + aSet.Put (SvxHatchListItem(pHatchingList,SID_HATCH_LIST)); + aSet.Put (SvxBitmapListItem(pBitmapList,SID_BITMAP_LIST)); + aSet.Put (SvxPatternListItem(pPatternList,SID_PATTERN_LIST)); + aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + aSet.Put (SfxUInt16Item(SID_TABPAGE_POS,0)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_SHADOW") + { + aSet.Put (SvxColorListItem(pColorTab,SID_COLOR_TABLE)); + aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_TRANSPARENCE") + { + aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_CHAR_NAME") + { + SvxFontListItem aItem(*static_cast(mpDocShell->GetItem( SID_ATTR_CHAR_FONTLIST) ) ); + aSet.Put (SvxFontListItem( aItem.GetFontList(), SID_ATTR_CHAR_FONTLIST)); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_CHAR_EFFECTS") + { + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_TEXTATTR") + { + aSet.Put(CntUInt16Item(SID_SVXTEXTATTRPAGE_OBJKIND, static_cast(SdrObjKind::Text))); + rPage.PageCreated(aSet); + } + else if (rId == "RID_SVXPAGE_BKG") + { + aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR))); + rPage.PageCreated(aSet); + } +} + +const SfxItemSet* SdPresLayoutTemplateDlg::GetOutputItemSet() const +{ + if (pOutSet) + { + pOutSet->Put(*SfxTabDialogController::GetOutputItemSet()); + + const SvxNumBulletItem *pSvxNumBulletItem = pOutSet->GetItemIfSet(EE_PARA_NUMBULLET, false); + if (pSvxNumBulletItem) + SdBulletMapper::MapFontsInNumRule( const_cast(pSvxNumBulletItem->GetNumRule()), *pOutSet ); + return pOutSet.get(); + } + else + return SfxTabDialogController::GetOutputItemSet(); +} + +sal_uInt16 SdPresLayoutTemplateDlg::GetOutlineLevel() const +{ + switch( ePO ) + { + case PresentationObjects::Outline_1: return 0; + case PresentationObjects::Outline_2: return 1; + case PresentationObjects::Outline_3: return 2; + case PresentationObjects::Outline_4: return 3; + case PresentationObjects::Outline_5: return 4; + case PresentationObjects::Outline_6: return 5; + case PresentationObjects::Outline_7: return 6; + case PresentationObjects::Outline_8: return 7; + case PresentationObjects::Outline_9: return 8; + default: + SAL_WARN( "sd", "Wrong Po! [CL]"); + } + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/prntopts.cxx b/sd/source/ui/dlg/prntopts.cxx new file mode 100644 index 0000000000..0349fe6889 --- /dev/null +++ b/sd/source/ui/dlg/prntopts.cxx @@ -0,0 +1,351 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +/** + * dialog to adjust print options + */ +SdPrintOptions::SdPrintOptions(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs) + : SfxTabPage(pPage, pController, "modules/simpress/ui/prntopts.ui", "prntopts", &rInAttrs) + , m_bDrawMode(false) + , m_xFrmContent(m_xBuilder->weld_frame("contentframe")) + , m_xCbxDraw(m_xBuilder->weld_check_button("drawingcb")) + , m_xCbxNotes(m_xBuilder->weld_check_button("notecb")) + , m_xCbxHandout(m_xBuilder->weld_check_button("handoutcb")) + , m_xCbxOutline(m_xBuilder->weld_check_button("outlinecb")) + , m_xRbtColor(m_xBuilder->weld_radio_button("defaultrb")) + , m_xRbtGrayscale(m_xBuilder->weld_radio_button("grayscalerb")) + , m_xRbtBlackWhite(m_xBuilder->weld_radio_button("blackwhiterb")) + , m_xRbQualityImg(m_xBuilder->weld_widget("lockquality")) + , m_xCbxPagename(m_xBuilder->weld_check_button("pagenmcb")) + , m_xCbxPagenameImg(m_xBuilder->weld_widget("lockpagenmcb")) + , m_xCbxDate(m_xBuilder->weld_check_button("datecb")) + , m_xCbxDateImg(m_xBuilder->weld_widget("lockdatecb")) + , m_xCbxTime(m_xBuilder->weld_check_button("timecb")) + , m_xCbxTimeImg(m_xBuilder->weld_widget("locktimecb")) + , m_xCbxHiddenPages(m_xBuilder->weld_check_button("hiddenpgcb")) + , m_xCbxHiddenPagesImg(m_xBuilder->weld_widget("lockhiddenpgcb")) + , m_xRbtDefault(m_xBuilder->weld_radio_button("pagedefaultrb")) + , m_xRbtPagesize(m_xBuilder->weld_radio_button("fittopgrb")) + , m_xRbtPagetile(m_xBuilder->weld_radio_button("tilepgrb")) + , m_xRbtBooklet(m_xBuilder->weld_radio_button("brouchrb")) + , m_xGridPageOpt(m_xBuilder->weld_widget("pageoptions")) + , m_xRbtPageOptImg(m_xBuilder->weld_widget("lockpageoptions")) + , m_xCbxFront(m_xBuilder->weld_check_button("frontcb")) + , m_xCbxFrontImg(m_xBuilder->weld_widget("lockfrontcb")) + , m_xCbxBack(m_xBuilder->weld_check_button("backcb")) + , m_xCbxBackImg(m_xBuilder->weld_widget("lockbackcb")) + , m_xCbxPaperbin(m_xBuilder->weld_check_button("papertryfrmprntrcb")) + , m_xCbxPaperbinImg(m_xBuilder->weld_widget("lockpapertryfrmprntrcb")) +{ + Link aLink = LINK( this, SdPrintOptions, ClickBookletHdl ); + m_xRbtDefault->connect_toggled( aLink ); + m_xRbtPagesize->connect_toggled( aLink ); + m_xRbtPagetile->connect_toggled( aLink ); + m_xRbtBooklet->connect_toggled( aLink ); + + aLink = LINK( this, SdPrintOptions, ClickCheckboxHdl ); + m_xCbxDraw->connect_toggled( aLink ); + m_xCbxNotes->connect_toggled( aLink ); + m_xCbxHandout->connect_toggled( aLink ); + m_xCbxOutline->connect_toggled( aLink ); + +#ifndef MACOSX + SetDrawMode(); +#endif +} + +SdPrintOptions::~SdPrintOptions() +{ +} + +OUString SdPrintOptions::GetAllStrings() +{ + OUString sAllStrings; + OUString labels[] = { "label3", "label2", "printlbl", "contentlbl" }; + + for (const auto& label : labels) + { + if (const auto& pString = m_xBuilder->weld_label(label)) + sAllStrings += pString->get_label() + " "; + } + + OUString checkButton[] = { "frontcb", "backcb", "papertryfrmprntrcb", "pagenmcb", + "datecb", "timecb", "hiddenpgcb", "drawingcb", + "notecb", "handoutcb", "outlinecb" }; + + for (const auto& check : checkButton) + { + if (const auto& pString = m_xBuilder->weld_check_button(check)) + sAllStrings += pString->get_label() + " "; + } + + OUString radioButton[] = { "pagedefaultrb", "fittopgrb", "tilepgrb", "brouchrb", + "defaultrb", "grayscalerb", "blackwhiterb" }; + + for (const auto& radio : radioButton) + { + if (const auto& pString = m_xBuilder->weld_radio_button(radio)) + sAllStrings += pString->get_label() + " "; + } + + return sAllStrings.replaceAll("_", ""); +} + +bool SdPrintOptions::FillItemSet( SfxItemSet* rAttrs ) +{ + if( m_xCbxDraw->get_state_changed_from_saved() || + m_xCbxNotes->get_state_changed_from_saved() || + m_xCbxHandout->get_state_changed_from_saved() || + m_xCbxOutline->get_state_changed_from_saved() || + m_xCbxDate->get_state_changed_from_saved() || + m_xCbxTime->get_state_changed_from_saved() || + m_xCbxPagename->get_state_changed_from_saved() || + m_xCbxHiddenPages->get_state_changed_from_saved() || + m_xRbtPagesize->get_state_changed_from_saved() || + m_xRbtPagetile->get_state_changed_from_saved() || + m_xRbtBooklet->get_state_changed_from_saved() || + m_xCbxFront->get_state_changed_from_saved() || + m_xCbxBack->get_state_changed_from_saved() || + m_xCbxPaperbin->get_state_changed_from_saved() || + m_xRbtColor->get_state_changed_from_saved() || + m_xRbtGrayscale->get_state_changed_from_saved()|| + m_xRbtBlackWhite->get_state_changed_from_saved()) + { + SdOptionsPrintItem aOptions; + + aOptions.GetOptionsPrint().SetDraw( m_xCbxDraw->get_active() ); + aOptions.GetOptionsPrint().SetNotes( m_xCbxNotes->get_active() ); + aOptions.GetOptionsPrint().SetHandout( m_xCbxHandout->get_active() ); + aOptions.GetOptionsPrint().SetOutline( m_xCbxOutline->get_active() ); + aOptions.GetOptionsPrint().SetDate( m_xCbxDate->get_active() ); + aOptions.GetOptionsPrint().SetTime( m_xCbxTime->get_active() ); + aOptions.GetOptionsPrint().SetPagename( m_xCbxPagename->get_active() ); + aOptions.GetOptionsPrint().SetHiddenPages( m_xCbxHiddenPages->get_active() ); + aOptions.GetOptionsPrint().SetPagesize( m_xRbtPagesize->get_active() ); + aOptions.GetOptionsPrint().SetPagetile( m_xRbtPagetile->get_active() ); + aOptions.GetOptionsPrint().SetBooklet( m_xRbtBooklet->get_active() ); + aOptions.GetOptionsPrint().SetFrontPage( m_xCbxFront->get_active() ); + aOptions.GetOptionsPrint().SetBackPage( m_xCbxBack->get_active() ); + aOptions.GetOptionsPrint().SetPaperbin( m_xCbxPaperbin->get_active() ); + + sal_uInt16 nQuality = 0; // Standard, also Color + if( m_xRbtGrayscale->get_active() ) + nQuality = 1; + if( m_xRbtBlackWhite->get_active() ) + nQuality = 2; + aOptions.GetOptionsPrint().SetOutputQuality( nQuality ); + + rAttrs->Put( aOptions ); + + return true; + } + return false; +} + +void SdPrintOptions::Reset( const SfxItemSet* rAttrs ) +{ + const SdOptionsPrintItem* pPrintOpts = rAttrs->GetItemIfSet( ATTR_OPTIONS_PRINT, false); + if( pPrintOpts ) + { + m_xCbxDraw->set_active( pPrintOpts->GetOptionsPrint().IsDraw() ); + m_xCbxNotes->set_active( pPrintOpts->GetOptionsPrint().IsNotes() ); + m_xCbxHandout->set_active( pPrintOpts->GetOptionsPrint().IsHandout() ); + m_xCbxOutline->set_active( pPrintOpts->GetOptionsPrint().IsOutline() ); + m_xCbxDate->set_active( pPrintOpts->GetOptionsPrint().IsDate() ); + m_xCbxTime->set_active( pPrintOpts->GetOptionsPrint().IsTime() ); + m_xCbxPagename->set_active( pPrintOpts->GetOptionsPrint().IsPagename() ); + m_xCbxHiddenPages->set_active( pPrintOpts->GetOptionsPrint().IsHiddenPages() ); + m_xRbtPagesize->set_active( pPrintOpts->GetOptionsPrint().IsPagesize() ); + m_xRbtPagetile->set_active( pPrintOpts->GetOptionsPrint().IsPagetile() ); + m_xRbtBooklet->set_active( pPrintOpts->GetOptionsPrint().IsBooklet() ); + m_xCbxFront->set_active( pPrintOpts->GetOptionsPrint().IsFrontPage() ); + m_xCbxBack->set_active( pPrintOpts->GetOptionsPrint().IsBackPage() ); + m_xCbxPaperbin->set_active( pPrintOpts->GetOptionsPrint().IsPaperbin() ); + + if( !m_xRbtPagesize->get_active() && + !m_xRbtPagetile->get_active() && + !m_xRbtBooklet->get_active() ) + { + m_xRbtDefault->set_active(true); + } + + sal_uInt16 nQuality = pPrintOpts->GetOptionsPrint().GetOutputQuality(); + if( nQuality == 0 ) + m_xRbtColor->set_active(true); + else if( nQuality == 1 ) + m_xRbtGrayscale->set_active(true); + else + m_xRbtBlackWhite->set_active(true); + } + + bool bReadOnly = false; + if (m_bDrawMode) + { + bReadOnly = officecfg::Office::Draw::Print::Page::PageSize::isReadOnly() || + officecfg::Office::Draw::Print::Page::PageTile::isReadOnly() || + officecfg::Office::Draw::Print::Page::Booklet::isReadOnly(); + } + else + { + bReadOnly = officecfg::Office::Impress::Print::Page::PageSize::isReadOnly() || + officecfg::Office::Impress::Print::Page::PageTile::isReadOnly() || + officecfg::Office::Impress::Print::Page::Booklet::isReadOnly(); + } + m_xGridPageOpt->set_sensitive(!bReadOnly); + m_xRbtPageOptImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Page::BookletFront::isReadOnly() : + officecfg::Office::Impress::Print::Page::BookletFront::isReadOnly(); + m_xCbxFront->set_sensitive(!bReadOnly); + m_xCbxFrontImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Page::BookletBack::isReadOnly() : + officecfg::Office::Impress::Print::Page::BookletBack::isReadOnly(); + m_xCbxBack->set_sensitive(!bReadOnly); + m_xCbxBackImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::FromPrinterSetup::isReadOnly() : + officecfg::Office::Impress::Print::Other::FromPrinterSetup::isReadOnly(); + m_xCbxPaperbin->set_sensitive(!bReadOnly); + m_xCbxPaperbinImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::PageName::isReadOnly() : + officecfg::Office::Impress::Print::Other::PageName::isReadOnly(); + m_xCbxPagename->set_sensitive(!bReadOnly); + m_xCbxPagenameImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::Date::isReadOnly() : + officecfg::Office::Impress::Print::Other::Date::isReadOnly(); + m_xCbxDate->set_sensitive(!bReadOnly); + m_xCbxDateImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::Time::isReadOnly() : + officecfg::Office::Impress::Print::Other::Time::isReadOnly(); + m_xCbxTime->set_sensitive(!bReadOnly); + m_xCbxTimeImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::HiddenPage::isReadOnly() : + officecfg::Office::Impress::Print::Other::HiddenPage::isReadOnly(); + m_xCbxHiddenPages->set_sensitive(!bReadOnly); + m_xCbxHiddenPagesImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::Quality::isReadOnly() : + officecfg::Office::Impress::Print::Other::Quality::isReadOnly(); + m_xRbtColor->set_sensitive(!bReadOnly); + m_xRbtGrayscale->set_sensitive(!bReadOnly); + m_xRbtBlackWhite->set_sensitive(!bReadOnly); + m_xRbQualityImg->set_visible(bReadOnly); + + m_xCbxDraw->save_state(); + m_xCbxNotes->save_state(); + m_xCbxHandout->save_state(); + m_xCbxOutline->save_state(); + m_xCbxDate->save_state(); + m_xCbxTime->save_state(); + m_xCbxPagename->save_state(); + m_xCbxHiddenPages->save_state(); + m_xRbtPagesize->save_state(); + m_xRbtPagetile->save_state(); + m_xRbtBooklet->save_state(); + m_xCbxPaperbin->save_state(); + m_xRbtColor->save_state(); + m_xRbtGrayscale->save_state(); + m_xRbtBlackWhite->save_state(); + + updateControls(); +} + +std::unique_ptr SdPrintOptions::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rOutAttrs ) +{ + return std::make_unique( pPage, pController, *rOutAttrs ); +} + +IMPL_LINK(SdPrintOptions, ClickCheckboxHdl, weld::Toggleable&, rCbx, void) +{ + // there must be at least one of them checked + if( !m_xCbxDraw->get_active() && !m_xCbxNotes->get_active() && !m_xCbxOutline->get_active() && !m_xCbxHandout->get_active() ) + rCbx.set_active(true); + + updateControls(); +} + +IMPL_LINK_NOARG(SdPrintOptions, ClickBookletHdl, weld::Toggleable&, void) +{ + updateControls(); +} + +void SdPrintOptions::updateControls() +{ + bool bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Page::BookletFront::isReadOnly() : + officecfg::Office::Impress::Print::Page::BookletFront::isReadOnly(); + m_xCbxFront->set_sensitive(m_xRbtBooklet->get_active() && !bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Page::BookletBack::isReadOnly() : + officecfg::Office::Impress::Print::Page::BookletBack::isReadOnly(); + m_xCbxBack->set_sensitive(m_xRbtBooklet->get_active() && !bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::Date::isReadOnly() : + officecfg::Office::Impress::Print::Other::Date::isReadOnly(); + m_xCbxDate->set_sensitive(!m_xRbtBooklet->get_active() && !bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::Time::isReadOnly() : + officecfg::Office::Impress::Print::Other::Time::isReadOnly(); + m_xCbxTime->set_sensitive(!m_xRbtBooklet->get_active() && !bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Print::Other::PageName::isReadOnly() : + officecfg::Office::Impress::Print::Other::PageName::isReadOnly(); + m_xCbxPagename->set_sensitive( !m_xRbtBooklet->get_active() && !bReadOnly && + (m_xCbxDraw->get_active() || m_xCbxNotes->get_active() || m_xCbxOutline->get_active()) ); +} + +void SdPrintOptions::SetDrawMode() +{ + if (m_xCbxNotes->get_visible()) + { + m_xFrmContent->hide(); + } +} + +void SdPrintOptions::PageCreated (const SfxAllItemSet& aSet) +{ + const SfxUInt32Item* pFlagItem = aSet.GetItem(SID_SDMODE_FLAG, false); + if (pFlagItem) + { + sal_uInt32 nFlags=pFlagItem->GetValue(); + if ( ( nFlags & SD_DRAW_MODE ) == SD_DRAW_MODE ) + m_bDrawMode = true; + } +#ifdef MACOSX + if (m_bDrawMode) + SetDrawMode(); +#else + SetDrawMode(); +#endif +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/sdabstdlg.cxx b/sd/source/ui/dlg/sdabstdlg.cxx new file mode 100644 index 0000000000..2b686a3e88 --- /dev/null +++ b/sd/source/ui/dlg/sdabstdlg.cxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +typedef SdAbstractDialogFactory* (*SdFuncPtrCreateDialogFactory)(); + +#ifndef DISABLE_DYNLOADING + +extern "C" { +static void thisModule() {} +} + +#else + +extern "C" SdAbstractDialogFactory* SdCreateDialogFactory(); + +#endif + +SdAbstractDialogFactory* SdAbstractDialogFactory::Create() +{ + SdFuncPtrCreateDialogFactory fp = nullptr; +#ifndef DISABLE_DYNLOADING + static ::osl::Module aDialogLibrary; + static constexpr OUStringLiteral sLibName(u"" SDUI_DLL_NAME); + if (aDialogLibrary.is() || aDialogLibrary.loadRelative(&thisModule, sLibName)) + fp = reinterpret_cast( + aDialogLibrary.getFunctionSymbol("SdCreateDialogFactory")); +#else + fp = SdCreateDialogFactory; +#endif + if (fp) + return fp(); + return nullptr; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/sddlgfact.cxx b/sd/source/ui/dlg/sddlgfact.cxx new file mode 100644 index 0000000000..3812171511 --- /dev/null +++ b/sd/source/ui/dlg/sddlgfact.cxx @@ -0,0 +1,712 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "sddlgfact.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "RemoteDialog.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "PhotoAlbumDialog.hxx" +#include + +short AbstractSvxBulletAndPositionDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short SdAbstractGenericDialog_Impl::Execute() +{ + return m_xDlg->run(); +} + +BitmapEx SdAbstractGenericDialog_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString SdAbstractGenericDialog_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +const SfxItemSet* AbstractSvxBulletAndPositionDlg_Impl::GetOutputItemSet( SfxItemSet* pSet ) const +{ + return m_xDlg->GetOutputItemSet( pSet ); +} + +bool AbstractSvxBulletAndPositionDlg_Impl::IsApplyToMaster() +{ + return m_xDlg->IsApplyToMaster(); +} + +bool AbstractSvxBulletAndPositionDlg_Impl::IsSlideScope() +{ + return m_xDlg->IsSlideScope(); +} + +short AbstractCopyDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdCustomShowDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short SdPresLayoutTemplateDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +bool SdPresLayoutTemplateDlg_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + +short AbstractSdModifyFieldDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdSnapLineDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdInsertLayerDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdInsertPagesObjsDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractMorphDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdStartPresDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdPresLayoutDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short SdAbstractSfxDialog_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractSdVectorizeDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +short AbstractHeaderFooterDialog_Impl::Execute() +{ + return m_xDlg->run(); +} + +bool AbstractHeaderFooterDialog_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + +BitmapEx AbstractHeaderFooterDialog_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractHeaderFooterDialog_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +short AbstractBulletDialog_Impl::Execute() +{ + return m_xDlg->run(); +} + +bool AbstractBulletDialog_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + +AbstractBreakDlg_Impl::AbstractBreakDlg_Impl(std::unique_ptr<::sd::BreakDlg> pDlg) + : m_xDlg(std::move(pDlg)) +{ +} + +short AbstractBreakDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +BitmapEx AbstractBreakDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractBreakDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +AbstractMasterLayoutDialog_Impl::AbstractMasterLayoutDialog_Impl(std::unique_ptr<::sd::MasterLayoutDialog> pDlg) + : m_xDlg(std::move(pDlg)) +{ +} + +short AbstractMasterLayoutDialog_Impl::Execute() +{ + return m_xDlg->run(); +} + +BitmapEx AbstractMasterLayoutDialog_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractMasterLayoutDialog_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractCopyDlg_Impl::GetAttr( SfxItemSet& rOutAttrs ) +{ + m_xDlg->GetAttr( rOutAttrs ); +} + +BitmapEx AbstractCopyDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractCopyDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +bool AbstractSdCustomShowDlg_Impl::IsCustomShow() const +{ + return m_xDlg->IsCustomShow(); +} + +BitmapEx AbstractSdCustomShowDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdCustomShowDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +short SdAbstractTabController_Impl::Execute() +{ + return m_xDlg->run(); +} + +void SdAbstractTabController_Impl::SetCurPageId( const OUString &rName ) +{ + m_xDlg->SetCurPageId( rName ); +} + +const SfxItemSet* SdAbstractTabController_Impl::GetOutputItemSet() const +{ + return m_xDlg->GetOutputItemSet(); +} + +WhichRangesContainer SdAbstractTabController_Impl::GetInputRanges(const SfxItemPool& pItem ) +{ + return m_xDlg->GetInputRanges( pItem ); +} + +void SdAbstractTabController_Impl::SetInputSet( const SfxItemSet* pInSet ) +{ + m_xDlg->SetInputSet( pInSet ); +} + +bool SdAbstractTabController_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + +//From class Window. +void SdAbstractTabController_Impl::SetText( const OUString& rStr ) +{ + m_xDlg->set_title(rStr); +} + +BitmapEx SdAbstractTabController_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString SdAbstractTabController_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractBulletDialog_Impl::SetCurPageId( const OUString& rName ) +{ + m_xDlg->SetCurPageId( rName ); +} + +const SfxItemSet* AbstractBulletDialog_Impl::GetOutputItemSet() const +{ + return static_cast< ::sd::OutlineBulletDlg*>(m_xDlg.get())->GetBulletOutputItemSet(); +} + +WhichRangesContainer AbstractBulletDialog_Impl::GetInputRanges(const SfxItemPool& pItem ) +{ + return m_xDlg->GetInputRanges(pItem); +} + +void AbstractBulletDialog_Impl::SetInputSet( const SfxItemSet* pInSet ) +{ + m_xDlg->SetInputSet(pInSet); +} + +void AbstractBulletDialog_Impl::SetText( const OUString& rStr ) +{ + m_xDlg->set_title(rStr); +} + +BitmapEx AbstractBulletDialog_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractBulletDialog_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void SdPresLayoutTemplateDlg_Impl::SetCurPageId( const OUString& rName ) +{ + m_xDlg->SetCurPageId( rName ); +} + +const SfxItemSet* SdPresLayoutTemplateDlg_Impl::GetOutputItemSet() const +{ + return m_xDlg->GetOutputItemSet(); +} + +WhichRangesContainer SdPresLayoutTemplateDlg_Impl::GetInputRanges(const SfxItemPool& pItem ) +{ + return m_xDlg->GetInputRanges( pItem ); +} + +void SdPresLayoutTemplateDlg_Impl::SetInputSet( const SfxItemSet* pInSet ) +{ + m_xDlg->SetInputSet( pInSet ); +} + +void SdPresLayoutTemplateDlg_Impl::SetText( const OUString& rStr ) +{ + m_xDlg->set_title(rStr); +} + +BitmapEx SdPresLayoutTemplateDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString SdPresLayoutTemplateDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +SvxFieldData* AbstractSdModifyFieldDlg_Impl::GetField() +{ + return m_xDlg->GetField(); +} + +SfxItemSet AbstractSdModifyFieldDlg_Impl::GetItemSet() +{ + return m_xDlg->GetItemSet(); +} + +BitmapEx AbstractSdModifyFieldDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdModifyFieldDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractSdSnapLineDlg_Impl::GetAttr(SfxItemSet& rOutAttrs) +{ + m_xDlg->GetAttr(rOutAttrs); +} + +void AbstractSdSnapLineDlg_Impl::HideRadioGroup() +{ + m_xDlg->HideRadioGroup(); +} + +void AbstractSdSnapLineDlg_Impl::HideDeleteBtn() +{ + m_xDlg->HideDeleteBtn(); +} + +void AbstractSdSnapLineDlg_Impl::SetInputFields(bool bEnableX, bool bEnableY) +{ + m_xDlg->SetInputFields(bEnableX, bEnableY); +} + +void AbstractSdSnapLineDlg_Impl::SetText( const OUString& rStr ) +{ + m_xDlg->set_title(rStr); +} + +BitmapEx AbstractSdSnapLineDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdSnapLineDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractSdInsertLayerDlg_Impl::GetAttr( SfxItemSet& rOutAttrs ) +{ + m_xDlg->GetAttr(rOutAttrs); +} + +void AbstractSdInsertLayerDlg_Impl::SetHelpId( const OUString& rHelpId ) +{ + m_xDlg->set_help_id(rHelpId); +} + +BitmapEx AbstractSdInsertLayerDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdInsertLayerDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +std::vector AbstractSdInsertPagesObjsDlg_Impl::GetList(const sal_uInt16 nType) +{ + return m_xDlg->GetList(nType); +} + +bool AbstractSdInsertPagesObjsDlg_Impl::IsLink() +{ + return m_xDlg->IsLink(); +} + +bool AbstractSdInsertPagesObjsDlg_Impl::IsRemoveUnnecessaryMasterPages() const +{ + return m_xDlg->IsRemoveUnnecessaryMasterPages(); +} + +BitmapEx AbstractSdInsertPagesObjsDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdInsertPagesObjsDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractMorphDlg_Impl::SaveSettings() const +{ + m_xDlg->SaveSettings(); +} + +sal_uInt16 AbstractMorphDlg_Impl::GetFadeSteps() const +{ + return m_xDlg->GetFadeSteps(); +} + +bool AbstractMorphDlg_Impl::IsAttributeFade() const +{ + return m_xDlg->IsAttributeFade(); +} + +bool AbstractMorphDlg_Impl::IsOrientationFade() const +{ + return m_xDlg->IsOrientationFade(); +} + +BitmapEx AbstractMorphDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractMorphDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractSdStartPresDlg_Impl::GetAttr( SfxItemSet& rOutAttrs ) +{ + m_xDlg->GetAttr(rOutAttrs); +} + +BitmapEx AbstractSdStartPresDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdStartPresDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +void AbstractSdPresLayoutDlg_Impl::GetAttr( SfxItemSet& rOutAttrs ) +{ + m_xDlg->GetAttr(rOutAttrs); +} + +BitmapEx AbstractSdPresLayoutDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdPresLayoutDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +const SfxItemSet* SdAbstractSfxDialog_Impl::GetOutputItemSet() const +{ + return m_xDlg->GetOutputItemSet(); +} + +void SdAbstractSfxDialog_Impl::SetText( const OUString& rStr ) +{ + m_xDlg->set_title(rStr); +} + +const GDIMetaFile& AbstractSdVectorizeDlg_Impl::GetGDIMetaFile() const +{ + return m_xDlg->GetGDIMetaFile(); +} + +BitmapEx AbstractSdVectorizeDlg_Impl::createScreenshot() const +{ + VclPtr xDialogSurface(m_xDlg->getDialog()->screenshot()); + return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel()); +} + +OUString AbstractSdVectorizeDlg_Impl::GetScreenshotId() const +{ + return m_xDlg->get_help_id(); +} + +//-------------- SdAbstractDialogFactory implementation-------------- + +VclPtr SdAbstractDialogFactory_Impl::CreateSvxBulletAndPositionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) +{ + return VclPtr::Create(std::make_unique(pParent, *pAttr, pView)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateBreakDlg( + weld::Window* pParent, + ::sd::DrawView* pDrView, + ::sd::DrawDocShell* pShell, + sal_uLong nSumActionCount, + sal_uLong nObjCount ) +{ + return VclPtr::Create(std::make_unique<::sd::BreakDlg>(pParent, pDrView, pShell, nSumActionCount, nObjCount)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateCopyDlg(weld::Window* pParent, + const SfxItemSet& rInAttrs, + ::sd::View* pView ) +{ + return VclPtr::Create(std::make_unique<::sd::CopyDlg>(pParent, rInAttrs, pView)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdCustomShowDlg(weld::Window* pParent, SdDrawDocument& rDrawDoc ) +{ + return VclPtr::Create(std::make_unique(pParent, rDrawDoc)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdTabCharDialog(weld::Window* pParent, const SfxItemSet* pAttr, SfxObjectShell* pDocShell) +{ + return VclPtr::Create(std::make_shared(pParent, pAttr, pDocShell)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdTabPageDialog(weld::Window* pParent, const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage, bool bIsImpressDoc) +{ + return VclPtr::Create(std::make_shared(pDocShell, pParent, pAttr, bAreaPage, bIsImpressDoc)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdModifyFieldDlg(weld::Window* pParent, const SvxFieldData* pInField, const SfxItemSet& rSet) +{ + return VclPtr::Create(std::make_unique(pParent, pInField, rSet)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdSnapLineDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) +{ + return VclPtr::Create(std::make_unique(pParent, rInAttrs, pView)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdInsertLayerDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr) +{ + return VclPtr::Create(std::make_unique(pParent, rInAttrs, bDeletable, aStr)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName) +{ + return VclPtr::Create(std::make_unique(pParent, pDoc, pSfxMedium, rFileName)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) +{ + return VclPtr::Create(std::make_unique<::sd::MorphDlg>(pParent, pObj1, pObj2)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdOutlineBulletTabDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) +{ + return VclPtr::Create(std::make_shared<::sd::OutlineBulletDlg>(pParent, pAttr, pView)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdParagraphTabDlg(weld::Window* pParent, const SfxItemSet* pAttr ) +{ + return VclPtr::Create(std::make_shared(pParent, pAttr)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdStartPresentationDlg(weld::Window* pParent, + const SfxItemSet& rInAttrs, const std::vector &rPageNames, SdCustomShowList* pCSList) +{ + return VclPtr::Create(std::make_unique(pParent, rInAttrs, rPageNames, pCSList)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateRemoteDialog(weld::Window* pParent) +{ + return VclPtr::Create(std::make_unique<::sd::RemoteDialog>(pParent)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, bool bBackgroundDlg, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) +{ + return VclPtr::Create(std::make_shared(pDocSh, pParent, bBackgroundDlg, rStyleBase, ePO, pSSPool)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdPresLayoutDlg(weld::Window* pParent, ::sd::DrawDocShell* pDocShell, const SfxItemSet& rInAttrs) +{ + return VclPtr::Create(std::make_unique(pDocShell, pParent, rInAttrs)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdTabTemplateDlg(weld::Window* pParent, const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView) +{ + return VclPtr::Create(std::make_shared(pParent, pDocShell, rStyleBase, pModel, pView)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreatSdActionDialog(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView ) +{ + return VclPtr::Create(std::make_unique(pParent, pAttr, pView)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) +{ + return VclPtr::Create(std::make_unique(pParent, rBmp, pDocShell)); +} + +// Factories for TabPages +CreateTabPage SdAbstractDialogFactory_Impl::GetSdOptionsContentsTabPageCreatorFunc() +{ + return SdTpOptionsContents::Create; +} + +CreateTabPage SdAbstractDialogFactory_Impl::GetSdPrintOptionsTabPageCreatorFunc() +{ + return SdPrintOptions::Create; +} + +CreateTabPage SdAbstractDialogFactory_Impl::GetSdOptionsMiscTabPageCreatorFunc() +{ + return SdTpOptionsMisc::Create; +} + +CreateTabPage SdAbstractDialogFactory_Impl::GetSdOptionsSnapTabPageCreatorFunc() +{ + return SdTpOptionsSnap::Create; +} + +VclPtr SdAbstractDialogFactory_Impl::CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) +{ + return VclPtr::Create(std::make_unique<::sd::MasterLayoutDialog>(pParent, pDoc, pCurrentPage)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateHeaderFooterDialog(sd::ViewShell* pViewShell, + weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) +{ + return VclPtr::Create(std::make_shared<::sd::HeaderFooterDialog>(pViewShell, pParent, pDoc, pCurrentPage)); +} + +VclPtr SdAbstractDialogFactory_Impl::CreateSdPhotoAlbumDialog(weld::Window* pParent, SdDrawDocument* pDoc) +{ + return VclPtr::Create(std::make_unique(pParent, pDoc)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/sddlgfact.hxx b/sd/source/ui/dlg/sddlgfact.hxx new file mode 100644 index 0000000000..8edfd2c709 --- /dev/null +++ b/sd/source/ui/dlg/sddlgfact.hxx @@ -0,0 +1,429 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//namespace sd { +// class MorphDlg; +// class CopyDlg; +// class BreakDlg; +// class HeaderFooterDialog; +// class MasterLayoutDialog; +//} + +class SvxBulletAndPositionDlg; + +/// Provides managing and getting information from the numbering and position dialog. +class AbstractSvxBulletAndPositionDlg_Impl :public AbstractSvxBulletAndPositionDlg +{ + std::unique_ptr m_xDlg; +public: + explicit AbstractSvxBulletAndPositionDlg_Impl(std::unique_ptr p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; + virtual const SfxItemSet* GetOutputItemSet( SfxItemSet* ) const override ; + virtual bool IsApplyToMaster() override; + virtual bool IsSlideScope() override; +}; + +class SdAbstractGenericDialog_Impl : public VclAbstractDialog +{ + std::unique_ptr m_xDlg; +public: + explicit SdAbstractGenericDialog_Impl(std::unique_ptr p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractMasterLayoutDialog_Impl : public VclAbstractDialog +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractMasterLayoutDialog_Impl(std::unique_ptr<::sd::MasterLayoutDialog> pDlg); + virtual short Execute() override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractBreakDlg_Impl : public VclAbstractDialog +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractBreakDlg_Impl(std::unique_ptr<::sd::BreakDlg> pDlg); + virtual short Execute() override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractCopyDlg_Impl : public AbstractCopyDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractCopyDlg_Impl(std::unique_ptr<::sd::CopyDlg> pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual void GetAttr( SfxItemSet& rOutAttrs ) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdCustomShowDlg_Impl : public AbstractSdCustomShowDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdCustomShowDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual bool IsCustomShow() const override ; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class SdAbstractTabController_Impl : public SfxAbstractTabDialog +{ + std::shared_ptr m_xDlg; +public: + explicit SdAbstractTabController_Impl(std::shared_ptr p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; + virtual void SetCurPageId( const OUString &rName ) override; + virtual const SfxItemSet* GetOutputItemSet() const override; + virtual WhichRangesContainer GetInputRanges( const SfxItemPool& pItem ) override; + virtual void SetInputSet( const SfxItemSet* pInSet ) override; + virtual void SetText( const OUString& rStr ) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractBulletDialog_Impl : public SfxAbstractTabDialog +{ + std::shared_ptr m_xDlg; +public: + explicit AbstractBulletDialog_Impl(std::shared_ptr p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; + virtual void SetCurPageId( const OUString& rName ) override; + virtual const SfxItemSet* GetOutputItemSet() const override; + virtual WhichRangesContainer GetInputRanges( const SfxItemPool& pItem ) override; + virtual void SetInputSet( const SfxItemSet* pInSet ) override; + virtual void SetText( const OUString& rStr ) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class SdPresLayoutTemplateDlg_Impl : public SfxAbstractTabDialog +{ + std::shared_ptr m_xDlg; +public: + explicit SdPresLayoutTemplateDlg_Impl(std::shared_ptr p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; + virtual void SetCurPageId( const OUString& rName ) override; + virtual const SfxItemSet* GetOutputItemSet() const override; + virtual WhichRangesContainer GetInputRanges( const SfxItemPool& pItem ) override; + virtual void SetInputSet( const SfxItemSet* pInSet ) override; + virtual void SetText( const OUString& rStr ) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdModifyFieldDlg_Impl : public AbstractSdModifyFieldDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdModifyFieldDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual SvxFieldData* GetField() override; + virtual SfxItemSet GetItemSet() override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdSnapLineDlg_Impl : public AbstractSdSnapLineDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdSnapLineDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual void GetAttr(SfxItemSet& rOutAttrs) override; + virtual void HideRadioGroup() override; + virtual void HideDeleteBtn() override; + virtual void SetInputFields(bool bEnableX, bool bEnableY) override; + virtual void SetText( const OUString& rStr ) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdInsertLayerDlg_Impl : public AbstractSdInsertLayerDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdInsertLayerDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual void GetAttr( SfxItemSet& rOutAttrs ) override ; + virtual void SetHelpId( const OUString& rHelpId ) override ; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdInsertPagesObjsDlg_Impl : public AbstractSdInsertPagesObjsDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdInsertPagesObjsDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual std::vector GetList ( const sal_uInt16 nType ) override; + virtual bool IsLink() override; + virtual bool IsRemoveUnnecessaryMasterPages() const override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractMorphDlg_Impl : public AbstractMorphDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractMorphDlg_Impl(std::unique_ptr<::sd::MorphDlg> pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual void SaveSettings() const override; + virtual sal_uInt16 GetFadeSteps() const override; + virtual bool IsAttributeFade() const override ; + virtual bool IsOrientationFade() const override ; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdStartPresDlg_Impl : public AbstractSdStartPresDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdStartPresDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual void GetAttr( SfxItemSet& rOutAttrs ) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractSdPresLayoutDlg_Impl : public AbstractSdPresLayoutDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdPresLayoutDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual void GetAttr(SfxItemSet& rOutAttrs) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class SdAbstractSfxDialog_Impl : public SfxAbstractDialog +{ +private: + std::unique_ptr m_xDlg; +public: + SdAbstractSfxDialog_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual const SfxItemSet* GetOutputItemSet() const override; + virtual void SetText( const OUString& rStr ) override; +}; + +class AbstractSdVectorizeDlg_Impl :public AbstractSdVectorizeDlg +{ +private: + std::unique_ptr m_xDlg; +public: + AbstractSdVectorizeDlg_Impl(std::unique_ptr pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual const GDIMetaFile& GetGDIMetaFile() const override ; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +class AbstractHeaderFooterDialog_Impl :public AbstractHeaderFooterDialog +{ +private: + std::shared_ptr<::sd::HeaderFooterDialog> m_xDlg; +public: + AbstractHeaderFooterDialog_Impl(std::shared_ptr<::sd::HeaderFooterDialog> pDlg) + : m_xDlg(std::move(pDlg)) + { + } + virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; + + // screenshotting + virtual BitmapEx createScreenshot() const override; + virtual OUString GetScreenshotId() const override; +}; + +//AbstractDialogFactory_Impl implementations +class SdAbstractDialogFactory_Impl : public SdAbstractDialogFactory +{ + +public: + virtual ~SdAbstractDialogFactory_Impl() {} + + virtual VclPtr CreateSvxBulletAndPositionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) override; + virtual VclPtr CreateBreakDlg(weld::Window* pWindow, ::sd::DrawView* pDrView, ::sd::DrawDocShell* pShell, sal_uLong nSumActionCount, sal_uLong nObjCount) override; + virtual VclPtr CreateCopyDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) override; + virtual VclPtr CreateSdCustomShowDlg(weld::Window* pParent, SdDrawDocument& rDrawDoc) override; + virtual VclPtr CreateSdTabCharDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell) override; + virtual VclPtr CreateSdTabPageDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage, bool bIsImpressDoc) override; + virtual VclPtr CreateSdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) override; + virtual VclPtr CreateSdSnapLineDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) override; + virtual VclPtr CreateSdInsertLayerDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr) override; + virtual VclPtr CreateSdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName ) override; + virtual VclPtr CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) override; + virtual VclPtr CreateSdOutlineBulletTabDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) override; + virtual VclPtr CreateSdParagraphTabDlg(weld::Window* pParent, const SfxItemSet* pAttr) override; + virtual VclPtr CreateSdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, + const std::vector &rPageNames, SdCustomShowList* pCSList ) override; + virtual VclPtr CreateRemoteDialog(weld::Window* pWindow) override; // add for RemoteDialog + virtual VclPtr CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, bool bBackgroundDlg, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) override; + virtual VclPtr CreateSdPresLayoutDlg(weld::Window* pParent, ::sd::DrawDocShell* pDocShell, const SfxItemSet& rInAttrs) override; + virtual VclPtr CreateSdTabTemplateDlg(weld::Window* pParent, const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView ) override; + virtual VclPtr CreatSdActionDialog(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) override; + virtual VclPtr CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) override; + + virtual VclPtr CreateSdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pDoc) override; + + virtual VclPtr CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage*) override; + + virtual VclPtr CreateHeaderFooterDialog(sd::ViewShell* pViewShell, + weld::Window* pParent, + SdDrawDocument* pDoc, + SdPage* pCurrentPage) override; + + // For TabPage + virtual CreateTabPage GetSdOptionsContentsTabPageCreatorFunc() override; + virtual CreateTabPage GetSdPrintOptionsTabPageCreatorFunc() override; + virtual CreateTabPage GetSdOptionsMiscTabPageCreatorFunc() override; + virtual CreateTabPage GetSdOptionsSnapTabPageCreatorFunc() override; + +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/sdpreslt.cxx b/sd/source/ui/dlg/sdpreslt.cxx new file mode 100644 index 0000000000..d0d0839bbb --- /dev/null +++ b/sd/source/ui/dlg/sdpreslt.cxx @@ -0,0 +1,281 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +SdPresLayoutDlg::SdPresLayoutDlg(::sd::DrawDocShell* pDocShell, + weld::Window* pWindow, const SfxItemSet& rInAttrs) + : GenericDialogController(pWindow, "modules/simpress/ui/slidedesigndialog.ui", "SlideDesignDialog") + , mpDocSh(pDocShell) + , mrOutAttrs(rInAttrs) + , maStrNone(SdResId(STR_NULL)) + , m_xCbxMasterPage(m_xBuilder->weld_check_button("masterpage")) + , m_xCbxCheckMasters(m_xBuilder->weld_check_button("checkmasters")) + , m_xBtnLoad(m_xBuilder->weld_button("load")) + , m_xVS(new ValueSet(m_xBuilder->weld_scrolled_window("selectwin", true))) + , m_xVSWin(new weld::CustomWeld(*m_xBuilder, "select", *m_xVS)) + , m_xLabel(m_xBuilder->weld_label("label1")) +{ + if (mpDocSh->GetDoc()->GetDocumentType() == DocumentType::Draw) + { + m_xDialog->set_title(SdResId(STR_AVAILABLE_MASTERPAGE)); + m_xLabel->set_label(SdResId(STR_SELECT_PAGE)); + } + else + { + m_xDialog->set_title(SdResId(STR_AVAILABLE_MASTERSLIDE)); + m_xLabel->set_label(SdResId(STR_SELECT_SLIDE)); + } + m_xVSWin->set_size_request(m_xBtnLoad->get_approximate_digit_width() * 60, + m_xBtnLoad->get_text_height() * 20); + + m_xVS->SetDoubleClickHdl(LINK(this, SdPresLayoutDlg, ClickLayoutHdl)); + m_xBtnLoad->connect_clicked(LINK(this, SdPresLayoutDlg, ClickLoadHdl)); + + Reset(); +} + +SdPresLayoutDlg::~SdPresLayoutDlg() +{ +} + +/** + * Initialize + */ +void SdPresLayoutDlg::Reset() +{ + tools::Long nName; + + // replace master page + if( const SfxBoolItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_PRESLAYOUT_MASTER_PAGE, false ) ) + { + bool bMasterPage = pPoolItem->GetValue(); + m_xCbxMasterPage->set_sensitive( !bMasterPage ); + m_xCbxMasterPage->set_active( bMasterPage ); + } + + // remove not used master pages + m_xCbxCheckMasters->set_active(false); + + if( const SfxStringItem* pPoolItem = mrOutAttrs.GetItemIfSet(ATTR_PRESLAYOUT_NAME) ) + maName = pPoolItem->GetValue(); + else + maName.clear(); + + FillValueSet(); + + mnLayoutCount = maLayoutNames.size(); + for( nName = 0; nName < mnLayoutCount; nName++ ) + { + if (maLayoutNames[nName] == maName) + break; + } + DBG_ASSERT(nName < mnLayoutCount, "Layout not found"); + + m_xVS->SelectItem(static_cast(nName) + 1); // Indices of the ValueSets start at 1 + +} + +/** + * Fills the provided Item-Set with dialog box attributes + */ +void SdPresLayoutDlg::GetAttr(SfxItemSet& rOutAttrs) +{ + short nId = m_xVS->GetSelectedItemId(); + bool bLoad = nId > mnLayoutCount; + rOutAttrs.Put( SfxBoolItem( ATTR_PRESLAYOUT_LOAD, bLoad ) ); + + OUString aLayoutName; + + if( bLoad ) + { + aLayoutName = maName + "#" + maLayoutNames[ nId - 1 ]; + } + else if (nId) + { + aLayoutName = maLayoutNames[ nId - 1 ]; + if( aLayoutName == maStrNone ) + aLayoutName.clear(); // that way we encode "- nothing -" (see below) + } + + rOutAttrs.Put( SfxStringItem( ATTR_PRESLAYOUT_NAME, aLayoutName ) ); + rOutAttrs.Put( SfxBoolItem( ATTR_PRESLAYOUT_MASTER_PAGE, m_xCbxMasterPage->get_active() ) ); + rOutAttrs.Put( SfxBoolItem( ATTR_PRESLAYOUT_CHECK_MASTERS, m_xCbxCheckMasters->get_active() ) ); +} + +/** + * Fills ValueSet with bitmaps + */ +void SdPresLayoutDlg::FillValueSet() +{ + m_xVS->SetStyle(m_xVS->GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER + | WB_VSCROLL | WB_NAMEFIELD); + + m_xVS->SetColCount(2); + m_xVS->SetLineCount(2); + m_xVS->SetExtraSpacing(2); + + SdDrawDocument* pDoc = mpDocSh->GetDoc(); + + sal_uInt16 nCount = pDoc->GetMasterPageCount(); + + for (sal_uInt16 nLayout = 0; nLayout < nCount; nLayout++) + { + SdPage* pMaster = static_cast(pDoc->GetMasterPage(nLayout)); + if (pMaster->GetPageKind() == PageKind::Standard) + { + OUString aLayoutName(pMaster->GetLayoutName()); + aLayoutName = aLayoutName.copy(0, aLayoutName.indexOf(SD_LT_SEPARATOR)); + maLayoutNames.push_back(aLayoutName); + + Image aBitmap(mpDocSh->GetPagePreviewBitmap(pMaster)); + m_xVS->InsertItem(static_cast(maLayoutNames.size()), aBitmap, aLayoutName); + } + } + + m_xVS->Show(); +} + +/** + * DoubleClick handler + */ +IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLayoutHdl, ValueSet*, void) +{ + m_xDialog->response(RET_OK); +} + +/** + * Click handler for load button + */ +IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLoadHdl, weld::Button&, void) +{ + SfxNewFileDialog aDlg(m_xDialog.get(), SfxNewFileDialogMode::Preview); + if (mpDocSh->GetDoc()->GetDocumentType() == DocumentType::Draw) + aDlg.set_title(SdResId(STR_LOAD_DRAWING_LAYOUT)); + else + aDlg.set_title(SdResId(STR_LOAD_PRESENTATION_LAYOUT)); + sal_uInt16 nResult = aDlg.run(); + + bool bCancel = false; + + switch (nResult) + { + case RET_OK: + { + if (aDlg.IsTemplate()) + { + maName = aDlg.GetTemplateFileName(); + } + else + { + // that way we encode "- nothing -" + maName.clear(); + } + } + break; + + default: + bCancel = true; + } + + if( bCancel ) + return; + + // check if template already exists + OUString aCompareStr(maName); + if (aCompareStr.isEmpty()) + aCompareStr = maStrNone; + + auto it = std::find(maLayoutNames.begin(), maLayoutNames.end(), aCompareStr); + if (it != maLayoutNames.end()) + { + sal_uInt16 aPos = static_cast(std::distance(maLayoutNames.begin(), it)); + // select template + m_xVS->SelectItem( aPos + 1 ); + } + else + { + // load document in order to determine preview bitmap (if template is selected) + if (!maName.isEmpty()) + { + // determine document in order to call OpenBookmarkDoc + SdDrawDocument* pDoc = mpDocSh->GetDoc(); + SdDrawDocument* pTemplDoc = pDoc->OpenBookmarkDoc( maName ); + + if (pTemplDoc) + { + ::sd::DrawDocShell* pTemplDocSh= pTemplDoc->GetDocSh(); + + sal_uInt16 nCount = pTemplDoc->GetMasterPageCount(); + + for (sal_uInt16 nLayout = 0; nLayout < nCount; nLayout++) + { + SdPage* pMaster = static_cast( pTemplDoc->GetMasterPage(nLayout) ); + if (pMaster->GetPageKind() == PageKind::Standard) + { + OUString aLayoutName(pMaster->GetLayoutName()); + aLayoutName = aLayoutName.copy(0, aLayoutName.indexOf(SD_LT_SEPARATOR)); + maLayoutNames.push_back(aLayoutName); + + Image aBitmap(pTemplDocSh->GetPagePreviewBitmap(pMaster)); + m_xVS->InsertItem(static_cast(maLayoutNames.size()), aBitmap, aLayoutName); + } + } + } + else + { + bCancel = true; + } + + pDoc->CloseBookmarkDoc(); + } + else + { + // empty layout + maLayoutNames.push_back(maStrNone); + m_xVS->InsertItem( static_cast(maLayoutNames.size()), + Image(BMP_SLIDE_NONE), maStrNone ); + } + + if (!bCancel) + { + // select template + m_xVS->SelectItem( static_cast(maLayoutNames.size()) ); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx new file mode 100644 index 0000000000..63c26bc563 --- /dev/null +++ b/sd/source/ui/dlg/sdtreelb.cxx @@ -0,0 +1,1396 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +using namespace com::sun::star; + +namespace { + +sd::DrawViewShell* lcl_getDrawViewShell(const SdDrawDocument* pDoc) +{ + if (!pDoc || !pDoc->GetDocSh()) + return nullptr; + return static_cast(pDoc->GetDocSh()->GetViewShell()); +} + +} + +bool SdPageObjsTLV::bIsInDrag = false; + +bool SdPageObjsTLV::IsInDrag() +{ + return bIsInDrag; +} + +SotClipboardFormatId SdPageObjsTLV::SdPageObjsTransferable::mnListBoxDropFormatId = static_cast(SAL_MAX_UINT32); + +SdPageObjsTLV::SdPageObjsTransferable::SdPageObjsTransferable( + INetBookmark aBookmark, + ::sd::DrawDocShell& rDocShell, + NavigatorDragType eDragType) + : SdTransferable(rDocShell.GetDoc(), nullptr, true), + maBookmark(std::move( aBookmark )), + mrDocShell( rDocShell ), + meDragType( eDragType ) +{ +} + +SdPageObjsTLV::SdPageObjsTransferable::~SdPageObjsTransferable() +{ +} + +void SdPageObjsTLV::SdPageObjsTransferable::AddSupportedFormats() +{ + AddFormat(SotClipboardFormatId::NETSCAPE_BOOKMARK); + AddFormat(SotClipboardFormatId::TREELISTBOX); + AddFormat(GetListBoxDropFormatId()); +} + +bool SdPageObjsTLV::SdPageObjsTransferable::GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) +{ + SotClipboardFormatId nFormatId = SotExchange::GetFormat( rFlavor ); + switch (nFormatId) + { + case SotClipboardFormatId::NETSCAPE_BOOKMARK: + SetINetBookmark( maBookmark, rFlavor ); + return true; + + case SotClipboardFormatId::TREELISTBOX: + { + css::uno::Any aTreeListBoxData; // empty for now + SetAny(aTreeListBoxData); + return true; + } + + default: + return false; + } +} + +void SdPageObjsTLV::SdPageObjsTransferable::DragFinished( sal_Int8 nDropAction ) +{ + SdPageObjsTLV::OnDragFinished(); + SdTransferable::DragFinished(nDropAction); +} + +SdPageObjsTLV::SdPageObjsTransferable* SdPageObjsTLV::SdPageObjsTransferable::getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) + noexcept +{ + return dynamic_cast(rxData.get()); +} + +SotClipboardFormatId SdPageObjsTLV::SdPageObjsTransferable::GetListBoxDropFormatId() +{ + if (mnListBoxDropFormatId == static_cast(SAL_MAX_UINT32)) + mnListBoxDropFormatId = SotExchange::RegisterFormatMimeType("application/x-openoffice-treelistbox-moveonly;windows_formatname=\"SV_LBOX_DD_FORMAT_MOVE\""); + return mnListBoxDropFormatId; +} + +/** + * @return true if children of the specified string are selected + */ +bool SdPageObjsTLV::HasSelectedChildren( std::u16string_view rName ) +{ + bool bChildren = false; + + if( !rName.empty() ) + { + std::unique_ptr xEntry(m_xTreeView->make_iterator()); + OUString aTmp; + + if (m_xTreeView->get_iter_first(*xEntry)) + { + do + { + aTmp = m_xTreeView->get_text(*xEntry); + if (aTmp == rName) + { + + // see if any of the selected nodes are subchildren of this node + m_xTreeView->selected_foreach([this, &bChildren, &xEntry](weld::TreeIter& rEntry){ + std::unique_ptr xParent(m_xTreeView->make_iterator(&rEntry)); + while (!bChildren && m_xTreeView->iter_parent(*xParent)) + bChildren = m_xTreeView->iter_compare(*xParent, *xEntry) == 0; + return bChildren; + }); + + break; + } + } + while (m_xTreeView->iter_next(*xEntry)); + } + } + + return bChildren; +} + +void SdPageObjsTLV::SetShowAllShapes ( + const bool bShowAllShapes, + const bool bFillList) +{ + m_bShowAllShapes = bShowAllShapes; + if (bFillList) + { + if (m_pMedium == nullptr) + Fill(m_pDoc, m_bShowAllPages, m_aDocName); + else + Fill(m_pDoc, m_pMedium, m_aDocName); + } +} + +void SdPageObjsTLV::SetOrderFrontToBack(const bool bOrderFrontToBack) +{ + m_bOrderFrontToBack = bOrderFrontToBack; +} + +bool SdPageObjsTLV::IsEqualToShapeList(std::unique_ptr& rEntry, const SdrObjList& rList, + std::u16string_view rListName) +{ + if (!rEntry) + return false; + OUString aName = m_xTreeView->get_text(*rEntry); + + if (rListName != aName) + return false; + + if (!m_xTreeView->iter_next(*rEntry)) + rEntry.reset(); + + SdrObjListIter aIter(&rList, + !rList.HasObjectNavigationOrder() /* use navigation order, if available */, + SdrIterMode::Flat); + + while (aIter.IsMore()) + { + SdrObject* pObj = aIter.Next(); + + const OUString aObjectName(GetObjectName(pObj)); + + if (!aObjectName.isEmpty()) + { + if (!rEntry) + return false; + + aName = m_xTreeView->get_text(*rEntry); + + if (aObjectName != aName) + return false; + + if (pObj->IsGroupObject()) + { + bool bRet = IsEqualToShapeList(rEntry, *pObj->GetSubList(), aObjectName); + if (!bRet) + return false; + } + else + { + if (!m_xTreeView->iter_next(*rEntry)) + rEntry.reset(); + } + } + } + + return true; +} + +/** + * Checks if the pages (PageKind::Standard) of a doc and the objects on the pages + * are identical to the TreeLB. + * If a doc is provided, this will be the used doc (important by more than + * one document). + */ +bool SdPageObjsTLV::IsEqualToDoc( const SdDrawDocument* pInDoc ) +{ + if( pInDoc ) + m_pDoc = pInDoc; + + if( !m_pDoc ) + return false; + + sd::DrawViewShell* pDrawViewShell = lcl_getDrawViewShell(m_pDoc); + if (!pDrawViewShell) + return false; + PageKind eDrawViewShellPageKind = pDrawViewShell->GetPageKind(); + if (eDrawViewShellPageKind != PageKind::Standard && eDrawViewShellPageKind != PageKind::Notes) + return false; + + std::unique_ptr xEntry(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_iter_first(*xEntry)) + xEntry.reset(); + + // compare all pages including the objects + sal_uInt16 nPage = 0; + const sal_uInt16 nMaxPages = m_pDoc->GetPageCount(); + + while( nPage < nMaxPages ) + { + const SdPage* pPage = static_cast( m_pDoc->GetPage( nPage ) ); + if (pPage->GetPageKind() == eDrawViewShellPageKind) + { + bool bRet = IsEqualToShapeList(xEntry, *pPage, pPage->GetName()); + if (!bRet) + return false; + } + nPage++; + } + // If there are still entries in the listbox, + // then objects (with names) or pages were deleted + return !xEntry; +} + +IMPL_LINK(SdPageObjsTLV, CommandHdl, const CommandEvent&, rCEvt, bool) +{ + if (IsEditingActive()) + return false; + + if (rCEvt.GetCommand() == CommandEventId::ContextMenu) + { + m_bMouseReleased = false; + m_xTreeView->grab_focus(); + + // select clicked entry + if (std::unique_ptr xEntry(m_xTreeView->make_iterator()); + rCEvt.IsMouseEvent() && m_xTreeView->get_dest_row_at_pos( + rCEvt.GetMousePosPixel(), xEntry.get(), false)) + { + m_bSelectionHandlerNavigates = true; + m_bNavigationGrabsFocus = false; + m_xTreeView->set_cursor(*xEntry); + Select(); + } + + bool bRet = m_aPopupMenuHdl.Call(rCEvt); + m_bMouseReleased = true; + return bRet; + } + + return false; +} + +IMPL_LINK(SdPageObjsTLV, KeyInputHdl, const KeyEvent&, rKEvt, bool) +{ + const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode(); + if (m_xAccel->execute(rKeyCode)) + { + m_bEditing = false; + // the accelerator consumed the event + return true; + } + if (rKeyCode.GetCode() == KEY_RETURN) + { + m_bEditing = false; + std::unique_ptr xCursor(m_xTreeView->make_iterator()); + if (m_xTreeView->get_cursor(xCursor.get()) && m_xTreeView->iter_has_child(*xCursor)) + { + if (m_xTreeView->get_row_expanded(*xCursor)) + m_xTreeView->collapse_row(*xCursor); + else + m_xTreeView->expand_row(*xCursor); + } + m_bNavigationGrabsFocus = true; + m_aRowActivatedHdl.Call(*m_xTreeView); + m_bNavigationGrabsFocus = false; + return true; + } + bool bRet = m_aKeyPressHdl.Call(rKEvt); + // m_bEditing needs to be set after key press handler call back or x11 won't end editing on + // Esc key press. See SdNavigatorWin::KeyInputHdl. + m_bEditing = false; + return bRet; +} + +IMPL_LINK(SdPageObjsTLV, MousePressHdl, const MouseEvent&, rMEvt, bool) +{ + m_bMouseReleased = false; + m_bEditing = false; + m_bSelectionHandlerNavigates = rMEvt.GetClicks() == 1; + m_bNavigationGrabsFocus = rMEvt.GetClicks() != 1; + return false; +} + +IMPL_LINK_NOARG(SdPageObjsTLV, MouseReleaseHdl, const MouseEvent&, bool) +{ + m_bMouseReleased = true; + if (m_aMouseReleaseHdl.IsSet() && m_aMouseReleaseHdl.Call(MouseEvent())) + return false; + + m_bSelectionHandlerNavigates = false; + m_bNavigationGrabsFocus = true; + return false; +} + +IMPL_LINK(SdPageObjsTLV, DragBeginHdl, bool&, rUnsetDragIcon, bool) +{ + rUnsetDragIcon = false; + return StartDrag(); +} + +namespace +{ + bool CanDragSource(const weld::TreeView& rTreeView) + { + std::unique_ptr xSource(rTreeView.make_iterator()); + if (!rTreeView.get_selected(xSource.get())) + return false; + + std::unique_ptr xSourceParent(rTreeView.make_iterator(xSource.get())); + bool bSourceHasParent = rTreeView.iter_parent(*xSourceParent); + // disallow root drag + if (!bSourceHasParent) + return false; + + SdrObject* pSourceObject = weld::fromId(rTreeView.get_id(*xSource)); + if (pSourceObject == reinterpret_cast(1)) + pSourceObject = nullptr; + + if (!pSourceObject) + return false; + + SdrPage* pObjectList = pSourceObject->getSdrPageFromSdrObject(); + if (!pObjectList) + return false; + + return true; + } +} + +/** + * StartDrag-Request + */ +bool SdPageObjsTLV::StartDrag() +{ + return !CanDragSource(*m_xTreeView) || DoDrag(); +} + +/** + * Begin drag + */ +bool SdPageObjsTLV::DoDrag() +{ + if (!m_pNavigator) + return true; + + if (!m_xHelper) + return true; + + // Get the view. + ::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh(); + ::sd::ViewShell* pViewShell = GetViewShellForDocShell(*pDocShell); + if (pViewShell == nullptr) + { + OSL_ASSERT(pViewShell!=nullptr); + return true; + } + sd::View* pView = pViewShell->GetView(); + if (pView == nullptr) + { + OSL_ASSERT(pView!=nullptr); + return true; + } + + m_xDropTargetHelper->SetDrawView(pViewShell->GetDrawView()); + m_xDropTargetHelper->SetOrderFrontToBack(m_bOrderFrontToBack); + bIsInDrag = true; + + std::unique_ptr xEntry = m_xTreeView->make_iterator(); + bool bUserData = m_xTreeView->get_cursor(xEntry.get()); + + SdrObject* pObject = nullptr; + sal_Int64 nUserData = bUserData ? m_xTreeView->get_id(*xEntry).toInt64() : 0; + if (nUserData != 1) + pObject = reinterpret_cast(nUserData); + if (pObject != nullptr) + { + // For shapes without a user supplied name (the automatically + // created name does not count), a different drag and drop technique + // is used. + if (GetObjectName(pObject, false).isEmpty()) + { + AddShapeToTransferable(*m_xHelper, *pObject); + m_xHelper->SetView(pView); + SD_MOD()->pTransferDrag = m_xHelper.get(); + } + + // Unnamed shapes have to be selected to be recognized by the + // current drop implementation. In order to have a consistent + // behaviour for all shapes, every shape that is to be dragged is + // selected first. + SdrPageView* pPageView = pView->GetSdrPageView(); + pView->UnmarkAllObj(pPageView); + pView->MarkObj(pObject, pPageView); + } + else + { + m_xHelper->SetView(pView); + SD_MOD()->pTransferDrag = m_xHelper.get(); + } + + return false; +} + +void SdPageObjsTLV::OnDragFinished() +{ + bIsInDrag = false; +} + +SdPageObjsTLVDropTarget::SdPageObjsTLVDropTarget(weld::TreeView& rTreeView) + : DropTargetHelper(rTreeView.get_drop_target()) + , m_rTreeView(rTreeView) + , m_pSdrView(nullptr) +{ +} + +/** + * AcceptDrop-Event + */ +sal_Int8 SdPageObjsTLVDropTarget::AcceptDrop(const AcceptDropEvent& rEvt) +{ + weld::TreeView* pSource = m_rTreeView.get_drag_source(); + // only dragging within the same widget allowed + if (!pSource || pSource != &m_rTreeView) + return DND_ACTION_NONE; + + std::unique_ptr xTarget(m_rTreeView.make_iterator()); + if (!m_rTreeView.get_dest_row_at_pos(rEvt.maPosPixel, xTarget.get(), true)) + return DND_ACTION_NONE; + + // disallow when root is drop target + if (m_rTreeView.get_iter_depth(*xTarget) == 0) + return DND_ACTION_NONE; + + // disallow if there is no source entry selected + std::unique_ptr xSource(m_rTreeView.make_iterator()); + if (!m_rTreeView.get_selected(xSource.get())) + return DND_ACTION_NONE; + + // disallow when root is source + if (m_rTreeView.get_iter_depth(*xSource) == 0) + return DND_ACTION_NONE; + + // disallow when the source is the parent or ancestral parent of the target + std::unique_ptr xTargetParent(m_rTreeView.make_iterator(xTarget.get())); + while (m_rTreeView.get_iter_depth(*xTargetParent) > 1) + { + if (!m_rTreeView.iter_parent(*xTargetParent) || + m_rTreeView.iter_compare(*xSource, *xTargetParent) == 0) + return DND_ACTION_NONE; + } + + // disallow drop when source and target are not within the same page + std::unique_ptr xSourcePage(m_rTreeView.make_iterator(xSource.get())); + std::unique_ptr xTargetPage(m_rTreeView.make_iterator(xTarget.get())); + while (m_rTreeView.get_iter_depth(*xTargetPage)) + m_rTreeView.iter_parent(*xTargetPage); + while (m_rTreeView.get_iter_depth(*xSourcePage)) + m_rTreeView.iter_parent(*xSourcePage); + if (m_rTreeView.iter_compare(*xTargetPage, *xSourcePage) != 0) + return DND_ACTION_NONE; + + return DND_ACTION_MOVE; +} + +/** + * ExecuteDrop-Event + */ +sal_Int8 SdPageObjsTLVDropTarget::ExecuteDrop( const ExecuteDropEvent& rEvt ) +{ + weld::TreeView* pSource = m_rTreeView.get_drag_source(); + // only dragging within the same widget allowed + if (!pSource || pSource != &m_rTreeView) + return DND_ACTION_NONE; + + std::unique_ptr xSource(m_rTreeView.make_iterator()); + if (!m_rTreeView.get_selected(xSource.get())) + return DND_ACTION_NONE; + + std::unique_ptr xTarget(m_rTreeView.make_iterator()); + if (!m_rTreeView.get_dest_row_at_pos(rEvt.maPosPixel, xTarget.get(), false)) + return DND_ACTION_NONE; + + auto nIterCompare = m_rTreeView.iter_compare(*xSource, *xTarget); + if (nIterCompare == 0) + { + // drop position is the same as source position + return DND_ACTION_NONE; + } + + SdrObject* pTargetObject = weld::fromId(m_rTreeView.get_id(*xTarget)); + SdrObject* pSourceObject = weld::fromId(m_rTreeView.get_id(*xSource)); + if (pSourceObject == reinterpret_cast(1)) + pSourceObject = nullptr; + if (pTargetObject == reinterpret_cast(1)) + pTargetObject = nullptr; + + if (pTargetObject != nullptr && pSourceObject != nullptr && m_pSdrView) + { + SdrPage* pObjectList = pSourceObject->getSdrPageFromSdrObject(); + + std::unique_ptr xSourceParent(m_rTreeView.make_iterator(xSource.get())); + m_rTreeView.iter_parent(*xSourceParent); + std::unique_ptr xTargetParent(m_rTreeView.make_iterator(xTarget.get())); + m_rTreeView.iter_parent(*xTargetParent); + + int nTargetPos = m_rTreeView.get_iter_index_in_parent(*xTarget); + + // Make the tree view what the model will be when it is changed below. + m_rTreeView.move_subtree(*xSource, xTargetParent.get(), nTargetPos); + m_rTreeView.iter_previous_sibling(*xTarget); + m_rTreeView.set_cursor(*xTarget); + + // Remove and insert are required for moving objects into and out of groups. + // PutMarked... by itself would suffice if this wasn't allowed. + + // Remove the source object from source parent list and insert it in the target parent list. + SdrObject* pSourceParentObject = weld::fromId(m_rTreeView.get_id(*xSourceParent)); + SdrObject* pTargetParentObject = weld::fromId(m_rTreeView.get_id(*xTargetParent)); + + // Presumably there is need for a hard reference to hold on to the removed object so it is + // guaranteed to be valid for insert back into an object list. + rtl::Reference rSourceObject; + + // remove object + if (pSourceParentObject == reinterpret_cast(1)) + { + rSourceObject = pObjectList->NbcRemoveObject(pSourceObject->GetOrdNum()); + } + else + { + SdrObjList* pList = pSourceParentObject->GetSubList(); + rSourceObject = pList->NbcRemoveObject(pSourceObject->GetOrdNum()); + } + + // insert object + if (pTargetParentObject == reinterpret_cast(1)) + { + pObjectList->NbcInsertObject(rSourceObject.get()); + } + else + { + SdrObjList* pList = pTargetParentObject->GetSubList(); + pList->NbcInsertObject(rSourceObject.get()); + } + + m_bOrderFrontToBack ? m_pSdrView->PutMarkedInFrontOfObj(pTargetObject) : + m_pSdrView->PutMarkedBehindObj(pTargetObject); + } + + return DND_ACTION_NONE; +} + +void SdPageObjsTLV::AddShapeToTransferable ( + SdTransferable& rTransferable, + const SdrObject& rObject) const +{ + std::unique_ptr pObjectDescriptor(new TransferableObjectDescriptor); + bool bIsDescriptorFillingPending (true); + + const SdrOle2Obj* pOleObject = dynamic_cast(&rObject); + if (pOleObject != nullptr && pOleObject->GetObjRef().is()) + { + // If object has no persistence it must be copied as part of the document + try + { + uno::Reference< embed::XEmbedPersist > xPersObj (pOleObject->GetObjRef(), uno::UNO_QUERY ); + if (xPersObj.is() && xPersObj->hasEntry()) + { + SvEmbedTransferHelper::FillTransferableObjectDescriptor( + *pObjectDescriptor, + pOleObject->GetObjRef(), + pOleObject->GetGraphic(), + pOleObject->GetAspect()); + bIsDescriptorFillingPending = false; + } + } + catch( uno::Exception& ) + { + } + } + + ::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh(); + if (bIsDescriptorFillingPending && pDocShell!=nullptr) + { + pDocShell->FillTransferableObjectDescriptor(*pObjectDescriptor); + } + + Point aDragPos (rObject.GetCurrentBoundRect().Center()); + pObjectDescriptor->maDragStartPos = aDragPos; + if (pDocShell != nullptr) + pObjectDescriptor->maDisplayName = pDocShell->GetMedium()->GetURLObject().GetURLNoPass(); + else + pObjectDescriptor->maDisplayName.clear(); + + rTransferable.SetStartPos(aDragPos); + rTransferable.SetObjectDescriptor( std::move(pObjectDescriptor) ); +} + +::sd::ViewShell* SdPageObjsTLV::GetViewShellForDocShell (::sd::DrawDocShell& rDocShell) +{ + { + ::sd::ViewShell* pViewShell = rDocShell.GetViewShell(); + if (pViewShell != nullptr) + return pViewShell; + } + + try + { + // Get a component enumeration from the desktop and search it for documents. + uno::Reference xContext( ::comphelper::getProcessComponentContext()); + + uno::Reference xDesktop = frame::Desktop::create(xContext); + + if ( ! xDesktop.is()) + return nullptr; + + uno::Reference xFrameAccess = xDesktop->getFrames(); + if ( ! xFrameAccess.is()) + return nullptr; + + for (sal_Int32 nIndex=0,nCount=xFrameAccess->getCount(); nIndex xFrame; + if ( ! (xFrameAccess->getByIndex(nIndex) >>= xFrame)) + continue; + + auto xController = xFrame->getController(); + ::sd::DrawController* pController = dynamic_cast(xController.get()); + if (pController == nullptr) + continue; + ::sd::ViewShellBase* pBase = pController->GetViewShellBase(); + if (pBase == nullptr) + continue; + if (pBase->GetDocShell() != &rDocShell) + continue; + + const std::shared_ptr pViewShell (pBase->GetMainViewShell()); + if (pViewShell) + return pViewShell.get(); + } + } + catch (uno::Exception &) + { + // When there is an exception then simply use the default value of + // bIsEnabled and disable the controls. + } + return nullptr; +} + +SdPageObjsTLV::SdPageObjsTLV(std::unique_ptr xTreeView) + : m_xTreeView(std::move(xTreeView)) + , m_xScratchIter(m_xTreeView->make_iterator()) + , m_xDropTargetHelper(new SdPageObjsTLVDropTarget(*m_xTreeView)) + , m_xAccel(::svt::AcceleratorExecute::createAcceleratorHelper()) + , m_pNavigator(nullptr) + , m_pDoc(nullptr) + , m_pBookmarkDoc(nullptr) + , m_pMedium(nullptr) + , m_pOwnMedium(nullptr) + , m_bLinkableSelected(false) + , m_bShowAllShapes(false) + , m_bOrderFrontToBack(false) + , m_bShowAllPages(false) + , m_bSelectionHandlerNavigates(false) + , m_bNavigationGrabsFocus(true) + , m_eSelectionMode(SelectionMode::Single) + , m_nSelectEventId(nullptr) + , m_nRowActivateEventId(nullptr) +{ + m_xTreeView->connect_expanding(LINK(this, SdPageObjsTLV, RequestingChildrenHdl)); + m_xTreeView->connect_changed(LINK(this, SdPageObjsTLV, SelectHdl)); + m_xTreeView->connect_row_activated(LINK(this, SdPageObjsTLV, RowActivatedHdl)); + m_xTreeView->connect_drag_begin(LINK(this, SdPageObjsTLV, DragBeginHdl)); + m_xTreeView->connect_key_press(LINK(this, SdPageObjsTLV, KeyInputHdl)); + m_xTreeView->connect_mouse_press(LINK(this, SdPageObjsTLV, MousePressHdl)); + m_xTreeView->connect_mouse_release(LINK(this, SdPageObjsTLV, MouseReleaseHdl)); + m_xTreeView->connect_editing(LINK(this, SdPageObjsTLV, EditingEntryHdl), + LINK(this, SdPageObjsTLV, EditedEntryHdl)); + m_xTreeView->connect_popup_menu(LINK(this, SdPageObjsTLV, CommandHdl)); + + m_xTreeView->set_size_request(m_xTreeView->get_approximate_digit_width() * 28, + m_xTreeView->get_text_height() * 8); + m_xTreeView->set_column_editables({true}); +} + +IMPL_LINK(SdPageObjsTLV, EditEntryAgain, void*, p, void) +{ + m_xTreeView->grab_focus(); + std::unique_ptr xEntry(static_cast(p)); + m_xTreeView->start_editing(*xEntry); + m_bEditing = true; +} + +IMPL_LINK_NOARG(SdPageObjsTLV, EditingEntryHdl, const weld::TreeIter&, bool) +{ + m_bEditing = true; + return true; +} + +IMPL_LINK(SdPageObjsTLV, EditedEntryHdl, const IterString&, rIterString, bool) +{ + m_bEditing = false; + + // Did the name change? + if (m_xTreeView->get_text(rIterString.first) == rIterString.second) + return true; + + // If the new name is empty or not unique, start editing again. + if (rIterString.second.isEmpty() || m_pDoc->GetObj(rIterString.second)) + { + std::unique_ptr xEntry(m_xTreeView->make_iterator(&rIterString.first)); + Application::PostUserEvent(LINK(this, SdPageObjsTLV, EditEntryAgain), xEntry.release()); + return false; + } + + // set the new name + const auto& rEntryId = m_xTreeView->get_id(rIterString.first); + if (rEntryId.toInt64() == 1) + { + // page name + if (::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh()) + { + if (::sd::ViewShell* pViewShell = GetViewShellForDocShell(*pDocShell)) + { + SdPage* pPage = pViewShell->GetActualPage(); + pPage->SetName(rIterString.second); + } + } + } + else if (SdrObject* pCursorEntryObject = weld::fromId(rEntryId)) + { + // object name + pCursorEntryObject->SetName(rIterString.second); + } + + return true; +} + +IMPL_LINK_NOARG(SdPageObjsTLV, SelectHdl, weld::TreeView&, void) +{ + if (m_nSelectEventId) + Application::RemoveUserEvent(m_nSelectEventId); + // post the event to process select event after mouse press event + m_nSelectEventId = Application::PostUserEvent(LINK(this, SdPageObjsTLV, AsyncSelectHdl)); +} + +IMPL_LINK_NOARG(SdPageObjsTLV, RowActivatedHdl, weld::TreeView&, bool) +{ + if (m_nRowActivateEventId) + Application::RemoveUserEvent(m_nRowActivateEventId); + // post the event to process row activate after mouse press event + m_nRowActivateEventId = Application::PostUserEvent(LINK(this, SdPageObjsTLV, AsyncRowActivatedHdl)); + return false; +} + +IMPL_LINK_NOARG(SdPageObjsTLV, AsyncSelectHdl, void*, void) +{ + Select(); +} + +void SdPageObjsTLV::Select() +{ + m_nSelectEventId = nullptr; + + // m_bMouseReleased is a hack to make inplace editing work for X11 + if (m_bMouseReleased) + return; + + m_bLinkableSelected = true; + + m_xTreeView->selected_foreach([this](weld::TreeIter& rEntry){ + if (m_xTreeView->get_id(rEntry).toInt64() == 0) + m_bLinkableSelected = false; + return false; + }); + + m_aChangeHdl.Call(*m_xTreeView); + + if (m_bSelectionHandlerNavigates) + m_aRowActivatedHdl.Call(*m_xTreeView); + + if (!m_pNavigator) + { + m_xHelper.clear(); + return; + } + + ::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh(); + OUString aURL = INetURLObject(pDocShell->GetMedium()->GetPhysicalName(), INetProtocol::File).GetMainURL(INetURLObject::DecodeMechanism::NONE); + NavigatorDragType eDragType = m_pNavigator->GetNavigatorDragType(); + + OUString sSelectedEntry = get_cursor_text(); // what about multiple selections? + aURL += "#" + sSelectedEntry; + + INetBookmark aBookmark(aURL, sSelectedEntry); + sal_Int8 nDNDActions = DND_ACTION_COPYMOVE; + + if( eDragType == NAVIGATOR_DRAGTYPE_LINK ) + nDNDActions = DND_ACTION_LINK; // Either COPY *or* LINK, never both! + else if (m_pDoc->GetSdPageCount(PageKind::Standard) == 1) + { + // Can not move away the last slide in a document. + nDNDActions = DND_ACTION_COPY; + } + + // object is destroyed by internal reference mechanism + m_xHelper.set(new SdPageObjsTLV::SdPageObjsTransferable(std::move(aBookmark), *pDocShell, eDragType)); + rtl::Reference xHelper(m_xHelper); + m_xTreeView->enable_drag_source(xHelper, nDNDActions); +} + +IMPL_LINK_NOARG(SdPageObjsTLV, AsyncRowActivatedHdl, void*, void) +{ + m_nRowActivateEventId = nullptr; + m_aRowActivatedHdl.Call(*m_xTreeView); +} + +OUString SdPageObjsTLV::GetObjectName( + const SdrObject* pObject, + const bool bCreate) const +{ + OUString aRet; + + if ( pObject ) + { + aRet = pObject->GetName(); + + if (aRet.isEmpty()) + if (auto pOleObj = dynamic_cast(pObject)) + aRet = pOleObj->GetPersistName(); + } + + if (bCreate + && m_bShowAllShapes + && aRet.isEmpty() + && pObject!=nullptr) + { + aRet = SdResId(STR_NAVIGATOR_SHAPE_BASE_NAME) + " (" + pObject->TakeObjNameSingul() +")"; + aRet = aRet.replaceFirst("%1", OUString::number(pObject->GetOrdNum() + 1)); + } + + return aRet; +} + +std::vector SdPageObjsTLV::GetSelectEntryList(const int nDepth) const +{ + std::vector aEntries; + + m_xTreeView->selected_foreach([this, nDepth, &aEntries](weld::TreeIter& rEntry){ + int nListDepth = m_xTreeView->get_iter_depth(rEntry); + if (nListDepth == nDepth) + aEntries.push_back(m_xTreeView->get_text(rEntry)); + return false; + }); + + return aEntries; +} + +std::vector SdPageObjsTLV::GetSelectedEntryIds() const +{ + std::vector vEntryIds; + + m_xTreeView->selected_foreach([this, &vEntryIds](weld::TreeIter& rEntry){ + vEntryIds.push_back(m_xTreeView->get_id(rEntry)); + return false; + }); + + return vEntryIds; +} + +/** + * Checks if it is a draw file and opens the BookmarkDoc depending of + * the provided Docs + */ +SdDrawDocument* SdPageObjsTLV::GetBookmarkDoc(SfxMedium* pMed) +{ + if ( + !m_pBookmarkDoc || + (pMed && (!m_pOwnMedium || m_pOwnMedium->GetName() != pMed->GetName())) + ) + { + // create a new BookmarkDoc if now one exists or if a new Medium is provided + if (m_pOwnMedium != pMed) + { + CloseBookmarkDoc(); + } + + if (pMed) + { + // it looks that it is undefined if a Medium was set by Fill() already + DBG_ASSERT( !m_pMedium, "SfxMedium confusion!" ); + delete m_pMedium; + m_pMedium = nullptr; + + // take over this Medium (currently used only be Navigator) + m_pOwnMedium = pMed; + } + + DBG_ASSERT( m_pMedium || pMed, "No SfxMedium provided!" ); + + if( pMed ) + { + // in this mode the document is also owned and controlled by this instance + m_xBookmarkDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::STANDARD, true, DocumentType::Impress); + if (m_xBookmarkDocShRef->DoLoad(pMed)) + m_pBookmarkDoc = m_xBookmarkDocShRef->GetDoc(); + else + m_pBookmarkDoc = nullptr; + } + else if ( m_pMedium ) + // in this mode the document is owned and controlled by the SdDrawDocument + // it can be released by calling the corresponding CloseBookmarkDoc method + // successful creation of a document makes this the owner of the medium + m_pBookmarkDoc = const_cast(m_pDoc)->OpenBookmarkDoc(m_pMedium); + + if ( !m_pBookmarkDoc ) + { + std::unique_ptr xErrorBox(Application::CreateMessageDialog(m_xTreeView.get(), + VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR))); + xErrorBox->run(); + m_pMedium = nullptr; //On failure the SfxMedium is invalid + } + } + + return m_pBookmarkDoc; +} + +/** + * Entries are inserted only by request (double click) + */ +IMPL_LINK(SdPageObjsTLV, RequestingChildrenHdl, const weld::TreeIter&, rFileEntry, bool) +{ + if (!m_xTreeView->iter_has_child(rFileEntry)) + { + if (GetBookmarkDoc()) + { + SdrObject* pObj = nullptr; + + OUString sImgPage(BMP_PAGE); + OUString sImgPageObjs(BMP_PAGEOBJS); + OUString sImgObjects(BMP_OBJECTS); + OUString sImgOle(BMP_OLE); + OUString sImgGraphic(BMP_GRAPHIC); + + // document name already inserted + + // only insert all "normal" ? slides with objects + sal_uInt16 nPage = 0; + const sal_uInt16 nMaxPages = m_pBookmarkDoc->GetPageCount(); + + std::unique_ptr xPageEntry; + while (nPage < nMaxPages) + { + SdPage* pPage = static_cast(m_pBookmarkDoc->GetPage(nPage)); + if (pPage->GetPageKind() == PageKind::Standard) + { + OUString sId(OUString::number(1)); + m_xTreeView->insert(&rFileEntry, -1, &pPage->GetName(), &sId, + nullptr, nullptr, false, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, sImgPage); + + if (!xPageEntry) + { + xPageEntry = m_xTreeView->make_iterator(&rFileEntry); + (void)m_xTreeView->iter_children(*xPageEntry); + } + else + (void)m_xTreeView->iter_next_sibling(*xPageEntry); + + SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups ); + + while( aIter.IsMore() ) + { + pObj = aIter.Next(); + OUString aStr( GetObjectName( pObj ) ); + if( !aStr.isEmpty() ) + { + if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::OLE2 ) + { + m_xTreeView->insert(xPageEntry.get(), -1, &aStr, nullptr, + nullptr, nullptr, false, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, sImgOle); + } + else if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Graphic ) + { + m_xTreeView->insert(xPageEntry.get(), -1, &aStr, nullptr, + nullptr, nullptr, false, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, sImgGraphic); + } + else + { + m_xTreeView->insert(xPageEntry.get(), -1, &aStr, nullptr, + nullptr, nullptr, false, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, sImgObjects); + } + } + } + if (m_xTreeView->iter_has_child(*xPageEntry)) + { + m_xTreeView->set_image(*xPageEntry, sImgPageObjs); + } + } + nPage++; + } + } + } + return true; +} + +void SdPageObjsTLV::SetSdNavigator(SdNavigatorWin* pNavigator) +{ + m_pNavigator = pNavigator; +} + +void SdPageObjsTLV::SetViewFrame(const SfxViewFrame* pViewFrame) +{ + sd::ViewShellBase* pBase = sd::ViewShellBase::GetViewShellBase(pViewFrame); + std::shared_ptr xViewShell = pBase->GetMainViewShell(); + SAL_WARN_IF(!xViewShell, "sd", "null pBaseViewFrame"); + const css::uno::Reference< css::frame::XFrame > xFrame = xViewShell ? xViewShell->GetViewFrame()->GetFrame().GetFrameInterface() : nullptr; + m_xAccel->init(::comphelper::getProcessComponentContext(), xFrame); +} + +/** + * Close and delete bookmark document + */ +void SdPageObjsTLV::CloseBookmarkDoc() +{ + if (m_xBookmarkDocShRef.is()) + { + m_xBookmarkDocShRef->DoClose(); + m_xBookmarkDocShRef.clear(); + + // Medium is owned by document, so it's destroyed already + m_pOwnMedium = nullptr; + } + else if (m_pBookmarkDoc) + { + DBG_ASSERT(!m_pOwnMedium, "SfxMedium confusion!"); + if (m_pDoc) + { + // The document owns the Medium, so the Medium will be invalid after closing the document + const_cast(m_pDoc)->CloseBookmarkDoc(); + m_pMedium = nullptr; + } + } + else + { + // perhaps mpOwnMedium provided, but no successful creation of BookmarkDoc + delete m_pOwnMedium; + m_pOwnMedium = nullptr; + } + + m_pBookmarkDoc = nullptr; +} + +bool SdPageObjsTLV::PageBelongsToCurrentShow(const SdPage* pPage) const +{ + // Return as default when there is no custom show or when none + // is used. The page does then belong to the standard show. + bool bBelongsToShow = true; + + if (m_pDoc->getPresentationSettings().mbCustomShow) + { + // Get the current custom show. + SdCustomShow* pCustomShow = nullptr; + SdCustomShowList* pShowList = const_cast(m_pDoc)->GetCustomShowList(); + if (pShowList != nullptr) + { + sal_uLong nCurrentShowIndex = pShowList->GetCurPos(); + pCustomShow = (*pShowList)[nCurrentShowIndex].get(); + } + + // Check whether the given page is part of that custom show. + if (pCustomShow != nullptr) + { + bBelongsToShow = false; + size_t nPageCount = pCustomShow->PagesVector().size(); + for (size_t i=0; iPagesVector()[i]) + bBelongsToShow = true; + } + } + + return bBelongsToShow; +} + +void SdPageObjsTLV::AddShapeList ( + const SdrObjList& rList, + const SdrObject* pShape, + const OUString& rsName, + const bool bIsExcluded, + const weld::TreeIter* pParentEntry) +{ + OUString aIcon(BMP_PAGE); + if (bIsExcluded) + aIcon = BMP_PAGE_EXCLUDED; + else if (pShape != nullptr) + aIcon = BMP_GROUP; + + OUString aUserData("1"); + if (pShape != nullptr) + aUserData = weld::toId(pShape); + + std::unique_ptr xEntry = m_xTreeView->make_iterator(); + InsertEntry(pParentEntry, aUserData, rsName, aIcon, xEntry.get()); + + SdrObjListIter aIter( + &rList, + !rList.HasObjectNavigationOrder() /* use navigation order, if available */, + SdrIterMode::Flat); + + while( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + OSL_ASSERT(pObj!=nullptr); + + // Get the shape name. + OUString aStr (GetObjectName( pObj ) ); + OUString sId(weld::toId(pObj)); + + if( !aStr.isEmpty() ) + { + if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::OLE2 ) + { + InsertEntry(xEntry.get(), sId, aStr, BMP_OLE); + } + else if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Graphic ) + { + InsertEntry(xEntry.get(), sId, aStr, BMP_GRAPHIC); + } + else if (pObj->IsGroupObject()) + { + AddShapeList( + *pObj->GetSubList(), + pObj, + aStr, + false, + xEntry.get()); + } + else + { + InsertEntry(xEntry.get(), sId, aStr, BMP_OBJECTS); + } + } + } + + if (!m_xTreeView->iter_has_child(*xEntry)) + return; + + if (bIsExcluded) + m_xTreeView->set_image(*xEntry, BMP_PAGEOBJS_EXCLUDED); + else + m_xTreeView->set_image(*xEntry, BMP_PAGEOBJS); + m_xTreeView->expand_row(*xEntry); +} + +/** + * Fill TreeLB with pages and objects + */ +void SdPageObjsTLV::Fill(const SdDrawDocument* pInDoc, bool bAllPages, const OUString& rDocName) +{ + OUString aSelection = m_xTreeView->get_selected_text(); + clear(); + + m_pDoc = pInDoc; + m_aDocName = rDocName; + m_bShowAllPages = bAllPages; + m_pMedium = nullptr; + + // first insert all pages including objects + sal_uInt16 nPage = 0; + const sal_uInt16 nMaxPages = m_pDoc->GetPageCount(); + + sd::DrawViewShell* pDrawViewShell = lcl_getDrawViewShell(m_pDoc); + if (!pDrawViewShell) + return; + PageKind eDrawViewShellPageKind = pDrawViewShell->GetPageKind(); + + while( nPage < nMaxPages ) + { + const SdPage* pPage = static_cast( m_pDoc->GetPage( nPage ) ); + PageKind ePagePageKind = pPage->GetPageKind(); + if ((m_bShowAllPages || + (ePagePageKind == PageKind::Standard && + eDrawViewShellPageKind == PageKind::Standard) || + (ePagePageKind == PageKind::Notes && + eDrawViewShellPageKind == PageKind::Notes)) && + ePagePageKind != PageKind::Handout) //#94954# never list the normal handout page ( handout-masterpage is used instead ) + { + bool bPageExcluded = pPage->IsExcluded(); + + bool bPageBelongsToShow = PageBelongsToCurrentShow (pPage); + bPageExcluded |= !bPageBelongsToShow; + + AddShapeList(*pPage, nullptr, pPage->GetName(), bPageExcluded, nullptr); + } + nPage++; + } + + // then insert all master pages including objects + if( m_bShowAllPages ) + { + nPage = 0; + const sal_uInt16 nMaxMasterPages = m_pDoc->GetMasterPageCount(); + + while( nPage < nMaxMasterPages ) + { + const SdPage* pPage = static_cast( m_pDoc->GetMasterPage( nPage ) ); + AddShapeList(*pPage, nullptr, pPage->GetName(), false, nullptr); + nPage++; + } + } + if (!aSelection.isEmpty()) + { + m_xTreeView->all_foreach([this, &aSelection](weld::TreeIter& rEntry){ + if (m_xTreeView->get_text(rEntry) == aSelection) + { + m_xTreeView->select(rEntry); + return true; + } + return false; + }); + } +} + +/** + * We insert only the first entry. Children are created on demand. + */ +void SdPageObjsTLV::Fill( const SdDrawDocument* pInDoc, SfxMedium* pInMedium, + const OUString& rDocName ) +{ + m_pDoc = pInDoc; + + // this object now owns the Medium + m_pMedium = pInMedium; + m_aDocName = rDocName; + + OUString sId(OUString::number(1)); + // insert document name + m_xTreeView->insert(nullptr, -1, &m_aDocName, &sId, nullptr, nullptr, true, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, BMP_DOC_OPEN); +} + +/** + * select an entry in TreeLB + */ +bool SdPageObjsTLV::SelectEntry( std::u16string_view rName ) +{ + bool bFound = false; + + if (!rName.empty()) + { + std::unique_ptr xEntry(m_xTreeView->make_iterator()); + OUString aTmp; + + if (m_xTreeView->get_iter_first(*xEntry)) + { + do + { + aTmp = m_xTreeView->get_text(*xEntry); + if (aTmp == rName) + { + m_xTreeView->set_cursor(*xEntry); + m_xTreeView->select(*xEntry); + bFound = true; + break; + } + } + while (m_xTreeView->iter_next(*xEntry)); + } + } + + return bFound; +} + +void SdPageObjsTLV::SelectEntry(const SdrObject *pObj) +{ + if (pObj) + { + m_xTreeView->all_foreach([this, &pObj](weld::TreeIter& rEntry){ + if (weld::fromId(m_xTreeView->get_id(rEntry)) == pObj) + { + // Only scroll to the row of the first selected. And only when the treeview + // doesn't have the focus. + if (!m_xTreeView->has_focus() && m_xTreeView->get_selected_rows().empty()) + m_xTreeView->set_cursor(rEntry); + m_xTreeView->select(rEntry); + return true; + } + return false; + }); + } +} + +SdPageObjsTLV::~SdPageObjsTLV() +{ + if (m_nSelectEventId) + Application::RemoveUserEvent(m_nSelectEventId); + if (m_nRowActivateEventId) + Application::RemoveUserEvent(m_nRowActivateEventId); + + if (m_pBookmarkDoc) + CloseBookmarkDoc(); + else + { + // no document was created from m_pMedium, so this object is still the owner of it + delete m_pMedium; + } + m_xAccel.reset(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/sduiexp.cxx b/sd/source/ui/dlg/sduiexp.cxx new file mode 100644 index 0000000000..62901c70d0 --- /dev/null +++ b/sd/source/ui/dlg/sduiexp.cxx @@ -0,0 +1,33 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "sddlgfact.hxx" +#include + +class SdAbstractDialogFactory; + +extern "C" { +SAL_DLLPUBLIC_EXPORT SdAbstractDialogFactory* SdCreateDialogFactory() +{ + static SdAbstractDialogFactory_Impl aFactory; + return &aFactory; +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/tabtempl.cxx b/sd/source/ui/dlg/tabtempl.cxx new file mode 100644 index 0000000000..70930be48f --- /dev/null +++ b/sd/source/ui/dlg/tabtempl.cxx @@ -0,0 +1,160 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/** + * Constructor of the Tab dialog: appends pages to the dialog + */ +SdTabTemplateDlg::SdTabTemplateDlg(weld::Window* pParent, + const SfxObjectShell* pDocShell, + SfxStyleSheetBase& rStyleBase, + SdrModel const * pModel, + SdrView* pView) + : SfxStyleDialogController(pParent, "modules/simpress/ui/templatedialog.ui", + "TemplateDialog", rStyleBase) + , rDocShell(*pDocShell) + , pSdrView(pView) + , pColorList(pModel->GetColorList()) + , pGradientList(pModel->GetGradientList()) + , pHatchingList(pModel->GetHatchList()) + , pBitmapList(pModel->GetBitmapList()) + , pPatternList(pModel->GetPatternList()) + , pDashList(pModel->GetDashList()) + , pLineEndList(pModel->GetLineEndList()) +{ + // fill Listbox and set Select-Handler + + AddTabPage("line", RID_SVXPAGE_LINE); + AddTabPage("area", RID_SVXPAGE_AREA); + AddTabPage("shadowing", RID_SVXPAGE_SHADOW); + AddTabPage("transparency", RID_SVXPAGE_TRANSPARENCE); + AddTabPage("font", RID_SVXPAGE_CHAR_NAME); + AddTabPage("fonteffect", RID_SVXPAGE_CHAR_EFFECTS); + AddTabPage("background", RID_SVXPAGE_BKG); + AddTabPage("indents", RID_SVXPAGE_STD_PARAGRAPH); + AddTabPage("text", RID_SVXPAGE_TEXTATTR); + AddTabPage("animation", RID_SVXPAGE_TEXTANIMATION); + AddTabPage("dimensioning", RID_SVXPAGE_MEASURE); + AddTabPage("connector", RID_SVXPAGE_CONNECTION); + AddTabPage("alignment", RID_SVXPAGE_ALIGN_PARAGRAPH); + AddTabPage("tabs", RID_SVXPAGE_TABULATOR); + if( SvtCJKOptions::IsAsianTypographyEnabled() ) + AddTabPage("asiantypo", RID_SVXPAGE_PARA_ASIAN); + else + RemoveTabPage("asiantypo"); +} + +void SdTabTemplateDlg::PageCreated(const OUString& rId, SfxTabPage &rPage) +{ + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + if (rId == "line") + { + aSet.Put (SvxColorListItem(pColorList,SID_COLOR_TABLE)); + aSet.Put (SvxDashListItem(pDashList,SID_DASH_LIST)); + aSet.Put (SvxLineEndListItem(pLineEndList,SID_LINEEND_LIST)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + rPage.PageCreated(aSet); + } + else if (rId == "area") + { + aSet.Put (SvxColorListItem(pColorList,SID_COLOR_TABLE)); + aSet.Put (SvxGradientListItem(pGradientList,SID_GRADIENT_LIST)); + aSet.Put (SvxHatchListItem(pHatchingList,SID_HATCH_LIST)); + aSet.Put (SvxBitmapListItem(pBitmapList,SID_BITMAP_LIST)); + aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + aSet.Put (SfxUInt16Item(SID_TABPAGE_POS,0)); + aSet.Put (SvxPatternListItem(pPatternList,SID_PATTERN_LIST)); + rPage.PageCreated(aSet); + } + else if (rId == "shadowing") + { + aSet.Put (SvxColorListItem(pColorList,SID_COLOR_TABLE)); + aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + rPage.PageCreated(aSet); + } + else if (rId == "transparency") + { + aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0)); + aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1)); + rPage.PageCreated(aSet); + } + else if (rId == "font") + { + SvxFontListItem aItem(*static_cast( + rDocShell.GetItem( SID_ATTR_CHAR_FONTLIST) ) ); + + aSet.Put (SvxFontListItem( aItem.GetFontList(), SID_ATTR_CHAR_FONTLIST)); + rPage.PageCreated(aSet); + } + else if (rId == "fonteffect") + { + rPage.PageCreated(aSet); + } + else if (rId == "background") + { + aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR))); + rPage.PageCreated(aSet); + } + else if (rId == "text") + { + rPage.PageCreated(aSet); + } + else if (rId == "dimensioning") + { + aSet.Put (OfaPtrItem(SID_OBJECT_LIST,pSdrView)); + rPage.PageCreated(aSet); + } + else if (rId == "connector") + { + aSet.Put (OfaPtrItem(SID_OBJECT_LIST,pSdrView)); + rPage.PageCreated(aSet); + } +} + +void SdTabTemplateDlg::RefreshInputSet() +{ + SfxItemSet* pInputSet = GetInputSetImpl(); + + if( pInputSet ) + { + pInputSet->ClearItem(); + pInputSet->SetParent( GetStyleSheet().GetItemSet().GetParent() ); + } + else + SetInputSet(&GetStyleSheet().GetItemSet()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/titledockwin.cxx b/sd/source/ui/dlg/titledockwin.cxx new file mode 100644 index 0000000000..d545170da6 --- /dev/null +++ b/sd/source/ui/dlg/titledockwin.cxx @@ -0,0 +1,332 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace sd +{ + //= TitledDockingWindow + TitledDockingWindow::TitledDockingWindow( SfxBindings* i_pBindings, SfxChildWindow* i_pChildWindow, vcl::Window* i_pParent, const OUString& rsTitle ) + :SfxDockingWindow( i_pBindings, i_pChildWindow, i_pParent, WB_MOVEABLE|WB_CLOSEABLE|WB_DOCKABLE|WB_HIDE|WB_3DLOOK ) + ,m_aToolbox( VclPtr::Create(this) ) + ,m_aContentWindow( VclPtr::Create(this, WB_DIALOGCONTROL) ) + ,m_aBorder( 3, 1, 3, 3 ) + ,m_nTitleBarHeight(0) + { + SetBackground( Wallpaper() ); + + m_aToolbox->SetSelectHdl( LINK( this, TitledDockingWindow, OnToolboxItemSelected ) ); + m_aToolbox->SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetDialogColor() ) ); + m_aToolbox->Show(); + impl_resetToolBox(); + + m_aContentWindow->Show(); + + m_sTitle = rsTitle; + Invalidate(); + SetSizePixel(LogicToPixel(Size(80,200), MapMode(MapUnit::MapAppFont))); + } + + TitledDockingWindow::~TitledDockingWindow() + { + disposeOnce(); + } + + void TitledDockingWindow::dispose() + { + m_aToolbox.disposeAndClear(); + m_aContentWindow.disposeAndClear(); + SfxDockingWindow::dispose(); + } + + void TitledDockingWindow::SetTitle(const OUString& i_rText) + { + m_sTitle = i_rText; + Invalidate(); + } + + void TitledDockingWindow::SetText( const OUString& i_rText ) + { + SfxDockingWindow::SetText( i_rText ); + if ( m_sTitle.isEmpty() ) + // our text is used as title, too => repaint + Invalidate(); + } + + + void TitledDockingWindow::Resize() + { + SfxDockingWindow::Resize(); + impl_layout(); + } + + + void TitledDockingWindow::impl_layout() + { + m_aToolbox->ShowItem( ToolBoxItemId(1), !IsFloatingMode() ); + + const Size aToolBoxSize( m_aToolbox->CalcWindowSizePixel() ); + Size aWindowSize( GetOutputSizePixel() ); + + // position the tool box + m_nTitleBarHeight = GetSettings().GetStyleSettings().GetTitleHeight(); + if ( aToolBoxSize.Height() > m_nTitleBarHeight ) + m_nTitleBarHeight = aToolBoxSize.Height(); + m_aToolbox->SetPosSizePixel( + Point( + aWindowSize.Width() - aToolBoxSize.Width(), + ( m_nTitleBarHeight - aToolBoxSize.Height() ) / 2 + ), + aToolBoxSize + ); + + // Place the content window. + if ( m_nTitleBarHeight < aToolBoxSize.Height() ) + m_nTitleBarHeight = aToolBoxSize.Height(); + aWindowSize.AdjustHeight( -m_nTitleBarHeight ); + m_aContentWindow->SetPosSizePixel( + Point( m_aBorder.Left(), m_nTitleBarHeight + m_aBorder.Top() ), + Size( + aWindowSize.Width() - m_aBorder.Left() - m_aBorder.Right(), + aWindowSize.Height() - m_aBorder.Top() - m_aBorder.Bottom() + ) + ); + } + + void TitledDockingWindow::ApplySettings(vcl::RenderContext& rRenderContext) + { + const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings(); + + // Font + ApplyControlFont(rRenderContext, rStyleSettings.GetAppFont()); + + // Color + ApplyControlForeground(rRenderContext, rStyleSettings.GetButtonTextColor()); + rRenderContext.SetTextFillColor(); + } + + void TitledDockingWindow::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& i_rArea) + { + const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings(); + + SfxDockingWindow::Paint(rRenderContext, i_rArea); + + rRenderContext.Push(vcl::PushFlags::FONT | vcl::PushFlags::FILLCOLOR | vcl::PushFlags::LINECOLOR); + + rRenderContext.SetFillColor(rStyleSettings.GetDialogColor()); + rRenderContext.SetLineColor(); + + // bold font + vcl::Font aFont(rRenderContext.GetFont()); + aFont.SetWeight(WEIGHT_BOLD); + rRenderContext.SetFont(aFont); + + // Set border values. + Size aWindowSize(GetOutputSizePixel()); + int nOuterLeft = 0; + int nInnerLeft = nOuterLeft + m_aBorder.Left() - 1; + int nOuterRight = aWindowSize.Width() - 1; + int nInnerRight = nOuterRight - m_aBorder.Right() + 1; + int nInnerTop = m_nTitleBarHeight + m_aBorder.Top() - 1; + int nOuterBottom = aWindowSize.Height() - 1; + int nInnerBottom = nOuterBottom - m_aBorder.Bottom() + 1; + + // Paint title bar background. + ::tools::Rectangle aTitleBarBox(nOuterLeft, 0, nOuterRight, nInnerTop - 1); + rRenderContext.DrawRect(aTitleBarBox); + + if (nInnerLeft > nOuterLeft) + rRenderContext.DrawRect(::tools::Rectangle(nOuterLeft, nInnerTop, nInnerLeft, nInnerBottom)); + if (nOuterRight > nInnerRight) + rRenderContext.DrawRect(::tools::Rectangle(nInnerRight, nInnerTop, nOuterRight, nInnerBottom)); + if (nInnerBottom < nOuterBottom) + rRenderContext.DrawRect(::tools::Rectangle(nOuterLeft, nInnerBottom, nOuterRight, nOuterBottom)); + + // Paint bevel border. + rRenderContext.SetFillColor(); + rRenderContext.SetLineColor(rStyleSettings.GetShadowColor()); + if (m_aBorder.Top() > 0) + rRenderContext.DrawLine(Point(nInnerLeft, nInnerTop), Point(nInnerLeft, nInnerBottom)); + if (m_aBorder.Left() > 0) + rRenderContext.DrawLine(Point(nInnerLeft, nInnerTop), Point(nInnerRight, nInnerTop)); + + rRenderContext.SetLineColor(rStyleSettings.GetLightColor()); + if (m_aBorder.Bottom() > 0) + rRenderContext.DrawLine(Point(nInnerRight, nInnerBottom), Point(nInnerLeft, nInnerBottom)); + if (m_aBorder.Right() > 0) + rRenderContext.DrawLine(Point(nInnerRight, nInnerBottom), Point(nInnerRight, nInnerTop)); + + // Paint title bar text. + rRenderContext.SetLineColor(rStyleSettings.GetActiveTextColor()); + aTitleBarBox.AdjustLeft(3 ); + rRenderContext.DrawText(aTitleBarBox, + !m_sTitle.isEmpty() ? m_sTitle : GetText(), + DrawTextFlags::Left | DrawTextFlags::VCenter | DrawTextFlags::MultiLine | DrawTextFlags::WordBreak); + + // Restore original values of the output device. + rRenderContext.Pop(); + } + + + void TitledDockingWindow::impl_resetToolBox() + { + m_aToolbox->Clear(); + + // Get the closer bitmap and set it as right most button. + m_aToolbox->InsertItem(ToolBoxItemId(1), Image(StockImage::Yes, SFX_BMP_CLOSE_DOC)); + m_aToolbox->SetQuickHelpText(ToolBoxItemId(1), SdResId(STR_CLOSE_PANE)); + m_aToolbox->ShowItem( ToolBoxItemId(1) ); + } + + + IMPL_LINK( TitledDockingWindow, OnToolboxItemSelected, ToolBox*, pToolBox, void ) + { + const ToolBoxItemId nId = pToolBox->GetCurItemId(); + + if ( nId == ToolBoxItemId(1) ) + { + // the closer + EndTracking(); + const sal_uInt16 nChildWindowId( GetChildWindow_Impl()->GetType() ); + const SfxBoolItem aVisibility( nChildWindowId, false ); + GetBindings().GetDispatcher()->ExecuteList( + nChildWindowId, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aVisibility } + ); + } + } + + + void TitledDockingWindow::StateChanged( StateChangedType i_nType ) + { + switch (i_nType) + { + case StateChangedType::InitShow: + Resize(); + GetContentWindow().SetStyle(GetContentWindow().GetStyle() | WB_DIALOGCONTROL); + impl_layout(); + break; + + case StateChangedType::Visible: + { + // The visibility of the docking window has changed. Tell the + // ConfigurationController so that it can activate or deactivate + // a/the view for the pane. + // Without this the side panes remain empty after closing an + // in-place slide show. + ViewShellBase* pBase = ViewShellBase::GetViewShellBase( + GetBindings().GetDispatcher()->GetFrame()); + if (pBase != nullptr) + { + framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration(); + } + } + break; + + default:; + } + SfxDockingWindow::StateChanged( i_nType ); + } + + void TitledDockingWindow::DataChanged( const DataChangedEvent& i_rDataChangedEvent ) + { + SfxDockingWindow::DataChanged( i_rDataChangedEvent ); + + switch ( i_rDataChangedEvent.GetType() ) + { + case DataChangedEventType::SETTINGS: + if ( !( i_rDataChangedEvent.GetFlags() & AllSettingsFlags::STYLE ) ) + break; + [[fallthrough]]; + case DataChangedEventType::FONTS: + case DataChangedEventType::FONTSUBSTITUTION: + { + impl_layout(); + Invalidate(); + } + break; + default: break; + } + } + + void TitledDockingWindow::MouseButtonDown (const MouseEvent& rEvent) + { + if (rEvent.GetButtons() == MOUSE_LEFT) + { + // For some strange reason we have to set the WB_DIALOGCONTROL at + // the content window in order to have it pass focus to its content + // window. Without setting this flag here that works only on views + // that have not been taken from the cash and relocated to this pane + // docking window. + GetContentWindow().SetStyle(GetContentWindow().GetStyle() | WB_DIALOGCONTROL); + GetContentWindow().GrabFocus(); + } + SfxDockingWindow::MouseButtonDown(rEvent); + } + + void TitledDockingWindow::SetValidSizeRange (const Range& rValidSizeRange) + { + SplitWindow* pSplitWindow = dynamic_cast(GetParent()); + if (pSplitWindow == nullptr) + return; + + const sal_uInt16 nId (pSplitWindow->GetItemId(static_cast< vcl::Window*>(this))); + const sal_uInt16 nSetId (pSplitWindow->GetSet(nId)); + // Because the TitledDockingWindow paints its own decoration, we have + // to compensate the valid size range for that. + const SvBorder aBorder (GetDecorationBorder()); + sal_Int32 nCompensation (pSplitWindow->IsHorizontal() + ? aBorder.Top() + aBorder.Bottom() + : aBorder.Left() + aBorder.Right()); + pSplitWindow->SetItemSizeRange( + nSetId, + Range( + rValidSizeRange.Min() + nCompensation, + rValidSizeRange.Max() + nCompensation)); + } + + TitledDockingWindow::Orientation TitledDockingWindow::GetOrientation() const + { + SplitWindow* pSplitWindow = dynamic_cast(GetParent()); + if (pSplitWindow == nullptr) + return UnknownOrientation; + else if (pSplitWindow->IsHorizontal()) + return HorizontalOrientation; + else + return VerticalOrientation; + } + +} // namespace sfx2 + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/tpaction.cxx b/sd/source/ui/dlg/tpaction.cxx new file mode 100644 index 0000000000..db92bd2a82 --- /dev/null +++ b/sd/source/ui/dlg/tpaction.cxx @@ -0,0 +1,801 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +using namespace ::com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; + +#define DOCUMENT_TOKEN '#' + +// XML content stream +constexpr OUStringLiteral pStarDrawXMLContent( u"content.xml" ); + +/** + * Constructor of the Tab dialog: appends the pages to the dialog + */ +SdActionDlg::SdActionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View const * pView) + : SfxSingleTabDialogController(pParent, pAttr, "modules/simpress/ui/interactiondialog.ui", + "InteractionDialog") +{ + std::unique_ptr xNewPage = SdTPAction::Create(get_content_area(), this, *pAttr); + + // formerly in PageCreated + static_cast( xNewPage.get() )->SetView( pView ); + static_cast( xNewPage.get() )->Construct(); + + SetTabPage(std::move(xNewPage)); +} + +/** + * Action-TabPage + */ +SdTPAction::SdTPAction(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs) + : SfxTabPage(pPage, pController, "modules/simpress/ui/interactionpage.ui", "InteractionPage", &rInAttrs) + , mpView(nullptr) + , mpDoc(nullptr) + , bTreeUpdated(false) + , m_xLbAction(m_xBuilder->weld_combo_box("listbox")) + , m_xFtTree(m_xBuilder->weld_label("fttree")) + , m_xLbTree(new SdPageObjsTLV(m_xBuilder->weld_tree_view("tree"))) + , m_xLbTreeDocument(new SdPageObjsTLV(m_xBuilder->weld_tree_view("treedoc"))) + , m_xLbOLEAction(m_xBuilder->weld_tree_view("oleaction")) + , m_xFrame(m_xBuilder->weld_frame("frame")) + , m_xEdtSound(m_xBuilder->weld_entry("sound")) + , m_xEdtBookmark(m_xBuilder->weld_entry("bookmark")) + , m_xEdtDocument(m_xBuilder->weld_entry("document")) + , m_xEdtProgram(m_xBuilder->weld_entry("program")) + , m_xEdtMacro(m_xBuilder->weld_entry("macro")) + , m_xBtnSearch(m_xBuilder->weld_button("browse")) + , m_xBtnSeek(m_xBuilder->weld_button("find")) +{ + m_xLbOLEAction->set_size_request(m_xLbOLEAction->get_approximate_digit_width() * 48, + m_xLbOLEAction->get_height_rows(12)); + + m_xBtnSearch->connect_clicked( LINK( this, SdTPAction, ClickSearchHdl ) ); + m_xBtnSeek->connect_clicked( LINK( this, SdTPAction, ClickSearchHdl ) ); + + // this page needs ExchangeSupport + SetExchangeSupport(); + + m_xLbAction->connect_changed( LINK( this, SdTPAction, ClickActionHdl ) ); + m_xLbTree->connect_changed( LINK( this, SdTPAction, SelectTreeHdl ) ); + m_xEdtDocument->connect_focus_out( LINK( this, SdTPAction, CheckFileHdl ) ); + m_xEdtMacro->connect_focus_out( LINK( this, SdTPAction, CheckFileHdl ) ); + + //Lock to initial max size + Size aSize(m_xContainer->get_preferred_size()); + m_xContainer->set_size_request(aSize.Width(), aSize.Height()); + + ClickActionHdl( *m_xLbAction ); +} + +SdTPAction::~SdTPAction() +{ +} + +void SdTPAction::SetView( const ::sd::View* pSdView ) +{ + mpView = pSdView; + + // get ColorTable and fill ListBox + ::sd::DrawDocShell* pDocSh = mpView->GetDocSh(); + if( pDocSh && pDocSh->GetViewShell() ) + { + mpDoc = pDocSh->GetDoc(); + SfxViewFrame* pFrame = pDocSh->GetViewShell()->GetViewFrame(); + m_xLbTree->SetViewFrame( pFrame ); + m_xLbTreeDocument->SetViewFrame( pFrame ); + + pColList = pDocSh->GetItem( SID_COLOR_TABLE )->GetColorList(); + DBG_ASSERT( pColList.is(), "No color table available!" ); + } + else + { + OSL_FAIL("sd::SdTPAction::SetView(), no docshell or viewshell?"); + } +} + +void SdTPAction::Construct() +{ + // fill OLE-Actionlistbox + SdrOle2Obj* pOleObj = nullptr; + SdrGrafObj* pGrafObj = nullptr; + bool bOLEAction = false; + + if ( mpView->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nSdrObjKind = pObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2) + { + pOleObj = static_cast(pObj); + } + else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Graphic) + { + pGrafObj = static_cast(pObj); + } + } + } + if( pGrafObj ) + { + bOLEAction = true; + + aVerbVector.push_back( 0 ); + m_xLbOLEAction->append_text( MnemonicGenerator::EraseAllMnemonicChars( SdResId( STR_EDIT_OBJ ) ) ); + } + else if( pOleObj ) + { + const uno::Reference < embed::XEmbeddedObject >& xObj = pOleObj->GetObjRef(); + if ( xObj.is() ) + { + bOLEAction = true; + uno::Sequence < embed::VerbDescriptor > aVerbs; + try + { + aVerbs = xObj->getSupportedVerbs(); + } + catch ( embed::NeedsRunningStateException& ) + { + xObj->changeState( embed::EmbedStates::RUNNING ); + aVerbs = xObj->getSupportedVerbs(); + } + + for( const embed::VerbDescriptor& aVerb : std::as_const(aVerbs) ) + { + if( aVerb.VerbAttributes & embed::VerbAttributes::MS_VERBATTR_ONCONTAINERMENU ) + { + OUString aTmp( aVerb.VerbName ); + aVerbVector.push_back( aVerb.VerbID ); + m_xLbOLEAction->append_text( MnemonicGenerator::EraseAllMnemonicChars( aTmp ) ); + } + } + } + } + + maCurrentActions.push_back( presentation::ClickAction_NONE ); + maCurrentActions.push_back( presentation::ClickAction_PREVPAGE ); + maCurrentActions.push_back( presentation::ClickAction_NEXTPAGE ); + maCurrentActions.push_back( presentation::ClickAction_FIRSTPAGE ); + maCurrentActions.push_back( presentation::ClickAction_LASTPAGE ); + maCurrentActions.push_back( presentation::ClickAction_BOOKMARK ); + maCurrentActions.push_back( presentation::ClickAction_DOCUMENT ); + maCurrentActions.push_back( presentation::ClickAction_SOUND ); + if( bOLEAction && m_xLbOLEAction->n_children() ) + maCurrentActions.push_back( presentation::ClickAction_VERB ); + maCurrentActions.push_back( presentation::ClickAction_PROGRAM ); + maCurrentActions.push_back( presentation::ClickAction_MACRO ); + maCurrentActions.push_back( presentation::ClickAction_STOPPRESENTATION ); + + // fill Action-Listbox + for (const presentation::ClickAction & rAction : maCurrentActions) + { + TranslateId pRId = GetClickActionSdResId(rAction); + m_xLbAction->append_text(SdResId(pRId)); + } + +} + +bool SdTPAction::FillItemSet( SfxItemSet* rAttrs ) +{ + bool bModified = false; + presentation::ClickAction eCA = presentation::ClickAction_NONE; + + if (m_xLbAction->get_active() != -1) + eCA = GetActualClickAction(); + + if( m_xLbAction->get_value_changed_from_saved() ) + { + rAttrs->Put( SfxUInt16Item( ATTR_ACTION, static_cast(eCA) ) ); + bModified = true; + } + else + rAttrs->InvalidateItem( ATTR_ACTION ); + + OUString aFileName = GetEditText( true ); + if( aFileName.isEmpty() ) + rAttrs->InvalidateItem( ATTR_ACTION_FILENAME ); + else + { + if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() ) + { + OUString aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL(); + if( eCA == presentation::ClickAction_SOUND || + eCA == presentation::ClickAction_DOCUMENT || + eCA == presentation::ClickAction_PROGRAM ) + aFileName = ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aFileName, URIHelper::GetMaybeFileHdl(), true, false, + INetURLObject::EncodeMechanism::WasEncoded, + INetURLObject::DecodeMechanism::Unambiguous ); + + rAttrs->Put( SfxStringItem( ATTR_ACTION_FILENAME, aFileName ) ); + bModified = true; + } + else + { + OSL_FAIL("sd::SdTPAction::FillItemSet(), I need a medium!"); + } + } + + return bModified; +} + +void SdTPAction::Reset( const SfxItemSet* rAttrs ) +{ + presentation::ClickAction eCA = presentation::ClickAction_NONE; + OUString aFileName; + + // m_xLbAction + if( rAttrs->GetItemState( ATTR_ACTION ) != SfxItemState::DONTCARE ) + { + eCA = static_cast( rAttrs-> + Get( ATTR_ACTION ).GetValue()); + SetActualClickAction( eCA ); + } + else + m_xLbAction->set_active(-1); + + // m_xEdtSound + if( rAttrs->GetItemState( ATTR_ACTION_FILENAME ) != SfxItemState::DONTCARE ) + { + aFileName = rAttrs->Get( ATTR_ACTION_FILENAME ).GetValue(); + SetEditText( aFileName ); + } + + switch( eCA ) + { + case presentation::ClickAction_BOOKMARK: + { + if (!m_xLbTree->SelectEntry(aFileName)) + m_xLbTree->unselect_all(); + } + break; + + case presentation::ClickAction_DOCUMENT: + { + if( comphelper::string::getTokenCount(aFileName, DOCUMENT_TOKEN) == 2 ) + m_xLbTreeDocument->SelectEntry( o3tl::getToken(aFileName, 1, DOCUMENT_TOKEN ) ); + } + break; + + default: + break; + } + ClickActionHdl( *m_xLbAction ); + + m_xLbAction->save_value(); + m_xEdtSound->save_value(); +} + +void SdTPAction::ActivatePage( const SfxItemSet& ) +{ +} + +DeactivateRC SdTPAction::DeactivatePage( SfxItemSet* pPageSet ) +{ + if( pPageSet ) + FillItemSet( pPageSet ); + + return DeactivateRC::LeavePage; +} + +std::unique_ptr SdTPAction::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttrs) +{ + return std::make_unique( pPage, pController, rAttrs ); +} + +void SdTPAction::UpdateTree() +{ + if( !bTreeUpdated && mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() ) + { + m_xLbTree->Fill( mpDoc, true, mpDoc->GetDocSh()->GetMedium()->GetName() ); + bTreeUpdated = true; + } +} + +void SdTPAction::OpenFileDialog() +{ + // Soundpreview only for interaction with sound + presentation::ClickAction eCA = GetActualClickAction(); + bool bSound = ( eCA == presentation::ClickAction_SOUND ); + bool bPage = ( eCA == presentation::ClickAction_BOOKMARK ); + bool bDocument = ( eCA == presentation::ClickAction_DOCUMENT || + eCA == presentation::ClickAction_PROGRAM ); + bool bMacro = ( eCA == presentation::ClickAction_MACRO ); + + if( bPage ) + { + // search in the TreeLB for the specified object + m_xLbTree->SelectEntry(GetEditText()); + } + else + { + OUString aFile( GetEditText() ); + + if (bSound) + { + SdOpenSoundFileDialog aFileDialog(GetFrameWeld()); + + if( !aFile.isEmpty() ) + aFileDialog.SetPath( aFile ); + + if( aFileDialog.Execute() == ERRCODE_NONE ) + { + aFile = aFileDialog.GetPath(); + SetEditText( aFile ); + } + } + else if (bMacro) + { + // choose macro dialog + OUString aScriptURL = SfxApplication::ChooseScript(GetFrameWeld()); + + if ( !aScriptURL.isEmpty() ) + { + SetEditText( aScriptURL ); + } + } + else + { + sfx2::FileDialogHelper aFileDialog( + ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION, + FileDialogFlags::NONE, GetFrameWeld()); + aFileDialog.SetContext(sfx2::FileDialogHelper::ImpressClickAction); + + // The following is a workaround for #i4306#: + // The addition of the implicitly existing "all files" + // filter makes the (Windows system) open file dialog follow + // links on the desktop to directories. + aFileDialog.AddFilter ( + SfxResId(STR_SFX_FILTERNAME_ALL), + "*.*"); + + if( aFileDialog.Execute() == ERRCODE_NONE ) + { + aFile = aFileDialog.GetPath(); + SetEditText( aFile ); + } + if( bDocument ) + CheckFileHdl( *m_xEdtDocument ); + } + } +} + +IMPL_LINK_NOARG(SdTPAction, ClickSearchHdl, weld::Button&, void) +{ + OpenFileDialog(); +} + +IMPL_LINK_NOARG(SdTPAction, ClickActionHdl, weld::ComboBox&, void) +{ + presentation::ClickAction eCA = GetActualClickAction(); + + // hide controls we don't need + switch( eCA ) + { + case presentation::ClickAction_NONE: + case presentation::ClickAction_INVISIBLE: + case presentation::ClickAction_PREVPAGE: + case presentation::ClickAction_NEXTPAGE: + case presentation::ClickAction_FIRSTPAGE: + case presentation::ClickAction_LASTPAGE: + case presentation::ClickAction_STOPPRESENTATION: + default: + m_xFtTree->hide(); + m_xLbTree->hide(); + m_xLbTreeDocument->hide(); + m_xLbOLEAction->hide(); + + m_xFrame->hide(); + m_xEdtSound->hide(); + m_xEdtBookmark->hide(); + m_xEdtDocument->hide(); + m_xEdtProgram->hide(); + m_xEdtMacro->hide(); + m_xBtnSearch->hide(); + m_xBtnSeek->hide(); + break; + + case presentation::ClickAction_SOUND: + case presentation::ClickAction_PROGRAM: + case presentation::ClickAction_MACRO: + m_xFtTree->hide(); + m_xLbTree->hide(); + m_xLbTreeDocument->hide(); + m_xLbOLEAction->hide(); + + m_xEdtDocument->hide(); + + if( eCA == presentation::ClickAction_MACRO ) + { + m_xEdtSound->hide(); + m_xEdtProgram->hide(); + } + else if( eCA == presentation::ClickAction_PROGRAM ) + { + m_xEdtSound->hide(); + m_xEdtMacro->hide(); + } + else if( eCA == presentation::ClickAction_SOUND ) + { + m_xEdtProgram->hide(); + m_xEdtMacro->hide(); + } + + m_xBtnSeek->hide(); + break; + + case presentation::ClickAction_DOCUMENT: + m_xLbTree->hide(); + m_xLbOLEAction->hide(); + + m_xEdtSound->hide(); + m_xEdtProgram->hide(); + m_xEdtMacro->hide(); + m_xEdtBookmark->hide(); + m_xBtnSeek->hide(); + break; + + case presentation::ClickAction_BOOKMARK: + m_xLbTreeDocument->hide(); + m_xLbOLEAction->hide(); + m_xEdtSound->hide(); + m_xEdtDocument->hide(); + m_xEdtProgram->hide(); + m_xEdtMacro->hide(); + m_xBtnSearch->hide(); + break; + + case presentation::ClickAction_VERB: + m_xLbTree->hide(); + m_xEdtDocument->hide(); + m_xEdtProgram->hide(); + m_xEdtBookmark->hide(); + m_xEdtMacro->hide(); + m_xBtnSearch->hide(); + m_xFrame->hide(); + m_xEdtSound->hide(); + m_xBtnSeek->hide(); + break; + } + + // show controls we do need + switch( eCA ) + { + case presentation::ClickAction_NONE: + case presentation::ClickAction_INVISIBLE: + case presentation::ClickAction_PREVPAGE: + case presentation::ClickAction_NEXTPAGE: + case presentation::ClickAction_FIRSTPAGE: + case presentation::ClickAction_LASTPAGE: + case presentation::ClickAction_STOPPRESENTATION: + // none + break; + + case presentation::ClickAction_SOUND: + m_xFrame->show(); + m_xEdtSound->show(); + m_xEdtSound->set_sensitive(true); + m_xBtnSearch->show(); + m_xBtnSearch->set_sensitive(true); + m_xFrame->set_label( SdResId( STR_EFFECTDLG_SOUND ) ); + break; + + case presentation::ClickAction_PROGRAM: + case presentation::ClickAction_MACRO: + m_xFrame->show(); + m_xBtnSearch->show(); + m_xBtnSearch->set_sensitive(true); + if( eCA == presentation::ClickAction_MACRO ) + { + m_xEdtMacro->show(); + m_xFrame->set_label( SdResId( STR_EFFECTDLG_MACRO ) ); + } + else + { + m_xEdtProgram->show(); + m_xFrame->set_label( SdResId( STR_EFFECTDLG_PROGRAM ) ); + } + break; + + case presentation::ClickAction_DOCUMENT: + m_xFtTree->show(); + m_xLbTreeDocument->show(); + + m_xFrame->show(); + m_xEdtDocument->show(); + m_xBtnSearch->show(); + m_xBtnSearch->set_sensitive(true); + + m_xFtTree->set_label( SdResId( STR_EFFECTDLG_JUMP ) ); + m_xFrame->set_label( SdResId( STR_EFFECTDLG_DOCUMENT ) ); + + CheckFileHdl( *m_xEdtDocument ); + break; + + case presentation::ClickAction_VERB: + m_xFtTree->show(); + m_xLbOLEAction->show(); + + m_xFtTree->set_label( SdResId( STR_EFFECTDLG_ACTION ) ); + break; + + case presentation::ClickAction_BOOKMARK: + UpdateTree(); + + m_xFtTree->show(); + m_xLbTree->show(); + + m_xFrame->show(); + m_xEdtBookmark->show(); + m_xBtnSeek->show(); + + m_xFtTree->set_label( SdResId( STR_EFFECTDLG_JUMP ) ); + m_xFrame->set_label( SdResId( STR_EFFECTDLG_PAGE_OBJECT ) ); + break; + default: + break; + } +} + +IMPL_LINK_NOARG(SdTPAction, SelectTreeHdl, weld::TreeView&, void) +{ + m_xEdtBookmark->set_text( m_xLbTree->get_selected_text() ); +} + +IMPL_LINK_NOARG(SdTPAction, CheckFileHdl, weld::Widget&, void) +{ + OUString aFile( GetEditText() ); + + if( aFile == aLastFile ) + return; + + bool bHideTreeDocument = true; + + if (mpDoc) + { + // check if it is a valid draw file + SfxMedium aMedium( aFile, + StreamMode::READ | StreamMode::NOCREATE ); + + if( aMedium.IsStorage() ) + { + weld::WaitObject aWait(GetFrameWeld()); + + // is it a draw file? + // open with READ, otherwise the Storages might write into the file! + uno::Reference < embed::XStorage > xStorage = aMedium.GetStorage(); + DBG_ASSERT( xStorage.is(), "No storage!" ); + + if (xStorage.is()) + { + try + { + if (xStorage->hasByName(pStarDrawXMLContent)) + { + if (SdDrawDocument* pBookmarkDoc = mpDoc->OpenBookmarkDoc(aFile)) + { + aLastFile = aFile; + + m_xLbTreeDocument->clear(); + m_xLbTreeDocument->Fill(pBookmarkDoc, true, aFile); + mpDoc->CloseBookmarkDoc(); + m_xLbTreeDocument->show(); + bHideTreeDocument = false; + } + } + } + catch (...) + { + } + } + } + } + + if (bHideTreeDocument) + m_xLbTreeDocument->hide(); +} + +presentation::ClickAction SdTPAction::GetActualClickAction() +{ + presentation::ClickAction eCA = presentation::ClickAction_NONE; + int nPos = m_xLbAction->get_active(); + if (nPos != -1 && o3tl::make_unsigned(nPos) < maCurrentActions.size()) + eCA = maCurrentActions[ nPos ]; + return eCA; +} + +void SdTPAction::SetActualClickAction( presentation::ClickAction eCA ) +{ + std::vector::const_iterator pIter = + std::find(maCurrentActions.begin(),maCurrentActions.end(),eCA); + + if ( pIter != maCurrentActions.end() ) + m_xLbAction->set_active(pIter-maCurrentActions.begin()); +} + +void SdTPAction::SetEditText( OUString const & rStr ) +{ + presentation::ClickAction eCA = GetActualClickAction(); + OUString aText(rStr); + + // possibly convert URI back to system path + switch( eCA ) + { + case presentation::ClickAction_DOCUMENT: + if( comphelper::string::getTokenCount(rStr, DOCUMENT_TOKEN) == 2 ) + aText = rStr.getToken( 0, DOCUMENT_TOKEN ); + + [[fallthrough]]; + case presentation::ClickAction_SOUND: + case presentation::ClickAction_PROGRAM: + { + INetURLObject aURL( aText ); + + // try to convert to system path + OUString aTmpStr(aURL.getFSysPath(FSysStyle::Detect)); + + if( !aTmpStr.isEmpty() ) + aText = aTmpStr; // was a system path + } + break; + default: + break; + } + + // set the string to the corresponding control + switch( eCA ) + { + case presentation::ClickAction_SOUND: + m_xEdtSound->set_text(aText ); + break; + case presentation::ClickAction_VERB: + { + ::std::vector< tools::Long >::iterator aFound( ::std::find( aVerbVector.begin(), aVerbVector.end(), rStr.toInt32() ) ); + if( aFound != aVerbVector.end() ) + m_xLbOLEAction->select(aFound - aVerbVector.begin()); + } + break; + case presentation::ClickAction_PROGRAM: + m_xEdtProgram->set_text( aText ); + break; + case presentation::ClickAction_MACRO: + m_xEdtMacro->set_text( aText ); + break; + case presentation::ClickAction_DOCUMENT: + m_xEdtDocument->set_text( aText ); + break; + case presentation::ClickAction_BOOKMARK: + m_xEdtBookmark->set_text( aText ); + break; + default: + break; + } +} + +OUString SdTPAction::GetEditText( bool bFullDocDestination ) +{ + OUString aStr; + presentation::ClickAction eCA = GetActualClickAction(); + + switch( eCA ) + { + case presentation::ClickAction_SOUND: + aStr = m_xEdtSound->get_text(); + break; + case presentation::ClickAction_VERB: + { + const int nPos = m_xLbOLEAction->get_selected_index(); + if (nPos != -1 && o3tl::make_unsigned(nPos) < aVerbVector.size() ) + aStr = OUString::number( aVerbVector[ nPos ] ); + return aStr; + } + case presentation::ClickAction_DOCUMENT: + aStr = m_xEdtDocument->get_text(); + break; + + case presentation::ClickAction_PROGRAM: + aStr = m_xEdtProgram->get_text(); + break; + + case presentation::ClickAction_MACRO: + { + return m_xEdtMacro->get_text(); + } + + case presentation::ClickAction_BOOKMARK: + return m_xEdtBookmark->get_text(); + + default: + break; + } + + // validate file URI + INetURLObject aURL( aStr ); + OUString aBaseURL; + if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() ) + aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL(); + + if( !aStr.isEmpty() && aURL.GetProtocol() == INetProtocol::NotValid ) + aURL = INetURLObject( ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aStr, URIHelper::GetMaybeFileHdl() ) ); + + // get adjusted file name + aStr = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ); + + if( bFullDocDestination && + eCA == presentation::ClickAction_DOCUMENT && + m_xLbTreeDocument->get_visible() && + m_xLbTreeDocument->get_selected() ) + { + OUString aTmpStr( m_xLbTreeDocument->get_selected_text() ); + if( !aTmpStr.isEmpty() ) + { + aStr += OUStringChar(DOCUMENT_TOKEN) + aTmpStr; + } + } + + return aStr; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/tpoption.cxx b/sd/source/ui/dlg/tpoption.cxx new file mode 100644 index 0000000000..812d39ffd8 --- /dev/null +++ b/sd/source/ui/dlg/tpoption.cxx @@ -0,0 +1,805 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +SdTpOptionsSnap::SdTpOptionsSnap(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs) + : SvxGridTabPage(pPage, pController, rInAttrs) +{ + m_xSnapFrames->show(); +} + +SdTpOptionsSnap::~SdTpOptionsSnap() +{ +} + +bool SdTpOptionsSnap::FillItemSet( SfxItemSet* rAttrs ) +{ + SvxGridTabPage::FillItemSet(rAttrs); + SdOptionsSnapItem aOptsItem; + + aOptsItem.GetOptionsSnap().SetSnapHelplines( m_xCbxSnapHelplines->get_active() ); + aOptsItem.GetOptionsSnap().SetSnapBorder( m_xCbxSnapBorder->get_active() ); + aOptsItem.GetOptionsSnap().SetSnapFrame( m_xCbxSnapFrame->get_active() ); + aOptsItem.GetOptionsSnap().SetSnapPoints( m_xCbxSnapPoints->get_active() ); + aOptsItem.GetOptionsSnap().SetOrtho( m_xCbxOrtho->get_active() ); + aOptsItem.GetOptionsSnap().SetBigOrtho( m_xCbxBigOrtho->get_active() ); + aOptsItem.GetOptionsSnap().SetRotate( m_xCbxRotate->get_active() ); + aOptsItem.GetOptionsSnap().SetSnapArea(static_cast(m_xMtrFldSnapArea->get_value(FieldUnit::PIXEL))); + aOptsItem.GetOptionsSnap().SetAngle(Degree100(m_xMtrFldAngle->get_value(FieldUnit::DEGREE))); + aOptsItem.GetOptionsSnap().SetEliminatePolyPointLimitAngle(Degree100(m_xMtrFldBezAngle->get_value(FieldUnit::DEGREE))); + + rAttrs->Put( aOptsItem ); + + // we get a possible existing GridItem, this ensures that we do not set + // some default values by accident + return true; +} + +void SdTpOptionsSnap::Reset( const SfxItemSet* rAttrs ) +{ + SvxGridTabPage::Reset(rAttrs); + + SdOptionsSnapItem aOptsItem( rAttrs->Get( ATTR_OPTIONS_SNAP ) ); + + bool bDrawMode = SvxGridTabPage::IsDrawMode(); + bool bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Object::SnapLine::isReadOnly() : + officecfg::Office::Impress::Snap::Object::SnapLine::isReadOnly(); + m_xCbxSnapHelplines->set_active( aOptsItem.GetOptionsSnap().IsSnapHelplines() ); + m_xCbxSnapHelplines->set_sensitive(!bReadOnly); + m_xCbxSnapHelplinesImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Object::PageMargin::isReadOnly() : + officecfg::Office::Impress::Snap::Object::PageMargin::isReadOnly(); + m_xCbxSnapBorder->set_active( aOptsItem.GetOptionsSnap().IsSnapBorder() ); + m_xCbxSnapBorder->set_sensitive(!bReadOnly); + m_xCbxSnapBorderImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Object::ObjectFrame::isReadOnly() : + officecfg::Office::Impress::Snap::Object::ObjectFrame::isReadOnly(); + m_xCbxSnapFrame->set_active( aOptsItem.GetOptionsSnap().IsSnapFrame() ); + m_xCbxSnapFrame->set_sensitive(!bReadOnly); + m_xCbxSnapFrameImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Object::ObjectPoint::isReadOnly() : + officecfg::Office::Impress::Snap::Object::ObjectPoint::isReadOnly(); + m_xCbxSnapPoints->set_active( aOptsItem.GetOptionsSnap().IsSnapPoints() ); + m_xCbxSnapPoints->set_sensitive(!bReadOnly); + m_xCbxSnapPointsImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Position::CreatingMoving::isReadOnly() : + officecfg::Office::Impress::Snap::Position::CreatingMoving::isReadOnly(); + m_xCbxOrtho->set_active( aOptsItem.GetOptionsSnap().IsOrtho() ); + m_xCbxOrtho->set_sensitive(!bReadOnly); + m_xCbxOrthoImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Position::ExtendEdges::isReadOnly() : + officecfg::Office::Impress::Snap::Position::ExtendEdges::isReadOnly(); + m_xCbxBigOrtho->set_active( aOptsItem.GetOptionsSnap().IsBigOrtho() ); + m_xCbxBigOrtho->set_sensitive(!bReadOnly); + m_xCbxBigOrthoImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Position::Rotating::isReadOnly() : + officecfg::Office::Impress::Snap::Position::Rotating::isReadOnly(); + m_xCbxRotate->set_active( aOptsItem.GetOptionsSnap().IsRotate() ); + m_xCbxRotate->set_sensitive(!bReadOnly); + m_xCbxRotateImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Object::Range::isReadOnly() : + officecfg::Office::Impress::Snap::Object::Range::isReadOnly(); + m_xMtrFldSnapArea->set_value(aOptsItem.GetOptionsSnap().GetSnapArea(), FieldUnit::PIXEL); + m_xMtrFldSnapArea->set_sensitive(!bReadOnly); + m_xMtrFldSnapAreaImg->set_visible(bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Position::RotatingValue::isReadOnly() : + officecfg::Office::Impress::Snap::Position::RotatingValue::isReadOnly(); + m_xMtrFldAngle->set_value(aOptsItem.GetOptionsSnap().GetAngle().get(), FieldUnit::DEGREE); + m_xMtrFldAngle->set_sensitive(!bReadOnly); + + bReadOnly = bDrawMode ? officecfg::Office::Draw::Snap::Position::PointReduction::isReadOnly() : + officecfg::Office::Impress::Snap::Position::PointReduction::isReadOnly(); + m_xMtrFldBezAngle->set_value(aOptsItem.GetOptionsSnap().GetEliminatePolyPointLimitAngle().get(), FieldUnit::DEGREE); + m_xMtrFldBezAngle->set_sensitive(!bReadOnly); + m_xMtrFldBezAngleImg->set_visible(bReadOnly); + + ClickRotateHdl_Impl(*m_xCbxRotate); +} + +std::unique_ptr SdTpOptionsSnap::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrs ) +{ + return std::make_unique(pPage, pController, *rAttrs); +} + +/************************************************************************* +|* +|* TabPage to adjust the content options +|* +\************************************************************************/ +SdTpOptionsContents::SdTpOptionsContents(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs) + : SfxTabPage(pPage, pController, "modules/simpress/ui/sdviewpage.ui", "SdViewPage", &rInAttrs) + , m_bDrawMode(false) + , m_xCbxRuler(m_xBuilder->weld_check_button("ruler")) + , m_xCbxRulerImg(m_xBuilder->weld_widget("lockruler")) + , m_xCbxDragStripes(m_xBuilder->weld_check_button("dragstripes")) + , m_xCbxDragStripesImg(m_xBuilder->weld_widget("lockdragstripes")) + , m_xCbxHandlesBezier(m_xBuilder->weld_check_button("handlesbezier")) + , m_xCbxHandlesBezierImg(m_xBuilder->weld_widget("lockhandlesbezier")) + , m_xCbxMoveOutline(m_xBuilder->weld_check_button("moveoutline")) + , m_xCbxMoveOutlineImg(m_xBuilder->weld_widget("lockmoveoutline")) +{ +} + +SdTpOptionsContents::~SdTpOptionsContents() +{ +} + +OUString SdTpOptionsContents::GetAllStrings() +{ + OUString sAllStrings; + OUString labels[] = { "label1" }; + + for (const auto& label : labels) + { + if (const auto& pString = m_xBuilder->weld_label(label)) + sAllStrings += pString->get_label() + " "; + } + + OUString checkButton[] = { "ruler", "dragstripes", "handlesbezier", "moveoutline" }; + + for (const auto& check : checkButton) + { + if (const auto& pString = m_xBuilder->weld_check_button(check)) + sAllStrings += pString->get_label() + " "; + } + + return sAllStrings.replaceAll("_", ""); +} + +bool SdTpOptionsContents::FillItemSet( SfxItemSet* rAttrs ) +{ + bool bModified = false; + + if( m_xCbxRuler->get_state_changed_from_saved() || + m_xCbxMoveOutline->get_state_changed_from_saved() || + m_xCbxDragStripes->get_state_changed_from_saved() || + m_xCbxHandlesBezier->get_state_changed_from_saved() ) + { + SdOptionsLayoutItem aOptsItem; + + aOptsItem.GetOptionsLayout().SetRulerVisible( m_xCbxRuler->get_active() ); + aOptsItem.GetOptionsLayout().SetMoveOutline( m_xCbxMoveOutline->get_active() ); + aOptsItem.GetOptionsLayout().SetDragStripes( m_xCbxDragStripes->get_active() ); + aOptsItem.GetOptionsLayout().SetHandlesBezier( m_xCbxHandlesBezier->get_active() ); + + rAttrs->Put( aOptsItem ); + bModified = true; + } + return bModified; +} + +void SdTpOptionsContents::Reset( const SfxItemSet* rAttrs ) +{ + SdOptionsLayoutItem aLayoutItem( rAttrs->Get( ATTR_OPTIONS_LAYOUT ) ); + + m_xCbxRuler->set_active( aLayoutItem.GetOptionsLayout().IsRulerVisible() ); + m_xCbxMoveOutline->set_active( aLayoutItem.GetOptionsLayout().IsMoveOutline() ); + m_xCbxDragStripes->set_active( aLayoutItem.GetOptionsLayout().IsDragStripes() ); + m_xCbxHandlesBezier->set_active( aLayoutItem.GetOptionsLayout().IsHandlesBezier() ); + + bool bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Display::Ruler::isReadOnly() : + officecfg::Office::Impress::Layout::Display::Ruler::isReadOnly(); + m_xCbxRuler->set_sensitive(!bReadOnly); + m_xCbxRulerImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Display::Contour::isReadOnly() : + officecfg::Office::Impress::Layout::Display::Contour::isReadOnly(); + m_xCbxMoveOutline->set_sensitive(!bReadOnly); + m_xCbxMoveOutlineImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Display::Guide::isReadOnly() : + officecfg::Office::Impress::Layout::Display::Guide::isReadOnly(); + m_xCbxDragStripes->set_sensitive(!bReadOnly); + m_xCbxDragStripesImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Display::Bezier::isReadOnly() : + officecfg::Office::Impress::Layout::Display::Bezier::isReadOnly(); + m_xCbxHandlesBezier->set_sensitive(!bReadOnly); + m_xCbxHandlesBezierImg->set_visible(bReadOnly); + + m_xCbxRuler->save_state(); + m_xCbxMoveOutline->save_state(); + m_xCbxDragStripes->save_state(); + m_xCbxHandlesBezier->save_state(); +} + +std::unique_ptr SdTpOptionsContents::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrs ) +{ + return std::make_unique(pPage, pController, *rAttrs); +} + +void SdTpOptionsContents::PageCreated( const SfxAllItemSet& aSet ) +{ + const SfxUInt32Item* pFlagItem = aSet.GetItem(SID_SDMODE_FLAG, false); + if (pFlagItem) + { + sal_uInt32 nFlags = pFlagItem->GetValue(); + if ((nFlags & SD_DRAW_MODE) == SD_DRAW_MODE) + SetDrawMode(); + } +} + +/************************************************************************* +|* +|* TabPage to adjust the misc options +|* +\************************************************************************/ +#define TABLE_COUNT 12 +#define TOKEN ':' + +SdTpOptionsMisc::SdTpOptionsMisc(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs) + : SfxTabPage(pPage, pController, "modules/simpress/ui/optimpressgeneralpage.ui", "OptSavePage", &rInAttrs) + , nWidth(0) + , nHeight(0) + , m_bDrawMode(false) + , m_xCbxQuickEdit(m_xBuilder->weld_check_button("qickedit")) + , m_xCbxQuickEditImg(m_xBuilder->weld_widget("lockqickedit")) + , m_xCbxPickThrough(m_xBuilder->weld_check_button("textselected")) + , m_xCbxPickThroughImg(m_xBuilder->weld_widget("locktextselected")) + , m_xNewDocumentFrame(m_xBuilder->weld_frame("newdocumentframe")) + , m_xCbxStartWithTemplate(m_xBuilder->weld_check_button("startwithwizard")) + , m_xCbxStartWithTemplateImg(m_xBuilder->weld_widget("lockstartwithwizard")) + , m_xCbxMasterPageCache(m_xBuilder->weld_check_button("backgroundback")) + , m_xCbxMasterPageCacheImg(m_xBuilder->weld_widget("lockbackgroundback")) + , m_xCbxCopy(m_xBuilder->weld_check_button("copywhenmove")) + , m_xCbxCopyImg(m_xBuilder->weld_widget("lockcopywhenmove")) + , m_xCbxMarkedHitMovesAlways(m_xBuilder->weld_check_button("objalwymov")) + , m_xCbxMarkedHitMovesAlwaysImg(m_xBuilder->weld_widget("lockobjalwymov")) + , m_xLbMetric(m_xBuilder->weld_combo_box("units")) + , m_xLbMetricImg(m_xBuilder->weld_widget("lockunits")) + , m_xMtrFldTabstop(m_xBuilder->weld_metric_spin_button("metricFields", FieldUnit::MM)) + , m_xMtrFldTabstopImg(m_xBuilder->weld_widget("locktabstop")) + , m_xCbxCompatibility(m_xBuilder->weld_check_button("cbCompatibility")) + , m_xCbxCompatibilityImg(m_xBuilder->weld_widget("lockcbCompatibility")) + , m_xScaleFrame(m_xBuilder->weld_frame("scaleframe")) + , m_xCbScale(m_xBuilder->weld_combo_box("scaleBox")) + , m_xCbScaleImg(m_xBuilder->weld_widget("lockscaleBox")) + , m_xNewDocLb(m_xBuilder->weld_label("newdoclbl")) + , m_xFiInfo1(m_xBuilder->weld_label("info1")) + , m_xMtrFldOriginalWidth(m_xBuilder->weld_metric_spin_button("metricWidthFields", FieldUnit::MM)) + , m_xWidthLb(m_xBuilder->weld_label("widthlbl")) + , m_xHeightLb(m_xBuilder->weld_label("heightlbl")) + , m_xFiInfo2(m_xBuilder->weld_label("info2")) + , m_xMtrFldOriginalHeight(m_xBuilder->weld_metric_spin_button("metricHeightFields", FieldUnit::MM)) + , m_xCbxDistort(m_xBuilder->weld_check_button("distortcb")) + , m_xCbxDistortImg(m_xBuilder->weld_widget("lockdistortcb")) + , m_xMtrFldInfo1(m_xBuilder->weld_metric_spin_button("metricInfo1Fields", FieldUnit::MM)) + , m_xMtrFldInfo2(m_xBuilder->weld_metric_spin_button("metricInfo2Fields", FieldUnit::MM)) +{ + SetExchangeSupport(); + + // set metric + FieldUnit eFUnit; + + sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC ); + if ( rInAttrs.GetItemState( nWhich ) >= SfxItemState::DEFAULT ) + { + const SfxUInt16Item& rItem = static_cast(rInAttrs.Get( nWhich )); + eFUnit = static_cast(rItem.GetValue()); + } + else + eFUnit = SfxModule::GetCurrentFieldUnit(); + + SetFieldUnit( *m_xMtrFldTabstop , eFUnit ); + // tdf#148292 - avoid right frame to change position depending on width of this control + m_xMtrFldTabstop->set_size_request(150, -1); + // Impress is default mode, let' hide the entire scale frame etc. + m_xCbxDistort->hide(); + m_xScaleFrame->hide(); + + // fill ListBox with metrics + for (sal_uInt32 i = 0; i < SvxFieldUnitTable::Count(); ++i) + { + OUString sMetric = SvxFieldUnitTable::GetString(i); + sal_uInt32 nFieldUnit = sal_uInt32(SvxFieldUnitTable::GetValue(i)); + m_xLbMetric->append(OUString::number(nFieldUnit), sMetric); + } + m_xLbMetric->connect_changed( LINK( this, SdTpOptionsMisc, SelectMetricHdl_Impl ) ); + + SetFieldUnit( *m_xMtrFldOriginalWidth, eFUnit ); + SetFieldUnit( *m_xMtrFldOriginalHeight, eFUnit ); + m_xMtrFldOriginalWidth->set_max(999999999, FieldUnit::NONE); + m_xMtrFldOriginalHeight->set_max(999999999, FieldUnit::NONE); + + // temporary fields for info texts (for formatting/calculation) + m_xMtrFldInfo1->set_unit( eFUnit ); + m_xMtrFldInfo1->set_max(999999999, FieldUnit::NONE); + m_xMtrFldInfo1->set_digits( 2 ); + m_xMtrFldInfo2->set_unit( eFUnit ); + m_xMtrFldInfo2->set_max(999999999, FieldUnit::NONE); + m_xMtrFldInfo2->set_digits( 2 ); + + // determine PoolUnit + SfxItemPool* pPool = rInAttrs.GetPool(); + DBG_ASSERT( pPool, "Where is the Pool?" ); + ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH ); + + // Fill the CB + sal_uInt16 aTable[ TABLE_COUNT ] = + { 1, 2, 4, 5, 8, 10, 16, 20, 30, 40, 50, 100 }; + + for( sal_uInt16 i = TABLE_COUNT-1; i > 0 ; i-- ) + m_xCbScale->append_text( GetScale( 1, aTable[i] ) ); + for( sal_uInt16 i = 0; i < TABLE_COUNT; i++ ) + m_xCbScale->append_text( GetScale( aTable[i], 1 ) ); +} + +SdTpOptionsMisc::~SdTpOptionsMisc() +{ +} + +void SdTpOptionsMisc::ActivatePage( const SfxItemSet& rSet ) +{ + // We have to call save_state again since it can happen that the value + // has no effect on other TabPages + m_xLbMetric->save_value(); + // change metric if necessary (since TabPage is in the Dialog where + // the metric is set) + const SfxUInt16Item* pAttr = rSet.GetItemIfSet( SID_ATTR_METRIC , false ); + if( !pAttr ) + return; + + FieldUnit eFUnit = static_cast(static_cast(pAttr->GetValue())); + + if( eFUnit == m_xMtrFldOriginalWidth->get_unit() ) + return; + + // set metrics + sal_Int64 nVal = m_xMtrFldOriginalWidth->denormalize( m_xMtrFldOriginalWidth->get_value( FieldUnit::TWIP ) ); + SetFieldUnit( *m_xMtrFldOriginalWidth, eFUnit, true ); + m_xMtrFldOriginalWidth->set_value( m_xMtrFldOriginalWidth->normalize( nVal ), FieldUnit::TWIP ); + + nVal = m_xMtrFldOriginalHeight->denormalize( m_xMtrFldOriginalHeight->get_value( FieldUnit::TWIP ) ); + SetFieldUnit( *m_xMtrFldOriginalHeight, eFUnit, true ); + m_xMtrFldOriginalHeight->set_value( m_xMtrFldOriginalHeight->normalize( nVal ), FieldUnit::TWIP ); + + if( nWidth == 0 || nHeight == 0 ) + return; + + m_xMtrFldInfo1->set_unit( eFUnit ); + m_xMtrFldInfo2->set_unit( eFUnit ); + + SetMetricValue( *m_xMtrFldInfo1, nWidth, ePoolUnit ); + aInfo1 = m_xMtrFldInfo1->get_text(); + m_xFiInfo1->set_label( aInfo1 ); + + SetMetricValue( *m_xMtrFldInfo2, nHeight, ePoolUnit ); + aInfo2 = m_xMtrFldInfo2->get_text(); + m_xFiInfo2->set_label( aInfo2 ); +} + +DeactivateRC SdTpOptionsMisc::DeactivatePage( SfxItemSet* pActiveSet ) +{ + // check parser + sal_Int32 nX, nY; + if( SetScale( m_xCbScale->get_active_text(), nX, nY ) ) + { + if( pActiveSet ) + FillItemSet( pActiveSet ); + return DeactivateRC::LeavePage; + } + + std::unique_ptr xWarn(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::YesNo, + SdResId(STR_WARN_SCALE_FAIL))); + if (xWarn->run() == RET_YES) + return DeactivateRC::KeepPage; + + if( pActiveSet ) + FillItemSet( pActiveSet ); + + return DeactivateRC::LeavePage; +} + +OUString SdTpOptionsMisc::GetAllStrings() +{ + OUString sAllStrings; + OUString labels[] + = { "newdoclbl", "label4", "label6", "tabstoplabel", "label1", "label7", "label2", + "label5", "label8", "widthlbl", "info1", "heightlbl", "info2" }; + + for (const auto& label : labels) + { + if (const auto& pString = m_xBuilder->weld_label(label)) + sAllStrings += pString->get_label() + " "; + } + + OUString checkButton[] = { "startwithwizard", "copywhenmove", "backgroundback", + "objalwymov", "distortcb", "cbCompatibility", + "qickedit", "textselected"}; + + for (const auto& check : checkButton) + { + if (const auto& pString = m_xBuilder->weld_check_button(check)) + sAllStrings += pString->get_label() + " "; + } + + return sAllStrings.replaceAll("_", ""); +} + +bool SdTpOptionsMisc::FillItemSet( SfxItemSet* rAttrs ) +{ + bool bModified = false; + + if( m_xCbxStartWithTemplate->get_state_changed_from_saved() || + m_xCbxMarkedHitMovesAlways->get_state_changed_from_saved() || + m_xCbxQuickEdit->get_state_changed_from_saved() || + m_xCbxPickThrough->get_state_changed_from_saved() || + m_xCbxMasterPageCache->get_state_changed_from_saved() || + m_xCbxCopy->get_state_changed_from_saved() || + m_xCbxCompatibility->get_state_changed_from_saved() || + m_xCbxDistort->get_state_changed_from_saved()) + { + SdOptionsMiscItem aOptsItem; + + aOptsItem.GetOptionsMisc().SetStartWithTemplate( m_xCbxStartWithTemplate->get_active() ); + aOptsItem.GetOptionsMisc().SetMarkedHitMovesAlways( m_xCbxMarkedHitMovesAlways->get_active() ); + aOptsItem.GetOptionsMisc().SetQuickEdit( m_xCbxQuickEdit->get_active() ); + aOptsItem.GetOptionsMisc().SetPickThrough( m_xCbxPickThrough->get_active() ); + aOptsItem.GetOptionsMisc().SetMasterPagePaintCaching( m_xCbxMasterPageCache->get_active() ); + aOptsItem.GetOptionsMisc().SetDragWithCopy( m_xCbxCopy->get_active() ); + aOptsItem.GetOptionsMisc().SetSummationOfParagraphs( m_xCbxCompatibility->get_active() ); + aOptsItem.GetOptionsMisc().SetCrookNoContortion( m_xCbxDistort->get_active() ); + rAttrs->Put( aOptsItem ); + + bModified = true; + } + + // metric + if (m_xLbMetric->get_value_changed_from_saved()) + { + const sal_Int32 nMPos = m_xLbMetric->get_active(); + sal_uInt16 nFieldUnit = m_xLbMetric->get_id(nMPos).toUInt32(); + rAttrs->Put( SfxUInt16Item( GetWhich( SID_ATTR_METRIC ), nFieldUnit ) ); + bModified = true; + } + + // tabulator space + if( m_xMtrFldTabstop->get_value_changed_from_saved() ) + { + MapUnit eUnit = rAttrs->GetPool()->GetMetric( SID_ATTR_DEFTABSTOP ); + SfxUInt16Item aDef( SID_ATTR_DEFTABSTOP, static_cast(GetCoreValue( *m_xMtrFldTabstop, eUnit )) ); + rAttrs->Put( aDef ); + bModified = true; + } + + sal_Int32 nX, nY; + if( SetScale( m_xCbScale->get_active_text(), nX, nY ) ) + { + rAttrs->Put( SfxInt32Item( ATTR_OPTIONS_SCALE_X, nX ) ); + rAttrs->Put( SfxInt32Item( ATTR_OPTIONS_SCALE_Y, nY ) ); + + bModified = true; + } + + return bModified; +} + +void SdTpOptionsMisc::Reset( const SfxItemSet* rAttrs ) +{ + SdOptionsMiscItem aOptsItem( rAttrs->Get( ATTR_OPTIONS_MISC ) ); + + bool bReadOnly = m_bDrawMode ? false : officecfg::Office::Impress::Misc::NewDoc::AutoPilot::isReadOnly(); + m_xCbxStartWithTemplate->set_active( aOptsItem.GetOptionsMisc().IsStartWithTemplate() ); + m_xCbxStartWithTemplate->set_sensitive(!bReadOnly); + m_xCbxStartWithTemplateImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Misc::ObjectMoveable::isReadOnly() : + officecfg::Office::Impress::Misc::ObjectMoveable::isReadOnly(); + m_xCbxMarkedHitMovesAlways->set_active( aOptsItem.GetOptionsMisc().IsMarkedHitMovesAlways() ); + m_xCbxMarkedHitMovesAlways->set_sensitive(!bReadOnly); + m_xCbxMarkedHitMovesAlwaysImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Misc::TextObject::QuickEditing::isReadOnly() : + officecfg::Office::Impress::Misc::TextObject::QuickEditing::isReadOnly(); + m_xCbxQuickEdit->set_active( aOptsItem.GetOptionsMisc().IsQuickEdit() ); + m_xCbxQuickEdit->set_sensitive(!bReadOnly); + m_xCbxQuickEditImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Misc::TextObject::Selectable::isReadOnly() : + officecfg::Office::Impress::Misc::TextObject::Selectable::isReadOnly(); + m_xCbxPickThrough->set_active( aOptsItem.GetOptionsMisc().IsPickThrough() ); + m_xCbxPickThrough->set_sensitive(!bReadOnly); + m_xCbxPickThroughImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Misc::BackgroundCache::isReadOnly() : + officecfg::Office::Impress::Misc::BackgroundCache::isReadOnly(); + m_xCbxMasterPageCache->set_active( aOptsItem.GetOptionsMisc().IsMasterPagePaintCaching() ); + m_xCbxMasterPageCache->set_sensitive(!bReadOnly); + m_xCbxMasterPageCacheImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Misc::CopyWhileMoving::isReadOnly() : + officecfg::Office::Impress::Misc::CopyWhileMoving::isReadOnly(); + m_xCbxCopy->set_active( aOptsItem.GetOptionsMisc().IsDragWithCopy() ); + m_xCbxCopy->set_sensitive(!bReadOnly); + m_xCbxCopyImg->set_visible(bReadOnly); + + bReadOnly = m_bDrawMode ? false : officecfg::Office::Impress::Misc::Compatibility::AddBetween::isReadOnly(); + m_xCbxCompatibility->set_active( aOptsItem.GetOptionsMisc().IsSummationOfParagraphs() ); + m_xCbxCompatibility->set_sensitive(!bReadOnly); + m_xCbxCompatibilityImg->set_visible(bReadOnly); + + m_xCbxDistort->set_active( aOptsItem.GetOptionsMisc().IsCrookNoContortion() ); + if (m_bDrawMode) + { + bReadOnly = officecfg::Office::Draw::Misc::NoDistort::isReadOnly(); + m_xCbxDistort->set_sensitive(!bReadOnly); + m_xCbxDistortImg->set_visible(bReadOnly); + } + + m_xCbxStartWithTemplate->save_state(); + m_xCbxMarkedHitMovesAlways->save_state(); + m_xCbxQuickEdit->save_state(); + m_xCbxPickThrough->save_state(); + + m_xCbxMasterPageCache->save_state(); + m_xCbxCopy->save_state(); + m_xCbxCompatibility->save_state(); + m_xCbxDistort->save_state(); + + // metric + sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC ); + m_xLbMetric->set_active(-1); + + if ( rAttrs->GetItemState( nWhich ) >= SfxItemState::DEFAULT ) + { + const SfxUInt16Item& rItem = static_cast(rAttrs->Get( nWhich )); + sal_uInt32 nFieldUnit = static_cast(rItem.GetValue()); + + for (sal_Int32 i = 0, nEntryCount = m_xLbMetric->get_count(); i < nEntryCount; ++i) + { + if (m_xLbMetric->get_id(i).toUInt32() == nFieldUnit) + { + m_xLbMetric->set_active( i ); + break; + } + } + } + + // tabulator space + constexpr auto nWhich2 = SID_ATTR_DEFTABSTOP; + if( rAttrs->GetItemState( nWhich2 ) >= SfxItemState::DEFAULT ) + { + MapUnit eUnit = rAttrs->GetPool()->GetMetric( nWhich2 ); + const SfxUInt16Item& rItem = rAttrs->Get( nWhich2 ); + SetMetricValue( *m_xMtrFldTabstop, rItem.GetValue(), eUnit ); + } + + if (SdOptionsGeneric::isMetricSystem()) + { + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Other::MeasureUnit::Metric::isReadOnly() : + officecfg::Office::Impress::Layout::Other::MeasureUnit::Metric::isReadOnly(); + } + else + { + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Other::MeasureUnit::NonMetric::isReadOnly() : + officecfg::Office::Impress::Layout::Other::MeasureUnit::NonMetric::isReadOnly(); + } + m_xLbMetric->set_sensitive(!bReadOnly); + m_xLbMetricImg->set_visible(bReadOnly); + + if (SdOptionsGeneric::isMetricSystem()) + { + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Other::TabStop::Metric::isReadOnly() : + officecfg::Office::Impress::Layout::Other::TabStop::Metric::isReadOnly(); + } + else + { + bReadOnly = m_bDrawMode ? officecfg::Office::Draw::Layout::Other::TabStop::NonMetric::isReadOnly() : + officecfg::Office::Impress::Layout::Other::TabStop::NonMetric::isReadOnly(); + } + m_xMtrFldTabstop->set_sensitive(!bReadOnly); + m_xMtrFldTabstopImg->set_visible(bReadOnly); + + m_xLbMetric->save_value(); + m_xMtrFldTabstop->save_value(); + //Scale + sal_Int32 nX = rAttrs->Get( ATTR_OPTIONS_SCALE_X ).GetValue(); + sal_Int32 nY = rAttrs->Get( ATTR_OPTIONS_SCALE_Y ).GetValue(); + nWidth = rAttrs->Get( ATTR_OPTIONS_SCALE_WIDTH ).GetValue(); + nHeight = rAttrs->Get( ATTR_OPTIONS_SCALE_HEIGHT ).GetValue(); + + m_xCbScale->set_entry_text( GetScale( nX, nY ) ); + if (m_bDrawMode) + { + bReadOnly = officecfg::Office::Draw::Zoom::ScaleX::isReadOnly() && + officecfg::Office::Draw::Zoom::ScaleY::isReadOnly(); + m_xCbScale->set_sensitive(!bReadOnly); + m_xCbScaleImg->set_visible(bReadOnly); + } + + m_xMtrFldOriginalWidth->hide(); + m_xMtrFldOriginalWidth->set_text( aInfo1 ); // empty + m_xMtrFldOriginalHeight->hide(); + m_xMtrFldOriginalHeight->set_text( aInfo2 ); //empty + m_xFiInfo1->hide(); + m_xFiInfo2->hide(); + + UpdateCompatibilityControls (); +} + +std::unique_ptr SdTpOptionsMisc::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrs ) +{ + return std::make_unique( pPage, pController, *rAttrs ); +} + +IMPL_LINK_NOARG(SdTpOptionsMisc, SelectMetricHdl_Impl, weld::ComboBox&, void) +{ + int nPos = m_xLbMetric->get_active(); + if (nPos != -1) + { + FieldUnit eUnit = static_cast(m_xLbMetric->get_id(nPos).toUInt32()); + sal_Int64 nVal = + m_xMtrFldTabstop->denormalize(m_xMtrFldTabstop->get_value(FieldUnit::TWIP)); + SetFieldUnit( *m_xMtrFldTabstop, eUnit ); + m_xMtrFldTabstop->set_value( m_xMtrFldTabstop->normalize( nVal ), FieldUnit::TWIP ); + } +} + +void SdTpOptionsMisc::SetDrawMode() +{ + m_xScaleFrame->show(); + m_xNewDocumentFrame->hide(); + m_xCbxCompatibility->hide(); + m_xNewDocLb->hide(); + m_xCbScale->show(); + m_xMtrFldInfo1->hide(); + m_xMtrFldInfo2->hide(); + m_xWidthLb->hide(); + m_xHeightLb->hide(); + m_xFiInfo1->show(); + m_xMtrFldOriginalWidth->show(); + m_xFiInfo2->show(); + m_xMtrFldOriginalHeight->show(); + m_xCbxDistort->show(); + m_xCbxCompatibility->hide(); + + m_bDrawMode = true; +} + +OUString SdTpOptionsMisc::GetScale( sal_Int32 nX, sal_Int32 nY ) +{ + return OUString::number(nX) + OUStringChar(TOKEN) + OUString::number(nY); +} + +bool SdTpOptionsMisc::SetScale( std::u16string_view aScale, sal_Int32& rX, sal_Int32& rY ) +{ + if (aScale.empty()) + return false; + + sal_Int32 nIdx {0}; + + std::u16string_view aTmp(o3tl::getToken(aScale, 0, TOKEN, nIdx)); + if (nIdx<0) + return false; // we expect another token! + + if (!comphelper::string::isdigitAsciiString(aTmp)) + return false; + + rX = static_cast(o3tl::toInt32(aTmp)); + if( rX == 0 ) + return false; + + aTmp = o3tl::getToken(aScale, 0, TOKEN, nIdx); + if (nIdx>=0) + return false; // we require just 2 tokens! + + if (!comphelper::string::isdigitAsciiString(aTmp)) + return false; + + rY = static_cast(o3tl::toInt32(aTmp)); + return rY != 0; +} + +void SdTpOptionsMisc::UpdateCompatibilityControls() +{ + // Disable the compatibility controls by default. Enable them only when + // there is at least one open document. + bool bIsEnabled = false; + + try + { + // Get a component enumeration from the desktop and search it for documents. + Reference xContext( ::comphelper::getProcessComponentContext()); + do + { + Reference xDesktop = frame::Desktop::create(xContext); + + Reference xComponents = + xDesktop->getComponents(); + if ( ! xComponents.is()) + break; + + Reference xEnumeration ( + xComponents->createEnumeration()); + if ( ! xEnumeration.is()) + break; + + while (xEnumeration->hasMoreElements()) + { + Reference xModel (xEnumeration->nextElement(), UNO_QUERY); + if (xModel.is()) + { + // There is at least one model/document: Enable the compatibility controls. + bIsEnabled = true; + break; + } + } + + } + while (false); // One 'loop'. + } + catch (const uno::Exception&) + { + // When there is an exception then simply use the default value of + // bIsEnabled and disable the controls. + } + + m_xCbxCompatibility->set_sensitive(bIsEnabled && !officecfg::Office::Impress::Misc::Compatibility::AddBetween::isReadOnly()); +} + +void SdTpOptionsMisc::PageCreated(const SfxAllItemSet& aSet) +{ + const SfxUInt32Item* pFlagItem = aSet.GetItem(SID_SDMODE_FLAG, false); + if (pFlagItem) + { + sal_uInt32 nFlags=pFlagItem->GetValue(); + if ( ( nFlags & SD_DRAW_MODE ) == SD_DRAW_MODE ) + SetDrawMode(); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/unchss.cxx b/sd/source/ui/dlg/unchss.cxx new file mode 100644 index 0000000000..7d963cddfb --- /dev/null +++ b/sd/source/ui/dlg/unchss.cxx @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +StyleSheetUndoAction::StyleSheetUndoAction(SdDrawDocument* pTheDoc, + SfxStyleSheet* pTheStyleSheet, + const SfxItemSet* pTheNewItemSet) : + SdUndoAction(pTheDoc) +{ + DBG_ASSERT(pTheStyleSheet, "Undo without StyleSheet ???"); + mpStyleSheet = pTheStyleSheet; + + // Create ItemSets; Attention, it is possible that the new one is from a, + // different pool. Therefore we clone it with its items. + mpNewSet = std::make_unique(static_cast(SdrObject::GetGlobalDrawObjectItemPool()), pTheNewItemSet->GetRanges()); + SdrModel::MigrateItemSet( pTheNewItemSet, mpNewSet.get(), pTheDoc ); + + mpOldSet = std::make_unique(static_cast(SdrObject::GetGlobalDrawObjectItemPool()), mpStyleSheet->GetItemSet().GetRanges()); + SdrModel::MigrateItemSet( &mpStyleSheet->GetItemSet(), mpOldSet.get(), pTheDoc ); + + OUString aComment(SdResId(STR_UNDO_CHANGE_PRES_OBJECT)); + OUString aName(mpStyleSheet->GetName()); + + // delete layout name and separator + sal_Int32 nPos = aName.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aName = aName.copy(nPos + SD_LT_SEPARATOR.getLength()); + + if (aName == STR_LAYOUT_TITLE) + { + aName = SdResId(STR_PSEUDOSHEET_TITLE); + } + else if (aName == STR_LAYOUT_SUBTITLE) + { + aName = SdResId(STR_PSEUDOSHEET_SUBTITLE); + } + else if (aName == STR_LAYOUT_BACKGROUND) + { + aName = SdResId(STR_PSEUDOSHEET_BACKGROUND); + } + else if (aName == STR_LAYOUT_BACKGROUNDOBJECTS) + { + aName = SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS); + } + else if (aName == STR_LAYOUT_NOTES) + { + aName = SdResId(STR_PSEUDOSHEET_NOTES); + } + else + { + OUString aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE)); + nPos = aName.indexOf(aOutlineStr); + if (nPos != -1) + { + std::u16string_view aNumStr(aName.subView(aOutlineStr.getLength())); + aName = STR_LAYOUT_OUTLINE + aNumStr; + } + } + + // replace placeholder with template name + SetComment(aComment.replaceFirst("$", aName)); +} + +void StyleSheetUndoAction::Undo() +{ + SfxItemSet aNewSet( mpDoc->GetItemPool(), mpOldSet->GetRanges() ); + SdrModel::MigrateItemSet( mpOldSet.get(), &aNewSet, mpDoc ); + + mpStyleSheet->GetItemSet().Set(aNewSet); + if( mpStyleSheet->GetFamily() == SfxStyleFamily::Pseudo ) + static_cast(mpStyleSheet)->GetRealStyleSheet()->Broadcast(SfxHint(SfxHintId::DataChanged)); + else + mpStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); +} + +void StyleSheetUndoAction::Redo() +{ + SfxItemSet aNewSet( mpDoc->GetItemPool(), mpOldSet->GetRanges() ); + SdrModel::MigrateItemSet( mpNewSet.get(), &aNewSet, mpDoc ); + + mpStyleSheet->GetItemSet().Set(aNewSet); + if( mpStyleSheet->GetFamily() == SfxStyleFamily::Pseudo ) + static_cast(mpStyleSheet)->GetRealStyleSheet()->Broadcast(SfxHint(SfxHintId::DataChanged)); + else + mpStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/dlg/vectdlg.cxx b/sd/source/ui/dlg/vectdlg.cxx new file mode 100644 index 0000000000..de555ceedb --- /dev/null +++ b/sd/source/ui/dlg/vectdlg.cxx @@ -0,0 +1,336 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define VECTORIZE_MAX_EXTENT 512 + +SdVectorizeDlg::SdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) + : GenericDialogController(pParent, "modules/sdraw/ui/vectorize.ui", "VectorizeDialog") + , m_pDocSh(pDocShell) + , aBmp(rBmp) + , m_aBmpWin(m_xDialog.get()) + , m_aMtfWin(m_xDialog.get()) + , m_xNmLayers(m_xBuilder->weld_spin_button("colors")) + , m_xMtReduce(m_xBuilder->weld_metric_spin_button("points", FieldUnit::PIXEL)) + , m_xFtFillHoles(m_xBuilder->weld_label("tilesft")) + , m_xMtFillHoles(m_xBuilder->weld_metric_spin_button("tiles", FieldUnit::PIXEL)) + , m_xCbFillHoles(m_xBuilder->weld_check_button("fillholes")) + , m_xBmpWin(new weld::CustomWeld(*m_xBuilder, "source", m_aBmpWin)) + , m_xMtfWin(new weld::CustomWeld(*m_xBuilder, "vectorized", m_aMtfWin)) + , m_xPrgs(m_xBuilder->weld_progress_bar("progressbar")) + , m_xBtnOK(m_xBuilder->weld_button("ok")) + , m_xBtnPreview(m_xBuilder->weld_button("preview")) +{ + const int nWidth = m_xFtFillHoles->get_approximate_digit_width() * 32; + const int nHeight = m_xFtFillHoles->get_text_height() * 16; + m_xBmpWin->set_size_request(nWidth, nHeight); + m_xMtfWin->set_size_request(nWidth, nHeight); + + m_xBtnPreview->connect_clicked( LINK( this, SdVectorizeDlg, ClickPreviewHdl ) ); + m_xBtnOK->connect_clicked( LINK( this, SdVectorizeDlg, ClickOKHdl ) ); + m_xNmLayers->connect_value_changed( LINK( this, SdVectorizeDlg, ModifyHdl ) ); + m_xMtReduce->connect_value_changed( LINK( this, SdVectorizeDlg, MetricModifyHdl ) ); + m_xMtFillHoles->connect_value_changed( LINK( this, SdVectorizeDlg, MetricModifyHdl ) ); + m_xCbFillHoles->connect_toggled( LINK( this, SdVectorizeDlg, ToggleHdl ) ); + + LoadSettings(); + InitPreviewBmp(); +} + +SdVectorizeDlg::~SdVectorizeDlg() +{ +} + +::tools::Rectangle SdVectorizeDlg::GetRect( const Size& rDispSize, const Size& rBmpSize ) +{ + ::tools::Rectangle aRect; + + if( rBmpSize.Width() && rBmpSize.Height() && rDispSize.Width() && rDispSize.Height() ) + { + Size aBmpSize( rBmpSize ); + const double fGrfWH = static_cast(aBmpSize.Width()) / aBmpSize.Height(); + const double fWinWH = static_cast(rDispSize.Width()) / rDispSize.Height(); + + if( fGrfWH < fWinWH ) + { + aBmpSize.setWidth( static_cast( rDispSize.Height() * fGrfWH ) ); + aBmpSize.setHeight( rDispSize.Height() ); + } + else + { + aBmpSize.setWidth( rDispSize.Width() ); + aBmpSize.setHeight( static_cast( rDispSize.Width() / fGrfWH) ); + } + + const Point aBmpPos( ( rDispSize.Width() - aBmpSize.Width() ) >> 1, + ( rDispSize.Height() - aBmpSize.Height() ) >> 1 ); + + aRect = ::tools::Rectangle( aBmpPos, aBmpSize ); + } + + return aRect; +} + +void SdVectorizeDlg::InitPreviewBmp() +{ + const ::tools::Rectangle aRect( GetRect( m_aBmpWin.GetOutputSizePixel(), aBmp.GetSizePixel() ) ); + + aPreviewBmp = aBmp; + aPreviewBmp.Scale( aRect.GetSize() ); + m_aBmpWin.SetGraphic(BitmapEx(aPreviewBmp)); +} + +Bitmap SdVectorizeDlg::GetPreparedBitmap( Bitmap const & rBmp, Fraction& rScale ) +{ + Bitmap aNew( rBmp ); + const Size aSizePix( aNew.GetSizePixel() ); + + if( aSizePix.Width() > VECTORIZE_MAX_EXTENT || aSizePix.Height() > VECTORIZE_MAX_EXTENT ) + { + const ::tools::Rectangle aRect( GetRect( Size( VECTORIZE_MAX_EXTENT, VECTORIZE_MAX_EXTENT ), aSizePix ) ); + rScale = Fraction( aSizePix.Width(), aRect.GetWidth() ); + aNew.Scale( aRect.GetSize() ); + } + else + rScale = Fraction( 1, 1 ); + + BitmapEx aNewBmpEx(aNew); + BitmapFilter::Filter(aNewBmpEx, BitmapSimpleColorQuantizationFilter(m_xNmLayers->get_value())); + aNew = aNewBmpEx.GetBitmap(); + + return aNew; +} + +void SdVectorizeDlg::Calculate( Bitmap const & rBmp, GDIMetaFile& rMtf ) +{ + m_pDocSh->SetWaitCursor( true ); + m_xPrgs->set_percentage(0); + + Fraction aScale; + Bitmap aTmp( GetPreparedBitmap( rBmp, aScale ) ); + + if( !aTmp.IsEmpty() ) + { + const Link<::tools::Long,void> aPrgsHdl( LINK( this, SdVectorizeDlg, ProgressHdl ) ); + aTmp.Vectorize( rMtf, static_cast(m_xMtReduce->get_value(FieldUnit::NONE)), &aPrgsHdl ); + + if (m_xCbFillHoles->get_active()) + { + GDIMetaFile aNewMtf; + BitmapScopedReadAccess pRAcc(aTmp); + + if( pRAcc ) + { + const tools::Long nWidth = pRAcc->Width(); + const tools::Long nHeight = pRAcc->Height(); + const tools::Long nTileX = m_xMtFillHoles->get_value(FieldUnit::NONE); + const tools::Long nTileY = m_xMtFillHoles->get_value(FieldUnit::NONE); + assert(nTileX && "div-by-zero"); + const tools::Long nCountX = nWidth / nTileX; + assert(nTileY && "div-by-zero"); + const tools::Long nCountY = nHeight / nTileY; + const tools::Long nRestX = nWidth % nTileX; + const tools::Long nRestY = nHeight % nTileY; + + MapMode aMap( rMtf.GetPrefMapMode() ); + aNewMtf.SetPrefSize( rMtf.GetPrefSize() ); + aNewMtf.SetPrefMapMode( aMap ); + + for( tools::Long nTY = 0; nTY < nCountY; nTY++ ) + { + const tools::Long nY = nTY * nTileY; + + for( tools::Long nTX = 0; nTX < nCountX; nTX++ ) + AddTile( pRAcc.get(), aNewMtf, nTX * nTileX, nTY * nTileY, nTileX, nTileY ); + + if( nRestX ) + AddTile( pRAcc.get(), aNewMtf, nCountX * nTileX, nY, nRestX, nTileY ); + } + + if( nRestY ) + { + const tools::Long nY = nCountY * nTileY; + + for( tools::Long nTX = 0; nTX < nCountX; nTX++ ) + AddTile( pRAcc.get(), aNewMtf, nTX * nTileX, nY, nTileX, nRestY ); + + if( nRestX ) + AddTile( pRAcc.get(), aNewMtf, nCountX * nTileX, nCountY * nTileY, nRestX, nRestY ); + } + + pRAcc.reset(); + + for( size_t n = 0, nCount = rMtf.GetActionSize(); n < nCount; n++ ) + aNewMtf.AddAction( rMtf.GetAction( n )->Clone() ); + + aMap.SetScaleX( aMap.GetScaleX() * aScale ); + aMap.SetScaleY( aMap.GetScaleY() * aScale ); + aNewMtf.SetPrefMapMode( aMap ); + rMtf = aNewMtf; + } + } + } + + m_xPrgs->set_percentage(0); + m_pDocSh->SetWaitCursor( false ); +} + +void SdVectorizeDlg::AddTile( BitmapReadAccess const * pRAcc, GDIMetaFile& rMtf, + tools::Long nPosX, tools::Long nPosY, tools::Long nWidth, tools::Long nHeight ) +{ + sal_uLong nSumR = 0, nSumG = 0, nSumB = 0; + const tools::Long nRight = nPosX + nWidth - 1; + const tools::Long nBottom = nPosY + nHeight - 1; + const double fMult = 1.0 / ( nWidth * nHeight ); + + for( tools::Long nY = nPosY; nY <= nBottom; nY++ ) + { + for( tools::Long nX = nPosX; nX <= nRight; nX++ ) + { + const BitmapColor aPixel( pRAcc->GetColor( nY, nX ) ); + + nSumR += aPixel.GetRed(); + nSumG += aPixel.GetGreen(); + nSumB += aPixel.GetBlue(); + } + } + + const Color aColor( static_cast(FRound( nSumR * fMult )), + static_cast(FRound( nSumG * fMult )), + static_cast(FRound( nSumB * fMult )) ); + + ::tools::Rectangle aRect( Point( nPosX, nPosY ), Size( nWidth + 1, nHeight + 1 ) ); + const Size& rMaxSize = rMtf.GetPrefSize(); + + aRect = Application::GetDefaultDevice()->PixelToLogic(aRect, rMtf.GetPrefMapMode()); + + if( aRect.Right() > ( rMaxSize.Width() - 1 ) ) + aRect.SetRight( rMaxSize.Width() - 1 ); + + if( aRect.Bottom() > ( rMaxSize.Height() - 1 ) ) + aRect.SetBottom( rMaxSize.Height() - 1 ); + + rMtf.AddAction( new MetaLineColorAction( aColor, true ) ); + rMtf.AddAction( new MetaFillColorAction( aColor, true ) ); + rMtf.AddAction( new MetaRectAction( aRect ) ); +} + +IMPL_LINK( SdVectorizeDlg, ProgressHdl, tools::Long, nData, void ) +{ + m_xPrgs->set_percentage(nData); +} + +IMPL_LINK_NOARG(SdVectorizeDlg, ClickPreviewHdl, weld::Button&, void) +{ + Calculate( aBmp, aMtf ); + m_aMtfWin.SetGraphic( aMtf ); + m_xBtnPreview->set_sensitive(false); +} + +IMPL_LINK_NOARG(SdVectorizeDlg, ClickOKHdl, weld::Button&, void) +{ + if (m_xBtnPreview->get_sensitive()) + Calculate( aBmp, aMtf ); + + SaveSettings(); + m_xDialog->response(RET_OK); +} + +IMPL_LINK( SdVectorizeDlg, ToggleHdl, weld::Toggleable&, rCb, void ) +{ + if (rCb.get_active()) + { + m_xFtFillHoles->set_sensitive(true); + m_xMtFillHoles->set_sensitive(true); + } + else + { + m_xFtFillHoles->set_sensitive(false); + m_xMtFillHoles->set_sensitive(false); + } + + m_xBtnPreview->set_sensitive(true); +} + +IMPL_LINK_NOARG(SdVectorizeDlg, ModifyHdl, weld::SpinButton&, void) +{ + m_xBtnPreview->set_sensitive(true); +} + +IMPL_LINK_NOARG(SdVectorizeDlg, MetricModifyHdl, weld::MetricSpinButton&, void) +{ + m_xBtnPreview->set_sensitive(true); +} + +void SdVectorizeDlg::LoadSettings() +{ + tools::SvRef xIStm( SD_MOD()->GetOptionStream( + SD_OPTION_VECTORIZE , + SdOptionStreamMode::Load ) ); + sal_uInt16 nLayers; + sal_uInt16 nReduce; + sal_uInt16 nFillHoles; + bool bFillHoles; + + if( xIStm.is() ) + { + SdIOCompat aCompat( *xIStm, StreamMode::READ ); + xIStm->ReadUInt16( nLayers ).ReadUInt16( nReduce ).ReadUInt16( nFillHoles ).ReadCharAsBool( bFillHoles ); + } + else + { + nLayers = 8; + nReduce = 0; + nFillHoles = 32; + bFillHoles = false; + } + + m_xNmLayers->set_value(nLayers); + m_xMtReduce->set_value(nReduce, FieldUnit::NONE); + m_xMtFillHoles->set_value(nFillHoles, FieldUnit::NONE); + m_xCbFillHoles->set_active(bFillHoles); + + ToggleHdl(*m_xCbFillHoles); +} + +void SdVectorizeDlg::SaveSettings() const +{ + tools::SvRef xOStm( SD_MOD()->GetOptionStream( + SD_OPTION_VECTORIZE , + SdOptionStreamMode::Store ) ); + + if( xOStm.is() ) + { + SdIOCompat aCompat( *xOStm, StreamMode::WRITE, 1 ); + xOStm->WriteUInt16( m_xNmLayers->get_value() ).WriteUInt16(m_xMtReduce->get_value(FieldUnit::NONE)); + xOStm->WriteUInt16( m_xMtFillHoles->get_value(FieldUnit::NONE) ).WriteBool(m_xCbFillHoles->get_active()); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/docshell/docshel2.cxx b/sd/source/ui/docshell/docshel2.cxx new file mode 100644 index 0000000000..582afec051 --- /dev/null +++ b/sd/source/ui/docshell/docshel2.cxx @@ -0,0 +1,421 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace sd { + +/** + * Drawing of DocShell (with the helper class SdDrawViewShell) + */ +void DrawDocShell::Draw(OutputDevice* pOut, const JobSetup&, sal_uInt16 nAspect, bool /*bOutputForScreen*/) +{ + if (nAspect == ASPECT_THUMBNAIL) + { + // THUMBNAIL: here we may can set the draft mode + } + + std::optional pView( std::in_place, this, pOut ); + + pView->SetHlplVisible(false); + pView->SetGridVisible(false); + pView->SetBordVisible(false); + pView->SetPageVisible(false); + pView->SetGlueVisible(false); + + SdPage* pSelectedPage = nullptr; + + const std::vector> &rViews = mpDoc->GetFrameViewList(); + if( !rViews.empty() ) + { + sd::FrameView* pFrameView = rViews[0].get(); + if( pFrameView->GetPageKind() == PageKind::Standard ) + { + sal_uInt16 nSelectedPage = pFrameView->GetSelectedPage(); + pSelectedPage = mpDoc->GetSdPage(nSelectedPage, PageKind::Standard); + } + } + + if( nullptr == pSelectedPage ) + { + SdPage* pPage = nullptr; + sal_uInt16 nPageCnt = mpDoc->GetSdPageCount(PageKind::Standard); + + for (sal_uInt16 i = 0; i < nPageCnt; i++) + { + pPage = mpDoc->GetSdPage(i, PageKind::Standard); + + if ( pPage->IsSelected() ) + pSelectedPage = pPage; + } + + if( nullptr == pSelectedPage ) + pSelectedPage = mpDoc->GetSdPage(0, PageKind::Standard); + } + + ::tools::Rectangle aVisArea = GetVisArea(nAspect); + pOut->IntersectClipRegion(aVisArea); + pView->ShowSdrPage(pSelectedPage); + + if (pOut->GetOutDevType() == OUTDEV_WINDOW) + return; + + MapMode aOldMapMode = pOut->GetMapMode(); + + if (pOut->GetOutDevType() == OUTDEV_PRINTER) + { + MapMode aMapMode = aOldMapMode; + Point aOrigin = aMapMode.GetOrigin(); + aOrigin.AdjustX(1 ); + aOrigin.AdjustY(1 ); + aMapMode.SetOrigin(aOrigin); + pOut->SetMapMode(aMapMode); + } + + vcl::Region aRegion(aVisArea); + pView->CompleteRedraw(pOut, aRegion); + + if (pOut->GetOutDevType() == OUTDEV_PRINTER) + { + pOut->SetMapMode(aOldMapMode); + } +} + +::tools::Rectangle DrawDocShell::GetVisArea(sal_uInt16 nAspect) const +{ + ::tools::Rectangle aVisArea; + + if( ( ASPECT_THUMBNAIL == nAspect ) || ( ASPECT_DOCPRINT == nAspect ) ) + { + // provide size of first page + aVisArea.SetSize(mpDoc->GetSdPage(0, PageKind::Standard)->GetSize()); + } + else + { + aVisArea = SfxObjectShell::GetVisArea(nAspect); + } + + if (aVisArea.IsEmpty() && mpViewShell) + { + vcl::Window* pWin = mpViewShell->GetActiveWindow(); + + if (pWin) + { + aVisArea = pWin->PixelToLogic(::tools::Rectangle(Point(0,0), pWin->GetOutputSizePixel())); + } + } + + return aVisArea; +} + +void DrawDocShell::Connect(ViewShell* pViewSh) +{ + mpViewShell = pViewSh; +} + +void DrawDocShell::Disconnect(ViewShell const * pViewSh) +{ + if (mpViewShell == pViewSh) + { + mpViewShell = nullptr; + } +} + +FrameView* DrawDocShell::GetFrameView() +{ + FrameView* pFrameView = nullptr; + + if (mpViewShell) + { + pFrameView = mpViewShell->GetFrameView(); + } + + return pFrameView; +} + +/** + * Creates a bitmap of an arbitrary page + */ +BitmapEx DrawDocShell::GetPagePreviewBitmap(SdPage* pPage) +{ + const sal_uInt16 nMaxEdgePixel = 90; + MapMode aMapMode( MapUnit::Map100thMM ); + const Size aSize( pPage->GetSize() ); + const Point aNullPt; + ScopedVclPtrInstance< VirtualDevice > pVDev( *Application::GetDefaultDevice() ); + + pVDev->SetMapMode( aMapMode ); + + const Size aPixSize( pVDev->LogicToPixel( aSize ) ); + const sal_uLong nMaxEdgePix = std::max( aPixSize.Width(), aPixSize.Height() ); + Fraction aFrac( nMaxEdgePixel, nMaxEdgePix ); + + aMapMode.SetScaleX( aFrac ); + aMapMode.SetScaleY( aFrac ); + pVDev->SetMapMode( aMapMode ); + pVDev->SetOutputSize( aSize ); + + // that we also get the dark lines at the right and bottom page margin + aFrac = Fraction( nMaxEdgePixel - 1, nMaxEdgePix ); + aMapMode.SetScaleX( aFrac ); + aMapMode.SetScaleY( aFrac ); + pVDev->SetMapMode( aMapMode ); + + std::optional pView( std::in_place, this, pVDev ); + FrameView* pFrameView = GetFrameView(); + pView->ShowSdrPage( pPage ); + + if ( GetFrameView() ) + { + // initialize the drawing-(screen) attributes + pView->SetGridCoarse( pFrameView->GetGridCoarse() ); + pView->SetGridFine( pFrameView->GetGridFine() ); + pView->SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY()); + pView->SetGridVisible( pFrameView->IsGridVisible() ); + pView->SetGridFront( pFrameView->IsGridFront() ); + pView->SetSnapAngle( pFrameView->GetSnapAngle() ); + pView->SetGridSnap( pFrameView->IsGridSnap() ); + pView->SetBordSnap( pFrameView->IsBordSnap() ); + pView->SetHlplSnap( pFrameView->IsHlplSnap() ); + pView->SetOFrmSnap( pFrameView->IsOFrmSnap() ); + pView->SetOPntSnap( pFrameView->IsOPntSnap() ); + pView->SetOConSnap( pFrameView->IsOConSnap() ); + pView->SetDragStripes( pFrameView->IsDragStripes() ); + pView->SetFrameDragSingles( pFrameView->IsFrameDragSingles() ); + pView->SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() ); + pView->SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() ); + pView->SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() ); + pView->SetSlantButShear( pFrameView->IsSlantButShear() ); + pView->SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() ); + pView->SetCrookNoContortion( pFrameView->IsCrookNoContortion() ); + pView->SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() ); + pView->SetBigOrtho( pFrameView->IsBigOrtho() ); + pView->SetOrtho( pFrameView->IsOrtho() ); + + SdrPageView* pPageView = pView->GetSdrPageView(); + + if (pPageView) + { + if ( pPageView->GetVisibleLayers() != pFrameView->GetVisibleLayers() ) + pPageView->SetVisibleLayers( pFrameView->GetVisibleLayers() ); + + if ( pPageView->GetPrintableLayers() != pFrameView->GetPrintableLayers() ) + pPageView->SetPrintableLayers( pFrameView->GetPrintableLayers() ); + + if ( pPageView->GetLockedLayers() != pFrameView->GetLockedLayers() ) + pPageView->SetLockedLayers( pFrameView->GetLockedLayers() ); + + pPageView->SetHelpLines( pFrameView->GetStandardHelpLines() ); + } + + if ( pView->GetActiveLayer() != pFrameView->GetActiveLayer() ) + pView->SetActiveLayer( pFrameView->GetActiveLayer() ); + } + + pView->CompleteRedraw( pVDev, vcl::Region(::tools::Rectangle(aNullPt, aSize)) ); + + // IsRedrawReady() always gives sal_True while ( !pView->IsRedrawReady() ) {} + pView.reset(); + + pVDev->SetMapMode( MapMode() ); + + BitmapEx aPreview( pVDev->GetBitmapEx( aNullPt, pVDev->GetOutputSizePixel() ) ); + + DBG_ASSERT(!aPreview.IsEmpty(), "Preview-Bitmap could not be generated"); + + return aPreview; +} + +/** + * Checks if the page exists. If so, we force the user to enter a not yet used + * name. + * @return sal_False if the user cancels the action. + */ +bool DrawDocShell::CheckPageName(weld::Window* pWin, OUString& rName) +{ + const OUString aStrForDlg( rName ); + bool bIsNameValid = IsNewPageNameValid( rName, true ); + + if( ! bIsNameValid ) + { + OUString aDesc; + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + + if (GetDocumentType() == DocumentType::Draw) + aDesc = SdResId( STR_WARN_PAGE_EXISTS_DRAW ); + else + aDesc = SdResId( STR_WARN_PAGE_EXISTS ); + + ScopedVclPtr aNameDlg(pFact->CreateSvxNameDialog(pWin, aStrForDlg, aDesc)); + aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE ); + + aNameDlg->SetCheckNameHdl( LINK( this, DrawDocShell, RenameSlideHdl ) ); + + rtl::Reference xFunc( mpViewShell->GetCurrentFunction() ); + if( xFunc.is() ) + xFunc->cancel(); + + if( aNameDlg->Execute() == RET_OK ) + { + aNameDlg->GetName( rName ); + bIsNameValid = IsNewPageNameValid( rName ); + } + } + + return bIsNameValid; +} + +bool DrawDocShell::IsNewPageNameValid( OUString & rInOutPageName, bool bResetStringIfStandardName /* = false */ ) +{ + bool bCanUseNewName = false; + + // check if name is something like 'Slide/Page n' + OUString aStrPage; + if (GetDoc()->GetDocumentType() == DocumentType::Draw) + aStrPage = SdResId(STR_PAGE_NAME) + " "; + else + // using the same strings as SdPage::GetName + aStrPage = SdResId(STR_PAGE) + " "; + + bool bIsStandardName = false; + + // prevent also _future_ slide names of the form "'STR_PAGE' + ' ' + '[0-9]+|[a-z]|[A-Z]|[CDILMVX]+|[cdilmvx]+'" + // (arabic, lower- and upper case single letter, lower- and upper case roman numbers) + if (rInOutPageName.startsWith(aStrPage) && + rInOutPageName.getLength() > aStrPage.getLength()) + { + sal_Int32 nIdx{ aStrPage.getLength() }; + std::u16string_view sRemainder = o3tl::getToken(rInOutPageName, 0, ' ', nIdx); + if (!sRemainder.empty() && sRemainder[0] >= '0' && sRemainder[0] <= '9') + { + // check for arabic numbering + + size_t nIndex = 1; + // skip all following numbers + while (nIndex < sRemainder.size() && + sRemainder[nIndex] >= '0' && sRemainder[nIndex] <= '9') + { + nIndex++; + } + + // EOL? Reserved name! + if (nIndex >= sRemainder.size()) + { + bIsStandardName = true; + } + } + else if (sRemainder.size() == 1 && + rtl::isAsciiLowerCase(sRemainder[0])) + { + // lower case, single character: reserved + bIsStandardName = true; + } + else if (sRemainder.size() == 1 && + rtl::isAsciiUpperCase(sRemainder[0])) + { + // upper case, single character: reserved + bIsStandardName = true; + } + else + { + // check for upper/lower case roman numbering + OUString sReserved("cdilmvx"); + + // skip all following characters contained in one reserved class + if (sReserved.indexOf(sRemainder[0]) == -1) + sReserved = sReserved.toAsciiUpperCase(); + + size_t nIndex = 0; + while (nIndex < sRemainder.size() && + sReserved.indexOf(sRemainder[nIndex]) != -1) + { + nIndex++; + } + + // EOL? Reserved name! + if (nIndex >= sRemainder.size()) + { + bIsStandardName = true; + } + } + } + + if( bIsStandardName ) + { + if( bResetStringIfStandardName ) + { + // this is for insertion of slides from other files with standard + // name. They get a new standard name, if the string is set to an + // empty one. + rInOutPageName.clear(); + bCanUseNewName = true; + } + else + bCanUseNewName = false; + } + else + { + if (!rInOutPageName.isEmpty()) + { + bool bOutDummy; + sal_uInt16 nExistingPageNum = mpDoc->GetPageByName( rInOutPageName, bOutDummy ); + bCanUseNewName = ( nExistingPageNum == SDRPAGE_NOTFOUND ); + } + else + bCanUseNewName = false; + } + + return bCanUseNewName; +} + +bool DrawDocShell::IsPageNameUnique( std::u16string_view rPageName ) const +{ + return mpDoc->IsPageNameUnique(rPageName); +} + +IMPL_LINK( DrawDocShell, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool ) +{ + OUString aNewName; + rDialog.GetName( aNewName ); + return IsNewPageNameValid( aNewName ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/docshell/docshel3.cxx b/sd/source/ui/docshell/docshel3.cxx new file mode 100644 index 0000000000..f310ddcfc6 --- /dev/null +++ b/sd/source/ui/docshell/docshel3.cxx @@ -0,0 +1,439 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::uno; + +namespace sd { + +static void lcl_setLanguageForObj( SdrObject *pObj, LanguageType nLang, bool bLanguageNone ) +{ + const sal_uInt16 aLangWhichId_EE[3] = + { + EE_CHAR_LANGUAGE, + EE_CHAR_LANGUAGE_CJK, + EE_CHAR_LANGUAGE_CTL + }; + + if( bLanguageNone ) + nLang = LANGUAGE_NONE; + + if( nLang != LANGUAGE_DONTKNOW ) + { + if( nLang == LANGUAGE_NONE ) + { + for(sal_uInt16 n : aLangWhichId_EE) + pObj->SetMergedItem( SvxLanguageItem( nLang, n ) ); + } + else + { + sal_uInt16 nLangWhichId = 0; + SvtScriptType nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLang ); + switch (nScriptType) + { + case SvtScriptType::LATIN : nLangWhichId = EE_CHAR_LANGUAGE; break; + case SvtScriptType::ASIAN : nLangWhichId = EE_CHAR_LANGUAGE_CJK; break; + case SvtScriptType::COMPLEX : nLangWhichId = EE_CHAR_LANGUAGE_CTL; break; + default: + OSL_FAIL("unexpected case" ); + return; + } + pObj->SetMergedItem( SvxLanguageItem( nLang, nLangWhichId ) ); + + // Reset shape text language to default, so it inherits the shape language set above. + OutlinerParaObject* pOutliner = pObj->GetOutlinerParaObject(); + if (pOutliner) + { + EditTextObject& rEditTextObject + = const_cast(pOutliner->GetTextObject()); + for (sal_uInt16 n : aLangWhichId_EE) + { + rEditTextObject.RemoveCharAttribs(n); + } + } + } + } + else // Reset to default + { + for(sal_uInt16 n : aLangWhichId_EE) + pObj->ClearMergedItem( n ); + } +} + +static void lcl_setLanguage( const SdDrawDocument *pDoc, std::u16string_view rLanguage, bool bLanguageNone = false ) +{ + LanguageType nLang = SvtLanguageTable::GetLanguageType( rLanguage ); + + // Do it for SdDrawDocument->SetLanguage as well? + + sal_uInt16 nPageCount = pDoc->GetPageCount(); // Pick All Pages + for( sal_uInt16 nPage = 0; nPage < nPageCount; nPage++ ) + { + const SdrPage *pPage = pDoc->GetPage( nPage ); + for (const rtl::Reference& pObj : *pPage) + if (pObj->GetObjIdentifier() != SdrObjKind::Page) + lcl_setLanguageForObj( pObj.get(), nLang, bLanguageNone ); + } +} + +/** + * Handles SFX-Requests + */ +void DrawDocShell::Execute( SfxRequest& rReq ) +{ + if(mpViewShell && SlideShow::IsRunning( mpViewShell->GetViewShellBase() )) + { + // during a running presentation no slot will be executed + return; + } + + switch ( rReq.GetSlot() ) + { + case SID_SEARCH_ITEM: + { + const SfxItemSet* pReqArgs = rReq.GetArgs(); + + if (pReqArgs) + { + const SvxSearchItem & rSearchItem = pReqArgs->Get(SID_SEARCH_ITEM); + + SD_MOD()->SetSearchItem(std::unique_ptr(rSearchItem.Clone())); + } + + rReq.Done(); + } + break; + + case FID_SEARCH_ON: + { + // no action needed + rReq.Done(); + } + break; + + case FID_SEARCH_OFF: + { + if (mpViewShell) + { + sd::View* pView = mpViewShell->GetView(); + if (pView) + { + auto& rFunctionContext = pView->getSearchContext(); + rtl::Reference& xFuSearch(rFunctionContext.getFunctionSearch()); + + if (xFuSearch.is()) + { + // End Search&Replace in all docshells + SfxObjectShell* pFirstShell = SfxObjectShell::GetFirst(); + SfxObjectShell* pShell = pFirstShell; + + while (pShell) + { + auto pDrawDocShell = dynamic_cast(pShell); + if (pDrawDocShell) + pDrawDocShell->CancelSearching(); + + pShell = SfxObjectShell::GetNext(*pShell); + + if (pShell == pFirstShell) + pShell = nullptr; + } + + rFunctionContext.resetSearchFunction(); + Invalidate(); + rReq.Done(); + } + } + } + } + break; + + case FID_SEARCH_NOW: + { + const SfxItemSet* pReqArgs = rReq.GetArgs(); + + if (pReqArgs && mpViewShell) + { + sd::View* pView = mpViewShell->GetView(); + if (pView) + { + rtl::Reference & xFuSearch = pView->getSearchContext().getFunctionSearch(); + + if (!xFuSearch.is()) + { + xFuSearch = rtl::Reference( + FuSearch::createPtr(mpViewShell, + mpViewShell->GetActiveWindow(), + pView, mpDoc, rReq)); + + pView->getSearchContext().setSearchFunction(xFuSearch); + } + + if (xFuSearch.is()) + { + const SvxSearchItem& rSearchItem = pReqArgs->Get(SID_SEARCH_ITEM); + + SD_MOD()->SetSearchItem(std::unique_ptr(rSearchItem.Clone())); + xFuSearch->SearchAndReplace(&rSearchItem); + } + } + } + + rReq.Done(); + } + break; + + case SID_CLOSEDOC: + { + ExecuteSlot(rReq, SfxObjectShell::GetStaticInterface()); + } + break; + + case SID_GET_COLORLIST: + { + const SvxColorListItem* pColItem = GetItem( SID_COLOR_TABLE ); + const XColorListRef& pList = pColItem->GetColorList(); + rReq.SetReturnValue( OfaXColorListItem( SID_GET_COLORLIST, pList ) ); + } + break; + + case SID_VERSION: + { + ExecuteSlot( rReq, SfxObjectShell::GetStaticInterface() ); + } + break; + + case SID_HANGUL_HANJA_CONVERSION: + { + if( mpViewShell ) + { + rtl::Reference aFunc( FuHangulHanjaConversion::Create( mpViewShell, mpViewShell->GetActiveWindow(), mpViewShell->GetView(), mpDoc, rReq ) ); + static_cast< FuHangulHanjaConversion* >( aFunc.get() )->StartConversion( LANGUAGE_KOREAN, LANGUAGE_KOREAN, nullptr, i18n::TextConversionOption::CHARACTER_BY_CHARACTER, true ); + } + } + break; + + case SID_CHINESE_CONVERSION: + { + if( mpViewShell ) + { + rtl::Reference aFunc( FuHangulHanjaConversion::Create( mpViewShell, mpViewShell->GetActiveWindow(), mpViewShell->GetView(), mpDoc, rReq ) ); + static_cast< FuHangulHanjaConversion* >( aFunc.get() )->StartChineseConversion(); + } + } + break; + case SID_LANGUAGE_STATUS: + { + OUString aNewLangTxt; + const SfxStringItem* pItem = rReq.GetArg(SID_LANGUAGE_STATUS); + if (pItem) + aNewLangTxt = pItem->GetValue(); + + if (aNewLangTxt == "*" ) + { + // open the dialog "Tools/Options/Languages and Locales - General" + if (mpViewShell) + { + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateVclDialog( mpViewShell->GetFrameWeld(), SID_LANGUAGE_OPTIONS )); + pDlg->Execute(); + } + } + else + { + if( mpViewShell ) + { + // setting the new language... + if (!aNewLangTxt.isEmpty()) + { + static constexpr OUString aSelectionLangPrefix(u"Current_"_ustr); + static constexpr OUString aParagraphLangPrefix(u"Paragraph_"_ustr); + static constexpr OUString aDocumentLangPrefix(u"Default_"_ustr); + + bool bSelection = false; + bool bParagraph = false; + + SdDrawDocument* pDoc = mpViewShell->GetDoc(); + sal_Int32 nPos = -1; + if (-1 != (nPos = aNewLangTxt.indexOf( aDocumentLangPrefix ))) + { + aNewLangTxt = aNewLangTxt.replaceAt( nPos, aDocumentLangPrefix.getLength(), u"" ); + + if (aNewLangTxt == "LANGUAGE_NONE") + lcl_setLanguage( pDoc, u"", true ); + else if (aNewLangTxt == "RESET_LANGUAGES") + lcl_setLanguage( pDoc, u"" ); + else + lcl_setLanguage( pDoc, aNewLangTxt ); + } + else if (-1 != (nPos = aNewLangTxt.indexOf( aSelectionLangPrefix ))) + { + bSelection = true; + aNewLangTxt = aNewLangTxt.replaceAt( nPos, aSelectionLangPrefix.getLength(), u"" ); + } + else if (-1 != (nPos = aNewLangTxt.indexOf( aParagraphLangPrefix ))) + { + bParagraph = true; + aNewLangTxt = aNewLangTxt.replaceAt( nPos, aParagraphLangPrefix.getLength(), u"" ); + } + + if (bSelection || bParagraph) + { + SdrView* pSdrView = mpViewShell->GetDrawView(); + if (!pSdrView) + return; + + EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); + const LanguageType nLangToUse = SvtLanguageTable::GetLanguageType( aNewLangTxt ); + SvtScriptType nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLangToUse ); + + SfxItemSet aAttrs = rEditView.GetEditEngine()->GetEmptyItemSet(); + if (nScriptType == SvtScriptType::LATIN) + aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE ) ); + if (nScriptType == SvtScriptType::COMPLEX) + aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE_CTL ) ); + if (nScriptType == SvtScriptType::ASIAN) + aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE_CJK ) ); + ESelection aOldSel; + if (bParagraph) + { + ESelection aSel = rEditView.GetSelection(); + aOldSel = aSel; + aSel.nStartPos = 0; + aSel.nEndPos = EE_TEXTPOS_ALL; + rEditView.SetSelection( aSel ); + } + + rEditView.SetAttribs( aAttrs ); + if (bParagraph) + rEditView.SetSelection( aOldSel ); + } + + if ( pDoc->GetOnlineSpell() ) + { + pDoc->StartOnlineSpelling(); + } + } + } + } + Broadcast(SfxHint(SfxHintId::LanguageChanged)); + } + break; + case SID_SPELLCHECK_IGNORE_ALL: + { + if (!mpViewShell) + return; + SdrView* pSdrView = mpViewShell->GetDrawView(); + if (!pSdrView) + return; + + EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); + OUString sIgnoreText; + const SfxStringItem* pItem2 = rReq.GetArg(FN_PARAM_1); + if (pItem2) + sIgnoreText = pItem2->GetValue(); + + if(sIgnoreText == "Spelling") + { + ESelection aOldSel = rEditView.GetSelection(); + rEditView.SpellIgnoreWord(); + rEditView.SetSelection( aOldSel ); + } + } + break; + case SID_SPELLCHECK_APPLY_SUGGESTION: + { + if (!mpViewShell) + return; + SdrView* pSdrView = mpViewShell->GetDrawView(); + if (!pSdrView) + return; + + EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); + OUString sApplyText; + const SfxStringItem* pItem2 = rReq.GetArg(FN_PARAM_1); + if (pItem2) + sApplyText = pItem2->GetValue(); + + static constexpr OUString sSpellingRule(u"Spelling_"_ustr); + sal_Int32 nPos = 0; + if(-1 != (nPos = sApplyText.indexOf( sSpellingRule ))) + { + sApplyText = sApplyText.replaceAt(nPos, sSpellingRule.getLength(), u""); + rEditView.InsertText( sApplyText ); + } + } + break; + + case SID_NOTEBOOKBAR: + { + const SfxStringItem* pFile = rReq.GetArg( SID_NOTEBOOKBAR ); + + if ( mpViewShell ) + { + SfxBindings& rBindings( mpViewShell->GetFrame()->GetBindings() ); + + if ( sfx2::SfxNotebookBar::IsActive() ) + sfx2::SfxNotebookBar::ExecMethod( rBindings, pFile ? pFile->GetValue() : "" ); + else + sfx2::SfxNotebookBar::CloseMethod( rBindings ); + } + } + break; + + default: + break; + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/docshell/docshel4.cxx b/sd/source/ui/docshell/docshel4.cxx new file mode 100644 index 0000000000..742614d101 --- /dev/null +++ b/sd/source/ui/docshell/docshel4.cxx @@ -0,0 +1,994 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using ::sd::framework::FrameworkHelper; + +// PowerPoint-Filter +constexpr OUStringLiteral pFilterPowerPoint97( u"MS PowerPoint 97" ); +constexpr OUStringLiteral pFilterPowerPoint97Template( u"MS PowerPoint 97 Vorlage" ); +constexpr OUStringLiteral pFilterPowerPoint97AutoPlay( u"MS PowerPoint 97 AutoPlay" ); + +namespace sd { + +/** + * Creates (if necessary) and returns a SfxPrinter + */ +SfxPrinter* DrawDocShell::GetPrinter(bool bCreate) +{ + if (bCreate && !mpPrinter) + { + // create ItemSet with special pool area + auto pSet = std::make_unique>( GetPool() ); + // set PrintOptionsSet + SdOptionsPrintItem aPrintItem( SD_MOD()->GetSdOptions(mpDoc->GetDocumentType()) ); + SfxFlagItem aFlagItem( SID_PRINTER_CHANGESTODOC ); + SfxPrinterChangeFlags nFlags = + (aPrintItem.GetOptionsPrint().IsWarningSize() ? SfxPrinterChangeFlags::CHG_SIZE : SfxPrinterChangeFlags::NONE) | + (aPrintItem.GetOptionsPrint().IsWarningOrientation() ? SfxPrinterChangeFlags::CHG_ORIENTATION : SfxPrinterChangeFlags::NONE); + aFlagItem.SetValue( static_cast(nFlags) ); + + pSet->Put( aPrintItem ); + pSet->Put( SfxBoolItem( SID_PRINTER_NOTFOUND_WARN, aPrintItem.GetOptionsPrint().IsWarningPrinter() ) ); + pSet->Put( aFlagItem ); + + mpPrinter = VclPtr::Create(std::move(pSet)); + mbOwnPrinter = true; + + // set output quality + sal_uInt16 nQuality = aPrintItem.GetOptionsPrint().GetOutputQuality(); + + DrawModeFlags nMode = DrawModeFlags::Default; + // 1 == Grayscale, 2 == Black & White (with grayscale images) + if( nQuality == 1 ) + nMode = DrawModeFlags::GrayLine | DrawModeFlags::GrayFill | DrawModeFlags::GrayText | DrawModeFlags::GrayBitmap | DrawModeFlags::GrayGradient; + else if( nQuality == 2 ) + nMode = DrawModeFlags::BlackLine | DrawModeFlags::WhiteFill | DrawModeFlags::BlackText | DrawModeFlags::GrayBitmap | DrawModeFlags::WhiteGradient; + + mpPrinter->SetDrawMode( nMode ); + + MapMode aMM (mpPrinter->GetMapMode()); + aMM.SetMapUnit(MapUnit::Map100thMM); + mpPrinter->SetMapMode(aMM); + UpdateRefDevice(); + } + return mpPrinter; +} + +/** + * Set new SfxPrinter (transfer of ownership) + */ +void DrawDocShell::SetPrinter(SfxPrinter *pNewPrinter) +{ + if ( mpViewShell ) + { + ::sd::View* pView = mpViewShell->GetView(); + if ( pView->IsTextEdit() ) + pView->SdrEndTextEdit(); + } + + if ( mpPrinter && mbOwnPrinter && (mpPrinter.get() != pNewPrinter) ) + mpPrinter.disposeAndClear(); + + mpPrinter = pNewPrinter; + mbOwnPrinter = true; + if ( mpDoc->GetPrinterIndependentLayout() == css::document::PrinterIndependentLayout::DISABLED ) + UpdateFontList(); + UpdateRefDevice(); +} + +void DrawDocShell::UpdateFontList() +{ + mpFontList.reset(); + OutputDevice* pRefDevice = nullptr; + if ( mpDoc->GetPrinterIndependentLayout() == css::document::PrinterIndependentLayout::DISABLED ) + pRefDevice = GetPrinter(true); + else + pRefDevice = SD_MOD()->GetVirtualRefDevice(); + mpFontList.reset( new FontList(pRefDevice, nullptr) ); + SvxFontListItem aFontListItem( mpFontList.get(), SID_ATTR_CHAR_FONTLIST ); + PutItem( aFontListItem ); +} + +Printer* DrawDocShell::GetDocumentPrinter() +{ + return GetPrinter(false); +} + +void DrawDocShell::OnDocumentPrinterChanged(Printer* pNewPrinter) +{ + // if we already have a printer, see if it's the same + if( mpPrinter ) + { + // easy case + if( mpPrinter == pNewPrinter ) + return; + + // compare if it's the same printer with the same job setup + if( (mpPrinter->GetName() == pNewPrinter->GetName()) && + (mpPrinter->GetJobSetup() == pNewPrinter->GetJobSetup())) + return; + } + + SfxPrinter* const pSfxPrinter = dynamic_cast(pNewPrinter); + if (pSfxPrinter) + { + SetPrinter(pSfxPrinter); + + // container owns printer + mbOwnPrinter = false; + } +} + +void DrawDocShell::UpdateRefDevice() +{ + if( !mpDoc ) + return; + + // Determine the device for which the output will be formatted. + VclPtr< OutputDevice > pRefDevice; + switch (mpDoc->GetPrinterIndependentLayout()) + { + case css::document::PrinterIndependentLayout::DISABLED: + pRefDevice = mpPrinter.get(); + break; + + case css::document::PrinterIndependentLayout::ENABLED: + pRefDevice = SD_MOD()->GetVirtualRefDevice(); + break; + + default: + // We are confronted with an invalid or un-implemented + // layout mode. Use the printer as formatting device + // as a fall-back. + SAL_WARN( "sd", "DrawDocShell::UpdateRefDevice(): Unexpected printer layout mode"); + + pRefDevice = mpPrinter.get(); + break; + } + mpDoc->SetRefDevice( pRefDevice.get() ); + + SdOutliner* pOutl = mpDoc->GetOutliner( false ); + + if( pOutl ) + pOutl->SetRefDevice( pRefDevice ); + + SdOutliner* pInternalOutl = mpDoc->GetInternalOutliner( false ); + + if( pInternalOutl ) + pInternalOutl->SetRefDevice( pRefDevice ); +} + +/** + * Creates new document, opens streams + */ +bool DrawDocShell::InitNew( const css::uno::Reference< css::embed::XStorage >& xStorage ) +{ + bool bRet = SfxObjectShell::InitNew( xStorage ); + + ::tools::Rectangle aVisArea( Point(0, 0), Size(14100, 10000) ); + SetVisArea(aVisArea); + + if (bRet) + { + if( !mbSdDataObj ) + mpDoc->NewOrLoadCompleted(DocCreationMode::New); // otherwise calling + // NewOrLoadCompleted(NEW_LOADED) in + // SdDrawDocument::AllocModel() + } + return bRet; +} + +/** + * loads pools and document + */ +bool DrawDocShell::Load( SfxMedium& rMedium ) +{ + // If this is an ODF file being loaded, then by default, use legacy processing + // (if required, it will be overridden in *::ReadUserDataSequence()) + if (IsOwnStorageFormat(rMedium)) + { + mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::AnchoredTextOverflowLegacy, true); // for tdf#99729 + mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::LegacyFontwork, true); // for tdf#148000 + } + + bool bRet = false; + bool bStartPresentation = false; + ErrCode nError = ERRCODE_NONE; + + SfxItemSet& rSet = rMedium.GetItemSet(); + + if( ( SfxItemState::SET == rSet.GetItemState(SID_PREVIEW ) ) && rSet.Get( SID_PREVIEW ).GetValue() ) + { + mpDoc->SetStarDrawPreviewMode( true ); + } + + if( SfxItemState::SET == rSet.GetItemState(SID_DOC_STARTPRESENTATION)&& + rSet.Get( SID_DOC_STARTPRESENTATION ).GetValue() ) + { + bStartPresentation = true; + mpDoc->SetStartWithPresentation( true ); + } + + bRet = SfxObjectShell::Load( rMedium ); + if (bRet) + { + comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer(); + rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false); + bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError ); + } + + if( bRet ) + { + // for legacy markup in OOoXML filter, convert the animations now + EffectMigration::DocumentLoaded(*GetDoc()); + UpdateTablePointers(); + + // If we're an embedded OLE object, use tight bounds + // for our visArea. No point in showing the user lots of empty + // space. Had to remove the check for empty VisArea below, + // since XML load always sets a VisArea before. + //TODO/LATER: looks a little bit strange! + if( ( GetCreateMode() == SfxObjectCreateMode::EMBEDDED ) && SfxObjectShell::GetVisArea( ASPECT_CONTENT ).IsEmpty() ) + { + SdPage* pPage = mpDoc->GetSdPage( 0, PageKind::Standard ); + + if( pPage ) + SetVisArea( pPage->GetAllObjBoundRect() ); + } + + FinishedLoading(); + + const INetURLObject aUrl; + SfxObjectShell::SetAutoLoad( aUrl, 0, false ); + } + else + { + if( nError == ERRCODE_IO_BROKENPACKAGE ) + SetError(ERRCODE_IO_BROKENPACKAGE); + + // TODO/LATER: correct error handling?! + //pStore->SetError(SVSTREAM_WRONGVERSION); + else + SetError(ERRCODE_ABORT); + } + + // tell SFX to change viewshell when in preview mode + if( IsPreview() || bStartPresentation ) + { + GetMedium()->GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, bStartPresentation ? 1 : 5 ) ); + } + + return bRet; +} + +/** + * loads content for organizer + */ +bool DrawDocShell::LoadFrom( SfxMedium& rMedium ) +{ + std::unique_ptr pWait; + if( mpViewShell ) + pWait.reset(new weld::WaitObject(mpViewShell->GetFrameWeld())); + + mpDoc->NewOrLoadCompleted( DocCreationMode::New ); + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + + // TODO/LATER: nobody is interested in the error code?! + ErrCode nError = ERRCODE_NONE; + bool bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Organizer, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError ); + + // tell SFX to change viewshell when in preview mode + if( IsPreview() ) + { + GetMedium()->GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, 5 ) ); + } + + return bRet; +} + +/** + * load from 3rd party format + */ +bool DrawDocShell::ImportFrom(SfxMedium &rMedium, + uno::Reference const& xInsertPosition) +{ + const OUString aFilterName( rMedium.GetFilter()->GetFilterName() ); + if (aFilterName == "Impress MS PowerPoint 2007 XML" || + aFilterName == "Impress MS PowerPoint 2007 XML AutoPlay" || + aFilterName == "Impress MS PowerPoint 2007 XML VBA") + { + // As this is a MSFT format, we should use the "MS Compat" + // mode for spacing before and after paragraphs. + + // This is copied from what is done for .ppt import in + // ImplSdPPTImport::Import() in sd/source/filter/ppt/pptin.cxx + // in. We need to tell both the edit engine of the draw outliner, + // and the document, to do "summation of paragraphs". + SdrOutliner& rOutl = mpDoc->GetDrawOutliner(); + EEControlBits nControlWord = rOutl.GetEditEngine().GetControlWord(); + nControlWord |= EEControlBits::ULSPACESUMMATION; + const_cast(rOutl.GetEditEngine()).SetControlWord( nControlWord ); + + mpDoc->SetSummationOfParagraphs(); + } + + if (aFilterName == "Impress MS PowerPoint 2007 XML") + { + // This is a "MS Compact" mode for connectors. + // The Libreoffice uses bounding rectangle of connected shapes but + // MSO uses snap rectangle when calculate the edge track. + mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::ConnectorUseSnapRect, true); + + // compatibility flag for tdf#148966 + mpDoc->SetCompatibilityFlag(SdrCompatibilityFlag::IgnoreBreakAfterMultilineField, true); + } + + if (aFilterName == "Impress MS PowerPoint 2007 XML" || + aFilterName == "Impress MS PowerPoint 2007 XML AutoPlay" || + aFilterName == "Impress MS PowerPoint 2007 XML VBA" || + aFilterName == "Impress Office Open XML") + { + // We need to be able to set the default tab size for each text object. + // This is possible at the moment only for the whole document. See + // TextParagraphPropertiesContext constructor. So default tab width + // of the LibreOffice is 1270 but MSO is 2540 on general settings. + mpDoc->SetDefaultTabulator( 2540 ); + } + + const bool bRet = SfxObjectShell::ImportFrom(rMedium, xInsertPosition); + + SfxItemSet& rSet = rMedium.GetItemSet(); + if( SfxItemState::SET == rSet.GetItemState(SID_DOC_STARTPRESENTATION)&& + rSet.Get( SID_DOC_STARTPRESENTATION ).GetValue() ) + { + mpDoc->SetStartWithPresentation( true ); + + // tell SFX to change viewshell when in preview mode + if( IsPreview() ) + { + GetMedium()->GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, 1 ) ); + } + } + + return bRet; +} + +/** + * load from a foreign format + */ +bool DrawDocShell::ConvertFrom( SfxMedium& rMedium ) +{ + const OUString aFilterName( rMedium.GetFilter()->GetFilterName() ); + bool bRet = false; + bool bStartPresentation = false; + + SetWaitCursor( true ); + + SfxItemSet& rSet = rMedium.GetItemSet(); + if( ( SfxItemState::SET == rSet.GetItemState(SID_PREVIEW ) ) && rSet.Get( SID_PREVIEW ).GetValue() ) + { + mpDoc->SetStarDrawPreviewMode( true ); + } + + if( SfxItemState::SET == rSet.GetItemState(SID_DOC_STARTPRESENTATION)&& + rSet.Get( SID_DOC_STARTPRESENTATION ).GetValue() ) + { + bStartPresentation = true; + mpDoc->SetStartWithPresentation( true ); + } + + if( aFilterName == pFilterPowerPoint97 + || aFilterName == pFilterPowerPoint97Template + || aFilterName == pFilterPowerPoint97AutoPlay) + { + mpDoc->StopWorkStartupDelay(); + bRet = SdPPTFilter( rMedium, *this ).Import(); + } + else if (aFilterName.indexOf("impress8") >= 0 || + aFilterName.indexOf("draw8") >= 0) + { + // TODO/LATER: nobody is interested in the error code?! + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + ErrCode nError = ERRCODE_NONE; + bRet = SdXMLFilter( rMedium, *this ).Import( nError ); + + } + else if (aFilterName.indexOf("StarOffice XML (Draw)") >= 0 || + aFilterName.indexOf("StarOffice XML (Impress)") >= 0) + { + // TODO/LATER: nobody is interested in the error code?! + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + ErrCode nError = ERRCODE_NONE; + bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Normal, SOFFICE_FILEFORMAT_60 ).Import( nError ); + } + else if (aFilterName == "CGM - Computer Graphics Metafile") + { + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + bRet = SdCGMFilter( rMedium, *this ).Import(); + } + else if (aFilterName == "draw_pdf_import") + { + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + bRet = SdPdfFilter(rMedium, *this).Import(); + } + else + { + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + bRet = SdGRFFilter( rMedium, *this ).Import(); + } + + FinishedLoading(); + + // tell SFX to change viewshell when in preview mode + if( IsPreview() ) + { + GetMedium()->GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, 5 ) ); + } + SetWaitCursor( false ); + + // tell SFX to change viewshell when in preview mode + if( IsPreview() || bStartPresentation ) + { + GetMedium()->GetItemSet().Put( SfxUInt16Item( SID_VIEW_ID, bStartPresentation ? 1 : 5 ) ); + } + + return bRet; +} + +/** + * Writes pools and document to the open streams + */ +bool DrawDocShell::Save() +{ + mpDoc->StopWorkStartupDelay(); + + //TODO/LATER: why this?! + if( GetCreateMode() == SfxObjectCreateMode::STANDARD ) + SfxObjectShell::SetVisArea( ::tools::Rectangle() ); + + bool bRet = SfxObjectShell::Save(); + + if( bRet ) + bRet = SdXMLFilter( *GetMedium(), *this, SdXMLFilterMode::Normal, SotStorage::GetVersion( GetMedium()->GetStorage() ) ).Export(); + + return bRet; +} + +/** + * Writes pools and document to the provided storage + */ +bool DrawDocShell::SaveAs( SfxMedium& rMedium ) +{ + mpDoc->setDocAccTitle(OUString()); + if (SfxViewFrame* pFrame1 = SfxViewFrame::GetFirst(this)) + { + if (vcl::Window* pSysWin = pFrame1->GetWindow().GetSystemWindow()) + { + pSysWin->SetAccessibleName(OUString()); + } + } + mpDoc->StopWorkStartupDelay(); + + //With custom animation, if Outliner is modified, update text before saving + if( mpViewShell ) + { + SdPage* pPage = mpViewShell->getCurrentPage(); + if( pPage && pPage->getMainSequence()->getCount() ) + { + SdrObject* pObj = mpViewShell->GetView()->GetTextEditObject(); + SdrOutliner* pOutl = mpViewShell->GetView()->GetTextEditOutliner(); + if( pObj && pOutl && pOutl->IsModified() ) + { + std::optional pNewText = pOutl->CreateParaObject( 0, pOutl->GetParagraphCount() ); + pObj->SetOutlinerParaObject( std::move(pNewText) ); + pOutl->ClearModifyFlag(); + } + } + } + + //TODO/LATER: why this?! + if( GetCreateMode() == SfxObjectCreateMode::STANDARD ) + SfxObjectShell::SetVisArea( ::tools::Rectangle() ); + + bool bRet = SfxObjectShell::SaveAs( rMedium ); + + if( bRet ) + bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Export(); + + if( GetErrorIgnoreWarning() == ERRCODE_NONE ) + SetError(ERRCODE_NONE); + + return bRet; +} + +/** + * save to foreign format + */ +bool DrawDocShell::ConvertTo( SfxMedium& rMedium ) +{ + bool bRet = false; + + if( mpDoc->GetPageCount() ) + { + std::shared_ptr pMediumFilter = rMedium.GetFilter(); + const OUString aTypeName( pMediumFilter->GetTypeName() ); + std::unique_ptr xFilter; + + if( aTypeName.indexOf( "graphic_HTML" ) >= 0 ) + { + xFilter = std::make_unique(rMedium, *this); + } + else if( aTypeName.indexOf( "MS_PowerPoint_97" ) >= 0 ) + { + xFilter = std::make_unique(rMedium, *this); + static_cast(xFilter.get())->PreSaveBasic(); + } + else if ( aTypeName.indexOf( "CGM_Computer_Graphics_Metafile" ) >= 0 ) + { + xFilter = std::make_unique(rMedium, *this); + } + else if( aTypeName.indexOf( "draw8" ) >= 0 || + aTypeName.indexOf( "impress8" ) >= 0 ) + { + xFilter = std::make_unique(rMedium, *this); + } + else if( aTypeName.indexOf( "StarOffice_XML_Impress" ) >= 0 || + aTypeName.indexOf( "StarOffice_XML_Draw" ) >= 0 ) + { + xFilter = std::make_unique(rMedium, *this, SdXMLFilterMode::Normal, SOFFICE_FILEFORMAT_60); + } + else + { + xFilter = std::make_unique(rMedium, *this); + } + + if (xFilter) + { + if ( mpViewShell ) + { + ::sd::View* pView = mpViewShell->GetView(); + if ( pView->IsTextEdit() ) + pView->SdrEndTextEdit(); + } + + bRet = xFilter->Export(); + } + } + + return bRet; +} + +/** + * Reopen own streams to ensure that nobody else can prevent use from opening + * them. + */ +bool DrawDocShell::SaveCompleted( const css::uno::Reference< css::embed::XStorage >& xStorage ) +{ + bool bRet = false; + + if( SfxObjectShell::SaveCompleted(xStorage) ) + { + mpDoc->NbcSetChanged( false ); + + if( mpViewShell ) + { + if( dynamic_cast< OutlineViewShell *>( mpViewShell ) != nullptr ) + static_cast(mpViewShell->GetView()) + ->GetOutliner().ClearModifyFlag(); + + SdrOutliner* pOutl = mpViewShell->GetView()->GetTextEditOutliner(); + if( pOutl ) + { + SdrObject* pObj = mpViewShell->GetView()->GetTextEditObject(); + if( pObj ) + pObj->NbcSetOutlinerParaObject( pOutl->CreateParaObject() ); + + pOutl->ClearModifyFlag(); + } + } + + bRet = true; + + SfxViewFrame* pFrame = ( mpViewShell && mpViewShell->GetViewFrame() ) ? + mpViewShell->GetViewFrame() : + SfxViewFrame::Current(); + + if( pFrame ) + pFrame->GetBindings().Invalidate( SID_NAVIGATOR_STATE, true ); + } + return bRet; +} + +SfxStyleSheetBasePool* DrawDocShell::GetStyleSheetPool() +{ + return mpDoc->GetStyleSheetPool(); +} + +void DrawDocShell::GotoBookmark(std::u16string_view rBookmark) +{ + auto pDrawViewShell = dynamic_cast( mpViewShell ); + if (!pDrawViewShell) + return; + + ViewShellBase& rBase (mpViewShell->GetViewShellBase()); + + bool bIsMasterPage = false; + sal_uInt16 nPageNumber = SDRPAGE_NOTFOUND; + SdrObject* pObj = nullptr; + + static constexpr std::u16string_view sInteraction( u"action?" ); + if ( o3tl::starts_with(rBookmark, sInteraction ) ) + { + static constexpr std::u16string_view sJump( u"jump=" ); + if ( o3tl::starts_with(rBookmark.substr( sInteraction.size() ), sJump ) ) + { + std::u16string_view aDestination( rBookmark.substr( sInteraction.size() + sJump.size() ) ); + if ( o3tl::starts_with(aDestination, u"firstslide" ) ) + { + nPageNumber = 1; + } + else if ( o3tl::starts_with(aDestination, u"lastslide" ) ) + { + nPageNumber = mpDoc->GetPageCount() - 2; + } + else if ( o3tl::starts_with(aDestination, u"previousslide" ) ) + { + SdPage* pPage = pDrawViewShell->GetActualPage(); + nPageNumber = pPage->GetPageNum(); + nPageNumber = nPageNumber > 2 ? nPageNumber - 2 : SDRPAGE_NOTFOUND; + } + else if ( o3tl::starts_with(aDestination, u"nextslide" ) ) + { + SdPage* pPage = pDrawViewShell->GetActualPage(); + nPageNumber = pPage->GetPageNum() + 2; + if ( nPageNumber >= mpDoc->GetPageCount() ) + nPageNumber = SDRPAGE_NOTFOUND; + } + } + } + else + { + // Is the bookmark a page? + nPageNumber = mpDoc->GetPageByName( rBookmark, bIsMasterPage ); + + if (nPageNumber == SDRPAGE_NOTFOUND) + { + // Is the bookmark an object? + pObj = mpDoc->GetObj(rBookmark); + + if (pObj) + { + nPageNumber = pObj->getSdrPageFromSdrObject()->GetPageNum(); + } + } + } + if (nPageNumber != SDRPAGE_NOTFOUND) + { + // Jump to the bookmarked page. This is done in three steps. + + SdPage* pPage; + if (bIsMasterPage) + pPage = static_cast( mpDoc->GetMasterPage(nPageNumber) ); + else + pPage = static_cast( mpDoc->GetPage(nPageNumber) ); + + // 1.) Change the view shell to the edit view, the notes view, + // or the handout view. + PageKind eNewPageKind = pPage->GetPageKind(); + + if( (eNewPageKind != PageKind::Standard) && (mpDoc->GetDocumentType() == DocumentType::Draw) ) + return; + + if (eNewPageKind != pDrawViewShell->GetPageKind()) + { + // change work area + GetFrameView()->SetPageKind(eNewPageKind); + OUString sViewURL; + switch (eNewPageKind) + { + case PageKind::Standard: + sViewURL = FrameworkHelper::msImpressViewURL; + break; + case PageKind::Notes: + sViewURL = FrameworkHelper::msNotesViewURL; + break; + case PageKind::Handout: + sViewURL = FrameworkHelper::msHandoutViewURL; + break; + default: + break; + } + if (!sViewURL.isEmpty()) + { + std::shared_ptr pHelper ( + FrameworkHelper::Instance(rBase)); + pHelper->RequestView( + sViewURL, + FrameworkHelper::msCenterPaneURL); + pHelper->WaitForUpdate(); + + // Get the new DrawViewShell. + mpViewShell = pHelper->GetViewShell(FrameworkHelper::msCenterPaneURL).get(); + pDrawViewShell = dynamic_cast(mpViewShell); + } + else + { + pDrawViewShell = nullptr; + } + } + + if (pDrawViewShell != nullptr) + { + setEditMode(pDrawViewShell, bIsMasterPage); + + // Make the bookmarked page the current page. This is done + // by using the API because this takes care of all the + // little things to be done. Especially writing the view + // data to the frame view. + sal_uInt16 nSdPgNum = (nPageNumber - 1) / 2; + Reference xController (rBase.GetController(), UNO_QUERY); + if (xController.is()) + { + Reference xDrawPage (pPage->getUnoPage(), UNO_QUERY); + xController->setCurrentPage (xDrawPage); + } + else + { + // As a fall back switch to the page via the core. + DBG_ASSERT (xController.is(), + "DrawDocShell::GotoBookmark: can't switch page via API"); + pDrawViewShell->SwitchPage(nSdPgNum); + } + + // Do UnmarkAll here to stop the Navigator from reselecting the previously marked + // entry when a slide entry is selected. + pDrawViewShell->GetView()->UnmarkAll(); + if (pObj != nullptr) + { + // show and select object + if (vcl::Window* pWindow = pDrawViewShell->GetActiveWindow()) + pDrawViewShell->MakeVisible(pObj->GetSnapRect(), *pWindow); + pDrawViewShell->GetView()->MarkObj( + pObj, + pDrawViewShell->GetView()->GetSdrPageView()); + } + } + } + + if (SfxViewFrame* pViewFrame = (pDrawViewShell && pDrawViewShell->GetViewFrame()) + ? pDrawViewShell->GetViewFrame() + : SfxViewFrame::Current()) + { + SfxBindings& rBindings = pViewFrame->GetBindings(); + rBindings.Invalidate(SID_NAVIGATOR_STATE, true); + rBindings.Invalidate(SID_NAVIGATOR_PAGENAME); + } +} + +/** + * If it should become a document template. + */ +bool DrawDocShell::SaveAsOwnFormat( SfxMedium& rMedium ) +{ + + std::shared_ptr pFilter = rMedium.GetFilter(); + + if (pFilter->IsOwnTemplateFormat()) + { + /* now the StarDraw specialty: + we assign known layout names to the layout template of the first + page, we set the layout names of the affected masterpages and pages. + We inform all text objects of the affected standard, note and + masterpages about the name change. + */ + + OUString aLayoutName; + + SfxStringItem const * pLayoutItem = rMedium.GetItemSet().GetItemIfSet(SID_TEMPLATE_NAME, false); + if( pLayoutItem ) + { + aLayoutName = pLayoutItem->GetValue(); + } + else + { + INetURLObject aURL( rMedium.GetName() ); + aURL.removeExtension(); + aLayoutName = aURL.getName(); + } + + if (aLayoutName.isEmpty()) + { + sal_uInt32 nCount = mpDoc->GetMasterSdPageCount(PageKind::Standard); + for (sal_uInt32 i = 0; i < nCount; ++i) + { + OUString aOldPageLayoutName = mpDoc->GetMasterSdPage(i, PageKind::Standard)->GetLayoutName(); + OUString aNewLayoutName = aLayoutName; + // Don't add suffix for the first master page + if( i > 0 ) + aNewLayoutName += OUString::number(i); + + mpDoc->RenameLayoutTemplate(aOldPageLayoutName, aNewLayoutName); + } + } + } + + return SfxObjectShell::SaveAsOwnFormat(rMedium); +} + +void DrawDocShell::FillClass(SvGlobalName* pClassName, + SotClipboardFormatId* pFormat, + OUString* pFullTypeName, + sal_Int32 nFileFormat, + bool bTemplate /* = false */) const +{ + if (nFileFormat == SOFFICE_FILEFORMAT_60) + { + if ( meDocType == DocumentType::Draw ) + { + *pClassName = SvGlobalName(SO3_SDRAW_CLASSID_60); + *pFormat = SotClipboardFormatId::STARDRAW_60; + *pFullTypeName = SdResId(STR_GRAPHIC_DOCUMENT_FULLTYPE_60); + } + else + { + *pClassName = SvGlobalName(SO3_SIMPRESS_CLASSID_60); + *pFormat = SotClipboardFormatId::STARIMPRESS_60; + *pFullTypeName = SdResId(STR_IMPRESS_DOCUMENT_FULLTYPE_60); + } + } + else if (nFileFormat == SOFFICE_FILEFORMAT_8) + { + if ( meDocType == DocumentType::Draw ) + { + *pClassName = SvGlobalName(SO3_SDRAW_CLASSID_60); + *pFormat = bTemplate ? SotClipboardFormatId::STARDRAW_8_TEMPLATE : SotClipboardFormatId::STARDRAW_8; + *pFullTypeName = SdResId(STR_GRAPHIC_DOCUMENT_FULLTYPE_80); // HACK: method will be removed with new storage API + } + else + { + *pClassName = SvGlobalName(SO3_SIMPRESS_CLASSID_60); + *pFormat = bTemplate ? SotClipboardFormatId::STARIMPRESS_8_TEMPLATE : SotClipboardFormatId::STARIMPRESS_8; + *pFullTypeName = SdResId(STR_IMPRESS_DOCUMENT_FULLTYPE_80); // HACK: method will be removed with new storage API + } + } +} + +OutputDevice* DrawDocShell::GetDocumentRefDev() +{ + OutputDevice* pReferenceDevice = SfxObjectShell::GetDocumentRefDev (); + // Only when our parent does not have a reference device then we return + // our own. + if (pReferenceDevice == nullptr && mpDoc != nullptr) + pReferenceDevice = mpDoc->GetRefDevice (); + return pReferenceDevice; +} + +/** executes the SID_OPENDOC slot to let the framework open a document + with the given URL and this document as a referer */ +void DrawDocShell::OpenBookmark( const OUString& rBookmarkURL ) +{ + SfxStringItem aStrItem( SID_FILE_NAME, rBookmarkURL ); + SfxStringItem aReferer( SID_REFERER, GetMedium()->GetName() ); + const SfxPoolItem* ppArgs[] = { &aStrItem, &aReferer, nullptr }; + if (SfxViewFrame* pFrame = mpViewShell ? mpViewShell->GetViewFrame() : SfxViewFrame::Current()) + pFrame->GetBindings().Execute( SID_OPENHYPERLINK, ppArgs ); +} + +std::shared_ptr DrawDocShell::CreateDocumentInfoDialog(weld::Window* pParent, const SfxItemSet &rSet) +{ + std::shared_ptr xDlg = std::make_shared(pParent, rSet); + DrawDocShell* pDocSh = dynamic_cast(SfxObjectShell::Current()); + if( pDocSh == this ) + { + xDlg->AddFontTabPage(); + } + return xDlg; +} + +void DrawDocShell::setEditMode(DrawViewShell* pDrawViewShell, bool isMasterPage) +{ + // Set the edit mode to either the normal edit mode or the + // master page mode. + EditMode eNewEditMode = EditMode::Page; + if (isMasterPage) + { + eNewEditMode = EditMode::MasterPage; + } + + if (eNewEditMode != pDrawViewShell->GetEditMode()) + { + // Set EditMode + pDrawViewShell->ChangeEditMode(eNewEditMode, false); + } +} +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/docshell/docshell.cxx b/sd/source/ui/docshell/docshell.cxx new file mode 100644 index 0000000000..5ac592f80b --- /dev/null +++ b/sd/source/ui/docshell/docshell.cxx @@ -0,0 +1,507 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace sd; +#define ShellClass_DrawDocShell +#include + +SFX_IMPL_SUPERCLASS_INTERFACE(DrawDocShell, SfxObjectShell); + +void DrawDocShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterChildWindow(SvxSearchDialogWrapper::GetChildWindowId()); +} + +namespace sd { + +/** + * slotmaps and definitions of SFX + */ + +SFX_IMPL_OBJECTFACTORY( + DrawDocShell, + SvGlobalName(SO3_SIMPRESS_CLASSID), + "simpress" ) + +void DrawDocShell::Construct( bool bClipboard ) +{ + mbInDestruction = false; + SetSlotFilter(); // resets the filter + + mbOwnDocument = mpDoc == nullptr; + if( mbOwnDocument ) + mpDoc = new SdDrawDocument(meDocType, this); + + // The document has been created so we can call UpdateRefDevice() to set + // the document's ref device. + UpdateRefDevice(); + + SetBaseModel( new SdXImpressDocument( this, bClipboard ) ); + SetPool( &mpDoc->GetItemPool() ); + std::unique_ptr pUndoManager(new sd::UndoManager); + pUndoManager->SetDocShell(this); + mpUndoManager = std::move(pUndoManager); + + if (!utl::ConfigManager::IsFuzzing() + && officecfg::Office::Common::Undo::Steps::get() < 1) + { + mpUndoManager->EnableUndo(false); // tdf#108863 disable if 0 steps + } + mpDoc->SetSdrUndoManager( mpUndoManager.get() ); + mpDoc->SetSdrUndoFactory( new sd::UndoFactory ); + UpdateTablePointers(); + SetStyleFamily(SfxStyleFamily::Pseudo); +} + +DrawDocShell::DrawDocShell(SfxObjectCreateMode eMode, + bool bDataObject, + DocumentType eDocumentType) : + SfxObjectShell( eMode == SfxObjectCreateMode::INTERNAL ? SfxObjectCreateMode::EMBEDDED : eMode), + mpDoc(nullptr), + mpPrinter(nullptr), + mpViewShell(nullptr), + meDocType(eDocumentType), + mbSdDataObj(bDataObject), + mbOwnPrinter(false) +{ + Construct( eMode == SfxObjectCreateMode::INTERNAL ); +} + +DrawDocShell::DrawDocShell( SfxModelFlags nModelCreationFlags, bool bDataObject, DocumentType eDocumentType ) : + SfxObjectShell( nModelCreationFlags ), + mpDoc(nullptr), + mpPrinter(nullptr), + mpViewShell(nullptr), + meDocType(eDocumentType), + mbSdDataObj(bDataObject), + mbOwnPrinter(false) +{ + Construct( false ); +} + +DrawDocShell::DrawDocShell(SdDrawDocument* pDoc, SfxObjectCreateMode eMode, + bool bDataObject, + DocumentType eDocumentType) : + SfxObjectShell(eMode == SfxObjectCreateMode::INTERNAL ? SfxObjectCreateMode::EMBEDDED : eMode), + mpDoc(pDoc), + mpPrinter(nullptr), + mpViewShell(nullptr), + meDocType(eDocumentType), + mbSdDataObj(bDataObject), + mbOwnPrinter(false) +{ + Construct( eMode == SfxObjectCreateMode::INTERNAL ); +} + +DrawDocShell::~DrawDocShell() +{ + // Tell all listeners that the doc shell is about to be + // destroyed. This has been introduced for the PreviewRenderer to + // free its view (that uses the item poll of the doc shell) but + // may be useful in other places as well. + Broadcast(SfxHint(SfxHintId::Dying)); + + mbInDestruction = true; + + if (mpViewShell) + { + auto* pView = mpViewShell->GetView(); + if (pView) + { + auto & pSearchContext = pView->getSearchContext(); + pSearchContext.resetSearchFunction(); + } + } + + mpFontList.reset(); + + if( mpDoc ) + mpDoc->SetSdrUndoManager( nullptr ); + mpUndoManager.reset(); + + if (mbOwnPrinter) + mpPrinter.disposeAndClear(); + + if( mbOwnDocument ) + delete mpDoc; + + // that the navigator get informed about the disappearance of the document + SfxBoolItem aItem(SID_NAVIGATOR_INIT, true); + SfxViewFrame* pFrame = mpViewShell ? mpViewShell->GetFrame() : GetFrame(); + + if( !pFrame ) + pFrame = SfxViewFrame::GetFirst( this ); + + if( pFrame ) + { + pFrame->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_INIT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aItem }); + } +} + +void DrawDocShell::GetState(SfxItemSet &rSet) +{ + + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + + while ( nWhich ) + { + sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich) + ? GetPool().GetSlotId(nWhich) + : nWhich; + + switch ( nSlotId ) + { + case SID_ATTR_CHAR_FONTLIST: + rSet.Put( SvxFontListItem( mpFontList.get(), nSlotId ) ); + break; + + case SID_SEARCH_ITEM: + { + rSet.Put( *SD_MOD()->GetSearchItem() ); + } + break; + + case SID_CLOSEDOC: + GetSlotState(SID_CLOSEDOC, SfxObjectShell::GetInterface(), &rSet); + break; + + case SID_SEARCH_OPTIONS: + { + SearchOptionFlags nOpt = SearchOptionFlags::SEARCH | + SearchOptionFlags::WHOLE_WORDS | + SearchOptionFlags::BACKWARDS | + SearchOptionFlags::REG_EXP | + SearchOptionFlags::EXACT | + SearchOptionFlags::SIMILARITY | + SearchOptionFlags::SELECTION; + + if (!IsReadOnly()) + { + nOpt |= SearchOptionFlags::REPLACE; + nOpt |= SearchOptionFlags::REPLACE_ALL; + } + + rSet.Put(SfxUInt16Item(nWhich, static_cast(nOpt))); + } + break; + + case SID_VERSION: + { + GetSlotState( SID_VERSION, SfxObjectShell::GetInterface(), &rSet ); + } + break; + + case SID_CHINESE_CONVERSION: + case SID_HANGUL_HANJA_CONVERSION: + { + rSet.Put(SfxVisibilityItem(nWhich, SvtCJKOptions::IsAnyEnabled())); + } + break; + case SID_LANGUAGE_STATUS: + { + SdrObject* pObj = nullptr; + bool bLanguageFound = false; + OutlinerParaObject* pParaObj = nullptr; + LanguageType eLanguage( LANGUAGE_DONTKNOW ); + sal_uInt16 nCount = mpDoc->GetPageCount(); + for ( sal_uInt16 itPage = 0; itPage < nCount && !bLanguageFound; itPage++ ) + { + SdrObjListIter aListIter(mpDoc->GetPage(itPage), SdrIterMode::DeepWithGroups); + while ( aListIter.IsMore() && !bLanguageFound ) + { + pObj = aListIter.Next(); + if ( pObj ) + { + pParaObj = pObj->GetOutlinerParaObject(); + if ( pParaObj ) + { + SdrOutliner aOutliner(&mpDoc->GetPool(), OutlinerMode::TextObject); + aOutliner.SetText(*pParaObj); + eLanguage = aOutliner.GetLanguage(0, 0); + bLanguageFound = eLanguage != LANGUAGE_DONTKNOW; + } + } + } + } + + if ( eLanguage == LANGUAGE_DONTKNOW ) + { + eLanguage = mpDoc->GetLanguage( EE_CHAR_LANGUAGE ); + } + + OUString aLanguage = SvtLanguageTable::GetLanguageString(eLanguage); + if (comphelper::LibreOfficeKit::isActive()) + { + if (eLanguage == LANGUAGE_DONTKNOW) + { + aLanguage += ";-"; + } + else + { + aLanguage += ";" + LanguageTag(eLanguage).getBcp47(false); + } + } + rSet.Put(SfxStringItem(nWhich, aLanguage)); + } + break; + + case SID_NOTEBOOKBAR: + { + if (mpViewShell) + { + bool bImpress = mpDoc->GetDocumentType() == DocumentType::Impress; + bool bVisible = false; + if(bImpress) + { + bVisible = sfx2::SfxNotebookBar::StateMethod(mpViewShell->GetFrame()->GetBindings(), + u"modules/simpress/ui/"); + } + else + { + bVisible = sfx2::SfxNotebookBar::StateMethod(mpViewShell->GetFrame()->GetBindings(), + u"modules/sdraw/ui/"); + } + rSet.Put( SfxBoolItem( SID_NOTEBOOKBAR, bVisible ) ); + } + } + break; + + default: + break; + } + nWhich = aIter.NextWhich(); + } + + if (SfxViewFrame* pFrame = SfxViewFrame::Current()) + { + if (rSet.GetItemState(SID_RELOAD) != SfxItemState::UNKNOWN) + { + pFrame->GetSlotState(SID_RELOAD, + pFrame->GetInterface(), &rSet); + } + } +} + +void DrawDocShell::Activate( bool bMDI) +{ + if (bMDI) + { + ApplySlotFilter(); + mpDoc->StartOnlineSpelling(); + } +} + +void DrawDocShell::Deactivate( bool ) +{ +} + +SfxUndoManager* DrawDocShell::GetUndoManager() +{ + return mpUndoManager.get(); +} + +void DrawDocShell::UpdateTablePointers() +{ + PutItem( SvxColorListItem( mpDoc->GetColorList(), SID_COLOR_TABLE ) ); + PutItem( SvxGradientListItem( mpDoc->GetGradientList(), SID_GRADIENT_LIST ) ); + PutItem( SvxHatchListItem( mpDoc->GetHatchList(), SID_HATCH_LIST ) ); + PutItem( SvxBitmapListItem( mpDoc->GetBitmapList(), SID_BITMAP_LIST ) ); + PutItem( SvxPatternListItem( mpDoc->GetPatternList(), SID_PATTERN_LIST ) ); + PutItem( SvxDashListItem( mpDoc->GetDashList(), SID_DASH_LIST ) ); + PutItem( SvxLineEndListItem( mpDoc->GetLineEndList(), SID_LINEEND_LIST ) ); + + UpdateFontList(); +} + +void DrawDocShell::CancelSearching() +{ + if (mpViewShell) + { + auto* pView = mpViewShell->GetView(); + if (pView) + { + auto & pSearchContext = pView->getSearchContext(); + pSearchContext.resetSearchFunction(); + } + } +} + +/** + * apply configured slot filters + */ +void DrawDocShell::ApplySlotFilter() const +{ + SfxViewShell* pTestViewShell = SfxViewShell::GetFirst(); + + while( pTestViewShell ) + { + if( pTestViewShell->GetObjectShell() == this + && pTestViewShell->GetViewFrame().GetDispatcher() ) + { + SfxDispatcher* pDispatcher = pTestViewShell->GetViewFrame().GetDispatcher(); + + if( !mpFilterSIDs.empty() ) + pDispatcher->SetSlotFilter( mbFilterEnable ? SfxSlotFilterState::ENABLED : SfxSlotFilterState::DISABLED, mpFilterSIDs ); + else + pDispatcher->SetSlotFilter(); + + if( pDispatcher->GetBindings() ) + pDispatcher->GetBindings()->InvalidateAll( true ); + } + + pTestViewShell = SfxViewShell::GetNext( *pTestViewShell ); + } +} + +void DrawDocShell::SetModified( bool bSet /* = true */ ) +{ + SfxObjectShell::SetModified( bSet ); + + // change model state, too + // only set the changed state if modification is enabled + if( IsEnableSetModified() ) + { + if ( mpDoc ) + mpDoc->NbcSetChanged( bSet ); + + Broadcast( SfxHint( SfxHintId::DocChanged ) ); + } +} + +/** + * Callback for ExecuteSpellPopup() + */ +// ExecuteSpellPopup now handled by DrawDocShell. This is necessary +// to get hands on the outliner and the text object. +IMPL_LINK(DrawDocShell, OnlineSpellCallback, SpellCallbackInfo&, rInfo, void) +{ + SdrObject* pObj = nullptr; + SdrOutliner* pOutl = nullptr; + + if(GetViewShell()) + { + pOutl = GetViewShell()->GetView()->GetTextEditOutliner(); + pObj = GetViewShell()->GetView()->GetTextEditObject(); + } + + mpDoc->ImpOnlineSpellCallback(&rInfo, pObj, pOutl); +} + +void DrawDocShell::ClearUndoBuffer() +{ + // clear possible undo buffers of outliners + SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false); + while(pSfxViewFrame) + { + ViewShellBase* pViewShellBase = dynamic_cast< ViewShellBase* >( pSfxViewFrame->GetViewShell() ); + if( pViewShellBase ) + { + std::shared_ptr pViewSh( pViewShellBase->GetMainViewShell() ); + if( pViewSh ) + { + ::sd::View* pView = pViewSh->GetView(); + if( pView ) + { + pView->SdrEndTextEdit(); + sd::OutlineView* pOutlView = dynamic_cast< sd::OutlineView* >( pView ); + if( pOutlView ) + { + pOutlView->GetOutliner().GetUndoManager().Clear(); + } + } + } + } + pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false); + } + + SfxUndoManager* pUndoManager = GetUndoManager(); + if(pUndoManager && pUndoManager->GetUndoActionCount()) + pUndoManager->Clear(); +} + +std::shared_ptr DrawDocShell::GetThemeColors() +{ + auto pViewShell = dynamic_cast(GetViewShell()); + if (!pViewShell) + return {}; + + SdPage* pPage = pViewShell->getCurrentPage(); + auto pTheme = pPage->getSdrPageProperties().getTheme(); + if (!pPage->IsMasterPage()) + pTheme = pPage->TRG_GetMasterPage().getSdrPageProperties().getTheme(); + + if (!pTheme) + return {}; + + return pTheme->getColorSet(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/docshell/grdocsh.cxx b/sd/source/ui/docshell/grdocsh.cxx new file mode 100644 index 0000000000..f0f5af9562 --- /dev/null +++ b/sd/source/ui/docshell/grdocsh.cxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include + +#include +#include + +using namespace sd; +#define ShellClass_GraphicDocShell +#include + +namespace sd +{ +SFX_IMPL_SUPERCLASS_INTERFACE(GraphicDocShell, SfxObjectShell) + +void GraphicDocShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG); +} + +SFX_IMPL_OBJECTFACTORY(GraphicDocShell, SvGlobalName(SO3_SDRAW_CLASSID_60), "sdraw") + +GraphicDocShell::GraphicDocShell(SfxObjectCreateMode eMode) + : DrawDocShell(eMode, /*bDataObject*/ true, DocumentType::Draw) +{ + SetStyleFamily(SfxStyleFamily::Para); +} + +GraphicDocShell::GraphicDocShell(SfxModelFlags nModelCreationFlags) + : DrawDocShell(nModelCreationFlags, /*bDataObject*/ false, DocumentType::Draw) +{ + SetStyleFamily(SfxStyleFamily::Para); +} + +GraphicDocShell::~GraphicDocShell() {} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/docshell/sdclient.cxx b/sd/source/ui/docshell/sdclient.cxx new file mode 100644 index 0000000000..c0b7b38edb --- /dev/null +++ b/sd/source/ui/docshell/sdclient.cxx @@ -0,0 +1,191 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + +Client::Client(SdrOle2Obj* pObj, ViewShell* pViewShell, vcl::Window* pWindow) : + SfxInPlaceClient(pViewShell->GetViewShell(), pWindow, pObj->GetAspect() ), + mpViewShell(pViewShell), + pSdrOle2Obj(pObj) +{ + SetObject( pObj->GetObjRef() ); + DBG_ASSERT( GetObject().is(), "No object connected!" ); +} + +Client::~Client() +{ +} + +/** + * If IP active, then we get this request to increase the visible section of the + * object. + */ +void Client::RequestNewObjectArea( ::tools::Rectangle& aObjRect ) +{ + ::sd::View* pView = mpViewShell->GetView(); + + bool bSizeProtect = false; + bool bPosProtect = false; + + const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + // no need to check for changes, this method is called only if the area really changed + bSizeProtect = pObj->IsResizeProtect(); + bPosProtect = pObj->IsMoveProtect(); + } + + ::tools::Rectangle aOldRect = GetObjArea(); + if ( bPosProtect ) + aObjRect.SetPos( aOldRect.TopLeft() ); + + if ( bSizeProtect ) + aObjRect.SetSize( aOldRect.GetSize() ); + + ::tools::Rectangle aWorkArea( pView->GetWorkArea() ); + if ( aWorkArea.Contains(aObjRect) || bPosProtect || aObjRect == aOldRect ) + return; + + // correct position + Point aPos = aObjRect.TopLeft(); + Size aSize = aObjRect.GetSize(); + Point aWorkAreaTL = aWorkArea.TopLeft(); + Point aWorkAreaBR = aWorkArea.BottomRight(); + + aPos.setX( std::max(aPos.X(), aWorkAreaTL.X()) ); + aPos.setX( std::min(aPos.X(), aWorkAreaBR.X()-aSize.Width()) ); + aPos.setY( std::max(aPos.Y(), aWorkAreaTL.Y()) ); + aPos.setY( std::min(aPos.Y(), aWorkAreaBR.Y()-aSize.Height()) ); + + aObjRect.SetPos(aPos); +} + +void Client::ObjectAreaChanged() +{ + ::sd::View* pView = mpViewShell->GetView(); + const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); + if (rMarkList.GetMarkCount() != 1) + return; + + SdrMark* pMark = rMarkList.GetMark(0); + SdrOle2Obj* pObj = dynamic_cast< SdrOle2Obj* >(pMark->GetMarkedSdrObj()); + + if(!pObj) + return; + + // no need to check for changes, this method is called only if the area really changed + ::tools::Rectangle aNewRectangle(GetScaledObjArea()); + + // #i118524# if sheared/rotated, center to non-rotated LogicRect + pObj->setSuppressSetVisAreaSize(true); + + if(pObj->GetGeoStat().m_nRotationAngle || pObj->GetGeoStat().m_nShearAngle) + { + pObj->SetLogicRect( aNewRectangle ); + + const ::tools::Rectangle& rBoundRect = pObj->GetCurrentBoundRect(); + const Point aDelta(aNewRectangle.Center() - rBoundRect.Center()); + + aNewRectangle.Move(aDelta.X(), aDelta.Y()); + } + + pObj->SetLogicRect( aNewRectangle ); + pObj->setSuppressSetVisAreaSize(false); +} + +void Client::ViewChanged() +{ + if ( GetAspect() == embed::Aspects::MSOLE_ICON ) + { + // the iconified object seems not to need such a scaling handling + // since the replacement image and the size a completely controlled by the container + // TODO/LATER: when the icon exchange is implemented the scaling handling might be required again here + + pSdrOle2Obj->ActionChanged(); // draw needs it to remove lines in slide preview + return; + } + + //TODO/LATER: should we try to avoid the recalculation of the visareasize + //if we know that it didn't change? + if (!mpViewShell->GetActiveWindow()) + return; + + ::sd::View* pView = mpViewShell->GetView(); + if (!pView) + return; + + // Do not recalculate the visareasize if the embedded object is opening in a new window. + if (!IsObjectInPlaceActive()) + { + pSdrOle2Obj->BroadcastObjectChange(); + return; + } + + ::tools::Rectangle aLogicRect( pSdrOle2Obj->GetLogicRect() ); + Size aLogicSize( aLogicRect.GetWidth(), aLogicRect.GetHeight() ); + + if( pSdrOle2Obj->IsChart() ) + { + //charts never should be stretched see #i84323# for example + pSdrOle2Obj->SetLogicRect( ::tools::Rectangle( aLogicRect.TopLeft(), aLogicSize ) ); + pSdrOle2Obj->BroadcastObjectChange(); + return; + } + + // TODO/LEAN: maybe we can do this without requesting the VisualArea? + // working with the visual area might need running state, so the object may switch itself to this state + MapMode aMap100( MapUnit::Map100thMM ); + ::tools::Rectangle aVisArea; + Size aSize = pSdrOle2Obj->GetOrigObjSize( &aMap100 ); + + aVisArea.SetSize( aSize ); + Size aScaledSize( static_cast< ::tools::Long >( GetScaleWidth() * Fraction( aVisArea.GetWidth() ) ), + static_cast< ::tools::Long >( GetScaleHeight() * Fraction( aVisArea.GetHeight() ) ) ); + + // react to the change if the difference is bigger than one pixel + Size aPixelDiff = + Application::GetDefaultDevice()->LogicToPixel( + Size( aLogicRect.GetWidth() - aScaledSize.Width(), + aLogicRect.GetHeight() - aScaledSize.Height() ), + aMap100 ); + if( aPixelDiff.Width() || aPixelDiff.Height() ) + { + pSdrOle2Obj->SetLogicRect( ::tools::Rectangle( aLogicRect.TopLeft(), aScaledSize ) ); + pSdrOle2Obj->BroadcastObjectChange(); + } + else + pSdrOle2Obj->ActionChanged(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueue.cxx b/sd/source/ui/framework/configuration/ChangeRequestQueue.cxx new file mode 100644 index 0000000000..0168c162b5 --- /dev/null +++ b/sd/source/ui/framework/configuration/ChangeRequestQueue.cxx @@ -0,0 +1,28 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ChangeRequestQueue.hxx" + +namespace sd::framework +{ +ChangeRequestQueue::ChangeRequestQueue() {} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueue.hxx b/sd/source/ui/framework/configuration/ChangeRequestQueue.hxx new file mode 100644 index 0000000000..e60b5b527e --- /dev/null +++ b/sd/source/ui/framework/configuration/ChangeRequestQueue.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +namespace com::sun::star::drawing::framework +{ +class XConfigurationChangeRequest; +} + +namespace sd::framework +{ +/** The ChangeRequestQueue stores the pending requests for changes to the + requested configuration. It is the task of the + ChangeRequestQueueProcessor to process these requests. +*/ +class ChangeRequestQueue + : public ::std::queue> +{ +public: + /** Create an empty queue. + */ + ChangeRequestQueue(); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx new file mode 100644 index 0000000000..c67ecbb77a --- /dev/null +++ b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx @@ -0,0 +1,181 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "debugtrace.hxx" +#include "ChangeRequestQueueProcessor.hxx" +#include "ConfigurationTracer.hxx" + +#include "ConfigurationUpdater.hxx" + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace { + +#if DEBUG_SD_CONFIGURATION_TRACE + +void TraceRequest (const Reference& rxRequest) +{ + Reference xNamed (rxRequest, UNO_QUERY); + if (xNamed.is()) + SAL_INFO("sd.fwk", __func__ << ": " << xNamed->getName()); +} + +#endif + +} // end of anonymous namespace + +namespace sd::framework { + +ChangeRequestQueueProcessor::ChangeRequestQueueProcessor ( + std::shared_ptr pConfigurationUpdater) + : mnUserEventId(nullptr), + mpConfigurationUpdater(std::move(pConfigurationUpdater)) +{ +} + +ChangeRequestQueueProcessor::~ChangeRequestQueueProcessor() +{ + if (mnUserEventId != nullptr) + Application::RemoveUserEvent(mnUserEventId); +} + +void ChangeRequestQueueProcessor::SetConfiguration ( + const Reference& rxConfiguration) +{ + ::osl::MutexGuard aGuard (maMutex); + + mxConfiguration = rxConfiguration; + StartProcessing(); +} + +void ChangeRequestQueueProcessor::AddRequest ( + const Reference& rxRequest) +{ + ::osl::MutexGuard aGuard (maMutex); + +#if DEBUG_SD_CONFIGURATION_TRACE + if (maQueue.empty()) + { + SAL_INFO("sd.fwk", __func__ << ": Adding requests to empty queue"); + ConfigurationTracer::TraceConfiguration( + mxConfiguration, "current configuration of queue processor"); + } + SAL_INFO("sd.fwk", __func__ << ": Adding request"); + TraceRequest(rxRequest); +#endif + + maQueue.push(rxRequest); + StartProcessing(); +} + +void ChangeRequestQueueProcessor::StartProcessing() +{ + ::osl::MutexGuard aGuard (maMutex); + + if (mnUserEventId == nullptr + && mxConfiguration.is() + && ! maQueue.empty()) + { + SAL_INFO("sd.fwk", __func__ << ": ChangeRequestQueueProcessor scheduling processing"); + mnUserEventId = Application::PostUserEvent( + LINK(this,ChangeRequestQueueProcessor,ProcessEvent)); + } +} + +IMPL_LINK_NOARG(ChangeRequestQueueProcessor, ProcessEvent, void*, void) +{ + ::osl::MutexGuard aGuard (maMutex); + + mnUserEventId = nullptr; + + ProcessOneEvent(); + + if ( ! maQueue.empty()) + { + // Schedule the processing of the next event. + StartProcessing(); + } +} + +void ChangeRequestQueueProcessor::ProcessOneEvent() +{ + ::osl::MutexGuard aGuard (maMutex); + + SAL_INFO("sd.fwk", __func__ << ": ProcessOneEvent"); + + if (!mxConfiguration.is() || maQueue.empty()) + return; + + // Get and remove the first entry from the queue. + Reference xRequest (maQueue.front()); + maQueue.pop(); + + // Execute the change request. + if (xRequest.is()) + { +#if DEBUG_SD_CONFIGURATION_TRACE + TraceRequest(xRequest); +#endif + xRequest->execute(mxConfiguration); + } + + if (!maQueue.empty()) + return; + + SAL_INFO("sd.fwk", __func__ << ": All requests are processed"); + // The queue is empty so tell the ConfigurationManager to update + // its state. + if (mpConfigurationUpdater != nullptr) + { +#if DEBUG_SD_CONFIGURATION_TRACE + ConfigurationTracer::TraceConfiguration ( + mxConfiguration, "updating to configuration"); +#endif + mpConfigurationUpdater->RequestUpdate(mxConfiguration); + } +} + +bool ChangeRequestQueueProcessor::IsEmpty() const +{ + return maQueue.empty(); +} + +void ChangeRequestQueueProcessor::ProcessUntilEmpty() +{ + while ( ! IsEmpty()) + ProcessOneEvent(); +} + +void ChangeRequestQueueProcessor::Clear() +{ + ::osl::MutexGuard aGuard (maMutex); + ChangeRequestQueue().swap(maQueue); +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx new file mode 100644 index 0000000000..823df7d8f8 --- /dev/null +++ b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ChangeRequestQueue.hxx" +#include + +#include + +#include + +namespace com::sun::star::drawing::framework +{ +class XConfiguration; +} +namespace com::sun::star::drawing::framework +{ +class XConfigurationChangeRequest; +} + +struct ImplSVEvent; + +namespace sd::framework +{ +class ConfigurationUpdater; + +/** The ChangeRequestQueueProcessor owns the ChangeRequestQueue and + processes the configuration change requests. + + When after processing one entry the queue is empty then the + XConfigurationController::update() method is called so that the changes + made to the local XConfiguration reference are reflected by the UI. + + Queue entries are processed asynchronously by calling PostUserEvent(). +*/ +class ChangeRequestQueueProcessor +{ +public: + /** The queue processor is created with a reference to an + ConfigurationController so that its UpdateConfiguration() method can + be called when the queue becomes empty. + */ + explicit ChangeRequestQueueProcessor(std::shared_ptr pUpdater); + ~ChangeRequestQueueProcessor(); + + /** Sets the configuration who will be changed by subsequent change + requests. This method should be called only by the configuration + controller who owns the configuration. + */ + void SetConfiguration( + const css::uno::Reference& rxConfiguration); + + /** The given request is appended to the end of the queue and will + eventually be processed when all other entries in front of it have + been processed. + */ + void AddRequest( + const css::uno::Reference& rxRequest); + + /** Returns when the queue is empty. + */ + bool IsEmpty() const; + + /** Process all events in the queue synchronously. + +

This method is typically called when the framework is shut down + to establish an empty configuration.

+ */ + void ProcessUntilEmpty(); + + /** Process the first event in queue. + */ + void ProcessOneEvent(); + + /** Remove all events from the queue. + +

This method is typically called when the framework is shut down + to avoid the processing of still pending activation requests.

+ */ + void Clear(); + +private: + mutable ::osl::Mutex maMutex; + + ChangeRequestQueue maQueue; + + /** The id returned by the last PostUserEvent() call. This id is stored + so that a pending user event can be removed when the queue processor + is destroyed. + */ + ImplSVEvent* mnUserEventId; + + css::uno::Reference mxConfiguration; + + std::shared_ptr mpConfigurationUpdater; + + /** Initiate the processing of the entries in the queue. The actual + processing starts asynchronously. + */ + void StartProcessing(); + + /** Callback function for the PostUserEvent() call. + */ + DECL_LINK(ProcessEvent, void*, void); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/Configuration.cxx b/sd/source/ui/framework/configuration/Configuration.cxx new file mode 100644 index 0000000000..56ade027b8 --- /dev/null +++ b/sd/source/ui/framework/configuration/Configuration.cxx @@ -0,0 +1,285 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::sd::framework::FrameworkHelper; + +namespace { +/** Use the XResourceId::compareTo() method to implement a compare operator + for STL containers. +*/ +class XResourceIdLess +{ +public: + bool operator () (const Reference& rId1, const Reference& rId2) const + { + return rId1->compareTo(rId2) == -1; + } +}; + +} // end of anonymous namespace + +namespace sd::framework { + +class Configuration::ResourceContainer + : public ::std::set, XResourceIdLess> +{ +public: + ResourceContainer() {} +}; + +//===== Configuration ========================================================= + +Configuration::Configuration ( + const Reference& rxBroadcaster, + bool bBroadcastRequestEvents) + : mpResourceContainer(new ResourceContainer()), + mxBroadcaster(rxBroadcaster), + mbBroadcastRequestEvents(bBroadcastRequestEvents) +{ +} + +Configuration::Configuration ( + const Reference& rxBroadcaster, + bool bBroadcastRequestEvents, + const ResourceContainer& rResourceContainer) + : mpResourceContainer(new ResourceContainer(rResourceContainer)), + mxBroadcaster(rxBroadcaster), + mbBroadcastRequestEvents(bBroadcastRequestEvents) +{ +} + +Configuration::~Configuration() +{ +} + +void Configuration::disposing(std::unique_lock&) +{ + mpResourceContainer->clear(); + mxBroadcaster = nullptr; +} + +//----- XConfiguration -------------------------------------------------------- + +void SAL_CALL Configuration::addResource (const Reference& rxResourceId) +{ + ThrowIfDisposed(); + + if ( ! rxResourceId.is() || rxResourceId->getResourceURL().isEmpty()) + throw css::lang::IllegalArgumentException(); + + if (mpResourceContainer->insert(rxResourceId).second) + { + SAL_INFO("sd.fwk", __func__ << ": Configuration::addResource() " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + PostEvent(rxResourceId, true); + } +} + +void SAL_CALL Configuration::removeResource (const Reference& rxResourceId) +{ + ThrowIfDisposed(); + + if ( ! rxResourceId.is() || rxResourceId->getResourceURL().isEmpty()) + throw css::lang::IllegalArgumentException(); + + ResourceContainer::iterator iResource (mpResourceContainer->find(rxResourceId)); + if (iResource != mpResourceContainer->end()) + { + SAL_INFO("sd.fwk", __func__ << ": Configuration::removeResource() " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + PostEvent(rxResourceId,false); + mpResourceContainer->erase(iResource); + } +} + +Sequence > SAL_CALL Configuration::getResources ( + const Reference& rxAnchorId, + const OUString& rsResourceURLPrefix, + AnchorBindingMode eMode) +{ + std::unique_lock aGuard (m_aMutex); + ThrowIfDisposed(); + + const bool bFilterResources (!rsResourceURLPrefix.isEmpty()); + + // Collect the matching resources in a vector. + ::std::vector > aResources; + for (const auto& rxResource : *mpResourceContainer) + { + if ( ! rxResource->isBoundTo(rxAnchorId,eMode)) + continue; + + if (bFilterResources) + { + // Apply the given resource prefix as filter. + + // Make sure that the resource is bound directly to the anchor. + if (eMode != AnchorBindingMode_DIRECT + && ! rxResource->isBoundTo(rxAnchorId, AnchorBindingMode_DIRECT)) + { + continue; + } + + // Make sure that the resource URL matches the given prefix. + if ( ! rxResource->getResourceURL().match(rsResourceURLPrefix)) + { + continue; + } + } + + aResources.push_back(rxResource); + } + + return comphelper::containerToSequence(aResources); +} + +sal_Bool SAL_CALL Configuration::hasResource (const Reference& rxResourceId) +{ + std::unique_lock aGuard (m_aMutex); + ThrowIfDisposed(); + + return rxResourceId.is() + && mpResourceContainer->find(rxResourceId) != mpResourceContainer->end(); +} + +//----- XCloneable ------------------------------------------------------------ + +Reference SAL_CALL Configuration::createClone() +{ + std::unique_lock aGuard (m_aMutex); + ThrowIfDisposed(); + + return new Configuration( + mxBroadcaster, + mbBroadcastRequestEvents, + *mpResourceContainer); +} + +//----- XNamed ---------------------------------------------------------------- + +OUString SAL_CALL Configuration::getName() +{ + std::unique_lock aGuard (m_aMutex); + OUStringBuffer aString; + + if (m_bDisposed) + aString.append("DISPOSED "); + aString.append("Configuration["); + + ResourceContainer::const_iterator iResource; + for (iResource=mpResourceContainer->begin(); + iResource!=mpResourceContainer->end(); + ++iResource) + { + if (iResource != mpResourceContainer->begin()) + aString.append(", "); + aString.append(FrameworkHelper::ResourceIdToString(*iResource)); + } + aString.append("]"); + + return aString.makeStringAndClear(); +} + +void SAL_CALL Configuration::setName (const OUString&) +{ + // ignored. +} + +void Configuration::PostEvent ( + const Reference& rxResourceId, + const bool bActivation) +{ + OSL_ASSERT(rxResourceId.is()); + + if (!mxBroadcaster.is()) + return; + + ConfigurationChangeEvent aEvent; + aEvent.ResourceId = rxResourceId; + if (bActivation) + if (mbBroadcastRequestEvents) + aEvent.Type = FrameworkHelper::msResourceActivationRequestEvent; + else + aEvent.Type = FrameworkHelper::msResourceActivationEvent; + else + if (mbBroadcastRequestEvents) + aEvent.Type = FrameworkHelper::msResourceDeactivationRequestEvent; + else + aEvent.Type = FrameworkHelper::msResourceDeactivationEvent; + aEvent.Configuration = this; + + mxBroadcaster->notifyEvent(aEvent); +} + +void Configuration::ThrowIfDisposed() const +{ + if (m_bDisposed) + { + throw lang::DisposedException ("Configuration object has already been disposed", + const_cast(static_cast(this))); + } +} + +bool AreConfigurationsEquivalent ( + const Reference& rxConfiguration1, + const Reference& rxConfiguration2) +{ + if (rxConfiguration1.is() != rxConfiguration2.is()) + return false; + if ( ! rxConfiguration1.is() && ! rxConfiguration2.is()) + return true; + + // Get the lists of resources from the two given configurations. + const Sequence > aResources1( + rxConfiguration1->getResources( + nullptr, OUString(), AnchorBindingMode_INDIRECT)); + const Sequence > aResources2( + rxConfiguration2->getResources( + nullptr, OUString(), AnchorBindingMode_INDIRECT)); + + // When the number of resources differ then the configurations can not + // be equivalent. + // Comparison of the two lists of resource ids relies on their + // ordering. + return std::equal(aResources1.begin(), aResources1.end(), aResources2.begin(), aResources2.end(), + [](const Reference& a, const Reference& b) { + if (a.is() && b.is()) + return a->compareTo(b) == 0; + return a.is() == b.is(); + }); +} + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationClassifier.cxx b/sd/source/ui/framework/configuration/ConfigurationClassifier.cxx new file mode 100644 index 0000000000..99fc1297d7 --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationClassifier.cxx @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ConfigurationClassifier.hxx" + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +ConfigurationClassifier::ConfigurationClassifier ( + const Reference& rxConfiguration1, + const Reference& rxConfiguration2) + : mxConfiguration1(rxConfiguration1), + mxConfiguration2(rxConfiguration2) +{ +} + +bool ConfigurationClassifier::Partition() +{ + maC1minusC2.clear(); + maC2minusC1.clear(); + + PartitionResources( + mxConfiguration1->getResources(nullptr, OUString(), AnchorBindingMode_DIRECT), + mxConfiguration2->getResources(nullptr, OUString(), AnchorBindingMode_DIRECT)); + + return !maC1minusC2.empty() || !maC2minusC1.empty(); +} + +void ConfigurationClassifier::PartitionResources ( + const css::uno::Sequence >& rS1, + const css::uno::Sequence >& rS2) +{ + ResourceIdVector aC1minusC2; + ResourceIdVector aC2minusC1; + ResourceIdVector aC1andC2; + + // Classify the resources in the configurations that are not bound to + // other resources. + ClassifyResources( + rS1, + rS2, + aC1minusC2, + aC2minusC1, + aC1andC2); + + SAL_INFO("sd.fwk", __func__ << ": copying resource ids to C1-C2"); + CopyResources(aC1minusC2, mxConfiguration1, maC1minusC2); + SAL_INFO("sd.fwk", __func__ << ": copying resource ids to C2-C1"); + CopyResources(aC2minusC1, mxConfiguration2, maC2minusC1); + + // Process the unique resources that belong to both configurations. + for (const auto& rxResource : aC1andC2) + { + PartitionResources( + mxConfiguration1->getResources(rxResource, OUString(), AnchorBindingMode_DIRECT), + mxConfiguration2->getResources(rxResource, OUString(), AnchorBindingMode_DIRECT)); + } +} + +void ConfigurationClassifier::ClassifyResources ( + const css::uno::Sequence >& rS1, + const css::uno::Sequence >& rS2, + ResourceIdVector& rS1minusS2, + ResourceIdVector& rS2minusS1, + ResourceIdVector& rS1andS2) +{ + // Find all elements in rS1 and place them in rS1minusS2 or rS1andS2 + // depending on whether they are in rS2 or not. + for (const Reference& rA1 : rS1) + { + bool bFound = std::any_of(rS2.begin(), rS2.end(), + [&rA1](const Reference& rA2) { + return rA1->getResourceURL() == rA2->getResourceURL(); }); + + if (bFound) + rS1andS2.push_back(rA1); + else + rS1minusS2.push_back(rA1); + } + + // Find all elements in rS2 that are not in rS1. The elements that are + // in both rS1 and rS2 have been handled above and are therefore ignored + // here. + for (const Reference& rA2 : rS2) + { + bool bFound = std::any_of(rS1.begin(), rS1.end(), + [&rA2](const Reference& rA1) { + return rA2->getResourceURL() == rA1->getResourceURL(); }); + + if ( ! bFound) + rS2minusS1.push_back(rA2); + } +} + +void ConfigurationClassifier::CopyResources ( + const ResourceIdVector& rSource, + const Reference& rxConfiguration, + ResourceIdVector& rTarget) +{ + // Copy all resources bound to the ones in aC1minusC2Unique to rC1minusC2. + for (const auto& rxResource : rSource) + { + const Sequence > aBoundResources ( + rxConfiguration->getResources( + rxResource, + OUString(), + AnchorBindingMode_INDIRECT)); + const sal_Int32 nL (aBoundResources.getLength()); + + rTarget.reserve(rTarget.size() + 1 + nL); + rTarget.push_back(rxResource); + + SAL_INFO("sd.fwk", __func__ << ": copying " << + FrameworkHelper::ResourceIdToString(rxResource)); + + for (const Reference& rBoundResource : aBoundResources) + { + rTarget.push_back(rBoundResource); + SAL_INFO("sd.fwk", __func__ << ": copying " << + FrameworkHelper::ResourceIdToString(rBoundResource)); + } + } +} + +#if DEBUG_SD_CONFIGURATION_TRACE + +void ConfigurationClassifier::TraceResourceIdVector ( + const char* pMessage, + const ResourceIdVector& rResources) +{ + + SAL_INFO("sd.fwk", __func__ << ": " << pMessage); + for (const auto& rxResource : rResources) + { + OUString sResource (FrameworkHelper::ResourceIdToString(rxResource)); + SAL_INFO("sd.fwk", __func__ << ": " << sResource); + } +} + +#endif + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationClassifier.hxx b/sd/source/ui/framework/configuration/ConfigurationClassifier.hxx new file mode 100644 index 0000000000..e9384713be --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationClassifier.hxx @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "debugtrace.hxx" +#include + +#include + +namespace com::sun::star::drawing::framework +{ +class XConfiguration; +} +namespace com::sun::star::drawing::framework +{ +class XResourceId; +} + +namespace sd::framework +{ +/** A ConfigurationClassifier object compares two configurations of + resources and gives access to the differences. It is used mainly when + changes to the current configuration have been requested and the various + resource controllers have to be supplied with the set of resources that + are to be activated or deactivated. +*/ +class ConfigurationClassifier +{ +public: + /** Create a new ConfigurationClassifier object that will compare the + two given configurations. + */ + ConfigurationClassifier( + const css::uno::Reference& rxConfiguration1, + const css::uno::Reference& rxConfiguration2); + + /** Calculate three lists of resource ids. These contain the resources + that belong to one configuration but not the other, or that belong + to both configurations. + @return + When the two configurations differ then return . When + they are equivalent then return . + */ + bool Partition(); + + typedef ::std::vector> + ResourceIdVector; + + /** Return the resources that belong to the configuration given as + rxConfiguration1 to the constructor but that do not belong to + rxConfiguration2. + @return + A reference to the, possibly empty, list of resources is + returned. This reference remains valid as long as the called + ConfigurationClassifier object stays alive. + */ + const ResourceIdVector& GetC1minusC2() const { return maC1minusC2; } + + /** Return the resources that belong to the configuration given as + rxConfiguration2 to the constructor but that do not belong to + rxConfiguration1. + @return + A reference to the, possibly empty, list of resources is + returned. This reference remains valid as long as the called + ConfigurationClassifier object stays alive. + */ + const ResourceIdVector& GetC2minusC1() const { return maC2minusC1; } + +#if DEBUG_SD_CONFIGURATION_TRACE + + /** Return the resources that belong to both the configurations that + where given to the constructor. + @return + A reference to the, possibly empty, list of resources is + returned. This reference remains valid as long as the called + ConfigurationClassifier object stays alive. + */ + const ResourceIdVector& GetC1andC2() const { return maC1andC2; } + + static void TraceResourceIdVector(const char* pMessage, const ResourceIdVector& rResources); + +#endif + +private: + css::uno::Reference mxConfiguration1; + css::uno::Reference mxConfiguration2; + + /** After the call to Classify() this vector holds all elements from + mxConfiguration1 that are not in mxConfiguration2. + */ + ResourceIdVector maC1minusC2; + + /** After the call to Classify() this vector holds all elements from + mxConfiguration2 that are not in mxConfiguration1. + */ + ResourceIdVector maC2minusC1; + + /** Put all the elements in the two given sequences of resource ids and + copy them into one of the resource id result vectors maC1minusC2, + maC2minusC1, and maC1andC2. This is done by using only the resource + URLs for classification. Therefore this method calls itself + recursively. + @param rS1 + One sequence of XResourceId objects. + @param rS2 + Another sequence of XResourceId objects. + */ + void PartitionResources( + const css::uno::Sequence>& rS1, + const css::uno::Sequence>& rS2); + + /** Compare the given sequences of resource ids and put their elements + in one of three vectors depending on whether an element belongs to + both sequences or to one but not the other. Note that only the + resource URLs of the XResourceId objects are used for the + classification. + @param rS1 + One sequence of XResourceId objects. + @param rS2 + Another sequence of XResourceId objects. + */ + static void ClassifyResources( + const css::uno::Sequence>& rS1, + const css::uno::Sequence>& rS2, + ResourceIdVector& rS1minusS2, ResourceIdVector& rS2minusS1, ResourceIdVector& rS1andS2); + + /** Copy the resources given in rSource to the list of resources + specified by rTarget. Resources bound to the ones in rSource, + either directly or indirectly, are copied as well. + @param rSource + All resources and the ones bound to them, either directly or + indirectly, are copied. + @param rxConfiguration + This configuration is used to determine the resources bound to + the ones in rSource. + @param rTarget + This list is filled with resources from rSource and the ones + bound to them. + */ + static void CopyResources( + const ResourceIdVector& rSource, + const css::uno::Reference& rxConfiguration, + ResourceIdVector& rTarget); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationController.cxx b/sd/source/ui/framework/configuration/ConfigurationController.cxx new file mode 100644 index 0000000000..15daf362f9 --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationController.cxx @@ -0,0 +1,522 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include "ConfigurationUpdater.hxx" +#include "ConfigurationControllerBroadcaster.hxx" +#include "ConfigurationTracer.hxx" +#include "GenericConfigurationChangeRequest.hxx" +#include "ConfigurationControllerResourceManager.hxx" +#include "ResourceFactoryManager.hxx" +#include "UpdateRequest.hxx" +#include "ChangeRequestQueueProcessor.hxx" +#include "ConfigurationClassifier.hxx" +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::sd::framework::FrameworkHelper; + +namespace sd::framework { + +//----- ConfigurationController::Implementation ------------------------------- + +class ConfigurationController::Implementation +{ +public: + Implementation ( + ConfigurationController& rController, + const rtl::Reference<::sd::DrawController>& rxController); + + rtl::Reference<::sd::DrawController> mxControllerManager; + + /** The Broadcaster class implements storing and calling of listeners. + */ + std::shared_ptr mpBroadcaster; + + /** The requested configuration which is modified (asynchronously) by + calls to requestResourceActivation() and + requestResourceDeactivation(). The mpConfigurationUpdater makes the + current configuration reflect the content of this one. + */ + css::uno::Reference mxRequestedConfiguration; + + std::shared_ptr mpResourceFactoryContainer; + + std::shared_ptr mpResourceManager; + + std::shared_ptr mpConfigurationUpdater; + + /** The queue processor owns the queue of configuration change request + objects and processes the objects. + */ + std::unique_ptr mpQueueProcessor; + + std::shared_ptr mpConfigurationUpdaterLock; + + sal_Int32 mnLockCount; +}; + +//===== ConfigurationController::Lock ========================================= + +ConfigurationController::Lock::Lock (const Reference& rxController) + : mxController(rxController) +{ + OSL_ASSERT(mxController.is()); + + if (mxController.is()) + mxController->lock(); +} + +ConfigurationController::Lock::~Lock() +{ + if (mxController.is()) + mxController->unlock(); +} + +//===== ConfigurationController =============================================== + +ConfigurationController::ConfigurationController(const rtl::Reference<::sd::DrawController>& rxController) + : ConfigurationControllerInterfaceBase(m_aMutex) + , mbIsDisposed(false) +{ + const SolarMutexGuard aSolarGuard; + + mpImplementation.reset(new Implementation( + *this, + rxController)); +} + +ConfigurationController::~ConfigurationController() noexcept +{ +} + +void SAL_CALL ConfigurationController::disposing() +{ + if (mpImplementation == nullptr) + return; + + SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::disposing"); + SAL_INFO("sd.fwk", __func__ << ": requesting empty configuration"); + // To destroy all resources an empty configuration is requested and then, + // synchronously, all resulting requests are processed. + mpImplementation->mpQueueProcessor->Clear(); + restoreConfiguration(new Configuration(this,false)); + mpImplementation->mpQueueProcessor->ProcessUntilEmpty(); + SAL_INFO("sd.fwk", __func__ << ": all requests processed"); + + // Now that all resources have been deactivated, mark the controller as + // disposed. + mbIsDisposed = true; + + // Release the listeners. + lang::EventObject aEvent; + aEvent.Source = uno::Reference(static_cast(this)); + + { + const SolarMutexGuard aSolarGuard; + mpImplementation->mpBroadcaster->DisposeAndClear(); + } + + mpImplementation->mpQueueProcessor.reset(); + mpImplementation->mxRequestedConfiguration = nullptr; + mpImplementation.reset(); +} + +void ConfigurationController::ProcessEvent() +{ + if (mpImplementation != nullptr) + { + OSL_ASSERT(mpImplementation->mpQueueProcessor != nullptr); + + mpImplementation->mpQueueProcessor->ProcessOneEvent(); + } +} + +void ConfigurationController::RequestSynchronousUpdate() +{ + if (mpImplementation == nullptr) + return; + if (mpImplementation->mpQueueProcessor == nullptr) + return; + mpImplementation->mpQueueProcessor->ProcessUntilEmpty(); +} + +//----- XConfigurationControllerBroadcaster ----------------------------------- + +void SAL_CALL ConfigurationController::addConfigurationChangeListener ( + const Reference& rxListener, + const OUString& rsEventType, + const Any& rUserData) +{ + ::osl::MutexGuard aGuard (m_aMutex); + + ThrowIfDisposed(); + OSL_ASSERT(mpImplementation != nullptr); + mpImplementation->mpBroadcaster->AddListener(rxListener, rsEventType, rUserData); +} + +void SAL_CALL ConfigurationController::removeConfigurationChangeListener ( + const Reference& rxListener) +{ + ::osl::MutexGuard aGuard (m_aMutex); + + ThrowIfDisposed(); + mpImplementation->mpBroadcaster->RemoveListener(rxListener); +} + +void SAL_CALL ConfigurationController::notifyEvent ( + const ConfigurationChangeEvent& rEvent) +{ + ThrowIfDisposed(); + mpImplementation->mpBroadcaster->NotifyListeners(rEvent); +} + +//----- XConfigurationController ---------------------------------------------- + +void SAL_CALL ConfigurationController::lock() +{ + OSL_ASSERT(mpImplementation != nullptr); + OSL_ASSERT(mpImplementation->mpConfigurationUpdater != nullptr); + + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + ++mpImplementation->mnLockCount; + if (mpImplementation->mpConfigurationUpdaterLock == nullptr) + mpImplementation->mpConfigurationUpdaterLock + = mpImplementation->mpConfigurationUpdater->GetLock(); +} + +void SAL_CALL ConfigurationController::unlock() +{ + ::osl::MutexGuard aGuard (m_aMutex); + + // Allow unlocking while the ConfigurationController is being disposed + // (but not when that is done and the controller is disposed.) + if (rBHelper.bDisposed) + ThrowIfDisposed(); + + OSL_ASSERT(mpImplementation->mnLockCount>0); + --mpImplementation->mnLockCount; + if (mpImplementation->mnLockCount == 0) + mpImplementation->mpConfigurationUpdaterLock.reset(); +} + +void SAL_CALL ConfigurationController::requestResourceActivation ( + const Reference& rxResourceId, + ResourceActivationMode eMode) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + // Check whether we are being disposed. This is handled differently + // then being completely disposed because the first thing disposing() + // does is to deactivate all remaining resources. This is done via + // regular methods which must not throw DisposedExceptions. Therefore + // we just return silently during that stage. + if (rBHelper.bInDispose) + { + SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::requestResourceActivation(): ignoring " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + return; + } + + SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::requestResourceActivation() " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + + if (!rxResourceId.is()) + return; + + if (eMode == ResourceActivationMode_REPLACE) + { + // Get a list of the matching resources and create deactivation + // requests for them. + const Sequence > aResourceList ( + mpImplementation->mxRequestedConfiguration->getResources( + rxResourceId->getAnchor(), + rxResourceId->getResourceTypePrefix(), + AnchorBindingMode_DIRECT)); + + for (const auto& rResource : aResourceList) + { + // Do not request the deactivation of the resource for which + // this method was called. Doing it would not change the + // outcome but would result in unnecessary work. + if (rxResourceId->compareTo(rResource) == 0) + continue; + + // Request the deactivation of a resource and all resources + // linked to it. + requestResourceDeactivation(rResource); + } + } + + Reference xRequest( + new GenericConfigurationChangeRequest( + rxResourceId, + GenericConfigurationChangeRequest::Activation)); + postChangeRequest(xRequest); +} + +void SAL_CALL ConfigurationController::requestResourceDeactivation ( + const Reference& rxResourceId) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::requestResourceDeactivation() " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + + if (!rxResourceId.is()) + return; + + // Request deactivation of all resources linked to the specified one + // as well. + const Sequence > aLinkedResources ( + mpImplementation->mxRequestedConfiguration->getResources( + rxResourceId, + OUString(), + AnchorBindingMode_DIRECT)); + for (const auto& rLinkedResource : aLinkedResources) + { + // We do not add deactivation requests directly but call this + // method recursively, so that when one time there are resources + // linked to linked resources, these are handled correctly, too. + requestResourceDeactivation(rLinkedResource); + } + + // Add a deactivation request for the specified resource. + Reference xRequest( + new GenericConfigurationChangeRequest( + rxResourceId, + GenericConfigurationChangeRequest::Deactivation)); + postChangeRequest(xRequest); +} + +Reference SAL_CALL ConfigurationController::getResource ( + const Reference& rxResourceId) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + ConfigurationControllerResourceManager::ResourceDescriptor aDescriptor ( + mpImplementation->mpResourceManager->GetResource(rxResourceId)); + return aDescriptor.mxResource; +} + +void SAL_CALL ConfigurationController::update() +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + if (mpImplementation->mpQueueProcessor->IsEmpty()) + { + // The queue is empty. Add another request that does nothing but + // asynchronously trigger a request for an update. + mpImplementation->mpQueueProcessor->AddRequest(new UpdateRequest()); + } + else + { + // The queue is not empty, so we rely on the queue processor to + // request an update automatically when the queue becomes empty. + } +} + +sal_Bool SAL_CALL ConfigurationController::hasPendingRequests() +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + return ! mpImplementation->mpQueueProcessor->IsEmpty(); +} + +void SAL_CALL ConfigurationController::postChangeRequest ( + const Reference& rxRequest) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + mpImplementation->mpQueueProcessor->AddRequest(rxRequest); +} + +Reference SAL_CALL ConfigurationController::getRequestedConfiguration() +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + if (mpImplementation->mxRequestedConfiguration.is()) + return Reference( + mpImplementation->mxRequestedConfiguration->createClone(), UNO_QUERY); + else + return Reference(); +} + +Reference SAL_CALL ConfigurationController::getCurrentConfiguration() +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + Reference xCurrentConfiguration( + mpImplementation->mpConfigurationUpdater->GetCurrentConfiguration()); + if (xCurrentConfiguration.is()) + return Reference(xCurrentConfiguration->createClone(), UNO_QUERY); + else + return Reference(); +} + +/** The given configuration is restored by generating the appropriate set of + activation and deactivation requests. +*/ +void SAL_CALL ConfigurationController::restoreConfiguration ( + const Reference& rxNewConfiguration) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + // We will probably be making a couple of activation and deactivation + // requests so lock the configuration controller and let it later update + // all changes at once. + std::shared_ptr pLock ( + mpImplementation->mpConfigurationUpdater->GetLock()); + + // Get lists of resources that are to be activated or deactivated. + Reference xCurrentConfiguration (mpImplementation->mxRequestedConfiguration); +#if OSL_DEBUG_LEVEL >=1 + SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::restoreConfiguration("); + ConfigurationTracer::TraceConfiguration(rxNewConfiguration, "requested configuration"); + ConfigurationTracer::TraceConfiguration(xCurrentConfiguration, "current configuration"); +#endif + ConfigurationClassifier aClassifier (rxNewConfiguration, xCurrentConfiguration); + aClassifier.Partition(); +#if DEBUG_SD_CONFIGURATION_TRACE + aClassifier.TraceResourceIdVector( + "requested but not current resources:\n", aClassifier.GetC1minusC2()); + aClassifier.TraceResourceIdVector( + "current but not requested resources:\n", aClassifier.GetC2minusC1()); + aClassifier.TraceResourceIdVector( + "requested and current resources:\n", aClassifier.GetC1andC2()); +#endif + + // Request the deactivation of resources that are not requested in the + // new configuration. + const ConfigurationClassifier::ResourceIdVector& rResourcesToDeactivate ( + aClassifier.GetC2minusC1()); + for (const auto& rxResource : rResourcesToDeactivate) + { + requestResourceDeactivation(rxResource); + } + + // Request the activation of resources that are requested in the + // new configuration but are not part of the current configuration. + const ConfigurationClassifier::ResourceIdVector& rResourcesToActivate ( + aClassifier.GetC1minusC2()); + for (const auto& rxResource : rResourcesToActivate) + { + requestResourceActivation(rxResource, ResourceActivationMode_ADD); + } + + pLock.reset(); +} + +//----- XResourceFactoryManager ----------------------------------------------- + +void SAL_CALL ConfigurationController::addResourceFactory( + const OUString& sResourceURL, + const Reference& rxResourceFactory) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + mpImplementation->mpResourceFactoryContainer->AddFactory(sResourceURL, rxResourceFactory); +} + +void SAL_CALL ConfigurationController::removeResourceFactoryForURL( + const OUString& sResourceURL) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + mpImplementation->mpResourceFactoryContainer->RemoveFactoryForURL(sResourceURL); +} + +void SAL_CALL ConfigurationController::removeResourceFactoryForReference( + const Reference& rxResourceFactory) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + mpImplementation->mpResourceFactoryContainer->RemoveFactoryForReference(rxResourceFactory); +} + +Reference SAL_CALL ConfigurationController::getResourceFactory ( + const OUString& sResourceURL) +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + return mpImplementation->mpResourceFactoryContainer->GetFactory(sResourceURL); +} + +void ConfigurationController::ThrowIfDisposed () const +{ + if (mbIsDisposed) + { + throw lang::DisposedException ("ConfigurationController object has already been disposed", + const_cast(static_cast(this))); + } + + if (mpImplementation == nullptr) + { + OSL_ASSERT(mpImplementation != nullptr); + throw RuntimeException("ConfigurationController not initialized", + const_cast(static_cast(this))); + } +} + +//===== ConfigurationController::Implementation =============================== + +ConfigurationController::Implementation::Implementation ( + ConfigurationController& rController, + const rtl::Reference<::sd::DrawController>& rxController) + : mxControllerManager(rxController, UNO_QUERY_THROW), + mpBroadcaster(std::make_shared(&rController)), + mxRequestedConfiguration(new Configuration(&rController, true)), + mpResourceFactoryContainer(std::make_shared(mxControllerManager)), + mpResourceManager( + std::make_shared(mpResourceFactoryContainer,mpBroadcaster)), + mpConfigurationUpdater( + std::make_shared(mpBroadcaster, mpResourceManager,mxControllerManager)), + mpQueueProcessor(new ChangeRequestQueueProcessor(mpConfigurationUpdater)), + mnLockCount(0) +{ + mpQueueProcessor->SetConfiguration(mxRequestedConfiguration); +} + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx new file mode 100644 index 0000000000..e5ee500f01 --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx @@ -0,0 +1,192 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ConfigurationControllerBroadcaster.hxx" +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +ConfigurationControllerBroadcaster::ConfigurationControllerBroadcaster ( + const Reference& rxController) + : mxConfigurationController(rxController) +{ +} + +void ConfigurationControllerBroadcaster::AddListener( + const Reference& rxListener, + const OUString& rsEventType, + const Any& rUserData) +{ + if ( ! rxListener.is()) + throw lang::IllegalArgumentException("invalid listener", + mxConfigurationController, + 0); + + maListenerMap.try_emplace(rsEventType); + + ListenerDescriptor aDescriptor; + aDescriptor.mxListener = rxListener; + aDescriptor.maUserData = rUserData; + maListenerMap[rsEventType].push_back(aDescriptor); +} + +void ConfigurationControllerBroadcaster::RemoveListener( + const Reference& rxListener) +{ + if ( ! rxListener.is()) + throw lang::IllegalArgumentException("invalid listener", + mxConfigurationController, + 0); + + ListenerList::iterator iList; + for (auto& rMap : maListenerMap) + { + iList = std::find_if(rMap.second.begin(), rMap.second.end(), + [&rxListener](const ListenerDescriptor& rList) { return rList.mxListener == rxListener; }); + if (iList != rMap.second.end()) + rMap.second.erase(iList); + } +} + +void ConfigurationControllerBroadcaster::NotifyListeners ( + const ListenerList& rList, + const ConfigurationChangeEvent& rEvent) +{ + // Create a local copy of the event in which the user data is modified + // for every listener. + ConfigurationChangeEvent aEvent (rEvent); + + for (const auto& rListener : rList) + { + try + { + aEvent.UserData = rListener.maUserData; + rListener.mxListener->notifyConfigurationChange(aEvent); + } + catch (const lang::DisposedException& rException) + { + // When the exception comes from the listener itself then + // unregister it. + if (rException.Context == rListener.mxListener) + RemoveListener(rListener.mxListener); + } + catch (const RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + } +} + +void ConfigurationControllerBroadcaster::NotifyListeners (const ConfigurationChangeEvent& rEvent) +{ + // Notify the specialized listeners. + ListenerMap::const_iterator iMap (maListenerMap.find(rEvent.Type)); + if (iMap != maListenerMap.end()) + { + // Create a local list of the listeners to avoid problems with + // concurrent changes and to be able to remove disposed listeners. + ListenerList aList (iMap->second.begin(), iMap->second.end()); + NotifyListeners(aList,rEvent); + } + + // Notify the universal listeners. + iMap = maListenerMap.find(OUString()); + if (iMap != maListenerMap.end()) + { + // Create a local list of the listeners to avoid problems with + // concurrent changes and to be able to remove disposed listeners. + ListenerList aList (iMap->second.begin(), iMap->second.end()); + NotifyListeners(aList,rEvent); + } +} + +void ConfigurationControllerBroadcaster::NotifyListeners ( + const OUString& rsEventType, + const Reference& rxResourceId, + const Reference& rxResourceObject) +{ + ConfigurationChangeEvent aEvent; + aEvent.Type = rsEventType; + aEvent.ResourceId = rxResourceId; + aEvent.ResourceObject = rxResourceObject; + try + { + NotifyListeners(aEvent); + } + catch (const lang::DisposedException&) + { + } +} + +void ConfigurationControllerBroadcaster::DisposeAndClear() +{ + lang::EventObject aEvent; + aEvent.Source = mxConfigurationController; + while (!maListenerMap.empty()) + { + ListenerMap::iterator iMap (maListenerMap.begin()); + if (iMap == maListenerMap.end()) + break; + + // When the first vector is empty then remove it from the map. + if (iMap->second.empty()) + { + maListenerMap.erase(iMap); + continue; + } + else + { + Reference xListener ( + iMap->second.front().mxListener ); + if (xListener.is()) + { + // Tell the listener that the configuration controller is + // being disposed and remove the listener (for all event + // types). + try + { + RemoveListener(xListener); + xListener->disposing(aEvent); + } + catch (const RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + } + else + { + // Remove just this reference to the listener. + iMap->second.erase(iMap->second.begin()); + } + } + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx new file mode 100644 index 0000000000..5dfd6843d3 --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +namespace com::sun::star::drawing::framework { class XConfigurationChangeListener; } +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XResource; } +namespace com::sun::star::drawing::framework { class XResourceId; } +namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; } + +namespace sd::framework { + +/** This class manages the set of XConfigurationChangeListeners and + calls them when the ConfigurationController wants to broadcast an + event. + + For every registered combination of listener and event type a user data + object is stored. This user data object is then given to the listener + whenever it is called for an event. With this the listener can use + a switch statement to handle different event types. +*/ +class ConfigurationControllerBroadcaster +{ +public: + /** The given controller is used as origin of thrown exceptions. + */ + explicit ConfigurationControllerBroadcaster ( + const css::uno::Reference< + css::drawing::framework::XConfigurationController>& rxController); + + /** Add a listener for one type of event. When one listener is + interested in more than one event type this method has to be called + once for every event type. Alternatively it can register as + universal listener that will be called for all event types. + @param rxListener + A valid reference to a listener. + @param rsEventType + The type of event that the listener will be called for. The + empty string is a special value in that the listener will be + called for all event types. + @param rUserData + This object is passed to the listener whenever it is called for + the specified event type. For different event types different + user data objects can be provided. + @throws IllegalArgumentException + when an empty listener reference is given. + */ + void AddListener( + const css::uno::Reference< + css::drawing::framework::XConfigurationChangeListener>& rxListener, + const OUString& rsEventType, + const css::uno::Any& rUserData); + + /** Remove all references to the given listener. When one listener has + been registered for more than one type of event then it is removed + for all of them. + @param rxListener + A valid reference to a listener. + @throws IllegalArgumentException + when an empty listener reference is given. + */ + void RemoveListener( + const css::uno::Reference< + css::drawing::framework::XConfigurationChangeListener>& rxListener); + + /** Broadcast the given event to all listeners that have been registered + for its type of event as well as all universal listeners. + + When calling a listener results in a DisposedException being thrown + the listener is unregistered automatically. + */ + void NotifyListeners ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent); + + /** This convenience variant of NotifyListeners create the event from + the given arguments. + */ + void NotifyListeners ( + const OUString& rsEventType, + const css::uno::Reference& rxResourceId, + const css::uno::Reference& rxResourceObject); + + /** Call all listeners and inform them that the + ConfigurationController is being disposed. When this method returns + the list of registered listeners is empty. Further calls to + RemoveListener() are not necessary but do not result in an error. + */ + void DisposeAndClear(); + +private: + css::uno::Reference mxConfigurationController; + class ListenerDescriptor + { + public: + css::uno::Reference mxListener; + css::uno::Any maUserData; + }; + typedef std::vector ListenerList; + typedef std::unordered_map + ListenerMap; + ListenerMap maListenerMap; + + /** Broadcast the given event to all listeners in the given list. + + When calling a listener results in a DisposedException being thrown + the listener is unregistered automatically. + */ + void NotifyListeners ( + const ListenerList& rList, + const css::drawing::framework::ConfigurationChangeEvent& rEvent); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx new file mode 100644 index 0000000000..cc04b9099a --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx @@ -0,0 +1,304 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ConfigurationControllerResourceManager.hxx" +#include "ConfigurationControllerBroadcaster.hxx" +#include "ResourceFactoryManager.hxx" +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +//===== ConfigurationControllerResourceManager ================================ + +ConfigurationControllerResourceManager::ConfigurationControllerResourceManager ( + std::shared_ptr pResourceFactoryContainer, + std::shared_ptr pBroadcaster) + : maResourceMap(ResourceComparator()), + mpResourceFactoryContainer(std::move(pResourceFactoryContainer)), + mpBroadcaster(std::move(pBroadcaster)) +{ +} + +ConfigurationControllerResourceManager::~ConfigurationControllerResourceManager() +{ +} + +ConfigurationControllerResourceManager::ResourceDescriptor + ConfigurationControllerResourceManager::GetResource ( + const Reference& rxResourceId) +{ + ::osl::MutexGuard aGuard (maMutex); + ResourceMap::const_iterator iResource (maResourceMap.find(rxResourceId)); + if (iResource != maResourceMap.end()) + return iResource->second; + else + return ResourceDescriptor(); +} + +void ConfigurationControllerResourceManager::ActivateResources ( + const ::std::vector >& rResources, + const Reference& rxConfiguration) +{ + ::osl::MutexGuard aGuard (maMutex); + // Iterate in normal order over the resources that are to be + // activated so that resources on which others depend are activated + // before the depending resources are activated. + for (const Reference& xResource : rResources) + ActivateResource(xResource, rxConfiguration); +} + +void ConfigurationControllerResourceManager::DeactivateResources ( + const ::std::vector >& rResources, + const Reference& rxConfiguration) +{ + ::osl::MutexGuard aGuard (maMutex); + // Iterate in reverse order over the resources that are to be + // deactivated so that resources on which others depend are deactivated + // only when the depending resources have already been deactivated. + ::std::for_each( + rResources.rbegin(), + rResources.rend(), + [&] (Reference const& xResource) { + return DeactivateResource(xResource, rxConfiguration); + } ); +} + +/* In this method we do following steps. + 1. Get the factory with which the resource will be created. + 2. Create the resource. + 3. Add the resource to the URL->Object map of the configuration + controller. + 4. Add the resource id to the current configuration. + 5. Notify listeners. +*/ +void ConfigurationControllerResourceManager::ActivateResource ( + const Reference& rxResourceId, + const Reference& rxConfiguration) +{ + if ( ! rxResourceId.is()) + { + OSL_ASSERT(rxResourceId.is()); + return; + } + + SAL_INFO("sd.fwk", __func__ << ": activating resource " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + + // 1. Get the factory. + const OUString sResourceURL (rxResourceId->getResourceURL()); + Reference xFactory (mpResourceFactoryContainer->GetFactory(sResourceURL)); + if ( ! xFactory.is()) + { + SAL_INFO("sd.fwk", __func__ << ": no factory found for " << sResourceURL); + return; + } + + try + { + // 2. Create the resource. + Reference xResource; + try + { + xResource = xFactory->createResource(rxResourceId); + } + catch (lang::DisposedException&) + { + // The factory is disposed and can be removed from the list + // of registered factories. + mpResourceFactoryContainer->RemoveFactoryForReference(xFactory); + } + catch (Exception&) {} + + if (xResource.is()) + { + SAL_INFO("sd.fwk", __func__ << ": successfully created"); + // 3. Add resource to URL->Object map. + AddResource(xResource, xFactory); + + // 4. Add resource id to current configuration. + rxConfiguration->addResource(rxResourceId); + + // 5. Notify the new resource to listeners of the ConfigurationController. + mpBroadcaster->NotifyListeners( + FrameworkHelper::msResourceActivationEvent, + rxResourceId, + xResource); + } + else + { + SAL_INFO("sd.fwk", __func__ << ": resource creation failed"); + } + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +/* In this method we do following steps. + 1. Remove the resource from the URL->Object map of the configuration + controller. + 2. Notify listeners that deactivation has started. + 3. Remove the resource id from the current configuration. + 4. Release the resource. + 5. Notify listeners about that deactivation is completed. +*/ +void ConfigurationControllerResourceManager::DeactivateResource ( + const Reference& rxResourceId, + const Reference& rxConfiguration) +{ + if ( ! rxResourceId.is()) + return; + +#if OSL_DEBUG_LEVEL >= 1 + bool bSuccess (false); +#endif + try + { + // 1. Remove resource from URL->Object map. + ResourceDescriptor aDescriptor (RemoveResource(rxResourceId)); + + if (aDescriptor.mxResource.is() && aDescriptor.mxResourceFactory.is()) + { + // 2. Notify listeners that the resource is being deactivated. + mpBroadcaster->NotifyListeners( + FrameworkHelper::msResourceDeactivationEvent, + rxResourceId, + aDescriptor.mxResource); + + // 3. Remove resource id from current configuration. + rxConfiguration->removeResource(rxResourceId); + + // 4. Release the resource. + try + { + aDescriptor.mxResourceFactory->releaseResource(aDescriptor.mxResource); + } + catch (const lang::DisposedException& rException) + { + if ( ! rException.Context.is() + || rException.Context == aDescriptor.mxResourceFactory) + { + // The factory is disposed and can be removed from the + // list of registered factories. + mpResourceFactoryContainer->RemoveFactoryForReference( + aDescriptor.mxResourceFactory); + } + } + +#if OSL_DEBUG_LEVEL >= 1 + bSuccess = true; +#endif + } + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + + // 5. Notify listeners that the resource is being deactivated. + mpBroadcaster->NotifyListeners( + FrameworkHelper::msResourceDeactivationEndEvent, + rxResourceId, + nullptr); + +#if OSL_DEBUG_LEVEL >= 1 + if (bSuccess) + SAL_INFO("sd.fwk", __func__ << ": successfully deactivated " << + FrameworkHelper::ResourceIdToString(rxResourceId)); + else + SAL_INFO("sd.fwk", __func__ << ": activating resource " << + FrameworkHelper::ResourceIdToString(rxResourceId) + << " failed"); +#endif +} + +void ConfigurationControllerResourceManager::AddResource ( + const Reference& rxResource, + const Reference& rxFactory) +{ + if ( ! rxResource.is()) + { + OSL_ASSERT(rxResource.is()); + return; + } + + // Add the resource to the resource container. + ResourceDescriptor aDescriptor; + aDescriptor.mxResource = rxResource; + aDescriptor.mxResourceFactory = rxFactory; + maResourceMap[rxResource->getResourceId()] = aDescriptor; + +#if OSL_DEBUG_LEVEL >= 2 + SAL_INFO("sd.fwk", __func__ << ": ConfigurationControllerResourceManager::AddResource(): added " << + FrameworkHelper::ResourceIdToString(rxResource->getResourceId()) << + " -> " << rxResource.get()); +#endif +} + +ConfigurationControllerResourceManager::ResourceDescriptor + ConfigurationControllerResourceManager::RemoveResource ( + const Reference& rxResourceId) +{ + ResourceDescriptor aDescriptor; + + ResourceMap::iterator iResource (maResourceMap.find(rxResourceId)); + if (iResource != maResourceMap.end()) + { +#if OSL_DEBUG_LEVEL >= 2 + SAL_INFO("sd.fwk", __func__ << ": ConfigurationControllerResourceManager::RemoveResource(): removing " << + FrameworkHelper::ResourceIdToString(rxResourceId) << + " -> " << &iResource); +#endif + + aDescriptor = iResource->second; + maResourceMap.erase(rxResourceId); + } + + return aDescriptor; +} + +//===== ConfigurationControllerResourceManager::ResourceComparator ============ + +bool ConfigurationControllerResourceManager::ResourceComparator::operator() ( + const Reference& rxId1, + const Reference& rxId2) const +{ + if (rxId1.is() && rxId2.is()) + return rxId1->compareTo(rxId2)<0; + else if (rxId1.is()) + return true; + else + return false; +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx new file mode 100644 index 0000000000..9839a0db3c --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfiguration; } +namespace com::sun::star::drawing::framework { class XResourceFactory; } +namespace com::sun::star::drawing::framework { class XResource; } +namespace com::sun::star::drawing::framework { class XResourceId; } + +namespace sd::framework { + +class ConfigurationControllerBroadcaster; +class ResourceFactoryManager; + +/** Manage the set of active resources. Activate and deactivate resources. +*/ +class ConfigurationControllerResourceManager +{ +public: + /** For every active resource both the resource itself as well as its + creating factory are remembered, so that on deactivation, the + resource can be deactivated by this factory. + */ + class ResourceDescriptor + { + public: + css::uno::Reference mxResource; + css::uno::Reference mxResourceFactory; + }; + + /** A new ResourceManager object is created with the resource factory + container for creating resources and the event broadcaster for + notifying ConfigurationChangeListeners of activated or deactivated + resources. + */ + ConfigurationControllerResourceManager ( + std::shared_ptr pResourceFactoryContainer, + std::shared_ptr pBroadcaster); + + ~ConfigurationControllerResourceManager(); + + /// Forbid copy construction and copy assignment + ConfigurationControllerResourceManager(const ConfigurationControllerResourceManager&) = delete; + ConfigurationControllerResourceManager& operator=(const ConfigurationControllerResourceManager&) = delete; + + /** Activate all the resources that are specified by resource ids in + rResources. The resource ids of activated resources are added to + the given configuration. Activated resources are notified to all + interested ConfigurationChangeListeners. + */ + void ActivateResources ( + const ::std::vector< + css::uno::Reference >& rResources, + const css::uno::Reference& rxConfiguration); + + /** Deactivate all the resources that are specified by resource ids in + rResources. The resource ids of deactivated resources are removed + from the given configuration. Activated resources are notified to all + interested ConfigurationChangeListeners. + */ + void DeactivateResources ( + const ::std::vector< + css::uno::Reference >& rResources, + const css::uno::Reference& rxConfiguration); + + /** Return the descriptor for the specified resource. + @return + When there is no active resource for the given resource id then + an empty descriptor is returned. + */ + ResourceDescriptor GetResource ( + const css::uno::Reference& rxResourceId); + +private: + osl::Mutex maMutex; + + class ResourceComparator + { + public: + bool operator() ( + const css::uno::Reference& rxId1, + const css::uno::Reference& rxId2) const; + }; + + typedef ::std::map< + css::uno::Reference, + ResourceDescriptor, + ResourceComparator> ResourceMap; + ResourceMap maResourceMap; + + std::shared_ptr mpResourceFactoryContainer; + + /** This broadcaster is used to notify the activation and deactivation + of resources. + */ + std::shared_ptr mpBroadcaster; + + void ActivateResource ( + const css::uno::Reference& rxResourceId, + const css::uno::Reference& rxConfiguration); + + void DeactivateResource ( + const css::uno::Reference& rxResourceId, + const css::uno::Reference& rxConfiguration); + + void AddResource ( + const css::uno::Reference& rxResource, + const css::uno::Reference& rxFactory); + + ResourceDescriptor RemoveResource ( + const css::uno::Reference& rxResourceId); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationTracer.cxx b/sd/source/ui/framework/configuration/ConfigurationTracer.cxx new file mode 100644 index 0000000000..68cc9fe9a1 --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationTracer.cxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ConfigurationTracer.hxx" + +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +void ConfigurationTracer::TraceConfiguration ( + const Reference& rxConfiguration, + const char* pMessage) +{ +#if OSL_DEBUG_LEVEL >=1 + SAL_INFO("sd.ui","" << pMessage << " at " << rxConfiguration.get() << " {"); + if (rxConfiguration.is()) + { + TraceBoundResources(rxConfiguration, nullptr, 0); + } + else + { + SAL_INFO("sd.ui"," empty"); + } + SAL_INFO("sd.ui","}"); +#else + (void)rxConfiguration; + (void)pMessage; +#endif +} + +#if OSL_DEBUG_LEVEL >=1 +void ConfigurationTracer::TraceBoundResources ( + const Reference& rxConfiguration, + const Reference& rxResourceId, + const int nIndentation) +{ + const Sequence > aResourceList ( + rxConfiguration->getResources(rxResourceId, OUString(), AnchorBindingMode_DIRECT)); + static constexpr OUStringLiteral sIndentation (u" "); + for (Reference const & resourceId : aResourceList) + { + OUString sLine (resourceId->getResourceURL()); + for (int i=0; i + +namespace com::sun::star::drawing::framework +{ +class XConfiguration; +} +namespace com::sun::star::drawing::framework +{ +class XResourceId; +} +namespace com::sun::star::uno +{ +template class Reference; +} + +namespace sd::framework +{ +/** Print debug information about configurations to the standard error + output channel. +*/ +class ConfigurationTracer +{ +public: + static void TraceConfiguration( + const css::uno::Reference& rxConfiguration, + const char* pMessage); +#if OSL_DEBUG_LEVEL >= 1 + static void TraceBoundResources( + const css::uno::Reference& rxConfiguration, + const css::uno::Reference& rxResourceId, + const int nIndentation); +#endif +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationUpdater.cxx b/sd/source/ui/framework/configuration/ConfigurationUpdater.cxx new file mode 100644 index 0000000000..feea95eacc --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationUpdater.cxx @@ -0,0 +1,378 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ConfigurationUpdater.hxx" +#include "ConfigurationTracer.hxx" +#include "ConfigurationClassifier.hxx" +#include "ConfigurationControllerBroadcaster.hxx" +#include "ConfigurationControllerResourceManager.hxx" +#include +#include +#include + +#include +#include +#include +#include +#include + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::sd::framework::FrameworkHelper; +using ::std::vector; + +namespace { +const sal_Int32 snShortTimeout (100); +const sal_Int32 snNormalTimeout (1000); +const sal_Int32 snLongTimeout (10000); +const sal_Int32 snShortTimeoutCountThreshold (1); +const sal_Int32 snNormalTimeoutCountThreshold (5); +} + +namespace sd::framework { + +//===== ConfigurationUpdaterLock ============================================== + +class ConfigurationUpdaterLock +{ +public: + explicit ConfigurationUpdaterLock (ConfigurationUpdater& rUpdater) + : mrUpdater(rUpdater) { mrUpdater.LockUpdates(); } + ~ConfigurationUpdaterLock() { mrUpdater.UnlockUpdates(); } +private: + ConfigurationUpdater& mrUpdater; +}; + +//===== ConfigurationUpdater ================================================== + +ConfigurationUpdater::ConfigurationUpdater ( + std::shared_ptr pBroadcaster, + std::shared_ptr pResourceManager, + const rtl::Reference<::sd::DrawController>& rxControllerManager) + : mpBroadcaster(std::move(pBroadcaster)), + mxCurrentConfiguration(Reference(new Configuration(nullptr, false))), + mbUpdatePending(false), + mbUpdateBeingProcessed(false), + mnLockCount(0), + maUpdateTimer("sd::ConfigurationUpdater maUpdateTimer"), + mnFailedUpdateCount(0), + mpResourceManager(std::move(pResourceManager)) +{ + // Prepare the timer that is started when after an update the current + // and the requested configuration differ. With the timer we try + // updates until the two configurations are the same. + maUpdateTimer.SetTimeout(snNormalTimeout); + maUpdateTimer.SetInvokeHandler(LINK(this,ConfigurationUpdater,TimeoutHandler)); + mxControllerManager = rxControllerManager; +} + +ConfigurationUpdater::~ConfigurationUpdater() +{ + maUpdateTimer.Stop(); +} + +void ConfigurationUpdater::RequestUpdate ( + const Reference& rxRequestedConfiguration) +{ + mxRequestedConfiguration = rxRequestedConfiguration; + + // Find out whether we really can update the configuration. + if (IsUpdatePossible()) + { + SAL_INFO("sd.fwk", __func__ << ": UpdateConfiguration start"); + + // Call UpdateConfiguration while that is possible and while someone + // set mbUpdatePending to true in the middle of it. + do + { + UpdateConfiguration(); + } + while (mbUpdatePending && IsUpdatePossible()); + } + else + { + mbUpdatePending = true; + SAL_INFO("sd.fwk", __func__ << ": scheduling update for later"); + } +} + +bool ConfigurationUpdater::IsUpdatePossible() const +{ + return ! mbUpdateBeingProcessed + && mxControllerManager.is() + && mnLockCount==0 + && mxRequestedConfiguration.is() + && mxCurrentConfiguration.is(); +} + +void ConfigurationUpdater::UpdateConfiguration() +{ + SAL_INFO("sd.fwk", __func__ << ": UpdateConfiguration update"); + SetUpdateBeingProcessed(true); + comphelper::ScopeGuard aScopeGuard ( + [this] () { return this->SetUpdateBeingProcessed(false); }); + + try + { + mbUpdatePending = false; + + CleanRequestedConfiguration(); + ConfigurationClassifier aClassifier(mxRequestedConfiguration, mxCurrentConfiguration); + if (aClassifier.Partition()) + { +#if DEBUG_SD_CONFIGURATION_TRACE + SAL_INFO("sd.fwk", __func__ << ": ConfigurationUpdater::UpdateConfiguration("); + ConfigurationTracer::TraceConfiguration( + mxRequestedConfiguration, "requested configuration"); + ConfigurationTracer::TraceConfiguration( + mxCurrentConfiguration, "current configuration"); +#endif + // Notify the beginning of the update. + ConfigurationChangeEvent aEvent; + aEvent.Type = FrameworkHelper::msConfigurationUpdateStartEvent; + aEvent.Configuration = mxRequestedConfiguration; + mpBroadcaster->NotifyListeners(aEvent); + + // Do the actual update. All exceptions are caught and ignored, + // so that the end of the update is notified always. + try + { + if (mnLockCount == 0) + UpdateCore(aClassifier); + } + catch(const RuntimeException&) + { + } + + // Notify the end of the update. + aEvent.Type = FrameworkHelper::msConfigurationUpdateEndEvent; + mpBroadcaster->NotifyListeners(aEvent); + + CheckUpdateSuccess(); + } + else + { + SAL_INFO("sd.fwk", __func__ << ": nothing to do"); +#if DEBUG_SD_CONFIGURATION_TRACE + ConfigurationTracer::TraceConfiguration( + mxRequestedConfiguration, "requested configuration"); + ConfigurationTracer::TraceConfiguration( + mxCurrentConfiguration, "current configuration"); +#endif + } + } + catch(const RuntimeException &) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + + SAL_INFO("sd.fwk", __func__ << ": ConfigurationUpdater::UpdateConfiguration)"); + SAL_INFO("sd.fwk", __func__ << ": UpdateConfiguration end"); +} + +void ConfigurationUpdater::CleanRequestedConfiguration() +{ + if (!mxControllerManager.is()) + return; + + // Request the deactivation of pure anchors that have no child. + vector > aResourcesToDeactivate; + CheckPureAnchors(mxRequestedConfiguration, aResourcesToDeactivate); + if (!aResourcesToDeactivate.empty()) + { + Reference xCC ( + mxControllerManager->getConfigurationController()); + for (const auto& rxId : aResourcesToDeactivate) + if (rxId.is()) + xCC->requestResourceDeactivation(rxId); + } +} + +void ConfigurationUpdater::CheckUpdateSuccess() +{ + // When the two configurations differ then start the timer to call + // another update later. + if ( ! AreConfigurationsEquivalent(mxCurrentConfiguration, mxRequestedConfiguration)) + { + if (mnFailedUpdateCount <= snShortTimeoutCountThreshold) + maUpdateTimer.SetTimeout(snShortTimeout); + else if (mnFailedUpdateCount < snNormalTimeoutCountThreshold) + maUpdateTimer.SetTimeout(snNormalTimeout); + else + maUpdateTimer.SetTimeout(snLongTimeout); + ++mnFailedUpdateCount; + maUpdateTimer.Start(); + } + else + { + // Update was successful. Reset the failed update count. + mnFailedUpdateCount = 0; + } +} + +void ConfigurationUpdater::UpdateCore (const ConfigurationClassifier& rClassifier) +{ + try + { +#if DEBUG_SD_CONFIGURATION_TRACE + rClassifier.TraceResourceIdVector( + "requested but not current resources:", rClassifier.GetC1minusC2()); + rClassifier.TraceResourceIdVector( + "current but not requested resources:", rClassifier.GetC2minusC1()); + rClassifier.TraceResourceIdVector( + "requested and current resources:", rClassifier.GetC1andC2()); +#endif + + // Updating of the sub controllers is done in two steps. In the + // first the sub controllers typically shut down resources that are + // not requested anymore. In the second the sub controllers + // typically set up resources that have been newly requested. + mpResourceManager->DeactivateResources(rClassifier.GetC2minusC1(), mxCurrentConfiguration); + mpResourceManager->ActivateResources(rClassifier.GetC1minusC2(), mxCurrentConfiguration); + +#if DEBUG_SD_CONFIGURATION_TRACE + SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::UpdateConfiguration)"); + ConfigurationTracer::TraceConfiguration( + mxRequestedConfiguration, "requested configuration"); + ConfigurationTracer::TraceConfiguration( + mxCurrentConfiguration, "current configuration"); +#endif + + // Deactivate pure anchors that have no child. + vector > aResourcesToDeactivate; + CheckPureAnchors(mxCurrentConfiguration, aResourcesToDeactivate); + if (!aResourcesToDeactivate.empty()) + mpResourceManager->DeactivateResources(aResourcesToDeactivate, mxCurrentConfiguration); + } + catch(const RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +void ConfigurationUpdater::CheckPureAnchors ( + const Reference& rxConfiguration, + vector >& rResourcesToDeactivate) +{ + if ( ! rxConfiguration.is()) + return; + + // Get a list of all resources in the configuration. + Sequence > aResources( + rxConfiguration->getResources( + nullptr, OUString(), AnchorBindingMode_INDIRECT)); + auto aResourcesRange = asNonConstRange(aResources); + sal_Int32 nCount (aResources.getLength()); + + // Prepare the list of pure anchors that have to be deactivated. + rResourcesToDeactivate.clear(); + + // Iterate over the list in reverse order because when there is a chain + // of pure anchors with only the last one having no child then the whole + // list has to be deactivated. + sal_Int32 nIndex (nCount-1); + while (nIndex >= 0) + { + const Reference xResourceId (aResources[nIndex]); + const Reference xResource ( + mpResourceManager->GetResource(xResourceId).mxResource); + bool bDeactiveCurrentResource (false); + + // Skip all resources that are no pure anchors. + if (xResource.is() && xResource->isAnchorOnly()) + { + // When xResource is not an anchor of the next resource in + // the list then it is the anchor of no resource at all. + if (nIndex == nCount-1) + { + // No following anchors, deactivate this one, then remove it + // from the list. + bDeactiveCurrentResource = true; + } + else + { + const Reference xPrevResourceId (aResources[nIndex+1]); + if ( ! xPrevResourceId.is() + || ! xPrevResourceId->isBoundTo(xResourceId, AnchorBindingMode_DIRECT)) + { + // The previous resource (id) does not exist or is not bound to + // the current anchor. + bDeactiveCurrentResource = true; + } + } + } + + if (bDeactiveCurrentResource) + { + SAL_INFO("sd.fwk", __func__ << ": deactivating pure anchor " << + FrameworkHelper::ResourceIdToString(xResourceId) << + "because it has no children"); + // Erase element from current configuration. + for (sal_Int32 nI=nIndex; nI ConfigurationUpdater::GetLock() +{ + return std::make_shared(*this); +} + +void ConfigurationUpdater::SetUpdateBeingProcessed (bool bValue) +{ + mbUpdateBeingProcessed = bValue; +} + +IMPL_LINK_NOARG(ConfigurationUpdater, TimeoutHandler, Timer *, void) +{ + if ( ! mbUpdateBeingProcessed + && mxCurrentConfiguration.is() + && mxRequestedConfiguration.is()) + { + if ( ! AreConfigurationsEquivalent(mxCurrentConfiguration, mxRequestedConfiguration)) + { + RequestUpdate(mxRequestedConfiguration); + } + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ConfigurationUpdater.hxx b/sd/source/ui/framework/configuration/ConfigurationUpdater.hxx new file mode 100644 index 0000000000..0e65505fa9 --- /dev/null +++ b/sd/source/ui/framework/configuration/ConfigurationUpdater.hxx @@ -0,0 +1,212 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace com::sun::star::drawing::framework +{ +class XConfiguration; +} +namespace com::sun::star::drawing::framework +{ +class XControllerManager; +} +namespace com::sun::star::drawing::framework +{ +class XResourceId; +} +namespace sd +{ +class DrawController; +} + +namespace sd::framework +{ +class ConfigurationClassifier; +class ConfigurationUpdaterLock; +class ConfigurationControllerResourceManager; +class ConfigurationControllerBroadcaster; + +/** This is a helper class for the ConfigurationController. It handles the + update of the current configuration so that it looks like a requested + configuration. An update is made by activating or deactivating drawing + framework resources. + + When an update is not successful, i.e. after the update the current + configuration is not equivalent to the requested configuration, then a + timer is started to repeat the update after a short time. +*/ +class ConfigurationUpdater +{ +public: + /** Create a new ConfigurationUpdater object that notifies configuration + changes and the start and end of updates via the given broadcaster. + */ + ConfigurationUpdater(std::shared_ptr pBroadcaster, + std::shared_ptr pResourceManager, + const rtl::Reference<::sd::DrawController>& xControllerManager); + ~ConfigurationUpdater(); + + /** Request an update of the current configuration so that it looks like + the given requested configuration. It checks whether an update of + the current configuration can be done. Calls UpdateConfiguration() + if that is the case. Otherwise it schedules a later call to + UpdateConfiguration(). + */ + void RequestUpdate(const css::uno::Reference& + rxRequestedConfiguration); + + const css::uno::Reference& + GetCurrentConfiguration() const + { + return mxCurrentConfiguration; + } + + friend class ConfigurationUpdaterLock; + /** Return a lock of the called ConfigurationUpdater. While the + returned object exists no update of the current configuration is + made. + */ + std::shared_ptr GetLock(); + +private: + /** A reference to the XControllerManager is kept so that + UpdateConfiguration() has access to the other sub controllers. + */ + rtl::Reference<::sd::DrawController> mxControllerManager; + + std::shared_ptr mpBroadcaster; + + /** The current configuration holds the resources that are currently + active. It is modified during an update. + */ + css::uno::Reference mxCurrentConfiguration; + + /** The requested configuration holds the resources that have been + requested to activate or to deactivate since the last update. It is + (usually) not modified during an update. This configuration is + maintained by the ConfigurationController and given to the + ConfigurationUpdater in the RequestUpdate() method. + */ + css::uno::Reference mxRequestedConfiguration; + + /** This flag is set to when an update of the current + configuration was requested (because the last request in the queue + was processed) but could not be executed because the + ConfigurationController was locked. A call to UpdateConfiguration() + resets the flag to . + */ + bool mbUpdatePending; + + /** This flag is set to while the UpdateConfiguration() method + is running. It is used to prevent reentrance problems with this + method. + */ + bool mbUpdateBeingProcessed; + + /** The ConfigurationController is locked when this count has a value + larger then zero. If the controller is locked then updates of the + current configuration are not made. + */ + sal_Int32 mnLockCount; + + /** This timer is used to check from time to time whether the requested + configuration and the current configuration are identical and request + an update when they are not. + This is used to overcome problems with resources that become + available asynchronously. + */ + Timer maUpdateTimer; + + /** The number of failed updates (those after which the current + configuration is not equivalent to the requested configuration) is + used to determine how long to wait before another update is made. + */ + sal_Int32 mnFailedUpdateCount; + + std::shared_ptr mpResourceManager; + + /** This method does the main work of an update. It calls the sub + controllers that are responsible for the various types of resources + and tells them to update their active resources. It notifies + listeners about the start and end of the configuration update. + */ + void UpdateConfiguration(); + + /** Basically calls UpdaterStart() andUpdateEnd() and makes some debug + output. + */ + void UpdateCore(const ConfigurationClassifier& rClassifier); + + /** Check for all pure anchors if they have at least one child. + Childless pure anchors are deactivated. + This affects only the current configuration. + */ + void CheckPureAnchors( + const css::uno::Reference& rxConfiguration, + ::std::vector>& + rResourcesToDeactivate); + + /** Remove from the requested configuration all pure anchors that have no + child. Requested but not yet activated anchors can not be removed + because without the actual resource the 'pureness' of an anchor can + not be determined. + */ + void CleanRequestedConfiguration(); + + /** Check the success of a recently executed configuration update. + When the update failed then start the timer. + */ + void CheckUpdateSuccess(); + + /** This method sets the mbUpdateBeingProcessed member that is used to + prevent reentrance problems. This method allows function objects + easily and safely to modify the variable. + */ + void SetUpdateBeingProcessed(bool bValue); + + /** Return whether it is possible to do an update of the configuration. + This takes into account whether another update is currently being + executed, the lock count, and whether the configuration controller + is still valid. + */ + bool IsUpdatePossible() const; + + /** Lock updates of the current configuration. For intermediate requests + for updates mbUpdatePending is set to . + */ + void LockUpdates(); + + /** When an update was requested since the last LockUpdates() call then + RequestUpdate() is called. + */ + void UnlockUpdates(); + + DECL_LINK(TimeoutHandler, Timer*, void); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx new file mode 100644 index 0000000000..fa6d415034 --- /dev/null +++ b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include "GenericConfigurationChangeRequest.hxx" + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +GenericConfigurationChangeRequest::GenericConfigurationChangeRequest ( + const Reference& rxResourceId, + const Mode eMode) + : mxResourceId(rxResourceId), + meMode(eMode) +{ + if ( ! rxResourceId.is() || rxResourceId->getResourceURL().isEmpty()) + throw css::lang::IllegalArgumentException(); +} + +GenericConfigurationChangeRequest::~GenericConfigurationChangeRequest() noexcept +{ +} + +void SAL_CALL GenericConfigurationChangeRequest::execute ( + const Reference& rxConfiguration) +{ + if (!rxConfiguration.is()) + return; + + switch (meMode) + { + case Activation: + rxConfiguration->addResource(mxResourceId); + break; + + case Deactivation: + rxConfiguration->removeResource(mxResourceId); + break; + } +} + +OUString SAL_CALL GenericConfigurationChangeRequest::getName() +{ + return OUString::Concat("GenericConfigurationChangeRequest ") + + (meMode==Activation + ? std::u16string_view(u"activate ") : std::u16string_view(u"deactivate ")) + + FrameworkHelper::ResourceIdToString(mxResourceId); +} + +void SAL_CALL GenericConfigurationChangeRequest::setName (const OUString&) +{ + // Ignored. +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx new file mode 100644 index 0000000000..3caa7a8cac --- /dev/null +++ b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfiguration; } +namespace com::sun::star::drawing::framework { class XResourceId; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeRequest, + css::container::XNamed + > GenericConfigurationChangeRequestInterfaceBase; + +/** This implementation of the XConfigurationChangeRequest interface + represents a single explicit request for a configuration change. On its + execution it may result in other, implicit, configuration changes. For + example this is the case when the deactivation of a unique resource is + requested: the resources linked to it have to be deactivated as well. +*/ +class GenericConfigurationChangeRequest final + : public GenericConfigurationChangeRequestInterfaceBase +{ +public: + /** This enum specified whether the activation or deactivation of a + resource is requested. + */ + enum Mode { Activation, Deactivation }; + + /** Create a new object that represents the request for activation or + deactivation of the specified resource. + @param rxsResourceId + Id of the resource that is to be activated or deactivated. + @param eMode + The mode specifies whether to activate or to deactivate the + resource. + @throws css::css::lang::IllegalArgumentException + */ + GenericConfigurationChangeRequest ( + const css::uno::Reference& + rxResourceId, + const Mode eMode); + + virtual ~GenericConfigurationChangeRequest() noexcept override; + + // XConfigurationChangeOperation + + /** The requested configuration change is executed on the given + configuration. Additionally to the explicitly requested change + other changes have to be made as well. See class description for an + example. + @param rxConfiguration + The configuration to which the requested change is made. + */ + virtual void SAL_CALL execute ( + const css::uno::Reference& rxConfiguration) override; + + // XNamed + + /** Return a human readable string representation. This is used for + debugging purposes. + */ + virtual OUString SAL_CALL getName() override; + + /** This call is ignored because the XNamed interface is (mis)used to + give access to a human readable name for debugging purposes. + */ + virtual void SAL_CALL setName (const OUString& rName) override; + +private: + const css::uno::Reference mxResourceId; + const Mode meMode; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ResourceFactoryManager.cxx b/sd/source/ui/framework/configuration/ResourceFactoryManager.cxx new file mode 100644 index 0000000000..fd07caeda4 --- /dev/null +++ b/sd/source/ui/framework/configuration/ResourceFactoryManager.cxx @@ -0,0 +1,195 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ResourceFactoryManager.hxx" +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +#undef VERBOSE +//#define VERBOSE 1 + +namespace sd::framework { + +ResourceFactoryManager::ResourceFactoryManager (const rtl::Reference<::sd::DrawController>& rxManager) + : mxControllerManager(rxManager) +{ + // Create the URL transformer. + Reference xContext(::comphelper::getProcessComponentContext()); + mxURLTransformer = util::URLTransformer::create(xContext); +} + +ResourceFactoryManager::~ResourceFactoryManager() +{ + for (auto& rXInterfaceResource : maFactoryMap) + { + Reference xComponent (rXInterfaceResource.second, UNO_QUERY); + rXInterfaceResource.second = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + Reference xComponent (mxURLTransformer, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); +} + +void ResourceFactoryManager::AddFactory ( + const OUString& rsURL, + const Reference& rxFactory) +{ + if ( ! rxFactory.is()) + throw lang::IllegalArgumentException(); + if (rsURL.isEmpty()) + throw lang::IllegalArgumentException(); + + std::scoped_lock aGuard (maMutex); + + if (rsURL.indexOf('*') >= 0 || rsURL.indexOf('?') >= 0) + { + // The URL is a URL pattern not a single URL. + maFactoryPatternList.emplace_back(rsURL, rxFactory); + +#if defined VERBOSE && VERBOSE>=1 + SAL_INFO("sd","ResourceFactoryManager::AddFactory pattern " << rsURL << std::hex << rxFactory.get()); +#endif + } + else + { + maFactoryMap[rsURL] = rxFactory; + +#if defined VERBOSE && VERBOSE>=1 + SAL_INFO("sd", "ResourceFactoryManager::AddFactory fixed " << rsURL << " 0x" << std::hex << rxFactory.get()); +#endif + } +} + +void ResourceFactoryManager::RemoveFactoryForURL ( + const OUString& rsURL) +{ + if (rsURL.isEmpty()) + throw lang::IllegalArgumentException(); + + std::scoped_lock aGuard (maMutex); + + FactoryMap::iterator iFactory (maFactoryMap.find(rsURL)); + if (iFactory != maFactoryMap.end()) + { + maFactoryMap.erase(iFactory); + } + else + { + // The URL may be a pattern. Look that up. + auto iPattern = std::find_if(maFactoryPatternList.begin(), maFactoryPatternList.end(), + [&rsURL](const FactoryPatternList::value_type& rPattern) { return rPattern.first == rsURL; }); + if (iPattern != maFactoryPatternList.end()) + { + // Found the pattern. Remove it. + maFactoryPatternList.erase(iPattern); + } + } +} + +void ResourceFactoryManager::RemoveFactoryForReference( + const Reference& rxFactory) +{ + std::scoped_lock aGuard (maMutex); + + // Collect a list with all keys that map to the given factory. + ::std::vector aKeys; + for (const auto& rFactory : maFactoryMap) + if (rFactory.second == rxFactory) + aKeys.push_back(rFactory.first); + + // Remove the entries whose keys we just have collected. + for (const auto& rKey : aKeys) + maFactoryMap.erase(rKey); + + // Remove the pattern entries whose factories are identical to the given + // factory. + std::erase_if( + maFactoryPatternList, + [&] (FactoryPatternList::value_type const& it) { return it.second == rxFactory; }); +} + +Reference ResourceFactoryManager::GetFactory ( + const OUString& rsCompleteURL) +{ + OUString sURLBase (rsCompleteURL); + if (mxURLTransformer.is()) + { + util::URL aURL; + aURL.Complete = rsCompleteURL; + if (mxURLTransformer->parseStrict(aURL)) + sURLBase = aURL.Main; + } + + Reference xFactory = FindFactory(sURLBase); + + if ( ! xFactory.is() && mxControllerManager.is()) + { + Reference xModuleController(mxControllerManager->getModuleController()); + if (xModuleController.is()) + { + // Ask the module controller to provide a factory of the + // requested view type. Note that this can (and should) cause + // intermediate calls to AddFactory(). + xModuleController->requestResource(sURLBase); + + xFactory = FindFactory(sURLBase); + } + } + + return xFactory; +} + +Reference ResourceFactoryManager::FindFactory (const OUString& rsURLBase) +{ + std::scoped_lock aGuard (maMutex); + FactoryMap::const_iterator iFactory (maFactoryMap.find(rsURLBase)); + if (iFactory != maFactoryMap.end()) + return iFactory->second; + else + { + // Check the URL patterns. + auto iPattern = std::find_if(maFactoryPatternList.begin(), maFactoryPatternList.end(), + [&rsURLBase](const FactoryPatternList::value_type& rPattern) { + WildCard aWildCard (rPattern.first); + return aWildCard.Matches(rsURLBase); + }); + if (iPattern != maFactoryPatternList.end()) + return iPattern->second; + } + return nullptr; +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ResourceFactoryManager.hxx b/sd/source/ui/framework/configuration/ResourceFactoryManager.hxx new file mode 100644 index 0000000000..f28c301e55 --- /dev/null +++ b/sd/source/ui/framework/configuration/ResourceFactoryManager.hxx @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XControllerManager; } +namespace com::sun::star::drawing::framework { class XResourceFactory; } +namespace com::sun::star::util { class XURLTransformer; } +namespace sd { class DrawController; } + +namespace sd::framework { + +/** Container of resource factories of the drawing framework. +*/ +class ResourceFactoryManager +{ +public: + explicit ResourceFactoryManager(const rtl::Reference<::sd::DrawController>& rxManager); + + ~ResourceFactoryManager(); + + /** Register a resource factory for one type of resource. + @param rsURL + The type of the resource that will be created by the factory. + @param rxFactory + The factory that will create resource objects of the specified type. + @throws css::uno::RuntimeException + */ + void AddFactory ( + const OUString& rsURL, + const css::uno::Reference& rxFactory); + + /** Unregister the specified factory. + @param rsURL + Unregister only the factory for this URL. When the same factory + is registered for other URLs then these remain registered. + @throws css::uno::RuntimeException + */ + void RemoveFactoryForURL( + const OUString& rsURL); + + /** Unregister the specified factory. + @param rxFactory + Unregister the this factory for all URLs that it has been + registered for. + @throws css::uno::RuntimeException + */ + void RemoveFactoryForReference( + const css::uno::Reference& rxFactory); + + /** Return a factory that can create resources specified by the given URL. + @param rsCompleteURL + This URL specifies the type of the resource. It may contain arguments. + @return + When a factory for the specified URL has been registered by a + previous call to AddFactory() then a reference to that factory + is returned. Otherwise an empty reference is returned. + @throws css::uno::RuntimeException + */ + css::uno::Reference GetFactory ( + const OUString& rsURL); + +private: + std::mutex maMutex; + typedef std::unordered_map< + OUString, + css::uno::Reference > FactoryMap; + FactoryMap maFactoryMap; + + typedef ::std::vector< + ::std::pair< + OUString, + css::uno::Reference > > + FactoryPatternList; + FactoryPatternList maFactoryPatternList; + + rtl::Reference<::sd::DrawController> mxControllerManager; + css::uno::Reference mxURLTransformer; + + /** Look up the factory for the given URL. + @param rsURLBase + The css::tools::URL.Main part of a URL. Arguments have to be + stripped off by the caller. + @return + When the factory has not yet been added then return NULL. + @throws css::uno::RuntimeException + */ + css::uno::Reference FindFactory ( + const OUString& rsURLBase); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/ResourceId.cxx b/sd/source/ui/framework/configuration/ResourceId.cxx new file mode 100644 index 0000000000..21d7e6932b --- /dev/null +++ b/sd/source/ui/framework/configuration/ResourceId.cxx @@ -0,0 +1,502 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace com::sun::star::uno { class XComponentContext; } + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing::framework; + +/** When the USE_OPTIMIZATIONS symbol is defined then at some optimizations + are activated that work only together with XResourceId objects that are + implemented by the ResourceId class. For other implementations of when + the USE_OPTIMIZATIONS symbol is not defined then alternative code is + used instead. +*/ +#define USE_OPTIMIZATIONS + +namespace sd::framework { + +//===== ResourceId ============================================================ + +WeakReference ResourceId::mxURLTransformerWeak; + +ResourceId::ResourceId() + : maResourceURLs(0) +{ +} + +ResourceId::ResourceId ( + std::vector&& rResourceURLs) + : maResourceURLs(std::move(rResourceURLs)) +{ + ParseResourceURL(); +} + +ResourceId::ResourceId ( + const OUString& rsResourceURL) + : maResourceURLs(1, rsResourceURL) +{ + // Handle the special case of an empty resource URL. + if (rsResourceURL.isEmpty()) + maResourceURLs.clear(); + ParseResourceURL(); +} + +ResourceId::ResourceId ( + const OUString& rsResourceURL, + const OUString& rsAnchorURL) + : maResourceURLs(2) +{ + maResourceURLs[0] = rsResourceURL; + maResourceURLs[1] = rsAnchorURL; + ParseResourceURL(); +} + +ResourceId::ResourceId ( + const OUString& rsResourceURL, + const OUString& rsFirstAnchorURL, + const Sequence& rAnchorURLs) + : maResourceURLs(2+rAnchorURLs.getLength()) +{ + maResourceURLs[0] = rsResourceURL; + maResourceURLs[1] = rsFirstAnchorURL; + std::copy(rAnchorURLs.begin(), rAnchorURLs.end(), std::next(maResourceURLs.begin(), 2)); + ParseResourceURL(); +} + +ResourceId::~ResourceId() +{ + mpURL.reset(); +} + +OUString SAL_CALL + ResourceId::getResourceURL() +{ + if (!maResourceURLs.empty()) + return maResourceURLs[0]; + else + return OUString(); +} + +util::URL SAL_CALL + ResourceId::getFullResourceURL() +{ + if (mpURL != nullptr) + return *mpURL; + + Reference xURLTransformer (mxURLTransformerWeak); + if (xURLTransformer.is() && !maResourceURLs.empty() ) + { + mpURL.reset(new util::URL); + mpURL->Complete = maResourceURLs[0]; + xURLTransformer->parseStrict(*mpURL); + return *mpURL; + } + + util::URL aURL; + if (!maResourceURLs.empty()) + aURL.Complete = maResourceURLs[0]; + return aURL; +} + +sal_Bool SAL_CALL + ResourceId::hasAnchor() +{ + return maResourceURLs.size()>1; +} + +Reference SAL_CALL + ResourceId::getAnchor() +{ + ::rtl::Reference rResourceId (new ResourceId()); + const sal_Int32 nAnchorCount (maResourceURLs.size()-1); + if (nAnchorCount > 0) + { + rResourceId->maResourceURLs.resize(nAnchorCount); + for (sal_Int32 nIndex=0; nIndexmaResourceURLs[nIndex] = maResourceURLs[nIndex+1]; + } + return rResourceId; +} + +Sequence SAL_CALL + ResourceId::getAnchorURLs() +{ + const sal_Int32 nAnchorCount (maResourceURLs.size() - 1); + if (nAnchorCount > 0) + { + Sequence aAnchorURLs (nAnchorCount); + std::copy_n(maResourceURLs.begin() + 1, nAnchorCount, aAnchorURLs.getArray()); + return aAnchorURLs; + } + else + return Sequence(); +} + +OUString SAL_CALL + ResourceId::getResourceTypePrefix() +{ + if (!maResourceURLs.empty() ) + { + // Return the "private:resource//" prefix. + + // Get the prefix that ends with the second "/". + const OUString& rsResourceURL (maResourceURLs[0]); + sal_Int32 nPrefixEnd (rsResourceURL.indexOf('/')); + if (nPrefixEnd >= 0) + nPrefixEnd = rsResourceURL.indexOf('/', nPrefixEnd+1) + 1; + else + nPrefixEnd = 0; + + return rsResourceURL.copy(0,nPrefixEnd); + } + else + return OUString(); +} + +sal_Int16 SAL_CALL + ResourceId::compareTo (const Reference& rxResourceId) +{ + sal_Int16 nResult (0); + + if ( ! rxResourceId.is()) + { + // The empty reference is interpreted as empty resource id object. + if (!maResourceURLs.empty()) + nResult = +1; + else + nResult = 0; + } + else + { + ResourceId* pId = nullptr; +#ifdef USE_OPTIMIZATIONS + pId = dynamic_cast(rxResourceId.get()); +#endif + if (pId != nullptr) + { + // We have direct access to the implementation of the given + // resource id object. + nResult = CompareToLocalImplementation(*pId); + } + else + { + // We have to do the comparison via the UNO interface of the + // given resource id object. + nResult = CompareToExternalImplementation(rxResourceId); + } + } + + return nResult; +} + +sal_Int16 ResourceId::CompareToLocalImplementation (const ResourceId& rId) const +{ + sal_Int16 nResult (0); + + const sal_uInt32 nLocalURLCount (maResourceURLs.size()); + const sal_uInt32 nURLCount(rId.maResourceURLs.size()); + + // Start comparison with the top most anchors. + for (sal_Int32 nIndex=nURLCount-1,nLocalIndex=nLocalURLCount-1; + nIndex>=0 && nLocalIndex>=0; + --nIndex,--nLocalIndex) + { + const OUString sLocalURL (maResourceURLs[nLocalIndex]); + const OUString sURL (rId.maResourceURLs[nIndex]); + const sal_Int32 nLocalResult (sURL.compareTo(sLocalURL)); + if (nLocalResult != 0) + { + if (nLocalResult < 0) + nResult = -1; + else + nResult = +1; + break; + } + } + + if (nResult == 0) + { + // No difference found yet. When the lengths are the same then the + // two resource ids are equivalent. Otherwise the shorter comes + // first. + if (nLocalURLCount != nURLCount) + { + if (nLocalURLCount < nURLCount) + nResult = -1; + else + nResult = +1; + } + } + + return nResult; +} + +sal_Int16 ResourceId::CompareToExternalImplementation (const Reference& rxId) const +{ + sal_Int16 nResult (0); + + const Sequence aAnchorURLs (rxId->getAnchorURLs()); + const sal_uInt32 nLocalURLCount (maResourceURLs.size()); + const sal_uInt32 nURLCount(1+aAnchorURLs.getLength()); + + // Start comparison with the top most anchors. + sal_Int32 nLocalResult (0); + for (sal_Int32 nIndex=nURLCount-1,nLocalIndex=nLocalURLCount-1; + nIndex>=0&&nLocalIndex>=0; + --nIndex,--nLocalIndex) + { + if (nIndex == 0 ) + nLocalResult = maResourceURLs[nIndex].compareTo(rxId->getResourceURL()); + else + nLocalResult = maResourceURLs[nIndex].compareTo(aAnchorURLs[nIndex-1]); + if (nLocalResult != 0) + { + if (nLocalResult < 0) + nResult = -1; + else + nResult = +1; + break; + } + } + + if (nResult == 0) + { + // No difference found yet. When the lengths are the same then the + // two resource ids are equivalent. Otherwise the shorter comes + // first. + if (nLocalURLCount != nURLCount) + { + if (nLocalURLCount < nURLCount) + nResult = -1; + else + nResult = +1; + } + } + + return nResult; +} + +sal_Bool SAL_CALL + ResourceId::isBoundTo ( + const Reference& rxResourceId, + AnchorBindingMode eMode) +{ + if ( ! rxResourceId.is()) + { + // An empty reference is interpreted as empty resource id. + return IsBoundToAnchor(nullptr, nullptr, eMode); + } + + ResourceId* pId = nullptr; +#ifdef USE_OPTIMIZATIONS + pId = dynamic_cast(rxResourceId.get()); +#endif + if (pId != nullptr) + { + return IsBoundToAnchor(pId->maResourceURLs, eMode); + } + else + { + const OUString sResourceURL (rxResourceId->getResourceURL()); + const Sequence aAnchorURLs (rxResourceId->getAnchorURLs()); + return IsBoundToAnchor(&sResourceURL, &aAnchorURLs, eMode); + } +} + +sal_Bool SAL_CALL + ResourceId::isBoundToURL ( + const OUString& rsAnchorURL, + AnchorBindingMode eMode) +{ + return IsBoundToAnchor(&rsAnchorURL, nullptr, eMode); +} + +Reference SAL_CALL + ResourceId::clone() +{ + return new ResourceId(std::vector(maResourceURLs)); +} + +//----- XInitialization ------------------------------------------------------- + +void SAL_CALL ResourceId::initialize (const Sequence& aArguments) +{ + for (const auto& rArgument : aArguments) + { + OUString sResourceURL; + if (rArgument >>= sResourceURL) + maResourceURLs.push_back(sResourceURL); + else + { + Reference xAnchor; + if (rArgument >>= xAnchor) + { + if (xAnchor.is()) + { + maResourceURLs.push_back(xAnchor->getResourceURL()); + const Sequence aAnchorURLs (xAnchor->getAnchorURLs()); + maResourceURLs.insert( maResourceURLs.end(), aAnchorURLs.begin(), aAnchorURLs.end() ); + } + } + } + } + ParseResourceURL(); +} + +OUString ResourceId::getImplementationName() +{ + return "com.sun.star.comp.Draw.framework.ResourceId"; +} + +sal_Bool ResourceId::supportsService(OUString const & ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +css::uno::Sequence ResourceId::getSupportedServiceNames() +{ + return {"com.sun.star.drawing.framework.ResourceId"}; +} + +/** When eMode is DIRECTLY then the anchor of the called object and the + anchor represented by the given sequence of anchor URLs have to be + identical. When eMode is RECURSIVE then the anchor of the called + object has to start with the given anchor URLs. +*/ +bool ResourceId::IsBoundToAnchor ( + const OUString* psFirstAnchorURL, + const Sequence* paAnchorURLs, + AnchorBindingMode eMode) const +{ + const sal_uInt32 nLocalAnchorURLCount (maResourceURLs.size() - 1); + const bool bHasFirstAnchorURL (psFirstAnchorURL!=nullptr); + const sal_uInt32 nAnchorURLCount ((bHasFirstAnchorURL?1:0) + + (paAnchorURLs!=nullptr ? paAnchorURLs->getLength() : 0)); + + // Check the lengths. + if (nLocalAnchorURLCountgetLength(); + while (nOffset < nCount) + { + if ( maResourceURLs[nLocalAnchorURLCount - nOffset] != + (*paAnchorURLs)[nCount - 1 - nOffset] ) + { + return false; + } + ++nOffset; + } + } + if (bHasFirstAnchorURL) + { + if ( *psFirstAnchorURL != maResourceURLs[nLocalAnchorURLCount - nOffset] ) + return false; + } + + return true; +} + +bool ResourceId::IsBoundToAnchor ( + const ::std::vector& rAnchorURLs, + AnchorBindingMode eMode) const +{ + const sal_uInt32 nLocalAnchorURLCount (maResourceURLs.size() - 1); + const sal_uInt32 nAnchorURLCount (rAnchorURLs.size()); + + // Check the lengths. + if (nLocalAnchorURLCount aGuard (::osl::Mutex::getGlobalMutex()); + Reference xURLTransformer (mxURLTransformerWeak); + if ( ! xURLTransformer.is()) + { + // Create the URL transformer. + Reference xContext(::comphelper::getProcessComponentContext()); + xURLTransformer.set(util::URLTransformer::create(xContext)); + mxURLTransformerWeak = xURLTransformer; + SdGlobalResourceContainer::Instance().AddResource( + Reference(xURLTransformer,UNO_QUERY)); + } + + if (xURLTransformer.is() && !maResourceURLs.empty() ) + { + mpURL.reset(new util::URL); + mpURL->Complete = maResourceURLs[0]; + xURLTransformer->parseStrict(*mpURL); + if (mpURL->Main == maResourceURLs[0]) + mpURL.reset(); + else + maResourceURLs[0] = mpURL->Main; + } +} + +} // end of namespace sd::framework + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_Draw_framework_ResourceID_get_implementation(css::uno::XComponentContext*, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::framework::ResourceId()); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/UpdateRequest.cxx b/sd/source/ui/framework/configuration/UpdateRequest.cxx new file mode 100644 index 0000000000..b6c5e8c42d --- /dev/null +++ b/sd/source/ui/framework/configuration/UpdateRequest.cxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "UpdateRequest.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework +{ +UpdateRequest::UpdateRequest() noexcept {} + +UpdateRequest::~UpdateRequest() noexcept {} + +void SAL_CALL UpdateRequest::execute(const Reference&) +{ + // Do nothing here. The configuration is updated when the request queue + // becomes empty. +} + +OUString SAL_CALL UpdateRequest::getName() { return "UpdateRequest"; } + +void SAL_CALL UpdateRequest::setName(const OUString&) +{ + // Ignored. +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/UpdateRequest.hxx b/sd/source/ui/framework/configuration/UpdateRequest.hxx new file mode 100644 index 0000000000..712167154b --- /dev/null +++ b/sd/source/ui/framework/configuration/UpdateRequest.hxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfiguration; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeRequest, + css::container::XNamed + > UpdateRequestInterfaceBase; + +/** This update request is used to request configuration updates + asynchronous when no other requests are being processed. When there are + other requests then we can simply wait until the last one is executed: + the configuration is updated when the request queue becomes empty. This + is use by this implementation as well. The execute() method does not + really do anything. This request just triggers the update of the + configuration when it is removed as last request from the queue. +*/ +class UpdateRequest final + : public UpdateRequestInterfaceBase +{ +public: + UpdateRequest() noexcept; + virtual ~UpdateRequest() noexcept override; + + // XConfigurationChangeOperation + + virtual void SAL_CALL execute ( + const css::uno::Reference& rxConfiguration) override; + + // XNamed + + /** Return a human readable string representation. This is used for + debugging purposes. + */ + virtual OUString SAL_CALL getName() override; + + /** This call is ignored because the XNamed interface is (mis)used to + give access to a human readable name for debugging purposes. + */ + virtual void SAL_CALL setName (const OUString& rName) override; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/configuration/debugtrace.hxx b/sd/source/ui/framework/configuration/debugtrace.hxx new file mode 100644 index 0000000000..b520d0ff30 --- /dev/null +++ b/sd/source/ui/framework/configuration/debugtrace.hxx @@ -0,0 +1,15 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/// Centrally define activation of configuration debug traces. +#define DEBUG_SD_CONFIGURATION_TRACE 0 + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/BasicPaneFactory.cxx b/sd/source/ui/framework/factories/BasicPaneFactory.cxx new file mode 100644 index 0000000000..e112ac4c31 --- /dev/null +++ b/sd/source/ui/framework/factories/BasicPaneFactory.cxx @@ -0,0 +1,407 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include "ChildWindowPane.hxx" +#include "FrameWindowPane.hxx" +#include "FullScreenPane.hxx" + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace { + enum PaneId { + CenterPaneId, + FullScreenPaneId, + LeftImpressPaneId, + LeftDrawPaneId + }; + + const sal_Int32 gnConfigurationUpdateStartEvent(0); + const sal_Int32 gnConfigurationUpdateEndEvent(1); +} + +namespace sd::framework { + +/** Store URL, XPane reference and (local) PaneId for every pane factory + that is registered at the PaneController. +*/ +class BasicPaneFactory::PaneDescriptor +{ +public: + OUString msPaneURL; + Reference mxPane; + PaneId mePaneId; + /** The mbReleased flag is set when the pane has been released. Some + panes are just hidden and destroyed. When the pane is reused this + flag is reset. + */ + bool mbIsReleased; + + bool CompareURL(std::u16string_view rsPaneURL) const { return msPaneURL == rsPaneURL; } + bool ComparePane(const Reference& rxPane) const { return mxPane == rxPane; } +}; + +class BasicPaneFactory::PaneContainer + : public ::std::vector +{ +public: + PaneContainer() {} +}; + +//===== PaneFactory =========================================================== + +BasicPaneFactory::BasicPaneFactory ( + const Reference& rxContext, + const rtl::Reference<::sd::DrawController>& rxController) + : mxComponentContext(rxContext), + mpViewShellBase(nullptr), + mpPaneContainer(new PaneContainer) +{ + try + { + // Tunnel through the controller to obtain access to the ViewShellBase. + mpViewShellBase = rxController->GetViewShellBase(); + + Reference xCC (rxController->getConfigurationController()); + mxConfigurationControllerWeak = xCC; + + // Add pane factories for the two left panes (one for Impress and one for + // Draw) and the center pane. + if (rxController.is() && xCC.is()) + { + PaneDescriptor aDescriptor; + aDescriptor.msPaneURL = FrameworkHelper::msCenterPaneURL; + aDescriptor.mePaneId = CenterPaneId; + aDescriptor.mbIsReleased = false; + mpPaneContainer->push_back(aDescriptor); + xCC->addResourceFactory(aDescriptor.msPaneURL, this); + + aDescriptor.msPaneURL = FrameworkHelper::msFullScreenPaneURL; + aDescriptor.mePaneId = FullScreenPaneId; + mpPaneContainer->push_back(aDescriptor); + xCC->addResourceFactory(aDescriptor.msPaneURL, this); + + aDescriptor.msPaneURL = FrameworkHelper::msLeftImpressPaneURL; + aDescriptor.mePaneId = LeftImpressPaneId; + mpPaneContainer->push_back(aDescriptor); + xCC->addResourceFactory(aDescriptor.msPaneURL, this); + + aDescriptor.msPaneURL = FrameworkHelper::msLeftDrawPaneURL; + aDescriptor.mePaneId = LeftDrawPaneId; + mpPaneContainer->push_back(aDescriptor); + xCC->addResourceFactory(aDescriptor.msPaneURL, this); + } + + // Register as configuration change listener. + if (xCC.is()) + { + xCC->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateStartEvent, + Any(gnConfigurationUpdateStartEvent)); + xCC->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateEndEvent, + Any(gnConfigurationUpdateEndEvent)); + } + } + catch (RuntimeException&) + { + Reference xCC (mxConfigurationControllerWeak); + if (xCC.is()) + xCC->removeResourceFactoryForReference(this); + } +} + +BasicPaneFactory::~BasicPaneFactory() +{ +} + +void BasicPaneFactory::disposing(std::unique_lock&) +{ + Reference xCC (mxConfigurationControllerWeak); + if (xCC.is()) + { + xCC->removeResourceFactoryForReference(this); + xCC->removeConfigurationChangeListener(this); + mxConfigurationControllerWeak.clear(); + } + + for (const auto& rDescriptor : *mpPaneContainer) + { + if (rDescriptor.mbIsReleased) + { + Reference xComponent (rDescriptor.mxPane, UNO_QUERY); + if (xComponent.is()) + { + xComponent->removeEventListener(this); + xComponent->dispose(); + } + } + } +} + +//===== XPaneFactory ========================================================== + +Reference SAL_CALL BasicPaneFactory::createResource ( + const Reference& rxPaneId) +{ + ThrowIfDisposed(); + + Reference xPane; + + // Based on the ResourceURL of the given ResourceId look up the + // corresponding factory descriptor. + PaneContainer::iterator iDescriptor ( + ::std::find_if ( + mpPaneContainer->begin(), + mpPaneContainer->end(), + [&] (PaneDescriptor const& rPane) { + return rPane.CompareURL(rxPaneId->getResourceURL()); + } )); + + if (iDescriptor == mpPaneContainer->end()) + { + // The requested pane can not be created by any of the factories + // managed by the called BasicPaneFactory object. + throw lang::IllegalArgumentException("BasicPaneFactory::createPane() called for unknown resource id", + nullptr, + 0); + } + + if (iDescriptor->mxPane.is()) + { + // The pane has already been created and is still active (has + // not yet been released). This should not happen. + xPane = iDescriptor->mxPane; + } + else + { + // Create a new pane. + switch (iDescriptor->mePaneId) + { + case CenterPaneId: + xPane = CreateFrameWindowPane(rxPaneId); + break; + + case FullScreenPaneId: + xPane = CreateFullScreenPane(mxComponentContext, rxPaneId); + break; + + case LeftImpressPaneId: + case LeftDrawPaneId: + xPane = CreateChildWindowPane( + rxPaneId, + *iDescriptor); + break; + } + iDescriptor->mxPane = xPane; + + // Listen for the pane being disposed. + Reference xComponent (xPane, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener(this); + } + iDescriptor->mbIsReleased = false; + + + return xPane; +} + +void SAL_CALL BasicPaneFactory::releaseResource ( + const Reference& rxPane) +{ + ThrowIfDisposed(); + + // Based on the given XPane reference look up the corresponding factory + // descriptor. + PaneContainer::iterator iDescriptor ( + ::std::find_if( + mpPaneContainer->begin(), + mpPaneContainer->end(), + [&] (PaneDescriptor const& rPane) { return rPane.ComparePane(rxPane); } )); + + if (iDescriptor == mpPaneContainer->end()) + { + // The given XPane reference is either empty or the pane was not + // created by any of the factories managed by the called + // BasicPaneFactory object. + throw lang::IllegalArgumentException("BasicPaneFactory::releasePane() called for pane that was not created by same factory.", + nullptr, + 0); + } + + // The given pane was created by one of the factories. Child + // windows are just hidden and will be reused when requested later. + // Other windows are disposed and their reference is reset so that + // on the next createPane() call for the same pane type the pane is + // created anew. + ChildWindowPane* pChildWindowPane = dynamic_cast(rxPane.get()); + if (pChildWindowPane != nullptr) + { + iDescriptor->mbIsReleased = true; + pChildWindowPane->Hide(); + } + else + { + iDescriptor->mxPane = nullptr; + Reference xComponent (rxPane, UNO_QUERY); + if (xComponent.is()) + { + // We are disposing the pane and do not have to be informed of + // that. + xComponent->removeEventListener(this); + xComponent->dispose(); + } + } + +} + +//===== XConfigurationChangeListener ========================================== + +void SAL_CALL BasicPaneFactory::notifyConfigurationChange ( + const ConfigurationChangeEvent& /* rEvent */ ) +{ + // FIXME: nothing to do +} + +//===== lang::XEventListener ================================================== + +void SAL_CALL BasicPaneFactory::disposing ( + const lang::EventObject& rEventObject) +{ + if (mxConfigurationControllerWeak.get() == rEventObject.Source) + { + mxConfigurationControllerWeak.clear(); + } + else + { + // Has one of the panes been disposed? If so, then release the + // reference to that pane, but not the pane descriptor. + Reference xPane (rEventObject.Source, UNO_QUERY); + PaneContainer::iterator iDescriptor ( + ::std::find_if ( + mpPaneContainer->begin(), + mpPaneContainer->end(), + [&] (PaneDescriptor const& rPane) { return rPane.ComparePane(xPane); } )); + if (iDescriptor != mpPaneContainer->end()) + { + iDescriptor->mxPane = nullptr; + } + } +} + +Reference BasicPaneFactory::CreateFrameWindowPane ( + const Reference& rxPaneId) +{ + Reference xPane; + + if (mpViewShellBase != nullptr) + { + xPane = new FrameWindowPane(rxPaneId, mpViewShellBase->GetViewWindow()); + } + + return xPane; +} + +Reference BasicPaneFactory::CreateFullScreenPane ( + const Reference& rxComponentContext, + const Reference& rxPaneId) +{ + Reference xPane ( + new FullScreenPane( + rxComponentContext, + rxPaneId, + mpViewShellBase->GetViewWindow())); + + return xPane; +} + +Reference BasicPaneFactory::CreateChildWindowPane ( + const Reference& rxPaneId, + const PaneDescriptor& rDescriptor) +{ + Reference xPane; + + if (mpViewShellBase != nullptr) + { + // Create the corresponding shell and determine the id of the child window. + sal_uInt16 nChildWindowId = 0; + ::std::unique_ptr pShell; + switch (rDescriptor.mePaneId) + { + case LeftImpressPaneId: + pShell.reset(new LeftImpressPaneShell()); + nChildWindowId = ::sd::LeftPaneImpressChildWindow::GetChildWindowId(); + break; + + case LeftDrawPaneId: + pShell.reset(new LeftDrawPaneShell()); + nChildWindowId = ::sd::LeftPaneDrawChildWindow::GetChildWindowId(); + break; + + default: + break; + } + + // With shell and child window id create the ChildWindowPane + // wrapper. + if (pShell != nullptr) + { + xPane = new ChildWindowPane( + rxPaneId, + nChildWindowId, + *mpViewShellBase, + std::move(pShell)); + } + } + + return xPane; +} + +void BasicPaneFactory::ThrowIfDisposed() const +{ + if (m_bDisposed) + { + throw lang::DisposedException ("BasicPaneFactory object has already been disposed", + const_cast(static_cast(this))); + } +} + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/BasicToolBarFactory.cxx b/sd/source/ui/framework/factories/BasicToolBarFactory.cxx new file mode 100644 index 0000000000..0c6ac16d4a --- /dev/null +++ b/sd/source/ui/framework/factories/BasicToolBarFactory.cxx @@ -0,0 +1,144 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +//===== BasicToolBarFactory =================================================== + +BasicToolBarFactory::BasicToolBarFactory(const rtl::Reference<::sd::DrawController>& rxController) +{ + try + { + mxController = rxController; + + utl::MediaDescriptor aDescriptor (mxController->getModel()->getArgs()); + if ( ! aDescriptor.getUnpackedValueOrDefault( + utl::MediaDescriptor::PROP_PREVIEW, + false)) + { + // Register the factory for its supported tool bars. + mxConfigurationController = mxController->getConfigurationController(); + if (mxConfigurationController.is()) + { + mxConfigurationController->addResourceFactory( + FrameworkHelper::msViewTabBarURL, this); + } + + Reference xComponent (mxConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener(static_cast(this)); + } + else + { + // The view shell is in preview mode and thus does not need + // the view tab bar. + mxConfigurationController = nullptr; + } + } + catch (RuntimeException&) + { + Shutdown(); + throw; + } +} + + +BasicToolBarFactory::~BasicToolBarFactory() +{ +} + +void BasicToolBarFactory::disposing(std::unique_lock&) +{ + Shutdown(); +} + +void BasicToolBarFactory::Shutdown() +{ + Reference xComponent (mxConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->removeEventListener(static_cast(this)); + if (mxConfigurationController.is()) + { + mxConfigurationController->removeResourceFactoryForReference(this); + mxConfigurationController = nullptr; + } +} + +//----- lang::XEventListener -------------------------------------------------- + +void SAL_CALL BasicToolBarFactory::disposing ( + const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxConfigurationController) + mxConfigurationController = nullptr; +} + +//===== XPaneFactory ========================================================== + +Reference SAL_CALL BasicToolBarFactory::createResource ( + const Reference& rxToolBarId) +{ + ThrowIfDisposed(); + + if (rxToolBarId->getResourceURL() != FrameworkHelper::msViewTabBarURL) + throw lang::IllegalArgumentException(); + + Reference xToolBar = new ViewTabBar(rxToolBarId, mxController); + return xToolBar; +} + +void SAL_CALL BasicToolBarFactory::releaseResource ( + const Reference& rxToolBar) +{ + ThrowIfDisposed(); + + Reference xComponent (rxToolBar, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); +} + +void BasicToolBarFactory::ThrowIfDisposed() const +{ + if (m_bDisposed) + { + throw lang::DisposedException ("BasicToolBarFactory object has already been disposed", + const_cast(static_cast(this))); + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/BasicViewFactory.cxx b/sd/source/ui/framework/factories/BasicViewFactory.cxx new file mode 100644 index 0000000000..3ea7e37f1f --- /dev/null +++ b/sd/source/ui/framework/factories/BasicViewFactory.cxx @@ -0,0 +1,495 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace sd::framework { + +//===== ViewDescriptor ======================================================== + +class BasicViewFactory::ViewDescriptor +{ +public: + Reference mxView; + std::shared_ptr mpViewShell; + Reference mxViewId; + static bool CompareView (const std::shared_ptr& rpDescriptor, + const Reference& rxView) + { return rpDescriptor->mxView.get() == rxView.get(); } +}; + +//===== BasicViewFactory::ViewShellContainer ================================== + +class BasicViewFactory::ViewShellContainer + : public ::std::vector > +{ +public: + ViewShellContainer() {}; +}; + +class BasicViewFactory::ViewCache + : public ::std::vector > +{ +public: + ViewCache() {}; +}; + +//===== ViewFactory =========================================================== + +BasicViewFactory::BasicViewFactory (const rtl::Reference<::sd::DrawController>& rxController) + : mpViewShellContainer(new ViewShellContainer()), + mpBase(nullptr), + mpFrameView(nullptr), + mpWindow(VclPtr::Create(nullptr,WB_STDWORK)), + mpViewCache(std::make_shared()), + mxLocalPane(new Pane(Reference(), mpWindow.get())) +{ + try + { + // Tunnel through the controller to obtain a ViewShellBase. + mpBase = rxController->GetViewShellBase(); + + // Register the factory for its supported views. + mxConfigurationController = rxController->getConfigurationController(); + if ( ! mxConfigurationController.is()) + throw RuntimeException(); + mxConfigurationController->addResourceFactory(FrameworkHelper::msImpressViewURL, this); + mxConfigurationController->addResourceFactory(FrameworkHelper::msDrawViewURL, this); + mxConfigurationController->addResourceFactory(FrameworkHelper::msOutlineViewURL, this); + mxConfigurationController->addResourceFactory(FrameworkHelper::msNotesViewURL, this); + mxConfigurationController->addResourceFactory(FrameworkHelper::msHandoutViewURL, this); + mxConfigurationController->addResourceFactory(FrameworkHelper::msPresentationViewURL, this); + mxConfigurationController->addResourceFactory(FrameworkHelper::msSlideSorterURL, this); + } + catch (RuntimeException&) + { + mpBase = nullptr; + if (mxConfigurationController.is()) + mxConfigurationController->removeResourceFactoryForReference(this); + throw; + } +} + +BasicViewFactory::~BasicViewFactory() +{ +} + +void BasicViewFactory::disposing(std::unique_lock&) +{ + // Disconnect from the frame view. + if (mpFrameView != nullptr) + { + mpFrameView->Disconnect(); + mpFrameView = nullptr; + } + + // Release the view cache. + for (const auto& rxView : *mpViewCache) + { + ReleaseView(rxView, true); + } + + // Release the view shell container. At this point no one other than us + // should hold references to the view shells (at the moment this is a + // trivial requirement, because no one other than us holds a shared + // pointer). + // ViewShellContainer::const_iterator iView; + for (const auto& rxView : *mpViewShellContainer) + { + OSL_ASSERT(rxView->mpViewShell.use_count() == 1); + } + mpViewShellContainer.reset(); +} + +Reference SAL_CALL BasicViewFactory::createResource ( + const Reference& rxViewId) +{ + Reference xView; + const bool bIsCenterPane ( + rxViewId->isBoundToURL(FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)); + + // Get the pane for the anchor URL. + Reference xPane; + if (mxConfigurationController.is()) + xPane.set(mxConfigurationController->getResource(rxViewId->getAnchor()), UNO_QUERY); + + // For main views use the frame view of the last main view. + ::sd::FrameView* pFrameView = nullptr; + if (xPane.is() && bIsCenterPane) + { + pFrameView = mpFrameView; + } + + // Get Window pointer for XWindow of the pane. + vcl::Window* pWindow = nullptr; + if (xPane.is()) + pWindow = VCLUnoHelper::GetWindow(xPane->getWindow()); + + // Get the view frame. + SfxViewFrame* pFrame = nullptr; + if (mpBase != nullptr) + pFrame = &mpBase->GetViewFrame(); + + if (pFrame != nullptr && mpBase!=nullptr && pWindow!=nullptr) + { + // Try to get the view from the cache. + std::shared_ptr pDescriptor (GetViewFromCache(rxViewId, xPane)); + + // When the requested view is not in the cache then create a new view. + if (pDescriptor == nullptr) + { + pDescriptor = CreateView(rxViewId, *pFrame, *pWindow, xPane, pFrameView, bIsCenterPane); + } + + xView = pDescriptor->mxView; + + mpViewShellContainer->push_back(pDescriptor); + + if (bIsCenterPane) + ActivateCenterView(pDescriptor); + else + pWindow->Resize(); + } + + return xView; +} + +void SAL_CALL BasicViewFactory::releaseResource (const Reference& rxView) +{ + if ( ! rxView.is()) + throw lang::IllegalArgumentException(); + + if (!rxView.is() || !mpBase) + return; + + ViewShellContainer::iterator iViewShell ( + ::std::find_if( + mpViewShellContainer->begin(), + mpViewShellContainer->end(), + [&] (std::shared_ptr const& pVD) { + return ViewDescriptor::CompareView(pVD, rxView); + } )); + if (iViewShell == mpViewShellContainer->end()) + { + throw lang::IllegalArgumentException(); + } + + std::shared_ptr pViewShell ((*iViewShell)->mpViewShell); + + if ((*iViewShell)->mxViewId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + // Obtain a pointer to and connect to the frame view of the + // view. The next view, that is created, will be + // initialized with this frame view. + if (mpFrameView == nullptr) + { + mpFrameView = pViewShell->GetFrameView(); + if (mpFrameView) + mpFrameView->Connect(); + } + + // With the view in the center pane the sub controller is + // released, too. + mpBase->GetDrawController()->SetSubController( + Reference()); + + SfxViewShell* pSfxViewShell = pViewShell->GetViewShell(); + if (pSfxViewShell != nullptr) + pSfxViewShell->DisconnectAllClients(); + } + + ReleaseView(*iViewShell, false); + + mpViewShellContainer->erase(iViewShell); +} + +std::shared_ptr BasicViewFactory::CreateView ( + const Reference& rxViewId, + SfxViewFrame& rFrame, + vcl::Window& rWindow, + const Reference& rxPane, + FrameView* pFrameView, + const bool bIsCenterPane) +{ + auto pDescriptor = std::make_shared(); + + pDescriptor->mpViewShell = CreateViewShell( + rxViewId, + rFrame, + rWindow, + pFrameView); + pDescriptor->mxViewId = rxViewId; + + if (pDescriptor->mpViewShell != nullptr) + { + pDescriptor->mpViewShell->Init(bIsCenterPane); + mpBase->GetViewShellManager()->ActivateViewShell(pDescriptor->mpViewShell.get()); + + Reference xWindow(rxPane->getWindow()); + rtl::Reference wrapper(new ViewShellWrapper( + pDescriptor->mpViewShell, + rxViewId, + xWindow)); + + // register ViewShellWrapper on pane window + if (xWindow.is()) + { + xWindow->addWindowListener(wrapper); + if (pDescriptor->mpViewShell != nullptr) + { + pDescriptor->mpViewShell->Resize(); + } + } + + pDescriptor->mxView = wrapper.get(); + } + + return pDescriptor; +} + +std::shared_ptr BasicViewFactory::CreateViewShell ( + const Reference& rxViewId, + SfxViewFrame& rFrame, + vcl::Window& rWindow, + FrameView* pFrameView) +{ + std::shared_ptr pViewShell; + const OUString& rsViewURL (rxViewId->getResourceURL()); + if (rsViewURL == FrameworkHelper::msImpressViewURL) + { + pViewShell = + std::make_shared( + *mpBase, + &rWindow, + PageKind::Standard, + pFrameView); + pViewShell->GetContentWindow()->set_id("impress_win"); + } + else if (rsViewURL == FrameworkHelper::msDrawViewURL) + { + pViewShell = std::shared_ptr( + new GraphicViewShell(*mpBase, &rWindow, pFrameView), + o3tl::default_delete()); + pViewShell->GetContentWindow()->set_id("draw_win"); + } + else if (rsViewURL == FrameworkHelper::msOutlineViewURL) + { + pViewShell = + std::make_shared( + &rFrame, + *mpBase, + &rWindow, + pFrameView); + pViewShell->GetContentWindow()->set_id("outline_win"); + } + else if (rsViewURL == FrameworkHelper::msNotesViewURL) + { + pViewShell = + std::make_shared( + *mpBase, + &rWindow, + PageKind::Notes, + pFrameView); + pViewShell->GetContentWindow()->set_id("notes_win"); + } + else if (rsViewURL == FrameworkHelper::msHandoutViewURL) + { + pViewShell = + std::make_shared( + *mpBase, + &rWindow, + PageKind::Handout, + pFrameView); + pViewShell->GetContentWindow()->set_id("handout_win"); + } + else if (rsViewURL == FrameworkHelper::msPresentationViewURL) + { + pViewShell = + std::make_shared( + *mpBase, + &rWindow, + pFrameView); + pViewShell->GetContentWindow()->set_id("presentation_win"); + } + else if (rsViewURL == FrameworkHelper::msSlideSorterURL) + { + pViewShell = ::sd::slidesorter::SlideSorterViewShell::Create ( + &rFrame, + *mpBase, + &rWindow, + pFrameView); + pViewShell->GetContentWindow()->set_id("slidesorter"); + } + + return pViewShell; +} + +void BasicViewFactory::ReleaseView ( + const std::shared_ptr& rpDescriptor, + bool bDoNotCache) +{ + bool bIsCacheable (!bDoNotCache && IsCacheable(rpDescriptor)); + + if (bIsCacheable) + { + Reference xResource (rpDescriptor->mxView, UNO_QUERY); + if (xResource.is()) + { + if (mxLocalPane.is()) + if (xResource->relocateToAnchor(mxLocalPane)) + mpViewCache->push_back(rpDescriptor); + else + bIsCacheable = false; + else + bIsCacheable = false; + } + else + { + bIsCacheable = false; + } + } + + if ( ! bIsCacheable) + { + // Shut down the current view shell. + rpDescriptor->mpViewShell->Shutdown (); + mpBase->GetDocShell()->Disconnect(rpDescriptor->mpViewShell.get()); + mpBase->GetViewShellManager()->DeactivateViewShell(rpDescriptor->mpViewShell.get()); + + Reference xComponent (rpDescriptor->mxView, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + } +} + +bool BasicViewFactory::IsCacheable (const std::shared_ptr& rpDescriptor) +{ + bool bIsCacheable (false); + + Reference xResource (rpDescriptor->mxView, UNO_QUERY); + if (xResource.is()) + { + static ::std::vector > s_aCacheableResources = [&]() + { + ::std::vector > tmp; + FrameworkHelper::Instance(*mpBase); + + // The slide sorter and the task panel are cacheable and relocatable. + tmp.push_back(FrameworkHelper::CreateResourceId( + FrameworkHelper::msSlideSorterURL, FrameworkHelper::msLeftDrawPaneURL)); + tmp.push_back(FrameworkHelper::CreateResourceId( + FrameworkHelper::msSlideSorterURL, FrameworkHelper::msLeftImpressPaneURL)); + return tmp; + }(); + + bIsCacheable = std::any_of(s_aCacheableResources.begin(), s_aCacheableResources.end(), + [&rpDescriptor](const Reference& rxId) { return rxId->compareTo(rpDescriptor->mxViewId) == 0; }); + } + + return bIsCacheable; +} + +std::shared_ptr BasicViewFactory::GetViewFromCache ( + const Reference& rxViewId, + const Reference& rxPane) +{ + std::shared_ptr pDescriptor; + + // Search for the requested view in the cache. + ViewCache::iterator iEntry = std::find_if(mpViewCache->begin(), mpViewCache->end(), + [&rxViewId](const ViewCache::value_type& rxEntry) { return rxEntry->mxViewId->compareTo(rxViewId) == 0; }); + if (iEntry != mpViewCache->end()) + { + pDescriptor = *iEntry; + mpViewCache->erase(iEntry); + } + + // When the view has been found then relocate it to the given pane and + // remove it from the cache. + if (pDescriptor != nullptr) + { + bool bRelocationSuccessful (false); + Reference xResource (pDescriptor->mxView, UNO_QUERY); + if (xResource.is() && rxPane.is()) + { + if (xResource->relocateToAnchor(rxPane)) + bRelocationSuccessful = true; + } + + if ( ! bRelocationSuccessful) + { + ReleaseView(pDescriptor, true); + pDescriptor.reset(); + } + } + + return pDescriptor; +} + +void BasicViewFactory::ActivateCenterView ( + const std::shared_ptr& rpDescriptor) +{ + mpBase->GetDocShell()->Connect(rpDescriptor->mpViewShell.get()); + + // During the creation of the new sub-shell, resize requests were not + // forwarded to it because it was not yet registered. Therefore, we + // have to request a resize now. + rpDescriptor->mpViewShell->UIFeatureChanged(); + if (mpBase->GetDocShell()->IsInPlaceActive()) + mpBase->GetViewFrame().Resize(true); + + mpBase->GetDrawController()->SetSubController( + rpDescriptor->mpViewShell->CreateSubController()); +} + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/ChildWindowPane.cxx b/sd/source/ui/framework/factories/ChildWindowPane.cxx new file mode 100644 index 0000000000..1eaf0f0aee --- /dev/null +++ b/sd/source/ui/framework/factories/ChildWindowPane.cxx @@ -0,0 +1,214 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include + +#include "ChildWindowPane.hxx" + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +ChildWindowPane::ChildWindowPane ( + const Reference& rxPaneId, + sal_uInt16 nChildWindowId, + ViewShellBase& rViewShellBase, + ::std::unique_ptr && pShell) + : ChildWindowPaneInterfaceBase(rxPaneId,nullptr), + mnChildWindowId(nChildWindowId), + mrViewShellBase(rViewShellBase), + mpShell(std::move(pShell)), + mbHasBeenActivated(false) +{ + mrViewShellBase.GetViewShellManager()->ActivateShell(mpShell.get()); + + SfxViewFrame& rViewFrame = mrViewShellBase.GetViewFrame(); + + if (mrViewShellBase.IsActive()) + { + if (rViewFrame.KnowsChildWindow(mnChildWindowId)) + { + if (rViewFrame.HasChildWindow(mnChildWindowId)) + { + // The ViewShellBase has already been activated. Make + // the child window visible as soon as possible. + rViewFrame.SetChildWindow(mnChildWindowId, true); + } + else + { + // The window is created asynchronously. Rely on the + // ConfigurationUpdater to try another update, and with + // that another request for this window, in a short + // time. + } + } + else + { + SAL_WARN("sd", "ChildWindowPane:not known"); + } + } + else + { + // The ViewShellBase has not yet been activated. Hide the + // window and wait a little before it is made visible. See + // comments in the GetWindow() method for an explanation. + rViewFrame.SetChildWindow(mnChildWindowId, false); + } +} + +ChildWindowPane::~ChildWindowPane() +{ +} + +void ChildWindowPane::Hide() +{ + SfxViewFrame& rViewFrame = mrViewShellBase.GetViewFrame(); + if (rViewFrame.KnowsChildWindow(mnChildWindowId)) + if (rViewFrame.HasChildWindow(mnChildWindowId)) + rViewFrame.SetChildWindow(mnChildWindowId, false); + + // Release the window because when the child window is shown again it + // may use a different window. + mxWindow = nullptr; +} + +void SAL_CALL ChildWindowPane::disposing() +{ + ::osl::MutexGuard aGuard (m_aMutex); + + mrViewShellBase.GetViewShellManager()->DeactivateShell(mpShell.get()); + mpShell.reset(); + + if (mxWindow.is()) + { + mxWindow->removeEventListener(this); + } + + Pane::disposing(); +} + +vcl::Window* ChildWindowPane::GetWindow() +{ + do + { + if (mxWindow.is()) + // Window already exists => nothing to do. + break; + + // When the window is not yet present then obtain it only when the + // shell has already been activated. The activation is not + // necessary for the code to work properly but is used to optimize + // the layouting and displaying of the window. When it is made + // visible too early then some layouting seems to be made twice or at + // an inconvenient time and the overall process of initializing the + // Impress takes longer. + if (!mbHasBeenActivated && mpShell != nullptr && !mpShell->IsActive()) + break; + + mbHasBeenActivated = true; + SfxViewFrame& rViewFrame = mrViewShellBase.GetViewFrame(); + // The view frame has to know the child window. This can be the + // case, when for example the document is in read-only mode: the + // task pane is then not available. + if ( ! rViewFrame.KnowsChildWindow(mnChildWindowId)) + break; + + rViewFrame.SetChildWindow(mnChildWindowId, true); + SfxChildWindow* pChildWindow = rViewFrame.GetChildWindow(mnChildWindowId); + if (pChildWindow == nullptr) + if (rViewFrame.HasChildWindow(mnChildWindowId)) + { + // The child window is not yet visible. Ask the view frame + // to show it and try again to get access to the child + // window. + rViewFrame.ShowChildWindow(mnChildWindowId); + pChildWindow = rViewFrame.GetChildWindow(mnChildWindowId); + } + + // When the child window is still not visible then we have to try later. + if (pChildWindow == nullptr) + break; + + // From the child window get the docking window and from that the + // content window that is the container for the actual content. + TitledDockingWindow* pDockingWindow = dynamic_cast( + pChildWindow->GetWindow()); + if (pDockingWindow == nullptr) + break; + + // At last, we have access to the window and its UNO wrapper. + mpWindow = &pDockingWindow->GetContentWindow(); + mxWindow = VCLUnoHelper::GetInterface(mpWindow); + + // Register as window listener to be informed when the child window + // is hidden. + if (mxWindow.is()) + mxWindow->addEventListener(this); + } + while (false); + + return mpWindow; +} + +Reference SAL_CALL ChildWindowPane::getWindow() +{ + if (mpWindow == nullptr || ! mxWindow.is()) + GetWindow(); + return Pane::getWindow(); +} + +IMPLEMENT_FORWARD_XINTERFACE2( + ChildWindowPane, + ChildWindowPaneInterfaceBase, + Pane); +IMPLEMENT_FORWARD_XTYPEPROVIDER2( + ChildWindowPane, + ChildWindowPaneInterfaceBase, + Pane); + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL ChildWindowPane::disposing (const lang::EventObject& rEvent) +{ + ThrowIfDisposed(); + + if (rEvent.Source == mxWindow) + { + // The window is gone but the pane remains alive. The next call to + // GetWindow() may create the window anew. + mxWindow = nullptr; + mpWindow = nullptr; + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/ChildWindowPane.hxx b/sd/source/ui/framework/factories/ChildWindowPane.hxx new file mode 100644 index 0000000000..0821777578 --- /dev/null +++ b/sd/source/ui/framework/factories/ChildWindowPane.hxx @@ -0,0 +1,101 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include +#include +#include + +class SfxShell; + +namespace sd { class ViewShellBase; } +namespace com::sun::star::awt { class XWindow; } +namespace com::sun::star::drawing::framework { class XResourceId; } + +namespace sd::framework { + +typedef ::cppu::ImplInheritanceHelper < + ::sd::framework::Pane, + css::lang::XEventListener + > ChildWindowPaneInterfaceBase; + +/** The ChildWindowPane listens to the child window and disposes itself when + the child window becomes inaccessible. This happens for instance when a + document is made read-only and the task pane is turned off. +*/ +class ChildWindowPane + : public ChildWindowPaneInterfaceBase +{ +public: + ChildWindowPane ( + const css::uno::Reference& rxPaneId, + sal_uInt16 nChildWindowId, + ViewShellBase& rViewShellBase, + ::std::unique_ptr && pShell); + virtual ~ChildWindowPane() override; + + /** Hide the pane. To make the pane visible again, call GetWindow(). + */ + void Hide(); + + virtual void SAL_CALL disposing() override; + + /** This returns the content window when the child window is already + visible. Otherwise is returned. In that case a later call + may return the requested window (making a child window visible is an + asynchronous process.) + Note that GetWindow() may return different Window pointers when + Hide() is called in between. + */ + virtual vcl::Window* GetWindow() override; + + /** The local getWindow() first calls GetWindow() to provide a valid + window pointer before forwarding the call to the base class. + */ + virtual css::uno::Reference + SAL_CALL getWindow() override; + + DECLARE_XINTERFACE() + DECLARE_XTYPEPROVIDER() + + // XEventListener + + virtual void SAL_CALL disposing( + const css::lang::EventObject& rEvent) override; + +private: + sal_uInt16 mnChildWindowId; + ViewShellBase& mrViewShellBase; + ::std::unique_ptr mpShell; + + /** This flag is set when the pane shell has been activated at least + once. It is used to optimize the start-up performance (by not + showing the window too early) and by not delaying its creation at + later times. + */ + bool mbHasBeenActivated; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/FrameWindowPane.cxx b/sd/source/ui/framework/factories/FrameWindowPane.cxx new file mode 100644 index 0000000000..1f4b387d88 --- /dev/null +++ b/sd/source/ui/framework/factories/FrameWindowPane.cxx @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "FrameWindowPane.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework +{ +FrameWindowPane::FrameWindowPane(const Reference& rxPaneId, vcl::Window* pWindow) + : Pane(rxPaneId, pWindow) +{ +} + +FrameWindowPane::~FrameWindowPane() noexcept {} + +sal_Bool SAL_CALL FrameWindowPane::isAnchorOnly() { return false; } + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/FrameWindowPane.hxx b/sd/source/ui/framework/factories/FrameWindowPane.hxx new file mode 100644 index 0000000000..67da37fdff --- /dev/null +++ b/sd/source/ui/framework/factories/FrameWindowPane.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace com::sun::star::drawing::framework +{ +class XResourceId; +} + +namespace sd::framework +{ +/** This subclass is not necessary anymore. We can remove it if that + remains so. +*/ +class FrameWindowPane : public Pane +{ +public: + FrameWindowPane(const css::uno::Reference& rxPaneId, + vcl::Window* pWindow); + virtual ~FrameWindowPane() noexcept override; + + /** A frame window typically can (and should) exists on its own without + children, if only to visualize that something (a view) is missing. + Therefore this method always returns . + */ + virtual sal_Bool SAL_CALL isAnchorOnly() override; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/FullScreenPane.cxx b/sd/source/ui/framework/factories/FullScreenPane.cxx new file mode 100644 index 0000000000..39da06144c --- /dev/null +++ b/sd/source/ui/framework/factories/FullScreenPane.cxx @@ -0,0 +1,235 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "FullScreenPane.hxx" +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +FullScreenPane::FullScreenPane ( + const Reference& rxComponentContext, + const Reference& rxPaneId, + const vcl::Window* pViewShellWindow) + : FrameWindowPane(rxPaneId,nullptr), + mxComponentContext(rxComponentContext) +{ + sal_Int32 nScreenNumber = 1; + bool bFullScreen = true; + ExtractArguments(rxPaneId, nScreenNumber, bFullScreen); + + vcl::Window* pParent = nullptr; + WinBits nStyle = bFullScreen ? 0 : (WB_BORDER | WB_MOVEABLE | WB_SIZEABLE); + + mpWorkWindow.reset(VclPtr::Create( + pParent, + nStyle)); // For debugging (non-fullscreen) use WB_BORDER | WB_MOVEABLE | WB_SIZEABLE)); + + if ( ! rxPaneId.is()) + throw lang::IllegalArgumentException(); + + if (!mpWorkWindow) + return; + + // Create a new top-level window that is displayed full screen. + if (bFullScreen) + mpWorkWindow->ShowFullScreenMode(bFullScreen, nScreenNumber); + + // For debugging (non-fullscreen) use mpWorkWindow->SetScreenNumber(nScreenNumber); + mpWorkWindow->SetMenuBarMode(MenuBarMode::Hide); + mpWorkWindow->SetBorderStyle(WindowBorderStyle::REMOVEBORDER); + mpWorkWindow->SetBackground(Wallpaper()); + // Don't show the window right now in order to allow the setting of an + // accessibility object: accessibility objects are typically + // requested by AT-tools when the window is shown. Chaining it + // afterwards may or may not work. + + // Add resize listener at the work window. + Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler)); + mpWorkWindow->AddEventListener(aWindowEventHandler); + + // Set title and icon of the new window to those of the current window + // of the view shell. + if (pViewShellWindow != nullptr) + { + const SystemWindow* pSystemWindow = pViewShellWindow->GetSystemWindow(); + mpWorkWindow->SetText(pSystemWindow->GetText()); + mpWorkWindow->SetIcon(pSystemWindow->GetIcon()); + } + + // For some reason the VCL canvas can not paint into a WorkWindow. + // Therefore a child window is created that covers the WorkWindow + // completely. + mpWindow = VclPtr::Create(mpWorkWindow.get()); + mpWindow->SetPosSizePixel(Point(0,0), mpWorkWindow->GetSizePixel()); + mpWindow->SetBackground(Wallpaper()); + mxWindow = VCLUnoHelper::GetInterface(mpWindow); + + // Create the canvas. + mxCanvas = CreateCanvas(); + + mpWindow->GrabFocus(); +} + +FullScreenPane::~FullScreenPane() noexcept +{ +} + +void SAL_CALL FullScreenPane::disposing() +{ + mpWindow.disposeAndClear(); + + if (mpWorkWindow) + { + Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler)); + mpWorkWindow->RemoveEventListener(aWindowEventHandler); + mpWorkWindow.disposeAndClear(); + } + + FrameWindowPane::disposing(); +} + +//----- XPane ----------------------------------------------------------------- + +sal_Bool SAL_CALL FullScreenPane::isVisible() +{ + ThrowIfDisposed(); + + if (mpWindow != nullptr) + return mpWindow->IsReallyVisible(); + else + return false; +} + +void SAL_CALL FullScreenPane::setVisible (const sal_Bool bIsVisible) +{ + ThrowIfDisposed(); + + if (mpWindow != nullptr) + mpWindow->Show(bIsVisible); + if (mpWorkWindow != nullptr) + mpWorkWindow->Show(bIsVisible); +} + +Reference SAL_CALL FullScreenPane::getAccessible() +{ + ThrowIfDisposed(); + + if (mpWorkWindow != nullptr) + return mpWorkWindow->GetAccessible(false); + else + return nullptr; +} + +void SAL_CALL FullScreenPane::setAccessible ( + const Reference& rxAccessible) +{ + ThrowIfDisposed(); + + if (mpWindow == nullptr) + return; + + Reference xInitializable (rxAccessible, UNO_QUERY); + if (xInitializable.is()) + { + vcl::Window* pParentWindow = mpWindow->GetParent(); + Reference xAccessibleParent; + if (pParentWindow != nullptr) + xAccessibleParent = pParentWindow->GetAccessible(); + Sequence aArguments{ Any(xAccessibleParent) }; + xInitializable->initialize(aArguments); + } + GetWindow()->SetAccessible(rxAccessible); +} + +IMPL_LINK(FullScreenPane, WindowEventHandler, VclWindowEvent&, rEvent, void) +{ + switch (rEvent.GetId()) + { + case VclEventId::WindowResize: + GetWindow()->SetPosPixel(Point(0,0)); + GetWindow()->SetSizePixel(Size( + mpWorkWindow->GetSizePixel().Width(), + mpWorkWindow->GetSizePixel().Height())); + break; + + case VclEventId::ObjectDying: + mpWorkWindow.disposeAndClear(); + break; + + default: break; + } +} + +Reference FullScreenPane::CreateCanvas() +{ + VclPtr pWindow = VCLUnoHelper::GetWindow(mxWindow); + if (!pWindow) + throw RuntimeException(); + + Sequence aArg{ // common: first any is VCL pointer to window (for VCL canvas) + Any(reinterpret_cast(pWindow.get())), + Any(css::awt::Rectangle()), + Any(false), + Any(mxWindow) + }; + + Reference xFactory ( + mxComponentContext->getServiceManager(), UNO_QUERY_THROW); + return Reference( + xFactory->createInstanceWithArguments("com.sun.star.rendering.SpriteCanvas.VCL", + aArg), + UNO_QUERY); +} + +void FullScreenPane::ExtractArguments ( + const Reference& rxPaneId, + sal_Int32& rnScreenNumberReturnValue, + bool& rbFullScreen) +{ + // Extract arguments from the resource URL. + const util::URL aURL = rxPaneId->getFullResourceURL(); + for (sal_Int32 nIndex{ 0 }; nIndex >= 0; ) + { + const std::u16string_view aToken = o3tl::getToken(aURL.Arguments, 0, '&', nIndex); + std::u16string_view sValue; + if (o3tl::starts_with(aToken, u"ScreenNumber=", &sValue)) + { + rnScreenNumberReturnValue = o3tl::toInt32(sValue); + } + if (o3tl::starts_with(aToken, u"FullScreen=", &sValue)) + { + rbFullScreen = o3tl::equalsAscii(sValue, "true"); + } + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/FullScreenPane.hxx b/sd/source/ui/framework/factories/FullScreenPane.hxx new file mode 100644 index 0000000000..138503d02f --- /dev/null +++ b/sd/source/ui/framework/factories/FullScreenPane.hxx @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "FrameWindowPane.hxx" +#include +#include + +class VclWindowEvent; + +namespace vcl { class Window; } +namespace com::sun::star::uno { class XComponentContext; } + +namespace sd::framework { + +/** The full screen pane creates a pane that covers the complete application + window, i.e. that hides menu bar, tool bars, status bars. +*/ +class FullScreenPane + : public FrameWindowPane +{ +public: + /** Create a new full screen pane. + @param rxComponentContext + Used for creating a new canvas. + @param rxPaneId + The resource id of the new pane. + @param pViewShellWindow + The top-level parent of this window is used to obtain title and + icon for the new top-level window. + */ + FullScreenPane ( + const css::uno::Reference& rxComponentContext, + const css::uno::Reference& rxPaneId, + const vcl::Window* pViewShellWindow); + virtual ~FullScreenPane() noexcept override; + + virtual void SAL_CALL disposing() override; + + //----- XPane ------------------------------------------------------------- + + virtual sal_Bool SAL_CALL isVisible() override; + + virtual void SAL_CALL setVisible (sal_Bool bIsVisible) override; + + virtual css::uno::Reference SAL_CALL getAccessible() override; + + virtual void SAL_CALL setAccessible ( + const css::uno::Reference& rxAccessible) override; + + DECL_LINK(WindowEventHandler, VclWindowEvent&, void); + +protected: + virtual css::uno::Reference + CreateCanvas() override; + +private: + css::uno::Reference mxComponentContext; + VclPtr mpWorkWindow; + + static void ExtractArguments ( + const css::uno::Reference& rxPaneId, + sal_Int32& rnScreenNumberReturnValue, + bool& rbFullScreen); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/Pane.cxx b/sd/source/ui/framework/factories/Pane.cxx new file mode 100644 index 0000000000..c128a5351f --- /dev/null +++ b/sd/source/ui/framework/factories/Pane.cxx @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +Pane::Pane ( + const Reference& rxPaneId, + vcl::Window* pWindow) + noexcept + : PaneInterfaceBase(m_aMutex), + mxPaneId(rxPaneId), + mpWindow(pWindow), + mxWindow(VCLUnoHelper::GetInterface(pWindow)) +{ +} + +Pane::~Pane() +{ +} + +void Pane::disposing() +{ + mxWindow = nullptr; + mpWindow = nullptr; +} + +vcl::Window* Pane::GetWindow() +{ + if (mxWindow.is()) + return mpWindow; + else + return nullptr; +} + +//----- XPane ----------------------------------------------------------------- + +Reference SAL_CALL Pane::getWindow() +{ + ThrowIfDisposed(); + + return mxWindow; +} + +Reference SAL_CALL Pane::getCanvas() +{ + ::osl::MutexGuard aGuard (m_aMutex); + ThrowIfDisposed(); + + if ( ! mxCanvas.is()) + mxCanvas = CreateCanvas(); + + return mxCanvas; +} + +//----- XPane2 ---------------------------------------------------------------- + +sal_Bool SAL_CALL Pane::isVisible() +{ + ThrowIfDisposed(); + + const vcl::Window* pWindow = GetWindow(); + if (pWindow != nullptr) + return pWindow->IsVisible(); + else + return false; +} + +void SAL_CALL Pane::setVisible (sal_Bool bIsVisible) +{ + ThrowIfDisposed(); + + vcl::Window* pWindow = GetWindow(); + if (pWindow != nullptr) + pWindow->Show(bIsVisible); +} + +Reference SAL_CALL Pane::getAccessible() +{ + ThrowIfDisposed(); + vcl::Window* pWindow = GetWindow(); + if (pWindow != nullptr) + return pWindow->GetAccessible(false); + else + return nullptr; +} + +void SAL_CALL Pane::setAccessible ( + const Reference& rxAccessible) +{ + ThrowIfDisposed(); + vcl::Window* pWindow = GetWindow(); + if (pWindow != nullptr) + pWindow->SetAccessible(rxAccessible); +} + +//----- XResource ------------------------------------------------------------- + +Reference SAL_CALL Pane::getResourceId() +{ + ThrowIfDisposed(); + + return mxPaneId; +} + +sal_Bool SAL_CALL Pane::isAnchorOnly() +{ + return true; +} + +Reference Pane::CreateCanvas() +{ + Reference xCanvas; + + if (mpWindow != nullptr) + { + ::cppcanvas::SpriteCanvasSharedPtr pCanvas ( + cppcanvas::VCLFactory::createSpriteCanvas(*mpWindow)); + if (pCanvas) + xCanvas.set(pCanvas->getUNOSpriteCanvas()); + } + + return xCanvas; +} + +void Pane::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose) + { + throw lang::DisposedException ("Pane object has already been disposed", + const_cast(static_cast(this))); + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/PresentationFactory.cxx b/sd/source/ui/framework/factories/PresentationFactory.cxx new file mode 100644 index 0000000000..d859ac3fbe --- /dev/null +++ b/sd/source/ui/framework/factories/PresentationFactory.cxx @@ -0,0 +1,150 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace com::sun::star::uno { class XComponentContext; } + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing::framework; + + +namespace sd::framework { + +namespace { + +typedef comphelper::WeakComponentImplHelper PresentationViewInterfaceBase; + +/** The PresentationView is not an actual view, it is a marker whose + existence in a configuration indicates that a slideshow is running + (in another application window). +*/ +class PresentationView + : public PresentationViewInterfaceBase +{ +public: + explicit PresentationView (const Reference& rxViewId) + : mxResourceId(rxViewId) {}; + + // XView + + virtual Reference SAL_CALL getResourceId() override + { return mxResourceId; }; + + virtual sal_Bool SAL_CALL isAnchorOnly() override + { return false; } + +private: + Reference mxResourceId; +}; + +} // end of anonymous namespace. + +//===== PresentationFactory =================================================== + +constexpr OUString gsPresentationViewURL = u"private:resource/view/Presentation"_ustr; + +PresentationFactory::PresentationFactory ( + const rtl::Reference<::sd::DrawController>& rxController) + : mxController(rxController) +{ +} + +PresentationFactory::~PresentationFactory() +{ +} + +//----- XViewFactory ---------------------------------------------------------- + +Reference SAL_CALL PresentationFactory::createResource ( + const Reference& rxViewId) +{ + ThrowIfDisposed(); + + if (rxViewId.is()) + if ( ! rxViewId->hasAnchor() && rxViewId->getResourceURL() == gsPresentationViewURL) + return new PresentationView(rxViewId); + + return Reference(); +} + +void SAL_CALL PresentationFactory::releaseResource ( + const Reference&) +{ + ThrowIfDisposed(); + + if (mxController) + { + ViewShellBase* pBase = mxController->GetViewShellBase(); + if (pBase != nullptr) + SlideShow::Stop( *pBase ); + } +} + +//===== XConfigurationChangeListener ========================================== + +void SAL_CALL PresentationFactory::notifyConfigurationChange ( + const ConfigurationChangeEvent&) +{} + +//===== lang::XEventListener ================================================== + +void SAL_CALL PresentationFactory::disposing ( + const lang::EventObject&) +{} + +void PresentationFactory::ThrowIfDisposed() const +{ + if (m_bDisposed) + { + throw lang::DisposedException ("PresentationFactory object has already been disposed", + const_cast(static_cast(this))); + } +} + +void PresentationFactory::install(const rtl::Reference<::sd::DrawController>& rxController) +{ + try + { + Reference xCC (rxController->getConfigurationController()); + if (xCC.is()) + xCC->addResourceFactory( + gsPresentationViewURL, + new PresentationFactory(rxController)); + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/factories/ViewShellWrapper.cxx b/sd/source/ui/framework/factories/ViewShellWrapper.cxx new file mode 100644 index 0000000000..294b7a550f --- /dev/null +++ b/sd/source/ui/framework/factories/ViewShellWrapper.cxx @@ -0,0 +1,239 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::com::sun::star::awt::XWindow; + +namespace sd::framework { + +ViewShellWrapper::ViewShellWrapper ( + const std::shared_ptr& pViewShell, + const Reference& rxViewId, + const Reference& rxWindow) + : mpViewShell(pViewShell), + mpSlideSorterViewShell( + std::dynamic_pointer_cast< ::sd::slidesorter::SlideSorterViewShell >( pViewShell )), + mxViewId(rxViewId), + mxWindow(rxWindow) +{ +} + +ViewShellWrapper::~ViewShellWrapper() +{ +} + +void ViewShellWrapper::disposing(std::unique_lock&) +{ + SAL_INFO("sd.ui", "disposing ViewShellWrapper " << this); + Reference xWindow (mxWindow); + if (xWindow.is()) + { + SAL_INFO( + "sd.ui", + "removing ViewShellWrapper " << this << " from window listener at " + << mxWindow.get()); + xWindow->removeWindowListener(this); + } + + mpSlideSorterViewShell.reset(); + mpViewShell.reset(); +} + +uno::Any SAL_CALL ViewShellWrapper::queryInterface( const uno::Type & rType ) +{ + if( mpSlideSorterViewShell && + rType == cppu::UnoType::get() ) + { + uno::Reference xSupplier( this ); + return Any(xSupplier); + } + else + return ViewShellWrapperInterfaceBase::queryInterface( rType ); +} + +//----- XResource ------------------------------------------------------------- + +Reference SAL_CALL ViewShellWrapper::getResourceId() +{ + return mxViewId; +} + +sal_Bool SAL_CALL ViewShellWrapper::isAnchorOnly() +{ + return false; +} + +//----- XSelectionSupplier -------------------------------------------------- + +sal_Bool SAL_CALL ViewShellWrapper::select( const css::uno::Any& aSelection ) +{ + if (!mpSlideSorterViewShell) + return false; + + ::sd::slidesorter::controller::SlideSorterController& rSlideSorterController + = mpSlideSorterViewShell->GetSlideSorter().GetController(); + ::sd::slidesorter::controller::PageSelector& rSelector (rSlideSorterController.GetPageSelector()); + rSelector.DeselectAllPages(); + Sequence > xPages; + aSelection >>= xPages; + for (const auto& rPage : std::as_const(xPages)) + { + Reference xSet (rPage, UNO_QUERY); + if (xSet.is()) + { + try + { + Any aNumber = xSet->getPropertyValue("Number"); + sal_Int32 nPageNumber = 0; + aNumber >>= nPageNumber; + nPageNumber -=1; // Transform 1-based page numbers to 0-based ones. + rSelector.SelectPage(nPageNumber); + } + catch (const RuntimeException&) + { + } + } + } + + return true; +} + +uno::Any SAL_CALL ViewShellWrapper::getSelection() +{ + Any aResult; + + if (!mpSlideSorterViewShell) + return aResult; + + slidesorter::model::PageEnumeration aSelectedPages ( + slidesorter::model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mpSlideSorterViewShell->GetSlideSorter().GetModel())); + int nSelectedPageCount ( + mpSlideSorterViewShell->GetSlideSorter().GetController().GetPageSelector().GetSelectedPageCount()); + + Sequence > aPages(nSelectedPageCount); + auto aPagesRange = asNonConstRange(aPages); + int nIndex = 0; + while (aSelectedPages.HasMoreElements() && nIndexGetPage()->getUnoPage(); + } + aResult <<= aPages; + + return aResult; +} + +void SAL_CALL ViewShellWrapper::addSelectionChangeListener( const uno::Reference< view::XSelectionChangeListener >& ) +{ +} + +void SAL_CALL ViewShellWrapper::removeSelectionChangeListener( const uno::Reference< view::XSelectionChangeListener >& ) +{ +} + +//----- XRelocatableResource -------------------------------------------------- + +sal_Bool SAL_CALL ViewShellWrapper::relocateToAnchor ( + const Reference& xResource) +{ + bool bResult (false); + + Reference xPane (xResource, UNO_QUERY); + if (xPane.is()) + { + // Detach from the window of the old pane. + Reference xWindow (mxWindow); + if (xWindow.is()) + xWindow->removeWindowListener(this); + mxWindow = nullptr; + + if (mpViewShell != nullptr) + { + VclPtr pWindow = VCLUnoHelper::GetWindow(xPane->getWindow()); + if (pWindow && mpViewShell->RelocateToParentWindow(pWindow)) + { + bResult = true; + + // Attach to the window of the new pane. + xWindow = xPane->getWindow(); + if (xWindow.is()) + { + xWindow->addWindowListener(this); + mpViewShell->Resize(); + } + } + } + } + + return bResult; +} + +//===== awt::XWindowListener ================================================== + +void SAL_CALL ViewShellWrapper::windowResized (const awt::WindowEvent&) +{ + ViewShell* pViewShell (mpViewShell.get()); + if (pViewShell != nullptr) + pViewShell->Resize(); +} + +void SAL_CALL ViewShellWrapper::windowMoved (const awt::WindowEvent&) {} + +void SAL_CALL ViewShellWrapper::windowShown (const lang::EventObject&) +{ + ViewShell* pViewShell (mpViewShell.get()); + if (pViewShell != nullptr) + pViewShell->Resize(); +} + +void SAL_CALL ViewShellWrapper::windowHidden (const lang::EventObject&) {} + +//===== XEventListener ======================================================== + +void SAL_CALL ViewShellWrapper::disposing (const lang::EventObject& rEvent) +{ + if (rEvent.Source == mxWindow) + mxWindow = nullptr; +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/CenterViewFocusModule.cxx b/sd/source/ui/framework/module/CenterViewFocusModule.cxx new file mode 100644 index 0000000000..2c799e04bb --- /dev/null +++ b/sd/source/ui/framework/module/CenterViewFocusModule.cxx @@ -0,0 +1,149 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "CenterViewFocusModule.hxx" + +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace sd::framework { + +//===== CenterViewFocusModule ==================================================== + +CenterViewFocusModule::CenterViewFocusModule (rtl::Reference const & rxController) + : mbValid(false), + mpBase(nullptr), + mbNewViewCreated(false) +{ + if (rxController.is()) + { + mxConfigurationController = rxController->getConfigurationController(); + + // Tunnel through the controller to obtain a ViewShellBase. + if (rxController != nullptr) + mpBase = rxController->GetViewShellBase(); + + // Check, if all required objects do exist. + if (mxConfigurationController.is() && mpBase!=nullptr) + { + mbValid = true; + } + } + + if (mbValid) + { + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateEndEvent, + Any()); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationEvent, + Any()); + } +} + +CenterViewFocusModule::~CenterViewFocusModule() +{ +} + +void CenterViewFocusModule::disposing(std::unique_lock&) +{ + if (mxConfigurationController.is()) + mxConfigurationController->removeConfigurationChangeListener(this); + + mbValid = false; + mxConfigurationController = nullptr; + mpBase = nullptr; +} + +void SAL_CALL CenterViewFocusModule::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (mbValid) + { + if (rEvent.Type == FrameworkHelper::msConfigurationUpdateEndEvent) + { + HandleNewView(rEvent.Configuration); + } + else if (rEvent.Type == FrameworkHelper::msResourceActivationEvent) + { + if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)) + mbNewViewCreated = true; + } + } +} + +void CenterViewFocusModule::HandleNewView ( + const Reference& rxConfiguration) +{ + if (!mbNewViewCreated) + return; + + mbNewViewCreated = false; + // Make the center pane the active one. Tunnel through the + // controller to obtain a ViewShell pointer. + + Sequence > xViewIds (rxConfiguration->getResources( + FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL), + FrameworkHelper::msViewURLPrefix, + AnchorBindingMode_DIRECT)); + Reference xView; + if (xViewIds.hasElements()) + xView.set( mxConfigurationController->getResource(xViewIds[0]),UNO_QUERY); + if (mpBase!=nullptr) + { + auto pViewShellWrapper = dynamic_cast(xView.get()); + if (pViewShellWrapper != nullptr) + { + std::shared_ptr pViewShell = pViewShellWrapper->GetViewShell(); + if (pViewShell != nullptr) + mpBase->GetViewShellManager()->MoveToTop(*pViewShell); + } + } +} + +void SAL_CALL CenterViewFocusModule::disposing ( + const lang::EventObject& rEvent) +{ + if (mxConfigurationController.is()) + if (rEvent.Source == mxConfigurationController) + { + mbValid = false; + mxConfigurationController = nullptr; + mpBase = nullptr; + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/CenterViewFocusModule.hxx b/sd/source/ui/framework/module/CenterViewFocusModule.hxx new file mode 100644 index 0000000000..e721562db0 --- /dev/null +++ b/sd/source/ui/framework/module/CenterViewFocusModule.hxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::drawing::framework +{ +class XConfigurationController; +} +namespace com::sun::star::frame +{ +class XController; +} + +namespace sd +{ +class DrawController; +class ViewShellBase; +} + +namespace sd::framework +{ +typedef comphelper::WeakComponentImplHelper + CenterViewFocusModuleInterfaceBase; + +/** This module waits for new views to be created for the center pane and + then moves the center view to the top most place on the shell stack. As + we are moving away from the shell stack this module may become obsolete + or has to be modified. +*/ +class CenterViewFocusModule final : public CenterViewFocusModuleInterfaceBase +{ +public: + explicit CenterViewFocusModule(rtl::Reference const& rxController); + virtual ~CenterViewFocusModule() override; + + virtual void disposing(std::unique_lock&) override; + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing(const css::lang::EventObject& rEvent) override; + +private: + class ViewShellContainer; + + bool mbValid; + css::uno::Reference + mxConfigurationController; + ViewShellBase* mpBase; + /** This flag indicates whether in the last configuration change cycle a + new view has been created and thus the center view has to be moved + to the top of the shell stack. + */ + bool mbNewViewCreated; + + /** At the end of an update of the current configuration this method + handles a new view in the center pane by moving the associated view + shell to the top of the shell stack. + */ + void HandleNewView( + const css::uno::Reference& rxConfiguration); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/DrawModule.cxx b/sd/source/ui/framework/module/DrawModule.cxx new file mode 100644 index 0000000000..aaa2d90bb3 --- /dev/null +++ b/sd/source/ui/framework/module/DrawModule.cxx @@ -0,0 +1,42 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include "CenterViewFocusModule.hxx" +#include "SlideSorterModule.hxx" +#include "ToolBarModule.hxx" +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::framework +{ +void DrawModule::Initialize(rtl::Reference const& rxController) +{ + new sd::framework::CenterViewFocusModule(rxController); + new sd::framework::SlideSorterModule(rxController, FrameworkHelper::msLeftDrawPaneURL); + new ToolBarModule(rxController); +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ImpressModule.cxx b/sd/source/ui/framework/module/ImpressModule.cxx new file mode 100644 index 0000000000..f89212e4a0 --- /dev/null +++ b/sd/source/ui/framework/module/ImpressModule.cxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include "ViewTabBarModule.hxx" +#include "CenterViewFocusModule.hxx" +#include "SlideSorterModule.hxx" +#include "ToolBarModule.hxx" +#include "ShellStackGuard.hxx" +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::framework { + +void ImpressModule::Initialize (rtl::Reference const & rxController) +{ + new CenterViewFocusModule(rxController); + new ViewTabBarModule( + rxController, + FrameworkHelper::CreateResourceId( + FrameworkHelper::msViewTabBarURL, + FrameworkHelper::msCenterPaneURL)); + new SlideSorterModule( + rxController, + FrameworkHelper::msLeftImpressPaneURL); + new ToolBarModule(rxController); + new ShellStackGuard(rxController); +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ModuleController.cxx b/sd/source/ui/framework/module/ModuleController.cxx new file mode 100644 index 0000000000..b064eefcda --- /dev/null +++ b/sd/source/ui/framework/module/ModuleController.cxx @@ -0,0 +1,160 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd::framework { + +ModuleController::ModuleController(const rtl::Reference<::sd::DrawController>& rxController) +{ + assert(rxController); + + /** Load a list of URL to service mappings. + The mappings are stored in the + mpResourceToFactoryMap member. + */ + ProcessFactory( + "com.sun.star.drawing.framework.BasicPaneFactory", + { "private:resource/pane/CenterPane", + "private:resource/pane/LeftImpressPane", + "private:resource/pane/LeftDrawPane" }); + ProcessFactory( + "com.sun.star.drawing.framework.BasicViewFactory", + { "private:resource/view/ImpressView", + "private:resource/view/GraphicView", + "private:resource/view/OutlineView", + "private:resource/view/NotesView", + "private:resource/view/HandoutView", + "private:resource/view/SlideSorter", + "private:resource/view/PresentationView" }); + ProcessFactory( + "com.sun.star.drawing.framework.BasicToolBarFactory", + { "private:resource/toolbar/ViewTabBar" }); + + try + { + mxController = rxController; + + InstantiateStartupServices(); + } + catch (RuntimeException&) + {} +} + +ModuleController::~ModuleController() noexcept +{ +} + +void ModuleController::disposing(std::unique_lock&) +{ + // Break the cyclic reference back to DrawController object + maLoadedFactories.clear(); + maResourceToFactoryMap.clear(); + mxController.clear(); +} + +void ModuleController::ProcessFactory (const OUString& sServiceName, ::std::vector aURLs) +{ + // Get all resource URLs that are created by the factory. + + SAL_INFO("sd.fwk", __func__ << ": ModuleController::adding factory " << sServiceName); + + // Add the resource URLs to the map. + for (const auto& rResource : aURLs) + { + maResourceToFactoryMap[rResource] = sServiceName; + SAL_INFO("sd.fwk", __func__ << ": " << rResource); + } +} + +void ModuleController::InstantiateStartupServices() +{ + try + { + // Instantiate service. + // Note that when the new object will be destroyed at the end of + // this scope when it does not register itself anywhere. + // Typically it will add itself as ConfigurationChangeListener + // at the configuration controller. + sd::framework::PresentationFactory::install(mxController); + } + catch (Exception&) + { + SAL_WARN("sd.fwk", "ERROR in ModuleController::InstantiateStartupServices"); + } +} + +//----- XModuleController ----------------------------------------------------- + +void SAL_CALL ModuleController::requestResource (const OUString& rsResourceURL) +{ + auto iFactory = maResourceToFactoryMap.find(rsResourceURL); + if (iFactory == maResourceToFactoryMap.end()) + return; + + // Check that the factory has already been loaded and not been + // destroyed in the meantime. + Reference xFactory; + auto iLoadedFactory = maLoadedFactories.find(iFactory->second); + if (iLoadedFactory != maLoadedFactories.end()) + xFactory.set(iLoadedFactory->second, UNO_QUERY); + if ( xFactory.is()) + return; + + // Create a new instance of the factory. + Reference xContext = + ::comphelper::getProcessComponentContext(); + + // Create the factory service. + if (iFactory->second == "com.sun.star.drawing.framework.BasicPaneFactory") + xFactory = uno::Reference(new BasicPaneFactory(xContext, mxController)); + else if (iFactory->second == "com.sun.star.drawing.framework.BasicViewFactory") + xFactory = uno::Reference(new BasicViewFactory(mxController)); + else if (iFactory->second == "com.sun.star.drawing.framework.BasicToolBarFactory") + xFactory = uno::Reference(new BasicToolBarFactory(mxController)); + else + throw RuntimeException("unknown factory"); + + // Remember that this factory has been instanced. + maLoadedFactories[iFactory->second] = xFactory; +} + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/PresentationModule.cxx b/sd/source/ui/framework/module/PresentationModule.cxx new file mode 100644 index 0000000000..c1ff16159d --- /dev/null +++ b/sd/source/ui/framework/module/PresentationModule.cxx @@ -0,0 +1,36 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include "CenterViewFocusModule.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::framework +{ +void PresentationModule::Initialize(rtl::Reference const& rxController) +{ + new sd::framework::CenterViewFocusModule(rxController); +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ShellStackGuard.cxx b/sd/source/ui/framework/module/ShellStackGuard.cxx new file mode 100644 index 0000000000..d7dcfb0f29 --- /dev/null +++ b/sd/source/ui/framework/module/ShellStackGuard.cxx @@ -0,0 +1,147 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ShellStackGuard.hxx" + +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace sd::framework { + +//===== CenterViewFocusModule ==================================================== + +ShellStackGuard::ShellStackGuard (rtl::Reference const & rxController) + : mpBase(nullptr), + maPrinterPollingIdle("sd ShellStackGuard PrinterPollingIdle") +{ + if (rxController.is()) + { + mxConfigurationController = rxController->getConfigurationController(); + + // Tunnel through the controller to obtain a ViewShellBase. + mpBase = rxController->GetViewShellBase(); + } + + if (mxConfigurationController.is()) + { + // Listen for update starts so that the following update can be + // prevented in case of a printing printer. + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateStartEvent, + Any()); + + // Prepare the printer polling. + maPrinterPollingIdle.SetInvokeHandler(LINK(this,ShellStackGuard,TimeoutHandler)); + } +} + +ShellStackGuard::~ShellStackGuard() +{ +} + +void ShellStackGuard::disposing(std::unique_lock&) +{ + if (mxConfigurationController) + { + mxConfigurationController->removeConfigurationChangeListener(this); + mxConfigurationController = nullptr; + } + mpBase = nullptr; +} + +void SAL_CALL ShellStackGuard::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (rEvent.Type == FrameworkHelper::msConfigurationUpdateStartEvent) + { + if (mpUpdateLock == nullptr && IsPrinting()) + { + // Prevent configuration updates while the printer is printing. + mpUpdateLock.reset(new ConfigurationController::Lock(mxConfigurationController)); + + // Start polling for the printer having finished printing. + maPrinterPollingIdle.Start(); + } + } +} + +void SAL_CALL ShellStackGuard::disposing ( + const lang::EventObject& rEvent) +{ + if (mxConfigurationController.is()) + if (rEvent.Source == mxConfigurationController) + { + mxConfigurationController = nullptr; + mpBase = nullptr; + } +} + +IMPL_LINK(ShellStackGuard, TimeoutHandler, Timer*, pIdle, void) +{ +#ifdef DEBUG + OSL_ASSERT(pIdle==&maPrinterPollingIdle); +#else + (void)pIdle; +#endif + if (mpUpdateLock == nullptr) + return; + + if ( ! IsPrinting()) + { + // Printing finished. Release the update lock. + mpUpdateLock.reset(); + } + else + { + // Wait long for the printing to finish. + maPrinterPollingIdle.Start(); + } +} + +bool ShellStackGuard::IsPrinting() const +{ + if (mpBase != nullptr) + { + SfxPrinter* pPrinter = mpBase->GetPrinter(); + if (pPrinter != nullptr + && pPrinter->IsPrinting()) + { + return true; + } + } + + return false; +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ShellStackGuard.hxx b/sd/source/ui/framework/module/ShellStackGuard.hxx new file mode 100644 index 0000000000..fe94037816 --- /dev/null +++ b/sd/source/ui/framework/module/ShellStackGuard.hxx @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include +#include + +namespace com::sun::star::drawing::framework +{ +class XConfigurationController; +} +namespace com::sun::star::frame +{ +class XController; +} + +namespace sd +{ +class DrawController; +class ViewShellBase; +} + +namespace sd::framework +{ +typedef comphelper::WeakComponentImplHelper + ShellStackGuardInterfaceBase; + +/** This module locks updates of the current configuration in situations + when the shell stack must not be modified. + + On every start of a configuration update the ShellStackGuard checks the + printer. If it is printing the configuration update is locked. It then + polls the printer and unlocks updates when printing finishes. + + When in the future there are no resources left that use shells then this + module can be removed. +*/ +class ShellStackGuard : public ShellStackGuardInterfaceBase +{ +public: + explicit ShellStackGuard(rtl::Reference const& rxController); + virtual ~ShellStackGuard() override; + + virtual void disposing(std::unique_lock&) override; + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing(const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference + mxConfigurationController; + ViewShellBase* mpBase; + std::unique_ptr mpUpdateLock; + Idle maPrinterPollingIdle; + + DECL_LINK(TimeoutHandler, Timer*, void); + + /** Return when the printer is printing. Return when + the printer is not printing, or there is no printer, or something + else went wrong. + */ + bool IsPrinting() const; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/SlideSorterModule.cxx b/sd/source/ui/framework/module/SlideSorterModule.cxx new file mode 100644 index 0000000000..1b6bbb7f9f --- /dev/null +++ b/sd/source/ui/framework/module/SlideSorterModule.cxx @@ -0,0 +1,313 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlideSorterModule.hxx" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace { + const sal_Int32 ResourceActivationRequestEvent = 0; + const sal_Int32 ResourceDeactivationRequestEvent = 1; +} + +namespace sd::framework { + +//===== SlideSorterModule ================================================== + +SlideSorterModule::SlideSorterModule ( + const rtl::Reference<::sd::DrawController>& rxController, + const OUString& rsLeftPaneURL) + : mxResourceId(FrameworkHelper::CreateResourceId(FrameworkHelper::msSlideSorterURL, rsLeftPaneURL)), + mxMainViewAnchorId(FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL)), + mxViewTabBarId(FrameworkHelper::CreateResourceId( + FrameworkHelper::msViewTabBarURL, + FrameworkHelper::msCenterPaneURL)), + mxControllerManager(rxController) +{ + if (mxControllerManager.is()) + { + mxConfigurationController = mxControllerManager->getConfigurationController(); + + if (mxConfigurationController.is()) + { + uno::Reference const xComppnent( + mxConfigurationController, UNO_QUERY_THROW); + xComppnent->addEventListener(this); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationRequestEvent, + Any(ResourceActivationRequestEvent)); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceDeactivationRequestEvent, + Any(ResourceDeactivationRequestEvent)); + } + } + if (!mxConfigurationController.is()) + return; + + UpdateViewTabBar(nullptr); + + if (SvtSlideSorterBarOptions().GetVisibleImpressView()) + AddActiveMainView(FrameworkHelper::msImpressViewURL); + if (SvtSlideSorterBarOptions().GetVisibleOutlineView()) + AddActiveMainView(FrameworkHelper::msOutlineViewURL); + if (SvtSlideSorterBarOptions().GetVisibleNotesView()) + AddActiveMainView(FrameworkHelper::msNotesViewURL); + if (SvtSlideSorterBarOptions().GetVisibleHandoutView()) + AddActiveMainView(FrameworkHelper::msHandoutViewURL); + if (SvtSlideSorterBarOptions().GetVisibleSlideSorterView()) + AddActiveMainView(FrameworkHelper::msSlideSorterURL); + if (SvtSlideSorterBarOptions().GetVisibleDrawView()) + AddActiveMainView(FrameworkHelper::msDrawViewURL); + + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationEvent, + Any()); +} + +SlideSorterModule::~SlideSorterModule() +{ +} + +void SlideSorterModule::SaveResourceState() +{ + SvtSlideSorterBarOptions().SetVisibleImpressView(IsResourceActive(FrameworkHelper::msImpressViewURL)); + SvtSlideSorterBarOptions().SetVisibleOutlineView(IsResourceActive(FrameworkHelper::msOutlineViewURL)); + SvtSlideSorterBarOptions().SetVisibleNotesView(IsResourceActive(FrameworkHelper::msNotesViewURL)); + SvtSlideSorterBarOptions().SetVisibleHandoutView(IsResourceActive(FrameworkHelper::msHandoutViewURL)); + SvtSlideSorterBarOptions().SetVisibleSlideSorterView(IsResourceActive(FrameworkHelper::msSlideSorterURL)); + SvtSlideSorterBarOptions().SetVisibleDrawView(IsResourceActive(FrameworkHelper::msDrawViewURL)); +} + +void SAL_CALL SlideSorterModule::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (rEvent.Type == FrameworkHelper::msResourceActivationEvent) + { + if (rEvent.ResourceId->compareTo(mxViewTabBarId) == 0) + { + // Update the view tab bar because the view tab bar has just + // become active. + UpdateViewTabBar(Reference(rEvent.ResourceObject,UNO_QUERY)); + } + else if (rEvent.ResourceId->getResourceTypePrefix() == + FrameworkHelper::msViewURLPrefix + && rEvent.ResourceId->isBoundTo( + FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL), + AnchorBindingMode_DIRECT)) + { + // Update the view tab bar because the view in the center pane + // has changed. + UpdateViewTabBar(nullptr); + } + return; + } + + OSL_ASSERT(rEvent.ResourceId.is()); + sal_Int32 nEventType = 0; + rEvent.UserData >>= nEventType; + switch (nEventType) + { + case ResourceActivationRequestEvent: + if (rEvent.ResourceId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, + AnchorBindingMode_DIRECT)) + { + // A resource directly bound to the center pane has been + // requested. + if (rEvent.ResourceId->getResourceTypePrefix() == + FrameworkHelper::msViewURLPrefix) + { + // The requested resource is a view. Show or hide the + // resource managed by this ResourceManager accordingly. + HandleMainViewSwitch( + rEvent.ResourceId->getResourceURL(), + true); + } + } + else if (rEvent.ResourceId->compareTo(mxResourceId) == 0) + { + // The resource managed by this ResourceManager has been + // explicitly been requested (maybe by us). Remember this + // setting. + HandleResourceRequest(true, rEvent.Configuration); + } + break; + + case ResourceDeactivationRequestEvent: + if (rEvent.ResourceId->compareTo(mxMainViewAnchorId) == 0) + { + HandleMainViewSwitch( + OUString(), + false); + } + else if (rEvent.ResourceId->compareTo(mxResourceId) == 0) + { + // The resource managed by this ResourceManager has been + // explicitly been requested to be hidden (maybe by us). + // Remember this setting. + HandleResourceRequest(false, rEvent.Configuration); + } + break; + } +} + +void SlideSorterModule::UpdateViewTabBar (const Reference& rxTabBar) +{ + if ( ! mxControllerManager.is()) + return; + + Reference xBar (rxTabBar); + if ( ! xBar.is()) + { + Reference xCC ( + mxControllerManager->getConfigurationController()); + if (xCC.is()) + xBar.set(xCC->getResource(mxViewTabBarId), UNO_QUERY); + } + + if (!xBar.is()) + return; + + TabBarButton aButtonA; + aButtonA.ResourceId = FrameworkHelper::CreateResourceId( + FrameworkHelper::msSlideSorterURL, + FrameworkHelper::msCenterPaneURL); + aButtonA.ButtonLabel = SdResId(STR_SLIDE_SORTER_MODE); + + TabBarButton aButtonB; + aButtonB.ResourceId = FrameworkHelper::CreateResourceId( + FrameworkHelper::msHandoutViewURL, + FrameworkHelper::msCenterPaneURL); + + if ( ! xBar->hasTabBarButton(aButtonA)) + xBar->addTabBarButtonAfter(aButtonA, aButtonB); +} + +void SlideSorterModule::AddActiveMainView ( + const OUString& rsMainViewURL) +{ + maActiveMainViewContainer.insert(rsMainViewURL); +} + +bool SlideSorterModule::IsResourceActive ( + const OUString& rsMainViewURL) +{ + return (maActiveMainViewContainer.find(rsMainViewURL) != maActiveMainViewContainer.end()); +} + +void SlideSorterModule::disposing(std::unique_lock&) +{ + if (mxConfigurationController.is()) + { + uno::Reference const xComponent(mxConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->removeEventListener(this); + + mxConfigurationController->removeConfigurationChangeListener(this); + mxConfigurationController = nullptr; + } +} + +void SlideSorterModule::HandleMainViewSwitch ( + const OUString& rsViewURL, + const bool bIsActivated) +{ + if (bIsActivated) + msCurrentMainViewURL = rsViewURL; + else + msCurrentMainViewURL.clear(); + + if (!mxConfigurationController.is()) + return; + + ConfigurationController::Lock aLock (mxConfigurationController); + + if (maActiveMainViewContainer.find(msCurrentMainViewURL) + != maActiveMainViewContainer.end()) + { + // Activate resource. + mxConfigurationController->requestResourceActivation( + mxResourceId->getAnchor(), + ResourceActivationMode_ADD); + mxConfigurationController->requestResourceActivation( + mxResourceId, + ResourceActivationMode_REPLACE); + } + else + { + mxConfigurationController->requestResourceDeactivation(mxResourceId); + } +} + +void SlideSorterModule::HandleResourceRequest( + bool bActivation, + const Reference& rxConfiguration) +{ + Sequence > aCenterViews = rxConfiguration->getResources( + FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL), + FrameworkHelper::msViewURLPrefix, + AnchorBindingMode_DIRECT); + if (aCenterViews.getLength() == 1) + { + if (bActivation) + { + maActiveMainViewContainer.insert(aCenterViews[0]->getResourceURL()); + } + else + { + maActiveMainViewContainer.erase(aCenterViews[0]->getResourceURL()); + } + } +} + +void SAL_CALL SlideSorterModule::disposing ( + const lang::EventObject& rEvent) +{ + if (mxConfigurationController.is() + && rEvent.Source == mxConfigurationController) + { + SaveResourceState(); + // Without the configuration controller this class can do nothing. + mxConfigurationController = nullptr; + dispose(); + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/SlideSorterModule.hxx b/sd/source/ui/framework/module/SlideSorterModule.hxx new file mode 100644 index 0000000000..f56d2c8c75 --- /dev/null +++ b/sd/source/ui/framework/module/SlideSorterModule.hxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XControllerManager; } +namespace com::sun::star::drawing::framework { class XTabBar; } +namespace com::sun::star::frame { class XController; } +namespace sd { class DrawController; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeListener + > SlideSorterModuleBase; + +/** This module is responsible for showing the slide sorter bar and the + slide sorter view in the center pane. + + Manage the activation state of one resource depending on the view in the + center pane. The ResourceManager remembers in which configuration to + activate and in which to deactivate the resource. When the resource is + deactivated or activated manually by the user then the ResourceManager + detects this and remembers it for the future. +*/ +class SlideSorterModule final + : public SlideSorterModuleBase +{ +public: + SlideSorterModule ( + const rtl::Reference<::sd::DrawController>& rxController, + const OUString& rsLeftPaneURL); + virtual ~SlideSorterModule() override; + + /** Remember the given URL as one of a center pane view for which to + activate the resource managed by the called object. + */ + void AddActiveMainView (const OUString& rsMainViewURL); + bool IsResourceActive (const OUString& rsMainViewURL); + void SaveResourceState(); + + virtual void disposing(std::unique_lock&) override; + + // XConfigurationChangeListener + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XEventListener + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference + mxConfigurationController; + ::std::set maActiveMainViewContainer; + /// The resource managed by this class. + css::uno::Reference mxResourceId; + /// The anchor of the main view. + css::uno::Reference mxMainViewAnchorId; + OUString msCurrentMainViewURL; + css::uno::Reference mxViewTabBarId; + rtl::Reference<::sd::DrawController> mxControllerManager; + + void HandleMainViewSwitch ( + const OUString& rsViewURL, + const bool bIsActivated); + void HandleResourceRequest( + bool bActivation, + const css::uno::Reference& rxConfiguration); + void UpdateViewTabBar ( + const css::uno::Reference& rxViewTabBar); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ToolBarModule.cxx b/sd/source/ui/framework/module/ToolBarModule.cxx new file mode 100644 index 0000000000..de7f3e5831 --- /dev/null +++ b/sd/source/ui/framework/module/ToolBarModule.cxx @@ -0,0 +1,189 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ToolBarModule.hxx" +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace { + const sal_Int32 gnConfigurationUpdateStartEvent(0); + const sal_Int32 gnConfigurationUpdateEndEvent(1); + const sal_Int32 gnResourceActivationRequestEvent(2); + const sal_Int32 gnResourceDeactivationRequestEvent(3); +} + +namespace sd::framework { + +//===== ToolBarModule ========================================================= + +ToolBarModule::ToolBarModule ( + const rtl::Reference& rxController) + : mpBase(nullptr), + mbMainViewSwitchUpdatePending(false) +{ + // Tunnel through the controller to obtain a ViewShellBase. + if (rxController != nullptr) + mpBase = rxController->GetViewShellBase(); + + if (!rxController.is()) + return; + + mxConfigurationController = rxController->getConfigurationController(); + if (!mxConfigurationController.is()) + return; + + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateStartEvent, + Any(gnConfigurationUpdateStartEvent)); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateEndEvent, + Any(gnConfigurationUpdateEndEvent)); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationRequestEvent, + Any(gnResourceActivationRequestEvent)); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceDeactivationRequestEvent, + Any(gnResourceDeactivationRequestEvent)); +} + +ToolBarModule::~ToolBarModule() +{ +} + +void ToolBarModule::disposing(std::unique_lock&) +{ + if (mxConfigurationController.is()) + { + mxConfigurationController->removeConfigurationChangeListener(this); + mxConfigurationController = nullptr; + } +} + +void SAL_CALL ToolBarModule::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (!mxConfigurationController.is()) + return; + + sal_Int32 nEventType = 0; + rEvent.UserData >>= nEventType; + switch (nEventType) + { + case gnConfigurationUpdateStartEvent: + HandleUpdateStart(); + break; + + case gnConfigurationUpdateEndEvent: + HandleUpdateEnd(); + break; + + case gnResourceActivationRequestEvent: + case gnResourceDeactivationRequestEvent: + // Remember the request for the activation or deactivation + // of the center pane view. When that happens then on end + // of the next configuration update the set of visible tool + // bars will be updated. + if ( ! mbMainViewSwitchUpdatePending) + if (rEvent.ResourceId->getResourceURL().match( + FrameworkHelper::msViewURLPrefix) + && rEvent.ResourceId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + mbMainViewSwitchUpdatePending = true; + } + break; + } +} + +void ToolBarModule::HandleUpdateStart() +{ + // Lock the ToolBarManager and tell it to lock the ViewShellManager as + // well. This way the ToolBarManager can optimize the releasing of + // locks and arranging of updates of both tool bars and the view shell + // stack. + if (mpBase != nullptr) + { + std::shared_ptr pToolBarManager (mpBase->GetToolBarManager()); + mpToolBarManagerLock.reset(new ToolBarManager::UpdateLock(pToolBarManager)); + pToolBarManager->LockViewShellManager(); + } +} + +void ToolBarModule::HandleUpdateEnd() +{ + if (mbMainViewSwitchUpdatePending) + { + mbMainViewSwitchUpdatePending = false; + // Update the set of visible tool bars and deactivate those that are + // no longer visible. This is done before the old view shell is + // destroyed in order to avoid unnecessary updates of those tool + // bars. + std::shared_ptr pToolBarManager (mpBase->GetToolBarManager()); + std::shared_ptr pFrameworkHelper ( + FrameworkHelper::Instance(*mpBase)); + ViewShell* pViewShell + = pFrameworkHelper->GetViewShell(FrameworkHelper::msCenterPaneURL).get(); + if (pViewShell != nullptr) + { + pToolBarManager->MainViewShellChanged(*pViewShell); + pToolBarManager->SelectionHasChanged( + *pViewShell, + *pViewShell->GetView()); + pToolBarManager->PreUpdate(); + } + else + { + pToolBarManager->MainViewShellChanged(); + pToolBarManager->PreUpdate(); + } + } + + // Releasing the update lock of the ToolBarManager will let the + // ToolBarManager with the help of the ViewShellManager take care of + // updating tool bars and view shell with the minimal amount of + // shell stack modifications and tool bar updates. + mpToolBarManagerLock.reset(); +} + +void SAL_CALL ToolBarModule::disposing (const lang::EventObject& rEvent) +{ + if (mxConfigurationController.is() + && rEvent.Source == mxConfigurationController) + { + // Without the configuration controller this class can do nothing. + mxConfigurationController = nullptr; + dispose(); + } +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ToolBarModule.hxx b/sd/source/ui/framework/module/ToolBarModule.hxx new file mode 100644 index 0000000000..bf0c017ef9 --- /dev/null +++ b/sd/source/ui/framework/module/ToolBarModule.hxx @@ -0,0 +1,83 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::frame { class XController; } + +namespace sd { +class DrawController; +class ViewShellBase; +} + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeListener + > ToolBarModuleInterfaceBase; + +/** This module is responsible for locking the ToolBarManager during + configuration updates and for triggering ToolBarManager updates. +*/ +class ToolBarModule final + : public ToolBarModuleInterfaceBase +{ +public: + /** Create a new module. + @param rxController + This is the access point to the drawing framework. + */ + explicit ToolBarModule ( + const rtl::Reference& rxController); + virtual ~ToolBarModule() override; + + virtual void disposing(std::unique_lock&) override; + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference< + css::drawing::framework::XConfigurationController> mxConfigurationController; + ViewShellBase* mpBase; + std::unique_ptr> mpToolBarManagerLock; + bool mbMainViewSwitchUpdatePending; + + void HandleUpdateStart(); + void HandleUpdateEnd(); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ViewTabBarModule.cxx b/sd/source/ui/framework/module/ViewTabBarModule.cxx new file mode 100644 index 0000000000..163b7adb02 --- /dev/null +++ b/sd/source/ui/framework/module/ViewTabBarModule.cxx @@ -0,0 +1,179 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ViewTabBarModule.hxx" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace { + +const sal_Int32 ResourceActivationRequestEvent = 0; +const sal_Int32 ResourceDeactivationRequestEvent = 1; +const sal_Int32 ResourceActivationEvent = 2; + +} + +namespace sd::framework { + +//===== ViewTabBarModule ================================================== + +ViewTabBarModule::ViewTabBarModule ( + const rtl::Reference<::sd::DrawController>& rxController, + const Reference& rxViewTabBarId) + : mxViewTabBarId(rxViewTabBarId) +{ + if (!rxController.is()) + return; + + mxConfigurationController = rxController->getConfigurationController(); + if (!mxConfigurationController.is()) + return; + + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationRequestEvent, + Any(ResourceActivationRequestEvent)); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceDeactivationRequestEvent, + Any(ResourceDeactivationRequestEvent)); + + UpdateViewTabBar(nullptr); + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationEvent, + Any(ResourceActivationEvent)); +} + +ViewTabBarModule::~ViewTabBarModule() +{ +} + +void ViewTabBarModule::disposing(std::unique_lock&) +{ + if (mxConfigurationController.is()) + { + mxConfigurationController->removeConfigurationChangeListener(this); + mxConfigurationController = nullptr; + } +} + +void SAL_CALL ViewTabBarModule::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (!mxConfigurationController.is()) + return; + + sal_Int32 nEventType = 0; + rEvent.UserData >>= nEventType; + switch (nEventType) + { + case ResourceActivationRequestEvent: + if (mxViewTabBarId->isBoundTo(rEvent.ResourceId, AnchorBindingMode_DIRECT)) + { + mxConfigurationController->requestResourceActivation( + mxViewTabBarId, + ResourceActivationMode_ADD); + } + break; + + case ResourceDeactivationRequestEvent: + if (mxViewTabBarId->isBoundTo(rEvent.ResourceId, AnchorBindingMode_DIRECT)) + { + mxConfigurationController->requestResourceDeactivation(mxViewTabBarId); + } + break; + + case ResourceActivationEvent: + if (rEvent.ResourceId->compareTo(mxViewTabBarId) == 0) + { + UpdateViewTabBar(Reference(rEvent.ResourceObject,UNO_QUERY)); + } + } +} + +void SAL_CALL ViewTabBarModule::disposing ( + const lang::EventObject& rEvent) +{ + if (mxConfigurationController.is() + && rEvent.Source == mxConfigurationController) + { + // Without the configuration controller this class can do nothing. + mxConfigurationController = nullptr; + dispose(); + } +} + +void ViewTabBarModule::UpdateViewTabBar (const Reference& rxTabBar) +{ + if (!mxConfigurationController.is()) + return; + + Reference xBar (rxTabBar); + if ( ! xBar.is()) + xBar.set( mxConfigurationController->getResource(mxViewTabBarId), UNO_QUERY); + + if (!xBar.is()) + return; + + TabBarButton aEmptyButton; + + Reference xAnchor (mxViewTabBarId->getAnchor()); + + TabBarButton aImpressViewButton; + aImpressViewButton.ResourceId = FrameworkHelper::CreateResourceId( + FrameworkHelper::msImpressViewURL, + xAnchor); + aImpressViewButton.ButtonLabel = SdResId(STR_NORMAL_MODE); + if ( ! xBar->hasTabBarButton(aImpressViewButton)) + xBar->addTabBarButtonAfter(aImpressViewButton, aEmptyButton); + + TabBarButton aOutlineViewButton; + aOutlineViewButton.ResourceId = FrameworkHelper::CreateResourceId( + FrameworkHelper::msOutlineViewURL, + xAnchor); + aOutlineViewButton.ButtonLabel = SdResId(STR_OUTLINE_MODE); + if ( ! xBar->hasTabBarButton(aOutlineViewButton)) + xBar->addTabBarButtonAfter(aOutlineViewButton, aImpressViewButton); + + TabBarButton aNotesViewButton; + aNotesViewButton.ResourceId = FrameworkHelper::CreateResourceId( + FrameworkHelper::msNotesViewURL, + xAnchor); + aNotesViewButton.ButtonLabel = SdResId(STR_NOTES_MODE); + if ( ! xBar->hasTabBarButton(aNotesViewButton)) + xBar->addTabBarButtonAfter(aNotesViewButton, aOutlineViewButton); +} + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/module/ViewTabBarModule.hxx b/sd/source/ui/framework/module/ViewTabBarModule.hxx new file mode 100644 index 0000000000..5a492dc324 --- /dev/null +++ b/sd/source/ui/framework/module/ViewTabBarModule.hxx @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XTabBar; } +namespace com::sun::star::frame { class XController; } +namespace sd { class DrawController; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeListener + > ViewTabBarModuleInterfaceBase; + +/** This module is responsible for showing the ViewTabBar above the view in + the center pane. +*/ +class ViewTabBarModule + : public ViewTabBarModuleInterfaceBase +{ +public: + /** Create a new module that controls the view tab bar above the view + in the specified pane. + @param rxController + This is the access point to the drawing framework. + @param rxViewTabBarId + This ResourceId specifies which tab bar is to be managed by the + new module. + */ + ViewTabBarModule ( + const rtl::Reference<::sd::DrawController>& rxController, + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxViewTabBarId); + virtual ~ViewTabBarModule() override; + + virtual void disposing(std::unique_lock&) override; + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference< + css::drawing::framework::XConfigurationController> mxConfigurationController; + css::uno::Reference mxViewTabBarId; + + /** This is the place where the view tab bar is filled. Only missing + buttons are added, so it is safe to call this method multiple + times. + */ + void UpdateViewTabBar ( + const css::uno::Reference& rxTabBar); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/framework/tools/FrameworkHelper.cxx b/sd/source/ui/framework/tools/FrameworkHelper.cxx new file mode 100644 index 0000000000..0a42649b1c --- /dev/null +++ b/sd/source/ui/framework/tools/FrameworkHelper.cxx @@ -0,0 +1,938 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace { + +//----- CallbackCaller -------------------------------------------------------- + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfigurationChangeListener + > CallbackCallerInterfaceBase; + +/** A CallbackCaller registers as listener at an XConfigurationController + object and waits for the notification of one type of event. When that + event is received, or when the CallbackCaller detects at its + construction that the event will not be sent in the near future, the + actual callback object is called and the CallbackCaller destroys itself. +*/ +class CallbackCaller + : public CallbackCallerInterfaceBase +{ +public: + /** Create a new CallbackCaller object. This object controls its own + lifetime by acquiring a reference to itself in the constructor. + When it detects that the event will not be notified in the near + future (because the queue of pending configuration change operations + is empty and therefore no event will be sent int the near future, it + does not acquires a reference and thus initiates its destruction in + the constructor.) + @param rBase + This ViewShellBase object is used to determine the + XConfigurationController at which to register. + @param rsEventType + The event type which the callback is waiting for. + @param pCallback + The callback object which is to be notified. The caller will + typically release his reference to the caller so that when the + CallbackCaller dies (after having called the callback) the + callback is destroyed. + */ + CallbackCaller ( + const ::sd::ViewShellBase& rBase, + OUString sEventType, + ::sd::framework::FrameworkHelper::ConfigurationChangeEventFilter aFilter, + ::sd::framework::FrameworkHelper::Callback aCallback); + + virtual void disposing(std::unique_lock&) override; + // XEventListener + virtual void SAL_CALL disposing (const lang::EventObject& rEvent) override; + // XConfigurationChangeListener + virtual void SAL_CALL notifyConfigurationChange (const ConfigurationChangeEvent& rEvent) override; + +private: + OUString msEventType; + Reference mxConfigurationController; + ::sd::framework::FrameworkHelper::ConfigurationChangeEventFilter maFilter; + ::sd::framework::FrameworkHelper::Callback maCallback; +}; + +//----- LifetimeController ---------------------------------------------------- + +typedef comphelper::WeakComponentImplHelper < + css::lang::XEventListener + > LifetimeControllerInterfaceBase; + +/** This class helps controlling the lifetime of the + FrameworkHelper. Register at a ViewShellBase object and an XController + object and call Dispose() at the associated FrameworkHelper object when + one of them and Release() when both of them are destroyed. +*/ +class LifetimeController + : public LifetimeControllerInterfaceBase, + public SfxListener +{ +public: + explicit LifetimeController (::sd::ViewShellBase& rBase); + virtual ~LifetimeController() override; + + /** XEventListener. This method is called when the frame::XController + is being destroyed. + */ + using WeakComponentImplHelperBase::disposing; + virtual void SAL_CALL disposing (const lang::EventObject& rEvent) override; + + /** This method is called when the ViewShellBase is being destroyed. + */ + virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override; + +private: + ::sd::ViewShellBase& mrBase; + bool mbListeningToViewShellBase; + bool mbListeningToController; + + /** When one or both of the mbListeningToViewShellBase and + mbListeningToController members were modified then call this method + to either dispose or release the associated FrameworkHelper. + */ + void Update(); +}; + +} // end of anonymous namespace + +namespace sd::framework { + +namespace { + + class FrameworkHelperAllPassFilter + { + public: + bool operator() (const css::drawing::framework::ConfigurationChangeEvent&) { return true; } + }; + + class FrameworkHelperResourceIdFilter + { + public: + explicit FrameworkHelperResourceIdFilter ( + const css::uno::Reference& rxResourceId); + bool operator() (const css::drawing::framework::ConfigurationChangeEvent& rEvent) + { return mxResourceId.is() && rEvent.ResourceId.is() + && mxResourceId->compareTo(rEvent.ResourceId) == 0; } + private: + css::uno::Reference mxResourceId; + }; + +} // end of anonymous namespace + +// Pane URLS. + +const OUString FrameworkHelper::msCenterPaneURL( msPaneURLPrefix + "CenterPane"); +const OUString FrameworkHelper::msFullScreenPaneURL( msPaneURLPrefix + "FullScreenPane"); +const OUString FrameworkHelper::msLeftImpressPaneURL( msPaneURLPrefix + "LeftImpressPane"); +const OUString FrameworkHelper::msLeftDrawPaneURL( msPaneURLPrefix + "LeftDrawPane"); + +// View URLs. + +const OUString FrameworkHelper::msImpressViewURL( msViewURLPrefix + "ImpressView"); +const OUString FrameworkHelper::msDrawViewURL( msViewURLPrefix + "GraphicView"); +const OUString FrameworkHelper::msOutlineViewURL( msViewURLPrefix + "OutlineView"); +const OUString FrameworkHelper::msNotesViewURL( msViewURLPrefix + "NotesView"); +const OUString FrameworkHelper::msHandoutViewURL( msViewURLPrefix + "HandoutView"); +const OUString FrameworkHelper::msSlideSorterURL( msViewURLPrefix + "SlideSorter"); +const OUString FrameworkHelper::msPresentationViewURL( msViewURLPrefix + "PresentationView"); +const OUString FrameworkHelper::msSidebarViewURL( msViewURLPrefix + "SidebarView"); + +// Tool bar URLs. + +const OUString FrameworkHelper::msViewTabBarURL( msToolBarURLPrefix + "ViewTabBar"); + +//----- helper ---------------------------------------------------------------- +namespace +{ + ::std::shared_ptr< ViewShell > lcl_getViewShell( const Reference< XResource >& i_rViewShellWrapper ) + { + ::std::shared_ptr< ViewShell > pViewShell; + try + { + if (auto pWrapper = dynamic_cast(i_rViewShellWrapper.get())) + pViewShell = pWrapper->GetViewShell(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + return pViewShell; + } + Reference< XResource > lcl_getFirstViewInPane( const Reference< XConfigurationController >& i_rConfigController, + const Reference< XResourceId >& i_rPaneId ) + { + try + { + Reference< XConfiguration > xConfiguration( i_rConfigController->getRequestedConfiguration(), UNO_SET_THROW ); + Sequence< Reference< XResourceId > > aViewIds( xConfiguration->getResources( + i_rPaneId, FrameworkHelper::msViewURLPrefix, AnchorBindingMode_DIRECT ) ); + if ( aViewIds.hasElements() ) + return i_rConfigController->getResource( aViewIds[0] ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + return nullptr; + } +} + +//----- FrameworkHelper::ViewURLMap ------------------------------------------- + +/** The ViewURLMap is used to translate between the view URLs used by the + drawing framework and the enums defined in the ViewShell class. +*/ +class FrameworkHelper::ViewURLMap + : public std::unordered_map< + OUString, + ViewShell::ShellType> +{ +public: + ViewURLMap() {} +}; + +//----- Framework::DisposeListener --------------------------------------------- + +namespace { + typedef comphelper::WeakComponentImplHelper < + css::lang::XEventListener + > FrameworkHelperDisposeListenerInterfaceBase; +} + +class FrameworkHelper::DisposeListener + : public FrameworkHelperDisposeListenerInterfaceBase +{ +public: + explicit DisposeListener (::std::shared_ptr pHelper); + + virtual void disposing(std::unique_lock&) override; + + virtual void SAL_CALL disposing (const lang::EventObject& rEventObject) override; + +private: + ::std::shared_ptr mpHelper; +}; + +//----- FrameworkHelper::Deleter ---------------------------------------------- + +class FrameworkHelper::Deleter +{ +public: + void operator()(FrameworkHelper* pObject) + { + delete pObject; + } +}; + +//----- FrameworkHelper ------------------------------------------------------- + +FrameworkHelper::ViewURLMap FrameworkHelper::maViewURLMap; + +FrameworkHelper::InstanceMap FrameworkHelper::maInstanceMap; +std::mutex FrameworkHelper::maInstanceMapMutex; + +::std::shared_ptr FrameworkHelper::Instance (ViewShellBase& rBase) +{ + std::unique_lock aGuard(maInstanceMapMutex); + + InstanceMap::const_iterator iHelper (maInstanceMap.find(&rBase)); + if (iHelper != maInstanceMap.end()) + return iHelper->second; + + ::std::shared_ptr pHelper( + new FrameworkHelper(rBase), + FrameworkHelper::Deleter()); + pHelper->Initialize(); + maInstanceMap[&rBase] = pHelper; + + return pHelper; +} + +void FrameworkHelper::DisposeInstance (const ViewShellBase& rBase) +{ + InstanceMap::iterator iHelper (maInstanceMap.find(&rBase)); + if (iHelper != maInstanceMap.end()) + { + iHelper->second->Dispose(); + } +} + +void FrameworkHelper::ReleaseInstance (const ViewShellBase& rBase) +{ + InstanceMap::iterator iHelper (maInstanceMap.find(&rBase)); + if (iHelper != maInstanceMap.end()) + maInstanceMap.erase(iHelper); +} + +FrameworkHelper::FrameworkHelper (ViewShellBase& rBase) + : mrBase(rBase) +{ + Reference xControllerManager (rBase.GetController(), UNO_QUERY); + if (xControllerManager.is()) + { + mxConfigurationController = xControllerManager->getConfigurationController(); + } + + new LifetimeController(mrBase); +} + +void FrameworkHelper::Initialize() +{ + mxDisposeListener = new DisposeListener(shared_from_this()); +} + +FrameworkHelper::~FrameworkHelper() +{ +} + +void FrameworkHelper::Dispose() +{ + if (mxDisposeListener.is()) + mxDisposeListener->dispose(); + mxConfigurationController = nullptr; +} + +bool FrameworkHelper::IsValid() const +{ + return mxConfigurationController.is(); +} + +::std::shared_ptr FrameworkHelper::GetViewShell (const OUString& rsPaneURL) +{ + if ( !mxConfigurationController.is() ) + return ::std::shared_ptr(); + + Reference xPaneId( CreateResourceId( rsPaneURL ) ); + return lcl_getViewShell( lcl_getFirstViewInPane( mxConfigurationController, xPaneId ) ); +} + +::std::shared_ptr FrameworkHelper::GetViewShell (const Reference& rxView) +{ + return lcl_getViewShell( rxView ); +} + +Reference FrameworkHelper::GetView (const Reference& rxPaneOrViewId) +{ + Reference xView; + + if ( ! rxPaneOrViewId.is() || ! mxConfigurationController.is()) + return nullptr; + + try + { + if (rxPaneOrViewId->getResourceURL().match(msViewURLPrefix)) + { + xView.set( mxConfigurationController->getResource( rxPaneOrViewId ), UNO_QUERY ); + } + else + { + xView.set( lcl_getFirstViewInPane( mxConfigurationController, rxPaneOrViewId ), UNO_QUERY ); + } + } + catch (lang::DisposedException&) + { + Dispose(); + } + catch (RuntimeException&) + { + } + + return xView; +} + +Reference FrameworkHelper::RequestView ( + const OUString& rsResourceURL, + const OUString& rsAnchorURL) +{ + Reference xViewId; + + try + { + if (mxConfigurationController.is()) + { + mxConfigurationController->requestResourceActivation( + CreateResourceId(rsAnchorURL), + ResourceActivationMode_ADD); + xViewId = CreateResourceId(rsResourceURL, rsAnchorURL); + mxConfigurationController->requestResourceActivation( + xViewId, + ResourceActivationMode_REPLACE); + } + } + catch (lang::DisposedException&) + { + Dispose(); + xViewId = nullptr; + } + catch (RuntimeException&) + { + xViewId = nullptr; + } + + return xViewId; +} + +ViewShell::ShellType FrameworkHelper::GetViewId (const OUString& rsViewURL) +{ + if (maViewURLMap.empty()) + { + maViewURLMap[msImpressViewURL] = ViewShell::ST_IMPRESS; + maViewURLMap[msDrawViewURL] = ViewShell::ST_DRAW; + maViewURLMap[msOutlineViewURL] = ViewShell::ST_OUTLINE; + maViewURLMap[msNotesViewURL] = ViewShell::ST_NOTES; + maViewURLMap[msHandoutViewURL] = ViewShell::ST_HANDOUT; + maViewURLMap[msSlideSorterURL] = ViewShell::ST_SLIDE_SORTER; + maViewURLMap[msPresentationViewURL] = ViewShell::ST_PRESENTATION; + maViewURLMap[msSidebarViewURL] = ViewShell::ST_SIDEBAR; + } + ViewURLMap::const_iterator iView (maViewURLMap.find(rsViewURL)); + if (iView != maViewURLMap.end()) + return iView->second; + else + return ViewShell::ST_NONE; +} + +OUString FrameworkHelper::GetViewURL (ViewShell::ShellType eType) +{ + switch (eType) + { + case ViewShell::ST_IMPRESS : return msImpressViewURL; + case ViewShell::ST_DRAW : return msDrawViewURL; + case ViewShell::ST_OUTLINE : return msOutlineViewURL; + case ViewShell::ST_NOTES : return msNotesViewURL; + case ViewShell::ST_HANDOUT : return msHandoutViewURL; + case ViewShell::ST_SLIDE_SORTER : return msSlideSorterURL; + case ViewShell::ST_PRESENTATION : return msPresentationViewURL; + case ViewShell::ST_SIDEBAR : return msSidebarViewURL; + default: + return OUString(); + } +} + +namespace +{ + +void updateEditMode(const Reference &xView, const EditMode eEMode, bool updateFrameView) +{ + // Ensure we have the expected edit mode + // The check is only for DrawViewShell as OutlineViewShell + // and SlideSorterViewShell have no master mode + const ::std::shared_ptr pCenterViewShell (FrameworkHelper::GetViewShell(xView)); + DrawViewShell* pDrawViewShell + = dynamic_cast(pCenterViewShell.get()); + if (pDrawViewShell != nullptr) + { + pCenterViewShell->Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); + + pDrawViewShell->ChangeEditMode(eEMode, pDrawViewShell->IsLayerModeActive()); + if (updateFrameView) + pDrawViewShell->WriteFrameViewData(); + + pCenterViewShell->Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); + } +} + +void asyncUpdateEditMode(FrameworkHelper* const pHelper, const EditMode eEMode) +{ + Reference xPaneId ( + FrameworkHelper::CreateResourceId(framework::FrameworkHelper::msCenterPaneURL)); + Reference xView (pHelper->GetView(xPaneId)); + updateEditMode(xView, eEMode, true); +} + +} + +void FrameworkHelper::HandleModeChangeSlot ( + sal_uInt16 nSlotId, + SfxRequest const & rRequest) +{ + if ( ! mxConfigurationController.is()) + return; + + // Parameters are allowed for NotesMasterPage and SlideMasterPage + // for these command, transfor xxxxMasterPage with param = false + // to ActivatexxxxxMode + if (nSlotId == SID_NOTES_MASTER_MODE || nSlotId == SID_SLIDE_MASTER_MODE) + { + const SfxItemSet* pRequestArguments = rRequest.GetArgs(); + if (pRequestArguments) + { + const SfxBoolItem* pIsActive = rRequest.GetArg(nSlotId); + if (!pIsActive->GetValue ()) + { + if (nSlotId == SID_NOTES_MASTER_MODE) + nSlotId = SID_NOTES_MODE; + else + nSlotId = SID_NORMAL_MULTI_PANE_GUI; + } + } + } + + try + { + if ( ! mxConfigurationController.is()) + throw RuntimeException(); + + Reference xPaneId ( + CreateResourceId(framework::FrameworkHelper::msCenterPaneURL)); + Reference xView (GetView(xPaneId)); + + // Compute requested view + OUString sRequestedView; + switch (nSlotId) + { + // draw + case SID_DRAWINGMODE: + // impress + case SID_NORMAL_MULTI_PANE_GUI: + case SID_SLIDE_MASTER_MODE: + sRequestedView = FrameworkHelper::msImpressViewURL; + break; + + case SID_NOTES_MODE: + case SID_NOTES_MASTER_MODE: + sRequestedView = FrameworkHelper::msNotesViewURL; + break; + + case SID_HANDOUT_MASTER_MODE: + sRequestedView = FrameworkHelper::msHandoutViewURL; + break; + + case SID_SLIDE_SORTER_MULTI_PANE_GUI: + case SID_SLIDE_SORTER_MODE: + sRequestedView = FrameworkHelper::msSlideSorterURL; + break; + + case SID_OUTLINE_MODE: + sRequestedView = FrameworkHelper::msOutlineViewURL; + break; + } + + // Compute requested mode + EditMode eEMode = EditMode::Page; + if (nSlotId == SID_SLIDE_MASTER_MODE + || nSlotId == SID_NOTES_MASTER_MODE + || nSlotId == SID_HANDOUT_MASTER_MODE) + eEMode = EditMode::MasterPage; + // Ensure we have the expected view shell + if (!(xView.is() && xView->getResourceId()->getResourceURL() == sRequestedView)) + + { + const auto xId = CreateResourceId(sRequestedView, msCenterPaneURL); + mxConfigurationController->requestResourceActivation( + xId, + ResourceActivationMode_REPLACE); + RunOnResourceActivation(xId, std::bind(&asyncUpdateEditMode, this, eEMode)); + } + else + { + updateEditMode(xView, eEMode, false); + } + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +void FrameworkHelper::RunOnConfigurationEvent( + const OUString& rsEventType, + const Callback& rCallback) +{ + RunOnEvent( + rsEventType, + FrameworkHelperAllPassFilter(), + rCallback); +} + +void FrameworkHelper::RunOnResourceActivation( + const css::uno::Reference& rxResourceId, + const Callback& rCallback) +{ + if (mxConfigurationController.is() + && mxConfigurationController->getResource(rxResourceId).is()) + { + rCallback(false); + } + else + { + RunOnEvent( + msResourceActivationEvent, + FrameworkHelperResourceIdFilter(rxResourceId), + rCallback); + } +} + +namespace { + +/** A callback that sets a flag to a specified value when the callback is + called. +*/ +class FlagUpdater +{ +public: + explicit FlagUpdater (bool& rFlag) : mrFlag(rFlag) {} + void operator() (bool) const {mrFlag = true;} +private: + bool& mrFlag; +}; + +} + +void FrameworkHelper::RequestSynchronousUpdate() +{ + rtl::Reference pCC ( + dynamic_cast(mxConfigurationController.get())); + if (pCC.is()) + pCC->RequestSynchronousUpdate(); +} + +void FrameworkHelper::WaitForEvent (const OUString& rsEventType) const +{ + bool bConfigurationUpdateSeen (false); + + RunOnEvent( + rsEventType, + FrameworkHelperAllPassFilter(), + FlagUpdater(bConfigurationUpdateSeen)); + + sal_uInt32 nStartTime = osl_getGlobalTimer(); + while ( ! bConfigurationUpdateSeen) + { + Application::Reschedule(); + + if( (osl_getGlobalTimer() - nStartTime) > 60000 ) + { + OSL_FAIL("FrameworkHelper::WaitForEvent(), no event for a minute? giving up!"); + break; + } + } +} + +void FrameworkHelper::WaitForUpdate() const +{ + WaitForEvent(msConfigurationUpdateEndEvent); +} + +void FrameworkHelper::RunOnEvent( + const OUString& rsEventType, + const ConfigurationChangeEventFilter& rFilter, + const Callback& rCallback) const +{ + new CallbackCaller(mrBase,rsEventType,rFilter,rCallback); +} + +void FrameworkHelper::disposing (const lang::EventObject& rEventObject) +{ + if (rEventObject.Source == mxConfigurationController) + mxConfigurationController = nullptr; +} + +void FrameworkHelper::UpdateConfiguration() +{ + if (!mxConfigurationController.is()) + return; + + try + { + if (mxConfigurationController.is()) + mxConfigurationController->update(); + } + catch (lang::DisposedException&) + { + Dispose(); + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +OUString FrameworkHelper::ResourceIdToString (const Reference& rxResourceId) +{ + OUStringBuffer sString; + if (rxResourceId.is()) + { + sString.append(rxResourceId->getResourceURL()); + if (rxResourceId->hasAnchor()) + { + const Sequence aAnchorURLs (rxResourceId->getAnchorURLs()); + for (const auto& rAnchorURL : aAnchorURLs) + { + sString.append(" | " + rAnchorURL); + } + } + } + return sString.makeStringAndClear(); +} + +Reference FrameworkHelper::CreateResourceId (const OUString& rsResourceURL) +{ + return new ::sd::framework::ResourceId(rsResourceURL); +} + +Reference FrameworkHelper::CreateResourceId ( + const OUString& rsResourceURL, + const OUString& rsAnchorURL) +{ + return new ::sd::framework::ResourceId(rsResourceURL, rsAnchorURL); +} + +Reference FrameworkHelper::CreateResourceId ( + const OUString& rsResourceURL, + const Reference& rxAnchorId) +{ + if (rxAnchorId.is()) + return new ::sd::framework::ResourceId( + rsResourceURL, + rxAnchorId->getResourceURL(), + rxAnchorId->getAnchorURLs()); + else + return new ::sd::framework::ResourceId(rsResourceURL); +} + +//----- FrameworkHelper::DisposeListener -------------------------------------- + +FrameworkHelper::DisposeListener::DisposeListener ( + ::std::shared_ptr pHelper) + : mpHelper(std::move(pHelper)) +{ + Reference xComponent (mpHelper->mxConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener(this); +} + +void FrameworkHelper::DisposeListener::disposing(std::unique_lock&) +{ + Reference xComponent (mpHelper->mxConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->removeEventListener(this); + + mpHelper.reset(); +} + +void SAL_CALL FrameworkHelper::DisposeListener::disposing (const lang::EventObject& rEventObject) +{ + if (mpHelper != nullptr) + mpHelper->disposing(rEventObject); +} + +//===== FrameworkHelperResourceIdFilter ======================================= + +FrameworkHelperResourceIdFilter::FrameworkHelperResourceIdFilter ( + const Reference& rxResourceId) + : mxResourceId(rxResourceId) +{ +} + +} // end of namespace sd::framework + +namespace { + +//===== CallbackCaller ======================================================== + +CallbackCaller::CallbackCaller ( + const ::sd::ViewShellBase& rBase, + OUString rsEventType, + ::sd::framework::FrameworkHelper::ConfigurationChangeEventFilter aFilter, + ::sd::framework::FrameworkHelper::Callback aCallback) + : msEventType(std::move(rsEventType)), + maFilter(std::move(aFilter)), + maCallback(std::move(aCallback)) +{ + try + { + Reference xControllerManager (rBase.GetController(), UNO_QUERY_THROW); + mxConfigurationController = xControllerManager->getConfigurationController(); + if (mxConfigurationController.is()) + { + if (mxConfigurationController->hasPendingRequests()) + mxConfigurationController->addConfigurationChangeListener(this,msEventType,Any()); + else + { + // There are no requests waiting to be processed. Therefore + // no event, especially not the one we are waiting for, will + // be sent in the near future and the callback would never be + // called. + // Call the callback now and tell him that the event it is + // waiting for was not sent. + mxConfigurationController = nullptr; + maCallback(false); + } + } + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +void CallbackCaller::disposing(std::unique_lock&) +{ + try + { + if (mxConfigurationController.is()) + { + Reference xCC (mxConfigurationController); + mxConfigurationController = nullptr; + xCC->removeConfigurationChangeListener(this); + } + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +void SAL_CALL CallbackCaller::disposing (const lang::EventObject& rEvent) +{ + if (rEvent.Source == mxConfigurationController) + { + mxConfigurationController = nullptr; + maCallback(false); + } +} + +void SAL_CALL CallbackCaller::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (!(rEvent.Type == msEventType && maFilter(rEvent))) + return; + + maCallback(true); + if (mxConfigurationController.is()) + { + // Reset the reference to the configuration controller so that + // dispose() will not try to remove the listener a second time. + Reference xCC (mxConfigurationController); + mxConfigurationController = nullptr; + + // Removing this object from the controller may very likely lead + // to its destruction, so no calls after that. + xCC->removeConfigurationChangeListener(this); + } +} + +//----- LifetimeController ------------------------------------------------- + +LifetimeController::LifetimeController (::sd::ViewShellBase& rBase) + : mrBase(rBase), + mbListeningToViewShellBase(false), + mbListeningToController(false) +{ + // Register as listener at the ViewShellBase. Because that is not done + // via a reference we have to increase the reference count manually. + // This is necessary even though listening to the XController did + // increase the reference count because the controller may release its + // reference to us before the ViewShellBase is destroyed. + StartListening(mrBase); + acquire(); + mbListeningToViewShellBase = true; + + Reference xComponent = rBase.GetController(); + if (xComponent.is()) + { + xComponent->addEventListener(this); + mbListeningToController = true; + } +} + +LifetimeController::~LifetimeController() +{ + OSL_ASSERT(!mbListeningToController && !mbListeningToViewShellBase); +} + +void SAL_CALL LifetimeController::disposing (const lang::EventObject&) +{ + mbListeningToController = false; + Update(); +} + +void LifetimeController::Notify (SfxBroadcaster&, const SfxHint& rHint) +{ + if (rHint.GetId() == SfxHintId::Dying) + { + mbListeningToViewShellBase = false; + Update(); + release(); + } +} + +void LifetimeController::Update() +{ + if (mbListeningToViewShellBase && mbListeningToController) + { + // Both the controller and the ViewShellBase are alive. Keep + // waiting for their destruction. + } + else if (mbListeningToViewShellBase) + { + // The controller has been destroyed but the ViewShellBase is still + // alive. Dispose the associated FrameworkHelper but keep it around + // so that no new instance is created for the dying framework. + ::sd::framework::FrameworkHelper::DisposeInstance(mrBase); + } + else + { + // Both the controller and the ViewShellBase have been destroyed. + // Remove the FrameworkHelper so that the next call its Instance() + // method can create a new instance. + ::sd::framework::FrameworkHelper::ReleaseInstance(mrBase); + } +} + +} // end of anonymous namespace. + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/bulmaper.cxx b/sd/source/ui/func/bulmaper.cxx new file mode 100644 index 0000000000..956855279e --- /dev/null +++ b/sd/source/ui/func/bulmaper.cxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +//-> Fonts & Items +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//<- Fonts & Items +#include +#include +#include + +#include + +#define GetWhich(nSlot) rSet.GetPool()->GetWhich( nSlot ) + +void SdBulletMapper::MapFontsInNumRule( SvxNumRule& aNumRule, const SfxItemSet& rSet ) +{ + const sal_uInt16 nCount = aNumRule.GetLevelCount(); + for( sal_uInt16 nLevel = 0; nLevel < nCount; nLevel++ ) + { + const SvxNumberFormat& rSrcLevel = aNumRule.GetLevel(nLevel); + SvxNumberFormat aNewLevel( rSrcLevel ); + + if(rSrcLevel.GetNumberingType() != css::style::NumberingType::CHAR_SPECIAL && + rSrcLevel.GetNumberingType() != css::style::NumberingType::NUMBER_NONE ) + { + // if enumeration instead bullet is chosen, adjust bullet font to template font + + // to be implemented if module supports CJK + + vcl::Font aMyFont; + const SvxFontItem& rFItem = rSet.Get(GetWhich( SID_ATTR_CHAR_FONT )); + aMyFont.SetFamily(rFItem.GetFamily()); + aMyFont.SetFamilyName(rFItem.GetFamilyName()); + aMyFont.SetCharSet(rFItem.GetCharSet()); + aMyFont.SetPitch(rFItem.GetPitch()); + + const SvxFontHeightItem& rFHItem = rSet.Get(GetWhich( SID_ATTR_CHAR_FONTHEIGHT )); + aMyFont.SetFontSize(Size(0, rFHItem.GetHeight())); + + const SvxWeightItem& rWItem = rSet.Get(GetWhich( SID_ATTR_CHAR_WEIGHT )); + aMyFont.SetWeight(rWItem.GetWeight()); + + const SvxPostureItem& rPItem = rSet.Get(GetWhich(SID_ATTR_CHAR_POSTURE)); + aMyFont.SetItalic(rPItem.GetPosture()); + + const SvxUnderlineItem& rUItem = rSet.Get(GetWhich(SID_ATTR_CHAR_UNDERLINE)); + aMyFont.SetUnderline(rUItem.GetLineStyle()); + + const SvxOverlineItem& rOItem = rSet.Get(GetWhich(SID_ATTR_CHAR_OVERLINE)); + aMyFont.SetOverline(rOItem.GetLineStyle()); + + const SvxCrossedOutItem& rCOItem = rSet.Get(GetWhich(SID_ATTR_CHAR_STRIKEOUT)); + aMyFont.SetStrikeout(rCOItem.GetStrikeout()); + + const SvxContourItem& rCItem = rSet.Get(GetWhich(SID_ATTR_CHAR_CONTOUR)); + aMyFont.SetOutline(rCItem.GetValue()); + + const SvxShadowedItem& rSItem = rSet.Get(GetWhich(SID_ATTR_CHAR_SHADOWED)); + aMyFont.SetShadow(rSItem.GetValue()); + + aNewLevel.SetBulletFont(&aMyFont); + aNumRule.SetLevel(nLevel, aNewLevel ); + } + else if( rSrcLevel.GetNumberingType() == css::style::NumberingType::CHAR_SPECIAL ) + { + aNewLevel.SetListFormat("", "", nLevel); + aNumRule.SetLevel(nLevel, aNewLevel ); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuarea.cxx b/sd/source/ui/func/fuarea.cxx new file mode 100644 index 0000000000..8dd7543e3b --- /dev/null +++ b/sd/source/ui/func/fuarea.cxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd { + +FuArea::FuArea( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* _pView, SdDrawDocument* pDoc, SfxRequest& rReq) +: FuPoor(pViewSh, pWin, _pView, pDoc, rReq) +{ +} + +rtl::Reference FuArea::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* _pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuArea( pViewSh, pWin, _pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuArea::DoExecute( SfxRequest& rReq ) +{ + rReq.Ignore (); + + const SfxItemSet* pArgs = rReq.GetArgs(); + if (pArgs) + return; + + SfxItemSet aNewAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aNewAttr ); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + bool bHasSlideBackground = mpViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress; + VclPtr pDlg( + pFact->CreateSvxAreaTabDialog(mpViewShell->GetFrameWeld(), &aNewAttr, mpDoc, true, bHasSlideBackground)); + + pDlg->StartExecuteAsync([pDlg, pView = this->mpView, pViewShell = this->mpViewShell](sal_Int32 nResult){ + if (nResult == RET_OK) + { + pView->SetAttributes (*(pDlg->GetOutputItemSet ())); + + // attributes changed, update Listboxes in Objectbars + static const sal_uInt16 SidArray[] = { + SID_ATTR_FILL_STYLE, + SID_ATTR_FILL_COLOR, + SID_ATTR_FILL_GRADIENT, + SID_ATTR_FILL_HATCH, + SID_ATTR_FILL_BITMAP, + SID_ATTR_FILL_TRANSPARENCE, + SID_ATTR_FILL_FLOATTRANSPARENCE, + SID_ATTR_FILL_USE_SLIDE_BACKGROUND, + 0 }; + + pViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + } + + // deferred until the dialog ends + pViewShell->Cancel(); + + pDlg->disposeOnce(); + }); +} + +void FuArea::Activate() +{ +} + +void FuArea::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fubullet.cxx b/sd/source/ui/func/fubullet.cxx new file mode 100644 index 0000000000..688ac67a83 --- /dev/null +++ b/sd/source/ui/func/fubullet.cxx @@ -0,0 +1,330 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +const sal_Unicode CHAR_HARDBLANK = u'\x00A0'; +const sal_Unicode CHAR_HARDHYPHEN = u'\x2011'; +const sal_Unicode CHAR_SOFTHYPHEN = u'\x00AD'; +const sal_Unicode CHAR_RLM = u'\x200F'; +const sal_Unicode CHAR_LRM = u'\x200E'; +const sal_Unicode CHAR_ZWSP = u'\x200B'; +const sal_Unicode CHAR_WJ = u'\x2060'; +const sal_Unicode CHAR_NNBSP = u'\x202F'; //NARROW NO-BREAK SPACE + + +FuBullet::FuBullet ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* _pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, _pView, pDoc, rReq) +{ +} + +rtl::Reference FuBullet::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuBullet( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuBullet::DoExecute( SfxRequest& rReq ) +{ + if( rReq.GetSlot() == SID_CHARMAP ) + InsertSpecialCharacter(rReq); + else + { + sal_Unicode cMark = 0; + switch( rReq.GetSlot() ) + { + case FN_INSERT_SOFT_HYPHEN: cMark = CHAR_SOFTHYPHEN ; break; + case FN_INSERT_HARDHYPHEN: cMark = CHAR_HARDHYPHEN ; break; + case FN_INSERT_HARD_SPACE: cMark = CHAR_HARDBLANK ; break; + case FN_INSERT_NNBSP: cMark = CHAR_NNBSP ; break; + case SID_INSERT_RLM : cMark = CHAR_RLM ; break; + case SID_INSERT_LRM : cMark = CHAR_LRM ; break; + case SID_INSERT_ZWSP : cMark = CHAR_ZWSP ; break; + case SID_INSERT_WJ: cMark = CHAR_WJ; break; + } + + DBG_ASSERT( cMark != 0, "FuBullet::FuBullet(), illegal slot used!" ); + + if( cMark ) + InsertFormattingMark( cMark ); + } + +} + +void FuBullet::InsertFormattingMark( sal_Unicode cMark ) +{ + OutlinerView* pOV = nullptr; + ::Outliner* pOL = nullptr; + + // depending on ViewShell set Outliner and OutlinerView + if( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr) + { + pOV = mpView->GetTextEditOutlinerView(); + if (pOV) + pOL = mpView->GetTextEditOutliner(); + } + else if( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr) + { + pOL = &static_cast(mpView)->GetOutliner(); + pOV = static_cast(mpView)->GetViewByWindow( + mpViewShell->GetActiveWindow()); + } + + // insert string + if(!(pOV && pOL)) + return; + + // prevent flickering + pOV->HideCursor(); + pOL->SetUpdateLayout(false); + + // remove old selected text + pOV->InsertText( "" ); + + // prepare undo + EditUndoManager& rUndoMgr = pOL->GetUndoManager(); + rUndoMgr.EnterListAction(SdResId(STR_UNDO_INSERT_SPECCHAR), + "", 0, mpViewShell->GetViewShellBase().GetViewShellId() ); + + // insert given text + OUString aStr( cMark ); + pOV->InsertText( aStr, true); + + ESelection aSel = pOV->GetSelection(); + aSel.nStartPara = aSel.nEndPara; + aSel.nStartPos = aSel.nEndPos; + pOV->SetSelection(aSel); + + rUndoMgr.LeaveListAction(); + + // restart repainting + pOL->SetUpdateLayout(true); + pOV->ShowCursor(); +} + +void FuBullet::InsertSpecialCharacter( SfxRequest const & rReq ) +{ + const SfxItemSet *pArgs = rReq.GetArgs(); + const SfxStringItem* pItem = nullptr; + if( pArgs ) + pItem = pArgs->GetItemIfSet(SID_CHARMAP, false); + + OUString aChars; + vcl::Font aFont; + if ( pItem ) + { + aChars = pItem->GetValue(); + const SfxStringItem* pFontItem = pArgs->GetItemIfSet( SID_ATTR_SPECIALCHAR, false ); + if ( pFontItem ) + { + const OUString& aFontName = pFontItem->GetValue(); + aFont = vcl::Font( aFontName, Size(1,1) ); + } + else + { + SfxItemSet aFontAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aFontAttr ); + const SvxFontItem* pFItem = aFontAttr.GetItem( SID_ATTR_CHAR_FONT ); + if( pFItem ) + aFont = vcl::Font( pFItem->GetFamilyName(), pFItem->GetStyleName(), Size( 1, 1 ) ); + } + } + + if (aChars.isEmpty()) + { + SfxAllItemSet aSet( mpDoc->GetPool() ); + aSet.Put( SfxBoolItem( FN_PARAM_1, false ) ); + + SfxItemSet aFontAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aFontAttr ); + const SvxFontItem* pFontItem = aFontAttr.GetItem( SID_ATTR_CHAR_FONT ); + if( pFontItem ) + aSet.Put( *pFontItem ); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + auto xFrame = mpViewShell ? mpViewShell->GetFrame()->GetFrame().GetFrameInterface() : nullptr; + ScopedVclPtr pDlg( pFact->CreateCharMapDialog(mpView->GetViewShell()->GetFrameWeld(), aSet, + xFrame) ); + + // If a character is selected, it can be shown + // pDLg->SetFont( ); + // pDlg->SetChar( ); + pDlg->Execute(); + return; + } + + if (aChars.isEmpty()) + return; + + OutlinerView* pOV = nullptr; + ::Outliner* pOL = nullptr; + + // determine depending on ViewShell Outliner and OutlinerView + if(dynamic_cast< const DrawViewShell *>( mpViewShell )) + { + pOV = mpView->GetTextEditOutlinerView(); + if (pOV) + { + pOL = mpView->GetTextEditOutliner(); + } + } + else if(dynamic_cast< const OutlineViewShell *>( mpViewShell )) + { + pOL = &static_cast(mpView)->GetOutliner(); + pOV = static_cast(mpView)->GetViewByWindow( + mpViewShell->GetActiveWindow()); + } + + // insert special character + if (!pOV) + return; + + // prevent flicker + pOV->HideCursor(); + pOL->SetUpdateLayout(false); + + /* remember old attributes: + To do that, remove selected area before (it has to go anyway). + With that, we get unique attributes (and since there is no + DeleteSelected() in OutlinerView, it is deleted by inserting an + empty string). */ + pOV->InsertText( "" ); + + SfxItemSetFixed aOldSet( mpDoc->GetPool() ); + aOldSet.Put( pOV->GetAttribs() ); + + EditUndoManager& rUndoMgr = pOL->GetUndoManager(); + ViewShellId nViewShellId = mpViewShell ? mpViewShell->GetViewShellBase().GetViewShellId() : ViewShellId(-1); + rUndoMgr.EnterListAction(SdResId(STR_UNDO_INSERT_SPECCHAR), + "", 0, nViewShellId ); + pOV->InsertText(aChars, true); + + // set attributes (set font) + SfxItemSet aSet(pOL->GetEmptyItemSet()); + SvxFontItem aFontItem (aFont.GetFamilyType(), aFont.GetFamilyName(), + aFont.GetStyleName(), aFont.GetPitch(), + aFont.GetCharSet(), + EE_CHAR_FONTINFO); + aSet.Put(aFontItem); + aFontItem.SetWhich(EE_CHAR_FONTINFO_CJK); + aSet.Put(aFontItem); + aFontItem.SetWhich(EE_CHAR_FONTINFO_CTL); + aSet.Put(aFontItem); + pOV->SetAttribs(aSet); + + ESelection aSel = pOV->GetSelection(); + aSel.nStartPara = aSel.nEndPara; + aSel.nStartPos = aSel.nEndPos; + pOV->SetSelection(aSel); + + // do not go ahead with setting attributes of special characters + pOV->GetOutliner()->QuickSetAttribs(aOldSet, aSel); + + rUndoMgr.LeaveListAction(); + + // show it again + pOL->SetUpdateLayout(true); + pOV->ShowCursor(); +} + +void FuBullet::GetSlotState( SfxItemSet& rSet, ViewShell const * pViewShell, SfxViewFrame* pViewFrame ) +{ + if( !(SfxItemState::DEFAULT == rSet.GetItemState( SID_CHARMAP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_CHARMAP_CONTROL ) || + SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_SOFT_HYPHEN ) || + SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_HARDHYPHEN ) || + SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_HARD_SPACE ) || + SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_NNBSP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_RLM ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_LRM ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_WJ ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_ZWSP ))) + return; + + ::sd::View* pView = pViewShell ? pViewShell->GetView() : nullptr; + OutlinerView* pOLV = pView ? pView->GetTextEditOutlinerView() : nullptr; + + const bool bTextEdit = pOLV; + + const bool bCtlEnabled = SvtCTLOptions::IsCTLFontEnabled(); + + if(!bTextEdit ) + { + rSet.DisableItem(FN_INSERT_SOFT_HYPHEN); + rSet.DisableItem(FN_INSERT_HARDHYPHEN); + rSet.DisableItem(FN_INSERT_HARD_SPACE); + rSet.DisableItem(FN_INSERT_NNBSP); + rSet.DisableItem(SID_INSERT_WJ); + rSet.DisableItem(SID_INSERT_ZWSP); + } + + if( !bTextEdit && (dynamic_cast( pViewShell ) == nullptr) ) + { + rSet.DisableItem(SID_CHARMAP); + rSet.DisableItem(SID_CHARMAP_CONTROL); + } + + if(!bTextEdit || !bCtlEnabled ) + { + rSet.DisableItem(SID_INSERT_RLM); + rSet.DisableItem(SID_INSERT_LRM); + } + + if( pViewFrame ) + { + SfxBindings& rBindings = pViewFrame->GetBindings(); + + rBindings.SetVisibleState( SID_INSERT_RLM, bCtlEnabled ); + rBindings.SetVisibleState( SID_INSERT_LRM, bCtlEnabled ); + } +} +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuchar.cxx b/sd/source/ui/func/fuchar.cxx new file mode 100644 index 0000000000..3935f64a1d --- /dev/null +++ b/sd/source/ui/func/fuchar.cxx @@ -0,0 +1,139 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuChar::FuChar ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuChar::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuChar( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuChar::DoExecute( SfxRequest& rReq ) +{ + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + { + SfxItemSet aEditAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aEditAttr ); + + SfxItemSetFixed aNewAttr(mpViewShell->GetPool()); + aNewAttr.Put( aEditAttr, false ); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreateSdTabCharDialog(mpViewShell->GetFrameWeld(), &aNewAttr, mpDoc->GetDocSh() ) ); + if (rReq.GetSlot() == SID_CHAR_DLG_EFFECT) + { + pDlg->SetCurPageId("RID_SVXPAGE_CHAR_EFFECTS"); + } + + sal_uInt16 nResult = pDlg->Execute(); + + if( nResult != RET_OK ) + return; + + const SfxItemSet* pOutputSet = pDlg->GetOutputItemSet(); + SfxItemSet aOtherSet( *pOutputSet ); + + // and now the reverse process + const SvxBrushItem* pBrushItem = aOtherSet.GetItem( SID_ATTR_BRUSH_CHAR ); + + if ( pBrushItem ) + { + SvxColorItem aBackColorItem( pBrushItem->GetColor(), EE_CHAR_BKGCOLOR ); + aOtherSet.ClearItem( SID_ATTR_BRUSH_CHAR ); + aOtherSet.Put( aBackColorItem ); + } + + rReq.Done( aOtherSet ); + pArgs = rReq.GetArgs(); + } + mpView->SetAttributes(*pArgs); + + // invalidate the Slots which are in DrTxtObjBar + static const sal_uInt16 SidArray[] = { + SID_ATTR_CHAR_FONT, + SID_ATTR_CHAR_POSTURE, + SID_ATTR_CHAR_WEIGHT, + SID_ATTR_CHAR_SHADOWED, + SID_ATTR_CHAR_STRIKEOUT, + SID_ATTR_CHAR_UNDERLINE, + SID_ATTR_CHAR_FONTHEIGHT, + SID_ATTR_CHAR_COLOR, + SID_ATTR_CHAR_KERNING, + SID_ATTR_CHAR_CASEMAP, + SID_SET_SUPER_SCRIPT, + SID_SET_SUB_SCRIPT, + SID_ATTR_CHAR_BACK_COLOR, + 0 }; + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + + if( mpDoc->GetOnlineSpell() ) + { + if( SfxItemState::SET == pArgs->GetItemState(EE_CHAR_LANGUAGE, false ) || + SfxItemState::SET == pArgs->GetItemState(EE_CHAR_LANGUAGE_CJK, false ) || + SfxItemState::SET == pArgs->GetItemState(EE_CHAR_LANGUAGE_CTL, false ) ) + { + mpDoc->StopOnlineSpelling(); + mpDoc->StartOnlineSpelling(); + } + } +} + +void FuChar::Activate() +{ +} + +void FuChar::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fucon3d.cxx b/sd/source/ui/func/fucon3d.cxx new file mode 100644 index 0000000000..b26d634898 --- /dev/null +++ b/sd/source/ui/func/fucon3d.cxx @@ -0,0 +1,477 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace com::sun::star; + +namespace sd { + + +FuConstruct3dObject::FuConstruct3dObject ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuConstruct(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuConstruct3dObject::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuConstruct3dObject* pFunc; + rtl::Reference xFunc( pFunc = new FuConstruct3dObject( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent(bPermanent); + return xFunc; +} + +void FuConstruct3dObject::DoExecute( SfxRequest& rReq ) +{ + FuConstruct::DoExecute( rReq ); + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msDrawingObjectToolBar); +} + +rtl::Reference FuConstruct3dObject::ImpCreateBasic3DShape() +{ + rtl::Reference p3DObj; + + switch (nSlotId) + { + default: + case SID_3D_CUBE: + { + p3DObj = new E3dCubeObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B3DPoint(-2500, -2500, -2500), + ::basegfx::B3DVector(5000, 5000, 5000)); + break; + } + + case SID_3D_SPHERE: + { + p3DObj = new E3dSphereObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B3DPoint(0, 0, 0), + ::basegfx::B3DVector(5000, 5000, 5000)); + break; + } + + case SID_3D_SHELL: + { + XPolygon aXPoly(Point (0, 1250), 2500, 2500, 0_deg100, 9000_deg100, false); + aXPoly.Scale(5.0, 5.0); + + ::basegfx::B2DPolygon aB2DPolygon(aXPoly.getB2DPolygon()); + if(aB2DPolygon.areControlPointsUsed()) + { + aB2DPolygon = ::basegfx::utils::adaptiveSubdivideByAngle(aB2DPolygon); + } + p3DObj = new E3dLatheObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B2DPolyPolygon(aB2DPolygon)); + + /* this is an open object, therefore it has to be handled double- + sided by default */ + p3DObj->SetMergedItem(makeSvx3DDoubleSidedItem(true)); + break; + } + + case SID_3D_HALF_SPHERE: + { + XPolygon aXPoly(Point (0, 1250), 2500, 2500, 0_deg100, 9000_deg100, false); + aXPoly.Scale(5.0, 5.0); + + aXPoly.Insert(0, Point (2400*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (2000*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (1500*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (1000*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (500*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (250*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (50*5, 1250*5), PolyFlags::Normal); + aXPoly.Insert(0, Point (0, 1250*5), PolyFlags::Normal); + + ::basegfx::B2DPolygon aB2DPolygon(aXPoly.getB2DPolygon()); + if(aB2DPolygon.areControlPointsUsed()) + { + aB2DPolygon = ::basegfx::utils::adaptiveSubdivideByAngle(aB2DPolygon); + } + p3DObj = new E3dLatheObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B2DPolyPolygon(aB2DPolygon)); + break; + } + + case SID_3D_TORUS: + { + ::basegfx::B2DPolygon aB2DPolygon(::basegfx::utils::createPolygonFromCircle(::basegfx::B2DPoint(1000.0, 0.0), 500.0)); + if(aB2DPolygon.areControlPointsUsed()) + { + aB2DPolygon = ::basegfx::utils::adaptiveSubdivideByAngle(aB2DPolygon); + } + p3DObj = new E3dLatheObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B2DPolyPolygon(aB2DPolygon)); + break; + } + + case SID_3D_CYLINDER: + { + ::basegfx::B2DPolygon aInnerPoly; + + aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(450*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(500*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(450*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(400*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(300*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(200*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(100*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(50*5, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5)); + aInnerPoly.setClosed(true); + + p3DObj = new E3dLatheObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B2DPolyPolygon(aInnerPoly)); + break; + } + + case SID_3D_CONE: + { + ::basegfx::B2DPolygon aInnerPoly; + + aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(25*5, -900*5)); + aInnerPoly.append(::basegfx::B2DPoint(50*5, -800*5)); + aInnerPoly.append(::basegfx::B2DPoint(100*5, -600*5)); + aInnerPoly.append(::basegfx::B2DPoint(200*5, -200*5)); + aInnerPoly.append(::basegfx::B2DPoint(300*5, 200*5)); + aInnerPoly.append(::basegfx::B2DPoint(400*5, 600*5)); + aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5)); + aInnerPoly.setClosed(true); + + p3DObj = new E3dLatheObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B2DPolyPolygon(aInnerPoly)); + break; + } + + case SID_3D_PYRAMID: + { + ::basegfx::B2DPolygon aInnerPoly; + + aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(25*5, -900*5)); + aInnerPoly.append(::basegfx::B2DPoint(50*5, -800*5)); + aInnerPoly.append(::basegfx::B2DPoint(100*5, -600*5)); + aInnerPoly.append(::basegfx::B2DPoint(200*5, -200*5)); + aInnerPoly.append(::basegfx::B2DPoint(300*5, 200*5)); + aInnerPoly.append(::basegfx::B2DPoint(400*5, 600*5)); + aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5)); + aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5)); + aInnerPoly.setClosed(true); + + p3DObj = new E3dLatheObj( + mpView->getSdrModelFromSdrView(), + mpView->Get3DDefaultAttributes(), + ::basegfx::B2DPolyPolygon(aInnerPoly)); + p3DObj->SetMergedItem(makeSvx3DHorizontalSegmentsItem(4)); + break; + } + } + + return p3DObj; +} + +void FuConstruct3dObject::ImpPrepareBasic3DShape(E3dCompoundObject const * p3DObj, E3dScene *pScene) +{ + Camera3D aCamera = pScene->GetCamera (); + + // get transformed BoundVolume of the new object + basegfx::B3DRange aBoundVol; + basegfx::B3DRange aObjVol(p3DObj->GetBoundVolume()); + aObjVol.transform(p3DObj->GetTransform()); + aBoundVol.expand(aObjVol); + double fDeepth(aBoundVol.getDepth()); + + aCamera.SetPRP(::basegfx::B3DPoint(0.0, 0.0, 1000.0)); + aCamera.SetPosition(::basegfx::B3DPoint(0.0, 0.0, mpView->GetDefaultCamPosZ() + fDeepth / 2)); + aCamera.SetFocalLength(mpView->GetDefaultCamFocal()); + pScene->SetCamera(aCamera); + basegfx::B3DHomMatrix aTransformation; + + switch (nSlotId) + { + case SID_3D_CUBE: + { + aTransformation.rotate(basegfx::deg2rad(20), 0.0, 0.0); + } + break; + + case SID_3D_SPHERE: + { + } + break; + + case SID_3D_SHELL: + case SID_3D_HALF_SPHERE: + { + aTransformation.rotate(basegfx::deg2rad(200), 0.0, 0.0); + } + break; + + case SID_3D_CYLINDER: + case SID_3D_CONE: + case SID_3D_PYRAMID: + { + } + break; + + case SID_3D_TORUS: + { + aTransformation.rotate(basegfx::deg2rad(90), 0.0, 0.0); + } + break; + + default: + { + } + break; + } + + pScene->SetTransform(aTransformation * pScene->GetTransform()); + + SfxItemSet aAttr (mpViewShell->GetPool()); + pScene->SetMergedItemSetAndBroadcast(aAttr); +} + +bool FuConstruct3dObject::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bReturn = FuConstruct::MouseButtonDown(rMEvt); + + if ( rMEvt.IsLeft() && !mpView->IsAction() ) + { + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + mpWindow->CaptureMouse(); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + + weld::WaitObject aWait(mpViewShell->GetFrameWeld()); + + rtl::Reference p3DObj = ImpCreateBasic3DShape(); + rtl::Reference pScene = mpView->SetCurrent3DObj(p3DObj.get()); + + ImpPrepareBasic3DShape(p3DObj.get(), pScene.get()); + bReturn = mpView->BegCreatePreparedObject(aPnt, nDrgLog, pScene.get()); + + SdrObject* pObj = mpView->GetCreateObj(); + + if (pObj) + { + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, pObj); + + // extract LineStyle + aAttr.Put(XLineStyleItem (drawing::LineStyle_NONE)); + + pObj->SetMergedItemSet(aAttr); + } + } + + return bReturn; +} + +bool FuConstruct3dObject::MouseButtonUp(const MouseEvent& rMEvt) +{ + if (rMEvt.IsLeft() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + bool bReturn = false; + + if ( mpView->IsCreateObj() && rMEvt.IsLeft() ) + { + if( mpView->EndCreateObj( SdrCreateCmd::ForceEnd ) ) + { + bReturn = true; + } + else + { + //Drag was too small to create object, so insert default object at click pos + Point aClickPos(mpWindow->PixelToLogic(rMEvt.GetPosPixel())); + sal_uInt32 nDefaultObjectSize(1000); + sal_Int32 nCenterOffset(-sal_Int32(nDefaultObjectSize / 2)); + aClickPos.AdjustX(nCenterOffset); + aClickPos.AdjustY(nCenterOffset); + + SdrPageView *pPV = mpView->GetSdrPageView(); + + if(mpView->IsSnapEnabled()) + aClickPos = mpView->GetSnapPos(aClickPos, pPV); + + ::tools::Rectangle aNewObjectRectangle(aClickPos, Size(nDefaultObjectSize, nDefaultObjectSize)); + rtl::Reference pObjDefault = CreateDefaultObject(nSlotId, aNewObjectRectangle); + + bReturn = mpView->InsertObjectAtView(pObjDefault.get(), *pPV); + } + } + bReturn = FuConstruct::MouseButtonUp(rMEvt) || bReturn; + + if (!bPermanent) + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + return bReturn; +} + +void FuConstruct3dObject::Activate() +{ + mpView->SetCurrentObj(SdrObjKind::NONE); + + FuConstruct::Activate(); +} + +rtl::Reference FuConstruct3dObject::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) +{ + + rtl::Reference p3DObj = ImpCreateBasic3DShape(); + + // E3dView::SetCurrent3DObj part + // get transformed BoundVolume of the object + basegfx::B3DRange aObjVol(p3DObj->GetBoundVolume()); + aObjVol.transform(p3DObj->GetTransform()); + basegfx::B3DRange aVolume(aObjVol); + double fW(aVolume.getWidth()); + double fH(aVolume.getHeight()); + ::tools::Rectangle a3DRect(0, 0, static_cast<::tools::Long>(fW), static_cast<::tools::Long>(fH)); + rtl::Reference< E3dScene > pScene(new E3dScene(*mpDoc)); + + // copied code from E3dView::InitScene + double fCamZ(aVolume.getMaxZ() + ((fW + fH) / 4.0)); + Camera3D aCam(pScene->GetCamera()); + aCam.SetAutoAdjustProjection(false); + aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH); + ::basegfx::B3DPoint aLookAt; + double fDefaultCamPosZ = mpView->GetDefaultCamPosZ(); + ::basegfx::B3DPoint aCamPos(0.0, 0.0, fCamZ < fDefaultCamPosZ ? fDefaultCamPosZ : fCamZ); + aCam.SetPosAndLookAt(aCamPos, aLookAt); + aCam.SetFocalLength(mpView->GetDefaultCamFocal()); + pScene->SetCamera(aCam); + pScene->InsertObject(p3DObj.get()); + pScene->NbcSetSnapRect(a3DRect); + ImpPrepareBasic3DShape(p3DObj.get(), pScene.get()); + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, p3DObj.get()); + aAttr.Put(XLineStyleItem (drawing::LineStyle_NONE)); + p3DObj->SetMergedItemSet(aAttr); + + // make object interactive at once + pScene->SetBoundAndSnapRectsDirty(); + + // Take care of restrictions for the rectangle + ::tools::Rectangle aRect(rRectangle); + + switch(nID) + { + case SID_3D_CUBE: + case SID_3D_SPHERE: + case SID_3D_TORUS: + { + // force quadratic + ImpForceQuadratic(aRect); + break; + } + + case SID_3D_SHELL: + case SID_3D_HALF_SPHERE: + { + // force horizontal layout + break; + } + + case SID_3D_CYLINDER: + case SID_3D_CONE: + case SID_3D_PYRAMID: + { + // force vertical layout + break; + } + } + + // use changed rectangle, not original one + pScene->SetLogicRect(aRect); + + return pScene; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconarc.cxx b/sd/source/ui/func/fuconarc.cxx new file mode 100644 index 0000000000..94718f1ed4 --- /dev/null +++ b/sd/source/ui/func/fuconarc.cxx @@ -0,0 +1,257 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +using namespace com::sun::star; + +namespace sd { + + +FuConstructArc::FuConstructArc ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ) + : FuConstruct( pViewSh, pWin, pView, pDoc, rReq ) +{ +} + +rtl::Reference FuConstructArc::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuConstructArc* pFunc; + rtl::Reference xFunc( pFunc = new FuConstructArc( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent(bPermanent); + return xFunc; +} + +void FuConstructArc::DoExecute( SfxRequest& rReq ) +{ + FuConstruct::DoExecute( rReq ); + + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msDrawingObjectToolBar); + + const SfxItemSet *pArgs = rReq.GetArgs (); + + if (!pArgs) + return; + + const SfxUInt32Item* pCenterX = rReq.GetArg(ID_VAL_CENTER_X); + const SfxUInt32Item* pCenterY = rReq.GetArg(ID_VAL_CENTER_Y); + const SfxUInt32Item* pAxisX = rReq.GetArg(ID_VAL_AXIS_X); + const SfxUInt32Item* pAxisY = rReq.GetArg(ID_VAL_AXIS_Y); + const SfxUInt32Item* pPhiStart = rReq.GetArg(ID_VAL_ANGLESTART); + const SfxUInt32Item* pPhiEnd = rReq.GetArg(ID_VAL_ANGLEEND); + + ::tools::Rectangle aNewRectangle (pCenterX->GetValue () - pAxisX->GetValue () / 2, + pCenterY->GetValue () - pAxisY->GetValue () / 2, + pCenterX->GetValue () + pAxisX->GetValue () / 2, + pCenterY->GetValue () + pAxisY->GetValue () / 2); + + Activate(); // sets aObjKind + rtl::Reference pNewCircle = + new SdrCircObj( + mpView->getSdrModelFromSdrView(), + ToSdrCircKind(mpView->GetCurrentObjIdentifier()), + aNewRectangle, + Degree100(pPhiStart->GetValue() * 10), + Degree100(pPhiEnd->GetValue() * 10)); + SdrPageView *pPV = mpView->GetSdrPageView(); + + mpView->InsertObjectAtView(pNewCircle.get(), *pPV, SdrInsertFlags::SETDEFLAYER); +} + +bool FuConstructArc::MouseButtonDown( const MouseEvent& rMEvt ) +{ + bool bReturn = FuConstruct::MouseButtonDown( rMEvt ); + + if ( rMEvt.IsLeft() && !mpView->IsAction() ) + { + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + mpWindow->CaptureMouse(); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpView->BegCreateObj(aPnt, nullptr, nDrgLog); + + SdrObject* pObj = mpView->GetCreateObj(); + + if (pObj) + { + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, pObj); + + pObj->SetMergedItemSet(aAttr); + } + + bReturn = true; + } + return bReturn; +} + +bool FuConstructArc::MouseButtonUp( const MouseEvent& rMEvt ) +{ + if (rMEvt.IsLeft() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + bool bReturn = false; + bool bCreated = false; + + if ( mpView->IsCreateObj() && rMEvt.IsLeft() ) + { + const size_t nCount = mpView->GetSdrPageView()->GetObjList()->GetObjCount(); + + if (mpView->EndCreateObj(SdrCreateCmd::NextPoint) ) + { + if (nCount != mpView->GetSdrPageView()->GetObjList()->GetObjCount()) + { + bCreated = true; + } + } + + bReturn = true; + } + + bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn; + + if (!bPermanent && bCreated) + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + return bReturn; +} + +void FuConstructArc::Activate() +{ + SdrObjKind aObjKind; + + switch( nSlotId ) + { + case SID_DRAW_ARC : + case SID_DRAW_CIRCLEARC: + { + aObjKind = SdrObjKind::CircleArc; + } + break; + + case SID_DRAW_PIE : + case SID_DRAW_PIE_NOFILL : + case SID_DRAW_CIRCLEPIE : + case SID_DRAW_CIRCLEPIE_NOFILL: + { + aObjKind = SdrObjKind::CircleSection; + } + break; + + case SID_DRAW_ELLIPSECUT : + case SID_DRAW_ELLIPSECUT_NOFILL: + case SID_DRAW_CIRCLECUT : + case SID_DRAW_CIRCLECUT_NOFILL : + { + aObjKind = SdrObjKind::CircleCut; + } + break; + + default: + { + aObjKind = SdrObjKind::CircleArc; + } + break; + } + + mpView->SetCurrentObj(aObjKind); + + FuConstruct::Activate(); +} + +rtl::Reference FuConstructArc::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) +{ + + rtl::Reference pObj(SdrObjFactory::MakeNewObject( + mpView->getSdrModelFromSdrView(), + mpView->GetCurrentObjInventor(), + mpView->GetCurrentObjIdentifier())); + + if(pObj) + { + if( dynamic_cast< const SdrCircObj *>( pObj.get() ) != nullptr) + { + ::tools::Rectangle aRect(rRectangle); + + if(SID_DRAW_ARC == nID || + SID_DRAW_CIRCLEARC == nID || + SID_DRAW_CIRCLEPIE == nID || + SID_DRAW_CIRCLEPIE_NOFILL == nID || + SID_DRAW_CIRCLECUT == nID || + SID_DRAW_CIRCLECUT_NOFILL == nID) + { + // force quadratic + ImpForceQuadratic(aRect); + } + + pObj->SetLogicRect(aRect); + + SfxItemSet aAttr(mpDoc->GetPool()); + aAttr.Put(makeSdrCircStartAngleItem(9000_deg100)); + aAttr.Put(makeSdrCircEndAngleItem(0_deg100)); + + if(SID_DRAW_PIE_NOFILL == nID || + SID_DRAW_CIRCLEPIE_NOFILL == nID || + SID_DRAW_ELLIPSECUT_NOFILL == nID || + SID_DRAW_CIRCLECUT_NOFILL == nID) + { + aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + } + + pObj->SetMergedItemSet(aAttr); + } + else + { + OSL_FAIL("Object is NO circle object"); + } + } + + return pObj; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconbez.cxx b/sd/source/ui/func/fuconbez.cxx new file mode 100644 index 0000000000..881f27343d --- /dev/null +++ b/sd/source/ui/func/fuconbez.cxx @@ -0,0 +1,559 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +using namespace ::com::sun::star::uno; + +namespace sd { + +/*//Extra attributes coming from parameters + sal_uInt16 mnTransparence; // Default: 0 + OUString msColor; // Default: "" + sal_uInt16 mnWidth; // Default: 0 + OUString msShapeName; // Default: ""*/ +FuConstructBezierPolygon::FuConstructBezierPolygon ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuConstruct(pViewSh, pWin, pView, pDoc, rReq), + nEditMode(SID_BEZIER_MOVE), + mnTransparence(0), + mnWidth(0) +{ +} + +namespace{ + +/// Checks to see if the request has a parameter of IsSticky:bool=true +/// It means that the selected command/button will stay selected after use +bool isSticky(const SfxRequest& rReq) +{ + const SfxItemSet *pArgs = rReq.GetArgs (); + if (pArgs) + { + const SfxBoolItem* pIsSticky = rReq.GetArg(FN_PARAM_4); + if (pIsSticky && pIsSticky->GetValue()) + return true; + } + + return false; +} + +} + +rtl::Reference FuConstructBezierPolygon::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuConstructBezierPolygon* pFunc; + rtl::Reference xFunc( pFunc = new FuConstructBezierPolygon( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent(bPermanent || isSticky(rReq)); + return xFunc; +} + +void FuConstructBezierPolygon::DoExecute( SfxRequest& rReq ) +{ + FuConstruct::DoExecute( rReq ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + return; + + const SfxUnoAnyItem* pPoolItem = pArgs->GetItemIfSet( SID_ADD_MOTION_PATH ); + if( pPoolItem ) + maTargets = pPoolItem->GetValue(); + + if (nSlotId != SID_DRAW_FREELINE_NOFILL) + return; + + const SfxUInt16Item* pTransparence = rReq.GetArg(FN_PARAM_1); + const SfxStringItem* pColor = rReq.GetArg(FN_PARAM_2); + const SfxUInt16Item* pWidth = rReq.GetArg(FN_PARAM_3); + const SfxStringItem* pShapeName = rReq.GetArg(SID_SHAPE_NAME); + + if (pTransparence && pTransparence->GetValue() > 0) + { + mnTransparence = pTransparence->GetValue(); + } + if (pColor && !pColor->GetValue().isEmpty()) + { + msColor = pColor->GetValue(); + } + if (pWidth && pWidth->GetValue() > 0) + { + mnWidth = pWidth->GetValue(); + } + if (pShapeName && !pShapeName->GetValue().isEmpty()) + { + msShapeName = pShapeName->GetValue(); + } +} + +bool FuConstructBezierPolygon::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bReturn = FuConstruct::MouseButtonDown(rMEvt); + + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::Handle || rMEvt.IsMod1()) + { + mpView->SetEditMode(SdrViewEditMode::Edit); + } + else + { + mpView->SetEditMode(SdrViewEditMode::Create); + } + + if (aVEvt.meEvent == SdrEventKind::BeginTextEdit) + { + // here, we do not allow text input + aVEvt.meEvent = SdrEventKind::BeginDragObj; + mpView->EnableExtendedMouseEventDispatcher(false); + } + else + { + mpView->EnableExtendedMouseEventDispatcher(true); + } + + if (eHit == SdrHitKind::MarkedObject && nEditMode == SID_BEZIER_INSERT) + { + // insert gluepoint + mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1()); + } + else + { + mpView->MouseButtonDown(rMEvt, mpWindow->GetOutDev()); + + SdrObject* pObj = mpView->GetCreateObj(); + + if (pObj) + { + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, pObj); + SetAttributes(aAttr, pObj); + pObj->SetMergedItemSet(aAttr); + } + } + + return bReturn; +} + +bool FuConstructBezierPolygon::MouseButtonUp(const MouseEvent& rMEvt ) +{ + if (rMEvt.IsLeft() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + bool bReturn = false; + bool bCreated = false; + + SdrViewEvent aVEvt; + mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONUP, aVEvt); + + const size_t nCount = mpView->GetSdrPageView()->GetObjList()->GetObjCount(); + + if (mpView->IsInsObjPoint()) + { + mpView->EndInsObjPoint(SdrCreateCmd::ForceEnd); + } + else + { + mpView->MouseButtonUp(rMEvt, mpWindow->GetOutDev()); + } + + if (aVEvt.meEvent == SdrEventKind::EndCreate) + { + bReturn = true; + + if (nCount+1 == mpView->GetSdrPageView()->GetObjList()->GetObjCount()) + { + bCreated = true; + } + + // trick to suppress FuDraw::DoubleClick + bMBDown = false; + + } + + bReturn = FuConstruct::MouseButtonUp(rMEvt) || bReturn; + + bool bDeleted = false; + if( bCreated && maTargets.hasValue() ) + { + SdrPathObj* pPathObj = dynamic_cast< SdrPathObj* >( mpView->GetSdrPageView()->GetObjList()->GetObj( nCount ) ); + SdPage* pPage = dynamic_cast< SdPage* >( pPathObj ? pPathObj->getSdrPageFromSdrObject() : nullptr ); + if( pPage ) + { + std::shared_ptr< sd::MainSequence > pMainSequence( pPage->getMainSequence() ); + if( pMainSequence ) + { + Sequence< Any > aTargets; + maTargets >>= aTargets; + + sal_Int32 nTCount = aTargets.getLength(); + if( nTCount > 1 ) + { + const Any* pTarget = aTargets.getConstArray(); + double fDuration = 0.0; + *pTarget++ >>= fDuration; + bool bFirst = true; + + OUString sPresetId; + switch(nSlotId) + { + case SID_DRAW_BEZIER_NOFILL: + sPresetId = "libo-motionpath-curve"; + break; + case SID_DRAW_POLYGON_NOFILL: + sPresetId = "libo-motionpath-polygon"; + break; + case SID_DRAW_FREELINE_NOFILL: + sPresetId = "libo-motionpath-freeform-line"; + break; + } + + while( --nTCount ) + { + CustomAnimationEffectPtr pCreated( pMainSequence->append( *pPathObj, *pTarget++, fDuration, sPresetId) ); + if( bFirst ) + bFirst = false; + else + pCreated->setNodeType( css::presentation::EffectNodeType::WITH_PREVIOUS ); + } + } + } + } + mpView->DeleteMarked(); + bDeleted = true; + } + + if ((!bPermanent && bCreated) || bDeleted) + { + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + + return bReturn; +} + +void FuConstructBezierPolygon::Activate() +{ + mpView->EnableExtendedMouseEventDispatcher(true); + + SdrObjKind eKind; + + switch (nSlotId) + { + case SID_DRAW_POLYGON_NOFILL: + case SID_DRAW_XPOLYGON_NOFILL: + { + eKind = SdrObjKind::PolyLine; + } + break; + + case SID_DRAW_POLYGON: + case SID_DRAW_XPOLYGON: + { + eKind = SdrObjKind::Polygon; + } + break; + + case SID_DRAW_BEZIER_NOFILL: + { + eKind = SdrObjKind::PathLine; + } + break; + + case SID_DRAW_BEZIER_FILL: + { + eKind = SdrObjKind::PathFill; + } + break; + + case SID_DRAW_FREELINE_NOFILL: + { + eKind = SdrObjKind::FreehandLine; + } + break; + + case SID_DRAW_FREELINE: + { + eKind = SdrObjKind::FreehandFill; + } + break; + + default: + { + eKind = SdrObjKind::PathLine; + } + break; + } + + mpView->SetCurrentObj(eKind); + + FuConstruct::Activate(); +} + +void FuConstructBezierPolygon::Deactivate() +{ + mpView->EnableExtendedMouseEventDispatcher(false); + + FuConstruct::Deactivate(); +} + +void FuConstructBezierPolygon::SelectionHasChanged() +{ + FuDraw::SelectionHasChanged(); + + mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged( + *mpViewShell, + *mpView); +} + +namespace { +/// Returns the color based on the color names listed in core/include/tools/color.hxx +/// Feel free to extend with more color names from color.hxx +Color strToColor(std::u16string_view sColor) +{ + Color aColor = COL_AUTO; + + if (sColor == u"COL_GRAY") + aColor = COL_GRAY; + else if (sColor == u"COL_GRAY3") + aColor = COL_GRAY3; + else if (sColor == u"COL_GRAY7") + aColor = COL_GRAY7; + + return aColor; +} +} + +void FuConstructBezierPolygon::SetAttributes(SfxItemSet& rAttr, SdrObject *pObj) +{ + if (nSlotId == SID_DRAW_FREELINE_NOFILL) + { + if (mnTransparence > 0 && mnTransparence <= 100) + rAttr.Put(XLineTransparenceItem(mnTransparence)); + if (!msColor.isEmpty()) + rAttr.Put(XLineColorItem(OUString(), strToColor(msColor))); + if (mnWidth > 0) + rAttr.Put(XLineWidthItem(mnWidth)); + if (!msShapeName.isEmpty()) + pObj->SetName(msShapeName); + } +} + +/** + * Set current bezier edit mode + */ +void FuConstructBezierPolygon::SetEditMode(sal_uInt16 nMode) +{ + nEditMode = nMode; + ForcePointer(); + + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_BEZIER_MOVE); + rBindings.Invalidate(SID_BEZIER_INSERT); +} + +rtl::Reference FuConstructBezierPolygon::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) +{ + // case SID_DRAW_POLYGON: + // case SID_DRAW_POLYGON_NOFILL: + // case SID_DRAW_XPOLYGON: + // case SID_DRAW_XPOLYGON_NOFILL: + // case SID_DRAW_FREELINE: + // case SID_DRAW_FREELINE_NOFILL: + // case SID_DRAW_BEZIER_FILL: // BASIC + // case SID_DRAW_BEZIER_NOFILL: // BASIC + + rtl::Reference pObj(SdrObjFactory::MakeNewObject( + mpView->getSdrModelFromSdrView(), + mpView->GetCurrentObjInventor(), + mpView->GetCurrentObjIdentifier())); + + if(pObj) + { + if( auto pPathObj = dynamic_cast< SdrPathObj *>( pObj.get() ) ) + { + basegfx::B2DPolyPolygon aPoly; + + switch(nID) + { + case SID_DRAW_BEZIER_FILL: + { + const sal_Int32 nWdt(rRectangle.GetWidth() / 2); + const sal_Int32 nHgt(rRectangle.GetHeight() / 2); + const basegfx::B2DPolygon aInnerPoly(basegfx::utils::createPolygonFromEllipse(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()), nWdt, nHgt)); + + aPoly.append(aInnerPoly); + break; + } + case SID_DRAW_BEZIER_NOFILL: + { + basegfx::B2DPolygon aInnerPoly; + + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom())); + + const basegfx::B2DPoint aCenterBottom(rRectangle.Center().X(), rRectangle.Bottom()); + aInnerPoly.appendBezierSegment( + aCenterBottom, + aCenterBottom, + basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y())); + + const basegfx::B2DPoint aCenterTop(rRectangle.Center().X(), rRectangle.Top()); + aInnerPoly.appendBezierSegment( + aCenterTop, + aCenterTop, + basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top())); + + aPoly.append(aInnerPoly); + break; + } + case SID_DRAW_FREELINE: + case SID_DRAW_FREELINE_NOFILL: + { + basegfx::B2DPolygon aInnerPoly; + + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom())); + + aInnerPoly.appendBezierSegment( + basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()), + basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top()), + basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y())); + + aInnerPoly.appendBezierSegment( + basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()), + basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()), + basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top())); + + if(SID_DRAW_FREELINE == nID) + { + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom())); + } + else + { + aInnerPoly.setClosed(true); + } + + aPoly.append(aInnerPoly); + break; + } + case SID_DRAW_XPOLYGON: + case SID_DRAW_XPOLYGON_NOFILL: + { + basegfx::B2DPolygon aInnerPoly; + + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Center().Y())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom())); + + if(SID_DRAW_XPOLYGON_NOFILL == nID) + { + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom())); + } + else + { + aInnerPoly.setClosed(true); + } + + aPoly.append(aInnerPoly); + break; + } + case SID_DRAW_POLYGON: + case SID_DRAW_POLYGON_NOFILL: + { + basegfx::B2DPolygon aInnerPoly; + const sal_Int32 nWdt(rRectangle.GetWidth()); + const sal_Int32 nHgt(rRectangle.GetHeight()); + + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 30) / 100, rRectangle.Top() + (nHgt * 70) / 100)); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top() + (nHgt * 15) / 100)); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 65) / 100, rRectangle.Top())); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + nWdt, rRectangle.Top() + (nHgt * 30) / 100)); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 50) / 100)); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 75) / 100)); + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Bottom(), rRectangle.Right())); + + if(SID_DRAW_POLYGON_NOFILL == nID) + { + aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom())); + } + else + { + aInnerPoly.setClosed(true); + } + + aPoly.append(aInnerPoly); + break; + } + } + + pPathObj->SetPathPoly(aPoly); + } + else + { + OSL_FAIL("Object is NO path object"); + } + + pObj->SetLogicRect(rRectangle); + } + + return pObj; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconcs.cxx b/sd/source/ui/func/fuconcs.cxx new file mode 100644 index 0000000000..7ca906c518 --- /dev/null +++ b/sd/source/ui/func/fuconcs.cxx @@ -0,0 +1,264 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd { + + +FuConstructCustomShape::FuConstructCustomShape ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ) : + FuConstruct(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuConstructCustomShape::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuConstructCustomShape* pFunc; + rtl::Reference xFunc( pFunc = new FuConstructCustomShape( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent( bPermanent ); + return xFunc; +} + +void FuConstructCustomShape::DoExecute( SfxRequest& rReq ) +{ + FuConstruct::DoExecute( rReq ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + if ( pArgs ) + { + const SfxStringItem& rItm = static_cast(pArgs->Get( rReq.GetSlot() )); + aCustomShape = rItm.GetValue(); + } + + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msDrawingObjectToolBar); +} + +bool FuConstructCustomShape::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bReturn = FuConstruct::MouseButtonDown(rMEvt); + + if ( rMEvt.IsLeft() && !mpView->IsAction() ) + { + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + mpWindow->CaptureMouse(); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + + mpView->BegCreateObj(aPnt, nullptr, nDrgLog); + + SdrObject* pObj = mpView->GetCreateObj(); + if ( pObj ) + { + SetAttributes( pObj ); + bool bForceFillStyle = true; + bool bForceNoFillStyle = false; + if ( static_cast(pObj)->UseNoFillStyle() ) + { + bForceFillStyle = false; + bForceNoFillStyle = true; + } + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet( aAttr, pObj, bForceFillStyle, bForceNoFillStyle ); + pObj->SetMergedItemSet(aAttr); + } + } + + return bReturn; +} + +bool FuConstructCustomShape::MouseButtonUp(const MouseEvent& rMEvt) +{ + if (rMEvt.IsLeft() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + bool bReturn(false); + + if(mpView->IsCreateObj() && rMEvt.IsLeft()) + { + SdrObject* pObj = mpView->GetCreateObj(); + if( pObj && mpView->EndCreateObj( SdrCreateCmd::ForceEnd ) ) + { + bReturn = true; + } + else + { + //Drag was too small to create object, so insert default object at click pos + Point aClickPos(mpWindow->PixelToLogic(rMEvt.GetPosPixel())); + sal_uInt32 nDefaultObjectSize(1000); + sal_Int32 nCenterOffset(-sal_Int32(nDefaultObjectSize / 2)); + aClickPos.AdjustX(nCenterOffset); + aClickPos.AdjustY(nCenterOffset); + + SdrPageView *pPV = mpView->GetSdrPageView(); + if(mpView->IsSnapEnabled()) + aClickPos = mpView->GetSnapPos(aClickPos, pPV); + + ::tools::Rectangle aNewObjectRectangle(aClickPos, Size(nDefaultObjectSize, nDefaultObjectSize)); + rtl::Reference pObjDefault = CreateDefaultObject(nSlotId, aNewObjectRectangle); + + bReturn = mpView->InsertObjectAtView(pObjDefault.get(), *pPV); + } + } + bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn; + + if (!bPermanent) + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + return bReturn; +} + +void FuConstructCustomShape::Activate() +{ + mpView->SetCurrentObj( SdrObjKind::CustomShape ); + FuConstruct::Activate(); +} + +/** + * set attribute for the object to be created + */ +void FuConstructCustomShape::SetAttributes( SdrObject* pObj ) +{ + bool bAttributesAppliedFromGallery = false; + + if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) ) + { + std::vector< OUString > aObjList; + if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) ) + { + for ( std::vector::size_type i = 0; i < aObjList.size(); i++ ) + { + if ( aObjList[ i ].equalsIgnoreAsciiCase( aCustomShape ) ) + { + FmFormModel aFormModel; + SfxItemPool& rPool(aFormModel.GetItemPool()); + rPool.FreezeIdRanges(); + + if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aFormModel ) ) + { + const SdrPage* pPage = aFormModel.GetPage( 0 ); + if ( pPage ) + { + const SdrObject* pSourceObj = pPage->GetObj( 0 ); + if( pSourceObj ) + { + const SfxItemSet& rSource = pSourceObj->GetMergedItemSet(); + SfxItemSetFixed< + // Ranges from SdrAttrObj: + SDRATTR_START, SDRATTR_SHADOW_LAST, + SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST, + SDRATTR_TEXTDIRECTION, + SDRATTR_TEXTDIRECTION, + // Graphic attributes, 3D properties, + // CustomShape properties: + SDRATTR_GRAF_FIRST, + SDRATTR_CUSTOMSHAPE_LAST, + // Range from SdrTextObj: + EE_ITEMS_START, EE_ITEMS_END> aDest(pObj->getSdrModelFromSdrObject().GetItemPool()); + aDest.Set( rSource ); + pObj->SetMergedItemSet( aDest ); + // Enables Word-wrap by default (tdf#134369) + pObj->SetMergedItem( SdrOnOffItem( SDRATTR_TEXT_WORDWRAP, true ) ); + Degree100 nAngle = pSourceObj->GetRotateAngle(); + if ( nAngle ) + pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle ); + bAttributesAppliedFromGallery = true; + } + } + } + break; + } + } + } + } + if ( !bAttributesAppliedFromGallery ) + { + pObj->SetMergedItem( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) ); + pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) ); + pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) ); + pObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( false ) ); + static_cast(pObj)->MergeDefaultAttributes( &aCustomShape ); + } +} + +const OUString& FuConstructCustomShape::GetShapeType() const +{ + return aCustomShape; +} + +rtl::Reference FuConstructCustomShape::CreateDefaultObject(const sal_uInt16, const ::tools::Rectangle& rRectangle) +{ + rtl::Reference pObj(SdrObjFactory::MakeNewObject( + mpView->getSdrModelFromSdrView(), + mpView->GetCurrentObjInventor(), + mpView->GetCurrentObjIdentifier())); + + if( pObj ) + { + ::tools::Rectangle aRect( rRectangle ); + if ( doConstructOrthogonal() ) + ImpForceQuadratic( aRect ); + pObj->SetLogicRect( aRect ); + SetAttributes( pObj.get() ); + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, pObj.get()); + pObj->SetMergedItemSet(aAttr); + } + return pObj; +} + +// #i33136# +bool FuConstructCustomShape::doConstructOrthogonal() const +{ + return SdrObjCustomShape::doConstructOrthogonal(aCustomShape); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconnct.cxx b/sd/source/ui/func/fuconnct.cxx new file mode 100644 index 0000000000..fc95b49077 --- /dev/null +++ b/sd/source/ui/func/fuconnct.cxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuConnectionDlg::FuConnectionDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuConnectionDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuConnectionDlg( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuConnectionDlg::DoExecute( SfxRequest& rReq ) +{ + SfxItemSet aNewAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aNewAttr ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSfxDialog(rReq.GetFrameWeld(), aNewAttr, mpView, RID_SVXPAGE_CONNECTION)); + + if( pDlg->Execute() == RET_OK ) + { + rReq.Done( *pDlg->GetOutputItemSet() ); + pArgs = rReq.GetArgs(); + } + } + if( pArgs ) + mpView->SetAttributes( *pArgs ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconrec.cxx b/sd/source/ui/func/fuconrec.cxx new file mode 100644 index 0000000000..ddd432a6bb --- /dev/null +++ b/sd/source/ui/func/fuconrec.cxx @@ -0,0 +1,1076 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +using namespace com::sun::star; + +namespace sd { + + +FuConstructRectangle::FuConstructRectangle ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuConstruct(pViewSh, pWin, pView, pDoc, rReq) + , mnFillTransparence(0) + , mnLineStyle(SAL_MAX_UINT16) +{ +} + +namespace{ + +/// Checks to see if the request has a parameter of IsSticky:bool=true +/// It means that the selected command/button will stay selected after use +bool isSticky(const SfxRequest& rReq) +{ + const SfxItemSet *pArgs = rReq.GetArgs (); + if (pArgs) + { + const SfxBoolItem* pIsSticky = rReq.GetArg(FN_PARAM_4); + if (pIsSticky && pIsSticky->GetValue()) + return true; + } + + return false; +} + +} + +rtl::Reference FuConstructRectangle::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuConstructRectangle* pFunc; + rtl::Reference xFunc( pFunc = new FuConstructRectangle( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent(bPermanent || isSticky(rReq)); + return xFunc; +} + +void FuConstructRectangle::DoExecute( SfxRequest& rReq ) +{ + FuConstruct::DoExecute( rReq ); + + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msDrawingObjectToolBar); + + const SfxItemSet *pArgs = rReq.GetArgs (); + + if (pArgs) + { + switch (nSlotId) + { + case SID_DRAW_ELLIPSE : + { + const SfxUInt32Item* pCenterX = rReq.GetArg(ID_VAL_CENTER_X); + const SfxUInt32Item* pCenterY = rReq.GetArg(ID_VAL_CENTER_Y); + const SfxUInt32Item* pAxisX = rReq.GetArg(ID_VAL_AXIS_X); + const SfxUInt32Item* pAxisY = rReq.GetArg(ID_VAL_AXIS_Y); + + if (!pCenterX || !pCenterY || !pAxisX || !pAxisY) + break; + + ::tools::Rectangle aNewRectangle (pCenterX->GetValue () - pAxisX->GetValue () / 2, + pCenterY->GetValue () - pAxisY->GetValue () / 2, + pCenterX->GetValue () + pAxisX->GetValue () / 2, + pCenterY->GetValue () + pAxisY->GetValue () / 2); + rtl::Reference pNewCircle = new SdrCircObj( + mpView->getSdrModelFromSdrView(), + SdrCircKind::Full, + aNewRectangle); + SdrPageView *pPV = mpView->GetSdrPageView(); + + mpView->InsertObjectAtView(pNewCircle.get(), *pPV, SdrInsertFlags::SETDEFLAYER | SdrInsertFlags::SETDEFATTR); + } + break; + + case SID_DRAW_RECT : + { + const SfxUInt32Item* pMouseStartX = rReq.GetArg(ID_VAL_MOUSESTART_X); + const SfxUInt32Item* pMouseStartY = rReq.GetArg(ID_VAL_MOUSESTART_Y); + const SfxUInt32Item* pMouseEndX = rReq.GetArg(ID_VAL_MOUSEEND_X); + const SfxUInt32Item* pMouseEndY = rReq.GetArg(ID_VAL_MOUSEEND_Y); + const SfxUInt16Item* pFillTransparence = rReq.GetArg(FN_PARAM_1); + const SfxStringItem* pFillColor = rReq.GetArg(FN_PARAM_2); + const SfxUInt16Item* pLineStyle = rReq.GetArg(FN_PARAM_3); + const SfxStringItem* pShapeName = rReq.GetArg(SID_SHAPE_NAME); + + if (pFillTransparence && pFillTransparence->GetValue() > 0) + { + mnFillTransparence = pFillTransparence->GetValue(); + } + if (pFillColor && !pFillColor->GetValue().isEmpty()) + { + msFillColor = pFillColor->GetValue(); + } + if (pLineStyle) + { + mnLineStyle = pLineStyle->GetValue(); + } + if (pShapeName && !pShapeName->GetValue().isEmpty()) + { + msShapeName = pShapeName->GetValue(); + } + + if (!pMouseStartX || !pMouseStartY || !pMouseEndX || !pMouseEndY) + break; + + ::tools::Rectangle aNewRectangle (pMouseStartX->GetValue (), + pMouseStartY->GetValue (), + pMouseEndX->GetValue (), + pMouseEndY->GetValue ()); + rtl::Reference pNewRect = new SdrRectObj( + mpView->getSdrModelFromSdrView(), + aNewRectangle); + SdrPageView *pPV = mpView->GetSdrPageView(); + + mpView->InsertObjectAtView(pNewRect.get(), *pPV, SdrInsertFlags::SETDEFLAYER | SdrInsertFlags::SETDEFATTR); + } + break; + } + } + + if (nSlotId == SID_TOOL_CONNECTOR || + nSlotId == SID_CONNECTOR_ARROW_START || + nSlotId == SID_CONNECTOR_ARROW_END || + nSlotId == SID_CONNECTOR_ARROWS || + nSlotId == SID_CONNECTOR_CIRCLE_START || + nSlotId == SID_CONNECTOR_CIRCLE_END || + nSlotId == SID_CONNECTOR_CIRCLES || + nSlotId == SID_CONNECTOR_LINE || + nSlotId == SID_CONNECTOR_LINE_ARROW_START || + nSlotId == SID_CONNECTOR_LINE_ARROW_END || + nSlotId == SID_CONNECTOR_LINE_ARROWS || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINE_CIRCLES || + nSlotId == SID_CONNECTOR_CURVE || + nSlotId == SID_CONNECTOR_CURVE_ARROW_START || + nSlotId == SID_CONNECTOR_CURVE_ARROW_END || + nSlotId == SID_CONNECTOR_CURVE_ARROWS || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END || + nSlotId == SID_CONNECTOR_CURVE_CIRCLES || + nSlotId == SID_CONNECTOR_LINES || + nSlotId == SID_CONNECTOR_LINES_ARROW_START || + nSlotId == SID_CONNECTOR_LINES_ARROW_END || + nSlotId == SID_CONNECTOR_LINES_ARROWS || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINES_CIRCLES || + nSlotId == SID_LINE_ARROW_START || + nSlotId == SID_LINE_ARROW_END || + nSlotId == SID_LINE_ARROWS || + nSlotId == SID_LINE_ARROW_CIRCLE || + nSlotId == SID_LINE_CIRCLE_ARROW || + nSlotId == SID_LINE_ARROW_SQUARE || + nSlotId == SID_LINE_SQUARE_ARROW ) + { + mpView->UnmarkAll(); + } +} + +bool FuConstructRectangle::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bReturn = FuConstruct::MouseButtonDown(rMEvt); + + if ( rMEvt.IsLeft() && !mpView->IsAction() ) + { + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + mpWindow->CaptureMouse(); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + + if (mpView->GetCurrentObjIdentifier() == SdrObjKind::Caption) + { + Size aCaptionSize(846, 846); // (4x2)cm + bReturn = mpView->BegCreateCaptionObj(aPnt, aCaptionSize, + nullptr, nDrgLog); + } + else + { + mpView->BegCreateObj(aPnt, nullptr, nDrgLog); + } + + SdrObject* pObj = mpView->GetCreateObj(); + + if (pObj) + { + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, pObj); + SetAttributes(aAttr, pObj); + SetLineEnds(aAttr, *pObj); + pObj->SetMergedItemSet(aAttr); + + if( nSlotId == SID_DRAW_CAPTION_VERTICAL ) + static_cast(pObj)->SetVerticalWriting( true ); + } + } + return bReturn; +} + +bool FuConstructRectangle::MouseButtonUp(const MouseEvent& rMEvt) +{ + if (rMEvt.IsLeft() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + bool bReturn(false); + + if(mpView->IsCreateObj() && rMEvt.IsLeft()) + { + SdrObject* pObj = mpView->GetCreateObj(); + + if(pObj && mpView->EndCreateObj(SdrCreateCmd::ForceEnd)) + { + if(SID_DRAW_MEASURELINE == nSlotId) + { + SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin(); + pObj->SetLayer(rAdmin.GetLayerID(sUNO_LayerName_measurelines)); + } + + // init text position when vertical caption object is created + if( dynamic_cast< const SdrCaptionObj *>( pObj ) != nullptr && SID_DRAW_CAPTION_VERTICAL == nSlotId) + { + // draw text object, needs to be initialized when vertical text is used + SfxItemSet aSet(pObj->GetMergedItemSet()); + + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER)); + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + + // Correct the value of SDRATTR_TEXTDIRECTION to avoid SetItemSet + // calling SetVerticalWriting() again since this item may not yet + // be set at the object and thus may differ from vertical state of + // the object. + aSet.Put(SvxWritingModeItem(css::text::WritingMode_TB_RL, SDRATTR_TEXTDIRECTION)); + pObj->SetMergedItemSet(aSet); + } + + bReturn = true; + } + else + { + //Drag was too small to create object, so insert default object at click pos + Point aClickPos(mpWindow->PixelToLogic(rMEvt.GetPosPixel())); + sal_uInt32 nDefaultObjectSize(1500); + sal_Int32 nCenterOffset(-sal_Int32(nDefaultObjectSize / 2)); + aClickPos.AdjustX(nCenterOffset); + aClickPos.AdjustY(nCenterOffset); + + SdrPageView *pPV = mpView->GetSdrPageView(); + if(mpView->IsSnapEnabled()) + aClickPos = mpView->GetSnapPos(aClickPos, pPV); + + ::tools::Rectangle aNewObjectRectangle(aClickPos, Size(nDefaultObjectSize, nDefaultObjectSize)); + rtl::Reference pObjDefault = CreateDefaultObject(nSlotId, aNewObjectRectangle); + + bReturn = mpView->InsertObjectAtView(pObjDefault.get(), *pPV); + } + } + + bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn; + + if (!bPermanent) + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + return bReturn; +} + +void FuConstructRectangle::Activate() +{ + SdrObjKind aObjKind; + + switch (nSlotId) + { + case SID_LINE_ARROW_START: + case SID_LINE_ARROW_END: + case SID_LINE_ARROWS: + case SID_LINE_ARROW_CIRCLE: + case SID_LINE_CIRCLE_ARROW: + case SID_LINE_ARROW_SQUARE: + case SID_LINE_SQUARE_ARROW: + mpView->SetGlueVisible(); + [[fallthrough]]; + case SID_DRAW_LINE : + case SID_DRAW_XLINE: + aObjKind = SdrObjKind::Line; + break; + + case SID_DRAW_MEASURELINE: + { + aObjKind = SdrObjKind::Measure; + } + break; + + case SID_DRAW_RECT : + case SID_DRAW_RECT_NOFILL : + case SID_DRAW_RECT_ROUND : + case SID_DRAW_RECT_ROUND_NOFILL: + case SID_DRAW_SQUARE : + case SID_DRAW_SQUARE_NOFILL : + case SID_DRAW_SQUARE_ROUND : + case SID_DRAW_SQUARE_ROUND_NOFILL: + { + aObjKind = SdrObjKind::Rectangle; + } + break; + + case SID_DRAW_ELLIPSE : + case SID_DRAW_ELLIPSE_NOFILL: + case SID_DRAW_CIRCLE : + case SID_DRAW_CIRCLE_NOFILL : + { + aObjKind = SdrObjKind::CircleOrEllipse; + } + break; + + case SID_DRAW_CAPTION: + case SID_DRAW_CAPTION_VERTICAL: + { + aObjKind = SdrObjKind::Caption; + } + break; + + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: + { + aObjKind = SdrObjKind::Edge; + mpView->SetGlueVisible(); + } + break; + case SID_INSERT_SIGNATURELINE: + { + aObjKind = SdrObjKind::Graphic; + } + break; + + default: + { + aObjKind = SdrObjKind::Rectangle; + } + break; + } + + mpView->SetCurrentObj(aObjKind); + + FuConstruct::Activate(); +} + +void FuConstructRectangle::Deactivate() +{ + if( nSlotId == SID_TOOL_CONNECTOR || + nSlotId == SID_CONNECTOR_ARROW_START || + nSlotId == SID_CONNECTOR_ARROW_END || + nSlotId == SID_CONNECTOR_ARROWS || + nSlotId == SID_CONNECTOR_CIRCLE_START || + nSlotId == SID_CONNECTOR_CIRCLE_END || + nSlotId == SID_CONNECTOR_CIRCLES || + nSlotId == SID_CONNECTOR_LINE || + nSlotId == SID_CONNECTOR_LINE_ARROW_START || + nSlotId == SID_CONNECTOR_LINE_ARROW_END || + nSlotId == SID_CONNECTOR_LINE_ARROWS || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINE_CIRCLES || + nSlotId == SID_CONNECTOR_CURVE || + nSlotId == SID_CONNECTOR_CURVE_ARROW_START || + nSlotId == SID_CONNECTOR_CURVE_ARROW_END || + nSlotId == SID_CONNECTOR_CURVE_ARROWS || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END || + nSlotId == SID_CONNECTOR_CURVE_CIRCLES || + nSlotId == SID_CONNECTOR_LINES || + nSlotId == SID_CONNECTOR_LINES_ARROW_START || + nSlotId == SID_CONNECTOR_LINES_ARROW_END || + nSlotId == SID_CONNECTOR_LINES_ARROWS || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINES_CIRCLES || + nSlotId == SID_LINE_ARROW_START || + nSlotId == SID_LINE_ARROW_END || + nSlotId == SID_LINE_ARROWS || + nSlotId == SID_LINE_ARROW_CIRCLE || + nSlotId == SID_LINE_CIRCLE_ARROW || + nSlotId == SID_LINE_ARROW_SQUARE || + nSlotId == SID_LINE_SQUARE_ARROW ) + { + mpView->SetGlueVisible( false ); + } + FuConstruct::Deactivate(); + + if (nSlotId != SID_INSERT_SIGNATURELINE) + { + return; + } + + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if (rMarkList.GetMarkCount() < 1) + { + // Just switching pages, no signature rectangle yet. + return; + } + + // Finished drawing a signature rectangle, now set it up. + if (!mpViewShell) + { + return; + } + + uno::Reference xCertificate + = svx::SignatureLineHelper::getSignatureCertificate(mpViewShell->GetObjectShell(), + mpViewShell->GetFrameWeld()); + if (!xCertificate.is()) + { + return; + } + + svx::SignatureLineHelper::setShapeCertificate(mpView, xCertificate); + + // Update infobar to offer "finish signing". + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + if (pFrame && pFrame->HasInfoBarWithID(u"readonly")) + { + pFrame->RemoveInfoBar(u"readonly"); + pFrame->AppendReadOnlyInfobar(); + } +} + +namespace { +/// Returns the color based on the color names listed in core/include/tools/color.hxx +/// Feel free to extend with more color names from color.hxx +Color strToColor(std::u16string_view sColor) +{ + Color aColor = COL_AUTO; + + if (sColor == u"COL_GRAY") + aColor = COL_GRAY; + else if (sColor == u"COL_GRAY3") + aColor = COL_GRAY3; + else if (sColor == u"COL_GRAY7") + aColor = COL_GRAY7; + + return aColor; +} +} + +/** + * set attribute for the object to be created + */ +void FuConstructRectangle::SetAttributes(SfxItemSet& rAttr, SdrObject* pObj) +{ + if (nSlotId == SID_DRAW_RECT_ROUND || + nSlotId == SID_DRAW_RECT_ROUND_NOFILL || + nSlotId == SID_DRAW_SQUARE_ROUND || + nSlotId == SID_DRAW_SQUARE_ROUND_NOFILL) + { + // round corner + rAttr.Put(makeSdrEckenradiusItem(500)); + } + else if (nSlotId == SID_CONNECTOR_LINE || + nSlotId == SID_CONNECTOR_LINE_ARROW_START || + nSlotId == SID_CONNECTOR_LINE_ARROW_END || + nSlotId == SID_CONNECTOR_LINE_ARROWS || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINE_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINE_CIRCLES) + { + // direct connector + rAttr.Put(SdrEdgeKindItem(SdrEdgeKind::OneLine)); + } + else if (nSlotId == SID_CONNECTOR_LINES || + nSlotId == SID_CONNECTOR_LINES_ARROW_START || + nSlotId == SID_CONNECTOR_LINES_ARROW_END || + nSlotId == SID_CONNECTOR_LINES_ARROWS || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_START || + nSlotId == SID_CONNECTOR_LINES_CIRCLE_END || + nSlotId == SID_CONNECTOR_LINES_CIRCLES) + { + // line connector + rAttr.Put(SdrEdgeKindItem(SdrEdgeKind::ThreeLines)); + } + else if (nSlotId == SID_CONNECTOR_CURVE || + nSlotId == SID_CONNECTOR_CURVE_ARROW_START || + nSlotId == SID_CONNECTOR_CURVE_ARROW_END || + nSlotId == SID_CONNECTOR_CURVE_ARROWS || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START || + nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END || + nSlotId == SID_CONNECTOR_CURVE_CIRCLES) + { + // curve connector + rAttr.Put(SdrEdgeKindItem(SdrEdgeKind::Bezier)); + } + else if ( nSlotId == SID_DRAW_CAPTION || nSlotId == SID_DRAW_CAPTION_VERTICAL ) + { + // legend object + Size aSize(pObj->GetLogicRect().GetSize()); + rAttr.Put( makeSdrTextMinFrameHeightItem( aSize.Height() ) ); + rAttr.Put( makeSdrTextMinFrameWidthItem( aSize.Width() ) ); + rAttr.Put( makeSdrTextAutoGrowHeightItem( true ) ); + rAttr.Put( makeSdrTextAutoGrowWidthItem( true ) ); + + // Support full with for vertical caption objects, too + if(SID_DRAW_CAPTION == nSlotId) + rAttr.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) ); + else + rAttr.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_BLOCK ) ); + + rAttr.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) ); + rAttr.Put( makeSdrTextLeftDistItem( 100 ) ); + rAttr.Put( makeSdrTextRightDistItem( 100 ) ); + rAttr.Put( makeSdrTextUpperDistItem( 100 ) ); + rAttr.Put( makeSdrTextLowerDistItem( 100 ) ); + } + else if (nSlotId == SID_DRAW_MEASURELINE) + { + // dimension line + SdPage* pPage = static_cast( mpView->GetSdrPageView()->GetPage() ); + OUString aName(SdResId(STR_POOLSHEET_MEASURE)); + SfxStyleSheet* pSheet( + static_cast< SfxStyleSheet* >( + pPage->getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Para))); + DBG_ASSERT(pSheet, "StyleSheet missing"); + + if (pSheet) + { + pObj->SetStyleSheet(pSheet, false); + } + + SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin(); + pObj->SetLayer(rAdmin.GetLayerID(sUNO_LayerName_measurelines)); + } + else if (nSlotId == SID_DRAW_RECT) + { + if (mnFillTransparence > 0 && mnFillTransparence <= 100) + rAttr.Put(XFillTransparenceItem(mnFillTransparence)); + if (!msFillColor.isEmpty()) + rAttr.Put(XFillColorItem(OUString(), strToColor(msFillColor))); + if (!msShapeName.isEmpty()) + pObj->SetName(msShapeName); + + switch(mnLineStyle) + { + case 0: + rAttr.Put( XLineStyleItem(css::drawing::LineStyle_NONE ) ); + break; + case 1: + rAttr.Put( XLineStyleItem(css::drawing::LineStyle_SOLID ) ); + break; + case 2: + rAttr.Put( XLineStyleItem(css::drawing::LineStyle_DASH ) ); + break; + default: + // Leave it to the defaults + break; + } + } + else if (nSlotId == SID_INSERT_SIGNATURELINE) + { + // Avoid the default solid fill and line, we'll set a graphic instead. + rAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + rAttr.Put(XLineStyleItem(drawing::LineStyle_NONE)); + } +} + +/** + * set line starts and ends for the object to be created + */ +void FuConstructRectangle::SetLineEnds(SfxItemSet& rAttr, SdrObject const & rObj) +{ + if ( !((rObj.GetObjIdentifier() == SdrObjKind::Edge && + nSlotId != SID_TOOL_CONNECTOR && + nSlotId != SID_CONNECTOR_LINE && + nSlotId != SID_CONNECTOR_LINES && + nSlotId != SID_CONNECTOR_CURVE) || + nSlotId == SID_LINE_ARROW_START || + nSlotId == SID_LINE_ARROW_END || + nSlotId == SID_LINE_ARROWS || + nSlotId == SID_LINE_ARROW_CIRCLE || + nSlotId == SID_LINE_CIRCLE_ARROW || + nSlotId == SID_LINE_ARROW_SQUARE || + nSlotId == SID_LINE_SQUARE_ARROW) ) + return; + + // set attributes of line start and ends + SdrModel& rModel(rObj.getSdrModelFromSdrObject()); + + // arrowhead + ::basegfx::B2DPolyPolygon aArrow(ConstructHelper::GetLineEndPoly(RID_SVXSTR_ARROW, rModel)); + if( !aArrow.count() ) + { + ::basegfx::B2DPolygon aNewArrow; + aNewArrow.append(::basegfx::B2DPoint(10.0, 0.0)); + aNewArrow.append(::basegfx::B2DPoint(0.0, 30.0)); + aNewArrow.append(::basegfx::B2DPoint(20.0, 30.0)); + aNewArrow.setClosed(true); + aArrow.append(aNewArrow); + } + + // Circles + ::basegfx::B2DPolyPolygon aCircle(ConstructHelper::GetLineEndPoly(RID_SVXSTR_CIRCLE, rModel)); + if( !aCircle.count() ) + { + ::basegfx::B2DPolygon aNewCircle = ::basegfx::utils::createPolygonFromEllipse(::basegfx::B2DPoint(0.0, 0.0), 250.0, 250.0); + aNewCircle.setClosed(true); + aCircle.append(aNewCircle); + } + + // Square + ::basegfx::B2DPolyPolygon aSquare(ConstructHelper::GetLineEndPoly(RID_SVXSTR_SQUARE, rModel)); + if( !aSquare.count() ) + { + ::basegfx::B2DPolygon aNewSquare; + aNewSquare.append(::basegfx::B2DPoint(0.0, 0.0)); + aNewSquare.append(::basegfx::B2DPoint(10.0, 0.0)); + aNewSquare.append(::basegfx::B2DPoint(10.0, 10.0)); + aNewSquare.append(::basegfx::B2DPoint(0.0, 10.0)); + aNewSquare.setClosed(true); + aSquare.append(aNewSquare); + } + + SfxItemSet aSet( mpDoc->GetPool() ); + mpView->GetAttributes( aSet ); + + // #i3908# Here, the default Line Start/End width for arrow construction is + // set. To have the same value in all situations (construction) in i3908 + // it was decided to change the default to 0.03 cm for all situations. + ::tools::Long nWidth = 300; // (1/100th mm) + + // determine line width and calculate with it the line end width + if( aSet.GetItemState( XATTR_LINEWIDTH ) != SfxItemState::DONTCARE ) + { + ::tools::Long nValue = aSet.Get( XATTR_LINEWIDTH ).GetValue(); + if( nValue > 0 ) + nWidth = nValue * 3; + } + + switch (nSlotId) + { + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_LINE_ARROWS: + { + // connector with arrow ends + rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_ARROW), aArrow)); + rAttr.Put(XLineStartWidthItem(nWidth)); + rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_ARROW), aArrow)); + rAttr.Put(XLineEndWidthItem(nWidth)); + } + break; + + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_LINE_ARROW_START: + case SID_LINE_ARROW_CIRCLE: + case SID_LINE_ARROW_SQUARE: + { + // connector with arrow start + rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_ARROW), aArrow)); + rAttr.Put(XLineStartWidthItem(nWidth)); + } + break; + + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_LINE_ARROW_END: + case SID_LINE_CIRCLE_ARROW: + case SID_LINE_SQUARE_ARROW: + { + // connector with arrow end + rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_ARROW), aArrow)); + rAttr.Put(XLineEndWidthItem(nWidth)); + } + break; + + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_LINES_CIRCLES: + case SID_CONNECTOR_CURVE_CIRCLES: + { + // connector with circle ends + rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle)); + rAttr.Put(XLineStartWidthItem(nWidth)); + rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle)); + rAttr.Put(XLineEndWidthItem(nWidth)); + } + break; + + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_START: + { + // connector with circle start + rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle)); + rAttr.Put(XLineStartWidthItem(nWidth)); + } + break; + + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLE_END: + { + // connector with circle ends + rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle)); + rAttr.Put(XLineEndWidthItem(nWidth)); + } + break; + } + + // and again, for the still missing ends + switch (nSlotId) + { + case SID_LINE_ARROW_CIRCLE: + { + // circle end + rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle)); + rAttr.Put(XLineEndWidthItem(nWidth)); + } + break; + + case SID_LINE_CIRCLE_ARROW: + { + // circle start + rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle)); + rAttr.Put(XLineStartWidthItem(nWidth)); + } + break; + + case SID_LINE_ARROW_SQUARE: + { + // square end + rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_SQUARE), aSquare)); + rAttr.Put(XLineEndWidthItem(nWidth)); + } + break; + + case SID_LINE_SQUARE_ARROW: + { + // square start + rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_SQUARE), aSquare)); + rAttr.Put(XLineStartWidthItem(nWidth)); + } + break; + } +} + +rtl::Reference FuConstructRectangle::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) +{ + DBG_ASSERT( (nID != SID_DRAW_FONTWORK) && (nID != SID_DRAW_FONTWORK_VERTICAL ), "FuConstRectangle::CreateDefaultObject can not create Fontwork shapes!" ); + + // case SID_DRAW_LINE: + // case SID_DRAW_XLINE: + // case SID_DRAW_MEASURELINE: + // case SID_LINE_ARROW_START: + // case SID_LINE_ARROW_END: + // case SID_LINE_ARROWS: + // case SID_LINE_ARROW_CIRCLE: + // case SID_LINE_CIRCLE_ARROW: + // case SID_LINE_ARROW_SQUARE: + // case SID_LINE_SQUARE_ARROW: + // case SID_DRAW_RECT: + // case SID_DRAW_RECT_NOFILL: + // case SID_DRAW_RECT_ROUND: + // case SID_DRAW_RECT_ROUND_NOFILL: + // case SID_DRAW_SQUARE: + // case SID_DRAW_SQUARE_NOFILL: + // case SID_DRAW_SQUARE_ROUND: + // case SID_DRAW_SQUARE_ROUND_NOFILL: + // case SID_DRAW_ELLIPSE: + // case SID_DRAW_ELLIPSE_NOFILL: + // case SID_DRAW_CIRCLE: + // case SID_DRAW_CIRCLE_NOFILL: + // case SID_DRAW_CAPTION: + // case SID_DRAW_CAPTION_VERTICAL: + // case SID_TOOL_CONNECTOR: + // case SID_CONNECTOR_ARROW_START: + // case SID_CONNECTOR_ARROW_END: + // case SID_CONNECTOR_ARROWS: + // case SID_CONNECTOR_CIRCLE_START: + // case SID_CONNECTOR_CIRCLE_END: + // case SID_CONNECTOR_CIRCLES: + // case SID_CONNECTOR_LINE: + // case SID_CONNECTOR_LINE_ARROW_START: + // case SID_CONNECTOR_LINE_ARROW_END: + // case SID_CONNECTOR_LINE_ARROWS: + // case SID_CONNECTOR_LINE_CIRCLE_START: + // case SID_CONNECTOR_LINE_CIRCLE_END: + // case SID_CONNECTOR_LINE_CIRCLES: + // case SID_CONNECTOR_CURVE: + // case SID_CONNECTOR_CURVE_ARROW_START: + // case SID_CONNECTOR_CURVE_ARROW_END: + // case SID_CONNECTOR_CURVE_ARROWS: + // case SID_CONNECTOR_CURVE_CIRCLE_START: + // case SID_CONNECTOR_CURVE_CIRCLE_END: + // case SID_CONNECTOR_CURVE_CIRCLES: + // case SID_CONNECTOR_LINES: + // case SID_CONNECTOR_LINES_ARROW_START: + // case SID_CONNECTOR_LINES_ARROW_END: + // case SID_CONNECTOR_LINES_ARROWS: + // case SID_CONNECTOR_LINES_CIRCLE_START: + // case SID_CONNECTOR_LINES_CIRCLE_END: + // case SID_CONNECTOR_LINES_CIRCLES: + + rtl::Reference pObj(SdrObjFactory::MakeNewObject( + mpView->getSdrModelFromSdrView(), + mpView->GetCurrentObjInventor(), + mpView->GetCurrentObjIdentifier())); + + if(pObj) + { + ::tools::Rectangle aRect(rRectangle); + + if(SID_DRAW_SQUARE == nID || + SID_DRAW_SQUARE_NOFILL == nID || + SID_DRAW_SQUARE_ROUND == nID || + SID_DRAW_SQUARE_ROUND_NOFILL == nID || + SID_DRAW_CIRCLE == nID || + SID_DRAW_CIRCLE_NOFILL == nID) + { + // force quadratic + ImpForceQuadratic(aRect); + } + + Point aStart = aRect.TopLeft(); + Point aEnd = aRect.BottomRight(); + + switch(nID) + { + case SID_DRAW_LINE: + case SID_DRAW_XLINE: + case SID_LINE_ARROW_START: + case SID_LINE_ARROW_END: + case SID_LINE_ARROWS: + case SID_LINE_ARROW_CIRCLE: + case SID_LINE_CIRCLE_ARROW: + case SID_LINE_ARROW_SQUARE: + case SID_LINE_SQUARE_ARROW: + { + if( auto pPathObj = dynamic_cast( pObj.get() ) ) + { + sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2); + + ::basegfx::B2DPolygon aB2DPolygon; + aB2DPolygon.append(::basegfx::B2DPoint(aStart.X(), nYMiddle)); + aB2DPolygon.append(::basegfx::B2DPoint(aEnd.X(), nYMiddle)); + pPathObj->SetPathPoly(::basegfx::B2DPolyPolygon(aB2DPolygon)); + } + else + { + OSL_FAIL("Object is NO line object"); + } + + break; + } + + case SID_DRAW_MEASURELINE: + { + if( auto pMeasureObj = dynamic_cast< SdrMeasureObj *>( pObj.get() ) ) + { + sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2); + pMeasureObj->SetPoint(Point(aStart.X(), nYMiddle), 0); + pMeasureObj->SetPoint(Point(aEnd.X(), nYMiddle), 1); + } + else + { + OSL_FAIL("Object is NO measure object"); + } + + break; + } + + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: + { + if( auto pEdgeObj = dynamic_cast< SdrEdgeObj *>( pObj.get() ) ) + { + pEdgeObj->SetTailPoint(false, aStart); + pEdgeObj->SetTailPoint(true, aEnd); + } + else + { + OSL_FAIL("Object is NO connector object"); + } + + break; + } + case SID_DRAW_CAPTION: + case SID_DRAW_CAPTION_VERTICAL: + { + if( auto pCaptionObj = dynamic_cast< SdrCaptionObj *>( pObj.get() ) ) + { + bool bIsVertical(SID_DRAW_CAPTION_VERTICAL == nID); + + pCaptionObj->SetVerticalWriting(bIsVertical); + + if(bIsVertical) + { + SfxItemSet aSet(pObj->GetMergedItemSet()); + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER)); + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + pObj->SetMergedItemSet(aSet); + } + + // The default text is not inserted anymore. + + pCaptionObj->SetLogicRect(aRect); + pCaptionObj->SetTailPos( + aRect.TopLeft() - Point(aRect.GetWidth() / 2, aRect.GetHeight() / 2)); + } + else + { + OSL_FAIL("Object is NO caption object"); + } + + break; + } + + default: + { + pObj->SetLogicRect(aRect); + + break; + } + } + + SfxItemSet aAttr(mpDoc->GetPool()); + SetStyleSheet(aAttr, pObj.get()); + SetAttributes(aAttr, pObj.get()); + SetLineEnds(aAttr, *pObj); + pObj->SetMergedItemSet(aAttr); + } + + return pObj; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconstr.cxx b/sd/source/ui/func/fuconstr.cxx new file mode 100644 index 0000000000..36c1f3428a --- /dev/null +++ b/sd/source/ui/func/fuconstr.cxx @@ -0,0 +1,392 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + + +FuConstruct::FuConstruct ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuDraw(pViewSh, pWin, pView, pDoc, rReq), + bSelectionChanged(false) +{ +} + +bool FuConstruct::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bReturn = FuDraw::MouseButtonDown(rMEvt); + + bMBDown = true; + bSelectionChanged = false; + + if ( mpView->IsAction() ) + { + return true; + } + + bFirstMouseMove = true; + aDragTimer.Start(); + + aMDPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); + sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width()); + + if (rMEvt.IsLeft() && mpView->IsExtendedMouseEventDispatcherEnabled()) + { + mpWindow->CaptureMouse(); + + SdrHdl* pHdl = mpView->PickHandle(aMDPos); + + if ( pHdl != nullptr || mpView->IsMarkedHit(aMDPos, nHitLog) ) + { + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog); + bReturn = true; + } + else if ( mpView->AreObjectsMarked() ) + { + mpView->UnmarkAll(); + bReturn = true; + } + } + + return bReturn; +} + +bool FuConstruct::MouseMove(const MouseEvent& rMEvt) +{ + FuDraw::MouseMove(rMEvt); + + if (aDragTimer.IsActive() ) + { + if( bFirstMouseMove ) + bFirstMouseMove = false; + else + aDragTimer.Stop(); + } + + Point aPix(rMEvt.GetPosPixel()); + Point aPnt( mpWindow->PixelToLogic(aPix) ); + + if ( mpView->IsAction() ) + { + ForceScroll(aPix); + mpView->MovAction(aPnt); + } + + return true; +} + +bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt) +{ + bool bReturn = true; + + if (aDragTimer.IsActive() ) + { + aDragTimer.Stop(); + bIsInDragMode = false; + } + + FuDraw::MouseButtonUp(rMEvt); + + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + if ( mpView && mpView->IsDragObj() ) + { + FrameView* pFrameView = mpViewShell->GetFrameView(); + bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (bDragWithCopy) + { + bDragWithCopy = !mpView->IsPresObjSelected(false); + } + + mpView->SetDragWithCopy(bDragWithCopy); + mpView->EndDragObj( mpView->IsDragWithCopy() ); + } + else if ( mpView && mpView->IsMarkObj() ) + { + mpView->EndMarkObj(); + } + else + { + bReturn = false; + } + + if ( mpView && !mpView->IsAction() ) + { + mpWindow->ReleaseMouse(); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + + if ( !mpView->AreObjectsMarked() ) + { + SdrPageView* pPV; + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + + SdrObject* pObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV); + if (!pObj) + { + mpView->MarkObj(aPnt, nHitLog); + } + + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + else if (rMEvt.IsLeft() && !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && + !bSelectionChanged && + std::abs(aPnt.X() - aMDPos.X()) < nDrgLog && + std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) + { + // toggle between selection and rotation + SdrObject* pSingleObj = nullptr; + + if (mpView->GetMarkedObjectList().GetMarkCount()==1) + { + pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + } + + const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); + if (!bTiledRendering && (mpView->GetDragMode() == SdrDragMode::Move && mpView->IsRotateAllowed() && + (mpViewShell->GetFrameView()->IsClickChangeRotation() || + (pSingleObj && pSingleObj->GetObjInventor()==SdrInventor::E3d)))) + { + mpView->SetDragMode(SdrDragMode::Rotate); + } + else + { + mpView->SetDragMode(SdrDragMode::Move); + } + } + } + + sal_uInt16 nClicks = rMEvt.GetClicks(); + + if (nClicks == 2 && rMEvt.IsLeft() && bMBDown && + !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift() ) + { + DoubleClick(rMEvt); + } + bMBDown = false; + + return bReturn; +} + +void FuConstruct::Activate() +{ + mpView->SetEditMode(SdrViewEditMode::Create); + FuDraw::Activate(); +} + +void FuConstruct::Deactivate() +{ + FuDraw::Deactivate(); + mpView->SetEditMode(SdrViewEditMode::Edit); +} + +bool FuConstruct::IsIgnoreUnexpectedMouseButtonUp() +{ + // tdf#153446 if there is a MouseButtonUp without a previous MouseButtonDown event, + // the MouseButtonDown was probably swallowed by a gain-focus action, + // and then this MouseButtonUp should be ignored + + if (bMBDown || bIsInDragMode) + return false; + + // Don't ignore if there are pending mouse-initiated tasks to complete. + return !mpView->IsDragObj() && !mpWindow->IsMouseCaptured() && !mpView->IsAction(); +} + +/** + * set style sheet for the object to be created + */ +void FuConstruct::SetStyleSheet(SfxItemSet& rAttr, SdrObject* pObj) +{ + bool bUseFillStyle, bUseNoFillStyle; + bUseFillStyle = bUseNoFillStyle = false; + + switch( nSlotId ) + { + case SID_DRAW_RECT: + case SID_DRAW_RECT_ROUND: + case SID_DRAW_SQUARE: + case SID_DRAW_SQUARE_ROUND: + case SID_DRAW_ELLIPSE: + case SID_DRAW_PIE: + case SID_DRAW_ELLIPSECUT: + case SID_DRAW_CIRCLE: + case SID_DRAW_CIRCLEPIE: + case SID_DRAW_CIRCLECUT: + case SID_DRAW_POLYGON: + case SID_DRAW_XPOLYGON: + case SID_DRAW_FREELINE: + case SID_DRAW_BEZIER_FILL: + { + bUseFillStyle = true; + break; + } + case SID_DRAW_RECT_NOFILL: + case SID_DRAW_RECT_ROUND_NOFILL: + case SID_DRAW_SQUARE_NOFILL: + case SID_DRAW_SQUARE_ROUND_NOFILL: + case SID_DRAW_ELLIPSE_NOFILL: + case SID_DRAW_PIE_NOFILL: + case SID_DRAW_ELLIPSECUT_NOFILL: + case SID_DRAW_CIRCLE_NOFILL: + case SID_DRAW_CIRCLEPIE_NOFILL: + case SID_DRAW_CIRCLECUT_NOFILL: + case SID_DRAW_POLYGON_NOFILL: + case SID_DRAW_XPOLYGON_NOFILL: + case SID_DRAW_FREELINE_NOFILL: + case SID_DRAW_LINE: + case SID_DRAW_XLINE: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: + case SID_DRAW_BEZIER_NOFILL: + case SID_LINE_ARROW_END: + { + bUseNoFillStyle = true; + break; + } + } + SetStyleSheet( rAttr, pObj, bUseFillStyle, bUseNoFillStyle ); +} + +void FuConstruct::SetStyleSheet( SfxItemSet& rAttr, SdrObject* pObj, + const bool bForceFillStyle, const bool bForceNoFillStyle ) +{ + SdPage* pPage = static_cast(mpView->GetSdrPageView()->GetPage()); + if ( pPage->IsMasterPage() && pPage->GetPageKind() == PageKind::Standard && + mpDoc->GetDocumentType() == DocumentType::Impress ) + { + /********************************************** + * Objects was created on the slide master page + ***********************************************/ + OUString aName( pPage->GetLayoutName() ); + sal_Int32 n = aName.indexOf(SD_LT_SEPARATOR) + SD_LT_SEPARATOR.getLength(); + aName = OUString::Concat(aName.subView(0, n)) + STR_LAYOUT_BACKGROUNDOBJECTS; + SfxStyleSheet* pSheet( + static_cast< SfxStyleSheet* >( + pPage->getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Page))); + DBG_ASSERT(pSheet, "StyleSheet missing"); + if (pSheet) + { + // applying style sheet for background objects + pObj->SetStyleSheet(pSheet, false); + SfxItemSet& rSet = pSheet->GetItemSet(); + const XFillStyleItem& rFillStyle = rSet.Get(XATTR_FILLSTYLE); + if ( bForceFillStyle ) + { + if (rFillStyle.GetValue() == drawing::FillStyle_NONE) + rAttr.Put(XFillStyleItem(drawing::FillStyle_SOLID)); + } + else if ( bForceNoFillStyle ) + { + if (rFillStyle.GetValue() != drawing::FillStyle_NONE) + rAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + } + } + } + else + { + /*********************************** + * object was created on normal page + ************************************/ + if ( bForceNoFillStyle ) + { + OUString aName(SdResId(STR_POOLSHEET_OBJWITHOUTFILL)); + SfxStyleSheet* pSheet( + static_cast< SfxStyleSheet* >( + pPage->getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Para))); + DBG_ASSERT(pSheet, "Stylesheet missing"); + if (pSheet) + { + pObj->SetStyleSheet(pSheet, false); + SfxItemSet aAttr(mpView->GetDefaultAttr()); + aAttr.Put(pSheet->GetItemSet().Get(XATTR_FILLSTYLE)); + pObj->SetMergedItemSet(aAttr); + } + else + { + SfxItemSet aAttr(mpView->GetDefaultAttr()); + rAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + pObj->SetMergedItemSet(aAttr); + } + } + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuconuno.cxx b/sd/source/ui/func/fuconuno.cxx new file mode 100644 index 0000000000..6086d62a0e --- /dev/null +++ b/sd/source/ui/func/fuconuno.cxx @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +namespace sd { + + +FuConstructUnoControl::FuConstructUnoControl ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuConstruct(pViewSh, pWin, pView, pDoc, rReq) + , nInventor(SdrInventor::Unknown) + , nIdentifier(SdrObjKind::NONE) +{ +} + +rtl::Reference FuConstructUnoControl::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuConstructUnoControl* pFunc; + rtl::Reference xFunc( pFunc = new FuConstructUnoControl( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent(bPermanent); + return xFunc; +} + +void FuConstructUnoControl::DoExecute( SfxRequest& rReq ) +{ + FuConstruct::DoExecute( rReq ); + + const SfxUInt32Item* pInventorItem = rReq.GetArg(SID_FM_CONTROL_INVENTOR); + const SfxUInt16Item* pIdentifierItem = rReq.GetArg(SID_FM_CONTROL_IDENTIFIER); + if( pInventorItem ) + nInventor = static_cast(pInventorItem->GetValue()); + if( pIdentifierItem ) + nIdentifier = static_cast(pIdentifierItem->GetValue()); + + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msDrawingObjectToolBar); +} + +bool FuConstructUnoControl::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bReturn = FuConstruct::MouseButtonDown(rMEvt); + + if ( rMEvt.IsLeft() && !mpView->IsAction() ) + { + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + mpWindow->CaptureMouse(); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpView->BegCreateObj(aPnt, nullptr, nDrgLog); + bReturn = true; + } + return bReturn; +} + +bool FuConstructUnoControl::MouseButtonUp(const MouseEvent& rMEvt) +{ + if (rMEvt.IsLeft() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + bool bReturn = false; + + if ( mpView->IsCreateObj() && rMEvt.IsLeft() ) + { + mpView->EndCreateObj(SdrCreateCmd::ForceEnd); + bReturn = true; + } + + bReturn = (FuConstruct::MouseButtonUp(rMEvt) || bReturn); + + if (!bPermanent) + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + return bReturn; +} + +void FuConstructUnoControl::Activate() +{ + mpView->SetCurrentObj( nIdentifier, nInventor ); + + aNewPointer = PointerStyle::DrawRect; + aOldPointer = mpWindow->GetPointer(); + mpWindow->SetPointer( aNewPointer ); + + aOldLayer = mpView->GetActiveLayer(); + mpView->SetActiveLayer(sUNO_LayerName_controls); + + FuConstruct::Activate(); +} + +void FuConstructUnoControl::Deactivate() +{ + FuConstruct::Deactivate(); + mpView->SetActiveLayer( aOldLayer ); + mpWindow->SetPointer( aOldPointer ); +} + +rtl::Reference FuConstructUnoControl::CreateDefaultObject(const sal_uInt16, const ::tools::Rectangle& rRectangle) +{ + // case SID_FM_CREATE_CONTROL: + + rtl::Reference pObj(SdrObjFactory::MakeNewObject( + mpView->getSdrModelFromSdrView(), + mpView->GetCurrentObjInventor(), + mpView->GetCurrentObjIdentifier())); + + if(pObj) + { + pObj->SetLogicRect(rRectangle); + } + + return pObj; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fucopy.cxx b/sd/source/ui/func/fucopy.cxx new file mode 100644 index 0000000000..99e5f7b87a --- /dev/null +++ b/sd/source/ui/func/fucopy.cxx @@ -0,0 +1,288 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + + +FuCopy::FuCopy ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuCopy::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuCopy( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuCopy::DoExecute( SfxRequest& rReq ) +{ + if( !mpView->AreObjectsMarked() ) + return; + + // Undo + OUString aString = mpView->GetDescriptionOfMarkedObjects() + + " " + SdResId( STR_UNDO_COPYOBJECTS ); + mpView->BegUndo( aString ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + { + SfxItemSetFixed aSet( mpViewShell->GetPool() ); + + // indicate color attribute + SfxItemSet aAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aAttr ); + + if( const XFillStyleItem* pFillStyleItem = aAttr.GetItemIfSet( XATTR_FILLSTYLE ) ) + { + drawing::FillStyle eStyle = pFillStyleItem->GetValue(); + + const XFillColorItem* pFillColorItem; + if( eStyle == drawing::FillStyle_SOLID && + (pFillColorItem = aAttr.GetItemIfSet( XATTR_FILLCOLOR )) ) + { + XColorItem aXColorItem( ATTR_COPY_START_COLOR, pFillColorItem->GetName(), + pFillColorItem->GetColorValue() ); + aSet.Put( aXColorItem ); + + } + } + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateCopyDlg(mpViewShell->GetFrameWeld(), aSet, mpView )); + + sal_uInt16 nResult = pDlg->Execute(); + + switch( nResult ) + { + case RET_OK: + pDlg->GetAttr( aSet ); + rReq.Done( aSet ); + pArgs = rReq.GetArgs(); + break; + + default: + { + pDlg.disposeAndClear(); + mpView->EndUndo(); + return; // Cancel + } + } + } + + ::tools::Rectangle aRect; + sal_Int32 lWidth = 0, lHeight = 0, lSizeX = 0, lSizeY = 0; + Degree100 lAngle(0); + sal_uInt16 nNumber = 0; + Color aStartColor, aEndColor; + bool bColor = false; + + if (pArgs) + { + // Count + if( const SfxUInt16Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_NUMBER ) ) + nNumber = pPoolItem->GetValue(); + + // translation + if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_MOVE_X ) ) + lSizeX = pPoolItem->GetValue(); + if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_MOVE_Y ) ) + lSizeY = pPoolItem->GetValue(); + if( const SdrAngleItem* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_ANGLE ) ) + lAngle = pPoolItem->GetValue(); + + // scale + if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_WIDTH ) ) + lWidth = pPoolItem->GetValue(); + if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_HEIGHT ) ) + lHeight = pPoolItem->GetValue(); + + // start/end color + if( const XColorItem* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_START_COLOR ) ) + { + aStartColor = pPoolItem->GetColorValue(); + bColor = true; + } + if( const XColorItem* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_END_COLOR ) ) + { + aEndColor = pPoolItem->GetColorValue(); + if( aStartColor == aEndColor ) + bColor = false; + } + } + + // remove handles + //HMHmpView->HideMarkHdl(); + + std::unique_ptr pProgress; + bool bWaiting = false; + + if( nNumber > 1 ) + { + OUString aStr = SdResId( STR_OBJECTS ) + + " " + SdResId( STR_UNDO_COPYOBJECTS ); + + pProgress.reset(new SfxProgress( mpDocSh, aStr, nNumber )); + mpDocSh->SetWaitCursor( true ); + bWaiting = true; + } + + const SdrMarkList aMarkList( mpView->GetMarkedObjectList() ); + const size_t nMarkCount = aMarkList.GetMarkCount(); + SdrObject* pObj = nullptr; + + // calculate number of possible copies + aRect = mpView->GetAllMarkedRect(); + + if( lWidth < 0 ) + { + ::tools::Long nTmp = ( aRect.Right() - aRect.Left() ) / -lWidth; + nNumber = static_cast(std::min( nTmp, static_cast<::tools::Long>(nNumber) )); + } + + if( lHeight < 0 ) + { + ::tools::Long nTmp = ( aRect.Bottom() - aRect.Top() ) / -lHeight; + nNumber = static_cast(std::min( nTmp, static_cast<::tools::Long>(nNumber) )); + } + + for( sal_uInt16 i = 1; i <= nNumber; i++ ) + { + if( pProgress ) + pProgress->SetState( i ); + + aRect = mpView->GetAllMarkedRect(); + + if( ( 1 == i ) && bColor ) + { + SfxItemSetFixed aNewSet( mpViewShell->GetPool() ); + aNewSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) ); + aNewSet.Put( XFillColorItem( OUString(), aStartColor ) ); + mpView->SetAttributes( aNewSet ); + } + + // make a copy of selected objects + mpView->CopyMarked(); + + // get newly selected objects + SdrMarkList aCopyMarkList( mpView->GetMarkedObjectList() ); + const size_t nCopyMarkCount = aMarkList.GetMarkCount(); + + // set protection flags at marked copies to null + for( size_t j = 0; j < nCopyMarkCount; ++j ) + { + pObj = aCopyMarkList.GetMark( j )->GetMarkedSdrObj(); + + if( pObj ) + { + pObj->SetMoveProtect( false ); + pObj->SetResizeProtect( false ); + } + } + + Fraction aWidth( aRect.Right() - aRect.Left() + lWidth, aRect.Right() - aRect.Left() ); + Fraction aHeight( aRect.Bottom() - aRect.Top() + lHeight, aRect.Bottom() - aRect.Top() ); + + if( mpView->IsResizeAllowed() ) + mpView->ResizeAllMarked( aRect.TopLeft(), aWidth, aHeight ); + + if( mpView->IsRotateAllowed() ) + mpView->RotateAllMarked( aRect.Center(), lAngle ); + + if( mpView->IsMoveAllowed() ) + mpView->MoveAllMarked( Size( lSizeX, lSizeY ) ); + + // set protection flags at marked copies to original values + if( nMarkCount == nCopyMarkCount ) + { + for( size_t j = 0; j < nMarkCount; ++j ) + { + SdrObject* pSrcObj = aMarkList.GetMark( j )->GetMarkedSdrObj(); + SdrObject* pDstObj = aCopyMarkList.GetMark( j )->GetMarkedSdrObj(); + + if( pSrcObj && pDstObj && + ( pSrcObj->GetObjInventor() == pDstObj->GetObjInventor() ) && + ( pSrcObj->GetObjIdentifier() == pDstObj->GetObjIdentifier() ) ) + { + pDstObj->SetMoveProtect( pSrcObj->IsMoveProtect() ); + pDstObj->SetResizeProtect( pSrcObj->IsResizeProtect() ); + } + } + } + + if( bColor ) + { + // probably room for optimizations, but may can lead to rounding errors + sal_uInt8 nRed = aStartColor.GetRed() + static_cast( ( static_cast<::tools::Long>(aEndColor.GetRed()) - static_cast<::tools::Long>(aStartColor.GetRed()) ) * static_cast<::tools::Long>(i) / static_cast<::tools::Long>(nNumber) ); + sal_uInt8 nGreen = aStartColor.GetGreen() + static_cast( ( static_cast<::tools::Long>(aEndColor.GetGreen()) - static_cast<::tools::Long>(aStartColor.GetGreen()) ) * static_cast<::tools::Long>(i) / static_cast<::tools::Long>(nNumber) ); + sal_uInt8 nBlue = aStartColor.GetBlue() + static_cast( ( static_cast<::tools::Long>(aEndColor.GetBlue()) - static_cast<::tools::Long>(aStartColor.GetBlue()) ) * static_cast<::tools::Long>(i) / static_cast<::tools::Long>(nNumber) ); + Color aNewColor( nRed, nGreen, nBlue ); + SfxItemSetFixed aNewSet( mpViewShell->GetPool() ); + aNewSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) ); + aNewSet.Put( XFillColorItem( OUString(), aNewColor ) ); + mpView->SetAttributes( aNewSet ); + } + } + + pProgress.reset(); + + if ( bWaiting ) + mpDocSh->SetWaitCursor( false ); + + // show handles + mpView->AdjustMarkHdl(); //HMH sal_True ); + //HMHpView->ShowMarkHdl(); + + mpView->EndUndo(); +} + +} // end of namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fucushow.cxx b/sd/source/ui/func/fucushow.cxx new file mode 100644 index 0000000000..eb3b122110 --- /dev/null +++ b/sd/source/ui/func/fucushow.cxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace sd { + + +FuCustomShowDlg::FuCustomShowDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor( pViewSh, pWin, pView, pDoc, rReq ) +{ +} + +rtl::Reference FuCustomShowDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuCustomShowDlg( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuCustomShowDlg::DoExecute( SfxRequest& ) +{ + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = mpViewShell->GetActiveWindow(); + ScopedVclPtr pDlg( pFact->CreateSdCustomShowDlg(pWin ? pWin->GetFrameWeld() : nullptr, *mpDoc) ); + sal_uInt16 nRet = pDlg->Execute(); + mpDoc->SetChanged(); + sd::PresentationSettings& rSettings = mpDoc->getPresentationSettings(); + + if( nRet == RET_YES ) + { + // If the custom show is not set by default + if (!rSettings.mbCustomShow) + { + rSettings.mbStartCustomShow = true; + rSettings.mbCustomShow = pDlg->IsCustomShow(); + } + + mpViewShell->SetStartShowWithDialog(true); + + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } + if (nRet == RET_OK) + { + if (mpDoc->GetCustomShowList()) + { + if (!pDlg->IsCustomShow()) + { + rSettings.mbCustomShow = false; + rSettings.mbAll = true; + } + } + } + pDlg.disposeAndClear(); +} + +} // end of namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fudraw.cxx b/sd/source/ui/func/fudraw.cxx new file mode 100644 index 0000000000..fca4f65fa5 --- /dev/null +++ b/sd/source/ui/func/fudraw.cxx @@ -0,0 +1,820 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace sd { + + +/** + * Base-class for all drawmodul-specific functions + */ +FuDraw::FuDraw(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) + , aNewPointer(PointerStyle::Arrow) + , aOldPointer(PointerStyle::Arrow) + , bMBDown(false) + , bDragHelpLine(false) + , nHelpLine(0) + , bPermanent(false) +{ +} + +FuDraw::~FuDraw() +{ + mpView->BrkAction(); +} + + +/** + * Code shared by MouseButtonDown and MouseMove + */ +void FuDraw::DoModifiers(const MouseEvent& rMEvt, bool bSnapModPressed) +{ + FrameView* pFrameView = mpViewShell->GetFrameView(); + bool bGridSnap = pFrameView->IsGridSnap(); + bGridSnap = (bSnapModPressed != bGridSnap); + + if (mpView->IsGridSnap() != bGridSnap) + mpView->SetGridSnap(bGridSnap); + + bool bBordSnap = pFrameView->IsBordSnap(); + bBordSnap = (bSnapModPressed != bBordSnap); + + if (mpView->IsBordSnap() != bBordSnap) + mpView->SetBordSnap(bBordSnap); + + bool bHlplSnap = pFrameView->IsHlplSnap(); + bHlplSnap = (bSnapModPressed != bHlplSnap); + + if (mpView->IsHlplSnap() != bHlplSnap) + mpView->SetHlplSnap(bHlplSnap); + + bool bOFrmSnap = pFrameView->IsOFrmSnap(); + bOFrmSnap = (bSnapModPressed != bOFrmSnap); + + if (mpView->IsOFrmSnap() != bOFrmSnap) + mpView->SetOFrmSnap(bOFrmSnap); + + bool bOPntSnap = pFrameView->IsOPntSnap(); + bOPntSnap = (bSnapModPressed != bOPntSnap); + + if (mpView->IsOPntSnap() != bOPntSnap) + mpView->SetOPntSnap(bOPntSnap); + + bool bOConSnap = pFrameView->IsOConSnap(); + bOConSnap = (bSnapModPressed != bOConSnap); + + if (mpView->IsOConSnap() != bOConSnap) + mpView->SetOConSnap(bOConSnap); + + bool bAngleSnap = rMEvt.IsShift() == !pFrameView->IsAngleSnapEnabled(); + + if (mpView->IsAngleSnapEnabled() != bAngleSnap) + mpView->SetAngleSnapEnabled(bAngleSnap); + + bool bCenter = rMEvt.IsMod2(); + + if ( mpView->IsCreate1stPointAsCenter() != bCenter || + mpView->IsResizeAtCenter() != bCenter ) + { + mpView->SetCreate1stPointAsCenter(bCenter); + mpView->SetResizeAtCenter(bCenter); + } +} + + +bool FuDraw::MouseButtonDown(const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + bool bReturn = false; + bDragHelpLine = false; + aMDPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); + + if ( rMEvt.IsLeft() ) + { + FrameView* pFrameView = mpViewShell->GetFrameView(); + + bool bOrtho = false; + + bool bRestricted = true; + + if (mpView->IsDragObj()) + { + // object is dragged (move, resize,...) + const SdrHdl* pHdl = mpView->GetDragStat().GetHdl(); + + if (!pHdl || (!pHdl->IsCornerHdl() && !pHdl->IsVertexHdl())) + { + // Move + bRestricted = false; + } + } + + // #i33136# + if(bRestricted && doConstructOrthogonal()) + { + // Restrict movement: + // rectangle->square, ellipse->circle, etc. + bOrtho = !rMEvt.IsShift(); + } + else + { + bOrtho = rMEvt.IsShift() != pFrameView->IsOrtho(); + } + if (!mpView->IsSnapEnabled()) + mpView->SetSnapEnabled(true); + + bool bSnapModPressed = rMEvt.IsMod1(); + if (mpView->IsOrtho() != bOrtho) + mpView->SetOrtho(bOrtho); + + DoModifiers(rMEvt, bSnapModPressed); + + SdrPageView* pPV = nullptr; + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + + // look only for HelpLines when they are visible (!) + bool bHelpLine(false); + if(mpView->IsHlplVisible()) + bHelpLine = mpView->PickHelpLine(aMDPos, nHitLog, *mpWindow->GetOutDev(), nHelpLine, pPV); + bool bHitHdl = (mpView->PickHandle(aMDPos) != nullptr); + + if ( bHelpLine + && !mpView->IsCreateObj() + && ((mpView->GetEditMode() == SdrViewEditMode::Edit && !bHitHdl) || (rMEvt.IsShift() && bSnapModPressed)) ) + { + mpWindow->CaptureMouse(); + mpView->BegDragHelpLine(nHelpLine, pPV); + bDragHelpLine = mpView->IsDragHelpLine(); + bReturn = true; + } + } + ForcePointer(&rMEvt); + + return bReturn; +} + +bool FuDraw::MouseMove(const MouseEvent& rMEvt) +{ + FrameView* pFrameView = mpViewShell->GetFrameView(); + Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); + + bool bOrtho = false; + bool bRestricted = true; + + if (mpView->IsDragObj()) + { + // object is dragged (move, resize, ...) + const SdrHdl* pHdl = mpView->GetDragStat().GetHdl(); + + if (!pHdl || (!pHdl->IsCornerHdl() && !pHdl->IsVertexHdl())) + { + // Move + bRestricted = false; + } + } + + if (mpView->IsAction()) + { + // #i33136# and fdo#88339 + if(bRestricted && doConstructOrthogonal()) + { + // Scale proportionally by default: + // rectangle->square, ellipse->circle, images, etc. + bOrtho = !rMEvt.IsShift(); + } + else + { + bOrtho = rMEvt.IsShift() != pFrameView->IsOrtho(); + } + + bool bSnapModPressed = rMEvt.IsMod2(); + mpView->SetDragWithCopy(rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (mpView->IsOrtho() != bOrtho) + mpView->SetOrtho(bOrtho); + DoModifiers(rMEvt, bSnapModPressed); + + + if ( mpView->IsDragHelpLine() ) + mpView->MovDragHelpLine(aPos); + } + + bool bReturn = mpView->MouseMove(rMEvt, mpWindow->GetOutDev()); + + if (mpView->IsAction()) + { + // Because the flag set back if necessary in MouseMove + if (mpView->IsOrtho() != bOrtho) + mpView->SetOrtho(bOrtho); + } + + ForcePointer(&rMEvt); + + return bReturn; +} + +bool FuDraw::MouseButtonUp(const MouseEvent& rMEvt) +{ + if (mpView && mpView->IsDragHelpLine()) + mpView->EndDragHelpLine(); + + if ( bDragHelpLine ) + { + ::tools::Rectangle aOutputArea(Point(0,0), mpWindow->GetOutputSizePixel()); + + if (mpView && !aOutputArea.Contains(rMEvt.GetPosPixel())) + mpView->GetSdrPageView()->DeleteHelpLine(nHelpLine); + + mpWindow->ReleaseMouse(); + } + + if (mpView) + { + FrameView* pFrameView = mpViewShell->GetFrameView(); + mpView->SetOrtho( pFrameView->IsOrtho() ); + mpView->SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() ); + mpView->SetSnapEnabled(true); + mpView->SetCreate1stPointAsCenter(false); + mpView->SetResizeAtCenter(false); + mpView->SetDragWithCopy(pFrameView->IsDragWithCopy()); + mpView->SetGridSnap(pFrameView->IsGridSnap()); + mpView->SetBordSnap(pFrameView->IsBordSnap()); + mpView->SetHlplSnap(pFrameView->IsHlplSnap()); + mpView->SetOFrmSnap(pFrameView->IsOFrmSnap()); + mpView->SetOPntSnap(pFrameView->IsOPntSnap()); + mpView->SetOConSnap(pFrameView->IsOConSnap()); + } + + bIsInDragMode = false; + ForcePointer(&rMEvt); + FuPoor::MouseButtonUp(rMEvt); + + return false; +} + +/** + * Process keyboard input + * @returns sal_True if a KeyEvent is being processed, sal_False otherwise + */ +bool FuDraw::KeyInput(const KeyEvent& rKEvt) +{ + bool bReturn = false; + + switch ( rKEvt.GetKeyCode().GetCode() ) + { + case KEY_ESCAPE: + { + bReturn = FuDraw::cancel(); + } + break; + + case KEY_DELETE: + case KEY_BACKSPACE: + { + if (!mpDocSh->IsReadOnly()) + { + if (mpView->IsPresObjSelected(false, true, false, true)) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + // wait-mousepointer while deleting object + weld::WaitObject aWait(mpViewShell->GetFrameWeld()); + // delete object + mpView->DeleteMarked(); + } + } + bReturn = true; + } + break; + + case KEY_TAB: + { + vcl::KeyCode aCode = rKEvt.GetKeyCode(); + + if ( !aCode.IsMod1() && !aCode.IsMod2() ) + { + // Moved next line which was a bugfix itself into + // the scope which really does the object selection travel + // and thus is allowed to call SelectionHasChanged(). + + // Switch to FuSelect. + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( + SID_OBJECT_SELECT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + + // changeover to the next object + if(!mpView->MarkNextObj( !aCode.IsShift() )) + { + //If there is only one object, don't do the UnmarkAllObj() & MarkNextObj(). + if ( mpView->HasMultipleMarkableObjects() && mpView->AreObjectsMarked() ) + { + // No next object: go over open end and get first from + // the other side + mpView->UnmarkAllObj(); + mpView->MarkNextObj(!aCode.IsShift()); + } + } + + if(mpView->AreObjectsMarked()) + mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow); + + bReturn = true; + } + } + break; + + case KEY_END: + { + vcl::KeyCode aCode = rKEvt.GetKeyCode(); + + if ( aCode.IsMod1() ) + { + // mark last object + mpView->UnmarkAllObj(); + mpView->MarkNextObj(); + + if(mpView->AreObjectsMarked()) + mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow); + + bReturn = true; + } + } + break; + + case KEY_HOME: + { + vcl::KeyCode aCode = rKEvt.GetKeyCode(); + + if ( aCode.IsMod1() ) + { + // mark first object + mpView->UnmarkAllObj(); + mpView->MarkNextObj(true); + + if(mpView->AreObjectsMarked()) + mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow); + + bReturn = true; + } + } + break; + + default: + break; + } + + if (!bReturn) + { + bReturn = FuPoor::KeyInput(rKEvt); + } + else + { + mpWindow->ReleaseMouse(); + } + + return bReturn; +} + +void FuDraw::Activate() +{ + FuPoor::Activate(); + ForcePointer(); +} + +/** + * Toggle mouse-pointer + */ +void FuDraw::ForcePointer(const MouseEvent* pMEvt) +{ + Point aPnt; + sal_uInt16 nModifier = 0; + bool bLeftDown = false; + bool bDefPointer = true; + + if (pMEvt) + { + aPnt = mpWindow->PixelToLogic(pMEvt->GetPosPixel()); + nModifier = pMEvt->GetModifier(); + bLeftDown = pMEvt->IsLeft(); + } + else + { + aPnt = mpWindow->PixelToLogic(mpWindow->GetPointerPosPixel()); + } + + if (mpView->IsDragObj()) + { + if (SD_MOD()->GetWaterCan() && !mpView->PickHandle(aPnt)) + { + // water can mode + bDefPointer = false; + mpWindow->SetPointer(PointerStyle::Fill); + } + } + else + { + SdrHdl* pHdl = mpView->PickHandle(aPnt); + + if (SD_MOD()->GetWaterCan() && !pHdl) + { + // water can mode + bDefPointer = false; + mpWindow->SetPointer(PointerStyle::Fill); + } + else if (!pHdl && + mpViewShell->GetViewFrame()->HasChildWindow(SvxBmpMaskChildWindow::GetChildWindowId())) + { + // pipette mode + SfxChildWindow* pWnd = mpViewShell->GetViewFrame()->GetChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()); + SvxBmpMask* pMask = pWnd ? static_cast(pWnd->GetWindow()) : nullptr; + if (pMask && pMask->IsEyedropping()) + { + bDefPointer = false; + mpWindow->SetPointer(PointerStyle::RefHand); + } + } + else if (!mpView->IsAction()) + { + SdrObject* pObj = nullptr; + SdrPageView* pPV = nullptr; + SdrViewEvent aVEvt; + SdrHitKind eHit = SdrHitKind::NONE; + SdrDragMode eDragMode = mpView->GetDragMode(); + + if (pMEvt) + { + eHit = mpView->PickAnything(*pMEvt, SdrMouseEventKind::MOVE, aVEvt); + } + + if ((eDragMode == SdrDragMode::Rotate) && (eHit == SdrHitKind::MarkedObject)) + { + // The goal of this request is show always the rotation arrow for 3D-objects at rotation mode + // Independent of the settings at Tools->Options->Draw "Objects always moveable" + // 2D-objects acquit in another way. Otherwise, the rotation of 3d-objects around any axes + // wouldn't be possible per default. + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + SdrObject* pObject = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if (DynCastE3dObject(pObject) && (rMarkList.GetMarkCount() == 1)) + { + mpWindow->SetPointer(PointerStyle::Rotate); + bDefPointer = false; // Otherwise it'll be called Joe's routine and the mousepointer will reconfigurate again + } + } + + if (eHit == SdrHitKind::NONE) + { + // found nothing -> look after at the masterpage + pObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER); + } + else if (eHit == SdrHitKind::UnmarkedObject) + { + pObj = aVEvt.mpObj; + } + else if (eHit == SdrHitKind::TextEditObj && dynamic_cast< const FuSelection *>( this ) != nullptr) + { + SdrObjKind nSdrObjKind = aVEvt.mpObj->GetObjIdentifier(); + + if ( nSdrObjKind != SdrObjKind::Text && + nSdrObjKind != SdrObjKind::TitleText && + nSdrObjKind != SdrObjKind::OutlineText && + aVEvt.mpObj->IsEmptyPresObj() ) + { + pObj = nullptr; + bDefPointer = false; + mpWindow->SetPointer(PointerStyle::Arrow); + } + } + + if (pObj && pMEvt && !pMEvt->IsMod2() + && dynamic_cast(this) != nullptr) + { + // test for ImageMap + bDefPointer = !SetPointer(pObj, aPnt); + + if (bDefPointer + && (dynamic_cast(pObj) != nullptr + || DynCastE3dScene(pObj))) + { + // take a glance into the group + pObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV, + SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::DEEP); + if (pObj) + bDefPointer = !SetPointer(pObj, aPnt); + } + } + } + } + + if (bDefPointer) + { + mpWindow->SetPointer(mpView->GetPreferredPointer( + aPnt, mpWindow->GetOutDev(), nModifier, bLeftDown)); + } +} + +/** + * Set cursor to pointer when in clickable area of an ImageMap + * + * @return True when pointer was set + */ +bool FuDraw::SetPointer(const SdrObject* pObj, const Point& rPos) +{ + bool bImageMapInfo = SvxIMapInfo::GetIMapInfo(pObj) != nullptr; + + if (!bImageMapInfo) + return false; + + const SdrLayerIDSet* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers(); + double fHitLog(mpWindow->PixelToLogic(Size(HITPIX, 0)).Width()); + ::tools::Long n2HitLog(fHitLog * 2); + Point aHitPosR(rPos); + Point aHitPosL(rPos); + Point aHitPosT(rPos); + Point aHitPosB(rPos); + + aHitPosR.AdjustX(n2HitLog); + aHitPosL.AdjustX(-n2HitLog); + aHitPosT.AdjustY(n2HitLog); + aHitPosB.AdjustY(-n2HitLog); + + if (!pObj->IsClosedObj() + || (SdrObjectPrimitiveHit(*pObj, aHitPosR, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, + false) + && SdrObjectPrimitiveHit(*pObj, aHitPosL, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), + pVisiLayer, false) + && SdrObjectPrimitiveHit(*pObj, aHitPosT, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), + pVisiLayer, false) + && SdrObjectPrimitiveHit(*pObj, aHitPosB, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), + pVisiLayer, false))) + { + // hit inside the object (without margin) or open object + if (SvxIMapInfo::GetHitIMapObject(pObj, rPos)) + { + mpWindow->SetPointer(PointerStyle::RefHand); + return true; + } + } + + return false; +} + +/** + * Response of doubleclick + */ +void FuDraw::DoubleClick(const MouseEvent& rMEvt) +{ + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + + if ( mpView->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nSdrObjKind = pObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2) + { + // activate OLE-object + SfxInt16Item aItem(SID_OBJECT, 0); + mpViewShell->GetViewFrame()-> + GetDispatcher()->ExecuteList(SID_OBJECT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aItem }); + } + else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Graphic && pObj->IsEmptyPresObj() ) + { + mpViewShell->GetViewFrame()-> + GetDispatcher()->Execute( SID_INSERT_GRAPHIC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } + else if ( ( DynCastSdrTextObj( pObj ) != nullptr || dynamic_cast< const SdrObjGroup *>( pObj ) != nullptr ) && + !SD_MOD()->GetWaterCan() && + mpViewShell->GetFrameView()->IsDoubleClickTextEdit() && + !mpDocSh->IsReadOnly()) + { + SfxUInt16Item aItem(SID_TEXTEDIT, 2); + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_TEXTEDIT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aItem }); + } + else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Group) + { + // hit group -> select subobject + mpView->UnMarkAll(); + mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift(), true); + } + } + } + else + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); +} + +bool FuDraw::RequestHelp(const HelpEvent& rHEvt) +{ + bool bReturn = false; + + if (Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled()) + { + SdrViewEvent aVEvt; + + MouseEvent aMEvt(mpWindow->GetPointerPosPixel(), 1, MouseEventModifiers::NONE, MOUSE_LEFT); + + SdrHitKind eHit = mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + SdrObject* pObj = aVEvt.mpObj; + + if (eHit != SdrHitKind::NONE && pObj != nullptr) + { + Point aPosPixel = rHEvt.GetMousePosPixel(); + + bReturn = SetHelpText(pObj, aPosPixel, aVEvt); + + if (!bReturn && (dynamic_cast< const SdrObjGroup *>( pObj ) != nullptr || DynCastE3dScene(pObj))) + { + // take a glance into the group + SdrPageView* pPV = nullptr; + + Point aPos(mpWindow->PixelToLogic(mpWindow->ScreenToOutputPixel(aPosPixel))); + + pObj = mpView->PickObj(aPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::DEEP); + if (pObj) + bReturn = SetHelpText(pObj, aPosPixel, aVEvt); + } + } + } + + if (!bReturn) + { + bReturn = FuPoor::RequestHelp(rHEvt); + } + + if (!bReturn) + bReturn = mpView->RequestHelp(rHEvt); + + return bReturn; +} + +bool FuDraw::SetHelpText(const SdrObject* pObj, const Point& rPosPixel, const SdrViewEvent& rVEvt) +{ + OUString aHelpText; + Point aPos(mpWindow->PixelToLogic(mpWindow->ScreenToOutputPixel(rPosPixel))); + IMapObject* pIMapObj = SvxIMapInfo::GetHitIMapObject(pObj, aPos); + + if (!rVEvt.mpURLField && !pIMapObj) + return false; + + OUString aURL; + if (rVEvt.mpURLField) + aURL = INetURLObject::decode(rVEvt.mpURLField->GetURL(), + INetURLObject::DecodeMechanism::WithCharset); + else if (pIMapObj) + { + aURL = pIMapObj->GetAltText() + + " (" + + INetURLObject::decode(pIMapObj->GetURL(), + INetURLObject::DecodeMechanism::WithCharset) + + ")"; + } + else + return false; + + aHelpText = SfxHelp::GetURLHelpText(aURL); + + if (aHelpText.isEmpty()) + return false; + + ::tools::Rectangle aLogicPix = mpWindow->LogicToPixel(pObj->GetLogicRect()); + ::tools::Rectangle aScreenRect(mpWindow->OutputToScreenPixel(aLogicPix.TopLeft()), + mpWindow->OutputToScreenPixel(aLogicPix.BottomRight())); + + if (Help::IsBalloonHelpEnabled()) + Help::ShowBalloon( static_cast(mpWindow), rPosPixel, aScreenRect, aHelpText); + else if (Help::IsQuickHelpEnabled()) + Help::ShowQuickHelp( static_cast(mpWindow), aScreenRect, aHelpText); + + return true; +} + +/** is called when the current function should be aborted.

+ This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted +*/ +bool FuDraw::cancel() +{ + bool bReturn = false; + + if ( mpView->IsAction() ) + { + mpView->BrkAction(); + bReturn = true; + } + else if ( mpView->IsTextEdit() ) + { + mpView->SdrEndTextEdit(); + bReturn = true; + + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_DEC_INDENT ); + rBindings.Invalidate( SID_INC_INDENT ); + rBindings.Invalidate( SID_PARASPACE_INCREASE ); + rBindings.Invalidate( SID_PARASPACE_DECREASE ); + } + else if ( mpView->AreObjectsMarked() ) + { + const SdrHdlList& rHdlList = mpView->GetHdlList(); + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + if(pHdl) + { + const_cast(rHdlList).ResetFocusHdl(); + } + else + { + mpView->UnmarkAll(); + } + + // Switch to FuSelect. + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( + SID_OBJECT_SELECT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + + bReturn = true; + } + + return bReturn; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fudspord.cxx b/sd/source/ui/func/fudspord.cxx new file mode 100644 index 0000000000..f129c523cc --- /dev/null +++ b/sd/source/ui/func/fudspord.cxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include + +namespace sd { + + +FuDisplayOrder::FuDisplayOrder( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq) +: FuPoor(pViewSh, pWin, pView, pDoc, rReq) +, maPtr(PointerStyle::Arrow) +, mpRefObj(nullptr) +{ +} + +FuDisplayOrder::~FuDisplayOrder() +{ +} + +void FuDisplayOrder::implClearOverlay() +{ + mpOverlay.reset(); +} + +rtl::Reference FuDisplayOrder::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuDisplayOrder( pViewSh, pWin, pView, pDoc, rReq ) ); + return xFunc; +} + +bool FuDisplayOrder::MouseButtonDown(const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + return true; +} + +bool FuDisplayOrder::MouseMove(const MouseEvent& rMEvt) +{ + SdrPageView* pPV; + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + SdrObject* pPickObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV); + if (pPickObj) + { + if (mpRefObj != pPickObj) + { + // delete current overlay + implClearOverlay(); + + // create new one + mpOverlay.reset( new SdrDropMarkerOverlay(*mpView, *pPickObj) ); + + // remember referenced object + mpRefObj = pPickObj; + } + } + else + { + mpRefObj = nullptr; + implClearOverlay(); + } + + return true; +} + +bool FuDisplayOrder::MouseButtonUp(const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + SdrPageView* pPV = nullptr; + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + mpRefObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV); + if (mpRefObj) + { + if (nSlotId == SID_BEFORE_OBJ) + { + mpView->PutMarkedInFrontOfObj(mpRefObj); + } + else + { + mpView->PutMarkedBehindObj(mpRefObj); + } + } + + mpViewShell->Cancel(); + + return true; +} + +void FuDisplayOrder::Activate() +{ + maPtr = mpWindow->GetPointer(); + mpWindow->SetPointer( PointerStyle::RefHand ); +} + +void FuDisplayOrder::Deactivate() +{ + mpWindow->SetPointer( maPtr ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuediglu.cxx b/sd/source/ui/func/fuediglu.cxx new file mode 100644 index 0000000000..9d0281e2cc --- /dev/null +++ b/sd/source/ui/func/fuediglu.cxx @@ -0,0 +1,471 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +namespace sd { + + +FuEditGluePoints::FuEditGluePoints ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuDraw(pViewSh, pWin, pView, pDoc, rReq) + //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, + //and SHIFT+ENTER key to decide the position and draw the new insert point + ,bBeginInsertPoint(false), + oldPoint(0,0) +{ +} + +rtl::Reference FuEditGluePoints::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ) +{ + FuEditGluePoints* pFunc; + rtl::Reference xFunc( pFunc = new FuEditGluePoints( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + pFunc->SetPermanent( bPermanent ); + return xFunc; +} + +void FuEditGluePoints::DoExecute( SfxRequest& rReq ) +{ + FuDraw::DoExecute( rReq ); + mpView->SetInsGluePointMode(false); + mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBar( + ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msGluePointsToolBar); +} + +FuEditGluePoints::~FuEditGluePoints() +{ + mpView->BrkAction(); + mpView->UnmarkAllGluePoints(); + mpView->SetInsGluePointMode(false); +} + +bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt) +{ + mpView->SetActualWin( mpWindow->GetOutDev() ); + + bool bReturn = FuDraw::MouseButtonDown(rMEvt); + + if (mpView->IsAction()) + { + if (rMEvt.IsRight()) + mpView->BckAction(); + + return true; + } + + if (rMEvt.IsLeft()) + { + bReturn = true; + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpWindow->CaptureMouse(); + + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::Handle) + { + // drag handle + SdrHdl* pHdl = aVEvt.mpHdl; + + if (mpView->IsGluePointMarked(aVEvt.mpObj, aVEvt.mnGlueId) && rMEvt.IsShift()) + { + mpView->UnmarkGluePoint(aVEvt.mpObj, aVEvt.mnGlueId); + pHdl = nullptr; + } + + if (pHdl) + { + // drag handle + mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog); + } + } + else if (eHit == SdrHitKind::MarkedObject && mpView->IsInsGluePointMode()) + { + // insert gluepoints + mpView->BegInsGluePoint(aMDPos); + } + else if (eHit == SdrHitKind::MarkedObject && rMEvt.IsMod1()) + { + // select gluepoints + if (!rMEvt.IsShift()) + mpView->UnmarkAllGluePoints(); + + mpView->BegMarkGluePoints(aMDPos); + } + else if (eHit == SdrHitKind::MarkedObject && !rMEvt.IsShift() && !rMEvt.IsMod2()) + { + // move object + mpView->BegDragObj(aMDPos, nullptr, nullptr, nDrgLog); + } + else if (eHit == SdrHitKind::Gluepoint) + { + // select gluepoints + if (!rMEvt.IsShift()) + mpView->UnmarkAllGluePoints(); + + mpView->MarkGluePoint(aVEvt.mpObj, aVEvt.mnGlueId, false); + SdrHdl* pHdl = mpView->GetGluePointHdl(aVEvt.mpObj, aVEvt.mnGlueId); + + if (pHdl) + { + mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog); + } + } + else + { + // select or drag object + if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SdrHitKind::UnmarkedObject) + { + mpView->UnmarkAllObj(); + } + + bool bMarked = false; + + if (!rMEvt.IsMod1()) + { + if (rMEvt.IsMod2()) + { + bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift()); + } + else + { + bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift()); + } + } + + if (bMarked && + (!rMEvt.IsShift() || eHit == SdrHitKind::MarkedObject)) + { + // move object + mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog); + } + else if (mpView->AreObjectsMarked()) + { + // select gluepoint + if (!rMEvt.IsShift()) + mpView->UnmarkAllGluePoints(); + + mpView->BegMarkGluePoints(aMDPos); + } + else + { + // select object + mpView->BegMarkObj(aMDPos); + } + } + + ForcePointer(&rMEvt); + } + + return bReturn; +} + +bool FuEditGluePoints::MouseMove(const MouseEvent& rMEvt) +{ + mpView->SetActualWin( mpWindow->GetOutDev() ); + + FuDraw::MouseMove(rMEvt); + + if (mpView->IsAction()) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt( mpWindow->PixelToLogic(aPix) ); + ForceScroll(aPix); + mpView->MovAction(aPnt); + } + + ForcePointer(&rMEvt); + + return true; +} + +bool FuEditGluePoints::MouseButtonUp(const MouseEvent& rMEvt) +{ + mpView->SetActualWin( mpWindow->GetOutDev() ); + + bool bReturn = false; + + if (mpView->IsAction()) + { + bReturn = true; + mpView->EndAction(); + } + + FuDraw::MouseButtonUp(rMEvt); + + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); + + if (std::abs(aMDPos.X() - aPos.X()) < nDrgLog && + std::abs(aMDPos.Y() - aPos.Y()) < nDrgLog && + !rMEvt.IsShift() && !rMEvt.IsMod2()) + { + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::NONE) + { + // click on position: deselect + mpView->UnmarkAllObj(); + } + } + + mpWindow->ReleaseMouse(); + + return bReturn; +} + +/** + * Process keyboard input + * @returns sal_True if a KeyEvent is being processed, sal_False otherwise + */ +bool FuEditGluePoints::KeyInput(const KeyEvent& rKEvt) +{ + mpView->SetActualWin( mpWindow->GetOutDev() ); + + //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, + //and SHIFT+ENTER key to decide the position and draw the new insert point + + bool bReturn = false; + + switch (rKEvt.GetKeyCode().GetCode()) + { + case KEY_UP: + case KEY_DOWN: + case KEY_LEFT: + case KEY_RIGHT: + { + if(rKEvt.GetKeyCode().IsShift()&& mpView->IsInsGluePointMode() ){ + ::tools::Long nX = 0; + ::tools::Long nY = 0; + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + if (nCode == KEY_UP) + { + // scroll up + nX = 0; + nY =-1; + } + else if (nCode == KEY_DOWN) + { + // scroll down + nX = 0; + nY = 1; + } + else if (nCode == KEY_LEFT) + { + // scroll left + nX =-1; + nY = 0; + } + else if (nCode == KEY_RIGHT) + { + // scroll right + nX = 1; + nY = 0; + } + Point centerPoint; + ::tools::Rectangle rect = mpView->GetMarkedObjRect(); + centerPoint = mpWindow->LogicToPixel(rect.Center()); + Point aPoint = bBeginInsertPoint? oldPoint:centerPoint; + Point ePoint = aPoint + Point(nX,nY); + mpWindow->SetPointerPosPixel(ePoint); + //simulate mouse move action + MouseEvent eMevt(ePoint, 1, MouseEventModifiers::DRAGMOVE, MOUSE_LEFT, 0); + MouseMove(eMevt); + oldPoint = ePoint; + bBeginInsertPoint = true; + bReturn = true; + } + } + break; + case KEY_RETURN: + if(rKEvt.GetKeyCode().IsShift() && mpView->IsInsGluePointMode() ) + { + if(bBeginInsertPoint) + { + mpWindow->SetPointerPosPixel(oldPoint); + //simulate mouse button down action + MouseEvent aMevt(oldPoint, 1, + MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::DRAGMOVE, + MOUSE_LEFT, KEY_SHIFT); + // MT IA2: Not used? + // sal_uInt16 ubuttons = aMevt.GetButtons(); + // sal_uInt16 uMod = aMevt.GetModifier(); + MouseButtonDown(aMevt); + mpWindow->CaptureMouse(); + //simulate mouse button up action + MouseEvent rMEvt(oldPoint+Point(0,0), 1, + MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::ENTERWINDOW, + MOUSE_LEFT, KEY_SHIFT); + MouseButtonUp(rMEvt); + bReturn= true; + } + } + break; + } + + if(!bReturn) + bReturn = FuDraw::KeyInput(rKEvt); + + return bReturn; +} + +//Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, and +//SHIFT+ENTER key to decide the position and draw the new insert point +void FuEditGluePoints::ForcePointer(const MouseEvent* pMEvt) +{ + if(bBeginInsertPoint && pMEvt) + { + MouseEvent aMEvt(pMEvt->GetPosPixel(), pMEvt->GetClicks(), + pMEvt->GetMode(), pMEvt->GetButtons(), pMEvt->GetModifier() & ~KEY_SHIFT); + FuDraw::ForcePointer(&aMEvt); + } + else + { + FuDraw::ForcePointer(pMEvt); + } +} + +bool FuEditGluePoints::Command(const CommandEvent& rCEvt) +{ + mpView->SetActualWin( mpWindow->GetOutDev() ); + return FuPoor::Command( rCEvt ); +} + +void FuEditGluePoints::Activate() +{ + mpView->SetGluePointEditMode(); + FuDraw::Activate(); +} + +void FuEditGluePoints::Deactivate() +{ + mpView->SetGluePointEditMode( false ); + FuDraw::Deactivate(); +} + +void FuEditGluePoints::ReceiveRequest(SfxRequest& rReq) +{ + switch (rReq.GetSlot()) + { + case SID_GLUE_INSERT_POINT: + { + mpView->SetInsGluePointMode(!mpView->IsInsGluePointMode()); + } + break; + + case SID_GLUE_ESCDIR_LEFT: + { + mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::LEFT, + !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::LEFT ) ); + } + break; + + case SID_GLUE_ESCDIR_RIGHT: + { + mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT, + !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT ) ); + } + break; + + case SID_GLUE_ESCDIR_TOP: + { + mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::TOP, + !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::TOP ) ); + } + break; + + case SID_GLUE_ESCDIR_BOTTOM: + { + mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM, + !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM ) ); + } + break; + + case SID_GLUE_PERCENT: + { + const SfxItemSet* pSet = rReq.GetArgs(); + const SfxPoolItem& rItem = pSet->Get(SID_GLUE_PERCENT); + bool bPercent = static_cast(rItem).GetValue(); + mpView->SetMarkedGluePointsPercent(bPercent); + } + break; + + case SID_GLUE_HORZALIGN_CENTER: + { + mpView->SetMarkedGluePointsAlign(false, SdrAlign::HORZ_CENTER); + } + break; + + case SID_GLUE_HORZALIGN_LEFT: + { + mpView->SetMarkedGluePointsAlign(false, SdrAlign::HORZ_LEFT); + } + break; + + case SID_GLUE_HORZALIGN_RIGHT: + { + mpView->SetMarkedGluePointsAlign(false, SdrAlign::HORZ_RIGHT); + } + break; + + case SID_GLUE_VERTALIGN_CENTER: + { + mpView->SetMarkedGluePointsAlign(true, SdrAlign::VERT_CENTER); + } + break; + + case SID_GLUE_VERTALIGN_TOP: + { + mpView->SetMarkedGluePointsAlign(true, SdrAlign::VERT_TOP); + } + break; + + case SID_GLUE_VERTALIGN_BOTTOM: + { + mpView->SetMarkedGluePointsAlign(true, SdrAlign::VERT_BOTTOM); + } + break; + } + + // at the end, call base class + FuPoor::ReceiveRequest(rReq); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuexecuteinteraction.cxx b/sd/source/ui/func/fuexecuteinteraction.cxx new file mode 100644 index 0000000000..6dacef089d --- /dev/null +++ b/sd/source/ui/func/fuexecuteinteraction.cxx @@ -0,0 +1,238 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace css; + +namespace sd +{ +FuExecuteInteraction::FuExecuteInteraction(ViewShell* pViewSh, ::sd::Window* pWin, + ::sd::View* pView, SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuExecuteInteraction::Create(ViewShell* pViewSh, ::sd::Window* pWin, + ::sd::View* pView, SdDrawDocument* pDoc, + SfxRequest& rReq) +{ + rtl::Reference xFunc(new FuExecuteInteraction(pViewSh, pWin, pView, pDoc, rReq)); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuExecuteInteraction::DoExecute(SfxRequest&) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() != 1) + return; + + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + if (dynamic_cast(mpDocSh) != nullptr + || dynamic_cast(mpView) == nullptr) + return; + + SdAnimationInfo* pInfo = SdDrawDocument::GetAnimationInfo(pObj); + if (!pInfo) + return; + + switch (pInfo->meClickAction) + { + case presentation::ClickAction_BOOKMARK: + { + // Jump to Bookmark (Page or Object) + SfxStringItem aItem(SID_NAVIGATOR_OBJECT, pInfo->GetBookmark()); + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_OBJECT, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + } + break; + + case presentation::ClickAction_DOCUMENT: + { + OUString sBookmark(pInfo->GetBookmark()); + // Jump to document + if (!sBookmark.isEmpty()) + { + SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); + SfxStringItem aStrItem(SID_FILE_NAME, sBookmark); + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); + SfxBoolItem aBrowseItem(SID_BROWSE, true); + pFrame->GetDispatcher()->ExecuteList( + SID_OPENDOC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer }); + } + } + break; + + case presentation::ClickAction_PREVPAGE: + { + // Jump to the previous page + SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_PREVIOUS); + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + } + break; + + case presentation::ClickAction_NEXTPAGE: + { + // Jump to the next page + SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_NEXT); + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + } + break; + + case presentation::ClickAction_FIRSTPAGE: + { + // Jump to the first page + SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_FIRST); + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + } + break; + + case presentation::ClickAction_LASTPAGE: + { + // Jump to the last page + SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_LAST); + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem }); + } + break; + + case presentation::ClickAction_SOUND: + { +#if HAVE_FEATURE_AVMEDIA + try + { + mxPlayer.set(avmedia::MediaWindow::createPlayer(pInfo->GetBookmark(), "" /*TODO?*/), + uno::UNO_SET_THROW); + mxPlayer->start(); + } + catch (uno::Exception&) + { + } +#endif + } + break; + + case presentation::ClickAction_VERB: + { + // Assign verb + mpView->UnmarkAll(); + mpView->MarkObj(pObj, mpView->GetSdrPageView()); + DrawViewShell* pDrViewSh = static_cast(mpViewShell); + pDrViewSh->DoVerb(static_cast(pInfo->mnVerb)); + } + break; + + case presentation::ClickAction_PROGRAM: + { + OUString aBaseURL = GetDocSh()->GetMedium()->GetBaseURL(); + INetURLObject aURL(::URIHelper::SmartRel2Abs( + INetURLObject(aBaseURL), pInfo->GetBookmark(), URIHelper::GetMaybeFileHdl(), true, + false, INetURLObject::EncodeMechanism::WasEncoded, + INetURLObject::DecodeMechanism::Unambiguous)); + + if (INetProtocol::File == aURL.GetProtocol()) + { + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + { + SfxStringItem aUrl(SID_FILE_NAME, + aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE)); + SfxBoolItem aBrowsing(SID_BROWSE, true); + + pViewFrm->GetDispatcher()->ExecuteList( + SID_OPENDOC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aUrl, &aBrowsing }); + } + } + } + break; + +#if HAVE_FEATURE_SCRIPTING + case presentation::ClickAction_MACRO: + { + // Execute macro + OUString aMacro = pInfo->GetBookmark(); + + if (SfxApplication::IsXScriptURL(aMacro)) + { + uno::Any aRet; + uno::Sequence aOutArgsIndex; + uno::Sequence aParams; + uno::Sequence aOutArgs; + + mpDocSh->CallXScript(aMacro, aParams, aRet, aOutArgsIndex, aOutArgs); + } + else + { + // aMacro has got following format: + // "Macroname.Modulname.Libname.Documentname" or + // "Macroname.Modulname.Libname.Applicationname" + sal_Int32 nIdx{ 0 }; + const std::u16string_view aMacroName = o3tl::getToken(aMacro, 0, '.', nIdx); + const std::u16string_view aModulName = o3tl::getToken(aMacro, 0, '.', nIdx); + + // Currently the "Call" method only resolves modulename+macroname + mpDocSh->GetBasic()->Call(OUString::Concat(aModulName) + "." + aMacroName); + } + } + break; +#endif + + default: + break; + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuexpand.cxx b/sd/source/ui/func/fuexpand.cxx new file mode 100644 index 0000000000..822174ed94 --- /dev/null +++ b/sd/source/ui/func/fuexpand.cxx @@ -0,0 +1,256 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + + +FuExpandPage::FuExpandPage ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuExpandPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuExpandPage( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuExpandPage::DoExecute( SfxRequest& ) +{ + if ( mpView && mpView->IsTextEdit() ) + mpView->SdrEndTextEdit(); + + // find selected page (only standard pages) + SdPage* pActualPage = nullptr; + sal_uInt16 i = 0; + sal_uInt16 nCount = mpDoc->GetSdPageCount(PageKind::Standard); + + while (!pActualPage && i < nCount) + { + if (mpDoc->GetSdPage(i, PageKind::Standard)->IsSelected()) + { + pActualPage = mpDoc->GetSdPage(i, PageKind::Standard); + } + + i++; + } + + if (!pActualPage) + return; + + SdOutliner aOutliner( mpDoc, OutlinerMode::OutlineObject ); + aOutliner.SetUpdateLayout(false); + aOutliner.EnableUndo(false); + + if (mpDocSh) + aOutliner.SetRefDevice( SD_MOD()->GetVirtualRefDevice() ); + + aOutliner.SetDefTab( mpDoc->GetDefaultTabulator() ); + aOutliner.SetStyleSheetPool(static_cast(mpDoc->GetStyleSheetPool())); + + SdrLayerIDSet aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers(); + sal_uInt16 nActualPageNum = pActualPage->GetPageNum(); + SdPage* pActualNotesPage = static_cast(mpDoc->GetPage(nActualPageNum + 1)); + SdrTextObj* pActualOutline = static_cast(pActualPage->GetPresObj(PresObjKind::Outline)); + + if (pActualOutline) + { + const bool bUndo = mpView->IsUndoEnabled(); + + if( bUndo ) + mpView->BegUndo(SdResId(STR_UNDO_EXPAND_PAGE)); + + // set current structuring-object into outliner + OutlinerParaObject* pParaObj = pActualOutline->GetOutlinerParaObject(); + aOutliner.SetText(*pParaObj); + + // remove hard paragraph- and character attributes + SfxItemSetFixed aEmptyEEAttr(mpDoc->GetPool()); + sal_Int32 nParaCount1 = aOutliner.GetParagraphCount(); + + for (sal_Int32 nPara = 0; nPara < nParaCount1; nPara++) + { + aOutliner.RemoveCharAttribs(nPara); + aOutliner.SetParaAttribs(nPara, aEmptyEEAttr); + } + + sal_uInt16 nPos = 2; + Paragraph* pPara = aOutliner.GetParagraph( 0 ); + + while (pPara) + { + sal_Int32 nParaPos = aOutliner.GetAbsPos( pPara ); + sal_Int16 nDepth = aOutliner.GetDepth( nParaPos ); + if ( nDepth == 0 ) + { + // page with title & structuring! + rtl::Reference pPage = mpDoc->AllocSdPage(false); + pPage->SetSize(pActualPage->GetSize() ); + pPage->SetBorder(pActualPage->GetLeftBorder(), + pActualPage->GetUpperBorder(), + pActualPage->GetRightBorder(), + pActualPage->GetLowerBorder() ); + pPage->SetName(OUString()); + + // insert page after current page + mpDoc->InsertPage(pPage.get(), nActualPageNum + nPos); + nPos++; + + if( bUndo ) + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pPage)); + + // use MasterPage of the current page + pPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage()); + pPage->SetLayoutName(pActualPage->GetLayoutName()); + pPage->SetAutoLayout(AUTOLAYOUT_TITLE_CONTENT, true); + pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + + // notes-page + rtl::Reference pNotesPage = mpDoc->AllocSdPage(false); + pNotesPage->SetSize(pActualNotesPage->GetSize()); + pNotesPage->SetBorder(pActualNotesPage->GetLeftBorder(), + pActualNotesPage->GetUpperBorder(), + pActualNotesPage->GetRightBorder(), + pActualNotesPage->GetLowerBorder() ); + pNotesPage->SetPageKind(PageKind::Notes); + pNotesPage->SetName(OUString()); + + // insert page after current page + mpDoc->InsertPage(pNotesPage.get(), nActualPageNum + nPos); + nPos++; + + if( bUndo ) + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage)); + + // use MasterPage of the current page + pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage()); + pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName()); + pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), true); + pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + + // create title text objects + SdrTextObj* pTextObj = static_cast(pPage->GetPresObj(PresObjKind::Title)); + SAL_WARN_IF(!pTextObj, "sd.core", "worrying lack of PresObjKind::Title object"); + if (!pTextObj) + continue; + + std::optional pOutlinerParaObject = aOutliner.CreateParaObject( nParaPos, 1); + pOutlinerParaObject->SetOutlinerMode(OutlinerMode::TitleObject); + + if( pOutlinerParaObject->GetDepth(0) != -1 ) + { + std::unique_ptr pTempOutl = SdrMakeOutliner(OutlinerMode::TitleObject, *mpDoc); + + pTempOutl->SetText( *pOutlinerParaObject ); + + pOutlinerParaObject.reset(); + + pTempOutl->SetDepth( pTempOutl->GetParagraph( 0 ), -1 ); + + pOutlinerParaObject = pTempOutl->CreateParaObject(); + } + + pTextObj->SetOutlinerParaObject(std::move(pOutlinerParaObject)); + + pTextObj->SetEmptyPresObj(false); + + SfxStyleSheet* pSheet = pPage->GetStyleSheetForPresObj(PresObjKind::Title); + pTextObj->NbcSetStyleSheet(pSheet, false); + + SdrTextObj* pOutlineObj = nullptr; + sal_Int32 nChildCount = aOutliner.GetChildCount(pPara); + if (nChildCount > 0) + pOutlineObj = static_cast( pPage->GetPresObj(PresObjKind::Outline) ); + if (pOutlineObj) + { + // create structuring text objects + std::optional pOPO = aOutliner.CreateParaObject(++nParaPos, nChildCount); + + std::unique_ptr pTempOutl = SdrMakeOutliner(OutlinerMode::OutlineObject, *mpDoc); + pTempOutl->SetText( *pOPO ); + + sal_Int32 nParaCount2 = pTempOutl->GetParagraphCount(); + sal_Int32 nPara; + for( nPara = 0; nPara < nParaCount2; nPara++ ) + { + pTempOutl->SetDepth ( + pTempOutl->GetParagraph( nPara ), + pTempOutl->GetDepth( nPara ) - 1); + } + + pOPO = pTempOutl->CreateParaObject(); + pTempOutl.reset(); + + pOutlineObj->SetOutlinerParaObject( std::move(pOPO) ); + pOutlineObj->SetEmptyPresObj(false); + + // remove hard attributes (Flag to sal_True) + SfxItemSet aAttr(mpDoc->GetPool()); + aAttr.Put(XLineStyleItem(drawing::LineStyle_NONE)); + aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + pOutlineObj->SetMergedItemSet(aAttr); + } + } + + pPara = aOutliner.GetParagraph( ++nParaPos ); + } + + if( bUndo ) + mpView->EndUndo(); + } + + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_DELETE_PAGE, SfxCallMode::SYNCHRON | SfxCallMode::RECORD); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuformatpaintbrush.cxx b/sd/source/ui/func/fuformatpaintbrush.cxx new file mode 100644 index 0000000000..0d2b29d33d --- /dev/null +++ b/sd/source/ui/func/fuformatpaintbrush.cxx @@ -0,0 +1,300 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +namespace +{ +// Paragraph properties are pasted if the selection contains a whole paragraph +// or there was no selection at all (i.e. just a left click) +bool ShouldPasteParaFormatPerSelection(const OutlinerView* pOLV) +{ + if(!pOLV) + return true; + + if(!pOLV->GetEditView().HasSelection()) + return true; + + if(!pOLV->GetEditView().IsSelectionWithinSinglePara()) + return true; + + return pOLV->GetEditView().IsSelectionFullPara(); +} +} + +namespace sd { + + +FuFormatPaintBrush::FuFormatPaintBrush( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +: FuText(pViewSh, pWin, pView, pDoc, rReq) +, mbPermanent( false ) +, mbOldIsQuickTextEditMode( true ) +{ +} + +rtl::Reference FuFormatPaintBrush::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuFormatPaintBrush( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute( rReq ); + return xFunc; +} + +void FuFormatPaintBrush::DoExecute( SfxRequest& rReq ) +{ + const SfxItemSet *pArgs = rReq.GetArgs(); + if( pArgs && pArgs->Count() >= 1 ) + { + mbPermanent = pArgs->Get(SID_FORMATPAINTBRUSH).GetValue(); + } + + if( mpView ) + { + mpView->TakeFormatPaintBrush( mxItemSet ); + } +} + +void FuFormatPaintBrush::implcancel() +{ + if( mpViewShell && mpViewShell->GetViewFrame() ) + { + SfxViewFrame* pViewFrame = mpViewShell->GetViewFrame(); + pViewFrame->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); + pViewFrame->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } +} + +static void unmarkimpl( SdrView* pView ) +{ + pView->SdrEndTextEdit(); + pView->UnMarkAll(); +} + +bool FuFormatPaintBrush::MouseButtonDown(const MouseEvent& rMEvt) +{ + if(mpView&&mpWindow) + { + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if( (eHit == SdrHitKind::TextEdit) || (eHit == SdrHitKind::TextEditObj && ( mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast(aVEvt.mpObj) != nullptr ) )) + { + SdrPageView* pPV=nullptr; + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + SdrObject* pPickObj = mpView->PickObj(mpWindow->PixelToLogic(rMEvt.GetPosPixel()),nHitLog, pPV, SdrSearchOptions::PICKMARKABLE); + if( (pPickObj != nullptr) && !pPickObj->IsEmptyPresObj() ) + { + // if we text hit another shape than the one currently selected, unselect the old one now + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() > 0 ) + { + if( rMarkList.GetMarkCount() == 1 ) + { + if( rMarkList.GetMark(0)->GetMarkedSdrObj() != pPickObj ) + { + + // if current selected shape is not that of the hit text edit, deselect it + unmarkimpl( mpView ); + } + } + else + { + // more than one shape selected, deselect all of them + unmarkimpl( mpView ); + } + } + MouseEvent aMEvt( rMEvt.GetPosPixel(), rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), 0 ); + return FuText::MouseButtonDown(aMEvt); + } + + if (aVEvt.mpObj == nullptr) + aVEvt.mpObj = pPickObj; + } + + unmarkimpl( mpView ); + + if (aVEvt.mpObj) + { + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + mpView->MarkObj(mpWindow->PixelToLogic( rMEvt.GetPosPixel() ), nHitLog, false/*bToggle*/); + return true; + } + } + return false; +} + +bool FuFormatPaintBrush::MouseMove(const MouseEvent& rMEvt) +{ + bool bReturn = false; + if( mpWindow && mpView ) + { + if ( mpView->IsTextEdit() ) + { + bReturn = FuText::MouseMove( rMEvt ); + mpWindow->SetPointer(PointerStyle::Fill); + } + else + { + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + SdrPageView* pPV=nullptr; + SdrObject* pObj = mpView->PickObj(mpWindow->PixelToLogic( rMEvt.GetPosPixel() ),nHitLog, pPV, SdrSearchOptions::PICKMARKABLE); + if (pObj && HasContentForThisType(pObj->GetObjInventor(),pObj->GetObjIdentifier()) ) + mpWindow->SetPointer(PointerStyle::Fill); + else + mpWindow->SetPointer(PointerStyle::Arrow); + } + } + return bReturn; +} + +bool FuFormatPaintBrush::MouseButtonUp(const MouseEvent& rMEvt) +{ + if( mxItemSet && mpView && mpView->AreObjectsMarked() ) + { + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + bool bNoCharacterFormats = false; + bool bNoParagraphFormats = !ShouldPasteParaFormatPerSelection(pOLV); + + if ((rMEvt.GetModifier() & KEY_MOD1) && (rMEvt.GetModifier() & KEY_SHIFT)) + { + bNoCharacterFormats = true; + bNoParagraphFormats = false; + } + else if (rMEvt.GetModifier() & KEY_MOD1) + { + bNoParagraphFormats = true; + } + + if( pOLV ) + pOLV->MouseButtonUp(rMEvt); + + Paste( bNoCharacterFormats, bNoParagraphFormats ); + if(mpViewShell) + mpViewShell->GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); + + if( mbPermanent ) + return true; + } + + implcancel(); + return true; +} + +bool FuFormatPaintBrush::KeyInput(const KeyEvent& rKEvt) +{ + if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE) + { + implcancel(); + return true; + } + return FuPoor::KeyInput(rKEvt); +} + +void FuFormatPaintBrush::Activate() +{ + mbOldIsQuickTextEditMode = mpViewShell->GetFrameView()->IsQuickEdit(); + if( !mbOldIsQuickTextEditMode ) + { + mpViewShell->GetFrameView()->SetQuickEdit(true); + mpView->SetQuickTextEditMode(true); + } +} + +void FuFormatPaintBrush::Deactivate() +{ + if( !mbOldIsQuickTextEditMode ) + { + mpViewShell->GetFrameView()->SetQuickEdit(false); + mpView->SetQuickTextEditMode(false); + } +} + +bool FuFormatPaintBrush::HasContentForThisType( SdrInventor nObjectInventor, SdrObjKind nObjectIdentifier ) const +{ + if (mxItemSet == nullptr) + return false; + if( !mpView || (!SdrObjEditView::SupportsFormatPaintbrush( nObjectInventor, nObjectIdentifier) ) ) + return false; + return true; +} + +void FuFormatPaintBrush::Paste( bool bNoCharacterFormats, bool bNoParagraphFormats ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if( !(mxItemSet && ( rMarkList.GetMarkCount() == 1 )) ) + return; + + SdrObject* pObj( nullptr ); + bool bUndo = mpDoc->IsUndoEnabled(); + + if( bUndo && !mpView->GetTextEditOutlinerView() ) + pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + // n685123: ApplyFormatPaintBrush itself would store undo information + // except in a few cases (?) + if( pObj ) + { + OUString sLabel( mpViewShell->GetViewShellBase().RetrieveLabelFromCommand(".uno:FormatPaintbrush" ) ); + mpDoc->BegUndo( sLabel ); + if (dynamic_cast< sdr::table::SdrTableObj* >( pObj ) == nullptr) + mpDoc->AddUndo( mpDoc->GetSdrUndoFactory().CreateUndoAttrObject( *pObj, false, true ) ); + } + + mpView->ApplyFormatPaintBrush( *mxItemSet, bNoCharacterFormats, bNoParagraphFormats ); + + if( pObj ) + { + mpDoc->EndUndo(); + } +} + +/* static */ void FuFormatPaintBrush::GetMenuState( DrawViewShell const & rDrawViewShell, SfxItemSet &rSet ) +{ + const SdrMarkList& rMarkList = rDrawViewShell.GetDrawView()->GetMarkedObjectList(); + + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( pObj && SdrObjEditView::SupportsFormatPaintbrush(pObj->GetObjInventor(),pObj->GetObjIdentifier()) ) + return; + } + rSet.DisableItem( SID_FORMATPAINTBRUSH ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuhhconv.cxx b/sd/source/ui/func/fuhhconv.cxx new file mode 100644 index 0000000000..a312439bb6 --- /dev/null +++ b/sd/source/ui/func/fuhhconv.cxx @@ -0,0 +1,256 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +class SfxRequest; + +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::uno; + +namespace sd { + + +FuHangulHanjaConversion::FuHangulHanjaConversion ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDocument, + SfxRequest& rReq ) + : FuPoor(pViewSh, pWin, pView, pDocument, rReq), + pSdOutliner(nullptr), + bOwnOutliner(false) +{ + if ( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr ) + { + bOwnOutliner = true; + pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject ); + } + else if ( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr ) + { + bOwnOutliner = false; + pSdOutliner = mpDoc->GetOutliner(); + } + + if (pSdOutliner) + pSdOutliner->PrepareSpelling(); +} + +FuHangulHanjaConversion::~FuHangulHanjaConversion() +{ + if (pSdOutliner) + pSdOutliner->EndConversion(); + + if (bOwnOutliner) + delete pSdOutliner; +} + +rtl::Reference FuHangulHanjaConversion::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuHangulHanjaConversion( pViewSh, pWin, pView, pDoc, rReq ) ); + return xFunc; +} + +/** + * Search and replace + */ +void FuHangulHanjaConversion::StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage, + const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive ) +{ + + mpView->BegUndo(SdResId(STR_UNDO_HANGULHANJACONVERSION)); + + ViewShellBase* pBase = dynamic_cast( SfxViewShell::Current() ); + if (pBase != nullptr) + mpViewShell = pBase->GetMainViewShell().get(); + + if( mpViewShell ) + { + if ( pSdOutliner && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bOwnOutliner ) + { + pSdOutliner->EndConversion(); + + bOwnOutliner = true; + pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject ); + pSdOutliner->BeginConversion(); + } + else if ( pSdOutliner && dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr && bOwnOutliner ) + { + pSdOutliner->EndConversion(); + delete pSdOutliner; + + bOwnOutliner = false; + pSdOutliner = mpDoc->GetOutliner(); + pSdOutliner->BeginConversion(); + } + + if (pSdOutliner) + pSdOutliner->StartConversion(nSourceLanguage, nTargetLanguage, pTargetFont, nOptions, bIsInteractive ); + } + + // Due to changing between edit mode, notes mode, and handout mode the + // view has most likely changed. Get the new one. + mpViewShell = pBase ? pBase->GetMainViewShell().get() : nullptr; + if (mpViewShell != nullptr) + { + mpView = mpViewShell->GetView(); + mpWindow = mpViewShell->GetActiveWindow(); + } + else + { + mpView = nullptr; + mpWindow = nullptr; + } + + if (mpView != nullptr) + mpView->EndUndo(); +} + +void FuHangulHanjaConversion::ConvertStyles( LanguageType nTargetLanguage, const vcl::Font *pTargetFont ) +{ + if( !mpDoc ) + return; + + SfxStyleSheetBasePool* pStyleSheetPool = mpDoc->GetStyleSheetPool(); + if( !pStyleSheetPool ) + return; + + SfxStyleSheetBase* pStyle = pStyleSheetPool->First(SfxStyleFamily::All); + while( pStyle ) + { + SfxItemSet& rSet = pStyle->GetItemSet(); + + const bool bHasParent = !pStyle->GetParent().isEmpty(); + + if( !bHasParent || rSet.GetItemState( EE_CHAR_LANGUAGE_CJK, false ) == SfxItemState::SET ) + rSet.Put( SvxLanguageItem( nTargetLanguage, EE_CHAR_LANGUAGE_CJK ) ); + + if( pTargetFont && + ( !bHasParent || rSet.GetItemState( EE_CHAR_FONTINFO_CJK, false ) == SfxItemState::SET ) ) + { + // set new font attribute + SvxFontItem aFontItem( rSet.Get( EE_CHAR_FONTINFO_CJK ) ); + aFontItem.SetFamilyName( pTargetFont->GetFamilyName()); + aFontItem.SetFamily( pTargetFont->GetFamilyType()); + aFontItem.SetStyleName( pTargetFont->GetStyleName()); + aFontItem.SetPitch( pTargetFont->GetPitch()); + aFontItem.SetCharSet( pTargetFont->GetCharSet()); + rSet.Put( aFontItem ); + } + + pStyle = pStyleSheetPool->Next(); + } + + mpDoc->SetLanguage( nTargetLanguage, EE_CHAR_LANGUAGE_CJK ); +} + +void FuHangulHanjaConversion::StartChineseConversion() +{ + //open ChineseTranslationDialog + Reference< XComponentContext > xContext( + ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one + if(!xContext.is()) + return; + + Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() ); + if(!xMCF.is()) + return; + + Reference< ui::dialogs::XExecutableDialog > xDialog( + xMCF->createInstanceWithContext("com.sun.star.linguistic2.ChineseTranslationDialog" + , xContext), UNO_QUERY); + Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY ); + if( xInit.is() ) + { + // initialize dialog + Reference< awt::XWindow > xDialogParentWindow; + Sequence aSeq(comphelper::InitAnyPropertySequence( + { + {"ParentWindow", uno::Any(xDialogParentWindow)} + })); + xInit->initialize( aSeq ); + + //execute dialog + sal_Int16 nDialogRet = xDialog->execute(); + if( RET_OK == nDialogRet ) + { + //get some parameters from the dialog + bool bToSimplified = true; + bool bUseVariants = true; + bool bCommonTerms = true; + Reference< beans::XPropertySet > xProp( xDialog, UNO_QUERY ); + if( xProp.is() ) + { + try + { + xProp->getPropertyValue( "IsDirectionToSimplified" ) >>= bToSimplified; + xProp->getPropertyValue( "IsUseCharacterVariants" ) >>= bUseVariants; + xProp->getPropertyValue( "IsTranslateCommonTerms" ) >>= bCommonTerms; + } + catch( Exception& ) + { + } + } + + //execute translation + LanguageType nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED; + LanguageType nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL; + sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0; + if( !bCommonTerms ) + nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER; + + vcl::Font aTargetFont = OutputDevice::GetDefaultFont( + DefaultFontType::CJK_PRESENTATION, + nTargetLang, GetDefaultFontFlags::OnlyOne ); + + StartConversion( nSourceLang, nTargetLang, &aTargetFont, nOptions, false ); + ConvertStyles( nTargetLang, &aTargetFont ); + } + } + Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY ); + if( xComponent.is() ) + xComponent->dispose(); +} +} // end of namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuinsert.cxx b/sd/source/ui/func/fuinsert.cxx new file mode 100644 index 0000000000..31b286c822 --- /dev/null +++ b/sd/source/ui/func/fuinsert.cxx @@ -0,0 +1,778 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +using namespace com::sun::star; + +namespace sd { + + +FuInsertGraphic::FuInsertGraphic ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq, + bool replaceExistingImage) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq), + mbReplaceExistingImage(replaceExistingImage) +{ +} + +rtl::Reference FuInsertGraphic::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq, bool replaceExistingImage ) +{ + rtl::Reference xFunc( new FuInsertGraphic( pViewSh, pWin, pView, pDoc, rReq, replaceExistingImage ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuInsertGraphic::DoExecute( SfxRequest& rReq ) +{ + OUString aFileName; + Graphic aGraphic; + + bool bAsLink = false; + ErrCode nError = ERRCODE_GRFILTER_OPENERROR; + + const SfxItemSet* pArgs = rReq.GetArgs(); + const SfxPoolItem* pItem; + + if ( pArgs && + pArgs->GetItemState( SID_INSERT_GRAPHIC, true, &pItem ) == SfxItemState::SET ) + { + aFileName = static_cast(pItem)->GetValue(); + + OUString aFilterName; + if ( const SfxStringItem* pFilterItem = pArgs->GetItemIfSet( FN_PARAM_FILTER ) ) + aFilterName = pFilterItem->GetValue(); + + if ( pArgs->GetItemState( FN_PARAM_1, true, &pItem ) == SfxItemState::SET ) + bAsLink = static_cast(pItem)->GetValue(); + + nError = GraphicFilter::LoadGraphic( aFileName, aFilterName, aGraphic, &GraphicFilter::GetGraphicFilter() ); + } + else + { + SvxOpenGraphicDialog aDlg(SdResId(STR_INSERTGRAPHIC), mpWindow ? mpWindow->GetFrameWeld() : nullptr); + + if( aDlg.Execute() != ERRCODE_NONE ) + return; // cancel dialog + + nError = aDlg.GetGraphic(aGraphic); + bAsLink = aDlg.IsAsLink(); + aFileName = aDlg.GetPath(); + } + + if( nError == ERRCODE_NONE ) + { + GraphicNativeMetadata aMetadata; + if ( aMetadata.read(aGraphic) ) + { + const Degree10 aRotation = aMetadata.getRotation(); + if (aRotation) + { + GraphicNativeTransform aTransform( aGraphic ); + aTransform.rotate( aRotation ); + } + } + if( dynamic_cast< DrawViewShell *>( mpViewShell ) ) + { + sal_Int8 nAction = DND_ACTION_COPY; + SdrObject* pPickObj = nullptr; + if (mbReplaceExistingImage) + pPickObj = mpView->GetSelectedSingleObject( mpView->GetPage() ); + if (pPickObj) + nAction = DND_ACTION_LINK; + else + { + pPickObj = mpView->GetEmptyPresentationObject( PresObjKind::Graphic ); + if (pPickObj) + nAction = DND_ACTION_LINK; + } + + Point aPos = mpWindow->GetVisibleCenter(); + SdrGrafObj* pGrafObj = mpView->InsertGraphic(aGraphic, nAction, aPos, pPickObj, nullptr); + + if(pGrafObj && bAsLink ) + { + // really store as link only? + if( officecfg::Office::Common::Misc::ShowLinkWarningDialog::get() ) + { + SvxLinkWarningDialog aWarnDlg(mpWindow->GetFrameWeld(), aFileName); + if (aWarnDlg.run() != RET_OK) + return; // don't store as link + } + + // store as link + pGrafObj->SetGraphicLink(aFileName); + } + } + } + else + { + SdGRFFilter::HandleGraphicFilterError( nError, GraphicFilter::GetGraphicFilter().GetLastError() ); + } +} + +FuInsertClipboard::FuInsertClipboard ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuInsertClipboard::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuInsertClipboard( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuInsertClipboard::DoExecute( SfxRequest& ) +{ + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpWindow ) ); + SotClipboardFormatId nFormatId; + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreatePasteDialog(mpViewShell->GetFrameWeld())); + pDlg->Insert( SotClipboardFormatId::EMBED_SOURCE, OUString() ); + pDlg->Insert( SotClipboardFormatId::LINK_SOURCE, OUString() ); + pDlg->Insert( SotClipboardFormatId::DRAWING, OUString() ); + pDlg->Insert( SotClipboardFormatId::SVXB, OUString() ); + pDlg->Insert( SotClipboardFormatId::GDIMETAFILE, OUString() ); + pDlg->Insert( SotClipboardFormatId::BITMAP, OUString() ); + pDlg->Insert( SotClipboardFormatId::NETSCAPE_BOOKMARK, OUString() ); + pDlg->Insert( SotClipboardFormatId::STRING, OUString() ); + pDlg->Insert( SotClipboardFormatId::HTML, OUString() ); + pDlg->Insert(SotClipboardFormatId::HTML_SIMPLE, OUString()); + pDlg->Insert( SotClipboardFormatId::RTF, OUString() ); + pDlg->Insert( SotClipboardFormatId::RICHTEXT, OUString() ); + pDlg->Insert( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT, OUString() ); + + //TODO/MBA: testing + nFormatId = pDlg->GetFormat( aDataHelper ); + if( nFormatId == SotClipboardFormatId::NONE || !aDataHelper.GetTransferable().is() ) + return; + + sal_Int8 nAction = DND_ACTION_COPY; + DrawViewShell* pDrViewSh = nullptr; + + if (!mpView->InsertData( aDataHelper, + mpWindow->PixelToLogic( ::tools::Rectangle( Point(), mpWindow->GetOutputSizePixel() ).Center() ), + nAction, false, nFormatId )) + { + pDrViewSh = dynamic_cast(mpViewShell); + } + + if (!pDrViewSh) + return; + + INetBookmark aINetBookmark( "", "" ); + + if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) + { + pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" ); + } +} + +FuInsertOLE::FuInsertOLE ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuInsertOLE::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuInsertOLE( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuInsertOLE::DoExecute( SfxRequest& rReq ) +{ + if ( nSlotId == SID_ATTR_TABLE || + nSlotId == SID_INSERT_DIAGRAM || + nSlotId == SID_INSERT_MATH ) + { + PresObjKind ePresObjKind = (nSlotId == SID_INSERT_DIAGRAM) ? PresObjKind::Chart : PresObjKind::Object; + + SdrObject* pPickObj = mpView->GetEmptyPresentationObject( ePresObjKind ); + + // insert diagram or Calc table + OUString aObjName; + SvGlobalName aName; + if (nSlotId == SID_INSERT_DIAGRAM) + aName = SvGlobalName( SO3_SCH_CLASSID); + else if (nSlotId == SID_ATTR_TABLE) + aName = SvGlobalName(SO3_SC_CLASSID); + else if (nSlotId == SID_INSERT_MATH) + aName = SvGlobalName(SO3_SM_CLASSID); + + uno::Reference < embed::XEmbeddedObject > xObj = mpViewShell->GetViewFrame()->GetObjectShell()-> + GetEmbeddedObjectContainer().CreateEmbeddedObject( aName.GetByteSequence(), aObjName ); + if ( xObj.is() ) + { + // Create default chart type. + uno::Reference xChartDoc(xObj->getComponent(), uno::UNO_QUERY); + if (xChartDoc.is()) + xChartDoc->createDefaultChart(); + + sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; + + MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); + + ::tools::Rectangle aRect; + if( pPickObj ) + { + aRect = pPickObj->GetLogicRect(); + + awt::Size aSz; + aSz.Width = aRect.GetWidth(); + aSz.Height = aRect.GetHeight(); + xObj->setVisualAreaSize( nAspect, aSz ); + } + else + { + awt::Size aSz; + try + { + aSz = xObj->getVisualAreaSize( nAspect ); + } + catch ( embed::NoVisualAreaSizeException& ) + { + // the default size will be set later + } + + Size aSize( aSz.Width, aSz.Height ); + + if (aSize.IsEmpty()) + { + // rectangle with balanced edge ratio + aSize.setWidth( 14100 ); + aSize.setHeight( 10000 ); + Size aTmp = OutputDevice::LogicToLogic(aSize, MapMode(MapUnit::Map100thMM), MapMode(aUnit)); + aSz.Width = aTmp.Width(); + aSz.Height = aTmp.Height(); + xObj->setVisualAreaSize( nAspect, aSz ); + } + else + { + aSize = OutputDevice::LogicToLogic(aSize, MapMode(aUnit), MapMode(MapUnit::Map100thMM)); + } + + Point aPos = mpWindow->GetVisibleCenter(); + aPos.AdjustX( -(aSize.Width() / 2) ); + aPos.AdjustY( -(aSize.Height() / 2) ); + aRect = ::tools::Rectangle(aPos, aSize); + } + + rtl::Reference pOleObj = new SdrOle2Obj( + mpView->getSdrModelFromSdrView(), + svt::EmbeddedObjectRef( xObj, nAspect ), + aObjName, + aRect); + SdrPageView* pPV = mpView->GetSdrPageView(); + + // if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj + if( pPickObj ) + { + SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject()); + if(pPage && pPage->IsPresObj(pPickObj)) + { + pPage->InsertPresObj( pOleObj.get(), ePresObjKind ); + pOleObj->SetUserCall(pPickObj->GetUserCall()); + } + + // #i123468# we need to end text edit before replacing the object. There cannot yet + // being text typed (else it would not be an EmptyPresObj anymore), but it may be + // in text edit mode + if (mpView->IsTextEdit()) + { + mpView->SdrEndTextEdit(); + } + } + + bool bRet = true; + if( pPickObj ) + mpView->ReplaceObjectAtView(pPickObj, *pPV, pOleObj.get() ); + else + bRet = mpView->InsertObjectAtView(pOleObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER); + + if (bRet && !comphelper::LibreOfficeKit::isActive()) + { + // Let the chart be activated after the inserting (unless + // via LibreOfficeKit) + if (nSlotId == SID_INSERT_DIAGRAM) + { + pOleObj->SetProgName( "StarChart"); + } + else if (nSlotId == SID_ATTR_TABLE) + { + pOleObj->SetProgName( "StarCalc" ); + } + else if (nSlotId == SID_INSERT_MATH) + { + pOleObj->SetProgName( "StarMath" ); + } + + pOleObj->SetLogicRect(aRect); + Size aTmp( OutputDevice::LogicToLogic(aRect.GetSize(), MapMode(MapUnit::Map100thMM), MapMode(aUnit)) ); + awt::Size aVisualSize; + aVisualSize.Width = aTmp.Width(); + aVisualSize.Height = aTmp.Height(); + xObj->setVisualAreaSize( nAspect, aVisualSize ); + mpViewShell->ActivateObject(pOleObj.get(), embed::EmbedVerbs::MS_OLEVERB_SHOW); + + if (nSlotId == SID_INSERT_DIAGRAM) + { + // note, that this call modified the chart model which + // results in a change notification. So call this after + // everything else is finished. + ChartHelper::AdaptDefaultsForChart( xObj ); + } + } + } + else + { + ErrorHandler::HandleError(ErrCodeMsg(ERRCODE_SFX_OLEGENERAL)); + } + } + else + { + // insert object + sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; + bool bCreateNew = false; + uno::Reference < embed::XEmbeddedObject > xObj; + uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage(); + SvObjectServerList aServerLst; + OUString aName; + + OUString aIconMediaType; + uno::Reference< io::XInputStream > xIconMetaFile; + + const SfxGlobalNameItem* pNameItem = rReq.GetArg(SID_INSERT_OBJECT); + if ( nSlotId == SID_INSERT_OBJECT && pNameItem ) + { + const SvGlobalName& aClassName = pNameItem->GetValue(); + xObj = mpViewShell->GetViewFrame()->GetObjectShell()-> + GetEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aName ); + } + else + { + switch ( nSlotId ) + { + case SID_INSERT_OBJECT : + { + if (officecfg::Office::Common::Security::Scripting::DisableActiveContent::get()) + { + std::unique_ptr xError( + Application::CreateMessageDialog( + nullptr, VclMessageType::Warning, VclButtonsType::Ok, + SvtResId(STR_WARNING_ACTIVE_CONTENT_DISABLED))); + xError->run(); + break; + } + aServerLst.FillInsertObjects(); + if (mpDoc->GetDocumentType() == DocumentType::Draw) + { + aServerLst.Remove( GraphicDocShell::Factory().GetClassId() ); + } + else + { + aServerLst.Remove( DrawDocShell::Factory().GetClassId() ); + } + + [[fallthrough]]; + } + case SID_INSERT_FLOATINGFRAME : + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( + pFact->CreateInsertObjectDialog( mpViewShell->GetFrameWeld(), SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommand(), + xStorage, &aServerLst )); + pDlg->Execute(); + bCreateNew = pDlg->IsCreateNew(); + xObj = pDlg->GetObject(); + + xIconMetaFile = pDlg->GetIconIfIconified( &aIconMediaType ); + if ( xIconMetaFile.is() ) + nAspect = embed::Aspects::MSOLE_ICON; + + if ( xObj.is() ) + mpViewShell->GetObjectShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName ); + + break; + } + } + } + + try + { + if (xObj.is()) + { + bool bInsertNewObject = true; + + Size aSize; + MapUnit aMapUnit = MapUnit::Map100thMM; + if ( nAspect != embed::Aspects::MSOLE_ICON ) + { + awt::Size aSz; + try + { + aSz = xObj->getVisualAreaSize( nAspect ); + } + catch( embed::NoVisualAreaSizeException& ) + { + // the default size will be set later + } + + aSize =Size( aSz.Width, aSz.Height ); + + aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); + if (aSize.IsEmpty()) + { + // rectangle with balanced edge ratio + aSize.setWidth( 14100 ); + aSize.setHeight( 10000 ); + Size aTmp = OutputDevice::LogicToLogic(aSize, MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)); + aSz.Width = aTmp.Width(); + aSz.Height = aTmp.Height(); + xObj->setVisualAreaSize( nAspect, aSz ); + } + else + { + aSize = OutputDevice::LogicToLogic(aSize, MapMode(aMapUnit), MapMode(MapUnit::Map100thMM)); + } + } + + if ( mpView->AreObjectsMarked() ) + { + // as an empty OLE object available? + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + if (pObj->GetObjInventor() == SdrInventor::Default && + pObj->GetObjIdentifier() == SdrObjKind::OLE2) + { + if ( !static_cast(pObj)->GetObjRef().is() ) + { + // the empty OLE object gets a new IPObj + bInsertNewObject = false; + pObj->SetEmptyPresObj(false); + static_cast(pObj)->SetOutlinerParaObject(std::nullopt); + static_cast(pObj)->SetObjRef(xObj); + static_cast(pObj)->SetPersistName(aName); + static_cast(pObj)->SetName(aName); + static_cast(pObj)->SetAspect(nAspect); + ::tools::Rectangle aRect = static_cast(pObj)->GetLogicRect(); + + if ( nAspect == embed::Aspects::MSOLE_ICON ) + { + if( xIconMetaFile.is() ) + static_cast(pObj)->SetGraphicToObj( xIconMetaFile, aIconMediaType ); + } + else + { + Size aTmp = OutputDevice::LogicToLogic(aRect.GetSize(), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)); + awt::Size aSz( aTmp.Width(), aTmp.Height() ); + xObj->setVisualAreaSize( nAspect, aSz ); + } + } + } + } + } + + if (bInsertNewObject) + { + // we create a new OLE object + SdrPageView* pPV = mpView->GetSdrPageView(); + Size aPageSize = pPV->GetPage()->GetSize(); + + // get the size from the iconified object + ::svt::EmbeddedObjectRef aObjRef( xObj, nAspect ); + if ( nAspect == embed::Aspects::MSOLE_ICON ) + { + aObjRef.SetGraphicStream( xIconMetaFile, aIconMediaType ); + MapMode aMapMode( MapUnit::Map100thMM ); + aSize = aObjRef.GetSize( &aMapMode ); + } + + Point aPnt ((aPageSize.Width() - aSize.Width()) / 2, + (aPageSize.Height() - aSize.Height()) / 2); + ::tools::Rectangle aRect (aPnt, aSize); + rtl::Reference pObj = new SdrOle2Obj( + mpView->getSdrModelFromSdrView(), + aObjRef, + aName, + aRect); + + if( mpView->InsertObjectAtView(pObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER) ) + { + // Math objects change their object size during InsertObject. + // New size must be set in SdrObject, or a wrong scale will be set at + // ActivateObject. + + if ( nAspect != embed::Aspects::MSOLE_ICON ) + { + try + { + awt::Size aSz = xObj->getVisualAreaSize( nAspect ); + + Size aNewSize = OutputDevice::LogicToLogic( Size( aSz.Width, aSz.Height ), + MapMode( aMapUnit ), MapMode( MapUnit::Map100thMM ) ); + if ( aNewSize != aSize ) + { + aRect.SetSize( aNewSize ); + pObj->SetLogicRect( aRect ); + } + } + catch( embed::NoVisualAreaSizeException& ) + {} + } + + if (bCreateNew) + { + pObj->SetLogicRect(aRect); + + if ( nAspect != embed::Aspects::MSOLE_ICON ) + { + Size aTmp = OutputDevice::LogicToLogic(aRect.GetSize(), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)); + awt::Size aSz( aTmp.Width(), aTmp.Height() ); + xObj->setVisualAreaSize( nAspect, aSz ); + } + + mpViewShell->ActivateObject(pObj.get(), embed::EmbedVerbs::MS_OLEVERB_SHOW); + } + + Size aVisSizePixel = mpWindow->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = mpWindow->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + mpViewShell->VisAreaChanged(aVisAreaWin); + mpDocSh->SetVisArea(aVisAreaWin); + } + } + } + } + catch (uno::Exception&) + { + // For some reason the object can not be inserted. For example + // because it is password protected and is not properly unlocked. + } + } +} + +FuInsertAVMedia::FuInsertAVMedia( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuInsertAVMedia::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuInsertAVMedia( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuInsertAVMedia::DoExecute( SfxRequest& rReq ) +{ +#if HAVE_FEATURE_AVMEDIA + OUString aURL; + const SfxItemSet* pReqArgs = rReq.GetArgs(); + bool bAPI = false; + + const SvxSizeItem* pSizeItem = rReq.GetArg(FN_PARAM_1); + const SfxBoolItem* pLinkItem = rReq.GetArg(FN_PARAM_2); + const bool bSizeUnknown = !pSizeItem; + Size aPrefSize; + + if( pReqArgs ) + { + const SfxStringItem* pStringItem = dynamic_cast( &pReqArgs->Get( rReq.GetSlot() ) ); + + if( pStringItem ) + { + aURL = pStringItem->GetValue(); + bAPI = !aURL.isEmpty(); + } + } + + bool bLink(pLinkItem ? pLinkItem->GetValue() : true); + if (!(bAPI + || ::avmedia::MediaWindow::executeMediaURLDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr, aURL, & bLink) + )) + return; + + if (!bSizeUnknown) + { + aPrefSize = pSizeItem->GetSize(); + } + else + { + // If we don't have a size then try and find that out, the resulted might be deliver async, so dispatch a follow up + // effort to insert the video, this time with a size. + if( mpWindow ) + mpWindow->EnterWait(); + + css::uno::Reference xDispatchProvider(mpViewShell->GetViewFrame()->GetFrame().GetFrameInterface(), css::uno::UNO_QUERY); + + rtl::Reference xPlayerListener(new avmedia::PlayerListener( + [xDispatchProvider, aURL, bLink](const css::uno::Reference& rPlayer){ + css::awt::Size aSize = rPlayer->getPreferredPlayerWindowSize(); + avmedia::MediaWindow::dispatchInsertAVMedia(xDispatchProvider, aSize, aURL, bLink); + })); + + const bool bIsMediaURL = ::avmedia::MediaWindow::isMediaURL(aURL, "", true, xPlayerListener); + + if( mpWindow ) + mpWindow->LeaveWait(); + + if (!bIsMediaURL && !bAPI) + ::avmedia::MediaWindow::executeFormatErrorBox(mpWindow->GetFrameWeld()); + + return; + } + + InsertMediaURL(aURL, aPrefSize, bLink); + +#else + (void)rReq; +#endif +} + +#if HAVE_FEATURE_AVMEDIA +void FuInsertAVMedia::InsertMediaURL(const OUString& rURL, const Size& rPrefSize, bool bLink) +{ + if( mpWindow ) + mpWindow->EnterWait(); + + Point aPos; + Size aSize; + sal_Int8 nAction = DND_ACTION_COPY; + + if (rPrefSize.Width() && rPrefSize.Height()) + { + if( mpWindow ) + aSize = mpWindow->PixelToLogic(rPrefSize, MapMode(MapUnit::Map100thMM)); + else + aSize = Application::GetDefaultDevice()->PixelToLogic(rPrefSize, MapMode(MapUnit::Map100thMM)); + } + else + aSize = Size( 5000, 5000 ); + + if( mpWindow ) + { + aPos = mpWindow->PixelToLogic( ::tools::Rectangle( aPos, mpWindow->GetOutputSizePixel() ).Center() ); + aPos.AdjustX( -(aSize.Width() >> 1) ); + aPos.AdjustY( -(aSize.Height() >> 1) ); + } + + mpView->InsertMediaURL(rURL, nAction, aPos, aSize, bLink); + + if( mpWindow ) + mpWindow->LeaveWait(); +} +#endif + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuinsfil.cxx b/sd/source/ui/func/fuinsfil.cxx new file mode 100644 index 0000000000..790c3d0c8d --- /dev/null +++ b/sd/source/ui/func/fuinsfil.cxx @@ -0,0 +1,724 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::ui::dialogs; +using namespace ::com::sun::star; + +typedef ::std::pair< OUString, OUString > FilterDesc; + +namespace +{ + +OUString lcl_GetExtensionsList ( ::std::vector< FilterDesc > const& rFilterDescList ) +{ + OUStringBuffer aExtensions; + + for (const auto& rFilterDesc : rFilterDescList) + { + OUString sWildcard = rFilterDesc.second; + + if ( aExtensions.indexOf( sWildcard ) == -1 ) + { + if ( !aExtensions.isEmpty() ) + aExtensions.append(";"); + aExtensions.append(sWildcard); + } + + } + + return aExtensions.makeStringAndClear(); +} + +void lcl_AddFilter ( ::std::vector< FilterDesc >& rFilterDescList, + const std::shared_ptr& pFilter ) +{ + if (pFilter) + rFilterDescList.emplace_back( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); +} + +} + +namespace sd { + + +FuInsertFile::FuInsertFile ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuInsertFile::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuInsertFile( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuInsertFile::DoExecute( SfxRequest& rReq ) +{ + SfxFilterMatcher& rMatcher = SfxGetpApp()->GetFilterMatcher(); + ::std::vector< FilterDesc > aFilterVector; + ::std::vector< OUString > aOtherFilterVector; + const SfxItemSet* pArgs = rReq.GetArgs (); + + FuInsertFile::GetSupportedFilterVector( aOtherFilterVector ); + + if (!pArgs) + { + sfx2::FileDialogHelper aFileDialog( + ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, + FileDialogFlags::Insert, mpWindow ? mpWindow->GetFrameWeld() : nullptr); + aFileDialog.SetContext(sfx2::FileDialogHelper::DrawImpressInsertFile); + Reference< XFilePicker > xFilePicker( aFileDialog.GetFilePicker() ); + Reference< XFilterManager > xFilterManager( xFilePicker, UNO_QUERY ); + OUString aOwnCont; + OUString aOtherCont; + + aFileDialog.SetTitle( SdResId(STR_DLG_INSERT_PAGES_FROM_FILE) ); + + if( mpDoc->GetDocumentType() == DocumentType::Impress ) + { + aOwnCont = "simpress"; + aOtherCont = "sdraw"; + } + else + { + aOtherCont = "simpress"; + aOwnCont = "sdraw" ; + } + + SfxFilterMatcher aMatch( aOwnCont ); + + if( xFilterManager.is() ) + { + // Get filter for current format + try + { + // Get main filter + std::shared_ptr pFilter = SfxFilter::GetDefaultFilterFromFactory( aOwnCont ); + lcl_AddFilter( aFilterVector, pFilter ); + + // get template filter + if( mpDoc->GetDocumentType() == DocumentType::Impress ) + pFilter = DrawDocShell::Factory().GetTemplateFilter(); + else + pFilter = GraphicDocShell::Factory().GetTemplateFilter(); + lcl_AddFilter( aFilterVector, pFilter ); + + // get cross filter + pFilter = SfxFilter::GetDefaultFilterFromFactory( aOtherCont ); + lcl_AddFilter( aFilterVector, pFilter ); + + // get Powerpoint filter + pFilter = aMatch.GetFilter4Extension( ".ppt" ); + lcl_AddFilter( aFilterVector, pFilter ); + + // Get other draw/impress filters + pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARIMPRESS_60, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH ); + lcl_AddFilter( aFilterVector, pFilter ); + + pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARIMPRESS_60, SfxFilterFlags::TEMPLATEPATH ); + lcl_AddFilter( aFilterVector, pFilter ); + + pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW_60, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH ); + lcl_AddFilter( aFilterVector, pFilter ); + + pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW_60, SfxFilterFlags::TEMPLATEPATH ); + lcl_AddFilter( aFilterVector, pFilter ); + + pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH ); + lcl_AddFilter( aFilterVector, pFilter ); + + pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW, SfxFilterFlags::TEMPLATEPATH ); + lcl_AddFilter( aFilterVector, pFilter ); + + // add additional supported filters + for( const auto& rOtherFilter : aOtherFilterVector ) + { + if( ( pFilter = rMatcher.GetFilter4Mime( rOtherFilter ) ) != nullptr ) + lcl_AddFilter( aFilterVector, pFilter ); + } + + // set "All supported formats" as the default filter + OUString aAllSpec( SdResId( STR_ALL_SUPPORTED_FORMATS ) ); + OUString aExtensions = lcl_GetExtensionsList( aFilterVector ); + OUString aGUIName = aAllSpec + " (" + aExtensions + ")"; + + xFilterManager->appendFilter( aGUIName, aExtensions ); + xFilterManager->setCurrentFilter( aAllSpec ); + + // append individual filters + for( const auto& rFilter : aFilterVector ) + { + xFilterManager->appendFilter( rFilter.first, rFilter.second ); + } + + // end with "All files" as fallback + xFilterManager->appendFilter( SdResId( STR_ALL_FILES ), "*.*" ); + } + catch (const IllegalArgumentException&) + { + } + } + + if( aFileDialog.Execute() != ERRCODE_NONE ) + return; + else + { + aFilterName = aFileDialog.GetCurrentFilter(); + aFile = aFileDialog.GetPath(); + } + } + else + { + const SfxStringItem* pFileName = rReq.GetArg(ID_VAL_DUMMY0); + assert(pFileName && "must be present"); + aFile = pFileName->GetValue(); + if (const SfxStringItem* pFilterName = rReq.GetArg(ID_VAL_DUMMY1)) + aFilterName = pFilterName->GetValue(); + } + + mpDocSh->SetWaitCursor( true ); + + std::unique_ptr xMedium(new SfxMedium(aFile, StreamMode::READ | StreamMode::NOCREATE)); + std::shared_ptr pFilter; + + SfxGetpApp()->GetFilterMatcher().GuessFilter(*xMedium, pFilter); + + bool bDrawMode = dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr; + bool bInserted = false; + + if( pFilter ) + { + xMedium->SetFilter( pFilter ); + aFilterName = pFilter->GetFilterName(); + + if( xMedium->IsStorage() || ( xMedium->GetInStream() && SotStorage::IsStorageFile( xMedium->GetInStream() ) ) ) + { + if ( pFilter->GetServiceName() == "com.sun.star.presentation.PresentationDocument" || + pFilter->GetServiceName() == "com.sun.star.drawing.DrawingDocument" ) + { + // Draw, Impress or PowerPoint document + // the ownership of the Medium is transferred + if( bDrawMode ) + InsSDDinDrMode(xMedium.release()); + else + InsSDDinOlMode(xMedium.release()); + + // ownership of pMedium has changed in this case + bInserted = true; + } + } + else + { + bool bFound = ( ::std::find( aOtherFilterVector.begin(), aOtherFilterVector.end(), pFilter->GetMimeType() ) != aOtherFilterVector.end() ); + if( !bFound && + ( aFilterName.indexOf( "Text" ) != -1 || + aFilterName.indexOf( "Rich" ) != -1 || + aFilterName.indexOf( "RTF" ) != -1 || + aFilterName.indexOf( "HTML" ) != -1 ) ) + { + bFound = true; + } + + if( bFound ) + { + if( bDrawMode ) + InsTextOrRTFinDrMode(xMedium.get()); + else + InsTextOrRTFinOlMode(xMedium.get()); + + bInserted = true; + xMedium.reset(); + } + } + } + + mpDocSh->SetWaitCursor( false ); + + if( !bInserted ) + { + std::unique_ptr xErrorBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR))); + xErrorBox->run(); + } +} + +bool FuInsertFile::InsSDDinDrMode(SfxMedium* pMedium) +{ + bool bOK = false; + + mpDocSh->SetWaitCursor( false ); + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + weld::Window* pParent = mpViewShell ? mpViewShell->GetFrameWeld() : nullptr; + ScopedVclPtr pDlg( pFact->CreateSdInsertPagesObjsDlg(pParent, mpDoc, pMedium, aFile) ); + + sal_uInt16 nRet = pDlg->Execute(); + + mpDocSh->SetWaitCursor( true ); + + if( nRet == RET_OK ) + { + /* list with page names (if NULL, then all pages) + First, insert pages */ + std::vector aBookmarkList = pDlg->GetList( 1 ); // pages + bool bLink = pDlg->IsLink(); + SdPage* pPage = nullptr; + ::sd::View* pView = mpViewShell ? mpViewShell->GetView() : nullptr; + + if (pView) + { + if( auto pOutlineView = dynamic_cast( pView )) + { + pPage = pOutlineView->GetActualPage(); + } + else + { + pPage = static_cast(pView->GetSdrPageView()->GetPage()); + } + } + + sal_uInt16 nPos = 0xFFFF; + + if (pPage && !pPage->IsMasterPage()) + { + if (pPage->GetPageKind() == PageKind::Standard) + { + nPos = pPage->GetPageNum() + 2; + } + else if (pPage->GetPageKind() == PageKind::Notes) + { + nPos = pPage->GetPageNum() + 1; + } + } + + bool bNameOK; + std::vector aExchangeList; + std::vector aObjectBookmarkList = pDlg->GetList( 2 ); // objects + + /* if pBookmarkList is NULL, we insert selected pages, and/or selected + objects or everything. */ + if( !aBookmarkList.empty() || aObjectBookmarkList.empty() ) + { + /* To ensure that all page names are unique, we check the ones we + want to insert and insert them into a substitution list if + necessary. + bNameOK is sal_False if the user has canceled. */ + bNameOK = mpView->GetExchangeList( aExchangeList, aBookmarkList, 0 ); + + if( bNameOK ) + bOK = mpDoc->InsertBookmarkAsPage( aBookmarkList, &aExchangeList, + bLink, false/*bReplace*/, nPos, + false, nullptr, true, true, false ); + + aBookmarkList.clear(); + aExchangeList.clear(); + } + + // to ensure ... (see above) + bNameOK = mpView->GetExchangeList( aExchangeList, aObjectBookmarkList, 1 ); + + if( bNameOK ) + bOK = mpDoc->InsertBookmarkAsObject( aObjectBookmarkList, aExchangeList, + nullptr, nullptr, false ); + + if( pDlg->IsRemoveUnnecessaryMasterPages() ) + mpDoc->RemoveUnnecessaryMasterPages(); + } + + return bOK; +} + +void FuInsertFile::InsTextOrRTFinDrMode(SfxMedium* pMedium) +{ + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreateSdInsertPagesObjsDlg(mpViewShell->GetFrameWeld(), mpDoc, nullptr, aFile) ); + + mpDocSh->SetWaitCursor( false ); + + sal_uInt16 nRet = pDlg->Execute(); + mpDocSh->SetWaitCursor( true ); + + if( nRet != RET_OK ) + return; + + // selected file format: text, RTF or HTML (default is text) + EETextFormat nFormat = EETextFormat::Text; + + if( aFilterName.indexOf( "Rich") != -1 ) + nFormat = EETextFormat::Rtf; + else if( aFilterName.indexOf( "HTML" ) != -1 ) + nFormat = EETextFormat::Html; + + /* create our own outline since: + - it is possible that the document outliner is actually used in the + structuring mode + - the draw outliner of the drawing engine has to draw something in + between + - the global outliner could be used in SdPage::CreatePresObj */ + SdOutliner aOutliner( mpDoc, OutlinerMode::TextObject ); + + // set reference device + aOutliner.SetRefDevice( SD_MOD()->GetVirtualRefDevice() ); + + SdPage* pPage = static_cast(mpViewShell)->GetActualPage(); + aLayoutName = pPage->GetLayoutName(); + sal_Int32 nIndex = aLayoutName.indexOf(SD_LT_SEPARATOR); + if( nIndex != -1 ) + aLayoutName = aLayoutName.copy(0, nIndex); + + aOutliner.SetPaperSize(pPage->GetSize()); + + SvStream* pStream = pMedium->GetInStream(); + assert(pStream && "No InStream!"); + pStream->Seek( 0 ); + + ErrCode nErr = aOutliner.Read( *pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes() ); + + if (nErr || aOutliner.GetEditEngine().GetText().isEmpty()) + { + std::unique_ptr xErrorBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR))); + xErrorBox->run(); + } + else + { + // is it a master page? + if (static_cast(mpViewShell)->GetEditMode() == EditMode::MasterPage && + !pPage->IsMasterPage()) + { + pPage = static_cast(&(pPage->TRG_GetMasterPage())); + } + + assert(pPage && "page not found"); + + // if editing is going on right now, let it flow into this text object + OutlinerView* pOutlinerView = mpView->GetTextEditOutlinerView(); + if( pOutlinerView ) + { + SdrObject* pObj = mpView->GetTextEditObject(); + if( pObj && + pObj->GetObjInventor() == SdrInventor::Default && + pObj->GetObjIdentifier() == SdrObjKind::TitleText && + aOutliner.GetParagraphCount() > 1 ) + { + // in title objects, only one paragraph is allowed + while ( aOutliner.GetParagraphCount() > 1 ) + { + Paragraph* pPara = aOutliner.GetParagraph( 0 ); + sal_uLong nLen = aOutliner.GetText( pPara ).getLength(); + aOutliner.QuickDelete( ESelection( 0, nLen, 1, 0 ) ); + aOutliner.QuickInsertLineBreak( ESelection( 0, nLen, 0, nLen ) ); + } + } + } + + std::optional pOPO = aOutliner.CreateParaObject(); + + if (pOutlinerView) + { + pOutlinerView->InsertText(*pOPO); + } + else + { + rtl::Reference pTO = new SdrRectObj( + mpView->getSdrModelFromSdrView(), + SdrObjKind::Text); + pTO->SetOutlinerParaObject(std::move(pOPO)); + + const bool bUndo = mpView->IsUndoEnabled(); + if( bUndo ) + mpView->BegUndo(SdResId(STR_UNDO_INSERT_TEXTFRAME)); + pPage->InsertObject(pTO.get()); + + /* can be bigger as the maximal allowed size: + limit object size if necessary */ + Size aSize(aOutliner.CalcTextSize()); + Size aMaxSize = mpDoc->GetMaxObjSize(); + aSize.setHeight( std::min(aSize.Height(), aMaxSize.Height()) ); + aSize.setWidth( std::min(aSize.Width(), aMaxSize.Width()) ); + aSize = mpWindow->LogicToPixel(aSize); + + // put it at the center of the window + Size aTemp(mpWindow->GetOutputSizePixel()); + Point aPos(aTemp.Width() / 2, aTemp.Height() / 2); + aPos.AdjustX( -(aSize.Width() / 2) ); + aPos.AdjustY( -(aSize.Height() / 2) ); + aSize = mpWindow->PixelToLogic(aSize); + aPos = mpWindow->PixelToLogic(aPos); + pTO->SetLogicRect(::tools::Rectangle(aPos, aSize)); + + if (pDlg->IsLink()) + { + pTO->SetTextLink(aFile, aFilterName ); + } + + if( bUndo ) + { + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoInsertObject(*pTO)); + mpView->EndUndo(); + } + } + } +} + +void FuInsertFile::InsTextOrRTFinOlMode(SfxMedium* pMedium) +{ + // selected file format: text, RTF or HTML (default is text) + EETextFormat nFormat = EETextFormat::Text; + + if( aFilterName.indexOf( "Rich") != -1 ) + nFormat = EETextFormat::Rtf; + else if( aFilterName.indexOf( "HTML" ) != -1 ) + nFormat = EETextFormat::Html; + + ::Outliner& rDocliner = static_cast(mpView)->GetOutliner(); + + std::vector aSelList; + rDocliner.GetView(0)->CreateSelectionList(aSelList); + + Paragraph* pPara = aSelList.empty() ? nullptr : *(aSelList.begin()); + + // what should we insert? + while (pPara && !Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE)) + pPara = rDocliner.GetParent(pPara); + + sal_Int32 nTargetPos = rDocliner.GetAbsPos(pPara) + 1; + + // apply layout of predecessor page + sal_uInt16 nPage = 0; + pPara = rDocliner.GetParagraph( rDocliner.GetAbsPos( pPara ) - 1 ); + while (pPara) + { + sal_Int32 nPos = rDocliner.GetAbsPos( pPara ); + if ( Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) ) + nPage++; + pPara = rDocliner.GetParagraph( nPos - 1 ); + } + SdPage* pPage = mpDoc->GetSdPage(nPage, PageKind::Standard); + aLayoutName = pPage->GetLayoutName(); + sal_Int32 nIndex = aLayoutName.indexOf(SD_LT_SEPARATOR); + if( nIndex != -1 ) + aLayoutName = aLayoutName.copy(0, nIndex); + + /* create our own outline since: + - it is possible that the document outliner is actually used in the + structuring mode + - the draw outliner of the drawing engine has to draw something in + between + - the global outliner could be used in SdPage::CreatePresObj */ + ::Outliner aOutliner( &mpDoc->GetItemPool(), OutlinerMode::OutlineObject ); + aOutliner.SetStyleSheetPool(static_cast(mpDoc->GetStyleSheetPool())); + + // set reference device + aOutliner.SetRefDevice(SD_MOD()->GetVirtualRefDevice()); + aOutliner.SetPaperSize(Size(0x7fffffff, 0x7fffffff)); + + SvStream* pStream = pMedium->GetInStream(); + DBG_ASSERT( pStream, "No InStream!" ); + pStream->Seek( 0 ); + + ErrCode nErr = aOutliner.Read(*pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes()); + + if (nErr || aOutliner.GetEditEngine().GetText().isEmpty()) + { + std::unique_ptr xErrorBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR))); + xErrorBox->run(); + } + else + { + sal_Int32 nParaCount = aOutliner.GetParagraphCount(); + + // for progress bar: number of level-0-paragraphs + sal_uInt16 nNewPages = 0; + pPara = aOutliner.GetParagraph( 0 ); + while (pPara) + { + sal_Int32 nPos = aOutliner.GetAbsPos( pPara ); + if( Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) ) + nNewPages++; + pPara = aOutliner.GetParagraph( ++nPos ); + } + + mpDocSh->SetWaitCursor( false ); + + std::optional pProgress( std::in_place, mpDocSh, SdResId(STR_CREATE_PAGES), nNewPages); + pProgress->SetState( 0, 100 ); + + nNewPages = 0; + + ViewShellId nViewShellId = mpViewShell ? mpViewShell->GetViewShellBase().GetViewShellId() : ViewShellId(-1); + rDocliner.GetUndoManager().EnterListAction( + SdResId(STR_UNDO_INSERT_FILE), OUString(), 0, nViewShellId ); + + sal_Int32 nSourcePos = 0; + SfxStyleSheet* pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Outline ); + Paragraph* pSourcePara = aOutliner.GetParagraph( 0 ); + while (pSourcePara) + { + sal_Int32 nPos = aOutliner.GetAbsPos( pSourcePara ); + sal_Int16 nDepth = aOutliner.GetDepth( nPos ); + + // only take the last paragraph if it is filled + if (nSourcePos < nParaCount - 1 || + !aOutliner.GetText(pSourcePara).isEmpty()) + { + rDocliner.Insert( aOutliner.GetText(pSourcePara), nTargetPos, nDepth ); + OUString aStyleSheetName( pStyleSheet->GetName() ); + aStyleSheetName = aStyleSheetName.subView( 0, aStyleSheetName.getLength()-1 ) + + OUString::number( nDepth <= 0 ? 1 : nDepth+1 ); + SfxStyleSheetBasePool* pStylePool = mpDoc->GetStyleSheetPool(); + SfxStyleSheet* pOutlStyle = static_cast( pStylePool->Find( aStyleSheetName, pStyleSheet->GetFamily() ) ); + rDocliner.SetStyleSheet( nTargetPos, pOutlStyle ); + } + + if( Outliner::HasParaFlag( pSourcePara, ParaFlag::ISPAGE ) ) + { + nNewPages++; + pProgress->SetState( nNewPages ); + } + + pSourcePara = aOutliner.GetParagraph( ++nPos ); + nTargetPos++; + nSourcePos++; + } + + rDocliner.GetUndoManager().LeaveListAction(); + + pProgress.reset(); + + mpDocSh->SetWaitCursor( true ); + } +} + +bool FuInsertFile::InsSDDinOlMode(SfxMedium* pMedium) +{ + OutlineView* pOlView = static_cast(mpView); + + // transfer Outliner content to SdDrawDocument + pOlView->PrepareClose(); + + // read in like in the character mode + if (InsSDDinDrMode(pMedium)) + { + ::Outliner* pOutliner = pOlView->GetViewByWindow(mpWindow)->GetOutliner(); + + // cut notification links temporarily + Link aOldParagraphInsertedHdl = pOutliner->GetParaInsertedHdl(); + pOutliner->SetParaInsertedHdl( Link()); + Link aOldParagraphRemovingHdl = pOutliner->GetParaRemovingHdl(); + pOutliner->SetParaRemovingHdl( Link()); + Link aOldDepthChangedHdl = pOutliner->GetDepthChangedHdl(); + pOutliner->SetDepthChangedHdl( Link<::Outliner::DepthChangeHdlParam,void>()); + Link<::Outliner*,void> aOldBeginMovingHdl = pOutliner->GetBeginMovingHdl(); + pOutliner->SetBeginMovingHdl( Link<::Outliner*,void>()); + Link<::Outliner*,void> aOldEndMovingHdl = pOutliner->GetEndMovingHdl(); + pOutliner->SetEndMovingHdl( Link<::Outliner*,void>()); + + Link aOldStatusEventHdl = pOutliner->GetStatusEventHdl(); + pOutliner->SetStatusEventHdl(Link()); + + pOutliner->Clear(); + pOlView->FillOutliner(); + + // set links again + pOutliner->SetParaInsertedHdl(aOldParagraphInsertedHdl); + pOutliner->SetParaRemovingHdl(aOldParagraphRemovingHdl); + pOutliner->SetDepthChangedHdl(aOldDepthChangedHdl); + pOutliner->SetBeginMovingHdl(aOldBeginMovingHdl); + pOutliner->SetEndMovingHdl(aOldEndMovingHdl); + pOutliner->SetStatusEventHdl(aOldStatusEventHdl); + + return true; + } + else + return false; +} + +void FuInsertFile::GetSupportedFilterVector( ::std::vector< OUString >& rFilterVector ) +{ + SfxFilterMatcher& rMatcher = SfxGetpApp()->GetFilterMatcher(); + std::shared_ptr pSearchFilter; + + rFilterVector.clear(); + + if( ( pSearchFilter = rMatcher.GetFilter4Mime( "text/plain" )) != nullptr ) + rFilterVector.push_back( pSearchFilter->GetMimeType() ); + + if( ( pSearchFilter = rMatcher.GetFilter4Mime( "application/rtf" ) ) != nullptr ) + rFilterVector.push_back( pSearchFilter->GetMimeType() ); + + if( ( pSearchFilter = rMatcher.GetFilter4Mime( "text/html" ) ) != nullptr ) + rFilterVector.push_back( pSearchFilter->GetMimeType() ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuline.cxx b/sd/source/ui/func/fuline.cxx new file mode 100644 index 0000000000..da9cc795fd --- /dev/null +++ b/sd/source/ui/func/fuline.cxx @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuLine::FuLine ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuLine::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuLine( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuLine::DoExecute( SfxRequest& rReq ) +{ + rReq.Ignore(); + + const SfxItemSet* pArgs = rReq.GetArgs(); + if (pArgs) + return; + + const SdrObject* pObj = nullptr; + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + SfxItemSet aNewAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aNewAttr ); + + bool bHasMarked = mpView->AreObjectsMarked(); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + VclPtr pDlg( pFact->CreateSvxLineTabDialog(mpViewShell->GetFrameWeld(), &aNewAttr, mpDoc, pObj, bHasMarked) ); + + pDlg->StartExecuteAsync([pDlg, this](sal_Int32 nResult){ + if (nResult == RET_OK) + { + mpView->SetAttributes (*(pDlg->GetOutputItemSet ())); + + // some attributes are changed, we have to update the listboxes in the objectbars + static const sal_uInt16 SidArray[] = { + SID_ATTR_LINE_STYLE, // ( SID_SVX_START + 169 ) + SID_ATTR_LINE_DASH, // ( SID_SVX_START + 170 ) + SID_ATTR_LINE_WIDTH, // ( SID_SVX_START + 171 ) + SID_ATTR_LINE_COLOR, // ( SID_SVX_START + 172 ) + SID_ATTR_LINE_START, // ( SID_SVX_START + 173 ) + SID_ATTR_LINE_END, // ( SID_SVX_START + 174 ) + SID_ATTR_LINE_TRANSPARENCE, // (SID_SVX_START+1107) + SID_ATTR_LINE_JOINT, // (SID_SVX_START+1110) + SID_ATTR_LINE_CAP, // (SID_SVX_START+1111) + 0 }; + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + } + + // deferred until the dialog ends + mpViewShell->Cancel(); + + pDlg->disposeOnce(); + }); +} + +void FuLine::Activate() +{ +} + +void FuLine::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fulinend.cxx b/sd/source/ui/func/fulinend.cxx new file mode 100644 index 0000000000..26ae109e02 --- /dev/null +++ b/sd/source/ui/func/fulinend.cxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuLineEnd::FuLineEnd(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuLineEnd::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuLineEnd( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuLineEnd::DoExecute( SfxRequest& ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if( rMarkList.GetMarkCount() != 1 ) + return; + + const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + const SdrObject* pNewObj; + rtl::Reference pConvPolyObj; + + if( dynamic_cast< const SdrPathObj *>( pObj ) != nullptr ) + { + pNewObj = pObj; + } + else + { + SdrObjTransformInfoRec aInfoRec; + pObj->TakeObjInfo( aInfoRec ); + + if( aInfoRec.bCanConvToPath && + pObj->GetObjInventor() == SdrInventor::Default && + pObj->GetObjIdentifier() != SdrObjKind::Group ) + // bCanConvToPath is sal_True for group objects, + // but it crashes on ConvertToPathObj()! + { + pConvPolyObj = pObj->ConvertToPolyObj( true, false ); + pNewObj = pConvPolyObj.get(); + + if( !pNewObj || dynamic_cast< const SdrPathObj *>( pNewObj ) == nullptr ) + return; // Cancel, additional security, but it does not help + // for group objects + } + else return; // Cancel + } + + const ::basegfx::B2DPolyPolygon aPolyPolygon = static_cast(pNewObj)->GetPathPoly(); + + // Delete the created poly-object + pConvPolyObj.clear(); + + XLineEndListRef pLineEndList = mpDoc->GetLineEndList(); + + OUString aNewName( SdResId( STR_LINEEND ) ); + OUString aDesc( SdResId( STR_DESC_LINEEND ) ); + OUString aName; + + ::tools::Long nCount = pLineEndList->Count(); + ::tools::Long j = 1; + bool bDifferent = false; + + while( !bDifferent ) + { + aName = aNewName + " " + OUString::number(j++); + bDifferent = true; + for( ::tools::Long i = 0; i < nCount && bDifferent; i++ ) + { + if( aName == pLineEndList->GetLineEnd( i )->GetName() ) + bDifferent = false; + } + } + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreateSvxNameDialog( nullptr, aName, aDesc ) ); + + pDlg->SetEditHelpId( HID_SD_NAMEDIALOG_LINEEND ); + + if( pDlg->Execute() != RET_OK ) + return; + + pDlg->GetName( aName ); + bDifferent = true; + + for( ::tools::Long i = 0; i < nCount && bDifferent; i++ ) + { + if( aName == pLineEndList->GetLineEnd( i )->GetName() ) + bDifferent = false; + } + + if( bDifferent ) + { + pLineEndList->Insert(std::make_unique(aPolyPolygon, aName)); + } + else + { + std::unique_ptr xWarn(Application::CreateMessageDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr, + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_WARN_NAME_DUPLICATE))); + xWarn->run(); + } +} + +void FuLineEnd::Activate() +{ +} + +void FuLineEnd::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fulink.cxx b/sd/source/ui/func/fulink.cxx new file mode 100644 index 0000000000..32b3b70ad8 --- /dev/null +++ b/sd/source/ui/func/fulink.cxx @@ -0,0 +1,78 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include + +class SfxRequest; + +namespace sd { + + +FuLink::FuLink ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuLink::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuLink( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuLink::DoExecute( SfxRequest& ) +{ + if (officecfg::Office::Common::Security::Scripting::DisableActiveContent::get()) + { + std::unique_ptr xError( + Application::CreateMessageDialog(nullptr, VclMessageType::Warning, VclButtonsType::Ok, + SvtResId(STR_WARNING_EXTERNAL_LINK_EDIT_DISABLED))); + xError->run(); + return; + } + + sfx2::LinkManager* pLinkManager = mpDoc->GetLinkManager(); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateLinksDialog(mpViewShell->GetFrameWeld(), pLinkManager)); + pDlg->Execute(); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_MANAGE_LINKS ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fumeasur.cxx b/sd/source/ui/func/fumeasur.cxx new file mode 100644 index 0000000000..27afd0f7a1 --- /dev/null +++ b/sd/source/ui/func/fumeasur.cxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuMeasureDlg::FuMeasureDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuMeasureDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuMeasureDlg( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuMeasureDlg::DoExecute( SfxRequest& rReq ) +{ + SfxItemSet aNewAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aNewAttr ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSfxDialog(rReq.GetFrameWeld(), aNewAttr, mpView, RID_SVXPAGE_MEASURE)); + + if( pDlg->Execute() == RET_OK ) + { + rReq.Done( *pDlg->GetOutputItemSet() ); + pArgs = rReq.GetArgs(); + } + } + + if( pArgs ) + mpView->SetAttributes( *pArgs ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fumorph.cxx b/sd/source/ui/func/fumorph.cxx new file mode 100644 index 0000000000..5f1021dcf3 --- /dev/null +++ b/sd/source/ui/func/fumorph.cxx @@ -0,0 +1,506 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include + +using namespace com::sun::star; + +namespace sd { + +FuMorph::FuMorph ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuMorph::Create( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq +) +{ + rtl::Reference xFunc( new FuMorph( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuMorph::DoExecute( SfxRequest& ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if(rMarkList.GetMarkCount() != 2) + return; + + // create clones + SdrObject* pObj1 = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SdrObject* pObj2 = rMarkList.GetMark(1)->GetMarkedSdrObj(); + rtl::Reference pCloneObj1(pObj1->CloneSdrObject(pObj1->getSdrModelFromSdrObject())); + rtl::Reference pCloneObj2(pObj2->CloneSdrObject(pObj2->getSdrModelFromSdrObject())); + + // delete text at clone, otherwise we do not get a correct PathObj + pCloneObj1->SetOutlinerParaObject(std::nullopt); + pCloneObj2->SetOutlinerParaObject(std::nullopt); + + // create path objects + rtl::Reference pPolyObj1 = pCloneObj1->ConvertToPolyObj(false, false); + rtl::Reference pPolyObj2 = pCloneObj2->ConvertToPolyObj(false, false); + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreateMorphDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, pObj1, pObj2) ); + if(pPolyObj1 && pPolyObj2 && (pDlg->Execute() == RET_OK)) + { + B2DPolyPolygonList_impl aPolyPolyList; + ::basegfx::B2DPolyPolygon aPolyPoly1; + ::basegfx::B2DPolyPolygon aPolyPoly2; + + pDlg->SaveSettings(); + + // #i48168# Not always is the pPolyObj1/pPolyObj2 a SdrPathObj, it may also be a group object + // containing SdrPathObjs. To get the polygons, I add two iters here + SdrObjListIter aIter1(*pPolyObj1); + SdrObjListIter aIter2(*pPolyObj2); + + while(aIter1.IsMore()) + { + SdrObject* pObj = aIter1.Next(); + if(auto pPathObj = dynamic_cast< SdrPathObj *>( pObj )) + aPolyPoly1.append(pPathObj->GetPathPoly()); + } + + while(aIter2.IsMore()) + { + SdrObject* pObj = aIter2.Next(); + if(auto pPathObj = dynamic_cast< SdrPathObj *>( pObj )) + aPolyPoly2.append(pPathObj->GetPathPoly()); + } + + // perform morphing + if(aPolyPoly1.count() && aPolyPoly2.count()) + { + aPolyPoly1 = ::basegfx::utils::correctOrientations(aPolyPoly1); + aPolyPoly1.removeDoublePoints(); + ::basegfx::B2VectorOrientation eIsClockwise1(::basegfx::utils::getOrientation(aPolyPoly1.getB2DPolygon(0))); + + aPolyPoly2 = ::basegfx::utils::correctOrientations(aPolyPoly2); + aPolyPoly2.removeDoublePoints(); + ::basegfx::B2VectorOrientation eIsClockwise2(::basegfx::utils::getOrientation(aPolyPoly2.getB2DPolygon(0))); + + // set same orientation + if(eIsClockwise1 != eIsClockwise2) + aPolyPoly2.flip(); + + // force same poly count + if(aPolyPoly1.count() < aPolyPoly2.count()) + ImpAddPolys(aPolyPoly1, aPolyPoly2); + else if(aPolyPoly2.count() < aPolyPoly1.count()) + ImpAddPolys(aPolyPoly2, aPolyPoly1); + + // use orientation flag from dialog + if(!pDlg->IsOrientationFade()) + aPolyPoly2.flip(); + + // force same point counts + for( sal_uInt32 a(0); a < aPolyPoly1.count(); a++ ) + { + ::basegfx::B2DPolygon aSub1(aPolyPoly1.getB2DPolygon(a)); + ::basegfx::B2DPolygon aSub2(aPolyPoly2.getB2DPolygon(a)); + + if(aSub1.count() < aSub2.count()) + ImpEqualizePolyPointCount(aSub1, aSub2); + else if(aSub2.count() < aSub1.count()) + ImpEqualizePolyPointCount(aSub2, aSub1); + + aPolyPoly1.setB2DPolygon(a, aSub1); + aPolyPoly2.setB2DPolygon(a, aSub2); + } + + ImpMorphPolygons(aPolyPoly1, aPolyPoly2, pDlg->GetFadeSteps(), aPolyPolyList); + + OUString aString = mpView->GetDescriptionOfMarkedObjects() + + " " + SdResId(STR_UNDO_MORPHING); + + mpView->BegUndo(aString); + ImpInsertPolygons(aPolyPolyList, pDlg->IsAttributeFade(), pObj1, pObj2); + mpView->EndUndo(); + } + } +} + +static ::basegfx::B2DPolygon ImpGetExpandedPolygon( + const ::basegfx::B2DPolygon& rCandidate, + sal_uInt32 nNum +) +{ + if(rCandidate.count() && nNum && rCandidate.count() != nNum) + { + // length of step in dest poly + ::basegfx::B2DPolygon aRetval; + const double fStep(::basegfx::utils::getLength(rCandidate) / static_cast(rCandidate.isClosed() ? nNum : nNum - 1)); + double fDestPos(0.0); + double fSrcPos(0.0); + sal_uInt32 nSrcPos(0); + sal_uInt32 nSrcPosNext((nSrcPos + 1 == rCandidate.count()) ? 0 : nSrcPos + 1); + double fNextSrcLen(::basegfx::B2DVector(rCandidate.getB2DPoint(nSrcPos) - rCandidate.getB2DPoint(nSrcPosNext)).getLength()); + + for(sal_uInt32 b(0); b < nNum; b++) + { + // calc fDestPos in source + while(fSrcPos + fNextSrcLen < fDestPos) + { + fSrcPos += fNextSrcLen; + nSrcPos++; + nSrcPosNext = (nSrcPos + 1 == rCandidate.count()) ? 0 : nSrcPos + 1; + fNextSrcLen = ::basegfx::B2DVector(rCandidate.getB2DPoint(nSrcPos) - rCandidate.getB2DPoint(nSrcPosNext)).getLength(); + } + + // fDestPos is between fSrcPos and (fSrcPos + fNextSrcLen) + const double fLenA((fDestPos - fSrcPos) / fNextSrcLen); + const ::basegfx::B2DPoint aOld1(rCandidate.getB2DPoint(nSrcPos)); + const ::basegfx::B2DPoint aOld2(rCandidate.getB2DPoint(nSrcPosNext)); + ::basegfx::B2DPoint aNewPoint(basegfx::interpolate(aOld1, aOld2, fLenA)); + aRetval.append(aNewPoint); + + // next step + fDestPos += fStep; + } + + if(aRetval.count() >= 3) + { + aRetval.setClosed(rCandidate.isClosed()); + } + + return aRetval; + } + else + { + return rCandidate; + } +} + +/** + * make the point count of the polygons equal in adding points + */ +void FuMorph::ImpEqualizePolyPointCount( + ::basegfx::B2DPolygon& rSmall, + const ::basegfx::B2DPolygon& rBig +) +{ + // create poly with equal point count + const sal_uInt32 nCnt(rBig.count()); + ::basegfx::B2DPolygon aPoly1(ImpGetExpandedPolygon(rSmall, nCnt)); + + // create transformation for rBig to do the compare + const ::basegfx::B2DRange aSrcSize(::basegfx::utils::getRange(rBig)); + const ::basegfx::B2DPoint aSrcPos(aSrcSize.getCenter()); + const ::basegfx::B2DRange aDstSize(::basegfx::utils::getRange(rSmall)); + const ::basegfx::B2DPoint aDstPos(aDstSize.getCenter()); + + basegfx::B2DHomMatrix aTrans(basegfx::utils::createTranslateB2DHomMatrix(-aSrcPos.getX(), -aSrcPos.getY())); + aTrans.scale(aDstSize.getWidth() / aSrcSize.getWidth(), aDstSize.getHeight() / aSrcSize.getHeight()); + aTrans.translate(aDstPos.getX(), aDstPos.getY()); + + // transpose points to have smooth linear blending + ::basegfx::B2DPolygon aPoly2; + aPoly2.append(::basegfx::B2DPoint(), nCnt); + sal_uInt32 nInd(ImpGetNearestIndex(aPoly1, aTrans * rBig.getB2DPoint(0))); + + for(sal_uInt32 a(0); a < nCnt; a++) + { + aPoly2.setB2DPoint((a + nCnt - nInd) % nCnt, aPoly1.getB2DPoint(a)); + } + + aPoly2.setClosed(rBig.isClosed()); + rSmall = aPoly2; +} + +sal_uInt32 FuMorph::ImpGetNearestIndex( + const ::basegfx::B2DPolygon& rPoly, + const ::basegfx::B2DPoint& rPos +) +{ + double fMinDist = 0.0; + sal_uInt32 nActInd = 0; + + for(sal_uInt32 a(0); a < rPoly.count(); a++) + { + double fNewDist(::basegfx::B2DVector(rPoly.getB2DPoint(a) - rPos).getLength()); + + if(!a || fNewDist < fMinDist) + { + fMinDist = fNewDist; + nActInd = a; + } + } + + return nActInd; +} + +/** + * add to a point reduced polys until count is same + */ +void FuMorph::ImpAddPolys( + ::basegfx::B2DPolyPolygon& rSmaller, + const ::basegfx::B2DPolyPolygon& rBigger +) +{ + while(rSmaller.count() < rBigger.count()) + { + const ::basegfx::B2DPolygon& aToBeCopied(rBigger.getB2DPolygon(rSmaller.count())); + const ::basegfx::B2DRange aToBeCopiedPolySize(::basegfx::utils::getRange(aToBeCopied)); + ::basegfx::B2DPoint aNewPoint(aToBeCopiedPolySize.getCenter()); + ::basegfx::B2DPolygon aNewPoly; + + const ::basegfx::B2DRange aSrcSize(::basegfx::utils::getRange(rBigger.getB2DPolygon(0))); + const ::basegfx::B2DPoint aSrcPos(aSrcSize.getCenter()); + const ::basegfx::B2DRange aDstSize(::basegfx::utils::getRange(rSmaller.getB2DPolygon(0))); + const ::basegfx::B2DPoint aDstPos(aDstSize.getCenter()); + aNewPoint = aNewPoint - aSrcPos + aDstPos; + + for(sal_uInt32 a(0); a < aToBeCopied.count(); a++) + { + aNewPoly.append(aNewPoint); + } + + rSmaller.append(aNewPoly); + } +} + +/** + * create group object with morphed polygons + */ +void FuMorph::ImpInsertPolygons( + B2DPolyPolygonList_impl& rPolyPolyList3D, + bool bAttributeFade, + const SdrObject* pObj1, + const SdrObject* pObj2 +) +{ + Color aStartFillCol; + Color aEndFillCol; + Color aStartLineCol; + Color aEndLineCol; + ::tools::Long nStartLineWidth = 0; + ::tools::Long nEndLineWidth = 0; + SdrPageView* pPageView = mpView->GetSdrPageView(); + SfxItemPool & rPool = pObj1->GetObjectItemPool(); + SfxItemSetFixed aSet1( rPool ); + SfxItemSet aSet2( aSet1 ); + bool bLineColor = false; + bool bFillColor = false; + bool bLineWidth = false; + bool bIgnoreLine = false; + bool bIgnoreFill = false; + + aSet1.Put(pObj1->GetMergedItemSet()); + aSet2.Put(pObj2->GetMergedItemSet()); + + const drawing::LineStyle eLineStyle1 = aSet1.Get(XATTR_LINESTYLE).GetValue(); + const drawing::LineStyle eLineStyle2 = aSet2.Get(XATTR_LINESTYLE).GetValue(); + const drawing::FillStyle eFillStyle1 = aSet1.Get(XATTR_FILLSTYLE).GetValue(); + const drawing::FillStyle eFillStyle2 = aSet2.Get(XATTR_FILLSTYLE).GetValue(); + + if ( bAttributeFade ) + { + if ( ( eLineStyle1 != drawing::LineStyle_NONE ) && ( eLineStyle2 != drawing::LineStyle_NONE ) ) + { + bLineWidth = bLineColor = true; + + aStartLineCol = aSet1.Get(XATTR_LINECOLOR).GetColorValue(); + aEndLineCol = aSet2.Get(XATTR_LINECOLOR).GetColorValue(); + + nStartLineWidth = aSet1.Get(XATTR_LINEWIDTH).GetValue(); + nEndLineWidth = aSet2.Get(XATTR_LINEWIDTH).GetValue(); + } + else if ( ( eLineStyle1 == drawing::LineStyle_NONE ) && ( eLineStyle2 == drawing::LineStyle_NONE ) ) + bIgnoreLine = true; + + if ( ( eFillStyle1 == drawing::FillStyle_SOLID ) && ( eFillStyle2 == drawing::FillStyle_SOLID ) ) + { + bFillColor = true; + aStartFillCol = aSet1.Get(XATTR_FILLCOLOR).GetColorValue(); + aEndFillCol = aSet2.Get(XATTR_FILLCOLOR).GetColorValue(); + } + else if ( ( eFillStyle1 == drawing::FillStyle_NONE ) && ( eFillStyle2 == drawing::FillStyle_NONE ) ) + bIgnoreFill = true; + } + + if ( !pPageView ) + return; + + SfxItemSet aSet( aSet1 ); + rtl::Reference xObjGroup(new SdrObjGroup(mpView->getSdrModelFromSdrView())); + SdrObjList* pObjList = xObjGroup->GetSubList(); + const size_t nCount = rPolyPolyList3D.size(); + const double fStep = 1. / ( nCount + 1 ); + const double fDelta = nEndLineWidth - nStartLineWidth; + double fFactor = fStep; + + aSet.Put( XLineStyleItem( drawing::LineStyle_SOLID ) ); + aSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) ); + + for ( size_t i = 0; i < nCount; i++, fFactor += fStep ) + { + const ::basegfx::B2DPolyPolygon& rPolyPoly3D = rPolyPolyList3D[ i ]; + rtl::Reference pNewObj = new SdrPathObj( + mpView->getSdrModelFromSdrView(), + SdrObjKind::Polygon, + rPolyPoly3D); + + // line color + if ( bLineColor ) + { + const basegfx::BColor aLineColor(basegfx::interpolate(aStartLineCol.getBColor(), aEndLineCol.getBColor(), fFactor)); + aSet.Put( XLineColorItem( "", Color(aLineColor))); + } + else if ( bIgnoreLine ) + aSet.Put( XLineStyleItem( drawing::LineStyle_NONE ) ); + + // fill color + if ( bFillColor ) + { + const basegfx::BColor aFillColor(basegfx::interpolate(aStartFillCol.getBColor(), aEndFillCol.getBColor(), fFactor)); + aSet.Put( XFillColorItem( "", Color(aFillColor))); + } + else if ( bIgnoreFill ) + aSet.Put( XFillStyleItem( drawing::FillStyle_NONE ) ); + + // line width + if ( bLineWidth ) + aSet.Put( XLineWidthItem( nStartLineWidth + static_cast<::tools::Long>( fFactor * fDelta + 0.5 ) ) ); + + pNewObj->SetMergedItemSetAndBroadcast(aSet); + + pObjList->InsertObject( pNewObj.get() ); + } + + if ( nCount ) + { + pObjList->InsertObject( + pObj1->CloneSdrObject(pObj1->getSdrModelFromSdrObject()).get(), + 0 ); + pObjList->InsertObject( + pObj2->CloneSdrObject(pObj2->getSdrModelFromSdrObject()).get() ); + + mpView->DeleteMarked(); + mpView->InsertObjectAtView(xObjGroup.get(), *pPageView, SdrInsertFlags:: SETDEFLAYER); + } +} + +/** + * create single morphed PolyPolygon + */ +::basegfx::B2DPolyPolygon FuMorph::ImpCreateMorphedPolygon( + const ::basegfx::B2DPolyPolygon& rPolyPolyStart, + const ::basegfx::B2DPolyPolygon& rPolyPolyEnd, + double fMorphingFactor +) +{ + ::basegfx::B2DPolyPolygon aNewPolyPolygon; + const double fFactor = 1.0 - fMorphingFactor; + + for(sal_uInt32 a(0); a < rPolyPolyStart.count(); a++) + { + const ::basegfx::B2DPolygon& aPolyStart(rPolyPolyStart.getB2DPolygon(a)); + const ::basegfx::B2DPolygon& aPolyEnd(rPolyPolyEnd.getB2DPolygon(a)); + const sal_uInt32 nCount(aPolyStart.count()); + ::basegfx::B2DPolygon aNewPolygon; + + for(sal_uInt32 b(0); b < nCount; b++) + { + const ::basegfx::B2DPoint& aPtStart(aPolyStart.getB2DPoint(b)); + const ::basegfx::B2DPoint& aPtEnd(aPolyEnd.getB2DPoint(b)); + aNewPolygon.append(aPtEnd + ((aPtStart - aPtEnd) * fFactor)); + } + + aNewPolygon.setClosed(aPolyStart.isClosed() && aPolyEnd.isClosed()); + aNewPolyPolygon.append(aNewPolygon); + } + + return aNewPolyPolygon; +} + +/** + * create morphed PolyPolygons + */ +void FuMorph::ImpMorphPolygons( + const ::basegfx::B2DPolyPolygon& rPolyPoly1, + const ::basegfx::B2DPolyPolygon& rPolyPoly2, + const sal_uInt16 nSteps, + B2DPolyPolygonList_impl& rPolyPolyList3D +) +{ + if(!nSteps) + return; + + const ::basegfx::B2DRange aStartPolySize(::basegfx::utils::getRange(rPolyPoly1)); + const ::basegfx::B2DPoint aStartCenter(aStartPolySize.getCenter()); + const ::basegfx::B2DRange aEndPolySize(::basegfx::utils::getRange(rPolyPoly2)); + const ::basegfx::B2DPoint aEndCenter(aEndPolySize.getCenter()); + const ::basegfx::B2DPoint aDelta(aEndCenter - aStartCenter); + const double fFactor(1.0 / (nSteps + 1)); + double fValue(0.0); + + for(sal_uInt16 i(0); i < nSteps; i++) + { + fValue += fFactor; + ::basegfx::B2DPolyPolygon aNewPolyPoly2D = ImpCreateMorphedPolygon(rPolyPoly1, rPolyPoly2, fValue); + + const ::basegfx::B2DRange aNewPolySize(::basegfx::utils::getRange(aNewPolyPoly2D)); + const ::basegfx::B2DPoint aNewS(aNewPolySize.getCenter()); + const ::basegfx::B2DPoint aRealS(aStartCenter + (aDelta * fValue)); + const ::basegfx::B2DPoint aDiff(aRealS - aNewS); + + aNewPolyPoly2D.transform(basegfx::utils::createTranslateB2DHomMatrix(aDiff)); + rPolyPolyList3D.push_back( std::move(aNewPolyPoly2D) ); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/funavig.cxx b/sd/source/ui/func/funavig.cxx new file mode 100644 index 0000000000..bd0cdb7c33 --- /dev/null +++ b/sd/source/ui/func/funavig.cxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuNavigation::FuNavigation ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuNavigation::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuNavigation( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuNavigation::DoExecute( SfxRequest& rReq ) +{ + bool bSlideShow = SlideShow::IsRunning( mpViewShell->GetViewShellBase() ); + + switch ( rReq.GetSlot() ) + { + case SID_GO_TO_FIRST_PAGE: + { + if (!mpView->IsTextEdit() + && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr + && !bSlideShow) + { + // jump to first page + static_cast(mpViewShell)->SwitchPage(0); + } + } + break; + + case SID_GO_TO_PREVIOUS_PAGE: + { + if( !bSlideShow) + if( auto pDrawViewShell = dynamic_cast( mpViewShell ) ) + { + // With no modifier pressed we move to the previous + // slide. + mpView->SdrEndTextEdit(); + + // Previous page. + SdPage* pPage = pDrawViewShell->GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + + if (nSdPage > 0) + { + // Switch the page and send events regarding + // deactivation the old page and activating the new + // one. + TabControl& rPageTabControl = + static_cast(mpViewShell) + ->GetPageTabControl(); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendDeactivatePageEvent (); + static_cast(mpViewShell)->SwitchPage(nSdPage - 1); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendActivatePageEvent (); + } + } + } + break; + + case SID_GO_TO_NEXT_PAGE: + { + if( !bSlideShow) + if( auto pDrawViewShell = dynamic_cast( mpViewShell )) + { + // With no modifier pressed we move to the next slide. + mpView->SdrEndTextEdit(); + + // Next page. + SdPage* pPage = pDrawViewShell->GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + + if (nSdPage < mpDoc->GetSdPageCount(pPage->GetPageKind()) - 1) + { + // Switch the page and send events regarding + // deactivation the old page and activating the new + // one. + TabControl& rPageTabControl = + static_cast(mpViewShell)->GetPageTabControl(); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendDeactivatePageEvent (); + static_cast(mpViewShell)->SwitchPage(nSdPage + 1); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendActivatePageEvent (); + } + } + } + break; + + case SID_GO_TO_LAST_PAGE: + { + if (!mpView->IsTextEdit() && !bSlideShow) + if (auto pDrawViewShell = dynamic_cast( mpViewShell )) + { + // jump to last page + SdPage* pPage = pDrawViewShell->GetActualPage(); + pDrawViewShell->SwitchPage(mpDoc->GetSdPageCount( + pPage->GetPageKind()) - 1); + } + } + break; + } + // Refresh toolbar icons + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_GO_TO_FIRST_PAGE); + rBindings.Invalidate(SID_GO_TO_PREVIOUS_PAGE); + rBindings.Invalidate(SID_GO_TO_NEXT_PAGE); + rBindings.Invalidate(SID_GO_TO_LAST_PAGE); +} + + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuoaprms.cxx b/sd/source/ui/func/fuoaprms.cxx new file mode 100644 index 0000000000..fd01f9befd --- /dev/null +++ b/sd/source/ui/func/fuoaprms.cxx @@ -0,0 +1,799 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace sd { + + +#define ATTR_MISSING 0 ///< Attribute missing +#define ATTR_MIXED 1 ///< Attribute ambiguous (on multi-selection) +#define ATTR_SET 2 ///< Attribute unique + +FuObjectAnimationParameters::FuObjectAnimationParameters ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuObjectAnimationParameters::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuObjectAnimationParameters( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuObjectAnimationParameters::DoExecute( SfxRequest& rReq ) +{ + SfxUndoManager* pUndoMgr = mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager(); + + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + + short nAnimationSet = ATTR_MISSING; + short nEffectSet = ATTR_MISSING; + short nTextEffectSet = ATTR_MISSING; + short nSpeedSet = ATTR_MISSING; + short nFadeColorSet = ATTR_MISSING; + short nFadeOutSet = ATTR_MISSING; + short nInvisibleSet = ATTR_MISSING; + short nSoundOnSet = ATTR_MISSING; + short nSoundFileSet = ATTR_MISSING; + short nPlayFullSet = ATTR_MISSING; + short nClickActionSet = ATTR_MISSING; + short nBookmarkSet = ATTR_MISSING; + + short nSecondEffectSet = ATTR_MISSING; + short nSecondSpeedSet = ATTR_MISSING; + short nSecondSoundOnSet = ATTR_MISSING; + short nSecondPlayFullSet = ATTR_MISSING; + + // defaults (for Undo-Action) + presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE; + presentation::AnimationEffect eTextEffect = presentation::AnimationEffect_NONE; + presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_MEDIUM; + bool bActive = false; + bool bFadeOut = false; + Color aFadeColor = COL_LIGHTGRAY; + bool bInvisible = false; + bool bSoundOn = false; + OUString aSound; + bool bPlayFull = false; + presentation::ClickAction eClickAction = presentation::ClickAction_NONE; + OUString aBookmark; + + presentation::AnimationEffect eSecondEffect = presentation::AnimationEffect_NONE; + presentation::AnimationSpeed eSecondSpeed = presentation::AnimationSpeed_MEDIUM; + bool bSecondSoundOn = false; + bool bSecondPlayFull = false; + + SdAnimationInfo* pInfo; + SdrMark* pMark; + + // inspect first object + pMark = rMarkList.GetMark(0); + pInfo = SdDrawDocument::GetAnimationInfo(pMark->GetMarkedSdrObj()); + if( pInfo ) + { + bActive = pInfo->mbActive; + nAnimationSet = ATTR_SET; + + eEffect = pInfo->meEffect; + nEffectSet = ATTR_SET; + + eTextEffect = pInfo->meTextEffect; + nTextEffectSet = ATTR_SET; + + eSpeed = pInfo->meSpeed; + nSpeedSet = ATTR_SET; + + bFadeOut = pInfo->mbDimPrevious; + nFadeOutSet = ATTR_SET; + + aFadeColor = pInfo->maDimColor; + nFadeColorSet = ATTR_SET; + + bInvisible = pInfo->mbDimHide; + nInvisibleSet = ATTR_SET; + + bSoundOn = pInfo->mbSoundOn; + nSoundOnSet = ATTR_SET; + + aSound = pInfo->maSoundFile; + nSoundFileSet = ATTR_SET; + + bPlayFull = pInfo->mbPlayFull; + nPlayFullSet = ATTR_SET; + + eClickAction = pInfo->meClickAction; + nClickActionSet = ATTR_SET; + + aBookmark = pInfo->GetBookmark(); + nBookmarkSet = ATTR_SET; + + eSecondEffect = pInfo->meSecondEffect; + nSecondEffectSet = ATTR_SET; + + eSecondSpeed = pInfo->meSecondSpeed; + nSecondSpeedSet = ATTR_SET; + + bSecondSoundOn = pInfo->mbSecondSoundOn; + nSecondSoundOnSet = ATTR_SET; + + bSecondPlayFull = pInfo->mbSecondPlayFull; + nSecondPlayFullSet = ATTR_SET; + } + + // if necessary, inspect more objects + for( size_t nObject = 1; nObject < nCount; ++nObject ) + { + pMark = rMarkList.GetMark( nObject ); + SdrObject* pObject = pMark->GetMarkedSdrObj(); + pInfo = SdDrawDocument::GetAnimationInfo(pObject); + if( pInfo ) + { + if( bActive != pInfo->mbActive ) + nAnimationSet = ATTR_MIXED; + + if( eEffect != pInfo->meEffect ) + nEffectSet = ATTR_MIXED; + + if( eTextEffect != pInfo->meTextEffect ) + nTextEffectSet = ATTR_MIXED; + + if( eSpeed != pInfo->meSpeed ) + nSpeedSet = ATTR_MIXED; + + if( bFadeOut != pInfo->mbDimPrevious ) + nFadeOutSet = ATTR_MIXED; + + if( aFadeColor != pInfo->maDimColor ) + nFadeColorSet = ATTR_MIXED; + + if( bInvisible != pInfo->mbDimHide ) + nInvisibleSet = ATTR_MIXED; + + if( bSoundOn != pInfo->mbSoundOn ) + nSoundOnSet = ATTR_MIXED; + + if( aSound != pInfo->maSoundFile ) + nSoundFileSet = ATTR_MIXED; + + if( bPlayFull != pInfo->mbPlayFull ) + nPlayFullSet = ATTR_MIXED; + + if( eClickAction != pInfo->meClickAction ) + nClickActionSet = ATTR_MIXED; + + if( aBookmark != pInfo->GetBookmark() ) + nBookmarkSet = ATTR_MIXED; + + if( eSecondEffect != pInfo->meSecondEffect ) + nSecondEffectSet = ATTR_MIXED; + + if( eSecondSpeed != pInfo->meSecondSpeed ) + nSecondSpeedSet = ATTR_MIXED; + + if( bSecondSoundOn != pInfo->mbSecondSoundOn ) + nSecondSoundOnSet = ATTR_MIXED; + + if( bSecondPlayFull != pInfo->mbSecondPlayFull ) + nSecondPlayFullSet = ATTR_MIXED; + } + else + { + if (nAnimationSet == ATTR_SET && bActive) + nAnimationSet = ATTR_MIXED; + + if (nEffectSet == ATTR_SET && eEffect != presentation::AnimationEffect_NONE) + nEffectSet = ATTR_MIXED; + + if (nTextEffectSet == ATTR_SET && eTextEffect != presentation::AnimationEffect_NONE) + nTextEffectSet = ATTR_MIXED; + + if (nSpeedSet == ATTR_SET) + nSpeedSet = ATTR_MIXED; + + if (nFadeOutSet == ATTR_SET && bFadeOut) + nFadeOutSet = ATTR_MIXED; + + if (nFadeColorSet == ATTR_SET) + nFadeColorSet = ATTR_MIXED; + + if (nInvisibleSet == ATTR_SET && bInvisible) + nInvisibleSet = ATTR_MIXED; + + if (nSoundOnSet == ATTR_SET && bSoundOn) + nSoundOnSet = ATTR_MIXED; + + if (nSoundFileSet == ATTR_SET) + nSoundFileSet = ATTR_MIXED; + + if (nPlayFullSet == ATTR_SET && bPlayFull) + nPlayFullSet = ATTR_MIXED; + + if (nClickActionSet == ATTR_SET && eClickAction != presentation::ClickAction_NONE) + nClickActionSet = ATTR_MIXED; + + if (nBookmarkSet == ATTR_SET) + nBookmarkSet = ATTR_MIXED; + + if (nSecondEffectSet == ATTR_SET && eSecondEffect != presentation::AnimationEffect_NONE) + nSecondEffectSet = ATTR_MIXED; + + if (nSecondSpeedSet == ATTR_SET) + nSecondSpeedSet = ATTR_MIXED; + + if (nSecondSoundOnSet == ATTR_SET && bSecondSoundOn) + nSecondSoundOnSet = ATTR_MIXED; + + if (nSecondPlayFullSet == ATTR_SET && bSecondPlayFull) + nSecondPlayFullSet = ATTR_MIXED; + } + } + + /* Exactly two objects with path effect? + Then, only the animation info at the moved object is valid. */ + if (nCount == 2) + { + SdrObject* pObject1 = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SdrObject* pObject2 = rMarkList.GetMark(1)->GetMarkedSdrObj(); + SdrObjKind eKind1 = pObject1->GetObjIdentifier(); + SdrObjKind eKind2 = pObject2->GetObjIdentifier(); + SdAnimationInfo* pInfo1 = SdDrawDocument::GetAnimationInfo(pObject1); + SdAnimationInfo* pInfo2 = SdDrawDocument::GetAnimationInfo(pObject2); + pInfo = nullptr; + + if (pObject1->GetObjInventor() == SdrInventor::Default && + ((eKind1 == SdrObjKind::Line) || // 2 point line + (eKind1 == SdrObjKind::PolyLine) || // Polygon + (eKind1 == SdrObjKind::PathLine)) && // Bezier curve + (pInfo2 && pInfo2->meEffect == presentation::AnimationEffect_PATH)) + { + pInfo = pInfo2; + } + + if (pObject2->GetObjInventor() == SdrInventor::Default && + ((eKind2 == SdrObjKind::Line) || // 2 point line + (eKind2 == SdrObjKind::PolyLine) || // Polygon + (eKind2 == SdrObjKind::PathLine)) && // Bezier curve + (pInfo1 && pInfo1->meEffect == presentation::AnimationEffect_PATH)) + { + pInfo = pInfo1; + } + + if (pInfo) + { + bActive = pInfo->mbActive; nAnimationSet = ATTR_SET; + eEffect = pInfo->meEffect; nEffectSet = ATTR_SET; + eTextEffect = pInfo->meTextEffect; nTextEffectSet = ATTR_SET; + eSpeed = pInfo->meSpeed; nSpeedSet = ATTR_SET; + bFadeOut = pInfo->mbDimPrevious; nFadeOutSet = ATTR_SET; + aFadeColor = pInfo->maDimColor; nFadeColorSet = ATTR_SET; + bInvisible = pInfo->mbDimHide; nInvisibleSet = ATTR_SET; + bSoundOn = pInfo->mbSoundOn; nSoundOnSet = ATTR_SET; + aSound = pInfo->maSoundFile; nSoundFileSet = ATTR_SET; + bPlayFull = pInfo->mbPlayFull; nPlayFullSet = ATTR_SET; + eClickAction = pInfo->meClickAction; nClickActionSet = ATTR_SET; + aBookmark = pInfo->GetBookmark(); nBookmarkSet = ATTR_SET; + eSecondEffect = pInfo->meSecondEffect; nSecondEffectSet = ATTR_SET; + eSecondSpeed = pInfo->meSecondSpeed; nSecondSpeedSet = ATTR_SET; + bSecondSoundOn = pInfo->mbSecondSoundOn; nSecondSoundOnSet = ATTR_SET; + bSecondPlayFull = pInfo->mbSecondPlayFull; nSecondPlayFullSet = ATTR_SET; + } + } + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if(!pArgs) + { + // fill ItemSet for dialog + SfxItemSetFixed aSet(mpDoc->GetPool()); + + // fill the set + if (nAnimationSet == ATTR_SET) + aSet.Put( SfxBoolItem( ATTR_ANIMATION_ACTIVE, bActive)); + else if (nAnimationSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ANIMATION_ACTIVE); + else + aSet.Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, false)); + + if (nEffectSet == ATTR_SET) + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, static_cast(eEffect))); + else if (nEffectSet == ATTR_MIXED) + aSet.InvalidateItem( ATTR_ANIMATION_EFFECT ); + else + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE))); + + if (nTextEffectSet == ATTR_SET) + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, static_cast(eTextEffect))); + else if (nTextEffectSet == ATTR_MIXED) + aSet.InvalidateItem( ATTR_ANIMATION_TEXTEFFECT ); + else + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, sal_uInt16(presentation::AnimationEffect_NONE))); + + if (nSpeedSet == ATTR_SET) + aSet.Put(SfxUInt16Item(ATTR_ANIMATION_SPEED, static_cast(eSpeed))); + else + aSet.InvalidateItem(ATTR_ANIMATION_SPEED); + + if (nFadeOutSet == ATTR_SET) + aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, bFadeOut)); + else if (nFadeOutSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ANIMATION_FADEOUT); + else + aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, false)); + + if (nFadeColorSet == ATTR_SET) + aSet.Put(SvxColorItem(aFadeColor, ATTR_ANIMATION_COLOR)); + else if (nFadeColorSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ANIMATION_COLOR); + else + aSet.Put(SvxColorItem(COL_LIGHTGRAY, ATTR_ANIMATION_COLOR)); + + if (nInvisibleSet == ATTR_SET) + aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, bInvisible)); + else if (nInvisibleSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ANIMATION_INVISIBLE); + else + aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, false)); + + if (nSoundOnSet == ATTR_SET) + aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, bSoundOn)); + else if (nSoundOnSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ANIMATION_SOUNDON); + else + aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, false)); + + if (nSoundFileSet == ATTR_SET) + aSet.Put(SfxStringItem(ATTR_ANIMATION_SOUNDFILE, aSound)); + else + aSet.InvalidateItem(ATTR_ANIMATION_SOUNDFILE); + + if (nPlayFullSet == ATTR_SET) + aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, bPlayFull)); + else if (nPlayFullSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ANIMATION_PLAYFULL); + else + aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, false)); + + if (nClickActionSet == ATTR_SET) + aSet.Put(SfxUInt16Item(ATTR_ACTION, static_cast(eClickAction))); + else if (nClickActionSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ACTION); + else + aSet.Put(SfxUInt16Item(ATTR_ACTION, sal_uInt16(presentation::ClickAction_NONE))); + + if (nBookmarkSet == ATTR_SET) + aSet.Put(SfxStringItem(ATTR_ACTION_FILENAME, aBookmark)); + else + aSet.InvalidateItem(ATTR_ACTION_FILENAME); + + if (nSecondEffectSet == ATTR_SET) + aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, static_cast(eSecondEffect))); + else if (nSecondEffectSet == ATTR_MIXED) + aSet.InvalidateItem( ATTR_ACTION_EFFECT ); + else + aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE))); + + if (nSecondSpeedSet == ATTR_SET) + aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECTSPEED, static_cast(eSecondSpeed))); + else + aSet.InvalidateItem(ATTR_ACTION_EFFECTSPEED); + + if (nSecondSoundOnSet == ATTR_SET) + aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, bSecondSoundOn)); + else if (nSecondSoundOnSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ACTION_SOUNDON); + else + aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, false)); + + if (nSecondPlayFullSet == ATTR_SET) + aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, bSecondPlayFull)); + else if (nSecondPlayFullSet == ATTR_MIXED) + aSet.InvalidateItem(ATTR_ACTION_PLAYFULL); + else + aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, false)); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreatSdActionDialog(mpViewShell->GetFrameWeld(), &aSet, mpView) ); + + short nResult = pDlg->Execute(); + + if( nResult != RET_OK ) + return; + + rReq.Done( *( pDlg->GetOutputItemSet() ) ); + pArgs = rReq.GetArgs(); + } + + // evaluation of the ItemSets + if (pArgs->GetItemState(ATTR_ANIMATION_ACTIVE) == SfxItemState::SET) + { + bActive = static_cast(pArgs->Get(ATTR_ANIMATION_ACTIVE)).GetValue(); + nAnimationSet = ATTR_SET; + } + else + nAnimationSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_EFFECT) == SfxItemState::SET) + { + eEffect = static_cast( pArgs-> + Get(ATTR_ANIMATION_EFFECT).GetValue()); + nEffectSet = ATTR_SET; + } + else + nEffectSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_TEXTEFFECT) == SfxItemState::SET) + { + eTextEffect = static_cast(static_cast( pArgs-> + Get(ATTR_ANIMATION_TEXTEFFECT)).GetValue()); + nTextEffectSet = ATTR_SET; + } + else + nTextEffectSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_SPEED) == SfxItemState::SET) + { + eSpeed = static_cast( pArgs-> + Get(ATTR_ANIMATION_SPEED).GetValue()); + nSpeedSet = ATTR_SET; + } + else + nSpeedSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_FADEOUT) == SfxItemState::SET) + { + bFadeOut = static_cast(pArgs->Get(ATTR_ANIMATION_FADEOUT)).GetValue(); + nFadeOutSet = ATTR_SET; + } + else + nFadeOutSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_INVISIBLE) == SfxItemState::SET) + { + bInvisible = static_cast(pArgs->Get(ATTR_ANIMATION_INVISIBLE)).GetValue(); + nInvisibleSet = ATTR_SET; + } + else + nInvisibleSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_SOUNDON) == SfxItemState::SET) + { + bSoundOn = static_cast(pArgs->Get(ATTR_ANIMATION_SOUNDON)).GetValue(); + nSoundOnSet = ATTR_SET; + } + else + nSoundOnSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_SOUNDFILE) == SfxItemState::SET) + { + aSound = pArgs->Get(ATTR_ANIMATION_SOUNDFILE).GetValue(); + nSoundFileSet = ATTR_SET; + } + else + nSoundFileSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_COLOR) == SfxItemState::SET) + { + aFadeColor = static_cast(pArgs->Get(ATTR_ANIMATION_COLOR)).GetValue(); + nFadeColorSet = ATTR_SET; + } + else + nFadeColorSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ANIMATION_PLAYFULL) == SfxItemState::SET) + { + bPlayFull = static_cast(pArgs->Get(ATTR_ANIMATION_PLAYFULL)).GetValue(); + nPlayFullSet = ATTR_SET; + } + else + nPlayFullSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ACTION) == SfxItemState::SET) + { + eClickAction = static_cast(pArgs-> + Get(ATTR_ACTION).GetValue()); + nClickActionSet = ATTR_SET; + } + else + nClickActionSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ACTION_FILENAME) == SfxItemState::SET) + { + aBookmark = pArgs->Get(ATTR_ACTION_FILENAME).GetValue(); + nBookmarkSet = ATTR_SET; + } + else + nBookmarkSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ACTION_EFFECT) == SfxItemState::SET) + { + eSecondEffect = static_cast( pArgs-> + Get(ATTR_ACTION_EFFECT).GetValue()); + nSecondEffectSet = ATTR_SET; + } + else + nSecondEffectSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ACTION_EFFECTSPEED) == SfxItemState::SET) + { + eSecondSpeed = static_cast( pArgs-> + Get(ATTR_ACTION_EFFECTSPEED).GetValue()); + nSecondSpeedSet = ATTR_SET; + } + else + nSecondSpeedSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ACTION_SOUNDON) == SfxItemState::SET) + { + bSecondSoundOn = static_cast(pArgs->Get(ATTR_ACTION_SOUNDON)).GetValue(); + nSecondSoundOnSet = ATTR_SET; + } + else + nSecondSoundOnSet = ATTR_MISSING; + + if (pArgs->GetItemState(ATTR_ACTION_PLAYFULL) == SfxItemState::SET) + { + bSecondPlayFull = static_cast(pArgs->Get(ATTR_ACTION_PLAYFULL)).GetValue(); + nSecondPlayFullSet = ATTR_SET; + } + else + nSecondPlayFullSet = ATTR_MISSING; + + // if any attribute is chosen + if (!(nEffectSet == ATTR_SET || + nTextEffectSet == ATTR_SET || + nSpeedSet == ATTR_SET || + nAnimationSet == ATTR_SET || + nFadeOutSet == ATTR_SET || + nFadeColorSet == ATTR_SET || + nInvisibleSet == ATTR_SET || + nSoundOnSet == ATTR_SET || + nSoundFileSet == ATTR_SET || + nPlayFullSet == ATTR_SET || + nClickActionSet == ATTR_SET || + nBookmarkSet == ATTR_SET || + nSecondEffectSet == ATTR_SET || + nSecondSpeedSet == ATTR_SET || + nSecondSoundOnSet == ATTR_SET || + nSecondPlayFullSet == ATTR_SET)) + return; + + // String for undo-group and list-action + OUString aComment(SdResId(STR_UNDO_ANIMATION)); + + // with 'following curves', we have an additional UndoAction + // therefore cling? here + pUndoMgr->EnterListAction(aComment, aComment, 0, mpViewShell->GetViewShellBase().GetViewShellId()); + + // create undo group + std::unique_ptr pUndoGroup(new SdUndoGroup(mpDoc)); + pUndoGroup->SetComment(aComment); + + // for the path effect, remember some stuff + SdrPathObj* pPath = nullptr; + if (eEffect == presentation::AnimationEffect_PATH && nEffectSet == ATTR_SET) + { + DBG_ASSERT(nCount == 2, "This effect expects two selected objects"); + SdrObject* pObject1 = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SdrObject* pObject2 = rMarkList.GetMark(1)->GetMarkedSdrObj(); + SdrObjKind eKind1 = pObject1->GetObjIdentifier(); + SdrObjKind eKind2 = pObject2->GetObjIdentifier(); + SdrObject* pRunningObj = nullptr; + + if (pObject1->GetObjInventor() == SdrInventor::Default && + ((eKind1 == SdrObjKind::Line) || // 2 point line + (eKind1 == SdrObjKind::PolyLine) || // Polygon + (eKind1 == SdrObjKind::PathLine))) // Bezier curve + { + pPath = static_cast(pObject1); + pRunningObj = pObject2; + } + + if (pObject2->GetObjInventor() == SdrInventor::Default && + ((eKind2 == SdrObjKind::Line) || // 2 point line + (eKind2 == SdrObjKind::PolyLine) || // Polygon + (eKind2 == SdrObjKind::PathLine))) // Bezier curve + { + pPath = static_cast(pObject2); + pRunningObj = pObject1; + } + + assert(pRunningObj && pPath && "no curve found"); + + // push the running object to the end of the curve + if (pRunningObj) + { + ::tools::Rectangle aCurRect(pRunningObj->GetLogicRect()); + Point aCurCenter(aCurRect.Center()); + const ::basegfx::B2DPolyPolygon& rPolyPolygon = pPath->GetPathPoly(); + sal_uInt32 nNoOfPolygons(rPolyPolygon.count()); + const ::basegfx::B2DPolygon& aPolygon(rPolyPolygon.getB2DPolygon(nNoOfPolygons - 1)); + sal_uInt32 nPoints(aPolygon.count()); + const ::basegfx::B2DPoint aNewB2DCenter(aPolygon.getB2DPoint(nPoints - 1)); + const Point aNewCenter(FRound(aNewB2DCenter.getX()), FRound(aNewB2DCenter.getY())); + Size aDistance(aNewCenter.X() - aCurCenter.X(), aNewCenter.Y() - aCurCenter.Y()); + pRunningObj->Move(aDistance); + + pUndoMgr->AddUndoAction(mpDoc->GetSdrUndoFactory().CreateUndoMoveObject( *pRunningObj, aDistance)); + } + } + + for (size_t nObject = 0; nObject < nCount; ++nObject) + { + SdrObject* pObject = rMarkList.GetMark(nObject)->GetMarkedSdrObj(); + + pInfo = SdDrawDocument::GetAnimationInfo(pObject); + + bool bCreated = false; + if( !pInfo ) + { + pInfo = SdDrawDocument::GetShapeUserData(*pObject,true); + bCreated = true; + } + + // path object for 'following curves'? + if (eEffect == presentation::AnimationEffect_PATH && pObject == pPath) + { + SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction + (mpDoc, pObject, bCreated); + pAction->SetActive(pInfo->mbActive, pInfo->mbActive); + pAction->SetEffect(pInfo->meEffect, pInfo->meEffect); + pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect); + pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed); + pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious); + pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor); + pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide); + pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn); + pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile); + pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull); + pAction->SetClickAction(pInfo->meClickAction, pInfo->meClickAction); + pAction->SetBookmark(pInfo->GetBookmark(), pInfo->GetBookmark()); + pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb); + pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect); + pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed); + pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn); + pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull); + pUndoGroup->AddAction(pAction); + + } + else + { + + // create undo action with old and new sizes + SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction + (mpDoc, pObject, bCreated); + pAction->SetActive(pInfo->mbActive, bActive); + pAction->SetEffect(pInfo->meEffect, eEffect); + pAction->SetTextEffect(pInfo->meTextEffect, eTextEffect); + pAction->SetSpeed(pInfo->meSpeed, eSpeed); + pAction->SetDim(pInfo->mbDimPrevious, bFadeOut); + pAction->SetDimColor(pInfo->maDimColor, aFadeColor); + pAction->SetDimHide(pInfo->mbDimHide, bInvisible); + pAction->SetSoundOn(pInfo->mbSoundOn, bSoundOn); + pAction->SetSound(pInfo->maSoundFile, aSound); + pAction->SetPlayFull(pInfo->mbPlayFull, bPlayFull); + pAction->SetClickAction(pInfo->meClickAction, eClickAction); + pAction->SetBookmark(pInfo->GetBookmark(), aBookmark); + pAction->SetVerb(pInfo->mnVerb, static_cast(pInfo->GetBookmark().toInt32()) ); + pAction->SetSecondEffect(pInfo->meSecondEffect, eSecondEffect); + pAction->SetSecondSpeed(pInfo->meSecondSpeed, eSecondSpeed); + pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, bSecondSoundOn); + pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull,bSecondPlayFull); + pUndoGroup->AddAction(pAction); + + // insert new values at info block of the object + if (nAnimationSet == ATTR_SET) + pInfo->mbActive = bActive; + + if (nEffectSet == ATTR_SET) + pInfo->meEffect = eEffect; + + if (nTextEffectSet == ATTR_SET) + pInfo->meTextEffect = eTextEffect; + + if (nSpeedSet == ATTR_SET) + pInfo->meSpeed = eSpeed; + + if (nFadeOutSet == ATTR_SET) + pInfo->mbDimPrevious = bFadeOut; + + if (nFadeColorSet == ATTR_SET) + pInfo->maDimColor = aFadeColor; + + if (nInvisibleSet == ATTR_SET) + pInfo->mbDimHide = bInvisible; + + if (nSoundOnSet == ATTR_SET) + pInfo->mbSoundOn = bSoundOn; + + if (nSoundFileSet == ATTR_SET) + pInfo->maSoundFile = aSound; + + if (nPlayFullSet == ATTR_SET) + pInfo->mbPlayFull = bPlayFull; + + if (nClickActionSet == ATTR_SET) + pInfo->meClickAction = eClickAction; + + if (nBookmarkSet == ATTR_SET) + pInfo->SetBookmark( aBookmark ); + + if (nSecondEffectSet == ATTR_SET) + pInfo->meSecondEffect = eSecondEffect; + + if (nSecondSpeedSet == ATTR_SET) + pInfo->meSecondSpeed = eSecondSpeed; + + if (nSecondSoundOnSet == ATTR_SET) + pInfo->mbSecondSoundOn = bSecondSoundOn; + + if (nSecondPlayFullSet == ATTR_SET) + pInfo->mbSecondPlayFull = bSecondPlayFull; + + if (eClickAction == presentation::ClickAction_VERB) + pInfo->mnVerb = static_cast(aBookmark.toInt32()); + } + } + // Set the Undo Group in of the Undo Manager + pUndoMgr->AddUndoAction(std::move(pUndoGroup)); + pUndoMgr->LeaveListAction(); + + // Model changed + mpDoc->SetChanged(); + // not seen, therefore we do not need to invalidate at the bindings +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuolbull.cxx b/sd/source/ui/func/fuolbull.cxx new file mode 100644 index 0000000000..1f5a056b7e --- /dev/null +++ b/sd/source/ui/func/fuolbull.cxx @@ -0,0 +1,340 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace svx::sidebar; +namespace sd { + +FuBulletAndPosition::FuBulletAndPosition(ViewShell* pViewShell, ::sd::Window* pWindow, + ::sd::View* pView, SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewShell, pWindow, pView, pDoc, rReq) +{ +} + +rtl::Reference FuBulletAndPosition::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuBulletAndPosition( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuBulletAndPosition::DoExecute( SfxRequest& rReq ) +{ + const sal_uInt16 nSId = rReq.GetSlot(); + if ( nSId == FN_SVX_SET_BULLET || nSId == FN_SVX_SET_NUMBER ) + { + SetCurrentBulletsNumbering(rReq); + return; + } + + const SfxItemSet* pArgs = rReq.GetArgs(); + const SfxStringItem* pPageItem = SfxItemSet::GetItem(pArgs, FN_PARAM_1, false); + + if ( pArgs && !pPageItem ) + { + /* not direct to pOlView; therefore, SdDrawView::SetAttributes can catch + changes to master page and redirect to a template */ + mpView->SetAttributes(*pArgs); + return; + } + + // fill ItemSet for Dialog + SfxItemSet aEditAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aEditAttr ); + + SfxItemSetFixed aNewAttr( mpViewShell->GetPool() ); + aNewAttr.Put( aEditAttr, false ); + + auto pView = mpView; + + // create and execute dialog + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSvxBulletAndPositionDlg(mpViewShell->GetFrameWeld(), &aNewAttr, mpView)); + sal_uInt16 nResult = pDlg->Execute(); + + if( nResult == RET_OK ) + { + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + std::unique_ptr> aGuard; + + if (OutlineView* pOutlineView = dynamic_cast(pView)) + { + pOLV = pOutlineView->GetViewByWindow(mpViewShell->GetActiveWindow()); + aGuard.reset(new OutlineViewModelChangeGuard(*pOutlineView)); + } + + if( pOLV ) + pOLV->EnsureNumberingIsOn(); + + const SfxItemSet pOutputSet( *pDlg->GetOutputItemSet( &aNewAttr ) ); + pView->SetAttributes(pOutputSet, /*bReplaceAll=*/false, /*bSlide*/ pDlg->IsSlideScope(), /*bMaster=*/pDlg->IsApplyToMaster()); + } + + rReq.Done(); +} + +void FuBulletAndPosition::SetCurrentBulletsNumbering(SfxRequest& rReq) +{ + if (!mpDoc || !mpView) + return; + + const sal_uInt16 nSId = rReq.GetSlot(); + if ( nSId != FN_SVX_SET_BULLET && nSId != FN_SVX_SET_NUMBER ) + { + // unexpected SfxRequest + return; + } + + const SfxUInt16Item* pItem = rReq.GetArg(nSId); + if ( !pItem ) + { + rReq.Done(); + return; + } + + SfxItemSetFixed aNewAttr( mpViewShell->GetPool() ); + { + SfxItemSet aEditAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aEditAttr ); + aNewAttr.Put( aEditAttr, false ); + } + + const DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >(mpViewShell); + //Init bullet level in "Customize" tab page in bullet dialog in master page view + const bool bInMasterView = pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::MasterPage; + if ( bInMasterView ) + { + SdrObject* pObj = mpView->GetTextEditObject(); + if( pObj && pObj->GetObjIdentifier() == SdrObjKind::OutlineText ) + { + const sal_uInt16 nLevel = mpView->GetSelectionLevel(); + if( nLevel != 0xFFFF ) + { + //save the itemset value + SfxItemSet aStoreSet( aNewAttr ); + aNewAttr.ClearItem(); + //extend range + aNewAttr.MergeRange( SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL ); + aNewAttr.Put( aStoreSet ); + //put current level user selected + aNewAttr.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) ); + } + } + } + + sal_uInt16 nIdx = pItem->GetValue(); + bool bToggle = false; + if( nIdx == sal_uInt16(0xFFFF) ) + { + // If the nIdx is (sal_uInt16)0xFFFF, means set bullet status to on/off + nIdx = 1; + bToggle = true; + } + nIdx--; + + TypedWhichId nNumItemId = SID_ATTR_NUMBERING_RULE; + const SfxPoolItem* pTmpItem = GetNumBulletItem( aNewAttr, nNumItemId ); + std::unique_ptr pNumRule; + if ( pTmpItem ) + { + pNumRule.reset(new SvxNumRule(static_cast(pTmpItem)->GetNumRule())); + + // get numbering rule corresponding to and apply the needed number formats to + NBOTypeMgrBase* pNumRuleMgr = + NBOutlineTypeMgrFact::CreateInstance( + nSId == FN_SVX_SET_BULLET ? NBOType::Bullets : NBOType::Numbering ); + if ( pNumRuleMgr ) + { + sal_uInt16 nActNumLvl = sal_uInt16(0xFFFF); + if(const SfxUInt16Item* pNumLevelItem = aNewAttr.GetItemIfSet(SID_PARAM_CUR_NUM_LEVEL, false)) + nActNumLvl = pNumLevelItem->GetValue(); + + pNumRuleMgr->SetItems(&aNewAttr); + SvxNumRule aTmpRule( *pNumRule ); + if ( nSId == FN_SVX_SET_BULLET && bToggle && nIdx==0 ) + { + // for toggling bullets get default numbering rule + pNumRuleMgr->ApplyNumRule( aTmpRule, nIdx, nActNumLvl, true ); + } + else + { + pNumRuleMgr->ApplyNumRule( aTmpRule, nIdx, nActNumLvl ); + } + + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < pNumRule->GetLevelCount(); i++) + { + if(nActNumLvl & nMask) + { + const SvxNumberFormat& aFmt(aTmpRule.GetLevel(i)); + pNumRule->SetLevel(i, aFmt); + } + nMask <<= 1; + } + } + } + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + std::unique_ptr> aGuard; + if (OutlineView* pView = dynamic_cast(mpView)) + { + pOLV = pView->GetViewByWindow(mpViewShell->GetActiveWindow()); + aGuard.reset(new OutlineViewModelChangeGuard(*pView)); + } + + SdrOutliner* pOwner = bInMasterView ? mpView->GetTextEditOutliner() : nullptr; + const bool bOutlinerUndoEnabled = pOwner && !pOwner->IsInUndo() && pOwner->IsUndoEnabled(); + SdrModel* pSdrModel = bInMasterView ? &mpView->GetModel() : nullptr; + const bool bModelUndoEnabled = pSdrModel && pSdrModel->IsUndoEnabled(); + + if ( bOutlinerUndoEnabled ) + { + pOwner->UndoActionStart( OLUNDO_ATTR ); + } + else if ( bModelUndoEnabled ) + { + pSdrModel->BegUndo(); + } + + if ( pOLV ) + { + pOLV->ToggleBulletsNumbering( bToggle, nSId == FN_SVX_SET_BULLET, bInMasterView ? nullptr : pNumRule.get() ); + } + else + { + mpView->ChangeMarkedObjectsBulletsNumbering( bToggle, nSId == FN_SVX_SET_BULLET, bInMasterView ? nullptr : pNumRule.get() ); + } + + if (bInMasterView && pNumRule) + { + SfxItemSetFixed aSetAttr( mpViewShell->GetPool() ); + aSetAttr.Put(SvxNumBulletItem( *pNumRule, nNumItemId )); + mpView->SetAttributes(aSetAttr); + } + + if( bOutlinerUndoEnabled ) + { + pOwner->UndoActionEnd(); + } + else if ( bModelUndoEnabled ) + { + pSdrModel->EndUndo(); + } + + pNumRule.reset(); + rReq.Done(); +} + +const SvxNumBulletItem* FuBulletAndPosition::GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId& nNumItemId) +{ + const SvxNumBulletItem* pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false); + + if(pTmpItem) + return pTmpItem; + + nNumItemId = aNewAttr.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE); + pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false); + if (pTmpItem) + return pTmpItem; + + bool bOutliner = false; + bool bTitle = false; + + if( mpView ) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + + for(size_t nNum = 0; nNum < nCount; ++nNum) + { + SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj(); + if( pObj->GetObjInventor() == SdrInventor::Default ) + { + switch(pObj->GetObjIdentifier()) + { + case SdrObjKind::TitleText: + bTitle = true; + break; + case SdrObjKind::OutlineText: + bOutliner = true; + break; + default: + break; + } + } + } + } + + const SvxNumBulletItem *pItem = nullptr; + if(bOutliner) + { + SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool(); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( STR_LAYOUT_OUTLINE + " 1", SfxStyleFamily::Pseudo); + if( pFirstStyleSheet ) + pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false); + } + + if( pItem == nullptr ) + pItem = aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET); + + //DBG_ASSERT( pItem, "No EE_PARA_NUMBULLET in the Pool!" ); + + aNewAttr.Put(pItem->CloneSetWhich(EE_PARA_NUMBULLET)); + + if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET ) + { + const SvxNumBulletItem* pBulletItem = aNewAttr.GetItem(EE_PARA_NUMBULLET); + const SvxNumRule& rLclRule = pBulletItem->GetNumRule(); + SvxNumRule aNewRule( rLclRule ); + aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS ); + + SvxNumBulletItem aNewItem( std::move(aNewRule), EE_PARA_NUMBULLET ); + aNewAttr.Put(aNewItem); + } + + pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false); + return pTmpItem; +} + + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuoltext.cxx b/sd/source/ui/func/fuoltext.cxx new file mode 100644 index 0000000000..fe64cac47d --- /dev/null +++ b/sd/source/ui/func/fuoltext.cxx @@ -0,0 +1,305 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sd { + +const sal_uInt16 SidArray[] = { + SID_STYLE_FAMILY2, + SID_STYLE_FAMILY3, + SID_STYLE_FAMILY5, + SID_STYLE_UPDATE_BY_EXAMPLE, + SID_CUT, + SID_COPY, + SID_PASTE, + SID_SELECTALL, + SID_ATTR_CHAR_FONT, + SID_ATTR_CHAR_POSTURE, + SID_ATTR_CHAR_WEIGHT, + SID_ATTR_CHAR_SHADOWED, + SID_ATTR_CHAR_STRIKEOUT, + SID_ATTR_CHAR_UNDERLINE, + SID_ATTR_CHAR_FONTHEIGHT, + SID_ATTR_CHAR_COLOR, + SID_ATTR_CHAR_KERNING, + SID_OUTLINE_UP, + SID_OUTLINE_DOWN, + SID_OUTLINE_LEFT, + SID_OUTLINE_RIGHT, + //SID_OUTLINE_FORMAT, + SID_OUTLINE_COLLAPSE_ALL, + //SID_OUTLINE_BULLET, + SID_OUTLINE_COLLAPSE, + SID_OUTLINE_EXPAND_ALL, + SID_OUTLINE_EXPAND, + SID_SET_SUPER_SCRIPT, + SID_SET_SUB_SCRIPT, + SID_HYPERLINK_GETLINK, + SID_DEC_INDENT, + SID_INC_INDENT, + SID_PARASPACE_INCREASE, + SID_PARASPACE_DECREASE, + SID_SCALE, + SID_STATUS_PAGE, + SID_STATUS_LAYOUT, + SID_EXPAND_PAGE, + SID_SUMMARY_PAGE, + 0 }; + + +FuOutlineText::FuOutlineText(ViewShell* pViewShell, ::sd::Window* pWindow, + ::sd::View* pView, SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewShell, pWindow, pView, pDoc, rReq), + pOutlineViewShell (static_cast(pViewShell)), + pOutlineView (static_cast(pView)) +{ +} + +/** + * forward to OutlinerView + */ +bool FuOutlineText::Command(const CommandEvent& rCEvt) +{ + bool bResult = false; + + OutlinerView* pOlView = + static_cast(mpView)->GetViewByWindow(mpWindow); + DBG_ASSERT (pOlView, "no OutlineView found"); + + if (pOlView) + { + pOlView->Command(rCEvt); // unfortunately, we do not get a return value + bResult = true; + } + return bResult; +} + + +rtl::Reference FuOutlineText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuOutlineText( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute( rReq ); + return xFunc; +} + +bool FuOutlineText::MouseButtonDown(const MouseEvent& rMEvt) +{ + mpWindow->GrabFocus(); + + bool bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseButtonDown(rMEvt); + + if (bReturn) + { + // Now the attributes of the current text position can be different + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + } + else + { + bReturn = FuPoor::MouseButtonDown(rMEvt); + } + + return bReturn; +} + +bool FuOutlineText::MouseMove(const MouseEvent& rMEvt) +{ + bool bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseMove(rMEvt); + + if (!bReturn) + { + bReturn = FuPoor::MouseMove(rMEvt); + } + + return bReturn; +} + +bool FuOutlineText::MouseButtonUp(const MouseEvent& rMEvt) +{ + bool bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseButtonUp(rMEvt); + + if (bReturn) + { + // Now the attributes of the current text position can be different + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + } + else + { + const SvxFieldItem* pFieldItem = pOutlineView->GetViewByWindow( mpWindow )->GetFieldUnderMousePointer(); + if( pFieldItem ) + { + const SvxFieldData* pField = pFieldItem->GetField(); + + if( auto pURLField = dynamic_cast< const SvxURLField *>( pField ) ) + { + bReturn = true; + mpWindow->ReleaseMouse(); + SfxStringItem aStrItem( SID_FILE_NAME, pURLField->GetURL() ); + SfxStringItem aReferer( SID_REFERER, mpDocSh->GetMedium()->GetName() ); + SfxBoolItem aBrowseItem( SID_BROWSE, true ); + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + + if ( rMEvt.IsMod1() ) + { + // open in new frame + pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aBrowseItem, &aReferer }); + } + else + { + // open in current frame + SfxFrameItem aFrameItem( SID_DOCFRAME, pFrame ); + pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer }); + } + } + } + } + + if( !bReturn ) + bReturn = FuPoor::MouseButtonUp(rMEvt); + + return bReturn; +} + +/** + * Process keyboard input + * @returns sal_True if a KeyEvent is being processed, sal_False otherwise + */ +bool FuOutlineText::KeyInput(const KeyEvent& rKEvt) +{ + bool bReturn = false; + + sal_uInt16 nKeyGroup = rKEvt.GetKeyCode().GetGroup(); + if( !mpDocSh->IsReadOnly() || nKeyGroup == KEYGROUP_CURSOR ) + { + mpWindow->GrabFocus(); + + std::unique_ptr> aGuard; + if( (nKeyGroup != KEYGROUP_CURSOR) && (nKeyGroup != KEYGROUP_FKEYS) ) + aGuard.reset( new OutlineViewModelChangeGuard( *pOutlineView ) ); + + bReturn = pOutlineView->GetViewByWindow(mpWindow)->PostKeyEvent(rKEvt); + + if (bReturn) + { + UpdateForKeyPress (rKEvt); + } + else + { + bReturn = FuPoor::KeyInput(rKEvt); + } + } + + return bReturn; +} + +void FuOutlineText::UpdateForKeyPress (const KeyEvent& rEvent) +{ + // Attributes at the current text position may have changed. + mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray); + + bool bUpdatePreview = true; + switch (rEvent.GetKeyCode().GetCode()) + { + // When just the cursor has been moved the preview only changes when + // it moved to entries of another page. To prevent unnecessary + // updates we check this here. This is an early rejection test, so + // missing a key is not a problem. + case KEY_UP: + case KEY_DOWN: + case KEY_LEFT: + case KEY_RIGHT: + case KEY_HOME: + case KEY_END: + case KEY_PAGEUP: + case KEY_PAGEDOWN: + { + SdPage* pCurrentPage = pOutlineViewShell->GetActualPage(); + bUpdatePreview = (pCurrentPage != pOutlineViewShell->GetActualPage()); + } + break; + } + if (bUpdatePreview) + pOutlineViewShell->UpdatePreview (pOutlineViewShell->GetActualPage()); +} + +/** + * Cut object to clipboard + */ +void FuOutlineText::DoCut() +{ + pOutlineView->GetViewByWindow(mpWindow)->Cut(); +} + +/** + * Copy object to clipboard + */ +void FuOutlineText::DoCopy() +{ + pOutlineView->GetViewByWindow(mpWindow)->Copy(); +} + +/** + * Paste object from clipboard + */ +void FuOutlineText::DoPaste() +{ + pOutlineView->GetViewByWindow(mpWindow)->PasteSpecial(); +} + +/** + * Paste object as unformatted text from clipboard + */ +void FuOutlineText::DoPasteUnformatted() +{ + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewShell->GetActiveWindow() ) ); + if (aDataHelper.GetTransferable().is()) + { + OUString aText; + if (aDataHelper.GetString(SotClipboardFormatId::STRING, aText)) + pOutlineView->GetViewByWindow(mpWindow)->InsertText(aText); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fupage.cxx b/sd/source/ui/func/fupage.cxx new file mode 100644 index 0000000000..6d0a59ac3a --- /dev/null +++ b/sd/source/ui/func/fupage.cxx @@ -0,0 +1,625 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +// arrange Tab-Page + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace com::sun::star; + +namespace sd { + +// 50 cm 28350 +// adapted from writer +#define MAXHEIGHT 28350 +#define MAXWIDTH 28350 + + +static void mergeItemSetsImpl( SfxItemSet& rTarget, const SfxItemSet& rSource ) +{ + const WhichRangesContainer& rRanges = rSource.GetRanges(); + sal_uInt16 p1, p2; + for (sal_Int32 i = 0; i < rRanges.size(); ++i) + { + p1 = rRanges[i].first; + p2 = rRanges[i].second; + + // make ranges discrete + while(i < rRanges.size()-1 && (rRanges[i+1].first - p2 == 1)) + { + p2 = rRanges[i+1].second; + ++i; + } + rTarget.MergeRange( p1, p2 ); + } + + rTarget.Put(rSource); +} + +FuPage::FuPage( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq ) +: FuPoor(pViewSh, pWin, pView, pDoc, rReq), + mrReq(rReq), + mpArgs( rReq.GetArgs() ), + mbPageBckgrdDeleted( false ), + mbMasterPage( false ), + mbDisplayBackgroundTabPage( true ), + mpPage(nullptr), + mpDrawViewShell(nullptr) +{ +} + +rtl::Reference FuPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuPage( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuPage::DoExecute(SfxRequest& rReq) +{ + mpDrawViewShell = dynamic_cast(mpViewShell); + DBG_ASSERT( mpDrawViewShell, "sd::FuPage::FuPage(), called without a current DrawViewShell!" ); + + if( mpDrawViewShell ) + { + mbMasterPage = mpDrawViewShell->GetEditMode() == EditMode::MasterPage; + // we don't really want to format page background with SID_ATTR_PAGE[_SIZE] slots + mbDisplayBackgroundTabPage = ( mpDrawViewShell->GetPageKind() == PageKind::Standard) && + ( nSlotId != SID_ATTR_PAGE_SIZE) && ( nSlotId != SID_ATTR_PAGE ); + mpPage = mpDrawViewShell->getCurrentPage(); + } + + if( !mpPage ) + return; + + // if there are no arguments given, open the dialog + if (!mpArgs || mpArgs->GetItemState(SID_SELECT_BACKGROUND) == SfxItemState::SET) + { + mpView->SdrEndTextEdit(); + mpArgs = ExecuteDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr, rReq); + } + + // if we now have arguments, apply them to current page + if( mpArgs ) + { + ApplyItemSet( mpArgs ); + } +} + +FuPage::~FuPage() +{ +} + +void FuPage::Activate() +{ +} + +void FuPage::Deactivate() +{ +} + +void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr) +{ + if (bMasterPage) + { + if (pStyleSheet) + mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet()); + } + else + { + // Only this page, get attributes for background fill + const SfxItemSet& rBackgroundAttributes = pPage->getSdrPageProperties().GetItemSet(); + + if(drawing::FillStyle_NONE != rBackgroundAttributes.Get(XATTR_FILLSTYLE).GetValue()) + { + // page attributes are used, take them + rMergedAttr.Put(rBackgroundAttributes); + } + else + { + if(pStyleSheet + && drawing::FillStyle_NONE != pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE).GetValue()) + { + // if the page has no fill style, use the settings from the + // background stylesheet (if used) + mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet()); + } + else + { + // no fill style from page, start with no fill style + rMergedAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + } + } + } +} + +const SfxItemSet* FuPage::ExecuteDialog(weld::Window* pParent, const SfxRequest& rReq) +{ + if (!mpDrawViewShell) + return nullptr; + + SfxItemSetFixed< + XATTR_FILL_FIRST, XATTR_FILL_LAST, + EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR, + SID_ATTR_BORDER_OUTER, SID_ATTR_BORDER_OUTER, + SID_ATTR_BORDER_SHADOW, SID_ATTR_BORDER_SHADOW, + SID_ATTR_PAGE, SID_ATTR_PAGE_SHARED, + SID_ATTR_CHAR_GRABBAG, SID_ATTR_CHAR_GRABBAG, + SID_ATTR_PAGE_COLOR, SID_ATTR_PAGE_FILLSTYLE + > aNewAttr(mpDoc->GetPool()); + // Keep it sorted + aNewAttr.MergeRange(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE), + mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE)); + + // Retrieve additional data for dialog + + SvxShadowItem aShadowItem(SID_ATTR_BORDER_SHADOW); + aNewAttr.Put( aShadowItem ); + SvxBoxItem aBoxItem( SID_ATTR_BORDER_OUTER ); + aNewAttr.Put( aBoxItem ); + + aNewAttr.Put( SvxFrameDirectionItem( + mpDoc->GetDefaultWritingMode() == css::text::WritingMode_RL_TB ? SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB, + EE_PARA_WRITINGDIR ) ); + + // Retrieve page-data for dialog + + SvxPageItem aPageItem( SID_ATTR_PAGE ); + aPageItem.SetDescName( mpPage->GetName() ); + aPageItem.SetPageUsage( SvxPageUsage::All ); + aPageItem.SetLandscape( mpPage->GetOrientation() == Orientation::Landscape ); + aPageItem.SetNumType( mpDoc->GetPageNumType() ); + aNewAttr.Put( aPageItem ); + + // size + maSize = mpPage->GetSize(); + SvxSizeItem aSizeItem( SID_ATTR_PAGE_SIZE, maSize ); + aNewAttr.Put( aSizeItem ); + + // Max size + SvxSizeItem aMaxSizeItem( SID_ATTR_PAGE_MAXSIZE, Size( MAXWIDTH, MAXHEIGHT ) ); + aNewAttr.Put( aMaxSizeItem ); + + // paperbin + SvxPaperBinItem aPaperBinItem( SID_ATTR_PAGE_PAPERBIN, static_cast(mpPage->GetPaperBin()) ); + aNewAttr.Put( aPaperBinItem ); + + SvxLRSpaceItem aLRSpaceItem( static_cast(mpPage->GetLeftBorder()), static_cast(mpPage->GetRightBorder()), 0, mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE)); + aNewAttr.Put( aLRSpaceItem ); + + SvxULSpaceItem aULSpaceItem( static_cast(mpPage->GetUpperBorder()), static_cast(mpPage->GetLowerBorder()), mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE)); + aNewAttr.Put( aULSpaceItem ); + + // Application + bool bScale = mpDoc->GetDocumentType() != DocumentType::Draw; + aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT1, bScale ) ); + + bool bFullSize = mpPage->IsMasterPage() ? + mpPage->IsBackgroundFullSize() : static_cast(mpPage->TRG_GetMasterPage()).IsBackgroundFullSize(); + + SfxGrabBagItem grabBag(SID_ATTR_CHAR_GRABBAG); + grabBag.GetGrabBag()["BackgroundFullSize"] <<= bFullSize; + + aNewAttr.Put(grabBag); + + // Merge ItemSet for dialog + + const WhichRangesContainer& rRanges = aNewAttr.GetRanges(); + sal_uInt16 p1 = rRanges[0].first, p2 = rRanges[0].second; + sal_Int32 idx = 1; + while(idx < rRanges.size() && (rRanges[idx].first - p2 == 1)) + { + p2 = rRanges[idx].second; + ++idx; + } + SfxItemSet aMergedAttr( *aNewAttr.GetPool(), p1, p2 ); + + mergeItemSetsImpl( aMergedAttr, aNewAttr ); + + SdStyleSheet* pStyleSheet = mpPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND); + + // merge page background filling to the dialogs input set + if( mbDisplayBackgroundTabPage ) + { + MergePageBackgroundFilling(mpPage, pStyleSheet, mbMasterPage, aMergedAttr); + } + + std::optional< SfxItemSet > pTempSet; + + const sal_uInt16 nId = GetSlotID(); + if (nId == SID_SAVE_BACKGROUND) + { + const XFillStyleItem& rStyleItem = aMergedAttr.Get(XATTR_FILLSTYLE); + if (drawing::FillStyle_BITMAP == rStyleItem.GetValue()) + { + const XFillBitmapItem& rBitmap = aMergedAttr.Get(XATTR_FILLBITMAP); + const GraphicObject& rGraphicObj = rBitmap.GetGraphicObject(); + GraphicHelper::ExportGraphic(pParent, rGraphicObj.GetGraphic(), ""); + } + } + else if (nId == SID_SELECT_BACKGROUND) + { + Graphic aGraphic; + ErrCode nError = ERRCODE_GRFILTER_OPENERROR; + + const SfxItemSet* pArgs = rReq.GetArgs(); + const SfxPoolItem* pItem; + + if (pArgs && pArgs->GetItemState(SID_SELECT_BACKGROUND, true, &pItem) == SfxItemState::SET) + { + OUString aFileName(static_cast(pItem)->GetValue()); + OUString aFilterName; + + if (const SfxStringItem* pFilterItem = pArgs->GetItemIfSet(FN_PARAM_FILTER)) + aFilterName = pFilterItem->GetValue(); + + nError = GraphicFilter::LoadGraphic(aFileName, aFilterName, aGraphic, + &GraphicFilter::GetGraphicFilter()); + } + else + { + SvxOpenGraphicDialog aDlg(SdResId(STR_SET_BACKGROUND_PICTURE), pParent); + + nError = aDlg.Execute(); + if (nError == ERRCODE_NONE) + { + nError = aDlg.GetGraphic(aGraphic); + } + } + + if (nError == ERRCODE_NONE) + { + pTempSet.emplace( mpDoc->GetPool(), svl::Items ); + + pTempSet->Put( XFillStyleItem( drawing::FillStyle_BITMAP ) ); + + // MigrateItemSet makes sure the XFillBitmapItem will have a unique name + SfxItemSetFixed aMigrateSet( mpDoc->GetPool() ); + aMigrateSet.Put(XFillBitmapItem("background", std::move(aGraphic))); + SdrModel::MigrateItemSet( &aMigrateSet, &*pTempSet, mpDoc ); + + pTempSet->Put( XFillBmpStretchItem( true )); + pTempSet->Put( XFillBmpTileItem( false )); + } + } + + else + { + bool bIsImpressDoc = mpDrawViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress; + + // create the dialog + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreateSdTabPageDialog(mpViewShell->GetFrameWeld(), &aMergedAttr, mpDocSh, mbDisplayBackgroundTabPage, bIsImpressDoc) ); + if( pDlg->Execute() == RET_OK ) + pTempSet.emplace( *pDlg->GetOutputItemSet() ); + } + + if (pTempSet && pStyleSheet) + { + pStyleSheet->AdjustToFontHeight(*pTempSet); + + if( mbDisplayBackgroundTabPage ) + { + // if some fillstyle-items are not set in the dialog, then + // try to use the items before + bool bChanges = false; + for( sal_uInt16 i=XATTR_FILL_FIRST; iGetItemState( i ) == SfxItemState::DEFAULT ) + pTempSet->Put( aMergedAttr.Get( i ) ); + else + if( !SfxPoolItem::areSame(aMergedAttr.GetItem( i ), pTempSet->GetItem( i ) ) ) + bChanges = true; + } + } + + // if the background for this page was set to invisible, the background-object has to be deleted, too. + const XFillStyleItem* pTempFillStyleItem = pTempSet->GetItem(XATTR_FILLSTYLE); + assert(pTempFillStyleItem); + if (pTempFillStyleItem->GetValue() == drawing::FillStyle_NONE) + mbPageBckgrdDeleted = true; + else + { + if (pTempSet->GetItemState(XATTR_FILLSTYLE) == SfxItemState::DEFAULT) + { + const XFillStyleItem* pMergedFillStyleItem = aMergedAttr.GetItem(XATTR_FILLSTYLE); + assert(pMergedFillStyleItem); + if (pMergedFillStyleItem->GetValue() == drawing::FillStyle_NONE) + mbPageBckgrdDeleted = true; + } + } + + const XFillGradientItem* pTempGradItem = pTempSet->GetItem(XATTR_FILLGRADIENT); + if (pTempGradItem && pTempGradItem->GetName().isEmpty()) + { + // MigrateItemSet guarantees unique gradient names + SfxItemSetFixed aMigrateSet( mpDoc->GetPool() ); + aMigrateSet.Put( XFillGradientItem("gradient", pTempGradItem->GetGradientValue()) ); + SdrModel::MigrateItemSet( &aMigrateSet, &*pTempSet, mpDoc); + } + + const XFillHatchItem* pTempHatchItem = pTempSet->GetItem(XATTR_FILLHATCH); + if (pTempHatchItem && pTempHatchItem->GetName().isEmpty()) + { + // MigrateItemSet guarantees unique hatch names + SfxItemSetFixed aMigrateSet( mpDoc->GetPool() ); + aMigrateSet.Put( XFillHatchItem("hatch", pTempHatchItem->GetHatchValue()) ); + SdrModel::MigrateItemSet( &aMigrateSet, &*pTempSet, mpDoc); + } + + if( !mbMasterPage && bChanges && mbPageBckgrdDeleted ) + { + mpBackgroundObjUndoAction.reset( new SdBackgroundObjUndoAction( + *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet()) ); + + if(!mpPage->IsMasterPage()) + { + // on normal pages, switch off fill attribute usage + SdrPageProperties& rPageProperties = mpPage->getSdrPageProperties(); + rPageProperties.ClearItem( XATTR_FILLBITMAP ); + rPageProperties.ClearItem( XATTR_FILLGRADIENT ); + rPageProperties.ClearItem( XATTR_FILLHATCH ); + rPageProperties.PutItem(XFillStyleItem(drawing::FillStyle_NONE)); + } + } + + + /* Special treatment: reset the INVALIDS to + NULL-Pointer (otherwise INVALIDs or pointer point + to DefaultItems in the template; both would + prevent the attribute inheritance) */ + pTempSet->ClearInvalidItems(); + + if( mbMasterPage ) + { + mpDocSh->GetUndoManager()->AddUndoAction(std::make_unique( + mpDoc, static_cast(pStyleSheet), &(*pTempSet))); + pStyleSheet->GetItemSet().Put( *pTempSet ); + sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() ); + pStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + } + + // if background filling is set to master pages then clear from page set + if( mbMasterPage ) + { + for( sal_uInt16 nWhich = XATTR_FILL_FIRST; nWhich <= XATTR_FILL_LAST; nWhich++ ) + { + pTempSet->ClearItem( nWhich ); + } + pTempSet->Put(XFillStyleItem(drawing::FillStyle_NONE)); + } + + if( const SvxFrameDirectionItem* pItem = pTempSet->GetItemIfSet( EE_PARA_WRITINGDIR, false ) ) + { + SvxFrameDirection nVal = pItem->GetValue(); + mpDoc->SetDefaultWritingMode( nVal == SvxFrameDirection::Horizontal_RL_TB ? css::text::WritingMode_RL_TB : css::text::WritingMode_LR_TB ); + } + + mpDoc->SetChanged(); + + // BackgroundFill of Masterpage: no hard attributes allowed + SdrPage& rUsedMasterPage = mpPage->IsMasterPage() ? *mpPage : mpPage->TRG_GetMasterPage(); + OSL_ENSURE(rUsedMasterPage.IsMasterPage(), "No MasterPage (!)"); + rUsedMasterPage.getSdrPageProperties().ClearItem(); + OSL_ENSURE(nullptr != rUsedMasterPage.getSdrPageProperties().GetStyleSheet(), + "MasterPage without StyleSheet detected (!)"); + } + + aNewAttr.Put(*pTempSet); + mrReq.Done( aNewAttr ); + + return mrReq.GetArgs(); + } + else + { + return nullptr; + } +} + +void FuPage::ApplyItemSet( const SfxItemSet* pArgs ) +{ + if (!pArgs || !mpDrawViewShell) + return; + + // Set new page-attributes + PageKind ePageKind = mpDrawViewShell->GetPageKind(); + const SfxPoolItem* pPoolItem; + bool bSetPageSizeAndBorder = false; + Size aNewSize(maSize); + sal_Int32 nLeft = -1, nRight = -1, nUpper = -1, nLower = -1; + bool bScaleAll = true; + Orientation eOrientation = mpPage->GetOrientation(); + SdPage* pMasterPage = mpPage->IsMasterPage() ? mpPage : &static_cast(mpPage->TRG_GetMasterPage()); + bool bFullSize = pMasterPage->IsBackgroundFullSize(); + sal_uInt16 nPaperBin = mpPage->GetPaperBin(); + + if( pArgs->GetItemState(SID_ATTR_PAGE, true, &pPoolItem) == SfxItemState::SET ) + { + mpDoc->SetPageNumType(static_cast(pPoolItem)->GetNumType()); + + eOrientation = static_cast(pPoolItem)->IsLandscape() ? + Orientation::Landscape : Orientation::Portrait; + + if( mpPage->GetOrientation() != eOrientation ) + bSetPageSizeAndBorder = true; + + mpDrawViewShell->ResetActualPage(); + } + + if( pArgs->GetItemState(SID_ATTR_PAGE_SIZE, true, &pPoolItem) == SfxItemState::SET ) + { + aNewSize = static_cast(pPoolItem)->GetSize(); + + if( mpPage->GetSize() != aNewSize ) + bSetPageSizeAndBorder = true; + } + + if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE), + true, &pPoolItem) == SfxItemState::SET ) + { + nLeft = static_cast(pPoolItem)->GetLeft(); + nRight = static_cast(pPoolItem)->GetRight(); + + if( mpPage->GetLeftBorder() != nLeft || mpPage->GetRightBorder() != nRight ) + bSetPageSizeAndBorder = true; + + } + + if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE), + true, &pPoolItem) == SfxItemState::SET ) + { + nUpper = static_cast(pPoolItem)->GetUpper(); + nLower = static_cast(pPoolItem)->GetLower(); + + if( mpPage->GetUpperBorder() != nUpper || mpPage->GetLowerBorder() != nLower ) + bSetPageSizeAndBorder = true; + } + + if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT1), true, &pPoolItem) == SfxItemState::SET ) + { + bScaleAll = static_cast(pPoolItem)->GetValue(); + } + + if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_CHAR_GRABBAG, true, &pPoolItem)) + { + SfxGrabBagItem const*const pGrabBag(static_cast(pPoolItem)); + const auto pGrabBagInner = pGrabBag->GetGrabBag(); + const auto iter = pGrabBagInner.find("BackgroundFullSize"); + assert(iter != pGrabBagInner.end()); + if (iter->second >>= bFullSize) + { + if (pMasterPage->IsBackgroundFullSize() != bFullSize) + { + bSetPageSizeAndBorder = true; + } + } + } + + // Paper Bin + if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_PAPERBIN), true, &pPoolItem) == SfxItemState::SET ) + { + nPaperBin = static_cast(pPoolItem)->GetValue(); + + if( mpPage->GetPaperBin() != nPaperBin ) + bSetPageSizeAndBorder = true; + } + + if (nLeft == -1 && nUpper != -1) + { + bSetPageSizeAndBorder = true; + nLeft = mpPage->GetLeftBorder(); + nRight = mpPage->GetRightBorder(); + } + else if (nLeft != -1 && nUpper == -1) + { + bSetPageSizeAndBorder = true; + nUpper = mpPage->GetUpperBorder(); + nLower = mpPage->GetLowerBorder(); + } + + if( bSetPageSizeAndBorder || !mbMasterPage ) + mpDrawViewShell->SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize ); + + // if bMasterPage==sal_False then create a background-object for this page with the + // properties set in the dialog before, but if mbPageBckgrdDeleted==sal_True then + // the background of this page was set to invisible, so it would be a mistake + // to create a new background-object for this page ! + + if( mbDisplayBackgroundTabPage ) + { + if( !mbMasterPage && !mbPageBckgrdDeleted ) + { + // Only this page + mpBackgroundObjUndoAction.reset( new SdBackgroundObjUndoAction( + *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet()) ); + SfxItemSet aSet( *pArgs ); + sdr::properties::CleanupFillProperties(aSet); + mpPage->getSdrPageProperties().ClearItem(); + mpPage->getSdrPageProperties().PutItemSet(aSet); + } + } + + // add undo action for background object + if( mpBackgroundObjUndoAction ) + { + // set merge flag, because a SdUndoGroupAction could have been inserted before + mpDocSh->GetUndoManager()->AddUndoAction( std::move(mpBackgroundObjUndoAction), true ); + } + + // Objects can not be bigger than ViewSize + Size aPageSize = mpDoc->GetSdPage(0, ePageKind)->GetSize(); + Size aViewSize(aPageSize.Width() * 3, aPageSize.Height() * 2); + mpDoc->SetMaxObjSize(aViewSize); + + // if necessary, we tell Preview the new context + mpDrawViewShell->UpdatePreview( mpDrawViewShell->GetActualPage() ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuparagr.cxx b/sd/source/ui/func/fuparagr.cxx new file mode 100644 index 0000000000..ac5d876360 --- /dev/null +++ b/sd/source/ui/func/fuparagr.cxx @@ -0,0 +1,162 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace sd { + + +FuParagraph::FuParagraph ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuParagraph::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuParagraph( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuParagraph::DoExecute( SfxRequest& rReq ) +{ + const SfxItemSet* pArgs = rReq.GetArgs(); + + OutlinerView* pOutlView = mpView->GetTextEditOutlinerView(); + ::Outliner* pOutliner = mpView->GetTextEditOutliner(); + + if( !pArgs ) + { + SfxItemSet aEditAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aEditAttr ); + SfxItemPool *pPool = aEditAttr.GetPool(); + SfxItemSetFixed aNewAttr( *pPool ); + + aNewAttr.Put( aEditAttr ); + + // left border is offset + const ::tools::Long nOff = aNewAttr.Get( EE_PARA_LRSPACE ).GetTextLeft(); + // conversion since TabulatorTabPage always uses Twips! + SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff ); + aNewAttr.Put( aOff ); + + if( pOutlView && pOutliner ) + { + ESelection eSelection = pOutlView->GetSelection(); + aNewAttr.Put( SfxInt16Item( ATTR_NUMBER_NEWSTART_AT, pOutliner->GetNumberingStartValue( eSelection.nStartPara ) ) ); + aNewAttr.Put( SfxBoolItem( ATTR_NUMBER_NEWSTART, pOutliner->IsParaIsNumberingRestart( eSelection.nStartPara ) ) ); + } + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSdParagraphTabDlg(mpViewShell->GetFrameWeld(), &aNewAttr)); + + sal_uInt16 nResult = pDlg->Execute(); + + switch( nResult ) + { + case RET_OK: + { + rReq.Done( *( pDlg->GetOutputItemSet() ) ); + + pArgs = rReq.GetArgs(); + } + break; + + default: + return; // Cancel + } + } + mpView->SetAttributes( *pArgs ); + + if( pOutlView && pOutliner ) + { + ESelection eSelection = pOutlView->GetSelection(); + + if( const SfxBoolItem* pItem = pArgs->GetItemIfSet( ATTR_NUMBER_NEWSTART, false ) ) + { + const bool bNewStart = pItem->GetValue(); + pOutliner->SetParaIsNumberingRestart( eSelection.nStartPara, bNewStart ); + } + + if( const SfxInt16Item* pItem = pArgs->GetItemIfSet( ATTR_NUMBER_NEWSTART_AT, false ) ) + { + const sal_Int16 nStartAt = pItem->GetValue(); + pOutliner->SetNumberingStartValue( eSelection.nStartPara, nStartAt ); + } + } + + // invalidate slots + static const sal_uInt16 SidArray[] = { + SID_ATTR_TABSTOP, + SID_ATTR_PARA_ADJUST_LEFT, + SID_ATTR_PARA_ADJUST_RIGHT, + SID_ATTR_PARA_ADJUST_CENTER, + SID_ATTR_PARA_ADJUST_BLOCK, + SID_ATTR_PARA_LINESPACE, + SID_ATTR_PARA_LINESPACE_10, + SID_ATTR_PARA_LINESPACE_15, + SID_ATTR_PARA_LINESPACE_20, + SID_ATTR_PARA_ULSPACE, + SID_ATTR_PARA_LRSPACE, + SID_DEC_INDENT, + SID_INC_INDENT, + SID_ATTR_PARA_LEFT_TO_RIGHT, + SID_ATTR_PARA_RIGHT_TO_LEFT, + SID_RULER_TEXT_RIGHT_TO_LEFT, + SID_PARASPACE_INCREASE, + SID_PARASPACE_DECREASE, + 0 }; + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); +} + +void FuParagraph::Activate() +{ +} + +void FuParagraph::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fupoor.cxx b/sd/source/ui/func/fupoor.cxx new file mode 100644 index 0000000000..e6fe25f711 --- /dev/null +++ b/sd/source/ui/func/fupoor.cxx @@ -0,0 +1,1135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include + +using namespace ::com::sun::star; + +namespace sd { + + +FuPoor::FuPoor ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDrDoc, + SfxRequest& rReq) + : mpView(pView), + mpViewShell(pViewSh), + mpWindow(pWin), + mpDocSh( pDrDoc->GetDocSh() ), + mpDoc(pDrDoc), + nSlotId( rReq.GetSlot() ), + aScrollTimer("sd FuPoor aScrollTimer"), + aDragTimer("sd FuPoor aDragTimer"), + bIsInDragMode(false), + bNoScrollUntilInside (true), + aDelayToScrollTimer("sd FuPoor aDelayToScrollTimer"), + bScrollable (false), + bDelayActive (false), + bFirstMouseMove (false), + // remember MouseButton state + mnCode(0) +{ + ReceiveRequest(rReq); + + aScrollTimer.SetInvokeHandler( LINK(this, FuPoor, ScrollHdl) ); + aScrollTimer.SetTimeout(SELENG_AUTOREPEAT_INTERVAL); + + aDragTimer.SetInvokeHandler( LINK(this, FuPoor, DragHdl) ); + aDragTimer.SetTimeout(SELENG_DRAGDROP_TIMEOUT); + + aDelayToScrollTimer.SetInvokeHandler( LINK(this, FuPoor, DelayHdl) ); + aDelayToScrollTimer.SetTimeout(2000); +} + +FuPoor::~FuPoor() +{ + aDragTimer.Stop(); + aScrollTimer.Stop(); + aDelayToScrollTimer.Stop(); +} + +void FuPoor::Activate() +{ +} + +void FuPoor::Deactivate() +{ + aDragTimer.Stop(); + aScrollTimer.Stop(); + aDelayToScrollTimer.Stop (); + bScrollable = bDelayActive = false; + + if (mpWindow && mpWindow->IsMouseCaptured()) + mpWindow->ReleaseMouse(); +} + +void FuPoor::SetWindow(::sd::Window* pWin) +{ + mpWindow = pWin; +} + +/** + * scroll when approached the border of the window; is called by MouseMove + */ +void FuPoor::ForceScroll(const Point& aPixPos) +{ + aScrollTimer.Stop(); + + if ( mpView->IsDragHelpLine() || mpView->IsSetPageOrg() || + SlideShow::IsRunning( mpViewShell->GetViewShellBase() ) ) + return; + + Point aPos = mpWindow->OutputToScreenPixel(aPixPos); + const ::tools::Rectangle& rRect = mpViewShell->GetAllWindowRect(); + + if ( bNoScrollUntilInside ) + { + if ( rRect.Contains(aPos) ) + bNoScrollUntilInside = false; + } + else + { + short dx = 0, dy = 0; + + if ( aPos.X() <= rRect.Left() ) dx = -1; + if ( aPos.X() >= rRect.Right() ) dx = 1; + if ( aPos.Y() <= rRect.Top() ) dy = -1; + if ( aPos.Y() >= rRect.Bottom() ) dy = 1; + + if ( dx != 0 || dy != 0 ) + { + if (bScrollable) + { + // scroll action in derived class + mpViewShell->ScrollLines(dx, dy); + aScrollTimer.Start(); + } + else if (! bDelayActive) StartDelayToScrollTimer (); + } + } +} + +/** + * timer handler for window scrolling + */ +IMPL_LINK_NOARG(FuPoor, ScrollHdl, Timer *, void) +{ + Point aPnt(mpWindow->GetPointerPosPixel()); + + // use remembered MouseButton state to create correct + // MouseEvents for this artificial MouseMove. + MouseMove(MouseEvent(aPnt, 1, MouseEventModifiers::NONE, GetMouseButtonCode())); +} + +/** + * handle keyboard events + * @returns sal_True if the event was handled, sal_False otherwise + */ +bool FuPoor::KeyInput(const KeyEvent& rKEvt) +{ + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + bool bReturn = false; + bool bSlideShow = SlideShow::IsRunning( mpViewShell->GetViewShellBase() ); + + switch (nCode) + { + case KEY_RETURN: + { + if(rKEvt.GetKeyCode().IsMod1()) + { + if( auto pDrawViewShell = dynamic_cast( mpViewShell )) + { + SdPage* pActualPage = pDrawViewShell->GetActualPage(); + SdrTextObj* pCandidate = nullptr; + + if(pActualPage) + { + SdrObjListIter aIter(pActualPage, SdrIterMode::DeepNoGroups); + + while(aIter.IsMore() && !pCandidate) + { + SdrObject* pObj = aIter.Next(); + + if(auto pTextObj = DynCastSdrTextObj( pObj )) + { + SdrInventor nInv(pObj->GetObjInventor()); + SdrObjKind nKnd(pObj->GetObjIdentifier()); + + if(SdrInventor::Default == nInv && + (SdrObjKind::TitleText == nKnd || SdrObjKind::OutlineText == nKnd || SdrObjKind::Text == nKnd)) + { + pCandidate = pTextObj; + } + } + } + } + + if(pCandidate) + { + mpView->UnMarkAll(); + mpView->MarkObj(pCandidate, mpView->GetSdrPageView()); + + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( + SID_ATTR_CHAR, SfxCallMode::ASYNCHRON); + } + else + { + // insert a new page with the same page layout + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( + SID_INSERTPAGE_QUICK, SfxCallMode::ASYNCHRON); + } + + // consumed + bReturn = true; + } + } + else + { + // activate OLE object on RETURN for selected object + // activate text edit on RETURN for selected object + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if( !mpView->IsTextEdit() && 1 == rMarkList.GetMarkCount() ) + { + SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + + if( dynamic_cast< const SdrOle2Obj* >( pObj ) && !mpDocSh->IsUIActive() ) + { + //HMHmpView->HideMarkHdl(); + mpViewShell->ActivateObject(static_cast(pObj), css::embed::EmbedVerbs::MS_OLEVERB_PRIMARY); + } + else if( pObj && pObj->IsEmptyPresObj() && dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr ) + { + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_INSERT_GRAPHIC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } + else + { + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_CHAR, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } + + // consumed + bReturn = true; + } + } + } + break; + + case KEY_TAB: + { + // handle Mod1 and Mod2 to get travelling running on different systems + if(rKEvt.GetKeyCode().IsMod1() || rKEvt.GetKeyCode().IsMod2()) + { + // do something with a selected handle? + const SdrHdlList& rHdlList = mpView->GetHdlList(); + bool bForward(!rKEvt.GetKeyCode().IsShift()); + + const_cast(rHdlList).TravelFocusHdl(bForward); + + // guarantee visibility of focused handle + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + if(pHdl) + { + Point aHdlPosition(pHdl->GetPos()); + ::tools::Rectangle aVisRect(aHdlPosition - Point(100, 100), Size(200, 200)); + mpView->MakeVisible(aVisRect, *mpWindow); + } + + // consumed + bReturn = true; + } + } + break; + + case KEY_ESCAPE: + { + bReturn = FuPoor::cancel(); + } + break; + + case KEY_ADD: + { + if (!mpView->IsTextEdit() && !bSlideShow && !mpDocSh->IsUIActive()) + { + // increase zoom + mpViewShell->SetZoom(mpWindow->GetZoom() * 3 / 2); + + if( auto pViewShell = dynamic_cast( mpViewShell )) + pViewShell->SetZoomOnPage(false); + + bReturn = true; + } + } + break; + + case KEY_SUBTRACT: + { + if (!mpView->IsTextEdit() && !bSlideShow && !mpDocSh->IsUIActive()) + { + // decrease zoom + mpViewShell->SetZoom(mpWindow->GetZoom() * 2 / 3); + + if( auto pViewShell = dynamic_cast( mpViewShell )) + pViewShell->SetZoomOnPage(false); + + bReturn = true; + } + } + break; + + case KEY_MULTIPLY: + { + if (!mpView->IsTextEdit() && !bSlideShow) + { + // zoom to page + mpViewShell->GetViewFrame()->GetDispatcher()-> + Execute(SID_SIZE_PAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + bReturn = true; + } + } + break; + + case KEY_DIVIDE: + { + if (!mpView->IsTextEdit() && !bSlideShow) + { + // zoom to selected objects + mpViewShell->GetViewFrame()->GetDispatcher()-> + Execute(SID_SIZE_OPTIMAL, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + bReturn = true; + } + } + break; + + case KEY_POINT: + { + ZoomList* pZoomList = mpViewShell->GetZoomList(); + + if (!mpView->IsTextEdit() && pZoomList->IsNextPossible() && !bSlideShow && !mpDocSh->IsUIActive()) + { + // use next ZoomRect + mpViewShell->SetZoomRect(pZoomList->GetNextZoomRect()); + bReturn = true; + } + } + break; + + case KEY_COMMA: + { + ZoomList* pZoomList = mpViewShell->GetZoomList(); + + if (!mpView->IsTextEdit() && pZoomList->IsPreviousPossible() && !bSlideShow && !mpDocSh->IsUIActive()) + { + // use previous ZoomRect + mpViewShell->SetZoomRect(pZoomList->GetPreviousZoomRect()); + bReturn = true; + } + } + break; + + case KEY_HOME: + { + if (!mpView->IsTextEdit() && !bSlideShow) + if (auto pDrawViewShell = dynamic_cast( mpViewShell )) + { + // jump to first page + pDrawViewShell->SwitchPage(0); + bReturn = true; + } + } + break; + + case KEY_END: + { + if (!mpView->IsTextEdit() && !bSlideShow) + if (auto pDrawViewShell = dynamic_cast( mpViewShell )) + { + // jump to last page + SdPage* pPage = pDrawViewShell->GetActualPage(); + pDrawViewShell->SwitchPage(mpDoc->GetSdPageCount( + pPage->GetPageKind()) - 1); + bReturn = true; + } + } + break; + + case KEY_PAGEUP: + { + if( rKEvt.GetKeyCode().IsMod1() && rKEvt.GetKeyCode().IsMod2() ) + break; + if( bSlideShow) + break; + + if( auto pDrawViewShell = dynamic_cast( mpViewShell ) ) + { + // The page-up key switches layers or pages depending on the + // modifier key. + if ( ! rKEvt.GetKeyCode().GetModifier()) + { + // With no modifier pressed we move to the previous + // slide. + mpView->SdrEndTextEdit(); + + // Previous page. + bReturn = true; + SdPage* pPage = pDrawViewShell->GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + + if (nSdPage > 0) + { + // Switch the page and send events regarding + // deactivation the old page and activating the new + // one. + TabControl& rPageTabControl = + pDrawViewShell->GetPageTabControl(); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendDeactivatePageEvent (); + pDrawViewShell->SwitchPage(nSdPage - 1); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendActivatePageEvent (); + } + } + else if (rKEvt.GetKeyCode().IsMod1()) + { + // With the CONTROL modifier we switch layers. + if (pDrawViewShell->IsLayerModeActive()) + { + // Moves to the previous layer. + SwitchLayer (-1); + } + } + } + } + break; + + case KEY_PAGEDOWN: + { + if( rKEvt.GetKeyCode().IsMod1() && rKEvt.GetKeyCode().IsMod2() ) + break; + if(dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bSlideShow) + { + // The page-down key switches layers or pages depending on the + // modifier key. + if ( ! rKEvt.GetKeyCode().GetModifier()) + { + // With no modifier pressed we move to the next slide. + mpView->SdrEndTextEdit(); + + // Next page. + bReturn = true; + SdPage* pPage = static_cast(mpViewShell)->GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + + if (nSdPage < mpDoc->GetSdPageCount(pPage->GetPageKind()) - 1) + { + // Switch the page and send events regarding + // deactivation the old page and activating the new + // one. + TabControl& rPageTabControl = + static_cast(mpViewShell)->GetPageTabControl(); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendDeactivatePageEvent (); + static_cast(mpViewShell)->SwitchPage(nSdPage + 1); + if (rPageTabControl.IsReallyShown()) + rPageTabControl.SendActivatePageEvent (); + } + } + else if (rKEvt.GetKeyCode().IsMod1()) + { + // With the CONTROL modifier we switch layers. + if (static_cast(mpViewShell)->IsLayerModeActive()) + { + // With the layer mode active pressing page-down + // moves to the next layer. + SwitchLayer (+1); + } + } + } + } + break; + + // change select state when focus is on poly point + case KEY_SPACE: + { + const SdrHdlList& rHdlList = mpView->GetHdlList(); + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + if(pHdl) + { + if(pHdl->GetKind() == SdrHdlKind::Poly) + { + // rescue ID of point with focus + sal_uInt32 nPol(pHdl->GetPolyNum()); + sal_uInt32 nPnt(pHdl->GetPointNum()); + + if(mpView->IsPointMarked(*pHdl)) + { + if(rKEvt.GetKeyCode().IsShift()) + { + mpView->UnmarkPoint(*pHdl); + } + } + else + { + if(!rKEvt.GetKeyCode().IsShift()) + { + mpView->UnmarkAllPoints(); + } + + mpView->MarkPoint(*pHdl); + } + + if(nullptr == rHdlList.GetFocusHdl()) + { + // restore point with focus + SdrHdl* pNewOne = nullptr; + + for(size_t a = 0; !pNewOne && a < rHdlList.GetHdlCount(); ++a) + { + SdrHdl* pAct = rHdlList.GetHdl(a); + + if(pAct + && pAct->GetKind() == SdrHdlKind::Poly + && pAct->GetPolyNum() == nPol + && pAct->GetPointNum() == nPnt) + { + pNewOne = pAct; + } + } + + if(pNewOne) + { + const_cast(rHdlList).SetFocusHdl(pNewOne); + } + } + + bReturn = true; + } + } + } + break; + + case KEY_UP: + case KEY_DOWN: + case KEY_LEFT: + case KEY_RIGHT: + { + if (!mpView->IsTextEdit() && !bSlideShow) + { + ::tools::Long nX = 0; + ::tools::Long nY = 0; + + if (nCode == KEY_UP) + { + // scroll up + nX = 0; + nY =-1; + } + else if (nCode == KEY_DOWN) + { + // scroll down + nX = 0; + nY = 1; + } + else if (nCode == KEY_LEFT) + { + // scroll left + nX =-1; + nY = 0; + } + else if (nCode == KEY_RIGHT) + { + // scroll right + nX = 1; + nY = 0; + } + + if (mpView->AreObjectsMarked() && !rKEvt.GetKeyCode().IsMod1() && + !mpDocSh->IsReadOnly()) + { + const SdrHdlList& rHdlList = mpView->GetHdlList(); + SdrHdl* pHdl = rHdlList.GetFocusHdl(); + + bool bIsMoveOfConnectedHandle(false); + bool bOldSuppress = false; + SdrEdgeObj* pEdgeObj = nullptr; + if(pHdl) + pEdgeObj = dynamic_cast( pHdl->GetObj() ); + + if(pEdgeObj && 0 == pHdl->GetPolyNum()) + { + if(0 == pHdl->GetPointNum()) + { + if(pEdgeObj->GetConnection(true).GetSdrObject()) + { + bIsMoveOfConnectedHandle = true; + } + } + if(1 == pHdl->GetPointNum()) + { + if(pEdgeObj->GetConnection(false).GetSdrObject()) + { + bIsMoveOfConnectedHandle = true; + } + } + } + + if(pEdgeObj) + { + // Suppress default connects to inside object and object center + bOldSuppress = pEdgeObj->GetSuppressDefaultConnect(); + pEdgeObj->SetSuppressDefaultConnect(true); + } + + if(bIsMoveOfConnectedHandle) + { + sal_uInt16 nMarkHdSiz(mpView->GetMarkHdlSizePixel()); + Size aHalfConSiz(nMarkHdSiz + 1, nMarkHdSiz + 1); + aHalfConSiz = mpWindow->PixelToLogic(aHalfConSiz); + + if(100 < aHalfConSiz.Width()) + nX *= aHalfConSiz.Width(); + else + nX *= 100; + + if(100 < aHalfConSiz.Height()) + nY *= aHalfConSiz.Height(); + else + nY *= 100; + } + else if(rKEvt.GetKeyCode().IsMod2()) + { + // move in 1 pixel distance + Size aLogicSizeOnePixel = mpWindow->PixelToLogic(Size(1,1)); + nX *= aLogicSizeOnePixel.Width(); + nY *= aLogicSizeOnePixel.Height(); + } + else if(rKEvt.GetKeyCode().IsShift()) + { + nX *= 1000; + nY *= 1000; + } + else + { + // old, fixed move distance + nX *= 100; + nY *= 100; + } + + if(nullptr == pHdl) + { + // only take action when move is allowed + if(mpView->IsMoveAllowed()) + { + // restrict movement to WorkArea + const ::tools::Rectangle& rWorkArea = mpView->GetWorkArea(); + + if(!rWorkArea.IsEmpty()) + { + ::tools::Rectangle aMarkRect(mpView->GetMarkedObjRect()); + aMarkRect.Move(nX, nY); + + if(!aMarkRect.Contains(rWorkArea)) + { + if(aMarkRect.Left() < rWorkArea.Left()) + { + nX += rWorkArea.Left() - aMarkRect.Left(); + } + + if(aMarkRect.Right() > rWorkArea.Right()) + { + nX -= aMarkRect.Right() - rWorkArea.Right(); + } + + if(aMarkRect.Top() < rWorkArea.Top()) + { + nY += rWorkArea.Top() - aMarkRect.Top(); + } + + if(aMarkRect.Bottom() > rWorkArea.Bottom()) + { + nY -= aMarkRect.Bottom() - rWorkArea.Bottom(); + } + } + } + + // no handle selected + if(0 != nX || 0 != nY) + { + mpView->MoveAllMarked(Size(nX, nY)); + + mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow); + } + } + } + else + { + // move handle with index nHandleIndex + if (nX || nY) + { + // now move the Handle (nX, nY) + Point aStartPoint(pHdl->GetPos()); + Point aEndPoint(pHdl->GetPos() + Point(nX, nY)); + const SdrDragStat& rDragStat = mpView->GetDragStat(); + + // start dragging + mpView->BegDragObj(aStartPoint, nullptr, pHdl, 0); + + if(mpView->IsDragObj()) + { + bool bWasNoSnap = rDragStat.IsNoSnap(); + bool bWasSnapEnabled = mpView->IsSnapEnabled(); + + // switch snapping off + if(!bWasNoSnap) + const_cast(rDragStat).SetNoSnap(); + if(bWasSnapEnabled) + mpView->SetSnapEnabled(false); + + mpView->MovAction(aEndPoint); + mpView->EndDragObj(); + + // restore snap + if(!bWasNoSnap) + const_cast(rDragStat).SetNoSnap(bWasNoSnap); + if(bWasSnapEnabled) + mpView->SetSnapEnabled(bWasSnapEnabled); + } + + // make moved handle visible + ::tools::Rectangle aVisRect(aEndPoint - Point(100, 100), Size(200, 200)); + mpView->MakeVisible(aVisRect, *mpWindow); + } + } + + if(pEdgeObj) + { + // Restore original suppress value + pEdgeObj->SetSuppressDefaultConnect(bOldSuppress); + } + } + else + { + // scroll page + mpViewShell->ScrollLines(nX, nY); + } + + bReturn = true; + } + } + break; + } + + if (bReturn) + { + mpWindow->ReleaseMouse(); + } + + // when a text-editable object is selected and the + // input character is printable, activate text edit on that object + // and feed character to object + if(!bReturn && !mpDocSh->IsReadOnly()) + { + if (!mpView->IsTextEdit()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if(1 == rMarkList.GetMarkCount()) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + // #i118485# allow TextInput for OLEs, too + if( DynCastSdrTextObj( pObj ) != nullptr && pObj->HasTextEdit()) + { + // use common IsSimpleCharInput from the EditEngine. + bool bPrintable(EditEngine::IsSimpleCharInput(rKEvt)); + + if(bPrintable) + { + // try to activate textedit mode for the selected object + SfxStringItem aInputString(SID_ATTR_CHAR, OUString(rKEvt.GetCharCode())); + + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_ATTR_CHAR, + SfxCallMode::ASYNCHRON, + { &aInputString }); + + // consumed + bReturn = true; + } + } + } + else + { + // test if there is a title object there. If yes, try to + // set it to edit mode and start typing... + DrawViewShell* pDrawViewShell = dynamic_cast(mpViewShell); + if (pDrawViewShell && EditEngine::IsSimpleCharInput(rKEvt)) + { + SdPage* pActualPage = pDrawViewShell->GetActualPage(); + SdrTextObj* pCandidate = nullptr; + + if(pActualPage) + { + SdrObjListIter aIter(pActualPage, SdrIterMode::DeepNoGroups); + + while(aIter.IsMore() && !pCandidate) + { + SdrObject* pObj = aIter.Next(); + + if(auto pTextObj = DynCastSdrTextObj( pObj )) + { + SdrInventor nInv(pObj->GetObjInventor()); + SdrObjKind nKnd(pObj->GetObjIdentifier()); + + if(SdrInventor::Default == nInv && SdrObjKind::TitleText == nKnd) + { + pCandidate = pTextObj; + } + } + } + } + + // when candidate found and candidate is untouched, start editing text... + if(pCandidate && pCandidate->IsEmptyPresObj()) + { + mpView->UnMarkAll(); + mpView->MarkObj(pCandidate, mpView->GetSdrPageView()); + SfxStringItem aInputString(SID_ATTR_CHAR, OUString(rKEvt.GetCharCode())); + + mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( + SID_ATTR_CHAR, + SfxCallMode::ASYNCHRON, + { &aInputString }); + + // consumed + bReturn = true; + } + } + } + } + } + + return bReturn; +} + +bool FuPoor::MouseMove(const MouseEvent& ) +{ + return false; +} + +void FuPoor::SelectionHasChanged() +{ + const SdrHdlList& rHdlList = mpView->GetHdlList(); + const_cast(rHdlList).ResetFocusHdl(); +} + +/** + * Cut object to clipboard + */ +void FuPoor::DoCut() +{ + if (mpView) + { + mpView->DoCut(); + } +} + +/** + * Copy object to clipboard + */ +void FuPoor::DoCopy() +{ + if (mpView) + { + mpView->DoCopy(); + } +} + +/** + * Paste object from clipboard + */ +void FuPoor::DoPaste() +{ + if (mpView) + { + mpView->DoPaste(mpWindow); + } +} + +/** + * Paste unformatted text from clipboard + */ +void FuPoor::DoPasteUnformatted() +{ + if (mpView) + { + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewShell->GetActiveWindow() ) ); + if (aDataHelper.GetTransferable().is()) + { + sal_Int8 nAction = DND_ACTION_COPY; + mpView->InsertData( aDataHelper, + mpWindow->PixelToLogic( ::tools::Rectangle( Point(), mpWindow->GetOutputSizePixel() ).Center() ), + nAction, false, SotClipboardFormatId::STRING); + } + } +} + +/** + * Timer handler for Drag&Drop + */ +IMPL_LINK_NOARG(FuPoor, DragHdl, Timer *, void) +{ + if( !mpView ) + return; + + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + SdrHdl* pHdl = mpView->PickHandle(aMDPos); + + if ( pHdl==nullptr && mpView->IsMarkedHit(aMDPos, nHitLog) + && !mpView->IsPresObjSelected(false) ) + { + mpWindow->ReleaseMouse(); + bIsInDragMode = true; + mpView->StartDrag( aMDPos, mpWindow ); + } +} + +bool FuPoor::Command(const CommandEvent& rCEvt) +{ + return mpView->Command(rCEvt,mpWindow); +} + +/** + * Timer handler for window scrolling + */ +IMPL_LINK_NOARG(FuPoor, DelayHdl, Timer *, void) +{ + aDelayToScrollTimer.Stop (); + bScrollable = true; + + Point aPnt(mpWindow->GetPointerPosPixel()); + + // use remembered MouseButton state to create correct + // MouseEvents for this artificial MouseMove. + MouseMove(MouseEvent(aPnt, 1, MouseEventModifiers::NONE, GetMouseButtonCode())); +} + +bool FuPoor::MouseButtonUp (const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + aDelayToScrollTimer.Stop (); + bScrollable = bDelayActive = false; + return bScrollable; +} + +bool FuPoor::MouseButtonDown(const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + return false; +} + +void FuPoor::StartDelayToScrollTimer () +{ + bDelayActive = true; + aDelayToScrollTimer.Start (); +} + +bool FuPoor::RequestHelp(const HelpEvent& rHEvt) +{ + bool bReturn = false; + + SdrPageView* pPV = mpView->GetSdrPageView(); + + if (pPV) + { + SdPage* pPage = static_cast( pPV->GetPage() ); + + if (pPage) + { + bReturn = FmFormPage::RequestHelp(mpWindow, mpView, rHEvt); + } + } + + return bReturn; +} + +void FuPoor::ReceiveRequest(SfxRequest& /*rReq*/) +{ +} + +rtl::Reference FuPoor::CreateDefaultObject(const sal_uInt16, const ::tools::Rectangle& ) +{ + // empty base implementation + return nullptr; +} + +void FuPoor::ImpForceQuadratic(::tools::Rectangle& rRect) +{ + if(rRect.GetWidth() > rRect.GetHeight()) + { + rRect = ::tools::Rectangle( + Point(rRect.Left() + ((rRect.GetWidth() - rRect.GetHeight()) / 2), rRect.Top()), + Size(rRect.GetHeight(), rRect.GetHeight())); + } + else + { + rRect = ::tools::Rectangle( + Point(rRect.Left(), rRect.Top() + ((rRect.GetHeight() - rRect.GetWidth()) / 2)), + Size(rRect.GetWidth(), rRect.GetWidth())); + } +} + +void FuPoor::SwitchLayer (sal_Int32 nOffset) +{ + auto pDrawViewShell = dynamic_cast( mpViewShell ); + if(!pDrawViewShell) + return; + + // Calculate the new index. + sal_Int32 nIndex = pDrawViewShell->GetActiveTabLayerIndex() + nOffset; + + // Make sure the new index lies inside the range of valid indices. + if (nIndex < 0) + nIndex = 0; + else if (nIndex >= pDrawViewShell->GetTabLayerCount ()) + nIndex = pDrawViewShell->GetTabLayerCount() - 1; + + // Set the new active layer. + if (nIndex != pDrawViewShell->GetActiveTabLayerIndex ()) + { + LayerTabBar* pLayerTabControl = + static_cast(mpViewShell)->GetLayerTabControl(); + if (pLayerTabControl != nullptr) + pLayerTabControl->SendDeactivatePageEvent (); + + pDrawViewShell->SetActiveTabLayerIndex (nIndex); + + if (pLayerTabControl != nullptr) + pLayerTabControl->SendActivatePageEvent (); + } +} + +/** is called when the current function should be aborted.

+ This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted +*/ +bool FuPoor::cancel() +{ + if ( dynamic_cast< const FuSelection *>( this ) == nullptr ) + { + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + return true; + } + + return false; +} + +// #i33136# +bool FuPoor::doConstructOrthogonal() const +{ + // Check whether a media object is selected + bool bResizeKeepRatio = false; + // tdf#89758 Avoid interactive crop preview from being proportionally scaled by default. + if (mpView->AreObjectsMarked() && mpView->GetDragMode() != SdrDragMode::Crop) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if (rMarkList.GetMarkCount() == 1) + { + SdrObjKind aObjIdentifier = rMarkList.GetMark(0)->GetMarkedSdrObj()->GetObjIdentifier(); + bResizeKeepRatio = aObjIdentifier == SdrObjKind::Graphic || + aObjIdentifier == SdrObjKind::Media || + aObjIdentifier == SdrObjKind::OLE2; + } + } + SdrHdl* pHdl = mpView->PickHandle(aMDPos); + // Resize proportionally when media is selected and the user drags on a corner + if (pHdl) + bResizeKeepRatio = bResizeKeepRatio && pHdl->IsCornerHdl(); + + return ( + bResizeKeepRatio || + SID_DRAW_XLINE == nSlotId || + SID_DRAW_CIRCLEARC == nSlotId || + SID_DRAW_SQUARE == nSlotId || + SID_DRAW_SQUARE_NOFILL == nSlotId || + SID_DRAW_SQUARE_ROUND == nSlotId || + SID_DRAW_SQUARE_ROUND_NOFILL == nSlotId || + SID_DRAW_CIRCLE == nSlotId || + SID_DRAW_CIRCLE_NOFILL == nSlotId || + SID_DRAW_CIRCLEPIE == nSlotId || + SID_DRAW_CIRCLEPIE_NOFILL == nSlotId || + SID_DRAW_CIRCLECUT == nSlotId || + SID_DRAW_CIRCLECUT_NOFILL == nSlotId || + SID_DRAW_XPOLYGON == nSlotId || + SID_DRAW_XPOLYGON_NOFILL == nSlotId || + SID_3D_CUBE == nSlotId || + SID_3D_SPHERE == nSlotId || + SID_3D_SHELL == nSlotId || + SID_3D_HALF_SPHERE == nSlotId || + SID_3D_TORUS == nSlotId || + SID_3D_CYLINDER == nSlotId || + SID_3D_CONE == nSlotId || + SID_3D_PYRAMID == nSlotId); +} + +void FuPoor::DoExecute( SfxRequest& ) +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuprlout.cxx b/sd/source/ui/func/fuprlout.cxx new file mode 100644 index 0000000000..829380b7aa --- /dev/null +++ b/sd/source/ui/func/fuprlout.cxx @@ -0,0 +1,277 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd +{ + + +#define DOCUMENT_TOKEN '#' + +FuPresentationLayout::FuPresentationLayout ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuPresentationLayout::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuPresentationLayout( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuPresentationLayout::DoExecute( SfxRequest& rReq ) +{ + // prevent selected objects or objects which are under editing from disappearing + mpView->SdrEndTextEdit(); + + if(mpView->GetSdrPageView()) + { + mpView->UnmarkAll(); + } + + bool bError = false; + + /* if we are on a master page, the changes apply for all pages and notes- + pages who are using the relevant layout */ + bool bOnMaster = false; + if (DrawViewShell *pShell = dynamic_cast(mpViewShell)) + { + EditMode eEditMode = pShell->GetEditMode(); + if (eEditMode == EditMode::MasterPage) + bOnMaster = true; + } + + std::vector aUnselect; + if (!bOnMaster) + { + //We later rely on IsSelected, so transfer the selection here + //into the document + slidesorter::SlideSorterViewShell* pSlideSorterViewShell + = slidesorter::SlideSorterViewShell::GetSlideSorter(mpViewShell->GetViewShellBase()); + if (pSlideSorterViewShell) + { + std::shared_ptr xSelection( + pSlideSorterViewShell->GetPageSelection()); + if (xSelection) + { + for (SdPage *pPage : *xSelection) + { + if (pPage->IsSelected() || pPage->GetPageKind() != PageKind::Standard) + continue; + mpDoc->SetSelected(pPage, true); + aUnselect.push_back(pPage); + } + } + } + } + + std::vector aSelectedPages; + std::vector aSelectedPageNums; + // determine the active pages + for (sal_uInt16 nPage = 0; nPage < mpDoc->GetSdPageCount(PageKind::Standard); nPage++) + { + SdPage* pPage = mpDoc->GetSdPage(nPage, PageKind::Standard); + if (pPage->IsSelected()) + { + aSelectedPages.push_back(pPage); + aSelectedPageNums.push_back(nPage); + } + } + + bool bMasterPage = bOnMaster; + bool bCheckMasters = false; + + // call dialog + bool bLoad = false; // appear the new master pages? + OUString aFile; + + SfxItemSetFixed aSet(mpDoc->GetPool() ); + + aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_LOAD, bLoad)); + aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_MASTER_PAGE, bMasterPage ) ); + aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_CHECK_MASTERS, bCheckMasters ) ); + + if (!aSelectedPages.empty()) + { + OUString aOldLayoutName(aSelectedPages.back()->GetLayoutName()); + sal_Int32 nPos = aOldLayoutName.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aOldLayoutName = aOldLayoutName.copy(0, nPos); + aSet.Put(SfxStringItem(ATTR_PRESLAYOUT_NAME, aOldLayoutName)); + } + + const SfxItemSet *pArgs = rReq.GetArgs (); + + if (pArgs) + { + if (pArgs->GetItemState(ATTR_PRESLAYOUT_LOAD) == SfxItemState::SET) + bLoad = static_cast(pArgs->Get(ATTR_PRESLAYOUT_LOAD)).GetValue(); + if( pArgs->GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SfxItemState::SET ) + bMasterPage = pArgs->Get( ATTR_PRESLAYOUT_MASTER_PAGE ).GetValue(); + if( pArgs->GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SfxItemState::SET ) + bCheckMasters = static_cast( pArgs->Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue(); + if (pArgs->GetItemState(ATTR_PRESLAYOUT_NAME) == SfxItemState::SET) + aFile = pArgs->Get(ATTR_PRESLAYOUT_NAME).GetValue(); + } + else + { + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSdPresLayoutDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, mpDocSh, aSet)); + + sal_uInt16 nResult = pDlg->Execute(); + + switch (nResult) + { + case RET_OK: + { + pDlg->GetAttr(aSet); + if (aSet.GetItemState(ATTR_PRESLAYOUT_LOAD) == SfxItemState::SET) + bLoad = static_cast(aSet.Get(ATTR_PRESLAYOUT_LOAD)).GetValue(); + if( aSet.GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SfxItemState::SET ) + bMasterPage = aSet.Get( ATTR_PRESLAYOUT_MASTER_PAGE ).GetValue(); + if( aSet.GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SfxItemState::SET ) + bCheckMasters = static_cast(aSet.Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue(); + if (aSet.GetItemState(ATTR_PRESLAYOUT_NAME) == SfxItemState::SET) + aFile = aSet.Get(ATTR_PRESLAYOUT_NAME).GetValue(); + } + break; + + default: + bError = true; + } + } + + if (bError) + return; + + mpDocSh->SetWaitCursor( true ); + + /* Here, we only exchange masterpages, therefore the current page + remains the current page. To prevent calling PageOrderChangedHint + during insertion and extraction of the masterpages, we block. */ + /* That isn't quite right. If the masterpageview is active and you are + removing a masterpage, it's possible that you are removing the + current masterpage. So you have to call ResetActualPage ! */ + if( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bCheckMasters ) + static_cast(mpView)->BlockPageOrderChangedHint(true); + + if (bLoad) + { + sal_Int32 nIdx{ 0 }; + OUString aFileName = aFile.getToken(0, DOCUMENT_TOKEN, nIdx); + SdDrawDocument* pTempDoc = mpDoc->OpenBookmarkDoc( aFileName ); + + // #69581: If I chose the standard-template I got no filename and so I get no + // SdDrawDocument-Pointer. But the method SetMasterPage is able to handle + // a NULL-pointer as a Standard-template ( look at SdDrawDocument::SetMasterPage ) + OUString aLayoutName; + if( pTempDoc ) + aLayoutName = aFile.getToken(0, DOCUMENT_TOKEN, nIdx); + for (auto nSelectedPage : aSelectedPageNums) + mpDoc->SetMasterPage(nSelectedPage, aLayoutName, pTempDoc, bMasterPage, bCheckMasters); + mpDoc->CloseBookmarkDoc(); + } + else + { + // use master page with the layout name aFile from current Doc + for (auto nSelectedPage : aSelectedPageNums) + mpDoc->SetMasterPage(nSelectedPage, aFile, mpDoc, bMasterPage, bCheckMasters); + } + + // remove blocking + if( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bCheckMasters ) + static_cast(mpView)->BlockPageOrderChangedHint(false); + + // if the master page was visible, show it again + if (!aSelectedPages.empty()) + { + if (bOnMaster) + { + if( auto pDrawViewShell = dynamic_cast( mpViewShell )) + { + ::sd::View* pView = pDrawViewShell->GetView(); + for (auto pSelectedPage : aSelectedPages) + { + sal_uInt16 nPgNum = pSelectedPage->TRG_GetMasterPage().GetPageNum(); + + if (static_cast(mpViewShell)->GetPageKind() == PageKind::Notes) + nPgNum++; + + pView->HideSdrPage(); + pView->ShowSdrPage(pView->GetModel().GetMasterPage(nPgNum)); + } + } + + // force update of TabBar + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_MASTERPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + else + { + for (auto pSelectedPage : aSelectedPages) + pSelectedPage->SetAutoLayout(pSelectedPage->GetAutoLayout()); + } + } + + //Undo transfer to document selection + for (auto pPage : aUnselect) + mpDoc->SetSelected(pPage, false); + + + // fake a mode change to repaint the page tab bar + if( auto pDrawViewSh = dynamic_cast( mpViewShell ) ) + { + EditMode eMode = pDrawViewSh->GetEditMode(); + bool bLayer = pDrawViewSh->IsLayerModeActive(); + pDrawViewSh->ChangeEditMode( eMode, !bLayer ); + pDrawViewSh->ChangeEditMode( eMode, bLayer ); + } + + mpDocSh->SetWaitCursor( false ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuprobjs.cxx b/sd/source/ui/func/fuprobjs.cxx new file mode 100644 index 0000000000..32ec8f890b --- /dev/null +++ b/sd/source/ui/func/fuprobjs.cxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuPresentationObjects::FuPresentationObjects ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuPresentationObjects::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuPresentationObjects( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuPresentationObjects::DoExecute( SfxRequest& ) +{ + OutlineViewShell* pOutlineViewShell = dynamic_cast< OutlineViewShell* >( mpViewShell ); + DBG_ASSERT( pOutlineViewShell, "sd::FuPresentationObjects::DoExecute(), does not work without an OutlineViewShell!"); + if( !pOutlineViewShell ) + return; + + /* does the selections end in a unique presentation layout? + if not, it is not allowed to edit the templates */ + SfxItemSetFixed aSet(mpDoc->GetItemPool() ); + pOutlineViewShell->GetStatusBarState( aSet ); + OUString aLayoutName = aSet.Get(SID_STATUS_LAYOUT).GetValue(); + DBG_ASSERT(!aLayoutName.isEmpty(), "Layout not defined"); + + bool bUnique = false; + sal_Int16 nDepth, nTmp; + OutlineView* pOlView = static_cast(pOutlineViewShell->GetView()); + OutlinerView* pOutlinerView = pOlView->GetViewByWindow( static_cast(mpWindow) ); + ::Outliner* pOutl = pOutlinerView->GetOutliner(); + + std::vector aSelList; + pOutlinerView->CreateSelectionList(aSelList); + + Paragraph* pPara = aSelList.empty() ? nullptr : aSelList.front(); + + nDepth = pOutl->GetDepth(pOutl->GetAbsPos( pPara ) ); + bool bPage = ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ); + + for( const auto& rpPara : aSelList ) + { + nTmp = pOutl->GetDepth( pOutl->GetAbsPos( rpPara ) ); + + if( nDepth != nTmp ) + { + bUnique = false; + break; + } + + if( ::Outliner::HasParaFlag( rpPara, ParaFlag::ISPAGE ) != bPage ) + { + bUnique = false; + break; + } + bUnique = true; + } + + if( !bUnique ) + return; + + OUString aStyleName = aLayoutName + SD_LT_SEPARATOR; + PresentationObjects ePO; + + if( bPage ) + { + ePO = PresentationObjects::Title; + aStyleName += STR_LAYOUT_TITLE; + } + else + { + ePO = static_cast( static_cast(PresentationObjects::Outline_1) + nDepth - 1 ); + aStyleName += STR_LAYOUT_OUTLINE + " " + OUString::number(nDepth); + } + + SfxStyleSheetBasePool* pStyleSheetPool = mpDocSh->GetStyleSheetPool(); + SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->Find( aStyleName, SfxStyleFamily::Page ); + DBG_ASSERT(pStyleSheet, "StyleSheet missing"); + + if( !pStyleSheet ) + return; + + SfxStyleSheetBase& rStyleSheet = *pStyleSheet; + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSdPresLayoutTemplateDlg(mpDocSh, mpViewShell->GetFrameWeld(), + false, rStyleSheet, ePO, pStyleSheetPool)); + if( pDlg->Execute() == RET_OK ) + { + const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); + // Undo-Action + mpDocSh->GetUndoManager()->AddUndoAction( + std::make_unique(mpDoc, static_cast(pStyleSheet), pOutSet)); + + pStyleSheet->GetItemSet().Put( *pOutSet ); + static_cast( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) ); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuscale.cxx b/sd/source/ui/func/fuscale.cxx new file mode 100644 index 0000000000..d4730b2432 --- /dev/null +++ b/sd/source/ui/func/fuscale.cxx @@ -0,0 +1,179 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuScale::FuScale ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuScale::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuScale( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuScale::DoExecute( SfxRequest& rReq ) +{ + sal_Int16 nValue; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + { + SfxItemSetFixed aNewAttr( mpDoc->GetPool() ); + std::unique_ptr pZoomItem; + SvxZoomEnableFlags nZoomValues = SvxZoomEnableFlags::ALL; + + nValue = static_cast(mpWindow->GetZoom()); + + // zoom on page size? + if( dynamic_cast< DrawViewShell *>( mpViewShell ) && + static_cast(mpViewShell)->IsZoomOnPage() ) + { + pZoomItem.reset(new SvxZoomItem( SvxZoomType::WHOLEPAGE, nValue )); + } + else + { + pZoomItem.reset(new SvxZoomItem( SvxZoomType::PERCENT, nValue )); + } + + // limit range + if( mpViewShell ) + { + if( dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr ) + { + SdrPageView* pPageView = mpView->GetSdrPageView(); + if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 ) + { + nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL; + } + } + else if( dynamic_cast< OutlineViewShell *>( mpViewShell ) != nullptr ) + { + nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL; + nZoomValues &= ~SvxZoomEnableFlags::WHOLEPAGE; + nZoomValues &= ~SvxZoomEnableFlags::PAGEWIDTH; + } + } + + pZoomItem->SetValueSet( nZoomValues ); + aNewAttr.Put( std::move(pZoomItem) ); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSvxZoomDialog(rReq.GetFrameWeld(), aNewAttr)); + pDlg->SetLimits( static_cast(mpWindow->GetMinZoom()), static_cast(mpWindow->GetMaxZoom()) ); + sal_uInt16 nResult = pDlg->Execute(); + switch( nResult ) + { + case RET_CANCEL: + { + rReq.Ignore (); + return; // Cancel + } + default: + { + rReq.Ignore (); + } + break; + } + + const SfxItemSet aArgs (*(pDlg->GetOutputItemSet ())); + + pDlg.disposeAndClear(); + + if (!mpViewShell) + return; + + switch ( aArgs.Get (SID_ATTR_ZOOM).GetType ()) + { + case SvxZoomType::PERCENT: + { + nValue = aArgs.Get (SID_ATTR_ZOOM).GetValue (); + + mpViewShell->SetZoom( nValue ); + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom ); + } + break; + + case SvxZoomType::OPTIMAL: + { + if( dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr ) + { + // name confusion: SID_SIZE_ALL -> zoom onto all objects + // --> the program offers it as optimal + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_ALL, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + } + break; + + case SvxZoomType::PAGEWIDTH: + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE_WIDTH, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + break; + + case SvxZoomType::WHOLEPAGE: + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + break; + default: + break; + } + } + else if(mpViewShell && (pArgs->Count () == 1)) + { + const SfxUInt32Item* pScale = rReq.GetArg(ID_VAL_ZOOM); + mpViewShell->SetZoom (pScale->GetValue ()); + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom ); + } + +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fusearch.cxx b/sd/source/ui/func/fusearch.cxx new file mode 100644 index 0000000000..73a112bf44 --- /dev/null +++ b/sd/source/ui/func/fusearch.cxx @@ -0,0 +1,140 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SfxRequest; + +namespace sd { + +const sal_uInt16 SidArraySpell[] = { + SID_DRAWINGMODE, + SID_OUTLINE_MODE, + SID_SLIDE_SORTER_MODE, + SID_NOTES_MODE, + SID_HANDOUT_MASTER_MODE, + SID_SLIDE_MASTER_MODE, + SID_NOTES_MASTER_MODE, + 0 }; + +FuSearch::FuSearch ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq), + m_pSdOutliner(nullptr), + m_bOwnOutliner(false) +{ +} + +FuSearch* FuSearch::createPtr(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq) +{ + FuSearch* xFunc( new FuSearch( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuSearch::DoExecute( SfxRequest& ) +{ + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArraySpell ); + + if ( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr ) + { + m_bOwnOutliner = true; + m_pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject ); + } + else if ( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr ) + { + m_bOwnOutliner = false; + m_pSdOutliner = mpDoc->GetOutliner(); + } + + if (m_pSdOutliner) + m_pSdOutliner->PrepareSpelling(); +} + +FuSearch::~FuSearch() +{ + if ( ! mpDocSh->IsInDestruction() && mpDocSh->GetViewShell()!=nullptr) + mpDocSh->GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SidArraySpell ); + + if (m_pSdOutliner) + m_pSdOutliner->EndSpelling(); + + if (m_bOwnOutliner) + delete m_pSdOutliner; +} + +void FuSearch::SearchAndReplace( const SvxSearchItem* pSearchItem ) +{ + ViewShellBase* pBase = dynamic_cast( SfxViewShell::Current() ); + ViewShell* pViewShell = nullptr; + if (pBase != nullptr) + pViewShell = pBase->GetMainViewShell().get(); + + if (pViewShell == nullptr) + return; + + if (m_pSdOutliner && dynamic_cast(pViewShell) && !m_bOwnOutliner) + { + m_pSdOutliner->EndSpelling(); + + m_bOwnOutliner = true; + m_pSdOutliner = new SdOutliner(mpDoc, OutlinerMode::TextObject); + m_pSdOutliner->PrepareSpelling(); + } + else if (m_pSdOutliner && dynamic_cast(pViewShell) && m_bOwnOutliner) + { + m_pSdOutliner->EndSpelling(); + delete m_pSdOutliner; + + m_bOwnOutliner = false; + m_pSdOutliner = mpDoc->GetOutliner(); + m_pSdOutliner->PrepareSpelling(); + } + + if (m_pSdOutliner) + { + bool bEndSpelling = m_pSdOutliner->StartSearchAndReplace(pSearchItem); + + if (bEndSpelling) + { + m_pSdOutliner->EndSpelling(); + m_pSdOutliner->PrepareSpelling(); + } + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx new file mode 100644 index 0000000000..501a993692 --- /dev/null +++ b/sd/source/ui/func/fusel.cxx @@ -0,0 +1,1331 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +using namespace ::com::sun::star; + +namespace sd { + +FuSelection::FuSelection ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuDraw(pViewSh, pWin, pView, pDoc, rReq), + bTempRotation(false), + bSelectionChanged(false), + pHdl(nullptr), + bSuppressChangesOfSelection(false), + bMirrorSide0(false), + nEditMode(SID_BEZIER_MOVE), + pWaterCanCandidate(nullptr) + //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, + //and SHIFT+ENTER key to decide the position and draw the new insert point + ,bBeginInsertPoint(false), + oldPoint(0,0) + ,bMovedToCenterPoint(false) +{ +} + +rtl::Reference FuSelection::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuSelection( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuSelection::DoExecute( SfxRequest& rReq ) +{ + FuDraw::DoExecute( rReq ); + + // Select object bar + SelectionHasChanged(); +} + +FuSelection::~FuSelection() +{ + mpView->UnmarkAllPoints(); + mpView->ResetCreationActive(); + + if ( mpView->GetDragMode() != SdrDragMode::Move ) + { + mpView->SetDragMode(SdrDragMode::Move); + } +} + +namespace { + bool lcl_followHyperlinkAllowed(const MouseEvent& rMEvt) { + if (!rMEvt.IsMod1() && SvtSecurityOptions::IsOptionSet(SvtSecurityOptions::EOption::CtrlClickHyperlink)) + return false; + if (rMEvt.IsMod1() && !SvtSecurityOptions::IsOptionSet(SvtSecurityOptions::EOption::CtrlClickHyperlink)) + return false; + return true; + } +} + +bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt) +{ + pHdl = nullptr; + bool bReturn = FuDraw::MouseButtonDown(rMEvt); + bool bWaterCan = SD_MOD()->GetWaterCan(); + const bool bReadOnly = mpDocSh->IsReadOnly(); + // When the right mouse button is pressed then only select objects + // (and deselect others) as a preparation for showing the context + // menu. + const bool bSelectionOnly = rMEvt.IsRight(); + + bMBDown = true; + bSelectionChanged = false; + + if ( mpView->IsAction() ) + { + if ( rMEvt.IsRight() ) + mpView->BckAction(); + return true; + } + + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + + if (comphelper::LibreOfficeKit::isActive()) + { + // When tiled rendering, we always work in logic units, use the non-pixel constants. + nDrgLog = DRGLOG; + nHitLog = HITLOG; + } + + // The following code is executed for right clicks as well as for left + // clicks in order to modify the selection for the right button as a + // preparation for the context menu. The functions BegMarkObject() and + // BegDragObject(), however, are not called for right clicks because a) + // it makes no sense and b) to have IsAction() return sal_False when called + // from Command() which is a prerequisite for the context menu. + if ((rMEvt.IsLeft() || rMEvt.IsRight()) + && !mpView->IsAction() + && (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints())) + { + /****************************************************************** + * NO BEZIER_EDITOR + ******************************************************************/ + mpWindow->CaptureMouse(); + pHdl = mpView->PickHandle(aMDPos); + + Degree100 nAngle0 = GetAngle(aMDPos - mpView->GetRef1()); + nAngle0 -= 27000_deg100; + nAngle0 = NormAngle36000(nAngle0); + bMirrorSide0 = nAngle0 < 18000_deg100; + + if (!pHdl && mpView->Is3DRotationCreationActive()) + { + /****************************************************************** + * If 3D-rotation bodies are about to be created, + * end creation now. + ******************************************************************/ + bSuppressChangesOfSelection = true; + mpWindow->EnterWait(); + mpView->End3DCreation(); + bSuppressChangesOfSelection = false; + mpView->ResetCreationActive(); + mpWindow->LeaveWait(); + } + + bool bTextEdit = false; + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::TextEditObj && (mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast< sdr::table::SdrTableObj* >(aVEvt.mpObj) != nullptr)) + { + bTextEdit = true; + } + + // When clicking into a URl field, also go to text edit mode (when not following the link) + if (!bTextEdit && eHit == SdrHitKind::UrlField && !rMEvt.IsMod2() && !lcl_followHyperlinkAllowed(rMEvt)) + bTextEdit = true; + + bool bPreventModify = mpDocSh->IsReadOnly(); + if (bPreventModify && mpDocSh->GetSignPDFCertificate().is()) + { + // If the just added signature line shape is selected, allow moving / resizing it. + bPreventModify = false; + } + + if(!bTextEdit + && !bPreventModify + && ((mpView->IsMarkedHit(aMDPos, nHitLog) && !rMEvt.IsShift() && !rMEvt.IsMod2()) || pHdl != nullptr) + && (rMEvt.GetClicks() != 2) + ) + { + if (!pHdl && mpView->Is3DRotationCreationActive()) + { + // Switch between 3D-rotation body -> selection + mpView->ResetCreationActive(); + } + else if (bWaterCan) + { + // Remember the selected object for proper handling in + // MouseButtonUp(). + pWaterCanCandidate = pickObject (aMDPos); + } + else + { + // hit handle or marked object + bFirstMouseMove = true; + aDragTimer.Start(); + } + + if ( ! rMEvt.IsRight()) + if (mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog)) + mpView->GetDragMethod()->SetShiftPressed( rMEvt.IsShift() ); + bReturn = true; + } + else + { + SdrPageView* pPV = nullptr; + SdrObject* pObj = !rMEvt.IsMod2() ? mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::PICKMACRO) : nullptr; + if (pObj) + { + mpView->BegMacroObj(aMDPos, nHitLog, pObj, pPV, mpWindow); + bReturn = true; + } + else if ( bTextEdit ) + { + SdrObjKind nSdrObjKind = aVEvt.mpObj->GetObjIdentifier(); + + if (aVEvt.mpObj->GetObjInventor() == SdrInventor::Default && + (nSdrObjKind == SdrObjKind::Text || + nSdrObjKind == SdrObjKind::TitleText || + nSdrObjKind == SdrObjKind::OutlineText || + !aVEvt.mpObj->IsEmptyPresObj())) + { + // Seamless Editing: branch to text input + if (!rMEvt.IsShift()) + mpView->UnmarkAll(); + + SfxUInt16Item aItem(SID_TEXTEDIT, 1); + mpViewShell->GetViewFrame()->GetDispatcher()-> + ExecuteList(SID_TEXTEDIT, + SfxCallMode::SYNCHRON | SfxCallMode::RECORD, + { &aItem }); + return bReturn; // CAUTION, due to the synchronous slot the object is deleted now + } + } + else if ( !rMEvt.IsMod2() && rMEvt.GetClicks() == 1 && + aVEvt.meEvent == SdrEventKind::ExecuteUrl ) + { + mpWindow->ReleaseMouse(); + + if (!aVEvt.mpURLField) + return true; + + // If tiled rendering, let client handles URL execution and early returns. + if (comphelper::LibreOfficeKit::isActive()) + { + SfxViewShell& rSfxViewShell = mpViewShell->GetViewShellBase(); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_HYPERLINK_CLICKED, aVEvt.mpURLField->GetURL().toUtf8()); + return true; + } + + if (!lcl_followHyperlinkAllowed(rMEvt)) + return true; + + SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.mpURLField->GetURL()); + SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); + SfxBoolItem aBrowseItem( SID_BROWSE, true ); + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + mpWindow->ReleaseMouse(); + + if (rMEvt.IsMod1()) + { + // Open in new frame + pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aBrowseItem, &aReferer }); + } + else + { + // Open in current frame + SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); + pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer }); + } + + bReturn = true; + } + else if(!rMEvt.IsMod2() + && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr + ) + { + pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER); + if (pObj) + { + // Handle ImageMap click when not just selecting + if (!bSelectionOnly) + { + if (lcl_followHyperlinkAllowed(rMEvt)) + bReturn = HandleImageMapClick(pObj, aMDPos); + } + + if (!bReturn + && (dynamic_cast(pObj) != nullptr + || DynCastE3dScene(pObj))) + { + if (rMEvt.GetClicks() == 1) + { + // Look into the group + pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, + SdrSearchOptions::ALSOONMASTER + | SdrSearchOptions::DEEP); + if (pObj && lcl_followHyperlinkAllowed(rMEvt)) + bReturn = HandleImageMapClick(pObj, aMDPos); + } + else if (!bReadOnly && rMEvt.GetClicks() == 2) + { + // New: double click on selected Group object + // enter group + if (!bSelectionOnly + && pObj->getSdrPageFromSdrObject() == pPV->GetPage()) + bReturn = pPV->EnterGroup(pObj); + } + } + } + + // #i71727# replaced else here with two possibilities, once the original else (!pObj) + // and also ignoring the found object when it's on a masterpage + if(!pObj || (pObj->getSdrPageFromSdrObject() && pObj->getSdrPageFromSdrObject()->IsMasterPage())) + { + if(mpView->IsGroupEntered() && 2 == rMEvt.GetClicks()) + { + // New: double click on empty space/on obj on MasterPage, leave group + mpView->LeaveOneGroup(); + bReturn = true; + } + } + } + + if (!bReturn) + { + if (bWaterCan) + { + if ( ! (rMEvt.IsShift() || rMEvt.IsMod2())) + { + // Find the object under the current mouse position + // and store it for the MouseButtonUp() method to + // evaluate. + pWaterCanCandidate = pickObject (aMDPos); + } + } + else + { + bReturn = true; + bool bDeactivateOLE = false; + + if ( !rMEvt.IsShift() && !rMEvt.IsMod2() ) + { + OSL_ASSERT (mpViewShell->GetViewShell()!=nullptr); + Client* pIPClient = static_cast( + mpViewShell->GetViewShell()->GetIPClient()); + + if (pIPClient && pIPClient->IsObjectInPlaceActive()) + { + // OLE-object gets deactivated in subsequent UnmarkAll() + bDeactivateOLE = true; + } + + mpView->UnmarkAll(); + } + + bool bMarked = false; + + if ( !rMEvt.IsMod1() && !bDeactivateOLE) + { + if ( rMEvt.IsMod2() ) + { + bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift() ); + } + else + { + bool bToggle = false; + + if (rMEvt.IsShift() && mpView->GetMarkedObjectList().GetMarkCount() > 1) + { + // No Toggle on single selection + bToggle = true; + } + + bMarked = mpView->MarkObj(aMDPos, nHitLog, bToggle); + } + } + + if( !bDeactivateOLE ) + { + if ( !bReadOnly && + bMarked && + (!rMEvt.IsShift() || mpView->IsMarkedHit(aMDPos, nHitLog))) + { + /********************************************************** + * Move object + **********************************************************/ + aDragTimer.Start(); + + pHdl=mpView->PickHandle(aMDPos); + if ( ! rMEvt.IsRight()) + mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog); + } + else + { + /********************************************************** + * Select object + **********************************************************/ + if ( ! rMEvt.IsRight()) + mpView->BegMarkObj(aMDPos); + } + } + + if( bMarked && bTempRotation && (nSlotId == SID_OBJECT_ROTATE) && !rMEvt.IsShift() && (rMEvt.GetClicks() != 2) ) + { + nSlotId = SID_OBJECT_SELECT; + Activate(); + } + } + } + } + } + else if ( !bReadOnly + && (rMEvt.IsLeft() || rMEvt.IsRight()) + && !mpView->IsAction()) + { + /********************************************************************** + * BEZIER-EDITOR + **********************************************************************/ + mpWindow->CaptureMouse(); + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::Handle && aVEvt.mpHdl->GetKind() == SdrHdlKind::BezierWeight) + { + /****************************************************************** + * Drag Handle + ******************************************************************/ + if ( ! rMEvt.IsRight()) + mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog); + } + else if (eHit == SdrHitKind::MarkedObject && nEditMode == SID_BEZIER_INSERT) + { + /****************************************************************** + * Insert gluepoint + ******************************************************************/ + mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1()); + } + else if (eHit == SdrHitKind::MarkedObject && rMEvt.IsMod1()) + { + /****************************************************************** + * Select gluepoint + ******************************************************************/ + if (!rMEvt.IsShift()) + mpView->UnmarkAllPoints(); + + if ( ! rMEvt.IsRight()) + mpView->BegMarkPoints(aMDPos); + } + else if (eHit == SdrHitKind::MarkedObject && !rMEvt.IsShift() && !rMEvt.IsMod2()) + { + /****************************************************************** + * Move object + ******************************************************************/ + if ( ! rMEvt.IsRight()) + mpView->BegDragObj(aMDPos, nullptr, nullptr, nDrgLog); + } + else if (eHit == SdrHitKind::Handle) + { + /****************************************************************** + * Select gluepoint + ******************************************************************/ + if (!mpView->IsPointMarked(*aVEvt.mpHdl) || rMEvt.IsShift()) + { + if (!rMEvt.IsShift()) + { + mpView->UnmarkAllPoints(); + pHdl = mpView->PickHandle(aMDPos); + } + else + { + if (mpView->IsPointMarked(*aVEvt.mpHdl)) + { + mpView->UnmarkPoint(*aVEvt.mpHdl); + pHdl = nullptr; + } + else + { + pHdl = mpView->PickHandle(aMDPos); + } + } + + if (pHdl) + { + mpView->MarkPoint(*pHdl); + if ( ! rMEvt.IsRight()) + mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog); + + } + } + else + { + // Point IS marked and NO shift is pressed. Start + // dragging of selected point(s) + pHdl = mpView->PickHandle(aMDPos); + if(pHdl && ! rMEvt.IsRight()) + mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog); + } + } + else + { + /****************************************************************** + * Select or drag object + ******************************************************************/ + if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SdrHitKind::UnmarkedObject) + { + mpView->UnmarkAllObj(); + } + + bool bMarked = false; + + if (!rMEvt.IsMod1()) + { + if (rMEvt.IsMod2()) + { + bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift()); + } + else + { + bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift()); + } + } + + if (bMarked && + (!rMEvt.IsShift() || eHit == SdrHitKind::MarkedObject)) + { + // Move object + if ( ! rMEvt.IsRight()) + mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog); + } + else if (mpView->AreObjectsMarked()) + { + /************************************************************** + * Select gluepoint + **************************************************************/ + if (!rMEvt.IsShift()) + mpView->UnmarkAllPoints(); + + if ( ! rMEvt.IsRight()) + mpView->BegMarkPoints(aMDPos); + } + else + { + /************************************************************** + * Select object + **************************************************************/ + if ( ! rMEvt.IsRight()) + mpView->BegMarkObj(aMDPos); + } + + ForcePointer(&rMEvt); + } + } + + if (!bIsInDragMode) + { + ForcePointer(&rMEvt); + } + + return bReturn; +} + +bool FuSelection::MouseMove(const MouseEvent& rMEvt) +{ + bool bReturn = FuDraw::MouseMove(rMEvt); + + if (aDragTimer.IsActive()) + { + if(bFirstMouseMove) + { + bFirstMouseMove = false; + } + else + { + aDragTimer.Stop(); + } + } + + if (mpView->IsAction()) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt(mpWindow->PixelToLogic(aPix)); + + ForceScroll(aPix); + + if (mpView->IsInsObjPoint()) + { + mpView->MovInsObjPoint(aPnt); + } + else + { + mpView->MovAction(aPnt); + } + } + + ForcePointer(&rMEvt); + + return bReturn; +} + +bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) +{ + bool bReturn = false; + // When the right mouse button is pressed then only select objects + // (and deselect others) as a preparation for showing the context + // menu. + const bool bSelectionOnly = rMEvt.IsRight(); + + if (aDragTimer.IsActive() ) + { + aDragTimer.Stop(); + bIsInDragMode = false; + } + + if( !mpView ) + return false; + + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + + if (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints()) + { + /********************************************************************** + * NO BEZIER_EDITOR + **********************************************************************/ + if ( mpView->IsDragObj() ) + { + /****************************************************************** + * Object was moved + ******************************************************************/ + FrameView* pFrameView = mpViewShell->GetFrameView(); + bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (bDragWithCopy) + { + bDragWithCopy = !mpView->IsPresObjSelected(false); + } + + mpView->SetDragWithCopy(bDragWithCopy); + bool bWasDragged(mpView->EndDragObj( mpView->IsDragWithCopy() )); + + mpView->ForceMarkedToAnotherPage(); + + if (!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && + !bSelectionChanged && + std::abs(aPnt.X() - aMDPos.X()) < nDrgLog && + std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) + { + /************************************************************* + * If a user wants to click on an object in front of a marked + * one, he releases the mouse button immediately + **************************************************************/ + SdrPageView* pPV; + SdrObject* pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::BEFOREMARK); + if (pObj && pPV->IsObjMarkable(pObj)) + { + mpView->UnmarkAllObj(); + mpView->MarkObj(pObj,pPV); + return true; + } + + // check for single object selected + SdrObject* pSingleObj = nullptr; + + if (mpView->GetMarkedObjectList().GetMarkCount()==1) + { + pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + } + + // Check for click on svx::diagram::DiagramFrameHdl + // - if we hit a SdrHdl + // - if it was not moved + // - if single object is selected + // - and it is a Diagram + if(pHdl && !bWasDragged && nullptr != pSingleObj && pSingleObj->isDiagram()) + { + svx::diagram::DiagramFrameHdl* pDiagramFrameHdl(dynamic_cast(pHdl)); + if(nullptr != pDiagramFrameHdl) + { + // let the DiagramFrameHdl decide what to do + svx::diagram::DiagramFrameHdl::clicked(aPnt); + } + } + + /************************************************************** + * Toggle between selection and rotation + **************************************************************/ + if (nSlotId == SID_OBJECT_SELECT + && !comphelper::LibreOfficeKit::isActive() + && mpView->IsRotateAllowed() + + && (rMEvt.GetClicks() != 2) + && (mpViewShell->GetFrameView()->IsClickChangeRotation() + || (pSingleObj + && pSingleObj->GetObjInventor()==SdrInventor::E3d)) + && ! bSelectionOnly) + + { + bTempRotation = true; + nSlotId = SID_OBJECT_ROTATE; + Activate(); + } + else if (nSlotId == SID_OBJECT_ROTATE) + { + nSlotId = SID_OBJECT_SELECT; + Activate(); + } + } + else if (nSlotId == SID_CONVERT_TO_3D_LATHE) + { + if (!pHdl) + { + bSuppressChangesOfSelection = true; + mpView->Start3DCreation(); + bSuppressChangesOfSelection = false; + } + else if (pHdl->GetKind() != SdrHdlKind::MirrorAxis && + pHdl->GetKind() != SdrHdlKind::Ref1 && + pHdl->GetKind() != SdrHdlKind::Ref2 && mpView->Is3DRotationCreationActive()) + { + /********************************************************* + * If 3D-rotation bodies are about to be created, + * end creation now + **********************************************************/ + Degree100 nAngle1 = GetAngle(aPnt - mpView->GetRef1()); + nAngle1 -= 27000_deg100; + nAngle1 = NormAngle36000(nAngle1); + bool bMirrorSide1 = nAngle1 < 18000_deg100; + + if (bMirrorSide0 != bMirrorSide1) + { + bSuppressChangesOfSelection = true; + mpWindow->EnterWait(); + mpView->End3DCreation(); + bSuppressChangesOfSelection = false; + nSlotId = SID_OBJECT_SELECT; + mpWindow->LeaveWait(); + Activate(); + } + } + } + } + else if (rMEvt.IsMod1() + && !rMEvt.IsMod2() + && std::abs(aPnt.X() - aMDPos.X()) < nDrgLog + && std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) + { + // Enter group + mpView->MarkObj(aPnt, nHitLog, rMEvt.IsShift(), rMEvt.IsMod1()); + } + + if (mpView->IsAction() ) + { + mpView->EndAction(); + } + + if( SD_MOD()->GetWaterCan() ) + { + if( rMEvt.IsRight() ) + { + // In watering-can mode, on press onto right mouse button, an undo is executed + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_UNDO, SfxCallMode::ASYNCHRON ); + } + else if (pWaterCanCandidate != nullptr) + { + // Is the candidate object still under the mouse? + if (pickObject (aPnt) == pWaterCanCandidate) + { + SdStyleSheetPool* pPool = static_cast( + mpDocSh->GetStyleSheetPool()); + if (pPool != nullptr) + { + SfxStyleSheet* pStyleSheet = static_cast( + pPool->GetActualStyleSheet()); + if (pStyleSheet != nullptr && mpView->IsUndoEnabled() ) + { + // Added UNDOs for the WaterCan mode. This was never done in + // the past, thus it was missing all the time. + std::unique_ptr pUndoAttr = mpDoc->GetSdrUndoFactory().CreateUndoAttrObject(*pWaterCanCandidate, true, true); + mpView->BegUndo(pUndoAttr->GetComment()); + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoGeoObject(*pWaterCanCandidate)); + mpView->AddUndo(std::move(pUndoAttr)); + + pWaterCanCandidate->SetStyleSheet (pStyleSheet, false); + + mpView->EndUndo(); + } + } + } + } + // else when there has been no object under the mouse when the + // button was pressed then nothing happens even when there is + // one now. + } + + sal_uInt16 nClicks = rMEvt.GetClicks(); + + if (nClicks == 2 && rMEvt.IsLeft() && bMBDown && + !rMEvt.IsMod1() && !rMEvt.IsShift() ) + { + DoubleClick(rMEvt); + } + + bMBDown = false; + + ForcePointer(&rMEvt); + pHdl = nullptr; + mpWindow->ReleaseMouse(); + SdrObject* pSingleObj = nullptr; + const size_t nMarkCount = mpView->GetMarkedObjectList().GetMarkCount(); + + if (nMarkCount==1) + { + pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + } + + if ( (nSlotId != SID_OBJECT_SELECT && nMarkCount==0) || + ( mpView->GetDragMode() == SdrDragMode::Crook && + !mpView->IsCrookAllowed( mpView->IsCrookNoContortion() ) ) || + ( mpView->GetDragMode() == SdrDragMode::Shear && + !mpView->IsShearAllowed() && !mpView->IsDistortAllowed() ) || + ( nSlotId==SID_CONVERT_TO_3D_LATHE && pSingleObj && + (pSingleObj->GetObjInventor() != SdrInventor::Default || + pSingleObj->GetObjIdentifier() == SdrObjKind::Measure) ) ) + { + bReturn = true; + ForcePointer(&rMEvt); + pHdl = nullptr; + mpWindow->ReleaseMouse(); + FuDraw::MouseButtonUp(rMEvt); + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::SYNCHRON); + return bReturn; // CAUTION, due to the synchronous slot, the object is deleted now. + } + + FuDraw::MouseButtonUp(rMEvt); + } + else + { + /********************************************************************** + * BEZIER_EDITOR + **********************************************************************/ + if ( mpView->IsAction() ) + { + if ( mpView->IsInsObjPoint() ) + { + mpView->EndInsObjPoint(SdrCreateCmd::ForceEnd); + } + else if ( mpView->IsDragObj() ) + { + FrameView* pFrameView = mpViewShell->GetFrameView(); + bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (bDragWithCopy) + { + bDragWithCopy = !mpView->IsPresObjSelected(false); + } + + mpView->SetDragWithCopy(bDragWithCopy); + mpView->EndDragObj( mpView->IsDragWithCopy() ); + } + else + { + mpView->EndAction(); + + sal_uInt16 nDrgLog2 = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); + + if (std::abs(aMDPos.X() - aPos.X()) < nDrgLog2 && + std::abs(aMDPos.Y() - aPos.Y()) < nDrgLog2 && + !rMEvt.IsShift() && !rMEvt.IsMod2()) + { + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::NONE) + { + // Click on the same place - unselect + mpView->UnmarkAllObj(); + } + } + } + } + else if (!rMEvt.IsShift() && rMEvt.IsMod1() && !rMEvt.IsMod2() && + std::abs(aPnt.X() - aMDPos.X()) < nDrgLog && + std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) + { + // Enter group + mpView->MarkObj(aPnt, nHitLog, false, rMEvt.IsMod1()); + } + + ForcePointer(&rMEvt); + pHdl = nullptr; + mpWindow->ReleaseMouse(); + + FuDraw::MouseButtonUp(rMEvt); + } + + return bReturn; +} + +/** + * Process keyboard input + * @returns sal_True if a KeyEvent is being processed, sal_False otherwise + */ +bool FuSelection::KeyInput(const KeyEvent& rKEvt) +{ + bool bReturn = false; + + switch (rKEvt.GetKeyCode().GetCode()) + { + case KEY_ESCAPE: + { + bReturn = FuSelection::cancel(); + } + break; + //add keyboard operation for insert points in drawing curve + case KEY_UP: + case KEY_DOWN: + case KEY_LEFT: + case KEY_RIGHT: + { + if(rKEvt.GetKeyCode().IsShift()&&(nEditMode == SID_BEZIER_INSERT)){ + ::tools::Long nX = 0; + ::tools::Long nY = 0; + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + if (nCode == KEY_UP) + { + // scroll up + nX = 0; + nY =-1; + } + else if (nCode == KEY_DOWN) + { + // scroll down + nX = 0; + nY = 1; + } + else if (nCode == KEY_LEFT) + { + // scroll left + nX =-1; + nY = 0; + } + else if (nCode == KEY_RIGHT) + { + // scroll right + nX = 1; + nY = 0; + } + + Point centerPoint; + ::tools::Rectangle rect = mpView->GetMarkedObjRect(); + centerPoint = mpWindow->LogicToPixel(rect.Center()); + Point aPoint = bMovedToCenterPoint? oldPoint:centerPoint; + Point ePoint = aPoint + Point(nX,nY); + mpWindow->SetPointerPosPixel(ePoint); + //simulate mouse move action + MouseEvent eMevt(ePoint, 1, MouseEventModifiers::DRAGMOVE, MOUSE_LEFT, 0); + MouseMove(eMevt); + oldPoint = ePoint; + bMovedToCenterPoint = true; + bReturn = true; + } + } + break; + case KEY_RETURN: + if(rKEvt.GetKeyCode().IsShift()&&(nEditMode == SID_BEZIER_INSERT)) + { + if(!bBeginInsertPoint) + { + //simulate mouse button down action + MouseEvent aMevt(oldPoint, 1, + MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::DRAGMOVE, + MOUSE_LEFT, KEY_SHIFT); + MouseButtonDown(aMevt); + mpWindow->CaptureMouse(); + bBeginInsertPoint = true; + } + else + { + //simulate mouse button up action + MouseEvent rMEvt(oldPoint, 1, + MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::ENTERWINDOW, + MOUSE_LEFT, KEY_SHIFT); + MouseButtonUp(rMEvt); + bBeginInsertPoint = false; + } + bReturn= true; + } + break; + } + if (!bReturn) + { + bReturn = FuDraw::KeyInput(rKEvt); + + if(mpView->GetMarkedObjectList().GetMarkCount() == 0) + { + mpView->ResetCreationActive(); + + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + } + + return bReturn; + +} + +void FuSelection::Activate() +{ + SdrDragMode eMode; + mpView->ResetCreationActive(); + mpView->SetEditMode(SdrViewEditMode::Edit); + + switch( nSlotId ) + { + case SID_OBJECT_ROTATE: + { + eMode = SdrDragMode::Rotate; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + + case SID_OBJECT_MIRROR: + { + eMode = SdrDragMode::Mirror; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + + case SID_OBJECT_CROP: + { + eMode = SdrDragMode::Crop; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + + case SID_OBJECT_TRANSPARENCE: + { + eMode = SdrDragMode::Transparence; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + + case SID_OBJECT_GRADIENT: + { + eMode = SdrDragMode::Gradient; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + + case SID_OBJECT_SHEAR: + { + eMode = SdrDragMode::Shear; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + + case SID_OBJECT_CROOK_ROTATE: + { + eMode = SdrDragMode::Crook; + + if ( mpView->GetDragMode() != eMode ) + { + mpView->SetDragMode(eMode); + mpView->SetCrookMode(SdrCrookMode::Rotate); + } + } + break; + + case SID_OBJECT_CROOK_SLANT: + { + eMode = SdrDragMode::Crook; + + if ( mpView->GetDragMode() != eMode ) + { + mpView->SetDragMode(eMode); + mpView->SetCrookMode(SdrCrookMode::Slant); + } + } + break; + + case SID_OBJECT_CROOK_STRETCH: + { + eMode = SdrDragMode::Crook; + + if ( mpView->GetDragMode() != eMode ) + { + mpView->SetDragMode(eMode); + mpView->SetCrookMode(SdrCrookMode::Stretch); + } + } + break; + + case SID_CONVERT_TO_3D_LATHE: + { + eMode = SdrDragMode::Mirror; + bSuppressChangesOfSelection = true; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + + if (!mpView->Is3DRotationCreationActive()) + mpView->Start3DCreation(); + + bSuppressChangesOfSelection = false; + } + break; + + default: + { + eMode = SdrDragMode::Move; + + if ( mpView->GetDragMode() != eMode ) + mpView->SetDragMode(eMode); + } + break; + } + + if (nSlotId != SID_OBJECT_ROTATE) + { + bTempRotation = false; + } + + FuDraw::Activate(); +} + +void FuSelection::SelectionHasChanged() +{ + bSelectionChanged = true; + + FuDraw::SelectionHasChanged(); + + if (mpView->Is3DRotationCreationActive() && !bSuppressChangesOfSelection) + { + // Switch rotation body -> selection + mpView->ResetCreationActive(); + nSlotId = SID_OBJECT_SELECT; + Activate(); + } + + // Activate the right tool bar for the current context of the view. + mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*mpViewShell, *mpView); +} + +/** + * Set current bezier edit mode + */ +void FuSelection::SetEditMode(sal_uInt16 nMode) +{ + nEditMode = nMode; + + if (nEditMode == SID_BEZIER_INSERT) + { + mpView->SetInsObjPointMode(true); + } + else + { + mpView->SetInsObjPointMode(false); + } + + ForcePointer(); + + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_BEZIER_MOVE); + rBindings.Invalidate(SID_BEZIER_INSERT); +} + +/** + * Execute ImageMap interaction + */ +bool FuSelection::HandleImageMapClick(const SdrObject* pObj, const Point& rPos) +{ + bool bClosed = pObj->IsClosedObj(); + bool bFilled = false; + + if (bClosed) + { + SfxItemSet aSet(mpDoc->GetPool()); + + aSet.Put(pObj->GetMergedItemSet()); + + const XFillStyleItem& rFillStyle = aSet.Get(XATTR_FILLSTYLE); + bFilled = rFillStyle.GetValue() != drawing::FillStyle_NONE; + } + + const SdrLayerIDSet* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers(); + double fHitLog = mpWindow->PixelToLogic(Size(HITPIX, 0)).Width(); + const ::tools::Long n2HitLog = fHitLog * 2; + Point aHitPosR(rPos); + Point aHitPosL(rPos); + Point aHitPosT(rPos); + Point aHitPosB(rPos); + + aHitPosR.AdjustX(n2HitLog); + aHitPosL.AdjustX(-n2HitLog); + aHitPosT.AdjustY(n2HitLog); + aHitPosB.AdjustY(-n2HitLog); + + if (!bClosed || !bFilled + || (SdrObjectPrimitiveHit(*pObj, aHitPosR, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, + false) + && SdrObjectPrimitiveHit(*pObj, aHitPosL, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), + pVisiLayer, false) + && SdrObjectPrimitiveHit(*pObj, aHitPosT, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), + pVisiLayer, false) + && SdrObjectPrimitiveHit(*pObj, aHitPosB, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), + pVisiLayer, false))) + { + if (SvxIMapInfo::GetIMapInfo(pObj)) + { + const IMapObject* pIMapObj = SvxIMapInfo::GetHitIMapObject(pObj, rPos); + + if (pIMapObj && !pIMapObj->GetURL().isEmpty()) + { + // Jump to Document + mpWindow->ReleaseMouse(); + SfxStringItem aStrItem(SID_FILE_NAME, pIMapObj->GetURL()); + SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); + SfxBoolItem aBrowseItem(SID_BROWSE, true); + mpWindow->ReleaseMouse(); + pFrame->GetDispatcher()->ExecuteList( + SID_OPENDOC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer }); + + return true; + } + } + } + + return false; +} + +/** is called when the current function should be aborted.

+ This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted +*/ +bool FuSelection::cancel() +{ + if (mpView->Is3DRotationCreationActive()) + { + mpView->ResetCreationActive(); + mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + return true; + } + else + { + return false; + } +} + +SdrObject* FuSelection::pickObject (const Point& rTestPoint) +{ + SdrPageView* pPageView; + sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width()); + return mpView->PickObj(rTestPoint, nHitLog, pPageView, SdrSearchOptions::PICKMARKABLE); +} + +void FuSelection::ForcePointer(const MouseEvent* pMEvt) +{ + if(bMovedToCenterPoint && !bBeginInsertPoint && pMEvt) + { + MouseEvent aMEvt(pMEvt->GetPosPixel(), pMEvt->GetClicks(), + pMEvt->GetMode(), pMEvt->GetButtons(), pMEvt->GetModifier() & ~KEY_SHIFT); + FuDraw::ForcePointer(&aMEvt); + } + else + { + FuDraw::ForcePointer(pMEvt); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fusldlg.cxx b/sd/source/ui/func/fusldlg.cxx new file mode 100644 index 0000000000..ab076b872c --- /dev/null +++ b/sd/source/ui/func/fusldlg.cxx @@ -0,0 +1,226 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +#define ITEMVALUE(ItemSet,Id,Cast) static_cast((ItemSet).Get(Id)).GetValue() + + +FuSlideShowDlg::FuSlideShowDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor( pViewSh, pWin, pView, pDoc, rReq ) +{ +} + +rtl::Reference FuSlideShowDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuSlideShowDlg( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuSlideShowDlg::DoExecute( SfxRequest& ) +{ + PresentationSettings& rPresentationSettings = mpDoc->getPresentationSettings(); + + SfxItemSetFixed aDlgSet( mpDoc->GetPool() ); + std::vector aPageNameList(mpDoc->GetSdPageCount( PageKind::Standard )); + const OUString& rPresPage = rPresentationSettings.maPresPage; + OUString aFirstPage; + SdPage* pPage = nullptr; + ::tools::Long nPage; + + for( nPage = mpDoc->GetSdPageCount( PageKind::Standard ) - 1; nPage >= 0; nPage-- ) + { + pPage = mpDoc->GetSdPage( static_cast(nPage), PageKind::Standard ); + OUString aStr( pPage->GetName() ); + + if ( aStr.isEmpty() ) + { + aStr = SdResId( STR_PAGE ) + OUString::number( nPage + 1 ); + } + + aPageNameList[ nPage ] = aStr; + + // is this our (existing) first page? + if ( rPresPage == aStr ) + aFirstPage = rPresPage; + else if ( pPage->IsSelected() && aFirstPage.isEmpty() ) + aFirstPage = aStr; + } + SdCustomShowList* pCustomShowList = mpDoc->GetCustomShowList(); // No Create + + if( aFirstPage.isEmpty() && pPage ) + aFirstPage = pPage->GetName(); + + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ALL, rPresentationSettings.mbAll ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_CUSTOMSHOW, rPresentationSettings.mbCustomShow ) ); + aDlgSet.Put( SfxStringItem( ATTR_PRESENT_DIANAME, aFirstPage ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ENDLESS, rPresentationSettings.mbEndless ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_MANUEL, rPresentationSettings.mbManual ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_MOUSE, rPresentationSettings.mbMouseVisible ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_PEN, rPresentationSettings.mbMouseAsPen ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ANIMATION_ALLOWED, rPresentationSettings.mbAnimationAllowed ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_CHANGE_PAGE, !rPresentationSettings.mbLockedPages ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ALWAYS_ON_TOP, rPresentationSettings.mbAlwaysOnTop ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_FULLSCREEN, rPresentationSettings.mbFullScreen ) ); + aDlgSet.Put( SfxUInt32Item( ATTR_PRESENT_PAUSE_TIMEOUT, rPresentationSettings.mnPauseTimeout ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_SHOW_PAUSELOGO, rPresentationSettings.mbShowPauseLogo ) ); + + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + aDlgSet.Put( SfxInt32Item( ATTR_PRESENT_DISPLAY, pOptions->GetDisplay() ) ); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( pFact->CreateSdStartPresentationDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, aDlgSet, aPageNameList, pCustomShowList) ); + if( pDlg->Execute() != RET_OK ) + return; + + ::tools::Long nValue32; + bool bValue; + bool bValuesChanged = false; + + pDlg->GetAttr( aDlgSet ); + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ALL, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbAll ) + { + bValuesChanged = true; + rPresentationSettings.mbAll = bValue; + // remove any previous existing slide + rPresentationSettings.maPresPage.clear(); + } + + if (!rPresentationSettings.mbAll) + { + OUString aPage = aDlgSet.Get(ATTR_PRESENT_DIANAME).GetValue(); + if( aPage != rPresentationSettings.maPresPage ) + { + bValuesChanged = true; + rPresentationSettings.maPresPage = aPage; + } + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_CUSTOMSHOW, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbCustomShow ) + { + bValuesChanged = true; + rPresentationSettings.mbCustomShow = bValue; + rPresentationSettings.mbStartCustomShow = false; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ENDLESS, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbEndless ) + { + bValuesChanged = true; + rPresentationSettings.mbEndless = bValue; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_MANUEL, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbManual ) + { + bValuesChanged = true; + rPresentationSettings.mbManual = bValue; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_MOUSE, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbMouseVisible ) + { + bValuesChanged = true; + rPresentationSettings.mbMouseVisible = bValue; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_PEN, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbMouseAsPen ) + { + bValuesChanged = true; + rPresentationSettings.mbMouseAsPen = bValue; + } + + bValue = !ITEMVALUE( aDlgSet, ATTR_PRESENT_CHANGE_PAGE, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbLockedPages ) + { + bValuesChanged = true; + rPresentationSettings.mbLockedPages = bValue; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ANIMATION_ALLOWED, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbAnimationAllowed ) + { + bValuesChanged = true; + rPresentationSettings.mbAnimationAllowed = bValue; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ALWAYS_ON_TOP, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbAlwaysOnTop ) + { + bValuesChanged = true; + rPresentationSettings.mbAlwaysOnTop = bValue; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_FULLSCREEN, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbFullScreen ) + { + bValuesChanged = true; + rPresentationSettings.mbFullScreen = bValue; + } + + nValue32 = aDlgSet.Get(ATTR_PRESENT_PAUSE_TIMEOUT).GetValue(); + if( nValue32 != rPresentationSettings.mnPauseTimeout ) + { + bValuesChanged = true; + rPresentationSettings.mnPauseTimeout = nValue32; + } + + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_SHOW_PAUSELOGO, SfxBoolItem ); + if ( bValue != rPresentationSettings.mbShowPauseLogo ) + { + bValuesChanged = true; + rPresentationSettings.mbShowPauseLogo = bValue; + } + + pOptions->SetDisplay( aDlgSet.Get(ATTR_PRESENT_DISPLAY).GetValue() ); + + // is something has changed, we set the modified flag + if ( bValuesChanged ) + mpDoc->SetChanged(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fusnapln.cxx b/sd/source/ui/func/fusnapln.cxx new file mode 100644 index 0000000000..24808e24a9 --- /dev/null +++ b/sd/source/ui/func/fusnapln.cxx @@ -0,0 +1,195 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +FuSnapLine::FuSnapLine(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq) : + FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuSnapLine::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuSnapLine( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuSnapLine::DoExecute( SfxRequest& rReq ) +{ + const SfxItemSet* pArgs = rReq.GetArgs(); + sal_uInt16 nHelpLine = 0; + bool bCreateNew = true; + + // Get index of snap line or snap point from the request. + const SfxUInt32Item* pHelpLineIndex = rReq.GetArg(ID_VAL_INDEX); + if (pHelpLineIndex != nullptr) + { + nHelpLine = static_cast(pHelpLineIndex->GetValue()); + // Reset the argument pointer to trigger the display of the dialog. + pArgs = nullptr; + } + + SdrPageView* pPV = mpView->GetSdrPageView(); + + if (!pArgs) + { + SfxItemSetFixed aNewAttr(mpViewShell->GetPool()); + bool bLineExist (false); + Point aLinePos; + + if (pHelpLineIndex == nullptr) + { + // The index of the snap line is not provided as argument to the + // request. Determine it from the mouse position. + + aLinePos = static_cast(mpViewShell)->GetMousePos(); + + if ( aLinePos.X() >= 0 ) + { + aLinePos = mpWindow->PixelToLogic(aLinePos); + sal_uInt16 nHitLog = static_cast(mpWindow->PixelToLogic(Size(HITPIX,0)).Width()); + bLineExist = mpView->PickHelpLine(aLinePos, nHitLog, *mpWindow->GetOutDev(), nHelpLine, pPV); + if ( bLineExist ) + aLinePos = (pPV->GetHelpLines())[nHelpLine].GetPos(); + else + pPV = mpView->GetSdrPageView(); + + pPV->LogicToPagePos(aLinePos); + } + else + aLinePos = Point(0,0); + } + else + { + assert(pPV!=nullptr); + aLinePos = (pPV->GetHelpLines())[nHelpLine].GetPos(); + pPV->LogicToPagePos(aLinePos); + bLineExist = true; + } + aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_X, aLinePos.X())); + aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_Y, aLinePos.Y())); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = mpViewShell->GetActiveWindow(); + ScopedVclPtr pDlg( pFact->CreateSdSnapLineDlg(pWin ? pWin->GetFrameWeld() : nullptr, aNewAttr, mpView) ); + + if ( bLineExist ) + { + pDlg->HideRadioGroup(); + + const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine]; + + if ( rHelpLine.GetKind() == SdrHelpLineKind::Point ) + { + pDlg->SetText(SdResId(STR_SNAPDLG_SETPOINT)); + pDlg->SetInputFields(true, true); + } + else + { + pDlg->SetText(SdResId(STR_SNAPDLG_SETLINE)); + + if ( rHelpLine.GetKind() == SdrHelpLineKind::Vertical ) + pDlg->SetInputFields(true, false); + else + pDlg->SetInputFields(false, true); + } + bCreateNew = false; + } + else + pDlg->HideDeleteBtn(); + + sal_uInt16 nResult = pDlg->Execute(); + + pDlg->GetAttr(aNewAttr); + pDlg.disposeAndClear(); + + switch( nResult ) + { + case RET_OK: + rReq.Done(aNewAttr); + pArgs = rReq.GetArgs(); + break; + + case RET_SNAP_DELETE: + // delete snap object + if ( !bCreateNew ) + pPV->DeleteHelpLine(nHelpLine); + [[fallthrough]]; + default: + return; + } + } + Point aHlpPos; + + aHlpPos.setX( pArgs->Get(ATTR_SNAPLINE_X).GetValue() ); + aHlpPos.setY( pArgs->Get(ATTR_SNAPLINE_Y).GetValue() ); + pPV->PagePosToLogic(aHlpPos); + + if ( bCreateNew ) + { + SdrHelpLineKind eKind; + + pPV = mpView->GetSdrPageView(); + + switch ( static_cast(pArgs->Get(ATTR_SNAPLINE_KIND).GetValue()) ) + { + case SnapKind::Horizontal : eKind = SdrHelpLineKind::Horizontal; break; + case SnapKind::Vertical : eKind = SdrHelpLineKind::Vertical; break; + default : eKind = SdrHelpLineKind::Point; break; + } + pPV->InsertHelpLine(SdrHelpLine(eKind, aHlpPos)); + } + else + { + const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine]; + pPV->SetHelpLine(nHelpLine, SdrHelpLine(rHelpLine.GetKind(), aHlpPos)); + } +} + +void FuSnapLine::Activate() +{ +} + +void FuSnapLine::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fusumry.cxx b/sd/source/ui/func/fusumry.cxx new file mode 100644 index 0000000000..9b160099cb --- /dev/null +++ b/sd/source/ui/func/fusumry.cxx @@ -0,0 +1,229 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + + +FuSummaryPage::FuSummaryPage ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuSummaryPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuSummaryPage( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuSummaryPage::DoExecute( SfxRequest& ) +{ + std::unique_ptr pOutl; + rtl::Reference pSummaryPage; + sal_uInt16 i = 0; + sal_uInt16 nFirstPage = SDRPAGE_NOTFOUND; + sal_uInt16 nSelectedPages = 0; + sal_uInt16 nCount = mpDoc->GetSdPageCount(PageKind::Standard); + + while (i < nCount && nSelectedPages <= 1) + { + /* How many pages are selected? + exactly one: pool everything from this page + otherwise: only pool the selected pages */ + SdPage* pActualPage = mpDoc->GetSdPage(i, PageKind::Standard); + + if (pActualPage->IsSelected()) + { + if (nFirstPage == SDRPAGE_NOTFOUND) + { + nFirstPage = i; + } + + nSelectedPages++; + } + + i++; + } + + bool bBegUndo = false; + + SfxStyleSheet* pStyle = nullptr; + + for (i = nFirstPage; i < nCount; i++) + { + SdPage* pActualPage = mpDoc->GetSdPage(i, PageKind::Standard); + + if (nSelectedPages <= 1 || pActualPage->IsSelected()) + { + SdPage* pActualNotesPage = mpDoc->GetSdPage(i, PageKind::Notes); + SdrTextObj* pTextObj = static_cast( pActualPage->GetPresObj(PresObjKind::Title) ); + + if (pTextObj && !pTextObj->IsEmptyPresObj()) + { + if (!pSummaryPage) + { + // insert "table of content"-page and create outliner + const bool bUndo = mpView->IsUndoEnabled(); + + if( bUndo ) + { + mpView->BegUndo(SdResId(STR_UNDO_SUMMARY_PAGE)); + bBegUndo = true; + } + + SdrLayerIDSet aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers(); + + // page with title & structuring! + pSummaryPage = mpDoc->AllocSdPage(false); + pSummaryPage->SetSize(pActualPage->GetSize() ); + pSummaryPage->SetBorder(pActualPage->GetLeftBorder(), + pActualPage->GetUpperBorder(), + pActualPage->GetRightBorder(), + pActualPage->GetLowerBorder() ); + + // insert page at the back + mpDoc->InsertPage(pSummaryPage.get(), nCount * 2 + 1); + if( bUndo ) + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pSummaryPage)); + + // use MasterPage of the current page + pSummaryPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage()); + pSummaryPage->SetLayoutName(pActualPage->GetLayoutName()); + pSummaryPage->SetAutoLayout(AUTOLAYOUT_TITLE_CONTENT, true); + pSummaryPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + pSummaryPage->setHeaderFooterSettings(pActualPage->getHeaderFooterSettings()); + + // notes-page + rtl::Reference pNotesPage = mpDoc->AllocSdPage(false); + pNotesPage->SetSize(pActualNotesPage->GetSize()); + pNotesPage->SetBorder(pActualNotesPage->GetLeftBorder(), + pActualNotesPage->GetUpperBorder(), + pActualNotesPage->GetRightBorder(), + pActualNotesPage->GetLowerBorder() ); + pNotesPage->SetPageKind(PageKind::Notes); + + // insert page at the back + mpDoc->InsertPage(pNotesPage.get(), nCount * 2 + 2); + + if( bUndo ) + mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage)); + + // use MasterPage of the current page + pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage()); + pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName()); + pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), true); + pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + pNotesPage->setHeaderFooterSettings(pActualNotesPage->getHeaderFooterSettings()); + + pOutl.reset(new SdOutliner( mpDoc, OutlinerMode::OutlineObject )); + pOutl->SetUpdateLayout(false); + pOutl->EnableUndo(false); + + if (mpDocSh) + pOutl->SetRefDevice(SD_MOD()->GetVirtualRefDevice()); + + pOutl->SetDefTab( mpDoc->GetDefaultTabulator() ); + pOutl->SetStyleSheetPool(static_cast(mpDoc->GetStyleSheetPool())); + pStyle = pSummaryPage->GetStyleSheetForPresObj( PresObjKind::Outline ); + pOutl->SetStyleSheet( 0, pStyle ); + } + + // add text + OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); + // #118876#, check if the OutlinerParaObject is created successfully + if( pParaObj ) + { + pParaObj->SetOutlinerMode( OutlinerMode::OutlineObject ); + pOutl->AddText(*pParaObj); + } + } + } + } + + if (!pSummaryPage) + return; + + SdrTextObj* pTextObj = static_cast( pSummaryPage->GetPresObj(PresObjKind::Outline) ); + + if (!pTextObj) + return; + + // remove hard break- and character attributes + SfxItemSetFixed aEmptyEEAttr(mpDoc->GetPool()); + sal_Int32 nParaCount = pOutl->GetParagraphCount(); + + for (sal_Int32 nPara = 0; nPara < nParaCount; nPara++) + { + pOutl->SetStyleSheet( nPara, pStyle ); + pOutl->RemoveCharAttribs(nPara); + pOutl->SetParaAttribs(nPara, aEmptyEEAttr); + pOutl->SetDepth(pOutl->GetParagraph(nPara), 0); + } + + pTextObj->SetOutlinerParaObject( pOutl->CreateParaObject() ); + pTextObj->SetEmptyPresObj(false); + + // remove hard attributes (Flag to sal_True) + SfxItemSet aAttr(mpDoc->GetPool()); + aAttr.Put(XLineStyleItem(drawing::LineStyle_NONE)); + aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE)); + pTextObj->SetMergedItemSet(aAttr); + + if( bBegUndo ) + mpView->EndUndo(); + pOutl.reset(); + + DrawViewShell* pDrawViewShell= dynamic_cast< DrawViewShell* >( mpViewShell ); + if(pDrawViewShell) + { + pDrawViewShell->SwitchPage( (pSummaryPage->GetPageNum() - 1) / 2); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/futempl.cxx b/sd/source/ui/func/futempl.cxx new file mode 100644 index 0000000000..2c0c22ecde --- /dev/null +++ b/sd/source/ui/func/futempl.cxx @@ -0,0 +1,638 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star::uno; +using namespace com::sun::star::container; +using namespace com::sun::star::beans; +using namespace com::sun::star::style; + +namespace sd +{ + + +FuTemplate::FuTemplate ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ) + : FuPoor( pViewSh, pWin, pView, pDoc, rReq ) +{ +} + +rtl::Reference FuTemplate::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuTemplate( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuTemplate::DoExecute( SfxRequest& rReq ) +{ + const SfxItemSet* pArgs = rReq.GetArgs(); + sal_uInt16 nSId = rReq.GetSlot(); + + // get StyleSheet parameter + SfxStyleSheetBasePool* pSSPool = mpDoc->GetDocSh()->GetStyleSheetPool(); + SfxStyleSheetBase* pStyleSheet = nullptr; + + const SfxPoolItem* pItem; + SfxStyleFamily nFamily = SfxStyleFamily(USHRT_MAX); + if( pArgs && SfxItemState::SET == pArgs->GetItemState( SID_STYLE_FAMILY, + false, &pItem )) + { + nFamily = static_cast( pArgs->Get( SID_STYLE_FAMILY ).GetValue()); + } + else if( pArgs && SfxItemState::SET == pArgs->GetItemState( SID_STYLE_FAMILYNAME, + false, &pItem )) + { + OUString sFamily = pArgs->Get( SID_STYLE_FAMILYNAME ).GetValue(); + if (sFamily == "graphics") + nFamily = SfxStyleFamily::Para; + else + nFamily = SfxStyleFamily::Pseudo; + } + + OUString aStyleName; + sal_uInt16 nRetMask = static_cast(SfxStyleSearchBits::All); + + switch( nSId ) + { + case SID_STYLE_APPLY: + case SID_STYLE_EDIT: + case SID_STYLE_DELETE: + case SID_STYLE_HIDE: + case SID_STYLE_SHOW: + case SID_STYLE_FAMILY: + case SID_STYLE_NEW_BY_EXAMPLE: + { + const SfxStringItem* pNameItem = rReq.GetArg(SID_APPLY_STYLE); + const SfxStringItem* pFamilyItem = rReq.GetArg(SID_STYLE_FAMILYNAME); + if ( pFamilyItem && pNameItem ) + { + try + { + Reference< XStyleFamiliesSupplier > xModel(mpDoc->GetDocSh()->GetModel(), UNO_QUERY_THROW ); + Reference< XNameAccess > xCont( xModel->getStyleFamilies() ); + Reference< XNameAccess > xStyles( xCont->getByName(pFamilyItem->GetValue()), UNO_QUERY_THROW ); + Reference< XPropertySet > xInfo( xStyles->getByName( pNameItem->GetValue() ), UNO_QUERY_THROW ); + + OUString aUIName; + xInfo->getPropertyValue( "DisplayName" ) >>= aUIName; + if ( !aUIName.isEmpty() ) + rReq.AppendItem( SfxStringItem( nSId, aUIName ) ); + } + catch( Exception& ) + { + } + } + + if (pArgs && pArgs->GetItemState(nSId) == SfxItemState::SET) + aStyleName = static_cast( pArgs->Get( nSId ) ).GetValue(); + } + } + + switch( nSId ) + { + case SID_STYLE_NEW: + { + SfxStyleSheetBase *p = pSSPool->Find(aStyleName, nFamily ); + if(p) + { + pSSPool->Remove(p); + p = nullptr; + } + pStyleSheet = &pSSPool->Make( aStyleName, nFamily, SfxStyleSearchBits::UserDefined ); + + if (pArgs && pArgs->GetItemState(SID_STYLE_REFERENCE) == SfxItemState::SET) + { + OUString aParentName( pArgs->Get(SID_STYLE_REFERENCE).GetValue()); + pStyleSheet->SetParent(aParentName); + } + else + { + pStyleSheet->SetParent(SdResId(STR_STANDARD_STYLESHEET_NAME)); + } + } + break; + + case SID_STYLE_NEW_BY_EXAMPLE: + { + // at the moment, the dialog to enter the name of the template is still opened + SfxStyleSheetBase *p = pSSPool->Find(aStyleName, nFamily ); + if(p) + { + pSSPool->Remove(p); + p = nullptr; + } + pStyleSheet = &pSSPool->Make( aStyleName, nFamily, SfxStyleSearchBits::UserDefined ); + pStyleSheet->SetParent(SdResId(STR_STANDARD_STYLESHEET_NAME)); + } + break; + + case SID_STYLE_EDIT: + pStyleSheet = pSSPool->Find( aStyleName, nFamily); + break; + + case SID_STYLE_DELETE: + pStyleSheet = pSSPool->Find( aStyleName, nFamily); + if( pStyleSheet ) + { + pSSPool->Remove( pStyleSheet ); + nRetMask = sal_uInt16(true); + mpDoc->SetChanged(); + } + else + { + nRetMask = sal_uInt16(false); + } + break; + + case SID_STYLE_HIDE: + case SID_STYLE_SHOW: + pStyleSheet = pSSPool->Find( aStyleName, nFamily); + pStyleSheet->SetHidden( nSId == SID_STYLE_HIDE ); + nRetMask = sal_uInt16(true); + break; + + case SID_STYLE_APPLY: + // apply the template to the document + pStyleSheet = pSSPool->Find( aStyleName, nFamily); + + // do not set presentation styles, they will be set implicit + if ( pStyleSheet && pStyleSheet->GetFamily() != SfxStyleFamily::Pseudo ) + { + SfxStyleSheet* pOldStyleSheet = mpView->GetStyleSheet(); + OUString aStr; + + if( // if the object had no style sheet, allow all + !pOldStyleSheet || + + // allow if old and new style sheet has same family + pStyleSheet->GetFamily() == pOldStyleSheet->GetFamily() || + + // allow if old was background objects and new is graphics + (pStyleSheet->GetFamily() == SfxStyleFamily::Para && pOldStyleSheet->GetHelpId( aStr ) == HID_PSEUDOSHEET_BACKGROUNDOBJECTS) || + + // allow if old was presentation and we are a drawing document + (pOldStyleSheet->GetFamily() == SfxStyleFamily::Page && mpDoc->GetDocumentType() == DocumentType::Draw) ) + { + mpView->SetStyleSheet( static_cast(pStyleSheet)); + mpDoc->SetChanged(); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 ); + } + } + break; + + case SID_STYLE_WATERCAN: + { + if( !SD_MOD()->GetWaterCan() ) + { + if (pArgs && pArgs->GetItemState( nSId ) == SfxItemState::SET) + { + aStyleName = static_cast( pArgs->Get( nSId ) ).GetValue(); + SD_MOD()->SetWaterCan( true ); + pStyleSheet = pSSPool->Find( aStyleName, nFamily); + } + // no presentation object templates, they are only allowed implicitly + if( pStyleSheet && pStyleSheet->GetFamily() != SfxStyleFamily::Pseudo ) + { + static_cast( pSSPool )->SetActualStyleSheet( pStyleSheet ); + + // we switch explicitly into selection mode + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + + } + else + SD_MOD()->SetWaterCan( false ); + } + else + { + SD_MOD()->SetWaterCan( false ); + // we have to re-enable to tools-bar + mpViewShell->Invalidate(); + } + } + break; + + default: + break; + } + + switch( nSId ) + { + case SID_STYLE_NEW: + case SID_STYLE_EDIT: + { + PresentationObjects ePO = PresentationObjects::Outline_1; + + if( pStyleSheet ) + { + ScopedVclPtr pStdDlg; + ScopedVclPtr pPresDlg; + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + + SfxStyleFamily eFamily = pStyleSheet->GetFamily(); + + if (eFamily == SfxStyleFamily::Para) + { + pStdDlg.disposeAndReset(pFact ? pFact->CreateSdTabTemplateDlg(mpViewShell->GetFrameWeld(), mpDoc->GetDocSh(), *pStyleSheet, mpDoc, mpView) : nullptr); + } + else if (eFamily == SfxStyleFamily::Pseudo) + { + OUString aName(pStyleSheet->GetName()); + bool bBackground = false; + bool bOldDocInOtherLanguage = false; + + if (aName == SdResId(STR_PSEUDOSHEET_TITLE)) + { + ePO = PresentationObjects::Title; + } + else if (aName == SdResId(STR_PSEUDOSHEET_SUBTITLE)) + { + ePO = PresentationObjects::Subtitle; + } + else if (aName == + SdResId(STR_PSEUDOSHEET_BACKGROUND)) + { + bBackground = true; + ePO = PresentationObjects::Background; + } + else if (aName == + SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS)) + { + ePO = PresentationObjects::BackgroundObjects; + } + else if (aName == + SdResId(STR_PSEUDOSHEET_NOTES)) + { + ePO = PresentationObjects::Notes; + } + else if(aName.indexOf(SdResId(STR_PSEUDOSHEET_OUTLINE)) != -1) + { + OUString aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE)); + // determine number, mind the blank between name and number + std::u16string_view aNumStr(aName.subView(aOutlineStr.getLength() + 1)); + sal_uInt16 nLevel = static_cast(o3tl::toInt32(aNumStr)); + switch (nLevel) + { + case 1: ePO = PresentationObjects::Outline_1; break; + case 2: ePO = PresentationObjects::Outline_2; break; + case 3: ePO = PresentationObjects::Outline_3; break; + case 4: ePO = PresentationObjects::Outline_4; break; + case 5: ePO = PresentationObjects::Outline_5; break; + case 6: ePO = PresentationObjects::Outline_6; break; + case 7: ePO = PresentationObjects::Outline_7; break; + case 8: ePO = PresentationObjects::Outline_8; break; + case 9: ePO = PresentationObjects::Outline_9; break; + } + } + else + { + OSL_FAIL("StyleSheet from older version with different language"); + bOldDocInOtherLanguage = true; + } + + if( !bOldDocInOtherLanguage ) + { + pPresDlg.disposeAndReset(pFact ? pFact->CreateSdPresLayoutTemplateDlg(mpDocSh, mpViewShell->GetFrameWeld(), bBackground, *pStyleSheet, ePO, pSSPool ) : nullptr); + } + } + + sal_uInt16 nResult = RET_CANCEL; + const SfxItemSet* pOutSet = nullptr; + if (pStdDlg) + { + nResult = pStdDlg->Execute(); + pOutSet = pStdDlg->GetOutputItemSet(); + } + else if( pPresDlg ) + { + nResult = pPresDlg->Execute(); + pOutSet = pPresDlg->GetOutputItemSet(); + } + + switch( nResult ) + { + case RET_OK: + { + nRetMask = static_cast(pStyleSheet->GetMask()); + + if (eFamily == SfxStyleFamily::Pseudo) + { + SfxItemSet aTempSet(*pOutSet); + /* Extract SvxBrushItem out of set and insert SvxColorItem */ + const SvxBrushItem* pBrushItem = aTempSet.GetItem( SID_ATTR_BRUSH_CHAR ); + + if ( pBrushItem ) + { + SvxColorItem aBackColorItem(pBrushItem->GetColor(), EE_CHAR_BKGCOLOR); + aTempSet.ClearItem( EE_CHAR_BKGCOLOR ); + aTempSet.Put( aBackColorItem ); + } + static_cast(pStyleSheet)->AdjustToFontHeight(aTempSet); + + /* Special treatment: reset the INVALIDS to + NULL-Pointer (otherwise INVALIDs or pointer point + to DefaultItems in the template; both would + prevent the attribute inheritance) */ + aTempSet.ClearInvalidItems(); + + // EE_PARA_NUMBULLET item is only valid in first outline template + if( (ePO >= PresentationObjects::Outline_2) && (ePO <= PresentationObjects::Outline_9) ) + { + if (aTempSet.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET) + { + SvxNumRule aRule(aTempSet.GetItem(EE_PARA_NUMBULLET)->GetNumRule()); + + OUString sStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " 1"); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( sStyleName, SfxStyleFamily::Pseudo); + + if(pFirstStyleSheet) + { + pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET )); + SdStyleSheet* pRealSheet = static_cast(pFirstStyleSheet)->GetRealStyleSheet(); + pRealSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + } + + aTempSet.ClearItem( EE_PARA_NUMBULLET ); + } + } + + pStyleSheet->GetItemSet().Put(aTempSet); + SdStyleSheet::BroadcastSdStyleSheetChange(pStyleSheet, ePO, pSSPool); + } + + SfxItemSet& rAttr = pStyleSheet->GetItemSet(); + + sdr::properties::CleanupFillProperties( rAttr ); + + // check for unique names of named items for xml + if( rAttr.GetItemState( XATTR_FILLBITMAP ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLBITMAP ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + if( rAttr.GetItemState( XATTR_LINEDASH ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEDASH ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + if( rAttr.GetItemState( XATTR_LINESTART ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINESTART ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + if( rAttr.GetItemState( XATTR_LINEEND ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEEND ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + if( rAttr.GetItemState( XATTR_FILLGRADIENT ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLGRADIENT ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + if( rAttr.GetItemState( XATTR_FILLFLOATTRANSPARENCE ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLFLOATTRANSPARENCE ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + if( rAttr.GetItemState( XATTR_FILLHATCH ) == SfxItemState::SET ) + { + const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLHATCH ); + std::unique_ptr pNewItem = static_cast(pOldItem)->checkForUniqueItem( mpDoc ); + if( pNewItem ) + { + rAttr.Put( std::move(pNewItem) ); + } + } + + static_cast( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) ); + + DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewShell ); + if( pDrawViewShell ) + { + PageKind ePageKind = pDrawViewShell->GetPageKind(); + if( ePageKind == PageKind::Notes || ePageKind == PageKind::Handout ) + { + SdPage* pPage = mpViewShell->GetActualPage(); + + if(pDrawViewShell->GetEditMode() == EditMode::MasterPage) + { + pPage = static_cast((&(pPage->TRG_GetMasterPage()))); + } + + if( pPage ) + { + SdrObjListIter aIter( pPage ); + while( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + if( dynamic_cast< const SdrPageObj *>( pObj ) != nullptr ) + { + // repaint only + pObj->ActionChanged(); + // pObj->SendRepaintBroadcast(); + } + } + } + } + } + + if( mpDoc->GetOnlineSpell() ) + { + if( SfxItemState::SET == rAttr.GetItemState(EE_CHAR_LANGUAGE, false ) || + SfxItemState::SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CJK, false ) || + SfxItemState::SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CTL, false ) ) + { + mpDoc->StopOnlineSpelling(); + mpDoc->StartOnlineSpelling(); + } + } + + mpDoc->SetChanged(); + } + break; + + default: + { + if( nSId == SID_STYLE_NEW ) + pSSPool->Remove( pStyleSheet ); + } + return; // Cancel + } + } + } + break; + + case SID_STYLE_NEW_BY_EXAMPLE: + { + if( pStyleSheet ) + { + nRetMask = static_cast(pStyleSheet->GetMask()); + SfxItemSet aCoreSet( mpDoc->GetPool() ); + mpView->GetAttributes( aCoreSet, true ); + + // if the object had a template, this becomes parent of the new template + SfxStyleSheet* pOldStyle = mpView->GetStyleSheet(); + + // if pOldStyle == pStyleSheet -> recursion + if( pOldStyle != pStyleSheet ) + { + if (pOldStyle) + { + pStyleSheet->SetParent(pOldStyle->GetName()); + } + + SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet(); + pStyleSet->Put(aCoreSet); + + /* apply template (but not when somebody is editing a text. + To do this, the edit engine had to be capable to use + templates on a character level. */ + if (!mpView->GetTextEditObject()) + { + mpView->SetStyleSheet( static_cast(pStyleSheet)); + } + + static_cast( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) ); + mpDoc->SetChanged(); + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 ); + } + } + } + break; + + case SID_STYLE_UPDATE_BY_EXAMPLE: + { + if ((mpView->AreObjectsMarked() && mpView->GetMarkedObjectList().GetMarkCount() == 1) || + dynamic_cast< const OutlineView *>( mpView ) != nullptr) + { + pStyleSheet = mpView->GetStyleSheet(); + + if( pStyleSheet ) + { + nRetMask = static_cast(pStyleSheet->GetMask()); + SfxItemSet aCoreSet( mpDoc->GetPool() ); + mpView->GetAttributes( aCoreSet ); + + SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet(); + pStyleSet->Put( aCoreSet ); + + mpView->SetStyleSheet( static_cast(pStyleSheet)); + + static_cast( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) ); + mpDoc->SetChanged(); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 ); + } + } + } + break; + + } + if( nRetMask != static_cast(SfxStyleSearchBits::All) ) + rReq.SetReturnValue( SfxUInt16Item( nSId, nRetMask ) ); +} + +void FuTemplate::Activate() +{ +} + +void FuTemplate::Deactivate() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx new file mode 100644 index 0000000000..549248f152 --- /dev/null +++ b/sd/source/ui/func/futext.cxx @@ -0,0 +1,1416 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +namespace sd { + +const sal_uInt16 SidArray[] = { + SID_STYLE_FAMILY2, // 5542 + SID_STYLE_FAMILY5, // 5545 + SID_REDO, // 5700 + SID_UNDO, // 5701 + SID_CUT, // 5710 + SID_COPY, // 5711 + SID_ATTR_TABSTOP, // 10002 + SID_ATTR_CHAR_FONT, // 10007 + SID_ATTR_CHAR_POSTURE, // 10008 + SID_ATTR_CHAR_WEIGHT, // 10009 + SID_ATTR_CHAR_SHADOWED, // 10010 + SID_ATTR_CHAR_STRIKEOUT, // 10013 + SID_ATTR_CHAR_UNDERLINE, // 10014 + SID_ATTR_CHAR_FONTHEIGHT, // 10015 + SID_ATTR_CHAR_COLOR, // 10017 + SID_ATTR_CHAR_KERNING, // 10018 + SID_ATTR_CHAR_CASEMAP, // 10019 + SID_ATTR_PARA_ADJUST_LEFT, // 10028 + SID_ATTR_PARA_ADJUST_RIGHT, // 10029 + SID_ATTR_PARA_ADJUST_CENTER, // 10030 + SID_ATTR_PARA_ADJUST_BLOCK, // 10031 + SID_ATTR_PARA_LINESPACE_10, // 10034 + SID_ATTR_PARA_LINESPACE_15, // 10035 + SID_ATTR_PARA_LINESPACE_20, // 10036 + SID_ATTR_PARA_ULSPACE, // 10042 + SID_ATTR_PARA_LRSPACE, // 10043 + SID_ATTR_TRANSFORM_POS_X, // 10088 + SID_ATTR_TRANSFORM_POS_Y, // 10089 + SID_ATTR_TRANSFORM_WIDTH, // 10090 + SID_ATTR_TRANSFORM_HEIGHT, // 10091 + SID_ATTR_TRANSFORM_ROT_X, // 10093 + SID_ATTR_TRANSFORM_ROT_Y, // 10094 + SID_ATTR_TRANSFORM_ANGLE, // 10095 //Added + SID_OUTLINE_UP, // 10150 + SID_OUTLINE_DOWN, // 10151 + SID_OUTLINE_LEFT, // 10152 + SID_OUTLINE_RIGHT, // 10153 + SID_ATTR_TRANSFORM_PROTECT_POS, // 10236 + SID_ATTR_TRANSFORM_PROTECT_SIZE, // 10237 //Added + SID_FORMTEXT_STYLE, // 10257 + SID_SET_SUPER_SCRIPT, // 10294 + SID_SET_SUB_SCRIPT, // 10295 + SID_ATTR_TRANSFORM_AUTOWIDTH, // 10310 + SID_ATTR_TRANSFORM_AUTOHEIGHT, // 10311 //Added + SID_HYPERLINK_GETLINK, // 10361 + SID_DEC_INDENT, // 10461 + SID_INC_INDENT, // 10462 + SID_CHARMAP, // 10503 + SID_TEXTDIRECTION_LEFT_TO_RIGHT, // 10907 + SID_TEXTDIRECTION_TOP_TO_BOTTOM, // 10908 + SID_ATTR_PARA_LEFT_TO_RIGHT, // 10950 + SID_ATTR_PARA_RIGHT_TO_LEFT, // 10951 + SID_PARASPACE_INCREASE, // 11145 + SID_PARASPACE_DECREASE, // 11146 + FN_NUM_BULLET_ON, // 20138 + 0 }; + + +/** + * base class for text functions + */ +FuText::FuText( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +: FuConstruct(pViewSh, pWin, pView, pDoc, rReq) +, bFirstObjCreated(false) +, bJustEndedEdit(false) +, rRequest (rReq) +{ +} + +rtl::Reference FuText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuText( pViewSh, pWin, pView, pDoc, rReq ) ); + return xFunc; +} + +void FuText::disposing() +{ + if(mpView) + { + if(mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted) + mxTextObj = nullptr; + + // reset the RequestHandler of the used Outliner to the handler of the document + ::Outliner* pOutliner = mpView->GetTextEditOutliner(); + + if (pOutliner) + pOutliner->SetStyleSheetPool(static_cast(mpDoc->GetStyleSheetPool())); + } +} + +/************************************************************************* +|* +|* Execute functionality of this class: +|* +|* #71422: Start the functionality of this class in this method +|* and not in the ctor. +|* If you construct an object of this class and you put the +|* address of this object to pFuActual you've got a problem, +|* because some methods inside DoExecute use the pFuActual-Pointer. +|* If the code inside DoExecute is executed inside the ctor, +|* the value of pFuActual is not right. And the value will not +|* be right until the ctor finished !!! +|* +\************************************************************************/ +void FuText::DoExecute( SfxRequest& ) +{ + mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBarShell( + ToolBarManager::ToolBarGroup::Function, + ToolbarId::Draw_Text_Toolbox_Sd); + + mpView->SetCurrentObj(SdrObjKind::Text); + mpView->SetEditMode(SdrViewEditMode::Edit); + + MouseEvent aMEvt(mpWindow->GetPointerPosPixel()); + + if (nSlotId == SID_TEXTEDIT) + { + // Try to select an object + SdrPageView* pPV = mpView->GetSdrPageView(); + SdrViewEvent aVEvt; + mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + mpView->MarkObj(aVEvt.mpRootObj, pPV); + + mxTextObj = DynCastSdrTextObj( aVEvt.mpObj ); + } + else if (mpView->AreObjectsMarked()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + mxTextObj = DynCastSdrTextObj( pObj ); + } + } + + // check for table + if (mpView->AreObjectsMarked()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( pObj && (pObj->GetObjInventor() == SdrInventor::Default ) && (pObj->GetObjIdentifier() == SdrObjKind::Table) ) + { + mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Table_Toolbox); + } + } + } + + bool bQuickDrag = true; + + const SfxItemSet* pArgs = rRequest.GetArgs(); + + if (pArgs + + // test for type before using + && SID_TEXTEDIT == nSlotId + && SfxItemState::SET == pArgs->GetItemState(SID_TEXTEDIT) + + && pArgs->Get(SID_TEXTEDIT).GetValue() == 2) + { + // Selection by doubleclick -> don't allow QuickDrag + bQuickDrag = false; + } + + SetInEditMode(aMEvt, bQuickDrag); +} + +bool FuText::MouseButtonDown(const MouseEvent& rMEvt) +{ + bMBDown = true; + bJustEndedEdit = false; + + bool bReturn = FuDraw::MouseButtonDown(rMEvt); + + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + // handle URL also during the text editing + if (rMEvt.GetClicks() == 1 && rMEvt.IsLeft() && rMEvt.IsMod1()) + { + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if (mxTextObj.get().is() && pOLV && pOLV->GetFieldUnderMousePointer()) + { + const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer(); + if (pFieldItem) + { + const SvxFieldData* pField = pFieldItem->GetField(); + + if (auto pURLField = dynamic_cast< const SvxURLField *>( pField )) + { + eHit = SdrHitKind::MarkedObject; + aVEvt.meEvent = SdrEventKind::ExecuteUrl; + aVEvt.mpURLField = pURLField; + } + } + } + } + + if (eHit == SdrHitKind::TextEdit) + { + // hit text -> SdrView handles event + if (mpView->MouseButtonDown(rMEvt, mpWindow->GetOutDev())) + return true; + } + + if (rMEvt.GetClicks() == 1) + { + if (mpView->IsTextEdit() && eHit != SdrHitKind::MarkedObject && eHit != SdrHitKind::Handle) + { + // finish text input + if(mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted) + { + /* Bugfix from MBA: during a double click onto the unused? area + in text mode, we get with the second click eHit = + SdrHitKind::TextEditObj since it goes to the TextObject which was + created with the first click. But this is removed by + SdrEndTextEdit since it is empty. But it is still in the mark + list. The call MarkObj further below accesses then the dead + object. As a simple fix, we determine eHit after + SdrEndTextEdit again, this returns then SdrHitKind::NONE. */ + mxTextObj = nullptr; + eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + } + + mpView->SetCurrentObj(SdrObjKind::Text); + mpView->SetEditMode(SdrViewEditMode::Edit); + } + + if (rMEvt.IsLeft() || rMEvt.IsRight()) + { + mpWindow->CaptureMouse(); + SdrPageView* pPV = mpView->GetSdrPageView(); + + if (eHit == SdrHitKind::TextEdit) + { + SetInEditMode(rMEvt, false); + } + else + { + // Don't remark table when clicking in it, mark change triggers a lot of updating + bool bMarkChanges = true; + rtl::Reference< sdr::SelectionController > xSelectionController(mpView->getSelectionController()); + if (eHit == SdrHitKind::TextEditObj && xSelectionController.is()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if (rMarkList.GetMarkCount() == 1 && rMarkList.GetMark(0)->GetMarkedSdrObj() == aVEvt.mpRootObj) + bMarkChanges = false; + } + + if (eHit != SdrHitKind::Handle) + { + // deselect selection + if (!rMEvt.IsShift() && eHit == SdrHitKind::TextEditObj) + { + if(bMarkChanges) + { + mpView->UnmarkAll(); + mpView->SetDragMode(SdrDragMode::Move); + } + } + } + + if ( aVEvt.meEvent == SdrEventKind::ExecuteUrl || + eHit == SdrHitKind::Handle || + eHit == SdrHitKind::MarkedObject || + eHit == SdrHitKind::TextEditObj || + ( eHit == SdrHitKind::UnmarkedObject && bFirstObjCreated && + !bPermanent ) ) + { + // Handle, hit marked or unmarked object + if (eHit == SdrHitKind::TextEditObj) + { + /* hit text of unmarked object: + select object and set to EditMode */ + if (bMarkChanges) + mpView->MarkObj(aVEvt.mpRootObj, pPV); + + if (auto pSdrTextObj = DynCastSdrTextObj(aVEvt.mpObj)) + { + mxTextObj = pSdrTextObj; + } + + SetInEditMode(rMEvt, true); + } + else if (aVEvt.meEvent == SdrEventKind::ExecuteUrl && !rMEvt.IsMod2()) + { + // execute URL + mpWindow->ReleaseMouse(); + + if (aVEvt.mpURLField) + { + SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.mpURLField->GetURL()); + SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); + SfxBoolItem aBrowseItem( SID_BROWSE, true ); + SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); + + if (rMEvt.IsMod1()) + { + // open in new frame + pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aBrowseItem, &aReferer }); + } + else + { + // open in current frame + SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); + pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer }); + } + } + } + else + { + // drag object or handle + + // #i78748# + // do the EndTextEdit first, it will delete the handles and force a + // recreation. This will make aVEvt.mpHdl to point to a deleted handle, + // thus it is necessary to reset it and to get it again. + + // #i112855# + // cl: I'm not sure why we checked here also for mxTextObj->GetOutlinerParaObject + // this caused SdrEndTextEdit() to be called also when not in text editing and + // this does not make sense and caused troubles. (see issue 112855) + + if( mpView->IsTextEdit() ) + { + mpView->SdrEndTextEdit(); + bJustEndedEdit = true; + + if(aVEvt.mpHdl) + { + // force new handle identification, the pointer will be dead here + // since SdrEndTextEdit has reset (deleted) the handles. + aVEvt.mpHdl = nullptr; + mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + } + } + + if (!aVEvt.mpHdl) + { + if( eHit == SdrHitKind::UnmarkedObject ) + { + if ( !rMEvt.IsShift() ) + mpView->UnmarkAll(); + + mpView->MarkObj(aVEvt.mpRootObj, pPV); + } + + // Drag object + bFirstMouseMove = true; + aDragTimer.Start(); + } + + if ( ! rMEvt.IsRight()) + { + // we need to pick again since SdrEndTextEdit can rebuild the handles list + eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + if( (eHit == SdrHitKind::Handle) || (eHit == SdrHitKind::MarkedObject) ) + { + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog); + } + } + bReturn = true; + } + } + else if ( nSlotId != SID_TEXTEDIT && + (bPermanent || !bFirstObjCreated) ) + { + // create object + mpView->SetCurrentObj(SdrObjKind::Text); + mpView->SetEditMode(SdrViewEditMode::Create); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpView->BegCreateObj(aMDPos, nullptr, nDrgLog); + } + else + { + // select + if( !rMEvt.IsShift() ) + mpView->UnmarkAll(); + + mpView->BegMarkObj( aMDPos ); + } + } + } + } + else if ( rMEvt.GetClicks() == 2 && !mpView->IsTextEdit() ) + { + MouseEvent aMEvt( mpWindow->GetPointerPosPixel() ); + SetInEditMode( aMEvt, false ); + } + + if (!bIsInDragMode) + { + ForcePointer(&rMEvt); + mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray); + } + + return bReturn; +} + +bool FuText::MouseMove(const MouseEvent& rMEvt) +{ + bool bReturn = FuDraw::MouseMove(rMEvt); + + if (aDragTimer.IsActive() ) + { + if( bFirstMouseMove ) + bFirstMouseMove = false; + else + aDragTimer.Stop(); + } + + if (!bReturn && mpView->IsAction() && !mpDocSh->IsReadOnly()) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt(mpWindow->PixelToLogic(aPix)); + + ForceScroll(aPix); + mpView->MovAction(aPnt); + } + + ForcePointer(&rMEvt); + + return bReturn; +} + +void FuText::ImpSetAttributesForNewTextObject(SdrTextObj* pTxtObj) +{ + if( nSlotId == SID_ATTR_CHAR ) + { + SfxItemSet aSet(mpViewShell->GetPool()); + aSet.Put(makeSdrTextAutoGrowWidthItem(false)); + aSet.Put(makeSdrTextAutoGrowHeightItem(true)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); + const SfxViewShell* pCurrentViewShell = SfxViewShell::Current(); + if (pCurrentViewShell && (pCurrentViewShell->isLOKMobilePhone() || pCurrentViewShell->isLOKTablet())) + pTxtObj->SetText(SdResId(STR_PRESOBJ_TEXT_EDIT_MOBILE)); + } + else if( nSlotId == SID_ATTR_CHAR_VERTICAL ) + { + // draw text object, needs to be initialized when vertical text is used + SfxItemSet aSet(mpViewShell->GetPool()); + + aSet.Put(makeSdrTextAutoGrowWidthItem(true)); + aSet.Put(makeSdrTextAutoGrowHeightItem(false)); + + // Set defaults for vertical click-n'drag text object, pool defaults are: + // SdrTextVertAdjustItem: SDRTEXTVERTADJUST_TOP + // SdrTextHorzAdjustItem: SDRTEXTHORZADJUST_BLOCK + // Analog to that: + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BLOCK)); + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); + } +} + +void FuText::ImpSetAttributesFitToSize(SdrTextObj* pTxtObj) +{ + // FitToSize (fit to frame) + SfxItemSetFixed aSet(mpViewShell->GetPool()); + aSet.Put(SdrTextFitToSizeTypeItem(drawing::TextFitToSizeType_PROPORTIONAL)); + aSet.Put(makeSdrTextAutoGrowHeightItem(false)); + aSet.Put(makeSdrTextAutoGrowWidthItem(false)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); +} + +void FuText::ImpSetAttributesFitToSizeVertical(SdrTextObj* pTxtObj) +{ + SfxItemSetFixed aSet(mpViewShell->GetPool()); + aSet.Put(SdrTextFitToSizeTypeItem(drawing::TextFitToSizeType_PROPORTIONAL)); + aSet.Put(makeSdrTextAutoGrowHeightItem(false)); + aSet.Put(makeSdrTextAutoGrowWidthItem(false)); + pTxtObj->SetMergedItemSet(aSet); + pTxtObj->AdjustTextFrameWidthAndHeight(); +} + +bool FuText::MouseButtonUp(const MouseEvent& rMEvt) +{ + bool bReturn = false; + if (aDragTimer.IsActive()) + { + aDragTimer.Stop(); + bIsInDragMode = false; + } + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + + Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); + + if( (mpView && mpView->MouseButtonUp(rMEvt, mpWindow->GetOutDev())) || rMEvt.GetClicks() == 2 ) + return true; // handle event from SdrView + + bool bEmptyTextObj = false; + + if (mxTextObj.get().is()) + { + bool bReset = true; + + if (mpView) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1 + && ( rMarkList.GetMark(0)->GetMarkedSdrObj() == mxTextObj.get().get()) ) + { + if (!GetTextObj()->GetOutlinerParaObject() ) + bEmptyTextObj = true; + else + bFirstObjCreated = true; + bReset = false; + } + } + + if (bReset) + { + mxTextObj = nullptr; + } + } + + if (rMEvt.IsLeft() && !mxTextObj.get().is() && IsIgnoreUnexpectedMouseButtonUp()) + return false; + + if( mpView && mpView->IsDragObj()) + { + // object was moved + FrameView* pFrameView = mpViewShell->GetFrameView(); + bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); + + if (bDragWithCopy) + { + bDragWithCopy = !mpView->IsPresObjSelected(false); + } + + mpView->SetDragWithCopy(bDragWithCopy); + mpView->EndDragObj( mpView->IsDragWithCopy() ); + mpView->ForceMarkedToAnotherPage(); + mpView->SetCurrentObj(SdrObjKind::Text); + + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + + if (bJustEndedEdit) + { + bJustEndedEdit = false; + FuPoor::cancel(); + } + if ((rMEvt.GetClicks() != 2) && + !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsRight() && + std::abs(aPnt.X() - aMDPos.X()) < nDrgLog && + std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) + { + /************************************************************* + * From text mode, you don't want to rotate immediately. + **************************************************************/ + SdrPageView* pPV; + SdrObject* pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::BEFOREMARK); + if (pObj && pPV->IsObjMarkable(pObj)) + { + mpView->UnmarkAllObj(); + mpView->MarkObj(pObj,pPV); + return bReturn; + } + } + } + else if( mpView && mpView->IsCreateObj() && rMEvt.IsLeft()) + { + // object was created + rtl::Reference pTextObj = DynCastSdrTextObj( mpView->GetCreateObj() ); + mxTextObj = pTextObj.get(); + + if( pTextObj ) + { + //AW outliner needs to be set to vertical when there is no + // outliner object up to now; also it needs to be set back to not + // vertical when there was a vertical one used last time. + OutlinerParaObject* pOPO = GetTextObj()->GetOutlinerParaObject(); + SdrOutliner& rOutl(pTextObj->getSdrModelFromSdrObject().GetDrawOutliner(GetTextObj())); + bool bVertical((pOPO && pOPO->IsEffectivelyVertical()) + || nSlotId == SID_ATTR_CHAR_VERTICAL + || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL); + rOutl.SetVertical(bVertical); + + // Before ImpSetAttributesForNewTextObject the vertical writing mode + // needs to be set at the object. This is done here at the OutlinerParaObject + // directly to not mirror the layout text items involved. These items will be set + // from ImpSetAttributesForNewTextObject and below. + OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject(); + + if(!pPara) + { + GetTextObj()->ForceOutlinerParaObject(); + pPara = GetTextObj()->GetOutlinerParaObject(); + } + + if(pPara && bVertical != pPara->IsEffectivelyVertical()) + { + // set ParaObject orientation accordingly + pPara->SetVertical(bVertical); + } + + ImpSetAttributesForNewTextObject(GetTextObj()); + } + + if (!mpView->EndCreateObj(SdrCreateCmd::ForceEnd)) + { + // it was not possible to create text object + mxTextObj = nullptr; + pTextObj = nullptr; + } + else if (nSlotId == SID_TEXT_FITTOSIZE) + { + ImpSetAttributesFitToSize(GetTextObj()); + + SetInEditMode(rMEvt, false); + } + else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL ) + { + ImpSetAttributesFitToSizeVertical(GetTextObj()); + + SetInEditMode(rMEvt, false); + } + else + { + // thereby the handles and the gray frame are correct + mpView->AdjustMarkHdl(); + mpView->PickHandle(aPnt); + SetInEditMode(rMEvt, false); + } + } + else if ( mpView && mpView->IsAction()) + { + mpView->EndAction(); + } + + ForcePointer(&rMEvt); + mpWindow->ReleaseMouse(); + + if ( mpView && !mpView->AreObjectsMarked() ) + { + sal_uInt16 nDrgLog1 = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + if ( std::abs(aMDPos.X() - aPnt.X()) < nDrgLog1 && + std::abs(aMDPos.Y() - aPnt.Y()) < nDrgLog1 && + !rMEvt.IsShift() && !rMEvt.IsMod2() ) + { + SdrPageView* pPV2 = mpView->GetSdrPageView(); + SdrViewEvent aVEvt; + mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + mpView->MarkObj(aVEvt.mpRootObj, pPV2); + } + } + + if ( !mxTextObj.get().is() && mpView ) + { + if ( ( (!bEmptyTextObj && bPermanent) || + (!bFirstObjCreated && !bPermanent) ) && + !mpDocSh->IsReadOnly() && + nSlotId != SID_TEXTEDIT ) + { + // text body (left-justified AutoGrow) + mpView->SetCurrentObj(SdrObjKind::Text); + mpView->SetEditMode(SdrViewEditMode::Create); + sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(mpView->GetDragThresholdPixels(),0)).Width() ); + mpView->BegCreateObj(aMDPos, nullptr, nDrgLog); + + bool bSnapEnabled = mpView->IsSnapEnabled(); + + if (bSnapEnabled) + mpView->SetSnapEnabled(false); + + aPnt.AdjustX(nDrgLog + nDrgLog ); + aPnt.AdjustY(nDrgLog + nDrgLog ); + mpView->MovAction(aPnt); + + mxTextObj = DynCastSdrTextObj( mpView->GetCreateObj() ); + + if(mxTextObj.get().is()) + { + GetTextObj()->SetDisableAutoWidthOnDragging(true); + } + + if(!mpView->EndCreateObj(SdrCreateCmd::ForceEnd)) + { + mxTextObj.clear(); + } + + if(bSnapEnabled) + mpView->SetSnapEnabled(bSnapEnabled); + + if(mxTextObj.get().is()) + { + SfxItemSet aSet(mpViewShell->GetPool()); + aSet.Put(makeSdrTextMinFrameHeightItem(0)); + aSet.Put(makeSdrTextMinFrameWidthItem(0)); + aSet.Put(makeSdrTextAutoGrowHeightItem(true)); + aSet.Put(makeSdrTextAutoGrowWidthItem(true)); + + if(nSlotId == SID_ATTR_CHAR_VERTICAL) + { + // Here, all items which need to be different from pool default need to be set + // again on the newly created text object. + // Since this is a simple click text object, it is first created, then SetVertical() + // is used, then ImpSetAttributesForNewTextObject is called and then the object is + // deleted again since not the minimum drag distance was travelled. Then, a new + // click text object is created and thus all that stuff needs to be set again here. + + // Before using the new object the vertical writing mode + // needs to be set. This is done here at the OutlinerParaObject + // directly to not mirror the layout text items involved. These items will be set + // below. + OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject(); + + if(!pPara) + { + GetTextObj()->ForceOutlinerParaObject(); + pPara = GetTextObj()->GetOutlinerParaObject(); + } + + if(pPara && !pPara->IsEffectivelyVertical()) + { + // set ParaObject orientation accordingly + pPara->SetVertical(true); + } + + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + + // Analog to the else case below, for vertical simple click texts + // one of the default set items from ImpSetAttributesForNewTextObject + // needs to be adapted to non-block mode. + const SfxItemSet& rSet = mpView->GetDefaultAttr(); + SvxFrameDirection eDirection = rSet.Get(EE_PARA_WRITINGDIR).GetValue(); + + if(SvxFrameDirection::Horizontal_RL_TB == eDirection || SvxFrameDirection::Vertical_RL_TB == eDirection) + { + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM)); + } + else + { + aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); + } + } + else + { + // This is for Format/Page settings. Since this also leads + // to the object defaults to be changed, i think this code can be + // removed. CL. wanted to take a look before adding this. + + // Look in the object defaults if left-to-right is wanted. If + // yes, set text anchoring to right to let the box grow to left. + const SfxItemSet& rSet = mpView->GetDefaultAttr(); + SvxFrameDirection eDirection = rSet.Get(EE_PARA_WRITINGDIR).GetValue(); + + if(SvxFrameDirection::Horizontal_RL_TB == eDirection) + { + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); + } + else + { + aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT)); + } + } + + GetTextObj()->SetMergedItemSet(aSet); + GetTextObj()->SetDisableAutoWidthOnDragging(true); + SetInEditMode(rMEvt, false); + } + + bFirstObjCreated = true; + } + else + { + // switch to selection + if (mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted) + { + mxTextObj = nullptr; + } + + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } + } + if (bJustEndedEdit) + { + bJustEndedEdit = false; + FuPoor::cancel(); + } + bMBDown = false; + FuConstruct::MouseButtonUp(rMEvt); + return bReturn; +} + +/** + * handle keyboard events + * @returns sal_True if the event was handled, sal_False otherwise + */ +bool FuText::KeyInput(const KeyEvent& rKEvt) +{ + bool bReturn = false; + + vcl::KeyCode nCode = rKEvt.GetKeyCode(); + bool bShift = nCode.IsShift(); + + if(mxTextObj.get().is()) + { + // maybe object is deleted, test if it's equal to the selected object + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + SdrObject* pSelectedObj = nullptr; + + if(1 == rMarkList.GetMarkCount()) + { + SdrMark* pMark = rMarkList.GetMark(0); + pSelectedObj = pMark->GetMarkedSdrObj(); + } + + if(mxTextObj.get().get() != pSelectedObj) + { + mxTextObj = nullptr; + } + } + + if (auto pTextObj = mxTextObj.get()) + if ( pTextObj->GetObjInventor() == SdrInventor::Default && pTextObj->GetObjIdentifier() == SdrObjKind::TitleText && rKEvt.GetKeyCode().GetCode() == KEY_RETURN ) + { + // title text object: always soft breaks + bShift = true; + } + + sal_uInt16 nKey = nCode.GetCode(); + vcl::KeyCode aKeyCode (nKey, bShift, nCode.IsMod1(), nCode.IsMod2(), nCode.IsMod3() ); + KeyEvent aKEvt(rKEvt.GetCharCode(), aKeyCode); + + bool bOK = true; + + if (mpDocSh->IsReadOnly()) + { + bOK = !EditEngine::DoesKeyChangeText(aKEvt); + } + if( aKeyCode.GetCode() == KEY_PAGEUP || aKeyCode.GetCode() == KEY_PAGEDOWN ) + { + bOK = false; // default handling in base class + } + + if (bOK && mpView->KeyInput(aKEvt, mpWindow) ) + { + bReturn = true; + + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray ); + + } + else if (aKeyCode == KEY_ESCAPE) + { + bReturn = cancel(); + } + + if( bPermanent ) + { + mpView->SetCurrentObj(SdrObjKind::Text); + mpView->SetEditMode(SdrViewEditMode::Create); + } + + if (!bReturn) + { + bReturn = FuDraw::KeyInput(aKEvt); + } + + return bReturn; +} + +void FuText::Activate() +{ + mpView->SetQuickTextEditMode(mpViewShell->GetFrameView()->IsQuickEdit()); + + // #i89661# it's no longer necessary to make it so big here, it's fine tuned + // for text objects in SdrMarkView::CheckSingleSdrObjectHit + mpView->SetHitTolerancePixel( 2 * HITPIX ); + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->ShowCursor(/*bGotoCursor=*/true, /*bActivate=*/true); + + FuConstruct::Activate(); + + if( pOLV ) + mpView->SetEditMode(SdrViewEditMode::Edit); +} + +void FuText::Deactivate() +{ + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->HideCursor(/*bDeactivate=*/true); + + mpView->SetHitTolerancePixel( HITPIX ); + + FuConstruct::Deactivate(); +} + +/** + * Sets the object into the edit mode. + */ +void FuText::SetInEditMode(const MouseEvent& rMEvt, bool bQuickDrag) +{ + SdrPageView* pPV = mpView->GetSdrPageView(); + if( mxTextObj.get().is() && (mxTextObj.get()->getSdrPageFromSdrObject() == pPV->GetPage()) ) + { + mpView->SetCurrentObj(SdrObjKind::Text); + + if( bPermanent ) + mpView->SetEditMode(SdrViewEditMode::Create); + else + mpView->SetEditMode(SdrViewEditMode::Edit); + + bool bEmptyOutliner = false; + + if (!GetTextObj()->GetOutlinerParaObject() && mpView->GetTextEditOutliner()) + { + ::Outliner* pOutl = mpView->GetTextEditOutliner(); + sal_Int32 nParagraphCnt = pOutl->GetParagraphCount(); + Paragraph* p1stPara = pOutl->GetParagraph( 0 ); + + if (nParagraphCnt==1 && p1stPara) + { + // with only one paragraph + if (pOutl->GetText(p1stPara).isEmpty()) + { + bEmptyOutliner = true; + } + } + } + + if (GetTextObj() != mpView->GetTextEditObject() || bEmptyOutliner) + { + rtl::Reference pTextObj = mxTextObj.get(); + SdrInventor nInv = pTextObj->GetObjInventor(); + SdrObjKind nSdrObjKind = pTextObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default && GetTextObj()->HasTextEdit() && + (nSdrObjKind == SdrObjKind::Text || + nSdrObjKind == SdrObjKind::TitleText || + nSdrObjKind == SdrObjKind::OutlineText || !pTextObj->IsEmptyPresObj() ) ) + { + // create new outliner (owned by SdrObjEditView) + std::unique_ptr pOutl = SdrMakeOutliner(OutlinerMode::OutlineObject, *mpDoc); + + if (bEmptyOutliner) + mpView->SdrEndTextEdit(true); + + pTextObj = GetTextObj(); + if( pTextObj ) + { + OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject(); + if( pOPO && pOPO->IsEffectivelyVertical() ) + { + pOutl->SetVertical(pOPO->GetVertical()); + pOutl->SetRotation(pOPO->GetRotation()); + } + else if (nSlotId == SID_ATTR_CHAR_VERTICAL || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) + pOutl->SetVertical( true ); + + if( pTextObj->getTextCount() > 1 ) + { + Point aPix(rMEvt.GetPosPixel()); + Point aPnt(mpWindow->PixelToLogic(aPix)); + pTextObj->setActiveText( pTextObj->CheckTextHit(aPnt ) ); + } + + if (mpView->SdrBeginTextEdit(pTextObj.get(), pPV, mpWindow, true, pOutl.release()) && mxTextObj.get()->GetObjInventor() == SdrInventor::Default) + { + //tdf#102293 flush overlay before going on to pass clicks down to + //the outline view which will want to paint selections + for (sal_uInt32 b = 0; b < pPV->PageWindowCount(); ++b) + { + const SdrPageWindow& rPageWindow = *pPV->GetPageWindow(b); + if (!rPageWindow.GetPaintWindow().OutputToWindow()) + continue; + const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager(); + if (!xManager.is()) + continue; + xManager->flush(); + } + + bFirstObjCreated = true; + DeleteDefaultText(); + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + nSdrObjKind = mxTextObj.get()->GetObjIdentifier(); + + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + + if (eHit == SdrHitKind::TextEdit) + { + // hit text + if (nSdrObjKind == SdrObjKind::Text || + nSdrObjKind == SdrObjKind::TitleText || + nSdrObjKind == SdrObjKind::OutlineText || + nSdrObjKind == SdrObjKind::Table || + nSlotId == SID_TEXTEDIT || + !bQuickDrag) + { + pOLV->MouseButtonDown(rMEvt); + pOLV->MouseMove(rMEvt); + pOLV->MouseButtonUp(rMEvt); + } + + if (mpViewShell->GetFrameView()->IsQuickEdit() && bQuickDrag && GetTextObj()->GetOutlinerParaObject()) + { + pOLV->MouseButtonDown(rMEvt); + } + } + else + { + // Move cursor to end of text + ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND); + if (pOLV != nullptr) + pOLV->SetSelection(aNewSelection); + } + } + else + { + mpView->RestoreDefaultText( mxTextObj.get().get() ); + } + } + } + } + } + else + { + mxTextObj = nullptr; + } +} + +/** + * Text entry is started, if necessary delete the default text. + */ +void FuText::DeleteDefaultText() +{ + if ( !(mxTextObj.get().is() && mxTextObj.get()->IsEmptyPresObj()) ) + return; + + SdPage* pPage = static_cast( mxTextObj.get()->getSdrPageFromSdrObject() ); + + if (!pPage) + return; + + PresObjKind ePresObjKind = pPage->GetPresObjKind(mxTextObj.get().get()); + + if ( !(ePresObjKind == PresObjKind::Title || + ePresObjKind == PresObjKind::Outline || + ePresObjKind == PresObjKind::Notes || + ePresObjKind == PresObjKind::Text ) || + pPage->IsMasterPage() ) + return; + + ::Outliner* pOutliner = mpView->GetTextEditOutliner(); + SfxStyleSheet* pSheet = pOutliner->GetStyleSheet( 0 ); + bool bIsUndoEnabled = pOutliner->IsUndoEnabled(); + if( bIsUndoEnabled ) + pOutliner->EnableUndo(false); + + pOutliner->SetText( OUString(), pOutliner->GetParagraph( 0 ) ); + + if( bIsUndoEnabled ) + pOutliner->EnableUndo(true); + + if (pSheet && + (ePresObjKind == PresObjKind::Notes || ePresObjKind == PresObjKind::Text)) + pOutliner->SetStyleSheet(0, pSheet); + + mxTextObj.get()->SetEmptyPresObj(true); +} + +bool FuText::RequestHelp(const HelpEvent& rHEvt) +{ + bool bReturn = false; + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if ((Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled()) && + mxTextObj.get().is() && pOLV && pOLV->GetFieldUnderMousePointer()) + { + OUString aHelpText; + const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer(); + const SvxFieldData* pField = pFieldItem->GetField(); + + if (auto pURLField = dynamic_cast< const SvxURLField *>( pField )) + { + // URL-Field + aHelpText = INetURLObject::decode( pURLField->GetURL(), INetURLObject::DecodeMechanism::WithCharset ); + } + if (!aHelpText.isEmpty()) + { + ::tools::Rectangle aLogicPix = mpWindow->LogicToPixel(mxTextObj.get()->GetLogicRect()); + ::tools::Rectangle aScreenRect(mpWindow->OutputToScreenPixel(aLogicPix.TopLeft()), + mpWindow->OutputToScreenPixel(aLogicPix.BottomRight())); + + if (Help::IsBalloonHelpEnabled()) + { + Help::ShowBalloon( static_cast(mpWindow), rHEvt.GetMousePosPixel(), aScreenRect, aHelpText); + bReturn = true; + } + else if (Help::IsQuickHelpEnabled()) + { + Help::ShowQuickHelp( static_cast(mpWindow), aScreenRect, aHelpText); + bReturn = true; + } + } + } + + if (!bReturn) + { + bReturn = FuConstruct::RequestHelp(rHEvt); + } + + return bReturn; +} + +void FuText::ReceiveRequest(SfxRequest& rReq) +{ + nSlotId = rReq.GetSlot(); + + // then we call the base class (besides others, nSlotId is NOT set there) + FuPoor::ReceiveRequest(rReq); + + if (!(nSlotId == SID_TEXTEDIT || mpViewShell->GetFrameView()->IsQuickEdit() || SID_ATTR_CHAR == nSlotId)) + return; + + MouseEvent aMEvt(mpWindow->GetPointerPosPixel()); + + mxTextObj = nullptr; + + if (nSlotId == SID_TEXTEDIT) + { + // are we currently editing? + mxTextObj = mpView->GetTextEditObject(); + + if (!mxTextObj.get().is()) + { + // Try to select an object + SdrPageView* pPV = mpView->GetSdrPageView(); + SdrViewEvent aVEvt; + mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt); + mpView->MarkObj(aVEvt.mpRootObj, pPV); + + if (auto pSdrTextObj = DynCastSdrTextObj(aVEvt.mpObj)) + { + mxTextObj = pSdrTextObj; + } + } + } + else if (mpView->AreObjectsMarked()) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + if( auto pTextObj = DynCastSdrTextObj( pObj )) + { + mxTextObj = pTextObj; + } + } + } + + bool bQuickDrag = true; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if (pArgs + + // test for type before using + && SID_TEXTEDIT == nSlotId + && SfxItemState::SET == pArgs->GetItemState(SID_TEXTEDIT) + + && pArgs->Get(SID_TEXTEDIT).GetValue() == 2) + { + // selection with double click -> do not allow QuickDrag + bQuickDrag = false; + } + + SetInEditMode(aMEvt, bQuickDrag); +} + +void FuText::DoubleClick(const MouseEvent& ) +{ + // Nothing to do +} + +/** Removed the insertion of default text and putting a new text + object directly into edit mode. +*/ +rtl::Reference FuText::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) +{ + rtl::Reference pObj( SdrObjFactory::MakeNewObject( + mpView->getSdrModelFromSdrView(), + mpView->GetCurrentObjInventor(), + mpView->GetCurrentObjIdentifier(), + nullptr) ); + + if(pObj) + { + if( auto pText = DynCastSdrTextObj( pObj.get() ) ) + { + pText->SetLogicRect(rRectangle); + + bool bVertical = (SID_ATTR_CHAR_VERTICAL == nID || SID_TEXT_FITTOSIZE_VERTICAL == nID); + pText->SetVerticalWriting(bVertical); + + ImpSetAttributesForNewTextObject(pText); + + if (nSlotId == SID_TEXT_FITTOSIZE) + { + ImpSetAttributesFitToSize(pText); + } + else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL ) + { + ImpSetAttributesFitToSizeVertical(pText); + } + + // Put text object into edit mode. + SdrPageView* pPV = mpView->GetSdrPageView(); + mpView->SdrBeginTextEdit(pText, pPV); + } + else + { + OSL_FAIL("Object is NO text object"); + } + } + + return pObj; +} + +/** is called when the current function should be aborted.

+ This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted +*/ +bool FuText::cancel() +{ + if ( mpView->IsTextEdit() ) + { + if(mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted) + mxTextObj = nullptr; + + mpView->SetCurrentObj(SdrObjKind::Text); + mpView->SetEditMode(SdrViewEditMode::Edit); + return true; + } + else + { + return false; + } +} + +void FuText::ChangeFontSize( bool bGrow, OutlinerView* pOLV, const FontList* pFontList, ::sd::View* pView ) +{ + if( !pFontList || !pView ) + return; + + if( pOLV ) + { + pOLV->GetEditView().ChangeFontSize( bGrow, pFontList ); + } + else + { + + pView->BegUndo(SdResId(bGrow ? STR_GROW_FONT_SIZE : STR_SHRINK_FONT_SIZE)); + const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); + for( size_t nMark = 0; nMark < rMarkList.GetMarkCount(); ++nMark ) + { + SdrTextObj* pTextObj = DynCastSdrTextObj( rMarkList.GetMark(nMark)->GetMarkedSdrObj() ); + if( pTextObj ) + { + rtl::Reference xSelectionController(pView->getSelectionController()); + if (xSelectionController.is() && xSelectionController->ChangeFontSize(bGrow, pFontList)) + { + continue; + } + for( sal_Int32 nText = 0; nText < pTextObj->getTextCount(); nText++ ) + { + pTextObj->setActiveText( nText ); + + // Put text object into edit mode. + SdrPageView* pPV = pView->GetSdrPageView(); + pView->SdrBeginTextEdit(pTextObj, pPV); + + pOLV = pView->GetTextEditOutlinerView(); + if( pOLV ) + { + EditEngine* pEditEngine = pOLV->GetEditView().GetEditEngine(); + if( pEditEngine ) + { + ESelection aSel; + aSel.nEndPara = pEditEngine->GetParagraphCount()-1; + aSel.nEndPos = pEditEngine->GetTextLen(aSel.nEndPara); + pOLV->SetSelection(aSel); + } + + ChangeFontSize( bGrow, pOLV, pFontList, pView ); + } + + pView->SdrEndTextEdit(); + } + + SfxItemSet aShapeSet( pTextObj->GetMergedItemSet() ); + if( EditView::ChangeFontSize( bGrow, aShapeSet, pFontList ) ) + { + pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT ) ); + pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CJK ) ); + pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CTL ) ); + } + } + } + pView->EndUndo(); + } +} + +void FuText::InvalidateBindings() +{ + mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray); +} + + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/futhes.cxx b/sd/source/ui/func/futhes.cxx new file mode 100644 index 0000000000..d978880039 --- /dev/null +++ b/sd/source/ui/func/futhes.cxx @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +class SfxRequest; + +namespace sd { + + +FuThesaurus::FuThesaurus( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq ) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuThesaurus::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuThesaurus( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuThesaurus::DoExecute(SfxRequest& rReq) +{ + SfxErrorContext aContext(ERRCTX_SVX_LINGU_THESAURUS, OUString(), + mpWindow->GetFrameWeld(), RID_SVXERRCTX, SvxResLocale()); + + if (dynamic_cast< DrawViewShell *>( mpViewShell )) + { + SdrTextObj* pTextObj = nullptr; + + if ( mpView->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if ( rMarkList.GetMarkCount() == 1 ) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + pTextObj = DynCastSdrTextObj( pObj ); + } + } + + ::Outliner* pOutliner = mpView->GetTextEditOutliner(); + const OutlinerView* pOutlView = mpView->GetTextEditOutlinerView(); + + if ( pTextObj && pOutliner && pOutlView ) + { + if ( !pOutliner->GetSpeller().is() ) + { + Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() ); + if ( xSpellChecker.is() ) + pOutliner->SetSpeller( xSpellChecker ); + + Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() ); + if( xHyphenator.is() ) + pOutliner->SetHyphenator( xHyphenator ); + + pOutliner->SetDefaultLanguage( mpDoc->GetLanguage( EE_CHAR_LANGUAGE ) ); + } + + EESpellState eState = const_cast(pOutlView)->StartThesaurus(rReq.GetFrameWeld()); + DBG_ASSERT(eState != EESpellState::NoSpeller, "No SpellChecker"); + } + } + else if (dynamic_cast< OutlineViewShell *>( mpViewShell )) + { + Outliner* pOutliner = mpDoc->GetOutliner(); + OutlinerView* pOutlView = pOutliner->GetView(0); + + if ( !pOutliner->GetSpeller().is() ) + { + Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() ); + if ( xSpellChecker.is() ) + pOutliner->SetSpeller( xSpellChecker ); + + Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() ); + if( xHyphenator.is() ) + pOutliner->SetHyphenator( xHyphenator ); + + pOutliner->SetDefaultLanguage( mpDoc->GetLanguage( EE_CHAR_LANGUAGE ) ); + } + + EESpellState eState = pOutlView->StartThesaurus(rReq.GetFrameWeld()); + DBG_ASSERT(eState != EESpellState::NoSpeller, "No SpellChecker"); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/futransf.cxx b/sd/source/ui/func/futransf.cxx new file mode 100644 index 0000000000..8c565a3b84 --- /dev/null +++ b/sd/source/ui/func/futransf.cxx @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace sd; + +FuTransform::FuTransform(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuTransform::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuTransform( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +namespace { + +void setUndo(::sd::View* pView, const SfxItemSet* pArgs, bool addPageMargin) +{ + // Undo + OUString aString = pView->GetDescriptionOfMarkedObjects() + + " " + SdResId(STR_TRANSFORM); + pView->BegUndo(aString); + pView->SetGeoAttrToMarked(*pArgs, addPageMargin); + pView->SetAttributes(*pArgs); + pView->EndUndo(); +} + +} + +void FuTransform::DoExecute( SfxRequest& rReq ) +{ + if (!mpView->AreObjectsMarked()) + return; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if (pArgs) + { + // If this comes from LOK, that means the shape is moved by mouse + // only then pArgs is pre-set. + setUndo(mpView, pArgs, comphelper::LibreOfficeKit::isActive()); + return; + } + + // --------- itemset for size and position -------- + SfxItemSet aSet( mpView->GetGeoAttrFromMarked() ); + VclPtr pDlg; + + bool bWelded = false; + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( rMarkList.GetMarkCount() == 1 && + pObj->GetObjInventor() == SdrInventor::Default && + pObj->GetObjIdentifier() == SdrObjKind::Caption ) + { + // --------- itemset for caption -------- + SfxItemSet aNewAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aNewAttr ); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + pDlg.reset(pFact->CreateCaptionDialog(mpViewShell->GetFrameWeld(), mpView)); + + const WhichRangesContainer& pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() ); + SfxItemSet aCombSet( *aNewAttr.GetPool(), pRange ); + aCombSet.Put( aNewAttr ); + aCombSet.Put( aSet ); + pDlg->SetInputSet( &aCombSet ); + } + else + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + pDlg.reset(pFact->CreateSvxTransformTabDialog(mpViewShell->GetFrameWeld(), &aSet, mpView)); + bWelded = true; + } + + assert(pDlg && "there must be a dialog at this point"); + + auto pRequest = std::make_shared(rReq); + rReq.Ignore(); // the 'old' request is not relevant any more + + pDlg->StartExecuteAsync([bWelded, pDlg, pRequest, this](sal_Int32 nResult){ + if (nResult == RET_OK) + { + pRequest->Done(*(pDlg->GetOutputItemSet())); + // Page margin is already calculated at this point. + setUndo(mpView, pRequest->GetArgs(), false); + } + + // deferred until the dialog ends + mpViewShell->Invalidate(SID_RULER_OBJECT); + mpViewShell->Cancel(); + if (bWelded) + pDlg->disposeOnce(); + }); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/futxtatt.cxx b/sd/source/ui/func/futxtatt.cxx new file mode 100644 index 0000000000..56f8c25696 --- /dev/null +++ b/sd/source/ui/func/futxtatt.cxx @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include + +namespace sd { + + +FuTextAttrDlg::FuTextAttrDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuTextAttrDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuTextAttrDlg( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuTextAttrDlg::DoExecute( SfxRequest& rReq ) +{ + SfxItemSet aNewAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aNewAttr ); + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if( !pArgs ) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateTextTabDialog(rReq.GetFrameWeld(), &aNewAttr, mpView)); + + sal_uInt16 nResult = pDlg->Execute(); + + switch( nResult ) + { + case RET_OK: + { + rReq.Done( *( pDlg->GetOutputItemSet() ) ); + + pArgs = rReq.GetArgs(); + } + break; + + default: + return; // Cancel + } + } + mpView->SetAttributes( *pArgs ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuvect.cxx b/sd/source/ui/func/fuvect.cxx new file mode 100644 index 0000000000..d657c0d18b --- /dev/null +++ b/sd/source/ui/func/fuvect.cxx @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include + +namespace sd +{ + + +FuVectorize::FuVectorize ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor (pViewSh, pWin, pView, pDoc, rReq) +{ +} + +rtl::Reference FuVectorize::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuVectorize( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute(rReq); + return xFunc; +} + +void FuVectorize::DoExecute( SfxRequest& ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if( rMarkList.GetMarkCount() != 1 ) + return; + + SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + + auto pSdrGrafObj = dynamic_cast< const SdrGrafObj *>( pObj ); + if( !pSdrGrafObj ) + return; + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( + pFact->CreateSdVectorizeDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, + pSdrGrafObj->GetGraphic().GetBitmapEx().GetBitmap(), mpDocSh ) ); + if( pDlg->Execute() != RET_OK ) + return; + + const GDIMetaFile& rMtf = pDlg->GetGDIMetaFile(); + SdrPageView* pPageView = mpView->GetSdrPageView(); + + if( pPageView && rMtf.GetActionSize() ) + { + rtl::Reference pVectObj = SdrObject::Clone(static_cast(*pObj), pObj->getSdrModelFromSdrObject()); + OUString aStr = mpView->GetDescriptionOfMarkedObjects() + + " " + SdResId( STR_UNDO_VECTORIZE ); + mpView->BegUndo( aStr ); + pVectObj->SetGraphic( rMtf ); + mpView->ReplaceObjectAtView( pObj, *pPageView, pVectObj.get() ); + mpView->EndUndo(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/fuzoom.cxx b/sd/source/ui/func/fuzoom.cxx new file mode 100644 index 0000000000..2c966daa2e --- /dev/null +++ b/sd/source/ui/func/fuzoom.cxx @@ -0,0 +1,219 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace sd { + +const sal_uInt16 SidArrayZoom[] = { + SID_ATTR_ZOOM, + SID_ZOOM_OUT, + SID_ZOOM_IN, + 0 }; + + +FuZoom::FuZoom( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq) + : FuPoor(pViewSh, pWin, pView, pDoc, rReq), + bVisible(false), + bStartDrag(false), + aPtr(PointerStyle::Arrow) +{ +} + +FuZoom::~FuZoom() +{ + if (bVisible) + { + // Hide ZoomRect + mpViewShell->DrawMarkRect(aZoomRect); + + bVisible = false; + bStartDrag = false; + } +} + +rtl::Reference FuZoom::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +{ + rtl::Reference xFunc( new FuZoom( pViewSh, pWin, pView, pDoc, rReq ) ); + return xFunc; +} + +bool FuZoom::MouseButtonDown(const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + mpWindow->CaptureMouse(); + bStartDrag = true; + + aBeginPosPix = rMEvt.GetPosPixel(); + aBeginPos = mpWindow->PixelToLogic(aBeginPosPix); + aZoomRect.SetSize( Size( 0, 0 ) ); + aZoomRect.SetPos( aBeginPos ); + + return true; +} + +bool FuZoom::MouseMove(const MouseEvent& rMEvt) +{ + if (rMEvt.IsShift()) + mpWindow->SetPointer(PointerStyle::Hand); + else if (nSlotId != SID_ZOOM_PANNING) + mpWindow->SetPointer(PointerStyle::Magnify); + + if (bStartDrag) + { + if (bVisible) + { + mpViewShell->DrawMarkRect(aZoomRect); + } + + Point aPosPix = rMEvt.GetPosPixel(); + ForceScroll(aPosPix); + + aEndPos = mpWindow->PixelToLogic(aPosPix); + aBeginPos = mpWindow->PixelToLogic(aBeginPosPix); + + if (nSlotId == SID_ZOOM_PANNING || (rMEvt.IsShift() && !bVisible) ) + { + // Panning + + Point aScroll = aBeginPos - aEndPos; + + if (aScroll.X() != 0 || aScroll.Y() != 0) + { + Size aWorkSize = mpView->GetWorkArea().GetSize(); + Size aPageSize = mpView->GetSdrPageView()->GetPage()->GetSize(); + if (aWorkSize.Width() != 0 && aWorkSize.Height() != 0 && + aPageSize.Width() != 0 && aPageSize.Height() != 0) + { + aScroll.setX( aScroll.X() / ( aWorkSize.Width() / aPageSize.Width()) ); + aScroll.setY( aScroll.Y() / ( aWorkSize.Height() / aPageSize.Height()) ); + mpViewShell->Scroll(aScroll.X(), aScroll.Y()); + aBeginPosPix = aPosPix; + } + } + } + else + { + ::tools::Rectangle aRect(aBeginPos, aEndPos); + aZoomRect = aRect; + aZoomRect.Normalize(); + mpViewShell->DrawMarkRect(aZoomRect); + bVisible = true; + } + } + + return bStartDrag; +} + +bool FuZoom::MouseButtonUp(const MouseEvent& rMEvt) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode(rMEvt.GetButtons()); + + if (bVisible) + { + // Hide ZoomRect + mpViewShell->DrawMarkRect(aZoomRect); + bVisible = false; + } + + Point aPosPix = rMEvt.GetPosPixel(); + + if(SID_ZOOM_PANNING != nSlotId && !rMEvt.IsShift()) + { + // Zoom + Size aZoomSizePixel = mpWindow->LogicToPixel(aZoomRect).GetSize(); + sal_uLong nTol = 2 * mpView->GetDragThresholdPixels(); + + if ( ( aZoomSizePixel.Width() < static_cast<::tools::Long>(nTol) && aZoomSizePixel.Height() < static_cast<::tools::Long>(nTol) ) || rMEvt.IsMod1() ) + { + // click at place: double zoom factor + Point aPos = mpWindow->PixelToLogic(aPosPix); + Size aSize = mpWindow->PixelToLogic(mpWindow->GetOutputSizePixel()); + if ( rMEvt.IsMod1() ) + { + aSize.setWidth( aSize.Width() * 2 ); + aSize.setHeight( aSize.Height() * 2 ); + } + else + { + aSize.setWidth( aSize.Width() / 2 ); + aSize.setHeight( aSize.Height() / 2 ); + } + aPos.AdjustX( -(aSize.Width() / 2) ); + aPos.AdjustY( -(aSize.Height() / 2) ); + aZoomRect.SetPos(aPos); + aZoomRect.SetSize(aSize); + } + + mpViewShell->SetZoomRect(aZoomRect); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom ); + } + + ::tools::Rectangle aVisAreaWin = mpWindow->PixelToLogic(::tools::Rectangle(Point(0,0), + mpWindow->GetOutputSizePixel())); + mpViewShell->GetZoomList()->InsertZoomRect(aVisAreaWin); + + bStartDrag = false; + mpWindow->ReleaseMouse(); + + return true; +} + +void FuZoom::Activate() +{ + aPtr = mpWindow->GetPointer(); + + if (nSlotId == SID_ZOOM_PANNING) + { + mpWindow->SetPointer(PointerStyle::Hand); + } + else + { + mpWindow->SetPointer(PointerStyle::Magnify); + } +} + +void FuZoom::Deactivate() +{ + mpWindow->SetPointer( aPtr ); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom ); +} +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/sdundogr.cxx b/sd/source/ui/func/sdundogr.cxx new file mode 100644 index 0000000000..a2e97386d5 --- /dev/null +++ b/sd/source/ui/func/sdundogr.cxx @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +SdUndoGroup::~SdUndoGroup() = default; + +bool SdUndoGroup::Merge(SfxUndoAction* pNextAction) +{ + bool bRet = false; + + if (auto pSdUndoAction = dynamic_cast(pNextAction)) + { + SdUndoAction* pClone = pSdUndoAction->Clone(); + + if (pClone) + { + AddAction(pClone); + bRet = true; + } + } + + return bRet; +} + +/** + * Undo, reverse order of execution + */ +void SdUndoGroup::Undo() +{ + ::tools::Long nLast = aCtn.size(); + for (::tools::Long nAction = nLast - 1; nAction >= 0; nAction--) + { + aCtn[nAction]->Undo(); + } +} + +void SdUndoGroup::Redo() +{ + size_t nLast = aCtn.size(); + for (size_t nAction = 0; nAction < nLast; nAction++) + { + aCtn[nAction]->Redo(); + } +} + +void SdUndoGroup::AddAction(SdUndoAction* pAction) { aCtn.emplace_back(pAction); } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/smarttag.cxx b/sd/source/ui/func/smarttag.cxx new file mode 100644 index 0000000000..b9fdc74c97 --- /dev/null +++ b/sd/source/ui/func/smarttag.cxx @@ -0,0 +1,334 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include + +namespace sd +{ + +SmartTag::SmartTag( ::sd::View& rView ) +: mrView( rView ) +, mbSelected( false ) +{ + SmartTagReference xThis( this ); + mrView.getSmartTags().add( xThis ); +} + +SmartTag::~SmartTag() +{ +} + +bool SmartTag::MouseButtonDown( const MouseEvent&, SmartHdl& ) +{ + return false; +} + +/** returns true if the SmartTag consumes this event. */ +bool SmartTag::KeyInput( const KeyEvent& /*rKEvt*/ ) +{ + return false; +} + +/** returns true if the SmartTag consumes this event. */ +bool SmartTag::Command( const CommandEvent& /*rCEvt*/ ) +{ + return false; +} + +void SmartTag::addCustomHandles( SdrHdlList& /*rHandlerList*/ ) +{ +} + +void SmartTag::select() +{ + mbSelected = true; +} + +void SmartTag::deselect() +{ + mbSelected = false; +} + +void SmartTag::disposing() +{ + SmartTagReference xThis( this ); + mrView.getSmartTags().remove( xThis ); +} + +bool SmartTag::getContext( SdrViewContext& /*rContext*/ ) +{ + return false; +} + +sal_Int32 SmartTag::GetMarkablePointCount() const +{ + return 0; +} + +sal_Int32 SmartTag::GetMarkedPointCount() const +{ + return 0; +} + +bool SmartTag::MarkPoint(SdrHdl& /*rHdl*/, bool /*bUnmark*/ ) +{ + return false; +} + +bool SmartTag::MarkPoints(const ::tools::Rectangle* /*pRect*/, bool /*bUnmark*/ ) +{ + return false; +} + +void SmartTag::CheckPossibilities() +{ +} + +SmartTagSet::SmartTagSet( View& rView ) +: mrView( rView ) +{ +} + +SmartTagSet::~SmartTagSet() +{ +} + +void SmartTagSet::add( const SmartTagReference& xTag ) +{ + maSet.insert( xTag ); + mrView.InvalidateAllWin(); + + if( xTag == mxMouseOverTag ) + mxMouseOverTag.clear(); + + if( xTag == mxSelectedTag ) + mxSelectedTag.clear(); +} + +void SmartTagSet::remove( const SmartTagReference& xTag ) +{ + std::set< SmartTagReference >::iterator aIter( maSet.find( xTag ) ); + if( aIter != maSet.end() ) + maSet.erase( aIter ); + mrView.InvalidateAllWin(); + + if( xTag == mxMouseOverTag ) + mxMouseOverTag.clear(); + + if( xTag == mxSelectedTag ) + mxSelectedTag.clear(); +} + +void SmartTagSet::Dispose() +{ + std::set< SmartTagReference > aSet; + aSet.swap( maSet ); + for( auto& rxItem : aSet ) + rxItem->Dispose(); + mrView.InvalidateAllWin(); + mxMouseOverTag.clear(); + mxSelectedTag.clear(); +} + +void SmartTagSet::select( const SmartTagReference& xTag ) +{ + if( mxSelectedTag == xTag ) + return; + + if( mxSelectedTag.is() ) + mxSelectedTag->deselect(); + + mxSelectedTag = xTag; + mxSelectedTag->select(); + mrView.SetPossibilitiesDirty(); + if( mrView.GetMarkedObjectCount() > 0 ) + mrView.UnmarkAllObj(); + else + mrView.updateHandles(); +} + +void SmartTagSet::deselect() +{ + if( mxSelectedTag.is() ) + { + mxSelectedTag->deselect(); + mxSelectedTag.clear(); + mrView.SetPossibilitiesDirty(); + mrView.updateHandles(); + } +} + +bool SmartTagSet::MouseButtonDown( const MouseEvent& rMEvt ) +{ + Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rMEvt.GetPosPixel() ) ); + SdrHdl* pHdl = mrView.PickHandle(aMDPos); + + // check if a smart tag is selected and no handle is hit + if( mxSelectedTag.is() && !pHdl ) + { + // deselect smart tag + deselect(); + return false; + } + + // if a smart tag handle is hit, forward event to its smart tag + SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl ); + if(pSmartHdl && pSmartHdl->getTag().is() ) + { + SmartTagReference xTag( pSmartHdl->getTag() ); + return xTag->MouseButtonDown( rMEvt, *pSmartHdl ); + } + + return false; +} + +bool SmartTagSet::KeyInput( const KeyEvent& rKEvt ) +{ + if( mxSelectedTag.is() ) + return mxSelectedTag->KeyInput( rKEvt ); + else if( rKEvt.GetKeyCode().GetCode() == KEY_SPACE ) + { + SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( mrView.GetHdlList().GetFocusHdl() ); + if( pSmartHdl ) + { + const_cast< SdrHdlList& >( mrView.GetHdlList() ).ResetFocusHdl(); + const SmartTagReference& xTag( pSmartHdl->getTag() ); + select( xTag ); + return true; + } + } + + return false; +} + +/** returns true if the SmartTag consumes this event. */ +bool SmartTagSet::Command( const CommandEvent& rCEvt ) +{ + if( rCEvt.IsMouseEvent() ) + { + Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rCEvt.GetMousePosPixel() ) ); + SdrHdl* pHdl = mrView.PickHandle(aMDPos); + + if( pHdl ) + { + // if a smart tag handle is hit, forward event to its smart tag + SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl ); + if(pSmartHdl && pSmartHdl->getTag().is() ) + { + const SmartTagReference& xTag( pSmartHdl->getTag() ); + return xTag->Command( rCEvt ); + } + } + } + else + { + if( mxSelectedTag.is() ) + return mxSelectedTag->Command( rCEvt ); + + } + + return false; +} + +void SmartTagSet::addCustomHandles( SdrHdlList& rHandlerList ) +{ + for( auto& rxItem : maSet ) + rxItem->addCustomHandles( rHandlerList ); +} + +/** returns true if the currently selected smart tag has + a special context, returned in rContext. */ +bool SmartTagSet::getContext( SdrViewContext& rContext ) const +{ + if( mxSelectedTag.is() ) + return mxSelectedTag->getContext( rContext ); + else + return false; +} + +// support point editing + +bool SmartTagSet::HasMarkablePoints() const +{ + return GetMarkablePointCount() != 0; +} + +sal_uLong SmartTagSet::GetMarkablePointCount() const +{ + if( mxSelectedTag.is() ) + return mxSelectedTag->GetMarkablePointCount(); + return 0; +} + +bool SmartTagSet::HasMarkedPoints() const +{ + return GetMarkedPointCount() != 0; +} + +sal_uLong SmartTagSet::GetMarkedPointCount() const +{ + if( mxSelectedTag.is() ) + return mxSelectedTag->GetMarkedPointCount(); + else + return 0; +} + +bool SmartTagSet::MarkPoint(SdrHdl& rHdl, bool bUnmark ) +{ + if( mxSelectedTag.is() ) + return mxSelectedTag->MarkPoint( rHdl, bUnmark ); + + return false; +} + +bool SmartTagSet::MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) +{ + if( mxSelectedTag.is() ) + return mxSelectedTag->MarkPoints( pRect, bUnmark ); + return false; +} + +void SmartTagSet::CheckPossibilities() +{ + if( mxSelectedTag.is() ) + mxSelectedTag->CheckPossibilities(); +} + +SmartHdl::SmartHdl( SmartTagReference xTag, SdrObject* pObject, const Point& rPnt, SdrHdlKind eNewKind /*=SdrHdlKind::Move*/ ) +: SdrHdl( rPnt, eNewKind ) +, mxSmartTag(std::move( xTag )) +{ + SetObj( pObject ); +} + +SmartHdl::SmartHdl( SmartTagReference xTag, const Point& rPnt, SdrHdlKind eNewKind /*=SdrHdlKind::Move*/ ) +: SdrHdl( rPnt, eNewKind ) +, mxSmartTag(std::move( xTag )) +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/undoback.cxx b/sd/source/ui/func/undoback.cxx new file mode 100644 index 0000000000..768ca2ec2f --- /dev/null +++ b/sd/source/ui/func/undoback.cxx @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include + +#include + +#include + +#include +#include +#include + +SdBackgroundObjUndoAction::SdBackgroundObjUndoAction( + SdDrawDocument& rDoc, + SdPage& rPage, + const SfxItemSet& rItemSet) +: SdUndoAction(&rDoc), + mrPage(rPage), + mpItemSet(std::make_unique(rItemSet)), + mbHasFillBitmap(false) +{ + OUString aString( SdResId( STR_UNDO_CHANGE_PAGEFORMAT ) ); + SetComment( aString ); + saveFillBitmap(*mpItemSet); +} + +void SdBackgroundObjUndoAction::ImplRestoreBackgroundObj() +{ + std::unique_ptr pNew = std::make_unique(mrPage.getSdrPageProperties().GetItemSet()); + mrPage.getSdrPageProperties().ClearItem(); + if (bool(mpFillBitmapItem)) + restoreFillBitmap(*mpItemSet); + mpFillBitmapItem.reset(); + mbHasFillBitmap = false; + mrPage.getSdrPageProperties().PutItemSet(*mpItemSet); + mpItemSet = std::move(pNew); + saveFillBitmap(*mpItemSet); + + // tell the page that it's visualization has changed + mrPage.ActionChanged(); +} + +void SdBackgroundObjUndoAction::Undo() +{ + ImplRestoreBackgroundObj(); +} + +void SdBackgroundObjUndoAction::Redo() +{ + ImplRestoreBackgroundObj(); +} + +SdUndoAction* SdBackgroundObjUndoAction::Clone() const +{ + std::unique_ptr pCopy = std::make_unique(*mpDoc, mrPage, *mpItemSet); + if (mpFillBitmapItem) + pCopy->mpFillBitmapItem.reset(mpFillBitmapItem->Clone()); + pCopy->mbHasFillBitmap = mbHasFillBitmap; + return pCopy.release(); +} + +void SdBackgroundObjUndoAction::saveFillBitmap(SfxItemSet &rItemSet) +{ + if (const XFillBitmapItem *pItem = rItemSet.GetItemIfSet(XATTR_FILLBITMAP, false)) + mpFillBitmapItem.reset(pItem->Clone()); + if (bool(mpFillBitmapItem)) + { + if (const XFillStyleItem* pItem = rItemSet.GetItemIfSet(XATTR_FILLSTYLE, false)) + mbHasFillBitmap = pItem->GetValue() == css::drawing::FillStyle_BITMAP; + rItemSet.ClearItem(XATTR_FILLBITMAP); + if (mbHasFillBitmap) + rItemSet.ClearItem(XATTR_FILLSTYLE); + } +} + +void SdBackgroundObjUndoAction::restoreFillBitmap(SfxItemSet &rItemSet) +{ + rItemSet.Put(*mpFillBitmapItem); + if (mbHasFillBitmap) + rItemSet.Put(XFillStyleItem(css::drawing::FillStyle_BITMAP)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/undoheaderfooter.cxx b/sd/source/ui/func/undoheaderfooter.cxx new file mode 100644 index 0000000000..6f386a42fd --- /dev/null +++ b/sd/source/ui/func/undoheaderfooter.cxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include + + +SdHeaderFooterUndoAction::SdHeaderFooterUndoAction( SdDrawDocument* pDoc, SdPage* pPage, sd::HeaderFooterSettings aNewSettings ) +: SdUndoAction(pDoc), + mpPage(pPage), + maOldSettings(pPage->getHeaderFooterSettings()), + maNewSettings(std::move(aNewSettings)) +{ +} + +SdHeaderFooterUndoAction::~SdHeaderFooterUndoAction() +{ +} + +void SdHeaderFooterUndoAction::Undo() +{ + mpPage->setHeaderFooterSettings( maOldSettings ); + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + pViewFrm->GetDispatcher()->Execute( SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); +} + +void SdHeaderFooterUndoAction::Redo() +{ + mpPage->setHeaderFooterSettings( maNewSettings ); + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + pViewFrm->GetDispatcher()->Execute( SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/undolayer.cxx b/sd/source/ui/func/undolayer.cxx new file mode 100644 index 0000000000..15084376b9 --- /dev/null +++ b/sd/source/ui/func/undolayer.cxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + + +SdLayerModifyUndoAction::SdLayerModifyUndoAction( + SdDrawDocument* _pDoc, SdrLayer* pLayer, + OUString aOldLayerName, OUString aOldLayerTitle, OUString aOldLayerDesc, bool bOldIsVisible, bool bOldIsLocked, bool bOldIsPrintable, + OUString aNewLayerName, OUString aNewLayerTitle, OUString aNewLayerDesc, bool bNewIsVisible, bool bNewIsLocked, bool bNewIsPrintable ) +: SdUndoAction( _pDoc ), + mpLayer( pLayer ), + maOldLayerName(std::move( aOldLayerName )), + maOldLayerTitle(std::move( aOldLayerTitle )), + maOldLayerDesc(std::move( aOldLayerDesc )), + mbOldIsVisible( bOldIsVisible ), + mbOldIsLocked( bOldIsLocked ), + mbOldIsPrintable( bOldIsPrintable ), + maNewLayerName(std::move( aNewLayerName )), + maNewLayerTitle(std::move( aNewLayerTitle )), + maNewLayerDesc(std::move( aNewLayerDesc )), + mbNewIsVisible( bNewIsVisible ), + mbNewIsLocked( bNewIsLocked ), + mbNewIsPrintable( bNewIsPrintable ) +{ + OUString aString(SdResId(STR_MODIFYLAYER)); + SetComment(aString); +} + +void SdLayerModifyUndoAction::Undo() +{ + ::sd::DrawDocShell* pDocSh = mpDoc->GetDocSh(); + if( pDocSh ) + { + ::sd::DrawViewShell* pDrViewSh = dynamic_cast< ::sd::DrawViewShell*> ( pDocSh->GetViewShell() ); + if( pDrViewSh ) + { + pDrViewSh->ModifyLayer( mpLayer, maOldLayerName, maOldLayerTitle, maOldLayerDesc, mbOldIsVisible, mbOldIsLocked, mbOldIsPrintable ); + } + } +} + +void SdLayerModifyUndoAction::Redo() +{ + ::sd::DrawDocShell* pDocSh = mpDoc->GetDocSh(); + if( pDocSh ) + { + ::sd::DrawViewShell* pDrViewSh = dynamic_cast< ::sd::DrawViewShell* >( pDocSh->GetViewShell() ); + if( pDrViewSh ) + { + pDrViewSh->ModifyLayer( mpLayer, maNewLayerName, maNewLayerTitle, maNewLayerDesc, mbNewIsVisible, mbNewIsLocked, mbNewIsPrintable ); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/undopage.cxx b/sd/source/ui/func/undopage.cxx new file mode 100644 index 0000000000..174747bf6c --- /dev/null +++ b/sd/source/ui/func/undopage.cxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + + +SdPageFormatUndoAction::~SdPageFormatUndoAction() +{ +} + +void SdPageFormatUndoAction::Undo() +{ + ::tools::Rectangle aOldBorderRect(mnOldLeft, mnOldUpper, mnOldRight, mnOldLower); + mpPage->ScaleObjects(maOldSize, aOldBorderRect, mbNewScale); + mpPage->SetSize(maOldSize); + mpPage->SetLeftBorder(mnOldLeft); + mpPage->SetRightBorder(mnOldRight); + mpPage->SetUpperBorder(mnOldUpper); + mpPage->SetLowerBorder(mnOldLower); + mpPage->SetOrientation(meOldOrientation); + mpPage->SetPaperBin( mnOldPaperBin ); + + mpPage->SetBackgroundFullSize( mbOldFullSize ); + if( !mpPage->IsMasterPage() ) + static_cast( mpPage->TRG_GetMasterPage() ).SetBackgroundFullSize( mbOldFullSize ); + +} + +void SdPageFormatUndoAction::Redo() +{ + ::tools::Rectangle aNewBorderRect(mnNewLeft, mnNewUpper, mnNewRight, mnNewLower); + mpPage->ScaleObjects(maNewSize, aNewBorderRect, mbNewScale); + mpPage->SetSize(maNewSize); + mpPage->SetLeftBorder(mnNewLeft); + mpPage->SetRightBorder(mnNewRight); + mpPage->SetUpperBorder(mnNewUpper); + mpPage->SetLowerBorder(mnNewLower); + mpPage->SetOrientation(meNewOrientation); + mpPage->SetPaperBin( mnNewPaperBin ); + + mpPage->SetBackgroundFullSize( mbNewFullSize ); + if( !mpPage->IsMasterPage() ) + static_cast( mpPage->TRG_GetMasterPage() ).SetBackgroundFullSize( mbNewFullSize ); + +} + +SdPageLRUndoAction::~SdPageLRUndoAction() +{ +} + +void SdPageLRUndoAction::Undo() +{ + mpPage->SetLeftBorder(mnOldLeft); + mpPage->SetRightBorder(mnOldRight); +} + +void SdPageLRUndoAction::Redo() +{ + mpPage->SetLeftBorder(mnNewLeft); + mpPage->SetRightBorder(mnNewRight); +} + +SdPageULUndoAction::~SdPageULUndoAction() +{ +} + +void SdPageULUndoAction::Undo() +{ + mpPage->SetUpperBorder(mnOldUpper); + mpPage->SetLowerBorder(mnOldLower); +} + +/** + * UL-Redo() + */ +void SdPageULUndoAction::Redo() +{ + mpPage->SetUpperBorder(mnNewUpper); + mpPage->SetLowerBorder(mnNewLower); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/unmovss.cxx b/sd/source/ui/func/unmovss.cxx new file mode 100644 index 0000000000..d21f83b39a --- /dev/null +++ b/sd/source/ui/func/unmovss.cxx @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +SdMoveStyleSheetsUndoAction::SdMoveStyleSheetsUndoAction( SdDrawDocument* pTheDoc, StyleSheetCopyResultVector& rTheStyles, bool bInserted) +: SdUndoAction(pTheDoc) +, mbMySheets( !bInserted ) +{ + maStyles.swap( rTheStyles ); + + maListOfChildLists.resize( maStyles.size() ); + // create list with lists of style sheet children + std::size_t i = 0; + for (const auto& a : maStyles) + { + maListOfChildLists[i++] = SdStyleSheetPool::CreateChildList(a.m_xStyleSheet.get()); + } +} + +void SdMoveStyleSheetsUndoAction::Undo() +{ + SfxStyleSheetBasePool* pPool = mpDoc->GetStyleSheetPool(); + + if (mbMySheets) + { + // the styles have to be inserted in the pool + + // first insert all styles to the pool + for (auto& a : maStyles) + { + if (!a.m_bCreatedByCopy) // tdf#119259, existed before this action, so leave it alone + continue; + pPool->Insert(a.m_xStyleSheet.get()); + } + + // now assign the children again + std::vector< SdStyleSheetVector >::iterator childlistiter( maListOfChildLists.begin() ); + for (const auto& a : maStyles) + { + OUString aParent(a.m_xStyleSheet->GetName()); + for( auto& rxChild : *childlistiter ) + { + rxChild->SetParent(aParent); + } + ++childlistiter; + } + } + else + { + // remove the styles again from the pool + for (auto& a : maStyles) + { + if (!a.m_bCreatedByCopy) // tdf#119259, existed before this action, so leave it alone + continue; + pPool->Remove(a.m_xStyleSheet.get()); + } + } + mbMySheets = !mbMySheets; +} + +void SdMoveStyleSheetsUndoAction::Redo() +{ + Undo(); +} + +SdMoveStyleSheetsUndoAction::~SdMoveStyleSheetsUndoAction() +{ +} + +OUString SdMoveStyleSheetsUndoAction::GetComment() const +{ + return OUString(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/unoaprms.cxx b/sd/source/ui/func/unoaprms.cxx new file mode 100644 index 0000000000..3bf7d98a61 --- /dev/null +++ b/sd/source/ui/func/unoaprms.cxx @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + + +void SdAnimationPrmsUndoAction::Undo() +{ + // no new info created: restore data + if (!bInfoCreated) + { + SdDrawDocument* pDoc(dynamic_cast< SdDrawDocument* >(&pObject->getSdrModelFromSdrObject())); + SdAnimationInfo* pInfo = pDoc ? SdDrawDocument::GetAnimationInfo(pObject) : nullptr; + if (pInfo) + { + pInfo->mbActive = bOldActive; + pInfo->meEffect = eOldEffect; + pInfo->meTextEffect = eOldTextEffect; + pInfo->meSpeed = eOldSpeed; + pInfo->mbDimPrevious = bOldDimPrevious; + pInfo->maDimColor = aOldDimColor; + pInfo->mbDimHide = bOldDimHide; + pInfo->mbSoundOn = bOldSoundOn; + pInfo->maSoundFile = aOldSoundFile; + pInfo->mbPlayFull = bOldPlayFull; + pInfo->meClickAction = eOldClickAction; + pInfo->SetBookmark( aOldBookmark ); + pInfo->mnVerb = nOldVerb; + + pInfo->meSecondEffect = eOldSecondEffect; + pInfo->meSecondSpeed = eOldSecondSpeed; + pInfo->mbSecondSoundOn = bOldSecondSoundOn; + pInfo->mbSecondPlayFull = bOldSecondPlayFull; + } + } + // info was created by action: delete info + else + { + pObject->DeleteUserData(0); + } + // force ModelHasChanged() in order to update effect window (animation order) + pObject->SetChanged(); + pObject->BroadcastObjectChange(); +} + +void SdAnimationPrmsUndoAction::Redo() +{ + SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObject,true); + + pInfo->mbActive = bNewActive; + pInfo->meEffect = eNewEffect; + pInfo->meTextEffect = eNewTextEffect; + pInfo->meSpeed = eNewSpeed; + pInfo->mbDimPrevious = bNewDimPrevious; + pInfo->maDimColor = aNewDimColor; + pInfo->mbDimHide = bNewDimHide; + pInfo->mbSoundOn = bNewSoundOn; + pInfo->maSoundFile = aNewSoundFile; + pInfo->mbPlayFull = bNewPlayFull; + pInfo->meClickAction = eNewClickAction; + pInfo->SetBookmark( aNewBookmark ); + pInfo->mnVerb = nNewVerb; + + pInfo->meSecondEffect = eNewSecondEffect; + pInfo->meSecondSpeed = eNewSecondSpeed; + pInfo->mbSecondSoundOn = bNewSecondSoundOn; + pInfo->mbSecondPlayFull = bNewSecondPlayFull; + + // force ModelHasChanged() in order to update effect window (animation order) + pObject->SetChanged(); + pObject->BroadcastObjectChange(); +} + +SdAnimationPrmsUndoAction::~SdAnimationPrmsUndoAction() +{ +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/func/unprlout.cxx b/sd/source/ui/func/unprlout.cxx new file mode 100644 index 0000000000..2188833498 --- /dev/null +++ b/sd/source/ui/func/unprlout.cxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include + + +SdPresentationLayoutUndoAction::SdPresentationLayoutUndoAction( + SdDrawDocument* pTheDoc, + const OUString& aTheOldLayoutName, + const OUString& aTheNewLayoutName, + AutoLayout eTheOldAutoLayout, + AutoLayout eTheNewAutoLayout, + bool bSet, + SdPage* pThePage): + SdUndoAction(pTheDoc) +{ + aOldLayoutName = aTheOldLayoutName; + aNewLayoutName = aTheNewLayoutName; + eOldAutoLayout = eTheOldAutoLayout; + eNewAutoLayout = eTheNewAutoLayout; + bSetAutoLayout = bSet; + + DBG_ASSERT(pThePage, "No Page set!"); + pPage = pThePage; + aComment = SdResId(STR_UNDO_SET_PRESLAYOUT); +} + +void SdPresentationLayoutUndoAction::Undo() +{ + pPage->SetPresentationLayout(aOldLayoutName, true, true, true); + if (bSetAutoLayout) + pPage->SetAutoLayout(eOldAutoLayout, true); +} + +void SdPresentationLayoutUndoAction::Redo() +{ + pPage->SetPresentationLayout(aNewLayoutName); + if (bSetAutoLayout) + pPage->SetAutoLayout(eNewAutoLayout, true); +} + +SdPresentationLayoutUndoAction::~SdPresentationLayoutUndoAction() +{ +} + +OUString SdPresentationLayoutUndoAction::GetComment() const +{ + return aComment; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleDocumentViewBase.hxx b/sd/source/ui/inc/AccessibleDocumentViewBase.hxx new file mode 100644 index 0000000000..a514cfc424 --- /dev/null +++ b/sd/source/ui/inc/AccessibleDocumentViewBase.hxx @@ -0,0 +1,324 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SD_SOURCE_UI_INC_ACCESSIBLEDOCUMENTVIEWBASE_HXX +#define INCLUDED_SD_SOURCE_UI_INC_ACCESSIBLEDOCUMENTVIEWBASE_HXX + +#include +#include +#include +#include "AccessibleViewForwarder.hxx" +#include +#include + +#include +#include +#include +#include + +#include + +#include "Window.hxx" + +namespace com::sun::star::accessibility { class XAccessible; } +namespace com::sun::star::frame { class XModel; } +namespace com::sun::star::awt { class XWindow; } + +class VclWindowEvent; + +namespace sd { +class ViewShell; +} + +namespace accessibility { + +/** Base class for the various document views of the Draw and + Impress applications. + +

The different view modes of the Draw and Impress applications + are made accessible by derived classes. When the view mode is + changed then the object representing the document view is + disposed and replaced by a new instance of the then appropriate + derived class.

+ +

This base class also manages an optionally active accessible OLE + object. If you overwrite the getAccessibleChildCount + and getAccessibleChild methods then make sure to first + call the corresponding method of this class and adapt your child count + and indices accordingly. Only one active OLE object is allowed at a + time. This class does not listen for disposing calls at the moment + because it does not use the accessible OLE object directly and trusts on + getting informed through VCL window events.

+ +

This class implements three kinds of listeners: +

  1. The property change listener is not used directly but exists as + convenience for derived classes. May be moved to those classes + instead.
  2. +
  3. As window listener it waits for changes of the window geometry and + forwards those as view forwarder changes.
  4. +
  5. As focus listener it keeps track of the focus to give this class and + derived classes the opportunity to set and remove the focus to/from + shapes.
  6. +
+

+*/ +class AccessibleDocumentViewBase + : public AccessibleContextBase, + public AccessibleComponentBase, + public AccessibleSelectionBase, + public IAccessibleViewForwarderListener, + public css::beans::XPropertyChangeListener, + public css::awt::XWindowListener, + public css::awt::XFocusListener, + public css::accessibility::XAccessibleExtendedAttributes +{ +public: + //===== internal ======================================================== + + /** Create a new object. Note that the caller has to call the + Init method directly after this constructor has finished. + @param pSdWindow + The window whose content is to be made accessible. + @param pViewShell + The view shell associated with the given window. + @param rxController + The controller from which to get the model. + @param rxParent + The accessible parent of the new object. Note that this parent does + not necessarily correspond with the parent of the given window. + */ + AccessibleDocumentViewBase ( + ::sd::Window* pSdWindow, + ::sd::ViewShell* pViewShell, + css::uno::Reference xController, + const css::uno::Reference& rxParent); + + virtual ~AccessibleDocumentViewBase() override; + + /** Initialize a new object. Call this method directly after creating a + new object. It finished the initialization begun in the constructor + but which needs a fully created object. + */ + virtual void Init(); + + /** Define callback for listening to window child events of VCL. + Listen for creation or destruction of OLE objects. + */ + DECL_LINK( WindowChildEventListener, VclWindowEvent&, void ); + + //===== IAccessibleViewForwarderListener ================================ + + /** A view forwarder change is signalled for instance when any of the + window events is received. Thus, instead of overriding the four + windowResized... methods it will be sufficient in most cases just to + override this method. + */ + virtual void ViewForwarderChanged() override; + + //===== XAccessibleContext ============================================== + + virtual css::uno::Reference SAL_CALL + getAccessibleParent() override; + + /** This implementation returns either 1 or 0 depending on whether there + is an active accessible OLE object or not. + */ + virtual sal_Int64 SAL_CALL + getAccessibleChildCount() override; + + /** This implementation either returns the active accessible OLE object + if it exists and the given index is 0 or throws an exception. + */ + virtual css::uno::Reference SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + + //===== XAccessibleComponent ============================================ + + virtual css::uno::Reference SAL_CALL + getAccessibleAtPoint (const css::awt::Point& aPoint) override; + + virtual css::awt::Rectangle SAL_CALL getBounds() override; + + virtual css::awt::Point SAL_CALL getLocation() override; + + virtual css::awt::Point SAL_CALL getLocationOnScreen() override; + + virtual css::awt::Size SAL_CALL getSize() override; + + //===== XInterface ====================================================== + + virtual css::uno::Any SAL_CALL + queryInterface (const css::uno::Type & rType) override; + + virtual void SAL_CALL + acquire() + noexcept override; + + virtual void SAL_CALL + release() + noexcept override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + virtual css::uno::Sequence< OUString> SAL_CALL + getSupportedServiceNames() override; + + //===== XTypeProvider =================================================== + + virtual css::uno::Sequence< css::uno::Type> SAL_CALL + getTypes() override; + + //===== lang::XEventListener ============================================ + + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + //===== XPropertyChangeListener ========================================= + + virtual void SAL_CALL + propertyChange (const css::beans::PropertyChangeEvent& rEventObject) override; + + //===== XWindowListener ================================================= + + virtual void SAL_CALL + windowResized (const css::awt::WindowEvent& e) override; + + virtual void SAL_CALL + windowMoved (const css::awt::WindowEvent& e) override; + + virtual void SAL_CALL + windowShown (const css::lang::EventObject& e) override; + + virtual void SAL_CALL + windowHidden (const css::lang::EventObject& e) override; + + //===== XFocusListener ================================================= + + virtual void SAL_CALL focusGained (const css::awt::FocusEvent& e) override; + virtual void SAL_CALL focusLost (const css::awt::FocusEvent& e) override; + //----------------------------xAttribute---------------------------- + virtual css::uno::Any SAL_CALL getExtendedAttributes() override; + ::sd::ViewShell* mpViewShell; +private: + + // return the member maMutex; + virtual ::osl::Mutex& + implGetMutex() override; + + // return ourself as context in default case + virtual css::uno::Reference< css::accessibility::XAccessibleContext > + implGetAccessibleContext() override; + + // return sal_False in default case + virtual bool + implIsSelected( sal_Int64 nAccessibleChildIndex ) override; + + // return nothing in default case + virtual void + implSelect( sal_Int64 nAccessibleChildIndex, bool bSelect ) override; + +protected: + /// The API window that is made accessible. + css::uno::Reference< css::awt::XWindow> + mxWindow; + + /// The controller of the window in which this view is displayed. + css::uno::Reference< css::frame::XController> + mxController; + + /// Model of the document. + css::uno::Reference < css::frame::XModel> + mxModel; + + // Bundle of information that is passed down the shape tree. + AccessibleShapeTreeInfo maShapeTreeInfo; + + /// The view forwarder passed to the children manager. + AccessibleViewForwarder maViewForwarder; + + /** Accessible OLE object. Set or removed by the + SetAccessibleOLEObject method. + */ + css::uno::Reference< css::accessibility::XAccessible> + mxAccessibleOLEObject; + + Link maWindowLink; + + // This method is called from the component helper base class while + // disposing. + virtual void SAL_CALL disposing() override; + + /** Create a name string. The current name is not modified and, + therefore, no events are sent. This method is usually called once + by the getAccessibleName method of the base class. + @return + A name string. + */ + virtual OUString + CreateAccessibleName () override; + + /** This method is called when (after) the frame containing this + document has been activated. Can be used to send FOCUSED state + changes for the currently selected element. + + Note: Currently used as a substitute for FocusGained. Should be + renamed in the future. + */ + virtual void Activated(); + + /** This method is called when (before or after?) the frame containing + this document has been deactivated. Can be used to send FOCUSED + state changes for the currently selected element. + + Note: Currently used as a substitute for FocusLost. Should be + renamed in the future. + */ + virtual void Deactivated(); + + /** Set or remove the currently active accessible OLE object. + @param xOLEObject + If this is a valid reference then a child event is send that + informs the listeners of a new child. If there has already been + an active accessible OLE object then this is removed first and + appropriate events are sent. + + If this is an empty reference then the currently active + accessible OLE object (if there is one) is removed. + */ + void SetAccessibleOLEObject ( + const css::uno::Reference& xOLEObject); + +public: + void SwitchViewActivated() { Activated(); } + virtual sal_Int32 SAL_CALL getForeground( ) override; + + virtual sal_Int32 SAL_CALL getBackground( ) override; + virtual void impl_dispose(); +}; + +} // end of namespace accessibility + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleDrawDocumentView.hxx b/sd/source/ui/inc/AccessibleDrawDocumentView.hxx new file mode 100644 index 0000000000..924723a311 --- /dev/null +++ b/sd/source/ui/inc/AccessibleDrawDocumentView.hxx @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "AccessibleDocumentViewBase.hxx" + +#include + +namespace accessibility { class AccessiblePageShape; } +namespace accessibility { class ChildrenManager; } + +namespace accessibility { + +/** This class makes draw documents in the general view modes + accessible. It passes all shapes on the current draw page to a + children manager and additionally creates a new shape that + represents the actual draw page. + + Please see the documentation of the base class for further + explanations of the individual methods. +*/ +class AccessibleDrawDocumentView final : + public AccessibleDocumentViewBase + ,public css::accessibility::XAccessibleGroupPosition +{ +public: + //===== internal ======================================================== + + AccessibleDrawDocumentView (::sd::Window* pSdWindow, + ::sd::ViewShell* pViewShell, + const css::uno::Reference& rxController, + const css::uno::Reference& rxParent); + + virtual ~AccessibleDrawDocumentView() override; + + /** Complete the initialization begun in the constructor. + */ + virtual void Init() override; + + //===== IAccessibleViewForwarderListener ================================ + + virtual void ViewForwarderChanged() override; + + //===== XAccessibleContext ============================================== + + virtual sal_Int64 SAL_CALL + getAccessibleChildCount() override; + + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + + virtual OUString SAL_CALL + getAccessibleName() override; + + //===== lang::XEventListener ============================================ + + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + //===== XPropertyChangeListener ========================================= + + virtual void SAL_CALL + propertyChange (const css::beans::PropertyChangeEvent& rEventObject) override; + //===== XInterface ====================================================== + + virtual css::uno::Any SAL_CALL + queryInterface (const css::uno::Type & rType) override; + + virtual void SAL_CALL + acquire() + noexcept override; + + virtual void SAL_CALL + release() + noexcept override; + + //===== XAccessibleGroupPosition ========================================= + virtual css::uno::Sequence< sal_Int32 > SAL_CALL + getGroupPosition( const css::uno::Any& rAny ) override; + virtual OUString SAL_CALL getObjectLink( const css::uno::Any& accoject ) override; + +private: + + //===== XServiceInfo ==================================================== + + virtual OUString SAL_CALL + getImplementationName() override; + + virtual css::uno::Sequence< OUString> SAL_CALL + getSupportedServiceNames() override; + + virtual bool + implIsSelected( sal_Int64 nAccessibleChildIndex ) override; + + /** Select or deselect the specified child or all children if the given + index has the special value ACCESSIBLE_SELECTION_CHILD_ALL. + Selecting or deselecting a child sets or resets the + SELECTED state and selects or deselects the UNO shape + being made accessible by the child. + @param nAccessibleChildIndex + Index of the child to select or deselect. If the parameter has + the value ACCESSIBLE_SELECTION_CHILD_ALL then all children are + selected or deselected. + @param bSelect + Indicates whether to select or deselect the specified child + reps. children. + */ + virtual void + implSelect( sal_Int64 nAccessibleChildIndex, bool bSelect ) override; + + ::sd::ViewShell* mpSdViewSh; + + /** This object manages the shapes of the represented draw page. It is + responsible to determine the visible shapes and create on demand the + accessible objects representing them. + */ + std::unique_ptr mpChildrenManager; + + // This method is called from the component helper base class while + // disposing. + virtual void SAL_CALL disposing() override; + + /** Create a shape the represents the page as seen on the screen. + */ + rtl::Reference CreateDrawPageShape(); + + /// Create an accessible name that contains the current view mode. + virtual OUString + CreateAccessibleName () override; + + /** Make sure that the currently focused shape sends a FOCUSED state + change event indicating that it has (regained) the focus. + */ + virtual void Activated() override; + + /** Make sure that the currently focused shape sends a FOCUSED state + change event indicating that it has lost the focus. + */ + virtual void Deactivated() override; + + virtual void impl_dispose() override; + + void UpdateAccessibleName(); +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleOutlineEditSource.hxx b/sd/source/ui/inc/AccessibleOutlineEditSource.hxx new file mode 100644 index 0000000000..d13d27e97c --- /dev/null +++ b/sd/source/ui/inc/AccessibleOutlineEditSource.hxx @@ -0,0 +1,90 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +class OutlinerView; +class SdrOutliner; +class SdrView; +namespace vcl { class Window; } + +namespace accessibility +{ + /** Implementation of the SvxEditSource interface in the SdOutlineView + + This class connects the SdOutlineView and its EditEngine + outliner with the AccessibleTextHelper, which provides all + necessary functionality to make the outliner text accessible + + @see SvxEditSource + @see SvxViewForwarder + */ + class AccessibleOutlineEditSource final : public SvxEditSource, public SvxViewForwarder, public SfxBroadcaster, public SfxListener + { + public: + /// Create an SvxEditSource interface for the given Outliner + AccessibleOutlineEditSource( + SdrOutliner& rOutliner, + SdrView& rView, + OutlinerView& rOutlView, + const vcl::Window& rViewWindow ); + virtual ~AccessibleOutlineEditSource() override; + + /// This method is disabled and always returns NULL + virtual std::unique_ptr Clone() const override; + virtual SvxTextForwarder* GetTextForwarder() override; + virtual SvxViewForwarder* GetViewForwarder() override; + virtual SvxEditViewForwarder* GetEditViewForwarder( bool bCreate = false ) override; + virtual void UpdateData() override; + virtual SfxBroadcaster& GetBroadcaster() const override; + + // the view forwarder + virtual bool IsValid() const override; + virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const override; + virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const override; + + // SfxListener + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + private: + AccessibleOutlineEditSource( const AccessibleOutlineEditSource& ) = delete; + AccessibleOutlineEditSource& operator=( const AccessibleOutlineEditSource& ) = delete; + + DECL_LINK( NotifyHdl, EENotify&, void ); + + SdrView& mrView; + const vcl::Window& mrWindow; + SdrOutliner* mpOutliner; + OutlinerView* mpOutlinerView; + + SvxOutlinerForwarder mTextForwarder; + SvxDrawOutlinerViewForwarder mViewForwarder; + + }; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleOutlineView.hxx b/sd/source/ui/inc/AccessibleOutlineView.hxx new file mode 100644 index 0000000000..ddff1b4652 --- /dev/null +++ b/sd/source/ui/inc/AccessibleOutlineView.hxx @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "AccessibleDocumentViewBase.hxx" +#include + +namespace sd { class OutlineViewShell; } + +namespace accessibility { + +/** This class makes the Impress outline view accessible. + + Please see the documentation of the base class for further + explanations of the individual methods. This class is a mere + wrapper around the AccessibleTextHelper class; as basically the + Outline View is a big Outliner. +*/ +class AccessibleOutlineView final + : public AccessibleDocumentViewBase +{ +public: + AccessibleOutlineView ( + ::sd::Window* pSdWindow, + ::sd::OutlineViewShell* pViewShell, + const css::uno::Reference& rxController, + const css::uno::Reference& rxParent); + + virtual ~AccessibleOutlineView() override; + + /** Complete the initialization begun in the constructor. + */ + virtual void Init() override; + + //===== IAccessibleViewForwarderListener ================================ + + virtual void ViewForwarderChanged() override; + + //===== XAccessibleContext ============================================== + + virtual sal_Int64 SAL_CALL + getAccessibleChildCount() override; + + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + virtual OUString SAL_CALL + getAccessibleName() override; + //===== XAccessibleEventBroadcaster ======================================== + + virtual void SAL_CALL + addAccessibleEventListener ( + const css::uno::Reference& xListener) override; + + virtual void SAL_CALL + removeAccessibleEventListener ( + const css::uno::Reference& xListener) override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + //===== lang::XEventListener ============================================ + + using AccessibleDocumentViewBase::disposing; + + //===== XPropertyChangeListener ========================================= + + virtual void SAL_CALL + propertyChange (const css::beans::PropertyChangeEvent& rEventObject) override; + +private: + + // overridden to detect focus changes + virtual void Activated() override; + + // overridden to detect focus changes + virtual void Deactivated() override; + + // declared, but not defined + AccessibleOutlineView( const AccessibleOutlineView& ); + AccessibleOutlineView& operator= ( const AccessibleOutlineView& ); + + // This method is called from the component helper base class while disposing. + virtual void SAL_CALL disposing() override; + + /// Create an accessible name that contains the current view mode. + virtual OUString + CreateAccessibleName () override; + + /// Invalidate text helper, updates visible children + void UpdateChildren(); + + AccessibleTextHelper maTextHelper; + +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessiblePageShape.hxx b/sd/source/ui/inc/AccessiblePageShape.hxx new file mode 100644 index 0000000000..1e7568ab00 --- /dev/null +++ b/sd/source/ui/inc/AccessiblePageShape.hxx @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace com::sun::star::accessibility { class XAccessible; } +namespace com::sun::star::drawing { class XDrawPage; } +namespace accessibility { class AccessibleShapeTreeInfo; } + +namespace accessibility { + +/** A page shape represents the actual page as seen on the screen. +*/ +class AccessiblePageShape + : public AccessibleShape +{ +public: + //===== internal ======================================================== + + /** Create a new accessible object that makes the given shape accessible. + @param rxParent + The accessible parent object. It will be used, for example when + the getIndexInParent method is called. + @param rShapeTreeInfo + Bundle of information passed to this shape and all of its descendants. + @attention + Always call the init method after creating a + new accessible shape. This is one way to overcome the potential + problem of registering the new object with e.g. event + broadcasters. That would delete the new object if a broadcaster + would not keep a strong reference to the new object. + */ + AccessiblePageShape ( + css::uno::Reference xPage, + const css::uno::Reference& rxParent, + const AccessibleShapeTreeInfo& rShapeTreeInfo); + + virtual ~AccessiblePageShape() override; + + //===== XAccessibleContext ============================================== + + /// Returns always 0 because there can be no children. + virtual sal_Int64 SAL_CALL + getAccessibleChildCount() override; + + /** Return the specified child. + @param nIndex + Index of the requested child. + @return + Reference of the requested child which is the accessible object + of a visible shape. + @throws IndexOutOfBoundsException + Throws always an exception because there are no children. + */ + virtual css::uno::Reference SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + + //===== XAccessibleComponent ============================================ + + virtual css::awt::Rectangle SAL_CALL getBounds() override; + + virtual sal_Int32 SAL_CALL getForeground() override; + + virtual sal_Int32 SAL_CALL getBackground() override; + + //===== XComponent ====================================================== + + virtual void SAL_CALL + dispose() override; + + //===== XServiceInfo ==================================================== + + virtual OUString SAL_CALL + getImplementationName() override; + + virtual css::uno::Sequence< OUString> SAL_CALL + getSupportedServiceNames() override; + + using AccessibleShape::disposing; + +protected: + /** Create a base name string that contains the accessible name. + */ + virtual OUString + CreateAccessibleBaseName() override; + + virtual OUString + CreateAccessibleName() override; + +private: + css::uno::Reference mxPage; + + AccessiblePageShape (const AccessiblePageShape&) = delete; + AccessibleShape& operator= (const AccessiblePageShape&) = delete; +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx b/sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx new file mode 100644 index 0000000000..91e573835c --- /dev/null +++ b/sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace accessibility { class AccessibleShapeInfo; } +namespace accessibility { class AccessibleShapeTreeInfo; } + +namespace accessibility { + +/** This class makes Impress shapes accessible. +*/ +class AccessiblePresentationGraphicShape + : public AccessibleGraphicShape +{ +public: + //===== internal ======================================================== + AccessiblePresentationGraphicShape ( + const AccessibleShapeInfo& rShapeInfo, + const AccessibleShapeTreeInfo& rShapeTreeInfo); + virtual ~AccessiblePresentationGraphicShape() override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + //===== internal ======================================================== + + /// Create a name string that contains the accessible name. + virtual OUString + CreateAccessibleBaseName () override; + + /// Return this object's role. + virtual sal_Int16 SAL_CALL getAccessibleRole () override; +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessiblePresentationOLEShape.hxx b/sd/source/ui/inc/AccessiblePresentationOLEShape.hxx new file mode 100644 index 0000000000..a8ac60deb4 --- /dev/null +++ b/sd/source/ui/inc/AccessiblePresentationOLEShape.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace accessibility { + +/** This class makes Impress shapes accessible. +*/ +class AccessiblePresentationOLEShape + : public AccessibleOLEShape +{ +public: + //===== internal ======================================================== + AccessiblePresentationOLEShape ( + const AccessibleShapeInfo& rShapeInfo, + const AccessibleShapeTreeInfo& rShapeTreeInfo); + virtual ~AccessiblePresentationOLEShape() override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + //===== internal ======================================================== + + /// Create a name string that contains the accessible name. + virtual OUString + CreateAccessibleBaseName () override; + + /// Return this object's role. + virtual sal_Int16 SAL_CALL getAccessibleRole () override; +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessiblePresentationShape.hxx b/sd/source/ui/inc/AccessiblePresentationShape.hxx new file mode 100644 index 0000000000..4a6447ae97 --- /dev/null +++ b/sd/source/ui/inc/AccessiblePresentationShape.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace accessibility { + +/** This class makes Impress shapes accessible. +*/ +class AccessiblePresentationShape + : public AccessibleShape +{ +public: + //===== internal ======================================================== + AccessiblePresentationShape ( + const AccessibleShapeInfo& rShapeInfo, + const AccessibleShapeTreeInfo& rShapeTreeInfo); + virtual ~AccessiblePresentationShape() override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + //===== internal ======================================================== + + /// Create a name string that contains the accessible name. + virtual OUString + CreateAccessibleBaseName () override; + + OUString GetStyle() const override; + +private: + AccessiblePresentationShape (const AccessiblePresentationShape&) = delete; + + AccessiblePresentationShape& operator= (const AccessiblePresentationShape&) = delete; +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleSlideSorterObject.hxx b/sd/source/ui/inc/AccessibleSlideSorterObject.hxx new file mode 100644 index 0000000000..97bea85197 --- /dev/null +++ b/sd/source/ui/inc/AccessibleSlideSorterObject.hxx @@ -0,0 +1,189 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +class SdPage; +namespace sd::slidesorter { class SlideSorter; } + +namespace accessibility { + +typedef comphelper::WeakComponentImplHelper< + css::accessibility::XAccessible, + css::accessibility::XAccessibleEventBroadcaster, + css::accessibility::XAccessibleContext, + css::accessibility::XAccessibleComponent, + css::lang::XServiceInfo > AccessibleSlideSorterObjectBase; + +/** This class makes page objects of the slide sorter accessible. +*/ +class AccessibleSlideSorterObject + : public AccessibleSlideSorterObjectBase +{ +public: + /** Create a new object that represents a page object in the slide + sorter. + @param rxParent + The accessible parent. + @param rSlideSorter + The slide sorter whose model manages the page. + @param nPageNumber + The number of the page in the range [0,nPageCount). + */ + AccessibleSlideSorterObject( + const css::uno::Reference& rxParent, + ::sd::slidesorter::SlideSorter& rSlideSorter, + sal_uInt16 nPageNumber); + virtual ~AccessibleSlideSorterObject() override; + + /** Return the page that is made accessible by the called object. + */ + SdPage* GetPage() const; + + /** The page number as given to the constructor. + */ + sal_uInt16 GetPageNumber() const { return mnPageNumber;} + + void FireAccessibleEvent ( + short nEventId, + const css::uno::Any& rOldValue, + const css::uno::Any& rNewValue); + + virtual void disposing(std::unique_lock&) override; + + //===== XAccessible ======================================================= + + virtual css::uno::Reference SAL_CALL + getAccessibleContext() override; + + //===== XAccessibleEventBroadcaster ======================================= + virtual void SAL_CALL + addAccessibleEventListener( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL + removeAccessibleEventListener( + const css::uno::Reference& rxListener ) override; + + //===== XAccessibleContext ============================================== + + virtual sal_Int64 SAL_CALL + getAccessibleChildCount() override; + + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleParent() override; + + virtual sal_Int64 SAL_CALL + getAccessibleIndexInParent() override; + + virtual sal_Int16 SAL_CALL + getAccessibleRole() override; + + virtual OUString SAL_CALL + getAccessibleDescription() override; + + virtual OUString SAL_CALL + getAccessibleName() override; + + virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet> SAL_CALL + getAccessibleRelationSet() override; + + virtual sal_Int64 SAL_CALL + getAccessibleStateSet() override; + + virtual css::lang::Locale SAL_CALL + getLocale() override; + + //===== XAccessibleComponent ================================================ + + virtual sal_Bool SAL_CALL containsPoint ( + const css::awt::Point& aPoint) override; + + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL + getAccessibleAtPoint ( + const css::awt::Point& aPoint) override; + + virtual css::awt::Rectangle SAL_CALL getBounds() override; + + virtual css::awt::Point SAL_CALL getLocation() override; + + virtual css::awt::Point SAL_CALL getLocationOnScreen() override; + + virtual css::awt::Size SAL_CALL getSize() override; + + virtual void SAL_CALL grabFocus() override; + + virtual sal_Int32 SAL_CALL getForeground() override; + + virtual sal_Int32 SAL_CALL getBackground() override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + /** Return whether the specified service is supported by this class. + */ + virtual sal_Bool SAL_CALL + supportsService (const OUString& sServiceName) override; + + /** Returns a list of all supported services. + */ + virtual css::uno::Sequence< OUString> SAL_CALL + getSupportedServiceNames() override; + +private: + css::uno::Reference mxParent; + sal_uInt16 mnPageNumber; + ::sd::slidesorter::SlideSorter& mrSlideSorter; + sal_uInt32 mnClientId; + + /** Check whether or not the object has been disposed (or is in the + state of being disposed). If that is the case then + DisposedException is thrown to inform the (indirect) caller of the + foul deed. + + @throws css::lang::DisposedException + */ + void ThrowIfDisposed(); + + /** Check whether or not the object has been disposed (or is in the + state of being disposed). + + @return sal_True, if the object is disposed or in the course + of being disposed. Otherwise, sal_False is returned. + */ + bool IsDisposed() const; +}; + +} // end of namespace ::accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleSlideSorterView.hxx b/sd/source/ui/inc/AccessibleSlideSorterView.hxx new file mode 100644 index 0000000000..0cbaf62ed5 --- /dev/null +++ b/sd/source/ui/inc/AccessibleSlideSorterView.hxx @@ -0,0 +1,253 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sd::slidesorter { class SlideSorter; } + +namespace accessibility { + +class AccessibleSlideSorterObject; + +typedef ::cppu::WeakComponentImplHelper< + css::accessibility::XAccessible, + css::accessibility::XAccessibleEventBroadcaster, + css::accessibility::XAccessibleContext, + css::accessibility::XAccessibleComponent, + css::accessibility::XAccessibleSelection, + css::lang::XServiceInfo + > AccessibleSlideSorterViewBase; + +/** This class makes the SlideSorterViewShell accessible. It uses objects + of the AccessibleSlideSorterObject class to the make the page objects + accessible. +*/ +class AccessibleSlideSorterView + : public cppu::BaseMutex, + public AccessibleSlideSorterViewBase +{ +public: + AccessibleSlideSorterView( + ::sd::slidesorter::SlideSorter& rSlideSorter, + vcl::Window* pParentWindow); + + void Init(); + + virtual ~AccessibleSlideSorterView() override; + + /** This method acts like a dispose call. It sends a disposing to all + of its listeners. It may be called twice. + */ + void Destroyed(); + + void FireAccessibleEvent ( + short nEventId, + const css::uno::Any& rOldValue, + const css::uno::Any& rNewValue); + + virtual void SAL_CALL disposing() override; + + /** Return the implementation object of the specified child. + @param nIndex + Index of the child for which to return the implementation object. + */ + AccessibleSlideSorterObject* GetAccessibleChildImplementation (sal_Int32 nIndex); + + //===== XAccessible ======================================================= + + virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL + getAccessibleContext() override; + + //===== XAccessibleEventBroadcaster ======================================= + virtual void SAL_CALL + addAccessibleEventListener( + const css::uno::Reference< css::accessibility::XAccessibleEventListener >& rxListener) override; + + virtual void SAL_CALL + removeAccessibleEventListener( + const css::uno::Reference< css::accessibility::XAccessibleEventListener >& rxListener ) override; + + //===== XAccessibleContext ============================================== + + /// Return the number of currently visible children. + virtual sal_Int64 SAL_CALL + getAccessibleChildCount() override; + + /// Return the specified child or throw exception. + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleChild (sal_Int64 nIndex) override; + + /// Return a reference to the parent. + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL + getAccessibleParent() override; + + /// Return this objects index among the parents children. + virtual sal_Int64 SAL_CALL + getAccessibleIndexInParent() override; + + /// Return this object's role. + virtual sal_Int16 SAL_CALL + getAccessibleRole() override; + + /// Return this object's description. + virtual OUString SAL_CALL + getAccessibleDescription() override; + + /// Return the object's current name. + virtual OUString SAL_CALL + getAccessibleName() override; + + /// Return NULL to indicate that an empty relation set. + virtual css::uno::Reference< + css::accessibility::XAccessibleRelationSet> SAL_CALL + getAccessibleRelationSet() override; + + /// Return the set of current states. + virtual sal_Int64 SAL_CALL getAccessibleStateSet() override; + + /** Return the parents locale or throw exception if this object has no + parent yet/anymore. + */ + virtual css::lang::Locale SAL_CALL + getLocale() override; + + //===== XAccessibleComponent ================================================ + + /** The default implementation uses the result of + getBounds to determine whether the given point lies + inside this object. + */ + virtual sal_Bool SAL_CALL containsPoint ( + const css::awt::Point& aPoint) override; + + /** The default implementation returns an empty reference. + */ + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL + getAccessibleAtPoint ( + const css::awt::Point& aPoint) override; + + /** The default implementation returns an empty rectangle. + */ + virtual css::awt::Rectangle SAL_CALL getBounds() override; + + /** The default implementation uses the result of + getBounds to determine the location. + */ + virtual css::awt::Point SAL_CALL getLocation() override; + + /** The default implementation returns an empty position, i.e. the + * result of the default constructor of css::awt::Point. + */ + virtual css::awt::Point SAL_CALL getLocationOnScreen() override; + + /** The default implementation uses the result of + getBounds to determine the size. + */ + virtual css::awt::Size SAL_CALL getSize() override; + + /** The default implementation does nothing. + */ + virtual void SAL_CALL grabFocus() override; + + /** Returns black as the default foreground color. + */ + virtual sal_Int32 SAL_CALL getForeground() override; + + /** Returns white as the default background color. + */ + virtual sal_Int32 SAL_CALL getBackground() override; + + //===== XAccessibleSelection ============================================== + + virtual void SAL_CALL + selectAccessibleChild (sal_Int64 nChildIndex) override; + + virtual sal_Bool SAL_CALL + isAccessibleChildSelected( sal_Int64 nChildIndex ) override; + + virtual void SAL_CALL + clearAccessibleSelection( ) override; + + virtual void SAL_CALL + selectAllAccessibleChildren( ) override; + + virtual sal_Int64 SAL_CALL + getSelectedAccessibleChildCount( ) override; + + virtual css::uno::Reference< + css::accessibility::XAccessible > SAL_CALL + getSelectedAccessibleChild( sal_Int64 nSelectedChildIndex ) override; + + virtual void SAL_CALL + deselectAccessibleChild( sal_Int64 nSelectedChildIndex ) override; + + //===== XServiceInfo ==================================================== + + /** Returns an identifier for the implementation of this object. + */ + virtual OUString SAL_CALL + getImplementationName() override; + + /** Return whether the specified service is supported by this class. + */ + virtual sal_Bool SAL_CALL + supportsService (const OUString& sServiceName) override; + + /** Returns a list of all supported services. + */ + virtual css::uno::Sequence< OUString> SAL_CALL + getSupportedServiceNames() override; + + void SwitchViewActivated(); +private: + class Implementation; + ::std::unique_ptr mpImpl; + + ::sd::slidesorter::SlideSorter& mrSlideSorter; + + sal_uInt32 mnClientId; + + VclPtr mpContentWindow; + + /** Check whether or not the object has been disposed (or is in the + state of being disposed). If that is the case then + DisposedException is thrown to inform the (indirect) caller of the + foul deed. + + @throws css::lang::DisposedException + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AccessibleViewForwarder.hxx b/sd/source/ui/inc/AccessibleViewForwarder.hxx new file mode 100644 index 0000000000..c791921e6f --- /dev/null +++ b/sd/source/ui/inc/AccessibleViewForwarder.hxx @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdrPaintView; +class OutputDevice; + +namespace accessibility +{ +/**

This class provides the means to transform between internal coordinates + and screen coordinates without giving direct access to the underlying + view. It represents a certain window. A call to + GetVisArea returns the corresponding visible + rectangle.

+ + @attention + Note, that modifications of the underlying view that lead to + different transformations between internal and screen coordinates or + change the validity of the forwarder have to be signaled separately. +*/ +class AccessibleViewForwarder final : public IAccessibleViewForwarder +{ +public: + //===== internal ======================================================== + + AccessibleViewForwarder(SdrPaintView* pView, const OutputDevice& rDevice); + + virtual ~AccessibleViewForwarder() override; + + //===== IAccessibleViewforwarder ======================================== + + /** Returns the area of the underlying document that is visible in the + * corresponding window. + + @return + The rectangle of the visible part of the document. + */ + virtual ::tools::Rectangle GetVisibleArea() const override; + + /** Transform the specified point from internal coordinates to an + absolute screen position. + + @param rPoint + Point in internal coordinates. + + @return + The same point but in screen coordinates relative to the upper + left corner of the (current) screen. + */ + virtual Point LogicToPixel(const Point& rPoint) const override; + + /** Transform the specified size from internal coordinates to a screen + * position. + + @param rSize + Size in internal coordinates. + + @return + The same size but in screen coordinates. + */ + virtual Size LogicToPixel(const Size& rSize) const override; + +private: + SdrPaintView* mpView; + sal_uInt16 mnWindowId; + + AccessibleViewForwarder(AccessibleViewForwarder const&) = delete; + AccessibleViewForwarder& operator=(AccessibleViewForwarder const&) = delete; +}; + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/AnimationChildWindow.hxx b/sd/source/ui/inc/AnimationChildWindow.hxx new file mode 100644 index 0000000000..1223dfdbd5 --- /dev/null +++ b/sd/source/ui/inc/AnimationChildWindow.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace vcl { class Window; } +class SfxBindings; + +namespace sd { + +class AnimationChildWindow + : public SfxChildWindow +{ +public: + AnimationChildWindow( + vcl::Window*, + sal_uInt16, + SfxBindings*, + SfxChildWinInfo*); + + SFX_DECL_CHILDWINDOW_WITHID(AnimationChildWindow); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/BezierObjectBar.hxx b/sd/source/ui/inc/BezierObjectBar.hxx new file mode 100644 index 0000000000..a030576ebb --- /dev/null +++ b/sd/source/ui/inc/BezierObjectBar.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd +{ +class View; +class ViewShell; + +class BezierObjectBar final : public SfxShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDDRAWBEZIEROBJECTBAR) + + BezierObjectBar(ViewShell* pSdViewShell, View* pSdView); + virtual ~BezierObjectBar() override; + + void GetAttrState(SfxItemSet& rSet); + void Execute(SfxRequest& rReq); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + + View* mpView; + ViewShell* mpViewSh; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/BreakDlg.hxx b/sd/source/ui/inc/BreakDlg.hxx new file mode 100644 index 0000000000..ee2a8b15dc --- /dev/null +++ b/sd/source/ui/inc/BreakDlg.hxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace sd +{ +class DrawDocShell; +class DrawView; + +/** + * dialog to break meta files + */ +class BreakDlg : public SfxDialogController +{ +public: + BreakDlg(weld::Window* pWindow, DrawView* pDrView, DrawDocShell* pShell, + sal_uLong nSumActionCount, sal_uLong nObjCount); + + virtual short run() override; + +private: + std::unique_ptr m_xFiObjInfo; + std::unique_ptr m_xFiActInfo; + std::unique_ptr m_xFiInsInfo; + std::unique_ptr m_xBtnCancel; + + DrawView* m_pDrView; + + bool m_bCancel; + + Idle m_aUpdateIdle; + std::unique_ptr m_xProgrInfo; + std::unique_ptr m_xProgress; + + DECL_LINK(CancelButtonHdl, weld::Button&, void); + DECL_LINK(UpDate, void*, bool); + DECL_LINK(InitialUpdate, Timer*, void); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/BulletAndPositionDlg.hxx b/sd/source/ui/inc/BulletAndPositionDlg.hxx new file mode 100644 index 0000000000..35a35412bc --- /dev/null +++ b/sd/source/ui/inc/BulletAndPositionDlg.hxx @@ -0,0 +1,156 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include +#include +#include "View.hxx" +#include + +#define MN_GALLERY_ENTRY 100 + +class ColorListBox; +class SvxNumValueSet; +class SvxNumRule; +class SvxBmpNumValueSet; +class SvxBrushItem; +class SdDrawDocument; + +namespace sd +{ +class View; +} + +/// Main class for handling the bullets, numbering format and their position. +class SvxBulletAndPositionDlg : public weld::GenericDialogController +{ + OUString m_sNumCharFmtName; + + Timer aInvalidateTimer; + + std::unique_ptr pActNum; + std::unique_ptr pSaveNum; + const SfxItemSet& rFirstStateSet; + + Size aInitSize[SVX_MAX_NUM]; + + bool bLastWidthModified : 1; + bool bModified : 1; + bool bInInitControl : 1; // workaround for Modify-error, is said to be corrected from 391 on + bool bLabelAlignmentPosAndSpaceModeActive; + bool bApplyToMaster; + + std::vector aGrfNames; + vcl::Font aActBulletFont; + + sal_uInt8 nBullet; + sal_uInt16 nActNumLvl; + weld::Window* p_Window; + TypedWhichId nNumItemId; + MapUnit eCoreUnit; + + SvxNumberingPreview m_aPreviewWIN; + std::unique_ptr m_xGrid; + std::unique_ptr m_xLevelLB; + std::unique_ptr m_xFmtLB; + std::unique_ptr m_xPrefixFT; + std::unique_ptr m_xPrefixED; + std::unique_ptr m_xSuffixFT; + std::unique_ptr m_xSuffixED; + std::unique_ptr m_xBeforeAfter; + std::unique_ptr m_xBulColorFT; + std::unique_ptr m_xBulColLB; + std::unique_ptr m_xBulRelSizeFT; + std::unique_ptr m_xBulRelSizeMF; + std::unique_ptr m_xStartFT; + std::unique_ptr m_xStartED; + std::unique_ptr m_xBulletFT; + std::unique_ptr m_xBulletPB; + std::unique_ptr m_xBitmapMB; + std::unique_ptr m_xWidthFT; + std::unique_ptr m_xWidthMF; + std::unique_ptr m_xHeightFT; + std::unique_ptr m_xHeightMF; + std::unique_ptr m_xRatioCB; + std::unique_ptr m_xGalleryMenu; + std::unique_ptr m_xPreviewWIN; + std::unique_ptr m_xDistBorderFT; + std::unique_ptr m_xDistBorderMF; + std::unique_ptr m_xRelativeCB; + std::unique_ptr m_xIndentMF; + std::unique_ptr m_xLeftTB; + std::unique_ptr m_xCenterTB; + std::unique_ptr m_xRightTB; + std::unique_ptr m_xSlideRB; + std::unique_ptr m_xSelectionRB; + std::unique_ptr m_xApplyToMaster; + std::unique_ptr m_xReset; + + void InitControls(); + /** To switch between the numbering type + 0 - Number; + 1 - Bullet; + 2 - Bitmap; */ + void SwitchNumberType(sal_uInt8 nType); + void CheckForStartValue_Impl(sal_uInt16 nNumberingType); + + DECL_LINK(NumberTypeSelectHdl_Impl, weld::ComboBox&, void); + DECL_LINK(LevelHdl_Impl, weld::TreeView&, void); + DECL_LINK(PopupActivateHdl_Impl, weld::Toggleable&, void); + DECL_LINK(GraphicHdl_Impl, const OUString&, void); + DECL_LINK(BulletHdl_Impl, weld::Button&, void); + DECL_LINK(SizeHdl_Impl, weld::MetricSpinButton&, void); + DECL_LINK(RatioHdl_Impl, weld::Toggleable&, void); + DECL_LINK(EditModifyHdl_Impl, weld::Entry&, void); + DECL_LINK(SpinModifyHdl_Impl, weld::SpinButton&, void); + DECL_LINK(BulColorHdl_Impl, ColorListBox&, void); + DECL_LINK(BulRelSizeHdl_Impl, weld::MetricSpinButton&, void); + DECL_LINK(PreviewInvalidateHdl_Impl, Timer*, void); + DECL_LINK(DistanceHdl_Impl, weld::MetricSpinButton&, void); + DECL_LINK(RelativeHdl_Impl, weld::Toggleable&, void); + DECL_LINK(SelectLeftAlignmentHdl_Impl, weld::Toggleable&, void); + DECL_LINK(SelectCenterAlignmentHdl_Impl, weld::Toggleable&, void); + DECL_LINK(SelectRightAlignmentHdl_Impl, weld::Toggleable&, void); + DECL_LINK(ApplyToMasterHdl_Impl, weld::Toggleable&, void); + DECL_LINK(ResetHdl_Impl, weld::Button&, void); + void EditModifyHdl_Impl(const weld::Entry*); + void InitPosAndSpaceMode(); + void SetAlignmentHdl_Impl(SvxAdjust); + +public: + SvxBulletAndPositionDlg(weld::Window* pWindow, const SfxItemSet& rSet, const ::sd::View* pView); + virtual ~SvxBulletAndPositionDlg() override; + + SfxItemSet* GetOutputItemSet(SfxItemSet* rSet); + bool IsApplyToMaster() const; + bool IsSlideScope() const; + void Reset(const SfxItemSet* rSet); + + void SetCharFmt(const OUString& rNumName) { m_sNumCharFmtName = rNumName; } + void SetMetric(FieldUnit eSet); + + void SetModified(bool bRepaint = true); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/Client.hxx b/sd/source/ui/inc/Client.hxx new file mode 100644 index 0000000000..6b999068e5 --- /dev/null +++ b/sd/source/ui/inc/Client.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +class SdrOle2Obj; + +namespace sd +{ +class ViewShell; + +class Client : public SfxInPlaceClient +{ + ViewShell* mpViewShell; + SdrOle2Obj* pSdrOle2Obj; + + virtual void ObjectAreaChanged() override; + virtual void RequestNewObjectArea(::tools::Rectangle&) override; + virtual void ViewChanged() override; + +public: + Client(SdrOle2Obj* pObj, ViewShell* pSdViewShell, vcl::Window* pWindow); + virtual ~Client() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ClientView.hxx b/sd/source/ui/inc/ClientView.hxx new file mode 100644 index 0000000000..7a52053bab --- /dev/null +++ b/sd/source/ui/inc/ClientView.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "drawview.hxx" + +namespace sd +{ +/** + * The SdClientView is used for DrawDocShell::Draw() + */ +class ClientView : public DrawView +{ +public: + ClientView(DrawDocShell* pDocSh, OutputDevice* pOutDev); + virtual ~ClientView() override; + + /* if the view should not do an Invalidate() on the windows, you have to + override the following two methods and do something different */ + virtual void InvalidateOneWin(OutputDevice& rWin) override; + virtual void InvalidateOneWin(OutputDevice& rWin, const ::tools::Rectangle& rRect) override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/CustomAnimationList.hxx b/sd/source/ui/inc/CustomAnimationList.hxx new file mode 100644 index 0000000000..fe35f5ae91 --- /dev/null +++ b/sd/source/ui/inc/CustomAnimationList.hxx @@ -0,0 +1,169 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include + +namespace com::sun::star::drawing { class XShape; } + +struct ImplSVEvent; + +namespace sd { + +typedef std::shared_ptr< CustomAnimationEffect > CustomAnimationEffectPtr; + +class ICustomAnimationListController +{ +public: + virtual void onSelect() = 0; + virtual void onDoubleClick() = 0; + virtual void onContextMenu(const OUString &rIdent) = 0; + virtual void onDragNDropComplete( std::vector< CustomAnimationEffectPtr > pEffectsDragged, CustomAnimationEffectPtr pEffectInsertBefore ) = 0; + virtual ~ICustomAnimationListController() {} +}; + +class CustomAnimationList; +class CustomAnimationListEntryItem; + +class CustomAnimationListDropTarget : public DropTargetHelper +{ +private: + CustomAnimationList& m_rTreeView; + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + +public: + CustomAnimationListDropTarget(CustomAnimationList& rTreeView); +}; + +class CustomAnimationList : public ISequenceListener +{ + friend class CustomAnimationListEntryItem; + friend struct stl_append_effect_func; + +public: + explicit CustomAnimationList(std::unique_ptr xTreeView, + std::unique_ptr xLabel, + std::unique_ptr xScrolledWindow); + virtual ~CustomAnimationList(); + + // methods + + /** selects or deselects the given effect. + Selections of other effects are not changed */ + void select( const CustomAnimationEffectPtr& pEffect ); + + /** populates the list with all effects from the given MainSequence */ + void update( const MainSequencePtr& pMainSequence ); + + void update(); + + EffectSequence getSelection() const; + + // events + void onSelectionChanged(const css::uno::Any& rSelection); + + void Select(); + + virtual void notify_change() override; + + bool isExpanded( const CustomAnimationEffectPtr& pEffect ) const; + bool isVisible( const CustomAnimationEffectPtr& pEffect ) const; + + // clears all entries from the listbox + void clear(); + + void setController( ICustomAnimationListController* pController ) + { + mpController = pController; + }; + + sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt); + sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt); + + void set_sensitive(bool bSensitive) { mxTreeView->set_sensitive(bSensitive); } + int get_height_rows(int nRows) { return mxTreeView->get_height_rows(nRows); } + int get_approximate_digit_width() const { return mxTreeView->get_approximate_digit_width(); } + void set_size_request(int nWidth, int nHeight) + { + mxTreeView->set_size_request(nWidth, nHeight); + mxEmptyLabel->set_size_request(nWidth, nHeight); + } + void unselect_all() { mxTreeView->unselect_all(); } + weld::TreeView& get_widget() { return *mxTreeView; } + + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + DECL_LINK(ExpandHdl, const weld::TreeIter&, bool); + DECL_LINK(PostExpandHdl, void*, void); + DECL_LINK(CollapseHdl, const weld::TreeIter&, bool); + DECL_LINK(PostCollapseHdl, void*, void); + +private: + std::unique_ptr mxTreeView; + CustomAnimationListDropTarget maDropTargetHelper; + std::unique_ptr mxEmptyLabel; + std::unique_ptr mxEmptyLabelParent; + std::vector> mxEntries; + std::vector> lastSelectedEntries; + + bool mbIgnorePaint; + + DECL_LINK(SelectHdl, weld::TreeView&, void); + DECL_LINK(CommandHdl, const CommandEvent&, bool); + DECL_LINK(DoubleClickHdl, weld::TreeView&, bool); + DECL_LINK(DragBeginHdl, bool&, bool); + DECL_STATIC_LINK(CustomAnimationList, CustomRenderHdl, weld::TreeView::render_args, void); + DECL_STATIC_LINK(CustomAnimationList, CustomGetSizeHdl, weld::TreeView::get_size_args, Size); + + void ExecuteContextMenuAction(const OUString& rSelectedPopupEntry); + + /** appends the given effect to the list*/ + void append( CustomAnimationEffectPtr pEffect ); + + ICustomAnimationListController* mpController; + + MainSequencePtr mpMainSequence; + + css::uno::Reference< css::drawing::XShape > mxLastTargetShape; + sal_Int32 mnLastGroupId; + ImplSVEvent* mnPostExpandEvent; + ImplSVEvent* mnPostCollapseEvent; + + std::unique_ptr mxLastParentEntry; + + // drag & drop + std::unique_ptr mxDndEffectDragging; + std::vector> mDndEffectsSelected; +}; + +OUString getPropertyName( sal_Int32 nPropertyType ); + +OUString getShapeDescription( const css::uno::Reference< css::drawing::XShape >& xShape, bool bWithText ); + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/CustomAnimationPane.hxx b/sd/source/ui/inc/CustomAnimationPane.hxx new file mode 100644 index 0000000000..9896b45f66 --- /dev/null +++ b/sd/source/ui/inc/CustomAnimationPane.hxx @@ -0,0 +1,179 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include "CustomAnimationList.hxx" +#include + +#include + +namespace com::sun::star::drawing { class XDrawPage; } +namespace com::sun::star::drawing { class XDrawView; } +namespace weld { class ComboBox; } +namespace com::sun::star::animations { class XAnimationNode; } +namespace sd::tools { class EventMultiplexerEvent; } + +enum class PathKind { NONE, CURVE, POLYGON, FREEFORM }; + +namespace sd { + +class MotionPathTag; +class SdPropertySubControl; +class STLPropertySet; +class ViewShellBase; + +typedef std::vector< rtl::Reference< MotionPathTag > > MotionPathTagVector; + +class CustomAnimationPane : public PanelLayout + , public sfx2::sidebar::ILayoutableWindow + , public ICustomAnimationListController +{ + friend class MotionPathTag; +public: + CustomAnimationPane(weld::Widget* pParent, ViewShellBase& rBase); + virtual ~CustomAnimationPane() override; + + // ILayoutableWindow + virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override; + + // callbacks + void onSelectionChanged(); + void onChangeCurrentPage(); + void onAdd(); + void onRemove(); + void onChangeStart(); + void onChangeStart( sal_Int16 nNodeType ); + void onChangeSpeed(); + + // methods + void preview( const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode ); + void remove( CustomAnimationEffectPtr const & pEffect ); + + // ICustomAnimationListController + virtual void onSelect() override; + virtual void onDoubleClick() override; + virtual void onContextMenu(const OUString& rIdent) override; + virtual void onDragNDropComplete( std::vector< CustomAnimationEffectPtr > pEffectsDragged, CustomAnimationEffectPtr pEffectInsertBefore ) override; + + void addUndo(); + + double getDuration() const; + void updatePathFromMotionPathTag( const rtl::Reference< MotionPathTag >& xTag ); + +private: + void initialize(); + void addListener(); + void removeListener(); + void updateControls(); + void updateMotionPathTags(); + + void showOptions(const OUString& sPage = {}); + void moveSelection( bool bUp ); + void onPreview( bool bForcePreview ); + + std::unique_ptr createSelectionSet(); + void changeSelection( STLPropertySet const * pResultSet, STLPropertySet const * pOldSet ); + + static css::uno::Any getProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect ); + static bool setProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect, const css::uno::Any& rValue ); + sal_Int32 fillAnimationLB( bool bHasText ); + PathKind getCreatePathKind() const; + void createPath( PathKind eKind, std::vector< ::com::sun::star::uno::Any >& rTargets, double fDuration ); + + DECL_LINK( implControlListBoxHdl, weld::ComboBox&, void ); + DECL_LINK( implClickHdl, weld::Button&, void ); + DECL_LINK( implToggleHdl, weld::Toggleable&, void ); + DECL_LINK( implPropertyHdl, LinkParamNone*, void ); + DECL_LINK( EventMultiplexerListener, tools::EventMultiplexerEvent&, void ); + DECL_LINK( lateInitCallback, Timer *, void ); + DECL_LINK( DurationModifiedHdl, weld::MetricSpinButton&, void ); + DECL_LINK( DelayModifiedHdl, weld::MetricSpinButton&, void ); + DECL_LINK( DelayLoseFocusHdl, weld::Widget&, void ); + DECL_LINK( UpdateAnimationLB, weld::ComboBox&, void ); + DECL_LINK( AnimationSelectHdl, weld::TreeView&, void ); + DECL_LINK( SelectionHandler, Timer*, void ); + void implControlHdl(const weld::Widget* pControl); + +private: + ViewShellBase& mrBase; + + // UI Elements + std::unique_ptr mxFTAnimation; + std::unique_ptr mxCustomAnimationList; + std::unique_ptr mxPBAddEffect; + std::unique_ptr mxPBRemoveEffect; + std::unique_ptr mxPBMoveUp; + std::unique_ptr mxPBMoveDown; + std::unique_ptr mxFTCategory; + std::unique_ptr mxLBCategory; + std::unique_ptr mxFTEffect; + std::unique_ptr mxLBAnimation; + std::unique_ptr mxFTStart; + std::unique_ptr mxLBStart; + std::unique_ptr mxFTProperty; + std::unique_ptr mxLBSubControl; + std::unique_ptr mxPlaceholderBox; + std::unique_ptr mxPBPropertyMore; + std::unique_ptr mxFTDuration; + std::unique_ptr mxCBXDuration; + std::unique_ptr mxFTStartDelay; + std::unique_ptr mxMFStartDelay; + std::unique_ptr mxCBAutoPreview; + std::unique_ptr mxPBPlay; + + Idle maIdle; + + OUString maStrModify; + OUString maStrProperty; + + sal_Int32 mnLastSelectedAnimation; + sal_Int32 mnPropertyType; + static sal_Int32 const gnMotionPathPos = 3; + sal_Int32 mnCurvePathPos; + sal_Int32 mnPolygonPathPos; + sal_Int32 mnFreeformPathPos; + + EffectSequence maListSelection; + css::uno::Any maViewSelection; + + MainSequencePtr mpMainSequence; + + css::uno::Reference< css::drawing::XDrawPage > mxCurrentPage; + css::uno::Reference< css::drawing::XDrawView > mxView; + + /** The CustomAnimationPresets is initialized either on demand or + after a short time after the construction of a new object of this + class. This timer is responsible for the later. + */ + Timer maLateInitTimer; + + MotionPathTagVector maMotionPathTags; + + ScopeLock maSelectionLock; +}; + +void fillRepeatComboBox(weld::ComboBox& rBox); + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/DocumentRenderer.hxx b/sd/source/ui/inc/DocumentRenderer.hxx new file mode 100644 index 0000000000..7cbeefc799 --- /dev/null +++ b/sd/source/ui/inc/DocumentRenderer.hxx @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd { class ViewShellBase; } + +namespace sd { + +typedef comphelper::WeakComponentImplHelper < + css::view::XRenderable + > DocumentRendererInterfaceBase; + +class DocumentRenderer final + : public DocumentRendererInterfaceBase +{ +public: + DocumentRenderer (ViewShellBase& rBase); + virtual ~DocumentRenderer() override; + + // XRenderable + virtual sal_Int32 SAL_CALL getRendererCount ( + const css::uno::Any& aSelection, + const css::uno::Sequence& xOptions) override; + + virtual css::uno::Sequence SAL_CALL getRenderer ( + sal_Int32 nRenderer, + const css::uno::Any& rSelection, + const css::uno::Sequence& rxOptions) override; + + virtual void SAL_CALL render ( + sal_Int32 nRenderer, + const css::uno::Any& rSelection, + const css::uno::Sequence& rxOptions) override; + +private: + class Implementation; + std::unique_ptr mpImpl; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/DrawController.hxx b/sd/source/ui/inc/DrawController.hxx new file mode 100644 index 0000000000..940efff5bf --- /dev/null +++ b/sd/source/ui/inc/DrawController.hxx @@ -0,0 +1,320 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace com::sun::star::drawing { class XDrawSubController; } +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XModuleController; } +namespace com::sun::star::drawing { class XLayer; } +namespace osl { class Mutex; } +namespace sd::framework { class ConfigurationController; } +namespace sd::framework { class ModuleController; } +class SdPage; + +namespace sd { + +typedef ::cppu::ImplInheritanceHelper < + SfxBaseController, + css::view::XSelectionSupplier, + css::lang::XServiceInfo, + css::drawing::XDrawView, + css::view::XSelectionChangeListener, + css::view::XFormLayerAccess, + css::drawing::framework::XControllerManager + > DrawControllerInterfaceBase; + +class BroadcastHelperOwner +{ +public: + explicit BroadcastHelperOwner (::osl::Mutex& rMutex) : maBroadcastHelper(rMutex) {}; + ::cppu::OBroadcastHelper maBroadcastHelper; +}; + +class ViewShellBase; + +/** The DrawController is the UNO controller for Impress and Draw. It + relies objects that implement the DrawSubController interface for view + specific behaviour. The life time of the DrawController is roughly that + of ViewShellBase but note that the DrawController can (in the case of a + reload) outlive the ViewShellBase. + + The implementation of the XControllerManager interface is not yet in its + final form. +*/ +class SD_DLLPUBLIC DrawController final + : public DrawControllerInterfaceBase, + private BroadcastHelperOwner, + public ::cppu::OPropertySetHelper +{ +public: + enum PropertyHandle { + PROPERTY_WORKAREA = 0, + PROPERTY_SUB_CONTROLLER = 1, + PROPERTY_CURRENTPAGE = 2, + PROPERTY_MASTERPAGEMODE = 3, + PROPERTY_LAYERMODE = 4, + PROPERTY_ACTIVE_LAYER = 5, + PROPERTY_ZOOMTYPE = 6, + PROPERTY_ZOOMVALUE = 7, + PROPERTY_VIEWOFFSET = 8, + PROPERTY_DRAWVIEWMODE = 9 + ,PROPERTY_UPDATEACC = 10 + ,PROPERTY_PAGE_CHANGE = 11 + }; + + /** Create a new DrawController object for the given ViewShellBase. + */ + explicit DrawController (ViewShellBase& rBase) noexcept; + + virtual ~DrawController() noexcept override; + + /** Replace the currently used sub controller with the given one. This + new sub controller is used from now on for the view (that is the + main view shell to be precise) specific tasks. Call this method + with a suitable sub controller whenever the view shell in the center + pane is exchanged. + @param pSubController + The ViewShell specific sub controller or NULL when (temporarily + while switching to another one) there is no ViewShell displayed + in the center pane. + */ + void SetSubController ( + const css::uno::Reference& rxSubController); + + /** Call this method when the VisArea has changed. + */ + void FireVisAreaChanged (const ::tools::Rectangle& rVisArea) noexcept; + + /** Call this method when the selection has changed. + */ + void FireSelectionChangeListener() noexcept; + + /** Call this method when the edit mode has changed. + */ + void FireChangeEditMode (bool bMasterPageMode) noexcept; + + /** Call this method when the layer mode has changed. + */ + void FireChangeLayerMode (bool bLayerMode) noexcept; + + /** Call this method when there is a new current page. + */ + void FireSwitchCurrentPage (SdPage* pCurrentPage) noexcept; + + /** Broadcast a sidebar context change that is caused by a view + switch. + */ + void BroadcastContextChange() const; + void NotifyAccUpdate(); + void fireChangeLayer( css::uno::Reference< css::drawing::XLayer>* pCurrentLayer ) noexcept; + // change the parameter to int + //void fireSwitchCurrentPage( String pageName) throw(); + void fireSwitchCurrentPage( sal_Int32 pageIndex) noexcept; + bool IsDisposing() const { return mbDisposing; } + + /** Return a pointer to the ViewShellBase object that the DrawController + is connected to. + @return + The returned pointer is after a call to + ReleaseViewShellBase(). + */ + ViewShellBase* GetViewShellBase() { return mpBase;} + + /** This method is typically called from the destructor of ViewShellBase + to tell the DrawController that it and its members must not access + the ViewShellBase anymore. + After this call the DrawController is semi-disposed. + */ + void ReleaseViewShellBase(); + + DECLARE_XINTERFACE() + DECLARE_XTYPEPROVIDER() + + // XComponent + virtual void SAL_CALL dispose() override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; + + // XController + virtual sal_Bool SAL_CALL suspend( sal_Bool Suspend ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XSelectionSupplier + virtual sal_Bool SAL_CALL select( const css::uno::Any& aSelection ) override; + virtual css::uno::Any SAL_CALL getSelection( ) override; + virtual void SAL_CALL addSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override; + virtual void SAL_CALL removeSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + + // XFormLayerAccess + virtual css::uno::Reference< css::form::runtime::XFormController > SAL_CALL getFormController( const css::uno::Reference< css::form::XForm >& Form ) override; + virtual sal_Bool SAL_CALL isFormDesignMode( ) override; + virtual void SAL_CALL setFormDesignMode( sal_Bool DesignMode ) override; + + // XControlAccess + virtual css::uno::Reference< css::awt::XControl > SAL_CALL getControl( const css::uno::Reference< css::awt::XControlModel >& xModel ) override; + + // XDrawView + virtual void SAL_CALL + setCurrentPage ( + const css::uno::Reference< + css::drawing::XDrawPage >& xPage) override; + + virtual css::uno::Reference< + css::drawing::XDrawPage > SAL_CALL + getCurrentPage() override; + + // lang::XEventListener + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + // view::XSelectionChangeListener + virtual void SAL_CALL + selectionChanged (const css::lang::EventObject& rEvent) override; + + // XControllerManager + + virtual css::uno::Reference SAL_CALL + getConfigurationController() override; + + virtual css::uno::Reference SAL_CALL + getModuleController() override; + +private: + /** This method must return the name to index table. This table + contains all property names and types of this object. + */ + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + + static void FillPropertyTable ( + ::std::vector< css::beans::Property>& rProperties); + + /** + * The same as getFastPropertyValue, but return the value through + * rValue and nHandle is always valid. + */ + virtual void SAL_CALL getFastPropertyValue( + css::uno::Any& rValue, + sal_Int32 nHandle ) const override; + + /** Convert the value rValue and return the result in rConvertedValue and the + old value in rOldValue. + After this call the vetoable listeners are notified. + + @param rConvertedValue + The converted value. Only set if return is true. + @param rOldValue + The old value. Only set if return is true. + @param nHandle + The handle of the property. + @return + if the value is converted successfully. + @throws IllegalArgumentException + */ + virtual sal_Bool SAL_CALL convertFastPropertyValue( + css::uno::Any & rConvertedValue, + css::uno::Any & rOldValue, + sal_Int32 nHandle, + const css::uno::Any& rValue ) override; + + /** The same as setFastPropertyValue, but no exception is thrown and nHandle + is always valid. You must not broadcast the changes in this method. + */ + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const css::uno::Any& rValue ) override; + + /** When the called object has been disposed already this method throws + a Disposed exception and does not return. + + @throws css::lang::DisposedException + */ + void ThrowIfDisposed() const; + + using cppu::OPropertySetHelper::disposing; + using cppu::OPropertySetHelper::getFastPropertyValue; + + css::uno::Reference< css::drawing::XLayer>* mpCurrentLayer; + + const css::uno::Type m_aSelectionTypeIdentifier; + + /** This pointer to the ViewShellBase can be NULL (after a call to + ReleaseViewShellBase()). + */ + ViewShellBase* mpBase; + + ::tools::Rectangle maLastVisArea; + ::unotools::WeakReference mpCurrentPage; + bool mbMasterPageMode; + bool mbLayerMode; + + /** This flag indicates whether the called DrawController is being + disposed or already has been disposed. + */ + bool mbDisposing; + + ::std::unique_ptr< ::cppu::IPropertyArrayHelper> mpPropertyArrayHelper; + + /** The current sub controller. May be NULL. + */ + css::uno::Reference mxSubController; + + rtl::Reference mxConfigurationController; + rtl::Reference mxModuleController; + + /** Send an event to all relevant property listeners that a + property has changed its value. The fire() method of the + OPropertySetHelper is wrapped by this method to handle + exceptions thrown by called listeners. + */ + void FirePropertyChange ( + sal_Int32 nHandle, + const css::uno::Any& rNewValue, + const css::uno::Any& rOldValue); + + void ProvideFrameworkControllers(); + void DisposeFrameworkControllers(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/DrawDocShell.hxx b/sd/source/ui/inc/DrawDocShell.hxx new file mode 100644 index 0000000000..b53debc7dc --- /dev/null +++ b/sd/source/ui/inc/DrawDocShell.hxx @@ -0,0 +1,236 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include "fupoor.hxx" + +class FontList; +class SdDrawDocument; +class SdPage; +class SfxPrinter; +struct SpellCallbackInfo; +class AbstractSvxNameDialog; +class SfxUndoManager; + +namespace sd { + +class FrameView; +class ViewShell; +class DrawViewShell; + +// DrawDocShell +class SD_DLLPUBLIC DrawDocShell : public SfxObjectShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDDRAWDOCSHELL) + SFX_DECL_OBJECTFACTORY(); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + DrawDocShell ( + SfxObjectCreateMode eMode, + bool bSdDataObj, + DocumentType); + + DrawDocShell ( + SfxModelFlags nModelCreationFlags, + bool bSdDataObj, + DocumentType); + + DrawDocShell ( + SdDrawDocument* pDoc, + SfxObjectCreateMode eMode, + bool bSdDataObj, + DocumentType); + virtual ~DrawDocShell() override; + + void UpdateRefDevice(); + virtual void Activate( bool bMDI ) override; + virtual void Deactivate( bool bMDI ) override; + virtual bool InitNew( const css::uno::Reference< css::embed::XStorage >& xStorage ) override; + virtual bool ImportFrom(SfxMedium &rMedium, + css::uno::Reference const& xInsertPosition) + override; + virtual bool ConvertFrom( SfxMedium &rMedium ) override; + virtual bool Save() override; + virtual bool SaveAsOwnFormat( SfxMedium& rMedium ) override; + virtual bool ConvertTo( SfxMedium &rMedium ) override; + virtual bool SaveCompleted( const css::uno::Reference< css::embed::XStorage >& xStorage ) override; + + virtual bool Load( SfxMedium &rMedium ) override; + virtual bool LoadFrom( SfxMedium& rMedium ) override; + virtual bool SaveAs( SfxMedium &rMedium ) override; + + virtual ::tools::Rectangle GetVisArea(sal_uInt16 nAspect) const override; + virtual void Draw(OutputDevice*, const JobSetup& rSetup, sal_uInt16 nAspect, bool bOutputForScreen) override; + virtual SfxUndoManager* GetUndoManager() override; + virtual Printer* GetDocumentPrinter() override; + virtual void OnDocumentPrinterChanged(Printer* pNewPrinter) override; + virtual SfxStyleSheetBasePool* GetStyleSheetPool() override; + virtual void FillClass(SvGlobalName* pClassName, SotClipboardFormatId* pFormat, OUString* pFullTypeName, sal_Int32 nFileFormat, bool bTemplate = false ) const override; + virtual void SetModified( bool = true ) override; + virtual std::shared_ptr CreateDocumentInfoDialog(weld::Window* pParent, + const SfxItemSet &rSet) override; + + using SfxObjectShell::GetVisArea; + using SfxShell::GetViewShell; + + sd::ViewShell* GetViewShell() { return mpViewShell; } + ::sd::FrameView* GetFrameView(); + + SdDrawDocument* GetDoc() { return mpDoc;} + DocumentType GetDocumentType() const { return meDocType; } + + SfxPrinter* GetPrinter(bool bCreate); + void SetPrinter(SfxPrinter *pNewPrinter); + void UpdateFontList(); + + bool IsInDestruction() const { return mbInDestruction; } + + void CancelSearching(); + + void Execute( SfxRequest& rReq ); + void GetState(SfxItemSet&); + + void Connect(sd::ViewShell* pViewSh); + void Disconnect(sd::ViewShell const * pViewSh); + void UpdateTablePointers(); + + void GotoBookmark(std::u16string_view rBookmark); + + BitmapEx GetPagePreviewBitmap(SdPage* pPage); + + /** checks, if the given name is a valid new name for a slide + +

If the name is invalid, an SvxNameDialog pops up that + queries again for a new name until it is ok or the user chose + Cancel.

+ + @param pWin is necessary to pass to the SvxNameDialog in + case an invalid name was entered. + @param rName the new name that is to be set for a slide. This string + may be set to an empty string (see below). + + @return sal_True, if the new name is unique. Note that if the user entered + a default name of a not-yet-existing slide (e.g. 'Slide 17'), + sal_True is returned, but rName is set to an empty string. + */ + bool CheckPageName(weld::Window* pWin, OUString& rName ); + + void SetSlotFilter(bool bEnable = false, std::span pSIDs = std::span()) { mbFilterEnable = bEnable; mpFilterSIDs = pSIDs; } + void ApplySlotFilter() const; + + SfxStyleFamily GetStyleFamily() const { return mnStyleFamily; } + void SetStyleFamily( SfxStyleFamily nSF ) { mnStyleFamily = nSF; } + + /** executes the SID_OPENDOC slot to let the framework open a document + with the given URL and this document as a referer */ + void OpenBookmark( const OUString& rBookmarkURL ); + + /** checks, if the given name is a valid new name for a slide + +

This method does not pop up any dialog (like CheckPageName).

+ + @param rInOutPageName the new name for a slide that is to be renamed. + This string will be set to an empty string if + bResetStringIfStandardName is true and the name is of the + form of any, possibly not-yet existing, standard slide + (e.g. 'Slide 17') + + @param bResetStringIfStandardName if true allows setting rInOutPageName + to an empty string, which returns true and implies that the + slide will later on get a new standard name (with a free + slide number). + + @return true, if the new name is unique. If bResetStringIfStandardName + is true, the return value is also true, if the slide name is + a standard name (see above) + */ + bool IsNewPageNameValid( OUString & rInOutPageName, bool bResetStringIfStandardName = false ); + + /** checks, if the given name is a *unique* name for an *existing* slide + + @param rPageName the name of an existing slide + + @return true, if the name is unique and the slide exists + */ + bool IsPageNameUnique(std::u16string_view rPagName) const; + + /** Return the reference device for the current document. When the + inherited implementation returns a device then this is passed to the + caller. Otherwise the returned value depends on the printer + independent layout mode and will usually be either a printer or a + virtual device used for screen rendering. + @return + Returns NULL when the current document has no reference device. + */ + virtual OutputDevice* GetDocumentRefDev() override; + + DECL_DLLPRIVATE_LINK( RenameSlideHdl, AbstractSvxNameDialog&, bool ); + + // ExecuteSpellPopup now handled by DrawDocShell + DECL_DLLPRIVATE_LINK( OnlineSpellCallback, SpellCallbackInfo&, void ); + + void ClearUndoBuffer(); + + std::shared_ptr GetThemeColors() override; + +private: + static void setEditMode(DrawViewShell* pDrawViewShell, bool isMasterPage); + void Construct(bool bClipboard); + + SdDrawDocument* mpDoc; + std::unique_ptr mpUndoManager; + VclPtr mpPrinter; + ::sd::ViewShell* mpViewShell; + std::unique_ptr mpFontList; + DocumentType meDocType; + SfxStyleFamily mnStyleFamily; + std::span + mpFilterSIDs; + bool mbFilterEnable; + bool mbSdDataObj; + bool mbInDestruction; + bool mbOwnPrinter; + bool mbOwnDocument; // if true, we own mpDoc and will delete it in our d'tor +}; + +#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED +#define SV_DECL_DRAW_DOC_SHELL_DEFINED +typedef ::tools::SvRef DrawDocShellRef; +#endif + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/DrawSubController.hxx b/sd/source/ui/inc/DrawSubController.hxx new file mode 100644 index 0000000000..5748617868 --- /dev/null +++ b/sd/source/ui/inc/DrawSubController.hxx @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd { + + class DrawSubControllerInterfaceBase : public ::comphelper::WeakComponentImplHelper< + css::drawing::XDrawSubController, + css::lang::XServiceInfo > + { + public: + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override = 0; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override = 0; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override = 0; + }; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/DrawViewShell.hxx b/sd/source/ui/inc/DrawViewShell.hxx new file mode 100644 index 0000000000..3043ba007b --- /dev/null +++ b/sd/source/ui/inc/DrawViewShell.hxx @@ -0,0 +1,505 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "ViewShell.hxx" +#include "tools/AsynchronousCall.hxx" +#include "TabControl.hxx" +#include +#include +#include +#include +#include +#include + +namespace svx::sidebar { class SelectionChangeHandler; } +namespace com::sun::star::lang { class XEventListener; } +namespace com::sun::star::scanner { class XScannerManager2; } + +class Outliner; +class SdPage; +class SdStyleSheet; +class SdrExternalToolEdit; +class TabBar; +class SdrObject; +class SdrPageView; +class TransferableDataHelper; +class TransferableClipboardListener; +class AbstractSvxNameDialog; +class SdrLayer; +class SvxClipboardFormatItem; +struct ESelection; +class AbstractSvxObjectNameDialog; + +namespace sd { + +class DrawView; +class LayerTabBar; +class Ruler; +class AnnotationManager; +class ViewOverlayManager; + +#define CHECK_RANGE(nMin, nValue, nMax) ((nValue >= nMin) && (nValue <= nMax)) + +/** Base class of the stacked shells that provide graphical views to + Draw and Impress documents and editing functionality. In contrast + to this other stacked shells are responsible for showing an + overview over several slides or a textual + overview over the text in an Impress document (OutlineViewShell). +*/ +class SAL_DLLPUBLIC_RTTI DrawViewShell + : public ViewShell, + public SfxListener, + public utl::ConfigurationListener +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDDRAWVIEWSHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + /** Create a new stackable shell that may take some information + (e.g. the frame view) from the given previous shell. + @param ePageKind + This parameter gives the initial page kind that the new shell + will show. + @param pFrameView + The frame view that makes it possible to pass information from + one view shell to the next. + */ + DrawViewShell ( + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + PageKind ePageKind, + FrameView* pFrameView); + + virtual ~DrawViewShell() override; + + virtual void Init (bool bIsMainViewShell) override; + + virtual void Shutdown() override; + + void PrePaint() override; + virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override; + + /** Arrange and resize the GUI elements like rulers, sliders, and + buttons as well as the actual document view according to the size of + the enclosing window and current sizes of buttons, rulers, and + sliders. + */ + virtual void ArrangeGUIElements() override; + + void HidePage(); + + virtual bool KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin) override; + virtual void MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin) override; + virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) override; + virtual void MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin) override; + virtual void Command(const CommandEvent& rCEvt, ::sd::Window* pWin) override; + bool IsMouseButtonDown() const { return mbMouseButtonDown; } + bool IsMouseSelecting() const { return mbMouseSelecting; } + + virtual void Resize() override; + + void ShowMousePosInfo(const ::tools::Rectangle& rRect, ::sd::Window const * pWin); + + virtual void ChangeEditMode (EditMode eMode, bool bIsLayerModeActive); + + virtual void SetZoom( ::tools::Long nZoom ) override; + virtual void SetZoomRect( const ::tools::Rectangle& rZoomRect ) override; + + void InsertURLField(const OUString& rURL, const OUString& rText, const OUString& rTarget); + void InsertURLButton(const OUString& rURL, const OUString& rText, const OUString& rTarget, + const Point* pPos); + + void SelectionHasChanged(); + void ModelHasChanged(); + virtual void Activate(bool bIsMDIActivate) override; + virtual void Deactivate(bool IsMDIActivate) override; + virtual void UIActivating( SfxInPlaceClient* ) override; + virtual void UIDeactivated( SfxInPlaceClient* ) override; + OUString GetSelectionText( bool bCompleteWords ); + bool HasSelection( bool bText ) const; + + //If we are editing a PresObjKind::Outline return the Outliner and fill rSel + //with the current selection + ::Outliner* GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel); + + void ExecCtrl(SfxRequest& rReq); + void GetCtrlState(SfxItemSet& rSet); + void GetDrawAttrState(SfxItemSet& rSet); + void GetMenuState(SfxItemSet& rSet); + void GetTableMenuState(SfxItemSet& rSet); + /** Set the items of the given item set that are related to + switching the editing mode to the correct values. +

This function also sets the states of the mode buttons + (those at the upper right corner) accordingly.

+ */ + void GetModeSwitchingMenuState (SfxItemSet &rSet); + void GetAttrState(SfxItemSet& rSet); + void GetSnapItemState(SfxItemSet& rSet); + + void SetPageProperties (SfxRequest& rReq); + void GetPageProperties(SfxItemSet& rSet); + void GetMarginProperties(SfxItemSet& rSet); + + void GetState (SfxItemSet& rSet); + void Execute (SfxRequest& rReq); + + void ExecStatusBar(SfxRequest& rReq); + void GetStatusBarState(SfxItemSet& rSet); + + void ExecOptionsBar(SfxRequest& rReq); + void GetOptionsBarState(SfxItemSet& rSet); + + void ExecRuler(SfxRequest& rReq); + void GetRulerState(SfxItemSet& rSet); + + void ExecFormText(SfxRequest& rReq); + void GetFormTextState(SfxItemSet& rSet); + + void ExecAnimationWin(SfxRequest& rReq); + void GetAnimationWinState(SfxItemSet& rSet); + + void ExecNavigatorWin(SfxRequest& rReq); + void GetNavigatorWinState(SfxItemSet& rSet); + + void ExecutePropPanelAttr (SfxRequest const & rReq); + void GetStatePropPanelAttr(SfxItemSet& rSet); + + void ExecEffectWin(SfxRequest& rReq); + + void Update3DWindow(); + void AssignFrom3DWindow(); + + void ExecGallery(SfxRequest const & rReq); + + void ExecBmpMask( SfxRequest const & rReq ); + void GetBmpMaskState( SfxItemSet& rSet ); + + void ExecIMap( SfxRequest const & rReq ); + void GetIMapState( SfxItemSet& rSet ); + + void FuTemporary(SfxRequest& rReq); + void FuPermanent(SfxRequest& rReq); + void FuSupport(SfxRequest& rReq); + void FuDeleteSelectedObjects(); + void FuSupportRotate(SfxRequest const & rReq); + void FuTable(SfxRequest& rReq); + + void AttrExec (SfxRequest& rReq); + void AttrState (SfxItemSet& rSet); + + void ExecGoToNextPage (SfxRequest& rReq); + void GetStateGoToNextPage (SfxItemSet& rSet); + + void ExecGoToPreviousPage (SfxRequest& rReq); + void GetStateGoToPreviousPage (SfxItemSet& rSet); + + void ExecGoToFirstPage (SfxRequest& rReq); + void GetStateGoToFirstPage (SfxItemSet& rSet); + + void ExecGoToLastPage (SfxRequest& rReq); + void GetStateGoToLastPage (SfxItemSet& rSet); + + SD_DLLPUBLIC void ExecChar(SfxRequest& rReq); + + void ExecuteAnnotation (SfxRequest const & rRequest); + void GetAnnotationState (SfxItemSet& rItemSet); + + void StartRulerDrag (const Ruler& rRuler, const MouseEvent& rMEvt); + + virtual bool PrepareClose( bool bUI = true ) override; + + PageKind GetPageKind() const { return mePageKind; } + void SetPageKind( PageKind ePageKind ) { mePageKind = ePageKind; } + const Point& GetMousePos() const { return maMousePos; } + + EditMode GetEditMode() const { return meEditMode; } + virtual SdPage* GetActualPage() override { return mpActualPage; } + + /// inherited from sd::ViewShell + virtual SdPage* getCurrentPage() const override; + + void ResetActualPage(); + void ResetActualLayer(); + bool SwitchPage(sal_uInt16 nPage, bool bAllowChangeFocus = true); + bool IsSwitchPageAllowed() const; + + /** + * Mark the desired page as selected (1), deselected (0), toggle (2). + * nPage refers to the page in question. + */ + bool SelectPage(sal_uInt16 nPage, sal_uInt16 nSelect); + bool IsSelected(sal_uInt16 nPage); + + void GotoBookmark(std::u16string_view rBookmark); + //Realize multi-selection of objects, If object is marked, the + //corresponding entry is set true, else the corresponding entry is set + //false. + void FreshNavigatrTree(); + void MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin); + + virtual void ReadFrameViewData(FrameView* pView) override; + virtual void WriteFrameViewData() override; + + virtual ErrCode DoVerb(sal_Int32 nVerb) override; + virtual bool ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb) override; + + void SetZoomOnPage( bool bZoom ) { mbZoomOnPage = bZoom; } + bool IsZoomOnPage() const { return mbZoomOnPage; } + static void CheckLineTo (SfxRequest& rReq); + void SetChildWindowState( SfxItemSet& rSet ); + + void UpdateIMapDlg( SdrObject* pObj ); + + void LockInput(); + void UnlockInput(); + bool IsInputLocked() const { return mnLockCount > 0; } + + sal_uInt16 GetCurPagePos() const { return maTabControl->GetCurPagePos(); } + + /** Show controls of the UI or hide them, depending on the given flag. + Do not call this method directly. Call the method at ViewShellBase + instead. + */ + virtual void ShowUIControls (bool bVisible) override; + + void ScannerEvent(); + + bool IsLayerModeActive() const { return mbIsLayerModeActive;} + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ) override; + + virtual void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& ) override; + virtual void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& ) override; + + virtual void VisAreaChanged(const ::tools::Rectangle& rRect) override; + + /** Create an accessible object representing the specified window. + @param pWindow + The returned object makes the document displayed in this window + accessible. + @return + Returns an AccessibleDrawDocumentView object. + */ + virtual css::uno::Reference + CreateAccessibleDocumentView (::sd::Window* pWindow) override; + + /** Return the number of layers managed by the layer tab control. This + will usually differ from the number of layers managed by the layer + administrator. + @return + The number of layers managed by the layer tab control. The + returned value is independent of whether the layer mode is + currently active and the tab control is visible. + */ + int GetTabLayerCount() const; + + /** Return the numerical id of the currently active layer as seen by the + layer tab control. + @return + The returned id is a number between zero (inclusive) and the + number of layers as returned by the + GetTabLayerCount method (exclusive). + */ + int GetActiveTabLayerIndex() const; + + /** Set the active layer at the layer tab control and update the control + accordingly to reflect the change on screen. + @param nId + The id is expected to be a number between zero (inclusive) and + the number of layers as returned by the + GetTabLayerCount method (exclusive). Note that + Invalid values are ignored. No exception is thrown in that case. + */ + void SetActiveTabLayerIndex (int nId); + + /** Return a pointer to the tab control for pages. + */ + TabControl& GetPageTabControl() { return *maTabControl; } + + /** Return a pointer to the tab control for layers. + */ + SD_DLLPUBLIC LayerTabBar* GetLayerTabControl(); // export for unit test + + /** Renames the given slide using an SvxNameDialog + + @param nPageId the index of the page in the SdTabControl. + @param rName the new name of the slide. + + @return false, if the new name is invalid for some reason. + +

Implemented in drviews8.cxx.

+ */ + bool RenameSlide( sal_uInt16 nPageId, const OUString & rName ); + + /** modifies the given layer with the given values */ + void ModifyLayer( SdrLayer* pLayer, const OUString& rLayerName, const OUString& rLayerTitle, const OUString& rLayerDesc, bool bIsVisible, bool bIsLocked, bool bIsPrintable ); + + virtual css::uno::Reference CreateSubController() override; + + DrawView* GetDrawView() const { return mpDrawView.get(); } + + /** Relocation to a new parent window is not supported for DrawViewShell + objects so this method always returns . + */ + virtual bool RelocateToParentWindow (vcl::Window* pParentWindow) override; + + OUString const & GetSidebarContextName() const; + + bool IsInSwitchPage() const { return mbIsInSwitchPage; } + + const SdViewOptions& GetViewOptions() const { return maViewOptions; } + //move this method to ViewShell. + //void NotifyAccUpdate(); +protected: + DECL_DLLPRIVATE_LINK( ClipboardChanged, TransferableDataHelper*, void ); + DECL_DLLPRIVATE_LINK( TabSplitHdl, TabBar *, void ); + DECL_DLLPRIVATE_LINK( NameObjectHdl, AbstractSvxObjectNameDialog&, bool ); + DECL_DLLPRIVATE_LINK( RenameSlideHdl, AbstractSvxNameDialog&, bool ); + + void DeleteActualPage(); + void DeleteActualLayer(); + + virtual VclPtr CreateHRuler(::sd::Window* pWin) override; + virtual VclPtr CreateVRuler(::sd::Window* pWin) override; + virtual void UpdateHRuler() override; + virtual void UpdateVRuler() override; + virtual void SetZoomFactor(const Fraction& rZoomX, const Fraction& rZoomY) override; + + void SetupPage( Size const &rSize, ::tools::Long nLeft, ::tools::Long nRight, ::tools::Long nUpper, ::tools::Long nLower, + bool bSize, bool bMargin, bool bScaleAll ); + + void GetMenuStateSel(SfxItemSet& rSet); + +private: + DrawViewShell(const DrawViewShell&) = delete; + DrawViewShell& operator=(const DrawViewShell&) = delete; + + void Construct (DrawDocShell* pDocSh, PageKind ePageKind); + + void ImplDestroy(); + + /** Depending on the given request create a new page or duplicate an + existing one. See ViewShell::CreateOrDuplicatePage() for more + information. + */ + virtual SdPage* CreateOrDuplicatePage ( + SfxRequest& rRequest, + PageKind ePageKind, + SdPage* pPage, + const sal_Int32 nInsertPosition = -1) override; + + void DuplicateSelectedSlides (SfxRequest& rRequest); + + virtual void Notify (SfxBroadcaster& rBC, const SfxHint& rHint) override; + + /** Stop a running slide show. + */ + void StopSlideShow(); + + /** Show the context menu for snap lines and points. Because snap lines + can not be selected the index of the snap line/point for which the + popup menu is opened has to be passed to the processing slot + handlers. This can be done only by manually showing the popup menu. + @param pParent + The parent for the context menu. + @param rRect + The location at which to display the context menu. + @param rPageView + The page view is used to access the help lines. + @param nSnapLineIndex + Index of the snap line or snap point for which to show the + context menu. + */ + void ShowSnapLineContextMenu(weld::Window* pParent, const ::tools::Rectangle& rRect, + SdrPageView& rPageView, const sal_uInt16 nSnapLineIndex); + + using ViewShell::Notify; + + virtual void ConfigurationChanged( utl::ConfigurationBroadcaster* pCb, ConfigurationHints ) override; + + void ConfigureAppBackgroundColor( svtools::ColorConfig* pColorConfig = nullptr ); + + /// return true if "Edit Hyperlink" in context menu should be disabled + bool ShouldDisableEditHyperlink() const; + +private: + std::unique_ptr mpDrawView; + SdPage* mpActualPage; + ::tools::Rectangle maMarkRect; + Point maMousePos; + VclPtr maTabControl; + EditMode meEditMode; + PageKind mePageKind; + bool mbZoomOnPage; + bool mbIsRulerDrag; + sal_uLong mnLockCount; + bool mbReadOnly; + static bool mbPipette; + /** Prevents grabbing focus while loading - see tdf#83773 that introduced + the grabbing, and tdf#150773 that needs grabbing disabled on loading + */ + bool mbFirstTimeActivation = true; + /** This flag controls whether the layer mode is active, i.e. the layer + dialog is visible. + */ + bool mbIsLayerModeActive; + /** This item contains the clipboard formats of the current clipboard + content that are supported both by that content and by the + DrawViewShell. + */ + ::std::unique_ptr mpCurrentClipboardFormats; + /** On some occasions it is necessary to make SwitchPage calls + asynchronously. + */ + tools::AsynchronousCall maAsynchronousSwitchPageCall; + /** This flag is used to prevent nested calls to SwitchPage(). + */ + bool mbIsInSwitchPage; + RotateTransliteration m_aRotateCase; + /** Listen for selection changes and broadcast context changes for the sidebar. + */ + ::rtl::Reference mpSelectionChangeHandler; + css::uno::Reference< css::scanner::XScannerManager2 > mxScannerManager; + css::uno::Reference< css::lang::XEventListener > mxScannerListener; + rtl::Reference mxClipEvtLstnr; + bool mbPastePossible; + bool mbMouseButtonDown; + bool mbMouseSelecting; + ::std::unique_ptr< AnnotationManager > mpAnnotationManager; + ::std::unique_ptr< ViewOverlayManager > mpViewOverlayManager; + std::vector> m_ExternalEdits; + SdViewOptions maViewOptions; +}; + + /// Merge the background properties together and deposit the result in rMergeAttr + void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr); + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/EventMultiplexer.hxx b/sd/source/ui/inc/EventMultiplexer.hxx new file mode 100644 index 0000000000..d6d79d11b2 --- /dev/null +++ b/sd/source/ui/inc/EventMultiplexer.hxx @@ -0,0 +1,172 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +template class Link; + +namespace sd +{ +class ViewShellBase; +} + +enum class EventMultiplexerEventId +{ + /** The EventMultiplexer itself is being disposed. Called for a live + EventMultiplexer. Removing a listener as response is not necessary, + though. + */ + Disposing, + + /** The selection in the center pane has changed. + */ + EditViewSelection, + + /** The selection in the slide sorter has changed, regardless of whether + the slide sorter is displayed in the left pane or the center pane. + */ + SlideSortedSelection, + + /** The current page has changed. + */ + CurrentPageChanged, + + /** The current MainViewShell (the ViewShell displayed in the center + pane) has been removed. + */ + MainViewRemoved, + + /** A new ViewShell has been made the MainViewShell. + */ + MainViewAdded, + + /** A new ViewShell is being displayed in one of the panes. Note that + for the ViewShell in the center pane both this event type and + EventId::MainViewAdded is broadcasted. + */ + ViewAdded, + + /** Edit mode was (or is being) switched to normal mode. Find + EventId::EditModeMaster below. + */ + EditModeNormal, + + /** One or more pages have been inserted into or deleted from the model. + */ + PageOrder, + + /** Text editing in one of the shapes in the MainViewShell has started. + */ + BeginTextEdit, + + /** Text editing in one of the shapes in the MainViewShell has ended. + */ + EndTextEdit, + + /** A UNO controller has been attached to the UNO frame. + */ + ControllerAttached, + + /** A UNO controller has been detached to the UNO frame. + */ + ControllerDetached, + + /** The state of a shape has changed. The page is available in the user data. + */ + ShapeChanged, + + /** A shape has been inserted to a page. The page is available in the + user data. + */ + ShapeInserted, + + /** A shape has been removed from a page. The page is available in the + user data. + */ + ShapeRemoved, + + /** A configuration update has been completed. + */ + ConfigurationUpdated, + + /** Edit mode was (or is being) switched to master mode. + */ + EditModeMaster, +}; + +namespace sd::tools +{ +class EventMultiplexerEvent +{ +public: + EventMultiplexerEventId meEventId; + const void* mpUserData; + + EventMultiplexerEvent(EventMultiplexerEventId eEventId, const void* pUserData); +}; + +/** This convenience class makes it easy to listen to various events that + originally are broadcasted via different channels. + + There is usually one EventMultiplexer instance per ViewShellBase(). + Call the laters GetEventMultiplexer() method to get access to that + instance. +*/ +class EventMultiplexer +{ +public: + /** Create new EventMultiplexer for the given ViewShellBase object. + */ + EventMultiplexer(ViewShellBase& rBase); + ~EventMultiplexer(); + + /** Add an event listener that will be informed about the specified + event types. + @param rCallback + The callback to call as soon as one of the event specified by + aEventTypeSet is received by the EventMultiplexer. + */ + void AddEventListener(const Link& rCallback); + + /** Remove an event listener for the specified event types. + */ + void RemoveEventListener(const Link& rCallback); + + /** This method is used for out-of-line events. An event of the + specified type will be sent to all listeners that are registered for + that type. + @param eEventId + The type of the event. + @param pUserData + Some data sent to the listeners along with the event. + */ + void MultiplexEvent(EventMultiplexerEventId eEventId, void const* pUserData); + +private: + class Implementation; + rtl::Reference mpImpl; +}; + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/FormShellManager.hxx b/sd/source/ui/inc/FormShellManager.hxx new file mode 100644 index 0000000000..08e31b98ff --- /dev/null +++ b/sd/source/ui/inc/FormShellManager.hxx @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShellManager.hxx" + +#include +#include +#include + +class VclWindowEvent; +class FmFormShell; +namespace vcl +{ +class Window; +} + +namespace sd::tools +{ +class EventMultiplexerEvent; +} + +namespace sd +{ +class ViewShellBase; + +/** This simple class is responsible for putting the form shell above or + below the main view shell on the shell stack maintained by the ObjectBarManager. + + The form shell is moved above the view shell when the form shell is + activated, i.e. the FormControlActivated handler is called. + + It is moved below the view shell when the main window of the + main view shell is focused. + + The form shell is created and destroyed by the ViewShellManager by using + a factory object provided by the FormShellManager. +*/ +class FormShellManager final : public SfxListener +{ +public: + FormShellManager(ViewShellBase& rBase); + virtual ~FormShellManager() override; + + /** Typically called by a ShellFactory. It tells the + FormShellManager which form shell to manage. + @param pFormShell + This may be to disconnect the ViewShellManager from the + form shell. + */ + void SetFormShell(FmFormShell* pFormShell); + + /** Return the form shell last set with SetFormShell(). + @return + The result may be when the SetFormShell() method has not + yet been called or was last called with . + */ + FmFormShell* GetFormShell() { return mpFormShell; } + +private: + ViewShellBase& mrBase; + + /** Ownership of the form shell lies with the ViewShellManager. This + reference is kept so that the FormShellManager can detect when a new + form shell is passed to SetFormShell(). + */ + FmFormShell* mpFormShell; + + /** Remember whether the form shell is currently above or below the main + view shell. + */ + bool mbFormShellAboveViewShell; + + /** The factory is remembered so that it removed from the + ViewShellManager when the FormShellManager is destroyed. + */ + ViewShellManager::SharedShellFactory mpSubShellFactory; + + bool mbIsMainViewChangePending; + + VclPtr mpMainViewShellWindow; + + /** Register at window of center pane and at the form shell that + represents the form tool bar. The former informs this manager about + the deselection of the form shell. The later informs about its + selection. + */ + void RegisterAtCenterPane(); + + /** Unregister the listeners that were registered in + RegisterAtCenterPane(). + */ + void UnregisterAtCenterPane(); + + /** This call back is called by the application window (among others) + when the window gets the focus. In this case the form shell is + moved to the bottom of the shell stack. + */ + DECL_LINK(WindowEventHandler, VclWindowEvent&, void); + + /** This call back is called when view in the center pane is replaced. + When this happens then we unregister at the window of the old and + register at the window of the new shell. + */ + DECL_LINK(ConfigurationUpdateHandler, ::sd::tools::EventMultiplexerEvent&, void); + + /** This call back is called by the form shell when it gets the focus. + In this case the form shell is moved to the top of the shell stack. + */ + DECL_LINK(FormControlActivated, LinkParamNone*, void); + + /** This method is called by the form shell when that is destroyed. It + acts as a last resort against referencing a dead form shell. With + the factory working properly this method should not be necessary + (and may be removed in the future.) + */ + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + + /** dtor body */ + void ImplDestroy(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/FrameView.hxx b/sd/source/ui/inc/FrameView.hxx new file mode 100644 index 0000000000..f2e839a81b --- /dev/null +++ b/sd/source/ui/inc/FrameView.hxx @@ -0,0 +1,213 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShell.hxx" +#include +#include + +class SdDrawDocument; +class SdOptions; + +namespace sd { + +/** + * View for MDIFrame + */ +class SD_DLLPUBLIC FrameView final + : public SdrView +{ +public: + FrameView(SdDrawDocument* pDrawDoc, FrameView* pFrameView = nullptr ); + FrameView(const FrameView& rFrameView); + virtual ~FrameView() override; + + void Connect(); + void Disconnect(); + + void Update(SdOptions const * pOptions); + + void SetStandardHelpLines(const SdrHelpLineList& rHelpLines) + { maStandardHelpLines = rHelpLines; } + const SdrHelpLineList& GetStandardHelpLines() const { return maStandardHelpLines; } + void SetNotesHelpLines(const SdrHelpLineList& rHelpLines) + { maNotesHelpLines = rHelpLines; } + const SdrHelpLineList& GetNotesHelpLines() const { return maNotesHelpLines; } + void SetHandoutHelpLines(const SdrHelpLineList& rHelpLines) + { maHandoutHelpLines = rHelpLines; } + const SdrHelpLineList& GetHandoutHelpLines() const { return maHandoutHelpLines; } + + void SetVisibleLayers(const SdrLayerIDSet& rVisibleLayers) + { maVisibleLayers = rVisibleLayers; } + const SdrLayerIDSet& GetVisibleLayers() const { return maVisibleLayers; } + + void SetLockedLayers(const SdrLayerIDSet& rLockedLayers) + { maLockedLayers = rLockedLayers; } + const SdrLayerIDSet& GetLockedLayers() const { return maLockedLayers; } + + void SetPrintableLayers(const SdrLayerIDSet& rPrintableLayers) + { maPrintableLayers = rPrintableLayers; } + const SdrLayerIDSet& GetPrintableLayers() const { return maPrintableLayers; } + + void SetRuler(const bool bRulerOn) + { mbRuler = bRulerOn; } + bool HasRuler() const { return mbRuler; } + + void SetNoColors(const bool bNoCol) + { mbNoColors = bNoCol; } + bool IsNoColors() const { return mbNoColors; } + + void SetNoAttribs(const bool bNoAttr) + { mbNoAttribs = bNoAttr; } + bool IsNoAttribs() const { return mbNoAttribs; } + + void SetVisArea(const ::tools::Rectangle& rVisArea) + { maVisArea = rVisArea; } + const ::tools::Rectangle& GetVisArea() const { return maVisArea; } + + void SetPageKind(PageKind eKind) { mePageKind = eKind; } + PageKind GetPageKind() const { return mePageKind; } + + /** is used in FrameView::ReadUserDataSequence() only to store the + page kind that was selected while last saving this document */ + void SetPageKindOnLoad(PageKind eKind) { mePageKindOnLoad = eKind; } + + /** can be used to get the page kind that was selected on last save of this document */ + PageKind GetPageKindOnLoad() const { return mePageKindOnLoad; } + + void SetSelectedPage (sal_uInt16 nPage); + sal_uInt16 GetSelectedPage () const { return mnSelectedPage;} + + /** is used in FrameView::ReadUserDataSequence() only to store the + page that was selected while last saving this document */ + void SetSelectedPageOnLoad (sal_uInt16 nPage) { mnSelectedPageOnLoad = nPage; } + + /** can be used to get the page that was selected on last save of this document */ + sal_uInt16 GetSelectedPageOnLoad () const { return mnSelectedPageOnLoad; } + + void SetViewShEditMode(EditMode eMode); + EditMode GetViewShEditMode () const; + + /** Remember the edit mode of the main view shell at the time when the + document is loaded. + */ + void SetViewShEditModeOnLoad (const EditMode eMode); + + /** Return the value of the edit mode as it was when the document was + loaded. + */ + EditMode GetViewShEditModeOnLoad() const { return meEditModeOnLoad;} + + void SetLayerMode(bool bMode) + { mbLayerMode = bMode; } + bool IsLayerMode() const { return mbLayerMode; } + + void SetQuickEdit(bool bQEdit) + { mbQuickEdit = bQEdit; } + bool IsQuickEdit() const { return mbQuickEdit; } + + void SetDoubleClickTextEdit( bool bOn ) { mbDoubleClickTextEdit = bOn; } + bool IsDoubleClickTextEdit() const { return mbDoubleClickTextEdit; } + + void SetClickChangeRotation( bool bOn ) { mbClickChangeRotation = bOn; } + bool IsClickChangeRotation() const { return mbClickChangeRotation; } + + /** Remember the type of the view shell that was (or soon will be) + previously associated with this frame view. + @param eType + The type of the previous view shell or ViewShell::ST_NONE to + indicate that there is no previous view shell. + */ + void SetPreviousViewShellType (ViewShell::ShellType eType); + + /** Return the type of the view shell previously associated with this + frame view. + */ + ViewShell::ShellType GetPreviousViewShellType() const { return mePreviousViewShellType;} + + /** Remember the type of the view shell at the time when the document is + loaded or, rather, when the ViewShellBase is constructed. + */ + void SetViewShellTypeOnLoad (ViewShell::ShellType eType); + + ViewShell::ShellType GetViewShellTypeOnLoad() const { return meViewShellTypeOnLoad;} + + void SetPresentationViewShellId(sal_uInt16 nId) + { mnPresViewShellId = nId; } + sal_uInt16 GetPresentationViewShellId() const { return mnPresViewShellId; } + + void SetSlidesPerRow(sal_uInt16 nSlides) { mnSlidesPerRow = nSlides; } + sal_uInt16 GetSlidesPerRow() const { return mnSlidesPerRow; } + + void SetDrawMode(DrawModeFlags nNewDrawMode) { mnDrawMode = nNewDrawMode; }; + DrawModeFlags GetDrawMode() const { return mnDrawMode; }; + + void SetIsNavigatorShowingAllShapes (const bool bIsNavigatorShowingAllShapes); + bool IsNavigatorShowingAllShapes() const { return mbIsNavigatorShowingAllShapes;} + + void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& ); + void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& ); + +private: + sal_uInt16 mnRefCount; + bool mbRuler; + SdrLayerIDSet maVisibleLayers; + SdrLayerIDSet maLockedLayers; + SdrLayerIDSet maPrintableLayers; + SdrHelpLineList maStandardHelpLines; + SdrHelpLineList maNotesHelpLines; + SdrHelpLineList maHandoutHelpLines; + bool mbNoColors; ///< structuring mode + bool mbNoAttribs; ///< structuring mode + ::tools::Rectangle maVisArea; ///< visible area + PageKind mePageKind; ///< kind of page (standard, notes, handout) + sal_uInt16 mnSelectedPage; + PageKind mePageKindOnLoad; + sal_uInt16 mnSelectedPageOnLoad; + EditMode mePageEditMode; ///< edit mode in drawing mode (Page/MasterPage) + // EditMode meStandardEditMode; ///< edit mode in drawing mode (Page/MasterPage) + // EditMode meNotesEditMode; ///< edit mode in notes mode (Page/MasterPage) + // EditMode meHandoutEditMode; ///< edit mode in handout mode (Page/MasterPage) + EditMode meEditModeOnLoad; + bool mbLayerMode; ///< layer on/off + bool mbQuickEdit; ///< QuickEdit on/off + bool mbDoubleClickTextEdit; ///< text mode after double click + bool mbClickChangeRotation; ///< single click switches between selection/rotation mode + sal_uInt16 mnPresViewShellId; ///< ViewShell from which the presentation was started + sal_uInt16 mnSlidesPerRow; ///< slides per row on the slide-desk + DrawModeFlags mnDrawMode; ///< draw mode for the normal window + /** Remember whether the navigator shows all shapes () or only + the names ones (). Not persistent. + */ + bool mbIsNavigatorShowingAllShapes; + + /** The type of the previous view shell. The (default) value + ViewShell::ST_NONE indicates that there was no previous view shell. + Note that this value is used only temporarily and is not saved or + restored. + */ + ViewShell::ShellType mePreviousViewShellType; + + ViewShell::ShellType meViewShellTypeOnLoad; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/GraphicDocShell.hxx b/sd/source/ui/inc/GraphicDocShell.hxx new file mode 100644 index 0000000000..64e7ed9061 --- /dev/null +++ b/sd/source/ui/inc/GraphicDocShell.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include "DrawDocShell.hxx" +#include +#include + +namespace sd +{ +/** + * document shell for draw documents + */ +class SD_DLLPUBLIC GraphicDocShell final : public DrawDocShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDGRAPHICDOCSHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + SFX_DECL_OBJECTFACTORY(); + + GraphicDocShell(SfxObjectCreateMode eMode); + + GraphicDocShell(SfxModelFlags nModelCreationFlags); + + virtual ~GraphicDocShell() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/GraphicObjectBar.hxx b/sd/source/ui/inc/GraphicObjectBar.hxx new file mode 100644 index 0000000000..7d53a86d2b --- /dev/null +++ b/sd/source/ui/inc/GraphicObjectBar.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd { + +class View; +class ViewShell; + +class GraphicObjectBar final + : public SfxShell +{ +public: + SFX_DECL_INTERFACE( SD_IF_SDDRAWGRAFOBJECTBAR ) + + GraphicObjectBar (const ViewShell* pSdViewShell, ::sd::View* pSdView); + virtual ~GraphicObjectBar() override; + + void GetAttrState( SfxItemSet& rSet ); + void Execute( SfxRequest& rReq ); + + void GetFilterState( SfxItemSet& rSet ); + void ExecuteFilter( SfxRequest const & rReq ); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + + ::sd::View* mpView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/GraphicViewShell.hxx b/sd/source/ui/inc/GraphicViewShell.hxx new file mode 100644 index 0000000000..d730c2dd98 --- /dev/null +++ b/sd/source/ui/inc/GraphicViewShell.hxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "DrawViewShell.hxx" + +namespace vcl +{ +class Window; +} + +namespace sd +{ +/** View shell of the Draw application. + +

This class is an example of how not to do it: specialization by + inheritance. A graphic view shell is similar to a draw view shell + but lacks some of its features. Thus is should be at most a base + class of DrawViewShell. There even is special case code in + ViewShell that turns off some of the features for GraphicViewShell + instances.

+*/ +class SAL_DLLPUBLIC_RTTI GraphicViewShell final : public DrawViewShell +{ +public: + SFX_DECL_VIEWFACTORY(GraphicViewShell); + SFX_DECL_INTERFACE(SD_IF_SDGRAPHICVIEWSHELL) + + /** Create a new view shell for the Draw application. + @param rViewShellBase + The new object will be stacked on this view shell base. + @param pFrameView + The frame view that makes it possible to pass information from + one view shell to the next. + */ + GraphicViewShell(ViewShellBase& rViewShellBase, vcl::Window* pParentWindow, + FrameView* pFrameView); + + virtual ~GraphicViewShell() override; + + /** Override this method in order to have the layer mode always active. + */ + virtual void ChangeEditMode(EditMode eMode, bool bIsLayerModeActive) override; + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + + void ConstructGraphicViewShell(); + virtual void ArrangeGUIElements() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/GraphicViewShellBase.hxx b/sd/source/ui/inc/GraphicViewShellBase.hxx new file mode 100644 index 0000000000..a53afb3825 --- /dev/null +++ b/sd/source/ui/inc/GraphicViewShellBase.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShellBase.hxx" + +namespace sd +{ +/** This class exists to be able to register another factory that + creates the view shell for the Draw application. +*/ +class GraphicViewShellBase final : public ViewShellBase +{ +public: + SFX_DECL_VIEWFACTORY(GraphicViewShellBase); + + /** This constructor is used by the view factory of the SFX + macros. + */ + GraphicViewShellBase(SfxViewFrame& rFrame, SfxViewShell* pOldShell); + virtual ~GraphicViewShellBase() override; + + /** Callback function for general slot calls. + */ + virtual void Execute(SfxRequest& rRequest) override; + +protected: + virtual void InitializeFramework() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ImpressViewShellBase.hxx b/sd/source/ui/inc/ImpressViewShellBase.hxx new file mode 100644 index 0000000000..402013fa7f --- /dev/null +++ b/sd/source/ui/inc/ImpressViewShellBase.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShellBase.hxx" + +namespace sd +{ +/** This class implements a few features that exist only for the Impress + application. +*/ +class ImpressViewShellBase : public ViewShellBase +{ +public: + SFX_DECL_VIEWFACTORY(ImpressViewShellBase); + + /** This constructor is used by the view factory of the SFX + macros. + */ + ImpressViewShellBase(SfxViewFrame& rFrame, SfxViewShell* pOldShell); + virtual ~ImpressViewShellBase() override; + + /** Callback function for general slot calls. + */ + virtual void Execute(SfxRequest& rRequest) override; + +protected: + virtual void InitializeFramework() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/LayerTabBar.hxx b/sd/source/ui/inc/LayerTabBar.hxx new file mode 100644 index 0000000000..297a9302d5 --- /dev/null +++ b/sd/source/ui/inc/LayerTabBar.hxx @@ -0,0 +1,108 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include + +namespace sd { + +/** + * TabBar for layer administration + */ +class DrawViewShell; + +class SAL_DLLPUBLIC_RTTI LayerTabBar final + : public TabBar, + public DropTargetHelper +{ +public: + LayerTabBar ( + DrawViewShell* pDrViewSh, + vcl::Window* pParent); + virtual void dispose() override; + virtual ~LayerTabBar() override; + + /** Inform all listeners of this control that the current layer has been + activated. Call this method after switching the current layer and is + not done elsewhere (like when using ctrl + page up/down keys). + */ + void SendActivatePageEvent(); + + /** Inform all listeners of this control that the current layer has been + deactivated. Call this method before switching the current layer + and is not done elsewhere (like when using ctrl page up/down keys). + */ + void SendDeactivatePageEvent(); + + // Expects not-localized, real layer name in rText. Generates a localized layer name + // that will be displayed on the tab of the LayerTabBar and writes the real name + // to maAuxiliaryText. In case you want no entry in maAuxiliaryText, use method from TabBar. + virtual void InsertPage( sal_uInt16 nPageId, const OUString& rText, + TabBarPageBits nBits = TabBarPageBits::NONE, + sal_uInt16 nPos = TabBar::APPEND ) override; + virtual void SetPageText( sal_uInt16 nPageId, const OUString& rText ) override; + + // Returns the real layer name if exists and empty OUString otherwise. + OUString GetLayerName(sal_uInt16 nPageId) const; + + // Used e.g. in DeleteActualLayer() to test whether deleting is allowed. + static bool IsRealNameOfStandardLayer(std::u16string_view rName); + + // Used e.g. in validity test of user entered names + static bool IsLocalizedNameOfStandardLayer(std::u16string_view rName); + + // In case rName is one of the sUNO_LayerName_*, it generates a localized name, + // otherwise it returns value of rName. + static OUString convertToLocalizedName(const OUString& rName); + + // TabBar + virtual void Select() override; + virtual void DoubleClick() override; + + SD_DLLPUBLIC virtual void MouseButtonDown(const MouseEvent& rMEvt) override; // export for unit test + + virtual void Command(const CommandEvent& rCEvt) override; + + virtual bool StartRenaming() override; + virtual TabBarAllowRenamingReturnCode AllowRenaming() override; + virtual void EndRenaming() override; + + virtual void ActivatePage() override; + + // DropTargetHelper + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + +private: + DrawViewShell* pDrViewSh; + + // Expects not-localized, real layer name in rText and writes it to maAuxiliaryText. + void SetLayerName( sal_uInt16 nPageId, const OUString& rText ); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/MasterPageObserver.hxx b/sd/source/ui/inc/MasterPageObserver.hxx new file mode 100644 index 0000000000..9ece9f9a98 --- /dev/null +++ b/sd/source/ui/inc/MasterPageObserver.hxx @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include "tools/SdGlobalResourceContainer.hxx" +#include +#include + +namespace osl +{ +class Mutex; +} + +class SdDrawDocument; + +namespace sd +{ +class MasterPageObserverEvent; + +/** This singleton observes all registered documents for changes in the used + master pages and in turn informs its listeners about it. One such + listener is the master page selector control in the tool panel that + shows the recently used master pages. +*/ +class MasterPageObserver final : public SdGlobalResource +{ +public: + typedef ::std::set MasterPageNameSet; + + /** Return the single instance of this class. + */ + static MasterPageObserver& Instance(); + + /** The master page observer will listen to events of this document and + detect changes of the use of master pages. + */ + void RegisterDocument(SdDrawDocument& rDocument); + + /** The master page observer will stop to listen to events of this + document. + */ + void UnregisterDocument(SdDrawDocument& rDocument); + + /** Add a listener that is informed of master pages that are newly + assigned to slides or become unassigned. + @param rEventListener + The event listener to call for future events. Call + RemoveEventListener() before the listener is destroyed. + */ + void AddEventListener(const Link& rEventListener); + + /** Remove the given listener from the list of listeners. + @param rEventListener + After this method returns the given listener is not called back + from this object. Passing a listener that has not + been registered before is safe and is silently ignored. + */ + void RemoveEventListener(const Link& rEventListener); + +private: + class Implementation; + ::std::unique_ptr mpImpl; + + MasterPageObserver(); + virtual ~MasterPageObserver() override; + + MasterPageObserver(const MasterPageObserver&) = delete; + + MasterPageObserver& operator=(const MasterPageObserver&) = delete; +}; + +/** Objects of this class are sent to listeners of the MasterPageObserver + singleton when the list of master pages of one document has changed. +*/ +class MasterPageObserverEvent +{ +public: + enum EventType + { + /// Master page already exists when document is registered. + ET_MASTER_PAGE_EXISTS, + /// Master page has been added to a document. + ET_MASTER_PAGE_ADDED, + /// Master page has been removed from to a document. + ET_MASTER_PAGE_REMOVED + }; + + EventType meType; + const OUString& mrMasterPageName; + + MasterPageObserverEvent(EventType eType, const OUString& rMasterPageName) + : meType(eType) + , mrMasterPageName(rMasterPageName) + { + } +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/MediaObjectBar.hxx b/sd/source/ui/inc/MediaObjectBar.hxx new file mode 100644 index 0000000000..b7c56ef00f --- /dev/null +++ b/sd/source/ui/inc/MediaObjectBar.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SfxInterface; +class SfxItemSet; +class SfxModule; +class SfxRequest; + +namespace sd { + +class View; +class ViewShell; + +class MediaObjectBar final + : public SfxShell +{ +public: + SFX_DECL_INTERFACE( SD_IF_SDDRAWMEDIAOBJECTBAR ) + + MediaObjectBar (const ViewShell* pSdViewShell, ::sd::View* pSdView); + virtual ~MediaObjectBar() override; + + void GetState( SfxItemSet& rSet ); + void Execute( SfxRequest const & rReq ); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + + ::sd::View* mpView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/NavigatorChildWindow.hxx b/sd/source/ui/inc/NavigatorChildWindow.hxx new file mode 100644 index 0000000000..4199cab677 --- /dev/null +++ b/sd/source/ui/inc/NavigatorChildWindow.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace vcl { class Window; } +class SfxBindings; + +namespace sd { + +class SdNavigatorWrapper final : public SfxNavigatorWrapper +{ +public: + SdNavigatorWrapper(vcl::Window *pParent, sal_uInt16 nId, + SfxBindings* pBindings, SfxChildWinInfo* pInfo); + SFX_DECL_CHILDWINDOW(SdNavigatorWrapper); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/OutlineBulletDlg.hxx b/sd/source/ui/inc/OutlineBulletDlg.hxx new file mode 100644 index 0000000000..88f401e617 --- /dev/null +++ b/sd/source/ui/inc/OutlineBulletDlg.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ +class View; + +/** + * Bullet-Tab-Dialog + */ +class OutlineBulletDlg : public SfxTabDialogController +{ +public: + OutlineBulletDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView); + virtual ~OutlineBulletDlg() override; + + const SfxItemSet* GetBulletOutputItemSet() const; + +protected: + virtual void PageCreated(const OUString& rId, SfxTabPage& rPage) override; + +private: + SfxItemSet m_aInputSet; + std::unique_ptr m_xOutputSet; + bool m_bTitle; + ::sd::View* m_pSdView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/OutlineView.hxx b/sd/source/ui/inc/OutlineView.hxx new file mode 100644 index 0000000000..43dadf0386 --- /dev/null +++ b/sd/source/ui/inc/OutlineView.hxx @@ -0,0 +1,230 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include "View.hxx" + +class SdPage; +class SdrPage; +class SdrTextObj; +class SfxProgress; +struct PasteOrDropInfos; +class EditView; + +namespace sd::tools { + class EventMultiplexerEvent; +} + +namespace sd { + +class DrawDocShell; +class OutlineViewShell; +class OutlineViewModelChangeGuard; + +const int MAX_OUTLINERVIEWS = 4; + +/** + * Derivative of ::sd::View for the outline mode +|* +\************************************************************************/ + +class OutlineView final + : public ::sd::View +{ + friend class OutlineViewModelChangeGuard; +public: + OutlineView (DrawDocShell& rDocSh, + vcl::Window* pWindow, + OutlineViewShell& rOutlineViewSh); + virtual ~OutlineView() override; + + /** This method is called by the view shell that owns the view to tell + the view that it can safely connect to the application. + This method must not be called before the view shell is on the shell + stack. + */ + void ConnectToApplication(); + void DisconnectFromApplication(); + + + static SdrTextObj* GetTitleTextObject(SdrPage const * pPage); + static SdrTextObj* GetOutlineTextObject(SdrPage const * pPage); + + static SdrTextObj* CreateTitleTextObject(SdPage* pPage); + static SdrTextObj* CreateOutlineTextObject(SdPage* pPage); + + virtual void AddDeviceToPaintView(OutputDevice& rDev, vcl::Window* pWindow) override; + virtual void DeleteDeviceFromPaintView(OutputDevice& rDev) override; + + OutlinerView* GetViewByWindow(vcl::Window const * pWin) const; + SdOutliner& GetOutliner() { return mrOutliner; } + + Paragraph* GetPrevTitle(const Paragraph* pPara); + Paragraph* GetNextTitle(const Paragraph* pPara); + SdPage* GetActualPage(); + SdPage* GetPageForParagraph( Paragraph* pPara ); + Paragraph* GetParagraphForPage( ::Outliner const & rOutl, SdPage const * pPage ); + + /** selects the paragraph for the given page at the outliner view*/ + void SetActualPage( SdPage const * pActual ); + + void Paint (const ::tools::Rectangle& rRect, ::sd::Window const * pWin); + + // Callbacks for LINKs + DECL_LINK( ParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, void ); + DECL_LINK( ParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, void ); + DECL_LINK( DepthChangedHdl, ::Outliner::DepthChangeHdlParam, void ); + DECL_LINK( StatusEventHdl, EditStatus&, void ); + DECL_LINK( BeginMovingHdl, ::Outliner *, void ); + DECL_LINK( EndMovingHdl, ::Outliner *, void ); + DECL_LINK( RemovingPagesHdl, OutlinerView *, bool ); + DECL_LINK( IndentingPagesHdl, OutlinerView *, bool ); + DECL_LINK( BeginDropHdl, EditView*, void ); + DECL_LINK( EndDropHdl, EditView*, void ); + DECL_LINK( PaintingFirstLineHdl, PaintFirstLineInfo*, void ); + + sal_uLong GetPaperWidth() const { return mnPaperWidth;} + + void PrepareClose(); + + virtual void GetAttributes( SfxItemSet& rTargetSet, bool bOnlyHardAttr = false ) const override; + virtual bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll = false, bool bSlide = false, bool bMaster = false) override; + + void FillOutliner(); + void SetLinks(); + void ResetLinks() const; + + SfxStyleSheet* GetStyleSheet() const override; + + void SetSelectedPages(); + + virtual sal_Int8 AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + SdrLayerID nLayer) override; + virtual sal_Int8 ExecuteDrop ( + const ExecuteDropEvent& rEvt, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) override; + + // Re-implement GetScriptType for this view to get correct results + virtual SvtScriptType GetScriptType() const override; + + /** After this method has been called with following changes of + the current page are ignored in that the corresponding text is not + selected. + This is used to suppress unwanted side effects between selection and + cursor position. + */ + void IgnoreCurrentPageChanges (bool bIgnore); + + /** creates and inserts an empty slide for the given paragraph. */ + SdPage* InsertSlideForParagraph( Paragraph* pPara ); + + void UpdateParagraph( sal_Int32 nPara ); + +protected: + virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfo ) override; + virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) override; + +private: + /** call this method before you do anything that can modify the outliner + and or the drawing document model. It will create needed undo actions */ + void BeginModelChange(); + + /** call this method after BeginModelChange(), when all possible model + changes are done. */ + void EndModelChange(); + + /** merge edit engine undo actions if possible */ + void TryToMergeUndoActions(); + + /** updates all changes in the outliner model to the draw model */ + void UpdateDocument(); + + OutlineViewShell& mrOutlineViewShell; + SdOutliner& mrOutliner; + std::unique_ptr mpOutlinerViews[MAX_OUTLINERVIEWS]; + + std::vector maOldParaOrder; + std::vector maSelectedParas; + + sal_Int32 mnPagesToProcess; // for the progress bar + sal_Int32 mnPagesProcessed; + + bool mbFirstPaint; + + sal_uLong mnPaperWidth; + + std::unique_ptr mpProgress; + + /** stores the last used document color. + this is changed in onUpdateStyleSettings() + */ + Color maDocColor; + + /** updates the high contrast settings and document color if they changed. + @param bForceUpdate forces the method to set all style settings + */ + void onUpdateStyleSettings( bool bForceUpdate ); + + /** this link is called from the vcl application when the stylesettings + change. Its only purpose is to call onUpdateStyleSettings() then. + */ + DECL_LINK( AppEventListenerHdl, VclSimpleEvent&, void ); + + DECL_LINK(EventMultiplexerListener, sd::tools::EventMultiplexerEvent&, void); + + /** holds a model guard during drag and drop between BeginMovingHdl and EndMovingHdl */ + std::unique_ptr> maDragAndDropModelGuard; + + SvxLRSpaceItem maLRSpaceItem; + Image maSlideImage; +}; + +// calls IgnoreCurrentPageChangesLevel with true in ctor and with false in dtor +class OutlineViewPageChangesGuard +{ +public: + OutlineViewPageChangesGuard( OutlineView* pView ); + ~OutlineViewPageChangesGuard(); +private: + OutlineView* mpView; +}; + +// calls BeginModelChange() on c'tor and EndModelChange() on d'tor +class OutlineViewModelChangeGuard +{ +public: + OutlineViewModelChangeGuard( OutlineView& rView ); + ~OutlineViewModelChangeGuard() COVERITY_NOEXCEPT_FALSE; +private: + OutlineView& mrView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/OutlineViewShell.hxx b/sd/source/ui/inc/OutlineViewShell.hxx new file mode 100644 index 0000000000..ec12e888a4 --- /dev/null +++ b/sd/source/ui/inc/OutlineViewShell.hxx @@ -0,0 +1,163 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShell.hxx" +#include + +class SdPage; +class TransferableDataHelper; +class TransferableClipboardListener; + +namespace sd { class OutlineView; } + +namespace sd { + +/** Show a textual overview of the text contents of all slides. +*/ +class OutlineViewShell final + : public ViewShell +{ +public: + + SFX_DECL_VIEWFACTORY(OutlineViewShell); + SFX_DECL_INTERFACE(SD_IF_SDOUTLINEVIEWSHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + /** Create a new view shell for the outline mode. + @param rViewShellBase + The new object will be stacked on this view shell base. + @param pFrameView + The frame view that makes it possible to pass information from + one view shell to the next. + */ + OutlineViewShell ( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameView); + + virtual ~OutlineViewShell() override; + + virtual void Shutdown() override; + + virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override; + + /** Arrange and resize the GUI elements like rulers, sliders, and + buttons as well as the actual document view according to the size of + the enclosing window and current sizes of buttons, rulers, and + sliders. + */ + virtual void ArrangeGUIElements() override; + + virtual bool PrepareClose( bool bUI = true ) override; + + virtual void VirtHScrollHdl(ScrollAdaptor* pHScroll) override; + virtual void VirtVScrollHdl(ScrollAdaptor* pVHScroll) override; + + virtual void Activate( bool IsMDIActivate ) override; + virtual void Deactivate( bool IsMDIActivate ) override; + + virtual SdPage* GetActualPage() override; + + /// inherited from sd::ViewShell + virtual SdPage* getCurrentPage() const override; + + void ExecCtrl(SfxRequest &rReq); + void GetCtrlState(SfxItemSet &rSet); + // FIXME non-virtual override??? + void GetMenuState(SfxItemSet &rSet); + void GetAttrState(SfxItemSet &rSet); + void GetState (SfxItemSet& rSet); + + static void ExecStatusBar(SfxRequest& rReq); + void GetStatusBarState(SfxItemSet& rSet); + + void FuTemporary(SfxRequest &rReq); + void FuTemporaryModify(SfxRequest &rReq); + void FuPermanent(SfxRequest &rReq); + void FuSupport(SfxRequest &rReq); + + virtual void SetZoom(::tools::Long nZoom) override; + virtual void SetZoomRect(const ::tools::Rectangle& rZoomRect) override; + + void Execute(SfxRequest& rReq); + + virtual void ReadFrameViewData(FrameView* pView) override; + virtual void WriteFrameViewData() override; + + virtual void Command( const CommandEvent& rCEvt, ::sd::Window* pWin ) override; + virtual bool KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin) override; + virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) override; + + ErrCode ReadRtf(SvStream& rInput); + + virtual void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& ) override; + virtual void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& ) override; + + /** this method is called when the visible area of the view from this viewshell is changed */ + virtual void VisAreaChanged(const ::tools::Rectangle& rRect) override; + + /** Create an accessible object representing the specified window. + @param pWindow + The returned object makes the document displayed in this window + accessible. + @return + Returns an AccessibleDrawDocumentView object. + */ + virtual css::uno::Reference + CreateAccessibleDocumentView (::sd::Window* pWindow) override; + + /** Update the preview to show the specified page. + */ + virtual void UpdatePreview (SdPage* pPage) override; + + virtual css::uno::Reference CreateSubController() override; + + /** Make the given page the new current page. This method + notifies the controller and adapts the selection of the + model. + @param pPage + The new current page. Pass NULL when there is no current page. + */ + void SetCurrentPage (SdPage* pPage); + + void UpdateTitleObject( SdPage* pPage, Paragraph const * pPara ); + void UpdateOutlineObject( SdPage* pPage, Paragraph* pPara ); + +private: + OUString m_StrOldPageName; + std::unique_ptr pOlView; + SdPage* pLastPage; // For efficient processing of the preview + rtl::Reference mxClipEvtLstnr; + bool bPastePossible; + bool mbInitialized; + + void Construct(); + DECL_LINK( ClipboardChanged, TransferableDataHelper*, void ); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/OutlineViewShellBase.hxx b/sd/source/ui/inc/OutlineViewShellBase.hxx new file mode 100644 index 0000000000..1abffb914d --- /dev/null +++ b/sd/source/ui/inc/OutlineViewShellBase.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ImpressViewShellBase.hxx" + +namespace sd +{ +/** This class exists to be able to register a factory that + creates an outline view shell as default. +*/ +class OutlineViewShellBase final : public ImpressViewShellBase +{ +public: + SFX_DECL_VIEWFACTORY(OutlineViewShellBase); + + /** This constructor is used by the view factory of the SFX + macros. + */ + OutlineViewShellBase(SfxViewFrame& rFrame, SfxViewShell* pOldShell); + virtual ~OutlineViewShellBase() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/OutlinerIteratorImpl.hxx b/sd/source/ui/inc/OutlinerIteratorImpl.hxx new file mode 100644 index 0000000000..84b11e47b6 --- /dev/null +++ b/sd/source/ui/inc/OutlinerIteratorImpl.hxx @@ -0,0 +1,239 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; +class SdPage; + +namespace sd { + +class ViewShell; + +namespace outliner { + +/** Base class for the polymorphic implementation class of the + Iterator class. The iterators based on this class are + basically uni directional iterators. Their direction can, however, be + reversed at any point of their life time. +*/ +class IteratorImplBase +{ +public: + /** The constructor stores the given arguments to be used by the derived + classes. + @param pDocument + The document provides the information to be iterated on. + @param pViewShellWeak + Some information has to be taken from the view shell. + @param bDirectionIsForward + This flag defines the iteration direction. When then + the direction is forwards otherwise it is backwards. + */ + IteratorImplBase (SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward); + IteratorImplBase (SdDrawDocument* pDocument, + std::weak_ptr pViewShellWeak, + bool bDirectionIsForward, PageKind ePageKind, EditMode eEditMode); + virtual ~IteratorImplBase(); + + /** Advance to the next text of the current object or to the next object. + This takes the iteration direction into + account. The new object pointed to can be retrieved (among other + information) by calling the GetPosition method. + */ + virtual void GotoNextText() = 0; + /** Return an object that describes the current object. + @return + The returned object describes the current object pointed to by + the iterator. See the description of + IteratorPosition for details on the available + information. + */ + virtual const IteratorPosition& GetPosition(); + /** Create an exact copy of this object. No argument should be + specified when called from the outside. It then creates an object + first and passes that to the inherited Clone() + methods to fill in class specific information. + @return + Returns a copy of this object. When this method is called with + an argument then this value will be returned. + */ + virtual IteratorImplBase* Clone (IteratorImplBase* pObject=nullptr) const; + /** Test the equality of the this object and the given iterator. Two + iterators are taken to be equal when they point to the same object. + Iteration direction is not taken into account. + @param rIterator + The iterator to compare to. + @return + When both iterators are equal is returned, otherwise. + */ + virtual bool operator== (const IteratorImplBase& rIterator) const; + /** This method is used by the equality operator. It is part of a "multimethod" pattern. + @param rIterator + The iterator to compare to. + @return + Returns when both iterators point to the same object. + */ + virtual bool IsEqualSelection(const IteratorImplBase& rIterator) const; + /** Reverse the direction of iteration. The current object stays the same. + */ + virtual void Reverse(); + +protected: + /// The current position as returned by GetPosition(). + IteratorPosition maPosition; + /// The document on whose data the iterator operates. + SdDrawDocument* mpDocument; + /// Necessary secondary source of information. + std::weak_ptr mpViewShellWeak; + /// Specifies the search direction. + bool mbDirectionIsForward; +}; + +/** Iterator all objects that belong to the current mark list + a.k.a. selection. It is assumed that all marked objects belong to the + same page. It is further assumed that the mark list does not change + while an iterator is alive. It is therefore the responsibility of an + iterator's owner to handle the case of a changed mark list. + +

For documentation of the methods please refer to the base class + IteratorImplBase.

+*/ +class SelectionIteratorImpl final + : public IteratorImplBase +{ +public: + SelectionIteratorImpl ( + const ::std::vector< ::unotools::WeakReference >& rObjectList, + sal_Int32 nObjectIndex, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward); + SelectionIteratorImpl (const SelectionIteratorImpl& rObject); + virtual ~SelectionIteratorImpl() override; + + virtual void GotoNextText() override; + virtual const IteratorPosition& GetPosition() override; + virtual IteratorImplBase* Clone (IteratorImplBase* pObject = nullptr) const override; + virtual bool operator== (const IteratorImplBase& rIterator) const override; + +private: + const ::std::vector<::unotools::WeakReference>& mrObjectList; + sal_Int32 mnObjectIndex; + + /** Compare the given iterator with this object. This method handles + only the case that the given iterator is an instance of this class. + @param rIterator + The iterator to compare to. + @return + Returns when both iterators point to the same object. + */ + virtual bool IsEqualSelection(const IteratorImplBase& rIterator) const override; + + IteratorImplBase& operator= (const IteratorImplBase& rIterator); +}; + +/** Iterator for iteration over all objects in a single view. On reaching + the last object on the last page (or the first object on the first page) + the view is *not* switched. Further calls to the + GotoNextObject() method will be ignored. + +

For documentation of the methods please refer to the base class + IteratorImplBase.

+*/ +class ViewIteratorImpl : public IteratorImplBase +{ +public: + ViewIteratorImpl ( + sal_Int32 nPageIndex, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward); + ViewIteratorImpl ( + sal_Int32 nPageIndex, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward, + PageKind ePageKind, + EditMode eEditMode); + virtual ~ViewIteratorImpl() override; + + virtual void GotoNextText() override; + virtual IteratorImplBase* Clone (IteratorImplBase* pObject = nullptr) const override; + virtual void Reverse() override; + +protected: + /** Set up page pointer and object list iterator for the specified + page. + @param nPageIndex + Index of the new page. It may lie outside the valid range for + page indices. + */ + void SetPage (sal_Int32 nPageIndex); + +private: + /// Indicates whether a page changed occurred on switching to current page. + bool mbPageChangeOccurred; + /// Pointer to the page associated with the current page index. May be NULL. + SdPage* mpPage; + /// Iterator of all objects on the current page. + std::optional moObjectIterator; + + // Don't use this operator. + ViewIteratorImpl& operator= (const ViewIteratorImpl&) = delete; +}; + +/** Iterator for iteration over all objects in all views. It automatically + switches views when reaching the end/beginning of a view. + +

For documentation of the methods please refer to the base class + IteratorImplBase.

+*/ +class DocumentIteratorImpl final : public ViewIteratorImpl +{ +public: + DocumentIteratorImpl ( + sal_Int32 nPageIndex, + PageKind ePageKind, + EditMode eEditMode, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward); + virtual ~DocumentIteratorImpl() override; + + virtual void GotoNextText() override; + virtual IteratorImplBase* Clone (IteratorImplBase* pObject = nullptr) const override; + +private: + /// Number of pages in the view that is specified by maPosition. + sal_Int32 mnPageCount; + + // Don't use this operator. + DocumentIteratorImpl& operator= (const DocumentIteratorImpl& ) = delete; +}; + +} } // end of namespace ::sd::outliner + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/PaneChildWindows.hxx b/sd/source/ui/inc/PaneChildWindows.hxx new file mode 100644 index 0000000000..f96ede468b --- /dev/null +++ b/sd/source/ui/inc/PaneChildWindows.hxx @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd { + +/// Base class of Impress and Draw left sidebars/panes. +class PaneChildWindow + : public SfxChildWindow +{ +public: + PaneChildWindow ( + vcl::Window* pParentWindow, + sal_uInt16 nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo, + TranslateId pTitleBarResId); + virtual ~PaneChildWindow() override; +}; + +/// The slide-sorter sidebar (on the left) in Impress. +class LeftPaneImpressChildWindow final + : public PaneChildWindow +{ +public: + LeftPaneImpressChildWindow(vcl::Window* pParentWindow, sal_uInt16 nId, SfxBindings* pBindings, + SfxChildWinInfo* pInfo); + + SFX_DECL_CHILDWINDOW_WITHID(LeftPaneImpressChildWindow); +}; + +/// The pages sidebar (on the left) in Draw. +class LeftPaneDrawChildWindow final + : public PaneChildWindow +{ +public: + LeftPaneDrawChildWindow(vcl::Window* pParentWindow, sal_uInt16 nId, SfxBindings* pBindings, + SfxChildWinInfo* pInfo); + + SFX_DECL_CHILDWINDOW_WITHID(LeftPaneDrawChildWindow); +}; + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/PaneShells.hxx b/sd/source/ui/inc/PaneShells.hxx new file mode 100644 index 0000000000..73f24909c2 --- /dev/null +++ b/sd/source/ui/inc/PaneShells.hxx @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd +{ +/** Shell that displays the left pane for Impress. The shell does not do + anything else and has especially no slots. +*/ +class LeftImpressPaneShell final : public SfxShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDLEFTIMPRESSPANESHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + LeftImpressPaneShell(); + virtual ~LeftImpressPaneShell() override; +}; + +/** Shell that displays the left pane for Draw. The shell does not do + anything else and has especially no slots. +*/ +class LeftDrawPaneShell final : public SfxShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDLEFTDRAWPANESHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + LeftDrawPaneShell(); + virtual ~LeftDrawPaneShell() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/PresentationViewShell.hxx b/sd/source/ui/inc/PresentationViewShell.hxx new file mode 100644 index 0000000000..0272829d41 --- /dev/null +++ b/sd/source/ui/inc/PresentationViewShell.hxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "DrawViewShell.hxx" + +namespace sd +{ +/** This view shell is responsible for showing the presentation of an + Impress document. +*/ +class PresentationViewShell final : public DrawViewShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDPRESVIEWSHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + PresentationViewShell(ViewShellBase& rViewShellBase, vcl::Window* pParentWindow, + FrameView* pFrameView); + virtual ~PresentationViewShell() override; + + /** This method is used by a simple class that passes some + arguments from the creator of the new view shell to the new view + shell object by waiting for its asynchronous creation. + @param pFrameView + The frame view that is typically used by the creating object and + that shall be shared by the created view shell. + */ + void FinishInitialization(FrameView* pFrameView); + + virtual void Resize() override; + +protected: + virtual VclPtr CreateHRuler(::sd::Window* pWin) override; + virtual VclPtr CreateVRuler(::sd::Window* pWin) override; + +private: + ::tools::Rectangle maOldVisArea; + ImplSVEvent* mnAbortSlideShowEvent; + + virtual void Activate(bool bIsMDIActivate) override; + virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override; + + DECL_LINK(AbortSlideShowHdl, void*, void); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/PresentationViewShellBase.hxx b/sd/source/ui/inc/PresentationViewShellBase.hxx new file mode 100644 index 0000000000..9892edb150 --- /dev/null +++ b/sd/source/ui/inc/PresentationViewShellBase.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShellBase.hxx" + +namespace sd +{ +/** This class exists to be able to register another factory that + creates the view shell for the presentation. +*/ +class PresentationViewShellBase final : public ViewShellBase +{ +public: + SFX_DECL_VIEWFACTORY(PresentationViewShellBase); + + /** This constructor is used by the view factory of the SFX + macros. + */ + PresentationViewShellBase(SfxViewFrame& rFrame, SfxViewShell* pOldShell); + virtual ~PresentationViewShellBase() override; + +protected: + virtual void InitializeFramework() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/PreviewRenderer.hxx b/sd/source/ui/inc/PreviewRenderer.hxx new file mode 100644 index 0000000000..9082201476 --- /dev/null +++ b/sd/source/ui/inc/PreviewRenderer.hxx @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +class SdPage; +class VirtualDevice; + +namespace sd { + +class DrawDocShell; +class DrawView; + +class PreviewRenderer final + : public SfxListener +{ +public: + /** Create a new preview renderer that takes some of its initial values + from the given output device. + @param bPaintFrame + When (the default) then a frame is painted around the + preview. This makes the actual preview smaller. + */ + PreviewRenderer(const bool bPaintFrame = true); + + virtual ~PreviewRenderer() override; + + /** Render a page with the given pixel size. + Use this version when only the width of the preview is known to the + caller. The height is then calculated according to the aspect + ratio of the given page. + @param pPage + The page to render. + @param nWidth + The width of the preview in device coordinates. + The high contrast mode of the application is + ignored and the preview is rendered in normal mode. + */ + Image RenderPage ( + const SdPage* pPage, + const sal_Int32 nWidth); + + /** Render a page with the given pixel size. + @param pPage + The page to render. + @param aPreviewPixelSize + The size in device coordinates of the preview. + @param bObeyHighContrastMode + When then the high contrast mode of the application is + ignored and the preview is rendered in normal mode. When + and high contrast mode is active then the preview is + rendered in high contrast mode. + @param bDisplayPresentationObjects + When then the PresObj place holders are not displayed + in the returned preview. + */ + Image RenderPage ( + const SdPage* pPage, + const Size aPreviewPixelSize, + const bool bObeyHighContrastMode, + const bool bDisplayPresentationObjects = true); + + /** Render an image that contains the given substitution text instead of a + slide preview. + @param aPreviewPixelSize + The size in device coordinates of the image. + */ + Image RenderSubstitution ( + const Size& rPreviewPixelSize, + const OUString& sSubstitutionText); + + /** Scale the given bitmap by keeping its aspect ratio to the desired + width. Add a frame to it afterwards. + */ + Image ScaleBitmap ( + const BitmapEx& rBitmap, + int nWidth); + +protected: + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + +private: + ScopedVclPtr mpPreviewDevice; + ::std::unique_ptr mpView; + DrawDocShell* mpDocShellOfView; + const Color maFrameColor; + const bool mbHasFrame; + static const int snSubstitutionTextSize; + // Width of the frame that is painted around the preview. + static const int snFrameWidth; + + bool Initialize ( + const SdPage* pPage, + const Size& rPixelSize, + const bool bObeyHighContrastMode); + void PaintPage ( + const SdPage* pPage, + const bool bDisplayPresentationObjects); + void PaintSubstitutionText (const OUString& rSubstitutionText); + void PaintFrame(); + + /** Set up the map mode so that the given page is renderer into a bitmap + with the specified width. + @param rPage + The page for which the preview is created. + @param rPixelSize + The size of the resulting preview bitmap. Note that this size + includes the frame. The actual preview is smaller accordingly. + */ + void SetupOutputSize (const SdPage& rPage, const Size& rPixelSize); + + /** When mpView is empty then create a new view and initialize it. + Otherwise just initialize it. + */ + void ProvideView (DrawDocShell* pDocShell); +}; + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/RemoteServer.hxx b/sd/source/ui/inc/RemoteServer.hxx new file mode 100644 index 0000000000..70eed9aa8d --- /dev/null +++ b/sd/source/ui/inc/RemoteServer.hxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include +#include + +#include +#include + +#include + +namespace osl { class Mutex; } +namespace com::sun::star::presentation { class XSlideShowController; } +namespace com::sun::star::uno { template class Reference; } + +/** +* The port for use for the main communication between LibO and remote control app. +*/ +#define PORT 1599 + +namespace sd +{ + class BufferedStreamSocket; + class Communicator; + + struct ClientInfo + { + OUString mName; + + bool mbIsAlreadyAuthorised; + + ClientInfo( OUString aName, + const bool bIsAlreadyAuthorised ) : + mName(std::move( aName )), + mbIsAlreadyAuthorised( bIsAlreadyAuthorised ) {} + + virtual ~ClientInfo() {}; + }; + + struct ClientInfoInternal; + + class RemoteServer final + { + public: + // For slideshowimpl to inform us. + static void presentationStarted( const css::uno::Reference< + css::presentation::XSlideShowController > &rController ); + static void presentationStopped(); + + /// ensure that discoverability (eg. for Bluetooth) is enabled + SD_DLLPUBLIC static void ensureDiscoverable(); + /// restore the state of discoverability from before ensureDiscoverable + SD_DLLPUBLIC static void restoreDiscoverable(); + + // For the communicator + static void removeCommunicator( Communicator const * pCommunicator ); + //private: + // these are public because 3 classes and a function need access + static ::osl::Mutex sDataMutex; + static ::std::vector sCommunicators; + }; + + class IPRemoteServer final : public salhelper::Thread + { + public: + // Internal setup + static void setup(); + + // For the control dialog + SD_DLLPUBLIC static std::vector> getClients(); + SD_DLLPUBLIC static bool connectClient(const std::shared_ptr& pClient, + std::u16string_view aPin); + SD_DLLPUBLIC static void deauthoriseClient(const std::shared_ptr& pClient); + + void execute() override; + void handleAcceptedConnection( BufferedStreamSocket *pSocket ) ; + + private: + IPRemoteServer(); + virtual ~IPRemoteServer() override; + + osl::AcceptorSocket mSocket; + ::std::vector> mAvailableClients; + + friend class RemoteServer; + static IPRemoteServer *spServer; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/Ruler.hxx b/sd/source/ui/inc/Ruler.hxx new file mode 100644 index 0000000000..5cf1d18bb5 --- /dev/null +++ b/sd/source/ui/inc/Ruler.hxx @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd { + +class DrawViewShell; +class RulerCtrlItem; +class Window; + +class Ruler final + : public SvxRuler +{ +public: + Ruler ( + DrawViewShell& rViewSh, + vcl::Window* pParent, + ::sd::Window* pWin, + SvxRulerSupportFlags nRulerFlags, + SfxBindings& rBindings, + WinBits nWinStyle); + virtual ~Ruler() override; + virtual void dispose() override; + + void SetNullOffset(const Point& rOffset); + + bool IsHorizontal() const { return bHorz; } + + using ::Ruler::SetNullOffset; + +private: + DrawViewShell* pDrViewShell; + std::unique_ptr pCtrlItem; + bool bHorz; + + virtual void MouseButtonDown(const MouseEvent& rMEvt) override; + virtual void Command(const CommandEvent& rCEvt) override; + virtual void ExtraDown() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SdUnoDrawView.hxx b/sd/source/ui/inc/SdUnoDrawView.hxx new file mode 100644 index 0000000000..ad14dabe52 --- /dev/null +++ b/sd/source/ui/inc/SdUnoDrawView.hxx @@ -0,0 +1,113 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "DrawSubController.hxx" + +class SdXImpressDocument; +namespace com::sun::star::drawing { class XLayer; } + +namespace sd { + +class DrawViewShell; +class View; + +/** This class implements the DrawViewShell specific part of the controller. +*/ +class SdUnoDrawView final : public DrawSubControllerInterfaceBase +{ +public: + SdUnoDrawView ( + DrawViewShell& rViewShell, + View& rView) noexcept; + virtual ~SdUnoDrawView() noexcept override; + + // XSelectionSupplier + + virtual sal_Bool SAL_CALL select ( + const css::uno::Any& aSelection) override; + + virtual css::uno::Any SAL_CALL getSelection() override; + + virtual void SAL_CALL addSelectionChangeListener ( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL removeSelectionChangeListener ( + const css::uno::Reference& rxListener) override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference& xPage) override; + + virtual css::uno::Reference SAL_CALL getCurrentPage() override; + + // XFastPropertySet + + virtual void SAL_CALL setFastPropertyValue ( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + + virtual css::uno::Any SAL_CALL getFastPropertyValue ( + sal_Int32 nHandle) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + + /** Return a reference to the active layer object. + @return + The returned value may be empty when the internal state of this + view is not valid (like during destruction.) + */ + css::uno::Reference< css::drawing::XLayer> getActiveLayer() const; + +private: + bool getMasterPageMode() const noexcept; + void setMasterPageMode(bool MasterPageMode_) noexcept; + bool getLayerMode() const noexcept; + void setLayerMode(bool LayerMode_) noexcept; + /** Make the specified object the active layer. + @param rxLayer + The new layer object. + @throws css::uno::RuntimeException + */ + void setActiveLayer (const css::uno::Reference< css::drawing::XLayer>& rxLayer); + + void SetZoom( sal_Int16 nZoom ); + sal_Int16 GetZoom() const; + + void SetViewOffset(const css::awt::Point& rWinPos ); + css::awt::Point GetViewOffset() const; + + void SetZoomType( sal_Int16 nType ); + + css::uno::Any getDrawViewMode() const; + + SdXImpressDocument* GetModel() const noexcept; + + DrawViewShell& mrDrawViewShell; + sd::View& mrView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SdUnoOutlineView.hxx b/sd/source/ui/inc/SdUnoOutlineView.hxx new file mode 100644 index 0000000000..cfad20ac58 --- /dev/null +++ b/sd/source/ui/inc/SdUnoOutlineView.hxx @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "DrawSubController.hxx" + +namespace sd { + +class OutlineViewShell; + +/** This class implements the OutlineViewShell specific part of the controller. +*/ +class SdUnoOutlineView final + : public DrawSubControllerInterfaceBase +{ +public: + SdUnoOutlineView (OutlineViewShell& rViewShell) noexcept; + virtual ~SdUnoOutlineView() noexcept override; + + // XSelectionSupplier + + virtual sal_Bool SAL_CALL select ( + const css::uno::Any& aSelection) override; + + virtual css::uno::Any SAL_CALL getSelection() override; + + virtual void SAL_CALL addSelectionChangeListener ( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL removeSelectionChangeListener ( + const css::uno::Reference& rxListener) override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference& xPage) override; + + virtual css::uno::Reference SAL_CALL getCurrentPage() override; + + // XFastPropertySet + + virtual void SAL_CALL setFastPropertyValue ( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + + virtual css::uno::Any SAL_CALL getFastPropertyValue ( + sal_Int32 nHandle) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + +private: + OutlineViewShell& mrOutlineViewShell; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SdUnoSlideView.hxx b/sd/source/ui/inc/SdUnoSlideView.hxx new file mode 100644 index 0000000000..f9f4655adc --- /dev/null +++ b/sd/source/ui/inc/SdUnoSlideView.hxx @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "DrawSubController.hxx" + +namespace sd::slidesorter { class SlideSorter; } +namespace com::sun::star::drawing { class XDrawPage; } + +namespace sd { + +/** This class implements the SlideSorter specific part of the + controller. + */ +class SdUnoSlideView final + : public DrawSubControllerInterfaceBase +{ +public: + SdUnoSlideView ( + slidesorter::SlideSorter& rSlideSorter) noexcept; + virtual ~SdUnoSlideView() noexcept override; + + // XSelectionSupplier + + virtual sal_Bool SAL_CALL select (const css::uno::Any& aSelection) override; + + virtual css::uno::Any SAL_CALL getSelection() override; + + virtual void SAL_CALL addSelectionChangeListener ( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL removeSelectionChangeListener ( + const css::uno::Reference& rxListener) override; + + // XDrawView + + virtual void SAL_CALL setCurrentPage ( + const css::uno::Reference< css::drawing::XDrawPage >& xPage) override; + + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL + getCurrentPage() override; + + // XFastPropertySet + + virtual void SAL_CALL setFastPropertyValue ( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + + virtual css::uno::Any SAL_CALL getFastPropertyValue ( + sal_Int32 nHandle) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + +private: + slidesorter::SlideSorter& mrSlideSorter; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ShellFactory.hxx b/sd/source/ui/inc/ShellFactory.hxx new file mode 100644 index 0000000000..fc05c41aba --- /dev/null +++ b/sd/source/ui/inc/ShellFactory.hxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ +typedef ToolbarId ShellId; + +template class ShellFactory +{ +public: + /** This abstract virtual class needs a destructor so that the + destructors of derived classes are called. + */ + virtual ~ShellFactory(){}; + + /** Create a new instance of a view shell for the given id that will + be stacked onto the given view shell base. + @return + Return the new view shell or NULL when a creation is not + possible. + */ + virtual ShellType* CreateShell(ShellId nId) = 0; + + /** Tell the factory that a shell is no longer in use. It may destroy + it or put it for future use in a cache. + */ + virtual void ReleaseShell(ShellType* pShell) = 0; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SlideSorter.hxx b/sd/source/ui/inc/SlideSorter.hxx new file mode 100644 index 0000000000..cbd15bd6ac --- /dev/null +++ b/sd/source/ui/inc/SlideSorter.hxx @@ -0,0 +1,208 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace vcl { class Window; } +namespace com::sun::star::frame { class XController; } +namespace rtl { template class Reference; } + +namespace sd { +class ViewShell; +class ViewShellBase; +class Window; +class FuPoor; +} + +namespace sd::slidesorter::model { class SlideSorterModel; } + +namespace sd::slidesorter::view { + class SlideSorterView; + class Theme; +} + +namespace sd::slidesorter::controller { + class SlideSorterController; + class SlotManager; + class Properties; +} + +namespace sd::slidesorter { + +/** Show previews for all the slides in a document and allow the user to + insert or delete slides and modify the order of the slides. + + This class is a facade for the model, view, and controller classes. + It is a hub that allows access to the various parts of a slide sorter. + + Note that this class is not in its final state. +*/ +class SlideSorter final +{ + friend class controller::SlotManager; +public: + ~SlideSorter(); + + /// Forbid copy construction and copy assignment + SlideSorter(const SlideSorter&) = delete; + SlideSorter& operator=(const SlideSorter&) = delete; + + /** Create a new slide sorter that is strongly coupled to the given view + shell. Use this function for a slide sorter in the left pane. + @param rViewShell + Typically a SlideSorterViewShell object. + @param rpContentWindow + Typically the content window of the ViewShell. + @param rpHorizontalScrollBar + Typically the horizontal scroll bar of the ViewShell. + @param rpVerticalScrollBar + Typically the vertical scroll bar of the ViewShell. + */ + static std::shared_ptr CreateSlideSorter ( + ViewShell& rViewShell, + sd::Window* pContentWindow, + ScrollAdaptor* pHorizontalScrollBar, + ScrollAdaptor* pVerticalScrollBar); + + /** Return the control of the vertical scroll bar. + */ + const VclPtr& GetVerticalScrollBar() const { return mpVerticalScrollBar;} + + /** Return the control of the horizontal scroll bar. + */ + const VclPtr& GetHorizontalScrollBar() const { return mpHorizontalScrollBar;} + + /** Return the content window. This is a sibling and is geometrically + enclosed by the scroll bars. + */ + const VclPtr& GetContentWindow() const { return mpContentWindow;} + + model::SlideSorterModel& GetModel() const; + + view::SlideSorterView& GetView() const; + + // Exported for unit test + SD_DLLPUBLIC controller::SlideSorterController& GetController() const; + + /** Return the view shell that was given at construction. + @return + May be empty. + */ + ViewShell* GetViewShell() const { return mpViewShell;} + + /** Return the XController object of the main view. + */ + css::uno::Reference + GetXController() const; + + /** Return the ViewShellBase object. + @return + May be empty. + */ + ViewShellBase* GetViewShellBase() const { return mpViewShellBase;} + + /** Place and size the controls and windows. You may want to call this + method when something has changed that for instance affects the + visibility state of the scroll bars. + */ + void ArrangeGUIElements ( + const Point& rOffset, + const Size& rSize); + + void RelocateToWindow (vcl::Window* pWindow); + + /** Set the current function at the view shell or, when it is not + present, set it at the content window. This method supports the use + of functions even when there is no SlideSorterViewShell. + */ + void SetCurrentFunction (const rtl::Reference& rpFunction); + + /** Return a collection of properties that are used throughout the slide + sorter. + */ + std::shared_ptr const & GetProperties() const; + + /** Return the active theme which gives access to colors and fonts. + */ + std::shared_ptr const & GetTheme() const; + +private: + /** This virtual method makes it possible to create a specialization of + the slide sorter view shell that works with its own implementation + of model, view, and controller. The default implementation simply + calls the CreateModel(), CreateView(), and CreateController() + methods in this order. + */ + void CreateModelViewController(); + + /** Create the model for the view shell. When called from the default + implementation of CreateModelViewController() then neither view nor + controller do exist. Test their pointers when in doubt. + */ + model::SlideSorterModel* CreateModel(); + + std::unique_ptr mpSlideSorterController; + std::unique_ptr mpSlideSorterModel; + std::unique_ptr mpSlideSorterView; + css::uno::WeakReference mxControllerWeak; + ViewShell* mpViewShell; + ViewShellBase* mpViewShellBase; + VclPtr mpContentWindow; + VclPtr mpHorizontalScrollBar; + VclPtr mpVerticalScrollBar; + + /** Some slide sorter wide properties that are used in different + classes. + */ + std::shared_ptr mpProperties; + std::shared_ptr mpTheme; + + SlideSorter ( + ViewShell& rViewShell, + sd::Window* pContentWindow, + ScrollAdaptor* pHorizontalScrollBar, + ScrollAdaptor* pVerticalScrollBar); + + void Init(); + /** Create the controls for the slide sorter. This are the tab bar + for switching the edit mode, the scroll bar, and the actual + slide sorter view window. + This method is usually called exactly one time from the + constructor. + */ + void SetupControls(); + + /** This method is usually called exactly one time from the + constructor. + */ + void SetupListeners(); + + /** Release the listeners that have been installed in SetupListeners(). + */ + void ReleaseListeners(); +}; + +} // end of namespace ::sd::slidesorter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SlideSorterViewShell.hxx b/sd/source/ui/inc/SlideSorterViewShell.hxx new file mode 100644 index 0000000000..64808d4343 --- /dev/null +++ b/sd/source/ui/inc/SlideSorterViewShell.hxx @@ -0,0 +1,232 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShell.hxx" +#include +#include +#include +#include +#include + +namespace sd::slidesorter::controller { class SlotManager; } + +namespace sd::slidesorter { + +class SlideSorter; + +class SAL_DLLPUBLIC_RTTI SlideSorterViewShell final + : public ViewShell +{ + friend class controller::SlotManager; + +public: + SFX_DECL_INTERFACE(SD_IF_SDSLIDESORTERVIEWSHELL) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + static std::shared_ptr Create( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameView); + + virtual ~SlideSorterViewShell() override; + + /** Late initialization that has to be called after a new instance has + completed its construction. + */ + virtual void Init (bool bIsMainViewShell) override; + + /** Return a slide sorter that is currently displayed in one of the + panes that belong to the given ViewShellBase object. + When there is only one slide sorter visible then that one is + returned. When two (or more) are visible then the one in the center + pane is returned. When no slidesorter is visible then NULL is + returned. + */ + // Exported for unit test + SD_DLLPUBLIC static SlideSorterViewShell* GetSlideSorter(ViewShellBase& rBase); + + virtual SdPage* GetActualPage() override; + + /// inherited from sd::ViewShell + virtual SdPage* getCurrentPage() const override; + + void ExecCtrl (SfxRequest& rRequest); + void GetCtrlState (SfxItemSet &rSet); + void FuSupport (SfxRequest& rRequest); + void FuTemporary (SfxRequest& rRequest); + void GetStatusBarState (SfxItemSet& rSet); + void FuPermanent (SfxRequest& rRequest); + void GetAttrState (SfxItemSet& rSet); + static void ExecStatusBar (SfxRequest& rRequest); + virtual void Command (const CommandEvent& rEvent, ::sd::Window* pWindow) override; + void GetMenuState (SfxItemSet &rSet); + void GetClipboardState (SfxItemSet &rSet); + + virtual void ReadFrameViewData (FrameView* pView) override; + virtual void WriteFrameViewData() override; + + /** Set the zoom factor. The given value is clipped against an upper + bound. + @param nZoom + An integer percent value, i.e. nZoom/100 is the actual zoom + factor. + */ + virtual void SetZoom (::tools::Long nZoom) override; + virtual void SetZoomRect (const ::tools::Rectangle& rZoomRect) override; + + /** This is a callback method used by the active window to delegate its + Paint() call to. This view shell itself delegates it to the view. + */ + virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override; + + /** Place and size the controls and windows. You may want to call this + method when something has changed that for instance affects the + visibility state of the scroll bars. + */ + virtual void ArrangeGUIElements() override; + + virtual void Activate (bool IsMDIActivate) override; + virtual void Deactivate (bool IsMDIActivate) override; + + /** Move slides up and down. Mainly uno commands. */ + void ExecMovePageUp (SfxRequest& rReq); + void GetStateMovePageUp (SfxItemSet& rSet); + + void ExecMovePageDown (SfxRequest& rReq); + void GetStateMovePageDown (SfxItemSet& rSet); + + void ExecMovePageFirst (SfxRequest& rReq); + void GetStateMovePageFirst (SfxItemSet& rSet); + + void ExecMovePageLast (SfxRequest& rReq); + void GetStateMovePageLast (SfxItemSet& rSet); + + + //===== Drag and Drop ===================================================== + + void StartDrag ( + const Point& rDragPt, + vcl::Window* pWindow ); + virtual sal_Int8 AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer ) override; + virtual sal_Int8 ExecuteDrop ( + const ExecuteDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) override; + + typedef ::std::vector PageSelection; + + /** Return the set of selected pages. + */ + std::shared_ptr GetPageSelection() const; + + void SetPageSelection (const std::shared_ptr& rSelection); + + /** Add a listener that is called when the selection of the slide sorter + changes. + @param rListener + When this method is called multiple times for the same listener + the second and all following calls are ignored. Each listener + is added only once. + */ + void AddSelectionChangeListener (const Link& rListener); + + /** Remove a listener that was called when the selection of the slide + sorter changes. + @param rListener + It is safe to pass a listener that was not added are has been + removed previously. Such calls are ignored. + */ + void RemoveSelectionChangeListener (const Link& rListener); + + virtual css::uno::Reference CreateSubController() override; + + /** Create an accessible object representing the specified window. + @param pWindow + The returned object makes the document displayed in this window + accessible. + @return + Returns an AccessibleSlideSorterView object. + */ + virtual css::uno::Reference + CreateAccessibleDocumentView (::sd::Window* pWindow) override; + // handle SlideSorterView specially because AccessibleSlideSorterView doesn't inherit from AccessibleDocumentViewBase + virtual void SwitchViewFireFocus( const css::uno::Reference< css::accessibility::XAccessible >& xAcc ) override; + + // Exported for unit test + SD_DLLPUBLIC SlideSorter& GetSlideSorter() const; + + /** Try to relocate all toplevel window elements to the given parent + window. + */ + virtual bool RelocateToParentWindow (vcl::Window* pParentWindow) override; + +private: + + /** Override this method to handle a missing tool bar correctly. + This is the case when the slide sorter is not the main view shell. + */ + virtual SfxUndoManager* ImpGetUndoManager() const override; + + std::shared_ptr mpSlideSorter; + bool mbIsArrangeGUIElementsPending; + + SlideSorterViewShell ( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameView); + void Initialize(); + + /** This method overwrites the one from our base class: We do our own + scroll bar and the base class call is thus unnecessary. It simply + calls UpdateScrollBars(false). + */ + virtual void UpdateScrollBars() override; + + void PostMoveSlidesActions(const std::shared_ptr &rpSelection); + + void MainViewEndEditAndUnmarkAll(); + + /** Select the same pages in the document as are selected in the + SlideSorterViewShell + + return the page numbers of the first and last selected pages + */ + std::pair SyncPageSelectionToDocument(const std::shared_ptr &rpSelection); +}; + +typedef std::shared_ptr SharedPageSelection; + +} // end of namespace ::sd::slidesorter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SlideSorterViewShellBase.hxx b/sd/source/ui/inc/SlideSorterViewShellBase.hxx new file mode 100644 index 0000000000..38bf649198 --- /dev/null +++ b/sd/source/ui/inc/SlideSorterViewShellBase.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ImpressViewShellBase.hxx" + +namespace sd +{ +/** This class exists to be able to register a factory that creates a + slide sorter view shell as default. +*/ +class SlideSorterViewShellBase final : public ImpressViewShellBase +{ +public: + SFX_DECL_VIEWFACTORY(SlideSorterViewShellBase); + + /** This constructor is used by the view factory of the SFX + macros. + */ + SlideSorterViewShellBase(SfxViewFrame& rFrame, SfxViewShell* pOldShell); + virtual ~SlideSorterViewShellBase() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SlideTransitionPane.hxx b/sd/source/ui/inc/SlideTransitionPane.hxx new file mode 100644 index 0000000000..2672bfa630 --- /dev/null +++ b/sd/source/ui/inc/SlideTransitionPane.hxx @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include "SlideSorterViewShell.hxx" + +#include +#include +#include +#include + +#include +#include + +class SdDrawDocument; + +namespace com::sun::star::drawing { class XDrawView; } +namespace com::sun::star::frame { class XModel; } +namespace sd::tools { class EventMultiplexerEvent; } + +namespace sd +{ + +class TransitionPane; +class ViewShellBase; + +namespace impl +{ + struct TransitionEffect; +} + +class SlideTransitionPane final : public PanelLayout + , public sfx2::sidebar::ILayoutableWindow +{ +public: + explicit SlideTransitionPane( + weld::Widget* pParent, + ViewShellBase & rBase); + virtual ~SlideTransitionPane() override; + + // ILayoutableWindow + virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override; + + void onSelectionChanged(); + void onChangeCurrentPage(); + +private: + void updateControls(); + void updateControlState(); + void updateVariants(size_t nPresetOffset); + + void updateSoundList(); + void openSoundFileDialog(); + + impl::TransitionEffect getTransitionEffectFromControls() const; + + void applyToSelectedPages(bool bPreview); + void playCurrentEffect(); + + void addListener(); + void removeListener(); + + ::sd::slidesorter::SharedPageSelection getSelectedPages() const; + + void Initialize(SdDrawDocument* pDoc); + + DECL_LINK( ApplyToAllButtonClicked, weld::Button&, void ); + DECL_LINK( PlayButtonClicked, weld::Button&, void ); + DECL_LINK( AutoPreviewClicked, weld::Toggleable&, void ); + + DECL_LINK( TransitionSelected, ValueSet*, void ); + DECL_LINK( AdvanceSlideRadioButtonToggled, weld::Toggleable&, void ); + DECL_LINK( AdvanceTimeModified, weld::MetricSpinButton&, void ); + DECL_LINK( VariantListBoxSelected, weld::ComboBox&, void ); + DECL_LINK( DurationModifiedHdl, weld::MetricSpinButton&, void ); + DECL_LINK( DurationLoseFocusHdl, weld::Widget&, void ); + DECL_LINK( SoundListBoxSelected, weld::ComboBox&, void ); + DECL_LINK( LoopSoundBoxChecked, weld::Toggleable&, void ); + DECL_LINK( EventMultiplexerListener, tools::EventMultiplexerEvent&, void ); + DECL_LINK(LateInitCallback, Timer *, void); + + ViewShellBase & mrBase; + SdDrawDocument * mpDrawDoc; + + std::unique_ptr mxVS_TRANSITION_ICONS; + std::unique_ptr mxVS_TRANSITION_ICONSWin; + std::unique_ptr mxLB_VARIANT; + std::unique_ptr mxCBX_duration; + std::unique_ptr mxFT_SOUND; + std::unique_ptr mxLB_SOUND; + std::unique_ptr mxCB_LOOP_SOUND; + std::unique_ptr mxRB_ADVANCE_ON_MOUSE; + std::unique_ptr mxRB_ADVANCE_AUTO; + std::unique_ptr mxMF_ADVANCE_AUTO_AFTER; + std::unique_ptr mxPB_APPLY_TO_ALL; + std::unique_ptr mxPB_PLAY; + std::unique_ptr mxCB_AUTO_PREVIEW; + + css::uno::Reference< css::drawing::XDrawView > mxView; + css::uno::Reference< css::frame::XModel > mxModel; + + bool mbHasSelection; + bool mbUpdatingControls; + bool mbIsMainViewChangePending; + + std::vector maSoundList; + mutable OUString maCurrentSoundFile; + + // How many variants each transition set has + std::map< OUString, int > m_aNumVariants; + + Timer maLateInitTimer; +}; + +} // namespace sd + +// INCLUDED_SD_SOURCE_UI_ANIMATIONS_SLIDETRANSITIONPANE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/SpellDialogChildWindow.hxx b/sd/source/ui/inc/SpellDialogChildWindow.hxx new file mode 100644 index 0000000000..3d2163a7e0 --- /dev/null +++ b/sd/source/ui/inc/SpellDialogChildWindow.hxx @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SdOutliner; + +namespace sd +{ +/** This derivation of the svx::SpellDialogChildWindow base class + provides Draw and Impress specific implementations of + GetNextWrongSentence() and ApplyChangedSentence(). +*/ +class SpellDialogChildWindow final : public svx::SpellDialogChildWindow, public SfxListener +{ +public: + SpellDialogChildWindow(vcl::Window* pParent, sal_uInt16 nId, SfxBindings* pBindings, + SfxChildWinInfo* pInfo); + virtual ~SpellDialogChildWindow() override; + + /** This method makes the one from the base class public so that + it can be called from the view shell when one is created. + */ + void InvalidateSpellDialog(); + + // SfxListener + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + + SFX_DECL_CHILDWINDOW_WITHID(SpellDialogChildWindow); + +private: + /** Iterate over the sentences in all text shapes and stop at the + next sentence with spelling errors. While doing so the view + mode may be changed and text shapes are set into edit mode. + */ + virtual svx::SpellPortions GetNextWrongSentence(bool bRecheck) override; + + /** This method is responsible for merging corrections made in the + spelling dialog back into the document. + */ + virtual void ApplyChangedSentence(const svx::SpellPortions& rChanged, bool bRecheck) override; + virtual void GetFocus() override; + virtual void LoseFocus() override; + + /** This outliner is used to do the main work of iterating over a + document and finding sentences with spelling errors. + */ + SdOutliner* mpSdOutliner; + + /** When this flag is then eventually we have to destroy + the outliner in mpSdOutliner. + */ + bool mbOwnOutliner; + + /** Provide an outliner in the mpSdOutliner data member. When the + view shell has changed since the last call this include the + deletion/release of formerly created/obtained one prior to + construction/obtaining of a new one. + */ + void ProvideOutliner(); + + void EndSpellingAndClearOutliner(); +}; + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/TabControl.hxx b/sd/source/ui/inc/TabControl.hxx new file mode 100644 index 0000000000..5e5eba7bbf --- /dev/null +++ b/sd/source/ui/inc/TabControl.hxx @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd { + +/** + * TabControl-Class for page switch + */ + +class DrawViewShell; + +class TabControl final + : public TabBar, + public DragSourceHelper, + public DropTargetHelper +{ +public: + TabControl (DrawViewShell* pDrViewSh, vcl::Window* pParent); + virtual void dispose() override; + virtual ~TabControl() override; + + /** Inform all listeners of this control that the current page has been + activated. Call this method after switching the current page and is + not done elsewhere (like when using page up/down keys). + */ + void SendActivatePageEvent(); + + /** Inform all listeners of this control that the current page has been + deactivated. Call this method before switching the current page and + is not done elsewhere (like when using page up/down keys). + */ + void SendDeactivatePageEvent(); + +private: + DrawViewShell* pDrViewSh; + bool bInternalMove; + + // TabBar + virtual void Select() override; + virtual void DoubleClick() override; + virtual void MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Command(const CommandEvent& rCEvt) override; + + virtual bool StartRenaming() override; + virtual TabBarAllowRenamingReturnCode AllowRenaming() override; + virtual void EndRenaming() override; + + virtual void ActivatePage() override; + virtual bool DeactivatePage() override; + + // DragSourceHelper + virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override; + + // DropTargetHelper + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + + // nested class to implement the TransferableHelper + class TabControlTransferable final : public TransferableHelper + { + public: + explicit TabControlTransferable( TabControl& rParent ) : + mrParent( rParent ) {} + private: + + TabControl& mrParent; + + virtual ~TabControlTransferable() override; + + virtual void AddSupportedFormats() override; + virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override; + virtual void DragFinished( sal_Int8 nDropAction ) override; + + }; + + friend class TabControl::TabControlTransferable; + + void DragFinished(); + + using TabBar::StartDrag; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/TableDesignPane.hxx b/sd/source/ui/inc/TableDesignPane.hxx new file mode 100644 index 0000000000..33fe87006f --- /dev/null +++ b/sd/source/ui/inc/TableDesignPane.hxx @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::beans { class XPropertySet; } +namespace com::sun::star::container { class XIndexAccess; class XNameContainer; } +namespace com::sun::star::drawing { class XDrawView; } + +namespace sd +{ + +namespace tools { +class EventMultiplexerEvent; +} + +class ViewShellBase; + +enum TableCheckBox : sal_uInt16 +{ + CB_HEADER_ROW = 0, + CB_TOTAL_ROW = 1, + CB_BANDED_ROWS = 2, + CB_FIRST_COLUMN = 3, + CB_LAST_COLUMN = 4, + CB_BANDED_COLUMNS = 5, + CB_COUNT = CB_BANDED_COLUMNS + 1 +}; + +class TableValueSet final : public ValueSet +{ +private: + bool m_bModal; + Link maContextMenuHandler; +public: + TableValueSet(std::unique_ptr pScrolledWindow); + virtual bool Command(const CommandEvent& rEvent) override; + virtual void Resize() override; + virtual void StyleUpdated() override; + void updateSettings(); + void setModal(bool bModal) { m_bModal = bModal; } + void SetContextMenuHandler(const Link& rLink) { maContextMenuHandler = rLink; } + static constexpr int getMaxRowCount() { return 3; } +}; + +class TableDesignWidget final +{ +public: + TableDesignWidget(weld::Builder& rBuilder, ViewShellBase& rBase); + ~TableDesignWidget(); + + // callbacks + void onSelectionChanged(); + + void ApplyOptions(); + void ApplyStyle(); + void InsertStyle(); + void CloneStyle(); + void ResetStyle(); + void DeleteStyle(); + void EditStyle(const OUString& rCommand); + +private: + void addListener(); + void removeListener(); + void updateControls(); + void selectStyle(std::u16string_view rStyle); + void endTextEditForStyle(const css::uno::Reference& rStyle); + void setDocumentModified(); + + void FillDesignPreviewControl(); + + DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void); + DECL_LINK(implContextMenuHandler, const Point*, void); + DECL_LINK(implValueSetHdl, ValueSet*, void); + DECL_LINK(implCheckBoxHdl, weld::Toggleable&, void); + + ViewShellBase& mrBase; + + std::unique_ptr m_xMenu; + std::unique_ptr m_xValueSet; + std::unique_ptr m_xValueSetWin; + std::unique_ptr m_aCheckBoxes[CB_COUNT]; + + css::uno::Reference< css::beans::XPropertySet > mxSelectedTable; + css::uno::Reference< css::drawing::XDrawView > mxView; + css::uno::Reference< css::container::XIndexAccess > mxTableFamily; + css::uno::Reference< css::container::XNameContainer > mxCellFamily; +}; + +class TableDesignPane final : public PanelLayout + , public sfx2::sidebar::ILayoutableWindow +{ +private: + std::unique_ptr m_xImpl; +public: + TableDesignPane( weld::Widget* pParent, ViewShellBase& rBase ) + : PanelLayout(pParent, "TableDesignPanel", + "modules/simpress/ui/tabledesignpanel.ui") + , m_xImpl(new TableDesignWidget(*m_xBuilder, rBase)) + { + } + virtual css::ui::LayoutSize GetHeightForWidth(const sal_Int32 /*nWidth*/) override + { + sal_Int32 nMinimumHeight = get_preferred_size().Height(); + return css::ui::LayoutSize(nMinimumHeight, -1, nMinimumHeight); + } +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/TemplateScanner.hxx b/sd/source/ui/inc/TemplateScanner.hxx new file mode 100644 index 0000000000..7924cc294c --- /dev/null +++ b/sd/source/ui/inc/TemplateScanner.hxx @@ -0,0 +1,176 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "tools/AsynchronousTask.hxx" +#include +#include + +#include +#include +#include + +namespace com::sun::star::ucb +{ +class XContent; +class XCommandEnvironment; +} + +namespace com::sun::star::sdbc +{ +class XResultSet; +} + +namespace sd +{ +/** Representation of a template or layout file. +*/ +class TemplateEntry +{ +public: + TemplateEntry(OUString sTitle, OUString sPath) + : msTitle(std::move(sTitle)) + , msPath(std::move(sPath)) + { + } + + OUString msTitle; + OUString msPath; +}; + +/** This class scans the template folders for impress templates. There are + two ways to use this class. + 1. The old and deprecated way is to call Scan() to scan all templates + and collect the supported ones in a tree structure. This structure is + returned by GetFolderList(). + 2. The new way implements the AsynchronousTask interface. Call + RunNextStep() as long HasNextStep() returns . After every step + GetLastAddedEntry() returns the template that was scanned (and has a + supported format) last. When a step does not add a new template then + the value of the previous step is returned. +*/ +class TemplateScanner final : public ::sd::tools::AsynchronousTask +{ +public: + /** Create a new template scanner and prepare but do not execute the scanning. + */ + TemplateScanner(); + + /** The destructor deletes any remaining entries of the local list of + templates. + */ + virtual ~TemplateScanner(); + + /** Implementation of the AsynchronousTask interface method. + */ + virtual void RunNextStep() override; + + /** Implementation of the AsynchronousTask interface method. + */ + virtual bool HasNextStep() override; + + /** Return the TemplateDir object that was last added to + mpTemplateEntries. + @return + is returned either before the template scanning is + started or after it has ended. + */ + const TemplateEntry* GetLastAddedEntry() const + { + return mpTemplateEntries.empty() ? nullptr : mpTemplateEntries.back().get(); + } + +private: + /** The current state determines which step will be executed next by + RunNextStep(). + */ + enum State + { + INITIALIZE_SCANNING, + INITIALIZE_FOLDER_SCANNING, + GATHER_FOLDER_LIST, + SCAN_FOLDER, + INITIALIZE_ENTRY_SCAN, + SCAN_ENTRY, + DONE, + ERROR + }; + State meState; + + ::ucbhelper::Content maFolderContent; + ::std::vector> mpTemplateEntries; + + /** The folders that are collected by GatherFolderList(). + */ + class FolderDescriptorList; + std::unique_ptr mpFolderDescriptors; + + /** Set of state variables used by the methods + InitializeFolderScanning(), GatherFolderList(), ScanFolder(), + InitializeEntryScanning(), and ScanEntry(). + */ + css::uno::Reference mxTemplateRoot; + css::uno::Reference mxFolderEnvironment; + css::uno::Reference mxEntryEnvironment; + css::uno::Reference mxFolderResultSet; + css::uno::Reference mxEntryResultSet; + + /** Obtain the root folder of the template folder hierarchy. The result + is stored in mxTemplateRoot for later use. + */ + State GetTemplateRoot(); + + /** Initialize the scanning of folders. This is called exactly once. + @return + Returns one of the two states ERROR or GATHER_FOLDER_LIST. + */ + State InitializeFolderScanning(); + + /** Collect all available top-level folders in an ordered list which can + then be processed by ScanFolder(). + @return + Returns one of the two states ERROR or SCAN_FOLDER. + */ + State GatherFolderList(); + + /** From the list of top-level folders collected by GatherFolderList() + the one with highest priority is processed. + @return + Returns one of the states ERROR, DONE, or INITIALIZE_ENTRY_SCAN. + */ + State ScanFolder(); + + /** Initialize the scanning of entries of a top-level folder. + @return + Returns one of the states ERROR or SCAN_ENTRY. + */ + State InitializeEntryScanning(); + + /** Scan one entry. When this entry matches the recognized template + types it is appended to the result set. + @return + Returns one of the states ERROR, SCAN_ENTRY, or SCAN_FOLDER. + */ + State ScanEntry(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/TextObjectBar.hxx b/sd/source/ui/inc/TextObjectBar.hxx new file mode 100644 index 0000000000..61394834fb --- /dev/null +++ b/sd/source/ui/inc/TextObjectBar.hxx @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd { + +class View; +class ViewShell; + +class TextObjectBar final + : public SfxShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDDRAWTEXTOBJECTBAR) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + TextObjectBar ( + ViewShell* pSdViewShell, + SfxItemPool& rItemPool, + ::sd::View* pSdView); + virtual ~TextObjectBar() override; + + void GetAttrState( SfxItemSet& rSet ); + void GetCharState( SfxItemSet& rSet ); + void Execute( SfxRequest &rReq ); + +private: + ViewShell* mpViewShell; + ::sd::View* mpView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ToolBarManager.hxx b/sd/source/ui/inc/ToolBarManager.hxx new file mode 100644 index 0000000000..da5325cf69 --- /dev/null +++ b/sd/source/ui/inc/ToolBarManager.hxx @@ -0,0 +1,274 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ShellFactory.hxx" +#include + +#include +#include +#include + +class SdrView; +namespace sd { class ViewShell; } +namespace sd::tools { class EventMultiplexer; } + +namespace sd { + +class ViewShellBase; +class ViewShellManager; + +/** Manage the set of visible tool bars (and object bars). Usually they + belong to the current view in the center pane. + + Tool bars are managed in groups. Each group can be set, reset, or + modified independently of the others. This allows for instance to + replace the toolbars associated with the current function independently + from those associated with the main view. + + The ToolBarManager has two high level methods which contain the + knowledge about which tool bars to show in a specific context. + When the view in the center pane changes then MainViewShellChanged() + sets up the tool bars for the new view. On changes of the selection the + SelectionHasChanged() method shows the tool bars for the new context. + + The update of the actually visible tool bars to the set currently + required by the main view shell and its functions is divided into two + parts, PreUpdate() and PostUpdate(). This are to be called before + respectively after the update of the view shell stack. The reason for + this is to save time by not updating tool bars that will not be visible + in a short time on a view shell switch. +*/ +class ToolBarManager + : public std::enable_shared_from_this +{ +public: + /** Use this method instead of the constructor to create new objects of + this class. + */ + static std::shared_ptr Create ( + ViewShellBase& rBase, + const std::shared_ptr& rpMultiplexer, + const std::shared_ptr& rpViewShellManager); + + ~ToolBarManager(); + + /** Call this method prior to the destructor to prevent the + ToolBarManager from accessing the ViewShellManager or the + XLayoutManager when those are possibly not well and alive anymore + (like during the destruction of the ViewShellBase.) + */ + void Shutdown(); + + /** When the view in the center pane changes then this method sets up + the initial set of tool bars for the new view. + The ToolBarManager listens for view switching itself and then calls + MainViewShellChanged(). Calling this method from the outside should + not be necessary. + @param nShellType + The type of the new main view shell. + */ + void MainViewShellChanged (); + void MainViewShellChanged (const ViewShell& rMainViewShell); + + /** Call this method when the selection has changed to update the more + temporary tool bars (those in the ToolBarGroup::Function group.) + */ + void SelectionHasChanged ( + const ViewShell& rViewShell, + const SdrView& rView); + + /** The set of tool bars that are handled by this manager class. + */ + constexpr static OUString msToolBar = u"toolbar"_ustr; // Draw_Toolbox_Sd, 23011 + constexpr static OUString msOptionsToolBar = u"optionsbar"_ustr; + // Draw_Options_Toolbox, 23020 + constexpr static OUString msCommonTaskToolBar = u"commontaskbar"_ustr; + // Draw_CommonTask_Toolbox, 23021 + constexpr static OUString msViewerToolBar = u"viewerbar"_ustr; // Draw_Viewer_Toolbox, 23023 + constexpr static OUString msSlideSorterToolBar = u"slideviewtoolbar"_ustr; + // Slide_Toolbox, 23012 + constexpr static OUString msSlideSorterObjectBar = u"slideviewobjectbar"_ustr; + // Slide_Obj_Toolbox, 23014 + constexpr static OUString msOutlineToolBar = u"outlinetoolbar"_ustr; // Outline_Toolbox, 23017 + constexpr static OUString msMasterViewToolBar = u"masterviewtoolbar"_ustr; + // SID_MASTERPAGE, 27053 + constexpr static OUString msDrawingObjectToolBar = u"drawingobjectbar"_ustr; + // Draw_Obj_Toolbox, 23013 + constexpr static OUString msGluePointsToolBar = u"gluepointsobjectbar"_ustr; + // Gluepoints_Toolbox, 23019 + constexpr static OUString msTextObjectBar = u"textobjectbar"_ustr; + // Draw_Text_Toolbox_Sd, 23016 + constexpr static OUString msBezierObjectBar = u"bezierobjectbar"_ustr; + // Bezier_Toolbox_Sd, 23015 + constexpr static OUString msGraphicObjectBar = u"graphicobjectbar"_ustr; + // Draw_Graf_Toolbox, 23030 + constexpr static OUString msMediaObjectBar = u"mediaobjectbar"_ustr; + // Draw_Media_Toolbox, 23031 + constexpr static OUString msTableObjectBar = u"tableobjectbar"_ustr; + // Draw_Table_Toolbox, 23018 + + /** The set of tool bar groups. + */ + enum class ToolBarGroup { + Permanent, + Function, + CommonTask, + MasterMode, + LAST = MasterMode + }; + + /** Reset the set of visible object bars in the specified group. Tool + bars in other groups are not affected. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + @param eGroup + Only the tool bars in this group are rest. + */ + void ResetToolBars (ToolBarGroup eGroup); + + /** Reset all tool bars, regardless of the group they belong to. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + */ + void ResetAllToolBars(); + + /** Add the tool bar with the given name to the specified group of tool + bars. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + @param eGroup + The new tool bar is added to this group. + @param rsToolBarName + The base name of the tool bar. A proper prefix (like + private:resource/toolbar/) is added. The name may be one of the + ones defined above. Other names are allowed as well. + */ + void AddToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName); + + /** Add the tool bar shell to the shell stack. This method basically + forwards the call to the ViewShellManager. + For some tool bar shells additional tool bars are made visible. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + @param eGroup + The group is used for the actual tool bars. + @param nToolBarId + Id of the tool bar shell. + */ + void AddToolBarShell ( + ToolBarGroup eGroup, + ShellId nToolBarId); + + /** Remove the tool bar with the given name from the specified group. + If the tool bar is not visible then nothing happens. + If the tool bar is a member of another group then nothing happens + either. + */ + void RemoveToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName); + + /** This is basically a shortcut for ResetToolBars(),AddToolBar(). The + main difference is, that all sub shells of the specified parent + shell are deactivated as well. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + @param eGroup + The new tool bar is added to this group. + @param rsToolBarName + The base name of the tool bar. A proper prefix (like + private:resource/toolbar/) is added. The name may be one of the + ones defined above. Other names are allowed as well. + */ + void SetToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName); + + /** This is basically a shortcut for ResetToolBars(),AddToolBar(). The + main difference is, that all sub shells of the specified parent + shell are deactivated as well. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + @param rParentShell + When this shell is not the main view then the method returns + immediately. + @param eGroup + The group is currently not used. + @param nToolBarId + Id of the tool bar shell. + */ + void SetToolBarShell ( + ToolBarGroup eGroup, + ShellId nToolBarId); + + void PreUpdate(); + + /** Request an update of the active tool bars. The update is made + asynchronously. + */ + void RequestUpdate(); + + /** This is a hint for the ToolBarManager to improve the performance + when it updates its tool bars when its own lock is released. Taking + control of the release of the update lock of the ViewShellManager + avoids some shell stack modifications and tool bar updates. + */ + void LockViewShellManager(); + + /** Use this class to prevent the visible tool bars from being updated + (and thus causing repaints and GUI rearrangements) when several tool + bar operations are made in a row. + */ + class UpdateLock { public: + UpdateLock(std::shared_ptr pManager) + : mpManager(std::move(pManager)) { mpManager->LockUpdate(); } + ~UpdateLock() COVERITY_NOEXCEPT_FALSE { mpManager->UnlockUpdate(); } + private: + std::shared_ptr mpManager; + }; + friend class UpdateLock; + + void ToolBarsDestroyed(); + +private: + class Implementation; + std::unique_ptr mpImpl; + + /** The ViewShellBase is used to get the XLayoutManager and to determine + the plug in mode. + */ + ToolBarManager(); + + void LockUpdate(); + void UnlockUpdate(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/UndoThemeChange.hxx b/sd/source/ui/inc/UndoThemeChange.hxx new file mode 100644 index 0000000000..798f2adb50 --- /dev/null +++ b/sd/source/ui/inc/UndoThemeChange.hxx @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include +#include +#include + +class SdDrawDocument; + +namespace sd +{ +class UndoThemeChange : public SdUndoAction +{ +private: + SdrPage* mpMasterPage; + std::shared_ptr mpOldColorSet; + std::shared_ptr mpNewColorSet; + +public: + UndoThemeChange(SdDrawDocument* pDocument, SdrPage* pMasterPage, + std::shared_ptr const& pOldColorSet, + std::shared_ptr const& pNewColorSet); + + virtual void Undo() override; + virtual void Redo() override; +}; + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx new file mode 100644 index 0000000000..342bf7b625 --- /dev/null +++ b/sd/source/ui/inc/View.hxx @@ -0,0 +1,300 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "smarttag.hxx" +#include "fusearch.hxx" + +class SdDrawDocument; +class SdPage; +class SdrOle2Obj; +class SdrGrafObj; +class SdrMediaObj; +class OutputDevice; +class ImageMap; +class Graphic; +class SdrOutliner; + +namespace avmedia { class PlayerListener; } + +namespace sd { + +class DrawDocShell; +class ViewShell; +class Window; +class ViewClipboard; + +//For master view we want to force that master +//textboxes have readonly text, because the +//text is the auto-generated click-here-to-edit +//and it doesn't help to change it +class OutlinerMasterViewFilter +{ +private: + SdrOutliner *m_pOutl; + bool m_bReadOnly; +public: + OutlinerMasterViewFilter() + : m_pOutl(nullptr) + , m_bReadOnly(false) + { + } + void Start(SdrOutliner *pOutl); + void End(); +}; + +class SearchContext +{ +private: + rtl::Reference maFunctionSearch; + +public: + rtl::Reference& getFunctionSearch() + { + return maFunctionSearch; + } + + void setSearchFunction(rtl::Reference const & xFunction) + { + resetSearchFunction(); + maFunctionSearch = xFunction; + } + + void resetSearchFunction() + { + if (maFunctionSearch.is()) + maFunctionSearch->Dispose(); + } +}; + +class SAL_DLLPUBLIC_RTTI View : public FmFormView +{ +public: + + View ( + SdDrawDocument& rDrawDoc, + OutputDevice* pOutDev, + ViewShell* pViewSh=nullptr); + virtual ~View() override; + + void CompleteRedraw( OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector = nullptr) override; + + virtual void GetAttributes( SfxItemSet& rTargetSet, bool bOnlyHardAttr = false ) const; + virtual bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll = false, bool bSlide = false, bool bMaster = false); + virtual void MarkListHasChanged() override; + void SelectAll(); + void DoCut(); + void DoCopy(); + void DoPaste(::sd::Window* pWindow=nullptr); + virtual void DoConnect(SdrOle2Obj* pOleObj) override; + virtual bool SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr = false); + void StartDrag( const Point& rStartPos, vcl::Window* pWindow ); + virtual void DragFinished( sal_Int8 nDropAction ); + virtual sal_Int8 AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + SdrLayerID nLayer); + virtual sal_Int8 ExecuteDrop ( + const ExecuteDropEvent& rEvt, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer); + + css::uno::Reference + CreateClipboardDataObject (); + css::uno::Reference + CreateDragDataObject (::sd::View*, vcl::Window& rWindow, + const Point& rDragPos); + css::uno::Reference + CreateSelectionDataObject (::sd::View*); + + // update clipboard to what is selected + void UpdateSelectionClipboard(); + + // release content of clipboard, if we own the content + void ClearSelectionClipboard(); + + DrawDocShell* GetDocSh() const { return mpDocSh; } + inline SdDrawDocument& GetDoc() const; + ViewShell* GetViewShell() const { return mpViewSh; } + SfxViewShell* GetSfxViewShell() const override; + + // Create a local UndoManager + std::unique_ptr createLocalTextUndoManager() override; + + virtual bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = nullptr, vcl::Window* pWin = nullptr, bool bIsNewObj = false, + SdrOutliner* pGivenOutliner = nullptr, OutlinerView* pGivenOutlinerView = nullptr, + bool bDontDeleteOutliner = false, bool bOnlyOneView = false, bool bGrabFocus = true) override; + + virtual SdrEndTextEditKind SdrEndTextEdit(bool bDontDeleteReally = false) override; + + bool RestoreDefaultText( SdrTextObj* pTextObj ); + + bool InsertData( const TransferableDataHelper& rDataHelper, + const Point& rPos, sal_Int8& rDnDAction, bool bDrag, + SotClipboardFormatId nFormat = SotClipboardFormatId::NONE, + sal_uInt16 nPage = SDRPAGE_NOTFOUND, SdrLayerID nLayer = SDRLAYER_NOTFOUND ); + /** gets the metafile from the given transferable helper and insert it as a graphic shape. + @param bOptimize if set to true, the metafile is analyzed and if only one bitmap action is + present, then is inserted as a single graphic. + */ + bool InsertMetaFile( const TransferableDataHelper& rDataHelper, + const Point& rInsertPos, + ImageMap const * pImageMap, bool bOptimize ); + SdrGrafObj* InsertGraphic( const Graphic& rGraphic, + sal_Int8& rAction, const Point& rPos, + SdrObject* pSelectedObj, ImageMap const * pImageMap ); + void InsertMediaURL( const OUString& rMediaURL, sal_Int8& rAction, + const Point& rPos, const Size& rSize, + bool const bLink ); + SdrMediaObj* InsertMediaObj(const OUString& rURL, sal_Int8& rAction, + const Point& rPos, const Size& rSize ); + + bool PasteRTFTable( const ::tools::SvRef& xStm, SdrPage* pPage, SdrInsertFlags nPasteOptions ); + + bool IsPresObjSelected(bool bOnPage = true, bool bOnMasterPage = true, bool bCheckPresObjListOnly = false, bool bCheckLayoutOnly = false) const; + + void SetMarkedOriginalSize(); + + bool IsMorphingAllowed() const; + bool IsVectorizeAllowed() const; + + virtual SfxStyleSheet* GetStyleSheet() const; + + /** return parameter: + pExchangeList == NULL -> all names are unique + bNameOK == false -> cancel by user + nType == 0 -> pages + nType == 1 -> objects + nType == 2 -> pages and objects */ + + bool GetExchangeList( std::vector &rExchangeList, + std::vector &rBookmarkList, + const sal_uInt16 nType ); + + virtual void onAccessibilityOptionsChanged() override; + + /** returns true if we have an undo manager and there is an open list undo action */ + bool isRecordingUndo() const; + + virtual void AddCustomHdl() override; + + SmartTagSet& getSmartTags() { return maSmartTags; } + void updateHandles(); + + virtual SdrViewContext GetContext() const override; + virtual bool HasMarkablePoints() const override; + virtual sal_Int32 GetMarkablePointCount() const override; + virtual bool HasMarkedPoints() const override; + virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark=false) override; + virtual void CheckPossibilities() override; + virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) override; + using SdrMarkView::MarkPoints; + + bool ShouldToggleOn( + const bool bBulletOnOffMode, + const bool bNormalBullet); + + /** change the bullets/numbering of the marked objects + + @param bToggle + true: just toggle the current bullets/numbering on --> off resp. off --> on + + @param bHandleBullets + true: handle bullets + false: handle numbering + + @param pNumRule + numbering rule which needs to be applied. can be 0. + */ + void ChangeMarkedObjectsBulletsNumbering( + const bool bToggle, + const bool bHandleBullets, + const SvxNumRule* pNumRule); + + void SetPossibilitiesDirty() { m_bPossibilitiesDirty = true; } + void SetMoveAllowed( bool bSet ) { m_bMoveAllowed = bSet; } + void SetMoveProtected( bool bSet ) { m_bMoveProtect = bSet; } + void SetResizeFreeAllowed( bool bSet ) { m_bResizeFreeAllowed = bSet; } + void SetResizePropAllowed( bool bSet ) { m_bResizePropAllowed = bSet; } + void SetResizeProtected( bool bSet ) { m_bResizeProtect = bSet; } + + SdrObject* GetEmptyPresentationObject( PresObjKind eKind ); + SdPage* GetPage(); + SdrObject* GetSelectedSingleObject(SdPage const * pPage); + void SetAuthor(const OUString& rAuthor) { m_sAuthor = rAuthor; } + const OUString& GetAuthor() const { return m_sAuthor; } + + SearchContext& getSearchContext() { return maSearchContext; } +protected: + DECL_DLLPRIVATE_LINK( OnParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, void ); + DECL_DLLPRIVATE_LINK( OnParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, void ); + + virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfo ) override; + virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) override; + + SdDrawDocument& mrDoc; + DrawDocShell* mpDocSh; + ViewShell* mpViewSh; + std::unique_ptr mpDragSrcMarkList; + SdrObject* mpDropMarkerObj; + std::unique_ptr mpDropMarker; + sal_uInt16 mnDragSrcPgNum; + Point maDropPos; + ::std::vector maDropFileVector; + sal_Int8 mnAction; + Idle maDropErrorIdle; + Idle maDropInsertFileIdle; + rtl::Reference mxDropMediaSizeListener; + sal_uInt16 mnLockRedrawSmph; + bool mbIsDropAllowed; + + DECL_DLLPRIVATE_LINK( DropErrorHdl, Timer*, void ); + DECL_DLLPRIVATE_LINK( DropInsertFileHdl, Timer*, void ); + DECL_DLLPRIVATE_LINK( ExecuteNavigatorDrop, void*, void ); + + void ImplClearDrawDropMarker(); + + SmartTagSet maSmartTags; + +private: + ::std::unique_ptr mpClipboard; + OutlinerMasterViewFilter maMasterViewFilter; + SearchContext maSearchContext; + + OUString m_sAuthor; +}; + +SdDrawDocument& View::GetDoc() const +{ + return mrDoc; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewClipboard.hxx b/sd/source/ui/inc/ViewClipboard.hxx new file mode 100644 index 0000000000..d39fdb8f0b --- /dev/null +++ b/sd/source/ui/inc/ViewClipboard.hxx @@ -0,0 +1,78 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdPage; +class SdTransferable; + +namespace sd +{ +class View; + +/** Handle clipboard related tasks for the draw view. +*/ +class ViewClipboard +{ + ::sd::View& mrView; + +public: + ViewClipboard(::sd::View& rView); + virtual ~ViewClipboard(); + + /** Handle the drop of a drag-and-drop action where the transferable + contains a set of pages. + */ + void HandlePageDrop(const SdTransferable& rTransferable); + +protected: + /** Return the first master page of the given transferable. When the + bookmark list of the transferable contains at least one non-master + page then NULL is returned. + */ + static SdPage* GetFirstMasterPage(const SdTransferable& rTransferable); + + /** Assign the (first) master page of the given transferable to the + (...) slide. + */ + void AssignMasterPage(const SdTransferable& rTransferable, SdPage const* pMasterPage); + + /** Return an index of a page after which the pages of the transferable + are to be inserted into the target document. + */ + virtual sal_uInt16 DetermineInsertPosition(); + + /** Insert the slides in the given transferable behind the last selected + slide or, when the selection is empty, behind the last slide. + @param rTransferable + This transferable defines which pages to insert. + @param nInsertPosition + The pages of the transferable will be inserted behind the page + with this index. + @return + Returns the number of inserted slides. + */ + sal_uInt16 InsertSlides(const SdTransferable& rTransferable, sal_uInt16 nInsertPosition); +}; + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewShell.hxx b/sd/source/ui/inc/ViewShell.hxx new file mode 100644 index 0000000000..d9fd8564ed --- /dev/null +++ b/sd/source/ui/inc/ViewShell.hxx @@ -0,0 +1,559 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include "View.hxx" +#include "fupoor.hxx" +#include + +#include + +class SdPage; +class SvxRuler; +class SdrOle2Obj; // for the ones, who have undefined parts of SVDRAW +class SdDrawDocument; +class SvxNumBulletItem; + +namespace weld +{ + class Window; +} + +namespace com::sun::star::drawing { class XDrawSubController; } + +namespace sd { + +class DrawDocShell; +class FrameView; +class LayerTabBar; +class ViewShellBase; +class Window; +class WindowUpdater; +class ZoomList; + +#undef OUTPUT_DRAWMODE_COLOR +#undef OUTPUT_DRAWMODE_CONTRAST + +const DrawModeFlags OUTPUT_DRAWMODE_COLOR = DrawModeFlags::Default; +const DrawModeFlags OUTPUT_DRAWMODE_GRAYSCALE + = DrawModeFlags::GrayLine | DrawModeFlags::GrayFill + | DrawModeFlags::BlackText | DrawModeFlags::GrayBitmap + | DrawModeFlags::GrayGradient; +const DrawModeFlags OUTPUT_DRAWMODE_BLACKWHITE + = DrawModeFlags::BlackLine | DrawModeFlags::BlackText + | DrawModeFlags::WhiteFill | DrawModeFlags::GrayBitmap + | DrawModeFlags::WhiteGradient; +const DrawModeFlags OUTPUT_DRAWMODE_CONTRAST + = DrawModeFlags::SettingsLine | DrawModeFlags::SettingsFill + | DrawModeFlags::SettingsText | DrawModeFlags::SettingsGradient; + +/** Base class of the stacked shell hierarchy. + +

Despite its name this class is not a descendant of SfxViewShell + but of SfxShell. Its name expresses the fact that it acts like a + view shell. Being a stacked shell rather than being an actual view shell + there can be several instances of this class that +

    +
  • all are based on the same view shell and thus show the same + document and share common view functionality and
  • +
  • are all visible at the same time and live in the same + frame.
  • +

      + +

      This class replaces the former ViewShell class.

      +*/ +class SAL_DLLPUBLIC_RTTI ViewShell + : public SfxShell +{ +public: + enum ShellType { + ST_NONE, + ST_DRAW, // The Draw application. + ST_IMPRESS, // Main view of the Impress application. + ST_NOTES, + ST_HANDOUT, + ST_OUTLINE, + ST_SLIDE_SORTER, + ST_PRESENTATION, + ST_SIDEBAR + }; + static const int MAX_HSPLIT_CNT = 1; + static const int MAX_VSPLIT_CNT = 1; + static const int MIN_SCROLLBAR_SIZE = 50; + + + ViewShell ( + vcl::Window* pParentWindow, + ViewShellBase& rViewShellBase); + virtual ~ViewShell() override; + + /** The Init method has to be called from the outside directly + after a new object of this class has been created. It can be + used for that part of the initialisation that can be run only + after the creation of the new object is finished. This + includes registration as listener at event broadcasters. + + Derived classes should call this method at the head of their + Init() methods. + @param bIsMainViewShell + This flag tells the Init() method whether the new ViewShell will + be the main view shell. + */ + virtual void Init (bool bIsMainViewShell); + + /** The Exit() method has to be called before the destructor so that the + view shell is still a valid object and can safely call methods that + rely on that. + */ + void Exit(); + + void Cancel(); + + /** Return the window that is the parent of all controls of this view + shell. This may or may not be the window of the frame. + */ + vcl::Window* GetParentWindow() const { return mpParentWindow; } + + sd::Window* GetContentWindow() const; + + ::sd::View* GetView() const { return mpView; } + inline SdrView* GetDrawView() const; + SD_DLLPUBLIC DrawDocShell* GetDocSh() const; + + SdDrawDocument* GetDoc() const; + + SD_DLLPUBLIC SfxViewFrame* GetViewFrame() const; + + /** The active window is usually the mpContentWindow. When there is a + show running then the active window is a ShowWindow. + */ + ::sd::Window* GetActiveWindow() const { return mpActiveWindow;} + SD_DLLPUBLIC weld::Window* GetFrameWeld() const; + + /** Set the active window. When the shell is displayed in the center + pane then the window of the ViewShellBase is also set to the given + window. + */ + void SetActiveWindow (::sd::Window* pWindow); + + /** Return the rectangle that encloses all windows of the view. That + excludes the controls in the frame like rulers, scroll bars, tab + bar, and buttons. + @return + The rectangle is returned in screen coordinates, i.e. pixel + values relative to the upper left corner of the screen?. + */ + const ::tools::Rectangle& GetAllWindowRect(); + + // Mouse- & Key-Events + virtual void PrePaint(); + virtual void Paint (const ::tools::Rectangle& rRect, ::sd::Window* pWin); + virtual bool KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin); + virtual void MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin); + virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin); + virtual void MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin); + virtual void Command(const CommandEvent& rCEvt, ::sd::Window* pWin); + bool RequestHelp( const HelpEvent& rEvt ); + bool Notify( NotifyEvent const & rNEvt, ::sd::Window* pWin ); + + bool HandleScrollCommand(const CommandEvent& rCEvt, ::sd::Window* pWin); + + void SetUIUnit(FieldUnit eUnit); + void SetDefTabHRuler( sal_uInt16 nDefTab ); + + const SvxNumBulletItem* GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId& nNumItemId); + + bool HasRuler() const { return mbHasRulers;} + void SetRuler(bool bRuler); + // Hides horizontal, vertical scrollbar as well as scrollbox + void SetScrollBarsVisible(bool bVisible); + + /** Set internal values of all scroll bars that determine thumb size and + position. The external values like size and position of the scroll + bar controls are not modified. + */ + virtual void UpdateScrollBars(); + void Scroll(::tools::Long nX, ::tools::Long nY); + void ScrollLines(::tools::Long nX, ::tools::Long nY); + virtual void SetZoom(::tools::Long nZoom); + ::tools::Long GetZoom() const; + virtual void SetZoomRect(const ::tools::Rectangle& rZoomRect); + void InitWindows(const Point& rViewOrigin, const Size& rViewSize, + const Point& rWinPos, bool bUpdate = false); + void InvalidateWindows(); + /** This method is still used by the OutlineViewShell to update the + model according to the content of the outline view. This in turn + updates the previews in the slide sorter. + */ + virtual void UpdatePreview (SdPage* pPage); + + void DrawMarkRect(const ::tools::Rectangle& rRect) const; + + void ExecReq( SfxRequest &rReq ); + + ZoomList* GetZoomList() { return mpZoomList.get();} + + FrameView* GetFrameView() { return mpFrameView; } + /** Setting a frame view triggers ReadFrameViewData() for the new + frame. + @param pFrameView + The new frame view that replaces the old one. + */ + void SetFrameView (FrameView* pFrameView); + virtual void ReadFrameViewData(FrameView* pView); + virtual void WriteFrameViewData(); + void WriteUserData(); + void ReadUserData(); + + virtual bool ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb); + + /** @returns + current or selected page or 0. This method + will fail in master page mode. + + @deprecated, please use getCurrentPage(); + */ + virtual SdPage* GetActualPage() = 0; + + /** @returns + current or selected page or 0. + */ + virtual SdPage* getCurrentPage() const = 0; + + const rtl::Reference& GetOldFunction() const { return mxOldFunction; } + bool HasOldFunction() const { return mxOldFunction.is(); } + const rtl::Reference& GetCurrentFunction() const { return mxCurrentFunction; } + bool HasCurrentFunction( sal_uInt16 nSID ) { return mxCurrentFunction.is() && (mxCurrentFunction->GetSlotID() == nSID ); } + bool HasCurrentFunction() const { return mxCurrentFunction.is(); } + + void SetCurrentFunction(const rtl::Reference& xFunction); + void SetOldFunction(const rtl::Reference& xFunction); + void DeactivateCurrentFunction( bool bPermanent = false ); + + void SetPageSizeAndBorder(PageKind ePageKind, const Size& rNewSize, + ::tools::Long nLeft, ::tools::Long nRight, ::tools::Long nUpper, ::tools::Long nLower, + bool bScaleAll, Orientation eOrient, sal_uInt16 nPaperBin, + bool bBackgroundFullSize ); + + void SetStartShowWithDialog( bool bIn ) { mbStartShowWithDialog = bIn; } + bool IsStartShowWithDialog() const { return mbStartShowWithDialog; } + + sal_uInt16 GetPrintedHandoutPageNum() const { return mnPrintedHandoutPageNum; } + void SetPrintedHandoutPageNum (sal_uInt16 nPageNumber) {mnPrintedHandoutPageNum=nPageNumber; } + + sal_uInt16 GetPrintedHandoutPageCount() const { return mnPrintedHandoutPageCount; } + void SetPrintedHandoutPageCount (sal_uInt16 nPageCount) {mnPrintedHandoutPageCount=nPageCount; } + + virtual bool PrepareClose( bool bUI = true ); + + void GetMenuState(SfxItemSet& rSet); + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ); + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ); + + virtual void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& ); + virtual void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& ); + + /** this method is called when the visible area of the view from this viewshell is changed */ + virtual void VisAreaChanged(const ::tools::Rectangle& rRect); + + /** Create an accessible object representing the specified window. + Override this method to provide view mode specific objects. The + default implementation returns an empty reference. + @param pWindow + Make the document displayed in this window accessible. + @return + This default implementation returns an empty reference. + */ + virtual css::uno::Reference + CreateAccessibleDocumentView (::sd::Window* pWindow); + + virtual void SwitchViewFireFocus( const css::uno::Reference< css::accessibility::XAccessible >& xAcc ); + void SwitchActiveViewFireFocus( ); + // Move these two methods from DrawViewShell to enable slide show view + void NotifyAccUpdate(); + void fireSwitchCurrentPage(sal_Int32 pageIndex); + void SetWinViewPos(const Point& rWinPos); + Point const & GetWinViewPos() const; + Point const & GetViewOrigin() const; + + /** Return the window updater of this view shell. + @return + In rare circumstances the returned pointer may be , + i.e. when no memory is available anymore. + */ + ::sd::WindowUpdater* GetWindowUpdater() const; + + /** Return the border that is drawn around the actual document view. + The border contains typically rulers and scroll bars. + */ + SvBorder GetBorder(); + + /** Notify the view shell that its parent window has been resized. + The ViewShell places and resizes its UI elements accordingly. + The new size can be obtained from the parent window. + */ + virtual void Resize(); + + /** Set position and size of the GUI elements that are controlled by + the view shell like rulers and scroll bars as well as the actual + document view according to the position and size that were given + with the last Resize() call. + */ + virtual void ArrangeGUIElements(); + + // virtual void OuterResizePixel(const Point &rPos, const Size &rSize); + // virtual void InnerResizePixel(const Point &rPos, const Size &rSize); + + // Exported for unit test + SD_DLLPUBLIC ViewShellBase& GetViewShellBase() const; + + /** Return when the called view shell is the main sub shell of + its ViewShellBase object, i.e. is display in the center pane. This + convenience function is equivalent to comparing the this pointer to + the result of ViewShellBase::GetViewShell(PT_CENTER). + */ + bool IsMainViewShell() const; + + /** Set or reset the flag that indicates whether the called shell is the + one displayed in the center pane. By default this flag is set to + . For the main view shell it thus has to be set to . + */ + void SetIsMainViewShell (bool bIsMainViewShell); + + /** Return a sub controller that implements the view shell specific + part of the DrawController. + */ + virtual css::uno::Reference CreateSubController() = 0; + + /** Return the type of the shell. + */ + SD_DLLPUBLIC ShellType GetShellType() const; //Export for unit test + + /** This method is more or less an alias to Deactivate(). It is called + before an object of this class is taken from the stack of view + shells. + +

      When this method is not called before a view shell is taken from + a stack then the Deactivate() call from the SFX as a response to + RemoveSubShell() comes too late when the view shell is not on the + stack anymore.

      + */ + virtual void Shutdown(); + + /** This function is called from the underlying ViewShellBase + object to handle a verb execution request. + */ + virtual ErrCode DoVerb(sal_Int32 nVerb); + + virtual void UIActivating( SfxInPlaceClient* ); + virtual void UIDeactivated( SfxInPlaceClient* ); + + /** Show controls of the UI or hide them, depending on the given flag. + As a result the border is adapted. + */ + virtual void ShowUIControls (bool bVisible); + bool IsPageFlipMode() const; + + /** Set the given window as new parent window. This is not possible for + all views, so the return value tells the caller if the relocation + was successful. + */ + virtual bool RelocateToParentWindow (vcl::Window* pParentWindow); + + /** Depending on the given request create a new page or duplicate an + existing one. A new page is created behind the given slide. + @param rRequest + The request as passed to an Execute() method. Its arguments are + evaluated. Its slot id determines whether to create or + duplicate a slide. + @param pPage + This page is either duplicated or becomes the predecessor of the + new slide. If NULL a duplication request is ignored. A new + slide is inserted as first slide. + @param nInsertPosition + When -1 (the default) then insert after pPage. Otherwise insert + before the given index (of a standard page). + @return + The new slide is returned. If for some reason a new page can + not be created then NULL is returned. + */ + virtual SdPage* CreateOrDuplicatePage ( + SfxRequest& rRequest, + PageKind ePageKind, + SdPage* pPage, + const sal_Int32 nInsertPosition = -1); + + /// Allows adjusting the point or mark of the selection to a document coordinate. + void SetCursorMm100Position(const Point& rPosition, bool bPoint, bool bClearMark); + /// Gets the current selection + css::uno::Reference GetSelectionTransferable() const; + /// Allows starting or ending a graphic move or resize action. + void SetGraphicMm100Position(bool bStart, const Point& rPosition); + + class Implementation; + +protected: + /** must be called in the beginning of each subclass d'tor. + disposes and clears both current and old function. */ + void DisposeFunctions(); + + friend class ViewShellBase; + + /** Window inside the rulers and scroll bars that shows a view of the + document. + */ + + VclPtr mpContentWindow; + + /// Horizontal scroll bar for the current slide is displayed when needed. + VclPtr mpHorizontalScrollBar; + /// Vertical scroll bar for whole document is always visible. + VclPtr mpVerticalScrollBar; + /// Horizontal ruler is not shown by default. + VclPtr mpHorizontalRuler; + /// Vertical ruler is not shown by default. + VclPtr mpVerticalRuler; + /// Layer tab bar. + VclPtr mpLayerTabBar; + + /// This flag controls whether the rulers are visible. + bool mbHasRulers; + + /// The active window. + VclPtr< ::sd::Window> mpActiveWindow; + ::sd::View* mpView; + FrameView* mpFrameView; + + rtl::Reference mxCurrentFunction; + rtl::Reference mxOldFunction; + std::unique_ptr mpZoomList; + double mfLastZoomScale; + double mfAccumulatedZoom = 0; + + Point maViewPos; + Size maViewSize; + Size maScrBarWH; + + bool mbStartShowWithDialog; // presentation is started by dialog + sal_uInt16 mnPrintedHandoutPageNum; // Page number of the handout page that is to be printed. + sal_uInt16 mnPrintedHandoutPageCount; // Page count of the handout pages that are to be printed. + + //af bool bPrintDirectSelected; // Print only selected objects in direct print + //afString sPageRange; // pagerange if selected objects in direct print + + /** Area covered by all windows, i.e. the area of the parent window + without the controls at the borders like rulers, scroll bars, tab + bar, buttons. + This rectangle may be set in window coordinates (i.e. pixel values + relative to the parent window). It is transformed by every call to + GetAllWindowRectangle() into screen coordinates (relative to the + upper left corner of the screen. + */ + ::tools::Rectangle maAllWindowRectangle; + + /// The type of the shell. Returned by GetShellType(). + ShellType meShellType; + + std::unique_ptr> mpImpl; + + // Support methods for centralized UNDO/REDO + virtual SfxUndoManager* ImpGetUndoManager() const; + void ImpGetUndoStrings(SfxItemSet &rSet) const; + void ImpGetRedoStrings(SfxItemSet &rSet) const; + void ImpSidUndo(SfxRequest& rReq); + void ImpSidRedo(SfxRequest& rReq); + + DECL_DLLPRIVATE_LINK( HScrollHdl, weld::Scrollbar&, void ); + DECL_DLLPRIVATE_LINK( VScrollHdl, weld::Scrollbar&, void ); + + // virtual scroll handler, here, derivative classes can add themselves here + virtual void VirtHScrollHdl(ScrollAdaptor* pHScroll); + virtual void VirtVScrollHdl(ScrollAdaptor* pVScroll); + + // virtual functions ruler handling + virtual VclPtr CreateHRuler(::sd::Window* pWin); + virtual VclPtr CreateVRuler(::sd::Window* pWin); + virtual void UpdateHRuler(); + virtual void UpdateVRuler(); + + virtual void Activate(bool IsMDIActivate) override; + virtual void Deactivate(bool IsMDIActivate) override; + + virtual void SetZoomFactor( const Fraction &rZoomX, + const Fraction &rZoomY ); + + /** + This must be called after the ctor, but before anything else. + It's the part of construction that is dependent + on showing the top-level window. + + Showing a window with a11y enabled causes various callbacks + to be triggered. + + Due to the "virtual methods are not virtual during constructors" + problem, this is a disaster to call from the ctor + + i.e. construct calls Show, and if a11y is enabled this + reenters the not-fully constructed object and calls + CreateAccessibleDocumentView, so if construct is called + from the ctor then if a derived class is constructed the base-case + CreateAccessibleDocumentView is used, not the derived + CreateAccessibleDocumentView. i.e. run smoketest under a11y with + debugging assertions enabled + */ + void doShow(); + +private: + VclPtr mpParentWindow; + /** This window updater is used to keep all relevant windows up to date + with reference to the digit language used to display digits in text + shapes. + */ + ::std::unique_ptr< ::sd::WindowUpdater> mpWindowUpdater; + + /** Code common to all constructors. It generally is a bad idea + to call this function from outside a constructor. + */ + void construct(); + + /** Create the rulers. + */ + void SetupRulers(); +}; + +SdrView* ViewShell::GetDrawView() const +{ + return static_cast(mpView); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewShellBase.hxx b/sd/source/ui/inc/ViewShellBase.hxx new file mode 100644 index 0000000000..acdd244c70 --- /dev/null +++ b/sd/source/ui/inc/ViewShellBase.hxx @@ -0,0 +1,252 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; +class SfxRequest; + +namespace sd::tools { +class EventMultiplexer; +} + +namespace sd { + +class DrawController; +class DrawDocShell; +class FormShellManager; +class ToolBarManager; +class ViewShell; +class ViewShellManager; +class ViewTabBar; + +/** SfxViewShell descendant that the stacked Draw/Impress shells are + based on. + +

      The "base" part of the name does not mean that this is a base + class of some class hierarchy. It rather is the base of the + stacked shells.

      + +

      This class starts as a new and relatively small class. Over + time as much code as possible should be moved from the stacked + shells to this class.

      +*/ +class ViewShellBase + : public SfxViewShell +{ +public: + SFX_DECL_INTERFACE(SD_IF_SDVIEWSHELLBASE) + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + /** This constructor is used by the view factory of the SFX macros. + Note that LateInit() has to be called after the constructor + terminates and before doing anything else. + */ + ViewShellBase ( + SfxViewFrame& rFrame, + SfxViewShell* pOldShell); + + virtual ~ViewShellBase() override; + + /** This method is part of the object construction. It HAS to be called + after the constructor has created a new object. + */ + void LateInit (const OUString& rsDefaultView); + + std::shared_ptr const & GetViewShellManager() const; + + /** Return the main view shell stacked on the called ViewShellBase + object. This is usually the view shell displayed in the center + pane. + */ + std::shared_ptr GetMainViewShell() const; + + /** When given a view frame this static method returns the + corresponding sd::ViewShellBase object. + @return + When the SfxViewShell of the given frame is not a + ViewShellBase object then NULL is returned. + */ + static ViewShellBase* GetViewShellBase (SfxViewFrame const * pFrame); + + DrawDocShell* GetDocShell() const { return mpDocShell;} + SdDrawDocument* GetDocument() const { return mpDocument;} + + /** Callback function for general slot calls. At the moment these are + slots for switching the pane docking windows on and off. + */ + virtual void Execute (SfxRequest& rRequest); + + /** Callback function for retrieving item values related to certain + slots. This is the companion of Execute() and handles the slots + concerned with showing the pane docking windows. + */ + void GetState (SfxItemSet& rSet); + + /* override these from SfxViewShell */ + virtual OUString GetSelectionText(bool = false, bool bOnlyASample = false) override; + virtual bool HasSelection(bool = true ) const override; + + SvBorder GetBorder (bool bOuterResize); + virtual void InnerResizePixel (const Point& rOrigin, const Size& rSize, bool inplaceEditModeChange) override; + virtual void OuterResizePixel (const Point& rOrigin, const Size& rSize) override; + + /** This call is forwarded to the main sub-shell. + */ + virtual ErrCode DoVerb(sal_Int32 nVerb) override; + + /** Return a new renderer that can be used for example for printing the + document. + */ + virtual css::uno::Reference GetRenderable() override; + + /// Forwarded to the print manager. + virtual SfxPrinter* GetPrinter (bool bCreate = false) override; + + /// Forwarded to the print manager. + virtual sal_uInt16 SetPrinter ( + SfxPrinter* pNewPrinter, + SfxPrinterChangeFlags nDiffFlags = SFX_PRINTER_ALL) override; + + /// Forward methods to main sub shell. + virtual void WriteUserDataSequence ( + css::uno::Sequence< css::beans::PropertyValue >&) override; + + /** Pass the given properties to the main view shell. After that we + ensure that the right view shell type is displayed in the center + pane. + */ + virtual void ReadUserDataSequence ( + const css::uno::Sequence< css::beans::PropertyValue >&) override; + + virtual void UIActivating( SfxInPlaceClient* ) override; + virtual void UIDeactivated( SfxInPlaceClient* ) override; + virtual void Activate (bool IsMDIActivate) override; + using SfxViewShell::Deactivate; + virtual void SetZoomFactor ( + const Fraction &rZoomX, + const Fraction &rZoomY) override; + virtual bool PrepareClose (bool bUI = true) override; + virtual void WriteUserData (OUString&, bool bBrowse = false) override; + virtual void ReadUserData (const OUString&, bool bBrowse = false) override; + virtual SdrView* GetDrawView() const override; + + /** When is given, then the mouse shape is set to hour glass (or + whatever the busy shape looks like on the system.) + */ + void SetBusyState (bool bBusy); + + /** Call this method when the controls of this view shell or the + embedded sub shell need to be rearranged. This is necessary + e.g. when the border has been modified (UpdateBorder() calls this + method). + + This method is like ResizePixel() with no arguments. + */ + void Rearrange(); + + /** Update the border that is set with SfxViewShell::SetBorderPixel(). + This is done by adding the border used by the ViewShellBase itself + with the border used by the main view shell. + + @param bForce if true the borders are also updated if old border + and new border are same. + */ + void UpdateBorder ( bool bForce = false ); + + /** With this method the UI controls can be turned on or off. It is + used by the FuSlideShow to hide the UI controls while showing a + non-full-screen or in-window presentation in the center pane. + */ + void ShowUIControls (bool bVisible); + + /** Return an event multiplexer. It is a single class that forwards + events from various sources. This method must not be called before + LateInit() has terminated. + */ + std::shared_ptr const & GetEventMultiplexer() const; + + /** returns the complete area of the current view relative to the frame + window + */ + const ::tools::Rectangle& getClientRectangle() const; + + std::shared_ptr const & GetToolBarManager() const; + std::shared_ptr const & GetFormShellManager() const; + + DrawController* GetDrawController() const; + + void SetViewTabBar (const ::rtl::Reference& rViewTabBar); + + /** Return the window that is used by the main view shell to display its + view and other UI elements, like scroll bars and rulers. Ownership + of that window remains with the called ViewShellBase object. + */ + vcl::Window* GetViewWindow(); + + /** returns the ui descriptive name for the given uno slot. The result is taken from the configuration + and not cached, so do not use it excessive (f.e. in status updates) */ + OUString RetrieveLabelFromCommand( const OUString& aCmdURL ) const; + /// See SfxViewShell::getPart(). + int getPart() const override; + /// See SfxViewShell::getEditMode(). + int getEditMode() const override; + /// See SfxViewShell::setEditMode(). + void setEditMode(int nMode); + /// See SfxViewShell::NotifyCursor(). + void NotifyCursor(SfxViewShell* pViewShell) const override; + /// See SfxViewShell::GetColorConfigColor(). + ::Color GetColorConfigColor(svtools::ColorConfigEntry nColorType) const override; + + void setLOKVisibleArea(const ::tools::Rectangle& rArea) { maLOKVisibleArea = rArea; } + virtual ::tools::Rectangle getLOKVisibleArea() const override { return maLOKVisibleArea; } + +protected: + + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + + virtual void InitializeFramework(); + +private: + class Implementation; + std::unique_ptr mpImpl; + DrawDocShell* mpDocShell; + SdDrawDocument* mpDocument; + ::tools::Rectangle maLOKVisibleArea; + + /** Determine from the properties of the document shell the initial type + of the view shell in the center pane. We use this method to avoid + starting with the wrong type. When ReadUserDataSequence() is called + we check that the right type is active and change again if that is + not the case because something went wrong. + */ + OUString GetInitialViewShellType() const; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewShellHint.hxx b/sd/source/ui/inc/ViewShellHint.hxx new file mode 100644 index 0000000000..05a0c83286 --- /dev/null +++ b/sd/source/ui/inc/ViewShellHint.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd +{ +/** Local derivation of the SfxHint class that defines some hint ids that + are used by the ViewShell class and its descendants. +*/ +class ViewShellHint final : public SfxHint +{ +public: + enum HintId + { + // Indicate that a page resize is about to begin. + HINT_PAGE_RESIZE_START, + // Indicate that a page resize has been completed. + HINT_PAGE_RESIZE_END, + // Indicate that an edit mode change is about to begin. + HINT_CHANGE_EDIT_MODE_START, + // Indicate that an edit mode change has been completed. + HINT_CHANGE_EDIT_MODE_END, + + HINT_COMPLEX_MODEL_CHANGE_START, + HINT_COMPLEX_MODEL_CHANGE_END + }; + + ViewShellHint(HintId nHintId); + + HintId GetHintId() const { return meHintId; } + +private: + HintId meHintId; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewShellImplementation.hxx b/sd/source/ui/inc/ViewShellImplementation.hxx new file mode 100644 index 0000000000..b4a02c3d54 --- /dev/null +++ b/sd/source/ui/inc/ViewShellImplementation.hxx @@ -0,0 +1,150 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ViewShell.hxx" +#include "ViewShellManager.hxx" +#include "ToolBarManager.hxx" +#include +#include + +class SvxIMapDlg; + +namespace sd +{ +/** This class contains (will contain) the implementation of methods that + have not be accessible from the outside. +*/ +class ViewShell::Implementation +{ +public: + bool mbIsMainViewShell; + /// Set to true when the ViewShell::Init() method has been called. + bool mbIsInitialized; + /** Set to true while ViewShell::ArrangeGUIElements() is being + executed. It is used as guard against recursive execution. + */ + bool mbArrangeActive; + + /** Remember a link to the sub shell factory, so that it can be + unregistered at the ViewShellManager when a ViewShell is deleted. + */ + ViewShellManager::SharedShellFactory mpSubShellFactory; + + /** This update lock for the ToolBarManager exists in order to avoid + problems with tool bars being displayed while the mouse button is + pressed. With docked tool bars this can lead to a size change of + the view. This would change the relative mouse coordinates and thus + interpret every mouse click as move command. + */ + class ToolBarManagerLock + { + public: + /** Create a new instance. This allows the mpSelf member to be set + automatically. + */ + static std::shared_ptr + Create(const std::shared_ptr& rpManager); + /** Release the lock. When the UI is captured + (Application::IsUICaptured() returns ) then the lock is + released later asynchronously. + @param bForce + When this flag is then the lock is released even + when IsUICaptured() returns . + */ + void Release(bool bForce = false); + DECL_DLLPRIVATE_LINK(TimeoutCallback, Timer*, void); + + private: + ::std::unique_ptr> + mpLock; + /** The timer is used both as a safe guard to unlock the update lock + when Release() is not called explicitly. It is also used to + defer the release of the lock to a time when the UI is not + captured. + */ + Timer maTimer; + /** The shared_ptr to this allows the ToolBarManagerLock to control + its own lifetime. This, of course, does work only when no one + holds another shared_ptr longer than only temporary. + */ + std::shared_ptr mpSelf; + ToolBarManagerLock(const std::shared_ptr& rpManager); + ~ToolBarManagerLock(); + + class Deleter; + friend class Deleter; + }; + // The member is not a unique_ptr because it takes over its own life time + // control. + std::weak_ptr mpUpdateLockForMouse; + + Implementation(ViewShell& rViewShell); + ~Implementation() COVERITY_NOEXCEPT_FALSE; + + /** Process the SID_MODIFY slot. + */ + void ProcessModifyPageSlot(SfxRequest& rRequest, SdPage* pCurrentPage, PageKind ePageKind); + + /** Assign the given layout to the given page. This method is at the + moment merely a front end for ProcessModifyPageSlot. + @param pPage + If a NULL pointer is given then this call is ignored. + */ + void AssignLayout(SfxRequest const& rRequest, PageKind ePageKind); + + /** Determine the view id of the view shell. This corresponds to the + view id stored in the SfxViewFrame class. + + We can not use the view of that class because with the introduction + of the multi pane GUI we do not switch the SfxViewShell anymore when + switching the view in the center pane. The view id of the + SfxViewFrame is thus not modified and we can not set it from the + outside. + + The view id is still needed for the SFX to determine on start up + (e.g. after loading a document) which ViewShellBase sub class to + use. These sub classes--like OutlineViewShellBase--exist only to be + used by the SFX as factories. They only set the initial pane + configuration, nothing more. + + So what we do here in essence is to return one of the + ViewShellFactoryIds that can be used to select the factory that + creates the ViewShellBase subclass with the initial pane + configuration that has in the center pane a view shell of the same + type as mrViewShell. + */ + SfxInterfaceId GetViewId() const; + + /** Return a pointer to the image map dialog that is displayed in some + child window. + @return + Returns when the image map dialog is not available. + */ + static SvxIMapDlg* GetImageMapDialog(); + +private: + ViewShell& mrViewShell; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewShellManager.hxx b/sd/source/ui/inc/ViewShellManager.hxx new file mode 100644 index 0000000000..c4011c52d5 --- /dev/null +++ b/sd/source/ui/inc/ViewShellManager.hxx @@ -0,0 +1,196 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "ShellFactory.hxx" +#include +#include +#include + +class FmFormShell; +class SfxShell; + +namespace sd +{ +class ViewShell; +class ViewShellBase; + +/** The ViewShellManager has the responsibility to manage the view shells + and sub shells on the SFX shell stack. They form a two level hierarchy + (the underlying ViewShellBase, the only true SfxViewShell descendant, + forms a third level.) On the first level there are the view shells + (what formerly was called view shell, anyway; nowadays they are derived + from SfxShell) and shells for panes. On the second level there are sub + shells (also derived from SfxShell) that usually are tool bars. + +

      On the SFX shell stack the regular sub shells are placed above their + view shells. The FormShell is a special case. With the SetFormShell() + method it can be placed directly above or below one of the view + shells.

      + +

      Shells managed by this class are created by factories or are given + directly to Activate... methods. For the sub shells there is one + factory for every view shell. Factories are added or removed via the + (Add|Remove)SubShellFactory() methods. The FormShell is managed with the + factory of its view shell.

      +*/ +class ViewShellManager +{ +public: + typedef std::shared_ptr> SharedShellFactory; + + ViewShellManager(ViewShellBase& rBase); + + /** Before the destructor is called the method Shutdown() has to have + been called. + */ + ~ViewShellManager(); + + /** Tell a ViewShellManager object to prepare to be deleted, i.e. to + destroy all of its resources and to ignore all following calls. + Use this when the owner of the view shell manager is about being + destroyed but the view shell manager itself can not yet be deleted. + */ + void Shutdown(); + + /** Set the factory for sub shells of the specified view shell. + */ + void AddSubShellFactory(ViewShell const* pViewShell, const SharedShellFactory& rpFactory); + void RemoveSubShellFactory(ViewShell const* pViewShell, const SharedShellFactory& rpFactory); + + /** Activate the given view shell. + */ + void ActivateViewShell(ViewShell* pViewShell); + + /** Activate the given shell which is not a view shell. For view shells + use the ActivateViewShell() method. + */ + void ActivateShell(SfxShell* pShell); + + /** Deactivate the specified shell, i.e. take it and all of its + object bars from the shell stack. + @param pShell + The shell to deactivate. + */ + void DeactivateViewShell(const ViewShell* pShell); + + /** Deactivate the specified shell. The shell is not destroyed. + */ + void DeactivateShell(const SfxShell* pShell); + + /** Associate the form shell with a view shell and their relative + position. This method does not change the shell stack, it just + stores the given values for the next shell stack update. + @param pParentShell + The view shell of the form shell. + @param pFormShell + The form shell. + @param bAbove + When then the form shell will be placed directly above + pViewShell on the SFX shell stack. Otherwise the form shell is + placed directly below the view shell. + */ + void SetFormShell(const ViewShell* pParentShell, FmFormShell* pFormShell, bool bAbove); + + /** Activate the specified shell as sub shell for the given view shell. + The sub shell factory associated with the view shell is used to + create the sub shell. + @param rParentShell + The new sub shell will be placed above this view shell. + @param nId + This id is used only with the factory registered for the parent + view shell. + */ + void ActivateSubShell(const ViewShell& rParentShell, ShellId nId); + + /** Deactivate the specified sub shell. + */ + void DeactivateSubShell(const ViewShell& rParentShell, ShellId nId); + + /** Send all sub shells of the specified view shell an Invalidate() + call. This does not modify the shell stack. + */ + void InvalidateAllSubShells(ViewShell const* pViewShell); + + /** Move the specified view shell to the top most position on the stack + of view shells in relation to the other view shells. After this the + only shells that are higher on the stack are its object bars. + + Call this method after a focus change to bring a view mode view + shell and is associated tool bar shells to the top of the + stack. + + The mbKeepMainViewShellOnTop flag is not obeyed. + + @param nId + The id of the shell to move to the top. + */ + void MoveToTop(const ViewShell& rShell); + + /** Return the first, i.e. top most, view shell that has been activated + under the given id. + @param nId + The id of the shell for which to return a pointer. + @return + When the specified shell is currently not active then NULL is + returned. + */ + SfxShell* GetShell(ShellId nId) const; + + /** Return the top-most shell on the SFX shell stack regardless of + whether that is a view shell or a sub shell. + */ + SfxShell* GetTopShell() const; + + /** Return the top-most active view shell on the internal shell stack. + */ + SfxShell* GetTopViewShell() const; + + /** Use this class to safely lock updates of the view shell stack. + */ + class UpdateLock + { + public: + UpdateLock(std::shared_ptr pManager) + : mpManager(std::move(pManager)) + { + mpManager->LockUpdate(); + } + ~UpdateLock() COVERITY_NOEXCEPT_FALSE { mpManager->UnlockUpdate(); } + + private: + std::shared_ptr mpManager; + }; + friend class UpdateLock; + +private: + class Implementation; + std::unique_ptr> + mpImpl; + bool mbValid; + + void LockUpdate(); + void UnlockUpdate(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewTabBar.hxx b/sd/source/ui/inc/ViewTabBar.hxx new file mode 100644 index 0000000000..c9e11994af --- /dev/null +++ b/sd/source/ui/inc/ViewTabBar.hxx @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XResourceId; } +namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; } +namespace com::sun::star::frame { class XController; } +namespace vcl { class Window; } + +namespace sd { + class DrawController; + class ViewShellBase; + class ViewTabBar; +} + +namespace sd { + +class TabBarControl final : public InterimItemWindow +{ +public: + TabBarControl(vcl::Window* pParentWindow, ::rtl::Reference pViewTabBar); + virtual void dispose() override; + virtual ~TabBarControl() override; + weld::Notebook& GetNotebook() { return *mxTabControl; } + int GetAllocatedWidth() const { return mnAllocatedWidth; } +private: + std::unique_ptr mxTabControl; + ::rtl::Reference mpViewTabBar; + int mnAllocatedWidth; + + DECL_LINK(ActivatePageHdl, const OUString&, void); + DECL_LINK(NotebookSizeAllocHdl, const Size&, void); +}; + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XToolBar, + css::drawing::framework::XTabBar, + css::drawing::framework::XConfigurationChangeListener + > ViewTabBarInterfaceBase; + +/** Tab control for switching between views in the center pane. +*/ +class ViewTabBar final + : public ViewTabBarInterfaceBase +{ +public: + ViewTabBar ( + const css::uno::Reference< css::drawing::framework::XResourceId>& rxViewTabBarId, + const rtl::Reference< ::sd::DrawController>& rxController); + virtual ~ViewTabBar() override; + + virtual void disposing(std::unique_lock&) override; + + const VclPtr& GetTabControl() const { return mpTabControl; } + + bool ActivatePage(size_t nIndex); + + //----- drawing::framework::XConfigurationChangeListener ------------------ + + virtual void SAL_CALL + notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + //----- XEventListener ---------------------------------------------------- + + virtual void SAL_CALL disposing( + const css::lang::EventObject& rEvent) override; + + //----- XTabBar ----------------------------------------------------------- + + virtual void + SAL_CALL addTabBarButtonAfter ( + const css::drawing::framework::TabBarButton& rButton, + const css::drawing::framework::TabBarButton& rAnchor) override; + + virtual void + SAL_CALL appendTabBarButton ( + const css::drawing::framework::TabBarButton& rButton) override; + + virtual void + SAL_CALL removeTabBarButton ( + const css::drawing::framework::TabBarButton& rButton) override; + + virtual sal_Bool + SAL_CALL hasTabBarButton ( + const css::drawing::framework::TabBarButton& rButton) override; + + virtual css::uno::Sequence + SAL_CALL getTabBarButtons() override; + + //----- XResource --------------------------------------------------------- + + virtual css::uno::Reference< + css::drawing::framework::XResourceId> SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + /** The returned value is calculated as the difference between the + total height of the control and the height of its first tab page. + This can be considered a hack. + This procedure works only when the control is visible. Calling this + method when the control is not visible results in returning a + default value. + To be on the safe side wait for this control to become visible and + the call this method again. + */ + int GetHeight() const; + + void UpdateActiveButton(); + + void AddTabBarButton ( + const css::drawing::framework::TabBarButton& rButton, + const css::drawing::framework::TabBarButton& rAnchor); + void AddTabBarButton ( + const css::drawing::framework::TabBarButton& rButton); + void RemoveTabBarButton ( + const css::drawing::framework::TabBarButton& rButton); + bool HasTabBarButton ( + const css::drawing::framework::TabBarButton& rButton); + css::uno::Sequence + GetTabBarButtons(); + +private: + VclPtr mpTabControl; + rtl::Reference<::sd::DrawController> mxController; + css::uno::Reference mxConfigurationController; + typedef ::std::vector TabBarButtonList; + TabBarButtonList maTabBarButtons; + css::uno::Reference mxViewTabBarId; + ViewShellBase* mpViewShellBase; + int mnNoteBookWidthPadding; + + void AddTabBarButton ( + const css::drawing::framework::TabBarButton& rButton, + sal_Int32 nPosition); + void UpdateTabBarButtons(); + + /** This method is called from the constructor to get the window for an + anchor ResourceId and pass it to our base class. It has to be + static because it must not access any of the, not yet initialized + members. + */ + static vcl::Window* GetAnchorWindow( + const css::uno::Reference& rxViewTabBarId, + const rtl::Reference<::sd::DrawController>& rxController); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/Window.hxx b/sd/source/ui/inc/Window.hxx new file mode 100644 index 0000000000..9763f24e88 --- /dev/null +++ b/sd/source/ui/inc/Window.hxx @@ -0,0 +1,207 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +class OutlinerView; + +namespace sd +{ +class ViewShell; + +/** An SdWindow contains the actual working area of ViewShell. + +

      The zoom factor used by this class controls how much the page and the + shapes on it are scaled down (<100%) or up (>100%) when displayed on the + output device represented by the OutputDevicebase class. A + zoom factor of 100% would result (with a correctly set DPI value for an + output device) in a one to one mapping of the internal coordinates that + are stored in 100th of mm. The zoom factor is stored in the map mode + member of the OutputDevice base class. It is calculated to + be an integer percent value. +*/ +class Window : public vcl::DocWindow, public ::DropTargetHelper +{ +public: + Window(vcl::Window* pParent); + virtual ~Window() override; + virtual void dispose() override; + + void SetViewShell(ViewShell* pViewSh); + ViewShell* GetViewShell(); + + /** Set the zoom factor to the specified value and center the display + area around the zoom center. + @param nZoom + The zoom factor is given as integral percent value. + */ + void SetZoomIntegral(::tools::Long nZoom); + + /** This internally used method performs the actual adaptation of the + window's map mode to the specified zoom factor. + @param nZoom + The zoom factor is given as integral percent value. + @return + When the given zoom factor lies outside the valid range enclosed + by the minimal zoom factor previously calculated by + CalcMinZoom and a constant upper value it is + forced into that interval. Therefore the returned value is a + valid zoom factor. + */ + ::tools::Long SetZoomFactor(::tools::Long nZoom); + + /** This method is called when the whole page shall be displayed in the + window. Position and zoom factor are set so that the given + rectangle is displayed as large as possible in the window while at + the same time maintaining the rectangle's aspect ratio and adding a + small space at all its four sides (about 3% of width and height). + The map mode is adapted accordingly. + @param rZoomRect + The rectangle is expected to be given relative to the upper left + corner of the window in logical coordinates (100th of mm). + @return + The new zoom factor is returned as integral percent value. + */ + ::tools::Long SetZoomRect(const ::tools::Rectangle& rZoomRect); + + ::tools::Long GetZoomForRect(const ::tools::Rectangle& rZoomRect); + + void SetMinZoomAutoCalc(bool bAuto); + + /** Calculate the minimal zoom factor as the value at which the + application area would completely fill the window. All values set + manually or programmatically are set to this value if they are + smaller. If the currently used zoom factor is smaller than the minimal zoom + factor than set the minimal zoom factor as the new current zoom + factor. + +

      This calculation is performed only when the + bMinZoomAutoCalc is set (to ).

      + */ + void CalcMinZoom(); + void SetMinZoom(::tools::Long nMin); + ::tools::Long GetMinZoom() const { return mnMinZoom; } + void SetMaxZoom(::tools::Long nMax); + ::tools::Long GetMaxZoom() const { return mnMaxZoom; } + + ::tools::Long GetZoom() const; + + const Point& GetWinViewPos() const { return maWinPos; } + const Point& GetViewOrigin() const { return maViewOrigin; } + const Size& GetViewSize() const { return maViewSize; } + void SetWinViewPos(const Point& rPnt); + void SetViewOrigin(const Point& rPnt); + void SetViewSize(const Size& rSize); + void SetCenterAllowed(bool bIsAllowed); + + /** Calculate origin of the map mode according to the size of the view + and window (its size in model coordinates; that takes the zoom + factor into account), and the bCenterAllowed flag. When it is not + set then nothing is changed. When in any direction the window is + larger than the view or the value of aWinPos in this direction is -1 + then the window is centered in this direction. + */ + void UpdateMapOrigin(bool bInvalidate = true); + + void UpdateMapMode(); + + double GetVisibleX() const; // interface for ScrollBars + double GetVisibleY() const; + void SetVisibleXY(double fX, double fY); + double GetVisibleWidth() const; + double GetVisibleHeight() const; + Point GetVisibleCenter(); + double GetScrlLineWidth() const; + double GetScrlLineHeight() const; + double GetScrlPageWidth() const; + double GetScrlPageHeight() const; + void GrabFocus(); + virtual void DataChanged(const DataChangedEvent& rDCEvt) override; + + // DropTargetHelper + virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override; + virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override; + + /** The DropScroll() method is used by AcceptDrop() to scroll the + content of the window while dragging and dropping. With this method + you can control whether DropScroll() shall be used. + */ + void SetUseDropScroll(bool bUseDropScroll); + void DropScroll(const Point& rMousePos); + virtual void KeyInput(const KeyEvent& rKEvt) override; + +private: + OutlinerView* GetOutlinerView() const; + +protected: + Point maWinPos; + Point maViewOrigin; + Size maViewSize; + Size maPrevSize; // contains previous window size in logical coords + sal_uInt16 mnMinZoom; + sal_uInt16 mnMaxZoom; + + /** This flag tells whether to re-calculate the minimal zoom factor + depending on the current zoom factor. Its default value is now false. + */ + bool mbMinZoomAutoCalc; + bool mbCenterAllowed; + ::tools::Long mnTicks; + + ViewShell* mpViewShell; + bool mbUseDropScroll; + + virtual void Resize() override; + virtual void PrePaint(vcl::RenderContext& rRenderContext) override; + virtual void Paint(vcl::RenderContext& rRenderContext, + const ::tools::Rectangle& rRect) override; + virtual void MouseMove(const MouseEvent& rMEvt) override; + virtual void MouseButtonUp(const MouseEvent& rMEvt) override; + virtual void MouseButtonDown(const MouseEvent& rMEvt) override; + virtual void Command(const CommandEvent& rCEvt) override; + virtual void RequestHelp(const HelpEvent& rEvt) override; + virtual void LoseFocus() override; + virtual bool EventNotify(NotifyEvent& rNEvt) override; + + /** Create an accessibility object that makes this window accessible. + + @return + The returned reference is empty if an accessible object could + not be created. + */ + virtual css::uno::Reference CreateAccessible() override; + + OUString GetSurroundingText() const override; + Selection GetSurroundingTextSelection() const override; + bool DeleteSurroundingText(const Selection& rSelection) override; + + /// @see Window::LogicInvalidate(). + void LogicInvalidate(const ::tools::Rectangle* pRectangle) override; + + FactoryFunction GetUITestFactory() const override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/WindowUpdater.hxx b/sd/source/ui/inc/WindowUpdater.hxx new file mode 100644 index 0000000000..f57d889b4f --- /dev/null +++ b/sd/source/ui/inc/WindowUpdater.hxx @@ -0,0 +1,124 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +namespace vcl +{ +class Window; +} +class OutputDevice; +class SdDrawDocument; + +namespace sd +{ +/** The purpose of the WindowUpdater is to update output + devices to take care of modified global values. These values are + monitored for changes. At the moment this is + the digit language that defines the glyphs to use to render digits. + Other values may be added in the future. + +

      The methods of this class have not been included into the + ViewShell class in order to not clutter its interface any + further. This class accesses some of ViewShell data + members directly and thus is declared as its friend.

      + +

      Windows that are to be kept up-to-date have to be registered via the + RegisterWindow() method. When a document is given then + this document is reformatted when the monitored option changes.

      +*/ +class WindowUpdater final : public utl::ConfigurationListener +{ +public: + explicit WindowUpdater(); + virtual ~WindowUpdater() noexcept override; + + /** Add the given device to the list of devices which will be updated + when one of the monitored values changes. + @param pWindow + This device is added to the device list if it is not and + when it is not already a member of that list. + */ + void RegisterWindow(vcl::Window* pWindow); + + /** Remove the given device from the list of devices which will be updated + when one of the monitored values changes. + @param pWindow + This device is removed from the device list when it is a member + of that list. + */ + void UnregisterWindow(vcl::Window* pWindow); + + /** Set the document so that it is reformatted when one of the monitored + values changes. + @param pDocument + When is given document reformatting will not take + place in the future. + */ + void SetDocument(SdDrawDocument* pDocument); + + /** Update the given output device and update all text objects of the + view shell if not told otherwise. + @param pWindow + The device to update. When the given pointer is NULL then + nothing is done. + */ + static void Update(OutputDevice* pDevice); + + /** Callback that waits for notifications of a + SvtCTLOptions object. + */ + virtual void ConfigurationChanged(utl::ConfigurationBroadcaster*, + ConfigurationHints nHint) override; + +private: + /// Options to monitor for changes. + SvtCTLOptions maCTLOptions; + + /// The document rendered in the output devices. + SdDrawDocument* mpDocument; + + WindowUpdater(const WindowUpdater& rUpdater) = delete; + + WindowUpdater operator=(const WindowUpdater& rUpdater) = delete; + + /** Type and data member for a list of devices that have to be kept + up-to-date. + */ + typedef ::std::vector> tWindowList; + tWindowList maWindowList; + + /** The central method of this class. Update the given output device. + It is the task of the caller to initiate a reformatting of the + document that is rendered on this device to reflect the changes. + @param pWindow + The output device to update. When it is then the call + is ignored. + */ + static void UpdateWindow(OutputDevice* pDevice); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/animobjs.hxx b/sd/source/ui/inc/animobjs.hxx new file mode 100644 index 0000000000..b44a5fb3dc --- /dev/null +++ b/sd/source/ui/inc/animobjs.hxx @@ -0,0 +1,163 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SdDrawDocument; + +namespace sd { + +class AnimationControllerItem; +class View; + +enum BitmapAdjustment +{ + BA_LEFT_UP, + BA_LEFT, + BA_LEFT_DOWN, + BA_UP, + BA_CENTER, + BA_DOWN, + BA_RIGHT_UP, + BA_RIGHT, + BA_RIGHT_DOWN +}; + +class SdDisplay : public weld::CustomWidgetController +{ +private: + BitmapEx aBitmapEx; + Fraction aScale; + +public: + SdDisplay(); + virtual ~SdDisplay() override; + + virtual void Paint( vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect ) override; + + void SetBitmapEx( BitmapEx const * pBmpEx ); + void SetScale( const Fraction& rFrac ); + + virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; +}; + +class AnimationWindow : public SfxDockingWindow +{ + friend class AnimationChildWindow; + friend class AnimationControllerItem; + +public: + AnimationWindow(SfxBindings* pBindings, SfxChildWindow *pCW, vcl::Window* pParent); + virtual ~AnimationWindow() override; + virtual void dispose() override; + + void AddObj( ::sd::View& rView ); + void CreateAnimObj( ::sd::View& rView ); + + virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; + +protected: + virtual bool Close() override; + virtual void Resize() override; + +private: + std::unique_ptr m_xCtlDisplay; + std::unique_ptr m_xCtlDisplayWin; + std::unique_ptr m_xBtnFirst; + std::unique_ptr m_xBtnReverse; + std::unique_ptr m_xBtnStop; + std::unique_ptr m_xBtnPlay; + std::unique_ptr m_xBtnLast; + std::unique_ptr m_xNumFldBitmap; + std::unique_ptr m_xTimeField; + std::unique_ptr m_xFormatter; + std::unique_ptr m_xLbLoopCount; + std::unique_ptr m_xBtnGetOneObject; + std::unique_ptr m_xBtnGetAllObjects; + std::unique_ptr m_xBtnRemoveBitmap; + std::unique_ptr m_xBtnRemoveAll; + std::unique_ptr m_xFiCount; + + std::unique_ptr m_xRbtGroup; + std::unique_ptr m_xRbtBitmap; + std::unique_ptr m_xFtAdjustment; + std::unique_ptr m_xLbAdjustment; + std::unique_ptr m_xBtnCreateGroup; + std::unique_ptr m_xBtnHelp; + + ::std::vector< ::std::pair > m_FrameList; + static const size_t EMPTY_FRAMELIST; + size_t m_nCurrentFrame; + std::unique_ptr pMyDoc; + + bool bMovie; + bool bAllObjects; + + std::unique_ptr pControllerItem; + + ScopeLock maPlayLock; + + DECL_LINK( ClickFirstHdl, weld::Button&, void ); + DECL_LINK( ClickStopHdl, weld::Button&, void ); + DECL_LINK( ClickPlayHdl, weld::Button&, void ); + DECL_LINK( ClickLastHdl, weld::Button&, void ); + DECL_LINK( ClickGetObjectHdl, weld::Button&, void ); + DECL_LINK( ClickRemoveBitmapHdl, weld::Button&, void ); + DECL_LINK( ClickRbtHdl, weld::Toggleable&, void ); + DECL_LINK( ClickHelpHdl, weld::Button&, void ); + DECL_LINK( ClickCreateGroupHdl, weld::Button&, void ); + DECL_LINK( ModifyBitmapHdl, weld::SpinButton&, void ); + DECL_LINK( ModifyTimeHdl, weld::FormattedSpinButton&, void ); + + void UpdateControl(bool bDisableCtrls = false); + void ResetAttrs(); + void WaitInEffect( sal_uLong nMilliSeconds, sal_uLong nTime, + SfxProgress* pStbMgr ) const; + Fraction GetScale(); +}; + +/** + * ControllerItem for Animator + */ +class AnimationControllerItem : public SfxControllerItem +{ + +public: + AnimationControllerItem( sal_uInt16, AnimationWindow*, SfxBindings* ); + +protected: + virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState, + const SfxPoolItem* pState ) override; +private: + VclPtr pAnimationWin; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/annotationmanager.hxx b/sd/source/ui/inc/annotationmanager.hxx new file mode 100644 index 0000000000..6f47efd1fc --- /dev/null +++ b/sd/source/ui/inc/annotationmanager.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SfxRequest; +class SfxItemSet; + +namespace sd +{ +class ViewShellBase; +class AnnotationManagerImpl; + +class AnnotationManager +{ +public: + AnnotationManager(ViewShellBase& rViewShellBase); + ~AnnotationManager(); + + void ExecuteAnnotation(SfxRequest const& rRequest); + void GetAnnotationState(SfxItemSet& rItemSet); + +private: + ::rtl::Reference mxImpl; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/bulmaper.hxx b/sd/source/ui/inc/bulmaper.hxx new file mode 100644 index 0000000000..3de99d2626 --- /dev/null +++ b/sd/source/ui/inc/bulmaper.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SfxItemSet; +class SvxNumRule; + +class SD_DLLPUBLIC SdBulletMapper +{ +public: + /* #i35937# + static void PreMapNumBulletForDialog( SfxItemSet& rSet ); + static void PostMapNumBulletForDialog( SfxItemSet& rSet ); +*/ + static void MapFontsInNumRule(SvxNumRule& aNumRule, const SfxItemSet& rSet); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/copydlg.hxx b/sd/source/ui/inc/copydlg.hxx new file mode 100644 index 0000000000..7d82747435 --- /dev/null +++ b/sd/source/ui/inc/copydlg.hxx @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class ColorListBox; + +namespace sd +{ +class View; + +/** + * dialog to adjust screen + */ +class CopyDlg : public SfxDialogController +{ +public: + CopyDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View* pView); + virtual ~CopyDlg() override; + + void GetAttr(SfxItemSet& rOutAttrs); + void Reset(); + +private: + const SfxItemSet& mrOutAttrs; + Fraction maUIScale; + ::sd::View* mpView; + + std::unique_ptr m_xNumFldCopies; + std::unique_ptr m_xBtnSetViewData; + std::unique_ptr m_xMtrFldMoveX; + std::unique_ptr m_xMtrFldMoveY; + std::unique_ptr m_xMtrFldAngle; + std::unique_ptr m_xMtrFldWidth; + std::unique_ptr m_xMtrFldHeight; + std::unique_ptr m_xFtEndColor; + std::unique_ptr m_xBtnSetDefault; + std::unique_ptr m_xLbStartColor; + std::unique_ptr m_xLbEndColor; + + DECL_LINK(SelectColorHdl, ColorListBox&, void); + DECL_LINK(SetViewData, weld::Button&, void); + DECL_LINK(SetDefault, weld::Button&, void); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/createtableobjectbar.hxx b/sd/source/ui/inc/createtableobjectbar.hxx new file mode 100644 index 0000000000..8fc21f19fc --- /dev/null +++ b/sd/source/ui/inc/createtableobjectbar.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SfxShell; + +namespace sd +{ +class View; +class ViewShell; +} + +namespace sd::ui::table +{ +SfxShell* CreateTableObjectBar(ViewShell& rShell, ::sd::View* pView); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/custsdlg.hxx b/sd/source/ui/inc/custsdlg.hxx new file mode 100644 index 0000000000..c6547cc918 --- /dev/null +++ b/sd/source/ui/inc/custsdlg.hxx @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SdDrawDocument; +class SdCustomShow; +class SdCustomShowList; + +class SdCustomShowDlg : public weld::GenericDialogController +{ +private: + SdDrawDocument& rDoc; + SdCustomShowList* pCustomShowList; + + std::unique_ptr m_xLbCustomShows; + std::unique_ptr m_xBtnNew; + std::unique_ptr m_xBtnEdit; + std::unique_ptr m_xBtnRemove; + std::unique_ptr m_xBtnCopy; + std::unique_ptr m_xBtnStartShow; + + void CheckState(); + + DECL_LINK( ClickButtonHdl, weld::Button&, void ); + DECL_LINK( SelectListBoxHdl, weld::TreeView&, void ); + DECL_LINK( StartShowHdl, weld::Button&, void ); + void SelectHdl(void const *); + +public: + SdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc); + virtual ~SdCustomShowDlg() override; + bool IsCustomShow() const; +}; + +class SdDefineCustomShowDlg : public weld::GenericDialogController +{ +private: + SdDrawDocument& rDoc; + std::unique_ptr& rpCustomShow; + bool bModified; + OUString aOldName; + + std::unique_ptr m_xEdtName; + std::unique_ptr m_xLbPages; + std::unique_ptr m_xBtnAdd; + std::unique_ptr m_xBtnRemove; + std::unique_ptr m_xLbCustomPages; + std::unique_ptr m_xDropTargetHelper; + std::unique_ptr m_xBtnOK; + + void CheckState(); + void CheckCustomShow(); + + DECL_LINK( ClickButtonHdl, weld::Button&, void ); + DECL_LINK( ClickButtonEditHdl, weld::Entry&, void ); + DECL_LINK( ClickButtonHdl3, weld::TreeView&, void ); + DECL_LINK( ClickButtonHdl4, weld::TreeView&, void ); + DECL_LINK( OKHdl, weld::Button&, void ); + void ClickButtonHdl2(void const *); + +public: + + SdDefineCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc, std::unique_ptr& rpCS); + virtual ~SdDefineCustomShowDlg() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/diactrl.hxx b/sd/source/ui/inc/diactrl.hxx new file mode 100644 index 0000000000..375e5401c9 --- /dev/null +++ b/sd/source/ui/inc/diactrl.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace com::sun::star::frame +{ +class XFrame; +} +class SfxUInt16Item; + +// SdPagesField: + +class SdPagesField final : public InterimItemWindow +{ +private: + std::unique_ptr m_xWidget; + css::uno::Reference m_xFrame; + + DECL_LINK(ModifyHdl, weld::SpinButton&, void); + DECL_STATIC_LINK(SdPagesField, OutputHdl, weld::SpinButton&, void); + DECL_LINK(spin_button_input, int* result, bool); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + +public: + SdPagesField(vcl::Window* pParent, css::uno::Reference xFrame); + virtual void dispose() override; + void set_sensitive(bool bSensitive); + virtual ~SdPagesField() override; + + void UpdatePagesField(const SfxUInt16Item* pItem); +}; + +// SdTbxCtlDiaPages: + +class SdTbxCtlDiaPages : public SfxToolBoxControl +{ +public: + virtual void StateChangedAtToolBoxControl(sal_uInt16 nSID, SfxItemState eState, + const SfxPoolItem* pState) override; + virtual VclPtr CreateItemWindow(vcl::Window* pParent) override; + + SFX_DECL_TOOLBOX_CONTROL(); + + SdTbxCtlDiaPages(sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx); + virtual ~SdTbxCtlDiaPages() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/dlg_char.hxx b/sd/source/ui/inc/dlg_char.hxx new file mode 100644 index 0000000000..dd12c321eb --- /dev/null +++ b/sd/source/ui/inc/dlg_char.hxx @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SfxItemSet; +class SfxObjectShell; + +/** + * Character-Tab-Dialog + */ +class SdCharDlg : public SfxTabDialogController +{ +private: + const SfxObjectShell& rDocShell; + + virtual void PageCreated(const OUString& rId, SfxTabPage& rPage) override; + +public: + SdCharDlg(weld::Window* pParent, const SfxItemSet* pAttr, const SfxObjectShell* pDocShell); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/dlgfield.hxx b/sd/source/ui/inc/dlgfield.hxx new file mode 100644 index 0000000000..40cadc9f40 --- /dev/null +++ b/sd/source/ui/inc/dlgfield.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SvxFieldData; +class SvxLanguageBox; + +/** + * dialog to adjust field-commands + */ +class SdModifyFieldDlg : public weld::GenericDialogController +{ +private: + SfxItemSet m_aInputSet; + const SvxFieldData* m_pField; + + std::unique_ptr m_xRbtFix; + std::unique_ptr m_xRbtVar; + std::unique_ptr m_xLbLanguage; + std::unique_ptr m_xLbFormat; + + void FillFormatList(); + void FillControls(); + + DECL_LINK(LanguageChangeHdl, weld::ComboBox&, void); + +public: + SdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, SfxItemSet aSet); + virtual ~SdModifyFieldDlg() override; + + SvxFieldData* GetField(); + SfxItemSet GetItemSet() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/dlgpage.hxx b/sd/source/ui/inc/dlgpage.hxx new file mode 100644 index 0000000000..aadb5f28e1 --- /dev/null +++ b/sd/source/ui/inc/dlgpage.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SfxObjectShell; +enum class ChangeType; + +/** + * Page configuration-tab-dialog + */ +class SdPageDlg : public SfxTabDialogController +{ +private: + bool mbIsImpressDoc; + + XColorListRef mpColorList; + XGradientListRef mpGradientList; + XHatchListRef mpHatchingList; + XBitmapListRef mpBitmapList; + XPatternListRef mpPatternList; +public: + + SdPageDlg(SfxObjectShell const * pDocSh, weld::Window* pParent, const SfxItemSet* pAttr, bool bAreaPage, bool bIsImpressDoc); + + virtual void PageCreated(const OUString& rId, SfxTabPage& rPage) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/dlgsnap.hxx b/sd/source/ui/inc/dlgsnap.hxx new file mode 100644 index 0000000000..97fe09ccbb --- /dev/null +++ b/sd/source/ui/inc/dlgsnap.hxx @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +/************************************************************************/ + +class SfxItemSet; +namespace sd { + class View; +} + +/** + * dialog to adjust snap- lines and points + */ +class SdSnapLineDlg : public weld::GenericDialogController +{ +private: + int nXValue; + int nYValue; + Fraction aUIScale; + + std::unique_ptr m_xFtX; + std::unique_ptr m_xMtrFldX; + std::unique_ptr m_xFtY; + std::unique_ptr m_xMtrFldY; + std::unique_ptr m_xRadioGroup; + std::unique_ptr m_xRbPoint; + std::unique_ptr m_xRbVert; + std::unique_ptr m_xRbHorz; + std::unique_ptr m_xBtnDelete; + + DECL_LINK(ClickHdl, weld::Button&, void); + DECL_LINK(ToggleHdl, weld::Toggleable&, void); + +public: + SdSnapLineDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View const * pView); + virtual ~SdSnapLineDlg() override; + + void GetAttr(SfxItemSet& rOutAttrs); + + void HideRadioGroup(); + void HideDeleteBtn() { m_xBtnDelete->hide(); } + void SetInputFields(bool bEnableX, bool bEnableY); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/drawview.hxx b/sd/source/ui/inc/drawview.hxx new file mode 100644 index 0000000000..daa5cc026f --- /dev/null +++ b/sd/source/ui/inc/drawview.hxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "View.hxx" + +#include + +namespace sd { + +class DrawDocShell; +class DrawViewShell; + +/** + * Derivative of ::sd::View; contains also a pointer to the document + */ +class SD_DLLPUBLIC DrawView : public ::sd::View +{ +public: + + DrawView ( + DrawDocShell* pDocSh, + OutputDevice* pOutDev, + DrawViewShell* pShell); + virtual ~DrawView() override; + + virtual void MarkListHasChanged() override; + void CompleteRedraw(OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector = nullptr) override; + + virtual bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll = false, bool bSlide = false, bool bMaster = false) override; + void SetMasterAttributes(SdrObject* pObject, const SdPage& rPage, SfxItemSet rSet, SfxStyleSheetBasePool* pStShPool, bool& bOk, bool bMaster, bool bSlide); + + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + + void BlockPageOrderChangedHint(bool bBlock); + + bool SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr = false) override; + + virtual void MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin) override; + virtual void HideSdrPage() override; // SdrPageView* pPV); + + virtual void DeleteMarked() override; // from SdrView +protected: + virtual void ModelHasChanged() override; + +private: + DrawDocShell* mpDocShell; + DrawViewShell* mpDrawViewShell; + + sal_uInt16 mnPOCHSmph; ///< for blocking PageOrderChangedHint +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/filedlg.hxx b/sd/source/ui/inc/filedlg.hxx new file mode 100644 index 0000000000..c2c373a550 --- /dev/null +++ b/sd/source/ui/inc/filedlg.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +#include + +class SdFileDialog_Imp; + +/******************************************************************************/ + +/** + The class SdOpenSoundFileDialog wraps the FileDialogHelper, displaying the + FILEOPEN_PLAY dialog template and performing the 'preview' functionality + (playing the selected sound file). The interface is a downstripped version + of the aforementioned class, with similar semantics. + */ +class SD_DLLPUBLIC SdOpenSoundFileDialog +{ + const std::unique_ptr mpImpl; + + SdOpenSoundFileDialog(const SdOpenSoundFileDialog&) = delete; + SdOpenSoundFileDialog& operator=(const SdOpenSoundFileDialog&) = delete; + +public: + SdOpenSoundFileDialog(weld::Window* pParent); + ~SdOpenSoundFileDialog(); + + ErrCode Execute(); + OUString GetPath() const; + void SetPath(const OUString& rPath); + // WIP, please don't remove, dear Clang plugins + bool IsInsertAsLinkSelected() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/Configuration.hxx b/sd/source/ui/inc/framework/Configuration.hxx new file mode 100644 index 0000000000..1b245e47af --- /dev/null +++ b/sd/source/ui/inc/framework/Configuration.hxx @@ -0,0 +1,174 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace com::sun::star::util { class XCloneable; } +namespace com::sun::star::drawing::framework { class XConfigurationControllerBroadcaster; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XConfiguration, + css::container::XNamed + > ConfigurationInterfaceBase; + +/** A configuration describes the resources of an application like panes, + views, and tool bars and their relationships that are currently active + or are requested to be activated. Resources are specified by URLs rather + than references so that not only the current configuration but also a + requested configuration can be represented. + + A resource URL describes the type of a resource, not its actual + instance. For resources, like panes, that are unique with respect to an + application frame, that does not mean much of a difference. For other + resources like views, that may have more than one instance per + application frame, this is different. To identify them unambiguously a + second URL, one of a unique resource, is necessary. This second URL is + called the anchor of the first. The two types of resources are called + unique and linked respectively. + + Direct manipulation of a configuration object is not advised with the + exception of the configuration controller and objects that implement the + XConfigurationChangeOperation interface. +*/ +class Configuration final + : public ConfigurationInterfaceBase +{ +public: + /** Create a new configuration with a broadcaster that is used to send + events about requested configuration changes. + @param rxBroadcaster + This broadcaster is typically the same as the one used by the + ConfigurationController. + @param bBroadcastRequestEvents + When this is then modifications to the configuration + trigger the broadcasting of "ResourceActivationRequestEvent" and + "ResourceDeactivationRequestEvent". When this flag is + then events with type "ResourceActivationEvent" and + "ResourceDeactivationEvent" are broadcasted. + */ + Configuration (const css::uno::Reference& rxBroadcaster, + bool bBroadcastRequestEvents); + virtual ~Configuration() override; + + virtual void disposing(std::unique_lock&) override; + + // XConfiguration + + virtual void SAL_CALL addResource ( + const css::uno::Reference& + rxResourceId) override; + + virtual void SAL_CALL removeResource( + const css::uno::Reference& + rxResourceId) override; + + virtual css::uno::Sequence< css::uno::Reference< + css::drawing::framework::XResourceId> > SAL_CALL getResources ( + const css::uno::Reference& rxAnchorId, + const OUString& rsResourceURLPrefix, + css::drawing::framework::AnchorBindingMode eMode) override; + + virtual sal_Bool SAL_CALL hasResource ( + const css::uno::Reference& + rxResourceId) override; + + // XCloneable + + virtual css::uno::Reference + SAL_CALL createClone() override; + + // XNamed + + /** Return a human readable string representation. This is used for + debugging purposes. + */ + virtual OUString SAL_CALL getName() override; + + /** This call is ignored because the XNamed interface is (mis)used to + give access to a human readable name for debugging purposes. + */ + virtual void SAL_CALL setName (const OUString& rName) override; + +private: + class ResourceContainer; + /** The resource container holds the URLs of unique resource and of + resource linked to unique resources. + */ + std::unique_ptr mpResourceContainer; + + /** The broadcaster used for notifying listeners of requests for + configuration changes. + */ + css::uno::Reference + mxBroadcaster; + + bool mbBroadcastRequestEvents; + + /** This private variant of the constructor is used for cloning a + Configuration object. + @param rResourceContainer + The new Configuration is created with a copy of the elements in + this container. + */ + Configuration (const css::uno::Reference& rxBroadcaster, + bool bBroadcastRequestEvents, + const ResourceContainer& rResourceContainer); + + /** Send an event to all interested listeners that a resource has been + added or removed. The event is sent to the listeners via the + ConfigurationController. + @param rxResourceId + The resource that is added to or removed from the configuration. + @param bActivation + This specifies whether an activation or deactivation is + broadcasted. The mbBroadcastRequestEvents member is also taken + into account when the actual event type field is determined. + */ + void PostEvent ( + const css::uno::Reference& rxResourceId, + const bool bActivation); + + /** When the called object has already been disposed this method throws + an exception and does not return. + + @throws css::lang::DisposedException + */ + void ThrowIfDisposed() const; +}; + +/** Return whether the two given configurations contain the same resource + ids. The order of resource ids is ignored. Empty references are + treated like empty configurations. +*/ +bool AreConfigurationsEquivalent ( + const css::uno::Reference& rxConfiguration1, + const css::uno::Reference& rxConfiguration2); + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/ConfigurationController.hxx b/sd/source/ui/inc/framework/ConfigurationController.hxx new file mode 100644 index 0000000000..3cff9d4039 --- /dev/null +++ b/sd/source/ui/inc/framework/ConfigurationController.hxx @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include +#include + +#include + + +namespace com::sun::star::drawing::framework { class XConfiguration; } +namespace com::sun::star::drawing::framework { class XConfigurationChangeRequest; } +namespace com::sun::star::drawing::framework { class XResourceId; } +namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; } +namespace com::sun::star::frame { class XController; } +namespace sd { class DrawController; } + +namespace sd::framework { + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XConfigurationController + > ConfigurationControllerInterfaceBase; + +/** The configuration controller is responsible for maintaining the current + configuration. + + @see css::drawing::framework::XConfigurationController + for an extended documentation. +*/ +class ConfigurationController final + : private cppu::BaseMutex, + public ConfigurationControllerInterfaceBase +{ +public: + ConfigurationController(const rtl::Reference<::sd::DrawController>& rxController); + virtual ~ConfigurationController() noexcept override; + ConfigurationController(const ConfigurationController&) = delete; + ConfigurationController& operator=(const ConfigurationController&) = delete; + + virtual void SAL_CALL disposing() override; + + void ProcessEvent(); + + /** Normally the requested changes of the configuration are executed + asynchronously. However, there is at least one situation (searching + with the Outliner) where the surrounding code does not cope with + this. So, instead of calling Reschedule until the global event loop + executes the configuration update, this method does (almost) the + same without the reschedules. + + Do not use this method until there is absolutely no other way. + */ + void RequestSynchronousUpdate(); + + // XConfigurationController + + virtual void SAL_CALL lock() override; + + virtual void SAL_CALL unlock() override; + + virtual void SAL_CALL requestResourceActivation ( + const css::uno::Reference& rxResourceId, + css::drawing::framework::ResourceActivationMode eMode) override; + + virtual void SAL_CALL requestResourceDeactivation ( + const css::uno::Reference& + rxResourceId) override; + + virtual css::uno::Reference + SAL_CALL getResource ( + const css::uno::Reference& rxResourceId) override; + + virtual void SAL_CALL update() override; + + virtual css::uno::Reference< + css::drawing::framework::XConfiguration> + SAL_CALL getRequestedConfiguration() override; + + virtual css::uno::Reference< + css::drawing::framework::XConfiguration> + SAL_CALL getCurrentConfiguration() override; + + virtual void SAL_CALL restoreConfiguration ( + const css::uno::Reference& + rxConfiguration) override; + + // XConfigurationControllerBroadcaster + + virtual void SAL_CALL addConfigurationChangeListener ( + const css::uno::Reference< + css::drawing::framework::XConfigurationChangeListener>& rxListener, + const OUString& rsEventType, + const css::uno::Any& rUserData) override; + + virtual void SAL_CALL removeConfigurationChangeListener ( + const css::uno::Reference< + css::drawing::framework::XConfigurationChangeListener>& rxListener) override; + + virtual void SAL_CALL notifyEvent ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // XConfigurationRequestQueue + + virtual sal_Bool SAL_CALL hasPendingRequests() override; + + virtual void SAL_CALL postChangeRequest ( + const css::uno::Reference< + css::drawing::framework::XConfigurationChangeRequest>& rxRequest) override; + + // XResourceFactoryManager + + virtual void SAL_CALL addResourceFactory( + const OUString& sResourceURL, + const css::uno::Reference& rxResourceFactory) override; + + virtual void SAL_CALL removeResourceFactoryForURL( + const OUString& sResourceURL) override; + + virtual void SAL_CALL removeResourceFactoryForReference( + const css::uno::Reference& rxResourceFactory) override; + + virtual css::uno::Reference + SAL_CALL getResourceFactory ( + const OUString& sResourceURL) override; + + /** Use this class instead of calling lock() and unlock() directly in + order to be exception safe. + */ + class Lock + { + public: + Lock (const css::uno::Reference< + css::drawing::framework::XConfigurationController>& rxController); + ~Lock(); + private: + css::uno::Reference< + css::drawing::framework::XConfigurationController> mxController; + }; + +private: + class Implementation; + std::unique_ptr mpImplementation; + bool mbIsDisposed; + + /** When the called object has already been disposed this method throws + an exception and does not return. + + @throws css::lang::DisposedException + @throws css::uno::RuntimeException + */ + void ThrowIfDisposed () const; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/DrawModule.hxx b/sd/source/ui/inc/framework/DrawModule.hxx new file mode 100644 index 0000000000..8190919986 --- /dev/null +++ b/sd/source/ui/inc/framework/DrawModule.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace com::sun::star::frame +{ +class XController; +} +namespace com::sun::star::uno +{ +template class Reference; +} +namespace sd +{ +class DrawController; +} + +namespace sd::framework +{ +/** The task of this module is to instantiate all modules that belong to the + Draw application. +*/ +class DrawModule +{ +public: + static void Initialize(rtl::Reference const& rxController); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/FrameworkHelper.hxx b/sd/source/ui/inc/framework/FrameworkHelper.hxx new file mode 100644 index 0000000000..e5fe6f78cd --- /dev/null +++ b/sd/source/ui/inc/framework/FrameworkHelper.hxx @@ -0,0 +1,342 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XResourceId; } +namespace com::sun::star::drawing::framework { class XView; } +namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; } + +namespace sd { +class ViewShellBase; +} + + +namespace sd::framework { + +/** The FrameworkHelper is a convenience class that simplifies the + access to the drawing framework. + It has three main tasks: + 1. Provide frequently used strings of resource URLs and event names. + 2. Provide shortcuts for accessing the sd framework. + 3. Ease the migration to the drawing framework. + + Note that a FrameworkHelper disposes itself when one of the resource + controllers called by it throws a DisposedException. +*/ +class FrameworkHelper final + : public std::enable_shared_from_this, + public SdGlobalResource +{ +public: + // URLs of frequently used panes. + static constexpr OUString msPaneURLPrefix = u"private:resource/pane/"_ustr; + static const OUString msCenterPaneURL; + static const OUString msFullScreenPaneURL; + static const OUString msLeftImpressPaneURL; + static const OUString msLeftDrawPaneURL; + + // URLs of frequently used views. + static constexpr OUString msViewURLPrefix = u"private:resource/view/"_ustr; + static const OUString msImpressViewURL; + static const OUString msDrawViewURL; + static const OUString msOutlineViewURL; + static const OUString msNotesViewURL; + static const OUString msHandoutViewURL; + static const OUString msSlideSorterURL; + static const OUString msPresentationViewURL; + static const OUString msSidebarViewURL; + + // URLs of frequently used tool bars. + static constexpr OUString msToolBarURLPrefix = u"private:resource/toolbar/"_ustr; + static const OUString msViewTabBarURL; + + // Names of frequently used events. + static constexpr OUString msResourceActivationRequestEvent + = u"ResourceActivationRequested"_ustr; + static constexpr OUString msResourceDeactivationRequestEvent + = u"ResourceDeactivationRequest"_ustr; + static constexpr OUString msResourceActivationEvent = u"ResourceActivation"_ustr; + static constexpr OUString msResourceDeactivationEvent = u"ResourceDeactivation"_ustr; + static constexpr OUString msResourceDeactivationEndEvent = u"ResourceDeactivationEnd"_ustr; + static constexpr OUString msConfigurationUpdateStartEvent = u"ConfigurationUpdateStart"_ustr; + static constexpr OUString msConfigurationUpdateEndEvent = u"ConfigurationUpdateEnd"_ustr; + + /** Return the FrameworkHelper object that is associated with the given + ViewShellBase. If such an object does not yet exist, a new one is + created. + */ + static ::std::shared_ptr Instance (ViewShellBase& rBase); + + /** Mark the FrameworkHelper object for the given ViewShellBase as + disposed. A following ReleaseInstance() call will destroy the + FrameworkHelper object. + + Do not call this method. It is an internally used method that can + not be made private. + */ + static void DisposeInstance (const ViewShellBase& rBase); + + /** Destroy the FrameworkHelper object for the given ViewShellBase. + + Do not call this method. It is an internally used method that can + not be made private. + */ + static void ReleaseInstance (const ViewShellBase& rBase); + + /** Return an identifier for the given view URL. This identifier can be + used in a switch statement. See GetViewURL() for a mapping in the + opposite direction. + */ + static ViewShell::ShellType GetViewId (const OUString& rsViewURL); + + /** Return a view URL for the given identifier. See GetViewId() for a + mapping in the opposite direction. + */ + static OUString GetViewURL (ViewShell::ShellType eType); + + /** Return a ViewShell pointer for the given XView reference. This + assumes that the given reference is implemented by the + ViewShellWrapper class that supports the XTunnel interface. + @return + When the ViewShell pointer can not be inferred from the given + reference then an empty pointer is returned. + */ + static ::std::shared_ptr GetViewShell ( + const css::uno::Reference& rxView); + + typedef ::std::function + ConfigurationChangeEventFilter; + typedef ::std::function Callback; + typedef ::std::function< + void ( + const css::uno::Reference< + css::drawing::framework::XResourceId>&) + > ResourceFunctor; + + /** Test whether the called FrameworkHelper object is valid. + @return + When the object has already been disposed then is returned. + */ + bool IsValid() const; + + /** Return a pointer to the view shell that is displayed in the + specified pane. See GetView() for a variant that returns a + reference to XView instead of a ViewShell pointer. + @return + An empty pointer is returned when for example the specified pane + does not exist or is not visible or does not show a view or one + of the involved objects does not support XUnoTunnel (where + necessary). + */ + ::std::shared_ptr GetViewShell (const OUString& rsPaneURL); + + /** Return a reference to the view that is displayed in the specified + pane. See GetViewShell () for a variant that returns a ViewShell + pointer instead of a reference to XView. + @param rxPaneOrViewId + When this ResourceId specifies a view then that view is + returned. When it belongs to a pane then one view in that pane + is returned. + @return + An empty reference is returned when for example the specified pane + does not exist or is not visible or does not show a view or one + of the involved objects does not support XTunnel (where + necessary). + */ + css::uno::Reference GetView ( + const css::uno::Reference& rxPaneOrViewId); + + /** Request the specified view to be displayed in the specified pane. + When the pane is not visible its creation is also requested. The + update that creates the actual view object is done asynchronously. + @param rsResourceURL + The resource URL of the view to show. + @param rsAnchorURL + The URL of the pane in which to show the view. + @return + The resource id of the requested view is returned. With that + the caller can, for example, call RunOnResourceActivation() to + do some initialization after the requested view becomes active. + */ + css::uno::Reference RequestView ( + const OUString& rsResourceURL, + const OUString& rsAnchorURL); + + /** Process a slot call that requests a view shell change. + */ + void HandleModeChangeSlot ( + sal_uInt16 nSlotId, + SfxRequest const & rRequest); + + /** Run the given callback when the specified event is notified by the + ConfigurationManager. When there are no pending requests and + therefore no events would be notified (in the foreseeable future) + then the callback is called immediately. + The callback is called with a flag that tells the callback whether + the event it waits for has been sent. + */ + void RunOnConfigurationEvent( + const OUString& rsEventType, + const Callback& rCallback); + + /** Run the given callback when the specified resource has been + activated. When the resource is active already when this method is + called then rCallback is called before this method returns. + @param rxResourceId + Wait for the activation of this resource before calling + rCallback. + @param rCallback + The callback to be called when the resource is activated. + + */ + void RunOnResourceActivation( + const css::uno::Reference& rxResourceId, + const Callback& rCallback); + + /** Normally the requested changes of the configuration are executed + asynchronously. However, there is at least one situation (searching + with the Outliner) where the surrounding code does not cope with + this. So, instead of calling Reschedule until the global event loop + executes the configuration update, this method does (almost) the + same without the reschedules. + + Do not use this method until there is absolutely no other way. + */ + void RequestSynchronousUpdate(); + + /** Block until the specified event is notified by the configuration + controller. When the configuration controller is not processing any + requests the method returns immediately. + */ + void WaitForEvent (const OUString& rsEventName) const; + + /** This is a short cut for WaitForEvent(msConfigurationUpdateEndEvent). + Call this method to execute the pending requests. + */ + void WaitForUpdate() const; + + /** Explicit request for an update of the current configuration. Call + this method when one of the resources managed by the sd framework + has been activated or deactivated from the outside, i.e. not by the + framework itself. An example for this is a click on the closer + button of one of the side panes. + */ + void UpdateConfiguration(); + + /** Return a string representation of the given XResourceId object. + */ + static OUString ResourceIdToString ( + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxResourceId); + + /** Create a new XResourceId object for the given resource URL. + */ + static css::uno::Reference< + css::drawing::framework::XResourceId> + CreateResourceId ( + const OUString& rsResourceURL); + + /** Create a new XResourceId object for the given resource URL and a + single anchor URL. + */ + static css::uno::Reference< + css::drawing::framework::XResourceId> + CreateResourceId ( + const OUString& rsResourceURL, + const OUString& rsAnchorURL); + + /** Create a new XResourceId object for the given resource URL. + */ + static css::uno::Reference< + css::drawing::framework::XResourceId> + CreateResourceId ( + const OUString& rsResourceURL, + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxAnchor); + + const css::uno::Reference& + GetConfigurationController() const { return mxConfigurationController;} + +private: + typedef ::std::map< + const ViewShellBase*, + ::std::shared_ptr > InstanceMap; + /** The instance map holds (at least) one FrameworkHelper instance for + every ViewShellBase object. + */ + static InstanceMap maInstanceMap; + class ViewURLMap; + static ViewURLMap maViewURLMap; + static std::mutex maInstanceMapMutex; + + ViewShellBase& mrBase; + css::uno::Reference + mxConfigurationController; + + class DisposeListener; + friend class DisposeListener; + css::uno::Reference + mxDisposeListener; + + FrameworkHelper (ViewShellBase& rBase); + FrameworkHelper (const FrameworkHelper& rHelper) = delete; + virtual ~FrameworkHelper() override; + class Deleter; friend class Deleter; + FrameworkHelper& operator= (const FrameworkHelper& rHelper) = delete; + + void Initialize(); + + void Dispose(); + + /** Run the given callback when an event of the specified type is + received from the ConfigurationController or when the + ConfigurationController has no pending change requests. + @param rsEventType + Run rCallback only on this event. + @param rFilter + This filter has to return in order for rCallback to be + called. + @param rCallback + The callback functor to be called. + */ + void RunOnEvent( + const OUString& rsEventType, + const ConfigurationChangeEventFilter& rFilter, + const Callback& rCallback) const; + + /** This disposing method is forwarded from the inner DisposeListener class. + */ + void disposing (const css::lang::EventObject& rEventObject); +}; + +} // end of namespace sd::framework + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/ImpressModule.hxx b/sd/source/ui/inc/framework/ImpressModule.hxx new file mode 100644 index 0000000000..fc4e2b8397 --- /dev/null +++ b/sd/source/ui/inc/framework/ImpressModule.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace com::sun::star::frame +{ +class XController; +} +namespace com::sun::star::uno +{ +template class Reference; +} +namespace sd +{ +class DrawController; +} + +namespace sd::framework +{ +/** The task of this module is to instantiate all modules that belong to the + Impress application. +*/ +class ImpressModule +{ +public: + static void Initialize(rtl::Reference const& rxController); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/ModuleController.hxx b/sd/source/ui/inc/framework/ModuleController.hxx new file mode 100644 index 0000000000..ea1de664cc --- /dev/null +++ b/sd/source/ui/inc/framework/ModuleController.hxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace com::sun::star::frame { class XController; } +namespace com::sun::star::uno { class XComponentContext; } +namespace sd { class DrawController; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XModuleController + > ModuleControllerInterfaceBase; + +/** The ModuleController has two tasks: + + 1. It reads the + org.openoffice.Office.Impress/MultiPaneGUI/Framework/ResourceFactories + configuration data that maps from resource URLs to service names of + factories that can create resources for the URLs. When the + configuration controller wants to create a resource for which it does + not have a factory, it asks the ModuleController to provide one. The + ModuleController looks up the service name registered for the URL of the + resource and instantiates this service. The service is expected to + register on its creation a factory for the resource in question. + + 2. The ModuleController instantiates PresentationFactoryProvider. + This service + can then register as listeners at the ConfigurationController or do + whatever they like. +*/ +class ModuleController final + : public ModuleControllerInterfaceBase +{ +public: + /// @throws std::exception + ModuleController(const rtl::Reference<::sd::DrawController>& rxController); + + virtual void disposing(std::unique_lock&) override; + + // XModuleController + + virtual void SAL_CALL requestResource(const OUString& rsResourceURL) override; + +private: + rtl::Reference<::sd::DrawController> mxController; + + std::unordered_map maResourceToFactoryMap; + std::unordered_map> maLoadedFactories; + + ModuleController (const ModuleController&) = delete; + virtual ~ModuleController() noexcept override; + + /** Called for every entry in the ResourceFactories configuration entry. + */ + void ProcessFactory (const OUString& ServiceName, ::std::vector aURLs); + + /** Instantiate startup services. This method is called once when a new + ModuleController object is created. + */ + void InstantiateStartupServices(); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/Pane.hxx b/sd/source/ui/inc/framework/Pane.hxx new file mode 100644 index 0000000000..51b7a5ed09 --- /dev/null +++ b/sd/source/ui/inc/framework/Pane.hxx @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace sd::framework { + +typedef ::cppu::WeakComponentImplHelper < + css::drawing::framework::XPane, + css::drawing::framework::XPane2 + > PaneInterfaceBase; + +/** A pane is a wrapper for a window and possibly for a tab bar (for view + switching). Panes are unique resources. + + This class has two responsibilities: + 1. It implements the XPane interface. This is the most important + interface of this class for API based views (of which there not that + many yet) because it gives access to the XWindow. + 2. It gives access to the underlying VCL Window. + This is necessary at the moment and in the + foreseeable future because many parts of the Draw and Impress views rely + on direct access on the Window class. +*/ +class Pane + : protected cppu::BaseMutex, + public PaneInterfaceBase +{ +public: + /** Create a new Pane object that wraps the given window. + @param rsPaneURL + The URL that is used by the configuration to identify the pane. + The given URL has to be valid. + @param pWindow + The VCL Window (usually this really is an sd::Window) that is + wrapped by the new Pane object. The given pointer must not be + NULL. + */ + Pane ( + const css::uno::Reference& rxPaneId, + vcl::Window* pWindow) + noexcept; + virtual ~Pane() override; + + virtual void SAL_CALL disposing() override; + + /** This method is typically used to obtain + a Window pointer from an XPane object. + */ + virtual vcl::Window* GetWindow(); + + //----- XPane ------------------------------------------------------------- + + /** For a UNO API based implementation of a view this may the most + important method of this class because the view is only interested + in the window of the pane. + */ + virtual css::uno::Reference + SAL_CALL getWindow() override; + + virtual css::uno::Reference + SAL_CALL getCanvas() override; + + //----- XPane2 ------------------------------------------------------------- + + virtual sal_Bool SAL_CALL isVisible() override; + + virtual void SAL_CALL setVisible (sal_Bool bIsVisible) override; + + virtual css::uno::Reference SAL_CALL getAccessible() override; + + virtual void SAL_CALL setAccessible ( + const css::uno::Reference& rxAccessible) override; + + //----- XResource --------------------------------------------------------- + + virtual css::uno::Reference + SAL_CALL getResourceId() override; + + /** For the typical pane it makes no sense to be displayed without a + view. Therefore this default implementation returns always . + */ + virtual sal_Bool SAL_CALL isAnchorOnly() override; + +protected: + css::uno::Reference mxPaneId; + VclPtr mpWindow; + css::uno::Reference mxWindow; + css::uno::Reference mxCanvas; + + /** Override this method, not getCanvas(), when you want to provide a + different canvas. + + @throws css::uno::RuntimeException + */ + virtual css::uno::Reference + CreateCanvas(); + + /** Throw DisposedException when the object has already been disposed or + is currently being disposed. Otherwise this method returns + normally. + + @throws css::lang::DisposedException + */ + void ThrowIfDisposed() const; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/PresentationFactory.hxx b/sd/source/ui/inc/framework/PresentationFactory.hxx new file mode 100644 index 0000000000..fe984c401f --- /dev/null +++ b/sd/source/ui/inc/framework/PresentationFactory.hxx @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::frame { class XController; } +namespace sd { class DrawController; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XResourceFactory, + css::drawing::framework::XConfigurationChangeListener + > PresentationFactoryInterfaceBase; + +/** This factory creates a marker view whose existence in a configuration + indicates that a slideshow is running (in another but associated + application window). +*/ +class PresentationFactory final + : public PresentationFactoryInterfaceBase +{ +public: + PresentationFactory ( + const rtl::Reference<::sd::DrawController>& rxController); + virtual ~PresentationFactory() override; + + static void install(const rtl::Reference<::sd::DrawController>& rxController); + + // XResourceFactory + + virtual css::uno::Reference + SAL_CALL createResource ( + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxViewId) override; + + virtual void SAL_CALL releaseResource ( + const css::uno::Reference& xView) override; + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // lang::XEventListener + + using WeakComponentImplHelperBase::disposing; + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEventObject) override; + +private: + rtl::Reference<::sd::DrawController> mxController; + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/PresentationModule.hxx b/sd/source/ui/inc/framework/PresentationModule.hxx new file mode 100644 index 0000000000..437534f707 --- /dev/null +++ b/sd/source/ui/inc/framework/PresentationModule.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace com::sun::star::frame +{ +class XController; +} +namespace com::sun::star::uno +{ +template class Reference; +} +namespace sd +{ +class DrawController; +} + +namespace sd::framework +{ +/** The task of this module is to instantiate all modules that belong to the + fullscreen presentation. +*/ +class PresentationModule +{ +public: + static void Initialize(rtl::Reference const& rxController); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/ResourceId.hxx b/sd/source/ui/inc/framework/ResourceId.hxx new file mode 100644 index 0000000000..2ce3271d04 --- /dev/null +++ b/sd/source/ui/inc/framework/ResourceId.hxx @@ -0,0 +1,213 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include +#include +#include +#include + +#include + +namespace com::sun::star::util { class XURLTransformer; } +namespace com::sun::star::uno { template class WeakReference; } + +namespace sd::framework { + +typedef ::cppu::WeakImplHelper < + css::drawing::framework::XResourceId, + css::lang::XInitialization, + css::lang::XServiceInfo + > ResourceIdInterfaceBase; + +/** Implementation of the css::drawing::framework::ResourceId + service and the css::drawing::framework::XResourceId + interface. +*/ +class ResourceId final + : public ResourceIdInterfaceBase +{ +public: + /** Create a new, empty resource id. + */ + ResourceId(); + + /** Create a new resource id that is described by the given URLs. + @param rsResourceURLs + The first URL specifies the type of resource. The other URLs + describe its anchor. + The set of URLs may be empty. The result is then the same as + returned by ResourceId() default constructor. + */ + ResourceId (std::vector&& rsResourceURLs); + + /** Create a new resource id that has an empty anchor. + @param rsResourceURL + When this resource URL is empty then the resulting ResourceId + object is identical to when the ResourceId() default constructor + had been called. + */ + ResourceId ( + const OUString& rsResourceURL); + + /** Create a new resource id for the given resource type and an anchor + that is specified by a single URL. This constructor can be used for + example for views that are bound to panes. + @param rsResourceURL + The URL of the actual resource. + @param rsAnchorURL + The single URL of the anchor. + */ + ResourceId ( + const OUString& rsResourceURL, + const OUString& rsAnchorURL); + + /** Create a new resource id with an anchor that consists of a sequence + of URLs that is extended by a further URL. + @param rsResourceURL + The URL of the actual resource. + @param rsFirstAnchorURL + This URL extends the anchor given by rAnchorURLs. + @param rAnchorURLs + An anchor as it is returned by XResourceId::getAnchorURLs(). + */ + ResourceId ( + const OUString& rsResourceURL, + const OUString& rsFirstAnchorURL, + const css::uno::Sequence& rAnchorURLs); + + virtual ~ResourceId() override; + + //===== XResourceId ======================================================= + + virtual OUString SAL_CALL + getResourceURL() override; + + virtual css::util::URL SAL_CALL + getFullResourceURL() override; + + virtual sal_Bool SAL_CALL + hasAnchor() override; + + virtual css::uno::Reference< + css::drawing::framework::XResourceId> SAL_CALL + getAnchor() override; + + virtual css::uno::Sequence SAL_CALL + getAnchorURLs() override; + + virtual OUString SAL_CALL + getResourceTypePrefix() override; + + virtual sal_Int16 SAL_CALL + compareTo (const css::uno::Reference< + css::drawing::framework::XResourceId>& rxResourceId) override; + + virtual sal_Bool SAL_CALL + isBoundTo ( + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxResourceId, + css::drawing::framework::AnchorBindingMode eMode) override; + + virtual sal_Bool SAL_CALL + isBoundToURL ( + const OUString& rsAnchorURL, + css::drawing::framework::AnchorBindingMode eMode) override; + + virtual css::uno::Reference< + css::drawing::framework::XResourceId> SAL_CALL + clone() override; + + //===== XInitialization =================================================== + + void SAL_CALL initialize ( + const css::uno::Sequence& aArguments) override; + + OUString SAL_CALL getImplementationName() override; + + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override; + + css::uno::Sequence SAL_CALL getSupportedServiceNames() override; + +private: + /** The set of URLs that consist of the resource URL at index 0 and the + anchor URLs and indices 1 and above. + */ + std::vector maResourceURLs; + + std::unique_ptr mpURL; + + static css::uno::WeakReference mxURLTransformerWeak; + + /** Compare the called ResourceId object to the given ResourceId object. + This uses the implementation of both objects to speed up the + comparison. + */ + sal_Int16 CompareToLocalImplementation (const ResourceId& rId) const; + + /** Compare the called ResourceId object to the given XResourceId object + reference. The comparison is done via the UNO interface. Namely, + it uses the getResourceURL() and the getAnchorURLs() methods to get + access to the URLs of the given object. + */ + sal_Int16 CompareToExternalImplementation (const css::uno::Reference< + css::drawing::framework::XResourceId>& rxId) const; + + /** Return whether the called ResourceId object is bound to the anchor + consisting of the URLs given by psFirstAnchorURL and paAnchorURLs. + @param psFirstAnchorURL + Optional first URL of the anchor. This can be missing or present + independently of paAnchorURLs. + @param paAnchorURLs + Optional set of additional anchor URLs. This can be missing or + present independently of psFirstAnchorURL. + @param eMode + This specifies whether the called resource has to be directly + bound to the given anchor in order to return or whether + it can be bound indirectly, too. + */ + bool IsBoundToAnchor ( + const OUString* psFirstAnchorURL, + const css::uno::Sequence* paAnchorURLs, + css::drawing::framework::AnchorBindingMode eMode) const; + + /** Return whether the called ResourceId object is bound to the anchor + consisting of the URLs in rResourceURLs. + @param rResourceURLs + A possibly empty list of anchor URLs. + @param eMode + This specifies whether the called resource has to be directly + bound to the given anchor in order to return or whether + it can be bound indirectly, too. + */ + bool IsBoundToAnchor ( + const ::std::vector& rResourceURLs, + css::drawing::framework::AnchorBindingMode eMode) const; + + void ParseResourceURL(); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/ViewShellWrapper.hxx b/sd/source/ui/inc/framework/ViewShellWrapper.hxx new file mode 100644 index 0000000000..fc944623a7 --- /dev/null +++ b/sd/source/ui/inc/framework/ViewShellWrapper.hxx @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace sd { class ViewShell; } +namespace sd::slidesorter { class SlideSorterViewShell; } +namespace com::sun::star::awt { class XWindow; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < css::awt::XWindowListener + , css::view::XSelectionSupplier + , css::drawing::framework::XRelocatableResource + , css::drawing::framework::XView + > ViewShellWrapperInterfaceBase; + +/** This class wraps ViewShell objects and makes them look like an XView. + Most importantly it provides access to the ViewShell implementation. + Then it forwards size changes of the pane window to the view shell. +*/ +class ViewShellWrapper final : public ViewShellWrapperInterfaceBase +{ +public: + /** Create a new ViewShellWrapper object that wraps the given ViewShell + object. + @param pViewShell + The ViewShell object to wrap. + @param rsViewURL + URL of the view type of the wrapped view shell. + @param rxWindow + This window reference is optional. When a valid reference is + given then size changes of the referenced window are forwarded + to the ViewShell object. + */ + ViewShellWrapper ( + const ::std::shared_ptr& pViewShell, + const css::uno::Reference& rxViewId, + const css::uno::Reference& rxWindow); + virtual ~ViewShellWrapper() override; + + virtual void disposing(std::unique_lock&) override; + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + + /** This method is typically used + to obtain a pointer to the wrapped ViewShell object for a given + XView object. + */ + const ::std::shared_ptr& GetViewShell() const { return mpViewShell;} + + // XResource + + virtual css::uno::Reference + SAL_CALL getResourceId() override; + + virtual sal_Bool SAL_CALL isAnchorOnly() override; + + // XSelectionSupplier + + virtual sal_Bool SAL_CALL select( const css::uno::Any& aSelection ) override; + virtual css::uno::Any SAL_CALL getSelection() override; + virtual void SAL_CALL addSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override; + virtual void SAL_CALL removeSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override; + + // XRelocatableResource + + virtual sal_Bool SAL_CALL relocateToAnchor ( + const css::uno::Reference< + css::drawing::framework::XResource>& xResource) override; + + // XWindowListener + + virtual void SAL_CALL windowResized( + const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved( + const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown( + const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden( + const css::lang::EventObject& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing( + const css::lang::EventObject& rEvent) override; + +private: + ::std::shared_ptr< ViewShell > mpViewShell; + ::std::shared_ptr< ::sd::slidesorter::SlideSorterViewShell > mpSlideSorterViewShell; + const css::uno::Reference< css::drawing::framework::XResourceId > mxViewId; + css::uno::Reference mxWindow; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/factories/BasicPaneFactory.hxx b/sd/source/ui/inc/framework/factories/BasicPaneFactory.hxx new file mode 100644 index 0000000000..fb1ac2cf82 --- /dev/null +++ b/sd/source/ui/inc/framework/factories/BasicPaneFactory.hxx @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::uno { class XComponentContext; } + +namespace sd { +class DrawController; +class ViewShellBase; +} + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XResourceFactory, + css::drawing::framework::XConfigurationChangeListener + > BasicPaneFactoryInterfaceBase; + +/** This factory provides the frequently used standard panes + private:resource/pane/CenterPane + private:resource/pane/FullScreenPane + private:resource/pane/LeftImpressPane + private:resource/pane/LeftDrawPane + There are two left panes because this is (seems to be) the only way to + show different titles for the left pane in Draw and Impress. +*/ +class BasicPaneFactory final + : public BasicPaneFactoryInterfaceBase +{ +public: + explicit BasicPaneFactory ( + const css::uno::Reference& rxContext, + const rtl::Reference<::sd::DrawController>& rxController); + virtual ~BasicPaneFactory() override; + + virtual void disposing(std::unique_lock&) override; + + // XResourceFactory + + virtual css::uno::Reference + SAL_CALL createResource ( + const css::uno::Reference& rxPaneId) override; + + virtual void SAL_CALL + releaseResource ( + const css::uno::Reference& rxPane) override; + + // XConfigurationChangeListener + + virtual void SAL_CALL notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + // lang::XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEventObject) override; + +private: + css::uno::Reference mxComponentContext; + css::uno::WeakReference + mxConfigurationControllerWeak; + ViewShellBase* mpViewShellBase; + class PaneDescriptor; + class PaneContainer; + std::unique_ptr mpPaneContainer; + + /** Create a new instance of FrameWindowPane. + @param rPaneId + There is only one frame window so this id is just checked to + have the correct value. + */ + css::uno::Reference + CreateFrameWindowPane ( + const css::uno::Reference& rxPaneId); + + /** Create a new pane that represents the center pane in full screen + mode. + */ + css::uno::Reference + CreateFullScreenPane ( + const css::uno::Reference& rxComponentContext, + const css::uno::Reference& rxPaneId); + + /** Create a new instance of ChildWindowPane. + @param rPaneId + The ResourceURL member defines which side pane to create. + */ + css::uno::Reference + CreateChildWindowPane ( + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxPaneId, + const PaneDescriptor& rDescriptor); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/factories/BasicToolBarFactory.hxx b/sd/source/ui/inc/framework/factories/BasicToolBarFactory.hxx new file mode 100644 index 0000000000..804d8711d5 --- /dev/null +++ b/sd/source/ui/inc/framework/factories/BasicToolBarFactory.hxx @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::frame { class XController; } +namespace com::sun::star::drawing::framework { class XResourceId; } +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace sd { class DrawController; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XResourceFactory, + css::lang::XEventListener + > BasicToolBarFactoryInterfaceBase; + +/** This factory provides some of the frequently used tool bars: + private:resource/toolbar/ViewTabBar +*/ +class BasicToolBarFactory final + : public BasicToolBarFactoryInterfaceBase +{ +public: + BasicToolBarFactory (const rtl::Reference<::sd::DrawController>& rxController); + virtual ~BasicToolBarFactory() override; + + virtual void disposing(std::unique_lock&) override; + + // ToolBarFactory + + virtual css::uno::Reference SAL_CALL + createResource ( + const css::uno::Reference< + css::drawing::framework::XResourceId>& rxToolBarId) override; + + virtual void SAL_CALL + releaseResource ( + const css::uno::Reference& + rxToolBar) override; + + // lang::XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEventObject) override; + +private: + css::uno::Reference mxConfigurationController; + rtl::Reference<::sd::DrawController> mxController; + + void Shutdown(); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/framework/factories/BasicViewFactory.hxx b/sd/source/ui/inc/framework/factories/BasicViewFactory.hxx new file mode 100644 index 0000000000..47a2aea5b8 --- /dev/null +++ b/sd/source/ui/inc/framework/factories/BasicViewFactory.hxx @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include + +#include +#include + +namespace com::sun::star::drawing::framework { class XConfigurationController; } +namespace com::sun::star::drawing::framework { class XPane; } + +namespace sd { +class DrawController; +class ViewShell; +class ViewShellBase; +class FrameView; +} +class SfxViewFrame; +namespace vcl { class Window; } + +namespace sd::framework { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::framework::XResourceFactory + > BasicViewFactoryInterfaceBase; + +/** Factory for the frequently used standard views of the drawing framework: + private:resource/view/ + private:resource/view/ImpressView + private:resource/view/GraphicView + private:resource/view/OutlineView + private:resource/view/NotesView + private:resource/view/HandoutView + private:resource/view/SlideSorter + private:resource/view/PresentationView + private:resource/view/TaskPane + For some views in some panes this class also acts as a cache. +*/ +class BasicViewFactory final + : public BasicViewFactoryInterfaceBase +{ +public: + BasicViewFactory(const rtl::Reference<::sd::DrawController>& rxController); + virtual ~BasicViewFactory() override; + + virtual void disposing(std::unique_lock&) override; + + // XViewFactory + + virtual css::uno::Reference + SAL_CALL createResource ( + const css::uno::Reference& rxViewId) override; + + virtual void SAL_CALL releaseResource ( + const css::uno::Reference& xView) override; + +private: + css::uno::Reference + mxConfigurationController; + class ViewDescriptor; + class ViewShellContainer; + std::unique_ptr mpViewShellContainer; + ViewShellBase* mpBase; + FrameView* mpFrameView; + + class ViewCache; + ScopedVclPtr mpWindow; + std::shared_ptr mpViewCache; + + css::uno::Reference mxLocalPane; + + std::shared_ptr CreateView ( + const css::uno::Reference& rxViewId, + SfxViewFrame& rFrame, + vcl::Window& rWindow, + const css::uno::Reference& rxPane, + FrameView* pFrameView, + const bool bIsCenterView); + + std::shared_ptr CreateViewShell ( + const css::uno::Reference& rxViewId, + SfxViewFrame& rFrame, + vcl::Window& rWindow, + FrameView* pFrameView); + + void ActivateCenterView ( + const std::shared_ptr& rpDescriptor); + + void ReleaseView ( + const std::shared_ptr& rpDescriptor, + bool bDoNotCache); + + bool IsCacheable ( + const std::shared_ptr& rpDescriptor); + + std::shared_ptr GetViewFromCache ( + const css::uno::Reference& rxViewId, + const css::uno::Reference& rxPane); +}; + +} // end of namespace sd::framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuarea.hxx b/sd/source/ui/inc/fuarea.hxx new file mode 100644 index 0000000000..67115bd346 --- /dev/null +++ b/sd/source/ui/inc/fuarea.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuArea final : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + virtual void Activate() override; + virtual void Deactivate() override; + +private: + FuArea ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + virtual void DoExecute( SfxRequest& rReq ) override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fubullet.hxx b/sd/source/ui/inc/fubullet.hxx new file mode 100644 index 0000000000..2864e0e9fe --- /dev/null +++ b/sd/source/ui/inc/fubullet.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SfxItemSet; +class SfxViewFrame; + +namespace sd { + +class ViewShell; + +class FuBullet final : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + + static void GetSlotState( SfxItemSet& rSet, ViewShell const * pViewShell, SfxViewFrame* pViewFrame ); + +private: + FuBullet ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + void InsertSpecialCharacter( SfxRequest const & rReq ); + void InsertFormattingMark( sal_Unicode cMark ); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuchar.hxx b/sd/source/ui/inc/fuchar.hxx new file mode 100644 index 0000000000..27de223d73 --- /dev/null +++ b/sd/source/ui/inc/fuchar.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuChar final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + virtual void DoExecute( SfxRequest& rReq ) override; + + virtual void Activate() override; + virtual void Deactivate() override; + +private: + FuChar ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fucon3d.hxx b/sd/source/ui/inc/fucon3d.hxx new file mode 100644 index 0000000000..92c30d039b --- /dev/null +++ b/sd/source/ui/inc/fucon3d.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fuconstr.hxx" + +class E3dCompoundObject; +class E3dScene; +class SdDrawDocument; +class SfxRequest; + +namespace sd { + +class FuConstruct3dObject final + : public FuConstruct +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + +private: + FuConstruct3dObject ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + void ImpPrepareBasic3DShape(E3dCompoundObject const * p3DObj, E3dScene *pScene); + rtl::Reference ImpCreateBasic3DShape(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconarc.hxx b/sd/source/ui/inc/fuconarc.hxx new file mode 100644 index 0000000000..263c56220c --- /dev/null +++ b/sd/source/ui/inc/fuconarc.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fuconstr.hxx" + +namespace sd { + +class FuConstructArc final + : public FuConstruct +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + +private: + FuConstructArc ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconbez.hxx b/sd/source/ui/inc/fuconbez.hxx new file mode 100644 index 0000000000..7827470b82 --- /dev/null +++ b/sd/source/ui/inc/fuconbez.hxx @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "fuconstr.hxx" + +class SdDrawDocument; + +namespace sd { + +class FuConstructBezierPolygon final + : public FuConstruct +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + virtual void SelectionHasChanged() override; + + void SetEditMode(sal_uInt16 nMode); + sal_uInt16 GetEditMode() const { return nEditMode; } + + /** + * set attribute for the object to be created + */ + void SetAttributes(SfxItemSet& rAttr, SdrObject* pObj); + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + +private: + FuConstructBezierPolygon ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + sal_uInt16 nEditMode; + css::uno::Any maTargets; // used for creating a path for custom animations + + //Extra attributes coming from parameters + sal_uInt16 mnTransparence; // Default: 0 + OUString msColor; // Default: "" + sal_uInt16 mnWidth; // Default: 0 + OUString msShapeName; // Default: "" +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconcs.hxx b/sd/source/ui/inc/fuconcs.hxx new file mode 100644 index 0000000000..cf63c214ed --- /dev/null +++ b/sd/source/ui/inc/fuconcs.hxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fuconstr.hxx" +#include + +class SdDrawDocument; + +namespace sd { + +class FuConstructCustomShape final + : public FuConstruct +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + + void SetAttributes( SdrObject* pObj ); + const OUString& GetShapeType() const; + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + + // #i33136# + virtual bool doConstructOrthogonal() const override; + +private: + FuConstructCustomShape ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + OUString aCustomShape; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconnct.hxx b/sd/source/ui/inc/fuconnct.hxx new file mode 100644 index 0000000000..f8000e5bc7 --- /dev/null +++ b/sd/source/ui/inc/fuconnct.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuConnectionDlg + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuConnectionDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconrec.hxx b/sd/source/ui/inc/fuconrec.hxx new file mode 100644 index 0000000000..a5230c5937 --- /dev/null +++ b/sd/source/ui/inc/fuconrec.hxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fuconstr.hxx" + +class SdDrawDocument; +class SfxItemSet; + +namespace sd { + +/** + * draw rectangle + */ +class FuConstructRectangle final + : public FuConstruct +{ +private: + //Extra attributes coming from parameters + sal_uInt16 mnFillTransparence; // Default: 0 + OUString msFillColor; // Default: "" + sal_uInt16 mnLineStyle; // Default: SAL_MAX_UINT16 + OUString msShapeName; // Default: "" + +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + void SetAttributes(SfxItemSet& rAttr, SdrObject* pObj); + void SetLineEnds(SfxItemSet& rAttr, SdrObject const & rObj); + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + +private: + FuConstructRectangle ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconstr.hxx b/sd/source/ui/inc/fuconstr.hxx new file mode 100644 index 0000000000..fd61046a14 --- /dev/null +++ b/sd/source/ui/inc/fuconstr.hxx @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fudraw.hxx" + +class SdrObject; +class SfxItemSet; + +namespace sd { + +class FuConstruct : public FuDraw +{ +public: + + // Mouse Events + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + virtual void SelectionHasChanged() override { bSelectionChanged = true; } + + // Without a preceding MouseButtonDown, a MouseButtonUp event should probably be ignored + bool IsIgnoreUnexpectedMouseButtonUp(); + + // SJ: setting stylesheet, the use of a filled or unfilled style + // is determined by the member nSlotId : + void SetStyleSheet(SfxItemSet& rAttr, SdrObject* pObj); + + // SJ: setting stylesheet, the use of a filled or unfilled style + // is determined by the parameters bUseFillStyle and bUseNoFillStyle : + void SetStyleSheet( SfxItemSet& rAttr, SdrObject* pObj, + const bool bUseFillStyle, const bool bUseNoFillStyle ); + +protected: + FuConstruct (ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +private: + bool bSelectionChanged; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuconuno.hxx b/sd/source/ui/inc/fuconuno.hxx new file mode 100644 index 0000000000..e31ff0a6b4 --- /dev/null +++ b/sd/source/ui/inc/fuconuno.hxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fuconstr.hxx" +#include + +enum class SdrInventor : sal_uInt32; + +namespace sd { + +/** + * draw control + */ +class FuConstructUnoControl final + : public FuConstruct +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + +private: + FuConstructUnoControl( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + OUString aOldLayer; + SdrInventor nInventor; + SdrObjKind nIdentifier; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fucopy.hxx b/sd/source/ui/inc/fucopy.hxx new file mode 100644 index 0000000000..f751f42577 --- /dev/null +++ b/sd/source/ui/inc/fucopy.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuCopy final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuCopy ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fucushow.hxx b/sd/source/ui/inc/fucushow.hxx new file mode 100644 index 0000000000..005aea2181 --- /dev/null +++ b/sd/source/ui/inc/fucushow.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuCustomShowDlg + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuCustomShowDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fudraw.hxx b/sd/source/ui/inc/fudraw.hxx new file mode 100644 index 0000000000..e1d25a5211 --- /dev/null +++ b/sd/source/ui/inc/fudraw.hxx @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +struct SdrViewEvent; +class SdrObject; + +namespace sd { + +/** + * Base class for all Draw specific functions + */ +class FuDraw + : public FuPoor +{ +public: + + virtual bool KeyInput(const KeyEvent& rKEvt) override; + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + virtual bool RequestHelp(const HelpEvent& rHEvt) override; + + virtual void Activate() override; + + virtual void ForcePointer(const MouseEvent* pMEvt = nullptr); + + virtual void DoubleClick(const MouseEvent& rMEvt); + + bool SetPointer(const SdrObject* pObj, const Point& rPos); + bool SetHelpText(const SdrObject* pObj, const Point& rPos, const SdrViewEvent& rVEvt); + + void SetPermanent(bool bSet) { bPermanent = bSet; } + + /** is called when the current function should be aborted.

      + This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted + */ + virtual bool cancel() override; + +protected: + FuDraw (ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + virtual ~FuDraw() override; + + PointerStyle aNewPointer; + PointerStyle aOldPointer; + bool bMBDown; + bool bDragHelpLine; + sal_uInt16 nHelpLine; + bool bPermanent; + +private: + void DoModifiers(const MouseEvent& rMEvt, bool bSnapModPressed); + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fudspord.hxx b/sd/source/ui/inc/fudspord.hxx new file mode 100644 index 0000000000..2c6089442e --- /dev/null +++ b/sd/source/ui/inc/fudspord.hxx @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SdrDropMarkerOverlay; +class SdrObject; + +namespace sd { + +class FuDisplayOrder final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + // Mouse- & Key-Events + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + virtual void Deactivate() override; + +private: + virtual ~FuDisplayOrder() override; + void implClearOverlay(); + + PointerStyle maPtr; + SdrObject* mpRefObj; + std::unique_ptr mpOverlay; + + FuDisplayOrder ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuediglu.hxx b/sd/source/ui/inc/fuediglu.hxx new file mode 100644 index 0000000000..19c32cefd1 --- /dev/null +++ b/sd/source/ui/inc/fuediglu.hxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fudraw.hxx" + +namespace sd { + +class FuEditGluePoints final + : public FuDraw +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool KeyInput(const KeyEvent& rKEvt) override; + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + virtual bool Command(const CommandEvent& rCEvt) override; + virtual void ReceiveRequest(SfxRequest& rReq) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, + //and SHIFT+ENTER key to decide the position and draw the new insert point + virtual void ForcePointer(const MouseEvent* pMEvt = nullptr) override; + +private: + bool bBeginInsertPoint; + Point oldPoint; + + FuEditGluePoints ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + virtual ~FuEditGluePoints() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuexecuteinteraction.hxx b/sd/source/ui/inc/fuexecuteinteraction.hxx new file mode 100644 index 0000000000..9b1d095e69 --- /dev/null +++ b/sd/source/ui/inc/fuexecuteinteraction.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +#include + +namespace sd +{ +class FuExecuteInteraction final : public FuPoor +{ +public: + static rtl::Reference Create(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq); + virtual void DoExecute(SfxRequest& rReq) override; + +private: + FuExecuteInteraction(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, + SdDrawDocument* pDoc, SfxRequest& rReq); + + css::uno::Reference mxPlayer; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuexpand.hxx b/sd/source/ui/inc/fuexpand.hxx new file mode 100644 index 0000000000..c710bd29c8 --- /dev/null +++ b/sd/source/ui/inc/fuexpand.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuExpandPage final + : public FuPoor +{ + public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuExpandPage ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuformatpaintbrush.hxx b/sd/source/ui/inc/fuformatpaintbrush.hxx new file mode 100644 index 0000000000..5c819372d7 --- /dev/null +++ b/sd/source/ui/inc/fuformatpaintbrush.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "futext.hxx" + +namespace sd { + +class DrawViewShell; + +class FuFormatPaintBrush final : public FuText +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + virtual bool KeyInput(const KeyEvent& rKEvt) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + static void GetMenuState( DrawViewShell const & rDrawViewShell, SfxItemSet &rSet ); + +private: + FuFormatPaintBrush ( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq); + + void DoExecute( SfxRequest& rReq ) override; + + bool HasContentForThisType( SdrInventor nObjectInventor, SdrObjKind nObjectIdentifier ) const; + void Paste( bool, bool ); + + void implcancel(); + + std::shared_ptr mxItemSet; + bool mbPermanent; + bool mbOldIsQuickTextEditMode; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuhhconv.hxx b/sd/source/ui/inc/fuhhconv.hxx new file mode 100644 index 0000000000..a009b3023e --- /dev/null +++ b/sd/source/ui/inc/fuhhconv.hxx @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SdOutliner; + +namespace sd { + +class FuHangulHanjaConversion final : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + void StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage, + const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive ); + + void StartChineseConversion(); + + void ConvertStyles( LanguageType nTargetLanguage, const vcl::Font *pTargetFont ); + +private: + virtual ~FuHangulHanjaConversion() override; + + SdOutliner* pSdOutliner; + bool bOwnOutliner; + + FuHangulHanjaConversion ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ); + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuinsert.hxx b/sd/source/ui/inc/fuinsert.hxx new file mode 100644 index 0000000000..d14ce69277 --- /dev/null +++ b/sd/source/ui/inc/fuinsert.hxx @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "fupoor.hxx" + +namespace sd { + +class FuInsertGraphic final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, + ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, + bool replaceExistingImage); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuInsertGraphic ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq, + bool replaceExistingImage); + + bool mbReplaceExistingImage; +}; + +/************************************************************************/ + +class FuInsertClipboard final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuInsertClipboard ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +/************************************************************************/ + +class FuInsertOLE final + : public FuPoor +{ + public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuInsertOLE ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +/************************************************************************/ + +class FuInsertAVMedia final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuInsertAVMedia ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + +#if HAVE_FEATURE_AVMEDIA + void InsertMediaURL(const OUString& rURL, const Size& rPrefSize, bool bLink); +#endif +}; +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuinsfil.hxx b/sd/source/ui/inc/fuinsfil.hxx new file mode 100644 index 0000000000..4dfec6603f --- /dev/null +++ b/sd/source/ui/inc/fuinsfil.hxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" +#include +#include + +class SfxMedium; + +namespace sd { + +class FuInsertFile final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + + static void GetSupportedFilterVector( ::std::vector< OUString >& rFilterVector ); + +private: + FuInsertFile ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + OUString aLayoutName; ///< layout name of the currently inserted page + OUString aFilterName; ///< chosen file filter + OUString aFile; ///< chosen file name + + void InsTextOrRTFinOlMode(SfxMedium* pMedium); + bool InsSDDinOlMode(SfxMedium* pMedium); + void InsTextOrRTFinDrMode(SfxMedium* pMedium); + bool InsSDDinDrMode(SfxMedium* pMedium); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuline.hxx b/sd/source/ui/inc/fuline.hxx new file mode 100644 index 0000000000..db3d305376 --- /dev/null +++ b/sd/source/ui/inc/fuline.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuLine final + : public FuPoor +{ +public: + + virtual void Activate() override; + virtual void Deactivate() override; + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuLine ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fulinend.hxx b/sd/source/ui/inc/fulinend.hxx new file mode 100644 index 0000000000..775b4c14af --- /dev/null +++ b/sd/source/ui/inc/fulinend.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuLineEnd final + : public FuPoor +{ +public: + + virtual void Activate() override; + virtual void Deactivate() override; + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuLineEnd ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fulink.hxx b/sd/source/ui/inc/fulink.hxx new file mode 100644 index 0000000000..63e320208d --- /dev/null +++ b/sd/source/ui/inc/fulink.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuLink final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuLink ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fumeasur.hxx b/sd/source/ui/inc/fumeasur.hxx new file mode 100644 index 0000000000..dfa9ce9d3a --- /dev/null +++ b/sd/source/ui/inc/fumeasur.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuMeasureDlg final + : public FuPoor +{ + public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuMeasureDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fumorph.hxx b/sd/source/ui/inc/fumorph.hxx new file mode 100644 index 0000000000..86c60cc068 --- /dev/null +++ b/sd/source/ui/inc/fumorph.hxx @@ -0,0 +1,90 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" +#include + +#include + +namespace basegfx { + class B2DPolygon; + class B2DPoint; +} + +namespace sd { + +class FuMorph final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + typedef ::std::vector< ::basegfx::B2DPolyPolygon > B2DPolyPolygonList_impl; + + FuMorph ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + void ImpInsertPolygons( + B2DPolyPolygonList_impl& rPolyPolyList3D, + bool bAttributeFade, + const SdrObject* pObj1, + const SdrObject* pObj2 + ); + + static ::basegfx::B2DPolyPolygon ImpCreateMorphedPolygon( + const ::basegfx::B2DPolyPolygon& rPolyPolyStart, + const ::basegfx::B2DPolyPolygon& rPolyPolyEnd, + double fMorphingFactor + ); + + static void ImpMorphPolygons( + const ::basegfx::B2DPolyPolygon& rPolyPoly1, + const ::basegfx::B2DPolyPolygon& rPolyPoly2, + const sal_uInt16 nSteps, + B2DPolyPolygonList_impl& rPolyPolyList3D + ); + + static void ImpAddPolys( + ::basegfx::B2DPolyPolygon& rSmaller, + const ::basegfx::B2DPolyPolygon& rBigger + ); + + static void ImpEqualizePolyPointCount( + ::basegfx::B2DPolygon& rSmall, + const ::basegfx::B2DPolygon& rBig + ); + + static sal_uInt32 ImpGetNearestIndex( + const ::basegfx::B2DPolygon& rPoly, + const ::basegfx::B2DPoint& rPos + ); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/funavig.hxx b/sd/source/ui/inc/funavig.hxx new file mode 100644 index 0000000000..a802b2f8bd --- /dev/null +++ b/sd/source/ui/inc/funavig.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuNavigation final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuNavigation ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuoaprms.hxx b/sd/source/ui/inc/fuoaprms.hxx new file mode 100644 index 0000000000..3e5432a4e0 --- /dev/null +++ b/sd/source/ui/inc/fuoaprms.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuObjectAnimationParameters final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuObjectAnimationParameters ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuolbull.hxx b/sd/source/ui/inc/fuolbull.hxx new file mode 100644 index 0000000000..e10ab6b237 --- /dev/null +++ b/sd/source/ui/inc/fuolbull.hxx @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SdDrawDocument; +class SfxRequest; +class SfxItemSet; +class SfxPoolItem; +class SvxNumBulletItem; + +namespace sd { + +class View; +class ViewShell; + +/** + * bullet functions in outline mode + */ + +class FuBulletAndPosition final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuBulletAndPosition ( + ViewShell* pViewShell, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + void SetCurrentBulletsNumbering(SfxRequest& rReq); + + const SvxNumBulletItem* GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId& nNumItemId); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuoltext.hxx b/sd/source/ui/inc/fuoltext.hxx new file mode 100644 index 0000000000..288bcf190c --- /dev/null +++ b/sd/source/ui/inc/fuoltext.hxx @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SdDrawDocument; +class SfxRequest; + +namespace sd { + +class View; +class ViewShell; +class OutlineView; +class OutlineViewShell; + +/** + * text functions in outline mode + */ +class FuOutlineText final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + virtual bool Command(const CommandEvent& rCEvt) override; + + virtual bool KeyInput(const KeyEvent& rKEvt) override; + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void DoCut() override; + virtual void DoCopy() override; + virtual void DoPaste() override; + virtual void DoPasteUnformatted() override; + + /** Call this method when the text in the outliner (may) has changed. + It will invalidate some slots of the view frame and update the + preview in the slide sorter. + */ + void UpdateForKeyPress (const KeyEvent& rEvent); + +private: + FuOutlineText ( + ViewShell* pViewShell, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + OutlineViewShell* pOutlineViewShell; + OutlineView* pOutlineView; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fupage.hxx b/sd/source/ui/inc/fupage.hxx new file mode 100644 index 0000000000..f3b30f3109 --- /dev/null +++ b/sd/source/ui/inc/fupage.hxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "fupoor.hxx" +#include + +class SfxItemSet; +class SdBackgroundObjUndoAction; +class SdPage; + +namespace sd { +class DrawViewShell; + +class FuPage final + : public FuPoor +{ + public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + + virtual void Activate() override; + virtual void Deactivate() override; + + const SfxItemSet* ExecuteDialog(weld::Window* pParent, const SfxRequest& rReq); + +protected: + virtual ~FuPage() override; + +private: + FuPage ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq ); + + void ApplyItemSet( const SfxItemSet* pArgs ); + + SfxRequest& mrReq; + const SfxItemSet* mpArgs; + std::unique_ptr + mpBackgroundObjUndoAction; + Size maSize; + bool mbPageBckgrdDeleted; + bool mbMasterPage; + bool mbDisplayBackgroundTabPage; + SdPage* mpPage; + DrawViewShell* mpDrawViewShell; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuparagr.hxx b/sd/source/ui/inc/fuparagr.hxx new file mode 100644 index 0000000000..2c6908b6b6 --- /dev/null +++ b/sd/source/ui/inc/fuparagr.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuParagraph final + : public FuPoor +{ +public: + + virtual void Activate() override; + virtual void Deactivate() override; + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuParagraph ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fupoor.hxx b/sd/source/ui/inc/fupoor.hxx new file mode 100644 index 0000000000..e0103a111d --- /dev/null +++ b/sd/source/ui/inc/fupoor.hxx @@ -0,0 +1,179 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +class SdDrawDocument; +class SfxRequest; +class CommandEvent; +class HelpEvent; +class KeyEvent; +class MouseEvent; + +namespace sd { + +class DrawDocShell; +class View; +class ViewShell; +class Window; + +/** + * Base class for all functions + */ +class FuPoor : public SimpleReferenceComponent +{ +public: + static const int HITPIX = 2; // hit tolerance in pixel + static const int HITLOG = 53; // hit tolerance in mm100 + static const int DRGLOG = 53; // minimal drag move in mm100 + + + virtual void DoExecute( SfxRequest& rReq ); + + void SetMouseButtonCode(sal_uInt16 nNew) { if(nNew != mnCode) mnCode = nNew; } + sal_uInt16 GetMouseButtonCode() const { return mnCode; } + + DrawDocShell* GetDocSh() { return mpDocSh; } + + virtual void DoCut(); + virtual void DoCopy(); + virtual void DoPaste(); + virtual void DoPasteUnformatted(); + + // mouse & key events; return value = sal_True: event has been handled + virtual bool KeyInput(const KeyEvent& rKEvt); + virtual bool MouseMove(const MouseEvent& ); + virtual bool MouseButtonUp(const MouseEvent& rMEvt); + + // moved from inline to *.cxx + virtual bool MouseButtonDown(const MouseEvent& rMEvt); + + virtual bool Command(const CommandEvent& rCEvt); + virtual bool RequestHelp(const HelpEvent& rHEvt); + virtual void ReceiveRequest(SfxRequest& rReq); + + virtual void Activate(); ///< activates the function + virtual void Deactivate(); ///< deactivates the function + + void SetWindow(::sd::Window* pWin); + + virtual void SelectionHasChanged(); + + sal_uInt16 GetSlotID() const { return nSlotId; } + + void StartDelayToScrollTimer (); + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle); + + /** is called when the current function should be aborted.

      + This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted + */ + virtual bool cancel(); + + // #i33136# + /** Decide if the object to be created should be created + orthogonal. Default implementation uses nSlotID + to decide. May be overridden to use other criteria + for this decision + + @returns true if the to be created object should be orthogonal. + */ + virtual bool doConstructOrthogonal() const; + +protected: + /** + @param pViewSh + May be NULL. + */ + FuPoor (ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + virtual ~FuPoor() override; + + DECL_LINK( DelayHdl, Timer *, void ); + + static void ImpForceQuadratic(::tools::Rectangle& rRect); + + /** Switch to another layer. The layer to switch to is specified by an + offset relative to the active layer. With respect to the layer bar + control at the lower left of the document window positive values + move to the right and negative values move to the left. + +

      Switching the layer is independent of the view's layer mode. The + layers are switched even when the layer mode is turned off and the + layer control is not visible.

      + @param nOffset + If the offset is positive skip that many layers in selecting the + next layer. If it is negative then select a previous one. An + offset or zero does not change the current layer. If the + resulting index lies outside the valid range of indices then it + is set to either the minimal or maximal valid index, whichever + is nearer. + */ + void SwitchLayer (sal_Int32 nOffset); + + ::sd::View* mpView; + ViewShell* mpViewShell; + VclPtr< ::sd::Window> mpWindow; + DrawDocShell* mpDocSh; + SdDrawDocument* mpDoc; + + sal_uInt16 nSlotId; + + Timer aScrollTimer; ///< for auto-scrolling + DECL_LINK( ScrollHdl, Timer *, void ); + void ForceScroll(const Point& aPixPos); + + Timer aDragTimer; ///< for Drag&Drop + DECL_LINK(DragHdl, Timer *, void); + bool bIsInDragMode; + Point aMDPos; ///< position of MouseButtonDown + + /// Flag to prevent auto-scrolling until one drags from outside into the window + bool bNoScrollUntilInside; + + /// timer to delay scrolling (~ 1 sec) when dragging out of the window + Timer aDelayToScrollTimer; + bool bScrollable; + bool bDelayActive; + bool bFirstMouseMove; + + /// member to hold state of the mouse buttons for creation of own MouseEvents (like in ScrollHdl) + +private: + sal_uInt16 mnCode; + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuprlout.hxx b/sd/source/ui/inc/fuprlout.hxx new file mode 100644 index 0000000000..1473eac53f --- /dev/null +++ b/sd/source/ui/inc/fuprlout.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SdDrawDocument; +class SfxRequest; + +namespace sd { + +class View; +class ViewShell; + +class FuPresentationLayout final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuPresentationLayout ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuprobjs.hxx b/sd/source/ui/inc/fuprobjs.hxx new file mode 100644 index 0000000000..bf0748d794 --- /dev/null +++ b/sd/source/ui/inc/fuprobjs.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SdDrawDocument; +class SfxRequest; + +namespace sd { + +class View; +class ViewShell; + +class FuPresentationObjects final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuPresentationObjects ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuscale.hxx b/sd/source/ui/inc/fuscale.hxx new file mode 100644 index 0000000000..64a606e4aa --- /dev/null +++ b/sd/source/ui/inc/fuscale.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuScale final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuScale ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fusearch.hxx b/sd/source/ui/inc/fusearch.hxx new file mode 100644 index 0000000000..7088dd776a --- /dev/null +++ b/sd/source/ui/inc/fusearch.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +class SvxSearchItem; +class SdOutliner; + +namespace sd { + +class FuSearch final : public FuPoor +{ +public: + + static FuSearch* createPtr(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq); + + virtual void DoExecute( SfxRequest& rReq ) override; + + void SearchAndReplace( const SvxSearchItem* pSearchItem ); + +private: + virtual ~FuSearch() override; + + SdOutliner* m_pSdOutliner; + bool m_bOwnOutliner; + + FuSearch ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fusel.hxx b/sd/source/ui/inc/fusel.hxx new file mode 100644 index 0000000000..3896a6d42f --- /dev/null +++ b/sd/source/ui/inc/fusel.hxx @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fudraw.hxx" + +namespace com::sun::star::media { class XPlayer; } + +class SdrHdl; +class SdrObject; + +namespace sd { + +class FuSelection final + : public FuDraw +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + + // Mouse- & Key-Events + virtual bool KeyInput(const KeyEvent& rKEvt) override; + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; + + virtual void SelectionHasChanged() override; + + void SetEditMode(sal_uInt16 nMode); + sal_uInt16 GetEditMode() const { return nEditMode; } + + bool HandleImageMapClick(const SdrObject* pObj, const Point& rPos); + + /** is called when the current function should be aborted.

      + This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted + */ + virtual bool cancel() override; + + //let mouse cursor move + virtual void ForcePointer(const MouseEvent* pMEvt = nullptr) override; + +private: + FuSelection (ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + + virtual ~FuSelection() override; + + bool bTempRotation; + bool bSelectionChanged; + SdrHdl* pHdl; + bool bSuppressChangesOfSelection; + bool bMirrorSide0; + sal_uInt16 nEditMode; + + /** This pointer stores a candidate for assigning a style in the water + can mode between mouse button down and mouse button up. + */ + SdrObject* pWaterCanCandidate; + + /** Find the object under the given test point without selecting it. + @param rTestPoint + The coordinates at which to search for a shape. + @return + The shape at the test point. When there is no shape at this + position then NULL is returned. + */ + SdrObject* pickObject (const Point& rTestPoint); + //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, + //and SHIFT+ENTER key to decide the position and draw the new insert point + bool bBeginInsertPoint; + Point oldPoint; + //let mouse cursor move + bool bMovedToCenterPoint; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fusldlg.hxx b/sd/source/ui/inc/fusldlg.hxx new file mode 100644 index 0000000000..57427cf69b --- /dev/null +++ b/sd/source/ui/inc/fusldlg.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuSlideShowDlg final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuSlideShowDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fusnapln.hxx b/sd/source/ui/inc/fusnapln.hxx new file mode 100644 index 0000000000..cdddeec8d2 --- /dev/null +++ b/sd/source/ui/inc/fusnapln.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuSnapLine final + : public FuPoor +{ +public: + + virtual void Activate() override; + virtual void Deactivate() override; + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuSnapLine ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fusumry.hxx b/sd/source/ui/inc/fusumry.hxx new file mode 100644 index 0000000000..78ac3f00d8 --- /dev/null +++ b/sd/source/ui/inc/fusumry.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuSummaryPage final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuSummaryPage ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/futempl.hxx b/sd/source/ui/inc/futempl.hxx new file mode 100644 index 0000000000..df7ece35c6 --- /dev/null +++ b/sd/source/ui/inc/futempl.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuTemplate final + : public FuPoor +{ +public: + + virtual void Activate() override; + virtual void Deactivate() override; + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuTemplate ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/futext.hxx b/sd/source/ui/inc/futext.hxx new file mode 100644 index 0000000000..4ef6cc75df --- /dev/null +++ b/sd/source/ui/inc/futext.hxx @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fuconstr.hxx" +#include +#include + +class FontList; +class OutlinerView; + +namespace sd { + +/** + * Base class for text functions + */ +class FuText + : public FuConstruct +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + + virtual bool KeyInput(const KeyEvent& rKEvt) override; + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + virtual bool RequestHelp(const HelpEvent& rHEvt) override; + virtual void ReceiveRequest(SfxRequest& rReq) override; + virtual void DoubleClick(const MouseEvent& rMEvt) override; + + virtual void Activate() override; ///< activates the function + virtual void Deactivate() override; ///< deactivates the function + + void SetInEditMode(const MouseEvent& rMEvt, bool bQuickDrag); + void DeleteDefaultText(); + SdrTextObj* GetTextObj() { return mxTextObj.get().get(); } + + virtual rtl::Reference CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override; + + /** is called when the current function should be aborted.

      + This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns true if an active function was aborted + */ + virtual bool cancel() override; + + static void ChangeFontSize( bool, OutlinerView*, const FontList*, ::sd::View* ); + + void InvalidateBindings(); + + +protected: + FuText (ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); + +private: + virtual void disposing() override; + + ::unotools::WeakReference + mxTextObj; + bool bFirstObjCreated; + bool bJustEndedEdit; + + SfxRequest& rRequest; + + void ImpSetAttributesForNewTextObject(SdrTextObj* pTxtObj); + void ImpSetAttributesFitToSize(SdrTextObj* pTxtObj); + void ImpSetAttributesFitToSizeVertical(SdrTextObj* pTxtObj); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/futhes.hxx b/sd/source/ui/inc/futhes.hxx new file mode 100644 index 0000000000..2310ae0e05 --- /dev/null +++ b/sd/source/ui/inc/futhes.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuThesaurus final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuThesaurus ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/futransf.hxx b/sd/source/ui/inc/futransf.hxx new file mode 100644 index 0000000000..08571108fc --- /dev/null +++ b/sd/source/ui/inc/futransf.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuTransform final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuTransform ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/futxtatt.hxx b/sd/source/ui/inc/futxtatt.hxx new file mode 100644 index 0000000000..e62d82be40 --- /dev/null +++ b/sd/source/ui/inc/futxtatt.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuTextAttrDlg final + : public FuPoor +{ + public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + FuTextAttrDlg ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuvect.hxx b/sd/source/ui/inc/fuvect.hxx new file mode 100644 index 0000000000..b408098f2b --- /dev/null +++ b/sd/source/ui/inc/fuvect.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +class FuVectorize final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + virtual void DoExecute( SfxRequest& rReq ) override; + +private: + + FuVectorize ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/fuzoom.hxx b/sd/source/ui/inc/fuzoom.hxx new file mode 100644 index 0000000000..54c352dd31 --- /dev/null +++ b/sd/source/ui/inc/fuzoom.hxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "fupoor.hxx" + +namespace sd { + +extern const sal_uInt16 SidArrayZoom[]; + +class FuZoom final + : public FuPoor +{ +public: + + static rtl::Reference Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ); + + // Mouse- & Key-Events + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + virtual void Activate() override; ///< activates the function + virtual void Deactivate() override; ///< deactivates the function + +private: + virtual ~FuZoom() override; + + Point aBeginPosPix; + Point aBeginPos; + Point aEndPos; + ::tools::Rectangle aZoomRect; + bool bVisible; + bool bStartDrag; + PointerStyle aPtr; + + FuZoom ( + ViewShell* pViewSh, + ::sd::Window* pWin, + ::sd::View* pView, + SdDrawDocument* pDoc, + SfxRequest& rReq); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/gluectrl.hxx b/sd/source/ui/inc/gluectrl.hxx new file mode 100644 index 0000000000..626d721586 --- /dev/null +++ b/sd/source/ui/inc/gluectrl.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +enum class SdrEscapeDirection; + +/** + * GluePointEscDirLB + */ +class GlueEscDirLB final : public InterimItemWindow +{ +private: + css::uno::Reference m_xFrame; + std::unique_ptr m_xWidget; + + DECL_LINK(SelectHdl, weld::ComboBox&, void); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + +public: + GlueEscDirLB(vcl::Window* pParent, const css::uno::Reference& rFrame); + virtual void dispose() override; + virtual ~GlueEscDirLB() override; + + void set_active(int nPos) { m_xWidget->set_active(nPos); } + void set_sensitive(bool bSensitive); + + void Fill(); +}; + +/** + * Toolbox controller for glue-point escape direction + */ +class SdTbxCtlGlueEscDir final : public SfxToolBoxControl +{ +private: + static sal_uInt16 GetEscDirPos(SdrEscapeDirection nEscDir); + +public: + virtual void StateChangedAtToolBoxControl(sal_uInt16 nSId, SfxItemState eState, + const SfxPoolItem* pState) override; + virtual VclPtr CreateItemWindow(vcl::Window* pParent) override; + + SFX_DECL_TOOLBOX_CONTROL(); + + SdTbxCtlGlueEscDir(sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/headerfooterdlg.hxx b/sd/source/ui/inc/headerfooterdlg.hxx new file mode 100644 index 0000000000..0b96d0348b --- /dev/null +++ b/sd/source/ui/inc/headerfooterdlg.hxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +#include + +class SdUndoGroup; + +namespace sd +{ +class ViewShell; + +class HeaderFooterTabPage; + +class HeaderFooterDialog : public weld::GenericDialogController +{ +private: + DECL_LINK( ActivatePageHdl, const OUString&, void ); + DECL_LINK( ClickApplyToAllHdl, weld::Button&, void ); + DECL_LINK( ClickApplyHdl, weld::Button&, void ); + DECL_LINK( ClickCancelHdl, weld::Button&, void ); + + HeaderFooterSettings maSlideSettings; + HeaderFooterSettings maNotesHandoutSettings; + + SdDrawDocument* mpDoc; + SdPage* mpCurrentPage; + ViewShell* mpViewShell; + + std::unique_ptr mxTabCtrl; + std::unique_ptr mxPBApplyToAll; + std::unique_ptr mxPBApply; + std::unique_ptr mxPBCancel; + std::unique_ptr mxSlideTabPage; + std::unique_ptr mxNotesHandoutsTabPage; + + void apply( bool bToAll, bool bForceSlides ); + void change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings ); + +public: + HeaderFooterDialog(ViewShell* pViewShell, weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage); + virtual ~HeaderFooterDialog() override; + + void ApplyToAll(); + void Apply(); + + virtual short run() override; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ins_paste.hxx b/sd/source/ui/inc/ins_paste.hxx new file mode 100644 index 0000000000..5031d09b03 --- /dev/null +++ b/sd/source/ui/inc/ins_paste.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +// SdInsertPasteDlg +class SdInsertPasteDlg : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xRbBefore; + std::unique_ptr m_xRbAfter; + +public: + SdInsertPasteDlg(weld::Window* pWindow); + virtual ~SdInsertPasteDlg() override; + bool IsInsertBefore() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/inspagob.hxx b/sd/source/ui/inc/inspagob.hxx new file mode 100644 index 0000000000..d906a10f77 --- /dev/null +++ b/sd/source/ui/inc/inspagob.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdDrawDocument; +class SdPageObjsTLV; +class SfxMedium; + +class SdInsertPagesObjsDlg : public weld::GenericDialogController +{ +private: + SfxMedium* m_pMedium; + const SdDrawDocument* m_pDoc; + const OUString& m_rName; + + std::unique_ptr m_xLbTree; + std::unique_ptr m_xCbxLink; + std::unique_ptr m_xCbxMasters; + + void Reset(); + DECL_LINK(SelectObjectHdl, weld::TreeView&, void); + +public: + SdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, + SfxMedium* pSfxMedium, const OUString& rFileName); + virtual ~SdInsertPagesObjsDlg() override; + + /** returns the list + nType == 0 -> pages + nType == 1 -> objects */ + + std::vector GetList ( const sal_uInt16 nType ) ; + + bool IsLink() const; + bool IsRemoveUnnecessaryMasterPages() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/layeroptionsdlg.hxx b/sd/source/ui/inc/layeroptionsdlg.hxx new file mode 100644 index 0000000000..300994937c --- /dev/null +++ b/sd/source/ui/inc/layeroptionsdlg.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +class SfxItemSet; + +class SD_DLLPUBLIC SdInsertLayerDlg : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xEdtName; + std::unique_ptr m_xEdtTitle; + std::unique_ptr m_xEdtDesc; + std::unique_ptr m_xCbxVisible; + std::unique_ptr m_xCbxPrintable; + std::unique_ptr m_xCbxLocked; + std::unique_ptr m_xNameFrame; + +public: + + SdInsertLayerDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, + bool bDeletable, const OUString& rStr); + virtual ~SdInsertLayerDlg() override; + + void GetAttr( SfxItemSet& rOutAttrs ); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/masterlayoutdlg.hxx b/sd/source/ui/inc/masterlayoutdlg.hxx new file mode 100644 index 0000000000..0acbb18d7b --- /dev/null +++ b/sd/source/ui/inc/masterlayoutdlg.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +#include + +class SdDrawDocument; +class SdPage; + +namespace sd +{ + +class MasterLayoutDialog : public weld::GenericDialogController +{ +private: + SdDrawDocument* mpDoc; + SdPage* mpCurrentPage; + + std::unique_ptr mxCBDate; + std::unique_ptr mxCBPageNumber; + std::unique_ptr mxCBSlideNumber; + std::unique_ptr mxCBHeader; + std::unique_ptr mxCBFooter; + + bool mbOldHeader; + bool mbOldFooter; + bool mbOldDate; + bool mbOldPageNumber; + + void applyChanges(); + void remove( PresObjKind eKind ); + void create( PresObjKind eKind ); + +public: + MasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage); + virtual ~MasterLayoutDialog() override; + + virtual short run() override; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/morphdlg.hxx b/sd/source/ui/inc/morphdlg.hxx new file mode 100644 index 0000000000..77b20d718d --- /dev/null +++ b/sd/source/ui/inc/morphdlg.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdrObject; + +namespace sd { + +class MorphDlg : public weld::GenericDialogController +{ +public: + MorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2); + virtual ~MorphDlg() override; + + void SaveSettings() const; + sal_uInt16 GetFadeSteps() const { return static_cast(m_xMtfSteps->get_value()); } + bool IsAttributeFade() const { return m_xCbxAttributes->get_active(); } + bool IsOrientationFade() const { return m_xCbxOrientation->get_active(); } + +private: + std::unique_ptr m_xMtfSteps; + std::unique_ptr m_xCbxAttributes; + std::unique_ptr m_xCbxOrientation; + + void LoadSettings(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/navigatr.hxx b/sd/source/ui/inc/navigatr.hxx new file mode 100644 index 0000000000..3e8ff9c28d --- /dev/null +++ b/sd/source/ui/inc/navigatr.hxx @@ -0,0 +1,209 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include "sdtreelb.hxx" +#include + +// forward +namespace vcl { class Window; } + +namespace sd { +class DrawDocShell; +class SdNavigatorFloat; +} +class Menu; +class SdNavigatorControllerItem; +class SdPageNameControllerItem; + +enum class NavState { + NONE = 0x000000, + TableUpdate = 0x000100, + BtnFirstEnabled = 0x001000, + BtnFirstDisabled = 0x002000, + BtnPrevEnabled = 0x004000, + BtnPrevDisabled = 0x008000, + BtnLastEnabled = 0x010000, + BtnLastDisabled = 0x020000, + BtnNextEnabled = 0x040000, + BtnNextDisabled = 0x080000, +}; +namespace o3tl { + template<> struct typed_flags : is_typed_flags {}; +} + +class NavDocInfo +{ +public: + NavDocInfo() + : bName(false) + , bActive(false) + , mpDocShell(nullptr) + { + } + + bool HasName() const { return bName; } + bool IsActive() const { return bActive; } + + void SetName( bool bOn ) { bName = bOn; } + void SetActive( bool bOn ) { bActive = bOn; } + + ::sd::DrawDocShell* GetDrawDocShell() {return mpDocShell;} + +private: + friend class SdNavigatorWin; + bool bName : 1; + bool bActive : 1; + ::sd::DrawDocShell* mpDocShell; +}; + +namespace sd { + +class SdNavigatorFloat final : public SfxNavigator +{ +private: + std::unique_ptr m_xNavWin; + bool m_bSetInitialFocusOnActivate; + +public: + SdNavigatorFloat(SfxBindings* _pBindings, SfxChildWindow* pMgr, + vcl::Window* pParent, SfxChildWinInfo* pInfo); + void InitTreeLB(const SdDrawDocument* pDoc); + void FreshTree(const SdDrawDocument* pDoc); + virtual void Activate() override; + virtual void dispose() override; + virtual ~SdNavigatorFloat() override; +}; + +} + +class SD_DLLPUBLIC SdNavigatorWin : public PanelLayout +{ +public: + typedef ::std::function UpdateRequestFunctor; + + /** Create a new instance of the navigator. + @param bUseActiveUpdate + When , the default, then the SdNavigatorWin object + will make a SID_NAVIGATOR_INIT call whenever it thinks an + update is necessary. When the navigator will + rely on others to trigger updates. + */ + SdNavigatorWin(weld::Widget* pParent, SfxBindings* pBindings, SfxNavigator* pNavigatorDlg); + void SetUpdateRequestFunctor(const UpdateRequestFunctor& rUpdateRequest); + virtual ~SdNavigatorWin() override; + + void InitTreeLB( const SdDrawDocument* pDoc ); + void RefreshDocumentLB( const OUString* pDocName = nullptr ); + void FirstFocus(); + + bool InsertFile(const OUString& rFileName); + + NavigatorDragType GetNavigatorDragType(); + SdPageObjsTLV& GetObjects(); + +private: + friend class SdNavigatorFloat; + friend class SdNavigatorControllerItem; + friend class SdPageNameControllerItem; + + std::unique_ptr mxToolbox; + std::unique_ptr mxTlbObjects; + std::unique_ptr mxLbDocs; + std::unique_ptr mxDragModeMenu; + std::unique_ptr mxShapeMenu; + + VclPtr mxNavigatorDlg; + + bool mbDocImported; + OUString maDropFileName; + NavigatorDragType meDragType; + std::vector maDocList; + SfxBindings* mpBindings; + std::unique_ptr mpNavigatorCtrlItem; + std::unique_ptr mpPageNameCtrlItem; + + /** This flag controls whether all shapes or only the named shapes are + shown. + */ + // bool mbShowAllShapes; + + static OUString GetDragTypeSdBmpId(NavigatorDragType eDT); + NavDocInfo* GetDocInfo(); + + DECL_DLLPRIVATE_LINK( SelectToolboxHdl, const OUString&, void ); + DECL_DLLPRIVATE_LINK( DropdownClickToolBoxHdl, const OUString&, void ); + DECL_DLLPRIVATE_LINK( ClickObjectHdl, weld::TreeView&, bool ); + DECL_DLLPRIVATE_LINK( SelectDocumentHdl, weld::ComboBox&, void ); + DECL_DLLPRIVATE_LINK( MenuSelectHdl, const OUString&, void ); + DECL_DLLPRIVATE_LINK( ShapeFilterCallback, const OUString&, void ); + DECL_DLLPRIVATE_LINK( KeyInputHdl, const KeyEvent&, bool ); + DECL_DLLPRIVATE_STATIC_LINK(SdNavigatorWin, MouseReleaseHdl, const MouseEvent&, bool); + DECL_LINK(CommandHdl, const CommandEvent&, bool); + + void SetDragImage(); + + void ExecuteContextMenuAction(std::u16string_view rSelectedPopupEntry); + +public: + //when object is marked , fresh the corresponding entry tree . + void FreshTree ( const SdDrawDocument* pDoc ); + + virtual weld::Window* GetFrameWeld() const override; +}; + +/** + * ControllerItem for Navigator + */ +class SdNavigatorControllerItem final : public SfxControllerItem +{ +public: + SdNavigatorControllerItem( sal_uInt16, SdNavigatorWin*, SfxBindings*, + SdNavigatorWin::UpdateRequestFunctor aUpdateRequest); + +protected: + virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState, + const SfxPoolItem* pState ) override; + +private: + SdNavigatorWin* pNavigatorWin; + const SdNavigatorWin::UpdateRequestFunctor maUpdateRequest; +}; + +/** + * ControllerItem for Navigator to show the page in the TreeLB + */ +class SdPageNameControllerItem final : public SfxControllerItem +{ +public: + SdPageNameControllerItem( sal_uInt16, SdNavigatorWin*, SfxBindings*); + +protected: + virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState, + const SfxPoolItem* pState ) override; + +private: + SdNavigatorWin* pNavigatorWin; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/optsitem.hxx b/sd/source/ui/inc/optsitem.hxx new file mode 100644 index 0000000000..3a71f53186 --- /dev/null +++ b/sd/source/ui/inc/optsitem.hxx @@ -0,0 +1,575 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +class SdOptions; + +namespace sd { +class FrameView; +} + +class SdOptionsGeneric; + +class SD_DLLPUBLIC SdOptionsItem final : public ::utl::ConfigItem +{ + +private: + + const SdOptionsGeneric& mrParent; + + virtual void ImplCommit() override; + +public: + + SdOptionsItem( const SdOptionsGeneric& rParent, const OUString& rSubTree ); + virtual ~SdOptionsItem() override; + + SdOptionsItem(SdOptionsItem const &) = default; + SdOptionsItem(SdOptionsItem &&) = default; + SdOptionsItem & operator =(SdOptionsItem const &) = delete; // due to ConfigItem + SdOptionsItem & operator =(SdOptionsItem &&) = delete; // due to ConfigItem + + virtual void Notify( const css::uno::Sequence& aPropertyNames) override; + + css::uno::Sequence< css::uno::Any > GetProperties( const css::uno::Sequence< OUString >& rNames ); + bool PutProperties( const css::uno::Sequence< OUString >& rNames, + const css::uno::Sequence< css::uno::Any>& rValues ); + using ConfigItem::SetModified; +}; + +class SD_DLLPUBLIC SdOptionsGeneric +{ +friend class SdOptionsItem; + +private: + + OUString maSubTree; + std::unique_ptr + mpCfgItem; + bool mbImpress; + bool mbInit : 1; + bool mbEnableModify : 1; + + SAL_DLLPRIVATE void Commit( SdOptionsItem& rCfgItem ) const; + SAL_DLLPRIVATE css::uno::Sequence< OUString > GetPropertyNames() const; + +protected: + + void Init() const; + void OptionsChanged() { if( mpCfgItem && mbEnableModify ) mpCfgItem->SetModified(); } + +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const = 0; + virtual bool ReadData( const css::uno::Any* pValues ) = 0; + virtual bool WriteData( css::uno::Any* pValues ) const = 0; + +public: + + SdOptionsGeneric(bool bImpress, const OUString& rSubTree); + SdOptionsGeneric(SdOptionsGeneric const &); + virtual ~SdOptionsGeneric(); + + SdOptionsGeneric& operator=( SdOptionsGeneric const & ); + + bool IsImpress() const { return mbImpress; } + + void EnableModify( bool bModify ) { mbEnableModify = bModify; } + + void Store(); + + static bool isMetricSystem(); +}; + +class SD_DLLPUBLIC SdOptionsLayout : public SdOptionsGeneric +{ +private: + + bool bRuler; // Layout/Display/Ruler + bool bMoveOutline; // Layout/Display/Contour + bool bDragStripes; // Layout/Display/Guide + bool bHandlesBezier; // Layout/Display/Bezier + bool bHelplines; // Layout/Display/Helpline + sal_uInt16 nMetric; // Layout/Other/MeasureUnit + sal_uInt16 nDefTab; // Layout/Other/TabStop + +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + SdOptionsLayout(bool bImpress, bool bUseConfig); + + bool operator==( const SdOptionsLayout& rOpt ) const; + + bool IsRulerVisible() const { Init(); return bRuler; } + bool IsMoveOutline() const { Init(); return bMoveOutline; } + bool IsDragStripes() const { Init(); return bDragStripes; } + bool IsHandlesBezier() const { Init(); return bHandlesBezier; } + bool IsHelplines() const { Init(); return bHelplines; } + sal_uInt16 GetMetric() const { Init(); return( ( 0xffff == nMetric ) ? static_cast(SfxModule::GetCurrentFieldUnit()) : nMetric ); } + sal_uInt16 GetDefTab() const { Init(); return nDefTab; } + + void SetRulerVisible( bool bOn ) { if( bRuler != bOn ) { OptionsChanged(); bRuler = bOn; } } + void SetMoveOutline( bool bOn ) { if( bMoveOutline != bOn ) { OptionsChanged(); bMoveOutline = bOn; } } + void SetDragStripes( bool bOn ) { if( bDragStripes != bOn ) { OptionsChanged(); bDragStripes = bOn; } } + void SetHandlesBezier( bool bOn ) { if( bHandlesBezier != bOn ) { OptionsChanged(); bHandlesBezier = bOn; } } + void SetHelplines( bool bOn ) { if( bHelplines != bOn ) { OptionsChanged(); bHelplines = bOn; } } + void SetMetric( sal_uInt16 nInMetric ) { if( nMetric != nInMetric ) { OptionsChanged(); nMetric = nInMetric; } } + void SetDefTab( sal_uInt16 nTab ) { if( nDefTab != nTab ) { OptionsChanged(); nDefTab = nTab; } } +}; + +class SD_DLLPUBLIC SdOptionsLayoutItem final : public SfxPoolItem +{ +public: + + explicit SdOptionsLayoutItem(); + SdOptionsLayoutItem( SdOptions const * pOpts, ::sd::FrameView const * pView ); + + virtual SdOptionsLayoutItem* Clone( SfxItemPool *pPool = nullptr ) const override; + virtual bool operator==( const SfxPoolItem& ) const override; + + void SetOptions( SdOptions* pOpts ) const; + + SdOptionsLayout& GetOptionsLayout() { return maOptionsLayout; } +private: + SdOptionsLayout maOptionsLayout; +}; + +class SdOptionsContents : public SdOptionsGeneric +{ +private: +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + + SdOptionsContents(bool bImpress); + + bool operator==( const SdOptionsContents& rOpt ) const; +}; + +class SD_DLLPUBLIC SdOptionsMisc : public SdOptionsGeneric +{ +private: + + sal_Int32 nDefaultObjectSizeWidth; + sal_Int32 nDefaultObjectSizeHeight; + + bool bStartWithTemplate : 1; // Misc/NewDoc/AutoPilot + bool bMarkedHitMovesAlways : 1; // Misc/ObjectMoveable + bool bMoveOnlyDragging : 1; // Currently, not in use !!! + bool bCrookNoContortion : 1; // Misc/NoDistort + bool bQuickEdit : 1; // Misc/TextObject/QuickEditing + bool bMasterPageCache : 1; // Misc/BackgroundCache + bool bDragWithCopy : 1; // Misc/CopyWhileMoving + bool bPickThrough : 1; // Misc/TextObject/Selectable + bool bDoubleClickTextEdit : 1; // Misc/DclickTextedit + bool bClickChangeRotation : 1; // Misc/RotateClick + bool bSolidDragging : 1; // Misc/ModifyWithAttributes + bool bSummationOfParagraphs : 1; // misc/SummationOfParagraphs + bool bTabBarVisible : 1; // Misc/TabBarVisible + bool bShowUndoDeleteWarning : 1; // Misc/ShowUndoDeleteWarning + // #i75315# + bool bSlideshowRespectZOrder : 1; // Misc/SlideshowRespectZOrder + bool bShowComments : 1; // Misc/ShowComments + + bool bPreviewNewEffects; + bool bPreviewChangedEffects; + bool bPreviewTransitions; + + sal_Int32 mnDisplay; + + sal_Int32 mnPenColor; + double mnPenWidth; + + /** This value controls the device to use for formatting documents. + The currently supported values are 0 for the current printer or 1 + for the printer independent virtual device the can be retrieved from + the modules. + */ + sal_uInt16 mnPrinterIndependentLayout; // Misc/Compatibility/PrinterIndependentLayout + + /// Minimum mouse move distance for it to register as a drag action + sal_Int32 mnDragThresholdPixels; // Misc/DragThresholdPixels +// Misc + +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + + SdOptionsMisc(bool bImpress, bool bUseConfig); + + bool operator==( const SdOptionsMisc& rOpt ) const; + + bool IsStartWithTemplate() const { Init(); return bStartWithTemplate; } + bool IsMarkedHitMovesAlways() const { Init(); return bMarkedHitMovesAlways; } + bool IsMoveOnlyDragging() const { Init(); return bMoveOnlyDragging; } + bool IsCrookNoContortion() const { Init(); return bCrookNoContortion; } + bool IsQuickEdit() const { Init(); return bQuickEdit; } + bool IsMasterPagePaintCaching() const { Init(); return bMasterPageCache; } + bool IsDragWithCopy() const { Init(); return bDragWithCopy; } + bool IsPickThrough() const { Init(); return bPickThrough; } + bool IsDoubleClickTextEdit() const { Init(); return bDoubleClickTextEdit; } + bool IsClickChangeRotation() const { Init(); return bClickChangeRotation; } + bool IsSolidDragging() const { Init(); return bSolidDragging; } + bool IsSummationOfParagraphs() const { Init(); return bSummationOfParagraphs; }; + bool IsTabBarVisible() const { Init(); return bTabBarVisible; }; + + /** Return the currently selected printer independent layout mode. + @return + Returns 1 for printer independent layout enabled and 0 when it + is disabled. Other values are reserved for future use. + */ + sal_uInt16 GetPrinterIndependentLayout() const { Init(); return mnPrinterIndependentLayout; }; + bool IsShowUndoDeleteWarning() const { Init(); return bShowUndoDeleteWarning; } + bool IsSlideshowRespectZOrder() const { Init(); return bSlideshowRespectZOrder; } + sal_Int32 GetDefaultObjectSizeWidth() const { Init(); return nDefaultObjectSizeWidth; } + sal_Int32 GetDefaultObjectSizeHeight() const { Init(); return nDefaultObjectSizeHeight; } + + bool IsPreviewNewEffects() const { Init(); return bPreviewNewEffects; } + bool IsPreviewChangedEffects() const { Init(); return bPreviewChangedEffects; } + bool IsPreviewTransitions() const { Init(); return bPreviewTransitions; } + + sal_Int32 GetDisplay() const; + void SetDisplay( sal_Int32 nDisplay ); + + sal_Int32 GetPresentationPenColor() const { Init(); return mnPenColor; } + void SetPresentationPenColor( sal_Int32 nPenColor ) { if( mnPenColor != nPenColor ) { OptionsChanged(); mnPenColor = nPenColor; } } + + double GetPresentationPenWidth() const { Init(); return mnPenWidth; } + void SetPresentationPenWidth( double nPenWidth ) { if( mnPenWidth != nPenWidth ) { OptionsChanged(); mnPenWidth = nPenWidth; } } + + sal_Int32 GetDragThresholdPixels() const; + void SetDragThreshold(sal_Int32 nDragThresholdPixels); + + void SetStartWithTemplate( bool bOn ) { if( bStartWithTemplate != bOn ) { OptionsChanged(); bStartWithTemplate = bOn; } } + void SetMarkedHitMovesAlways( bool bOn ) { if( bMarkedHitMovesAlways != bOn ) { OptionsChanged(); bMarkedHitMovesAlways = bOn; } } + void SetMoveOnlyDragging( bool bOn ) { if( bMoveOnlyDragging != bOn ) { OptionsChanged(); bMoveOnlyDragging = bOn; } } + void SetCrookNoContortion( bool bOn ) { if( bCrookNoContortion != bOn ) { OptionsChanged(); bCrookNoContortion = bOn; } } + void SetQuickEdit( bool bOn ) { if( bQuickEdit != bOn ) { OptionsChanged(); bQuickEdit = bOn; } } + void SetMasterPagePaintCaching( bool bOn ) { if( bMasterPageCache != bOn ) { OptionsChanged(); bMasterPageCache = bOn; } } + void SetDragWithCopy( bool bOn ) { if( bDragWithCopy != bOn ) { OptionsChanged(); bDragWithCopy = bOn; } } + void SetPickThrough( bool bOn ) { if( bPickThrough != bOn ) { OptionsChanged(); bPickThrough = bOn; } } + void SetDoubleClickTextEdit( bool bOn ) { if( bDoubleClickTextEdit != bOn ) { OptionsChanged(); bDoubleClickTextEdit = bOn; } } + void SetClickChangeRotation( bool bOn ) { if( bClickChangeRotation != bOn ) { OptionsChanged(); bClickChangeRotation = bOn; } } + void SetSummationOfParagraphs( bool bOn ){ if ( bOn != bSummationOfParagraphs ) { OptionsChanged(); bSummationOfParagraphs = bOn; } } + void SetTabBarVisible( bool bOn ){ if ( bOn != bTabBarVisible ) { OptionsChanged(); bTabBarVisible = bOn; } } + /** Set the printer independent layout mode. + @param nOn + The default value is to switch printer independent layout on, + hence the parameters name. Use 0 for turning it off. Other + values are reserved for future use. + */ + void SetPrinterIndependentLayout (sal_uInt16 nOn ){ if ( nOn != mnPrinterIndependentLayout ) { OptionsChanged(); mnPrinterIndependentLayout = nOn; } } + void SetSolidDragging( bool bOn ) { if( bSolidDragging != bOn ) { OptionsChanged(); bSolidDragging = bOn; } } + void SetShowUndoDeleteWarning( bool bOn ) { if( bShowUndoDeleteWarning != bOn ) { OptionsChanged(); bShowUndoDeleteWarning = bOn; } } + void SetSlideshowRespectZOrder( bool bOn ) { if( bSlideshowRespectZOrder != bOn ) { OptionsChanged(); bSlideshowRespectZOrder = bOn; } } + void SetDefaultObjectSizeWidth( sal_Int32 nWidth ) { if( nDefaultObjectSizeWidth != nWidth ) { OptionsChanged(); nDefaultObjectSizeWidth = nWidth; } } + void SetDefaultObjectSizeHeight( sal_Int32 nHeight ) { if( nDefaultObjectSizeHeight != nHeight ) { OptionsChanged(); nDefaultObjectSizeHeight = nHeight; } } + + void SetPreviewNewEffects( bool bOn ) { if( bPreviewNewEffects != bOn ) { OptionsChanged(); bPreviewNewEffects = bOn; } } + void SetPreviewChangedEffects( bool bOn ) { if( bPreviewChangedEffects != bOn ) { OptionsChanged(); bPreviewChangedEffects = bOn; } } + void SetPreviewTransitions( bool bOn ) { if( bPreviewTransitions != bOn ) { OptionsChanged(); bPreviewTransitions = bOn; } } + + bool IsShowComments() const { Init(); return bShowComments; } + void SetShowComments( bool bShow ) { if( bShowComments != bShow ) { OptionsChanged(); bShowComments = bShow; } } +}; + +class SD_DLLPUBLIC SdOptionsMiscItem final : public SfxPoolItem +{ +public: + + explicit SdOptionsMiscItem(); + SdOptionsMiscItem( SdOptions const * pOpts, ::sd::FrameView const * pView ); + + virtual SdOptionsMiscItem* Clone( SfxItemPool *pPool = nullptr ) const override; + virtual bool operator==( const SfxPoolItem& ) const override; + + void SetOptions( SdOptions* pOpts ) const; + + SdOptionsMisc& GetOptionsMisc() { return maOptionsMisc; } + const SdOptionsMisc& GetOptionsMisc() const { return maOptionsMisc; } +private: + SdOptionsMisc maOptionsMisc; +}; + +class SD_DLLPUBLIC SdOptionsSnap : public SdOptionsGeneric +{ +private: + + bool bSnapHelplines : 1; // Snap/Object/SnapLine + bool bSnapBorder : 1; // Snap/Object/PageMargin + bool bSnapFrame : 1; // Snap/Object/ObjectFrame + bool bSnapPoints : 1; // Snap/Object/ObjectPoint + bool bOrtho : 1; // Snap/Position/CreatingMoving + bool bBigOrtho : 1; // Snap/Position/ExtendEdges + bool bRotate : 1; // Snap/Position/Rotating + sal_Int16 nSnapArea; // Snap/Object/Range + Degree100 nAngle; // Snap/Position/RotatingValue + Degree100 nBezAngle; // Snap/Position/PointReduction + +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + + SdOptionsSnap(bool bImpress, bool bUseConfig); + + bool operator==( const SdOptionsSnap& rOpt ) const; + + bool IsSnapHelplines() const { Init(); return bSnapHelplines; } + bool IsSnapBorder() const { Init(); return bSnapBorder; } + bool IsSnapFrame() const { Init(); return bSnapFrame; } + bool IsSnapPoints() const { Init(); return bSnapPoints; } + bool IsOrtho() const { Init(); return bOrtho; } + bool IsBigOrtho() const { Init(); return bBigOrtho; } + bool IsRotate() const { Init(); return bRotate; } + sal_Int16 GetSnapArea() const { Init(); return nSnapArea; } + Degree100 GetAngle() const { Init(); return nAngle; } + Degree100 GetEliminatePolyPointLimitAngle() const { Init(); return nBezAngle; } + + void SetSnapHelplines( bool bOn ) { if( bSnapHelplines != bOn ) { OptionsChanged(); bSnapHelplines = bOn; } } + void SetSnapBorder( bool bOn ) { if( bSnapBorder != bOn ) { OptionsChanged(); bSnapBorder = bOn; } } + void SetSnapFrame( bool bOn ) { if( bSnapFrame != bOn ) { OptionsChanged(); bSnapFrame = bOn; } } + void SetSnapPoints( bool bOn ) { if( bSnapPoints != bOn ) { OptionsChanged(); bSnapPoints = bOn; } } + void SetOrtho( bool bOn ) { if( bOrtho != bOn ) { OptionsChanged(); bOrtho = bOn; } } + void SetBigOrtho( bool bOn ) { if( bBigOrtho != bOn ) { OptionsChanged(); bBigOrtho = bOn; } } + void SetRotate( bool bOn ) { if( bRotate != bOn ) { OptionsChanged(); bRotate = bOn; } } + void SetSnapArea( sal_Int16 nIn ) { if( nSnapArea != nIn ) { OptionsChanged(); nSnapArea = nIn; } } + void SetAngle( Degree100 nIn ) { if( nAngle != nIn ) { OptionsChanged(); nAngle = nIn; } } + void SetEliminatePolyPointLimitAngle( Degree100 nIn ) { if( nBezAngle != nIn ) { OptionsChanged(); nBezAngle = nIn; } } +}; + +class SD_DLLPUBLIC SdOptionsSnapItem final : public SfxPoolItem +{ +public: + + explicit SdOptionsSnapItem(); + SdOptionsSnapItem( SdOptions const * pOpts, ::sd::FrameView const * pView ); + + virtual SdOptionsSnapItem* Clone( SfxItemPool *pPool = nullptr ) const override; + virtual bool operator==( const SfxPoolItem& ) const override; + + void SetOptions( SdOptions* pOpts ) const; + + SdOptionsSnap& GetOptionsSnap() { return maOptionsSnap; } +private: + SdOptionsSnap maOptionsSnap; +}; + +class SdOptionsZoom : public SdOptionsGeneric +{ +private: + + sal_Int32 nX; // Zoom/ScaleX + sal_Int32 nY; // Zoom/ScaleY + +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + + explicit SdOptionsZoom(bool bImpress); + + void GetScale( sal_Int32& rX, sal_Int32& rY ) const { Init(); rX = nX; rY = nY; } + void SetScale( sal_Int32 nInX, sal_Int32 nInY ) { if( nX != nInX || nY != nInY ) { OptionsChanged(); nX = nInX; nY = nInY; } } +}; + +class SdOptionsGrid : public SdOptionsGeneric, public SvxOptionsGrid +{ +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + + explicit SdOptionsGrid(bool bImpress); + virtual ~SdOptionsGrid() override; + + void SetDefaults(); + + sal_uInt32 GetFieldDrawX() const { Init(); return SvxOptionsGrid::GetFieldDrawX(); } + sal_uInt32 GetFieldDivisionX() const { Init(); return SvxOptionsGrid::GetFieldDivisionX(); } + sal_uInt32 GetFieldDrawY() const { Init(); return SvxOptionsGrid::GetFieldDrawY(); } + sal_uInt32 GetFieldDivisionY() const { Init(); return SvxOptionsGrid::GetFieldDivisionY(); } + bool IsUseGridSnap() const { Init(); return SvxOptionsGrid::GetUseGridSnap(); } + bool IsSynchronize() const { Init(); return SvxOptionsGrid::GetSynchronize(); } + bool IsGridVisible() const { Init(); return SvxOptionsGrid::GetGridVisible(); } + bool IsEqualGrid() const { Init(); return SvxOptionsGrid::GetEqualGrid(); } + + void SetFieldDrawX( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDrawX() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDrawX( nSet ); } } + void SetFieldDivisionX( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDivisionX() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDivisionX( nSet ); } } + void SetFieldDrawY( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDrawY() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDrawY( nSet ); } } + void SetFieldDivisionY( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDivisionY() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDivisionY( nSet ); } } + void SetUseGridSnap( bool bSet ) { if( bSet != SvxOptionsGrid::GetUseGridSnap() ) { OptionsChanged(); SvxOptionsGrid::SetUseGridSnap( bSet ); } } + void SetSynchronize( bool bSet ) { if( bSet != SvxOptionsGrid::GetSynchronize() ) { OptionsChanged(); SvxOptionsGrid::SetSynchronize( bSet ); } } + void SetGridVisible( bool bSet ) { if( bSet != SvxOptionsGrid::GetGridVisible() ) { OptionsChanged(); SvxOptionsGrid::SetGridVisible( bSet ); } } + void SetEqualGrid( bool bSet ) { if( bSet != SvxOptionsGrid::GetEqualGrid() ) { OptionsChanged(); SvxOptionsGrid::SetEqualGrid( bSet ); } } +}; + +class SdOptionsGridItem final : public SvxGridItem +{ + +public: + explicit SdOptionsGridItem( SdOptions const * pOpts ); + + void SetOptions( SdOptions* pOpts ) const; +}; + +class SD_DLLPUBLIC SdOptionsPrint : public SdOptionsGeneric +{ +private: + + bool bDraw : 1; // Print/Content/Drawing + bool bNotes : 1; // Print/Content/Note + bool bHandout : 1; // Print/Content/Handout + bool bOutline : 1; // Print/Content/Outline + bool bDate : 1; // Print/Other/Date + bool bTime : 1; // Print/Other/Time + bool bPagename : 1; // Print/Other/PageName + bool bHiddenPages : 1; // Print/Other/HiddenPage + bool bPagesize : 1; // Print/Page/PageSize + bool bPagetile : 1; // Print/Page/PageTile + bool bWarningPrinter : 1; // These flags you get + bool bWarningSize : 1; // from the common options, + bool bWarningOrientation : 1; // currently org.openoffice.Office.Common.xml (class OfaMiscCfg ; sfx2/misccfg.hxx ) + bool bBooklet : 1; // Print/Page/Booklet + bool bFront : 1; // Print/Page/BookletFront + bool bBack : 1; // Print/Page/BookletFront + bool bCutPage : 1; // NOT persistent !!! + bool bPaperbin : 1; // Print/Other/FromPrinterSetup + bool mbHandoutHorizontal : 1; // Order Page previews on Handout Pages horizontal + sal_uInt16 mnHandoutPages; // Number of page previews on handout page (only 1/2/4/6/9 are supported) + sal_uInt16 nQuality; // Print/Other/Quality + +protected: + + virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override; + virtual bool ReadData( const css::uno::Any* pValues ) override; + virtual bool WriteData( css::uno::Any* pValues ) const override; + +public: + + SdOptionsPrint(bool bImpress, bool bUseConfig); + + bool operator==( const SdOptionsPrint& rOpt ) const; + + bool IsDraw() const { Init(); return bDraw; } + bool IsNotes() const { Init(); return bNotes; } + bool IsHandout() const { Init(); return bHandout; } + bool IsOutline() const { Init(); return bOutline; } + bool IsDate() const { Init(); return bDate; } + bool IsTime() const { Init(); return bTime; } + bool IsPagename() const { Init(); return bPagename; } + bool IsHiddenPages() const { Init(); return bHiddenPages; } + bool IsPagesize() const { Init(); return bPagesize; } + bool IsPagetile() const { Init(); return bPagetile; } + bool IsWarningPrinter() const { Init(); return bWarningPrinter; } + bool IsWarningSize() const { Init(); return bWarningSize; } + bool IsWarningOrientation() const { Init(); return bWarningOrientation; } + bool IsBooklet() const { Init(); return bBooklet; } + bool IsFrontPage() const { Init(); return bFront; } + bool IsBackPage() const { Init(); return bBack; } + bool IsCutPage() const { Init(); return bCutPage; } + bool IsPaperbin() const { Init(); return bPaperbin; } + sal_uInt16 GetOutputQuality() const { Init(); return nQuality; } + bool IsHandoutHorizontal() const { Init(); return mbHandoutHorizontal; } + sal_uInt16 GetHandoutPages() const { Init(); return mnHandoutPages; } + + void SetDraw( bool bOn ) { if( bDraw != bOn ) { OptionsChanged(); bDraw = bOn; } } + void SetNotes( bool bOn ) { if( bNotes != bOn ) { OptionsChanged(); bNotes = bOn; } } + void SetHandout( bool bOn ) { if( bHandout != bOn ) { OptionsChanged(); bHandout = bOn; } } + void SetOutline( bool bOn ) { if( bOutline != bOn ) { OptionsChanged(); bOutline = bOn; } } + void SetDate( bool bOn ) { if( bDate != bOn ) { OptionsChanged(); bDate = bOn; } } + void SetTime( bool bOn ) { if( bTime != bOn ) { OptionsChanged(); bTime = bOn; } } + void SetPagename( bool bOn ) { if( bPagename != bOn ) { OptionsChanged(); bPagename = bOn; } } + void SetHiddenPages( bool bOn ) { if( bHiddenPages != bOn ) { OptionsChanged(); bHiddenPages = bOn; } } + void SetPagesize( bool bOn ) { if( bPagesize != bOn ) { OptionsChanged(); bPagesize = bOn; } } + void SetPagetile( bool bOn ) { if( bPagetile != bOn ) { OptionsChanged(); bPagetile = bOn; } } + void SetWarningPrinter( bool bOn ) { if( bWarningPrinter != bOn ) { OptionsChanged(); bWarningPrinter = bOn; } } + void SetWarningSize( bool bOn ) { if( bWarningSize != bOn ) { OptionsChanged(); bWarningSize = bOn; } } + void SetWarningOrientation( bool bOn) { if( bWarningOrientation != bOn ) { OptionsChanged(); bWarningOrientation = bOn; } } + void SetBooklet( bool bOn ) { if( bBooklet != bOn ) { OptionsChanged(); bBooklet = bOn; } } + void SetFrontPage( bool bOn ) { if( bFront != bOn ) { OptionsChanged(); bFront = bOn; } } + void SetBackPage( bool bOn ) { if( bBack != bOn ) { OptionsChanged(); bBack = bOn; } } + void SetCutPage( bool bOn ) { if( bCutPage != bOn ) { OptionsChanged(); bCutPage = bOn; } } + void SetPaperbin( bool bOn ) { if( bPaperbin != bOn ) { OptionsChanged(); bPaperbin = bOn; } } + void SetOutputQuality( sal_uInt16 nInQuality ) { if( nQuality != nInQuality ) { OptionsChanged(); nQuality = nInQuality; } } + void SetHandoutHorizontal( bool bHandoutHorizontal ) { if( mbHandoutHorizontal != bHandoutHorizontal ) { OptionsChanged(); mbHandoutHorizontal = bHandoutHorizontal; } } + void SetHandoutPages( sal_uInt16 nHandoutPages ) { if( nHandoutPages != mnHandoutPages ) { OptionsChanged(); mnHandoutPages = nHandoutPages; } } +}; + +class SD_DLLPUBLIC SdOptionsPrintItem final : public SfxPoolItem +{ +public: + + explicit SdOptionsPrintItem(); + explicit SdOptionsPrintItem( SdOptions const * pOpts ); + + virtual SdOptionsPrintItem* Clone( SfxItemPool *pPool = nullptr ) const override; + virtual bool operator==( const SfxPoolItem& ) const override; + + void SetOptions( SdOptions* pOpts ) const; + + SdOptionsPrint& GetOptionsPrint() { return maOptionsPrint; } + const SdOptionsPrint& GetOptionsPrint() const { return maOptionsPrint; } +private: + SdOptionsPrint maOptionsPrint; +}; + +class SdOptions final : public SdOptionsLayout, public SdOptionsContents, + public SdOptionsMisc, public SdOptionsSnap, + public SdOptionsZoom, public SdOptionsGrid, + public SdOptionsPrint +{ +public: + + explicit SdOptions(bool bImpress); + virtual ~SdOptions() override; + + void StoreConfig(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/paragr.hxx b/sd/source/ui/inc/paragr.hxx new file mode 100644 index 0000000000..cbdfda1019 --- /dev/null +++ b/sd/source/ui/inc/paragr.hxx @@ -0,0 +1,36 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +/** + * Paragraph-Tab-Dialog + */ +class SdParagraphDlg : public SfxTabDialogController +{ +private: + virtual void PageCreated(const OUString& rId, SfxTabPage& rPage) override; + +public: + SdParagraphDlg(weld::Window* pParent, const SfxItemSet* pAttr); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/pgjump.hxx b/sd/source/ui/inc/pgjump.hxx new file mode 100644 index 0000000000..c4d434caa2 --- /dev/null +++ b/sd/source/ui/inc/pgjump.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +enum PageJump +{ + PAGE_NONE, + PAGE_FIRST, + PAGE_PREVIOUS, + PAGE_NEXT, + PAGE_LAST +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/present.hxx b/sd/source/ui/inc/present.hxx new file mode 100644 index 0000000000..0d626bc234 --- /dev/null +++ b/sd/source/ui/inc/present.hxx @@ -0,0 +1,100 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SfxItemSet; +class SdCustomShowList; + +/** + * Dialog to define optionsm_xnd to start the presentation + */ +class SdStartPresentationDlg : public weld::GenericDialogController +{ +private: + SdCustomShowList* pCustomShowList; + const SfxItemSet& rOutAttrs; + sal_Int32 mnMonitors; + + std::unique_ptr m_xRbtAll; + std::unique_ptr m_xRbtAtDia; + std::unique_ptr m_xRbtCustomshow; + std::unique_ptr m_xLbDias; + std::unique_ptr m_xLbCustomshow; + + std::unique_ptr m_xRbtStandard; + std::unique_ptr m_xRbtWindow; + std::unique_ptr m_xRbtAuto; + std::unique_ptr m_xTmfPause; + std::unique_ptr m_xFormatter; + std::unique_ptr m_xCbxAutoLogo; + + std::unique_ptr m_xCbxManuel; + std::unique_ptr m_xCbxMousepointer; + std::unique_ptr m_xCbxPen; + std::unique_ptr m_xCbxAnimationAllowed; + std::unique_ptr m_xCbxChangePage; + std::unique_ptr m_xCbxAlwaysOnTop; + std::unique_ptr m_xCbxShowNavigationButton; + std::unique_ptr m_xLbNavigationButtonsSize; + std::unique_ptr m_xFtNavigationButtonsSize; + std::unique_ptr m_xFrameEnableRemote; + std::unique_ptr m_xCbxEnableRemote; + std::unique_ptr m_xCbxEnableRemoteInsecure; + + std::unique_ptr m_xLbConsole; + + std::unique_ptr m_xFtMonitor; + std::unique_ptr m_xLBMonitor; + + std::unique_ptr m_xMonitor; + std::unique_ptr m_xAllMonitors; + std::unique_ptr m_xMonitorExternal; + std::unique_ptr m_xExternal; + + DECL_LINK(ChangeRemoteHdl, weld::Toggleable&, void); + DECL_LINK(ChangeRangeHdl, weld::Toggleable&, void); + DECL_LINK(ClickWindowPresentationHdl, weld::Toggleable&, void); + void ChangePause(); + DECL_LINK(ChangePauseHdl, weld::FormattedSpinButton&, void); + + void InitMonitorSettings(); + enum DisplayType { + EXTERNAL_IS_NUMBER, + MONITOR_NORMAL, + MONITOR_IS_EXTERNAL, + }; + sal_Int32 InsertDisplayEntry(const OUString &aName, + sal_Int32 nDisplay); + OUString GetDisplayName( sal_Int32 nDisplay, + DisplayType eType ); +public: + SdStartPresentationDlg(weld::Window* pWindow, + const SfxItemSet& rInAttrs, + const std::vector &rPageNames, + SdCustomShowList* pCSList); + virtual ~SdStartPresentationDlg() override; + virtual short run() override; + void GetAttr( SfxItemSet& rOutAttrs ); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/prltempl.hxx b/sd/source/ui/inc/prltempl.hxx new file mode 100644 index 0000000000..ea1ef022b8 --- /dev/null +++ b/sd/source/ui/inc/prltempl.hxx @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +class SfxObjectShell; +class SfxStyleSheetBase; +class SfxStyleSheetBasePool; + +/** + * Template-Tab-Dialog + */ +class SdPresLayoutTemplateDlg final : public SfxTabDialogController +{ +private: + const SfxObjectShell* mpDocShell; + + XColorListRef pColorTab; + XGradientListRef pGradientList; + XHatchListRef pHatchingList; + XBitmapListRef pBitmapList; + XPatternListRef pPatternList; + XDashListRef pDashList; + XLineEndListRef pLineEndList; + + PresentationObjects ePO; + + virtual void PageCreated(const OUString& rId, SfxTabPage &rPage) override; + + // for mapping with the new SvxNumBulletItem + SfxItemSet aInputSet; + std::unique_ptr pOutSet; + + sal_uInt16 GetOutlineLevel() const; + +public: + SdPresLayoutTemplateDlg(SfxObjectShell const * pDocSh, weld::Window* pParent, bool bBackground, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool); + virtual ~SdPresLayoutTemplateDlg() override; + + const SfxItemSet* GetOutputItemSet() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/prntopts.hxx b/sd/source/ui/inc/prntopts.hxx new file mode 100644 index 0000000000..2c391ae328 --- /dev/null +++ b/sd/source/ui/inc/prntopts.hxx @@ -0,0 +1,83 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdPrintOptions final : public SfxTabPage +{ + friend class SdModule; + +private: + bool m_bDrawMode; + + std::unique_ptr m_xFrmContent; + std::unique_ptr m_xCbxDraw; + std::unique_ptr m_xCbxNotes; + std::unique_ptr m_xCbxHandout; + std::unique_ptr m_xCbxOutline; + std::unique_ptr m_xRbtColor; + std::unique_ptr m_xRbtGrayscale; + std::unique_ptr m_xRbtBlackWhite; + std::unique_ptr m_xRbQualityImg; + std::unique_ptr m_xCbxPagename; + std::unique_ptr m_xCbxPagenameImg; + std::unique_ptr m_xCbxDate; + std::unique_ptr m_xCbxDateImg; + std::unique_ptr m_xCbxTime; + std::unique_ptr m_xCbxTimeImg; + std::unique_ptr m_xCbxHiddenPages; + std::unique_ptr m_xCbxHiddenPagesImg; + std::unique_ptr m_xRbtDefault; + std::unique_ptr m_xRbtPagesize; + std::unique_ptr m_xRbtPagetile; + std::unique_ptr m_xRbtBooklet; + std::unique_ptr m_xGridPageOpt; + std::unique_ptr m_xRbtPageOptImg; + std::unique_ptr m_xCbxFront; + std::unique_ptr m_xCbxFrontImg; + std::unique_ptr m_xCbxBack; + std::unique_ptr m_xCbxBackImg; + std::unique_ptr m_xCbxPaperbin; + std::unique_ptr m_xCbxPaperbinImg; + + DECL_LINK(ClickCheckboxHdl, weld::Toggleable&, void); + DECL_LINK(ClickBookletHdl, weld::Toggleable&, void); + + void updateControls(); + +public: + SdPrintOptions(weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet& rInAttrs); + virtual ~SdPrintOptions() override; + + static std::unique_ptr + Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet*); + + virtual OUString GetAllStrings() override; + + virtual bool FillItemSet(SfxItemSet*) override; + virtual void Reset(const SfxItemSet*) override; + + void SetDrawMode(); + virtual void PageCreated(const SfxAllItemSet& aSet) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/registerinterfaces.hxx b/sd/source/ui/inc/registerinterfaces.hxx new file mode 100644 index 0000000000..5a8be7dc07 --- /dev/null +++ b/sd/source/ui/inc/registerinterfaces.hxx @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd::ui::table +{ +void RegisterInterfaces(const SfxModule* pMod); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/scalectrl.hxx b/sd/source/ui/inc/scalectrl.hxx new file mode 100644 index 0000000000..2a0ed5b28e --- /dev/null +++ b/sd/source/ui/inc/scalectrl.hxx @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdScaleControl final : public SfxStatusBarControl +{ +public: + SdScaleControl(sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb); + virtual ~SdScaleControl() override; + + virtual void StateChangedAtStatusBarControl(sal_uInt16 nSID, SfxItemState eState, + const SfxPoolItem* pState) override; + + SFX_DECL_STATUSBAR_CONTROL(); + +private: + virtual void Command(const CommandEvent& rCEvt) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/sdpopup.hxx b/sd/source/ui/inc/sdpopup.hxx new file mode 100644 index 0000000000..0eccc914d4 --- /dev/null +++ b/sd/source/ui/inc/sdpopup.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SvxFieldData; + +/** + * PopupMenu for editing field-commands + */ +class SdFieldPopup +{ +private: + std::unique_ptr m_xBuilder; + std::unique_ptr m_xPopup; + const SvxFieldData* m_pField; + + void Fill( LanguageType eLanguage ); + +public: + SdFieldPopup(const SvxFieldData* pInField, LanguageType eLanguage); + void Execute(weld::Window* pParent, const tools::Rectangle& rRect); + ~SdFieldPopup(); + + SvxFieldData* GetField(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/sdpreslt.hxx b/sd/source/ui/inc/sdpreslt.hxx new file mode 100644 index 0000000000..2e87b66840 --- /dev/null +++ b/sd/source/ui/inc/sdpreslt.hxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +class SfxItemSet; +class ValueSet; +namespace weld { class CustomWeld; } + +namespace sd { +class DrawDocShell; +} + +class SdPresLayoutDlg final + : public weld::GenericDialogController +{ +public: + SdPresLayoutDlg( + ::sd::DrawDocShell* pDocShell, + weld::Window* pWindow, + const SfxItemSet& rInAttrs); + virtual ~SdPresLayoutDlg() override; + + void GetAttr(SfxItemSet& rOutAttrs); + + DECL_LINK(ClickLayoutHdl, ValueSet*, void); + DECL_LINK(ClickLoadHdl, weld::Button&, void); + +private: + ::sd::DrawDocShell* mpDocSh; + + const SfxItemSet& mrOutAttrs; + + std::vector maLayoutNames; + + OUString maName; ///< layout name or file name + tools::Long mnLayoutCount; ///< number of master pages in the document + const OUString maStrNone; + + std::unique_ptr m_xCbxMasterPage; + std::unique_ptr m_xCbxCheckMasters; + std::unique_ptr m_xBtnLoad; + std::unique_ptr m_xVS; + std::unique_ptr m_xVSWin; + std::unique_ptr m_xLabel; + + void FillValueSet(); + void Reset(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/sdtreelb.hxx b/sd/source/ui/inc/sdtreelb.hxx new file mode 100644 index 0000000000..1f6026b557 --- /dev/null +++ b/sd/source/ui/inc/sdtreelb.hxx @@ -0,0 +1,455 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include "sdxfer.hxx" +#include +#include + +class SdrView; +class SdDrawDocument; +class SfxMedium; +class SfxViewFrame; +class SdNavigatorWin; +class SdrObject; +class SdrObjList; +class SdPage; +struct ImplSVEvent; + +namespace sd { +class ViewShell; + +class DrawDocShell; +#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED +#define SV_DECL_DRAW_DOC_SHELL_DEFINED +typedef ::tools::SvRef DrawDocShellRef; +#endif +} +namespace svt { + class AcceleratorExecute; +} + +class SdPageObjsTLVDropTarget final : public DropTargetHelper +{ +private: + weld::TreeView& m_rTreeView; + SdrView* m_pSdrView; + bool m_bOrderFrontToBack = false; + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + +public: + SdPageObjsTLVDropTarget(weld::TreeView& rTreeView); + + void SetDrawView(SdrView* pSdrView) { m_pSdrView = pSdrView; } + void SetOrderFrontToBack(bool bSet) { m_bOrderFrontToBack = bSet; } +}; + +class SD_DLLPUBLIC SdPageObjsTLV +{ +private: + static bool SAL_DLLPRIVATE bIsInDrag; ///< static, in the case the navigator is deleted in ExecuteDrag + + std::unique_ptr m_xTreeView; + std::unique_ptr m_xScratchIter; + std::unique_ptr m_xDropTargetHelper; + std::unique_ptr<::svt::AcceleratorExecute> m_xAccel; + SdNavigatorWin* m_pNavigator; + const SdDrawDocument* m_pDoc; + SdDrawDocument* m_pBookmarkDoc; + SfxMedium* m_pMedium; + SfxMedium* m_pOwnMedium; + bool m_bLinkableSelected; + bool m_bShowAllShapes; + bool m_bOrderFrontToBack; + + /** This flag controls whether to show all pages. + */ + bool m_bShowAllPages; + + /** + * If changing the selection should also result in navigating to the + * relevant shape. + */ + bool m_bSelectionHandlerNavigates; + + /** + * If navigation should not only select the relevant shape but also change + * focus to it. + */ + bool m_bNavigationGrabsFocus; + + bool m_bMouseReleased = true; // hack for x11 inplace editing + bool m_bEditing = false; + + SelectionMode m_eSelectionMode; + + ImplSVEvent* m_nSelectEventId; + ImplSVEvent* m_nRowActivateEventId; + + OUString m_aDocName; + ::sd::DrawDocShellRef m_xBookmarkDocShRef; ///< for the loading of bookmarks + Link m_aChangeHdl; + Link m_aRowActivatedHdl; + Link m_aKeyPressHdl; + Link m_aMouseReleaseHdl; + Link m_aPopupMenuHdl; + + /** Return the name of the object. When the object has no user supplied + name and the bCreate flag is then a name is created + automatically. Additionally the mbShowAllShapes flag is taken into + account when there is no user supplied name. When this flag is + then no name is created. + @param pObject + When this is NULL then an empty string is returned, regardless + of the value of bCreate. + @param bCreate + This flag controls for objects without user supplied name + whether a name is created. When a name is created then this + name is not stored in the object. + */ + OUString GetObjectName ( + const SdrObject* pObject, + const bool bCreate = true) const; + + void CloseBookmarkDoc(); + + DECL_DLLPRIVATE_LINK(RequestingChildrenHdl, const weld::TreeIter&, bool); + DECL_DLLPRIVATE_LINK(SelectHdl, weld::TreeView&, void); + DECL_DLLPRIVATE_LINK(AsyncSelectHdl, void*, void); + DECL_DLLPRIVATE_LINK(RowActivatedHdl, weld::TreeView&, bool); + DECL_DLLPRIVATE_LINK(AsyncRowActivatedHdl, void*, void); + DECL_DLLPRIVATE_LINK(DragBeginHdl, bool&, bool); + DECL_DLLPRIVATE_LINK(KeyInputHdl, const KeyEvent&, bool); + + DECL_LINK(EditingEntryHdl, const weld::TreeIter&, bool); + typedef std::pair IterString; + DECL_LINK(EditedEntryHdl, const IterString&, bool); + DECL_LINK(EditEntryAgain, void*, void); + + DECL_LINK(CommandHdl, const CommandEvent&, bool); + + /** Determine whether the specified page belongs to the current show + which is either the standard show or a custom show. + @param pPage + Pointer to the page for which to check whether it belongs to the + show. + @return + Returns if there is no custom show or if the current + show does not contain the specified page at least once. + */ + bool PageBelongsToCurrentShow (const SdPage* pPage) const; + + bool DoDrag(); + static void OnDragFinished(); + + // DragSourceHelper + bool StartDrag(); + +public: + + SdPageObjsTLV(std::unique_ptr xTreeview); + ~SdPageObjsTLV(); + + bool IsEditingActive() const {return m_bEditing;} + + void set_sensitive(bool bSensitive) + { + m_xTreeView->set_sensitive(bSensitive); + } + + void hide() + { + m_xTreeView->hide(); + } + + void show() + { + m_xTreeView->show(); + } + + void grab_focus() + { + m_xTreeView->grab_focus(); + } + + void set_size_request(int nWidth, int nHeight) + { + m_xTreeView->set_size_request(nWidth, nHeight); + } + + float get_approximate_digit_width() const + { + return m_xTreeView->get_approximate_digit_width(); + } + + DECL_LINK(MousePressHdl, const MouseEvent&, bool); + DECL_LINK(MouseReleaseHdl, const MouseEvent&, bool); + + void Select(); + + int get_height_rows(int nRows) const + { + return m_xTreeView->get_height_rows(nRows); + } + + void set_selection_mode(SelectionMode eMode) + { + m_eSelectionMode = eMode; + m_xTreeView->set_selection_mode(eMode); + } + + SelectionMode get_selection_mode() const + { + return m_eSelectionMode; + } + + void connect_row_activated(const Link& rLink) + { + m_aRowActivatedHdl = rLink; + } + + void connect_key_press(const Link& rLink) + { + m_aKeyPressHdl = rLink; + } + + void connect_mouse_release(const Link& rLink) + { + m_aMouseReleaseHdl = rLink; + } + + void connect_popup_menu(const Link& rLink) + { + m_aPopupMenuHdl = rLink; + } + + bool HasSelectedChildren(std::u16string_view rName); + bool SelectEntry(std::u16string_view rName); + void SelectEntry(const SdrObject* pObj); + + OUString get_selected_text() const + { + return m_xTreeView->get_selected_text(); + } + + bool get_selected() const + { + return m_xTreeView->get_selected(nullptr); + } + + int count_selected_rows() const + { + return m_xTreeView->count_selected_rows(); + } + + void connect_changed(const Link& rLink) + { + m_aChangeHdl = rLink; + } + + bool is_selected(const weld::TreeIter& rIter) const + { + return m_xTreeView->is_selected(rIter); + } + + bool get_iter_first(weld::TreeIter& rIter) const + { + return m_xTreeView->get_iter_first(rIter); + } + + weld::TreeView& get_treeview() + { + return *m_xTreeView; + } + + std::unique_ptr make_iterator() + { + return m_xTreeView->make_iterator(); + } + + bool get_visible() const + { + return m_xTreeView->get_visible(); + } + + void unselect_all() + { + m_xTreeView->unselect_all(); + } + + OUString get_cursor_text() const + { + std::unique_ptr xIter(m_xTreeView->make_iterator()); + if (m_xTreeView->get_cursor(xIter.get())) + return m_xTreeView->get_text(*xIter); + return OUString(); + } + + OUString get_cursor_id() const + { + std::unique_ptr xIter(m_xTreeView->make_iterator()); + if (m_xTreeView->get_cursor(xIter.get())) + return m_xTreeView->get_id(*xIter); + return OUString(); + } + + void SetViewFrame(const SfxViewFrame* pViewFrame); + + void Fill(const SdDrawDocument*, bool bAllPages, const OUString& rDocName); + void Fill(const SdDrawDocument*, SfxMedium* pSfxMedium, const OUString& rDocName); + + void SetShowAllShapes (const bool bShowAllShapes, const bool bFill); + bool GetShowAllShapes() const { return m_bShowAllShapes; } + + void SetOrderFrontToBack (const bool bOrderFrontToBack); + bool GetOrderFrontToBack() const { return m_bOrderFrontToBack; } + + bool IsNavigationGrabsFocus() const { return m_bNavigationGrabsFocus; } + bool IsEqualToDoc(const SdDrawDocument* pInDoc); + /// Visits rList recursively and tries to advance rEntry accordingly. + bool IsEqualToShapeList(std::unique_ptr& rEntry, const SdrObjList& rList, + std::u16string_view rListName); + + static bool IsInDrag(); + + /** Return the view shell that is linked to the given doc shell. + Call this method when the there is a chance that the doc shell + has been disconnected from the view shell (but not the other + way round.) + @return + May return when the link between view shell and + doc shell has been severed. + */ + static ::sd::ViewShell* GetViewShellForDocShell (::sd::DrawDocShell &rDocShell); + + /** Add one list box entry for the parent of the given shapes and one child entry for + each of the given shapes. + @param rList + The container of shapes that are to be inserted. + @param pShape + The parent shape or NULL when the parent is a page. + @param rsName + The name to be displayed for the new parent node. + @param bIsExcluded + Some pages can be excluded (from the show?). + @param pParentEntry + The parent entry of the new parent entry. + */ + void AddShapeList ( + const SdrObjList& rList, + const SdrObject* pShape, + const OUString& rsName, + const bool bIsExcluded, + const weld::TreeIter* pParentEntry); + + /** Add the given object to a transferable object so that the object can + be dragged and dropped without having a name. + */ + void AddShapeToTransferable ( + SdTransferable& rTransferable, + const SdrObject& rObject) const; + + /** return selected entries + nDepth == 0 -> pages + nDepth == 1 -> objects */ + + std::vector GetSelectEntryList(const int nDepth) const; + + std::vector GetSelectedEntryIds() const; + + SdDrawDocument* GetBookmarkDoc(SfxMedium* pMedium = nullptr); + + bool IsLinkableSelected() const { return m_bLinkableSelected; } + + void InsertEntry(const OUString &rName, const OUString &rExpander) + { + m_xTreeView->insert(nullptr, -1, &rName, nullptr, nullptr, nullptr, false, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, rExpander); + } + + void InsertEntry(const weld::TreeIter* pParent, const OUString& rId, const OUString &rName, const OUString &rExpander, weld::TreeIter* pEntry = nullptr) + { + if (pParent) + m_xTreeView->insert(pParent, m_bOrderFrontToBack ? 0 : -1, &rName, &rId, nullptr, + nullptr, false, m_xScratchIter.get()); + else + // always append page/slide entry + m_xTreeView->insert(nullptr, -1, &rName, &rId, nullptr, nullptr, false, m_xScratchIter.get()); + m_xTreeView->set_image(*m_xScratchIter, rExpander); + if (pEntry) + m_xTreeView->copy_iterator(*m_xScratchIter, *pEntry); + } + + //Mark Current Entry + void SetSdNavigator(SdNavigatorWin* pNavigator); + + void clear() + { + m_xTreeView->clear(); + } + + // nested class to implement the TransferableHelper + class SAL_DLLPRIVATE SdPageObjsTransferable final : public SdTransferable + { + public: + SdPageObjsTransferable( + INetBookmark aBookmark, + ::sd::DrawDocShell& rDocShell, + NavigatorDragType eDragType ); + ::sd::DrawDocShell& GetDocShell() const { return mrDocShell;} + NavigatorDragType GetDragType() const { return meDragType;} + + static SdPageObjsTransferable* getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) noexcept; + /** Return a temporary transferable data flavor that is used + internally in the navigator for reordering entries. Its + lifetime ends with the office application. + */ + static SotClipboardFormatId GetListBoxDropFormatId(); + + private: + /** Temporary drop flavor id that is used internally in the + navigator. + */ + static SotClipboardFormatId mnListBoxDropFormatId; + + INetBookmark const maBookmark; + ::sd::DrawDocShell& mrDocShell; + NavigatorDragType const meDragType; + virtual ~SdPageObjsTransferable() override; + + virtual void AddSupportedFormats() override; + virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override; + virtual void DragFinished( sal_Int8 nDropAction ) override; + }; + + friend class SdPageObjsTLV::SdPageObjsTransferable; + +private: + rtl::Reference m_xHelper; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/sdundogr.hxx b/sd/source/ui/inc/sdundogr.hxx new file mode 100644 index 0000000000..466182faf4 --- /dev/null +++ b/sd/source/ui/inc/sdundogr.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include + +class SD_DLLPUBLIC SdUndoGroup final : public SdUndoAction +{ + std::vector> aCtn; +public: + SdUndoGroup(SdDrawDocument* pSdDrawDocument) + : SdUndoAction(pSdDrawDocument) + {} + virtual ~SdUndoGroup() override; + + virtual bool Merge( SfxUndoAction* pNextAction ) override; + + virtual void Undo() override; + virtual void Redo() override; + + void AddAction(SdUndoAction* pAction); + +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/sdxfer.hxx b/sd/source/ui/inc/sdxfer.hxx new file mode 100644 index 0000000000..d6d382870d --- /dev/null +++ b/sd/source/ui/inc/sdxfer.hxx @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +// SdTransferable +class SdDrawDocument; +class SdrObject; +class ImageMap; +class VirtualDevice; + +namespace sd { +class DrawDocShell; +class View; +} + +class SAL_DLLPUBLIC_RTTI SdTransferable : public TransferDataContainer, public SfxListener +{ +public: + + SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, bool bInitOnGetData ); + virtual ~SdTransferable() override; + + void SetDocShell( const SfxObjectShellRef& rRef ) { maDocShellRef = rRef; } + const SfxObjectShellRef& GetDocShell() const { return maDocShellRef; } + + void SetWorkDocument( const SdDrawDocument* pWorkDoc ) { mpSdDrawDocument = mpSdDrawDocumentIntern = const_cast(pWorkDoc); } + const SdDrawDocument* GetWorkDocument() const { return mpSdDrawDocument; } + + void SetView(const ::sd::View* pView); + const ::sd::View* GetView() const { return mpSdView; } + + void SetObjectDescriptor( std::unique_ptr pObjDesc ); + + void SetStartPos( const Point& rStartPos ) { maStartPos = rStartPos; } + const Point& GetStartPos() const { return maStartPos; } + + void SetInternalMove( bool bSet ) { mbInternalMove = bSet; } + bool IsInternalMove() const { return mbInternalMove; } + + bool HasSourceDoc( const SdDrawDocument* pDoc ) const { return( mpSourceDoc == pDoc ); } + + void SetPageBookmarks( std::vector&& rPageBookmarks, bool bPersistent ); + bool IsPageTransferable() const { return mbPageTransferable; } + bool HasPageBookmarks() const { return( mpPageDocShell && ( !maPageBookmarks.empty() ) ); } + const std::vector& GetPageBookmarks() const { return maPageBookmarks; } + ::sd::DrawDocShell* GetPageDocShell() const { return mpPageDocShell; } + + bool SetTableRTF( SdDrawDocument* ); + + static SdTransferable* getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) noexcept; + + // SfxListener + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + virtual void DragFinished( sal_Int8 nDropAction ) override; + SdDrawDocument* GetSourceDoc() const { return mpSourceDoc;} + + /** User data objects can be used to store information temporarily + at the transferable. The slide sorter uses this to store + previews of the slides that are referenced by the + transferable. + */ + class UserData {public:virtual~UserData(){}}; + + /** Add a user data object. When it was added before (and not + removed) then this call is ignored. + */ + void AddUserData (const std::shared_ptr& rpData); + + /** Return the number of user data objects. + */ + sal_Int32 GetUserDataCount() const; + + /** Return the specified user data object. When the index is not + valid, ie not in the range [0,count) then an empty pointer is + returned. + */ + std::shared_ptr GetUserData (const sal_Int32 nIndex) const; + +protected: + + virtual void AddSupportedFormats() override; + virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override; + virtual bool WriteObject( tools::SvRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const css::datatransfer::DataFlavor& rFlavor ) override; + virtual void ObjectReleased() override final; + +private: + + SfxObjectShellRef maDocShellRef; + ::sd::DrawDocShell* mpPageDocShell; + std::vector maPageBookmarks; + std::unique_ptr mpOLEDataHelper; + std::unique_ptr mpObjDesc; + const ::sd::View* mpSdView; + ::sd::View* mpSdViewIntern; + SdDrawDocument* mpSdDrawDocument; + SdDrawDocument* mpSdDrawDocumentIntern; + SdDrawDocument* mpSourceDoc; + VclPtr mpVDev; + std::optional moBookmark; + std::optional moGraphic; + std::unique_ptr mpImageMap; + ::tools::Rectangle maVisArea; + Point maStartPos; + bool mbInternalMove : 1; + bool mbOwnDocument : 1; + bool mbOwnView : 1; + bool mbLateInit : 1; + bool mbPageTransferable : 1; + bool mbPageTransferablePersistent : 1; + ::std::vector > maUserData; + + SdTransferable( const SdTransferable& ) = delete; + SdTransferable& operator=( const SdTransferable& ) = delete; + + void CreateObjectReplacement( SdrObject* pObj ); + void CreateData(); + +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/slideshow.hxx b/sd/source/ui/inc/slideshow.hxx new file mode 100644 index 0000000000..afbfee6846 --- /dev/null +++ b/sd/source/ui/inc/slideshow.hxx @@ -0,0 +1,216 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +#include + +#include + +#include + +#include +#include + +namespace com::sun::star { + namespace drawing { + class XDrawPage; + } + namespace animations { + class XAnimationNode; + } +} +class SdDrawDocument; +class KeyEvent; +class OutputDevice; +class Size; +namespace vcl { class Window; } +class SfxRequest; +class WorkWindow; +class CommandGestureSwipeData; +class CommandGestureLongPressData; +struct ImplSVEvent; + +// TODO: Remove +#define PAGE_NO_END 65535 + +/* Definition of SlideShow class */ + +namespace sd +{ + +class SlideshowImpl; +class View; +class ViewShell; +class ViewShellBase; +struct PresentationSettingsEx; +class FrameView; + +enum AnimationMode +{ + ANIMATIONMODE_SHOW, + ANIMATIONMODE_PREVIEW +}; + +typedef comphelper::WeakComponentImplHelper< css::presentation::XPresentation2, css::lang::XServiceInfo > SlideshowBase; + +class SlideShow final : public SlideshowBase +{ +public: + /// used by the model to create a slideshow for it + static rtl::Reference< SlideShow > Create( SdDrawDocument* pDoc ); + + // static helper api + static rtl::Reference< SlideShow > GetSlideShow( SdDrawDocument const * pDocument ); + static rtl::Reference< SlideShow > GetSlideShow( SdDrawDocument const & rDocument ); + static rtl::Reference< SlideShow > GetSlideShow( ViewShellBase const & rBase ); + + static css::uno::Reference< css::presentation::XSlideShowController > GetSlideShowController(ViewShellBase const & rBase ); + + static bool StartPreview( ViewShellBase const & rBase, + const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage, + const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode ); + + static void Stop( ViewShellBase const & rBase ); + + /// returns true if there is a running presentation for the given ViewShellBase + static bool IsRunning( ViewShellBase const & rBase ); + + /// returns true if there is a running presentation inside the given ViewShell + /// returns false even if there is a running presentation but in another ViewShell + static bool IsRunning( const ViewShell& rViewShell ); + + // helper api + + void startPreview( + const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage, + const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode ); + + // uno api + + virtual void disposing(std::unique_lock&) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // XPresentation + virtual void SAL_CALL start( ) override; + virtual void SAL_CALL end() override; + virtual void SAL_CALL rehearseTimings( ) override; + + // XPresentation2 + virtual void SAL_CALL startWithArguments(const css::uno::Sequence< css::beans::PropertyValue >& Arguments) override; + virtual sal_Bool SAL_CALL isRunning( ) override; + virtual css::uno::Reference< css::presentation::XSlideShowController > SAL_CALL getController( ) override; + + // legacy api + + // actions + void jumpToPageNumber( sal_Int32 nPage ); // a.k.a. FuSlideShow::JumpToPage() + void jumpToPageIndex( sal_Int32 nIndex ); + void jumpToBookmark( const OUString& sBookmark ); // a.k.a. FuSlideShow::JumpToBookmark() + + /** sets or clears the pause state of the running slideshow. + !!!! This should only be called by the SdShowWindow !!!!*/ + void pause( bool bPause ); + bool swipe(const CommandGestureSwipeData &rSwipeData); + bool longpress(const CommandGestureLongPressData& rLongPressData); + + // settings + bool isFullScreen() const; // a.k.a. FuSlideShow::IsFullScreen() + OutputDevice* getShowWindow(); // a.k.a. FuSlideShow::GetShowWindow() + int getAnimationMode() const; // a.k.a. FuSlideShow::GetAnimationMode() + sal_Int32 getCurrentPageNumber() const; // a.k.a. FuSlideShow::GetCurrentPage() + + // events + void resize( const Size &rSize ); + // return false if the activate failed. callers should call end in response to failure + bool activate(ViewShellBase& rBase); + void deactivate(); + void paint(); + + bool keyInput(const KeyEvent& rKEvt); + + bool dependsOn( ViewShellBase const * pViewShellBase ); + + static sal_Int32 GetDisplay(); + + bool IsExitAfterPresenting() const; + void SetExitAfterPresenting(bool bExit); + +private: + SlideShow( SdDrawDocument* pDoc ); + + DECL_LINK( StartInPlacePresentationConfigurationHdl, void *, void ); + void StartInPlacePresentationConfigurationCallback(); + + void StartInPlacePresentation(); + void StartFullscreenPresentation(); + + /// @throws css::uno::RuntimeException + void ThrowIfDisposed() const; + + void CreateController( ViewShell* pViewSh, ::sd::View* pView, vcl::Window* pParentWindow ); + WorkWindow *GetWorkWindow(); + + SlideShow(const SlideShow&) = delete; + SlideShow& operator=( const SlideShow& ) = delete; + + SvxItemPropertySet maPropSet; + + rtl::Reference< SlideshowImpl > mxController; + /** This flag is used together with mxController.is() to prevent + multiple instances of the slide show for one document. The flag + covers the time before mxController is set. + */ + bool mbIsInStartup; + SdDrawDocument* mpDoc; + + std::shared_ptr< PresentationSettingsEx > mxCurrentSettings; + + ViewShellBase* mpCurrentViewShellBase; + ViewShellBase* mpFullScreenViewShellBase; + FrameView* mpFullScreenFrameView; + ImplSVEvent * mnInPlaceConfigEvent; +}; + +namespace slideshowhelp +{ + SD_DLLPUBLIC void ShowSlideShow(SfxRequest const& rReq, SdDrawDocument& rDoc); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/smarttag.hxx b/sd/source/ui/inc/smarttag.hxx new file mode 100644 index 0000000000..2157abb130 --- /dev/null +++ b/sd/source/ui/inc/smarttag.hxx @@ -0,0 +1,170 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +class KeyEvent; +class MouseEvent; + +namespace sd +{ +class View; +class SmartHdl; + +/** a smart tag represents a visual user interface element on the documents edit view + that is not part of the document. It uses derivations from SmartHdl for its visuals. + A SmartTag adds himself to the given view if created. It removes himself if it + is disposed before the view is disposed. + + Derive from this class to implement your own smart tag. +*/ +class SmartTag : public SimpleReferenceComponent +{ + friend class SmartTagSet; + +public: + explicit SmartTag(::sd::View& rView); + virtual ~SmartTag() override; + + /** returns true if the SmartTag consumes this event. */ + virtual bool MouseButtonDown(const MouseEvent&, SmartHdl&); + + /** returns true if the SmartTag consumes this event. */ + virtual bool KeyInput(const KeyEvent& rKEvt); + + /** returns true if the SmartTag consumes this event. */ + virtual bool Command(const CommandEvent& rCEvt); + + /** returns true if this smart tag is currently selected */ + bool isSelected() const { return mbSelected; } + + ::sd::View& getView() const { return mrView; } + +protected: + virtual sal_Int32 GetMarkablePointCount() const; + virtual sal_Int32 GetMarkedPointCount() const; + virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark); + virtual void CheckPossibilities(); + virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark); + + virtual void addCustomHandles(SdrHdlList& rHandlerList); + virtual void select(); + virtual void deselect(); + virtual bool getContext(SdrViewContext& rContext); + + virtual void disposing() override; + + ::sd::View& mrView; + bool mbSelected; + +private: + SmartTag(const SmartTag&) = delete; + SmartTag& operator=(const SmartTag&) = delete; +}; + +typedef rtl::Reference SmartTagReference; + +/** class to administrate the available smart tags for a single view. */ +class SmartTagSet +{ + friend class SmartTag; + +public: + explicit SmartTagSet(::sd::View& rView); + ~SmartTagSet(); + + /** selects the given smart tag and updates all handles */ + void select(const SmartTagReference& xTag); + + /** deselects the current selected smart tag and updates all handles */ + void deselect(); + + /** returns the currently selected tag or an empty reference. */ + const SmartTagReference& getSelected() const { return mxSelectedTag; } + + /** returns true if a SmartTag consumes this event. */ + bool MouseButtonDown(const MouseEvent&); + + /** returns true if a SmartTag consumes this event. */ + bool KeyInput(const KeyEvent& rKEvt); + + /** returns true if a SmartTag consumes this event. */ + bool Command(const CommandEvent& rCEvt); + + /** disposes all smart tags and clears the set */ + void Dispose(); + + /** adds the handles from all smart tags to the given list */ + void addCustomHandles(SdrHdlList& rHandlerList); + + /** returns true if the currently selected smart tag has + a special context, returned in rContext. */ + bool getContext(SdrViewContext& rContext) const; + + // support point editing + bool HasMarkablePoints() const; + sal_uLong GetMarkablePointCount() const; + bool HasMarkedPoints() const; + sal_uLong GetMarkedPointCount() const; + bool MarkPoint(SdrHdl& rHdl, bool bUnmark); + bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark); + + void CheckPossibilities(); + +private: + SmartTagSet(const SmartTagSet&) = delete; + SmartTagSet& operator=(const SmartTagSet&) = delete; + + /** adds a new smart tag to this set */ + void add(const SmartTagReference& xTag); + + /** removes the given smart tag from this set */ + void remove(const SmartTagReference& xTag); + + std::set maSet; + + ::sd::View& mrView; + SmartTagReference mxSelectedTag; + SmartTagReference mxMouseOverTag; +}; + +/** a derivation from this handle is the visual representation for a smart tag. + One smart tag can have more than one handle. +*/ +class SmartHdl : public SdrHdl +{ +public: + SmartHdl(SmartTagReference xTag, SdrObject* pObject, const Point& rPnt, SdrHdlKind eNewKind); + SmartHdl(SmartTagReference xTag, const Point& rPnt, SdrHdlKind eNewKind); + + const SmartTagReference& getTag() const { return mxSmartTag; } + +private: + SmartTagReference mxSmartTag; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tablefunction.hxx b/sd/source/ui/inc/tablefunction.hxx new file mode 100644 index 0000000000..fe32f16b51 --- /dev/null +++ b/sd/source/ui/inc/tablefunction.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +namespace sd +{ +void CreateTableFromRTF(SvStream& rStream, SdDrawDocument* pModel); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tabtempl.hxx b/sd/source/ui/inc/tabtempl.hxx new file mode 100644 index 0000000000..4e24fb9929 --- /dev/null +++ b/sd/source/ui/inc/tabtempl.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class SdrModel; +class SfxObjectShell; +class SdrView; + +/** + * Template-Tab-Dialog + */ +class SdTabTemplateDlg final : public SfxStyleDialogController +{ +private: + const SfxObjectShell& rDocShell; + SdrView* pSdrView; + + XColorListRef pColorList; + XGradientListRef pGradientList; + XHatchListRef pHatchingList; + XBitmapListRef pBitmapList; + XPatternListRef pPatternList; + XDashListRef pDashList; + XLineEndListRef pLineEndList; + + virtual void PageCreated(const OUString& rId, SfxTabPage &rPage) override; + virtual void RefreshInputSet() override; + +public: + SdTabTemplateDlg(weld::Window* pParent, + const SfxObjectShell* pDocShell, + SfxStyleSheetBase& rStyleBase, + SdrModel const * pModel, + SdrView* pView); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/titledockwin.hxx b/sd/source/ui/inc/titledockwin.hxx new file mode 100644 index 0000000000..5a880e2687 --- /dev/null +++ b/sd/source/ui/inc/titledockwin.hxx @@ -0,0 +1,116 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class ToolBox; + +namespace sd +{ + class TitledDockingWindow final : public SfxDockingWindow + { + public: + /** Create a new docking window. + @param pBindings + Used, among others, to determine the ViewShellBase and + PaneManager that manage the new docking window. + @param pChildWindow + This child window is the logical container for the new docking + window. + @param pParent + The parent window of the new docking window. + @param rsTitle + the initial title + */ + TitledDockingWindow( + SfxBindings* i_pBindings, + SfxChildWindow* i_pChildWindow, + vcl::Window* i_pParent, + const OUString& rsTitle + ); + + virtual ~TitledDockingWindow() override; + virtual void dispose() override; + + /** returns the content window, which is to be used as parent window for any content to be displayed + in the docking window. + */ + vcl::Window& GetContentWindow() { return *m_aContentWindow; } + const vcl::Window& GetContentWindow() const { return *m_aContentWindow; } + + /** Return the border that is painted around the inner window as + decoration. + */ + const SvBorder& GetDecorationBorder() const { return m_aBorder; } + + /** When docked the given range is passed to the parent SplitWindow. + */ + void SetValidSizeRange (const Range& rValidSizeRange); + + enum Orientation { HorizontalOrientation, VerticalOrientation, UnknownOrientation }; + /** When the TitledDockingWindow is docked and managed by a split window + it can derive its orientation from the orientation of the split + window and return either HorizontalOrientation or + VerticalOrientation. + Otherwise UnknownOrientation is returned. + */ + Orientation GetOrientation() const; + + void SetTitle(const OUString& i_rText); + + private: + // Window overridables + virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& i_rArea) override; + virtual void Resize() override; + virtual void StateChanged( StateChangedType i_nType ) override; + virtual void DataChanged( const DataChangedEvent& i_rDataChangedEvent ) override; + virtual void SetText( const OUString& i_rText ) override; + virtual void MouseButtonDown (const MouseEvent& rEvent) override; + virtual void ApplySettings(vcl::RenderContext& rRenderContext) override; + /** internal version of ResetToolBox + */ + void impl_resetToolBox(); + + DECL_LINK(OnToolboxItemSelected, ToolBox*, void); + + void impl_layout(); + + OUString m_sTitle; + VclPtr m_aToolbox; + VclPtr m_aContentWindow; + + /** The border that is painted around the inner window. The bevel + shadow lines are part of the border, so where the border is 0 no + such line is painted. + */ + SvBorder m_aBorder; + + /** Height of the title bar. Calculated in impl_layout(). + */ + int m_nTitleBarHeight; + + }; + +} // namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tmplctrl.hxx b/sd/source/ui/inc/tmplctrl.hxx new file mode 100644 index 0000000000..bdf6eed86d --- /dev/null +++ b/sd/source/ui/inc/tmplctrl.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +class SdTemplateControl final : public SfxStatusBarControl +{ +public: + SdTemplateControl( sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb ); + virtual ~SdTemplateControl() override; + + virtual void StateChangedAtStatusBarControl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) override; + virtual void Paint( const UserDrawEvent& rEvt ) override; + + SFX_DECL_STATUSBAR_CONTROL(); + +private: + virtual void Command( const CommandEvent& rCEvt ) override; + + OUString msTemplate; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/AsynchronousCall.hxx b/sd/source/ui/inc/tools/AsynchronousCall.hxx new file mode 100644 index 0000000000..fa4c180207 --- /dev/null +++ b/sd/source/ui/inc/tools/AsynchronousCall.hxx @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +namespace sd::tools +{ +/** Store a function object and execute it asynchronous. + + The features of this class are: + a) It provides a wrapper around a VCL Timer so that generic function + objects can be used. + b) When more than one function objects are posted to be executed later + then the pending ones are erased and only the last one will actually be + executed. + + Use this class like this: + aInstanceOfAsynchronousCall.Post( + ::std::bind( + ::std::mem_fun(&DrawViewShell::SwitchPage), + pDrawViewShell, + 11)); +*/ +class AsynchronousCall +{ +public: + /** Create a new asynchronous call. Each object of this class processes + one (semantical) type of call. + */ + AsynchronousCall(); + + ~AsynchronousCall(); + + /** Post a function object that is to be executed asynchronously. When + this method is called while the current function object has not been + executed then the latter is destroyed and only the given function + object will be executed. + @param rFunction + The function object that may be called asynchronously in the + near future. + */ + typedef ::std::function AsynchronousFunction; + void Post(const AsynchronousFunction& rFunction); + +private: + Timer maTimer; + /** The function object that will be executed when the TimerCallback + function is called the next time. This pointer may be NULL. + */ + ::std::unique_ptr mpFunction; + DECL_LINK(TimerCallback, Timer*, void); +}; + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/AsynchronousTask.hxx b/sd/source/ui/inc/tools/AsynchronousTask.hxx new file mode 100644 index 0000000000..6964234392 --- /dev/null +++ b/sd/source/ui/inc/tools/AsynchronousTask.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +namespace sd::tools +{ +/** Interface for the asynchronous execution of a task. This interface + allows a controller to run the task either timer based with a fixed + amount of time between the steps or thread based one step right after + the other. +*/ +class AsynchronousTask +{ +public: + /** Run the next step of the task. After HasNextStep() returns false + this method should ignore further calls. + */ + virtual void RunNextStep() = 0; + + /** Return when there is at least one more step to execute. + When the task has been executed completely then is + returned. + */ + virtual bool HasNextStep() = 0; + +protected: + ~AsynchronousTask() {} +}; + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/ConfigurationAccess.hxx b/sd/source/ui/inc/tools/ConfigurationAccess.hxx new file mode 100644 index 0000000000..97b5e92dc0 --- /dev/null +++ b/sd/source/ui/inc/tools/ConfigurationAccess.hxx @@ -0,0 +1,106 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include + +namespace com::sun::star::container { class XHierarchicalNameAccess; } +namespace com::sun::star::container { class XNameAccess; } +namespace com::sun::star::lang { class XMultiServiceFactory; } +namespace com::sun::star::uno { class XComponentContext; } + +namespace sd::tools { + +/** This class gives access to the configuration. Create an object of this + class for one node of the configuration. This will be the root node. + Its children are then accessible through the new ConfigurationAccess + object. +*/ +class ConfigurationAccess +{ +public: + enum WriteMode { READ_WRITE, READ_ONLY }; + + /** Create a new object to access the configuration entries below the + given root. + @param rsRootName + Name of the root. + @param eMode + This flag specifies whether to give read-write or read-only + access. + */ + ConfigurationAccess( + const OUString& rsRootName, + const WriteMode eMode); + + /** Return a configuration node below the root of the called object. + @param rsPathToNode + The relative path from the root (as given the constructor) to + the node. + @return + The type of the returned node varies with the requested node. + It is empty when the node was not found. + */ + css::uno::Any GetConfigurationNode ( + const OUString& rsPathToNode); + + /** Return a configuration node below the given node. + @param rxNode + The node that acts as root to the given relative path. + @param rsPathToNode + The relative path from the given node to the requested node. + @return + The type of the returned node varies with the requested node. + It is empty when the node was not found. + */ + static css::uno::Any GetConfigurationNode ( + const css::uno::Reference& rxNode, + const OUString& rsPathToNode); + + /** Write any changes that have been made back to the configuration. + This call is ignored when the called ConfigurationAccess object was + not create with read-write mode. + */ + void CommitChanges(); + + /** This functor is typically called for every item in a set. Its two + parameters are the name of key item (often of no further interest) + and the value of the item. + */ + typedef ::std::function&) > Functor; + +private: + css::uno::Reference mxRoot; + + void Initialize ( + const css::uno::Reference& rxProvider, + const OUString& rsRootName, + const WriteMode eMode); +}; + +} // end of namespace sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/GraphicSizeCheck.hxx b/sd/source/ui/inc/tools/GraphicSizeCheck.hxx new file mode 100644 index 0000000000..44f78e4eb1 --- /dev/null +++ b/sd/source/ui/inc/tools/GraphicSizeCheck.hxx @@ -0,0 +1,116 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#pragma once + +#include +#include +#include +#include + +namespace sd +{ +/** + * Class responsible to check if a graphic object violates the size + * constraints and store the results. + */ +class GraphicSizeViolation final +{ +private: + SdrGrafObj* m_pGraphicObject; + + sal_Int32 m_nLowDPILimit = 0; + sal_Int32 m_nHighDPILimit = 0; + + sal_Int32 m_nDPIX = 0; + sal_Int32 m_nDPIY = 0; + +public: + GraphicSizeViolation(sal_Int32 nDPI, SdrGrafObj* pGraphicObject); + bool check(); + + const OUString& getGraphicName(); + + SdrGrafObj* getObject() const { return m_pGraphicObject; } + + bool isDPITooLow() { return m_nDPIX < m_nLowDPILimit || m_nDPIY < m_nLowDPILimit; } + + bool isDPITooHigh() { return m_nDPIX > m_nHighDPILimit || m_nDPIY > m_nHighDPILimit; } + + sal_Int32 getDPIX() { return m_nDPIX; } + + sal_Int32 getDPIY() { return m_nDPIY; } +}; + +/** + * Run the graphic size checks for all the graphic objects in the DOM + * and store a list of violations. + */ +class GraphicSizeCheck final +{ +private: + SdDrawDocument* m_pDocument; + std::vector> m_aGraphicSizeViolationList; + +public: + GraphicSizeCheck(SdDrawDocument* pDocument) + : m_pDocument(pDocument) + { + } + + void check(); + + std::vector>& getViolationList() + { + return m_aGraphicSizeViolationList; + } +}; + +/** The UI part of the GraphicSizeViolation used by GenericCheckDialog */ +class GraphicSizeCheckGUIEntry : public svx::CheckData +{ +private: + SdDrawDocument* m_pDocument; + std::unique_ptr m_pViolation; + +public: + GraphicSizeCheckGUIEntry(SdDrawDocument* pDocument, + std::unique_ptr&& pViolation) + : m_pDocument(pDocument) + , m_pViolation(std::move(pViolation)) + { + } + + OUString getText() override; + + bool canMarkObject() override { return true; } + + void markObject() override; + + bool hasProperties() override { return true; } + + void runProperties() override; +}; + +/** + * The UI part presenting the graphic size check results, which is + * used by GenericCheckDialog + */ +class GraphicSizeCheckGUIResult : public svx::CheckDataCollection +{ +public: + GraphicSizeCheckGUIResult(SdDrawDocument* m_pDocument); + + OUString getTitle() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/IconCache.hxx b/sd/source/ui/inc/tools/IconCache.hxx new file mode 100644 index 0000000000..fef994764f --- /dev/null +++ b/sd/source/ui/inc/tools/IconCache.hxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd +{ +/** This simple class stores frequently used icons so that the classes that + use the icons do not have to store them in every one of their + instances. + + Icons are addressed over their resource id and are loaded on demand. + + This cache acts like a singleton with a lifetime equal to that of the sd + module. +*/ +class IconCache final : public SdGlobalResource +{ +public: + /** The lifetime of the returned reference is limited to that of the sd + module. + */ + static IconCache& Instance(); + + /** Return the icon with the given resource id. + @return + The returned Image may be empty when there is no icon for the + given id or an error occurred. Should not happen under normal + circumstances. + */ + Image GetIcon(const OUString& rResourceId); + +private: + class Implementation; + ::std::unique_ptr mpImpl; + + /** The constructor creates the one instance of the cache and registers + it at the SdGlobalResourceContainer to limit is lifetime to that of + the sd module. + */ + IconCache(); + + /** This destructor is called by SdGlobalResourceContainer. + */ + virtual ~IconCache() override; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/IdleDetection.hxx b/sd/source/ui/inc/tools/IdleDetection.hxx new file mode 100644 index 0000000000..decf5ff262 --- /dev/null +++ b/sd/source/ui/inc/tools/IdleDetection.hxx @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace vcl { class Window; } + +namespace sd::tools { + enum class IdleState { + /** When GetIdleState() returns this value, then the system is idle. + */ + Idle = 0x0000, + + /** There are system event pending. + */ + SystemEventPending = 0x0001, + + /** A full screen slide show is running and is active. In contrast + there may be a full screen show be running in an inactive window, + i.e. in the background. + */ + FullScreenShowActive = 0x0002, + + /** A slide show is running in a window. + */ + WindowShowActive = 0x0004, + + /** A window is being painted. + */ + WindowPainting = 0x0008, + }; +} // end of namespace ::sd::tools +namespace o3tl { + template<> struct typed_flags<::sd::tools::IdleState> : is_typed_flags<::sd::tools::IdleState, 0x0f> {}; +} + +namespace sd::tools { + +/** Detect whether the system is idle and some time consuming operation may + be carried out. This class distinguishes between different states of + idle-ness. +*/ +class IdleDetection +{ +public: + /** Determine whether the system is idle. + @param pWindow + When a valid Window pointer is given then it is checked + whether the window is currently being painting. + @return + This method either returns IdleState::Idle or a combination of + IdleStates values or-ed together that describe what the system + is currently doing so that the caller can decide what to do. + */ + static IdleState GetIdleState (const vcl::Window* pWindow); + +private: + /** Check whether there are input events pending. + */ + static IdleState CheckInputPending(); + + /** Check whether a slide show is running full screen or in a window. + */ + static IdleState CheckSlideShowRunning(); + + static IdleState CheckWindowPainting (const vcl::Window& rWindow); +}; + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx b/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx new file mode 100644 index 0000000000..a582ffa72e --- /dev/null +++ b/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::uno +{ +template class Reference; +} +namespace com::sun::star::uno +{ +class XInterface; +} + +namespace sd +{ +class SdGlobalResource +{ +public: + virtual ~SdGlobalResource() COVERITY_NOEXCEPT_FALSE{}; +}; + +/** The purpose of this container is to hold references to resources that + are globally available to all interested objects and to destroy them + when the sd module is destroyed. Examples for resources can be + containers of bitmaps or the container of master pages used by the + MasterPagesSelector objects in the task panel. + + It works like a singleton in that there is one instance per sd module. + Resources can be added (by themselves or their owners) to the + container. The main task of the container is the destruction of all + resources that have been added to it. + + As you may note, there is no method to get a resource from the + container. It is the task of the resource to provide other means of + access to it. + + The reason for this design is not to have to change the SdModule + destructor every time when there is a new resource. This is done by + reversing the dependency between module and resource: the resource knows + about the module--this container class to be more precisely--and tells + it to destroy the resource when the sd module is at the end of its + lifetime. +*/ +class SdGlobalResourceContainer final +{ +public: + static SdGlobalResourceContainer& Instance(); + + /** Add a resource to the container. The ownership of the resource is + transferred to the container. The resource is destroyed when the + container is destroyed, i.e. when the sd module is destroyed. + + When in doubt, use the shared_ptr variant of this method. + */ + void AddResource(::std::unique_ptr pResource); + + /** Add a resource to the container. By using a shared_ptr and + releasing it only when the SgGlobalResourceContainer is destroyed + the given resource is kept alive at least that long. When at the + time of the destruction of SgGlobalResourceContainer no other + references exist the resource is destroyed as well. + */ + void AddResource(const std::shared_ptr& pResource); + + /** Add a resource that is implemented as UNO object. Destruction + (when the sd modules is unloaded) is done by a) calling dispose() + when the XComponent is supported and by b) releasing the reference. + */ + void AddResource(const css::uno::Reference& rxResource); + +private: + friend class SdGlobalResourceContainerInstance; + friend struct o3tl::default_delete; + + class Implementation; + ::std::unique_ptr mpImpl; + + SdGlobalResourceContainer(); + ~SdGlobalResourceContainer(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/SlotStateListener.hxx b/sd/source/ui/inc/tools/SlotStateListener.hxx new file mode 100644 index 0000000000..54a2e463d3 --- /dev/null +++ b/sd/source/ui/inc/tools/SlotStateListener.hxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::frame { class XDispatch; } +namespace com::sun::star::frame { class XDispatchProvider; } +namespace com::sun::star::frame { class XStatusListener; } +namespace com::sun::star::frame { struct FeatureStateEvent; } + +namespace sd::tools { + +typedef comphelper::WeakComponentImplHelper< + css::frame::XStatusListener + > SlotStateListenerInterfaceBase; + +/** Listen for state changes of slots. This class has been created in order + to be informed when the support for vertical writing changes but it can + be used to relay state changes of other slots as well. +*/ +class SlotStateListener final + : public SlotStateListenerInterfaceBase +{ +public: + /** This convenience version of the constructor takes all parameters + that are necessary to observe a single slot. See descriptions of + the SetCallback(), ConnectToFrame(), and ObserveSlot() methods for + explanations about the parameters. + */ + SlotStateListener ( + Link const & rCallback, + const css::uno::Reference& rxDispatchProvider, + const OUString& rSlotName); + + /** The constructor de-registers all remaining listeners. Usually a prior + dispose() call should have done that already. + */ + virtual ~SlotStateListener() override; + + /** Set the callback to the given value. Whenever one of the observed + slots changes its state this callback is informed about it. + Changing the callback does not release the listeners. + @throws DisposedException + */ + void SetCallback (const Link& rCallback); + + /** Set the frame whose slots shall be observed. When an object of this + class is already observing slots of another frame then these + listeners are released first. + @throws DisposedException + */ + void ConnectToDispatchProvider ( + const css::uno::Reference& rxDispatchProvider); + + /** Observe the slot specified by the given name. Note that + ConnectToFrame() has to have been called earlier. + @param rSlotName + The name of the slot to observe. An example is + ".uno:VerticalTextState". + @throws DisposedException + */ + void ObserveSlot (const OUString& rSlotName); + + //===== frame::XStatusListener ========================================== + + /** Called by slot state change broadcasters. In turn the callback is + informed about the state change. + @throws DisposedException + */ + virtual void SAL_CALL + statusChanged ( + const css::frame::FeatureStateEvent& rState) override; + + //===== lang::XEventListener ============================================ + + virtual void SAL_CALL + disposing(const css::lang::EventObject& rEvent) override; + +private: + /** This method is called by the WeakComponentImplHelper base class in + reaction to a XComponent::dispose() call. It releases all currently + active listeners. + */ + virtual void disposing(std::unique_lock&) override; + + Link maCallback; + + /** Remember the URLs that describe slots whose state changes we are + listening to. + */ + std::vector maRegisteredURLList; + + css::uno::WeakReference mxDispatchProviderWeak; + + /** Deregister all currently active state change listeners. + */ + void ReleaseListeners(); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); + + /** Transform the given string into a URL object. + */ + static css::util::URL MakeURL (const OUString& rSlotName); + + /** Return an XDispatch object for the given URL. + */ + css::uno::Reference + GetDispatch ( + const css::util::URL& rURL) const; +}; + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx b/sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx new file mode 100644 index 0000000000..4084e7e8fe --- /dev/null +++ b/sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +namespace sd::tools { + +class AsynchronousTask; + +/** Execute an AsynchronousTask timer based, i.e. every + nMillisecondsBetweenSteps milliseconds as much steps are executed as fit + into a nMaxTimePerStep millisecond interval. + + When a task is executed completely, i.e. HasNextStep() returns , + the TimerBasedTaskExecution destroys itself. This, of course, works + only if the creating instance does not hold a shared_ptr to that object. +*/ +class TimerBasedTaskExecution +{ +public: + /** Create a new object of this class. + @param rpTask + The AsynchronousTask that is to be executed. + @param nMillisecondsBetweenSteps + Wait at least this long between the execution of steps. Note + that more than one step may be executed in succession. + @param nMaxTimePerStep + The maximal time for executing steps without yielding control. + */ + static std::shared_ptr Create ( + const std::shared_ptr& rpTask, + sal_uInt32 nMillisecondsBetweenSteps, + sal_uInt32 nMaxTimePerStep); + + /** Stop the execution of the task and release the shared pointer to + itself so that it will eventually be destroyed. + */ + void Release(); + + /** Convenience method that calls Release() on the given task. It + checks the given weak_ptr for being expired and catches bad_weak_ptr + exceptions. + */ + static void ReleaseTask (const std::weak_ptr& rpTask); + +private: + std::shared_ptr mpTask; + Timer maTimer; + /** This shared_ptr to this is used to destroy a TimerBasedTaskExecution + object when its task has been executed completely. + */ + std::shared_ptr mpSelf; + sal_uInt32 mnMaxTimePerStep; + + TimerBasedTaskExecution ( + std::shared_ptr pTask, + sal_uInt32 nMillisecondsBetweenSteps, + sal_uInt32 nMaxTimePerStep); + ~TimerBasedTaskExecution(); + + class Deleter; + friend class Deleter; + + DECL_LINK(TimerCallback, Timer *, void); +}; + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tpaction.hxx b/sd/source/ui/inc/tpaction.hxx new file mode 100644 index 0000000000..893192d256 --- /dev/null +++ b/sd/source/ui/inc/tpaction.hxx @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include "sdtreelb.hxx" + +#include + +namespace sd { + class View; +} +class SdDrawDocument; + +/** + * Effect-SingleTab-Dialog + */ +class SdActionDlg final : public SfxSingleTabDialogController +{ +public: + SdActionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View const * pView); +}; + +/** + * Interaction-Tab-Page + */ +class SdTPAction final : public SfxTabPage +{ +private: + const ::sd::View* mpView; + SdDrawDocument* mpDoc; + XColorListRef pColList; + + bool bTreeUpdated; + std::vector maCurrentActions; + OUString aLastFile; + ::std::vector< tools::Long > aVerbVector; + + std::unique_ptr m_xLbAction; + std::unique_ptr m_xFtTree; // jump destination controls + std::unique_ptr m_xLbTree; + std::unique_ptr m_xLbTreeDocument; + std::unique_ptr m_xLbOLEAction; + std::unique_ptr m_xFrame; + std::unique_ptr m_xEdtSound; + std::unique_ptr m_xEdtBookmark; + std::unique_ptr m_xEdtDocument; + std::unique_ptr m_xEdtProgram; + std::unique_ptr m_xEdtMacro; + std::unique_ptr m_xBtnSearch; + std::unique_ptr m_xBtnSeek; + + DECL_LINK( ClickSearchHdl, weld::Button&, void ); + DECL_LINK( ClickActionHdl, weld::ComboBox&, void ); + DECL_LINK( SelectTreeHdl, weld::TreeView&, void ); + DECL_LINK( CheckFileHdl, weld::Widget&, void ); + + void UpdateTree(); + void OpenFileDialog(); + css::presentation::ClickAction GetActualClickAction(); + void SetActualClickAction( css::presentation::ClickAction eCA ); + void SetEditText( OUString const & rStr ); + OUString GetEditText( bool bURL = false ); +public: + SD_DLLPUBLIC static TranslateId GetClickActionSdResId(css::presentation::ClickAction eCA); + + SdTPAction(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs); + virtual ~SdTPAction() override; + + static std::unique_ptr Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& ); + + virtual bool FillItemSet( SfxItemSet* ) override; + virtual void Reset( const SfxItemSet * ) override; + + virtual void ActivatePage( const SfxItemSet& rSet ) override; + virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; + + void Construct(); + + void SetView( const ::sd::View* pSdView ); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/tpoption.hxx b/sd/source/ui/inc/tpoption.hxx new file mode 100644 index 0000000000..e1065eb28b --- /dev/null +++ b/sd/source/ui/inc/tpoption.hxx @@ -0,0 +1,159 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +/** + * Option-Tab-Page: Snap + */ +class SdTpOptionsSnap final : public SvxGridTabPage +{ +public: + SdTpOptionsSnap(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs); + static std::unique_ptr Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* ); + virtual ~SdTpOptionsSnap() override; + + virtual bool FillItemSet( SfxItemSet* ) override; + virtual void Reset( const SfxItemSet * ) override; +}; + +/** + * Option-Tab-Page: Contents + */ +class SdTpOptionsContents final : public SfxTabPage +{ +private: + bool m_bDrawMode; + std::unique_ptr m_xCbxRuler; + std::unique_ptr m_xCbxRulerImg; + std::unique_ptr m_xCbxDragStripes; + std::unique_ptr m_xCbxDragStripesImg; + std::unique_ptr m_xCbxHandlesBezier; + std::unique_ptr m_xCbxHandlesBezierImg; + std::unique_ptr m_xCbxMoveOutline; + std::unique_ptr m_xCbxMoveOutlineImg; + +public: + SdTpOptionsContents(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs); + static std::unique_ptr Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* ); + virtual ~SdTpOptionsContents() override; + + virtual OUString GetAllStrings() override; + + virtual bool FillItemSet( SfxItemSet* ) override; + virtual void Reset( const SfxItemSet * ) override; + + virtual void PageCreated(const SfxAllItemSet& aSet) override; + + void SetDrawMode() { m_bDrawMode = true; } +}; + +/** + * Option-Tab-Page: View + */ + +class SdTpOptionsMisc final : public SfxTabPage +{ + friend class SdModule; + +private: + sal_uInt32 nWidth; + sal_uInt32 nHeight; + OUString aInfo1; + OUString aInfo2; + + bool m_bDrawMode; + MapUnit ePoolUnit; + + std::unique_ptr m_xCbxQuickEdit; + std::unique_ptr m_xCbxQuickEditImg; + std::unique_ptr m_xCbxPickThrough; + std::unique_ptr m_xCbxPickThroughImg; + + std::unique_ptr m_xNewDocumentFrame; + std::unique_ptr m_xCbxStartWithTemplate; + std::unique_ptr m_xCbxStartWithTemplateImg; + + std::unique_ptr m_xCbxMasterPageCache; + std::unique_ptr m_xCbxMasterPageCacheImg; + std::unique_ptr m_xCbxCopy; + std::unique_ptr m_xCbxCopyImg; + std::unique_ptr m_xCbxMarkedHitMovesAlways; + std::unique_ptr m_xCbxMarkedHitMovesAlwaysImg; + + std::unique_ptr m_xLbMetric; + std::unique_ptr m_xLbMetricImg; + std::unique_ptr m_xMtrFldTabstop; + std::unique_ptr m_xMtrFldTabstopImg; + + std::unique_ptr m_xCbxCompatibility; + std::unique_ptr m_xCbxCompatibilityImg; + + //Scale + std::unique_ptr m_xScaleFrame; + std::unique_ptr m_xCbScale; + std::unique_ptr m_xCbScaleImg; + std::unique_ptr m_xNewDocLb; + std::unique_ptr m_xFiInfo1; + std::unique_ptr m_xMtrFldOriginalWidth; + std::unique_ptr m_xWidthLb; + std::unique_ptr m_xHeightLb; + std::unique_ptr m_xFiInfo2; + std::unique_ptr m_xMtrFldOriginalHeight; + std::unique_ptr m_xCbxDistort; + std::unique_ptr m_xCbxDistortImg; + std::unique_ptr m_xMtrFldInfo1; + std::unique_ptr m_xMtrFldInfo2; + + static OUString GetScale( sal_Int32 nX, sal_Int32 nY ); + static bool SetScale( std::u16string_view aScale, sal_Int32& rX, sal_Int32& rY ); + + DECL_LINK( SelectMetricHdl_Impl, weld::ComboBox&, void ); + + /** Enable or disable the controls in the compatibility section of the + 'general' tab page depending on whether there is at least one + document. + */ + void UpdateCompatibilityControls(); + + virtual void ActivatePage( const SfxItemSet& rSet ) override; + virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; + +public: + SdTpOptionsMisc(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs); + static std::unique_ptr Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* ); + virtual ~SdTpOptionsMisc() override; + + virtual OUString GetAllStrings() override; + + virtual bool FillItemSet( SfxItemSet* ) override; + virtual void Reset( const SfxItemSet * ) override; + + /** Hide Impress specific controls, make Draw specific controls visible + and arrange the visible controls. Do not call this method more than once. + */ + void SetDrawMode(); + + virtual void PageCreated(const SfxAllItemSet& aSet) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/uiobject.hxx b/sd/source/ui/inc/uiobject.hxx new file mode 100644 index 0000000000..06cb6105fa --- /dev/null +++ b/sd/source/ui/inc/uiobject.hxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include "Window.hxx" + +class ImpressWindowUIObject final : public WindowUIObject +{ +public: + ImpressWindowUIObject(const VclPtr& xWindow); + + virtual StringMap get_state() override; + + virtual void execute(const OUString& rAction, const StringMap& rParameters) override; + + virtual std::unique_ptr get_child(const OUString& rID) override; + + virtual std::set get_children() const override; + + static std::unique_ptr create(vcl::Window* pWindow); + +private: + virtual OUString get_name() const override; + + VclPtr mxWindow; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unchss.hxx b/sd/source/ui/inc/unchss.hxx new file mode 100644 index 0000000000..7c3845f8bd --- /dev/null +++ b/sd/source/ui/inc/unchss.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include + +class SfxItemSet; +class SfxStyleSheet; +class SdDrawDocument; + +class StyleSheetUndoAction final : public SdUndoAction +{ + SfxStyleSheet* mpStyleSheet; + + std::unique_ptr mpNewSet; + std::unique_ptr mpOldSet; + +public: + StyleSheetUndoAction(SdDrawDocument* pTheDoc, SfxStyleSheet* pTheStyleSheet, + const SfxItemSet* pTheNewItemSet); + + virtual void Undo() override; + virtual void Redo() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/undoback.hxx b/sd/source/ui/inc/undoback.hxx new file mode 100644 index 0000000000..afbb13eca4 --- /dev/null +++ b/sd/source/ui/inc/undoback.hxx @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include + +class SdDrawDocument; +class SdPage; +class SfxItemSet; +class SfxPoolItem; + +class SdBackgroundObjUndoAction final : public SdUndoAction +{ +private: + + SdPage& mrPage; + std::unique_ptr mpItemSet; + std::unique_ptr mpFillBitmapItem; + bool mbHasFillBitmap; + + void ImplRestoreBackgroundObj(); + void saveFillBitmap(SfxItemSet &rItemSet); + void restoreFillBitmap(SfxItemSet &rItemSet); + +public: + SdBackgroundObjUndoAction( + SdDrawDocument& rDoc, + SdPage& rPage, + const SfxItemSet& rItemSet); + + virtual void Undo() override; + virtual void Redo() override; + + virtual SdUndoAction* Clone() const override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/undoheaderfooter.hxx b/sd/source/ui/inc/undoheaderfooter.hxx new file mode 100644 index 0000000000..a6928a63c2 --- /dev/null +++ b/sd/source/ui/inc/undoheaderfooter.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; + +/************************************************************************/ + +class SD_DLLPUBLIC SdHeaderFooterUndoAction final : public SdUndoAction +{ + SdPage* mpPage; + + const sd::HeaderFooterSettings maOldSettings; + const sd::HeaderFooterSettings maNewSettings; + +public: + SdHeaderFooterUndoAction( SdDrawDocument* pDoc, SdPage* pPage, sd::HeaderFooterSettings aNewSettings ); + virtual ~SdHeaderFooterUndoAction() override; + + virtual void Undo() override; + virtual void Redo() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/undolayer.hxx b/sd/source/ui/inc/undolayer.hxx new file mode 100644 index 0000000000..7b0d33d9ae --- /dev/null +++ b/sd/source/ui/inc/undolayer.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdDrawDocument; +class SdrLayer; + +/************************************************************************/ + +class SdLayerModifyUndoAction final : public SdUndoAction +{ + +public: + SdLayerModifyUndoAction( SdDrawDocument* _pDoc, SdrLayer* pLayer, + OUString aOldLayerName, OUString aOldLayerTitle, OUString aOldLayerDesc, bool bOldIsVisible, bool bOldIsLocked, bool bOldIsPrintable, + OUString aNewLayerName, OUString aNewLayerTitle, OUString aNewLayerDesc, bool bNewIsVisible, bool bNewIsLocked, bool bNewIsPrintable ); + + virtual void Undo() override; + virtual void Redo() override; + +private: + SdrLayer* mpLayer; + OUString maOldLayerName; + OUString maOldLayerTitle; + OUString maOldLayerDesc; + bool mbOldIsVisible; + bool mbOldIsLocked; + bool mbOldIsPrintable; + OUString maNewLayerName; + OUString maNewLayerTitle; + OUString maNewLayerDesc; + bool mbNewIsVisible; + bool mbNewIsLocked; + bool mbNewIsPrintable; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/undopage.hxx b/sd/source/ui/inc/undopage.hxx new file mode 100644 index 0000000000..87d5b5b217 --- /dev/null +++ b/sd/source/ui/inc/undopage.hxx @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +class SdDrawDocument; +class SdPage; + +/************************************************************************/ + +class SdPageFormatUndoAction final : public SdUndoAction +{ + SdPage* mpPage; + + Size maOldSize; + sal_Int32 mnOldLeft; + sal_Int32 mnOldRight; + sal_Int32 mnOldUpper; + sal_Int32 mnOldLower; + Orientation meOldOrientation; + sal_uInt16 mnOldPaperBin; + bool mbOldFullSize; + + Size maNewSize; + sal_Int32 mnNewLeft; + sal_Int32 mnNewRight; + sal_Int32 mnNewUpper; + sal_Int32 mnNewLower; + bool mbNewScale; + Orientation meNewOrientation; + sal_uInt16 mnNewPaperBin; + bool mbNewFullSize; + +public: + SdPageFormatUndoAction( SdDrawDocument* pDoc, + SdPage* pThePage, + const Size& rOldSz, + sal_Int32 nOldLft, + sal_Int32 nOldRgt, + sal_Int32 nOldUpr, + sal_Int32 nOldLwr, + Orientation eOldOrient, + sal_uInt16 nOPaperBin, + bool bOFullSize, + + const Size& rNewSz, + sal_Int32 nNewLft, + sal_Int32 nNewRgt, + sal_Int32 nNewUpr, + sal_Int32 nNewLwr, + bool bNewScl, + Orientation eNewOrient, + sal_uInt16 nNPaperBin, + bool bNFullSize + ) : + SdUndoAction(pDoc), + mpPage (pThePage), + maOldSize (rOldSz), + mnOldLeft (nOldLft), + mnOldRight (nOldRgt), + mnOldUpper (nOldUpr), + mnOldLower (nOldLwr), + meOldOrientation(eOldOrient), + mnOldPaperBin (nOPaperBin), + mbOldFullSize (bOFullSize), + + maNewSize (rNewSz), + mnNewLeft (nNewLft), + mnNewRight (nNewRgt), + mnNewUpper (nNewUpr), + mnNewLower (nNewLwr), + mbNewScale (bNewScl), + meNewOrientation(eNewOrient), + mnNewPaperBin (nNPaperBin), + mbNewFullSize (bNFullSize) + + {} + virtual ~SdPageFormatUndoAction() override; + + virtual void Undo() override; + virtual void Redo() override; +}; + +/************************************************************************/ + +class SdPageLRUndoAction final : public SdUndoAction +{ + SdPage* mpPage; + + sal_Int32 mnOldLeft; + sal_Int32 mnOldRight; + sal_Int32 mnNewLeft; + sal_Int32 mnNewRight; + +public: + SdPageLRUndoAction( SdDrawDocument* pDoc, SdPage* pThePage, + sal_Int32 nOldLft, sal_Int32 nOldRgt, + sal_Int32 nNewLft, sal_Int32 nNewRgt ) : + SdUndoAction(pDoc), + mpPage (pThePage), + mnOldLeft (nOldLft), + mnOldRight (nOldRgt), + mnNewLeft (nNewLft), + mnNewRight (nNewRgt) + {} + virtual ~SdPageLRUndoAction() override; + + virtual void Undo() override; + virtual void Redo() override; +}; + +/************************************************************************/ + +class SdPageULUndoAction final : public SdUndoAction +{ + SdPage* mpPage; + + sal_Int32 mnOldUpper; + sal_Int32 mnOldLower; + sal_Int32 mnNewUpper; + sal_Int32 mnNewLower; + +public: + SdPageULUndoAction( SdDrawDocument* pDoc, SdPage* pThePage, + sal_Int32 nOldUpr, sal_Int32 nOldLwr, + sal_Int32 nNewUpr, sal_Int32 nNewLwr ) : + SdUndoAction(pDoc), + mpPage (pThePage), + mnOldUpper (nOldUpr), + mnOldLower (nOldLwr), + mnNewUpper (nNewUpr), + mnNewLower (nNewLwr) + {} + virtual ~SdPageULUndoAction() override; + + virtual void Undo() override; + virtual void Redo() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unmodpg.hxx b/sd/source/ui/inc/unmodpg.hxx new file mode 100644 index 0000000000..02920c27ab --- /dev/null +++ b/sd/source/ui/inc/unmodpg.hxx @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +#include + +class SdDrawDocument; +class SdPage; + +class ModifyPageUndoAction final : public SdUndoAction +{ + SdPage* mpPage; + OUString maOldName; + OUString maNewName; + AutoLayout meOldAutoLayout; + AutoLayout meNewAutoLayout; + bool mbOldBckgrndVisible; + bool mbNewBckgrndVisible; + bool mbOldBckgrndObjsVisible; + bool mbNewBckgrndObjsVisible; + +public: + ModifyPageUndoAction( + SdDrawDocument* pTheDoc, + SdPage* pThePage, + const OUString& aTheNewName, + AutoLayout eTheNewAutoLayout, + bool bTheNewBckgrndVisible, + bool bTheNewBckgrndObjsVisible); + + virtual ~ModifyPageUndoAction() override; + virtual void Undo() override; + virtual void Redo() override; +}; + +class ChangeSlideExclusionStateUndoAction final : public SdUndoAction +{ +public: + ChangeSlideExclusionStateUndoAction(SdDrawDocument* pDocument, + const sd::slidesorter::model::PageDescriptor::State eState, + const bool bOldStateValue); + + ChangeSlideExclusionStateUndoAction( + SdDrawDocument* pDocument, const sd::slidesorter::model::SharedPageDescriptor& rpDescriptor, + const sd::slidesorter::model::PageDescriptor::State eState, const bool bOldStateValue); + + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; + + void AddPageDescriptor(const sd::slidesorter::model::SharedPageDescriptor& rpDescriptor); + +private: + sd::slidesorter::model::PageDescriptor::State meState; + bool mbOldStateValue; + std::vector mrpDescriptors; + const OUString maComment; +}; + +class RenameLayoutTemplateUndoAction final : public SdUndoAction +{ +public: + RenameLayoutTemplateUndoAction( + SdDrawDocument* pDocument, + OUString aOldLayoutName, + OUString aNewLayoutName); + + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; + +private: + OUString maOldName; + OUString maNewName; + const OUString maComment; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unmovss.hxx b/sd/source/ui/inc/unmovss.hxx new file mode 100644 index 0000000000..93e87cd407 --- /dev/null +++ b/sd/source/ui/inc/unmovss.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdDrawDocument; + +class SdMoveStyleSheetsUndoAction final : public SdUndoAction +{ + StyleSheetCopyResultVector maStyles; + std::vector< SdStyleSheetVector > maListOfChildLists; + bool mbMySheets; + +public: + SdMoveStyleSheetsUndoAction(SdDrawDocument* pTheDoc, StyleSheetCopyResultVector& rTheStyles, bool bInserted); + + virtual ~SdMoveStyleSheetsUndoAction() override; + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unoaprms.hxx b/sd/source/ui/inc/unoaprms.hxx new file mode 100644 index 0000000000..9ad3276684 --- /dev/null +++ b/sd/source/ui/inc/unoaprms.hxx @@ -0,0 +1,148 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +class SdDrawDocument; +class SdrObject; + +class SdAnimationPrmsUndoAction final : public SdUndoAction +{ + SdrObject* pObject; + bool bOldActive; + bool bNewActive; + bool bOldDimPrevious; + bool bNewDimPrevious; + bool bOldDimHide; + bool bNewDimHide; + bool bOldSoundOn; + bool bNewSoundOn; + bool bOldSecondSoundOn; + bool bNewSecondSoundOn; + bool bOldPlayFull; + bool bNewPlayFull; + bool bOldSecondPlayFull; + bool bNewSecondPlayFull; + css::presentation::AnimationEffect eOldEffect; + css::presentation::AnimationEffect eNewEffect; + css::presentation::AnimationEffect eOldTextEffect; + css::presentation::AnimationEffect eNewTextEffect; + css::presentation::AnimationSpeed eOldSpeed; + css::presentation::AnimationSpeed eNewSpeed; + css::presentation::AnimationEffect eOldSecondEffect; + css::presentation::AnimationEffect eNewSecondEffect; + css::presentation::AnimationSpeed eOldSecondSpeed; + css::presentation::AnimationSpeed eNewSecondSpeed; + Color aOldDimColor; + Color aNewDimColor; + OUString aOldSoundFile; + OUString aNewSoundFile; + css::presentation::ClickAction eOldClickAction; + css::presentation::ClickAction eNewClickAction; + OUString aOldBookmark; + OUString aNewBookmark; + sal_uInt16 nOldVerb; + sal_uInt16 nNewVerb; + + bool bInfoCreated; + +public: + SdAnimationPrmsUndoAction(SdDrawDocument* pTheDoc, SdrObject* pObj, + bool bCreated) + : SdUndoAction(pTheDoc) + , pObject(pObj) + , bOldActive(false) + , bNewActive(false) + , bOldDimPrevious(false) + , bNewDimPrevious(false) + , bOldDimHide(false) + , bNewDimHide(false) + , bOldSoundOn(false) + , bNewSoundOn(false) + , bOldSecondSoundOn(false) + , bNewSecondSoundOn(false) + , bOldPlayFull(false) + , bNewPlayFull(false) + , bOldSecondPlayFull(false) + , bNewSecondPlayFull(false) + , eOldEffect(css::presentation::AnimationEffect_NONE) + , eNewEffect(css::presentation::AnimationEffect_NONE) + , eOldTextEffect(css::presentation::AnimationEffect_NONE) + , eNewTextEffect(css::presentation::AnimationEffect_NONE) + , eOldSpeed(css::presentation::AnimationSpeed_SLOW) + , eNewSpeed(css::presentation::AnimationSpeed_SLOW) + , eOldSecondEffect(css::presentation::AnimationEffect_NONE) + , eNewSecondEffect(css::presentation::AnimationEffect_NONE) + , eOldSecondSpeed(css::presentation::AnimationSpeed_SLOW) + , eNewSecondSpeed(css::presentation::AnimationSpeed_SLOW) + , eOldClickAction(css::presentation::ClickAction_NONE) + , eNewClickAction(css::presentation::ClickAction_NONE) + , nOldVerb(0) + , nNewVerb(0) + , bInfoCreated(bCreated) + { + } + + void SetActive(bool bTheOldActive, bool bTheNewActive) + { bOldActive = bTheOldActive; bNewActive = bTheNewActive; } + void SetEffect(css::presentation::AnimationEffect eTheOldEffect, css::presentation::AnimationEffect eTheNewEffect) + { eOldEffect = eTheOldEffect; eNewEffect = eTheNewEffect; } + void SetTextEffect(css::presentation::AnimationEffect eTheOldEffect, css::presentation::AnimationEffect eTheNewEffect) + { eOldTextEffect = eTheOldEffect; eNewTextEffect = eTheNewEffect; } + void SetSpeed(css::presentation::AnimationSpeed eTheOldSpeed, css::presentation::AnimationSpeed eTheNewSpeed) + { eOldSpeed = eTheOldSpeed; eNewSpeed = eTheNewSpeed; } + void SetDim(bool bTheOldDim, bool bTheNewDim) + { bOldDimPrevious = bTheOldDim; bNewDimPrevious = bTheNewDim; } + void SetDimColor(Color aTheOldDimColor, Color aTheNewDimColor) + { aOldDimColor = aTheOldDimColor; aNewDimColor = aTheNewDimColor; } + void SetDimHide(bool bTheOldDimHide, bool bTheNewDimHide) + { bOldDimHide = bTheOldDimHide; bNewDimHide = bTheNewDimHide; } + void SetSoundOn(bool bTheOldSoundOn, bool bTheNewSoundOn) + { bOldSoundOn = bTheOldSoundOn; bNewSoundOn = bTheNewSoundOn; } + void SetSound(const OUString& aTheOldSound, const OUString& aTheNewSound) + { aOldSoundFile = aTheOldSound; aNewSoundFile = aTheNewSound; } + void SetPlayFull(bool bTheOldPlayFull, bool bTheNewPlayFull) + { bOldPlayFull = bTheOldPlayFull; bNewPlayFull = bTheNewPlayFull; } + void SetClickAction(css::presentation::ClickAction eTheOldAction, css::presentation::ClickAction eTheNewAction) + { eOldClickAction = eTheOldAction; eNewClickAction = eTheNewAction; } + void SetBookmark(const OUString& aTheOldBookmark, const OUString& aTheNewBookmark) + { aOldBookmark = aTheOldBookmark; aNewBookmark = aTheNewBookmark; } + void SetVerb(sal_uInt16 nTheOldVerb, sal_uInt16 nTheNewVerb) + { nOldVerb = nTheOldVerb; nNewVerb = nTheNewVerb; } + void SetSecondEffect(css::presentation::AnimationEffect eTheOldEffect, css::presentation::AnimationEffect eTheNewEffect) + { eOldSecondEffect = eTheOldEffect; eNewSecondEffect = eTheNewEffect; } + void SetSecondSpeed(css::presentation::AnimationSpeed eTheOldSpeed, css::presentation::AnimationSpeed eTheNewSpeed) + { eOldSecondSpeed = eTheOldSpeed; eNewSecondSpeed = eTheNewSpeed; } + void SetSecondSoundOn(bool bTheOldSoundOn, bool bTheNewSoundOn) + { bOldSecondSoundOn = bTheOldSoundOn; bNewSecondSoundOn = bTheNewSoundOn; } + void SetSecondPlayFull(bool bTheOldPlayFull, bool bTheNewPlayFull) + { bOldSecondPlayFull = bTheOldPlayFull; bNewSecondPlayFull = bTheNewPlayFull; } + + virtual ~SdAnimationPrmsUndoAction() override; + virtual void Undo() override; + virtual void Redo() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unokywds.hxx b/sd/source/ui/inc/unokywds.hxx new file mode 100644 index 0000000000..a298e93b7c --- /dev/null +++ b/sd/source/ui/inc/unokywds.hxx @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +// SdUnoPseudoStyleFamily +inline constexpr OUString sUNO_PseudoSheet_Background = u"background"_ustr; + +// SdLayer +inline constexpr OUString sUNO_LayerName_background = u"background"_ustr; +inline constexpr OUString sUNO_LayerName_background_objects = u"backgroundobjects"_ustr; +inline constexpr OUString sUNO_LayerName_layout = u"layout"_ustr; +inline constexpr OUString sUNO_LayerName_controls = u"controls"_ustr; +inline constexpr OUString sUNO_LayerName_measurelines = u"measurelines"_ustr; + +// services +inline constexpr OUString sUNO_Service_FillProperties = u"com.sun.star.drawing.FillProperties"_ustr; +inline constexpr OUString sUNO_Service_PageBackground = u"com.sun.star.drawing.PageBackground"_ustr; +inline constexpr OUString sUNO_Service_ImageMapRectangleObject + = u"com.sun.star.image.ImageMapRectangleObject"_ustr; +inline constexpr OUString sUNO_Service_ImageMapCircleObject + = u"com.sun.star.image.ImageMapCircleObject"_ustr; +inline constexpr OUString sUNO_Service_ImageMapPolygonObject + = u"com.sun.star.image.ImageMapPolygonObject"_ustr; + +// properties +inline constexpr OUString sUNO_Prop_ForbiddenCharacters = u"ForbiddenCharacters"_ustr; +inline constexpr OUString sUNO_Prop_MapUnit = u"MapUnit"_ustr; +inline constexpr OUString sUNO_Prop_VisibleArea = u"VisibleArea"_ustr; +inline constexpr OUString sUNO_Prop_TabStop = u"TabStop"_ustr; +inline constexpr OUString sUNO_Prop_CharLocale = u"CharLocale"_ustr; +inline constexpr OUString sUNO_Prop_AutomContFocus = u"AutomaticControlFocus"_ustr; +inline constexpr OUString sUNO_Prop_ApplyFrmDsgnMode = u"ApplyFormDesignMode"_ustr; +inline constexpr OUString sUNO_Prop_IsBackgroundVisible = u"IsBackgroundVisible"_ustr; +inline constexpr OUString sUNO_Prop_IsBackgroundObjectsVisible = u"IsBackgroundObjectsVisible"_ustr; +inline constexpr OUString sUNO_Prop_UserDefinedAttributes = u"UserDefinedAttributes"_ustr; +inline constexpr OUString sUNO_Prop_BookmarkURL = u"BookmarkURL"_ustr; +inline constexpr OUString sUNO_Prop_RuntimeUID = u"RuntimeUID"_ustr; +inline constexpr OUString sUNO_Prop_HasValidSignatures = u"HasValidSignatures"_ustr; +inline constexpr OUString sUNO_Prop_InteropGrabBag = u"InteropGrabBag"_ustr; +inline constexpr OUString sUNO_Prop_Theme = u"Theme"_ustr; + +// view settings +inline constexpr OUString sUNO_View_ViewId = u"ViewId"_ustr; +inline constexpr OUString sUNO_View_SnapLinesDrawing = u"SnapLinesDrawing"_ustr; +inline constexpr OUString sUNO_View_SnapLinesNotes = u"SnapLinesNotes"_ustr; +inline constexpr OUString sUNO_View_SnapLinesHandout = u"SnapLinesHandout"_ustr; +inline constexpr OUString sUNO_View_RulerIsVisible = u"RulerIsVisible"_ustr; +inline constexpr OUString sUNO_View_PageKind = u"PageKind"_ustr; +inline constexpr OUString sUNO_View_SelectedPage = u"SelectedPage"_ustr; +inline constexpr OUString sUNO_View_IsLayerMode = u"IsLayerMode"_ustr; +inline constexpr OUString sUNO_View_IsDoubleClickTextEdit = u"IsDoubleClickTextEdit"_ustr; +inline constexpr OUString sUNO_View_IsClickChangeRotation = u"IsClickChangeRotation"_ustr; +inline constexpr OUString sUNO_View_SlidesPerRow = u"SlidesPerRow"_ustr; +inline constexpr OUString sUNO_View_EditMode = u"EditMode"_ustr; +inline const char sUNO_View_EditModeStandard[] = "EditModeStandard"; // To be deprecated +// inline const char sUNO_View_EditModeNotes[] = "EditModeNotes"; +// inline const char sUNO_View_EditModeHandout[] = "EditModeHandout"; + +inline constexpr OUString sUNO_View_GridIsVisible = u"GridIsVisible"_ustr; +inline constexpr OUString sUNO_View_GridIsFront = u"GridIsFront"_ustr; +inline constexpr OUString sUNO_View_IsSnapToGrid = u"IsSnapToGrid"_ustr; +inline constexpr OUString sUNO_View_IsSnapToPageMargins = u"IsSnapToPageMargins"_ustr; +inline constexpr OUString sUNO_View_IsSnapToSnapLines = u"IsSnapToSnapLines"_ustr; +inline constexpr OUString sUNO_View_IsSnapToObjectFrame = u"IsSnapToObjectFrame"_ustr; +inline constexpr OUString sUNO_View_IsSnapToObjectPoints = u"IsSnapToObjectPoints"_ustr; +inline constexpr OUString sUNO_View_IsPlusHandlesAlwaysVisible = u"IsPlusHandlesAlwaysVisible"_ustr; +inline constexpr OUString sUNO_View_IsFrameDragSingles = u"IsFrameDragSingles"_ustr; +inline constexpr OUString sUNO_View_EliminatePolyPointLimitAngle + = u"EliminatePolyPointLimitAngle"_ustr; +inline constexpr OUString sUNO_View_IsEliminatePolyPoints = u"IsEliminatePolyPoints"_ustr; +inline const char sUNO_View_ActiveLayer[] = "ActiveLayer"; +inline constexpr OUString sUNO_View_NoAttribs = u"NoAttribs"_ustr; +inline constexpr OUString sUNO_View_NoColors = u"NoColors"_ustr; +inline constexpr OUString sUNO_View_GridCoarseWidth = u"GridCoarseWidth"_ustr; +inline constexpr OUString sUNO_View_GridCoarseHeight = u"GridCoarseHeight"_ustr; +inline constexpr OUString sUNO_View_GridFineWidth = u"GridFineWidth"_ustr; +inline constexpr OUString sUNO_View_GridFineHeight = u"GridFineHeight"_ustr; +inline constexpr OUString sUNO_View_IsAngleSnapEnabled = u"IsAngleSnapEnabled"_ustr; +inline constexpr OUString sUNO_View_SnapAngle = u"SnapAngle"_ustr; +inline constexpr OUString sUNO_View_GridSnapWidthXNumerator = u"GridSnapWidthXNumerator"_ustr; +inline constexpr OUString sUNO_View_GridSnapWidthXDenominator = u"GridSnapWidthXDenominator"_ustr; +inline constexpr OUString sUNO_View_GridSnapWidthYNumerator = u"GridSnapWidthYNumerator"_ustr; +inline constexpr OUString sUNO_View_GridSnapWidthYDenominator = u"GridSnapWidthYDenominator"_ustr; +inline constexpr OUString sUNO_View_VisibleLayers = u"VisibleLayers"_ustr; +inline constexpr OUString sUNO_View_PrintableLayers = u"PrintableLayers"_ustr; +inline constexpr OUString sUNO_View_LockedLayers = u"LockedLayers"_ustr; + +inline constexpr OUString sUNO_View_VisibleAreaTop = u"VisibleAreaTop"_ustr; +inline constexpr OUString sUNO_View_VisibleAreaLeft = u"VisibleAreaLeft"_ustr; +inline constexpr OUString sUNO_View_VisibleAreaWidth = u"VisibleAreaWidth"_ustr; +inline constexpr OUString sUNO_View_VisibleAreaHeight = u"VisibleAreaHeight"_ustr; + +inline constexpr OUString sUNO_View_ZoomOnPage = u"ZoomOnPage"_ustr; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx new file mode 100644 index 0000000000..e0fa051d88 --- /dev/null +++ b/sd/source/ui/inc/unomodel.hxx @@ -0,0 +1,486 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +#include +#include +#include +#include + +namespace com::sun::star::container { class XNameContainer; } +namespace com::sun::star::i18n { class XForbiddenCharacters; } +namespace com::sun::star::presentation { class XPresentation; } + +class SdDrawDocument; +class SdPage; +class SvxItemPropertySet; + +namespace sd { +class DrawDocShell; +class DrawViewShell; +} + +extern OUString getPageApiName( SdPage const * pPage ); +extern OUString getPageApiNameFromUiName( const OUString& rUIName ); + +class SD_DLLPUBLIC SdXImpressDocument final : public SfxBaseModel, // implements SfxListener, OWEAKOBJECT & other + public SvxFmMSFactory, + public css::drawing::XDrawPageDuplicator, + public css::drawing::XLayerSupplier, + public css::drawing::XMasterPagesSupplier, + public css::drawing::XDrawPagesSupplier, + public css::presentation::XPresentationSupplier, + public css::presentation::XCustomPresentationSupplier, + public css::document::XLinkTargetSupplier, + public css::beans::XPropertySet, + public css::style::XStyleFamiliesSupplier, + public css::lang::XServiceInfo, + public css::ucb::XAnyCompareFactory, + public css::presentation::XHandoutMasterSupplier, + public css::view::XRenderable, + public vcl::ITiledRenderable +{ + friend class SdDrawPagesAccess; + friend class SdMasterPagesAccess; + friend class SdLayerManager; + +private: + ::sd::DrawDocShell* mpDocShell; + SdDrawDocument* mpDoc; + bool mbDisposed; + + css::uno::Reference create( + OUString const & aServiceSpecifier, OUString const & referer); + + /// @throws css::uno::RuntimeException + SdPage* InsertSdPage( sal_uInt16 nPage, bool bDuplicate ); + + const bool mbImpressDoc; + bool mbClipBoard; + + css::uno::WeakReference< css::drawing::XDrawPages > mxDrawPagesAccess; + css::uno::WeakReference< css::drawing::XDrawPages > mxMasterPagesAccess; + css::uno::WeakReference< css::container::XNameAccess > mxLayerManager; + css::uno::WeakReference< css::container::XNameContainer > mxCustomPresentationAccess; + css::uno::WeakReference< css::i18n::XForbiddenCharacters > mxForbiddenCharacters; + css::uno::Reference< css::container::XNameAccess > mxLinks; + + css::uno::Reference< css::uno::XInterface > mxDashTable; + css::uno::Reference< css::uno::XInterface > mxGradientTable; + css::uno::Reference< css::uno::XInterface > mxHatchTable; + css::uno::Reference< css::uno::XInterface > mxBitmapTable; + css::uno::Reference< css::uno::XInterface > mxTransGradientTable; + css::uno::Reference< css::uno::XInterface > mxMarkerTable; + css::uno::Reference< css::uno::XInterface > mxDrawingPool; + + const SvxItemPropertySet* mpPropSet; + + css::uno::Sequence< css::uno::Type > maTypeSequence; + + OUString maBuildId; + + bool mbPaintTextEdit; + + void initializeDocument(); + + sd::DrawViewShell* GetViewShell(); + + /** abstract SdrModel provider */ + virtual SdrModel& getSdrModelFromUnoModel() const override; + +public: + SdXImpressDocument(::sd::DrawDocShell* pShell, bool bClipBoard); + SdXImpressDocument(SdDrawDocument* pDoc, bool bClipBoard); + virtual ~SdXImpressDocument() noexcept override; + + static rtl::Reference< SdXImpressDocument > GetModel( SdDrawDocument const & rDoc ); + + // internal + bool operator==( const SdXImpressDocument& rModel ) const { return mpDoc == rModel.mpDoc; } + bool operator!=( const SdXImpressDocument& rModel ) const { return mpDoc != rModel.mpDoc; } + + ::sd::DrawDocShell* GetDocShell() const { return mpDocShell; } + SdDrawDocument* GetDoc() const { return mpDoc; } + bool IsImpressDocument() const { return mbImpressDoc; } + + void SetModified() noexcept; + + css::uno::Reference< css::i18n::XForbiddenCharacters > getForbiddenCharsTable(); + + // SfxListener + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + UNO3_GETIMPLEMENTATION_DECL(SdXImpressDocument) + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XModel + virtual void SAL_CALL lockControllers( ) override; + virtual void SAL_CALL unlockControllers( ) override; + virtual sal_Bool SAL_CALL hasControllersLocked( ) override; + virtual css::uno::Reference < css::container::XIndexAccess > SAL_CALL getViewData() override; + virtual void SAL_CALL setViewData( const css::uno::Reference < css::container::XIndexAccess >& aData ) override; + + // XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId( ) override; + + // XDrawPageDuplicator + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL duplicate( const css::uno::Reference< css::drawing::XDrawPage >& xPage ) override; + + // XDrawPagesSupplier + virtual css::uno::Reference< css::drawing::XDrawPages > SAL_CALL getDrawPages( ) override; + + // XMasterPagesSupplier + virtual css::uno::Reference< css::drawing::XDrawPages > SAL_CALL getMasterPages( ) override; + + // XLayerManagerSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLayerManager( ) override; + + // XCustomPresentationSupplier + virtual css::uno::Reference< css::container::XNameContainer > SAL_CALL getCustomPresentations( ) override; + + // XHandoutMasterSupplier + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getHandoutMasterPage( ) override; + + // XPresentationSupplier + virtual css::uno::Reference< css::presentation::XPresentation > SAL_CALL getPresentation( ) override; + + // XMultiServiceFactory ( SvxFmMSFactory ) + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( const OUString& aServiceSpecifier ) override; + virtual css::uno::Reference SAL_CALL + createInstanceWithArguments( + OUString const & ServiceSpecifier, + css::uno::Sequence const & Arguments) override; + virtual css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames( ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // XLinkTargetSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks( ) override; + + // XStyleFamiliesSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getStyleFamilies( ) override; + + // XAnyCompareFactory + virtual css::uno::Reference< css::ucb::XAnyCompare > SAL_CALL createAnyCompareByName( const OUString& PropertyName ) override; + + // XRenderable + virtual sal_Int32 SAL_CALL getRendererCount( const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& xOptions ) override; + virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getRenderer( sal_Int32 nRenderer, const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& xOptions ) override; + virtual void SAL_CALL render( sal_Int32 nRenderer, const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& xOptions ) override; + + // ITiledRenderable + virtual void paintTile( VirtualDevice& rDevice, + int nOutputWidth, + int nOutputHeight, + int nTilePosX, + int nTilePosY, + tools::Long nTileWidth, + tools::Long nTileHeight ) override; + virtual Size getDocumentSize() override; + virtual void setPart( int nPart, bool bAllowChangeFocus = true ) override; + virtual int getPart() override; + virtual int getParts() override; + virtual OUString getPartName( int nPart ) override; + virtual OUString getPartHash( int nPart ) override; + virtual VclPtr getDocWindow() override; + bool isMasterViewMode(); + + /// @see vcl::ITiledRenderable::setPartMode(). + virtual void setPartMode( int nPartMode ) override; + /// @see vcl::ITiledRenderable::getEditMode(). + virtual int getEditMode() override; + /// @see vcl::ITiledRenderable::setEditMode(). + virtual void setEditMode(int) override; + /// @see vcl::ITiledRenderable::initializeForTiledRendering(). + virtual void initializeForTiledRendering(const css::uno::Sequence& rArguments) override; + /// @see vcl::ITiledRenderable::postKeyEvent(). + virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) override; + /// @see vcl::ITiledRenderable::postMouseEvent(). + virtual void postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) override; + /// @see vcl::ITiledRenderable::setTextSelection(). + virtual void setTextSelection(int nType, int nX, int nY) override; + /// @see vcl::ITiledRenderable::getSelection(). + virtual css::uno::Reference getSelection() override; + /// @see vcl::ITiledRenderable::setGraphicSelection(). + virtual void setGraphicSelection(int nType, int nX, int nY) override; + /// @see lok::Document::resetSelection(). + virtual void resetSelection() override; + /// @see vcl::ITiledRenderable::setClientVisibleArea(). + virtual void setClientVisibleArea(const tools::Rectangle& rRectangle) override; + /// @see vcl::ITiledRenderable::setClipboard(). + virtual void setClipboard(const css::uno::Reference& xClipboard) override; + /// @see vcl::ITiledRenderable::isMimeTypeSupported(). + virtual bool isMimeTypeSupported() override; + /// @see vcl::ITiledRenderable::getPointer(). + virtual PointerStyle getPointer() override; + /// @see vcl::ITiledRenderable::getPostIts(). + virtual void getPostIts(tools::JsonWriter& /*rJsonWriter*/) override; + /// @see vcl::ITiledRenderable::selectPart(). + virtual void selectPart(int nPart, int nSelect) override; + /// @see vcl::ITiledRenderable::moveSelectedParts(). + virtual void moveSelectedParts(int nPosition, bool bDuplicate) override; + /// @see vcl::ITiledRenderable::getPartInfo(). + virtual OUString getPartInfo(int nPart) override; + /// @see vcl::ITiledRenderable::isDisposed(). + virtual bool isDisposed() const override + { + return mbDisposed; + } + /// @see vcl::ITiledRenderable::setPaintTextEdit(). + virtual void setPaintTextEdit(bool bPaint) override { mbPaintTextEdit = bPaint; } + + /// @see vcl::ITiledRenderable::getViewRenderState(). + OString getViewRenderState(SfxViewShell* pViewShell = nullptr) override; + + // XComponent + + /** This dispose implementation releases the resources held by the + called object and forwards the call to its base class. + When close() has not yet been called then this is done first. As a + consequence the implementation has to cope with being called twice + and still has to forward the second call to the base class. + See also comments of issue 27847. + */ + virtual void SAL_CALL dispose() override; +}; + +/*********************************************************************** +* * +***********************************************************************/ + +class SdDrawPagesAccess final : public ::cppu::WeakImplHelper< css::drawing::XDrawPages, css::container::XNameAccess, css::lang::XServiceInfo, css::lang::XComponent > +{ +private: + SdXImpressDocument* mpModel; + +public: + SdDrawPagesAccess( SdXImpressDocument& rMyModel ) noexcept; + virtual ~SdDrawPagesAccess() noexcept override; + + // XDrawPages + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL insertNewByIndex( sal_Int32 nIndex ) override; + virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XDrawPage >& xPage ) override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; +}; + +/*********************************************************************** +* * +***********************************************************************/ + +class SdMasterPagesAccess final : public ::cppu::WeakImplHelper< css::drawing::XDrawPages, css::lang::XServiceInfo, css::lang::XComponent > +{ +private: + SdXImpressDocument* mpModel; + +public: + SdMasterPagesAccess( SdXImpressDocument& rMyModel ) noexcept; + virtual ~SdMasterPagesAccess() noexcept override; + + // XDrawPages + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL insertNewByIndex( sal_Int32 nIndex ) override; + virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XDrawPage >& xPage ) override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; +}; + +/*********************************************************************** +* * +***********************************************************************/ + +enum SdLinkTargetType +{ + Page = 0, + Notes, + Handout, + MasterPage, + Count +}; + +class SdDocLinkTargets final : public ::cppu::WeakImplHelper< css::container::XNameAccess, + css::lang::XServiceInfo , css::lang::XComponent > +{ +private: + SdXImpressDocument* mpModel; + OUString aNames[SdLinkTargetType::Count]; + +public: + SdDocLinkTargets(SdXImpressDocument& rMyModel); + virtual ~SdDocLinkTargets() noexcept override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; +}; + +class SdDocLinkTargetType final : public ::cppu::WeakImplHelper< css::document::XLinkTargetSupplier, + css::beans::XPropertySet, + css::lang::XServiceInfo > +{ + SdXImpressDocument* mpModel; + sal_uInt16 mnType; + OUString maName; + +public: + SdDocLinkTargetType(SdXImpressDocument* pModel, sal_uInt16 nT); + + // css::document::XLinkTargetSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks() override; + + // css::lang::XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString> SAL_CALL getSupportedServiceNames() override; + + // css::beans::XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override; + virtual void SAL_CALL setPropertyValue(const OUString& aPropertyName, + const css::uno::Any& aValue) override; + virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& PropertyName) override; + virtual void SAL_CALL addPropertyChangeListener(const OUString& aPropertyName, + const css::uno::Reference< css::beans::XPropertyChangeListener > & xListener) override; + virtual void SAL_CALL removePropertyChangeListener(const OUString& aPropertyName, + const css::uno::Reference< css::beans::XPropertyChangeListener > & aListener) override; + virtual void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, + const css::uno::Reference< css::beans::XVetoableChangeListener > & aListener) override; + virtual void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName, + const css::uno::Reference< css::beans::XVetoableChangeListener > & aListener) override; +}; + +class SdDocLinkTarget final : public ::cppu::WeakImplHelper< css::container::XNameAccess, + css::lang::XServiceInfo > +{ +private: + SdXImpressDocument* mpModel; + sal_uInt16 mnType; + +public: + SdDocLinkTarget( SdXImpressDocument* pModel, sal_uInt16 nT ); + + // css::container::XNameAccess + virtual css::uno::Any SAL_CALL getByName(const OUString& aName) override; + virtual css::uno::Sequence< OUString> SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName(const OUString& aName) override; + + // css::container::XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // css::lang::XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; + virtual css::uno::Sequence< OUString> SAL_CALL getSupportedServiceNames() override; + + // internal + /// @throws std::exception + SdPage* FindPage( std::u16string_view rName ) const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unopage.hxx b/sd/source/ui/inc/unopage.hxx new file mode 100644 index 0000000000..14b4975b2c --- /dev/null +++ b/sd/source/ui/inc/unopage.hxx @@ -0,0 +1,302 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include "unosrch.hxx" +#include + +class SdrObject; +class SdXImpressDocument; + +class SdGenericDrawPage : public SvxDrawPage, + public SdUnoSearchReplaceShape, + public css::drawing::XShapeCombiner, + public css::drawing::XShapeBinder, + public css::container::XNamed, + public css::beans::XPropertySet, + public css::beans::XMultiPropertySet, + public css::animations::XAnimationNodeSupplier, + public css::office::XAnnotationAccess, + public css::document::XLinkTargetSupplier +{ +private: + SdXImpressDocument* mpDocModel; + SdrModel* mpSdrModel; + bool mbIsImpressDocument; + sal_Int16 mnTempPageNumber; // for printing handouts + css::uno::Any mSlideLayout; // import slide layout pptx + const SvxItemPropertySet* mpPropSet; + + void UpdateModel(); + +protected: + friend class SdXImpressDocument; + + /// @throws css::lang::IllegalArgumentException + virtual void setBackground( const css::uno::Any& rValue ); + /// @throws std::exception + virtual void getBackground( css::uno::Any& rValue ); + + OUString getBookmarkURL() const; + void setBookmarkURL( std::u16string_view rURL ); + + void SetLeftBorder( sal_Int32 nValue ); + void SetRightBorder( sal_Int32 nValue ); + void SetUpperBorder( sal_Int32 nValue ); + void SetLowerBorder( sal_Int32 nValue ); + + void SetWidth( sal_Int32 nWidth ); + void SetHeight( sal_Int32 nHeight ); + + bool IsImpressDocument() const; + + virtual void disposing() noexcept override; + + css::uno::Any getNavigationOrder(); + void setNavigationOrder( const css::uno::Any& rValue ); + + /// @throws css::uno::RuntimeException + void throwIfDisposed() const; + +public: + SdGenericDrawPage(SdXImpressDocument* pModel, SdPage* pInPage, const SvxItemPropertySet* pSet); + virtual ~SdGenericDrawPage() noexcept override; + + // internal + bool isValid() const { return (SvxDrawPage::mpPage != nullptr) && (mpModel != nullptr); } + + SdPage* GetPage() const { return static_cast(SvxDrawPage::mpPage); } + SdXImpressDocument* GetModel() const; + + static const css::uno::Sequence< sal_Int8 > & getUnoTunnelId() noexcept; + virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& aIdentifier ) override; + + // this is called whenever a SdrObject must be created for an empty api shape wrapper + virtual rtl::Reference CreateSdrObject_( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + + // SvxDrawPage + virtual css::uno::Reference CreateShape(SdrObject *pObj) const override; + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + + // XShapeCombiner + virtual css::uno::Reference< css::drawing::XShape > SAL_CALL combine( const css::uno::Reference< css::drawing::XShapes >& xShapes ) override; + virtual void SAL_CALL split( const css::uno::Reference< css::drawing::XShape >& xGroup ) override; + + // XShapeBinder + virtual css::uno::Reference< css::drawing::XShape > SAL_CALL bind( const css::uno::Reference< css::drawing::XShapes >& xShapes ) override; + virtual void SAL_CALL unbind( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // XMultiPropertySet + virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override; + virtual css::uno::Sequence< css::uno::Any > SAL_CALL getPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames ) override; + virtual void SAL_CALL addPropertiesChangeListener( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertiesChangeListener( const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override; + virtual void SAL_CALL firePropertiesChangeEvent( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override; + + // XLinkTargetSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks( ) override; + + // XServiceInfo + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XAnimationNodeSupplier + virtual css::uno::Reference< css::animations::XAnimationNode > SAL_CALL getAnimationNode( ) override; + + // XAnnotationAccess: + virtual css::uno::Reference< css::office::XAnnotation > SAL_CALL createAndInsertAnnotation() override; + virtual void SAL_CALL removeAnnotation(const css::uno::Reference< css::office::XAnnotation > & annotation) override; + virtual css::uno::Reference< css::office::XAnnotationEnumeration > SAL_CALL createAnnotationEnumeration() override; +}; + +/*********************************************************************** +* * +***********************************************************************/ + +class SdDrawPage final : public css::drawing::XMasterPageTarget, + public css::presentation::XPresentationPage, + public SdGenericDrawPage +{ +private: + css::uno::Sequence< css::uno::Type > maTypeSequence; + + virtual void setBackground( const css::uno::Any& rValue ) override; + virtual void getBackground( css::uno::Any& rValue ) override; +public: + SdDrawPage(SdXImpressDocument* pModel, SdPage* pInPage); + virtual ~SdDrawPage() noexcept override; + + UNO3_GETIMPLEMENTATION_DECL( SdDrawPage ) + + static OUString getPageApiName( SdPage const * pPage ); + static OUString getPageApiNameFromUiName( const OUString& rUIName ); + static OUString getUiNameFromPageApiName( const OUString& rApiName ); + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XMasterPageTarget + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getMasterPage( ) override; + virtual void SAL_CALL setMasterPage( const css::uno::Reference< css::drawing::XDrawPage >& xMasterPage ) override; + + // XPresentationPage + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getNotesPage( ) override; + + // XNamed + virtual OUString SAL_CALL getName( ) override; + virtual void SAL_CALL setName( const OUString& aName ) override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XShapes + virtual void SAL_CALL add( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XShape >& xShape ) override; +}; + +/*********************************************************************** +* * +***********************************************************************/ + +class SdMasterPage final : public css::presentation::XPresentationPage, + public SdGenericDrawPage +{ +private: + css::uno::Sequence< css::uno::Type > maTypeSequence; + + virtual void setBackground( const css::uno::Any& rValue ) override; + virtual void getBackground( css::uno::Any& rValue ) override; + +public: + SdMasterPage(SdXImpressDocument* pModel, SdPage* pInPage); + virtual ~SdMasterPage() noexcept override; + + UNO3_GETIMPLEMENTATION_DECL(SdMasterPage) + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XPresentationPage + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getNotesPage( ) override; + + // XNamed + virtual OUString SAL_CALL getName( ) override; + virtual void SAL_CALL setName( const OUString& aName ) override; + + // XShapes + virtual void SAL_CALL add( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XShape >& xShape ) override; +}; + +/*********************************************************************** +* * +***********************************************************************/ + +class SdPageLinkTargets final : public ::cppu::WeakImplHelper< css::container::XNameAccess, + css::lang::XServiceInfo > +{ +private: + css::uno::Reference< css::drawing::XDrawPage > mxPage; + SdGenericDrawPage* mpUnoPage; + +public: + SdPageLinkTargets( SdGenericDrawPage* pUnoPage ) noexcept; + virtual ~SdPageLinkTargets() noexcept override; + + // internal + SdrObject* FindObject( std::u16string_view rName ) const noexcept; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; +}; + +OUString getUiNameFromPageApiNameImpl( const OUString& rApiName ); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unoprnms.hxx b/sd/source/ui/inc/unoprnms.hxx new file mode 100644 index 0000000000..1d3a905525 --- /dev/null +++ b/sd/source/ui/inc/unoprnms.hxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + + +#define UNO_NAME_PAGE_BACKGROUND "Background" +#define UNO_NAME_PAGE_LEFT "BorderLeft" +#define UNO_NAME_PAGE_RIGHT "BorderRight" +#define UNO_NAME_PAGE_TOP "BorderTop" +#define UNO_NAME_PAGE_BOTTOM "BorderBottom" +#define UNO_NAME_PAGE_CHANGE "Change" +#define UNO_NAME_PAGE_DURATION "Duration" +#define UNO_NAME_PAGE_EFFECT "Effect" +#define UNO_NAME_PAGE_HEIGHT "Height" +#define UNO_NAME_PAGE_LAYOUT "Layout" +#define UNO_NAME_PAGE_NUMBER "Number" +#define UNO_NAME_PAGE_ORIENTATION "Orientation" +#define UNO_NAME_PAGE_SPEED "Speed" +#define UNO_NAME_PAGE_TRANSITION_DURATION "TransitionDuration" +#define UNO_NAME_PAGE_WIDTH "Width" +#define UNO_NAME_PAGE_PREVIEW "Preview" +#define UNO_NAME_PAGE_PREVIEWBITMAP "PreviewBitmap" +#define UNO_NAME_PAGE_PREVIEWMETAFILE "PreviewMetafile" +#define UNO_NAME_PAGE_VISIBLE "Visible" + +#define UNO_NAME_OBJ_BOOKMARK "Bookmark" +#define UNO_NAME_OBJ_DIMCOLOR "DimColor" +#define UNO_NAME_OBJ_DIMHIDE "DimHide" +#define UNO_NAME_OBJ_DIMPREV "DimPrevious" +#define UNO_NAME_OBJ_EFFECT "Effect" +#define UNO_NAME_OBJ_ISEMPTYPRESOBJ "IsEmptyPresentationObject" +#define UNO_NAME_OBJ_ISPRESOBJ "IsPresentationObject" +#define UNO_NAME_OBJ_CLICKACTION "OnClick" +#define UNO_NAME_OBJ_PLAYFULL "PlayFull" +#define UNO_NAME_OBJ_PRESORDER "PresentationOrder" +#define UNO_NAME_OBJ_SOUNDFILE "Sound" +#define UNO_NAME_OBJ_SOUNDON "SoundOn" +#define UNO_NAME_OBJ_SPEED "Speed" +#define UNO_NAME_OBJ_TEXTEFFECT "TextEffect" +#define UNO_NAME_OBJ_BLUESCREEN "TransparentColor" +#define UNO_NAME_OBJ_VERB "Verb" +#define UNO_NAME_OBJ_STYLE "Style" +#define UNO_NAME_OBJ_MASTERDEPENDENT "IsPlaceholderDependent" +#define UNO_NAME_OBJ_ANIMATIONPATH "AnimationPath" +#define UNO_NAME_OBJ_LEGACYFRAGMENT "LegacyFragment" + +#define UNO_NAME_LAYER_LOCKED "IsLocked" +#define UNO_NAME_LAYER_PRINTABLE "IsPrintable" +#define UNO_NAME_LAYER_VISIBLE "IsVisible" +#define UNO_NAME_LAYER_NAME "Name" + + +#define UNO_NAME_SEARCH_BACKWARDS "SearchBackwards" +#define UNO_NAME_SEARCH_CASE "SearchCaseSensitive" +#define UNO_NAME_SEARCH_WORDS "SearchWords" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unosrch.hxx b/sd/source/ui/inc/unosrch.hxx new file mode 100644 index 0000000000..104fd27474 --- /dev/null +++ b/sd/source/ui/inc/unosrch.hxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace com::sun::star::drawing { class XDrawPage; } +namespace com::sun::star::drawing { class XShape; } +namespace com::sun::star::text { class XTextRange; } +namespace com::sun::star::util { class XSearchDescriptor; } + +class SvxItemPropertySet; +class SdUnoSearchReplaceDescriptor; + +/** this class implements a search or replace operation on a given page or a given sdrobj */ +class SdUnoSearchReplaceShape : public css::util::XReplaceable +{ + css::drawing::XDrawPage* mpPage; + +protected: + css::uno::Reference< css::text::XTextRange > Search( const css::uno::Reference< css::text::XTextRange >& xText, SdUnoSearchReplaceDescriptor* pDescr ); + bool Search( const OUString& rText, sal_Int32& nStartPos, sal_Int32& nEndPos, SdUnoSearchReplaceDescriptor* pDescr ) noexcept; + static ESelection GetSelection( const css::uno::Reference< css::text::XTextRange >& xTextRange ) noexcept; + static css::uno::Reference< css::drawing::XShape > GetShape( const css::uno::Reference< css::text::XTextRange >& xTextRange ) noexcept; + css::uno::Reference< css::drawing::XShape > GetNextShape( const css::uno::Reference< css::container::XIndexAccess >& xShapes, const css::uno::Reference< css::drawing::XShape >& xCurrentShape ) noexcept; + css::uno::Reference< css::drawing::XShape > GetCurrentShape() const noexcept; + +public: + // danger, this c'tor is only usable if the given shape or page is derived + // from this class!!! + SdUnoSearchReplaceShape( css::drawing::XDrawPage* xPage ) noexcept; + virtual ~SdUnoSearchReplaceShape() noexcept; + + // XReplaceable + virtual css::uno::Reference< css::util::XReplaceDescriptor > SAL_CALL createReplaceDescriptor( ) override; + virtual sal_Int32 SAL_CALL replaceAll( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override; + + // XSearchable + virtual css::uno::Reference< css::util::XSearchDescriptor > SAL_CALL createSearchDescriptor( ) override; + virtual css::uno::Reference< css::container::XIndexAccess > SAL_CALL findAll( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL findFirst( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL findNext( const css::uno::Reference< css::uno::XInterface >& xStartAt, const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override; +}; + +/* ================================================================= */ + +/** this class holds the parameters and status of a search or replace operation performed + by class SdUnoSearchReplaceShape */ + +class SdUnoSearchReplaceDescriptor final : public ::cppu::WeakImplHelper< css::util::XReplaceDescriptor > // public css::util::XSearchDescriptor, css::beans::XPropertySet +{ + std::unique_ptr mpPropSet; + + bool mbBackwards; + bool mbCaseSensitive; + bool mbWords; + + OUString maSearchStr; + OUString maReplaceStr; + +public: + /// @throws css::uno::RuntimeException + SdUnoSearchReplaceDescriptor(); + virtual ~SdUnoSearchReplaceDescriptor() noexcept override; + + bool IsCaseSensitive() const { return mbCaseSensitive; } + bool IsWords() const { return mbWords; } + + // XSearchDescriptor + virtual OUString SAL_CALL getSearchString( ) override; + virtual void SAL_CALL setSearchString( const OUString& aString ) override; + + // XReplaceDescriptor + virtual OUString SAL_CALL getReplaceString( ) override; + virtual void SAL_CALL setReplaceString( const OUString& aReplaceString ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; +}; + +/* ================================================================= */ + +/** this class holds a sequence that is a result from a find all and + lets people access it through the XIndexAccess Interface. */ +class SdUnoFindAllAccess final : public ::cppu::WeakImplHelper< css::container::XIndexAccess > // public css::container::XElementAccess +{ + css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > maSequence; + +public: + SdUnoFindAllAccess( css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > const & rSequence ) noexcept; + virtual ~SdUnoFindAllAccess() noexcept override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/unprlout.hxx b/sd/source/ui/inc/unprlout.hxx new file mode 100644 index 0000000000..8d75204f19 --- /dev/null +++ b/sd/source/ui/inc/unprlout.hxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +class SdDrawDocument; +class SdPage; + +class SdPresentationLayoutUndoAction final : public SdUndoAction +{ + OUString aOldLayoutName; + OUString aNewLayoutName; + AutoLayout eOldAutoLayout; + AutoLayout eNewAutoLayout; + bool bSetAutoLayout; // sal_True: change AutoLayout + SdPage* pPage; + OUString aComment; + +public: + SdPresentationLayoutUndoAction(SdDrawDocument* pTheDoc, + const OUString& aTheOldLayoutName, + const OUString& aTheNewLayoutName, + AutoLayout eTheOldAutoLayout, + AutoLayout eTheNewAutoLayout, + bool bSet, + SdPage* pThePage); + + virtual ~SdPresentationLayoutUndoAction() override; + virtual void Undo() override; + virtual void Redo() override; + + virtual OUString GetComment() const override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/vectdlg.hxx b/sd/source/ui/inc/vectdlg.hxx new file mode 100644 index 0000000000..ac7a1bfd49 --- /dev/null +++ b/sd/source/ui/inc/vectdlg.hxx @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd { +class DrawDocShell; +} + +/****************************************************************************** +|* +|* SdVectorizeDlg +|* +\******************************************************************************/ + +class SdVectorizeDlg final : public weld::GenericDialogController +{ + ::sd::DrawDocShell* m_pDocSh; + Bitmap aBmp; + Bitmap aPreviewBmp; + GDIMetaFile aMtf; + + GraphCtrl m_aBmpWin; + GraphCtrl m_aMtfWin; + + std::unique_ptr m_xNmLayers; + std::unique_ptr m_xMtReduce; + std::unique_ptr m_xFtFillHoles; + std::unique_ptr m_xMtFillHoles; + std::unique_ptr m_xCbFillHoles; + std::unique_ptr m_xBmpWin; + std::unique_ptr m_xMtfWin; + std::unique_ptr m_xPrgs; + std::unique_ptr m_xBtnOK; + std::unique_ptr m_xBtnPreview; + + void LoadSettings(); + void SaveSettings() const; + void InitPreviewBmp(); + + static ::tools::Rectangle GetRect( const Size& rDispSize, const Size& rBmpSize ); + Bitmap GetPreparedBitmap( Bitmap const & rBmp, Fraction& rScale ); + void Calculate( Bitmap const & rBmp, GDIMetaFile& rMtf ); + static void AddTile( BitmapReadAccess const * pRAcc, GDIMetaFile& rMtf, + tools::Long nPosX, tools::Long nPosY, tools::Long nWidth, tools::Long nHeight ); + + DECL_LINK( ProgressHdl, tools::Long, void ); + DECL_LINK( ClickPreviewHdl, weld::Button&, void ); + DECL_LINK( ClickOKHdl, weld::Button&, void ); + DECL_LINK( ToggleHdl, weld::Toggleable&, void ); + DECL_LINK( ModifyHdl, weld::SpinButton&, void ); + DECL_LINK( MetricModifyHdl, weld::MetricSpinButton&, void ); + +public: + + SdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell); + virtual ~SdVectorizeDlg() override; + + const GDIMetaFile& GetGDIMetaFile() const { return aMtf; } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/view/viewoverlaymanager.hxx b/sd/source/ui/inc/view/viewoverlaymanager.hxx new file mode 100644 index 0000000000..3a5c98deb3 --- /dev/null +++ b/sd/source/ui/inc/view/viewoverlaymanager.hxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include + +namespace sd +{ +class SmartTag; +} +namespace sd::tools +{ +class EventMultiplexerEvent; +} +namespace sd +{ +class ViewShellBase; +} +struct ImplSVEvent; + +namespace sd +{ +typedef std::vector> ViewTagVector; + +class ViewOverlayManager final : public SfxListener +{ +public: + ViewOverlayManager(ViewShellBase& rViewShellBase); + virtual ~ViewOverlayManager() override; + + void onZoomChanged(); + void UpdateTags(); + + DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void); + DECL_LINK(UpdateTagsHdl, void*, void); + + bool CreateTags(); + bool DisposeTags(); + + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + +private: + ViewShellBase& mrBase; + ImplSVEvent* mnUpdateTagsEvent; + + ViewTagVector maTagVector; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/zoomlist.hxx b/sd/source/ui/inc/zoomlist.hxx new file mode 100644 index 0000000000..b7f7da79d0 --- /dev/null +++ b/sd/source/ui/inc/zoomlist.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +namespace sd +{ +class ViewShell; + +class ZoomList +{ +public: + ZoomList(ViewShell* pViewShell); + + void InsertZoomRect(const ::tools::Rectangle& rRect); + ::tools::Rectangle const& GetNextZoomRect(); + ::tools::Rectangle const& GetPreviousZoomRect(); + bool IsNextPossible() const; + bool IsPreviousPossible() const; + +private: + ViewShell* mpViewShell; + sal_uInt32 mnCurPos; + + std::vector<::tools::Rectangle> maRectangles; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/CanvasUpdateRequester.cxx b/sd/source/ui/presenter/CanvasUpdateRequester.cxx new file mode 100644 index 0000000000..2271ba7815 --- /dev/null +++ b/sd/source/ui/presenter/CanvasUpdateRequester.cxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "CanvasUpdateRequester.hxx" +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::presenter { + +//===== CanvasUpdateRequester::Deleter ======================================== + +class CanvasUpdateRequester::Deleter +{ +public: + void operator() (CanvasUpdateRequester* pObject) { delete pObject; } +}; + +//===== CanvasUpdateRequester ================================================= + +std::shared_ptr CanvasUpdateRequester::Instance ( + const Reference& rxSharedCanvas) +{ + // this global must not own anything or we crash on shutdown + static std::vector, + std::weak_ptr>> s_RequesterMap; + for (auto it = s_RequesterMap.begin(); it != s_RequesterMap.end(); ) + { + uno::Reference const xCanvas(it->first); + if (!xCanvas.is()) + { + it = s_RequesterMap.erase(it); // remove stale entry + } + else if (xCanvas == rxSharedCanvas) + { + std::shared_ptr pRequester(it->second); + if (pRequester) + { + return pRequester; + } + else + { + std::shared_ptr const pNew( + new CanvasUpdateRequester(rxSharedCanvas), Deleter()); + it->second = pNew; + return pNew; + } + } + else + { + ++it; + } + } + + // No requester for the given canvas found. Create a new one. + std::shared_ptr pRequester ( + new CanvasUpdateRequester(rxSharedCanvas), Deleter()); + s_RequesterMap.emplace_back(rxSharedCanvas, pRequester); + return pRequester; +} + + +CanvasUpdateRequester::CanvasUpdateRequester ( + const Reference& rxCanvas) + : mxCanvas(rxCanvas) + , m_pUserEventId(nullptr) + , mbUpdateFlag(false) +{ + Reference xComponent (mxCanvas, UNO_QUERY); + if (xComponent.is()) + { + //xComponent->addEventListener(this); + } +} + +CanvasUpdateRequester::~CanvasUpdateRequester() +{ + assert(m_pUserEventId == nullptr); +} + +void CanvasUpdateRequester::RequestUpdate (const bool bUpdateAll) +{ + if (m_pUserEventId == nullptr) + { + m_pThis = shared_from_this(); // keep instance alive until dispatch + mbUpdateFlag = bUpdateAll; + m_pUserEventId = Application::PostUserEvent(LINK(this, CanvasUpdateRequester, Callback)); + } + else + { + mbUpdateFlag |= bUpdateAll; + } +} + +IMPL_LINK_NOARG(CanvasUpdateRequester, Callback, void*, void) +{ + m_pUserEventId = nullptr; + if (mxCanvas.is()) + { + mxCanvas->updateScreen(mbUpdateFlag); + mbUpdateFlag = false; + } + assert(m_pThis); + m_pThis.reset(); // possibly delete "this" +} + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/CanvasUpdateRequester.hxx b/sd/source/ui/presenter/CanvasUpdateRequester.hxx new file mode 100644 index 0000000000..ebb582ead9 --- /dev/null +++ b/sd/source/ui/presenter/CanvasUpdateRequester.hxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::rendering +{ +class XSpriteCanvas; +} + +struct ImplSVEvent; + +namespace sd::presenter +{ +/** Each UpdateRequester handles update requests (calls to + XCanvas::updateScreen()) for one shared canvas (a canvas that has one or + more PresenterCanvas wrappers). Multiple calls are collected and lead + to a single call to updateScreen. +*/ +class CanvasUpdateRequester : public std::enable_shared_from_this +{ +public: + CanvasUpdateRequester(const CanvasUpdateRequester&) = delete; + CanvasUpdateRequester& operator=(const CanvasUpdateRequester&) = delete; + + /** @return the Canvas UpdateRequester object for the given shared canvas. + A new object is created when it does not already exist. + */ + static std::shared_ptr + Instance(const css::uno::Reference& rxCanvas); + + void RequestUpdate(const bool bUpdateAll); + +private: + explicit CanvasUpdateRequester( + const css::uno::Reference& rxCanvas); + ~CanvasUpdateRequester(); + class Deleter; + friend class Deleter; + + /// keep instance alive waiting for event dispatch + std::shared_ptr m_pThis; + css::uno::Reference mxCanvas; + ImplSVEvent* m_pUserEventId; + bool mbUpdateFlag; + + DECL_LINK(Callback, void*, void); +}; + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/PresenterCanvas.cxx b/sd/source/ui/presenter/PresenterCanvas.cxx new file mode 100644 index 0000000000..5791204c8f --- /dev/null +++ b/sd/source/ui/presenter/PresenterCanvas.cxx @@ -0,0 +1,791 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterCanvas.hxx" +#include "CanvasUpdateRequester.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::presenter { + +//===== PresenterCustomSprite ================================================= + +/** Wrapper around a sprite that is displayed on a PresenterCanvas. +*/ +namespace { + typedef comphelper::WeakComponentImplHelper < + css::rendering::XCustomSprite + > PresenterCustomSpriteInterfaceBase; + +class PresenterCustomSprite final + : public PresenterCustomSpriteInterfaceBase +{ +public: + PresenterCustomSprite ( + rtl::Reference pCanvas, + const Reference& rxSprite, + const Reference& rxBaseWindow); + PresenterCustomSprite(const PresenterCustomSprite&) = delete; + PresenterCustomSprite& operator=(const PresenterCustomSprite&) = delete; + virtual void disposing(std::unique_lock&) override; + + // XSprite + + virtual void SAL_CALL setAlpha (double nAlpha) override; + + virtual void SAL_CALL move (const geometry::RealPoint2D& rNewPos, + const rendering::ViewState& rViewState, + const rendering::RenderState& rRenderState) override; + + virtual void SAL_CALL transform (const geometry::AffineMatrix2D& rTransformation) override; + + virtual void SAL_CALL clip (const Reference& rClip) override; + + virtual void SAL_CALL setPriority (double nPriority) override; + + virtual void SAL_CALL show() override; + + virtual void SAL_CALL hide() override; + + // XCustomSprite + + virtual Reference SAL_CALL getContentCanvas() override; + +private: + rtl::Reference mpCanvas; + Reference mxSprite; + Reference mxBaseWindow; + geometry::RealPoint2D maPosition; + + /// @throws css::lang::DisposedException + void ThrowIfDisposed(); +}; + +} + +//===== PresenterCanvas ======================================================= + +PresenterCanvas::PresenterCanvas ( + const Reference& rxUpdateCanvas, + const Reference& rxUpdateWindow, + const Reference& rxSharedCanvas, + const Reference& rxSharedWindow, + const Reference& rxWindow) + : mxUpdateCanvas(rxUpdateCanvas), + mxUpdateWindow(rxUpdateWindow), + mxSharedCanvas(rxSharedCanvas), + mxSharedWindow(rxSharedWindow), + mxWindow(rxWindow), + mbOffsetUpdatePending(true) +{ + if (mxWindow.is()) + mxWindow->addWindowListener(this); + + if (mxUpdateCanvas.is()) + { + m_pUpdateRequester = CanvasUpdateRequester::Instance(mxUpdateCanvas); + } +} + +PresenterCanvas::~PresenterCanvas() +{ +} + +void PresenterCanvas::disposing(std::unique_lock&) +{ + if (mxWindow.is()) + { + mxWindow->removeWindowListener(this); + mxWindow.clear(); + } +} + +//----- XCanvas --------------------------------------------------------------- + +void SAL_CALL PresenterCanvas::clear() +{ + ThrowIfDisposed(); + // ToDo: Clear the area covered by the child window. A simple forward + // would clear the whole shared canvas. +} + +void SAL_CALL PresenterCanvas::drawPoint ( + const css::geometry::RealPoint2D& aPoint, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + mxSharedCanvas->drawPoint(aPoint,MergeViewState(aViewState),aRenderState); +} + +void SAL_CALL PresenterCanvas::drawLine ( + const css::geometry::RealPoint2D& aStartPoint, + const css::geometry::RealPoint2D& aEndPoint, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + mxSharedCanvas->drawLine(aStartPoint,aEndPoint,MergeViewState(aViewState),aRenderState); +} + +void SAL_CALL PresenterCanvas::drawBezier ( + const css::geometry::RealBezierSegment2D& aBezierSegment, + const css::geometry::RealPoint2D& aEndPoint, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + mxSharedCanvas->drawBezier(aBezierSegment,aEndPoint,MergeViewState(aViewState),aRenderState); +} + +css::uno::Reference SAL_CALL PresenterCanvas::drawPolyPolygon ( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + return mxSharedCanvas->drawPolyPolygon( + xPolyPolygon, MergeViewState(aViewState), aRenderState); +} + +css::uno::Reference SAL_CALL PresenterCanvas::strokePolyPolygon ( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::rendering::StrokeAttributes& aStrokeAttributes) +{ + ThrowIfDisposed(); + return mxSharedCanvas->strokePolyPolygon( + xPolyPolygon, MergeViewState(aViewState), aRenderState, aStrokeAttributes); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::strokeTexturedPolyPolygon ( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence< css::rendering::Texture >& aTextures, + const css::rendering::StrokeAttributes& aStrokeAttributes) +{ + ThrowIfDisposed(); + return mxSharedCanvas->strokeTexturedPolyPolygon( + xPolyPolygon, MergeViewState(aViewState), aRenderState, aTextures, aStrokeAttributes); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::strokeTextureMappedPolyPolygon( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence& aTextures, + const css::uno::Reference& xMapping, + const css::rendering::StrokeAttributes& aStrokeAttributes) +{ + ThrowIfDisposed(); + return mxSharedCanvas->strokeTextureMappedPolyPolygon( + xPolyPolygon, + MergeViewState(aViewState), + aRenderState, + aTextures, + xMapping, + aStrokeAttributes); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::queryStrokeShapes( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::rendering::StrokeAttributes& aStrokeAttributes) +{ + ThrowIfDisposed(); + return mxSharedCanvas->queryStrokeShapes( + xPolyPolygon, MergeViewState(aViewState), aRenderState, aStrokeAttributes); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::fillPolyPolygon( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + return mxSharedCanvas->fillPolyPolygon( + xPolyPolygon, MergeViewState(aViewState), aRenderState); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::fillTexturedPolyPolygon( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence& xTextures) +{ + ThrowIfDisposed(); + return mxSharedCanvas->fillTexturedPolyPolygon( + xPolyPolygon, MergeViewState(aViewState), aRenderState, xTextures); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::fillTextureMappedPolyPolygon( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence< css::rendering::Texture >& xTextures, + const css::uno::Reference< css::geometry::XMapping2D >& xMapping) +{ + ThrowIfDisposed(); + return mxSharedCanvas->fillTextureMappedPolyPolygon( + xPolyPolygon, MergeViewState(aViewState), aRenderState, xTextures, xMapping); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::createFont( + const css::rendering::FontRequest& aFontRequest, + const css::uno::Sequence< css::beans::PropertyValue >& aExtraFontProperties, + const css::geometry::Matrix2D& aFontMatrix) +{ + ThrowIfDisposed(); + return mxSharedCanvas->createFont( + aFontRequest, aExtraFontProperties, aFontMatrix); +} + +css::uno::Sequence SAL_CALL + PresenterCanvas::queryAvailableFonts( + const css::rendering::FontInfo& aFilter, + const css::uno::Sequence< css::beans::PropertyValue >& aFontProperties) +{ + ThrowIfDisposed(); + return mxSharedCanvas->queryAvailableFonts(aFilter, aFontProperties); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::drawText( + const css::rendering::StringContext& aText, + const css::uno::Reference< css::rendering::XCanvasFont >& xFont, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + ::sal_Int8 nTextDirection) +{ + ThrowIfDisposed(); + return mxSharedCanvas->drawText( + aText, xFont, MergeViewState(aViewState), aRenderState, nTextDirection); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::drawTextLayout( + const css::uno::Reference< css::rendering::XTextLayout >& xLayoutetText, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + return mxSharedCanvas->drawTextLayout( + xLayoutetText, MergeViewState(aViewState), aRenderState); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::drawBitmap( + const css::uno::Reference< css::rendering::XBitmap >& xBitmap, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + return mxSharedCanvas->drawBitmap( + xBitmap, MergeViewState(aViewState), aRenderState); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::drawBitmapModulated( + const css::uno::Reference< css::rendering::XBitmap>& xBitmap, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) +{ + ThrowIfDisposed(); + return mxSharedCanvas->drawBitmapModulated( + xBitmap, MergeViewState(aViewState), aRenderState); +} + +css::uno::Reference SAL_CALL + PresenterCanvas::getDevice() +{ + ThrowIfDisposed(); + return mxSharedCanvas->getDevice(); +} + +//----- XSpriteCanvas --------------------------------------------------------- + +Reference SAL_CALL + PresenterCanvas::createSpriteFromAnimation ( + const css::uno::Reference& rAnimation) +{ + ThrowIfDisposed(); + + Reference xSpriteCanvas (mxSharedCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + return xSpriteCanvas->createSpriteFromAnimation(rAnimation); + else + return nullptr; +} + +Reference SAL_CALL + PresenterCanvas::createSpriteFromBitmaps ( + const css::uno::Sequence< + css::uno::Reference< css::rendering::XBitmap > >& rAnimationBitmaps, + ::sal_Int8 nInterpolationMode) +{ + ThrowIfDisposed(); + + Reference xSpriteCanvas (mxSharedCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + return xSpriteCanvas->createSpriteFromBitmaps(rAnimationBitmaps, nInterpolationMode); + else + return nullptr; +} + +Reference SAL_CALL + PresenterCanvas::createCustomSprite ( + const css::geometry::RealSize2D& rSpriteSize) +{ + ThrowIfDisposed(); + + Reference xSpriteCanvas (mxSharedCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + return new PresenterCustomSprite( + this, + xSpriteCanvas->createCustomSprite(rSpriteSize), + mxSharedWindow); + else if (mxUpdateCanvas.is()) + return new PresenterCustomSprite( + this, + mxUpdateCanvas->createCustomSprite(rSpriteSize), + mxUpdateWindow); + else + return nullptr; +} + +Reference SAL_CALL + PresenterCanvas::createClonedSprite ( + const css::uno::Reference< css::rendering::XSprite >& rxOriginal) +{ + ThrowIfDisposed(); + + Reference xSpriteCanvas (mxSharedCanvas, UNO_QUERY); + if (xSpriteCanvas.is()) + return xSpriteCanvas->createClonedSprite(rxOriginal); + if (mxUpdateCanvas.is()) + return mxUpdateCanvas->createClonedSprite(rxOriginal); + return nullptr; +} + +sal_Bool SAL_CALL PresenterCanvas::updateScreen (sal_Bool bUpdateAll) +{ + ThrowIfDisposed(); + + mbOffsetUpdatePending = true; + if (m_pUpdateRequester != nullptr) + { + m_pUpdateRequester->RequestUpdate(bUpdateAll); + return true; + } + else + { + return false; + } +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL PresenterCanvas::disposing (const css::lang::EventObject& rEvent) +{ + ThrowIfDisposed(); + if (rEvent.Source == mxWindow) + mxWindow = nullptr; +} + +//----- XWindowListener ------------------------------------------------------- + +void SAL_CALL PresenterCanvas::windowResized (const css::awt::WindowEvent&) +{ + ThrowIfDisposed(); + mbOffsetUpdatePending = true; +} + +void SAL_CALL PresenterCanvas::windowMoved (const css::awt::WindowEvent&) +{ + ThrowIfDisposed(); + mbOffsetUpdatePending = true; +} + +void SAL_CALL PresenterCanvas::windowShown (const css::lang::EventObject&) +{ + ThrowIfDisposed(); + mbOffsetUpdatePending = true; +} + +void SAL_CALL PresenterCanvas::windowHidden (const css::lang::EventObject&) +{ + ThrowIfDisposed(); +} + +//----- XBitmap --------------------------------------------------------------- + +geometry::IntegerSize2D SAL_CALL PresenterCanvas::getSize() +{ + ThrowIfDisposed(); + + if (mxWindow.is()) + { + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + return geometry::IntegerSize2D(aWindowBox.Width, aWindowBox.Height); + } + else + return geometry::IntegerSize2D(0,0); +} + +sal_Bool SAL_CALL PresenterCanvas::hasAlpha() +{ + Reference xBitmap (mxSharedCanvas, UNO_QUERY); + if (xBitmap.is()) + return xBitmap->hasAlpha(); + else + return false; +} + +Reference SAL_CALL PresenterCanvas::getScaledBitmap( + const css::geometry::RealSize2D&, + sal_Bool) +{ + ThrowIfDisposed(); + + // Not implemented. + + return nullptr; +} + +rendering::ViewState PresenterCanvas::MergeViewState ( + const rendering::ViewState& rViewState) +{ + // Make sure the offset is up-to-date. + if (mbOffsetUpdatePending) + maOffset = GetOffset(mxSharedWindow); + return MergeViewState(rViewState, maOffset); +} + +css::rendering::ViewState PresenterCanvas::MergeViewState ( + const css::rendering::ViewState& rViewState, + const css::awt::Point& rOffset) +{ + // Early rejects. + if ( ! mxSharedCanvas.is()) + return rViewState; + + Reference xDevice (mxSharedCanvas->getDevice()); + if ( ! xDevice.is()) + return rViewState; + + // Create a modifiable copy of the given view state. + rendering::ViewState aViewState (rViewState); + + // Prepare the local clip rectangle. + ::basegfx::B2DRectangle aWindowRange (GetClipRectangle(aViewState.AffineTransform, rOffset)); + + // Adapt the offset of the view state. + aViewState.AffineTransform.m02 += rOffset.X; + aViewState.AffineTransform.m12 += rOffset.Y; + + // Adapt the clip polygon. + if ( ! aViewState.Clip.is()) + { + // Cancel out the later multiplication with the view state + // transformation. + aViewState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( + xDevice, + ::basegfx::B2DPolyPolygon(::basegfx::utils::createPolygonFromRect(aWindowRange))); + } + else + { + // Have to compute the intersection of the given clipping polygon in + // the view state and the local clip rectangle. + + // Clip the view state clipping polygon against the local clip rectangle. + const ::basegfx::B2DPolyPolygon aClipPolygon ( + ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D( + aViewState.Clip)); + const ::basegfx::B2DPolyPolygon aClippedClipPolygon ( + ::basegfx::utils::clipPolyPolygonOnRange( + aClipPolygon, + aWindowRange, + true, /* bInside */ + false /* bStroke */)); + + aViewState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( + xDevice, + aClippedClipPolygon); + } + + return aViewState; +} + +awt::Point PresenterCanvas::GetOffset (const Reference& rxBaseWindow) +{ + mbOffsetUpdatePending = false; + if (mxWindow.is() && rxBaseWindow.is()) + { + VclPtr pWindow = VCLUnoHelper::GetWindow(mxWindow); + VclPtr pSharedWindow = VCLUnoHelper::GetWindow(rxBaseWindow); + if (pWindow && pSharedWindow) + { + ::tools::Rectangle aBox = pWindow->GetWindowExtentsRelative(*pSharedWindow); + + // Calculate offset of this canvas with respect to the shared + // canvas. + return awt::Point(aBox.Left(), aBox.Top()); + } + } + + return awt::Point(0, 0); +} + +::basegfx::B2DRectangle PresenterCanvas::GetClipRectangle ( + const css::geometry::AffineMatrix2D& rViewTransform, + const awt::Point& rOffset) +{ + VclPtr pWindow = VCLUnoHelper::GetWindow(mxWindow); + if (!pWindow) + return ::basegfx::B2DRectangle(); + + VclPtr pSharedWindow = VCLUnoHelper::GetWindow(mxSharedWindow); + if (!pSharedWindow) + return ::basegfx::B2DRectangle(); + + // Get the bounding box of the window and create a range in the + // coordinate system of the child window. + // Use the window extents. + ::tools::Rectangle aLocalClip = pWindow->GetWindowExtentsRelative(*pSharedWindow); + + // The local clip rectangle is used to clip the view state clipping + // polygon. + ::basegfx::B2DRectangle aWindowRectangle ( + aLocalClip.Left() - rOffset.X, + aLocalClip.Top() - rOffset.Y, + aLocalClip.Right() - rOffset.X + 1, + aLocalClip.Bottom() - rOffset.Y + 1); + + // Calculate the inverted view state transformation to cancel out a + // later transformation of the local clip polygon with the view state + // transformation. + ::basegfx::B2DHomMatrix aInvertedViewStateTransformation; + ::basegfx::unotools::homMatrixFromAffineMatrix( + aInvertedViewStateTransformation, + rViewTransform); + if (aInvertedViewStateTransformation.invert()) + { + // Cancel out the later multiplication with the view state + // transformation. + aWindowRectangle.transform(aInvertedViewStateTransformation); + } + + return aWindowRectangle; +} + +Reference PresenterCanvas::UpdateSpriteClip ( + const Reference& rxOriginalClip, + const geometry::RealPoint2D& rLocation) +{ + // Check used resources and just return the original clip when not + // every one of them is available. + if ( ! mxWindow.is()) + return rxOriginalClip; + + Reference xDevice (mxSharedCanvas->getDevice()); + if ( ! xDevice.is()) + return rxOriginalClip; + + // Determine the bounds of the clip rectangle (the window border) in the + // coordinate system of the sprite. + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + const double nMinX (-rLocation.X); + const double nMinY (-rLocation.Y); + const double nMaxX (aWindowBox.Width-rLocation.X); + const double nMaxY (aWindowBox.Height-rLocation.Y); + + // Create a clip polygon. + Reference xPolygon; + if (rxOriginalClip.is()) + { + // Combine the original clip with the window clip. + const ::basegfx::B2DPolyPolygon aOriginalClip ( + ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rxOriginalClip)); + ::basegfx::B2DRectangle aWindowRange (nMinX, nMinY, nMaxX, nMaxY); + const ::basegfx::B2DPolyPolygon aClippedClipPolygon ( + ::basegfx::utils::clipPolyPolygonOnRange( + aOriginalClip, + aWindowRange, + true, /* bInside */ + false /* bStroke */)); + xPolygon = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( + xDevice, + aClippedClipPolygon); + } + else + { + // Create a new clip polygon from the window clip rectangle. + Sequence > aPoints + { + { + { nMinX,nMinY }, + { nMaxX,nMinY }, + { nMaxX,nMaxY }, + { nMinX,nMaxY } + } + }; + Reference xLinePolygon( + xDevice->createCompatibleLinePolyPolygon(aPoints)); + if (xLinePolygon.is()) + xLinePolygon->setClosed(0, true); + xPolygon = xLinePolygon; + } + + return xPolygon; +} + +void PresenterCanvas::ThrowIfDisposed() +{ + if (m_bDisposed || ! mxSharedCanvas.is()) + { + throw lang::DisposedException ("PresenterCanvas object has already been disposed", + static_cast(this)); + } +} + +//===== PresenterCustomSprite ================================================= + +PresenterCustomSprite::PresenterCustomSprite ( + rtl::Reference pCanvas, + const Reference& rxSprite, + const Reference& rxBaseWindow) + : mpCanvas(std::move(pCanvas)), + mxSprite(rxSprite), + mxBaseWindow(rxBaseWindow), + maPosition(0,0) +{ +} + +void PresenterCustomSprite::disposing(std::unique_lock&) +{ + Reference xComponent (mxSprite, UNO_QUERY); + mxSprite = nullptr; + if (xComponent.is()) + xComponent->dispose(); + mpCanvas.clear(); +} + +//----- XSprite --------------------------------------------------------------- + +void SAL_CALL PresenterCustomSprite::setAlpha (const double nAlpha) +{ + ThrowIfDisposed(); + mxSprite->setAlpha(nAlpha); +} + +void SAL_CALL PresenterCustomSprite::move ( + const geometry::RealPoint2D& rNewPos, + const rendering::ViewState& rViewState, + const rendering::RenderState& rRenderState) +{ + ThrowIfDisposed(); + maPosition = rNewPos; + mxSprite->move( + rNewPos, + mpCanvas->MergeViewState(rViewState, mpCanvas->GetOffset(mxBaseWindow)), + rRenderState); + // Clip sprite against window bounds. This call is necessary because + // sprite clipping is done in the coordinate system of the sprite. + // Therefore, after each change of the sprites location the window + // bounds have to be transformed into the sprites coordinate system. + clip(nullptr); +} + +void SAL_CALL PresenterCustomSprite::transform (const geometry::AffineMatrix2D& rTransformation) +{ + ThrowIfDisposed(); + mxSprite->transform(rTransformation); +} + +void SAL_CALL PresenterCustomSprite::clip (const Reference& rxClip) +{ + ThrowIfDisposed(); + // The clip region is expected in the coordinate system of the sprite. + // UpdateSpriteClip() integrates the window bounds, transformed into the + // sprites coordinate system, with the given clip. + mxSprite->clip(mpCanvas->UpdateSpriteClip(rxClip, maPosition)); +} + +void SAL_CALL PresenterCustomSprite::setPriority (const double nPriority) +{ + ThrowIfDisposed(); + mxSprite->setPriority(nPriority); +} + +void SAL_CALL PresenterCustomSprite::show() +{ + ThrowIfDisposed(); + mxSprite->show(); +} + +void SAL_CALL PresenterCustomSprite::hide() +{ + ThrowIfDisposed(); + mxSprite->hide(); +} + +//----- XCustomSprite --------------------------------------------------------- + +Reference PresenterCustomSprite::getContentCanvas() +{ + ThrowIfDisposed(); + return mxSprite->getContentCanvas(); +} + +void PresenterCustomSprite::ThrowIfDisposed() +{ + if (m_bDisposed || ! mxSprite.is()) + { + throw lang::DisposedException ("PresenterCustomSprite object has already been disposed", + static_cast(this)); + } +} + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/PresenterCanvas.hxx b/sd/source/ui/presenter/PresenterCanvas.hxx new file mode 100644 index 0000000000..da2f51a799 --- /dev/null +++ b/sd/source/ui/presenter/PresenterCanvas.hxx @@ -0,0 +1,320 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace sd::presenter { class CanvasUpdateRequester; } +namespace com::sun::star::awt { class XWindow; } +namespace com::sun::star::geometry { struct AffineMatrix2D; } + +namespace sd::presenter { + +typedef comphelper::WeakComponentImplHelper < + css::rendering::XSpriteCanvas, + css::rendering::XBitmap, + css::awt::XWindowListener +> PresenterCanvasInterfaceBase; + +/** Wrapper around a shared canvas that forwards most of its methods to the + shared canvas. Most notable differences are: + 1. The transformation of the ViewState of forwarded calls is modified by adding + an offset. + 2. The clip polygon of the ViewState of forwarded calls is intersected + with a clip rectangle that can be set via SetClip(). + 3. Calls to updateScreen() are collected. One call to the updateScreen() + method of the shared canvas is made asynchronously. + + The canvas can use different canvases for sharing and for sprite + construction. This allows the shared canvas to be a canvas of sprite itself. +*/ +class PresenterCanvas + : public PresenterCanvasInterfaceBase +{ +public: + /** This constructor is used when a PresenterCanvas object is created + directly, typically by the PresenterCanvasFactory. + @param rxUpdateCanvas + This canvas is used to call updateScreen() at and to create + sprites. In the typical case this canvas is identical to the + rxSharedCanvas argument. + @param rxUpdateWindow + The window that belongs to the canvas given by the + rxUpdateCanvas argument. + @param rxSharedCanvas + The canvas that is wrapped by the new instance of this class. + Typically this is a regular XSpriteCanvas and then is identical + to the one given by the rxUpdateCanvas argument. It may be the + canvas of a sprite which does not support the XSpriteCanvas + interface. In that case the canvas that created the sprite can + be given as rxUpdateCanvas argument to allow to create further + sprites and to have proper calls to updateScreen(). + @param rxSharedWindow + The window that belongs to the canvas given by the + rxSharedCanvas argument. + @param rxWindow + The window that is represented by the new PresenterCanvas + object. It is expected to be a direct descendant of + rxSharedWindow. Its position inside rxSharedWindow defines the + offset of the canvas implemented by the new PresenterCanvas + object and rxSharedCanvas. + */ + PresenterCanvas ( + const css::uno::Reference& rxUpdateCanvas, + const css::uno::Reference& rxUpdateWindow, + const css::uno::Reference& rxSharedCanvas, + const css::uno::Reference& rxSharedWindow, + const css::uno::Reference& rxWindow); + virtual ~PresenterCanvas() override; + PresenterCanvas(const PresenterCanvas&) = delete; + PresenterCanvas& operator=(const PresenterCanvas&) = delete; + + virtual void disposing(std::unique_lock&) override; + + css::awt::Point GetOffset (const css::uno::Reference& rxBaseWindow); + + /** Merge the given view state with the view state that translates the + (virtual) child canvas to the shared canvas. + */ + css::rendering::ViewState MergeViewState ( + const css::rendering::ViewState& rViewState, + const css::awt::Point& raOffset); + + /** Called by custom sprites to update their clip polygon so that they + are clipped at the borders of the canvas. This method has to be + called after each change of the sprite location so that the bounds + of the canvas can be transformed into the coordinate system of the + sprite. + */ + css::uno::Reference UpdateSpriteClip ( + const css::uno::Reference& rxOriginalClip, + const css::geometry::RealPoint2D& rLocation); + + // XCanvas + + virtual void SAL_CALL clear() override; + + virtual void SAL_CALL drawPoint ( + const css::geometry::RealPoint2D& aPoint, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual void SAL_CALL drawLine ( + const css::geometry::RealPoint2D& aStartPoint, + const css::geometry::RealPoint2D& aEndPoint, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual void SAL_CALL drawBezier ( + const css::geometry::RealBezierSegment2D& aBezierSegment, + const css::geometry::RealPoint2D& aEndPoint, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual css::uno::Reference SAL_CALL drawPolyPolygon ( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual css::uno::Reference SAL_CALL strokePolyPolygon ( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::rendering::StrokeAttributes& aStrokeAttributes) override; + + virtual css::uno::Reference SAL_CALL + strokeTexturedPolyPolygon ( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence< css::rendering::Texture >& aTextures, + const css::rendering::StrokeAttributes& aStrokeAttributes) override; + + virtual css::uno::Reference SAL_CALL + strokeTextureMappedPolyPolygon( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence& aTextures, + const css::uno::Reference& xMapping, + const css::rendering::StrokeAttributes& aStrokeAttributes) override; + + virtual css::uno::Reference SAL_CALL + queryStrokeShapes( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::rendering::StrokeAttributes& aStrokeAttributes) override; + + virtual css::uno::Reference SAL_CALL + fillPolyPolygon( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual css::uno::Reference SAL_CALL + fillTexturedPolyPolygon( + const css::uno::Reference& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence& xTextures) override; + + virtual css::uno::Reference SAL_CALL + fillTextureMappedPolyPolygon( + const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + const css::uno::Sequence< css::rendering::Texture >& xTextures, + const css::uno::Reference< css::geometry::XMapping2D >& xMapping) override; + + virtual css::uno::Reference SAL_CALL + createFont( + const css::rendering::FontRequest& aFontRequest, + const css::uno::Sequence< css::beans::PropertyValue >& aExtraFontProperties, + const css::geometry::Matrix2D& aFontMatrix) override; + + virtual css::uno::Sequence SAL_CALL + queryAvailableFonts( + const css::rendering::FontInfo& aFilter, + const css::uno::Sequence< css::beans::PropertyValue >& aFontProperties) override; + + virtual css::uno::Reference SAL_CALL + drawText( + const css::rendering::StringContext& aText, + const css::uno::Reference< css::rendering::XCanvasFont >& xFont, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState, + ::sal_Int8 nTextDirection) override; + + virtual css::uno::Reference SAL_CALL + drawTextLayout( + const css::uno::Reference< css::rendering::XTextLayout >& xLayoutetText, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual css::uno::Reference SAL_CALL + drawBitmap( + const css::uno::Reference< css::rendering::XBitmap >& xBitmap, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual css::uno::Reference SAL_CALL + drawBitmapModulated( + const css::uno::Reference< css::rendering::XBitmap>& xBitmap, + const css::rendering::ViewState& aViewState, + const css::rendering::RenderState& aRenderState) override; + + virtual css::uno::Reference SAL_CALL + getDevice() override; + + // XSpriteCanvas + + css::uno::Reference< css::rendering::XAnimatedSprite > SAL_CALL + createSpriteFromAnimation ( + const css::uno::Reference< css::rendering::XAnimation >& animation) override; + + css::uno::Reference< css::rendering::XAnimatedSprite > SAL_CALL + createSpriteFromBitmaps ( + const css::uno::Sequence< + css::uno::Reference< css::rendering::XBitmap > >& animationBitmaps, + ::sal_Int8 interpolationMode) override; + + css::uno::Reference< css::rendering::XCustomSprite > SAL_CALL + createCustomSprite ( + const css::geometry::RealSize2D& spriteSize) override; + + css::uno::Reference< css::rendering::XSprite > SAL_CALL + createClonedSprite ( + const css::uno::Reference< css::rendering::XSprite >& original) override; + + sal_Bool SAL_CALL updateScreen (sal_Bool bUpdateAll) override; + + // XEventListener + + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XBitmap + + virtual css::geometry::IntegerSize2D SAL_CALL getSize() override; + + virtual sal_Bool SAL_CALL hasAlpha() override; + + virtual css::uno::Reference SAL_CALL getScaledBitmap( + const css::geometry::RealSize2D& rNewSize, + sal_Bool bFast) override; + +private: + css::uno::Reference mxUpdateCanvas; + css::uno::Reference mxUpdateWindow; + css::uno::Reference mxSharedCanvas; + css::uno::Reference mxSharedWindow; + + /** The window for which a canvas is emulated. + */ + css::uno::Reference mxWindow; + + /** Offset of the emulated canvas with respect to the shared canvas. + */ + css::awt::Point maOffset; + + /** The UpdateRequester is used by updateScreen() to schedule + updateScreen() calls at the shared canvas. + */ + std::shared_ptr m_pUpdateRequester; + + /** When this flag is true (it is set to true after every call to + updateScreen()) then the next call to MergeViewState updates the + maOffset member. A possible optimization would set this flag only + to true when one of the windows between mxWindow and mxSharedWindow + changes its position. + */ + bool mbOffsetUpdatePending; + + ::basegfx::B2DRectangle GetClipRectangle ( + const css::geometry::AffineMatrix2D& rViewTransform, + const css::awt::Point& rOffset); + + css::rendering::ViewState MergeViewState (const css::rendering::ViewState& rViewState); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/PresenterHelper.cxx b/sd/source/ui/presenter/PresenterHelper.cxx new file mode 100644 index 0000000000..ec22beeedc --- /dev/null +++ b/sd/source/ui/presenter/PresenterHelper.cxx @@ -0,0 +1,479 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include "PresenterHelper.hxx" +#include "PresenterCanvas.hxx" +#include +#include +#include +#include +#include +#include +#include + + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::presenter { + +//===== PresenterHelper ======================================================= + +PresenterHelper::PresenterHelper ( + const Reference& rxContext) + : mxComponentContext(rxContext) +{ +} + +PresenterHelper::~PresenterHelper() +{ +} + +//----- XInitialize ----------------------------------------------------------- + +void SAL_CALL PresenterHelper::initialize (const Sequence&) {} + +OUString PresenterHelper::getImplementationName() { + return "com.sun.star.comp.Draw.PresenterHelper"; +} + +sal_Bool PresenterHelper::supportsService(OUString const & ServiceName) { + return cppu::supportsService(this, ServiceName); +} + +css::uno::Sequence PresenterHelper::getSupportedServiceNames() { + return {"com.sun.star.drawing.PresenterHelper"}; +} + +//----- XPaneHelper ---------------------------------------------------- + +Reference SAL_CALL PresenterHelper::createWindow ( + const Reference& rxParentWindow, + sal_Bool bCreateSystemChildWindow, + sal_Bool bInitiallyVisible, + sal_Bool bEnableChildTransparentMode, + sal_Bool bEnableParentClip) +{ + VclPtr pParentWindow(VCLUnoHelper::GetWindow(rxParentWindow)); + + // Create a new window. + VclPtr pWindow; + if (bCreateSystemChildWindow) + { + pWindow = VclPtr::Create(pParentWindow, WB_SYSTEMCHILDWINDOW); + } + else + { + pWindow = VclPtr::Create(pParentWindow); + } + Reference xWindow (pWindow->GetComponentInterface(), UNO_QUERY); + + if (bEnableChildTransparentMode) + { + // Make the frame window transparent and make the parent able to + // draw behind it. + if (pParentWindow) + pParentWindow->EnableChildTransparentMode(); + } + + pWindow->Show(bInitiallyVisible); + + pWindow->SetMapMode(MapMode(MapUnit::MapPixel)); + pWindow->SetBackground(); + if ( ! bEnableParentClip) + { + pWindow->SetParentClipMode(ParentClipMode::NoClip); + pWindow->SetPaintTransparent(true); + } + else + { + pWindow->SetParentClipMode(ParentClipMode::Clip); + pWindow->SetPaintTransparent(false); + } + + return xWindow; +} + +Reference SAL_CALL PresenterHelper::createSharedCanvas ( + const Reference& rxUpdateCanvas, + const Reference& rxUpdateWindow, + const Reference& rxSharedCanvas, + const Reference& rxSharedWindow, + const Reference& rxWindow) +{ + if ( ! rxSharedCanvas.is() + || ! rxSharedWindow.is() + || ! rxWindow.is()) + { + throw RuntimeException("illegal argument", static_cast(this)); + } + + if (rxWindow == rxSharedWindow) + return rxSharedCanvas; + else + return new PresenterCanvas( + rxUpdateCanvas, + rxUpdateWindow, + rxSharedCanvas, + rxSharedWindow, + rxWindow); +} + +Reference SAL_CALL PresenterHelper::createCanvas ( + const Reference& rxWindow, + sal_Int16, + const OUString& rsOptionalCanvasServiceName) +{ + // No shared window is given or an explicit canvas service name is + // specified. Create a new canvas. + VclPtr pWindow = VCLUnoHelper::GetWindow(rxWindow); + if (!pWindow) + throw RuntimeException(); + + Sequence aArg{ // common: first any is VCL pointer to window (for VCL canvas) + Any(reinterpret_cast(pWindow.get())), + Any(css::awt::Rectangle()), + Any(false), + Any(rxWindow) + }; + + Reference xFactory ( + mxComponentContext->getServiceManager(), UNO_QUERY_THROW); + return Reference( + xFactory->createInstanceWithArguments( + !rsOptionalCanvasServiceName.isEmpty() + ? rsOptionalCanvasServiceName + : OUString("com.sun.star.rendering.Canvas.VCL"), + aArg), + UNO_QUERY); +} + +void SAL_CALL PresenterHelper::toTop ( + const Reference& rxWindow) +{ + VclPtr pWindow = VCLUnoHelper::GetWindow(rxWindow); + if (pWindow) + { + pWindow->ToTop(); + pWindow->SetZOrder(nullptr, ZOrderFlags::Last); + } +} + +namespace { + +struct IdMapEntry { + char const * sid; + OUString bmpid; +}; + +} + +Reference SAL_CALL PresenterHelper::loadBitmap ( + const OUString& id, + const Reference& rxCanvas) +{ + if ( ! rxCanvas.is()) + return nullptr; + + static IdMapEntry constexpr map[] = { + { "bitmaps/Background.png", BMP_PRESENTERSCREEN_BACKGROUND }, + { "bitmaps/Animation.png", + BMP_PRESENTERSCREEN_ANIMATION }, + { "bitmaps/Transition.png", + BMP_PRESENTERSCREEN_TRANSITION }, + { "bitmaps/BorderActiveBottom.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM }, + { "bitmaps/BorderActiveBottomCallout.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_CALLOUT }, + { "bitmaps/BorderActiveBottomLeft.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_LEFT }, + { "bitmaps/BorderActiveBottomRight.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_RIGHT }, + { "bitmaps/BorderActiveLeft.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_LEFT }, + { "bitmaps/BorderActiveRight.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_RIGHT }, + { "bitmaps/BorderActiveTop.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP }, + { "bitmaps/BorderActiveTopLeft.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_LEFT }, + { "bitmaps/BorderActiveTopRight.png", + BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_RIGHT }, + { "bitmaps/BorderBottom.png", BMP_PRESENTERSCREEN_BORDER_BOTTOM }, + { "bitmaps/BorderBottomLeft.png", + BMP_PRESENTERSCREEN_BORDER_BOTTOM_LEFT }, + { "bitmaps/BorderBottomRight.png", + BMP_PRESENTERSCREEN_BORDER_BOTTOM_RIGHT }, + { "bitmaps/BorderCurrentSlideBottom.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM }, + { "bitmaps/BorderCurrentSlideBottomLeft.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_LEFT }, + { "bitmaps/BorderCurrentSlideBottomRight.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_RIGHT }, + { "bitmaps/BorderCurrentSlideLeft.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_LEFT }, + { "bitmaps/BorderCurrentSlideRight.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_RIGHT }, + { "bitmaps/BorderCurrentSlideTop.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP }, + { "bitmaps/BorderCurrentSlideTopLeft.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_LEFT }, + { "bitmaps/BorderCurrentSlideTopRight.png", + BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_RIGHT }, + { "bitmaps/BorderLeft.png", BMP_PRESENTERSCREEN_BORDER_LEFT }, + { "bitmaps/BorderRight.png", BMP_PRESENTERSCREEN_BORDER_RIGHT }, + { "bitmaps/BorderToolbarBottom.png", + BMP_PRESENTERSCREEN_BORDER_TOOLBAR_BOTTOM }, + { "bitmaps/BorderToolbarLeft.png", + BMP_PRESENTERSCREEN_BORDER_TOOLBAR_LEFT }, + { "bitmaps/BorderToolbarRight.png", + BMP_PRESENTERSCREEN_BORDER_TOOLBAR_RIGHT }, + { "bitmaps/BorderToolbarTop.png", + BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP }, + { "bitmaps/BorderToolbarTopLeft.png", + BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_LEFT }, + { "bitmaps/BorderToolbarTopRight.png", + BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_RIGHT }, + { "bitmaps/BorderTop.png", BMP_PRESENTERSCREEN_BORDER_TOP }, + { "bitmaps/BorderTopLeft.png", BMP_PRESENTERSCREEN_BORDER_TOP_LEFT }, + { "bitmaps/BorderTopRight.png", BMP_PRESENTERSCREEN_BORDER_TOP_RIGHT }, + { "bitmaps/ButtonEffectNextDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_DISABLED }, + { "bitmaps/ButtonEffectNextMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_MOUSE_OVER }, + { "bitmaps/ButtonEffectNextNormal.png", + BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_NORMAL }, + { "bitmaps/ButtonEffectNextSelected.png", + BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_SELECTED }, + { "bitmaps/ButtonFrameCenterMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_MOUSE_OVER }, + { "bitmaps/ButtonFrameCenterNormal.png", + BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_NORMAL }, + { "bitmaps/ButtonFrameLeftMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_MOUSE_OVER }, + { "bitmaps/ButtonFrameLeftNormal.png", + BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_NORMAL }, + { "bitmaps/ButtonFrameRightMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_MOUSE_OVER }, + { "bitmaps/ButtonFrameRightNormal.png", + BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_NORMAL }, + { "bitmaps/ButtonHelpDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_HELP_DISABLED }, + { "bitmaps/ButtonHelpMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_HELP_MOUSE_OVER }, + { "bitmaps/ButtonHelpNormal.png", + BMP_PRESENTERSCREEN_BUTTON_HELP_NORMAL }, + { "bitmaps/ButtonHelpSelected.png", + BMP_PRESENTERSCREEN_BUTTON_HELP_SELECTED }, + { "bitmaps/ButtonExitPresenterMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_MOUSE_OVER }, + { "bitmaps/ButtonExitPresenterNormal.png", + BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_NORMAL }, + { "bitmaps/ButtonMinusDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_MINUS_DISABLED }, + { "bitmaps/ButtonMinusMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_MINUS_MOUSE_OVER }, + { "bitmaps/ButtonMinusNormal.png", + BMP_PRESENTERSCREEN_BUTTON_MINUS_NORMAL }, + { "bitmaps/ButtonMinusSelected.png", + BMP_PRESENTERSCREEN_BUTTON_MINUS_SELECTED }, + { "bitmaps/ButtonNotesDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_NOTES_DISABLED }, + { "bitmaps/ButtonNotesMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_NOTES_MOUSE_OVER }, + { "bitmaps/ButtonNotesNormal.png", + BMP_PRESENTERSCREEN_BUTTON_NOTES_NORMAL }, + { "bitmaps/ButtonNotesSelected.png", + BMP_PRESENTERSCREEN_BUTTON_NOTES_SELECTED }, + { "bitmaps/ButtonPlusDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_PLUS_DISABLED }, + { "bitmaps/ButtonPlusMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_PLUS_MOUSE_OVER }, + { "bitmaps/ButtonPlusNormal.png", + BMP_PRESENTERSCREEN_BUTTON_PLUS_NORMAL }, + { "bitmaps/ButtonPlusSelected.png", + BMP_PRESENTERSCREEN_BUTTON_PLUS_SELECTED }, + { "bitmaps/ButtonSlideNextDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_DISABLED }, + { "bitmaps/ButtonSlideNextMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_MOUSE_OVER }, + { "bitmaps/ButtonSlideNextNormal.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_NORMAL }, + { "bitmaps/ButtonSlidePreviousDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_DISABLED }, + { "bitmaps/ButtonSlidePreviousMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_MOUSE_OVER }, + { "bitmaps/ButtonSlidePreviousNormal.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_NORMAL }, + { "bitmaps/ButtonSlidePreviousSelected.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_SELECTED }, + { "bitmaps/ButtonSlideSorterDisabled.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_DISABLED }, + { "bitmaps/ButtonSlideSorterMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_MOUSE_OVER }, + { "bitmaps/ButtonSlideSorterNormal.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_NORMAL }, + { "bitmaps/ButtonSlideSorterSelected.png", + BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_SELECTED }, + { "bitmaps/ButtonSwitchMonitorMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_MOUSE_OVER }, + { "bitmaps/ButtonSwitchMonitorNormal.png", + BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_NORMAL }, + { "bitmaps/ButtonRestartTimerMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_MOUSE_OVER }, + { "bitmaps/ButtonRestartTimerNormal.png", + BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_NORMAL }, + { "bitmaps/ButtonPauseTimerMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_MOUSE_OVER }, + { "bitmaps/ButtonPauseTimerNormal.png", + BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_NORMAL }, + { "bitmaps/ButtonResumeTimerMouseOver.png", + BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_MOUSE_OVER }, + { "bitmaps/ButtonResumeTimerNormal.png", + BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_NORMAL }, + { "bitmaps/LabelMouseOverCenter.png", + BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_CENTER }, + { "bitmaps/LabelMouseOverLeft.png", + BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_LEFT }, + { "bitmaps/LabelMouseOverRight.png", + BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_RIGHT }, + { "bitmaps/ScrollbarArrowDownDisabled.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_DISABLED }, + { "bitmaps/ScrollbarArrowDownMouseOver.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_MOUSE_OVER }, + { "bitmaps/ScrollbarArrowDownNormal.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_NORMAL }, + { "bitmaps/ScrollbarArrowDownSelected.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_SELECTED }, + { "bitmaps/ScrollbarArrowUpDisabled.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_DISABLED }, + { "bitmaps/ScrollbarArrowUpMouseOver.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_MOUSE_OVER }, + { "bitmaps/ScrollbarArrowUpNormal.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_NORMAL }, + { "bitmaps/ScrollbarArrowUpSelected.png", + BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_SELECTED }, + { "bitmaps/ScrollbarPagerMiddleMouseOver.png", + BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_MOUSE_OVER }, + { "bitmaps/ScrollbarPagerMiddleNormal.png", + BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_NORMAL }, + { "bitmaps/ScrollbarThumbBottomMouseOver.png", + BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_MOUSE_OVER }, + { "bitmaps/ScrollbarThumbBottomNormal.png", + BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_NORMAL }, + { "bitmaps/ScrollbarThumbMiddleMouseOver.png", + BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_MOUSE_OVER }, + { "bitmaps/ScrollbarThumbMiddleNormal.png", + BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_NORMAL }, + { "bitmaps/ScrollbarThumbTopMouseOver.png", + BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_MOUSE_OVER }, + { "bitmaps/ScrollbarThumbTopNormal.png", + BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_NORMAL }, + { "bitmaps/ViewBackground.png", BMP_PRESENTERSCREEN_VIEW_BACKGROUND }, + { "bitmaps/Separator.png", + BMP_PRESENTERSCREEN_SEPARATOR } + }; + OUString bmpid; + for (std::size_t i = 0; i != SAL_N_ELEMENTS(map); ++i) { + if (id.equalsAscii(map[i].sid)) { + bmpid = map[i].bmpid; + break; + } + } + if (bmpid.isEmpty()) { + return nullptr; + } + + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + + const cppcanvas::CanvasSharedPtr pCanvas ( + cppcanvas::VCLFactory::createCanvas(rxCanvas)); + + if (pCanvas) + { + BitmapEx aBitmapEx(bmpid); + cppcanvas::BitmapSharedPtr xBitmap( + cppcanvas::VCLFactory::createBitmap(pCanvas, + aBitmapEx)); + if (!xBitmap) + return nullptr; + return xBitmap->getUNOBitmap(); + } + + return nullptr; +} + +void SAL_CALL PresenterHelper::captureMouse ( + const Reference& rxWindow) +{ + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + + // Capture the mouse (if not already done.) + VclPtr pWindow = VCLUnoHelper::GetWindow(rxWindow); + if (pWindow && ! pWindow->IsMouseCaptured()) + { + pWindow->CaptureMouse(); + } +} + +void SAL_CALL PresenterHelper::releaseMouse (const Reference& rxWindow) +{ + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + + // Release the mouse (if not already done.) + VclPtr pWindow = VCLUnoHelper::GetWindow(rxWindow); + if (pWindow && pWindow->IsMouseCaptured()) + { + pWindow->ReleaseMouse(); + } +} + +awt::Rectangle PresenterHelper::getWindowExtentsRelative ( + const Reference& rxChildWindow, + const Reference& rxParentWindow) +{ + VclPtr pChildWindow = VCLUnoHelper::GetWindow(rxChildWindow); + VclPtr pParentWindow = VCLUnoHelper::GetWindow(rxParentWindow); + if (pChildWindow && pParentWindow) + { + ::tools::Rectangle aBox (pChildWindow->GetWindowExtentsRelative(*pParentWindow)); + return awt::Rectangle(aBox.Left(),aBox.Top(),aBox.GetWidth(),aBox.GetHeight()); + } + else + return awt::Rectangle(); +} + +} // end of namespace ::sd::presenter + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_Draw_PresenterHelper_get_implementation(css::uno::XComponentContext* context, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::presenter::PresenterHelper(context)); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/PresenterHelper.hxx b/sd/source/ui/presenter/PresenterHelper.hxx new file mode 100644 index 0000000000..5450447dd6 --- /dev/null +++ b/sd/source/ui/presenter/PresenterHelper.hxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::uno { class XComponentContext; } + +namespace sd::presenter { + +typedef comphelper::WeakComponentImplHelper< + css::lang::XInitialization, + css::lang::XServiceInfo, + css::drawing::XPresenterHelper +> PresenterHelperInterfaceBase; + +/** Implementation of the XPresenterHelper interface: functionality that can + not be implemented in an extension. +*/ +class PresenterHelper final + : public PresenterHelperInterfaceBase +{ +public: + explicit PresenterHelper (const css::uno::Reference& rxContext); + virtual ~PresenterHelper() override; + PresenterHelper(const PresenterHelper&) = delete; + PresenterHelper& operator=(const PresenterHelper&) = delete; + + // XInitialize + + virtual void SAL_CALL initialize (const css::uno::Sequence& rArguments) override; + + OUString SAL_CALL getImplementationName() override; + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override; + css::uno::Sequence SAL_CALL getSupportedServiceNames() override; + + // XPresenterHelper + + virtual css::uno::Reference SAL_CALL createWindow ( + const css::uno::Reference& rxParentWindow, + sal_Bool bCreateSystemChildWindow, + sal_Bool bInitiallyVisible, + sal_Bool bEnableChildTransparentMode, + sal_Bool bEnableParentClip) override; + + virtual css::uno::Reference SAL_CALL createSharedCanvas ( + const css::uno::Reference& rxUpdateCanvas, + const css::uno::Reference& rxUpdateWindow, + const css::uno::Reference& rxSharedCanvas, + const css::uno::Reference& rxSharedWindow, + const css::uno::Reference& rxWindow) override; + + virtual css::uno::Reference SAL_CALL createCanvas ( + const css::uno::Reference& rxWindow, + sal_Int16 nRequestedCanvasFeatures, + const OUString& rsOptionalCanvasServiceName) override; + + virtual void SAL_CALL toTop ( + const css::uno::Reference& rxWindow) override; + + virtual css::uno::Reference SAL_CALL loadBitmap ( + const OUString& rsURL, + const css::uno::Reference& rxCanvas) override; + + virtual void SAL_CALL captureMouse (const css::uno::Reference& rxWindow) override; + + virtual void SAL_CALL releaseMouse (const css::uno::Reference& rxWindow) override; + + virtual css::awt::Rectangle SAL_CALL getWindowExtentsRelative ( + const css::uno::Reference& rxChildWindow, + const css::uno::Reference& rxParentWindow) override; + +private: + css::uno::Reference mxComponentContext; +}; + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/PresenterPreviewCache.cxx b/sd/source/ui/presenter/PresenterPreviewCache.cxx new file mode 100644 index 0000000000..26068492f4 --- /dev/null +++ b/sd/source/ui/presenter/PresenterPreviewCache.cxx @@ -0,0 +1,373 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PresenterPreviewCache.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace com::sun::star::uno { class XComponentContext; } + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::sd::slidesorter::cache; + +namespace sd::presenter { + +class PresenterPreviewCache::PresenterCacheContext : public CacheContext +{ +public: + PresenterCacheContext(); + + void SetDocumentSlides ( + const Reference& rxSlides, + const Reference& rxDocument); + void SetVisibleSlideRange ( + const sal_Int32 nFirstVisibleSlideIndex, + const sal_Int32 nLastVisibleSlideIndex); + const SdrPage* GetPage (const sal_Int32 nSlideIndex) const; + void AddPreviewCreationNotifyListener (const Reference& rxListener); + void RemovePreviewCreationNotifyListener (const Reference& rxListener); + + // CacheContext + virtual void NotifyPreviewCreation (CacheKey aKey) override; + virtual bool IsIdle() override; + virtual bool IsVisible (CacheKey aKey) override; + virtual const SdrPage* GetPage (CacheKey aKey) override; + virtual std::shared_ptr > GetEntryList (bool bVisible) override; + virtual sal_Int32 GetPriority (CacheKey aKey) override; + virtual css::uno::Reference GetModel() override; + +private: + Reference mxSlides; + Reference mxDocument; + sal_Int32 mnFirstVisibleSlideIndex; + sal_Int32 mnLastVisibleSlideIndex; + typedef ::std::vector > ListenerContainer; + ListenerContainer maListeners; + + void CallListeners (const sal_Int32 nSlideIndex); +}; + +//===== PresenterPreviewCache ================================================= + +PresenterPreviewCache::PresenterPreviewCache () + : maPreviewSize(Size(200,200)), + mpCacheContext(std::make_shared()), + mpCache(std::make_shared(maPreviewSize, Bitmap::HasFastScale(), mpCacheContext)) +{ +} + +PresenterPreviewCache::~PresenterPreviewCache() +{ +} + +//----- XInitialize ----------------------------------------------------------- + +void SAL_CALL PresenterPreviewCache::initialize (const Sequence& rArguments) +{ + if (rArguments.hasElements()) + throw RuntimeException(); +} + +OUString PresenterPreviewCache::getImplementationName() { + return "com.sun.star.comp.Draw.PresenterPreviewCache"; +} + +sal_Bool PresenterPreviewCache::supportsService(OUString const & ServiceName) { + return cppu::supportsService(this, ServiceName); +} + +css::uno::Sequence PresenterPreviewCache::getSupportedServiceNames() { + return {"com.sun.star.drawing.PresenterPreviewCache"}; +} + +//----- XSlidePreviewCache ---------------------------------------------------- + +void SAL_CALL PresenterPreviewCache::setDocumentSlides ( + const Reference& rxSlides, + const Reference& rxDocument) +{ + ThrowIfDisposed(); + OSL_ASSERT(mpCacheContext != nullptr); + + mpCacheContext->SetDocumentSlides(rxSlides, rxDocument); +} + +void SAL_CALL PresenterPreviewCache::setVisibleRange ( + sal_Int32 nFirstVisibleSlideIndex, + sal_Int32 nLastVisibleSlideIndex) +{ + ThrowIfDisposed(); + OSL_ASSERT(mpCacheContext != nullptr); + + mpCacheContext->SetVisibleSlideRange (nFirstVisibleSlideIndex, nLastVisibleSlideIndex); +} + +void SAL_CALL PresenterPreviewCache::setPreviewSize ( + const css::geometry::IntegerSize2D& rSize) +{ + ThrowIfDisposed(); + OSL_ASSERT(mpCache != nullptr); + + maPreviewSize = Size(rSize.Width, rSize.Height); + mpCache->ChangeSize(maPreviewSize, Bitmap::HasFastScale()); +} + +Reference SAL_CALL PresenterPreviewCache::getSlidePreview ( + sal_Int32 nSlideIndex, + const Reference& rxCanvas) +{ + ThrowIfDisposed(); + OSL_ASSERT(mpCacheContext != nullptr); + + cppcanvas::CanvasSharedPtr pCanvas ( + cppcanvas::VCLFactory::createCanvas(rxCanvas)); + + const SdrPage* pPage = mpCacheContext->GetPage(nSlideIndex); + if (pPage == nullptr) + throw RuntimeException(); + + const BitmapEx aPreview (mpCache->GetPreviewBitmap(pPage,true)); + if (aPreview.IsEmpty()) + return nullptr; + else + return cppcanvas::VCLFactory::createBitmap( + pCanvas, + aPreview)->getUNOBitmap(); +} + +void SAL_CALL PresenterPreviewCache::addPreviewCreationNotifyListener ( + const Reference& rxListener) +{ + if (m_bDisposed) + return; + if (rxListener.is()) + mpCacheContext->AddPreviewCreationNotifyListener(rxListener); +} + +void SAL_CALL PresenterPreviewCache::removePreviewCreationNotifyListener ( + const css::uno::Reference& rxListener) +{ + ThrowIfDisposed(); + mpCacheContext->RemovePreviewCreationNotifyListener(rxListener); +} + +void SAL_CALL PresenterPreviewCache::pause() +{ + ThrowIfDisposed(); + OSL_ASSERT(mpCache != nullptr); + mpCache->Pause(); +} + +void SAL_CALL PresenterPreviewCache::resume() +{ + ThrowIfDisposed(); + OSL_ASSERT(mpCache != nullptr); + mpCache->Resume(); +} + +void PresenterPreviewCache::ThrowIfDisposed() +{ + if (m_bDisposed) + { + throw lang::DisposedException ("PresenterPreviewCache object has already been disposed", + static_cast(this)); + } +} + +//===== PresenterPreviewCache::PresenterCacheContext ========================== + +PresenterPreviewCache::PresenterCacheContext::PresenterCacheContext() + : mnFirstVisibleSlideIndex(-1), + mnLastVisibleSlideIndex(-1) +{ +} + +void PresenterPreviewCache::PresenterCacheContext::SetDocumentSlides ( + const Reference& rxSlides, + const Reference& rxDocument) +{ + mxSlides = rxSlides; + mxDocument = rxDocument; + mnFirstVisibleSlideIndex = -1; + mnLastVisibleSlideIndex = -1; +} + +void PresenterPreviewCache::PresenterCacheContext::SetVisibleSlideRange ( + const sal_Int32 nFirstVisibleSlideIndex, + const sal_Int32 nLastVisibleSlideIndex) +{ + if (nFirstVisibleSlideIndex > nLastVisibleSlideIndex || nFirstVisibleSlideIndex<0) + { + mnFirstVisibleSlideIndex = -1; + mnLastVisibleSlideIndex = -1; + } + else + { + mnFirstVisibleSlideIndex = nFirstVisibleSlideIndex; + mnLastVisibleSlideIndex = nLastVisibleSlideIndex; + } + if (mxSlides.is() && mnLastVisibleSlideIndex >= mxSlides->getCount()) + mnLastVisibleSlideIndex = mxSlides->getCount() - 1; +} + +void PresenterPreviewCache::PresenterCacheContext::AddPreviewCreationNotifyListener ( + const Reference& rxListener) +{ + maListeners.push_back(rxListener); +} + +void PresenterPreviewCache::PresenterCacheContext::RemovePreviewCreationNotifyListener ( + const Reference& rxListener) +{ + auto iListener = std::find(maListeners.begin(), maListeners.end(), rxListener); + if (iListener != maListeners.end()) + maListeners.erase(iListener); +} + +//----- CacheContext ---------------------------------------------------------- + +void PresenterPreviewCache::PresenterCacheContext::NotifyPreviewCreation ( + CacheKey aKey) +{ + if ( ! mxSlides.is()) + return; + const sal_Int32 nCount(mxSlides->getCount()); + for (sal_Int32 nIndex=0; nIndex > + PresenterPreviewCache::PresenterCacheContext::GetEntryList (bool bVisible) +{ + auto pKeys = std::make_shared>(); + + if ( ! mxSlides.is()) + return pKeys; + + const sal_Int32 nFirstIndex (bVisible ? mnFirstVisibleSlideIndex : 0); + const sal_Int32 nLastIndex (bVisible ? mnLastVisibleSlideIndex : mxSlides->getCount()-1); + + if (nFirstIndex < 0) + return pKeys; + + for (sal_Int32 nIndex=nFirstIndex; nIndex<=nLastIndex; ++nIndex) + { + pKeys->push_back(GetPage(nIndex)); + } + + return pKeys; +} + +sal_Int32 PresenterPreviewCache::PresenterCacheContext::GetPriority (CacheKey aKey) +{ + if ( ! mxSlides.is()) + return 0; + + const sal_Int32 nCount (mxSlides->getCount()); + + for (sal_Int32 nIndex=mnFirstVisibleSlideIndex; nIndex<=mnLastVisibleSlideIndex; ++nIndex) + if (aKey == GetPage(nIndex)) + return -nCount-1+nIndex; + + for (sal_Int32 nIndex=0; nIndex<=nCount; ++nIndex) + if (aKey == GetPage(nIndex)) + return nIndex; + + return 0; +} + +Reference PresenterPreviewCache::PresenterCacheContext::GetModel() +{ + return mxDocument; +} + +const SdrPage* PresenterPreviewCache::PresenterCacheContext::GetPage ( + const sal_Int32 nSlideIndex) const +{ + if ( ! mxSlides.is()) + return nullptr; + if (nSlideIndex < 0 || nSlideIndex >= mxSlides->getCount()) + return nullptr; + + Reference xSlide (mxSlides->getByIndex(nSlideIndex), UNO_QUERY); + const SdPage* pPage = SdPage::getImplementation(xSlide); + return pPage; +} + +void PresenterPreviewCache::PresenterCacheContext::CallListeners ( + const sal_Int32 nIndex) +{ + ListenerContainer aListeners (maListeners); + for (const auto& rxListener : aListeners) + { + try + { + rxListener->notifyPreviewCreation(nIndex); + } + catch (lang::DisposedException&) + { + RemovePreviewCreationNotifyListener(rxListener); + } + } +} + +} // end of namespace ::sd::presenter + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_Draw_PresenterPreviewCache_get_implementation(css::uno::XComponentContext*, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::presenter::PresenterPreviewCache); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/PresenterPreviewCache.hxx b/sd/source/ui/presenter/PresenterPreviewCache.hxx new file mode 100644 index 0000000000..9c4e5be714 --- /dev/null +++ b/sd/source/ui/presenter/PresenterPreviewCache.hxx @@ -0,0 +1,103 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::cache { class PageCache; } + +namespace sd::presenter { + +typedef comphelper::WeakComponentImplHelper< + css::lang::XInitialization, + css::lang::XServiceInfo, + css::drawing::XSlidePreviewCache +> PresenterPreviewCacheInterfaceBase; + +/** Uno API wrapper around the slide preview cache. +*/ +class PresenterPreviewCache final + : public PresenterPreviewCacheInterfaceBase +{ +public: + PresenterPreviewCache (); + virtual ~PresenterPreviewCache() override; + PresenterPreviewCache(const PresenterPreviewCache&) = delete; + PresenterPreviewCache& operator=(const PresenterPreviewCache&) = delete; + + // XInitialize + + /** Accepts no arguments. All values that are necessary to set up a + preview cache can be provided via methods. + */ + virtual void SAL_CALL initialize (const css::uno::Sequence& rArguments) override; + + OUString SAL_CALL getImplementationName() override; + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override; + css::uno::Sequence SAL_CALL getSupportedServiceNames() override; + + // XSlidePreviewCache + + virtual void SAL_CALL setDocumentSlides ( + const css::uno::Reference& rxSlides, + const css::uno::Reference& rxDocument) override; + + virtual void SAL_CALL setVisibleRange ( + sal_Int32 nFirstVisibleSlideIndex, + sal_Int32 nLastVisibleSlideIndex) override; + + virtual void SAL_CALL setPreviewSize ( + const css::geometry::IntegerSize2D& rSize) override; + + virtual css::uno::Reference SAL_CALL + getSlidePreview ( + sal_Int32 nSlideIndex, + const css::uno::Reference& rxCanvas) override; + + virtual void SAL_CALL addPreviewCreationNotifyListener ( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL removePreviewCreationNotifyListener ( + const css::uno::Reference& rxListener) override; + + virtual void SAL_CALL pause() override; + + virtual void SAL_CALL resume() override; + +private: + class PresenterCacheContext; + Size maPreviewSize; + std::shared_ptr mpCacheContext; + std::shared_ptr mpCache; + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/SlideRenderer.cxx b/sd/source/ui/presenter/SlideRenderer.cxx new file mode 100644 index 0000000000..1b57b195ac --- /dev/null +++ b/sd/source/ui/presenter/SlideRenderer.cxx @@ -0,0 +1,201 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlideRenderer.hxx" +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::presenter { + +//===== SlideRenderer ========================================================== + +SlideRenderer::SlideRenderer () +{ +} + +SlideRenderer::~SlideRenderer() +{ +} + +//----- XInitialization ------------------------------------------------------- + +void SAL_CALL SlideRenderer::initialize (const Sequence& rArguments) +{ + ThrowIfDisposed(); + + if (rArguments.hasElements()) + { + throw RuntimeException("SlideRenderer: invalid number of arguments", + static_cast(this)); + } +} + +OUString SlideRenderer::getImplementationName() +{ + return "com.sun.star.comp.Draw.SlideRenderer"; +} + +sal_Bool SlideRenderer::supportsService(OUString const & ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +css::uno::Sequence SlideRenderer::getSupportedServiceNames() +{ + return {"com.sun.star.drawing.SlideRenderer"}; +} + +//----- XSlideRenderer -------------------------------------------------------- + +Reference SlideRenderer::createPreview ( + const Reference& rxSlide, + const awt::Size& rMaximalSize, + sal_Int16 nSuperSampleFactor) +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + return VCLUnoHelper::CreateBitmap( + CreatePreview(rxSlide, rMaximalSize, nSuperSampleFactor)); +} + +Reference SlideRenderer::createPreviewForCanvas ( + const Reference& rxSlide, + const awt::Size& rMaximalSize, + sal_Int16 nSuperSampleFactor, + const Reference& rxCanvas) +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + cppcanvas::CanvasSharedPtr pCanvas ( + cppcanvas::VCLFactory::createCanvas(rxCanvas)); + if (pCanvas) + return cppcanvas::VCLFactory::createBitmap( + pCanvas, + CreatePreview(rxSlide, rMaximalSize, nSuperSampleFactor))->getUNOBitmap(); + else + return nullptr; +} + +awt::Size SAL_CALL SlideRenderer::calculatePreviewSize ( + double nSlideAspectRatio, + const awt::Size& rMaximalSize) +{ + if (rMaximalSize.Width <= 0 + || rMaximalSize.Height <= 0 + || nSlideAspectRatio <= 0) + { + return awt::Size(0,0); + } + + const double nWindowAspectRatio (double(rMaximalSize.Width) / double(rMaximalSize.Height)); + if (nSlideAspectRatio < nWindowAspectRatio) + return awt::Size( + sal::static_int_cast(rMaximalSize.Height * nSlideAspectRatio), + rMaximalSize.Height); + else + return awt::Size( + rMaximalSize.Width, + sal::static_int_cast(rMaximalSize.Width / nSlideAspectRatio)); +} + +BitmapEx SlideRenderer::CreatePreview ( + const Reference& rxSlide, + const awt::Size& rMaximalSize, + sal_Int16 nSuperSampleFactor) +{ + const SdPage* pPage = SdPage::getImplementation(rxSlide); + if (pPage == nullptr) + throw lang::IllegalArgumentException("SlideRenderer::createPreview() called with invalid slide", + static_cast(this), + 0); + + // Determine the size of the current slide and its aspect ratio. + Size aPageSize = pPage->GetSize(); + if (aPageSize.Height() <= 0) + throw lang::IllegalArgumentException("SlideRenderer::createPreview() called with invalid size", + static_cast(this), + 1); + + // Compare with the aspect ratio of the window (which rMaximalSize + // assumed to be) and calculate the size of the preview so that it + // a) will have the aspect ratio of the page and + // b) will be as large as possible. + awt::Size aPreviewSize (calculatePreviewSize( + double(aPageSize.Width()) / double(aPageSize.Height()), + rMaximalSize)); + if (aPreviewSize.Width <= 0 || aPreviewSize.Height <= 0) + return BitmapEx(); + + // Make sure that the super sample factor has a sane value. + sal_Int16 nFactor (nSuperSampleFactor); + if (nFactor < 1) + nFactor = 1; + else if (nFactor > 10) + nFactor = 10; + + // Create the preview. When the super sample factor n is greater than 1 + // then a preview is created in size (n*width, n*height) and then scaled + // down to (width, height). This is a poor mans antialiasing for the + // time being. When we have true antialiasing support this workaround + // can be removed. + const Image aPreview = maPreviewRenderer.RenderPage ( + pPage, + Size(aPreviewSize.Width*nFactor, aPreviewSize.Height*nFactor), + true); + if (nFactor == 1) + return aPreview.GetBitmapEx(); + else + { + BitmapEx aScaledPreview = aPreview.GetBitmapEx(); + aScaledPreview.Scale( + Size(aPreviewSize.Width,aPreviewSize.Height), + BmpScaleFlag::BestQuality); + return aScaledPreview; + } +} + +void SlideRenderer::ThrowIfDisposed() +{ + if (m_bDisposed) + { + throw lang::DisposedException ("SlideRenderer object has already been disposed", + static_cast(this)); + } +} + +} // end of namespace ::sd::presenter + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_Draw_SlideRenderer_get_implementation(css::uno::XComponentContext*, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::presenter::SlideRenderer); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/presenter/SlideRenderer.hxx b/sd/source/ui/presenter/SlideRenderer.hxx new file mode 100644 index 0000000000..d394344212 --- /dev/null +++ b/sd/source/ui/presenter/SlideRenderer.hxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace com::sun::star::drawing { class XDrawPage; } + +namespace sd::presenter { + +typedef comphelper::WeakComponentImplHelper < + css::drawing::XSlideRenderer, + css::lang::XInitialization, + css::lang::XServiceInfo +> SlideRendererInterfaceBase; + +/** Render single slides into bitmaps. +*/ +class SlideRenderer final + : public SlideRendererInterfaceBase +{ +public: + SlideRenderer (); + virtual ~SlideRenderer() override; + SlideRenderer(const SlideRenderer&) = delete; + SlideRenderer& operator=(const SlideRenderer&) = delete; + + // XInitialization + + virtual void SAL_CALL initialize (const css::uno::Sequence& rArguments) override; + + OUString SAL_CALL getImplementationName() override; + + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override; + + css::uno::Sequence SAL_CALL getSupportedServiceNames() override; + + // XSlideRenderer + + virtual css::uno::Reference SAL_CALL createPreview ( + const css::uno::Reference& rxSlide, + const css::awt::Size& rMaximumPreviewPixelSize, + sal_Int16 nSuperSampleFactor) override; + + virtual css::uno::Reference SAL_CALL createPreviewForCanvas ( + const css::uno::Reference& rxSlide, + const css::awt::Size& rMaximumPreviewPixelSize, + sal_Int16 nSuperSampleFactor, + const css::uno::Reference& rxCanvas) override; + + virtual css::awt::Size SAL_CALL calculatePreviewSize ( + double nSlideAspectRatio, + const css::awt::Size& rMaximumPreviewPixelSize) override; + +private: + PreviewRenderer maPreviewRenderer; + + /// @throws css::uno::RuntimeException + BitmapEx CreatePreview ( + const css::uno::Reference& rxSlide, + const css::awt::Size& rMaximumPreviewPixelSize, + sal_Int16 nSuperSampleFactor); + + /** @throws css::lang::DisposedException when the object has already been + disposed. + */ + void ThrowIfDisposed(); +}; + +} // end of namespace ::sd::presenter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx new file mode 100644 index 0000000000..7708e6eb7d --- /dev/null +++ b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx @@ -0,0 +1,209 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#if ENABLE_DBUS +#include +#endif + +#include + +#include "AvahiNetworkService.hxx" +#include "ZeroconfService.hxx" + +using namespace sd; + +static AvahiClient *client = nullptr; +static AvahiThreadedPoll *threaded_poll = nullptr; +static AvahiEntryGroup *group = nullptr; +static AvahiNetworkService *avahiService = nullptr; + +static bool create_services(AvahiClient *c); + +static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata) { + assert(g == group || group == nullptr); + group = g; + + /* Called whenever the entry group state changes */ + + switch (state) { + case AVAHI_ENTRY_GROUP_ESTABLISHED : + /* The entry group has been established successfully */ + SAL_INFO( "sdremote.wifi", "Service '" << avahiService->getName() << "' successfully established." ); + break; + + case AVAHI_ENTRY_GROUP_COLLISION : { + char *n; + + /* A service name collision with a remote service + * happened. Let's pick a new name */ + n = avahi_alternative_service_name(avahiService->getName().c_str()); + avahiService->setName(n); + + SAL_INFO( "sdremote.wifi", "Service name collision, renaming service to '" << avahiService->getName() << "'"); + + /* And recreate the services */ + create_services(avahi_entry_group_get_client(g)); + break; + } + + case AVAHI_ENTRY_GROUP_FAILURE : + + SAL_WARN("sdremote.wifi", "Entry group failure: " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g)))); + + /* Some kind of failure happened while we were registering our services */ + avahi_threaded_poll_quit(threaded_poll); + break; + + case AVAHI_ENTRY_GROUP_UNCOMMITED: + case AVAHI_ENTRY_GROUP_REGISTERING: + ; + } +} + +static bool create_services(AvahiClient *c) { + assert(c); + + /* If this is the first time we're called, let's create a new + * entry group if necessary */ + if(!client) + return false; + + if (!group) + if (!(group = avahi_entry_group_new(c, entry_group_callback, nullptr))) { + SAL_WARN("sdremote.wifi", "avahi_entry_group_new() failed: " << avahi_strerror(avahi_client_errno(c))); + avahiService->clear(); + return false; + } + + /* If the group is empty (either because it was just created, or + * because it was reset previously, add our entries. */ + + if (avahi_entry_group_is_empty(group)) { + SAL_INFO("sdremote.wifi", "Adding service '" << avahiService->getName() << "'"); + char r[128]; + int nRandom = comphelper::rng::uniform_int_distribution(0, std::numeric_limits::max()); + snprintf(r, sizeof(r), "random=%i", nRandom); + int ret = avahi_entry_group_add_service( + group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast(0), + avahiService->getName().c_str(), kREG_TYPE, nullptr, nullptr, 1599, "local", r, nullptr + ); + if (ret < 0) { + + if (ret == AVAHI_ERR_COLLISION){ + /* A service name collision with a local service happened. Let's + * pick a new name */ + char *n = avahi_alternative_service_name(avahiService->getName().c_str()); + avahiService->setName(n); + + SAL_WARN("sdremote.wifi", "Service name collision, renaming service to '" << avahiService->getName() << "'"); + + avahi_entry_group_reset(group); + + return create_services(c); + } + + SAL_WARN("sdremote.wifi", "Failed to add _impressremote._tcp service: " << avahi_strerror(ret)); + avahiService->clear(); + return false; + } + + /* Tell the server to register the service */ + if ((ret = avahi_entry_group_commit(group)) < 0) { + SAL_WARN("sdremote.wifi", "Failed to commit entry group: " << avahi_strerror(ret)); + avahiService->clear(); + return false; + } + } + + return true; //Services we're already created +} + +static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata) { + assert(c); + + /* Called whenever the client or server state changes */ + + switch (state) { + case AVAHI_CLIENT_S_RUNNING: + create_services(c); + break; + case AVAHI_CLIENT_FAILURE: + SAL_WARN("sdremote.wifi", "Client failure: " << avahi_strerror(avahi_client_errno(c))); + avahiService->clear(); + break; + case AVAHI_CLIENT_S_COLLISION: + case AVAHI_CLIENT_S_REGISTERING: + if (group) + avahi_entry_group_reset(group); + break; + case AVAHI_CLIENT_CONNECTING: + ; + } +} + +void AvahiNetworkService::setup() { +#if ENABLE_DBUS + // Sure, without ENABLE_DBUS it probably makes no sense to try to use this Avahi stuff either, + // but this is just a stop-gap measure to get this to even compile for now with the probably + // pointless combination of configurable options --enable-avahi --enable-dbus --disable-gui. + + // Avahi internally uses D-Bus, which requires the following in order to be + // thread-safe (and we potentially access D-Bus from different threads in + // different places of the code base): + if (!dbus_threads_init_default()) { + throw std::bad_alloc(); + } +#endif + + int error = 0; + avahiService = this; + if (!(threaded_poll = avahi_threaded_poll_new())) { + SAL_WARN("sdremote.wifi", "avahi_threaded_poll_new '" << avahiService->getName() << "' failed"); + return; + } + + if (!(client = avahi_client_new(avahi_threaded_poll_get(threaded_poll), static_cast(0), client_callback, nullptr, &error))) { + SAL_WARN("sdremote.wifi", "avahi_client_new failed"); + return; + } + + if(!create_services(client)) + return; + + /* Finally, start the event loop thread */ + if (avahi_threaded_poll_start(threaded_poll) < 0) { + SAL_WARN("sdremote.wifi", "avahi_threaded_poll_start failed"); + return; + } +} + +void AvahiNetworkService::clear() { + /* Call this when the app shuts down */ + if(threaded_poll) + avahi_threaded_poll_stop(threaded_poll); + if(client) + avahi_client_free(client); + if(threaded_poll) + avahi_threaded_poll_free(threaded_poll); +} diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.hxx b/sd/source/ui/remotecontrol/AvahiNetworkService.hxx new file mode 100644 index 0000000000..374a27a3a4 --- /dev/null +++ b/sd/source/ui/remotecontrol/AvahiNetworkService.hxx @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include "ZeroconfService.hxx" + +namespace sd { + + class AvahiNetworkService : public ZeroconfService + { + public: + AvahiNetworkService(const std::string& aname = "", unsigned int aport = 1599) + : ZeroconfService(aname, aport){} + + void clear() override; + void setup() override; + }; +} diff --git a/sd/source/ui/remotecontrol/BluetoothServer.cxx b/sd/source/ui/remotecontrol/BluetoothServer.cxx new file mode 100644 index 0000000000..0c568556b5 --- /dev/null +++ b/sd/source/ui/remotecontrol/BluetoothServer.cxx @@ -0,0 +1,1535 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "BluetoothServer.hxx" + +#include +#include +#include +#include + +#include + +#ifdef LINUX_BLUETOOTH + #include + #include + #include + #include + #include + #include + #include + #include + #include "BluetoothServiceRecord.hxx" + #include "BufferedStreamSocket.hxx" +#endif + +#ifdef _WIN32 + // LO vs WinAPI conflict + #undef WB_LEFT + #undef WB_RIGHT + #include + #include + #include "BufferedStreamSocket.hxx" +#endif + +#ifdef MACOSX + #include + #include + #include + #import + #import + #import + #import + #include + #import "OSXBluetooth.h" + #include "OSXBluetoothWrapper.hxx" +#endif + +#include "Communicator.hxx" +#include + +#include + +using namespace sd; + +#ifdef LINUX_BLUETOOTH + +namespace { + +struct DBusObject { + OString maBusName; + OString maPath; + OString maInterface; + + DBusObject() { } + DBusObject( const char *pBusName, const char *pPath, const char *pInterface ) + : maBusName( pBusName ), maPath( pPath ), maInterface( pInterface ) { } + + DBusMessage *getMethodCall( const char *pName ) + { + return dbus_message_new_method_call( maBusName.getStr(), maPath.getStr(), + maInterface.getStr(), pName ); + } + std::unique_ptr cloneForInterface( const char *pInterface ) + { + std::unique_ptr pObject(new DBusObject()); + + pObject->maBusName = maBusName; + pObject->maPath = maPath; + pObject->maInterface = pInterface; + + return pObject; + } +}; + +} + +static std::unique_ptr getBluez5Adapter(DBusConnection *pConnection); + +struct sd::BluetoothServer::Impl { + // the glib mainloop running in the thread + GMainContext *mpContext; + DBusConnection *mpConnection; + std::unique_ptr mpService; + enum class BluezVersion { BLUEZ4, BLUEZ5, UNKNOWN }; + BluezVersion maBluezVersion; + + Impl() + : mpContext( g_main_context_new() ) + , mpConnection( nullptr ) + , maBluezVersion( BluezVersion::UNKNOWN ) + { } + + std::unique_ptr getAdapter() + { + if (mpService) + { + return mpService->cloneForInterface( "org.bluez.Adapter" ); + } + else if (spServer->mpImpl->maBluezVersion == BluezVersion::BLUEZ5) + { + return getBluez5Adapter(mpConnection); + } + else + { + return nullptr; + } + } +}; + +static DBusConnection * +dbusConnectToNameOnBus() +{ + DBusError aError; + DBusConnection *pConnection; + + dbus_error_init( &aError ); + + pConnection = dbus_bus_get( DBUS_BUS_SYSTEM, &aError ); + if( !pConnection || dbus_error_is_set( &aError )) + { + SAL_WARN( "sdremote.bluetooth", "failed to get dbus system bus: " << aError.message ); + dbus_error_free( &aError ); + return nullptr; + } + + return pConnection; +} + +static DBusMessage * +sendUnrefAndWaitForReply( DBusConnection *pConnection, DBusMessage *pMsg ) +{ + DBusPendingCall *pPending = nullptr; + + if( !pMsg || !dbus_connection_send_with_reply( pConnection, pMsg, &pPending, + -1 /* default timeout */ ) ) + { + SAL_WARN( "sdremote.bluetooth", "Memory allocation failed on message send" ); + dbus_message_unref( pMsg ); + return nullptr; + } + dbus_connection_flush( pConnection ); + dbus_message_unref( pMsg ); + + dbus_pending_call_block( pPending ); // block for reply + + pMsg = dbus_pending_call_steal_reply( pPending ); + if( !pMsg ) + SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" ); + + dbus_pending_call_unref( pPending ); + return pMsg; +} + +static bool +isBluez5Available(DBusConnection *pConnection) +{ + DBusMessage *pMsg; + + // Simplest ways to check whether we have Bluez 5+ is to check + // that we can obtain adapters using the new interfaces. + // The first two error checks however don't tell us anything as they should + // succeed as long as dbus is working correctly. + pMsg = DBusObject( "org.bluez", "/", "org.freedesktop.DBus.ObjectManager" ).getMethodCall( "GetManagedObjects" ); + if (!pMsg) + { + SAL_INFO("sdremote.bluetooth", "No GetManagedObjects call created"); + return false; + } + + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + if (!pMsg) + { + SAL_INFO("sdremote.bluetooth", "No reply received"); + return false; + } + + // If dbus is working correctly and we aren't on bluez 5 this is where we + // should actually get the error. + if (dbus_message_get_error_name( pMsg )) + { + SAL_INFO( "sdremote.bluetooth", "GetManagedObjects call failed with \"" + << dbus_message_get_error_name( pMsg ) + << "\" -- we don't seem to have Bluez 5 available"); + return false; + } + SAL_INFO("sdremote.bluetooth", "GetManagedObjects call seems to have succeeded -- we must be on Bluez 5"); + dbus_message_unref(pMsg); + return true; +} + +static std::unique_ptr +getBluez5Adapter(DBusConnection *pConnection) +{ + DBusMessage *pMsg; + // This returns a list of objects where we need to find the first + // org.bluez.Adapter1 . + pMsg = DBusObject( "org.bluez", "/", "org.freedesktop.DBus.ObjectManager" ).getMethodCall( "GetManagedObjects" ); + if (!pMsg) + return nullptr; + + const gchar* const pInterfaceType = "org.bluez.Adapter1"; + + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + DBusMessageIter aObjectIterator; + if (pMsg && dbus_message_iter_init(pMsg, &aObjectIterator)) + { + if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&aObjectIterator)) + { + DBusMessageIter aObject; + dbus_message_iter_recurse(&aObjectIterator, &aObject); + do + { + if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&aObject)) + { + DBusMessageIter aContainerIter; + dbus_message_iter_recurse(&aObject, &aContainerIter); + char *pPath = nullptr; + do + { + if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&aContainerIter)) + { + dbus_message_iter_get_basic(&aContainerIter, &pPath); + SAL_INFO( "sdremote.bluetooth", "Something retrieved: '" + << pPath << "' '"); + } + else if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&aContainerIter)) + { + DBusMessageIter aInnerIter; + dbus_message_iter_recurse(&aContainerIter, &aInnerIter); + do + { + if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&aInnerIter)) + { + DBusMessageIter aInnerInnerIter; + dbus_message_iter_recurse(&aInnerIter, &aInnerInnerIter); + do + { + if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&aInnerInnerIter)) + { + char* pMessage; + + dbus_message_iter_get_basic(&aInnerInnerIter, &pMessage); + if (pMessage == std::string_view("org.bluez.Adapter1")) + { + dbus_message_unref(pMsg); + if (pPath) + { + return std::make_unique( "org.bluez", pPath, pInterfaceType ); + } + assert(false); // We should already have pPath provided for us. + } + } + } + while (dbus_message_iter_next(&aInnerInnerIter)); + } + } + while (dbus_message_iter_next(&aInnerIter)); + } + } + while (dbus_message_iter_next(&aContainerIter)); + } + } + while (dbus_message_iter_next(&aObject)); + } + dbus_message_unref(pMsg); + } + + return nullptr; +} + +static DBusObject * +bluez4GetDefaultService( DBusConnection *pConnection ) +{ + DBusMessage *pMsg; + DBusMessageIter it; + const gchar* const pInterfaceType = "org.bluez.Service"; + + // org.bluez.manager only exists for bluez 4. + // getMethodCall should return NULL if there is any issue e.g. the + // if org.bluez.manager doesn't exist. + pMsg = DBusObject( "org.bluez", "/", "org.bluez.Manager" ).getMethodCall( "DefaultAdapter" ); + + if (!pMsg) + { + SAL_WARN("sdremote.bluetooth", "Couldn't retrieve DBusObject for DefaultAdapter"); + return nullptr; + } + + SAL_INFO("sdremote.bluetooth", "successfully retrieved org.bluez.Manager.DefaultAdapter, attempting to use."); + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + if(!pMsg || !dbus_message_iter_init( pMsg, &it ) ) + { + return nullptr; + } + + // This works for Bluez 4 + if( DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type( &it ) ) + { + const char *pObjectPath = nullptr; + dbus_message_iter_get_basic( &it, &pObjectPath ); + SAL_INFO( "sdremote.bluetooth", "DefaultAdapter retrieved: '" + << pObjectPath << "' '" << pInterfaceType << "'" ); + dbus_message_unref( pMsg ); + return new DBusObject( "org.bluez", pObjectPath, pInterfaceType ); + } + // Some form of error, e.g. if we have bluez 5 we get a message that + // this method doesn't exist. + else if ( DBUS_TYPE_STRING == dbus_message_iter_get_arg_type( &it ) ) + { + const char *pMessage = nullptr; + dbus_message_iter_get_basic( &it, &pMessage ); + SAL_INFO( "sdremote.bluetooth", "Error message: '" + << pMessage << "' '" << pInterfaceType << "'" ); + } + else + { + SAL_INFO( "sdremote.bluetooth", "invalid type of reply to DefaultAdapter: '" + << static_cast(dbus_message_iter_get_arg_type( &it )) << "'" ); + } + dbus_message_unref(pMsg); + return nullptr; +} + +static bool +bluez4RegisterServiceRecord( DBusConnection *pConnection, DBusObject *pAdapter, + const char *pServiceRecord ) +{ + DBusMessage *pMsg; + DBusMessageIter it; + + pMsg = pAdapter->getMethodCall( "AddRecord" ); + dbus_message_iter_init_append( pMsg, &it ); + dbus_message_iter_append_basic( &it, DBUS_TYPE_STRING, &pServiceRecord ); + + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + if( !pMsg || !dbus_message_iter_init( pMsg, &it ) || + dbus_message_iter_get_arg_type( &it ) != DBUS_TYPE_UINT32 ) + { + SAL_WARN( "sdremote.bluetooth", "SDP registration failed" ); + return false; + } + + // We ignore the uint de-registration handle we get back: + // bluez will clean us up automatically on exit + + return true; +} + +static void +bluezCreateAttachListeningSocket( GMainContext *pContext, GPollFD *pSocketFD ) +{ + int nSocket; + + pSocketFD->fd = -1; + + if( ( nSocket = socket( AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM ) ) < 0 ) + { + SAL_WARN( "sdremote.bluetooth", "failed to open bluetooth socket with error " << nSocket ); + return; + } + + sockaddr_rc aAddr; + // Initialize whole structure. Mainly to appease valgrind, which + // doesn't know about the padding at the end of sockaddr_rc which + // it will dutifully check for definedness. But also the standard + // definition of BDADDR_ANY is unusable in C++ code, so just use + // memset to set aAddr.rc_bdaddr to 0. + memset( &aAddr, 0, sizeof( aAddr ) ); + aAddr.rc_family = AF_BLUETOOTH; + aAddr.rc_channel = 5; + + int a; + if ( ( a = bind( nSocket, reinterpret_cast(&aAddr), sizeof(aAddr) ) ) < 0 ) { + SAL_WARN( "sdremote.bluetooth", "bind failed with error" << a ); + close( nSocket ); + return; + } + + if ( ( a = listen( nSocket, 1 ) ) < 0 ) + { + SAL_WARN( "sdremote.bluetooth", "listen failed with error" << a ); + close( nSocket ); + return; + } + + // set non-blocking behaviour ... + if( fcntl( nSocket, F_SETFL, O_NONBLOCK) < 0 ) + { + close( nSocket ); + return; + } + + pSocketFD->fd = nSocket; + pSocketFD->events = G_IO_IN | G_IO_PRI; + pSocketFD->revents = 0; + + g_main_context_add_poll( pContext, pSocketFD, G_PRIORITY_DEFAULT ); +} + +static void +bluezDetachCloseSocket( GMainContext *pContext, GPollFD *pSocketFD ) +{ + if( pSocketFD->fd >= 0 ) + { + close( pSocketFD->fd ); + g_main_context_remove_poll( pContext, pSocketFD ); + pSocketFD->fd = -1; + } +} + +#endif // LINUX_BLUETOOTH + +#if defined(MACOSX) + +OSXBluetoothWrapper::OSXBluetoothWrapper( IOBluetoothRFCOMMChannel* channel ) : + mpChannel(channel), + mnMTU(0), + mHaveBytes(), + mMutex(), + mBuffer() +{ + // silly enough, can't write more than mnMTU bytes at once + mnMTU = [channel getMTU]; + + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::OSXBluetoothWrapper(): mnMTU=" << mnMTU ); +} + +sal_Int32 OSXBluetoothWrapper::readLine( OString& aLine ) +{ + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine()" ); + + while( true ) + { + { + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: entering mutex" ); + ::osl::MutexGuard aQueueGuard( mMutex ); + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: entered mutex" ); + +#ifdef SAL_LOG_INFO + // We should have in the sal logging some standard way to + // output char buffers with non-printables escaped. + std::ostringstream s; + if (mBuffer.size() > 0) + { + for (unsigned char *p = reinterpret_cast(mBuffer.data()); p != reinterpret_cast(mBuffer.data()) + mBuffer.size(); p++) + { + if (*p == '\n') + s << "\\n"; + else if (*p < ' ' || *p >= 0x7F) + s << "\\0x" << std::hex << std::setw(2) << std::setfill('0') << static_cast(*p) << std::setfill(' ') << std::setw(1) << std::dec; + else + s << *p; + } + } + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine mBuffer: \"" << s.str() << "\"" ); +#endif + + // got enough bytes to return a line? + std::vector::iterator aIt; + if ( (aIt = find( mBuffer.begin(), mBuffer.end(), '\n' )) + != mBuffer.end() ) + { + sal_uInt64 aLocation = aIt - mBuffer.begin(); + + aLine = OString( &(*mBuffer.begin()), aLocation ); + + mBuffer.erase( mBuffer.begin(), aIt + 1 ); // Also delete the empty line + + // yeps + SAL_INFO( "sdremote.bluetooth", " returning, got \"" << OStringToOUString( aLine, RTL_TEXTENCODING_UTF8 ) << "\"" ); + return aLine.getLength() + 1; + } + + // nope - wait some more (after releasing the mutex) + SAL_INFO( "sdremote.bluetooth", " resetting mHaveBytes" ); + mHaveBytes.reset(); + SAL_INFO( "sdremote.bluetooth", " leaving mutex" ); + } + + SAL_INFO( "sdremote.bluetooth", " waiting for mHaveBytes" ); + mHaveBytes.wait(); + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: got mHaveBytes" ); + } +} + +sal_Int32 OSXBluetoothWrapper::write( const void* pBuffer, sal_uInt32 n ) +{ + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::write(" << pBuffer << ", " << n << ") mpChannel=" << mpChannel ); + + char const * ptr = static_cast(pBuffer); + sal_uInt32 nBytesWritten = 0; + + if (mpChannel == nil) + return 0; + + while( nBytesWritten < n ) + { + int toWrite = n - nBytesWritten; + toWrite = toWrite <= mnMTU ? toWrite : mnMTU; + if ( [mpChannel writeSync:const_cast(ptr) length:toWrite] != kIOReturnSuccess ) + { + SAL_INFO( "sdremote.bluetooth", " [mpChannel writeSync:" << static_cast(ptr) << " length:" << toWrite << "] returned error, total written " << nBytesWritten ); + return nBytesWritten; + } + ptr += toWrite; + nBytesWritten += toWrite; + } + SAL_INFO( "sdremote.bluetooth", " total written " << nBytesWritten ); + return nBytesWritten; +} + +void OSXBluetoothWrapper::appendData(void* pBuffer, size_t len) +{ + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData(" << pBuffer << ", " << len << ")" ); + + if( len ) + { + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData: entering mutex" ); + ::osl::MutexGuard aQueueGuard( mMutex ); + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData: entered mutex" ); + mBuffer.insert(mBuffer.begin()+mBuffer.size(), + static_cast(pBuffer), static_cast(pBuffer)+len); + SAL_INFO( "sdremote.bluetooth", " setting mHaveBytes" ); + mHaveBytes.set(); + SAL_INFO( "sdremote.bluetooth", " leaving mutex" ); + } +} + +void OSXBluetoothWrapper::channelClosed() +{ + SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::channelClosed()" ); + + mpChannel = nil; +} + +void incomingCallback( void *userRefCon, + IOBluetoothUserNotificationRef, + IOBluetoothObjectRef objectRef ) +{ + SAL_INFO( "sdremote.bluetooth", "incomingCallback()" ); + + BluetoothServer* pServer = static_cast(userRefCon); + + IOBluetoothRFCOMMChannel* channel = [IOBluetoothRFCOMMChannel withRFCOMMChannelRef:reinterpret_cast(objectRef)]; + + OSXBluetoothWrapper* socket = new OSXBluetoothWrapper( channel); + Communicator* pCommunicator = new Communicator( std::unique_ptr(socket) ); + pServer->addCommunicator( pCommunicator ); + + ChannelDelegate* delegate = [[ChannelDelegate alloc] initWithCommunicatorAndSocket: pCommunicator socket: socket]; + [channel setDelegate: delegate]; + [delegate retain]; + + pCommunicator->launch(); +} + +void BluetoothServer::addCommunicator( Communicator* pCommunicator ) +{ + ::osl::MutexGuard aGuard(RemoteServer::sDataMutex); + mpCommunicators->push_back( pCommunicator ); +} + +#endif // MACOSX + +#ifdef LINUX_BLUETOOTH + +extern "C" { + static gboolean ensureDiscoverable_cb(gpointer) + { + BluetoothServer::doEnsureDiscoverable(); + return FALSE; // remove source + } + static gboolean restoreDiscoverable_cb(gpointer) + { + BluetoothServer::doRestoreDiscoverable(); + return FALSE; // remove source + } +} + +/* + * Bluez 4 uses custom methods for setting properties, whereas Bluez 5+ + * implements properties using the generic "org.freedesktop.DBus.Properties" + * interface -- hence we have a specific Bluez 4 function to deal with the + * old style of reading properties. + */ +static bool +getBluez4BooleanProperty( DBusConnection *pConnection, DBusObject *pAdapter, + const char *pPropertyName, bool *pBoolean ) +{ + *pBoolean = false; + + if( !pAdapter ) + return false; + + DBusMessage *pMsg; + pMsg = sendUnrefAndWaitForReply( pConnection, + pAdapter->getMethodCall( "GetProperties" ) ); + + DBusMessageIter it; + if( !pMsg || !dbus_message_iter_init( pMsg, &it ) ) + { + SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" ); + return false; + } + + if( DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type( &it ) ) + { + SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" ); + return false; + } + + DBusMessageIter arrayIt; + dbus_message_iter_recurse( &it, &arrayIt ); + + while( dbus_message_iter_get_arg_type( &arrayIt ) == DBUS_TYPE_DICT_ENTRY ) + { + DBusMessageIter dictIt; + dbus_message_iter_recurse( &arrayIt, &dictIt ); + + const char *pName = nullptr; + if( dbus_message_iter_get_arg_type( &dictIt ) == DBUS_TYPE_STRING ) + { + dbus_message_iter_get_basic( &dictIt, &pName ); + if( pName != nullptr && !strcmp( pName, pPropertyName ) ) + { + SAL_INFO( "sdremote.bluetooth", "hit " << pPropertyName << " property" ); + dbus_message_iter_next( &dictIt ); + dbus_bool_t bBool = false; + + if( dbus_message_iter_get_arg_type( &dictIt ) == DBUS_TYPE_VARIANT ) + { + DBusMessageIter variantIt; + dbus_message_iter_recurse( &dictIt, &variantIt ); + + if( dbus_message_iter_get_arg_type( &variantIt ) == DBUS_TYPE_BOOLEAN ) + { + dbus_message_iter_get_basic( &variantIt, &bBool ); + SAL_INFO( "sdremote.bluetooth", "" << pPropertyName << " is " << bBool ); + *pBoolean = bBool; + return true; + } + else + SAL_WARN( "sdremote.bluetooth", "" << pPropertyName << " type " << + dbus_message_iter_get_arg_type( &variantIt ) ); + } + else + SAL_WARN( "sdremote.bluetooth", "variant type ? " << + dbus_message_iter_get_arg_type( &dictIt ) ); + } + else + { + const char *pStr = pName ? pName : ""; + SAL_INFO( "sdremote.bluetooth", "property '" << pStr << "'" ); + } + } + else + SAL_WARN( "sdremote.bluetooth", "unexpected property key type " + << dbus_message_iter_get_arg_type( &dictIt ) ); + dbus_message_iter_next( &arrayIt ); + } + dbus_message_unref( pMsg ); + + return false; +} + +/* + * This gets an org.freedesktop.DBus.Properties boolean + * (as opposed to the old Bluez 4 custom properties methods as visible above). + */ +static bool +getDBusBooleanProperty( DBusConnection *pConnection, DBusObject *pAdapter, + const char *pPropertyName, bool *pBoolean ) +{ + assert( pAdapter ); + + *pBoolean = false; + bool bRet = false; + + std::unique_ptr< DBusObject > pProperties ( + pAdapter->cloneForInterface( "org.freedesktop.DBus.Properties" ) ); + + DBusMessage *pMsg = pProperties->getMethodCall( "Get" ); + + DBusMessageIter itIn; + dbus_message_iter_init_append( pMsg, &itIn ); + const char* pInterface = "org.bluez.Adapter1"; + dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pInterface ); + dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pPropertyName ); + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + DBusMessageIter it; + if( !pMsg || !dbus_message_iter_init( pMsg, &it ) ) + { + SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" ); + return false; + } + + if( DBUS_TYPE_VARIANT != dbus_message_iter_get_arg_type( &it ) ) + { + SAL_WARN( "sdremote.bluetooth", "invalid return type" ); + } + else + { + DBusMessageIter variantIt; + dbus_message_iter_recurse( &it, &variantIt ); + + if( dbus_message_iter_get_arg_type( &variantIt ) == DBUS_TYPE_BOOLEAN ) + { + dbus_bool_t bBool = false; + dbus_message_iter_get_basic( &variantIt, &bBool ); + SAL_INFO( "sdremote.bluetooth", "" << pPropertyName << " is " << bBool ); + *pBoolean = bBool; + bRet = true; + } + else + { + SAL_WARN( "sdremote.bluetooth", "" << pPropertyName << " type " << + dbus_message_iter_get_arg_type( &variantIt ) ); + } + + const char* pError = dbus_message_get_error_name( pMsg ); + if ( pError ) + { + SAL_WARN( "sdremote.bluetooth", + "Get failed for " << pPropertyName << " on " << + pAdapter->maPath << " with error: " << pError ); + } + } + dbus_message_unref( pMsg ); + + return bRet; +} + +static void +setDBusBooleanProperty( DBusConnection *pConnection, DBusObject *pAdapter, + const char *pPropertyName, bool bBoolean ) +{ + assert( pAdapter ); + + std::unique_ptr< DBusObject > pProperties( + pAdapter->cloneForInterface( "org.freedesktop.DBus.Properties" ) ); + + DBusMessage *pMsg = pProperties->getMethodCall( "Set" ); + + DBusMessageIter itIn; + dbus_message_iter_init_append( pMsg, &itIn ); + const char* pInterface = "org.bluez.Adapter1"; + dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pInterface ); + dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pPropertyName ); + + { + DBusMessageIter varIt; + dbus_message_iter_open_container( &itIn, DBUS_TYPE_VARIANT, + DBUS_TYPE_BOOLEAN_AS_STRING, &varIt ); + dbus_bool_t bDBusBoolean = bBoolean; + dbus_message_iter_append_basic( &varIt, DBUS_TYPE_BOOLEAN, &bDBusBoolean ); + dbus_message_iter_close_container( &itIn, &varIt ); + } + + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + if( !pMsg ) + { + SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" ); + } + else + { + const char* pError = dbus_message_get_error_name( pMsg ); + if ( pError ) + { + SAL_WARN( "sdremote.bluetooth", + "Set failed for " << pPropertyName << " on " << + pAdapter->maPath << " with error: " << pError ); + } + dbus_message_unref( pMsg ); + } +} + +static bool +getDiscoverable( DBusConnection *pConnection, DBusObject *pAdapter ) +{ + if (pAdapter->maInterface == "org.bluez.Adapter") // Bluez 4 + { + bool bDiscoverable; + if( getBluez4BooleanProperty(pConnection, pAdapter, "Discoverable", &bDiscoverable ) ) + return bDiscoverable; + } + else if (pAdapter->maInterface == "org.bluez.Adapter1") // Bluez 5 + { + bool bDiscoverable; + if ( getDBusBooleanProperty(pConnection, pAdapter, "Discoverable", &bDiscoverable ) ) + return bDiscoverable; + } + return false; +} + +static void +setDiscoverable( DBusConnection *pConnection, DBusObject *pAdapter, bool bDiscoverable ) +{ + SAL_INFO( "sdremote.bluetooth", "setDiscoverable to " << bDiscoverable ); + + if (pAdapter->maInterface == "org.bluez.Adapter") // Bluez 4 + { + bool bPowered = false; + if( !getBluez4BooleanProperty( pConnection, pAdapter, "Powered", &bPowered ) || !bPowered ) + return; // nothing to do + + DBusMessage *pMsg; + DBusMessageIter it, varIt; + + // set timeout to zero + pMsg = pAdapter->getMethodCall( "SetProperty" ); + dbus_message_iter_init_append( pMsg, &it ); + const char *pTimeoutStr = "DiscoverableTimeout"; + dbus_message_iter_append_basic( &it, DBUS_TYPE_STRING, &pTimeoutStr ); + dbus_message_iter_open_container( &it, DBUS_TYPE_VARIANT, + DBUS_TYPE_UINT32_AS_STRING, &varIt ); + dbus_uint32_t nTimeout = 0; + dbus_message_iter_append_basic( &varIt, DBUS_TYPE_UINT32, &nTimeout ); + dbus_message_iter_close_container( &it, &varIt ); + dbus_connection_send( pConnection, pMsg, nullptr ); // async send - why not ? + dbus_message_unref( pMsg ); + + // set discoverable value + pMsg = pAdapter->getMethodCall( "SetProperty" ); + dbus_message_iter_init_append( pMsg, &it ); + const char *pDiscoverableStr = "Discoverable"; + dbus_message_iter_append_basic( &it, DBUS_TYPE_STRING, &pDiscoverableStr ); + dbus_message_iter_open_container( &it, DBUS_TYPE_VARIANT, + DBUS_TYPE_BOOLEAN_AS_STRING, &varIt ); + dbus_bool_t bValue = bDiscoverable; + dbus_message_iter_append_basic( &varIt, DBUS_TYPE_BOOLEAN, &bValue ); + dbus_message_iter_close_container( &it, &varIt ); // async send - why not ? + dbus_connection_send( pConnection, pMsg, nullptr ); + dbus_message_unref( pMsg ); + } + else if (pAdapter->maInterface == "org.bluez.Adapter1") // Bluez 5 + { + setDBusBooleanProperty(pConnection, pAdapter, "Discoverable", bDiscoverable ); + } +} + +static std::unique_ptr +registerWithDefaultAdapter( DBusConnection *pConnection ) +{ + std::unique_ptr pService(bluez4GetDefaultService( pConnection )); + if( pService ) + { + if( !bluez4RegisterServiceRecord( pConnection, pService.get(), + bluetooth_service_record ) ) + { + return nullptr; + } + } + + return pService; +} + +static void ProfileUnregisterFunction +(DBusConnection *, void *) +{ + // We specifically don't need to do anything here. +} + +static DBusHandlerResult ProfileMessageFunction +(DBusConnection *pConnection, DBusMessage *pMessage, void *user_data) +{ + SAL_INFO("sdremote.bluetooth", "ProfileMessageFunction||" << dbus_message_get_interface(pMessage) << "||" << dbus_message_get_member(pMessage)); + + if (dbus_message_get_interface(pMessage) == std::string_view("org.bluez.Profile1")) + { + if (dbus_message_get_member(pMessage) == std::string_view("Release")) + { + return DBUS_HANDLER_RESULT_HANDLED; + } + else if (dbus_message_get_member(pMessage) == std::string_view("NewConnection")) + { + if (!dbus_message_has_signature(pMessage, "oha{sv}")) + { + SAL_WARN("sdremote.bluetooth", "wrong signature for NewConnection"); + } + + DBusMessageIter it; + if (!dbus_message_iter_init(pMessage, &it)) + SAL_WARN( "sdremote.bluetooth", "error init dbus" ); + else + { + char* pPath; + dbus_message_iter_get_basic(&it, &pPath); + SAL_INFO("sdremote.bluetooth", "Adapter path:" << pPath); + + if (!dbus_message_iter_next(&it)) + SAL_WARN("sdremote.bluetooth", "not enough parameters passed"); + + // DBUS_TYPE_UNIX_FD == 'h' -- doesn't exist in older versions + // of dbus (< 1.3?) hence defined manually for now + if ('h' == dbus_message_iter_get_arg_type(&it)) + { + + int nDescriptor; + dbus_message_iter_get_basic(&it, &nDescriptor); + std::vector* pCommunicators = static_cast*>(user_data); + + // Bluez gives us non-blocking sockets, but our code relies + // on blocking behaviour. + (void)fcntl(nDescriptor, F_SETFL, fcntl(nDescriptor, F_GETFL) & ~O_NONBLOCK); + + SAL_INFO( "sdremote.bluetooth", "connection accepted " << nDescriptor); + Communicator* pCommunicator = new Communicator( std::make_unique( nDescriptor ) ); + { + ::osl::MutexGuard aGuard(RemoteServer::sDataMutex); + pCommunicators->push_back( pCommunicator ); + } + pCommunicator->launch(); + } + + // For some reason an (empty?) reply is expected. + DBusMessage* pRet = dbus_message_new_method_return(pMessage); + dbus_connection_send(pConnection, pRet, nullptr); + dbus_message_unref(pRet); + + // We could read the remote profile version and features here + // (i.e. they are provided as part of the DBusMessage), + // however for us they are irrelevant (as our protocol handles + // equivalent functionality independently of whether we're on + // bluetooth or normal network connection). + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_get_member(pMessage) == std::string_view("RequestDisconnection")) + { + return DBUS_HANDLER_RESULT_HANDLED; + } + } + SAL_WARN("sdremote.bluetooth", "Couldn't handle message correctly."); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + +} + +static void +setupBluez5Profile1(DBusConnection* pConnection, std::vector* pCommunicators) +{ + bool bErr; + + SAL_INFO("sdremote.bluetooth", "Attempting to register our org.bluez.Profile1"); + static DBusObjectPathVTable aVTable; + aVTable.unregister_function = ProfileUnregisterFunction; + aVTable.message_function = ProfileMessageFunction; + + // dbus_connection_try_register_object_path could be used but only exists for + // dbus >= 1.2 -- we really shouldn't be trying this twice in any case. + // (dbus_connection_try_register_object_path also returns an error with more + // information which could be useful for debugging purposes.) + bErr = !dbus_connection_register_object_path(pConnection, "/org/libreoffice/bluez/profile1", &aVTable, pCommunicators); + + if (bErr) + { + SAL_WARN("sdremote.bluetooth", "Failed to register Bluez 5 Profile1 callback, bluetooth won't work."); + } + + dbus_connection_flush( pConnection ); +} + +static void +unregisterBluez5Profile(DBusConnection* pConnection) +{ + DBusMessage* pMsg = dbus_message_new_method_call("org.bluez", "/org/bluez", + "org.bluez.ProfileManager1", "UnregisterProfile"); + DBusMessageIter it; + dbus_message_iter_init_append(pMsg, &it); + + const char *pPath = "/org/libreoffice/bluez/profile1"; + dbus_message_iter_append_basic(&it, DBUS_TYPE_OBJECT_PATH, &pPath); + + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + if (pMsg) + dbus_message_unref(pMsg); + + dbus_connection_unregister_object_path( pConnection, "/org/libreoffice/bluez/profile1"); + + dbus_connection_flush(pConnection); +} + +static bool +registerBluez5Profile(DBusConnection* pConnection, std::vector* pCommunicators) +{ + setupBluez5Profile1(pConnection, pCommunicators); + + DBusMessage *pMsg; + DBusMessageIter it; + + pMsg = dbus_message_new_method_call("org.bluez", "/org/bluez", + "org.bluez.ProfileManager1", "RegisterProfile"); + dbus_message_iter_init_append(pMsg, &it); + + const char *pPath = "/org/libreoffice/bluez/profile1"; + dbus_message_iter_append_basic(&it, DBUS_TYPE_OBJECT_PATH, &pPath); + const char *pUUID = "spp"; // Bluez translates this to 0x1101 for spp + dbus_message_iter_append_basic(&it, DBUS_TYPE_STRING, &pUUID); + + DBusMessageIter aOptionsIter; + dbus_message_iter_open_container(&it, DBUS_TYPE_ARRAY, "{sv}", &aOptionsIter); + + DBusMessageIter aEntry; + + { + dbus_message_iter_open_container(&aOptionsIter, DBUS_TYPE_DICT_ENTRY, nullptr, &aEntry); + + const char *pString = "Name"; + dbus_message_iter_append_basic(&aEntry, DBUS_TYPE_STRING, &pString); + + const char *pValue = "LibreOffice Impress Remote"; + DBusMessageIter aValue; + dbus_message_iter_open_container(&aEntry, DBUS_TYPE_VARIANT, "s", &aValue); + dbus_message_iter_append_basic(&aValue, DBUS_TYPE_STRING, &pValue); + dbus_message_iter_close_container(&aEntry, &aValue); + dbus_message_iter_close_container(&aOptionsIter, &aEntry); + } + + dbus_message_iter_close_container(&it, &aOptionsIter); + + // Other properties that we could set (but don't, since they appear + // to be useless for us): + // "Service": "0x1101" (not needed, but we used to have it in the manually defined profile). + // "Role": setting this to "server" breaks things, although we think we're a server? + // "Channel": seems to be dealt with automatically (but we used to use 5 in the manual profile). + + bool bSuccess = true; + + pMsg = sendUnrefAndWaitForReply( pConnection, pMsg ); + + DBusError aError; + dbus_error_init(&aError); + if (pMsg && dbus_set_error_from_message( &aError, pMsg )) + { + bSuccess = false; + SAL_WARN("sdremote.bluetooth", + "Failed to register our Profile1 with bluez ProfileManager " + << (aError.message ? aError.message : "")); + } + + dbus_error_free(&aError); + if (pMsg) + dbus_message_unref(pMsg); + + dbus_connection_flush(pConnection); + + return bSuccess; +} + +#endif // LINUX_BLUETOOTH + +BluetoothServer::BluetoothServer( std::vector* pCommunicators ) + : meWasDiscoverable( UNKNOWN ), + mpCommunicators( pCommunicators ) +{ +#ifdef LINUX_BLUETOOTH + // D-Bus requires the following in order to be thread-safe (and we + // potentially access D-Bus from different threads in different places of + // the code base): + if (!dbus_threads_init_default()) { + throw std::bad_alloc(); + } + + mpImpl.reset(new BluetoothServer::Impl()); +#endif +} + +BluetoothServer::~BluetoothServer() +{ +} + +void BluetoothServer::ensureDiscoverable() +{ +#ifdef LINUX_BLUETOOTH + // Push it all across into our mainloop + if( !spServer ) + return; + GSource *pIdle = g_idle_source_new(); + g_source_set_callback( pIdle, ensureDiscoverable_cb, nullptr, nullptr ); + g_source_set_priority( pIdle, G_PRIORITY_DEFAULT ); + g_source_attach( pIdle, spServer->mpImpl->mpContext ); + g_source_unref( pIdle ); +#endif +} + +void BluetoothServer::restoreDiscoverable() +{ +#ifdef LINUX_BLUETOOTH + // Push it all across into our mainloop + if( !spServer ) + return; + GSource *pIdle = g_idle_source_new(); + g_source_set_callback( pIdle, restoreDiscoverable_cb, nullptr, nullptr ); + g_source_set_priority( pIdle, G_PRIORITY_DEFAULT_IDLE ); + g_source_attach( pIdle, spServer->mpImpl->mpContext ); + g_source_unref( pIdle ); +#endif +} + +void BluetoothServer::doEnsureDiscoverable() +{ +#ifdef LINUX_BLUETOOTH + if (!spServer->mpImpl->mpConnection || + spServer->meWasDiscoverable != UNKNOWN ) + return; + + // Find out if we are discoverable already ... + std::unique_ptr pAdapter = spServer->mpImpl->getAdapter(); + if( !pAdapter ) + return; + + bool bDiscoverable = getDiscoverable(spServer->mpImpl->mpConnection, pAdapter.get() ); + + spServer->meWasDiscoverable = bDiscoverable ? DISCOVERABLE : NOT_DISCOVERABLE; + if( !bDiscoverable ) + setDiscoverable( spServer->mpImpl->mpConnection, pAdapter.get(), true ); +#endif +} + +void BluetoothServer::doRestoreDiscoverable() +{ + if( spServer->meWasDiscoverable == NOT_DISCOVERABLE ) + { +#ifdef LINUX_BLUETOOTH + std::unique_ptr pAdapter = spServer->mpImpl->getAdapter(); + if( !pAdapter ) + return; + setDiscoverable( spServer->mpImpl->mpConnection, pAdapter.get(), false ); +#endif + } + spServer->meWasDiscoverable = UNKNOWN; +} + +// We have to have all our clients shut otherwise we can't +// re-bind to the same port number it appears. +void BluetoothServer::cleanupCommunicators() +{ + ::osl::MutexGuard aGuard(RemoteServer::sDataMutex); + for (auto& rpCommunicator : *mpCommunicators) + rpCommunicator->forceClose(); + // the hope is that all the threads then terminate cleanly and + // clean themselves up. +} + +void SAL_CALL BluetoothServer::run() +{ + SAL_INFO( "sdremote.bluetooth", "BluetoothServer::run called" ); + osl::Thread::setName("BluetoothServer"); +#ifdef LINUX_BLUETOOTH + DBusConnection *pConnection = dbusConnectToNameOnBus(); + if( !pConnection ) + return; + + // For either implementation we need to poll the dbus fd + int fd = -1; + GPollFD aDBusFD; + if( dbus_connection_get_unix_fd( pConnection, &fd ) && fd >= 0 ) + { + aDBusFD.fd = fd; + aDBusFD.events = G_IO_IN | G_IO_PRI; + g_main_context_add_poll( mpImpl->mpContext, &aDBusFD, G_PRIORITY_DEFAULT ); + } + else + SAL_WARN( "sdremote.bluetooth", "failed to poll for incoming dbus signals" ); + + if (isBluez5Available(pConnection)) + { + SAL_INFO("sdremote.bluetooth", "Using Bluez 5"); + registerBluez5Profile(pConnection, mpCommunicators); + mpImpl->mpConnection = pConnection; + mpImpl->maBluezVersion = Impl::BluezVersion::BLUEZ5; + + // We don't need to listen to adapter changes anymore -- profile + // registration is done globally for the entirety of bluez, so we only + // need adapters when setting discoverability, which can be done + // dynamically without the need to listen for changes. + + // TODO: exit on SD deinit + // Probably best to do that in SdModule::~SdModule? + while (true) + { + aDBusFD.revents = 0; + g_main_context_iteration( mpImpl->mpContext, true ); + if( aDBusFD.revents ) + { + dbus_connection_read_write( pConnection, 0 ); + while (DBUS_DISPATCH_DATA_REMAINS == dbus_connection_get_dispatch_status( pConnection )) + dbus_connection_dispatch( pConnection ); + } + if ((false)) break; + // silence Clang -Wunreachable-code after loop (TODO: proper + // fix?) + } + unregisterBluez5Profile( pConnection ); + g_main_context_unref( mpImpl->mpContext ); + mpImpl->mpConnection = nullptr; + mpImpl->mpContext = nullptr; + return; + } + + // Otherwise we could be on Bluez 4 and continue as usual. + mpImpl->maBluezVersion = Impl::BluezVersion::BLUEZ4; + + // Try to setup the default adapter, otherwise wait for add/remove signal + mpImpl->mpService = registerWithDefaultAdapter( pConnection ); + // listen for connection state and power changes - we need to close + // and re-create our socket code on suspend / resume, enable/disable + DBusError aError; + dbus_error_init( &aError ); + dbus_bus_add_match( pConnection, "type='signal',interface='org.bluez.Manager'", &aError ); + dbus_connection_flush( pConnection ); + + // Try to setup the default adapter, otherwise wait for add/remove signal + mpImpl->mpService = registerWithDefaultAdapter( pConnection ); + + // poll on our bluetooth socket - if we can. + GPollFD aSocketFD; + if( mpImpl->mpService ) + bluezCreateAttachListeningSocket( mpImpl->mpContext, &aSocketFD ); + + mpImpl->mpConnection = pConnection; + + while( true ) + { + aDBusFD.revents = 0; + aSocketFD.revents = 0; + g_main_context_iteration( mpImpl->mpContext, true ); + + SAL_INFO( "sdremote.bluetooth", "main-loop spin " + << aDBusFD.revents << " " << aSocketFD.revents ); + if( aDBusFD.revents ) + { + dbus_connection_read_write( pConnection, 0 ); + DBusMessage *pMsg = dbus_connection_pop_message( pConnection ); + if( pMsg ) + { + if( dbus_message_is_signal( pMsg, "org.bluez.Manager", "AdapterRemoved" ) ) + { + SAL_WARN( "sdremote.bluetooth", "lost adapter - cleaning up sockets" ); + bluezDetachCloseSocket( mpImpl->mpContext, &aSocketFD ); + cleanupCommunicators(); + } + else if( dbus_message_is_signal( pMsg, "org.bluez.Manager", "AdapterAdded" ) || + dbus_message_is_signal( pMsg, "org.bluez.Manager", "DefaultAdapterChanged" ) ) + { + SAL_WARN( "sdremote.bluetooth", "gained adapter - re-generating sockets" ); + bluezDetachCloseSocket( mpImpl->mpContext, &aSocketFD ); + cleanupCommunicators(); + mpImpl->mpService = registerWithDefaultAdapter( pConnection ); + if( mpImpl->mpService ) + bluezCreateAttachListeningSocket( mpImpl->mpContext, &aSocketFD ); + } + else + SAL_INFO( "sdremote.bluetooth", "unknown incoming dbus message, " + " type: " << dbus_message_get_type( pMsg ) + << " path: '" << dbus_message_get_path( pMsg ) + << "' interface: '" << dbus_message_get_interface( pMsg ) + << "' member: '" << dbus_message_get_member( pMsg ) ); + } + dbus_message_unref( pMsg ); + } + + if( aSocketFD.revents ) + { + sockaddr_rc aRemoteAddr; + socklen_t aRemoteAddrLen = sizeof(aRemoteAddr); + + SAL_INFO( "sdremote.bluetooth", "performing accept" ); + int nClient = accept( aSocketFD.fd, reinterpret_cast(&aRemoteAddr), &aRemoteAddrLen); + if ( nClient < 0 && errno != EAGAIN ) + { + SAL_WARN( "sdremote.bluetooth", "accept failed with errno " << errno ); + } else { + SAL_INFO( "sdremote.bluetooth", "connection accepted " << nClient ); + Communicator* pCommunicator = new Communicator( std::make_unique( nClient ) ); + { + ::osl::MutexGuard aGuard(RemoteServer::sDataMutex); + mpCommunicators->push_back( pCommunicator ); + } + pCommunicator->launch(); + } + } + if ((false)) break; + // silence Clang -Wunreachable-code after loop (TODO: proper fix?) + } + + unregisterBluez5Profile( pConnection ); + g_main_context_unref( mpImpl->mpContext ); + mpImpl->mpConnection = nullptr; + mpImpl->mpContext = nullptr; + +#elif defined(_WIN32) + WORD wVersionRequested; + WSADATA wsaData; + + wVersionRequested = MAKEWORD(2, 2); + + if ( WSAStartup(wVersionRequested, &wsaData) ) + { + return; // winsock dll couldn't be loaded + } + + int aSocket = socket( AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM ); + if ( !aSocket ) + { + WSACleanup(); + return; + } + SOCKADDR_BTH aAddr; + aAddr.addressFamily = AF_BTH; + aAddr.btAddr = 0; + aAddr.serviceClassId = GUID_NULL; + aAddr.port = BT_PORT_ANY; // Select any free socket. + if ( bind( aSocket, reinterpret_cast(&aAddr), sizeof(aAddr) ) == SOCKET_ERROR ) + { + closesocket( aSocket ); + WSACleanup(); + return; + } + + SOCKADDR_BTH aName; + int aNameSize = sizeof(aName); + getsockname( aSocket, reinterpret_cast(&aName), &aNameSize ); // Retrieve the local address and port + + CSADDR_INFO aAddrInfo = {}; + aAddrInfo.LocalAddr.lpSockaddr = reinterpret_cast(&aName); + aAddrInfo.LocalAddr.iSockaddrLength = sizeof( SOCKADDR_BTH ); + aAddrInfo.iSocketType = SOCK_STREAM; + aAddrInfo.iProtocol = BTHPROTO_RFCOMM; + + // To be used for setting a custom UUID once available. +// GUID uuid; +// uuid.Data1 = 0x00001101; +// memset( &uuid, 0x1000 + UUID*2^96, sizeof( GUID ) ); +// uuid.Data2 = 0; +// uuid.Data3 = 0x1000; +// ULONGLONG aData4 = 0x800000805F9B34FB; +// memcpy( uuid.Data4, &aData4, sizeof(uuid.Data4) ); + + WSAQUERYSETW aRecord = {}; + aRecord.dwSize = sizeof(aRecord); + aRecord.lpszServiceInstanceName = const_cast( + L"LibreOffice Impress Remote Control"); + aRecord.lpszComment = const_cast( + L"Remote control of presentations over bluetooth."); + aRecord.lpServiceClassId = const_cast(&SerialPortServiceClass_UUID); + aRecord.dwNameSpace = NS_BTH; + aRecord.dwNumberOfCsAddrs = 1; + aRecord.lpcsaBuffer = &aAddrInfo; + if (WSASetServiceW( &aRecord, RNRSERVICE_REGISTER, 0 ) == SOCKET_ERROR) + { + closesocket( aSocket ); + WSACleanup(); + return; + } + + if ( listen( aSocket, 1 ) == SOCKET_ERROR ) + { + closesocket( aSocket ); + WSACleanup(); + return; + } + + SOCKADDR_BTH aRemoteAddr; + int aRemoteAddrLen = sizeof(aRemoteAddr); + while ( true ) + { + SOCKET socket; + if ( (socket = accept(aSocket, reinterpret_cast(&aRemoteAddr), &aRemoteAddrLen)) == INVALID_SOCKET ) + { + closesocket( aSocket ); + WSACleanup(); + return; + } else { + Communicator* pCommunicator = new Communicator( std::make_unique( socket) ); + { + ::osl::MutexGuard aGuard(RemoteServer::sDataMutex); + mpCommunicators->push_back( pCommunicator ); + } + pCommunicator->launch(); + } + } + +#elif defined(MACOSX) + // Build up dictionary at run-time instead of bothering with a + // .plist file, using the Objective-C API + + // Compare to BluetoothServiceRecord.hxx + + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + + NSDictionary *dict = + [NSDictionary dictionaryWithObjectsAndKeys: + + // Service class ID list + [NSArray arrayWithObject: + [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16ServiceClassSerialPort]], + @"0001 - ServiceClassIDList", + + // Protocol descriptor list + [NSArray arrayWithObjects: + [NSArray arrayWithObject: [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16L2CAP]], + [NSArray arrayWithObjects: + [IOBluetoothSDPUUID uuid16: kBluetoothL2CAPPSMRFCOMM], + [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt: 1], + @"DataElementSize", + [NSNumber numberWithInt: 1], + @"DataElementType", + [NSNumber numberWithInt: 5], // RFCOMM port number, will be replaced if necessary automatically + @"DataElementValue", + nil], + nil], + nil], + @"0004 - Protocol descriptor list", + + // Browse group list + [NSArray arrayWithObject: + [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16ServiceClassPublicBrowseGroup]], + @"0005 - BrowseGroupList", + + // Language base attribute ID list + [NSArray arrayWithObjects: + [NSData dataWithBytes: "en" length: 2], + [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt: 2], + @"DataElementSize", + [NSNumber numberWithInt: 1], + @"DataElementType", + [NSNumber numberWithInt: 0x006a], // encoding + @"DataElementValue", + nil], + [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt: 2], + @"DataElementSize", + [NSNumber numberWithInt: 1], + @"DataElementType", + [NSNumber numberWithInt: 0x0100], // offset + @"DataElementValue", + nil], + nil], + @"0006 - LanguageBaseAttributeIDList", + + // Bluetooth profile descriptor list + [NSArray arrayWithObject: + [NSArray arrayWithObjects: + [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16ServiceClassSerialPort], + [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt: 2], + @"DataElementSize", + [NSNumber numberWithInt: 1], + @"DataElementType", + [NSNumber numberWithInt: 0x0100], // version number ? + @"DataElementValue", + nil], + nil]], + @"0009 - BluetoothProfileDescriptorList", + + // Attributes pointed to by the LanguageBaseAttributeIDList + @"LibreOffice Impress Remote Control", + @"0100 - ServiceName", + @"The Document Foundation", + @"0102 - ProviderName", + nil]; + + // Create service + IOBluetoothSDPServiceRecordRef serviceRecordRef; + SAL_WNODEPRECATED_DECLARATIONS_PUSH //TODO: 10.9 IOBluetoothAddServiceDict + IOReturn rc = IOBluetoothAddServiceDict(reinterpret_cast(dict), &serviceRecordRef); + SAL_WNODEPRECATED_DECLARATIONS_POP + + SAL_INFO("sdremote.bluetooth", "IOBluetoothAddServiceDict returned " << rc); + + if (rc == kIOReturnSuccess) + { + IOBluetoothSDPServiceRecord *serviceRecord = + [IOBluetoothSDPServiceRecord withSDPServiceRecordRef: serviceRecordRef]; + + BluetoothRFCOMMChannelID channelID; + [serviceRecord getRFCOMMChannelID: &channelID]; + + BluetoothSDPServiceRecordHandle serviceRecordHandle; + [serviceRecord getServiceRecordHandle: &serviceRecordHandle]; + + // Register callback for incoming connections + IOBluetoothRegisterForFilteredRFCOMMChannelOpenNotifications( + incomingCallback, + this, + channelID, + kIOBluetoothUserNotificationChannelDirectionIncoming); + + [serviceRecord release]; + } + + [pool release]; + + (void) mpCommunicators; +#else + (void) mpCommunicators; // avoid warnings about unused member +#endif +} + +BluetoothServer *sd::BluetoothServer::spServer = nullptr; + +void BluetoothServer::setup( std::vector* pCommunicators ) +{ + if (spServer) + return; + + spServer = new BluetoothServer( pCommunicators ); + spServer->create(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/BluetoothServer.hxx b/sd/source/ui/remotecontrol/BluetoothServer.hxx new file mode 100644 index 0000000000..9e20bfa519 --- /dev/null +++ b/sd/source/ui/remotecontrol/BluetoothServer.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include +#include + +#include + +#if (defined(LINUX) && !defined(__FreeBSD_kernel__)) && ENABLE_DBUS && DBUS_HAVE_GLIB +# define LINUX_BLUETOOTH +#endif + +namespace sd +{ + class Communicator; + + class BluetoothServer: + public osl::Thread + { + public: + static void setup( std::vector* pCommunicators ); + + /// ensure that Bluetooth discoverability is on + static void ensureDiscoverable(); + /// restore the state of discoverability from before ensureDiscoverable + static void restoreDiscoverable(); + + // called by C / idle callbacks + static void doEnsureDiscoverable(); + static void doRestoreDiscoverable(); + +#if defined(MACOSX) + void addCommunicator( Communicator* pCommunicator ); +#endif + private: + explicit BluetoothServer( std::vector* pCommunicators ); + virtual ~BluetoothServer() override; + + enum { UNKNOWN, DISCOVERABLE, NOT_DISCOVERABLE } meWasDiscoverable; + static BluetoothServer *spServer; + +#ifdef LINUX_BLUETOOTH + struct Impl; + std::unique_ptr mpImpl; +#endif + virtual void SAL_CALL run() override; + + void cleanupCommunicators(); + std::vector* mpCommunicators; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/BluetoothServer.mm b/sd/source/ui/remotecontrol/BluetoothServer.mm new file mode 100644 index 0000000000..28288ff6fa --- /dev/null +++ b/sd/source/ui/remotecontrol/BluetoothServer.mm @@ -0,0 +1 @@ +#include "BluetoothServer.cxx" \ No newline at end of file diff --git a/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx b/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx new file mode 100644 index 0000000000..c1a00fb3b9 --- /dev/null +++ b/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +// FIXME: look into sharing definitions across OS's (i.e. UUID and port ). +// Look into dynamically determining which ports are available. + +// SDP is a Service Description Protocol cf. +// http://developer.bluetooth.org/TechnologyOverview/Pages/DI.aspx +// This is an XML representation, an alternative would be a +// binary SDP record. + +// for numbers see: +// https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm + +const char * const bluetooth_service_record = + "" + "" + "" // Service class ID list + "" + "" // an assigned service class meaning: 'serial port' + // we could add our own 'LibreOffice remote' service + // class here too in future ... + "" + "" + "" // Protocol Descriptor list + "" + "" + "" // L2CAP Protocol descriptor + "" + "" + "" // enumeration value of RFCOMM protocol + "" // RFCOMM port number + "" + "" + "" + "" // Browse Group List + "" + "" // public browse class + "" + "" + "" // Language Base Attribute ID List + "" + "" // code_ISO639 + "" // encoding 0x6a + "" // base_offset ie. points to below => + "" + "" + "" // Bluetooth Profile Descriptor List + "" + "" + "" // 'serial port' UUID as above + ""// version number 1.0 ? + "" + "" + "" + // Attribute identifiers are pointed to by the Language Base Attribute ID List + // id+0 = ServiceName, id+1 = ServiceDescription, id+2=ProviderName + "" + "" + "" + "" + "" + "" + "" + ; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/BufferedStreamSocket.cxx b/sd/source/ui/remotecontrol/BufferedStreamSocket.cxx new file mode 100644 index 0000000000..64ad5eb8d5 --- /dev/null +++ b/sd/source/ui/remotecontrol/BufferedStreamSocket.cxx @@ -0,0 +1,130 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "BufferedStreamSocket.hxx" + +#include +#include +#include + +#ifdef _WIN32 + // LO vs WinAPI conflict + #undef WB_LEFT + #undef WB_RIGHT + + #include +#else + #include + #include +#endif +using namespace sd; +using namespace osl; + +BufferedStreamSocket::BufferedStreamSocket( const osl::StreamSocket &aSocket ): + StreamSocket( aSocket ), + aRet( 0 ), + aRead( 0 ), + mSocket( 0 ), + usingCSocket( false ) +{ +} + +BufferedStreamSocket::BufferedStreamSocket( int aSocket ): + aRet( 0 ), + aRead( 0 ), + mSocket( aSocket ), + usingCSocket( true ) +{ +} + +BufferedStreamSocket::~BufferedStreamSocket() { + close(); +} + +void BufferedStreamSocket::getPeerAddr(osl::SocketAddr& rAddr) +{ + assert ( !usingCSocket ); + StreamSocket::getPeerAddr( rAddr ); +} + +sal_Int32 BufferedStreamSocket::write( const void* pBuffer, sal_uInt32 n ) +{ + if ( !usingCSocket ) + return StreamSocket::write( pBuffer, n ); + else + return ::send( + mSocket, +#if defined(_WIN32) + static_cast(pBuffer), +#else + pBuffer, +#endif + static_cast(n), 0 ); +} + +void BufferedStreamSocket::close() +{ + if( usingCSocket && mSocket != -1 ) + { +#ifdef _WIN32 + ::closesocket( mSocket ); +#else + ::close( mSocket ); +#endif + mSocket = -1; + } + else + ::osl::StreamSocket::close(); +} + +sal_Int32 BufferedStreamSocket::readLine( OString& aLine ) +{ + while ( true ) + { + // Process buffer first in case data already present. + std::vector::iterator aIt; + if ( (aIt = find( aBuffer.begin(), aBuffer.end(), '\n' )) + != aBuffer.end() ) + { + sal_uInt64 aLocation = aIt - aBuffer.begin(); + + aLine = OString( &(*aBuffer.begin()), aLocation ); + + aBuffer.erase( aBuffer.begin(), aIt + 1 ); // Also delete the empty line + aRead -= (aLocation + 1); + + SAL_INFO( "sdremote.bluetooth", "recv line '" << aLine << "'" ); + + return aLine.getLength() + 1; + } + + // Then try and receive if nothing present + aBuffer.resize( aRead + 100 ); + if ( !usingCSocket) + aRet = StreamSocket::recv( &aBuffer[aRead], 100 ); + else + aRet = ::recv( mSocket, &aBuffer[aRead], 100, 0 ); + + SAL_INFO( "sdremote.bluetooth", "recv " << aRet << " aBuffer len " << aBuffer.size() ); + if ( aRet <= 0 ) + { + return 0; + } + // Prevent buffer from growing massively large. + if ( aRead > MAX_LINE_LENGTH ) + { + aBuffer.clear(); + return 0; + } + aRead += aRet; + } + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/BufferedStreamSocket.hxx b/sd/source/ui/remotecontrol/BufferedStreamSocket.hxx new file mode 100644 index 0000000000..6abf7ec1bf --- /dev/null +++ b/sd/source/ui/remotecontrol/BufferedStreamSocket.hxx @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include "IBluetoothSocket.hxx" +#include +#include + +#define MAX_LINE_LENGTH 20000 + +namespace sd +{ + + /** + * [A wrapper for an osl StreamSocket to allow reading lines.] + * + * Currently wraps either an osl StreamSocket or a standard c socket, + * allowing reading and writing for our purposes. Should eventually be + * returned to being a StreamSocket wrapper if/when Bluetooth is + * integrated into osl Sockets. + */ + class BufferedStreamSocket final : + public IBluetoothSocket, + private ::osl::StreamSocket + { + public: + /** + * Create a BufferedStreamSocket on top of an + * osl::StreamSocket. + */ + explicit BufferedStreamSocket( const osl::StreamSocket &aSocket ); + /** + * Create a BufferedStreamSocket on top of a POSIX or WinSock socket. + */ + explicit BufferedStreamSocket( int aSocket ); + BufferedStreamSocket( const BufferedStreamSocket &aSocket ); + + ~BufferedStreamSocket(); + + /** + * Blocks until a line is read. + * Returns whatever the last call of recv returned, i.e. 0 or less + * if there was a problem in communications. + */ + virtual sal_Int32 readLine( OString& aLine ) override; + + virtual sal_Int32 write( const void* pBuffer, sal_uInt32 n ) override; + + virtual void close() override; + + void getPeerAddr(osl::SocketAddr&); + private: + sal_Int32 aRet, aRead; + std::vector aBuffer; + int mSocket; + bool usingCSocket; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Communicator.cxx b/sd/source/ui/remotecontrol/Communicator.cxx new file mode 100644 index 0000000000..0618675559 --- /dev/null +++ b/sd/source/ui/remotecontrol/Communicator.cxx @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Communicator.hxx" +#include "IBluetoothSocket.hxx" +#include "Listener.hxx" +#include "Receiver.hxx" +#include "Transmitter.hxx" +#include + +using namespace sd; +using namespace com::sun::star; +using namespace osl; + +Communicator::Communicator( std::unique_ptr pSocket ): + Thread( "CommunicatorThread" ), + mpSocket( std::move(pSocket) ) +{ +} + +Communicator::~Communicator() +{ +} + +/// Close the underlying socket from another thread to force +/// an early exit / termination +void Communicator::forceClose() +{ + if( mpSocket ) + mpSocket->close(); +} + +// Run as a thread +void Communicator::execute() +{ + pTransmitter.reset( new Transmitter( mpSocket.get() ) ); + pTransmitter->create(); + + pTransmitter->addMessage( "LO_SERVER_SERVER_PAIRED\n\n"_ostr, + Transmitter::PRIORITY_HIGH ); + + pTransmitter->addMessage( "LO_SERVER_INFO\n" LIBO_VERSION_DOTTED "\n\n"_ostr, + Transmitter::PRIORITY_HIGH ); + + Receiver aReceiver( pTransmitter.get() ); + try { + uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create( ::comphelper::getProcessComponentContext() ); + uno::Reference< frame::XFrame > xFrame = xFramesSupplier->getActiveFrame(); + + uno::Reference xPS; + if( xFrame.is() ) + xPS.set( xFrame->getController()->getModel(), uno::UNO_QUERY ); + uno::Reference xPresentation; + if( xPS.is() ) + xPresentation.set( xPS->getPresentation(), uno::UNO_QUERY ); + if ( xPresentation.is() && xPresentation->isRunning() ) + { + presentationStarted( xPresentation->getController() ); + OString aBuffer = + "slideshow_info\n" + + OUStringToOString( ::comphelper::DocumentInfo::getDocumentTitle( xFrame->getController()->getModel() ), RTL_TEXTENCODING_UTF8 ) + + "\n\n"; + + pTransmitter->addMessage( aBuffer, Transmitter::PRIORITY_LOW ); + } + else + { + pTransmitter->addMessage( "slideshow_finished\n\n"_ostr, + Transmitter::PRIORITY_HIGH ); + } + } + catch (uno::RuntimeException &) + { + } + + sal_uInt64 aRet; + std::vector aCommand; + while ( true ) + { + OString aLine; + aRet = mpSocket->readLine( aLine ); + if ( aRet == 0 ) + { + break; // I.e. transmission finished. + } + if ( aLine.getLength() ) + { + aCommand.push_back( aLine ); + } + else + { + aReceiver.pushCommand( aCommand ); + aCommand.clear(); + } + } + + SAL_INFO ("sdremote", "Exiting transmission loop"); + + disposeListener(); + + pTransmitter->notifyFinished(); + pTransmitter->join(); + pTransmitter = nullptr; + + mpSocket->close(); + mpSocket.reset(); + + RemoteServer::removeCommunicator( this ); +} + +void Communicator::informListenerDestroyed() +{ + // called only from the Listener::disposing() method + // during disposal of this communicator + + if ( pTransmitter ) + pTransmitter->addMessage( "slideshow_finished\n\n"_ostr, + Transmitter::PRIORITY_HIGH ); +} + +void Communicator::presentationStarted( const css::uno::Reference< + css::presentation::XSlideShowController > &rController ) +{ + if ( pTransmitter ) + { + mListener.set( new Listener( this, pTransmitter.get() ) ); + mListener->init( rController ); + } +} + +void Communicator::disposeListener() +{ + if ( mListener.is() ) + { + mListener->dispose(); + mListener = nullptr; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Communicator.hxx b/sd/source/ui/remotecontrol/Communicator.hxx new file mode 100644 index 0000000000..f8f23c58c0 --- /dev/null +++ b/sd/source/ui/remotecontrol/Communicator.hxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include + +#include +#include + +namespace com::sun::star::uno { template class Reference; } +namespace com::sun::star::presentation { class XSlideShowController; } +namespace sd { struct IBluetoothSocket; } + +namespace sd +{ + + class Transmitter; + class Listener; + + /** Class used for communication with one single client, dealing with all + * tasks specific to this client. + * + * Needs to be created, then started using launch(), disposes itself. + */ + class Communicator : public salhelper::Thread + { + public: + explicit Communicator( std::unique_ptr pSocket ); + virtual ~Communicator() override; + + void presentationStarted( const css::uno::Reference< + css::presentation::XSlideShowController > &rController ); + void informListenerDestroyed(); + void disposeListener(); + void forceClose(); + + private: + void execute() override; + std::unique_ptr mpSocket; + + std::unique_ptr pTransmitter; + rtl::Reference mListener; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/DiscoveryService.cxx b/sd/source/ui/remotecontrol/DiscoveryService.cxx new file mode 100644 index 0000000000..bdd0b51c80 --- /dev/null +++ b/sd/source/ui/remotecontrol/DiscoveryService.cxx @@ -0,0 +1,186 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include +#include +#include + +#include "DiscoveryService.hxx" +#include "ZeroconfService.hxx" + +#ifdef _WIN32 + // LO vs WinAPI conflict + #undef WB_LEFT + #undef WB_RIGHT + + #include + #include + + #include "WINNetworkService.hxx" + typedef int socklen_t; +#else + #include + #include + #include +#endif + +#ifdef MACOSX + #include + #include + #import + #include + #import "OSXNetworkService.hxx" +#endif + +#if HAVE_FEATURE_AVAHI + #include "AvahiNetworkService.hxx" +#endif + +using namespace osl; +using namespace sd; + +DiscoveryService::DiscoveryService() + : mSocket(-1) + , zService(nullptr) +{ +} + +DiscoveryService::~DiscoveryService() +{ + if (mSocket != -1) + { +#ifdef _WIN32 + closesocket( mSocket ); +#else + close( mSocket ); +#endif + } + + if (zService) + zService->clear(); +} + +void DiscoveryService::setupSockets() +{ + +#ifdef MACOSX + // Bonjour for OSX + zService = new OSXNetworkService(); + zService->setup(); +#endif + +#if HAVE_FEATURE_AVAHI + // Avahi for Linux + char hostname[1024]; + hostname[1023] = '\0'; + gethostname(hostname, 1023); + + zService = new AvahiNetworkService(hostname); + zService->setup(); +#endif + +#ifdef _WIN32 + zService = new WINNetworkService(); + zService->setup(); +#endif + + // Old implementation for backward compatibility matter + mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); + if (mSocket == -1) + { + SAL_WARN("sd", "DiscoveryService: socket failed: " << errno); + return; // would be better to throw, but unsure if caller handles that + } + + sockaddr_in aAddr = {}; + aAddr.sin_family = AF_INET; + aAddr.sin_addr.s_addr = htonl(INADDR_ANY); + aAddr.sin_port = htons( PORT_DISCOVERY ); + + int rc = bind( mSocket, reinterpret_cast(&aAddr), sizeof(sockaddr_in) ); + + if (rc) + { + SAL_WARN("sd", "DiscoveryService: bind failed: " << errno); + return; // would be better to throw, but unsure if caller handles that + } + + struct ip_mreq multicastRequest; + + multicastRequest.imr_multiaddr.s_addr = htonl((239U << 24) | 1U); // 239.0.0.1 + multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); + + rc = setsockopt( mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, + #ifdef _WIN32 + reinterpret_cast(&multicastRequest), + #else + &multicastRequest, + #endif + sizeof(multicastRequest)); + + if (rc) + { + SAL_WARN("sd", "DiscoveryService: setsockopt failed: " << errno); + return; // would be better to throw, but unsure if caller handles that + } +} + +void SAL_CALL DiscoveryService::run() +{ + osl::Thread::setName("DiscoveryService"); + + setupSockets(); + + // Kept for backward compatibility + while ( true ) + { + char aBuffer[BUFFER_SIZE] = {}; + sockaddr_in aAddr; + socklen_t aLen = sizeof( aAddr ); + if(recvfrom( mSocket, aBuffer, BUFFER_SIZE, 0, reinterpret_cast(&aAddr), &aLen ) > 0) + { + OString aString( aBuffer, strlen( "LOREMOTE_SEARCH" ) ); + if ( aString == "LOREMOTE_SEARCH" ) + { + OString aStringBuffer = "LOREMOTE_ADVERTISE\n" + + OUStringToOString(osl::SocketAddr::getLocalHostname(), RTL_TEXTENCODING_UTF8 ) + + "\n\n"; + if ( sendto( mSocket, aStringBuffer.getStr(), + aStringBuffer.getLength(), 0, reinterpret_cast(&aAddr), + sizeof(aAddr) ) <= 0 ) + { + // Write error or closed socket -- we are done. + return; + } + } + } + else + { + // Read error or closed socket -- we are done. + return; + } + } +} + +DiscoveryService *sd::DiscoveryService::spService = nullptr; + +void DiscoveryService::setup() +{ + if (spService) + return; + + spService = new DiscoveryService(); + spService->create(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/DiscoveryService.hxx b/sd/source/ui/remotecontrol/DiscoveryService.hxx new file mode 100644 index 0000000000..4b235fe893 --- /dev/null +++ b/sd/source/ui/remotecontrol/DiscoveryService.hxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include + +namespace sd { class ZeroconfService; } + +namespace sd +{ + class DiscoveryService : public osl::Thread + { + public: + static void setup(); + + private: + DiscoveryService(); + virtual ~DiscoveryService() override; + + /** + * Networking related setup -- must be run within our own thread + * to prevent the application blocking (fdo#75328). + */ + void setupSockets(); + + static DiscoveryService *spService; + virtual void SAL_CALL run() override; + int mSocket; + + ZeroconfService * zService; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/DiscoveryService.mm b/sd/source/ui/remotecontrol/DiscoveryService.mm new file mode 100644 index 0000000000..3cad7cdfb6 --- /dev/null +++ b/sd/source/ui/remotecontrol/DiscoveryService.mm @@ -0,0 +1 @@ +#include "DiscoveryService.cxx" \ No newline at end of file diff --git a/sd/source/ui/remotecontrol/IBluetoothSocket.hxx b/sd/source/ui/remotecontrol/IBluetoothSocket.hxx new file mode 100644 index 0000000000..4b75a1e828 --- /dev/null +++ b/sd/source/ui/remotecontrol/IBluetoothSocket.hxx @@ -0,0 +1,42 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include + +namespace sd +{ + /** Interface for bluetooth data io + */ + struct IBluetoothSocket + { + IBluetoothSocket() = default; + virtual ~IBluetoothSocket() {} + IBluetoothSocket(const IBluetoothSocket&) = delete; + IBluetoothSocket& operator=(const IBluetoothSocket&) = delete; + + /** Blocks until a line is read. + + @return whatever the last call of recv returned, i.e. 0 or less + if there was a problem in communications. + */ + virtual sal_Int32 readLine(OString& aLine) = 0; + + /** Write a number of bytes + + @return number of bytes actually written + */ + virtual sal_Int32 write( const void* pBuffer, sal_uInt32 n ) = 0; + + virtual void close() {}; + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/ImagePreparer.cxx b/sd/source/ui/remotecontrol/ImagePreparer.cxx new file mode 100644 index 0000000000..c3738d8942 --- /dev/null +++ b/sd/source/ui/remotecontrol/ImagePreparer.cxx @@ -0,0 +1,253 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ImagePreparer.hxx" +#include "Transmitter.hxx" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::sd; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +ImagePreparer::ImagePreparer( + uno::Reference _xController, + Transmitter *aTransmitter ) + : Timer("sd ImagePreparer"), + xController(std::move( _xController )), + pTransmitter( aTransmitter ) +{ + SAL_INFO( "sdremote", "ImagePreparer - start" ); + SetTimeout( 50 ); + mnSendingSlide = 0; + Start(); +} + +ImagePreparer::~ImagePreparer() +{ + SAL_INFO( "sdremote", "ImagePreparer - stop" ); + Stop(); +} + +void ImagePreparer::Invoke() +{ + sal_uInt32 aSlides = xController->getSlideCount(); + SAL_INFO( "sdremote", "ImagePreparer " << xController->isRunning() << + " sending slide " << mnSendingSlide << " of " << aSlides ); + if ( xController->isRunning() && // not stopped/disposed of. + mnSendingSlide < aSlides ) + { + sendPreview( mnSendingSlide ); + sendNotes( mnSendingSlide ); + mnSendingSlide++; + Start(); + } + else + Stop(); +} + +void ImagePreparer::sendPreview( sal_uInt32 aSlideNumber ) +{ + sal_uInt64 aSize; + uno::Sequence aImageData = preparePreview( aSlideNumber, 320, 240, + aSize ); + if ( !xController->isRunning() ) + return; + + OUStringBuffer aStrBuffer; + ::comphelper::Base64::encode( aStrBuffer, aImageData ); + + OString aEncodedShortString = OUStringToOString( + aStrBuffer, RTL_TEXTENCODING_UTF8 ); + + // Start the writing + OString aBuffer = "slide_preview\n" + + OString::number(aSlideNumber) + + "\n" + aEncodedShortString + "\n\n"; + pTransmitter->addMessage( aBuffer, + Transmitter::PRIORITY_LOW ); + +} + +uno::Sequence ImagePreparer::preparePreview( + sal_uInt32 aSlideNumber, sal_uInt32 aWidth, sal_uInt32 aHeight, + sal_uInt64 &rSize ) +{ + OUString aFileURL; + FileBase::createTempFile( nullptr, nullptr, &aFileURL ); + + uno::Reference< drawing::XGraphicExportFilter > xFilter = + drawing::GraphicExportFilter::create( ::comphelper::getProcessComponentContext() ); + + if ( !xController->isRunning() ) + return uno::Sequence(); + + uno::Reference< lang::XComponent > xSourceDoc( + xController->getSlideByIndex( aSlideNumber ), + uno::UNO_QUERY_THROW ); + + xFilter->setSourceDocument( xSourceDoc ); + + uno::Sequence< beans::PropertyValue > aFilterData{ + comphelper::makePropertyValue("PixelWidth", aWidth), + comphelper::makePropertyValue("PixelHeight", aHeight), + comphelper::makePropertyValue("ColorMode", sal_Int32(0)) // 0: Color, 1: B&W + }; + + uno::Sequence< beans::PropertyValue > aProps{ + comphelper::makePropertyValue("MediaType", OUString( "image/png" )), + comphelper::makePropertyValue("URL", aFileURL), + comphelper::makePropertyValue("FilterData", aFilterData) + }; + + xFilter->filter( aProps ); + + File aFile(aFileURL); + if (aFile.open(0) != osl::File::E_None) + return uno::Sequence(); + + sal_uInt64 aRead; + rSize = 0; + aFile.getSize( rSize ); + uno::Sequence aContents( rSize ); + + aFile.read( aContents.getArray(), rSize, aRead ); + if (aRead != rSize) + aContents.realloc(aRead); + + aFile.close(); + File::remove( aFileURL ); + return aContents; + +} + +void ImagePreparer::sendNotes( sal_uInt32 aSlideNumber ) +{ + + OString aNotes = prepareNotes( aSlideNumber ); + + if ( aNotes.isEmpty() ) + return; + + if ( !xController->isRunning() ) + return; + + // Start the writing + OString aBuffer = + "slide_notes\n" + + OString::number( static_cast(aSlideNumber) ) + + "\n" + "" + + aNotes + + "" + "\n\n"; + pTransmitter->addMessage( aBuffer, + Transmitter::PRIORITY_LOW ); +} + +// Code copied from sdremote/source/presenter/PresenterNotesView.cxx +OString ImagePreparer::prepareNotes( sal_uInt32 aSlideNumber ) +{ + OUStringBuffer aRet; + + if ( !xController->isRunning() ) + return ""_ostr; + + uno::Reference aNotesPage; + uno::Reference< drawing::XDrawPage > xSourceDoc( + xController->getSlideByIndex( aSlideNumber ), + uno::UNO_SET_THROW ); + uno::Reference xPresentationPage( + xSourceDoc, UNO_QUERY); + if (xPresentationPage.is()) + aNotesPage = xPresentationPage->getNotesPage(); + else + return ""_ostr; + + static constexpr OUString sNotesShapeName ( + u"com.sun.star.presentation.NotesShape"_ustr ); + static constexpr OUStringLiteral sTextShapeName ( + u"com.sun.star.drawing.TextShape" ); + + if (aNotesPage.is()) + { + + // Iterate over all shapes and find the one that holds the text. + sal_Int32 nCount (aNotesPage->getCount()); + for (sal_Int32 nIndex=0; nIndex xServiceName ( + aNotesPage->getByIndex(nIndex), UNO_QUERY); + if (xServiceName.is() + && xServiceName->getServiceName() == sNotesShapeName) + { + uno::Reference xText (xServiceName, UNO_QUERY); + if (xText.is()) + { + aRet.append(xText->getString() + "
      "); + } + } + else + { + uno::Reference xShapeDescriptor ( + aNotesPage->getByIndex(nIndex), UNO_QUERY); + if (xShapeDescriptor.is()) + { + OUString sType (xShapeDescriptor->getShapeType()); + if (sType == sNotesShapeName || sType == sTextShapeName) + { + uno::Reference xText ( + aNotesPage->getByIndex(nIndex), UNO_QUERY); + if (xText.is()) + { + aRet.append(xText->getString() + "
      "); + } + } + } + } + } + } + // Replace all newlines with tags + for ( sal_Int32 i = 0; i < aRet.getLength(); i++ ) + { + if ( aRet[i] == '\n' ) + { + aRet[i]= '<'; + aRet.insert( i+1, "br/>" ); + } + } + return OUStringToOString( aRet, RTL_TEXTENCODING_UTF8 ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/ImagePreparer.hxx b/sd/source/ui/remotecontrol/ImagePreparer.hxx new file mode 100644 index 0000000000..10c282ccd7 --- /dev/null +++ b/sd/source/ui/remotecontrol/ImagePreparer.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include + +namespace com::sun::star::presentation { class XSlideShowController; } +namespace sd { class Transmitter; } + +namespace sd +{ + +class ImagePreparer : private Timer +{ + sal_uInt32 mnSendingSlide; +public: + ImagePreparer( css::uno::Reference xController, + sd::Transmitter *aTransmitter ); + virtual ~ImagePreparer() override; + +private: + css::uno::Reference xController; + Transmitter *pTransmitter; + + virtual void Invoke() override; + + void sendPreview( sal_uInt32 aSlideNumber ); + css::uno::Sequence preparePreview( sal_uInt32 aSlideNumber, + sal_uInt32 aWidth, sal_uInt32 aHeight, sal_uInt64 &rSize ); + + void sendNotes( sal_uInt32 aSlideNumber ); + OString prepareNotes( sal_uInt32 aSlideNumber ); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Listener.cxx b/sd/source/ui/remotecontrol/Listener.cxx new file mode 100644 index 0000000000..8f92da2651 --- /dev/null +++ b/sd/source/ui/remotecontrol/Listener.cxx @@ -0,0 +1,134 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include "Communicator.hxx" +#include "Listener.hxx" +#include "ImagePreparer.hxx" +#include "Transmitter.hxx" + +#include + +using namespace sd; +using namespace ::com::sun::star::presentation; + +Listener::Listener( ::rtl::Reference xCommunicator, + sd::Transmitter *aTransmitter ): + mCommunicator(std::move( xCommunicator )), + pTransmitter( nullptr ) +{ + pTransmitter = aTransmitter; +} + +Listener::~Listener() +{ +} + +void Listener::init( const css::uno::Reference< css::presentation::XSlideShowController >& aController) +{ + if ( aController.is() ) + { + mController.set( aController ); + aController->addSlideShowListener( this ); + + sal_Int32 aSlides = aController->getSlideCount(); + sal_Int32 aCurrentSlide = aController->getCurrentSlideIndex(); + OString aBuffer = "slideshow_started\n" + + OString::number( aSlides ) + "\n" + + OString::number( aCurrentSlide ) + "\n\n"; + + pTransmitter->addMessage( aBuffer, + Transmitter::PRIORITY_HIGH ); + + { + SolarMutexGuard aGuard; + /* ImagePreparer* pPreparer = */ new ImagePreparer( aController, pTransmitter ); + } + } + else + { + SAL_INFO( "sdremote", "Listener::init but no controller - so no preview push queued" ); + } +} + +//----- XAnimationListener ---------------------------------------------------- + +void SAL_CALL Listener::beginEvent(const css::uno::Reference< + css::animations::XAnimationNode >& ) +{} + +void SAL_CALL Listener::endEvent( const css::uno::Reference< + css::animations::XAnimationNode >& ) +{} + +void SAL_CALL Listener::repeat( const css::uno::Reference< + css::animations::XAnimationNode >&, ::sal_Int32 ) +{} + +//----- XSlideShowListener ---------------------------------------------------- + +void SAL_CALL Listener::paused() +{ +} + +void SAL_CALL Listener::resumed() +{ +} + +void SAL_CALL Listener::slideEnded (sal_Bool) +{ +} + +void SAL_CALL Listener::hyperLinkClicked (const OUString &) +{ +} + +void SAL_CALL Listener::slideTransitionStarted() +{ + sal_Int32 aSlide = mController->getCurrentSlideIndex(); + + OString aBuilder = "slide_updated\n" + + OString::number( aSlide ) + + "\n\n"; + + if ( pTransmitter ) + { + pTransmitter->addMessage( aBuilder, + Transmitter::PRIORITY_HIGH ); + } +} + +void SAL_CALL Listener::slideTransitionEnded() +{ +} + +void SAL_CALL Listener::slideAnimationsEnded() +{ +} + +void Listener::disposing(std::unique_lock&) +{ + pTransmitter = nullptr; + if ( mController.is() ) + { + mController->removeSlideShowListener( this ); + mController = nullptr; + } + mCommunicator->informListenerDestroyed(); +} + +void SAL_CALL Listener::disposing ( + const css::lang::EventObject&) +{ + dispose(); +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Listener.hxx b/sd/source/ui/remotecontrol/Listener.hxx new file mode 100644 index 0000000000..eb75ab44b7 --- /dev/null +++ b/sd/source/ui/remotecontrol/Listener.hxx @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include + +#include +#include +#include + +namespace com::sun::star::presentation { class XSlideShowController; } +namespace sd { class Communicator; } +namespace sd { class Transmitter; } + +namespace sd { +/** + * Slide show listener. This class can also be used for anything else that is + * specific to the lifetime of one slideshow while a client is connected. + */ +class Listener + : public comphelper::WeakComponentImplHelper< css::presentation::XSlideShowListener > +{ +public: + Listener( ::rtl::Reference xServer, sd::Transmitter *aTransmitter ); + virtual ~Listener() override; + void init( const css::uno::Reference< css::presentation::XSlideShowController >& aController ); + + // XAnimationListener + virtual void SAL_CALL beginEvent(const css::uno::Reference< + css::animations::XAnimationNode >& rNode ) override; + virtual void SAL_CALL endEvent( const css::uno::Reference< + css::animations::XAnimationNode >& rNode ) override; + virtual void SAL_CALL repeat( const css::uno::Reference< + css::animations::XAnimationNode >& rNode, ::sal_Int32 Repeat ) override; + + // XSlideShowListener + virtual void SAL_CALL paused( ) override; + virtual void SAL_CALL resumed( ) override; + virtual void SAL_CALL slideTransitionStarted( ) override; + virtual void SAL_CALL slideTransitionEnded( ) override; + virtual void SAL_CALL slideAnimationsEnded( ) override; + virtual void SAL_CALL slideEnded(sal_Bool bReverse) override; + virtual void SAL_CALL hyperLinkClicked( const OUString& hyperLink ) override; + + // XEventListener + virtual void disposing(std::unique_lock&) override; + virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override; + +private: + rtl::Reference mCommunicator; + sd::Transmitter *pTransmitter; + css::uno::Reference< css::presentation::XSlideShowController > mController; +}; +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/OSXBluetooth.h b/sd/source/ui/remotecontrol/OSXBluetooth.h new file mode 100644 index 0000000000..64f095f6ca --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXBluetooth.h @@ -0,0 +1,30 @@ +/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#import + +#include "IBluetoothSocket.hxx" +#include "Communicator.hxx" +#include "OSXBluetoothWrapper.hxx" + +@interface ChannelDelegate : NSObject +{ + sd::Communicator* pCommunicator; + sd::OSXBluetoothWrapper* pSocket; +} + +- (id) initWithCommunicatorAndSocket:(sd::Communicator*)communicator socket:(sd::OSXBluetoothWrapper*)socket; +- (void) rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength; +- (void) rfcommChannelClosed:(IOBluetoothRFCOMMChannel*)rfcommChannel; + +@end + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/OSXBluetooth.mm b/sd/source/ui/remotecontrol/OSXBluetooth.mm new file mode 100644 index 0000000000..8b705c50ba --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXBluetooth.mm @@ -0,0 +1,53 @@ +/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include +#include + +#include +#import +#include + +#include "OSXBluetooth.h" + +@implementation ChannelDelegate + +- (id) initWithCommunicatorAndSocket:(sd::Communicator*)communicator socket:(sd::OSXBluetoothWrapper*)socket +{ + pCommunicator = communicator; + pSocket = socket; + return self; +} + +- (void) rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength +{ + (void) rfcommChannel; + + if ( pSocket ) + { + pSocket->appendData(dataPointer, dataLength); + } +} + +- (void) rfcommChannelClosed:(IOBluetoothRFCOMMChannel*)rfcommChannel +{ + (void) rfcommChannel; + + SAL_INFO( "sdremote.bluetooth", "ChannelDelegate::rfcommChannelClosed()"); + + if ( pSocket ) + { + pSocket->channelClosed(); + } + pCommunicator = nullptr; + pSocket = nullptr; +} + +@end + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx b/sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx new file mode 100644 index 0000000000..26e1349f0a --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include +#include +#include + +#include "IBluetoothSocket.hxx" + +namespace sd +{ + class OSXBluetoothWrapper : public IBluetoothSocket + { + IOBluetoothRFCOMMChannel* mpChannel; + int mnMTU; + osl::Condition mHaveBytes; + osl::Mutex mMutex; + std::vector mBuffer; + + public: + OSXBluetoothWrapper( IOBluetoothRFCOMMChannel* channel ); + virtual sal_Int32 readLine( OString& aLine ) override; + virtual sal_Int32 write( const void* pBuffer, sal_uInt32 len ) override; + void appendData(void* pBuffer, size_t len ); + void channelClosed(); + }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.h b/sd/source/ui/remotecontrol/OSXNetworkService.h new file mode 100644 index 0000000000..7298d901bd --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXNetworkService.h @@ -0,0 +1,30 @@ +/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include + +#include +#import +#import +#import +#include + +@interface OSXBonjourService : NSObject +{ + NSNetService* netService; +} + +- (void)publishImpressRemoteServiceOnLocalNetworkWithName:(NSString*)sName; + +@end + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.hxx b/sd/source/ui/remotecontrol/OSXNetworkService.hxx new file mode 100644 index 0000000000..78ab13eff8 --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXNetworkService.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#import +#include +#import "OSXNetworkService.h" + +#include "ZeroconfService.hxx" + +namespace sd { + class OSXNetworkService : public ZeroconfService + { + private: + OSXBonjourService *osxservice; + public: + OSXNetworkService(const std::string& aname = "", unsigned int aport = 1599) + : ZeroconfService(aname, aport){} + + void clear() override { + [osxservice dealloc]; + } + void setup() override { + osxservice = [[OSXBonjourService alloc] init]; + [osxservice publishImpressRemoteServiceOnLocalNetworkWithName: @""]; + }; + }; +} diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.mm b/sd/source/ui/remotecontrol/OSXNetworkService.mm new file mode 100644 index 0000000000..51cbd8c99c --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXNetworkService.mm @@ -0,0 +1,43 @@ +/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include + +#include + #import + #import "OSXNetworkService.h" +#include + +@implementation OSXBonjourService + +- (void) publishImpressRemoteServiceOnLocalNetworkWithName:(NSString *)sName +{ + netService = [[NSNetService alloc] initWithDomain:@"local" type:@"_impressremote._tcp" name:sName port:1599]; + + if (netService != nil) + { + [netService setDelegate:self]; + [netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + [netService publish]; + } +} + +-(void)netService:(NSNetService *)aNetService + didNotPublish:(NSDictionary *)dict { + NSLog(@"Service %p did not publish: %@", aNetService, dict); +} + +- (void)dealloc { + [netService stop]; + [netService release]; + [super dealloc]; +} + +@end + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx new file mode 100644 index 0000000000..0846f5bbbe --- /dev/null +++ b/sd/source/ui/remotecontrol/Receiver.cxx @@ -0,0 +1,228 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include "Receiver.hxx" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace sd; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::beans; + +Receiver::Receiver( Transmitter *aTransmitter ) : Timer("sd Receiver") +{ + pTransmitter = aTransmitter; + SetTimeout( 0 ); +} + +Receiver::~Receiver() +{ +} + +// Bounce the commands to the main thread to avoid threading woes +void Receiver::pushCommand( const std::vector &rCommand ) +{ + SolarMutexGuard aGuard; + maExecQueue.push_back( rCommand ); + Start(); +} + +void Receiver::Invoke() +{ + if( !maExecQueue.empty() ) + { + std::vector< OString > aCommands( maExecQueue.front() ); + maExecQueue.pop_front(); + if( !aCommands.empty() ) + executeCommand( aCommands ); + Start(); + } + else + Stop(); +} + +void Receiver::executeCommand( const std::vector &aCommand ) +{ + uno::Reference xSlideShowController; + uno::Reference xPresentation; + uno::Reference xSlideShow; + try { + uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create( ::comphelper::getProcessComponentContext() ); + uno::Reference< frame::XFrame > xFrame ( xFramesSupplier->getActiveFrame(), uno::UNO_SET_THROW ); + uno::Reference xPS ( xFrame->getController()->getModel(), uno::UNO_QUERY_THROW); + xPresentation.set( xPS->getPresentation(), uno::UNO_QUERY_THROW); + // Throws an exception if no slideshow running + xSlideShowController.set( xPresentation->getController(), uno::UNO_SET_THROW ); + xSlideShow.set( xSlideShowController->getSlideShow(), uno::UNO_SET_THROW ); + } + catch (uno::RuntimeException &) + { + } + + if (aCommand.empty()) + { + SAL_WARN("sdremote", "Receiver::executeCommand: no command"); + return; + } + + if ( aCommand[0] == "transition_next" ) + { + if ( xSlideShowController.is() ) + xSlideShowController->gotoNextEffect(); + } + else if ( aCommand[0] == "transition_previous" ) + { + if ( xSlideShowController.is() ) + xSlideShowController->gotoPreviousEffect(); + } + else if ( aCommand[0] == "goto_slide" ) + { + if (aCommand.size() < 2) + { + SAL_WARN("sdremote", "Receiver::executeCommand: invalid goto_slide"); + return; + } + // FIXME: if 0 returned, then not a valid number + sal_Int32 aSlide = aCommand[1].toInt32(); + if ( xSlideShowController.is() && + xSlideShowController->getCurrentSlideIndex() != aSlide ) + { + xSlideShowController->gotoSlideIndex( aSlide ); + } + } + else if ( aCommand[0] == "presentation_start" ) + { + if ( xPresentation.is() ) + xPresentation->start(); + } + else if ( aCommand[0] == "presentation_stop" ) + { + if ( xPresentation.is() ) + xPresentation->end(); + } + else if ( aCommand[0] == "presentation_blank_screen" ) + { + if ( aCommand.size() > 1 ) + { +// aColour = FIXME: get the colour in some format from this string +// Determine the formatting first. + } + if ( xSlideShowController.is() ) + { + xSlideShowController->blankScreen( 0 ); // Default is black + } + } + else if (aCommand[0] == "pointer_started" ) + { + if (aCommand.size() < 3) + { + SAL_WARN("sdremote", "Receiver::executeCommand: invalid pointer_started"); + return; + } + // std::cerr << "pointer_started" << std::endl; + float x = aCommand[1].toFloat(); + float y = aCommand[2].toFloat(); + SolarMutexGuard aSolarGuard; + + const css::geometry::RealPoint2D pos(x,y); + // std::cerr << "Pointer at ("<setProperty(beans::PropertyValue("PointerPosition", -1, Any(pos), + beans::PropertyState_DIRECT_VALUE)); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION("sdremote", "sd::SlideShowImpl::setPointerPosition()"); + } + + try + { + xSlideShow->setProperty(beans::PropertyValue("PointerVisible", -1, Any(true), + beans::PropertyState_DIRECT_VALUE)); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION("sdremote", "sd::SlideShowImpl::setPointerMode()"); + } + } + + SAL_INFO( "sdremote", "Pointer started, we display the pointer on screen" ); + } + else if (aCommand[0] == "pointer_dismissed" ) + { + SolarMutexGuard aSolarGuard; + if (xSlideShow.is()) try + { + xSlideShow->setProperty( + beans::PropertyValue( "PointerVisible" , + -1, + Any( false ), + beans::PropertyState_DIRECT_VALUE ) ); + } + catch ( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sdremote", "sd::SlideShowImpl::setPointerMode()" ); + } + + SAL_INFO( "sdremote", "Pointer dismissed, we hide the pointer on screen" ); + } + else if (aCommand[0] == "pointer_coordination" ) + { + if (aCommand.size() < 3) + { + SAL_WARN("sdremote", "Receiver::executeCommand: invalid pointer_coordination"); + return; + } + float x = aCommand[1].toFloat(); + float y = aCommand[2].toFloat(); + + SAL_INFO( "sdremote", "Pointer at ("<setProperty( + beans::PropertyValue( "PointerPosition" , + -1, + Any( pos ), + beans::PropertyState_DIRECT_VALUE ) ); + } + catch ( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sdremote", "sd::SlideShowImpl::setPointerPosition()" ); + } + } + else if ( aCommand[0] == "presentation_resume" ) + { + if ( xSlideShowController.is() ) + { + xSlideShowController->resume(); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Receiver.hxx b/sd/source/ui/remotecontrol/Receiver.hxx new file mode 100644 index 0000000000..d3fadf0da2 --- /dev/null +++ b/sd/source/ui/remotecontrol/Receiver.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include +#include + +#include +#include + +namespace sd { class Transmitter; } + +namespace sd +{ + +// Timer is protected by the solar mutex => so are we. +class Receiver : private Timer +{ + std::deque< std::vector< OString > > maExecQueue; +public: + explicit Receiver( Transmitter *aTransmitter ); + virtual ~Receiver() override; + virtual void Invoke() override; + void pushCommand( const std::vector &rCommand ); + static void executeCommand( const std::vector &aCommand ); + +private: + Transmitter *pTransmitter; +}; + +} diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx new file mode 100644 index 0000000000..928f4ef7fc --- /dev/null +++ b/sd/source/ui/remotecontrol/Server.cxx @@ -0,0 +1,379 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "DiscoveryService.hxx" +#include "Listener.hxx" +#include +#include "BluetoothServer.hxx" +#include "Communicator.hxx" +#include "BufferedStreamSocket.hxx" + +using namespace sd; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::osl; +using namespace ::comphelper; + +namespace sd { + /** + * Used to keep track of clients that have attempted to connect, but haven't + * yet been approved. + */ + struct ClientInfoInternal: + ClientInfo + { + BufferedStreamSocket *mpStreamSocket; + OUString mPin; + + ClientInfoInternal( const OUString& rName, + BufferedStreamSocket *pSocket, + OUString aPin ): + ClientInfo( rName, false ), + mpStreamSocket( pSocket ), + mPin(std::move( aPin )) {} + }; +} + +IPRemoteServer::IPRemoteServer() + : Thread("IPRemoteServerThread") +{ + SAL_INFO("sdremote", "Instantiated IPRemoteServer"); +} + +IPRemoteServer::~IPRemoteServer() +{ +} + +void IPRemoteServer::execute() +{ + SAL_INFO("sdremote", "IPRemoteServer::execute called"); + osl::SocketAddr aAddr( "0.0.0.0", PORT ); + if ( !mSocket.bind( aAddr ) ) + { + SAL_WARN( "sdremote", "bind failed" << mSocket.getErrorAsString() ); + spServer = nullptr; + return; + } + + if ( !mSocket.listen(3) ) + { + SAL_WARN( "sdremote", "listen failed" << mSocket.getErrorAsString() ); + spServer = nullptr; + return; + } + while ( true ) + { + StreamSocket aSocket; + SAL_INFO( "sdremote", "waiting on accept" ); + if ( mSocket.acceptConnection( aSocket ) == osl_Socket_Error ) + { + SAL_WARN( "sdremote", "accept failed" << mSocket.getErrorAsString() ); + spServer = nullptr; + return; // Closed, or other issue. + } + BufferedStreamSocket *pSocket = new BufferedStreamSocket( aSocket); + handleAcceptedConnection( pSocket ); + } + SAL_INFO("sdremote", "shutting down IPRemoteServer"); + spServer = nullptr; // Object is destroyed when Thread::execute() ends. +} + +void IPRemoteServer::handleAcceptedConnection( BufferedStreamSocket *pSocket ) +{ + OString aLine; + if ( ! ( pSocket->readLine( aLine) + && aLine == "LO_SERVER_CLIENT_PAIR" + && pSocket->readLine( aLine ) ) ) + { + SAL_INFO( "sdremote", "client failed to send LO_SERVER_CLIENT_PAIR, ignoring" ); + delete pSocket; + return; + } + + OString aName( aLine ); + + if ( ! pSocket->readLine( aLine ) ) + { + delete pSocket; + return; + } + OString aPin( aLine ); + + SocketAddr aClientAddr; + pSocket->getPeerAddr( aClientAddr ); + + do + { + // Read off any additional non-empty lines + // We know that we at least have the empty termination line to read. + if ( ! pSocket->readLine( aLine ) ) { + delete pSocket; + return; + } + } + while ( aLine.getLength() > 0 ); + + MutexGuard aGuard(RemoteServer::sDataMutex); + std::shared_ptr< ClientInfoInternal > pClient = + std::make_shared( + OStringToOUString( aName, RTL_TEXTENCODING_UTF8 ), + pSocket, OStringToOUString( aPin, RTL_TEXTENCODING_UTF8 ) ); + mAvailableClients.push_back( pClient ); + + // Check if we already have this server. + Reference< XNameAccess > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get(); + const Sequence< OUString > aNames = xConfig->getElementNames(); + for ( const auto& rName : aNames ) + { + if ( rName == pClient->mName ) + { + Reference xSetItem( xConfig->getByName(rName), UNO_QUERY ); + Any axPin(xSetItem->getByName("PIN")); + OUString sPin; + axPin >>= sPin; + + if ( sPin == pClient->mPin ) { + SAL_INFO( "sdremote", "client found on validated list -- connecting" ); + connectClient( pClient, sPin ); + return; + } + } + } + + // Pin not found so inform the client. + SAL_INFO( "sdremote", "client not found on validated list" ); + pSocket->write( "LO_SERVER_VALIDATING_PIN\n\n", + strlen( "LO_SERVER_VALIDATING_PIN\n\n" ) ); +} + +IPRemoteServer *sd::IPRemoteServer::spServer = nullptr; +::osl::Mutex sd::RemoteServer::sDataMutex; +::std::vector sd::RemoteServer::sCommunicators; + +void IPRemoteServer::setup() +{ + if (spServer) + return; + + spServer = new IPRemoteServer(); + spServer->launch(); +} + +void RemoteServer::presentationStarted( const css::uno::Reference< + css::presentation::XSlideShowController > &rController ) +{ + // note this can be invoked even when there is no IPRemoteServer instance + // but there are communicators belonging to a BluetoothServer + MutexGuard aGuard( sDataMutex ); + for ( const auto& rpCommunicator : sCommunicators ) + { + rpCommunicator->presentationStarted( rController ); + } +} +void RemoteServer::presentationStopped() +{ + MutexGuard aGuard( sDataMutex ); + for ( const auto& rpCommunicator : sCommunicators ) + { + rpCommunicator->disposeListener(); + } +} + +void RemoteServer::removeCommunicator( Communicator const * mCommunicator ) +{ + MutexGuard aGuard( sDataMutex ); + auto aIt = std::find(sCommunicators.begin(), sCommunicators.end(), mCommunicator); + if (aIt != sCommunicators.end()) + sCommunicators.erase( aIt ); +} + +std::vector> IPRemoteServer::getClients() +{ + SAL_INFO( "sdremote", "IPRemoteServer::getClients() called" ); + std::vector< std::shared_ptr< ClientInfo > > aClients; + if ( spServer ) + { + MutexGuard aGuard(RemoteServer::sDataMutex); + aClients.assign( spServer->mAvailableClients.begin(), + spServer->mAvailableClients.end() ); + } + else + { + SAL_INFO( "sdremote", "No remote server instance => no remote clients" ); + } + // We also need to provide authorised clients (no matter whether or not + // they are actually available), so that they can be de-authorised if + // necessary. We specifically want these to be at the end of the list + // since the user is more likely to be trying to connect a new remote + // than removing an existing remote. + // We can also be sure that pre-authorised clients will not be on the + // available clients list, as they get automatically connected if seen. + // TODO: we should probably add some sort of extra labelling to mark + // authorised AND connected client. + Reference< XNameAccess > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get(); + const Sequence< OUString > aNames = xConfig->getElementNames(); + std::transform(aNames.begin(), aNames.end(), std::back_inserter(aClients), + [](const OUString& rName) -> std::shared_ptr { + return std::make_shared(rName, true); }); + + return aClients; +} + +bool IPRemoteServer::connectClient(const std::shared_ptr& pClient, std::u16string_view aPin) +{ + SAL_INFO("sdremote", "IPRemoteServer::connectClient called"); + if ( !spServer ) + return false; + + ClientInfoInternal* apClient = dynamic_cast< ClientInfoInternal* >( pClient.get() ); + if ( !apClient ) + // could happen if we try to "connect" an already authorised client + { + return false; + } + + if ( apClient->mPin == aPin ) + { + // Save in settings first + std::shared_ptr< ConfigurationChanges > aChanges = ConfigurationChanges::create(); + Reference< XNameContainer > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get( aChanges ); + + Reference xChildFactory ( + xConfig, UNO_QUERY); + Reference xChild( xChildFactory->createInstance(), UNO_QUERY); + Any aValue; + if (xChild.is()) + { + // Check whether the client is already saved + Sequence< OUString > aNames = xConfig->getElementNames(); + if (comphelper::findValue(aNames, apClient->mName) != -1) + xConfig->replaceByName( apClient->mName, Any( xChild ) ); + else + xConfig->insertByName( apClient->mName, Any( xChild ) ); + aValue <<= apClient->mPin; + xChild->replaceByName("PIN", aValue); + aChanges->commit(); + } + + Communicator* pCommunicator = new Communicator( std::unique_ptr(apClient->mpStreamSocket) ); + MutexGuard aGuard(RemoteServer::sDataMutex); + + RemoteServer::sCommunicators.push_back( pCommunicator ); + + auto aIt = std::find(spServer->mAvailableClients.begin(), spServer->mAvailableClients.end(), pClient); + if (aIt != spServer->mAvailableClients.end()) + spServer->mAvailableClients.erase( aIt ); + pCommunicator->launch(); + return true; + } + else + { + return false; + } +} + +void IPRemoteServer::deauthoriseClient(const std::shared_ptr& pClient) +{ + // TODO: we probably want to forcefully disconnect at this point too? + // But possibly via a separate function to allow just disconnecting from + // the UI. + + SAL_INFO("sdremote", "IPRemoteServer::deauthoriseClient called"); + + if ( !pClient->mbIsAlreadyAuthorised ) + // We can't remove unauthorised clients from the authorised list... + { + return; + } + + std::shared_ptr< ConfigurationChanges > aChanges = ConfigurationChanges::create(); + Reference< XNameContainer > const xConfig = + officecfg::Office::Impress::Misc::AuthorisedRemotes::get( aChanges ); + + xConfig->removeByName( pClient->mName ); + aChanges->commit(); +} + +void SdDLL::RegisterRemotes() +{ + SAL_INFO( "sdremote", "SdDLL::RegisterRemotes called" ); + + // The remote server is likely of no use in headless mode. And as only + // one instance of the server can actually own the appropriate ports its + // probably best to not even try to do so from our headless instance + // (i.e. as to avoid blocking expected usage). + // It could perhaps be argued that we would still need the remote + // server for tiled rendering of presentations, but even then this + // implementation would not be of much use, i.e. would be controlling + // the purely imaginary headless presentation -- instead we'd need + // to have some sort of mechanism of plugging in our tiled rendering + // client to be controlled by the remote server, or provide an + // alternative implementation. + if ( Application::IsHeadlessModeEnabled() ) + return; + + if ( !officecfg::Office::Impress::Misc::Start::EnableSdremote::get() ) + return; + +#ifdef ENABLE_SDREMOTE_BLUETOOTH + sd::BluetoothServer::setup( &RemoteServer::sCommunicators ); +#endif + + if (!officecfg::Office::Security::Net::AllowInsecureImpressRemoteWiFi::get()) + { + SAL_WARN("desktop", "Impress remote WiFi is disabled by configuration"); + return; + } + + // this is the IP/WiFi server + sd::IPRemoteServer::setup(); + // assumption is that BluetoothServer doesn't need DiscoveryService + sd::DiscoveryService::setup(); +} + +void RemoteServer::ensureDiscoverable() +{ + // FIXME: we could also enable listening on our WiFi + // socket here to significantly reduce the attack surface. +#ifdef ENABLE_SDREMOTE_BLUETOOTH + BluetoothServer::ensureDiscoverable(); +#endif +} + +void RemoteServer::restoreDiscoverable() +{ +#ifdef ENABLE_SDREMOTE_BLUETOOTH + BluetoothServer::restoreDiscoverable(); +#endif +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Transmitter.cxx b/sd/source/ui/remotecontrol/Transmitter.cxx new file mode 100644 index 0000000000..7992e5b94b --- /dev/null +++ b/sd/source/ui/remotecontrol/Transmitter.cxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include "Transmitter.hxx" +#include "IBluetoothSocket.hxx" +#include + +using namespace osl; // Sockets etc. +using namespace sd; + +Transmitter::Transmitter( IBluetoothSocket* aSocket ) + : pStreamSocket( aSocket ), + mFinishRequested( false ) +{ +} + +void SAL_CALL Transmitter::run() +{ + osl_setThreadName("bluetooth Transmitter"); + + while ( true ) + { + mProcessingRequired.wait(); + + OString aMessage; + bool isHighPrio = {}; + + { + ::osl::MutexGuard aGuard(mMutex); + + if (mFinishRequested) { + return; + } + if (!mHighPriority.empty()) + { + aMessage = mHighPriority.front(); + mHighPriority.pop(); + isHighPrio = true; + } + else if (!mLowPriority.empty()) + { + aMessage = mLowPriority.front(); + mLowPriority.pop(); + isHighPrio = false; + } + } + + SAL_INFO("sdremote.bluetooth", "write " << (isHighPrio ? "high prio" : "normal") << " line '" << aMessage << "'"); + // pStreamSocket is owned by Communicator, which joins this thread + // before destroying pStreamSocket so it can't die here. + // Sending is SLOW and blocks! + pStreamSocket->write( aMessage.getStr(), aMessage.getLength() ); + + { + ::osl::MutexGuard aGuard(mMutex); + + if (mLowPriority.empty() && mHighPriority.empty()) + { + mProcessingRequired.reset(); + } + } + } +} + +void Transmitter::notifyFinished() +{ + ::osl::MutexGuard aGuard( mMutex ); + mFinishRequested = true; + mProcessingRequired.set(); +} + +Transmitter::~Transmitter() +{ +} + +void Transmitter::addMessage( const OString& aMessage, const Priority aPriority ) +{ + ::osl::MutexGuard aGuard( mMutex ); + switch ( aPriority ) + { + case PRIORITY_LOW: + mLowPriority.push( aMessage ); + break; + case PRIORITY_HIGH: + mHighPriority.push( aMessage ); + break; + } + if ( !mProcessingRequired.check() ) + { + mProcessingRequired.set(); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/Transmitter.hxx b/sd/source/ui/remotecontrol/Transmitter.hxx new file mode 100644 index 0000000000..c24f5a5a46 --- /dev/null +++ b/sd/source/ui/remotecontrol/Transmitter.hxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace sd { struct IBluetoothSocket; } + +namespace sd +{ + +class Transmitter +: public osl::Thread +{ +public: + enum Priority { PRIORITY_LOW = 1, PRIORITY_HIGH }; + explicit Transmitter( ::sd::IBluetoothSocket* aSocket ); + virtual ~Transmitter() override; + void addMessage( const OString& aMessage, const Priority aPriority ); + void notifyFinished(); + +private: + virtual void SAL_CALL run() override; + + ::sd::IBluetoothSocket* pStreamSocket; + + ::osl::Condition mProcessingRequired; + + ::osl::Mutex mMutex; + /** + * Used to indicate that we're done and the transmitter loop should exit. + * All access must be guarded my `mMutex`. + */ + bool mFinishRequested; + /// Queue for low priority messages. All access must be guarded my `mMutex`. + std::queue mLowPriority; + /// Queue for high priority messages. All access must be guarded my `mMutex`. + std::queue mHighPriority; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/remotecontrol/WINNetworkService.cxx b/sd/source/ui/remotecontrol/WINNetworkService.cxx new file mode 100644 index 0000000000..bd2decf629 --- /dev/null +++ b/sd/source/ui/remotecontrol/WINNetworkService.cxx @@ -0,0 +1,19 @@ +#include +#include +#include "WINNetworkService.hxx" +#include + +void sd::WINNetworkService::setup() +{ + DNSServiceErrorType err = DNSServiceRegister(&client, 0, 0, nullptr, kREG_TYPE, "local", nullptr, 1599, 1, "", nullptr, this ); + + if (kDNSServiceErr_NoError != err) + SAL_WARN("sdremote.wifi", "DNSServiceRegister failed: " << err); + + // Fail silently +} + +void sd::WINNetworkService::clear() +{ + DNSServiceRefDeallocate(client); +} diff --git a/sd/source/ui/remotecontrol/WINNetworkService.hxx b/sd/source/ui/remotecontrol/WINNetworkService.hxx new file mode 100644 index 0000000000..3d096dc0fb --- /dev/null +++ b/sd/source/ui/remotecontrol/WINNetworkService.hxx @@ -0,0 +1,23 @@ +#pragma once + +#include +#undef WB_LEFT +#undef WB_RIGHT +#include +#include "ZeroconfService.hxx" + +namespace sd{ + class WINNetworkService : public ZeroconfService + { + private: + DNSServiceRef client; + + public: + WINNetworkService(const std::string& aname = "", unsigned int aport = 1599) + : ZeroconfService(aname, aport), client(nullptr) {} + + void clear() override; + void setup() override; + + }; +} diff --git a/sd/source/ui/remotecontrol/ZeroconfService.hxx b/sd/source/ui/remotecontrol/ZeroconfService.hxx new file mode 100644 index 0000000000..98abe41085 --- /dev/null +++ b/sd/source/ui/remotecontrol/ZeroconfService.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#ifndef ZEROCONF_SERVICE +#define ZEROCONF_SERVICE + +#include +#include + +/** +* The port used by LO's custom remote server discovery protocol. +*/ +#define PORT_DISCOVERY 1598 +#define BUFFER_SIZE 200 + +#define kREG_TYPE "_impressremote._tcp" + +struct sockaddr_in; + +typedef unsigned int uint; + +namespace sd{ + + class ZeroconfService + { + protected: + std::string name; + uint port; + + public: + explicit ZeroconfService(std::string aname, uint aport) + :name(std::move(aname)), port(aport){} + virtual ~ZeroconfService(){} + + const std::string& getName() const {return name;} + void setName(const char * n) {name = n;} + + // Clean up the service when closing + virtual void clear() = 0; + // Bonjour for OSX, Avahi for Linux + virtual void setup() = 0; + }; + +} +#endif diff --git a/sd/source/ui/sidebar/AllMasterPagesSelector.cxx b/sd/source/ui/sidebar/AllMasterPagesSelector.cxx new file mode 100644 index 0000000000..76e056120e --- /dev/null +++ b/sd/source/ui/sidebar/AllMasterPagesSelector.cxx @@ -0,0 +1,180 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "AllMasterPagesSelector.hxx" +#include +#include "MasterPageContainer.hxx" +#include "MasterPageDescriptor.hxx" +#include + +#include + +namespace { + +using namespace sd::sidebar; + +int GetURLPriority (const SharedMasterPageDescriptor& rpDescriptor) +{ + int nPriority (0); + switch (rpDescriptor->GetURLClassification()) + { + case MasterPageDescriptor::URLCLASS_USER: nPriority = 0; break; + case MasterPageDescriptor::URLCLASS_LAYOUT: nPriority = 1; break; + case MasterPageDescriptor::URLCLASS_PRESENTATION: nPriority = 2; break; + case MasterPageDescriptor::URLCLASS_OTHER: nPriority = 3; break; + case MasterPageDescriptor::URLCLASS_UNKNOWN: nPriority = 4; break; + default: + case MasterPageDescriptor::URLCLASS_UNDETERMINED: nPriority = 5; break; + } + return nPriority; +} + +class MasterPageDescriptorOrder +{ +public: + bool operator() ( + const SharedMasterPageDescriptor& rp1, + const SharedMasterPageDescriptor& rp2) const + { + if (rp1->meOrigin == MasterPageContainer::DEFAULT) + return true; + else if (rp2->meOrigin == MasterPageContainer::DEFAULT) + return false; + else if (rp1->GetURLClassification() == rp2->GetURLClassification()) + return rp1->mnTemplateIndex < rp2->mnTemplateIndex; + else + return GetURLPriority(rp1) < GetURLPriority(rp2); + } +}; + +} // end of anonymous namespace + +namespace sd::sidebar { + +class AllMasterPagesSelector::SortedMasterPageDescriptorList + : public ::std::set +{ +public: + SortedMasterPageDescriptorList() {} +}; + +std::unique_ptr AllMasterPagesSelector::Create ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + const css::uno::Reference& rxSidebar) +{ + SdDrawDocument* pDocument = rViewShellBase.GetDocument(); + if (pDocument == nullptr) + return nullptr; + + auto pContainer = std::make_shared(); + + auto xSelector(std::make_unique( + pParent, + *pDocument, + rViewShellBase, + pContainer, + rxSidebar)); + xSelector->LateInit(); + xSelector->SetHelpId(HID_SD_TASK_PANE_PREVIEW_ALL); + + return xSelector; +} + +AllMasterPagesSelector::AllMasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + const std::shared_ptr& rpContainer, + const css::uno::Reference& rxSidebar) + : MasterPagesSelector(pParent, rDocument, rBase, rpContainer, rxSidebar, "modules/simpress/ui/masterpagepanelall.ui", "allvalueset"), + mpSortedMasterPages(new SortedMasterPageDescriptorList()) +{ + MasterPagesSelector::Fill(); +} + +AllMasterPagesSelector::~AllMasterPagesSelector() +{ +} + +void AllMasterPagesSelector::Fill (ItemList& rItemList) +{ + if (mpSortedMasterPages->empty()) + UpdateMasterPageList(); + UpdatePageSet(rItemList); +} + +void AllMasterPagesSelector::NotifyContainerChangeEvent ( + const MasterPageContainerChangeEvent& rEvent) +{ + switch (rEvent.meEventType) + { + case MasterPageContainerChangeEvent::EventType::CHILD_ADDED: + AddItem(rEvent.maChildToken); + MasterPagesSelector::Fill(); + break; + + case MasterPageContainerChangeEvent::EventType::INDEX_CHANGED: + mpSortedMasterPages->clear(); + MasterPagesSelector::Fill(); + break; + + default: + MasterPagesSelector::NotifyContainerChangeEvent(rEvent); + break; + } +} + +void AllMasterPagesSelector::UpdateMasterPageList() +{ + mpSortedMasterPages->clear(); + int nTokenCount = mpContainer->GetTokenCount(); + for (int i=0; iGetTokenForIndex(i)); +} + +void AllMasterPagesSelector::AddItem (MasterPageContainer::Token aToken) +{ + switch (mpContainer->GetOriginForToken(aToken)) + { + case MasterPageContainer::DEFAULT: + case MasterPageContainer::TEMPLATE: + // Templates are added only when coming from the + // MasterPageContainerFiller so that they have an id which + // defines their place in the list. Templates (pre) loaded from + // RecentlyUsedMasterPages are ignored (they will be loaded + // later by the MasterPageContainerFiller.) + if (mpContainer->GetTemplateIndexForToken(aToken) >= 0) + mpSortedMasterPages->insert(mpContainer->GetDescriptorForToken(aToken)); + break; + + default: + break; + } +} + +void AllMasterPagesSelector::UpdatePageSet (ItemList& rItemList) +{ + for (const auto& rxDescriptor : *mpSortedMasterPages) + rItemList.push_back(rxDescriptor->maToken); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/AllMasterPagesSelector.hxx b/sd/source/ui/sidebar/AllMasterPagesSelector.hxx new file mode 100644 index 0000000000..982a2ec521 --- /dev/null +++ b/sd/source/ui/sidebar/AllMasterPagesSelector.hxx @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "MasterPagesSelector.hxx" + +#include + +namespace sd::sidebar { + +/** Show a list of all available master pages so that the user can assign + them to the document. +*/ +class AllMasterPagesSelector + : public MasterPagesSelector +{ + friend class VclPtrInstance; +public: + static std::unique_ptr Create ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + const css::uno::Reference& rxSidebar); + + AllMasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + const std::shared_ptr& rpContainer, + const css::uno::Reference& rxSidebar); + virtual ~AllMasterPagesSelector() override; + + + /** Scan the set of templates for the ones whose first master pages are + shown by this control and store them in the MasterPageContainer. + */ + virtual void Fill (ItemList& rItemList) override; + +protected: + virtual void NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent) override; + +private: + /** The list of master pages displayed by this class. + */ + class SortedMasterPageDescriptorList; + ::std::unique_ptr mpSortedMasterPages; + + void AddItem (MasterPageContainer::Token aToken); + + /** Add all items in the internal master page list into the given list. + */ + void UpdatePageSet (ItemList& rItemList); + + /** Update the internal list of master pages that are to show in the + control. + */ + void UpdateMasterPageList(); + + using MasterPagesSelector::Fill; +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx b/sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx new file mode 100644 index 0000000000..e0e1c6a07c --- /dev/null +++ b/sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx @@ -0,0 +1,263 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "CurrentMasterPagesSelector.hxx" +#include "PreviewValueSet.hxx" +#include +#include +#include +#include +#include "MasterPageContainer.hxx" +#include "MasterPageContainerProviders.hxx" +#include "MasterPageDescriptor.hxx" +#include +#include +#include + +#include + +#include + +using namespace ::com::sun::star; + +namespace sd::sidebar { + +std::unique_ptr CurrentMasterPagesSelector::Create ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + const css::uno::Reference& rxSidebar) +{ + SdDrawDocument* pDocument = rViewShellBase.GetDocument(); + if (pDocument == nullptr) + return nullptr; + + auto pContainer = std::make_shared(); + + auto xSelector(std::make_unique( + pParent, + *pDocument, + rViewShellBase, + pContainer, + rxSidebar)); + xSelector->LateInit(); + xSelector->SetHelpId( HID_SD_TASK_PANE_PREVIEW_CURRENT ); + + return xSelector; +} + +CurrentMasterPagesSelector::CurrentMasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + const std::shared_ptr& rpContainer, + const css::uno::Reference& rxSidebar) + : MasterPagesSelector (pParent, rDocument, rBase, rpContainer, rxSidebar, "modules/simpress/ui/masterpagepanel.ui", "usedvalueset") +{ + Link aLink (LINK(this,CurrentMasterPagesSelector,EventMultiplexerListener)); + rBase.GetEventMultiplexer()->AddEventListener(aLink); +} + +CurrentMasterPagesSelector::~CurrentMasterPagesSelector() +{ + if (mrDocument.GetDocSh() != nullptr) + { + EndListening(*mrDocument.GetDocSh()); + } + else + { + OSL_ASSERT(mrDocument.GetDocSh() != nullptr); + } + + Link aLink (LINK(this,CurrentMasterPagesSelector,EventMultiplexerListener)); + mrBase.GetEventMultiplexer()->RemoveEventListener(aLink); +} + +void CurrentMasterPagesSelector::LateInit() +{ + MasterPagesSelector::LateInit(); + MasterPagesSelector::Fill(); + if (mrDocument.GetDocSh() != nullptr) + { + StartListening(*mrDocument.GetDocSh()); + } + else + { + OSL_ASSERT(mrDocument.GetDocSh() != nullptr); + } +} + +void CurrentMasterPagesSelector::Fill (ItemList& rItemList) +{ + sal_uInt16 nPageCount = mrDocument.GetMasterSdPageCount(PageKind::Standard); + // Remember the names of the master pages that have been inserted to + // avoid double insertion. + ::std::set aMasterPageNames; + for (sal_uInt16 nIndex=0; nIndexGetName()); + if (!aMasterPageNames.insert(sName).second) + continue; + + // Look up the master page in the container and, when it is not yet + // in it, insert it. + MasterPageContainer::Token aToken = mpContainer->GetTokenForPageObject(pMasterPage); + if (aToken == MasterPageContainer::NIL_TOKEN) + { + SharedMasterPageDescriptor pDescriptor = std::make_shared( + MasterPageContainer::MASTERPAGE, + nIndex, + OUString(), + pMasterPage->GetName(), + OUString(), + pMasterPage->IsPrecious(), + std::make_shared(pMasterPage), + std::make_shared()); + aToken = mpContainer->PutMasterPage(pDescriptor); + } + + rItemList.push_back(aToken); + } +} + +OUString CurrentMasterPagesSelector::GetContextMenuUIFile() const +{ + return "modules/simpress/ui/currentmastermenu.ui"; +} + +void CurrentMasterPagesSelector::UpdateSelection() +{ + // Iterate over all pages and for the selected ones put the name of + // their master page into a set. + sal_uInt16 nPageCount = mrDocument.GetSdPageCount(PageKind::Standard); + ::std::set aNames; + sal_uInt16 nIndex; + bool bLoop (true); + for (nIndex=0; nIndexIsSelected()) + { + if ( ! pPage->TRG_HasMasterPage()) + { + // One of the pages has no master page. This is an + // indicator for that this method is called in the middle of + // a document change and that the model is not in a valid + // state. Therefore we stop update the selection and wait + // for another call to UpdateSelection when the model is + // valid again. + bLoop = false; + } + else + { + SdrPage& rMasterPage (pPage->TRG_GetMasterPage()); + assert(dynamic_cast(&rMasterPage)); + aNames.insert(static_cast(rMasterPage).GetName()); + } + } + } + + // Find the items for the master pages in the set. + sal_uInt16 nItemCount (mxPreviewValueSet->GetItemCount()); + for (nIndex=1; nIndex<=nItemCount && bLoop; nIndex++) + { + OUString sName (mxPreviewValueSet->GetItemText (nIndex)); + if (aNames.find(sName) != aNames.end()) + { + mxPreviewValueSet->SelectItem (nIndex); + } + } +} + +void CurrentMasterPagesSelector::ExecuteCommand(const OUString &rIdent) +{ + if (rIdent == "delete") + { + // Check once again that the master page can safely be deleted, + // i.e. is not used. + SdPage* pMasterPage = GetSelectedMasterPage(); + if (pMasterPage != nullptr + && mrDocument.GetMasterPageUserCount(pMasterPage) == 0) + { + // Removing the precious flag so that the following call to + // RemoveUnnecessaryMasterPages() will remove this master page. + pMasterPage->SetPrecious(false); + mrDocument.RemoveUnnecessaryMasterPages(pMasterPage); + } + } + else + MasterPagesSelector::ExecuteCommand(rIdent); +} + +void CurrentMasterPagesSelector::ProcessPopupMenu(weld::Menu& rMenu) +{ + // Disable the delete entry when there is only one master page. + if (mrDocument.GetMasterPageUserCount(GetSelectedMasterPage()) > 0) + rMenu.set_sensitive("delete", false); + + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(mrBase.GetMainViewShell())); + if (pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::MasterPage) + { + rMenu.set_sensitive("edit", false); + } + + MasterPagesSelector::ProcessPopupMenu(rMenu); +} + +IMPL_LINK(CurrentMasterPagesSelector,EventMultiplexerListener, + sd::tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::CurrentPageChanged: + case EventMultiplexerEventId::EditModeNormal: + case EventMultiplexerEventId::EditModeMaster: + case EventMultiplexerEventId::SlideSortedSelection: + UpdateSelection(); + break; + + case EventMultiplexerEventId::PageOrder: + // This is tricky. If a master page is removed, moved, or + // added we have to wait until both the notes master page + // and the standard master page have been removed, moved, + // or added. We do this by looking at the number of master + // pages which has to be odd in the consistent state (the + // handout master page is always present). If the number is + // even we ignore the hint. + if (mrBase.GetDocument()->GetMasterPageCount()%2 == 1) + MasterPagesSelector::Fill(); + break; + + case EventMultiplexerEventId::ShapeChanged: + case EventMultiplexerEventId::ShapeInserted: + case EventMultiplexerEventId::ShapeRemoved: + InvalidatePreview(static_cast(rEvent.mpUserData)); + break; + default: break; + } +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx b/sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx new file mode 100644 index 0000000000..5b2ad3114e --- /dev/null +++ b/sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include "MasterPagesSelector.hxx" + +namespace sd::tools { class EventMultiplexerEvent; } + +namespace sd::sidebar { + +/** Show the master pages currently used by a SdDrawDocument. +*/ +class CurrentMasterPagesSelector + : public MasterPagesSelector, + public SfxListener +{ + friend class VclPtrInstance; +public: + static std::unique_ptr Create ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + const css::uno::Reference& rxSidebar); + + CurrentMasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + const std::shared_ptr& rpContainer, + const css::uno::Reference& rxSidebar); + virtual ~CurrentMasterPagesSelector() override; + + /** Set the selection so that the master page is selected that is + used by the currently selected page of the document in the + center pane. + */ + void UpdateSelection(); + + /** Copy all master pages that are to be shown into the given list. + */ + virtual void Fill (ItemList& rItemList) override; + + using MasterPagesSelector::Fill; + +protected: + virtual OUString GetContextMenuUIFile() const override; + + virtual void ProcessPopupMenu(weld::Menu& rMenu) override; + virtual void ExecuteCommand(const OUString &rIdent) override; + +private: + virtual void LateInit() override; + + DECL_LINK(EventMultiplexerListener,sd::tools::EventMultiplexerEvent&, void); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/DocumentHelper.cxx b/sd/source/ui/sidebar/DocumentHelper.cxx new file mode 100644 index 0000000000..20a2511c79 --- /dev/null +++ b/sd/source/ui/sidebar/DocumentHelper.cxx @@ -0,0 +1,536 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "DocumentHelper.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace sd::sidebar { + +SdPage* DocumentHelper::CopyMasterPageToLocalDocument ( + SdDrawDocument& rTargetDocument, + SdPage* pMasterPage) +{ + SdPage* pNewMasterPage = nullptr; + + do + { + if (pMasterPage == nullptr) + break; + + // Check the presence of the source document. + SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage())); + + // When the given master page already belongs to the target document + // then there is nothing more to do. + if (&rSourceDocument == &rTargetDocument) + { + pNewMasterPage = pMasterPage; + break; + } + + // Test if the master pages of both the slide and its notes page are + // present. This is not the case when we are called during the + // creation of the slide master page because then the notes master + // page is not there. + sal_uInt16 nSourceMasterPageCount = rSourceDocument.GetMasterPageCount(); + if (nSourceMasterPageCount%2 == 0) + // There should be 1 handout page + n slide masters + n notes + // masters = 2*n+1. An even value indicates that a new slide + // master but not yet the notes master has been inserted. + break; + sal_uInt16 nIndex = pMasterPage->GetPageNum(); + if (nSourceMasterPageCount <= nIndex+1) + break; + // Get the slide master page. + if (pMasterPage != static_cast( + rSourceDocument.GetMasterPage(nIndex))) + break; + // Get the notes master page. + SdPage* pNotesMasterPage = static_cast( + rSourceDocument.GetMasterPage(nIndex+1)); + if (pNotesMasterPage == nullptr) + break; + + // Check if a master page with the same name as that of the given + // master page already exists. + bool bPageExists (false); + sal_uInt16 nMasterPageCount(rTargetDocument.GetMasterSdPageCount(PageKind::Standard)); + for (sal_uInt16 nMaster=0; nMasterGetName() == pMasterPage->GetName()) + { + bPageExists = true; + pNewMasterPage = pCandidate; + break; + } + } + if (bPageExists) + break; + + // Create a new slide (and its notes page.) + uno::Reference xSlideSupplier ( + rTargetDocument.getUnoModel(), uno::UNO_QUERY); + if ( ! xSlideSupplier.is()) + break; + uno::Reference xSlides = + xSlideSupplier->getDrawPages(); + if ( ! xSlides.is()) + break; + xSlides->insertNewByIndex (xSlides->getCount()); + + // Set a layout. + SdPage* pSlide = rTargetDocument.GetSdPage( + rTargetDocument.GetSdPageCount(PageKind::Standard)-1, + PageKind::Standard); + if (pSlide == nullptr) + break; + pSlide->SetAutoLayout(AUTOLAYOUT_TITLE, true); + + // Create a copy of the master page and the associated notes + // master page and insert them into our document. + pNewMasterPage = AddMasterPage(rTargetDocument, pMasterPage); + if (pNewMasterPage==nullptr) + break; + SdPage* pNewNotesMasterPage + = AddMasterPage(rTargetDocument, pNotesMasterPage); + if (pNewNotesMasterPage==nullptr) + break; + + // Make the connection from the new slide to the master page + // (and do the same for the notes page.) + rTargetDocument.SetMasterPage ( + rTargetDocument.GetSdPageCount(PageKind::Standard)-1, + pNewMasterPage->GetName(), + &rTargetDocument, + false, // Connect the new master page with the new slide but + // do not modify other (master) pages. + true); + } + while (false); + + // We are not interested in any automatisms for our modified internal + // document. + rTargetDocument.SetChanged(false); + + return pNewMasterPage; +} + +SdPage* DocumentHelper::GetSlideForMasterPage (SdPage const * pMasterPage) +{ + SdPage* pCandidate = nullptr; + + SdDrawDocument* pDocument = nullptr; + if (pMasterPage != nullptr) + pDocument = dynamic_cast< SdDrawDocument* >(&pMasterPage->getSdrModelFromSdrPage()); + + // Iterate over all pages and check if it references the given master + // page. + if (pDocument!=nullptr && pDocument->GetSdPageCount(PageKind::Standard) > 0) + { + // In most cases a new slide has just been inserted so start with + // the last page. + sal_uInt16 nPageIndex (pDocument->GetSdPageCount(PageKind::Standard)-1); + bool bFound (false); + while ( ! bFound) + { + pCandidate = pDocument->GetSdPage( + nPageIndex, + PageKind::Standard); + if (pCandidate != nullptr) + { + if (static_cast(&pCandidate->TRG_GetMasterPage()) + == pMasterPage) + { + bFound = true; + break; + } + } + + if (nPageIndex == 0) + break; + else + nPageIndex --; + } + + // If no page was found, that referenced the given master page, reset + // the pointer that is returned. + if ( ! bFound) + pCandidate = nullptr; + } + + return pCandidate; +} + +SdPage* DocumentHelper::AddMasterPage ( + SdDrawDocument& rTargetDocument, + SdPage const * pMasterPage) +{ + rtl::Reference pClonedMasterPage; + + if (pMasterPage!=nullptr) + { + try + { + // Duplicate the master page. + pClonedMasterPage = static_cast(pMasterPage->CloneSdrPage(rTargetDocument).get()); + + // Copy the necessary styles. + SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage())); + ProvideStyles(rSourceDocument, rTargetDocument, pClonedMasterPage.get()); + + // Copy the precious flag. + pClonedMasterPage->SetPrecious(pMasterPage->IsPrecious()); + + // Now that the styles are available we can insert the cloned + // master page. + rTargetDocument.InsertMasterPage (pClonedMasterPage.get()); + } + catch(const uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + pClonedMasterPage = nullptr; + } + catch(const ::std::exception& e) + { + pClonedMasterPage = nullptr; + SAL_WARN("sd", "caught general exception " << e.what()); + } + catch(...) + { + pClonedMasterPage = nullptr; + SAL_WARN("sd", "caught general exception"); + } + } + + return pClonedMasterPage.get(); +} + +void DocumentHelper::ProvideStyles ( + SdDrawDocument const & rSourceDocument, + SdDrawDocument& rTargetDocument, + SdPage const * pPage) +{ + // Get the layout name of the given page. + OUString sLayoutName (pPage->GetLayoutName()); + sal_Int32 nIndex = sLayoutName.indexOf(SD_LT_SEPARATOR); + if( nIndex != -1 ) + sLayoutName = sLayoutName.copy(0, nIndex); + + // Copy the style sheet from source to target document. + SdStyleSheetPool* pSourceStyleSheetPool = + static_cast(rSourceDocument.GetStyleSheetPool()); + SdStyleSheetPool* pTargetStyleSheetPool = + static_cast(rTargetDocument.GetStyleSheetPool()); + StyleSheetCopyResultVector aCreatedStyles; + pTargetStyleSheetPool->CopyLayoutSheets ( + sLayoutName, + *pSourceStyleSheetPool, + aCreatedStyles); + + // Add an undo action for the copied style sheets. + if( !aCreatedStyles.empty() ) + { + SfxUndoManager* pUndoManager = rTargetDocument.GetDocSh()->GetUndoManager(); + if (pUndoManager != nullptr) + { + pUndoManager->AddUndoAction ( + std::make_unique( + &rTargetDocument, + aCreatedStyles, + true)); + } + } +} + +void DocumentHelper::AssignMasterPageToPageList ( + SdDrawDocument& rTargetDocument, + SdPage* pMasterPage, + const std::shared_ptr >& rpPageList) +{ + if (pMasterPage == nullptr || !pMasterPage->IsMasterPage()) + return; + + // Make the layout name by stripping out the layout postfix from the + // layout name of the given master page. + OUString sFullLayoutName(pMasterPage->GetLayoutName()); + OUString sBaseLayoutName (sFullLayoutName); + sal_Int32 nIndex = sBaseLayoutName.indexOf(SD_LT_SEPARATOR); + if( nIndex != -1 ) + sBaseLayoutName = sBaseLayoutName.copy(0, nIndex); + + if (rpPageList->empty()) + return; + + // Create a second list that contains only the valid pointers to + // pages for which an assignment is necessary. + ::std::vector aCleanedList; + for (const auto& rpPage : *rpPageList) + { + OSL_ASSERT(rpPage!=nullptr && &rpPage->getSdrModelFromSdrPage() == &rTargetDocument); + if (rpPage != nullptr && rpPage->GetLayoutName() != sFullLayoutName) + { + aCleanedList.push_back(rpPage); + } + } + if (aCleanedList.empty() ) + return; + + ViewShellId nViewShellId(-1); + if (sd::ViewShell* pViewShell = rTargetDocument.GetDocSh()->GetViewShell()) + nViewShellId = pViewShell->GetViewShellBase().GetViewShellId(); + SfxUndoManager* pUndoMgr = rTargetDocument.GetDocSh()->GetUndoManager(); + if( pUndoMgr ) + pUndoMgr->EnterListAction(SdResId(STR_UNDO_SET_PRESLAYOUT), OUString(), 0, nViewShellId); + + SdPage* pMasterPageInDocument = ProvideMasterPage(rTargetDocument,pMasterPage,rpPageList); + if (pMasterPageInDocument == nullptr) + return; + + // Assign the master pages to the given list of pages. + for (const auto& rpPage : aCleanedList) + { + AssignMasterPageToPage ( + pMasterPageInDocument, + sBaseLayoutName, + rpPage); + } + + if( pUndoMgr ) + pUndoMgr->LeaveListAction(); +} + +SdPage* DocumentHelper::AddMasterPage ( + SdDrawDocument& rTargetDocument, + SdPage const * pMasterPage, + sal_uInt16 nInsertionIndex) +{ + rtl::Reference pClonedMasterPage; + + if (pMasterPage!=nullptr) + { + // Duplicate the master page. + pClonedMasterPage = static_cast(pMasterPage->CloneSdrPage(rTargetDocument).get()); + + // Copy the precious flag. + pClonedMasterPage->SetPrecious(pMasterPage->IsPrecious()); + + // Copy the necessary styles. + SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage())); + ProvideStyles(rSourceDocument, rTargetDocument, pClonedMasterPage.get()); + + // Now that the styles are available we can insert the cloned + // master page. + rTargetDocument.InsertMasterPage (pClonedMasterPage.get(), nInsertionIndex); + + // Adapt the size of the new master page to that of the pages in + // the document. + Size aNewSize (rTargetDocument.GetSdPage(0, pMasterPage->GetPageKind())->GetSize()); + ::tools::Rectangle aBorders ( + pClonedMasterPage->GetLeftBorder(), + pClonedMasterPage->GetUpperBorder(), + pClonedMasterPage->GetRightBorder(), + pClonedMasterPage->GetLowerBorder()); + pClonedMasterPage->ScaleObjects(aNewSize, aBorders, true); + pClonedMasterPage->SetSize(aNewSize); + pClonedMasterPage->CreateTitleAndLayout(true); + } + + return pClonedMasterPage.get(); +} + +/** In here we have to handle three cases: + 1. pPage is a normal slide. We can use SetMasterPage to assign the + master pages to it. + 2. pPage is a master page that is used by at least one slide. We can + assign the master page to these slides. + 3. pPage is a master page that is currently not used by any slide. + We can delete that page and add copies of the given master pages + instead. + + For points 2 and 3 where one master page A is assigned to another B we have + to keep in mind that the master page that page A has already been + inserted into the target document. +*/ +void DocumentHelper::AssignMasterPageToPage ( + SdPage const * pMasterPage, + std::u16string_view rsBaseLayoutName, + SdPage* pPage) +{ + // Leave early when the parameters are invalid. + if (pPage == nullptr || pMasterPage == nullptr) + return; + + SdDrawDocument& rDocument(dynamic_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage())); + + if ( ! pPage->IsMasterPage()) + { + // 1. Remove the background object (so that, if it exists, does + // not override the new master page) and assign the master page to + // the regular slide. + rDocument.GetDocSh()->GetUndoManager()->AddUndoAction( + std::make_unique( + rDocument, *pPage, pPage->getSdrPageProperties().GetItemSet()), + true); + pPage->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE)); + + rDocument.SetMasterPage ( + (pPage->GetPageNum()-1)/2, + rsBaseLayoutName, + &rDocument, + false, + false); + } + else + { + // Find first slide that uses the master page. + SdPage* pSlide = nullptr; + sal_uInt16 nPageCount = rDocument.GetSdPageCount(PageKind::Standard); + for (sal_uInt16 nPage=0; nPageTRG_HasMasterPage() + && &(pCandidate->TRG_GetMasterPage()) == pPage) + { + pSlide = static_cast(pCandidate); + } + } + + if (pSlide != nullptr) + { + // 2. Assign the given master pages to the first slide that was + // found above that uses the master page. + rDocument.SetMasterPage ( + (pSlide->GetPageNum()-1)/2, + rsBaseLayoutName, + &rDocument, + false, + false); + } + else + { + // 3. Replace the master page A by a copy of the given master + // page B. + rDocument.RemoveUnnecessaryMasterPages ( + pPage); + } + } +} + +SdPage* DocumentHelper::ProvideMasterPage ( + SdDrawDocument& rTargetDocument, + SdPage* pMasterPage, + const std::shared_ptr >& rpPageList) +{ + // Make sure that both the master page and its notes master exist + // in the source document. If one is missing then return without + // making any changes. + if (pMasterPage == nullptr) + { + // The caller should make sure that the master page is valid. + OSL_ASSERT(pMasterPage != nullptr); + return nullptr; + } + SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage())); + SdPage* pNotesMasterPage = static_cast( + rSourceDocument.GetMasterPage(pMasterPage->GetPageNum()+1)); + if (pNotesMasterPage == nullptr) + { + // The model is not in a valid state. Maybe a new master page + // is being (not finished yet) created? Return without making + // any changes. + return nullptr; + } + + SdPage* pMasterPageInDocument = nullptr; + // Search for a master page with the same name as the given one in + // the target document. + const OUString sMasterPageLayoutName (pMasterPage->GetLayoutName()); + for (sal_uInt16 nIndex=0,nCount=rTargetDocument.GetMasterPageCount(); nIndex(rTargetDocument.GetMasterPage(nIndex)); + if (pCandidate && sMasterPageLayoutName == pCandidate->GetLayoutName()) + { + // The requested master page does already exist in the + // target document, return it. + return pCandidate; + } + } + + // The given master page does not already belong to the target + // document so we have to create copies and insert them into the + // target document. + + // Determine the position where the new master pages are inserted. + // By default they are inserted at the end. When we assign to a + // master page then insert after the last of the (selected) pages. + sal_uInt16 nInsertionIndex = rTargetDocument.GetMasterPageCount(); + if (rpPageList->front()->IsMasterPage()) + { + nInsertionIndex = rpPageList->back()->GetPageNum(); + } + + // Clone the master page. + if (&pMasterPage->getSdrModelFromSdrPage() != &rTargetDocument) + { + pMasterPageInDocument = AddMasterPage (rTargetDocument, pMasterPage, nInsertionIndex); + if( rTargetDocument.IsUndoEnabled() ) + rTargetDocument.AddUndo( + rTargetDocument.GetSdrUndoFactory().CreateUndoNewPage(*pMasterPageInDocument)); + } + else + pMasterPageInDocument = pMasterPage; + + // Clone the notes master. + if (&pNotesMasterPage->getSdrModelFromSdrPage() != &rTargetDocument) + { + SdPage* pClonedNotesMasterPage + = AddMasterPage (rTargetDocument, pNotesMasterPage, nInsertionIndex+1); + if( rTargetDocument.IsUndoEnabled() ) + rTargetDocument.AddUndo( + rTargetDocument.GetSdrUndoFactory().CreateUndoNewPage(*pClonedNotesMasterPage)); + } + + return pMasterPageInDocument; +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/DocumentHelper.hxx b/sd/source/ui/sidebar/DocumentHelper.hxx new file mode 100644 index 0000000000..61ba5f810e --- /dev/null +++ b/sd/source/ui/sidebar/DocumentHelper.hxx @@ -0,0 +1,108 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include +#include + +class SdDrawDocument; +class SdPage; + +namespace sd::sidebar { + +/** A collection of methods supporting the handling of master pages. +*/ +class DocumentHelper +{ +public: + /** Return a copy of the given master page in the given document. + */ + static SdPage* CopyMasterPageToLocalDocument ( + SdDrawDocument& rTargetDocument, + SdPage* pMasterPage); + + /** Return and, when not yet present, create a slide that uses the given + master page. + */ + static SdPage* GetSlideForMasterPage (SdPage const * pMasterPage); + + /** Copy the styles used by the given page from the source document to + the target document. + */ + static void ProvideStyles ( + SdDrawDocument const & rSourceDocument, + SdDrawDocument& rTargetDocument, + SdPage const * pPage); + + /** Assign the given master page to the list of pages. + @param rTargetDocument + The document that is the owner of the pages in rPageList. + @param pMasterPage + This master page will usually be a member of the list of all + available master pages as provided by the MasterPageContainer. + @param rPageList + The pages to which to assign the master page. These pages may + be slides or master pages themselves. + */ + static void AssignMasterPageToPageList ( + SdDrawDocument& rTargetDocument, + SdPage* pMasterPage, + const std::shared_ptr >& rPageList); + +private: + static SdPage* AddMasterPage ( + SdDrawDocument& rTargetDocument, + SdPage const * pMasterPage); + static SdPage* AddMasterPage ( + SdDrawDocument& rTargetDocument, + SdPage const * pMasterPage, + sal_uInt16 nInsertionIndex); + static SdPage* ProvideMasterPage ( + SdDrawDocument& rTargetDocument, + SdPage* pMasterPage, + const std::shared_ptr >& rpPageList); + + /** Assign the given master page to the given page. + @param pMasterPage + In contrast to AssignMasterPageToPageList() this page is assumed + to be in the target document, i.e. the same document that pPage + is in. The caller will usually call AddMasterPage() to create a + clone of a master page in another document to create it. + @param rsBaseLayoutName + The layout name of the given master page. It is given so that + it has not to be created on every call. It could be generated + from the given master page, though. + @param pPage + The page to which to assign the master page. It can be a slide + or a master page itself. + */ + static void AssignMasterPageToPage ( + SdPage const * pMasterPage, + std::u16string_view rsBaseLayoutName, + SdPage* pPage); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/IDisposable.hxx b/sd/source/ui/sidebar/IDisposable.hxx new file mode 100644 index 0000000000..e2c1afe278 --- /dev/null +++ b/sd/source/ui/sidebar/IDisposable.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +namespace sd::sidebar +{ +class IDisposable +{ +public: + virtual ~IDisposable(); +}; + +} // end of namespace ::sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/ISidebarReceiver.hxx b/sd/source/ui/sidebar/ISidebarReceiver.hxx new file mode 100644 index 0000000000..bf51cbe128 --- /dev/null +++ b/sd/source/ui/sidebar/ISidebarReceiver.hxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +namespace sd::sidebar +{ +class ISidebarReceiver +{ +public: + virtual ~ISidebarReceiver(); +}; + +} // end of namespace ::sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/LayoutMenu.cxx b/sd/source/ui/sidebar/LayoutMenu.cxx new file mode 100644 index 0000000000..98ab853fb5 --- /dev/null +++ b/sd/source/ui/sidebar/LayoutMenu.cxx @@ -0,0 +1,721 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "LayoutMenu.hxx" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using namespace ::sd::slidesorter; +using ::sd::framework::FrameworkHelper; + +namespace sd::sidebar { + +namespace { + +struct snew_slide_value_info +{ + OUString msBmpResId; + TranslateId mpStrResId; + WritingMode meWritingMode; + AutoLayout maAutoLayout; +}; + +} + +constexpr snew_slide_value_info notes[] = +{ + {BMP_SLIDEN_01, STR_AUTOLAYOUT_NOTES, WritingMode_LR_TB, + AUTOLAYOUT_NOTES}, +}; + +constexpr snew_slide_value_info handout[] = +{ + {BMP_SLIDEH_01, STR_AUTOLAYOUT_HANDOUT1, WritingMode_LR_TB, + AUTOLAYOUT_HANDOUT1}, + {BMP_SLIDEH_02, STR_AUTOLAYOUT_HANDOUT2, WritingMode_LR_TB, + AUTOLAYOUT_HANDOUT2}, + {BMP_SLIDEH_03, STR_AUTOLAYOUT_HANDOUT3, WritingMode_LR_TB, + AUTOLAYOUT_HANDOUT3}, + {BMP_SLIDEH_04, STR_AUTOLAYOUT_HANDOUT4, WritingMode_LR_TB, + AUTOLAYOUT_HANDOUT4}, + {BMP_SLIDEH_06, STR_AUTOLAYOUT_HANDOUT6, WritingMode_LR_TB, + AUTOLAYOUT_HANDOUT6}, + {BMP_SLIDEH_09, STR_AUTOLAYOUT_HANDOUT9, WritingMode_LR_TB, + AUTOLAYOUT_HANDOUT9}, +}; + +constexpr snew_slide_value_info standard[] = +{ + {BMP_LAYOUT_EMPTY, STR_AUTOLAYOUT_NONE, WritingMode_LR_TB, AUTOLAYOUT_NONE}, + {BMP_LAYOUT_HEAD03, STR_AUTOLAYOUT_TITLE, WritingMode_LR_TB, AUTOLAYOUT_TITLE}, + {BMP_LAYOUT_HEAD02, STR_AUTOLAYOUT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_CONTENT}, + {BMP_LAYOUT_HEAD02A, STR_AUTOLAYOUT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_2CONTENT}, + {BMP_LAYOUT_HEAD01, STR_AUTOLAYOUT_ONLY_TITLE, WritingMode_LR_TB, AUTOLAYOUT_TITLE_ONLY}, + {BMP_LAYOUT_TEXTONLY, STR_AUTOLAYOUT_ONLY_TEXT, WritingMode_LR_TB, AUTOLAYOUT_ONLY_TEXT}, + {BMP_LAYOUT_HEAD03B, STR_AUTOLAYOUT_2CONTENT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_2CONTENT_CONTENT}, + {BMP_LAYOUT_HEAD03C, STR_AUTOLAYOUT_CONTENT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_CONTENT_2CONTENT}, + {BMP_LAYOUT_HEAD03A, STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT,WritingMode_LR_TB, AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT}, + {BMP_LAYOUT_HEAD02B, STR_AUTOLAYOUT_CONTENT_OVER_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT}, + {BMP_LAYOUT_HEAD04, STR_AUTOLAYOUT_4CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_4CONTENT}, + {BMP_LAYOUT_HEAD06, STR_AUTOLAYOUT_6CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_6CONTENT}, + + // vertical + {BMP_LAYOUT_VERTICAL02, STR_AL_VERT_TITLE_TEXT_CHART, WritingMode_TB_RL, AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT}, + {BMP_LAYOUT_VERTICAL01, STR_AL_VERT_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_VTITLE_VCONTENT}, + {BMP_LAYOUT_HEAD02, STR_AL_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_TITLE_VCONTENT}, + {BMP_LAYOUT_HEAD02A, STR_AL_TITLE_VERT_OUTLINE_CLIPART, WritingMode_TB_RL, AUTOLAYOUT_TITLE_2VTEXT}, +}; + +class LayoutValueSet : public ValueSet +{ +private: + LayoutMenu& mrMenu; + + /** Calculate the number of displayed rows. This depends on the given + item size, the given number of columns, and the size of the + control. Note that this is not the number of rows managed by the + valueset. This number may be larger. In that case a vertical + scroll bar is displayed. + */ + int CalculateRowCount(const Size& rItemSize, int nColumnCount); + +public: + LayoutValueSet(LayoutMenu& rMenu) + : ValueSet(nullptr) + , mrMenu(rMenu) + { + } + + virtual void Resize() override; + + virtual bool Command(const CommandEvent& rEvent) override; +}; + +LayoutMenu::LayoutMenu ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + css::uno::Reference xSidebar) + : PanelLayout( pParent, "LayoutPanel", "modules/simpress/ui/layoutpanel.ui" ), + mrBase(rViewShellBase), + mxLayoutValueSet(new LayoutValueSet(*this)), + mxLayoutValueSetWin(new weld::CustomWeld(*m_xBuilder, "layoutvalueset", *mxLayoutValueSet)), + mbIsMainViewChangePending(false), + mxSidebar(std::move(xSidebar)), + mbIsDisposed(false) +{ + implConstruct( *mrBase.GetDocument()->GetDocSh() ); + SAL_INFO("sd.ui", "created LayoutMenu at " << this); + + mxLayoutValueSet->SetStyle(mxLayoutValueSet->GetStyle() | WB_ITEMBORDER | WB_FLATVALUESET | WB_TABSTOP); + + mxLayoutValueSet->SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Color_PanelBackground)); +} + +void LayoutMenu::implConstruct( DrawDocShell& rDocumentShell ) +{ + OSL_ENSURE( mrBase.GetDocument()->GetDocSh() == &rDocumentShell, + "LayoutMenu::implConstruct: hmm?" ); + // if this fires, then my assumption that the rDocumentShell parameter to our first ctor is superfluous ... + (void) rDocumentShell; + + mxLayoutValueSet->SetStyle ( + ( mxLayoutValueSet->GetStyle() & ~(WB_ITEMBORDER) ) + | WB_TABSTOP + | WB_MENUSTYLEVALUESET + | WB_NO_DIRECTSELECT + ); + mxLayoutValueSet->SetExtraSpacing(2); + mxLayoutValueSet->SetSelectHdl (LINK(this, LayoutMenu, ClickHandler)); + InvalidateContent(); + + Link<::sd::tools::EventMultiplexerEvent&,void> aEventListenerLink (LINK(this,LayoutMenu,EventMultiplexerListener)); + mrBase.GetEventMultiplexer()->AddEventListener(aEventListenerLink); + + mxLayoutValueSet->SetHelpId(HID_SD_TASK_PANE_PREVIEW_LAYOUTS); + mxLayoutValueSet->SetAccessibleName(SdResId(STR_TASKPANEL_LAYOUT_MENU_TITLE)); + + Link aStateChangeLink (LINK(this,LayoutMenu,StateChangeHandler)); + mxListener = new ::sd::tools::SlotStateListener( + aStateChangeLink, + Reference(mrBase.GetController()->getFrame(), UNO_QUERY), + ".uno:VerticalTextState"); +} + +LayoutMenu::~LayoutMenu() +{ + SAL_INFO("sd.ui", "destroying LayoutMenu at " << this); + Dispose(); + mxLayoutValueSetWin.reset(); + mxLayoutValueSet.reset(); +} + +void LayoutMenu::Dispose() +{ + if (mbIsDisposed) + return; + + SAL_INFO("sd.ui", "disposing LayoutMenu at " << this); + + mbIsDisposed = true; + + Reference xComponent (mxListener, UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + + Clear(); + Link aLink (LINK(this,LayoutMenu,EventMultiplexerListener)); + mrBase.GetEventMultiplexer()->RemoveEventListener (aLink); +} + +AutoLayout LayoutMenu::GetSelectedAutoLayout() const +{ + AutoLayout aResult = AUTOLAYOUT_NONE; + + if (!mxLayoutValueSet->IsNoSelection() && mxLayoutValueSet->GetSelectedItemId()!=0) + { + AutoLayout* pLayout = static_cast(mxLayoutValueSet->GetItemData(mxLayoutValueSet->GetSelectedItemId())); + if (pLayout != nullptr) + aResult = *pLayout; + } + + return aResult; +} + +ui::LayoutSize LayoutMenu::GetHeightForWidth (const sal_Int32 nWidth) +{ + sal_Int32 nPreferredHeight = 200; + if (mxLayoutValueSet->GetItemCount()>0) + { + Image aImage = mxLayoutValueSet->GetItemImage(mxLayoutValueSet->GetItemId(0)); + Size aItemSize = mxLayoutValueSet->CalcItemSizePixel(aImage.GetSizePixel()); + if (nWidth>0 && aItemSize.Width()>0) + { + aItemSize.AdjustWidth(8 ); + aItemSize.AdjustHeight(8 ); + int nColumnCount = nWidth / aItemSize.Width(); + if (nColumnCount <= 0) + nColumnCount = 1; + else if (nColumnCount > 4) + nColumnCount = 4; + int nRowCount = (mxLayoutValueSet->GetItemCount() + nColumnCount-1) / nColumnCount; + nPreferredHeight = nRowCount * aItemSize.Height(); + } + } + return ui::LayoutSize(nPreferredHeight,nPreferredHeight,nPreferredHeight); +} + +void LayoutValueSet::Resize() +{ + Size aWindowSize = GetOutputSizePixel(); + if (IsVisible() && aWindowSize.Width() > 0) + { + // Calculate the number of rows and columns. + if (GetItemCount() > 0) + { + Image aImage = GetItemImage(GetItemId(0)); + Size aItemSize = CalcItemSizePixel ( + aImage.GetSizePixel()); + aItemSize.AdjustWidth(8 ); + aItemSize.AdjustHeight(8 ); + int nColumnCount = aWindowSize.Width() / aItemSize.Width(); + if (nColumnCount < 1) + nColumnCount = 1; + else if (nColumnCount > 4) + nColumnCount = 4; + + int nRowCount = CalculateRowCount (aItemSize, nColumnCount); + + SetColCount(nColumnCount); + SetLineCount(nRowCount); + } + } + + ValueSet::Resize(); +} + +bool LayoutValueSet::Command(const CommandEvent& rEvent) +{ + if (rEvent.GetCommand() != CommandEventId::ContextMenu) + return false; + + // As a preparation for the context menu the item under the mouse is + // selected. + if (rEvent.IsMouseEvent()) + { + sal_uInt16 nIndex = GetItemId(rEvent.GetMousePosPixel()); + if (nIndex > 0) + SelectItem(nIndex); + } + + mrMenu.ShowContextMenu(rEvent.IsMouseEvent() ? &rEvent.GetMousePosPixel() : nullptr); + return true; +} + +void LayoutMenu::InsertPageWithLayout (AutoLayout aLayout) +{ + ViewShell* pViewShell = mrBase.GetMainViewShell().get(); + if (pViewShell == nullptr) + return; + + SfxViewFrame& rViewFrame = mrBase.GetViewFrame(); + SfxDispatcher* pDispatcher = rViewFrame.GetDispatcher(); + if (pDispatcher == nullptr) + return; + + // Call SID_INSERTPAGE with the right arguments. This is because + // the popup menu can not call this slot with arguments directly. + SfxRequest aRequest (CreateRequest(SID_INSERTPAGE, aLayout)); + if (aRequest.GetArgs() != nullptr) + { + pDispatcher->Execute( + SID_INSERTPAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + *aRequest.GetArgs()); + } + UpdateSelection(); +} + +void LayoutMenu::InvalidateContent() +{ + // Throw away the current set and fill the menu anew according to the + // current settings (this includes the support for vertical writing.) + Fill(); + + if (mxSidebar.is()) + mxSidebar->requestLayout(); + + // set selection inside the control during Impress start up + UpdateSelection(); +} + +int LayoutValueSet::CalculateRowCount (const Size&, int nColumnCount) +{ + int nRowCount = 0; + + if (GetItemCount() > 0 && nColumnCount > 0) + { + nRowCount = (GetItemCount() + nColumnCount - 1) / nColumnCount; + if (nRowCount < 1) + nRowCount = 1; + } + + return nRowCount; +} + +IMPL_LINK_NOARG(LayoutMenu, ClickHandler, ValueSet*, void) +{ + AssignLayoutToSelectedSlides( GetSelectedAutoLayout() ); +} + +/** The specified layout is assigned to the current page of the view shell + in the center pane. +*/ +void LayoutMenu::AssignLayoutToSelectedSlides (AutoLayout aLayout) +{ + using namespace ::sd::slidesorter; + using namespace ::sd::slidesorter::controller; + + do + { + // The view shell in the center pane has to be present. + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + if (pMainViewShell == nullptr) + break; + + // Determine if the current view is in an invalid master page mode. + // The handout view is always in master page mode and therefore not + // invalid. + bool bMasterPageMode (false); + switch (pMainViewShell->GetShellType()) + { + case ViewShell::ST_NOTES: + case ViewShell::ST_IMPRESS: + { + DrawViewShell* pDrawViewShell = static_cast(pMainViewShell); + if (pDrawViewShell->GetEditMode() == EditMode::MasterPage) + bMasterPageMode = true; + break; + } + default: + break; + } + if (bMasterPageMode) + break; + + // Get a list of all selected slides and call the SID_MODIFYPAGE + // slot for all of them. + ::sd::slidesorter::SharedPageSelection pPageSelection; + + // Get a list of selected pages. + // First we try to obtain this list from a slide sorter. This is + // possible only some of the view shells in the center pane. When + // no valid slide sorter is available then ask the main view shell + // for its current page. + SlideSorterViewShell* pSlideSorter = nullptr; + switch (pMainViewShell->GetShellType()) + { + case ViewShell::ST_IMPRESS: + case ViewShell::ST_NOTES: + case ViewShell::ST_SLIDE_SORTER: + pSlideSorter = SlideSorterViewShell::GetSlideSorter(mrBase); + break; + default: + break; + } + if (pSlideSorter != nullptr) + { + // There is a slide sorter visible so get the list of selected pages from it. + pPageSelection = pSlideSorter->GetPageSelection(); + } + + if( (pSlideSorter == nullptr) || !pPageSelection || pPageSelection->empty() ) + { + // No valid slide sorter available. Ask the main view shell for + // its current page. + pPageSelection = std::make_shared<::sd::slidesorter::SlideSorterViewShell::PageSelection>(); + pPageSelection->push_back(pMainViewShell->GetActualPage()); + } + + if (pPageSelection->empty()) + break; + + for (const auto& rpPage : *pPageSelection) + { + if (rpPage == nullptr) + continue; + + // Call the SID_ASSIGN_LAYOUT slot with all the necessary parameters. + SfxRequest aRequest(mrBase.GetViewFrame(), SID_ASSIGN_LAYOUT); + aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATPAGE, (rpPage->GetPageNum()-1)/2)); + aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, aLayout)); + pMainViewShell->ExecuteSlot (aRequest, false); + } + } + while(false); +} + +SfxRequest LayoutMenu::CreateRequest ( + sal_uInt16 nSlotId, + AutoLayout aLayout) +{ + SfxRequest aRequest(mrBase.GetViewFrame(), nSlotId); + + do + { + SdrLayerAdmin& rLayerAdmin (mrBase.GetDocument()->GetLayerAdmin()); + SdrLayerID aBackground (rLayerAdmin.GetLayerID(sUNO_LayerName_background)); + SdrLayerID aBackgroundObject (rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects)); + ViewShell* pViewShell = mrBase.GetMainViewShell().get(); + if (pViewShell == nullptr) + break; + SdPage* pPage = pViewShell->GetActualPage(); + if (pPage == nullptr) + break; + + SdrLayerIDSet aVisibleLayers (pPage->TRG_GetMasterPageVisibleLayers()); + + aRequest.AppendItem( + SfxStringItem (ID_VAL_PAGENAME, OUString()));//pPage->GetName())); + aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, aLayout)); + aRequest.AppendItem( + SfxBoolItem(ID_VAL_ISPAGEBACK, aVisibleLayers.IsSet(aBackground))); + aRequest.AppendItem( + SfxBoolItem( + ID_VAL_ISPAGEOBJ, + aVisibleLayers.IsSet(aBackgroundObject))); + } + while (false); + + return aRequest; +} + +void LayoutMenu::Fill() +{ + bool bVertical = SvtCJKOptions::IsVerticalTextEnabled(); + SdDrawDocument* pDocument = mrBase.GetDocument(); + bool bRightToLeft = (pDocument!=nullptr + && pDocument->GetDefaultWritingMode() == WritingMode_RL_TB); + + // Get URL of the view in the center pane. + OUString sCenterPaneViewName; + try + { + if (mrBase.GetDrawController()) + { + Reference xPaneId (ResourceId::create( + ::comphelper::getProcessComponentContext(), + FrameworkHelper::msCenterPaneURL)); + Reference xView (FrameworkHelper::Instance(mrBase)->GetView(xPaneId)); + if (xView.is()) + sCenterPaneViewName = xView->getResourceId()->getResourceURL(); + } + } + catch (RuntimeException&) + {} + + std::span pInfo; + if (sCenterPaneViewName == framework::FrameworkHelper::msNotesViewURL) + { + pInfo = notes; + } + else if (sCenterPaneViewName == framework::FrameworkHelper::msHandoutViewURL) + { + pInfo = handout; + } + else if (sCenterPaneViewName == framework::FrameworkHelper::msImpressViewURL + || sCenterPaneViewName == framework::FrameworkHelper::msSlideSorterURL) + { + pInfo = standard; + } + + Clear(); + sal_uInt16 id = 1; + for (const auto& elem : pInfo) + { + if ((WritingMode_TB_RL != elem.meWritingMode) || bVertical) + { + Image aImg(OUString::Concat("private:graphicrepository/") + elem.msBmpResId); + + if (bRightToLeft && (WritingMode_TB_RL != elem.meWritingMode)) + { // FIXME: avoid interpolating RTL layouts. + BitmapEx aRTL = aImg.GetBitmapEx(); + aRTL.Mirror(BmpMirrorFlags::Horizontal); + aImg = Image(aRTL); + } + + mxLayoutValueSet->InsertItem(id, aImg, SdResId(elem.mpStrResId)); + mxLayoutValueSet->SetItemData(id, new AutoLayout(elem.maAutoLayout)); + ++id; + } + } +} + +void LayoutMenu::Clear() +{ + for (size_t nId=1; nId<=mxLayoutValueSet->GetItemCount(); nId++) + delete static_cast(mxLayoutValueSet->GetItemData(nId)); + mxLayoutValueSet->Clear(); +} + +void LayoutMenu::ShowContextMenu(const Point* pPos) +{ + if (SD_MOD()->GetWaterCan()) + return; + + // Determine the position where to show the menu. + Point aMenuPosition; + if (pPos) + { + auto nItemId = mxLayoutValueSet->GetItemId(*pPos); + if (nItemId <= 0) + return; + mxLayoutValueSet->SelectItem(nItemId); + aMenuPosition = *pPos; + } + else + { + if (mxLayoutValueSet->GetSelectedItemId() == sal_uInt16(-1)) + return; + ::tools::Rectangle aBBox(mxLayoutValueSet->GetItemRect(mxLayoutValueSet->GetSelectedItemId())); + aMenuPosition = aBBox.Center(); + } + + // Setup the menu. + ::tools::Rectangle aRect(aMenuPosition, Size(1, 1)); + weld::Widget* pPopupParent = mxLayoutValueSet->GetDrawingArea(); + std::unique_ptr xBuilder(Application::CreateBuilder(pPopupParent, "modules/simpress/ui/layoutmenu.ui")); + std::unique_ptr xMenu(xBuilder->weld_menu("menu")); + + // Disable the SID_INSERTPAGE_LAYOUT_MENU item when + // the document is read-only. + SfxPoolItemHolder aResult; + const SfxItemState aState ( + mrBase.GetViewFrame().GetDispatcher()->QueryState(SID_INSERTPAGE, aResult)); + if (aState == SfxItemState::DISABLED) + xMenu->set_sensitive("insert", false); + + // Show the menu. + OnMenuItemSelected(xMenu->popup_at_rect(pPopupParent, aRect)); +} + +IMPL_LINK_NOARG(LayoutMenu, StateChangeHandler, const OUString&, void) +{ + InvalidateContent(); +} + +void LayoutMenu::OnMenuItemSelected(std::u16string_view ident) +{ + if (ident.empty()) + return; + + if (ident == u"apply") + { + AssignLayoutToSelectedSlides(GetSelectedAutoLayout()); + } + else if (ident == u"insert") + { + // Add arguments to this slot and forward it to the main view + // shell. + InsertPageWithLayout(GetSelectedAutoLayout()); + } +} + +// Selects an appropriate layout of the slide inside control. +// +// Method may be called several times with the same item-id to be selected - +// only once the actually state of the control will be changed. +// +void LayoutMenu::UpdateSelection() +{ + bool bItemSelected = false; + + do + { + // Get current page of main view. + ViewShell* pViewShell = mrBase.GetMainViewShell().get(); + if (pViewShell == nullptr) + break; + + SdPage* pCurrentPage = pViewShell->getCurrentPage(); + if (pCurrentPage == nullptr) + break; + + // Get layout of current page. + AutoLayout aLayout (pCurrentPage->GetAutoLayout()); + if (aLayoutAUTOLAYOUT_END) + break; + + // Find the entry of the menu for to the layout. + const sal_uInt16 nItemCount = mxLayoutValueSet->GetItemCount(); + for (sal_uInt16 nId=1; nId<=nItemCount; nId++) + { + if (*static_cast(mxLayoutValueSet->GetItemData(nId)) == aLayout) + { + // do not set selection twice to the same item + if (mxLayoutValueSet->GetSelectedItemId() != nId) + { + mxLayoutValueSet->SetNoSelection(); + mxLayoutValueSet->SelectItem(nId); + } + + bItemSelected = true; // no need to call SetNoSelection() + break; + } + } + } + while (false); + + if (!bItemSelected) + mxLayoutValueSet->SetNoSelection(); +} + +IMPL_LINK(LayoutMenu, EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + // tdf#89890 During changes of the Layout of the slide when focus is not set inside main area + // we do not receive notification EventMultiplexerEventId::CurrentPageChanged, but we receive the following 3 notification types. + // => let's make UpdateSelection() also when some shape is changed (during Layout changes) + case EventMultiplexerEventId::ShapeChanged: + case EventMultiplexerEventId::ShapeInserted: + case EventMultiplexerEventId::ShapeRemoved: + UpdateSelection(); + break; + + case EventMultiplexerEventId::CurrentPageChanged: + case EventMultiplexerEventId::SlideSortedSelection: + UpdateSelection(); + break; + + case EventMultiplexerEventId::MainViewAdded: + mbIsMainViewChangePending = true; + break; + + case EventMultiplexerEventId::MainViewRemoved: + mxLayoutValueSet->Invalidate(); // redraw without focus + break; + + case EventMultiplexerEventId::ConfigurationUpdated: + if (mbIsMainViewChangePending) + { + mbIsMainViewChangePending = false; + InvalidateContent(); + } + break; + + default: + break; + } +} + +void LayoutMenu::DataChanged(const DataChangedEvent& rEvent) +{ + PanelLayout::DataChanged(rEvent); + Fill(); + mxLayoutValueSet->StyleUpdated(); + mxLayoutValueSet->SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Color_PanelBackground)); +} + +} // end of namespace ::sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/LayoutMenu.hxx b/sd/source/ui/sidebar/LayoutMenu.hxx new file mode 100644 index 0000000000..0b1f7b4512 --- /dev/null +++ b/sd/source/ui/sidebar/LayoutMenu.hxx @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include +#include + +namespace com::sun::star::frame +{ +class XStatusListener; +} +namespace com::sun::star::ui +{ +class XSidebar; +} + +namespace sd +{ +class DrawDocShell; +class ViewShellBase; +} + +namespace sd::tools +{ +class EventMultiplexerEvent; +} + +namespace sd::sidebar +{ +class LayoutValueSet; + +class LayoutMenu : public PanelLayout, public sfx2::sidebar::ILayoutableWindow +{ +public: + /** Create a new layout menu. Depending on the given flag it + displays its own scroll bar or lets a surrounding window + handle that. + @param i_pParent + the parent node in the control tree + @param i_rPanelViewShell + the view shell of the task pane. + */ + LayoutMenu(weld::Widget* pParent, ViewShellBase& rViewShellBase, + css::uno::Reference xSidebar); + virtual ~LayoutMenu() override; + + void Dispose(); + + /** Return a numerical value representing the currently selected + layout. + */ + AutoLayout GetSelectedAutoLayout() const; + + // From ILayoutableWindow + virtual css::ui::LayoutSize GetHeightForWidth(const sal_Int32 nWidth) override; + + /** Call this method when the set of displayed layouts is not up-to-date + anymore. It will re-assemble this set according to the current + settings. + */ + void InvalidateContent(); + + /** The context menu is requested over this ShowContextMenu() method. + */ + void ShowContextMenu(const Point* pPos); + + /** Call Fill() when switching to or from high contrast mode so that the + correct set of icons is displayed. + */ + virtual void DataChanged(const DataChangedEvent& rEvent) override; + +private: + ViewShellBase& mrBase; + + std::unique_ptr mxLayoutValueSet; + std::unique_ptr mxLayoutValueSetWin; + + /** If we are asked for the preferred window size, then use this + many columns for the calculation. + */ + css::uno::Reference mxListener; + bool mbIsMainViewChangePending; + css::uno::Reference mxSidebar; + bool mbIsDisposed; + + /** Fill the value set with the layouts that are applicable to the + current main view shell. + */ + void Fill(); + + /** Remove all items from the value set. + */ + void Clear(); + + /** Assign the given layout to all selected slides of a slide sorter. + If no slide sorter is active then this call is ignored. The slide + sorter in the center pane is preferred if the choice exists. + */ + void AssignLayoutToSelectedSlides(AutoLayout aLayout); + + /** Insert a new page with the given layout. The page is inserted via + the main view shell, i.e. its SID_INSERTPAGE slot is called. If it + does not support this slot then inserting a new page does not take + place. The new page is inserted after the currently active one (the + one returned by ViewShell::GetActualPage().) + */ + void InsertPageWithLayout(AutoLayout aLayout); + + /** Create a request structure that can be used with the SID_INSERTPAGE + and SID_MODIFYPAGE slots. The parameters are set so that the given + layout is assigned to the current page of the main view shell. + @param nSlotId + Supported slots are SID_INSERTPAGE and SID_MODIFYPAGE. + @param aLayout + Layout of the page to insert or to assign. + */ + SfxRequest CreateRequest(sal_uInt16 nSlotId, AutoLayout aLayout); + + /** Select the layout that is used by the current page. + */ + void UpdateSelection(); + + // internal ctor + void implConstruct(DrawDocShell& rDocumentShell); + + /** When clicked then set the current page of the view in the center pane. + */ + DECL_LINK(ClickHandler, ValueSet*, void); + DECL_LINK(StateChangeHandler, const OUString&, void); + DECL_LINK(EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent&, void); + void OnMenuItemSelected(std::u16string_view ident); +}; + +} // end of namespace ::sd::toolpanel + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainer.cxx b/sd/source/ui/sidebar/MasterPageContainer.cxx new file mode 100644 index 0000000000..20d8528077 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainer.cxx @@ -0,0 +1,958 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "MasterPageContainer.hxx" + +#include "MasterPageContainerProviders.hxx" +#include "MasterPageDescriptor.hxx" +#include "MasterPageContainerFiller.hxx" +#include "MasterPageContainerQueue.hxx" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace { + +typedef ::std::vector MasterPageContainerType; + +} // end of anonymous namespace + +namespace sd::sidebar { + +/** Inner implementation class of the MasterPageContainer. +*/ +class MasterPageContainer::Implementation + : public SdGlobalResource, + public MasterPageContainerFiller::ContainerAdapter, + public MasterPageContainerQueue::ContainerAdapter +{ +public: + mutable ::osl::Mutex maMutex; + + static std::weak_ptr mpInstance; + MasterPageContainerType maContainer; + + static std::shared_ptr Instance(); + + void LateInit(); + void AddChangeListener (const Link& rLink); + void RemoveChangeListener (const Link& rLink); + void UpdatePreviewSizePixel(); + const Size& GetPreviewSizePixel (PreviewSize eSize) const; + + bool HasToken (Token aToken) const; + SharedMasterPageDescriptor GetDescriptor (MasterPageContainer::Token aToken) const; + virtual Token PutMasterPage (const SharedMasterPageDescriptor& rDescriptor) override; + void InvalidatePreview (Token aToken); + Image GetPreviewForToken ( + Token aToken, + PreviewSize ePreviewSize); + PreviewState GetPreviewState (Token aToken) const; + bool RequestPreview (Token aToken); + + Reference GetModel(); + SdDrawDocument* GetDocument(); + + void FireContainerChange ( + MasterPageContainerChangeEvent::EventType eType, + Token aToken); + + virtual bool UpdateDescriptor ( + const SharedMasterPageDescriptor& rpDescriptor, + bool bForcePageObject, + bool bForcePreview, + bool bSendEvents) override; + + void ReleaseDescriptor (Token aToken); + + /** Called by the MasterPageContainerFiller to notify that all master + pages from template documents have been added. + */ + virtual void FillingDone() override; + +private: + Implementation(); + virtual ~Implementation() override; + + class Deleter { public: + void operator() (Implementation* pObject) { delete pObject; } + }; + friend class Deleter; + + enum class InitializationState { NotInitialized, Initializing, Initialized }; + InitializationState meInitializationState; + + std::unique_ptr mpRequestQueue; + css::uno::Reference mxModel; + SdDrawDocument* mpDocument; + PreviewRenderer maPreviewRenderer; + /** Remember whether the first page object has already been used to + determine the correct size ratio. + */ + bool mbFirstPageObjectSeen; + + // The widths for the previews contain two pixels for the border that is + // painted around the preview. + static const int SMALL_PREVIEW_WIDTH = 72 + 2; + static const int LARGE_PREVIEW_WIDTH = 2*72 + 2; + + /** This substitution of page preview shows "Preparing preview" and is + shown as long as the actual previews are not being present. + */ + Image maLargePreviewBeingCreated; + Image maSmallPreviewBeingCreated; + + /** This substitution of page preview is shown when a preview can not be + created and thus is not available. + */ + Image maLargePreviewNotAvailable; + Image maSmallPreviewNotAvailable; + + ::std::vector> maChangeListeners; + + // We have to remember the tasks for initialization and filling in case + // a MasterPageContainer object is destroyed before these tasks have + // been completed. + std::weak_ptr mpFillerTask; + + Size maSmallPreviewSizePixel; + Size maLargePreviewSizePixel; + + Image GetPreviewSubstitution(TranslateId pId, PreviewSize ePreviewSize); + + void CleanContainer(); +}; + +//===== MasterPageContainer =================================================== + +std::weak_ptr + MasterPageContainer::Implementation::mpInstance; + +std::shared_ptr + MasterPageContainer::Implementation::Instance() +{ + std::shared_ptr pInstance; + + if (Implementation::mpInstance.expired()) + { + ::osl::GetGlobalMutex aMutexFunctor; + ::osl::MutexGuard aGuard (aMutexFunctor()); + if (Implementation::mpInstance.expired()) + { + OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); + pInstance = std::shared_ptr( + new MasterPageContainer::Implementation(), + MasterPageContainer::Implementation::Deleter()); + SdGlobalResourceContainer::Instance().AddResource(pInstance); + Implementation::mpInstance = pInstance; + } + else + pInstance = std::shared_ptr( + Implementation::mpInstance); + } + else + { + OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); + pInstance = std::shared_ptr( + Implementation::mpInstance); + } + + DBG_ASSERT(pInstance != nullptr, + "MasterPageContainer::Implementation::Instance(): instance is nullptr"); + return pInstance; +} + +MasterPageContainer::MasterPageContainer() + : mpImpl(Implementation::Instance()), + mePreviewSize(SMALL) +{ + mpImpl->LateInit(); +} + +MasterPageContainer::~MasterPageContainer() +{ +} + +void MasterPageContainer::AddChangeListener (const Link& rLink) +{ + mpImpl->AddChangeListener(rLink); +} + +void MasterPageContainer::RemoveChangeListener (const Link& rLink) +{ + mpImpl->RemoveChangeListener(rLink); +} + +void MasterPageContainer::SetPreviewSize (PreviewSize eSize) +{ + mePreviewSize = eSize; + mpImpl->FireContainerChange( + MasterPageContainerChangeEvent::EventType::SIZE_CHANGED, + NIL_TOKEN); +} + +Size const & MasterPageContainer::GetPreviewSizePixel() const +{ + return mpImpl->GetPreviewSizePixel(mePreviewSize); +} + +MasterPageContainer::Token MasterPageContainer::PutMasterPage ( + const std::shared_ptr& rDescriptor) +{ + return mpImpl->PutMasterPage(rDescriptor); +} + +void MasterPageContainer::AcquireToken (Token aToken) +{ + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + { + ++pDescriptor->mnUseCount; + } +} + +void MasterPageContainer::ReleaseToken (Token aToken) +{ + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (!pDescriptor) + return; + + OSL_ASSERT(pDescriptor->mnUseCount>0); + --pDescriptor->mnUseCount; + if (pDescriptor->mnUseCount > 0) + return; + + switch (pDescriptor->meOrigin) + { + case DEFAULT: + case TEMPLATE: + default: + break; + + case MASTERPAGE: + mpImpl->ReleaseDescriptor(aToken); + break; + } +} + +int MasterPageContainer::GetTokenCount() const +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + return mpImpl->maContainer.size(); +} + +bool MasterPageContainer::HasToken (Token aToken) const +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + return mpImpl->HasToken(aToken); +} + +MasterPageContainer::Token MasterPageContainer::GetTokenForIndex (int nIndex) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + Token aResult (NIL_TOKEN); + if (HasToken(nIndex)) + aResult = mpImpl->maContainer[nIndex]->maToken; + return aResult; +} + +MasterPageContainer::Token MasterPageContainer::GetTokenForURL ( + const OUString& sURL) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + Token aResult (NIL_TOKEN); + if (!sURL.isEmpty()) + { + MasterPageContainerType::iterator iEntry ( + ::std::find_if ( + mpImpl->maContainer.begin(), + mpImpl->maContainer.end(), + MasterPageDescriptor::URLComparator(sURL))); + if (iEntry != mpImpl->maContainer.end()) + aResult = (*iEntry)->maToken; + } + return aResult; +} + +MasterPageContainer::Token MasterPageContainer::GetTokenForStyleName (const OUString& sStyleName) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + Token aResult (NIL_TOKEN); + if (!sStyleName.isEmpty()) + { + MasterPageContainerType::iterator iEntry ( + ::std::find_if ( + mpImpl->maContainer.begin(), + mpImpl->maContainer.end(), + MasterPageDescriptor::StyleNameComparator(sStyleName))); + if (iEntry != mpImpl->maContainer.end()) + aResult = (*iEntry)->maToken; + } + return aResult; +} + +MasterPageContainer::Token MasterPageContainer::GetTokenForPageObject ( + const SdPage* pPage) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + Token aResult (NIL_TOKEN); + if (pPage != nullptr) + { + MasterPageContainerType::iterator iEntry ( + ::std::find_if ( + mpImpl->maContainer.begin(), + mpImpl->maContainer.end(), + MasterPageDescriptor::PageObjectComparator(pPage))); + if (iEntry != mpImpl->maContainer.end()) + aResult = (*iEntry)->maToken; + } + return aResult; +} + +OUString MasterPageContainer::GetURLForToken ( + MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + return pDescriptor->msURL; + else + return OUString(); +} + +OUString MasterPageContainer::GetPageNameForToken ( + MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + return pDescriptor->msPageName; + else + return OUString(); +} + +OUString MasterPageContainer::GetStyleNameForToken ( + MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + return pDescriptor->msStyleName; + else + return OUString(); +} + +SdPage* MasterPageContainer::GetPageObjectForToken ( + MasterPageContainer::Token aToken, + bool bLoad) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + SdPage* pPageObject = nullptr; + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + { + pPageObject = pDescriptor->mpMasterPage; + if (pPageObject == nullptr) + { + // The page object is not (yet) present. Call + // UpdateDescriptor() to trigger the PageObjectProvider() to + // provide it. + if (bLoad) + mpImpl->GetModel(); + if (mpImpl->UpdateDescriptor(pDescriptor,bLoad,false, true)) + pPageObject = pDescriptor->mpMasterPage; + } + } + return pPageObject; +} + +MasterPageContainer::Origin MasterPageContainer::GetOriginForToken (Token aToken) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + return pDescriptor->meOrigin; + else + return UNKNOWN; +} + +sal_Int32 MasterPageContainer::GetTemplateIndexForToken (Token aToken) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken); + if (pDescriptor) + return pDescriptor->mnTemplateIndex; + else + return -1; +} + +std::shared_ptr MasterPageContainer::GetDescriptorForToken ( + MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (mpImpl->maMutex); + + return mpImpl->GetDescriptor(aToken); +} + +void MasterPageContainer::InvalidatePreview (MasterPageContainer::Token aToken) +{ + mpImpl->InvalidatePreview(aToken); +} + +Image MasterPageContainer::GetPreviewForToken (MasterPageContainer::Token aToken) +{ + return mpImpl->GetPreviewForToken(aToken,mePreviewSize); +} + +MasterPageContainer::PreviewState MasterPageContainer::GetPreviewState (Token aToken) +{ + return mpImpl->GetPreviewState(aToken); +} + +bool MasterPageContainer::RequestPreview (Token aToken) +{ + return mpImpl->RequestPreview(aToken); +} + +//==== Implementation ================================================ + +MasterPageContainer::Implementation::Implementation() + : meInitializationState(InitializationState::NotInitialized), + mpDocument(nullptr), + mbFirstPageObjectSeen(false) +{ + UpdatePreviewSizePixel(); +} + +MasterPageContainer::Implementation::~Implementation() +{ + // When the initializer or filler tasks are still running then we have + // to stop them now in order to prevent them from calling us back. + tools::TimerBasedTaskExecution::ReleaseTask(mpFillerTask); + + mpRequestQueue.reset(); + + uno::Reference xCloseable (mxModel, uno::UNO_QUERY); + if (xCloseable.is()) + { + try + { + xCloseable->close(true); + } + catch (const css::util::CloseVetoException&) + { + } + } + mxModel = nullptr; +} + +void MasterPageContainer::Implementation::LateInit() +{ + const ::osl::MutexGuard aGuard (maMutex); + + if (meInitializationState != InitializationState::NotInitialized) + return; + + meInitializationState = InitializationState::Initializing; + + OSL_ASSERT(Instance().get()==this); + mpRequestQueue.reset(MasterPageContainerQueue::Create( + std::shared_ptr(Instance()))); + + mpFillerTask = ::sd::tools::TimerBasedTaskExecution::Create( + std::make_shared(*this), + 5, + 50); + + meInitializationState = InitializationState::Initialized; +} + +void MasterPageContainer::Implementation::AddChangeListener (const Link& rLink) +{ + const ::osl::MutexGuard aGuard (maMutex); + + ::std::vector>::iterator iListener ( + ::std::find(maChangeListeners.begin(),maChangeListeners.end(),rLink)); + if (iListener == maChangeListeners.end()) + maChangeListeners.push_back(rLink); + +} + +void MasterPageContainer::Implementation::RemoveChangeListener (const Link& rLink) +{ + const ::osl::MutexGuard aGuard (maMutex); + + ::std::vector>::iterator iListener ( + ::std::find(maChangeListeners.begin(),maChangeListeners.end(),rLink)); + if (iListener != maChangeListeners.end()) + maChangeListeners.erase(iListener); +} + +void MasterPageContainer::Implementation::UpdatePreviewSizePixel() +{ + const ::osl::MutexGuard aGuard (maMutex); + + // The default aspect ratio is 4:3 + int nWidth (4); + int nHeight (3); + + // Search for the first entry with an existing master page. + auto iDescriptor = std::find_if(maContainer.begin(), maContainer.end(), + [](const SharedMasterPageDescriptor& rxDescriptor) { + return rxDescriptor != nullptr && rxDescriptor->mpMasterPage != nullptr; + }); + if (iDescriptor != maContainer.end()) + { + Size aPageSize ((*iDescriptor)->mpMasterPage->GetSize()); + OSL_ASSERT(!aPageSize.IsEmpty()); + if (aPageSize.Width() > 0) + nWidth = aPageSize.Width(); + if (aPageSize.Height() > 0) + nHeight = aPageSize.Height(); + mbFirstPageObjectSeen = true; + } + + maSmallPreviewSizePixel.setWidth( SMALL_PREVIEW_WIDTH ); + maLargePreviewSizePixel.setWidth( LARGE_PREVIEW_WIDTH ); + + int nNewSmallHeight ((maSmallPreviewSizePixel.Width()-2) * nHeight / nWidth + 2); + int nNewLargeHeight ((maLargePreviewSizePixel.Width()-2) * nHeight / nWidth + 2); + + if (nNewSmallHeight!=maSmallPreviewSizePixel.Height() + || nNewLargeHeight!=maLargePreviewSizePixel.Height()) + { + maSmallPreviewSizePixel.setHeight( nNewSmallHeight ); + maLargePreviewSizePixel.setHeight( nNewLargeHeight ); + FireContainerChange( + MasterPageContainerChangeEvent::EventType::SIZE_CHANGED, + NIL_TOKEN); + } +} + +const Size& MasterPageContainer::Implementation::GetPreviewSizePixel (PreviewSize eSize) const +{ + if (eSize == SMALL) + return maSmallPreviewSizePixel; + else + return maLargePreviewSizePixel; +} + +MasterPageContainer::Token MasterPageContainer::Implementation::PutMasterPage ( + const SharedMasterPageDescriptor& rpDescriptor) +{ + const ::osl::MutexGuard aGuard (maMutex); + + Token aResult (NIL_TOKEN); + + // Get page object and preview when that is inexpensive. + UpdateDescriptor(rpDescriptor,false,false, false); + + // Look up the new MasterPageDescriptor and either insert it or update + // an already existing one. + MasterPageContainerType::iterator aEntry ( + ::std::find_if ( + maContainer.begin(), + maContainer.end(), + MasterPageDescriptor::AllComparator(rpDescriptor))); + if (aEntry == maContainer.end()) + { + // Insert a new MasterPageDescriptor. + bool bIgnore(rpDescriptor->mpPageObjectProvider == nullptr + && rpDescriptor->msURL.isEmpty()); + + if ( ! bIgnore) + { + CleanContainer(); + + aResult = maContainer.size(); + rpDescriptor->SetToken(aResult); + + // Templates are precious, i.e. we lock them so that they will + // not be destroyed when (temporarily) no one references them. + // They will only be deleted when the container is destroyed. + switch (rpDescriptor->meOrigin) + { + case TEMPLATE: + case DEFAULT: + ++rpDescriptor->mnUseCount; + break; + + default: + break; + } + + maContainer.push_back(rpDescriptor); + aEntry = maContainer.end()-1; + + FireContainerChange(MasterPageContainerChangeEvent::EventType::CHILD_ADDED,aResult); + } + } + else + { + // Update an existing MasterPageDescriptor. + aResult = (*aEntry)->maToken; + std::unique_ptr > pEventTypes( + (*aEntry)->Update(*rpDescriptor)); + if (pEventTypes != nullptr && !pEventTypes->empty()) + { + // One or more aspects of the descriptor have changed. Send + // appropriate events to the listeners. + UpdateDescriptor(*aEntry,false,false, true); + + for (const auto& rEventType : *pEventTypes) + { + FireContainerChange(rEventType, (*aEntry)->maToken); + } + } + } + + return aResult; +} + +bool MasterPageContainer::Implementation::HasToken (Token aToken) const +{ + return aToken>=0 + && o3tl::make_unsigned(aToken)=0 && o3tl::make_unsigned(aToken)maSmallPreview = Image(); + pDescriptor->maLargePreview = Image(); + RequestPreview(aToken); + } +} + +Image MasterPageContainer::Implementation::GetPreviewForToken ( + MasterPageContainer::Token aToken, + PreviewSize ePreviewSize) +{ + const ::osl::MutexGuard aGuard (maMutex); + + Image aPreview; + PreviewState ePreviewState (GetPreviewState(aToken)); + + SharedMasterPageDescriptor pDescriptor = GetDescriptor(aToken); + + // When the preview is missing but inexpensively creatable then do that + // now. + if (pDescriptor) + { + if (ePreviewState == PS_CREATABLE) + if (UpdateDescriptor(pDescriptor, false,false, true)) + if (pDescriptor->maLargePreview.GetSizePixel().Width() != 0) + ePreviewState = PS_AVAILABLE; + + switch (ePreviewState) + { + case PS_AVAILABLE: + aPreview = pDescriptor->GetPreview(ePreviewSize); + break; + + case PS_PREPARING: + aPreview = GetPreviewSubstitution( + STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION, + ePreviewSize); + break; + + case PS_CREATABLE: + aPreview = GetPreviewSubstitution( + STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION, + ePreviewSize); + break; + + case PS_NOT_AVAILABLE: + aPreview = GetPreviewSubstitution( + STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION, + ePreviewSize); + if (ePreviewSize == SMALL) + pDescriptor->maSmallPreview = aPreview; + else + pDescriptor->maLargePreview = aPreview; + break; + } + } + + return aPreview; +} + +MasterPageContainer::PreviewState MasterPageContainer::Implementation::GetPreviewState ( + Token aToken) const +{ + const ::osl::MutexGuard aGuard (maMutex); + + PreviewState eState (PS_NOT_AVAILABLE); + + SharedMasterPageDescriptor pDescriptor = GetDescriptor(aToken); + if (pDescriptor) + { + if (pDescriptor->maLargePreview.GetSizePixel().Width() != 0) + eState = PS_AVAILABLE; + else if (pDescriptor->mpPreviewProvider != nullptr) + { + // The preview does not exist but can be created. When that is + // not expensive then do it at once. + if (mpRequestQueue->HasRequest(aToken)) + eState = PS_PREPARING; + else + eState = PS_CREATABLE; + } + else + eState = PS_NOT_AVAILABLE; + } + + return eState; +} + +bool MasterPageContainer::Implementation::RequestPreview (Token aToken) +{ + SharedMasterPageDescriptor pDescriptor = GetDescriptor(aToken); + if (pDescriptor) + return mpRequestQueue->RequestPreview(pDescriptor); + else + return false; +} + +Reference MasterPageContainer::Implementation::GetModel() +{ + const ::osl::MutexGuard aGuard (maMutex); + + if ( ! mxModel.is()) + { + // Create a new model. + mxModel.set( + ::comphelper::getProcessServiceFactory()->createInstance( + "com.sun.star.presentation.PresentationDocument"), + uno::UNO_QUERY); + + // Initialize the model. + uno::Reference xLoadable (mxModel,uno::UNO_QUERY); + if (xLoadable.is()) + xLoadable->initNew(); + + // Use its tunnel to get a pointer to its core implementation. + uno::Reference xUnoTunnel (mxModel, uno::UNO_QUERY); + if (auto pSdXImpressDocument = comphelper::getFromUnoTunnel(xUnoTunnel)) + { + mpDocument = pSdXImpressDocument->GetDoc(); + } + + // Create a default page. + uno::Reference xSlideSupplier (mxModel, uno::UNO_QUERY); + if (xSlideSupplier.is()) + { + uno::Reference xSlides = + xSlideSupplier->getDrawPages(); + if (xSlides.is()) + { + uno::Reference xNewPage (xSlides->insertNewByIndex(0)); + uno::Reference xProperties(xNewPage, uno::UNO_QUERY); + if (xProperties.is()) + xProperties->setPropertyValue( + "Layout", + Any(sal_Int16(AUTOLAYOUT_TITLE))); + } + } + } + return mxModel; +} + +SdDrawDocument* MasterPageContainer::Implementation::GetDocument() +{ + GetModel(); + return mpDocument; +} + +Image MasterPageContainer::Implementation::GetPreviewSubstitution ( + TranslateId pId, + PreviewSize ePreviewSize) +{ + const ::osl::MutexGuard aGuard (maMutex); + + Image aPreview; + + if (pId == STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION) + { + Image& rPreview (ePreviewSize==SMALL + ? maSmallPreviewBeingCreated + : maLargePreviewBeingCreated); + if (rPreview.GetSizePixel().Width() == 0) + { + rPreview = maPreviewRenderer.RenderSubstitution( + ePreviewSize==SMALL ? maSmallPreviewSizePixel : maLargePreviewSizePixel, + SdResId(STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION)); + } + aPreview = rPreview; + } + else if (pId == STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION) + { + Image& rPreview (ePreviewSize==SMALL + ? maSmallPreviewNotAvailable + : maLargePreviewNotAvailable); + if (rPreview.GetSizePixel().Width() == 0) + { + rPreview = maPreviewRenderer.RenderSubstitution( + ePreviewSize==SMALL ? maSmallPreviewSizePixel : maLargePreviewSizePixel, + SdResId(STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION)); + } + aPreview = rPreview; + } + + return aPreview; +} + +void MasterPageContainer::Implementation::CleanContainer() +{ + // Remove the empty elements at the end of the container. The empty + // elements in the middle can not be removed because that would + // invalidate the references still held by others. + int nIndex (maContainer.size()-1); + while (nIndex>=0 && !maContainer[nIndex]) + --nIndex; + maContainer.resize(++nIndex); +} + +void MasterPageContainer::Implementation::FireContainerChange ( + MasterPageContainerChangeEvent::EventType eType, + Token aToken) +{ + ::std::vector> aCopy(maChangeListeners); + MasterPageContainerChangeEvent aEvent; + aEvent.meEventType = eType; + aEvent.maChildToken = aToken; + for (const auto& rListener : aCopy) + rListener.Call(aEvent); +} + +bool MasterPageContainer::Implementation::UpdateDescriptor ( + const SharedMasterPageDescriptor& rpDescriptor, + bool bForcePageObject, + bool bForcePreview, + bool bSendEvents) +{ + const ::osl::MutexGuard aGuard (maMutex); + + // We have to create the page object when the preview provider needs it + // and the caller needs the preview. + bForcePageObject |= (bForcePreview + && rpDescriptor->mpPreviewProvider->NeedsPageObject() + && rpDescriptor->mpMasterPage==nullptr); + + // Define a cost threshold so that an update or page object or preview + // that is at least this cost are made at once. Updates with higher cost + // are scheduled for later. + sal_Int32 nCostThreshold (mpRequestQueue->IsEmpty() ? 5 : 0); + + // Update the page object (which may be used for the preview update). + if (bForcePageObject) + GetDocument(); + int nPageObjectModified (rpDescriptor->UpdatePageObject( + (bForcePageObject ? -1 : nCostThreshold), + mpDocument)); + if (nPageObjectModified == 1 && bSendEvents) + FireContainerChange( + MasterPageContainerChangeEvent::EventType::DATA_CHANGED, + rpDescriptor->maToken); + if (nPageObjectModified == -1 && bSendEvents) + FireContainerChange( + MasterPageContainerChangeEvent::EventType::CHILD_REMOVED, + rpDescriptor->maToken); + if (nPageObjectModified && ! mbFirstPageObjectSeen) + UpdatePreviewSizePixel(); + + // Update the preview. + bool bPreviewModified (rpDescriptor->UpdatePreview( + (bForcePreview ? -1 : nCostThreshold), + maSmallPreviewSizePixel, + maLargePreviewSizePixel, + maPreviewRenderer)); + + if (bPreviewModified && bSendEvents) + FireContainerChange( + MasterPageContainerChangeEvent::EventType::PREVIEW_CHANGED, + rpDescriptor->maToken); + + return nPageObjectModified || bPreviewModified; +} + +void MasterPageContainer::Implementation::ReleaseDescriptor (Token aToken) +{ + if (aToken>=0 && o3tl::make_unsigned(aToken)ProcessAllRequests(); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainer.hxx b/sd/source/ui/sidebar/MasterPageContainer.hxx new file mode 100644 index 0000000000..9de4eb6bc8 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainer.hxx @@ -0,0 +1,199 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +class SdPage; + +namespace sd::sidebar +{ +class MasterPageDescriptor; +class MasterPageContainerChangeEvent; + +/** This container manages the master pages used by the MasterPagesSelector + controls. It uses internally a singleton implementation object. + Therefore, all MasterPageContainer object operator on the same set of + master pages. Each MasterPageContainer, however, has its own + PreviewSize value and thus can independently switch between large and + small previews. + + The container maintains its own document to store master page objects. + + For each master page container stores its URL, preview bitmap, page + name, and, if available, the page object. + + Entries are accessed via a Token, which is mostly a numerical index but + whose values do not necessarily have to be consecutive. +*/ +class MasterPageContainer final +{ +public: + typedef int Token; + static const Token NIL_TOKEN = -1; + + MasterPageContainer(); + ~MasterPageContainer(); + + void AddChangeListener(const Link& rLink); + void RemoveChangeListener(const Link& rLink); + + enum PreviewSize + { + SMALL, + LARGE + }; + /** There are two different preview sizes, a small one and a large one. + Which one is used by the called container can be changed with this + method. + When the preview size is changed then all change listeners are + notified of this. + */ + void SetPreviewSize(PreviewSize eSize); + + /** Returns the preview size. + */ + PreviewSize GetPreviewSize() const { return mePreviewSize; } + + /** Return the preview size in pixels. + */ + Size const& GetPreviewSizePixel() const; + + enum PreviewState + { + PS_AVAILABLE, + PS_CREATABLE, + PS_PREPARING, + PS_NOT_AVAILABLE + }; + PreviewState GetPreviewState(Token aToken); + + /** This method is typically called for entries in the container for + which GetPreviewState() returns OS_CREATABLE. The creation of the + preview is then scheduled to be executed asynchronously at a later + point in time. When the preview is available the change listeners + will be notified. + */ + bool RequestPreview(Token aToken); + + /** Each entry of the container is either the first page of a template + document or is a master page of an Impress document. + */ + enum Origin + { + MASTERPAGE, // Master page of a document. + TEMPLATE, // First page of a template file. + DEFAULT, // Empty master page with default style. + UNKNOWN + }; + + /** Put the master page identified and described by the given parameters + into the container. When there already is a master page with the + given URL, page name, or object pointer (when that is not NULL) then + the existing entry is replaced/updated by the given one. Otherwise + a new entry is inserted. + */ + Token PutMasterPage(const std::shared_ptr& rDescriptor); + void AcquireToken(Token aToken); + void ReleaseToken(Token aToken); + + /** This and the GetTokenForIndex() methods can be used to iterate over + all members of the container. + */ + int GetTokenCount() const; + + /** Determine whether the container has a member for the given token. + */ + bool HasToken(Token aToken) const; + + /** Return a token for an index in the range + 0 <= index < GetTokenCount(). + */ + Token GetTokenForIndex(int nIndex); + + Token GetTokenForURL(const OUString& sURL); + Token GetTokenForStyleName(const OUString& sStyleName); + Token GetTokenForPageObject(const SdPage* pPage); + + OUString GetURLForToken(Token aToken); + OUString GetPageNameForToken(Token aToken); + OUString GetStyleNameForToken(Token aToken); + SdPage* GetPageObjectForToken(Token aToken, bool bLoad); + Origin GetOriginForToken(Token aToken); + sal_Int32 GetTemplateIndexForToken(Token aToken); + std::shared_ptr GetDescriptorForToken(Token aToken); + + void InvalidatePreview(Token aToken); + + /** Return a preview for the specified token. When the preview is not + present then the PreviewProvider associated with the token is + executed only when that is not expensive. It is the responsibility + of the caller to call RequestPreview() to do the same + (asynchronously) for expensive PreviewProviders. + Call GetPreviewState() to find out if that is necessary. + @param aToken + This token specifies for which master page to return the preview. + Tokens are returned for example by the GetTokenFor...() methods. + @return + The returned image is the requested preview or a substitution. + */ + Image GetPreviewForToken(Token aToken); + +private: + class Implementation; + std::shared_ptr mpImpl; + PreviewSize mePreviewSize; +}; + +/** For some changes to the set of master pages in a MasterPageContainer or + to the data stored for each master page one or more events are sent to + registered listeners. + Each event has an event type and a token that tells the listener where + the change took place. +*/ +class MasterPageContainerChangeEvent +{ +public: + enum class EventType + { + // A master page was added to the container. + CHILD_ADDED, + // A master page was removed from the container. + CHILD_REMOVED, + // The preview of a master page has changed. + PREVIEW_CHANGED, + // The size of a preview has changed. + SIZE_CHANGED, + // Some of the data stored for a master page has changed. + DATA_CHANGED, + // The TemplateIndex of a master page has changed. + INDEX_CHANGED, + } meEventType; + + // Token of the container entry whose data changed or which was added or + // removed. + MasterPageContainer::Token maChildToken; +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainerFiller.cxx b/sd/source/ui/sidebar/MasterPageContainerFiller.cxx new file mode 100644 index 0000000000..3568d9c715 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainerFiller.cxx @@ -0,0 +1,168 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "MasterPageContainerFiller.hxx" + +#include "MasterPageDescriptor.hxx" +#include "MasterPageContainerProviders.hxx" +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::sidebar { + +MasterPageContainerFiller::MasterPageContainerFiller (ContainerAdapter& rpAdapter) + : mrContainerAdapter(rpAdapter), + meState(INITIALIZE_TEMPLATE_SCANNER), + mpLastAddedEntry(nullptr), + mnIndex(1) +{ + // Add one entry for the default master page. We use temporarily the + // DefaultPagePreviewProvider to prevent the rendering (and the + // expensive creation) of the default page. It is replaced later on by + // another. + SharedMasterPageDescriptor pDescriptor = std::make_shared( + MasterPageContainer::DEFAULT, + 0, + OUString(), + OUString(), + OUString(), + false, + std::make_shared(), + std::make_shared()); + mrContainerAdapter.PutMasterPage(pDescriptor); +} + +MasterPageContainerFiller::~MasterPageContainerFiller() +{ +} + +void MasterPageContainerFiller::RunNextStep() +{ + switch (meState) + { + case INITIALIZE_TEMPLATE_SCANNER: + mpScannerTask.reset(new TemplateScanner()); + meState = SCAN_TEMPLATE; + break; + + case SCAN_TEMPLATE: + meState = ScanTemplate(); + break; + + case ADD_TEMPLATE: + meState = AddTemplate(); + break; + + case DONE: + case ERROR: + default: + break; + } + + // When the state has just been set to DONE or ERROR then tell the + // container that no more templates will be coming and stop the + // scanning. + switch (meState) + { + case DONE: + case ERROR: + if (mpScannerTask != nullptr) + { + mrContainerAdapter.FillingDone(); + mpScannerTask.reset(); + } + break; + default: + break; + } +} + +bool MasterPageContainerFiller::HasNextStep() +{ + switch (meState) + { + case DONE: + case ERROR: + return false; + + default: + return true; + } +} + +MasterPageContainerFiller::State MasterPageContainerFiller::ScanTemplate() +{ + State eState (ERROR); + + if (mpScannerTask != nullptr) + { + if (mpScannerTask->HasNextStep()) + { + mpScannerTask->RunNextStep(); + if (mpScannerTask->GetLastAddedEntry() != mpLastAddedEntry) + { + mpLastAddedEntry = mpScannerTask->GetLastAddedEntry(); + if (mpLastAddedEntry != nullptr) + eState = ADD_TEMPLATE; + else + eState = SCAN_TEMPLATE; + } + else + eState = SCAN_TEMPLATE; + } + else + eState = DONE; + } + + return eState; +} + +MasterPageContainerFiller::State MasterPageContainerFiller::AddTemplate() +{ + if (mpLastAddedEntry != nullptr) + { + SharedMasterPageDescriptor pDescriptor = std::make_shared( + MasterPageContainer::TEMPLATE, + mnIndex, + mpLastAddedEntry->msPath, + mpLastAddedEntry->msTitle, + OUString(), + false, + std::make_shared(mpLastAddedEntry->msPath), + std::make_shared(mpLastAddedEntry->msPath)); + // For user supplied templates we use a different preview provider: + // The preview in the document shows not only shapes on the master + // page but also shapes on the foreground. This is misleading and + // therefore these previews are discarded and created directly from + // the page objects. + if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER) + pDescriptor->mpPreviewProvider = std::make_shared(); + + mrContainerAdapter.PutMasterPage(pDescriptor); + ++mnIndex; + } + + return SCAN_TEMPLATE; +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainerFiller.hxx b/sd/source/ui/sidebar/MasterPageContainerFiller.hxx new file mode 100644 index 0000000000..b08452ab68 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainerFiller.hxx @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "MasterPageContainer.hxx" +#include "MasterPageDescriptor.hxx" +#include + +namespace sd +{ +class TemplateScanner; +class TemplateEntry; +} + +namespace sd::sidebar +{ +/** Fill a MasterPageContainer with information about the available master + pages. These are provided by one default page and from the existing + Impress templates. This is done asynchronously. +*/ +class MasterPageContainerFiller : public ::sd::tools::AsynchronousTask +{ +public: + class ContainerAdapter + { + public: + virtual MasterPageContainer::Token + PutMasterPage(const SharedMasterPageDescriptor& rpDescriptor) + = 0; + /** This method is called when all Impress templates have been added + to the container via the PutMasterPage() method. + */ + virtual void FillingDone() = 0; + + protected: + ~ContainerAdapter() {} + }; + + explicit MasterPageContainerFiller(ContainerAdapter& rContainerAdapter); + virtual ~MasterPageContainerFiller(); + + /** Run the next step of the task. After HasNextStep() returns false + this method should ignore further calls. + */ + virtual void RunNextStep() override; + + /** Return when there is at least one more step to execute. + When the task has been executed completely then is + returned. + */ + virtual bool HasNextStep() override; + +private: + ContainerAdapter& mrContainerAdapter; + // Remember what the next step has to do. + enum State + { + INITIALIZE_TEMPLATE_SCANNER, + SCAN_TEMPLATE, + ADD_TEMPLATE, + ERROR, + DONE + } meState; + ::std::unique_ptr mpScannerTask; + const TemplateEntry* mpLastAddedEntry; + int mnIndex; + + State ScanTemplate(); + State AddTemplate(); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainerProviders.cxx b/sd/source/ui/sidebar/MasterPageContainerProviders.cxx new file mode 100644 index 0000000000..fecd93f36f --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainerProviders.cxx @@ -0,0 +1,206 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "MasterPageContainerProviders.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::sidebar { + +//===== PagePreviewProvider =================================================== + +PagePreviewProvider::PagePreviewProvider() +{ +} + +Image PagePreviewProvider::operator () ( + int nWidth, + SdPage* pPage, + ::sd::PreviewRenderer& rRenderer) +{ + Image aPreview; + + if (pPage != nullptr) + { + // Use the given renderer to create a preview of the given page + // object. + aPreview = rRenderer.RenderPage( + pPage, + nWidth); + } + + return aPreview; +} + +int PagePreviewProvider::GetCostIndex() +{ + return 5; +} + +bool PagePreviewProvider::NeedsPageObject() +{ + return true; +} + +//===== TemplatePreviewProvider =============================================== + +TemplatePreviewProvider::TemplatePreviewProvider (OUString sURL) + : msURL(std::move(sURL)) +{ +} + +Image TemplatePreviewProvider::operator() ( + int, + SdPage*, + ::sd::PreviewRenderer&) +{ + return Image(ThumbnailView::readThumbnail(msURL)); +} + +int TemplatePreviewProvider::GetCostIndex() +{ + return 10; +} + +bool TemplatePreviewProvider::NeedsPageObject() +{ + return false; +} + +//===== TemplatePageObjectProvider ============================================= + +TemplatePageObjectProvider::TemplatePageObjectProvider (OUString sURL) + : msURL(std::move(sURL)) +{ +} + +SdPage* TemplatePageObjectProvider::operator() (SdDrawDocument*) +{ + SdPage* pPage = nullptr; + + mxDocumentShell = nullptr; + try + { + // Load the template document and return its first page. + ::sd::DrawDocShell* pDocumentShell = LoadDocument (msURL); + if (pDocumentShell != nullptr) + { + SdDrawDocument* pDocument = pDocumentShell->GetDoc(); + if (pDocument != nullptr) + { + pPage = pDocument->GetMasterSdPage(0, PageKind::Standard); + // In order to make the newly loaded master page deletable + // when copied into documents it is marked as no "precious". + // When it is modified then it is marked as "precious". + if (pPage != nullptr) + pPage->SetPrecious(false); + } + } + } + catch (const uno::RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + pPage = nullptr; + } + + return pPage; +} + +::sd::DrawDocShell* TemplatePageObjectProvider::LoadDocument (const OUString& sFileName) +{ + SfxApplication* pSfxApp = SfxGetpApp(); + std::unique_ptr pSet(new SfxAllItemSet (pSfxApp->GetPool())); + pSet->Put (SfxBoolItem (SID_TEMPLATE, true)); + pSet->Put (SfxBoolItem (SID_PREVIEW, true)); + if (pSfxApp->LoadTemplate (mxDocumentShell, sFileName, std::move(pSet))) + { + mxDocumentShell = nullptr; + } + SfxObjectShell* pShell = mxDocumentShell; + return dynamic_cast< ::sd::DrawDocShell *>( pShell ); +} + +int TemplatePageObjectProvider::GetCostIndex() +{ + return 20; +} + +//===== DefaultPageObjectProvider ============================================== + +DefaultPageObjectProvider::DefaultPageObjectProvider() +{ +} + +SdPage* DefaultPageObjectProvider::operator () (SdDrawDocument* pContainerDocument) +{ + SdPage* pLocalMasterPage = nullptr; + if (pContainerDocument != nullptr) + { + SdPage* pLocalSlide = pContainerDocument->GetSdPage(0, PageKind::Standard); + if (pLocalSlide!=nullptr && pLocalSlide->TRG_HasMasterPage()) + pLocalMasterPage = dynamic_cast(&pLocalSlide->TRG_GetMasterPage()); + } + + if (pLocalMasterPage == nullptr) + { + SAL_WARN( "sd", "can not create master page for slide"); + } + + return pLocalMasterPage; +} + +int DefaultPageObjectProvider::GetCostIndex() +{ + return 15; +} + +//===== ExistingPageProvider ================================================== + +ExistingPageProvider::ExistingPageProvider (SdPage* pPage) + : mpPage(pPage) +{ +} + +SdPage* ExistingPageProvider::operator() (SdDrawDocument*) +{ + return mpPage; +} + +int ExistingPageProvider::GetCostIndex() +{ + return 0; +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainerProviders.hxx b/sd/source/ui/sidebar/MasterPageContainerProviders.hxx new file mode 100644 index 0000000000..672644a9f6 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainerProviders.hxx @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class Image; +class SdDrawDocument; +class SdPage; +namespace sd +{ +class PreviewRenderer; +} +namespace sd +{ +class DrawDocShell; +} + +namespace sd::sidebar +{ +/** Interface for a provider of page objects. It is used by the + MasterPageDescriptor to create master page objects on demand. +*/ +class PageObjectProvider +{ +public: + /** Return a master page either by returning an already existing one, by + creating a new page, or by loading a document. + @param pDocument + The document of the MasterPageContainer. It may be used to + create new pages. + */ + virtual SdPage* operator()(SdDrawDocument* pDocument) = 0; + + /** An abstract value for the expected cost of providing a master page + object. + @return + A value of 0 represents for the lowest cost, i.e. an almost + immediate return. Positive values stand for higher costs. + Negative values are not supported. + */ + virtual int GetCostIndex() = 0; + +protected: + ~PageObjectProvider() {} +}; + +class PreviewProvider +{ +public: + /** Create a preview image in the specified width. + @param nWidth + Requested width of the preview. The calling method can cope + with other sizes as well but the resulting image quality is + better when the returned image has the requested size. + @param pPage + Page object for which a preview is requested. This may be NULL + when the page object is expensive to get and the PreviewProvider + does not need this object (NeedsPageObject() returns false.) + @param rRenderer + This PreviewRenderer may be used by the PreviewProvider to + create a preview image. + */ + virtual Image operator()(int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) = 0; + + /** Return a value that indicates how expensive the creation of a + preview image is. The higher the returned value the more expensive + is the preview creation. Return 0 when the preview is already + present and can be returned immediately. + */ + virtual int GetCostIndex() = 0; + + /** Return whether the page object passed is necessary to create a + preview. + */ + virtual bool NeedsPageObject() = 0; + +protected: + ~PreviewProvider() {} +}; + +/** Provide previews of existing page objects by rendering them. +*/ +class PagePreviewProvider : public PreviewProvider +{ +public: + PagePreviewProvider(); + virtual ~PagePreviewProvider() {} + virtual Image operator()(int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) override; + virtual int GetCostIndex() override; + virtual bool NeedsPageObject() override; + +private: +}; + +/** Provide master page objects for template documents for which only the + URL is given. +*/ +class TemplatePageObjectProvider : public PageObjectProvider +{ +public: + explicit TemplatePageObjectProvider(OUString sURL); + virtual ~TemplatePageObjectProvider(){}; + virtual SdPage* operator()(SdDrawDocument* pDocument) override; + virtual int GetCostIndex() override; + +private: + OUString msURL; + SfxObjectShellLock mxDocumentShell; + ::sd::DrawDocShell* LoadDocument(const OUString& sFileName); +}; + +/** Provide previews for template documents by loading the thumbnails from + the documents. +*/ +class TemplatePreviewProvider : public PreviewProvider +{ +public: + explicit TemplatePreviewProvider(OUString sURL); + virtual ~TemplatePreviewProvider(){}; + virtual Image operator()(int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) override; + virtual int GetCostIndex() override; + virtual bool NeedsPageObject() override; + +private: + OUString msURL; +}; + +/** Create an empty default master page. +*/ +class DefaultPageObjectProvider : public PageObjectProvider +{ +public: + DefaultPageObjectProvider(); + virtual ~DefaultPageObjectProvider() {} + virtual SdPage* operator()(SdDrawDocument* pDocument) override; + virtual int GetCostIndex() override; +}; + +/** This implementation of the PageObjectProvider simply returns an already + existing master page object. +*/ +class ExistingPageProvider : public PageObjectProvider +{ +public: + explicit ExistingPageProvider(SdPage* pPage); + virtual ~ExistingPageProvider() {} + virtual SdPage* operator()(SdDrawDocument* pDocument) override; + virtual int GetCostIndex() override; + +private: + SdPage* mpPage; +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainerQueue.cxx b/sd/source/ui/sidebar/MasterPageContainerQueue.cxx new file mode 100644 index 0000000000..e65d1861d9 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainerQueue.cxx @@ -0,0 +1,264 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "MasterPageContainerQueue.hxx" +#include "MasterPageContainerProviders.hxx" + +#include + +#include +#include + +namespace sd::sidebar { + +const sal_Int32 MasterPageContainerQueue::snDelayedCreationTimeout (15); +const sal_Int32 MasterPageContainerQueue::snDelayedCreationTimeoutWhenNotIdle (100); +const sal_Int32 MasterPageContainerQueue::snMasterPagePriorityBoost (5); +const sal_Int32 MasterPageContainerQueue::snWaitForMoreRequestsPriorityThreshold (-10); +sal_uInt32 MasterPageContainerQueue::snWaitForMoreRequestsCount(15); + +//===== MasterPageContainerQueue::PreviewCreationRequest ====================== + +class MasterPageContainerQueue::PreviewCreationRequest +{ +public: + PreviewCreationRequest (SharedMasterPageDescriptor pDescriptor, int nPriority) + : mpDescriptor(std::move(pDescriptor)), + mnPriority(nPriority) + {} + SharedMasterPageDescriptor mpDescriptor; + int mnPriority; + class Compare + { + public: + bool operator() (const PreviewCreationRequest& r1,const PreviewCreationRequest& r2) const + { + if (r1.mnPriority != r2.mnPriority) + { + // Prefer requests with higher priority. + return r1.mnPriority > r2.mnPriority; + } + else + { + // Prefer tokens that have been earlier created (those with lower + // value). + return r1.mpDescriptor->maToken < r2.mpDescriptor->maToken; + } + } + }; + class CompareToken + { + public: + MasterPageContainer::Token maToken; + explicit CompareToken(MasterPageContainer::Token aToken) : maToken(aToken) {} + bool operator() (const PreviewCreationRequest& rRequest) const + { return maToken==rRequest.mpDescriptor->maToken; } + }; +}; + +//===== MasterPageContainerQueue::RequestQueue ================================ + +class MasterPageContainerQueue::RequestQueue + : public ::std::set +{ +public: + RequestQueue() {} +}; + +//===== MasterPageContainerQueue ============================================== + +MasterPageContainerQueue* MasterPageContainerQueue::Create ( + const std::weak_ptr& rpContainer) +{ + MasterPageContainerQueue* pQueue = new MasterPageContainerQueue(rpContainer); + pQueue->LateInit(); + return pQueue; +} + +MasterPageContainerQueue::MasterPageContainerQueue ( + std::weak_ptr pContainer) + : mpWeakContainer(std::move(pContainer)), + mpRequestQueue(new RequestQueue()), + maDelayedPreviewCreationTimer("sd MasterPageContainerQueue maDelayedPreviewCreationTimer"), + mnRequestsServedCount(0) +{ +} + +MasterPageContainerQueue::~MasterPageContainerQueue() +{ + maDelayedPreviewCreationTimer.Stop(); + while ( ! mpRequestQueue->empty()) + mpRequestQueue->erase(mpRequestQueue->begin()); +} + +void MasterPageContainerQueue::LateInit() +{ + // Set up the timer for the delayed creation of preview bitmaps. + maDelayedPreviewCreationTimer.SetTimeout (snDelayedCreationTimeout); + maDelayedPreviewCreationTimer.SetInvokeHandler( + LINK(this,MasterPageContainerQueue,DelayedPreviewCreation) ); +} + +bool MasterPageContainerQueue::RequestPreview (const SharedMasterPageDescriptor& rpDescriptor) +{ + bool bSuccess (false); + if (rpDescriptor + && rpDescriptor->maLargePreview.GetSizePixel().Width() == 0) + { + sal_Int32 nPriority (CalculatePriority(rpDescriptor)); + + // Add a new or replace an existing request. + RequestQueue::iterator iRequest (::std::find_if( + mpRequestQueue->begin(), + mpRequestQueue->end(), + PreviewCreationRequest::CompareToken(rpDescriptor->maToken))); + // When a request for the same token exists then the lowest of the + // two priorities is used. + if (iRequest != mpRequestQueue->end()) + if (iRequest->mnPriority < nPriority) + { + mpRequestQueue->erase(iRequest); + iRequest = mpRequestQueue->end(); + } + + // Add a new request when none exists (or has just been erased). + if (iRequest == mpRequestQueue->end()) + { + mpRequestQueue->insert(PreviewCreationRequest(rpDescriptor,nPriority)); + maDelayedPreviewCreationTimer.Start(); + bSuccess = true; + } + } + return bSuccess; +} + +sal_Int32 MasterPageContainerQueue::CalculatePriority ( + const SharedMasterPageDescriptor& rpDescriptor) +{ + sal_Int32 nPriority; + + // The cost is used as a starting value. + int nCost (0); + if (rpDescriptor->mpPreviewProvider != nullptr) + { + nCost = rpDescriptor->mpPreviewProvider->GetCostIndex(); + if (rpDescriptor->mpPreviewProvider->NeedsPageObject()) + if (rpDescriptor->mpPageObjectProvider != nullptr) + nCost += rpDescriptor->mpPageObjectProvider->GetCostIndex(); + } + + // Its negative value is used so that requests with a low cost are + // preferred over those with high costs. + nPriority = -nCost; + + // Add a term that introduces an order based on the appearance in the + // AllMasterPagesSelector. + nPriority -= rpDescriptor->maToken / 3; + + // Process requests for the CurrentMasterPagesSelector first. + if (rpDescriptor->meOrigin == MasterPageContainer::MASTERPAGE) + nPriority += snMasterPagePriorityBoost; + + return nPriority; +} + +IMPL_LINK(MasterPageContainerQueue, DelayedPreviewCreation, Timer*, pTimer, void) +{ + bool bIsShowingFullScreenShow (false); + bool bWaitForMoreRequests (false); + + do + { + if (mpRequestQueue->empty()) + break; + + // First check whether the system is idle. + tools::IdleState nIdleState (tools::IdleDetection::GetIdleState(nullptr)); + if (nIdleState != tools::IdleState::Idle) + { + if (nIdleState & tools::IdleState::FullScreenShowActive) + bIsShowingFullScreenShow = true; + break; + } + + PreviewCreationRequest aRequest (*mpRequestQueue->begin()); + + // Check if the request should really be processed right now. + // Reasons to not do it are when its cost is high and not many other + // requests have been inserted into the queue that would otherwise + // be processed first. + if (aRequest.mnPriority < snWaitForMoreRequestsPriorityThreshold + && (mnRequestsServedCount+mpRequestQueue->size() < snWaitForMoreRequestsCount)) + { + // Wait for more requests before this one is processed. Note + // that the queue processing is not started anew when this + // method is left. That is done when the next request is + // inserted. + bWaitForMoreRequests = true; + break; + } + + mpRequestQueue->erase(mpRequestQueue->begin()); + + if (aRequest.mpDescriptor) + { + mnRequestsServedCount += 1; + if ( ! mpWeakContainer.expired()) + { + std::shared_ptr pContainer (mpWeakContainer); + if (pContainer != nullptr) + pContainer->UpdateDescriptor(aRequest.mpDescriptor,false,true,true); + } + } + } + while (false); + + if (!mpRequestQueue->empty() && ! bWaitForMoreRequests) + { + int nTimeout (snDelayedCreationTimeout); + if (bIsShowingFullScreenShow) + nTimeout = snDelayedCreationTimeoutWhenNotIdle; + maDelayedPreviewCreationTimer.SetTimeout(nTimeout); + pTimer->Start(); + } +} + +bool MasterPageContainerQueue::HasRequest (MasterPageContainer::Token aToken) const +{ + return std::any_of( + mpRequestQueue->begin(), + mpRequestQueue->end(), + PreviewCreationRequest::CompareToken(aToken)); +} + +bool MasterPageContainerQueue::IsEmpty() const +{ + return mpRequestQueue->empty(); +} + +void MasterPageContainerQueue::ProcessAllRequests() +{ + snWaitForMoreRequestsCount = 0; + if (!mpRequestQueue->empty()) + maDelayedPreviewCreationTimer.Start(); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageContainerQueue.hxx b/sd/source/ui/sidebar/MasterPageContainerQueue.hxx new file mode 100644 index 0000000000..d121bf2fcc --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageContainerQueue.hxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "MasterPageContainer.hxx" +#include "MasterPageDescriptor.hxx" + +#include + +#include + +namespace sd::sidebar { + +/** The queue stores and processes all requests from a MasterPageContainer + for the creation of previews. + The order of request processing and its timing is controlled by a + heuristic that uses values given with each request and which is + controlled by various parameters that are described below. +*/ +class MasterPageContainerQueue final +{ +public: + class ContainerAdapter { + public: + virtual bool UpdateDescriptor ( + const SharedMasterPageDescriptor& rpDescriptor, + bool bForcePageObject, + bool bForcePreview, + bool bSendEvents) = 0; + + protected: + ~ContainerAdapter() {} + }; + + static MasterPageContainerQueue* Create ( + const std::weak_ptr& rpContainer); + ~MasterPageContainerQueue(); + + /** This method is typically called for entries in the container for + which GetPreviewState() returns OS_CREATABLE. The creation of the + preview is then scheduled to be executed asynchronously at a later + point in time. When the preview is available the change listeners + will be notified. + */ + bool RequestPreview (const SharedMasterPageDescriptor& rDescriptor); + + /** Return when there is a request currently in the queue for + the given token. + */ + bool HasRequest (MasterPageContainer::Token aToken) const; + + /** Return when there is at least one request in the queue. + */ + bool IsEmpty() const; + + /** After this call the queue does not wait anymore for requests with + higher priority when only a small number of requests with lower + priority are present. This method should be called when all + templates are inserted into the MasterPageContainer. + */ + void ProcessAllRequests(); + +private: + std::weak_ptr mpWeakContainer; + class PreviewCreationRequest; + class RequestQueue; + std::unique_ptr mpRequestQueue; + Timer maDelayedPreviewCreationTimer; + sal_uInt32 mnRequestsServedCount; + + // There are a couple of values that define various aspects of the + // heuristic that defines the order and timing in which requests for + // preview creation are processed. + + /** The time to wait (in milliseconds) between the creation of previews. + */ + static const sal_Int32 snDelayedCreationTimeout; + + /** The time to wait when the system is not idle. + */ + static const sal_Int32 snDelayedCreationTimeoutWhenNotIdle; + + /** Requests for previews of master pages in a document have their + priority increased by this value. + */ + static const sal_Int32 snMasterPagePriorityBoost; + + /** When only requests which a priority lower than this threshold exist + and not many requests have been made yet then wait with processing + them until more requests are present. + */ + static const sal_Int32 snWaitForMoreRequestsPriorityThreshold; + + /** When only requests which a priority lower than a threshold exist + and not more requests than this number have been made or already + processed then wait with processing them until more requests are + present. + */ + static sal_uInt32 snWaitForMoreRequestsCount; + + explicit MasterPageContainerQueue (std::weak_ptr pContainer); + void LateInit(); + + /** Calculate the priority that defines the order in which requests + are processed. + */ + static sal_Int32 CalculatePriority (const SharedMasterPageDescriptor& rDescriptor); + + DECL_LINK(DelayedPreviewCreation, Timer *, void); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageDescriptor.cxx b/sd/source/ui/sidebar/MasterPageDescriptor.cxx new file mode 100644 index 0000000000..549e6c25bd --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageDescriptor.cxx @@ -0,0 +1,342 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "MasterPageDescriptor.hxx" +#include "MasterPageContainerProviders.hxx" + +#include "DocumentHelper.hxx" +#include +#include +#include +#include +#include + +namespace sd::sidebar { + +//===== MasterPageDescriptor ================================================== + +MasterPageDescriptor::MasterPageDescriptor ( + MasterPageContainer::Origin eOrigin, + const sal_Int32 nTemplateIndex, + std::u16string_view rsURL, + OUString sPageName, + OUString sStyleName, + const bool bIsPrecious, + std::shared_ptr pPageObjectProvider, + std::shared_ptr pPreviewProvider) + : maToken(MasterPageContainer::NIL_TOKEN), + meOrigin(eOrigin), + msURL(INetURLObject(rsURL).GetMainURL(INetURLObject::DecodeMechanism::Unambiguous)), + msPageName(std::move(sPageName)), + msStyleName(std::move(sStyleName)), + mbIsPrecious(bIsPrecious), + mpMasterPage(nullptr), + mpSlide(nullptr), + mpPreviewProvider(std::move(pPreviewProvider)), + mpPageObjectProvider(std::move(pPageObjectProvider)), + mnTemplateIndex(nTemplateIndex), + meURLClassification(URLCLASS_UNDETERMINED), + mnUseCount(0) +{ +} + +void MasterPageDescriptor::SetToken (MasterPageContainer::Token aToken) +{ + maToken = aToken; +} + +const Image& MasterPageDescriptor::GetPreview (MasterPageContainer::PreviewSize eSize) const +{ + if (eSize == MasterPageContainer::SMALL) + return maSmallPreview; + else + return maLargePreview; +} + +::std::unique_ptr > + MasterPageDescriptor::Update ( + const MasterPageDescriptor& rDescriptor) +{ + bool bDataChanged (false); + bool bIndexChanged (false); + bool bPreviewChanged (false); + + if (meOrigin==MasterPageContainer::UNKNOWN + && rDescriptor.meOrigin!=MasterPageContainer::UNKNOWN) + { + meOrigin = rDescriptor.meOrigin; + bIndexChanged = true; + } + + if (msURL.isEmpty() && !rDescriptor.msURL.isEmpty()) + { + msURL = rDescriptor.msURL; + bDataChanged = true; + } + + if (msPageName.isEmpty() && !rDescriptor.msPageName.isEmpty()) + { + msPageName = rDescriptor.msPageName; + bDataChanged = true; + } + + if (msStyleName.isEmpty() && !rDescriptor.msStyleName.isEmpty()) + { + msStyleName = rDescriptor.msStyleName; + bDataChanged = true; + } + + if (mpPageObjectProvider == nullptr && rDescriptor.mpPageObjectProvider != nullptr) + { + mpPageObjectProvider = rDescriptor.mpPageObjectProvider; + bDataChanged = true; + } + + if (mpPreviewProvider == nullptr && rDescriptor.mpPreviewProvider != nullptr) + { + mpPreviewProvider = rDescriptor.mpPreviewProvider; + bPreviewChanged = true; + } + + if (mnTemplateIndex<0 && rDescriptor.mnTemplateIndex>=0) + { + mnTemplateIndex = rDescriptor.mnTemplateIndex; + bIndexChanged = true; + } + + // Prepare the list of event types that will be returned. + ::std::unique_ptr > pResult; + if (bDataChanged || bIndexChanged || bPreviewChanged) + { + pResult.reset(new std::vector); + if (bDataChanged) + pResult->push_back(MasterPageContainerChangeEvent::EventType::DATA_CHANGED); + if (bIndexChanged) + pResult->push_back(MasterPageContainerChangeEvent::EventType::INDEX_CHANGED); + if (bPreviewChanged) + pResult->push_back(MasterPageContainerChangeEvent::EventType::PREVIEW_CHANGED); + } + + return pResult; +} + +int MasterPageDescriptor::UpdatePageObject ( + sal_Int32 nCostThreshold, + SdDrawDocument* pDocument) +{ + int nModified = 0; + + // Update the page object when that is not yet known. + if (mpMasterPage == nullptr && mpPageObjectProvider != nullptr + && (nCostThreshold < 0 || mpPageObjectProvider->GetCostIndex() <= nCostThreshold)) + { + // Note that pDocument may be NULL. + + SdPage* pPage = (*mpPageObjectProvider)(pDocument); + if (meOrigin == MasterPageContainer::MASTERPAGE) + { + mpMasterPage = pPage; + if (mpMasterPage != nullptr) + mpMasterPage->SetPrecious(mbIsPrecious); + } + else + { + // Master pages from templates are copied into the local document. + if (pDocument != nullptr) + mpMasterPage = DocumentHelper::CopyMasterPageToLocalDocument(*pDocument,pPage); + mpSlide = DocumentHelper::GetSlideForMasterPage(mpMasterPage); + } + + if (mpMasterPage != nullptr) + { + // Update page name and style name. + if (msPageName.isEmpty()) + msPageName = mpMasterPage->GetName(); + msStyleName = mpMasterPage->GetName(); + + // Delete an existing substitution. The next request for a preview + // will create the real one. + maSmallPreview = Image(); + maLargePreview = Image(); + mpPreviewProvider = std::make_shared(); + } + else + { + SAL_WARN( "sd", "UpdatePageObject: master page is NULL"); + return -1; + } + + nModified = 1; + } + + return nModified; +} + +bool MasterPageDescriptor::UpdatePreview ( + sal_Int32 nCostThreshold, + const Size& rSmallSize, + const Size& rLargeSize, + ::sd::PreviewRenderer& rRenderer) +{ + bool bModified (false); + + // Update the preview when that is not yet known. + if (maLargePreview.GetSizePixel().Width() == 0 && mpPreviewProvider != nullptr + && (nCostThreshold < 0 || mpPreviewProvider->GetCostIndex() <= nCostThreshold)) + { + SdPage* pPage = mpSlide; + if (pPage == nullptr) + { + pPage = mpMasterPage; + } + //TODO: Notify LOOL of preview updates. + maLargePreview = (*mpPreviewProvider)( + rLargeSize.Width(), + pPage, + rRenderer); + if (maLargePreview.GetSizePixel().Width() > 0) + { + // Create the small preview by scaling the large one down. + maSmallPreview = rRenderer.ScaleBitmap( + maLargePreview.GetBitmapEx(), + rSmallSize.Width()); + // The large preview may not have the desired width. Scale it + // accordingly. + if (maLargePreview.GetSizePixel().Width() != rLargeSize.Width()) + maLargePreview = rRenderer.ScaleBitmap( + maLargePreview.GetBitmapEx(), + rLargeSize.Width()); + bModified = true; + } + } + + return bModified; +} + +MasterPageDescriptor::URLClassification MasterPageDescriptor::GetURLClassification() +{ + if (meURLClassification == URLCLASS_UNDETERMINED) + { + if (msURL.isEmpty()) + meURLClassification = URLCLASS_UNKNOWN; + else if (msURL.indexOf("presnt")>=0) + { + meURLClassification = URLCLASS_PRESENTATION; + } + else if (msURL.indexOf("layout")>=0) + { + meURLClassification = URLCLASS_LAYOUT; + } + else if (msURL.indexOf("educate")>=0) + { + meURLClassification = URLCLASS_OTHER; + } + else + { + meURLClassification = URLCLASS_USER; + } + } + + return meURLClassification; +} + +//===== URLComparator ========================================================= + +MasterPageDescriptor::URLComparator::URLComparator (OUString sURL) + : msURL(std::move(sURL)) +{ +} + +bool MasterPageDescriptor::URLComparator::operator() ( + const SharedMasterPageDescriptor& rDescriptor) +{ + if (!rDescriptor) + return false; + else + return rDescriptor->msURL == msURL; +} + +// ===== StyleNameComparator ================================================== + +MasterPageDescriptor::StyleNameComparator::StyleNameComparator (OUString sStyleName) + : msStyleName(std::move(sStyleName)) +{ +} + +bool MasterPageDescriptor::StyleNameComparator::operator() ( + const SharedMasterPageDescriptor& rDescriptor) +{ + if (!rDescriptor) + return false; + else + return rDescriptor->msStyleName == msStyleName; +} + +//===== PageObjectComparator ================================================== + +MasterPageDescriptor::PageObjectComparator::PageObjectComparator (const SdPage* pPageObject) + : mpMasterPage(pPageObject) +{ +} + +bool MasterPageDescriptor::PageObjectComparator::operator() ( + const SharedMasterPageDescriptor& rDescriptor) +{ + if (!rDescriptor) + return false; + else + return rDescriptor->mpMasterPage==mpMasterPage; +} + +//===== AllComparator ========================================================= + +MasterPageDescriptor::AllComparator::AllComparator(SharedMasterPageDescriptor aDescriptor) + : mpDescriptor(std::move(aDescriptor)) +{ +} + +bool MasterPageDescriptor::AllComparator::operator() (const SharedMasterPageDescriptor&rDescriptor) +{ + if (!rDescriptor) + return false; + else + { + // Take URL, page name, style name, and page object into account + // when comparing two descriptors. When two descriptors are + // identical in any of these values then there are thought of as + // equivalent. Only the Origin has to be the same in both + // descriptors. + return mpDescriptor->meOrigin == rDescriptor->meOrigin + && ((!mpDescriptor->msURL.isEmpty() && mpDescriptor->msURL == rDescriptor->msURL) + || (!mpDescriptor->msPageName.isEmpty() + && mpDescriptor->msPageName == rDescriptor->msPageName) + || (!mpDescriptor->msStyleName.isEmpty() + && mpDescriptor->msStyleName == rDescriptor->msStyleName) + || (mpDescriptor->mpMasterPage != nullptr + && mpDescriptor->mpMasterPage == rDescriptor->mpMasterPage) + || (mpDescriptor->mpPageObjectProvider != nullptr + && rDescriptor->mpPageObjectProvider != nullptr + && mpDescriptor->mpPageObjectProvider == rDescriptor->mpPageObjectProvider)); + } +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageDescriptor.hxx b/sd/source/ui/sidebar/MasterPageDescriptor.hxx new file mode 100644 index 0000000000..24e77e65bd --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageDescriptor.hxx @@ -0,0 +1,231 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "MasterPageContainer.hxx" +#include + +namespace sd { class PreviewRenderer; } +class SdDrawDocument; + +namespace sd::sidebar { + +class PageObjectProvider; +class PreviewProvider; + +class MasterPageDescriptor; +typedef std::shared_ptr SharedMasterPageDescriptor; + +/** A collection of data that is stored for every master page in the + MasterpageContainer. +*/ +class MasterPageDescriptor +{ +public: + MasterPageDescriptor ( + MasterPageContainer::Origin eOrigin, + const sal_Int32 nTemplateIndex, + std::u16string_view rURL, + OUString sPageName, + OUString sStyleName, + const bool bIsPrecious, + std::shared_ptr pPageObjectProvider, + std::shared_ptr pPreviewProvider); + + void SetToken (MasterPageContainer::Token aToken); + + /** Update the called MasterPageDescriptor object with values from the + given one. Only those values are updated that have default values + in the called object and that have non-default values in the given + one. + @return + Returns a list of event types for which event notifications have + to be sent to listeners. The list may be empty or NULL. + */ + ::std::unique_ptr > + Update ( + const MasterPageDescriptor& rDescriptor); + + /** This convenience method returns either a small or a large preview, + depending on the given size specifier. + Note that the previews are not created when they are not present. + @return + The returned preview may be empty. + */ + const Image& GetPreview (MasterPageContainer::PreviewSize ePreviewSize) const; + + /** Use the PreviewProvider to get access to a preview of the master + page. + + Note that this is only done, when either bForce is or + the PreviewProvider::GetCostIndex() returns 0. + + The small preview is created by scaling the large one, not by + calling PreviewProvider::operator() a second time. + + It is the responsibility of the caller to call UpdatePageObject() + before calling this method when the PreviewProvider can only work + when the master page object is present, i.e. its NeedsPageObject() + method returns . + + @param nCostThreshold + When this is zero or positive then the preview is created only + when the preview provider has a cost equal to or smaller than + this threshold. A negative value forces the preview to be + created, regardless of the cost. + @param rSmallSize + Size of the small preview. + @param rLargeSize + Size of the large preview. + @param rRenderer + A PreviewRenderer object that may be used to create a preview. + @return + When the previews are successfully provided then is + returned. + */ + bool UpdatePreview ( + sal_Int32 nCostThreshold, + const Size& rSmallSize, + const Size& rLargeSize, + ::sd::PreviewRenderer& rRenderer); + + /** Use the PageObjectProvider to get access to the master page object. + + Note that this is only done, when either bForce is or the + PreviewProvider::GetCostIndex() returns 0. + + @param nCostThreshold + When this is zero or positive then the page object is created + only when the page object provider has a cost equal to or + smaller than this threshold. A negative value forces the + page object be created, regardless of the cost. + @param pDocument + This document of the MasterPageContainer may be used to create + a page object with or store one in. + @return + When the master page object is successfully provided then + 1 is returned, on no change then a 0 is provided, + on a masterpage-error a -1 is provided. + */ + int UpdatePageObject ( + sal_Int32 nCostThreshold, + SdDrawDocument* pDocument); + + enum URLClassification { + URLCLASS_USER, + URLCLASS_LAYOUT, + URLCLASS_PRESENTATION, + URLCLASS_OTHER, + URLCLASS_UNKNOWN, + URLCLASS_UNDETERMINED + }; + + URLClassification GetURLClassification(); + + /** The Token under which the MasterPageContainer gives access to the + object. + */ + MasterPageContainer::Token maToken; + + /** A rough specification of the origin of the master page. + */ + MasterPageContainer::Origin meOrigin; + + /** The URL is not empty for master pages loaded from a template + document. + */ + OUString msURL; + + /** Taken from the title of the template file. + */ + OUString msPageName; + + /** Taken from the master page object. + */ + OUString msStyleName; + + const bool mbIsPrecious; + + /** The actual master page. + */ + SdPage* mpMasterPage; + + /** A slide that uses the master page. + */ + SdPage* mpSlide; + + /** A small (the default size) preview of the master page. May be + empty. When this smaller preview is not empty then the larger one + is not empty, too. + */ + Image maSmallPreview; + + /** A large preview of the master page. May be empty. When this larger + preview is not empty then the smaller one is not empty, too. + */ + Image maLargePreview; + + /** The preview provider. May be empty. May be replaced during the + lifetime of a MasterPageDescriptor object. + */ + std::shared_ptr mpPreviewProvider; + + /** The master page provider. May be empty. May be replaced during + the lifetime of a MasterPageDescriptor object. + */ + std::shared_ptr mpPageObjectProvider; + + /** This index represents the order in which templates are provided via + the TemplateScanner. It defines the order in which the entries in + the AllMasterPagesSelector are displayed. The default value is -1. + */ + sal_Int32 mnTemplateIndex; + + URLClassification meURLClassification; + + sal_Int32 mnUseCount; + + class URLComparator { public: + OUString msURL; + explicit URLComparator (OUString sURL); + bool operator() (const SharedMasterPageDescriptor& rDescriptor); + }; + class StyleNameComparator { public: + OUString msStyleName; + explicit StyleNameComparator (OUString sStyleName); + bool operator() (const SharedMasterPageDescriptor& rDescriptor); + }; + class PageObjectComparator { public: + const SdPage* mpMasterPage; + explicit PageObjectComparator (const SdPage* pPageObject); + bool operator() (const SharedMasterPageDescriptor& rDescriptor); + }; + class AllComparator { public: + explicit AllComparator(SharedMasterPageDescriptor aDescriptor); + bool operator() (const SharedMasterPageDescriptor& rDescriptor); + private: + SharedMasterPageDescriptor mpDescriptor; + }; + +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPageObserver.cxx b/sd/source/ui/sidebar/MasterPageObserver.cxx new file mode 100644 index 0000000000..724b7b5e8f --- /dev/null +++ b/sd/source/ui/sidebar/MasterPageObserver.cxx @@ -0,0 +1,297 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +class MasterPageObserver::Implementation + : public SfxListener +{ +public: + /** The master page observer will listen to events of this document and + detect changes of the use of master pages. + */ + void RegisterDocument (SdDrawDocument& rDocument); + + /** The master page observer will stop to listen to events of this + document. + */ + void UnregisterDocument (SdDrawDocument& rDocument); + + /** Add a listener that is informed of master pages that are newly + assigned to slides or become unassigned. + @param rEventListener + The event listener to call for future events. Call + RemoveEventListener() before the listener is destroyed. + */ + void AddEventListener (const Link& rEventListener); + + /** Remove the given listener from the list of listeners. + @param rEventListener + After this method returns the given listener is not called back + from this object. Passing a listener that has not + been registered before is safe and is silently ignored. + */ + void RemoveEventListener (const Link& rEventListener); + +private: + ::std::vector> maListeners; + + struct DrawDocHash { + size_t operator()(SdDrawDocument* argument) const + { return reinterpret_cast(argument); } + }; + typedef std::unordered_map + MasterPageContainer; + MasterPageContainer maUsedMasterPages; + + virtual void Notify( + SfxBroadcaster& rBroadcaster, + const SfxHint& rHint) override; + + void AnalyzeUsedMasterPages (SdDrawDocument& rDocument); + + void SendEvent (MasterPageObserverEvent& rEvent); +}; + +//===== MasterPageObserver ==================================================== + +MasterPageObserver& MasterPageObserver::Instance() +{ + static MasterPageObserver* gInstance = []() + { + MasterPageObserver* pInstance = new MasterPageObserver (); + SdGlobalResourceContainer::Instance().AddResource ( + ::std::unique_ptr(pInstance)); + return pInstance; + }(); + return *gInstance; +} + +void MasterPageObserver::RegisterDocument (SdDrawDocument& rDocument) +{ + mpImpl->RegisterDocument (rDocument); +} + +void MasterPageObserver::UnregisterDocument (SdDrawDocument& rDocument) +{ + mpImpl->UnregisterDocument (rDocument); +} + +void MasterPageObserver::AddEventListener (const Link& rEventListener) +{ + + mpImpl->AddEventListener (rEventListener); +} + +void MasterPageObserver::RemoveEventListener (const Link& rEventListener) +{ + mpImpl->RemoveEventListener (rEventListener); +} + +MasterPageObserver::MasterPageObserver() + : mpImpl (new Implementation) +{} + +MasterPageObserver::~MasterPageObserver() +{} + +//===== MasterPageObserver::Implementation ==================================== + +void MasterPageObserver::Implementation::RegisterDocument ( + SdDrawDocument& rDocument) +{ + // Gather the names of all the master pages in the given document. + MasterPageContainer::mapped_type aMasterPageSet; + sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PageKind::Standard); + for (sal_uInt16 nIndex=0; nIndexGetName()); + } + + bool bAlreadyExists = maUsedMasterPages.find(&rDocument) != maUsedMasterPages.end(); + maUsedMasterPages[&rDocument] = aMasterPageSet; + + if (!bAlreadyExists) + StartListening (rDocument); +} + +void MasterPageObserver::Implementation::UnregisterDocument ( + SdDrawDocument& rDocument) +{ + EndListening (rDocument); + + MasterPageContainer::iterator aMasterPageDescriptor(maUsedMasterPages.find(&rDocument)); + if(aMasterPageDescriptor != maUsedMasterPages.end()) + maUsedMasterPages.erase(aMasterPageDescriptor); +} + +void MasterPageObserver::Implementation::AddEventListener ( + const Link& rEventListener) +{ + if (::std::find ( + maListeners.begin(), + maListeners.end(), + rEventListener) != maListeners.end()) + return; + + maListeners.push_back (rEventListener); + + // Tell the new listener about all the master pages that are + // currently in use. + for (const auto& rDocument : maUsedMasterPages) + { + ::std::set::reverse_iterator aNameIterator; + for (aNameIterator=rDocument.second.rbegin(); + aNameIterator!=rDocument.second.rend(); + ++aNameIterator) + { + MasterPageObserverEvent aEvent ( + MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS, + *aNameIterator); + SendEvent (aEvent); + } + } +} + +void MasterPageObserver::Implementation::RemoveEventListener ( + const Link& rEventListener) +{ + maListeners.erase ( + ::std::find ( + maListeners.begin(), + maListeners.end(), + rEventListener)); +} + +void MasterPageObserver::Implementation::Notify( + SfxBroadcaster& rBroadcaster, + const SfxHint& rHint) +{ + if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint) + return; + const SdrHint* pSdrHint = static_cast(&rHint); + + switch (pSdrHint->GetKind()) + { + case SdrHintKind::PageOrderChange: + // Process the modified set of pages only when the number of + // standard and notes master pages are equal. This test + // filters out events that are sent in between the insertion + // of a new standard master page and a new notes master + // page. + if (auto pDrawDocument = dynamic_cast( &rBroadcaster )) + { + if (pDrawDocument->GetMasterSdPageCount(PageKind::Standard) + == pDrawDocument->GetMasterSdPageCount(PageKind::Notes)) + { + AnalyzeUsedMasterPages (*pDrawDocument); + } + } + break; + + default: + break; + } +} + +void MasterPageObserver::Implementation::AnalyzeUsedMasterPages ( + SdDrawDocument& rDocument) +{ + // Create a set of names of the master pages used by the given document. + sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PageKind::Standard); + ::std::set aCurrentMasterPages; + for (sal_uInt16 nIndex=0; nIndexGetName()); + } + + std::vector aNewMasterPages; + std::vector aRemovedMasterPages; + MasterPageContainer::iterator aOldMasterPagesDescriptor ( + maUsedMasterPages.find(&rDocument)); + if (aOldMasterPagesDescriptor == maUsedMasterPages.end()) + return; + + // Send events about the newly used master pages. + ::std::set_difference ( + aCurrentMasterPages.begin(), + aCurrentMasterPages.end(), + aOldMasterPagesDescriptor->second.begin(), + aOldMasterPagesDescriptor->second.end(), + std::back_inserter(aNewMasterPages)); + for (const auto& aNewMasterPage : aNewMasterPages) + { + MasterPageObserverEvent aEvent ( + MasterPageObserverEvent::ET_MASTER_PAGE_ADDED, + aNewMasterPage); + SendEvent (aEvent); + } + + // Send events about master pages that are not used any longer. + ::std::set_difference ( + aOldMasterPagesDescriptor->second.begin(), + aOldMasterPagesDescriptor->second.end(), + aCurrentMasterPages.begin(), + aCurrentMasterPages.end(), + std::back_inserter(aRemovedMasterPages)); + for (const auto& aRemovedMasterPage : aRemovedMasterPages) + { + MasterPageObserverEvent aEvent ( + MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED, + aRemovedMasterPage); + SendEvent (aEvent); + } + + // Store the new list of master pages. + aOldMasterPagesDescriptor->second = aCurrentMasterPages; +} + +void MasterPageObserver::Implementation::SendEvent ( + MasterPageObserverEvent& rEvent) +{ + for (const auto& aLink : maListeners) + { + aLink.Call(rEvent); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPagesSelector.cxx b/sd/source/ui/sidebar/MasterPagesSelector.cxx new file mode 100644 index 0000000000..5be2e73cd0 --- /dev/null +++ b/sd/source/ui/sidebar/MasterPagesSelector.cxx @@ -0,0 +1,620 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include "MasterPagesSelector.hxx" + +#include "MasterPageContainer.hxx" +#include "DocumentHelper.hxx" +#include +#include +#include +#include + +#include +#include +#include "PreviewValueSet.hxx" +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::text; + +namespace sd::sidebar { + + /** menu entry that is executed as default action when the left mouse button is + clicked over a master page. + */ +constexpr OUStringLiteral gsDefaultClickAction = u"applyselect"; + +MasterPagesSelector::MasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + std::shared_ptr pContainer, + css::uno::Reference xSidebar, + const OUString& rUIFileName, + const OUString& rValueSetName) + : PanelLayout( pParent, "MasterPagePanel", rUIFileName ), + mpContainer(std::move(pContainer)), + mxPreviewValueSet(new PreviewValueSet), + mxPreviewValueSetWin(new weld::CustomWeld(*m_xBuilder, rValueSetName, *mxPreviewValueSet)), + mrDocument(rDocument), + mrBase(rBase), + mxSidebar(std::move(xSidebar)) +{ + mxPreviewValueSet->SetSelectHdl ( + LINK(this, MasterPagesSelector, ClickHandler)); + mxPreviewValueSet->SetContextMenuHandler ( + LINK(this, MasterPagesSelector, ContextMenuHandler)); + mxPreviewValueSet->SetStyle(mxPreviewValueSet->GetStyle() | WB_NO_DIRECTSELECT); + + if (mxPreviewValueSet->GetDrawingArea()->get_ref_device().GetDPIScaleFactor() > 1) + mpContainer->SetPreviewSize(MasterPageContainer::LARGE); + + mxPreviewValueSet->SetPreviewSize(mpContainer->GetPreviewSizePixel()); + mxPreviewValueSet->Show(); + + mxPreviewValueSet->SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Color_PanelBackground)); + + Link aChangeListener (LINK(this,MasterPagesSelector,ContainerChangeListener)); + mpContainer->AddChangeListener(aChangeListener); +} + +MasterPagesSelector::~MasterPagesSelector() +{ + Clear(); + UpdateLocks(ItemList()); + + Link aChangeListener (LINK(this,MasterPagesSelector,ContainerChangeListener)); + mpContainer->RemoveChangeListener(aChangeListener); + mpContainer.reset(); + mxPreviewValueSetWin.reset(); + mxPreviewValueSet.reset(); +} + +void MasterPagesSelector::LateInit() +{ +} + +sal_Int32 MasterPagesSelector::GetPreferredHeight (sal_Int32 nWidth) +{ + const ::osl::MutexGuard aGuard (maMutex); + + return mxPreviewValueSet->GetPreferredHeight (nWidth); +} + +void MasterPagesSelector::UpdateLocks (const ItemList& rItemList) +{ + ItemList aNewLockList; + + // In here we first lock the master pages in the given list and then + // release the locks acquired in a previous call to this method. When + // this were done the other way round the lock count of some master + // pages might drop temporarily to 0 and would lead to unnecessary + // deletion and re-creation of MasterPageDescriptor objects. + + // Lock the master pages in the given list. + for (const auto& rItem : rItemList) + { + mpContainer->AcquireToken(rItem); + aNewLockList.push_back(rItem); + } + + // Release the previously locked master pages. + for (const auto& rPage : maLockedMasterPages) + mpContainer->ReleaseToken(rPage); + + maLockedMasterPages.swap(aNewLockList); +} + +void MasterPagesSelector::Fill() +{ + ::std::unique_ptr pItemList (new ItemList); + + Fill(*pItemList); + + UpdateLocks(*pItemList); + UpdateItemList(std::move(pItemList)); +} + +OUString MasterPagesSelector::GetContextMenuUIFile() const +{ + return "modules/simpress/ui/mastermenu.ui"; +} + +IMPL_LINK_NOARG(MasterPagesSelector, ClickHandler, ValueSet*, void) +{ + // We use the framework to assign the clicked-on master page because we + // so use the same mechanism as the context menu does (where we do not + // have the option to call the assignment method directly.) + ExecuteCommand(gsDefaultClickAction); +} + +IMPL_LINK(MasterPagesSelector, ContextMenuHandler, const Point*, pPos, void) +{ + if (pPos) + { + // Here we only prepare the display of the context menu: on right + // click the item under the mouse is selected. + mxPreviewValueSet->GrabFocus(); + mxPreviewValueSet->ReleaseMouse(); + + sal_uInt16 nIndex = mxPreviewValueSet->GetItemId(*pPos); + if (nIndex > 0) + mxPreviewValueSet->SelectItem(nIndex); + } + + // Now do the actual display of the context menu + ShowContextMenu(pPos); +} + +void MasterPagesSelector::ShowContextMenu(const Point* pPos) +{ + // Use the currently selected item and show the popup menu in its + // center. + const sal_uInt16 nIndex = mxPreviewValueSet->GetSelectedItemId(); + if (nIndex <= 0) + return; + + // The position of the upper left corner of the context menu is + // taken either from the mouse position (when the command was sent + // as reaction to a right click) or in the center of the selected + // item (when the command was sent as reaction to Shift+F10.) + Point aPosition; + if (!pPos) + { + ::tools::Rectangle aBBox (mxPreviewValueSet->GetItemRect(nIndex)); + aPosition = aBBox.Center(); + } + else + aPosition = *pPos; + + // Setup the menu. + weld::Widget* pParent = mxPreviewValueSet->GetDrawingArea(); + std::unique_ptr xBuilder(Application::CreateBuilder(pParent, GetContextMenuUIFile())); + std::unique_ptr xMenu(xBuilder->weld_menu("menu")); + ProcessPopupMenu(*xMenu); + ::tools::Rectangle aRect(aPosition, Size(1,1)); + // Show the menu. + ExecuteCommand(xMenu->popup_at_rect(pParent, aRect)); +} + +void MasterPagesSelector::ProcessPopupMenu(weld::Menu& rMenu) +{ + // Disable some entries. + if (mpContainer->GetPreviewSize() == MasterPageContainer::SMALL) + rMenu.set_sensitive("small", false); + else + rMenu.set_sensitive("large", false); +} + +void MasterPagesSelector::ExecuteCommand(const OUString &rIdent) +{ + if (rIdent == "applyall") + { + mrBase.SetBusyState (true); + AssignMasterPageToAllSlides (GetSelectedMasterPage()); + mrBase.SetBusyState (false); + } + else if (rIdent == "applyselect") + { + mrBase.SetBusyState (true); + AssignMasterPageToSelectedSlides (GetSelectedMasterPage()); + mrBase.SetBusyState (false); + } + else if (rIdent == "large") + { + mrBase.SetBusyState (true); + mpContainer->SetPreviewSize(MasterPageContainer::LARGE); + mrBase.SetBusyState (false); + if (mxSidebar.is()) + mxSidebar->requestLayout(); + } + else if (rIdent == "small") + { + mrBase.SetBusyState (true); + mpContainer->SetPreviewSize(MasterPageContainer::SMALL); + mrBase.SetBusyState (false); + if (mxSidebar.is()) + mxSidebar->requestLayout(); + } + else if (rIdent == "edit") + { + using namespace ::com::sun::star; + uno::Reference xSelectedMaster; + SdPage* pMasterPage = GetSelectedMasterPage(); + assert(pMasterPage); //rhbz#902884 + if (pMasterPage) + xSelectedMaster.set(pMasterPage->getUnoPage(), uno::UNO_QUERY); + SfxViewFrame& rViewFrame = mrBase.GetViewFrame(); + if (xSelectedMaster.is()) + { + SfxDispatcher* pDispatcher = rViewFrame.GetDispatcher(); + if (pDispatcher != nullptr) + { + sal_uInt16 nIndex = mxPreviewValueSet->GetSelectedItemId(); + pDispatcher->Execute(SID_MASTERPAGE, SfxCallMode::SYNCHRON); + mxPreviewValueSet->SelectItem (nIndex); + mrBase.GetDrawController()->setCurrentPage(xSelectedMaster); + } + } + } +} + +IMPL_LINK(MasterPagesSelector, ContainerChangeListener, MasterPageContainerChangeEvent&, rEvent, void) +{ + NotifyContainerChangeEvent(rEvent); +} + +SdPage* MasterPagesSelector::GetSelectedMasterPage() +{ + const ::osl::MutexGuard aGuard (maMutex); + + SdPage* pMasterPage = nullptr; + sal_uInt16 nIndex = mxPreviewValueSet->GetSelectedItemId(); + UserData* pData = GetUserData(nIndex); + if (pData != nullptr) + { + pMasterPage = mpContainer->GetPageObjectForToken(pData->second, true); + } + return pMasterPage; +} + +/** Assemble a list of all slides of the document and pass it to + AssignMasterPageToPageList(). +*/ +void MasterPagesSelector::AssignMasterPageToAllSlides (SdPage* pMasterPage) +{ + if (pMasterPage == nullptr) + return; + + sal_uInt16 nPageCount = mrDocument.GetSdPageCount(PageKind::Standard); + if (nPageCount == 0) + return; + + // Get a list of all pages. As a little optimization we only + // include pages that do not already have the given master page + // assigned. + OUString sFullLayoutName(pMasterPage->GetLayoutName()); + ::sd::slidesorter::SharedPageSelection pPageList = + std::make_shared<::sd::slidesorter::SlideSorterViewShell::PageSelection>(); + for (sal_uInt16 nPageIndex=0; nPageIndexGetLayoutName() != sFullLayoutName) + { + pPageList->push_back (pPage); + } + } + + AssignMasterPageToPageList(pMasterPage, pPageList); +} + +/** Assemble a list of the currently selected slides (selected in a visible + slide sorter) and pass it to AssignMasterPageToPageList(). +*/ +void MasterPagesSelector::AssignMasterPageToSelectedSlides ( + SdPage* pMasterPage) +{ + using namespace ::sd::slidesorter; + using namespace ::sd::slidesorter::controller; + + if (pMasterPage == nullptr) + return; + + // Find a visible slide sorter. + SlideSorterViewShell* pSlideSorter = SlideSorterViewShell::GetSlideSorter(mrBase); + if (pSlideSorter == nullptr) + return; + + // Get a list of selected pages. + SharedPageSelection pPageSelection = pSlideSorter->GetPageSelection(); + if (pPageSelection->empty()) + return; + + AssignMasterPageToPageList(pMasterPage, pPageSelection); + + // Restore the previous selection. + pSlideSorter->SetPageSelection(pPageSelection); +} + +void MasterPagesSelector::AssignMasterPageToPageList ( + SdPage* pMasterPage, + const std::shared_ptr>& rPageList) +{ + DocumentHelper::AssignMasterPageToPageList(mrDocument, pMasterPage, rPageList); +} + +void MasterPagesSelector::NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent) +{ + const ::osl::MutexGuard aGuard (maMutex); + + switch (rEvent.meEventType) + { + case MasterPageContainerChangeEvent::EventType::SIZE_CHANGED: + mxPreviewValueSet->SetPreviewSize(mpContainer->GetPreviewSizePixel()); + UpdateAllPreviews(); + break; + + case MasterPageContainerChangeEvent::EventType::PREVIEW_CHANGED: + { + int nIndex (GetIndexForToken(rEvent.maChildToken)); + if (nIndex >= 0) + { + mxPreviewValueSet->SetItemImage ( + static_cast(nIndex), + mpContainer->GetPreviewForToken(rEvent.maChildToken)); + mxPreviewValueSet->Invalidate(mxPreviewValueSet->GetItemRect(static_cast(nIndex))); + } + } + break; + + case MasterPageContainerChangeEvent::EventType::DATA_CHANGED: + { + InvalidateItem(rEvent.maChildToken); + Fill(); + } + break; + + case MasterPageContainerChangeEvent::EventType::CHILD_REMOVED: + { + int nIndex (GetIndexForToken(rEvent.maChildToken)); + SetItem(nIndex, MasterPageContainer::NIL_TOKEN); + break; + } + + default: + break; + } +} + +MasterPagesSelector::UserData* MasterPagesSelector::GetUserData (int nIndex) const +{ + const ::osl::MutexGuard aGuard (maMutex); + + if (nIndex>0 && o3tl::make_unsigned(nIndex)<=mxPreviewValueSet->GetItemCount()) + return static_cast(mxPreviewValueSet->GetItemData(static_cast(nIndex))); + else + return nullptr; +} + +void MasterPagesSelector::SetUserData (int nIndex, std::unique_ptr pData) +{ + const ::osl::MutexGuard aGuard (maMutex); + + delete GetUserData(nIndex); + mxPreviewValueSet->SetItemData(static_cast(nIndex), pData.release()); +} + +void MasterPagesSelector::SetItem ( + sal_uInt16 nIndex, + MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (maMutex); + + RemoveTokenToIndexEntry(nIndex,aToken); + + if (nIndex <= 0) + return; + + if (aToken != MasterPageContainer::NIL_TOKEN) + { + Image aPreview (mpContainer->GetPreviewForToken(aToken)); + MasterPageContainer::PreviewState eState (mpContainer->GetPreviewState(aToken)); + + if (aPreview.GetSizePixel().Width()>0) + { + if (mxPreviewValueSet->GetItemPos(nIndex) != VALUESET_ITEM_NOTFOUND) + { + mxPreviewValueSet->SetItemImage(nIndex,aPreview); + mxPreviewValueSet->SetItemText(nIndex, mpContainer->GetPageNameForToken(aToken)); + } + else + { + mxPreviewValueSet->InsertItem ( + nIndex, + aPreview, + mpContainer->GetPageNameForToken(aToken), + nIndex); + } + SetUserData(nIndex, std::make_unique(nIndex,aToken)); + + AddTokenToIndexEntry(nIndex,aToken); + } + + if (eState == MasterPageContainer::PS_CREATABLE) + mpContainer->RequestPreview(aToken); + } + else + { + mxPreviewValueSet->RemoveItem(nIndex); + } + +} + +void MasterPagesSelector::AddTokenToIndexEntry ( + sal_uInt16 nIndex, + MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (maMutex); + + maTokenToValueSetIndex[aToken] = nIndex; +} + +void MasterPagesSelector::RemoveTokenToIndexEntry ( + sal_uInt16 nIndex, + MasterPageContainer::Token aNewToken) +{ + const ::osl::MutexGuard aGuard (maMutex); + + UserData* pData = GetUserData(nIndex); + if (pData != nullptr) + { + // Get the token that the index pointed to previously. + MasterPageContainer::Token aOldToken (pData->second); + + if (aNewToken != aOldToken + && nIndex == GetIndexForToken(aOldToken)) + { + maTokenToValueSetIndex[aOldToken] = 0; + } + } +} + +void MasterPagesSelector::InvalidatePreview (const SdPage* pPage) +{ + const ::osl::MutexGuard aGuard (maMutex); + + for (size_t nIndex=1; nIndex<=mxPreviewValueSet->GetItemCount(); nIndex++) + { + UserData* pData = GetUserData(nIndex); + if (pData != nullptr) + { + MasterPageContainer::Token aToken (pData->second); + if (pPage == mpContainer->GetPageObjectForToken(aToken,false)) + { + mpContainer->InvalidatePreview(aToken); + mpContainer->RequestPreview(aToken); + break; + } + } + } +} + +void MasterPagesSelector::UpdateAllPreviews() +{ + const ::osl::MutexGuard aGuard (maMutex); + + for (size_t nIndex=1; nIndex<=mxPreviewValueSet->GetItemCount(); nIndex++) + { + UserData* pData = GetUserData(nIndex); + if (pData != nullptr) + { + MasterPageContainer::Token aToken (pData->second); + mxPreviewValueSet->SetItemImage( + nIndex, + mpContainer->GetPreviewForToken(aToken)); + if (mpContainer->GetPreviewState(aToken) == MasterPageContainer::PS_CREATABLE) + mpContainer->RequestPreview(aToken); + } + } + mxPreviewValueSet->Rearrange(); +} + +void MasterPagesSelector::ClearPageSet() +{ + const ::osl::MutexGuard aGuard (maMutex); + + for (size_t nIndex=1; nIndex<=mxPreviewValueSet->GetItemCount(); nIndex++) + { + UserData* pData = GetUserData(nIndex); + delete pData; + } + mxPreviewValueSet->Clear(); +} + +void MasterPagesSelector::SetHelpId( const OUString& aId ) +{ + const ::osl::MutexGuard aGuard (maMutex); + + mxPreviewValueSet->SetHelpId( aId ); +} + +sal_Int32 MasterPagesSelector::GetIndexForToken (MasterPageContainer::Token aToken) const +{ + const ::osl::MutexGuard aGuard (maMutex); + + TokenToValueSetIndex::const_iterator iIndex (maTokenToValueSetIndex.find(aToken)); + if (iIndex != maTokenToValueSetIndex.end()) + return iIndex->second; + else + return -1; +} + +void MasterPagesSelector::Clear() +{ + const ::osl::MutexGuard aGuard (maMutex); + + ClearPageSet(); +} + +void MasterPagesSelector::InvalidateItem (MasterPageContainer::Token aToken) +{ + const ::osl::MutexGuard aGuard (maMutex); + + auto iItem = std::find(maCurrentItemList.begin(), maCurrentItemList.end(), aToken); + if (iItem != maCurrentItemList.end()) + *iItem = MasterPageContainer::NIL_TOKEN; +} + +void MasterPagesSelector::UpdateItemList (::std::unique_ptr && pNewItemList) +{ + const ::osl::MutexGuard aGuard (maMutex); + + ItemList::const_iterator iNewItem (pNewItemList->begin()); + ItemList::const_iterator iCurrentItem (maCurrentItemList.begin()); + ItemList::const_iterator iNewEnd (pNewItemList->end()); + ItemList::const_iterator iCurrentEnd (maCurrentItemList.end()); + sal_uInt16 nIndex (1); + + // Update existing items. + for ( ; iNewItem!=iNewEnd && iCurrentItem!=iCurrentEnd; ++iNewItem, ++iCurrentItem,++nIndex) + { + if (*iNewItem != *iCurrentItem) + { + SetItem(nIndex,*iNewItem); + } + } + + // Append new items. + for ( ; iNewItem!=iNewEnd; ++iNewItem,++nIndex) + { + SetItem(nIndex,*iNewItem); + } + + // Remove trailing items. + for ( ; iCurrentItem!=iCurrentEnd; ++iCurrentItem,++nIndex) + { + SetItem(nIndex,MasterPageContainer::NIL_TOKEN); + } + + maCurrentItemList.swap(*pNewItemList); + + mxPreviewValueSet->Rearrange(); + if (mxSidebar.is()) + mxSidebar->requestLayout(); +} + +css::ui::LayoutSize MasterPagesSelector::GetHeightForWidth (const sal_Int32 nWidth) +{ + const sal_Int32 nHeight (GetPreferredHeight(nWidth)); + return css::ui::LayoutSize(nHeight,nHeight,nHeight); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/MasterPagesSelector.hxx b/sd/source/ui/sidebar/MasterPagesSelector.hxx new file mode 100644 index 0000000000..f0a540bade --- /dev/null +++ b/sd/source/ui/sidebar/MasterPagesSelector.hxx @@ -0,0 +1,180 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include "MasterPageContainer.hxx" +#include "PreviewValueSet.hxx" +#include +#include + +#include + +namespace com::sun::star::ui { class XSidebar; } +class MouseEvent; +class SdDrawDocument; +class SdPage; + +namespace sd { +class ViewShellBase; +} + +namespace sd::sidebar { + +/** Base class of a menu that lets the user select from a list of + templates or designs that are loaded from files. +*/ +class MasterPagesSelector : public PanelLayout + , public sfx2::sidebar::ILayoutableWindow +{ +public: + MasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + std::shared_ptr pContainer, + css::uno::Reference xSidebar, + const OUString& rUIFileName, + const OUString& rValueSetName); + virtual ~MasterPagesSelector() override; + + virtual void LateInit(); + + sal_Int32 GetPreferredHeight (sal_Int32 nWidth); + + /** Make the selector empty. This method clear the value set from any + entries. Override this method to add functionality, especially to + destroy objects set as data items at the value set. + */ + void ClearPageSet(); + + void SetHelpId( const OUString& aId ); + + /** Mark the preview that belongs to the given index as not up-to-date + anymore with respect to page content or preview size. + The implementation of this method will either sunchronously or + asynchronously call UpdatePreview(). + @param nIndex + Index into the value set control that is used for displaying the + previews. + */ + void InvalidatePreview (const SdPage* pPage); + + void UpdateAllPreviews(); + + void ShowContextMenu(const Point* pPos); + + // ILayoutableWindow + virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override; + +protected: + mutable ::osl::Mutex maMutex; + std::shared_ptr mpContainer; + + std::unique_ptr mxPreviewValueSet; + std::unique_ptr mxPreviewValueSetWin; + + SdDrawDocument& mrDocument; + ViewShellBase& mrBase; + + SdPage* GetSelectedMasterPage(); + + /** Assign the given master page to all slides of the document. + @param pMasterPage + The master page to assign to all slides. + */ + void AssignMasterPageToAllSlides (SdPage* pMasterPage); + + /** Assign the given master page to all slides that are selected in a + slide sorter that is displayed in the lef or center pane. When both + panes display a slide sorter then the one in the center pane is + used. + */ + void AssignMasterPageToSelectedSlides (SdPage* pMasterPage); + + virtual void AssignMasterPageToPageList ( + SdPage* pMasterPage, + const std::shared_ptr>& rPageList); + + virtual void NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent); + + typedef ::std::pair UserData; + UserData* GetUserData (int nIndex) const; + void SetUserData (int nIndex, std::unique_ptr pData); + + sal_Int32 GetIndexForToken (MasterPageContainer::Token aToken) const; + typedef ::std::vector ItemList; + void UpdateItemList (::std::unique_ptr && pList); + void Clear(); + /** Invalidate the specified item so that on the next Fill() this item + is updated. + */ + void InvalidateItem (MasterPageContainer::Token aToken); + + // For every item in the ValueSet we store its associated token. This + // allows a faster access and easier change tracking. + ItemList maCurrentItemList; + typedef ::std::map TokenToValueSetIndex; + TokenToValueSetIndex maTokenToValueSetIndex; + + ItemList maLockedMasterPages; + /** Lock master pages in the given list and release locks that were + previously acquired. + */ + void UpdateLocks (const ItemList& rItemList); + + void Fill(); + virtual void Fill (ItemList& rItemList) = 0; + + /** Give derived classes the opportunity to provide their own context + menu. If they do then they probably have to provide their own + Execute() and GetState() methods as well. + */ + virtual OUString GetContextMenuUIFile() const; + + virtual void ProcessPopupMenu(weld::Menu& rMenu); + virtual void ExecuteCommand(const OUString& rIdent); + +private: + css::uno::Reference mxSidebar; + + /** The offset between ValueSet index and MasterPageContainer::Token + last seen. This value is used heuristically to speed up the lookup + of an index for a token. + */ + DECL_LINK(ClickHandler, ValueSet*, void); + DECL_LINK(ContextMenuHandler, const Point*, void); + DECL_LINK(ContainerChangeListener, MasterPageContainerChangeEvent&, void); + + void SetItem ( + sal_uInt16 nIndex, + MasterPageContainer::Token aToken); + void AddTokenToIndexEntry ( + sal_uInt16 nIndex, + MasterPageContainer::Token aToken); + void RemoveTokenToIndexEntry ( + sal_uInt16 nIndex, + MasterPageContainer::Token aToken); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/NavigatorWrapper.cxx b/sd/source/ui/sidebar/NavigatorWrapper.cxx new file mode 100644 index 0000000000..95d4a66ae1 --- /dev/null +++ b/sd/source/ui/sidebar/NavigatorWrapper.cxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "NavigatorWrapper.hxx" +#include +#include + +namespace sd::sidebar { + +NavigatorWrapper::NavigatorWrapper ( + weld::Widget* pParent, + sd::ViewShellBase& rViewShellBase, + SfxBindings* pBindings) + : SdNavigatorWin(pParent, pBindings, nullptr) + , mrViewShellBase(rViewShellBase) +{ + SetUpdateRequestFunctor( + [this] () { return this->UpdateNavigator(); }); +} + +css::ui::LayoutSize NavigatorWrapper::GetHeightForWidth (const sal_Int32) +{ + return css::ui::LayoutSize(-1,-1,-1); +} + +void NavigatorWrapper::UpdateNavigator() +{ + InitTreeLB(mrViewShellBase.GetDocument()); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/NavigatorWrapper.hxx b/sd/source/ui/sidebar/NavigatorWrapper.hxx new file mode 100644 index 0000000000..6632d796f1 --- /dev/null +++ b/sd/source/ui/sidebar/NavigatorWrapper.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include + +class SfxBindings; +namespace sd { class ViewShellBase; } + +namespace sd::sidebar { + +/** Present the navigator as control that can be displayed inside the + sidebar. + This wrapper has two main responsibilities: + - Watch for document changes and update the navigator when one + happens. + - Forward size changes from sidebar to navigator. +*/ +class NavigatorWrapper + : public SdNavigatorWin, + public sfx2::sidebar::ILayoutableWindow +{ +public: + NavigatorWrapper ( + weld::Widget* pParent, + sd::ViewShellBase& rViewShellBase, + SfxBindings* pBindings); + + // From ILayoutableWindow + virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override; + +private: + ViewShellBase& mrViewShellBase; + + void UpdateNavigator(); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/PageMarginUtils.hxx b/sd/source/ui/sidebar/PageMarginUtils.hxx new file mode 100644 index 0000000000..9a1f834937 --- /dev/null +++ b/sd/source/ui/sidebar/PageMarginUtils.hxx @@ -0,0 +1,159 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#include +#include +#define SDPAGE_NO_MARGIN 0 +#define SDPAGE_NARROW_VALUE 635 +#define SDPAGE_MODERATE_LR 955 +#define SDPAGE_NORMAL_VALUE 1000 +#define SDPAGE_WIDE_VALUE1 1270 +#define SDPAGE_WIDE_VALUE2 2540 +#define SDPAGE_WIDE_VALUE3 1590 +#define SDPAGE_UNIT_THRESHOLD 5 + +namespace sd::sidebar{ + +bool IsNone( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_NO_MARGIN) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_NO_MARGIN ) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_NO_MARGIN) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_NO_MARGIN) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetNone( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_NO_MARGIN; + nPageRightMargin = SDPAGE_NO_MARGIN; + nPageTopMargin = SDPAGE_NO_MARGIN; + nPageBottomMargin = SDPAGE_NO_MARGIN; +} + +bool IsNarrow( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetNarrow( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_NARROW_VALUE; + nPageRightMargin = SDPAGE_NARROW_VALUE; + nPageTopMargin = SDPAGE_NARROW_VALUE; + nPageBottomMargin = SDPAGE_NARROW_VALUE; +} + +bool IsModerate( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_MODERATE_LR) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_MODERATE_LR) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetModerate( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_MODERATE_LR; + nPageRightMargin = SDPAGE_MODERATE_LR; + nPageTopMargin = SDPAGE_WIDE_VALUE1; + nPageBottomMargin = SDPAGE_WIDE_VALUE1; +} + +bool IsNormal075( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetNormal075( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_NORMAL_VALUE; + nPageRightMargin = SDPAGE_NORMAL_VALUE; + nPageTopMargin = SDPAGE_NORMAL_VALUE; + nPageBottomMargin = SDPAGE_NORMAL_VALUE; +} + +bool IsNormal100( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetNormal100( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_WIDE_VALUE1; + nPageRightMargin = SDPAGE_WIDE_VALUE1; + nPageTopMargin = SDPAGE_WIDE_VALUE1; + nPageBottomMargin = SDPAGE_WIDE_VALUE1; +} + +bool IsNormal125( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_WIDE_VALUE3) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_WIDE_VALUE3) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetNormal125( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_WIDE_VALUE3; + nPageRightMargin = SDPAGE_WIDE_VALUE3; + nPageTopMargin = SDPAGE_WIDE_VALUE1; + nPageBottomMargin = SDPAGE_WIDE_VALUE1; +} + +bool IsWide( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin, + const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin ) +{ + return( std::abs(nPageLeftMargin - SDPAGE_WIDE_VALUE2) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageRightMargin - SDPAGE_WIDE_VALUE2) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD && + std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD ); +} + +void SetWide( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin, + ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin ) +{ + nPageLeftMargin = SDPAGE_WIDE_VALUE2; + nPageRightMargin = SDPAGE_WIDE_VALUE2; + nPageTopMargin = SDPAGE_WIDE_VALUE1; + nPageBottomMargin = SDPAGE_WIDE_VALUE1; +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/PanelFactory.cxx b/sd/source/ui/sidebar/PanelFactory.cxx new file mode 100644 index 0000000000..1e39b2ee9c --- /dev/null +++ b/sd/source/ui/sidebar/PanelFactory.cxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PanelFactory.hxx" +#include +#include +#include +#include "LayoutMenu.hxx" +#include "CurrentMasterPagesSelector.hxx" +#include "RecentMasterPagesSelector.hxx" +#include "AllMasterPagesSelector.hxx" +#include +#include "NavigatorWrapper.hxx" +#include +#include +#include "SlideBackground.hxx" + +#include +#include +#include +#include +#include +#include + +using namespace css; +using namespace css::uno; +using namespace ::sd::framework; + +namespace sd::sidebar { + +//----- PanelFactory -------------------------------------------------------- + +PanelFactory::PanelFactory() +{ +} + +PanelFactory::~PanelFactory() +{ +} + +// XUIElementFactory + +Reference SAL_CALL PanelFactory::createUIElement ( + const OUString& rsUIElementResourceURL, + const css::uno::Sequence& rArguments) +{ + // Process arguments. + const ::comphelper::NamedValueCollection aArguments (rArguments); + Reference xFrame (aArguments.getOrDefault("Frame", Reference())); + Reference xParentWindow (aArguments.getOrDefault("ParentWindow", Reference())); + Reference xSidebar (aArguments.getOrDefault("Sidebar", Reference())); + + // Throw exceptions when the arguments are not as expected. + weld::Widget* pParent(nullptr); + if (weld::TransportAsXWindow* pTunnel = dynamic_cast(xParentWindow.get())) + pParent = pTunnel->getWidget(); + + if (!pParent) + throw RuntimeException( + "PanelFactory::createUIElement called without ParentWindow"); + if ( ! xFrame.is()) + throw RuntimeException( + "PanelFactory::createUIElement called without XFrame"); + + // Tunnel through the controller to obtain a ViewShellBase. + ViewShellBase* pBase = nullptr; + rtl::Reference pController = dynamic_cast(xFrame->getController().get()); + if (pController != nullptr) + pBase = pController->GetViewShellBase(); + if (pBase == nullptr) + throw RuntimeException("can not get ViewShellBase for frame"); + + // Get bindings from given arguments. + const sal_uInt64 nBindingsValue (aArguments.getOrDefault("SfxBindings", sal_uInt64(0))); + SfxBindings* pBindings = reinterpret_cast(nBindingsValue); + + // Create a framework view. + std::unique_ptr xControl; + css::ui::LayoutSize aLayoutSize (-1,-1,-1); + + /** Note that these names have to be identical to (the tail of) + the entries in officecfg/registry/data/org/openoffice/Office/Impress.xcu + for the TaskPanelFactory. + */ + if (rsUIElementResourceURL.endsWith("/CustomAnimations")) + xControl = std::make_unique(pParent, *pBase); + else if (rsUIElementResourceURL.endsWith("/Layouts")) + xControl = std::make_unique(pParent, *pBase, xSidebar); + else if (rsUIElementResourceURL.endsWith("/AllMasterPages")) + xControl = AllMasterPagesSelector::Create(pParent, *pBase, xSidebar); + else if (rsUIElementResourceURL.endsWith("/RecentMasterPages")) + xControl = RecentMasterPagesSelector::Create(pParent, *pBase, xSidebar); + else if (rsUIElementResourceURL.endsWith("/UsedMasterPages")) + xControl = CurrentMasterPagesSelector::Create(pParent, *pBase, xSidebar); + else if (rsUIElementResourceURL.endsWith("/SlideTransitions")) + xControl = std::make_unique(pParent, *pBase); + else if (rsUIElementResourceURL.endsWith("/TableDesign")) + xControl = std::make_unique(pParent, *pBase); + else if (rsUIElementResourceURL.endsWith("/NavigatorPanel")) + xControl = std::make_unique(pParent, *pBase, pBindings); + else if (rsUIElementResourceURL.endsWith("/SlideBackgroundPanel")) + xControl = std::make_unique(pParent, *pBase, xFrame, pBindings); + + if (!xControl) + throw lang::IllegalArgumentException(); + + // Create a wrapper around the control that implements the + // necessary UNO interfaces. + return sfx2::sidebar::SidebarPanelBase::Create( + rsUIElementResourceURL, + xFrame, + std::move(xControl), + aLayoutSize); +} + +OUString PanelFactory::getImplementationName() { + return "org.openoffice.comp.Draw.framework.PanelFactory"; +} + +sal_Bool PanelFactory::supportsService(OUString const & ServiceName) { + return cppu::supportsService(this, ServiceName); +} + +css::uno::Sequence PanelFactory::getSupportedServiceNames() { + return {"com.sun.star.drawing.framework.PanelFactory"}; +} + +} // end of namespace sd::sidebar + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +org_openoffice_comp_Draw_framework_PanelFactory_get_implementation(css::uno::XComponentContext* /*context*/, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::sidebar::PanelFactory); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/PanelFactory.hxx b/sd/source/ui/sidebar/PanelFactory.hxx new file mode 100644 index 0000000000..3462aef11f --- /dev/null +++ b/sd/source/ui/sidebar/PanelFactory.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +#include +#include + +namespace sd::sidebar { + +typedef comphelper::WeakComponentImplHelper < + css::ui::XUIElementFactory, css::lang::XServiceInfo + > PanelFactoryInterfaceBase; + +class PanelFactory final + : public PanelFactoryInterfaceBase +{ +public: + explicit PanelFactory (); + virtual ~PanelFactory() override; + PanelFactory(const PanelFactory&) = delete; + PanelFactory& operator=(const PanelFactory&) = delete; + + // XUIElementFactory + + css::uno::Reference SAL_CALL createUIElement ( + const OUString& rsResourceURL, + const css::uno::Sequence& rArguments) override; + + OUString SAL_CALL getImplementationName() override; + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override; + css::uno::Sequence SAL_CALL getSupportedServiceNames() override; +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/PreviewValueSet.cxx b/sd/source/ui/sidebar/PreviewValueSet.cxx new file mode 100644 index 0000000000..f752d60eb0 --- /dev/null +++ b/sd/source/ui/sidebar/PreviewValueSet.cxx @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PreviewValueSet.hxx" +#include + +namespace sd::sidebar { + +const int gnBorderWidth(3); +const int gnBorderHeight(3); + +PreviewValueSet::PreviewValueSet() + : ValueSet(nullptr) + , maPreviewSize(10,10) +{ + SetStyle ( + GetStyle() + & ~(WB_ITEMBORDER)// | WB_MENUSTYLEVALUESET) + // | WB_FLATVALUESET); + ); +} + +void PreviewValueSet::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + ValueSet::SetDrawingArea(pDrawingArea); + + SetColCount(2); + SetExtraSpacing (2); +} + +PreviewValueSet::~PreviewValueSet() +{ +} + +void PreviewValueSet::SetPreviewSize (const Size& rSize) +{ + maPreviewSize = rSize; +} + +void PreviewValueSet::SetContextMenuHandler(const Link& rLink) +{ + maContextMenuHandler = rLink; +} + +bool PreviewValueSet::Command(const CommandEvent& rEvent) +{ + if (rEvent.GetCommand() != CommandEventId::ContextMenu) + return ValueSet::Command(rEvent); + maContextMenuHandler.Call(rEvent.IsMouseEvent() ? &rEvent.GetMousePosPixel() : nullptr); + return true; +} + +void PreviewValueSet::Resize() +{ + ValueSet::Resize(); + + Size aWindowSize (GetOutputSizePixel()); + if (!aWindowSize.IsEmpty()) + { + Rearrange(); + } +} + +void PreviewValueSet::Rearrange() +{ + sal_uInt16 nNewColumnCount (CalculateColumnCount ( + GetOutputSizePixel().Width())); + sal_uInt16 nNewRowCount (CalculateRowCount (nNewColumnCount)); + + SetFormat(); + SetColCount(nNewColumnCount); + SetLineCount(nNewRowCount); +} + +sal_uInt16 PreviewValueSet::CalculateColumnCount (int nWidth) const +{ + int nColumnCount = 0; + if (nWidth > 0) + { + nColumnCount = nWidth / (maPreviewSize.Width() + 2*gnBorderWidth); + if (nColumnCount < 1) + nColumnCount = 1; + } + return static_cast(nColumnCount); +} + +sal_uInt16 PreviewValueSet::CalculateRowCount (sal_uInt16 nColumnCount) const +{ + int nRowCount = 0; + int nItemCount = GetItemCount(); + if (nColumnCount > 0) + { + nRowCount = (nItemCount+nColumnCount-1) / nColumnCount; + if (nRowCount < 1) + nRowCount = 1; + } + + return static_cast(nRowCount); +} + +sal_Int32 PreviewValueSet::GetPreferredHeight (sal_Int32 nWidth) +{ + int nRowCount (CalculateRowCount(CalculateColumnCount(nWidth))); + int nItemHeight (maPreviewSize.Height()); + + return nRowCount * (nItemHeight + 2*gnBorderHeight); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/PreviewValueSet.hxx b/sd/source/ui/sidebar/PreviewValueSet.hxx new file mode 100644 index 0000000000..adab3c78ad --- /dev/null +++ b/sd/source/ui/sidebar/PreviewValueSet.hxx @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::sidebar +{ +/** Adapt the svtools valueset to the needs of the master page controls. +*/ +class PreviewValueSet : public ValueSet +{ +public: + explicit PreviewValueSet(); + virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; + virtual ~PreviewValueSet() override; + + void SetContextMenuHandler(const Link& rLink); + + virtual void Resize() override; + virtual bool Command(const CommandEvent& rEvent) override; + + void SetPreviewSize(const Size& rSize); + + sal_Int32 GetPreferredHeight(sal_Int32 nWidth); + + /** Set the number of rows and columns according to the current number + of items. Call this method when new items have been inserted. + */ + void Rearrange(); + +private: + Link maContextMenuHandler; + Size maPreviewSize; + + sal_uInt16 CalculateColumnCount(int nWidth) const; + sal_uInt16 CalculateRowCount(sal_uInt16 nColumnCount) const; +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/RecentMasterPagesSelector.cxx b/sd/source/ui/sidebar/RecentMasterPagesSelector.cxx new file mode 100644 index 0000000000..6e5a46c736 --- /dev/null +++ b/sd/source/ui/sidebar/RecentMasterPagesSelector.cxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "RecentMasterPagesSelector.hxx" + +#include +#include "RecentlyUsedMasterPages.hxx" +#include +#include +#include +#include + +namespace sd::sidebar { + +std::unique_ptr RecentMasterPagesSelector::Create ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + const css::uno::Reference& rxSidebar) +{ + SdDrawDocument* pDocument = rViewShellBase.GetDocument(); + if (pDocument == nullptr) + return nullptr; + + auto pContainer = std::make_shared(); + + auto xSelector(std::make_unique( + pParent, + *pDocument, + rViewShellBase, + pContainer, + rxSidebar)); + xSelector->LateInit(); + xSelector->SetHelpId(HID_SD_TASK_PANE_PREVIEW_RECENT); + + return xSelector; +} + +RecentMasterPagesSelector::RecentMasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + const std::shared_ptr& rpContainer, + const css::uno::Reference& rxSidebar) + : MasterPagesSelector (pParent, rDocument, rBase, rpContainer, rxSidebar, "modules/simpress/ui/masterpagepanelrecent.ui", "recentvalueset") +{ +} + +RecentMasterPagesSelector::~RecentMasterPagesSelector() +{ + RecentlyUsedMasterPages::Instance().RemoveEventListener ( + LINK(this,RecentMasterPagesSelector,MasterPageListListener)); +} + +void RecentMasterPagesSelector::LateInit() +{ + MasterPagesSelector::LateInit(); + + MasterPagesSelector::Fill(); + RecentlyUsedMasterPages::Instance().AddEventListener ( + LINK(this,RecentMasterPagesSelector,MasterPageListListener)); +} + +IMPL_LINK_NOARG(RecentMasterPagesSelector, MasterPageListListener, LinkParamNone*, void) +{ + MasterPagesSelector::Fill(); +} + +void RecentMasterPagesSelector::Fill (ItemList& rItemList) +{ + // Create a set of names of the master pages used by the document. + MasterPageObserver::MasterPageNameSet aCurrentNames; + sal_uInt16 nMasterPageCount = mrDocument.GetMasterSdPageCount(PageKind::Standard); + for (sal_uInt16 nIndex=0; nIndexGetName()); + } + + // Insert the recently used master pages that are currently not used. + RecentlyUsedMasterPages& rInstance (RecentlyUsedMasterPages::Instance()); + int nPageCount = rInstance.GetMasterPageCount(); + for (int nIndex=0; nIndexGetStyleNameForToken(aToken)); + if (sStyleName.isEmpty() + || aCurrentNames.find(sStyleName) == aCurrentNames.end()) + { + rItemList.push_back(aToken); + } + } + } +} + +void RecentMasterPagesSelector::AssignMasterPageToPageList ( + SdPage* pMasterPage, + const std::shared_ptr >& rpPageList) +{ + sal_uInt16 nSelectedItemId = mxPreviewValueSet->GetSelectedItemId(); + + MasterPagesSelector::AssignMasterPageToPageList(pMasterPage, rpPageList); + + // Restore the selection. + if (mxPreviewValueSet->GetItemCount() > 0) + { + if (mxPreviewValueSet->GetItemCount() >= nSelectedItemId) + mxPreviewValueSet->SelectItem(nSelectedItemId); + else + mxPreviewValueSet->SelectItem(mxPreviewValueSet->GetItemCount()); + } +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/RecentMasterPagesSelector.hxx b/sd/source/ui/sidebar/RecentMasterPagesSelector.hxx new file mode 100644 index 0000000000..6dbc3a2aae --- /dev/null +++ b/sd/source/ui/sidebar/RecentMasterPagesSelector.hxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "MasterPagesSelector.hxx" + +namespace sd::sidebar { + +/** Show the recently used master pages (that are not currently used). +*/ +class RecentMasterPagesSelector final + : public MasterPagesSelector +{ + friend class VclPtrInstance; +public: + static std::unique_ptr Create ( + weld::Widget* pParent, + ViewShellBase& rViewShellBase, + const css::uno::Reference& rxSidebar); + + RecentMasterPagesSelector ( + weld::Widget* pParent, + SdDrawDocument& rDocument, + ViewShellBase& rBase, + const std::shared_ptr& rpContainer, + const css::uno::Reference& rxSidebar); + virtual ~RecentMasterPagesSelector() override; + +private: + DECL_LINK(MasterPageListListener, LinkParamNone*, void); + virtual void Fill (ItemList& rItemList) override; + + using sd::sidebar::MasterPagesSelector::Fill; + + /** Forward this call to the base class but save and restore the + currently selected item. + Assign the given master page to the list of pages. + @param pMasterPage + This master page will usually be a member of the list of all + available master pages as provided by the MasterPageContainer. + @param rPageList + The pages to which to assign the master page. These pages may + be slides or master pages themselves. + */ + virtual void AssignMasterPageToPageList ( + SdPage* pMasterPage, + const std::shared_ptr >& rpPageList) override; + + virtual void LateInit() override; +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx b/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx new file mode 100644 index 0000000000..be339116f6 --- /dev/null +++ b/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx @@ -0,0 +1,365 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "RecentlyUsedMasterPages.hxx" +#include "MasterPageContainerProviders.hxx" +#include +#include "MasterPageDescriptor.hxx" +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace { + +OUString GetPathToImpressConfigurationRoot() +{ + return "/org.openoffice.Office.Impress/"; +} +OUString GetPathToSetNode() +{ + return "MultiPaneGUI/ToolPanel/RecentlyUsedMasterPages"; +} + +} // end of anonymous namespace + +namespace sd::sidebar { + +RecentlyUsedMasterPages* RecentlyUsedMasterPages::mpInstance = nullptr; + +RecentlyUsedMasterPages& RecentlyUsedMasterPages::Instance() +{ + if (mpInstance == nullptr) + { + ::osl::GetGlobalMutex aMutexFunctor; + ::osl::MutexGuard aGuard (aMutexFunctor()); + if (mpInstance == nullptr) + { + RecentlyUsedMasterPages* pInstance = new RecentlyUsedMasterPages(); + pInstance->LateInit(); + SdGlobalResourceContainer::Instance().AddResource ( + ::std::unique_ptr(pInstance)); + OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); + mpInstance = pInstance; + } + } + else { + OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); + } + + return *mpInstance; +} + +constexpr size_t gnMaxListSize(8); + +RecentlyUsedMasterPages::RecentlyUsedMasterPages() + : mpContainer(std::make_shared()) +{ +} + +RecentlyUsedMasterPages::~RecentlyUsedMasterPages() +{ + Link aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener)); + mpContainer->RemoveChangeListener(aLink); + + MasterPageObserver::Instance().RemoveEventListener( + LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener)); +} + +void RecentlyUsedMasterPages::LateInit() +{ + Link aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener)); + mpContainer->AddChangeListener(aLink); + + LoadPersistentValues (); + MasterPageObserver::Instance().AddEventListener( + LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener)); +} + +void RecentlyUsedMasterPages::LoadPersistentValues() +{ + try + { + tools::ConfigurationAccess aConfiguration ( + GetPathToImpressConfigurationRoot(), + tools::ConfigurationAccess::READ_ONLY); + Reference xSet ( + aConfiguration.GetConfigurationNode(GetPathToSetNode()), + UNO_QUERY); + if ( ! xSet.is()) + return; + + static constexpr OUStringLiteral sURLMemberName(u"URL"); + static constexpr OUStringLiteral sNameMemberName(u"Name"); + OUString sURL; + OUString sName; + + // Read the names and URLs of the master pages. + const Sequence aKeys (xSet->getElementNames()); + mvMasterPages.clear(); + mvMasterPages.reserve(aKeys.getLength()); + for (const auto& rKey : aKeys) + { + Reference xSetItem ( + xSet->getByName(rKey), UNO_QUERY); + if (xSetItem.is()) + { + Any aURL (xSetItem->getByName(sURLMemberName)); + Any aName (xSetItem->getByName(sNameMemberName)); + aURL >>= sURL; + aName >>= sName; + SharedMasterPageDescriptor pDescriptor = std::make_shared( + MasterPageContainer::TEMPLATE, + -1, + sURL, + OUString(), + sName, + false, + std::make_shared(sURL), + std::make_shared(sURL)); + // For user supplied templates we use a different + // preview provider: The preview in the document shows + // not only shapes on the master page but also shapes on + // the foreground. This is misleading and therefore + // these previews are discarded and created directly + // from the page objects. + if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER) + pDescriptor->mpPreviewProvider = std::make_shared(); + MasterPageContainer::Token aToken (mpContainer->PutMasterPage(pDescriptor)); + mvMasterPages.emplace_back(aToken,sURL,sName); + } + } + + ResolveList(); + } + catch (Exception&) + { + // Ignore exception. + } +} + +void RecentlyUsedMasterPages::SavePersistentValues() +{ + try + { + tools::ConfigurationAccess aConfiguration ( + GetPathToImpressConfigurationRoot(), + tools::ConfigurationAccess::READ_WRITE); + Reference xSet ( + aConfiguration.GetConfigurationNode(GetPathToSetNode()), + UNO_QUERY); + if ( ! xSet.is()) + return; + + // Clear the set. + const Sequence aKeys (xSet->getElementNames()); + for (const auto& rKey : aKeys) + xSet->removeByName (rKey); + + // Fill it with the URLs of this object. + static constexpr OUStringLiteral sURLMemberName(u"URL"); + static constexpr OUStringLiteral sNameMemberName(u"Name"); + Any aValue; + Reference xChildFactory ( + xSet, UNO_QUERY); + if ( ! xChildFactory.is()) + return; + sal_Int32 nIndex(0); + for (const auto& rDescriptor : mvMasterPages) + { + // Create new child. + OUString sKey = "index_" + OUString::number(nIndex); + Reference xChild( + xChildFactory->createInstance(), UNO_QUERY); + if (xChild.is()) + { + xSet->insertByName (sKey, Any(xChild)); + + aValue <<= rDescriptor.msURL; + xChild->replaceByName (sURLMemberName, aValue); + + aValue <<= rDescriptor.msName; + xChild->replaceByName (sNameMemberName, aValue); + } + ++nIndex; + } + + // Write the data back to disk. + aConfiguration.CommitChanges(); + } + catch (Exception&) + { + // Ignore exception. + } +} + +void RecentlyUsedMasterPages::AddEventListener (const Link& rEventListener) +{ + if (::std::find ( + maListeners.begin(), + maListeners.end(), + rEventListener) == maListeners.end()) + { + maListeners.push_back (rEventListener); + } +} + +void RecentlyUsedMasterPages::RemoveEventListener (const Link& rEventListener) +{ + maListeners.erase ( + ::std::find ( + maListeners.begin(), + maListeners.end(), + rEventListener)); +} + +int RecentlyUsedMasterPages::GetMasterPageCount() const +{ + return mvMasterPages.size(); +} + +MasterPageContainer::Token RecentlyUsedMasterPages::GetTokenForIndex (sal_uInt32 nIndex) const +{ + if(nIndexGetTokenForStyleName(rEvent.mrMasterPageName)); + break; + + case MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED: + // Do not change the list of recently master pages (the deleted + // page was recently used) but tell the listeners. They may want + // to update their lists. + SendEvent(); + break; + } +} + +IMPL_LINK(RecentlyUsedMasterPages, MasterPageContainerChangeListener, + MasterPageContainerChangeEvent&, rEvent, void) +{ + switch (rEvent.meEventType) + { + case MasterPageContainerChangeEvent::EventType::CHILD_ADDED: + case MasterPageContainerChangeEvent::EventType::CHILD_REMOVED: + case MasterPageContainerChangeEvent::EventType::INDEX_CHANGED: + ResolveList(); + break; + + default: + // Ignored. + break; + } +} + +void RecentlyUsedMasterPages::AddMasterPage ( + MasterPageContainer::Token aToken) +{ + // For the page to be inserted the token has to be valid and the page + // has to have a valid URL. This excludes master pages that do not come + // from template files. + if (aToken == MasterPageContainer::NIL_TOKEN + || mpContainer->GetURLForToken(aToken).isEmpty()) + return; + + MasterPageList::iterator aIterator ( + ::std::find_if(mvMasterPages.begin(),mvMasterPages.end(), + Descriptor::TokenComparator(aToken))); + if (aIterator != mvMasterPages.end()) + { + // When an entry for the given token already exists then remove + // it now and insert it later at the head of the list. + mvMasterPages.erase (aIterator); + } + + mvMasterPages.insert(mvMasterPages.begin(), + Descriptor( + aToken, + mpContainer->GetURLForToken(aToken), + mpContainer->GetStyleNameForToken(aToken))); + + // Shorten list to maximal size. + while (mvMasterPages.size() > gnMaxListSize) + { + mvMasterPages.pop_back (); + } + + SavePersistentValues (); + SendEvent(); +} + +void RecentlyUsedMasterPages::ResolveList() +{ + bool bNotify (false); + + for (auto& rDescriptor : mvMasterPages) + { + if (rDescriptor.maToken == MasterPageContainer::NIL_TOKEN) + { + MasterPageContainer::Token aToken (mpContainer->GetTokenForURL(rDescriptor.msURL)); + rDescriptor.maToken = aToken; + if (aToken != MasterPageContainer::NIL_TOKEN) + bNotify = true; + } + else + { + if ( ! mpContainer->HasToken(rDescriptor.maToken)) + { + rDescriptor.maToken = MasterPageContainer::NIL_TOKEN; + bNotify = true; + } + } + } + + if (bNotify) + SendEvent(); +} + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx b/sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx new file mode 100644 index 0000000000..7172df6b86 --- /dev/null +++ b/sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +#include "MasterPageContainer.hxx" + +namespace sd { +class MasterPageObserverEvent; +} + +namespace sd::sidebar { + +/** This singleton holds a list of the most recently used master pages. +*/ +class RecentlyUsedMasterPages + : public SdGlobalResource +{ +public: + /** Return the single instance of this class. + */ + static RecentlyUsedMasterPages& Instance(); + + void AddEventListener (const Link& rEventListener); + void RemoveEventListener (const Link& rEventListener); + + int GetMasterPageCount() const; + MasterPageContainer::Token GetTokenForIndex (sal_uInt32 nIndex) const; + +private: + class Descriptor + { + public: + OUString msURL; + OUString msName; + ::sd::sidebar::MasterPageContainer::Token maToken; + Descriptor (::sd::sidebar::MasterPageContainer::Token aToken, + OUString sURL, OUString sName) + : msURL(std::move(sURL)), + msName(std::move(sName)), + maToken(aToken) + {} + + class TokenComparator + { + public: + explicit TokenComparator(::sd::sidebar::MasterPageContainer::Token aToken) + : maToken(aToken) {} + bool operator () (const Descriptor& rDescriptor) + { return maToken==rDescriptor.maToken; } + + private: + ::sd::sidebar::MasterPageContainer::Token maToken; + }; + }; + + /** The single instance of this class. It is created on demand when + Instance() is called for the first time. + */ + static RecentlyUsedMasterPages* mpInstance; + + ::std::vector> maListeners; + + typedef ::std::vector MasterPageList; + MasterPageList mvMasterPages; + std::shared_ptr mpContainer; + + RecentlyUsedMasterPages(); + virtual ~RecentlyUsedMasterPages() override; + + /** Call this method after a new object has been created. + */ + void LateInit(); + + RecentlyUsedMasterPages (const RecentlyUsedMasterPages&) = delete; + + RecentlyUsedMasterPages& operator= (const RecentlyUsedMasterPages&) = delete; + + void SendEvent(); + DECL_LINK(MasterPageChangeListener, MasterPageObserverEvent&, void); + DECL_LINK(MasterPageContainerChangeListener, MasterPageContainerChangeEvent&, void); + + /** Add a descriptor for the specified master page to the end of the + list of most recently used master pages. When the page is already a + member of that list the associated descriptor is moved to the end of + the list to make it the most recently used entry. + */ + void AddMasterPage(MasterPageContainer::Token aToken); + + /** Load the list of recently used master pages from the registry where + it was saved to make it persistent. + */ + void LoadPersistentValues(); + + /** Save the list of recently used master pages to the registry to make + it persistent. + */ + void SavePersistentValues(); + + void ResolveList(); +}; + +} // end of namespace sd::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/SlideBackground.cxx b/sd/source/ui/sidebar/SlideBackground.cxx new file mode 100644 index 0000000000..6cd8d6b4c8 --- /dev/null +++ b/sd/source/ui/sidebar/SlideBackground.cxx @@ -0,0 +1,1314 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include "SlideBackground.hxx" +#include +#include +#include +#include +#include +#include +#include "PageMarginUtils.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; + +using ::com::sun::star::uno::Reference; + +namespace sd::sidebar { + +namespace { + +enum eFillStyle +{ + NONE, + SOLID, + GRADIENT, + HATCH, + BITMAP, + PATTERN +}; + +} + +SlideBackground::SlideBackground( + weld::Widget* pParent, + ViewShellBase& rBase, + css::uno::Reference xFrame, + SfxBindings* pBindings) : + PanelLayout( pParent, "SlideBackgroundPanel", "modules/simpress/ui/sidebarslidebackground.ui" ), + mrBase( rBase ), + mxPaperSizeBox(new SvxPaperSizeListBox(m_xBuilder->weld_combo_box("paperformat"))), + mxPaperOrientation(m_xBuilder->weld_combo_box("orientation")), + mxMasterSlide(m_xBuilder->weld_combo_box("masterslide")), + mxBackgroundLabel(m_xBuilder->weld_label("label3")), + mxFillStyle(m_xBuilder->weld_combo_box("fillstyle")), + mxFillLB(new ColorListBox(m_xBuilder->weld_menu_button("fillattr"), [this]{ return GetFrameWeld(); })), + mxFillAttr(m_xBuilder->weld_combo_box("fillattr1")), + mxFillGrad1(new ColorListBox(m_xBuilder->weld_menu_button("fillattr2"), [this]{ return GetFrameWeld(); })), + mxFillGrad2(new ColorListBox(m_xBuilder->weld_menu_button("fillattr3"), [this]{ return GetFrameWeld(); })), + mxInsertImage(m_xBuilder->weld_button("button2")), + mxDspMasterBackground(m_xBuilder->weld_check_button("displaymasterbackground")), + mxDspMasterObjects(m_xBuilder->weld_check_button("displaymasterobjects")), + mxCloseMaster(m_xBuilder->weld_button("closemasterslide")), + mxEditMaster(m_xBuilder->weld_button("masterslidebutton")), + mxMasterLabel(m_xBuilder->weld_label("masterlabel")), + mxMarginSelectBox(m_xBuilder->weld_combo_box("marginLB")), + mxCustomEntry(m_xBuilder->weld_label("customlabel")), + mxMarginLabel(m_xBuilder->weld_label("labelmargin")), + maPaperSizeController(SID_ATTR_PAGE_SIZE, *pBindings, *this), + maPaperOrientationController(SID_ATTR_PAGE, *pBindings, *this), + maPaperMarginLRController(SID_ATTR_PAGE_LRSPACE, *pBindings, *this), + maPaperMarginULController(SID_ATTR_PAGE_ULSPACE, *pBindings, *this), + maBckColorController(SID_ATTR_PAGE_COLOR, *pBindings, *this), + maBckGradientController(SID_ATTR_PAGE_GRADIENT, *pBindings, *this), + maBckHatchController(SID_ATTR_PAGE_HATCH, *pBindings, *this), + maBckBitmapController(SID_ATTR_PAGE_BITMAP, *pBindings, *this), + maBckFillStyleController(SID_ATTR_PAGE_FILLSTYLE, *pBindings, *this), + maBckImageController(SID_SELECT_BACKGROUND, *pBindings, *this), + maDspBckController(SID_DISPLAY_MASTER_BACKGROUND, *pBindings, *this), + maDspObjController(SID_DISPLAY_MASTER_OBJECTS, *pBindings, *this), + maMetricController(SID_ATTR_METRIC, *pBindings, *this), + maCloseMasterController(SID_CLOSE_MASTER_VIEW, *pBindings, *this), + mpPageItem( new SvxPageItem(SID_ATTR_PAGE) ), + mbSwitchModeToNormal(false), + mbSwitchModeToMaster(false), + mxFrame(std::move(xFrame)), + maDrawOtherContext(vcl::EnumContext::Application::Draw, vcl::EnumContext::Context::DrawPage), + maDrawMasterContext(vcl::EnumContext::Application::Draw, vcl::EnumContext::Context::MasterPage), + maImpressOtherContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::DrawPage), + maImpressMasterContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::MasterPage), + maImpressHandoutContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::HandoutPage), + maImpressNotesContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::NotesPage), + mbTitle(false), + mpPageLRMarginItem( new SvxLongLRSpaceItem( 0, 0, SID_ATTR_PAGE_LRSPACE ) ), + mpPageULMarginItem( new SvxLongULSpaceItem( 0, 0, SID_ATTR_PAGE_ULSPACE ) ), + m_nPageLeftMargin(0), + m_nPageRightMargin(0), + m_nPageTopMargin(0), + m_nPageBottomMargin(0), + meFUnit(GetModuleFieldUnit()), + mpBindings(pBindings) +{ + //let the listbox shrink to any size so the sidebar isn't forced to grow to + //the size of the longest master slide name in the document + mxMasterSlide->set_size_request(42, -1); + + maCustomEntry = mxCustomEntry->get_label(); + + addListener(); + Initialize(); +} + +bool SlideBackground::IsDraw() +{ + return ( maContext == maDrawMasterContext || + maContext == maDrawOtherContext ); +} + +bool SlideBackground::IsImpress() +{ + return ( maContext == maImpressMasterContext || + maContext == maImpressOtherContext || + maContext == maImpressHandoutContext || + maContext == maImpressNotesContext ); +} + +FieldUnit SlideBackground::GetCurrentUnit(SfxItemState eState, const SfxPoolItem* pState) +{ + FieldUnit eUnit; + + if (pState && eState >= SfxItemState::DEFAULT) + eUnit = static_cast(static_cast(pState)->GetValue()); + else + eUnit = GetModuleFieldUnit(); + + return eUnit; +} + +void SlideBackground::SetMarginsFieldUnit() +{ + auto nSelected = mxMarginSelectBox->get_active(); + mxMarginSelectBox->clear(); + + const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetLocaleDataWrapper(); + + if (IsInch(meFUnit)) + { + OUString sSuffix = weld::MetricSpinButton::MetricToString(FieldUnit::INCH); + for (size_t i = 0; i < SAL_N_ELEMENTS(RID_PAGEFORMATPANEL_MARGINS_INCH); ++i) + { + OUString sMeasurement = rLocaleData.getNum(RID_PAGEFORMATPANEL_MARGINS_INCH[i].second, 2, true, false) + sSuffix; + mxMarginSelectBox->append_text(SdResId(RID_PAGEFORMATPANEL_MARGINS_INCH[i].first).replaceFirst("%1", sMeasurement)); + } + } + else + { + OUString sSuffix = " " + weld::MetricSpinButton::MetricToString(FieldUnit::CM); + for (size_t i = 0; i < SAL_N_ELEMENTS(RID_PAGEFORMATPANEL_MARGINS_CM); ++i) + { + OUString sMeasurement = rLocaleData.getNum(RID_PAGEFORMATPANEL_MARGINS_CM[i].second, 2, true, false) + sSuffix; + mxMarginSelectBox->append_text(SdResId(RID_PAGEFORMATPANEL_MARGINS_CM[i].first).replaceFirst("%1", sMeasurement)); + } + } + + mxMarginSelectBox->set_active(nSelected); +} + +void SlideBackground::Initialize() +{ + SvxFillTypeBox::Fill(*mxFillStyle); + + SetMarginsFieldUnit(); + + mxPaperSizeBox->FillPaperSizeEntries( PaperSizeApp::Draw ); + mxPaperSizeBox->connect_changed(LINK(this,SlideBackground,PaperSizeModifyHdl)); + mxPaperOrientation->connect_changed(LINK(this,SlideBackground,PaperSizeModifyHdl)); + mxEditMaster->connect_clicked(LINK(this, SlideBackground, EditMasterHdl)); + mxCloseMaster->connect_clicked(LINK(this, SlideBackground, CloseMasterHdl)); + mxInsertImage->connect_clicked(LINK(this, SlideBackground, SelectBgHdl)); + meUnit = maPaperSizeController.GetCoreMetric(); + + mxMasterSlide->connect_changed(LINK(this, SlideBackground, AssignMasterPage)); + + mxFillStyle->connect_changed(LINK(this, SlideBackground, FillStyleModifyHdl)); + mxFillLB->SetSelectHdl(LINK(this, SlideBackground, FillColorHdl)); + mxFillGrad1->SetSelectHdl(LINK(this, SlideBackground, FillColorHdl)); + mxFillGrad2->SetSelectHdl(LINK(this, SlideBackground, FillColorHdl)); + mxFillAttr->connect_changed(LINK(this, SlideBackground, FillBackgroundHdl)); + + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + if (pMainViewShell) + { + FrameView *pFrameView = pMainViewShell->GetFrameView(); + + if ( pFrameView->GetViewShEditMode() == EditMode::Page ) + { + SdPage* mpPage = pMainViewShell->getCurrentPage(); + populateMasterSlideDropdown(); + + OUString aLayoutName( mpPage->GetLayoutName() ); + aLayoutName = aLayoutName.copy(0,aLayoutName.indexOf(SD_LT_SEPARATOR)); + mxMasterSlide->set_active_text(aLayoutName); + } + } + + mxFillStyle->set_active(static_cast< sal_Int32 >(NONE)); + + mxDspMasterBackground->connect_toggled(LINK(this, SlideBackground, DspBackground)); + mxDspMasterObjects->connect_toggled(LINK(this, SlideBackground, DspObjects)); + + //margins + mxMarginSelectBox->connect_changed(LINK(this, SlideBackground, ModifyMarginHdl)); + + Update(); + UpdateMarginBox(); +} + +void SlideBackground::DumpAsPropertyTree(::tools::JsonWriter& rJsonWriter) +{ + if (mxPaperSizeBox->get_active() == -1) + { + mpBindings->Update(SID_ATTR_PAGE_SIZE); + } + + PanelLayout::DumpAsPropertyTree(rJsonWriter); +} + +void SlideBackground::HandleContextChange( + const vcl::EnumContext& rContext) +{ + if (maContext == rContext) + return; + maContext = rContext; + + if ( IsImpress() ) + { + mxMasterLabel->set_label(SdResId(STR_MASTERSLIDE_LABEL)); + + // margin selector is only for Draw + mxMarginSelectBox->hide(); + mxMarginLabel->hide(); + + if ( maContext == maImpressMasterContext ) + { + mxCloseMaster->show(); + mxEditMaster->hide(); + mxMasterSlide->set_sensitive(false); + mxMasterSlide->clear(); + mxDspMasterBackground->set_sensitive(false); + mxDspMasterObjects->set_sensitive(false); + mxFillStyle->hide(); + mxBackgroundLabel->hide(); + mxInsertImage->show(); + + mxFillLB->hide(); + mxFillAttr->hide(); + mxFillGrad1->hide(); + mxFillGrad2->hide(); + } + else if ( maContext == maImpressHandoutContext || maContext == maImpressNotesContext ) + { + mxCloseMaster->hide(); + mxEditMaster->hide(); + mxMasterSlide->set_sensitive(false); + mxMasterSlide->clear(); + mxDspMasterBackground->set_sensitive(false); + mxDspMasterObjects->set_sensitive(false); + mxFillStyle->hide(); + mxBackgroundLabel->hide(); + mxInsertImage->hide(); + } + else if (maContext == maImpressOtherContext) + { + mxCloseMaster->hide(); + mxEditMaster->show(); + mxMasterSlide->set_sensitive(true); + populateMasterSlideDropdown(); + mxDspMasterBackground->set_sensitive(true); + mxDspMasterObjects->set_sensitive(true); + mxFillStyle->show(); + mxBackgroundLabel->show(); + mxInsertImage->show(); + } + + // Need to do a relayouting, otherwise the panel size is not updated after show / hide controls + if (m_pPanel) + m_pPanel->TriggerDeckLayouting(); + + } + else if ( IsDraw() ) + { + mxMasterLabel->set_label(SdResId(STR_MASTERPAGE_LABEL)); + mxDspMasterBackground->hide(); + mxDspMasterObjects->hide(); + + if (maContext == maDrawOtherContext) + { + mxEditMaster->hide(); + mxFillStyle->show(); + mxBackgroundLabel->show(); + } + else if (maContext == maDrawMasterContext) + { + mxFillStyle->hide(); + mxBackgroundLabel->hide(); + } + } + + // The Insert Image button in the sidebar issues .uno:SelectBackground, + // which when invoked without arguments will open the file-open-dialog + // to prompt the user to select a file. This is useless in LOOL. + // Hide for now so the user will only be able to use the menu to insert + // background image, which prompts the user for file selection in the browser. + if (comphelper::LibreOfficeKit::isActive()) + mxInsertImage->hide(); +} + +void SlideBackground::Update() +{ + eFillStyle nPos = static_cast(mxFillStyle->get_active()); + + if(maContext != maImpressOtherContext && maContext != maDrawOtherContext) + nPos = NONE; + + SfxObjectShell* pSh = SfxObjectShell::Current(); + if (!pSh) + return; + + switch(nPos) + { + case NONE: + { + mxFillLB->hide(); + mxFillAttr->hide(); + mxFillGrad1->hide(); + mxFillGrad2->hide(); + } + break; + case SOLID: + { + mxFillAttr->hide(); + mxFillGrad1->hide(); + mxFillGrad2->hide(); + mxFillLB->show(); + const Color aColor = GetColorSetOrDefault(); + mxFillLB->SelectEntry(aColor); + } + break; + case GRADIENT: + { + mxFillLB->hide(); + mxFillAttr->hide(); + mxFillGrad1->show(); + mxFillGrad2->show(); + + const basegfx::BGradient aBGradient = GetGradientSetOrDefault(); + const Color aStartColor(aBGradient.GetColorStops().front().getStopColor()); + mxFillGrad1->SelectEntry(aStartColor); + const Color aEndColor(aBGradient.GetColorStops().back().getStopColor()); + mxFillGrad2->SelectEntry(aEndColor); + + // MCGR: preserve ColorStops if given. + // tdf#155901 We need offset of first and last stop, so include them. + if (aBGradient.GetColorStops().size() >= 2) + maColorStops = aBGradient.GetColorStops(); + else + maColorStops.clear(); + } + break; + + case HATCH: + { + mxFillLB->hide(); + mxFillAttr->show(); + mxFillAttr->clear(); + SvxFillAttrBox::Fill(*mxFillAttr, pSh->GetItem(SID_HATCH_LIST)->GetHatchList()); + mxFillGrad1->hide(); + mxFillGrad2->hide(); + + const OUString aHatchName = GetHatchingSetOrDefault(); + mxFillAttr->set_active_text( aHatchName ); + } + break; + + case BITMAP: + case PATTERN: + { + mxFillLB->hide(); + mxFillAttr->show(); + mxFillAttr->clear(); + mxFillGrad1->hide(); + mxFillGrad2->hide(); + OUString aName; + if(nPos == BITMAP) + { + SvxFillAttrBox::Fill(*mxFillAttr, pSh->GetItem(SID_BITMAP_LIST)->GetBitmapList()); + aName = GetBitmapSetOrDefault(); + } + else if(nPos == PATTERN) + { + SvxFillAttrBox::Fill(*mxFillAttr, pSh->GetItem(SID_PATTERN_LIST)->GetPatternList()); + aName = GetPatternSetOrDefault(); + } + mxFillAttr->set_active_text( aName ); + } + break; + default: + break; + } + + // Need to do a relayouting, otherwise the panel size is not updated after show / hide controls + if (m_pPanel) + m_pPanel->TriggerDeckLayouting(); +} + +void SlideBackground::UpdateMarginBox() +{ + m_nPageLeftMargin = mpPageLRMarginItem->GetLeft(); + m_nPageRightMargin = mpPageLRMarginItem->GetRight(); + m_nPageTopMargin = mpPageULMarginItem->GetUpper(); + m_nPageBottomMargin = mpPageULMarginItem->GetLower(); + + int nCustomIndex = mxMarginSelectBox->find_text(maCustomEntry); + + if( IsNone(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(0); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else if( IsNarrow(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(1); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else if( IsModerate(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(2); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else if( IsNormal075(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(3); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else if( IsNormal100(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(4); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else if( IsNormal125(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(5); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else if( IsWide(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) ) + { + mxMarginSelectBox->set_active(6); + if (nCustomIndex != -1) + mxMarginSelectBox->remove(nCustomIndex); + } + else + { + if (nCustomIndex == -1) + mxMarginSelectBox->append_text(maCustomEntry); + mxMarginSelectBox->set_active_text(maCustomEntry); + } +} + +void SlideBackground::SetPanelTitle( const OUString& rTitle ) +{ + Reference xController( mxFrame->getController(), uno::UNO_QUERY); + if ( !xController.is() ) + return; + + Reference xSidebarProvider = xController->getSidebar(); + if ( !xSidebarProvider.is() ) + return; + + Reference xDecks = xSidebarProvider->getDecks(); + if ( !xDecks.is() ) + return; + + Reference xDeck ( xDecks->getByName("PropertyDeck"), uno::UNO_QUERY); + if ( !xDeck.is() ) + return; + + Reference xPanels = xDeck->getPanels(); + if ( !xPanels.is() ) + return; + + if (xPanels->hasByName("SlideBackgroundPanel")) + { + Reference xPanel ( xPanels->getByName("SlideBackgroundPanel"), uno::UNO_QUERY); + if ( !xPanel.is() ) + return; + + xPanel->setTitle( rTitle ); + } +} + +void SlideBackground::addListener() +{ + Link aLink( LINK(this, SlideBackground, EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->AddEventListener( aLink ); +} + +void SlideBackground::removeListener() +{ + Link aLink( LINK(this, SlideBackground, EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); +} + +IMPL_LINK(SlideBackground, EventMultiplexerListener, + tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + // add more events as per requirement + // Master Page change triggers a shape change event. Solves sync problem. + case EventMultiplexerEventId::ShapeChanged: + populateMasterSlideDropdown(); + break; + case EventMultiplexerEventId::EditModeNormal: + mbSwitchModeToNormal = true; + break; + case EventMultiplexerEventId::EditModeMaster: + mbSwitchModeToMaster = true; + break; + case EventMultiplexerEventId::EditViewSelection: + case EventMultiplexerEventId::EndTextEdit: + { + if ( mbSwitchModeToMaster ) + { + if( IsImpress() ) + SetPanelTitle(SdResId(STR_MASTERSLIDE_NAME)); + else + SetPanelTitle(SdResId(STR_MASTERPAGE_NAME)); + mbSwitchModeToMaster = false; + } + else if ( mbSwitchModeToNormal ) + { + if( IsImpress() ) + SetPanelTitle(SdResId(STR_SLIDE_NAME)); + else + SetPanelTitle(SdResId(STR_PAGE_NAME)); + mbSwitchModeToNormal = false; + } + + } + break; + case EventMultiplexerEventId::CurrentPageChanged: + { + static const sal_uInt16 SidArray[] = { + SID_ATTR_PAGE_COLOR, + SID_ATTR_PAGE_GRADIENT, + SID_ATTR_PAGE_HATCH, + SID_ATTR_PAGE_BITMAP, + SID_ATTR_PAGE_FILLSTYLE, + SID_DISPLAY_MASTER_BACKGROUND, + SID_DISPLAY_MASTER_OBJECTS, + 0 }; + updateMasterSlideSelection(); + GetBindings()->Invalidate( SidArray ); + } + break; + case EventMultiplexerEventId::ViewAdded: + { + if(!mbTitle) + { + if( IsDraw() ) + { + mxCloseMaster->hide(); + mxEditMaster->hide(); + if( maContext == maDrawMasterContext) + SetPanelTitle(SdResId(STR_MASTERPAGE_NAME)); + else + SetPanelTitle(SdResId(STR_PAGE_NAME)); + } + else if ( maContext == maImpressOtherContext || maContext == maImpressMasterContext ) + { + if( maContext == maImpressMasterContext ) + SetPanelTitle(SdResId(STR_MASTERSLIDE_NAME)); + else + SetPanelTitle(SdResId(STR_SLIDE_NAME)); + } + else if ( maContext == maImpressNotesContext ) + { + mxMasterLabel->set_label(SdResId(STR_MASTERSLIDE_LABEL)); + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + + if (pMainViewShell) + { + DrawViewShell* pDrawViewShell = static_cast(pMainViewShell); + if ( pDrawViewShell->GetEditMode() == EditMode::MasterPage) + SetPanelTitle(SdResId(STR_MASTERSLIDE_NAME)); + else // EditMode::Page + SetPanelTitle(SdResId(STR_SLIDE_NAME)); + } + } + mbTitle = true; + } + } + break; + default: + break; + } +} + +void SlideBackground::populateMasterSlideDropdown() +{ + mxMasterSlide->clear(); + ::sd::DrawDocShell* pDocSh = dynamic_cast<::sd::DrawDocShell*>( SfxObjectShell::Current() ); + SdDrawDocument* pDoc = pDocSh ? pDocSh->GetDoc() : nullptr; + sal_uInt16 nCount = pDoc ? pDoc->GetMasterPageCount() : 0; + for( sal_uInt16 nLayout = 0; nLayout < nCount; nLayout++ ) + { + SdPage* pMaster = static_cast(pDoc->GetMasterPage(nLayout)); + if( pMaster->GetPageKind() == PageKind::Standard) + { + OUString aLayoutName(pMaster->GetLayoutName()); + aLayoutName = aLayoutName.copy(0,aLayoutName.indexOf(SD_LT_SEPARATOR)); + mxMasterSlide->append_text(aLayoutName); + } + } + updateMasterSlideSelection(); +} + +void SlideBackground::updateMasterSlideSelection() +{ + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + SdPage* pPage = pMainViewShell ? pMainViewShell->getCurrentPage() : nullptr; + if (pPage != nullptr && pPage->TRG_HasMasterPage()) + { + SdrPage& rMasterPage (pPage->TRG_GetMasterPage()); + SdPage* pMasterPage = static_cast(&rMasterPage); + mxMasterSlide->set_active_text(pMasterPage->GetName()); + } +} + +SlideBackground::~SlideBackground() +{ + removeListener(); + + mxCustomEntry.reset(); + mxMarginLabel.reset(); + mxPaperSizeBox.reset(); + mxPaperOrientation.reset(); + mxMasterSlide.reset(); + mxBackgroundLabel.reset(); + mxFillAttr.reset(); + mxFillGrad1.reset(); + mxFillGrad2.reset(); + mxFillStyle.reset(); + mxFillLB.reset(); + mxInsertImage.reset(); + mxMarginSelectBox.reset(); + mxDspMasterBackground.reset(); + mxDspMasterObjects.reset(); + mxMasterLabel.reset(); + mxEditMaster.reset(); + mxCloseMaster.reset(); + + maPaperSizeController.dispose(); + maPaperOrientationController.dispose(); + maPaperMarginLRController.dispose(); + maPaperMarginULController.dispose(); + maBckColorController.dispose(); + maBckGradientController.dispose(); + maBckHatchController.dispose(); + maBckBitmapController.dispose(); + maBckFillStyleController.dispose(); + maBckImageController.dispose(); + maDspBckController.dispose(); + maDspObjController.dispose(); + maMetricController.dispose(); + maCloseMasterController.dispose(); + + mpPageItem.reset(); + mpColorItem.reset(); + mpHatchItem.reset(); + mpBitmapItem.reset(); + mpPageLRMarginItem.reset(); + mpPageULMarginItem.reset(); +} + +void SlideBackground::ExecuteMarginLRChange(const ::tools::Long mnPageLeftMargin, const ::tools::Long mnPageRightMargin) +{ + mpPageLRMarginItem->SetLeft(mnPageLeftMargin); + mpPageLRMarginItem->SetRight(mnPageRightMargin); + GetBindings()->GetDispatcher()->ExecuteList( SID_ATTR_PAGE_LRSPACE, SfxCallMode::RECORD, { mpPageLRMarginItem.get() } ); +} + +void SlideBackground::ExecuteMarginULChange(const ::tools::Long mnPageTopMargin, const ::tools::Long mnPageBottomMargin) +{ + mpPageULMarginItem->SetUpper(mnPageTopMargin); + mpPageULMarginItem->SetLower(mnPageBottomMargin); + GetBindings()->GetDispatcher()->ExecuteList( SID_ATTR_PAGE_ULSPACE, SfxCallMode::RECORD, { mpPageULMarginItem.get() } ); +} + +Color const & SlideBackground::GetColorSetOrDefault() +{ + // Tango Sky Blue 1, to be consistent w/ area fill panel (b/c COL_AUTO for slides is transparent) + if ( !mpColorItem ) + mpColorItem.reset( new XFillColorItem( OUString(), Color(0x72, 0x9f, 0xcf) ) ); + + return mpColorItem->GetColorValue(); +} + +basegfx::BGradient const & SlideBackground::GetGradientSetOrDefault() +{ + if( !mpGradientItem ) + { + basegfx::BGradient aGradient; + OUString aGradientName; + if (SfxObjectShell* pSh = SfxObjectShell::Current()) + { + const SvxGradientListItem * pGradListItem = pSh->GetItem(SID_GRADIENT_LIST); + aGradient = pGradListItem->GetGradientList()->GetGradient(0)->GetGradient(); + aGradientName = pGradListItem->GetGradientList()->GetGradient(0)->GetName(); + } + mpGradientItem.reset( new XFillGradientItem( aGradientName, aGradient ) ); + } + + return mpGradientItem->GetGradientValue(); +} + +OUString const & SlideBackground::GetHatchingSetOrDefault() +{ + if( !mpHatchItem ) + { + XHatch aHatch; + OUString aHatchName; + if (SfxObjectShell* pSh = SfxObjectShell::Current()) + { + const SvxHatchListItem * pHatchListItem = pSh->GetItem(SID_HATCH_LIST); + aHatch = pHatchListItem->GetHatchList()->GetHatch(0)->GetHatch(); + aHatchName = pHatchListItem->GetHatchList()->GetHatch(0)->GetName(); + } + mpHatchItem.reset( new XFillHatchItem( aHatchName, aHatch ) ); + } + + return mpHatchItem->GetName(); +} + +OUString const & SlideBackground::GetBitmapSetOrDefault() +{ + if( !mpBitmapItem || mpBitmapItem->isPattern()) + { + GraphicObject aGraphObj; + OUString aBmpName; + if (SfxObjectShell* pSh = SfxObjectShell::Current()) + { + const SvxBitmapListItem * pBmpListItem = pSh->GetItem(SID_BITMAP_LIST); + aGraphObj = pBmpListItem->GetBitmapList()->GetBitmap(0)->GetGraphicObject(); + aBmpName = pBmpListItem->GetBitmapList()->GetBitmap(0)->GetName(); + } + mpBitmapItem.reset( new XFillBitmapItem( aBmpName, aGraphObj ) ); + } + + return mpBitmapItem->GetName(); +} + +OUString const & SlideBackground::GetPatternSetOrDefault() +{ + if( !mpBitmapItem || !(mpBitmapItem->isPattern())) + { + GraphicObject aGraphObj; + OUString aPtrnName; + if (SfxObjectShell* pSh = SfxObjectShell::Current()) + { + const SvxPatternListItem * pPtrnListItem = pSh->GetItem(SID_PATTERN_LIST); + aGraphObj = pPtrnListItem->GetPatternList()->GetBitmap(0)->GetGraphicObject(); + aPtrnName = pPtrnListItem->GetPatternList()->GetBitmap(0)->GetName(); + } + mpBitmapItem.reset( new XFillBitmapItem( aPtrnName, aGraphObj ) ); + } + + return mpBitmapItem->GetName(); +} + +void SlideBackground::NotifyItemUpdate( + const sal_uInt16 nSID, + const SfxItemState eState, + const SfxPoolItem* pState) +{ + switch(nSID) + { + + case SID_ATTR_PAGE_COLOR: + { + if(eState >= SfxItemState::DEFAULT) + { + mxFillStyle->set_active(static_cast< sal_Int32 >(SOLID)); + mpColorItem.reset(pState ? static_cast< XFillColorItem* >(pState->Clone()) : nullptr); + Update(); + } + } + break; + + case SID_ATTR_PAGE_HATCH: + { + if(eState >= SfxItemState::DEFAULT) + { + mxFillStyle->set_active(static_cast< sal_Int32 >(HATCH)); + mpHatchItem.reset(pState ? static_cast < XFillHatchItem* >(pState->Clone()) : nullptr); + Update(); + } + } + break; + + case SID_ATTR_PAGE_GRADIENT: + { + if(eState >= SfxItemState::DEFAULT) + { + mxFillStyle->set_active(static_cast< sal_Int32>(GRADIENT)); + mpGradientItem.reset(pState ? static_cast< XFillGradientItem* >(pState->Clone()) : nullptr); + Update(); + } + } + break; + case SID_ATTR_PAGE_BITMAP: + { + if(eState >= SfxItemState::DEFAULT) + { + mpBitmapItem.reset(pState ? static_cast< XFillBitmapItem* >(pState->Clone()) : nullptr); + if(mpBitmapItem) + { + if(mpBitmapItem->isPattern()) + mxFillStyle->set_active(static_cast< sal_Int32 >(PATTERN)); + else + mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP)); + } + else + mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP)); + Update(); + } + } + break; + + case SID_ATTR_PAGE_FILLSTYLE: + { + const XFillStyleItem* pFillStyleItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pFillStyleItem = dynamic_cast< const XFillStyleItem* >(pState); + if (pFillStyleItem) + { + css::drawing::FillStyle eXFS = pFillStyleItem->GetValue(); + switch(eXFS) + { + case drawing::FillStyle_NONE: + mxFillStyle->set_active(static_cast< sal_Int32 >(NONE)); + break; + case drawing::FillStyle_SOLID: + mxFillStyle->set_active(static_cast< sal_Int32 >(SOLID)); + break; + case drawing::FillStyle_GRADIENT: + mxFillStyle->set_active(static_cast< sal_Int32 >(GRADIENT)); + break; + case drawing::FillStyle_HATCH: + mxFillStyle->set_active(static_cast< sal_Int32 >(HATCH)); + break; + case drawing::FillStyle_BITMAP: + { + if(mpBitmapItem->isPattern()) + mxFillStyle->set_active(static_cast< sal_Int32 >(PATTERN)); + else + mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP)); + } + break; + default: + break; + } + Update(); + } + } + break; + + case SID_ATTR_PAGE_SIZE: + { + const SvxSizeItem* pSizeItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pSizeItem = dynamic_cast(pState); + if (pSizeItem) + { + Size aPaperSize = pSizeItem->GetSize(); + if (mxPaperOrientation->get_active() == 0) + Swap(aPaperSize); + + Paper ePaper = SvxPaperInfo::GetSvxPaper(aPaperSize, meUnit); + mxPaperSizeBox->set_active_id( ePaper ); + } + } + break; + + case SID_ATTR_PAGE: + { + const SvxPageItem* pPageItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pPageItem = dynamic_cast(pState); + if (pPageItem) + { + mpPageItem.reset(pPageItem->Clone()); + bool bIsLandscape = mpPageItem->IsLandscape(); + mxPaperOrientation->set_active( bIsLandscape ? 0 : 1 ); + } + } + break; + + case SID_ATTR_PAGE_LRSPACE: + { + const SvxLongLRSpaceItem* pLRItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pLRItem = dynamic_cast(pState); + if (pLRItem) + { + mpPageLRMarginItem.reset( static_cast(pState->Clone()) ); + UpdateMarginBox(); + } + } + break; + + case SID_ATTR_PAGE_ULSPACE: + { + const SvxLongULSpaceItem* pULItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pULItem = dynamic_cast(pState); + if (pULItem) + { + mpPageULMarginItem.reset( static_cast(pState->Clone()) ); + UpdateMarginBox(); + } + } + break; + + case SID_DISPLAY_MASTER_BACKGROUND: + { + const SfxBoolItem* pBoolItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pBoolItem = dynamic_cast< const SfxBoolItem* >(pState); + if (pBoolItem) + mxDspMasterBackground->set_active(pBoolItem->GetValue()); + } + break; + case SID_DISPLAY_MASTER_OBJECTS: + { + const SfxBoolItem* pBoolItem = nullptr; + if (eState >= SfxItemState::DEFAULT) + pBoolItem = dynamic_cast< const SfxBoolItem* >(pState); + if (pBoolItem) + mxDspMasterObjects->set_active(pBoolItem->GetValue()); + } + break; + case SID_SELECT_BACKGROUND: + { + if(eState >= SfxItemState::DEFAULT) + { + mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP)); + Update(); + } + } + break; + case SID_ATTR_METRIC: + { + FieldUnit eFUnit = GetCurrentUnit(eState, pState); + if (meFUnit != eFUnit) + { + meFUnit = eFUnit; + SetMarginsFieldUnit(); + UpdateMarginBox(); + } + } + break; + default: + break; + } +} + +IMPL_LINK_NOARG(SlideBackground, FillStyleModifyHdl, weld::ComboBox&, void) +{ + const eFillStyle nPos = static_cast(mxFillStyle->get_active()); + Update(); + + switch (nPos) + { + case NONE: + { + const XFillStyleItem aXFillStyleItem(drawing::FillStyle_NONE); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_FILLSTYLE, SfxCallMode::RECORD, { &aXFillStyleItem }); + } + break; + + case SOLID: + { + if (mpColorItem) + { + const XFillColorItem aItem( OUString(), mpColorItem->GetColorValue() ); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLOR, SfxCallMode::RECORD, { &aItem }); + } + } + break; + + case GRADIENT: + { + if (mpGradientItem) + { + const XFillGradientItem aItem( mpGradientItem->GetName(), mpGradientItem->GetGradientValue() ); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_GRADIENT, SfxCallMode::RECORD, { &aItem }); + } + } + break; + + case HATCH: + { + if (mpHatchItem) + { + const XFillHatchItem aItem( mpHatchItem->GetName(), mpHatchItem->GetHatchValue() ); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_HATCH, SfxCallMode::RECORD, { &aItem }); + } + } + break; + + case BITMAP: + case PATTERN: + { + if (mpBitmapItem) + { + const XFillBitmapItem aItem( mpBitmapItem->GetName(), mpBitmapItem->GetGraphicObject() ); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_BITMAP, SfxCallMode::RECORD, { &aItem }); + } + } + break; + + default: + break; + } +//TODO mxFillStyle->Selected(); +} + +IMPL_LINK_NOARG(SlideBackground, PaperSizeModifyHdl, weld::ComboBox&, void) +{ + const Paper ePaper = mxPaperSizeBox->get_active_id(); + Size aSize(SvxPaperInfo::GetPaperSize(ePaper, meUnit)); + + if (mxPaperOrientation->get_active() == 0) + Swap(aSize); + + mpPageItem->SetLandscape(mxPaperOrientation->get_active() == 0); + const SvxSizeItem aSizeItem(SID_ATTR_PAGE_SIZE, aSize); + // Page/slide properties dialog (FuPage::ExecuteDialog and ::ApplyItemSet) misuses + // SID_ATTR_PAGE_EXT1 to distinguish between Impress and Draw, as for whether to fit + // objects to paper size. Until that is handled somehow better, we do the same here + const SfxBoolItem aFitObjs(SID_ATTR_PAGE_EXT1, IsImpress()); + + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_SIZE, SfxCallMode::RECORD, + { &aSizeItem, mpPageItem.get(), &aFitObjs }); + + // Notify LOK clients of the page size change. + if (!comphelper::LibreOfficeKit::isActive()) + return; + + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + if (pViewShell->GetDocId() == mrBase.GetDocId()) + { + SdXImpressDocument* pDoc = comphelper::getFromUnoTunnel(pViewShell->GetCurrentDocument()); + SfxLokHelper::notifyDocumentSizeChangedAllViews(pDoc); + } + pViewShell = SfxViewShell::GetNext(*pViewShell); + } +} + +IMPL_LINK_NOARG(SlideBackground, FillColorHdl, ColorListBox&, void) +{ + const drawing::FillStyle eXFS = static_cast(mxFillStyle->get_active()); + switch(eXFS) + { + case drawing::FillStyle_SOLID: + { + XFillColorItem aItem(OUString(), mxFillLB->GetSelectEntryColor()); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLOR, SfxCallMode::RECORD, { &aItem }); + } + break; + case drawing::FillStyle_GRADIENT: + { + basegfx::BGradient aGradient = GetGradientSetOrDefault(); + aGradient.SetColorStops(createColorStops()); + + // the name doesn't really matter, it'll be converted to unique one eventually, + // but it has to be non-empty + XFillGradientItem aItem("gradient", aGradient); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_GRADIENT, SfxCallMode::RECORD, { &aItem }); + } + break; + default: + break; + } +} + +IMPL_LINK_NOARG(SlideBackground, FillBackgroundHdl, weld::ComboBox&, void) +{ + const eFillStyle nFillPos = static_cast(mxFillStyle->get_active()); + SfxObjectShell* pSh = SfxObjectShell::Current(); + if (!pSh) + return; + switch(nFillPos) + { + + case HATCH: + { + const SvxHatchListItem * pHatchListItem = pSh->GetItem(SID_HATCH_LIST); + sal_uInt16 nPos = mxFillAttr->get_active(); + XHatch aHatch = pHatchListItem->GetHatchList()->GetHatch(nPos)->GetHatch(); + const OUString aHatchName = pHatchListItem->GetHatchList()->GetHatch(nPos)->GetName(); + + XFillHatchItem aItem(aHatchName, aHatch); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_HATCH, SfxCallMode::RECORD, { &aItem }); + } + break; + + case BITMAP: + case PATTERN: + { + sal_Int16 nPos = mxFillAttr->get_active(); + GraphicObject aBitmap; + OUString aName; + if( nFillPos == BITMAP ) + { + SvxBitmapListItem const * pBitmapListItem = pSh->GetItem(SID_BITMAP_LIST); + aBitmap = pBitmapListItem->GetBitmapList()->GetBitmap(nPos)->GetGraphicObject(); + aName = pBitmapListItem->GetBitmapList()->GetBitmap(nPos)->GetName(); + } + else if( nFillPos == PATTERN ) + { + SvxPatternListItem const * pPatternListItem = pSh->GetItem(SID_PATTERN_LIST); + aBitmap = pPatternListItem->GetPatternList()->GetBitmap(nPos)->GetGraphicObject(); + aName = pPatternListItem->GetPatternList()->GetBitmap(nPos)->GetName(); + } + XFillBitmapItem aItem(aName, aBitmap); + GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_BITMAP, SfxCallMode::RECORD, { &aItem }); + } + break; + + default: + break; + } +} + +IMPL_LINK_NOARG(SlideBackground, AssignMasterPage, weld::ComboBox&, void) +{ + ::sd::DrawDocShell* pDocSh = dynamic_cast<::sd::DrawDocShell*>( SfxObjectShell::Current() ); + SdDrawDocument* pDoc = pDocSh ? pDocSh->GetDoc() : nullptr; + if (!pDoc) + return; + + auto pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(mrBase); + if (pSSVS == nullptr) + return; + + auto& rSSController = pSSVS->GetSlideSorter().GetController(); + auto& rPageSelector = rSSController.GetPageSelector(); + + for( sal_uInt16 nPage = 0; nPage < pDoc->GetSdPageCount(PageKind::Standard); nPage++ ) + { + if (rPageSelector.IsPageSelected(nPage)) + { + OUString aLayoutName(mxMasterSlide->get_active_text()); + pDoc->SetMasterPage(nPage, aLayoutName, pDoc, false, false); + } + } +} + +IMPL_LINK_NOARG(SlideBackground, EditMasterHdl, weld::Button&, void) +{ + GetBindings()->GetDispatcher()->Execute( SID_SLIDE_MASTER_MODE, SfxCallMode::RECORD ); +} + +IMPL_LINK_NOARG(SlideBackground, SelectBgHdl, weld::Button&, void) +{ + GetBindings()->GetDispatcher()->Execute( SID_SELECT_BACKGROUND, SfxCallMode::RECORD ); +} + +IMPL_LINK_NOARG(SlideBackground, CloseMasterHdl, weld::Button&, void) +{ + GetBindings()->GetDispatcher()->Execute( SID_CLOSE_MASTER_VIEW, SfxCallMode::RECORD ); +} + +IMPL_LINK_NOARG(SlideBackground, DspBackground, weld::Toggleable&, void) +{ + bool IsChecked = mxDspMasterBackground->get_active(); + const SfxBoolItem aBoolItem(SID_DISPLAY_MASTER_BACKGROUND, IsChecked); + GetBindings()->GetDispatcher()->ExecuteList(SID_DISPLAY_MASTER_BACKGROUND, SfxCallMode::RECORD, { &aBoolItem }); +} + +IMPL_LINK_NOARG(SlideBackground, DspObjects, weld::Toggleable&, void) +{ + bool IsChecked = mxDspMasterObjects->get_active(); + const SfxBoolItem aBoolItem(SID_DISPLAY_MASTER_OBJECTS,IsChecked); + GetBindings()->GetDispatcher()->ExecuteList(SID_DISPLAY_MASTER_OBJECTS, SfxCallMode::RECORD, { &aBoolItem, &aBoolItem }); +} + +IMPL_LINK_NOARG( SlideBackground, ModifyMarginHdl, weld::ComboBox&, void ) +{ + bool bApplyNewPageMargins = true; + switch ( mxMarginSelectBox->get_active() ) + { + case 0: + SetNone(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + case 1: + SetNarrow(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + case 2: + SetModerate(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + case 3: + SetNormal075(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + case 4: + SetNormal100(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + case 5: + SetNormal125(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + case 6: + SetWide(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin); + break; + default: + bApplyNewPageMargins = false; + break; + } + + if(bApplyNewPageMargins) + { + ExecuteMarginLRChange(m_nPageLeftMargin, m_nPageRightMargin); + ExecuteMarginULChange(m_nPageTopMargin, m_nPageBottomMargin); + } +} + +basegfx::BColorStops SlideBackground::createColorStops() +{ + basegfx::BColorStops aColorStops; + + if (maColorStops.size() >= 2) + { + aColorStops = maColorStops; + aColorStops.front() = basegfx::BColorStop(maColorStops.front().getStopOffset(), + mxFillGrad1->GetSelectEntryColor().getBColor()); + aColorStops.back() = basegfx::BColorStop(maColorStops.back().getStopOffset(), + mxFillGrad2->GetSelectEntryColor().getBColor()); + } + else + { + aColorStops.emplace_back(0.0, mxFillGrad1->GetSelectEntryColor().getBColor()); + aColorStops.emplace_back(1.0, mxFillGrad2->GetSelectEntryColor().getBColor()); + } + + return aColorStops; +} + +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/sidebar/SlideBackground.hxx b/sd/source/ui/sidebar/SlideBackground.hxx new file mode 100644 index 0000000000..8d5932629b --- /dev/null +++ b/sd/source/ui/sidebar/SlideBackground.hxx @@ -0,0 +1,185 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +namespace sd { class ViewShellBase; } +namespace sd::tools { class EventMultiplexerEvent; } + +class ColorListBox; +class SvxPageItem; +class SvxLongLRSpaceItem; +class SvxLongULSpaceItem; +class XFillColorItem; +class XFillGradientItem; +class XFillBitmapItem; +class XFillHatchItem; + +namespace sd::sidebar { + +class SlideBackground : + public PanelLayout, + public ::sfx2::sidebar::IContextChangeReceiver, + public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface +{ +public: + SlideBackground( + weld::Widget* pParent, + ViewShellBase& rBase, + css::uno::Reference xFrame, + SfxBindings* pBindings ); + virtual ~SlideBackground() override; + SfxBindings* GetBindings() { return mpBindings; } + // Window + virtual void NotifyItemUpdate( + const sal_uInt16 nSID, + const SfxItemState eState, + const SfxPoolItem* pState) override; + + virtual void GetControlState( + const sal_uInt16 /*nSId*/, + boost::property_tree::ptree& /*rState*/) override {}; + + virtual void HandleContextChange( + const vcl::EnumContext& rContext) override; + virtual void DumpAsPropertyTree(::tools::JsonWriter&) override; + +private: + + ViewShellBase& mrBase; + + std::unique_ptr mxPaperSizeBox; + std::unique_ptr mxPaperOrientation; + std::unique_ptr mxMasterSlide; + std::unique_ptr mxBackgroundLabel; + std::unique_ptr mxFillStyle; + std::unique_ptr mxFillLB; + std::unique_ptr mxFillAttr; + std::unique_ptr mxFillGrad1; + std::unique_ptr mxFillGrad2; + std::unique_ptr mxInsertImage; + std::unique_ptr mxDspMasterBackground; + std::unique_ptr mxDspMasterObjects; + std::unique_ptr mxCloseMaster; + std::unique_ptr mxEditMaster; + std::unique_ptr mxMasterLabel; + std::unique_ptr mxMarginSelectBox; + std::unique_ptr mxCustomEntry; + std::unique_ptr mxMarginLabel; + + ::sfx2::sidebar::ControllerItem maPaperSizeController; + ::sfx2::sidebar::ControllerItem maPaperOrientationController; + ::sfx2::sidebar::ControllerItem maPaperMarginLRController; + ::sfx2::sidebar::ControllerItem maPaperMarginULController; + ::sfx2::sidebar::ControllerItem maBckColorController; + ::sfx2::sidebar::ControllerItem maBckGradientController; + ::sfx2::sidebar::ControllerItem maBckHatchController; + ::sfx2::sidebar::ControllerItem maBckBitmapController; + ::sfx2::sidebar::ControllerItem maBckFillStyleController; + ::sfx2::sidebar::ControllerItem maBckImageController; + ::sfx2::sidebar::ControllerItem maDspBckController; + ::sfx2::sidebar::ControllerItem maDspObjController; + ::sfx2::sidebar::ControllerItem maMetricController; + ::sfx2::sidebar::ControllerItem maCloseMasterController; + + std::unique_ptr< SvxPageItem > mpPageItem; + std::unique_ptr< XFillColorItem > mpColorItem; + std::unique_ptr< XFillGradientItem > mpGradientItem; + std::unique_ptr< XFillHatchItem > mpHatchItem; + std::unique_ptr< XFillBitmapItem > mpBitmapItem; + + bool mbSwitchModeToNormal; + bool mbSwitchModeToMaster; + + css::uno::Reference mxFrame; + vcl::EnumContext maContext; + vcl::EnumContext maDrawOtherContext; + vcl::EnumContext maDrawMasterContext; + vcl::EnumContext maImpressOtherContext; + vcl::EnumContext maImpressMasterContext; + vcl::EnumContext maImpressHandoutContext; + vcl::EnumContext maImpressNotesContext; + bool mbTitle; + std::unique_ptr mpPageLRMarginItem; + std::unique_ptr mpPageULMarginItem; + ::tools::Long m_nPageLeftMargin; + ::tools::Long m_nPageRightMargin; + ::tools::Long m_nPageTopMargin; + ::tools::Long m_nPageBottomMargin; + FieldUnit meFUnit; + OUString maCustomEntry; + + SfxBindings* mpBindings; + + MapUnit meUnit; + + // MCGR: Preserve ColorStops until we have a UI to edit these + basegfx::BColorStops maColorStops; + + DECL_LINK(FillBackgroundHdl, weld::ComboBox&, void); + DECL_LINK(FillStyleModifyHdl, weld::ComboBox&, void); + DECL_LINK(PaperSizeModifyHdl, weld::ComboBox&, void); + DECL_LINK(FillColorHdl, ColorListBox&, void); + DECL_LINK(AssignMasterPage, weld::ComboBox&, void); + DECL_LINK(DspBackground, weld::Toggleable&, void); + DECL_LINK(DspObjects, weld::Toggleable&, void); + DECL_LINK(CloseMasterHdl, weld::Button&, void); + DECL_LINK(EditMasterHdl, weld::Button&, void); + DECL_LINK(SelectBgHdl, weld::Button&, void); + DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void ); + DECL_LINK( ModifyMarginHdl, weld::ComboBox&, void ); + + void Initialize(); + void Update(); + void UpdateMarginBox(); + void SetPanelTitle(const OUString& rTitle); + void SetMarginsFieldUnit(); + + Color const & GetColorSetOrDefault(); + basegfx::BGradient const & GetGradientSetOrDefault(); + OUString const & GetHatchingSetOrDefault(); + OUString const & GetBitmapSetOrDefault(); + OUString const & GetPatternSetOrDefault(); + bool IsDraw(); + bool IsImpress(); + void addListener(); + void removeListener(); + void ExecuteMarginLRChange(const ::tools::Long mnPageLeftMargin, const ::tools::Long mnPageRightMargin); + void ExecuteMarginULChange(const ::tools::Long mnPageTopMargin, const ::tools::Long mnPageBottomMargin); + void populateMasterSlideDropdown(); + void updateMasterSlideSelection(); + + static FieldUnit GetCurrentUnit(SfxItemState eState, const SfxPoolItem* pState); + + // MCGR: Preserve ColorStops until we have a UI to edit these + basegfx::BColorStops createColorStops(); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/PaneHider.cxx b/sd/source/ui/slideshow/PaneHider.cxx new file mode 100644 index 0000000000..6207bf156a --- /dev/null +++ b/sd/source/ui/slideshow/PaneHider.cxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "PaneHider.hxx" + +#include +#include +#include "slideshowimpl.hxx" +#include + +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::sd::framework::FrameworkHelper; +using ::com::sun::star::lang::DisposedException; + +namespace sd +{ +PaneHider::PaneHider(const ViewShell& rViewShell, SlideshowImpl* pSlideShow) +{ + // Hide the left and right pane windows when a slideshow exists and is + // not full screen. + if (pSlideShow == nullptr || pSlideShow->isFullScreen()) + return; + + try + { + Reference xControllerManager( + rViewShell.GetViewShellBase().GetController(), UNO_QUERY_THROW); + mxConfigurationController = xControllerManager->getConfigurationController(); + if (mxConfigurationController.is()) + { + // Get and save the current configuration. + mxConfiguration = mxConfigurationController->getRequestedConfiguration(); + if (mxConfiguration.is()) + { + // Iterate over the resources and deactivate the panes. + const Sequence> aResources(mxConfiguration->getResources( + nullptr, framework::FrameworkHelper::msPaneURLPrefix, + AnchorBindingMode_DIRECT)); + for (const Reference& xPaneId : aResources) + { + if (xPaneId->getResourceURL() != FrameworkHelper::msCenterPaneURL) + { + mxConfigurationController->requestResourceDeactivation(xPaneId); + } + } + } + } + FrameworkHelper::Instance(rViewShell.GetViewShellBase())->WaitForUpdate(); + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } +} + +PaneHider::~PaneHider() +{ + if (mxConfiguration.is() && mxConfigurationController.is()) + { + try + { + mxConfigurationController->restoreConfiguration(mxConfiguration); + } + catch (DisposedException&) + { + // When the configuration controller is already disposed then + // there is no point in restoring the configuration. + } + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/PaneHider.hxx b/sd/source/ui/slideshow/PaneHider.hxx new file mode 100644 index 0000000000..a2d3cabb01 --- /dev/null +++ b/sd/source/ui/slideshow/PaneHider.hxx @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace com::sun::star::drawing::framework +{ +class XConfiguration; +} +namespace com::sun::star::drawing::framework +{ +class XConfigurationController; +} + +namespace sd +{ +class ViewShell; +class SlideshowImpl; + +/** Hide the windows of the side panes and restore the original visibility + later. Used by the in-window slide show in order to use the whole frame + window for the show. +*/ +class PaneHider +{ +public: + /** The constructor hides all side panes that belong to the + ViewShellBase of the given view shell. + */ + PaneHider(const ViewShell& rViewShell, SlideshowImpl* pSlideShow); + + /** Restore the original visibility of the side panes. + */ + ~PaneHider(); + +private: + /** Remember whether the visibility states of the windows of the panes + has been modified and have to be restored. + */ + + css::uno::Reference + mxConfigurationController; + css::uno::Reference mxConfiguration; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/SlideShowRestarter.cxx b/sd/source/ui/slideshow/SlideShowRestarter.cxx new file mode 100644 index 0000000000..a9b53acf11 --- /dev/null +++ b/sd/source/ui/slideshow/SlideShowRestarter.cxx @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include "SlideShowRestarter.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using ::sd::framework::FrameworkHelper; + +namespace sd { + +SlideShowRestarter::SlideShowRestarter ( + ::rtl::Reference pSlideShow, + ViewShellBase* pViewShellBase) + : mnEventId(nullptr), + mpSlideShow(std::move(pSlideShow)), + mpViewShellBase(pViewShellBase), + mnDisplayCount(Application::GetScreenCount()), + mpDispatcher(pViewShellBase->GetViewFrame().GetDispatcher()), + mnCurrentSlideNumber(0) +{ +} + +SlideShowRestarter::~SlideShowRestarter() +{ +} + +void SlideShowRestarter::Restart (bool bForce) +{ + // Prevent multiple and concurrently restarts. + if (mnEventId != nullptr) + return; + + if (bForce) + mnDisplayCount = 0; + + // Remember the current slide in order to restore it after the slide + // show has been restarted. + if (mpSlideShow.is()) + mnCurrentSlideNumber = mpSlideShow->getCurrentPageNumber(); + + // Remember a shared pointer to this object to prevent its destruction + // before the whole restarting process has finished. + mpSelf = shared_from_this(); + + // We do not know in what situation this method was called. So, in + // order to be able to cleanly stop the presentation, we do that + // asynchronously. + mnEventId = Application::PostUserEvent( + LINK(this, SlideShowRestarter, EndPresentation)); +} + +IMPL_LINK_NOARG(SlideShowRestarter, EndPresentation, void*, void) +{ + mnEventId = nullptr; + if (!mpSlideShow.is()) + return; + + if (mnDisplayCount == static_cast(Application::GetScreenCount())) + return; + + bool bIsExitAfterPresenting = mpSlideShow->IsExitAfterPresenting(); + mpSlideShow->SetExitAfterPresenting(false); + mpSlideShow->end(); + mpSlideShow->SetExitAfterPresenting(bIsExitAfterPresenting); + + // The following piece of code should not be here because the + // slide show should be aware of the existence of the presenter + // console (which is displayed in the FullScreenPane). But the + // timing has to be right and I did not find a better place for + // it. + + // Wait for the full screen pane, which displays the presenter + // console, to disappear. Only when it is gone, call + // InitiatePresenterStart(), in order to begin the asynchronous + // restart of the slide show. + if (mpViewShellBase == nullptr) + return; + + ::std::shared_ptr pHelper( + FrameworkHelper::Instance(*mpViewShellBase)); + if (pHelper->GetConfigurationController()->getResource( + FrameworkHelper::CreateResourceId(FrameworkHelper::msFullScreenPaneURL)).is()) + { + ::sd::framework::ConfigurationController::Lock aLock ( + pHelper->GetConfigurationController()); + + pHelper->RunOnConfigurationEvent( + FrameworkHelper::msConfigurationUpdateEndEvent, + ::std::bind(&SlideShowRestarter::StartPresentation, shared_from_this())); + pHelper->UpdateConfiguration(); + } + else + { + StartPresentation(); + } +} + +void SlideShowRestarter::StartPresentation() +{ + //rhbz#1091117 crash because we're exiting the application, and this is + //being called during the configuration update event on exit. At this point + //newly created objects won't get disposed called on them, because the + //disposer is doing its last execution of that now. + if (mpViewShellBase && mpViewShellBase->GetDrawController()->IsDisposing()) + return; + + if (mpDispatcher == nullptr && mpViewShellBase!=nullptr) + mpDispatcher = mpViewShellBase->GetViewFrame().GetDispatcher(); + + // Start the slide show on the saved current slide. + if (mpDispatcher != nullptr) + { + mpDispatcher->Execute(SID_PRESENTATION, SfxCallMode::ASYNCHRON); + if (mpSlideShow.is()) + { + Sequence aProperties{ comphelper::makePropertyValue("FirstPage", + "page" + OUString::number(mnCurrentSlideNumber+1)) }; + mpSlideShow->startWithArguments(aProperties); + } + mpSelf.reset(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/SlideShowRestarter.hxx b/sd/source/ui/slideshow/SlideShowRestarter.hxx new file mode 100644 index 0000000000..f8cf95c33a --- /dev/null +++ b/sd/source/ui/slideshow/SlideShowRestarter.hxx @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd +{ +class SlideShow; +} +namespace sd +{ +class ViewShellBase; +} +class SfxDispatcher; +struct ImplSVEvent; + +namespace sd +{ +/** This class is used when a display is removed or added to restart the + slide show. This is necessary at least with DirectX because + deactivating a display invalidates DirectX resources. Accessing those + leads to a crash. + + During a restart a possibly installed presenter extension is given the + opportunity to show or hide depending on the number of available displays. +*/ +class SlideShowRestarter : public std::enable_shared_from_this +{ +public: + /** Create a new SlideShowRestarter object. + @param rpSlideShow + The slide show is used to determine the current slide, which is + restored after the restart, and of course to stop and start the + slide show. + @param pViewShellBase + Used to get access to a slot dispatcher. + */ + SlideShowRestarter(::rtl::Reference pSlideShow, ViewShellBase* pViewShellBase); + virtual ~SlideShowRestarter(); + + /** Restarting the slide show is an asynchronous multi step process + which is started by calling this method. + @param bForce + Used to force a re-start, even if the display count is unchanged. + */ + void Restart(bool bForce); + +private: + ImplSVEvent* mnEventId; + ::rtl::Reference mpSlideShow; + ViewShellBase* mpViewShellBase; + ::std::shared_ptr mpSelf; + sal_Int32 mnDisplayCount; + SfxDispatcher* mpDispatcher; + sal_Int32 mnCurrentSlideNumber; + + DECL_LINK(EndPresentation, void*, void); + + /** Restart the presentation on the slide last shown before the restart + was initiated. + */ + void StartPresentation(); +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/showwin.cxx b/sd/source/ui/slideshow/showwin.cxx new file mode 100644 index 0000000000..d6ecc19a69 --- /dev/null +++ b/sd/source/ui/slideshow/showwin.cxx @@ -0,0 +1,633 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include "showwindow.hxx" +#include "slideshowimpl.hxx" + +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace sd { + +const sal_uInt64 HIDE_MOUSE_TIMEOUT = 10000; +const sal_uInt64 SHOW_MOUSE_TIMEOUT = 1000; + +ShowWindow::ShowWindow( ::rtl::Reference< SlideshowImpl > xController, vcl::Window* pParent ) +: ::sd::Window( pParent ) +, maPauseTimer("sd ShowWindow maPauseTimer") +, maMouseTimer("sd ShowWindow maMouseTimer") +, mnPauseTimeout( SLIDE_NO_TIMEOUT ) +, mnRestartPageIndex( PAGE_NO_END ) +, meShowWindowMode(SHOWWINDOWMODE_NORMAL) +, mbShowNavigatorAfterSpecialMode( false ) +, mbMouseAutoHide(true) +, mbMouseCursorHidden(false) +, mnFirstMouseMove(0) +, mxController(std::move( xController )) +{ + GetOutDev()->SetOutDevViewType( OutDevViewType::SlideShow ); + + // Do never mirror the preview window. This explicitly includes right + // to left writing environments. + EnableRTL (false); + + MapMode aMap(GetMapMode()); + aMap.SetMapUnit(MapUnit::Map100thMM); + SetMapMode(aMap); + + // set HelpId + SetHelpId( HID_SD_WIN_PRESENTATION ); + + maPauseTimer.SetInvokeHandler( LINK( this, ShowWindow, PauseTimeoutHdl ) ); + maPauseTimer.SetTimeout( 1000 ); + maMouseTimer.SetInvokeHandler( LINK( this, ShowWindow, MouseTimeoutHdl ) ); + maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT ); + + maShowBackground = Wallpaper( COL_BLACK ); + SetBackground(); // avoids that VCL paints any background! + GetParent()->Show(); + AddEventListener( LINK( this, ShowWindow, EventHdl ) ); +} + +ShowWindow::~ShowWindow() +{ + disposeOnce(); +} + +void ShowWindow::dispose() +{ + maPauseTimer.Stop(); + maMouseTimer.Stop(); + ::sd::Window::dispose(); +} + +void ShowWindow::KeyInput(const KeyEvent& rKEvt) +{ + // Ignore workaround of https://gitlab.gnome.org/GNOME/gtk/issues/1785 + // See calls to GtkSalFrame::makeFakeKeyPress (Fixed in GTK 3.24) + bool bFakeKeyPress = rKEvt.GetKeyCode().GetFullCode() == 0; + if (bFakeKeyPress) + return; + + bool bReturn = false; + + if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) + { + TerminateShow(); + bReturn = true; + } + else if( SHOWWINDOWMODE_END == meShowWindowMode ) + { + const int nKeyCode = rKEvt.GetKeyCode().GetCode(); + switch( nKeyCode ) + { + case KEY_PAGEUP: + case KEY_LEFT: + case KEY_UP: + case KEY_P: + case KEY_HOME: + case KEY_END: + case awt::Key::CONTEXTMENU: + // these keys will be handled by the slide show even + // while in end mode + break; + default: + TerminateShow(); + bReturn = true; + } + } + else if( SHOWWINDOWMODE_BLANK == meShowWindowMode ) + { + RestartShow(); + bReturn = true; + } + else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode ) + { + const int nKeyCode = rKEvt.GetKeyCode().GetCode(); + switch( nKeyCode ) + { + case KEY_ESCAPE: + TerminateShow(); + bReturn = true; + break; + case KEY_PAGEUP: + case KEY_RIGHT: + case KEY_UP: + case KEY_P: + case KEY_HOME: + case KEY_END: + case awt::Key::CONTEXTMENU: + // these keys will be handled by the slide show even + // while in end mode + break; + default: + RestartShow(); + bReturn = true; + break; + } + } + + if( !bReturn ) + { + if( mxController.is() ) + bReturn = mxController->keyInput(rKEvt); + + if( !bReturn ) + { + if( mpViewShell ) + { + mpViewShell->KeyInput(rKEvt,this); + } + else + { + Window::KeyInput(rKEvt); + } + } + } + + if( mpViewShell ) + mpViewShell->SetActiveWindow( this ); +} + +void ShowWindow::MouseButtonDown(const MouseEvent& /*rMEvt*/) +{ + if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) + { + TerminateShow(); + } + else if( mpViewShell ) + { + mpViewShell->SetActiveWindow( this ); + } +} + +void ShowWindow::MouseMove(const MouseEvent& /*rMEvt*/) +{ + if( mbMouseAutoHide ) + { + if( mbMouseCursorHidden ) + { + if( mnFirstMouseMove ) + { + // if this is not the first mouse move while hidden, see if + // enough time has pasted to show mouse pointer again + sal_uInt64 nTime = ::tools::Time::GetSystemTicks(); + if( (nTime - mnFirstMouseMove) >= SHOW_MOUSE_TIMEOUT ) + { + ShowPointer( true ); + mnFirstMouseMove = 0; + mbMouseCursorHidden = false; + maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT ); + maMouseTimer.Start(); + } + } + else + { + // if this is the first mouse move, note current + // time and start idle timer to cancel show mouse pointer + // again if not enough mouse movement is measured + mnFirstMouseMove = ::tools::Time::GetSystemTicks(); + maMouseTimer.SetTimeout( 2*SHOW_MOUSE_TIMEOUT ); + maMouseTimer.Start(); + } + } + else + { + // current mousemove restarts the idle timer to hide the mouse + maMouseTimer.Start(); + } + } + + if( mpViewShell ) + mpViewShell->SetActiveWindow( this ); +} + +void ShowWindow::MouseButtonUp(const MouseEvent& rMEvt) +{ + if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) + { + TerminateShow(); + } + else if( (SHOWWINDOWMODE_END == meShowWindowMode) && !rMEvt.IsRight() ) + { + TerminateShow(); + } + else if( (( SHOWWINDOWMODE_BLANK == meShowWindowMode ) || ( SHOWWINDOWMODE_PAUSE == meShowWindowMode )) + && !rMEvt.IsRight() ) + { + RestartShow(); + } + else + { + if( mxController.is() ) + mxController->mouseButtonUp( rMEvt ); + } +} + +/** + * if FuSlideShow is still available, forward it + */ +void ShowWindow::Paint(vcl::RenderContext& /*rRenderContext*/, const ::tools::Rectangle& rRect) +{ + if( (meShowWindowMode == SHOWWINDOWMODE_NORMAL) || (meShowWindowMode == SHOWWINDOWMODE_PREVIEW) ) + { + if( mxController.is() ) + { + mxController->paint(); + } + else if(mpViewShell ) + { + mpViewShell->Paint(rRect, this); + } + } + else + { + GetOutDev()->DrawWallpaper( rRect, maShowBackground ); + + if( SHOWWINDOWMODE_END == meShowWindowMode ) + { + DrawEndScene(); + } + else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode ) + { + DrawPauseScene( false ); + } + else if( SHOWWINDOWMODE_BLANK == meShowWindowMode ) + { + // just blank through background color => nothing to be done here + } + } +} + +void ShowWindow::LoseFocus() +{ + Window::LoseFocus(); + + if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode) + TerminateShow(); +} + +void ShowWindow::SetEndMode() +{ + if( !(( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView()) ) + return; + + DeleteWindowFromPaintView(); + meShowWindowMode = SHOWWINDOWMODE_END; + maShowBackground = Wallpaper( COL_BLACK ); + + // hide navigator if it is visible + if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) ) + { + mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, false ); + mbShowNavigatorAfterSpecialMode = true; + } + + Invalidate(); +} + +bool ShowWindow::SetPauseMode( sal_Int32 nTimeout, Graphic const * pLogo ) +{ + rtl::Reference< SlideShow > xSlideShow; + + if( mpViewShell ) + xSlideShow = SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() ); + + if( xSlideShow.is() && !nTimeout ) + { + xSlideShow->jumpToPageIndex( 0 ); + } + else if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() ) + { + DeleteWindowFromPaintView(); + mnPauseTimeout = nTimeout; + mnRestartPageIndex = 0; + meShowWindowMode = SHOWWINDOWMODE_PAUSE; + maShowBackground = Wallpaper( COL_BLACK ); + + // hide navigator if it is visible + if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) ) + { + mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, false ); + mbShowNavigatorAfterSpecialMode = true; + } + + if( pLogo ) + maLogo = *pLogo; + + Invalidate(); + + if( SLIDE_NO_TIMEOUT != mnPauseTimeout ) + maPauseTimer.Start(); + } + + return( SHOWWINDOWMODE_PAUSE == meShowWindowMode ); +} + +bool ShowWindow::SetBlankMode( sal_Int32 nPageIndexToRestart, const Color& rBlankColor ) +{ + if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() ) + { + DeleteWindowFromPaintView(); + mnRestartPageIndex = nPageIndexToRestart; + meShowWindowMode = SHOWWINDOWMODE_BLANK; + maShowBackground = Wallpaper( rBlankColor ); + + // hide navigator if it is visible + if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) ) + { + mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, false ); + mbShowNavigatorAfterSpecialMode = true; + } + + Invalidate(); + } + + return( SHOWWINDOWMODE_BLANK == meShowWindowMode ); +} + +void ShowWindow::SetPreviewMode() +{ + meShowWindowMode = SHOWWINDOWMODE_PREVIEW; +} + +void ShowWindow::TerminateShow() +{ + maLogo.Clear(); + maPauseTimer.Stop(); + maMouseTimer.Stop(); + GetOutDev()->Erase(); + maShowBackground = Wallpaper( COL_BLACK ); + meShowWindowMode = SHOWWINDOWMODE_NORMAL; + mnPauseTimeout = SLIDE_NO_TIMEOUT; + + if( mpViewShell ) + { + // show navigator? + if( mbShowNavigatorAfterSpecialMode ) + { + mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR ); + mbShowNavigatorAfterSpecialMode = false; + } + } + + if( mxController.is() ) + mxController->endPresentation(); + + mnRestartPageIndex = PAGE_NO_END; +} + +void ShowWindow::RestartShow() +{ + RestartShow( mnRestartPageIndex ); +} + +void ShowWindow::RestartShow( sal_Int32 nPageIndexToRestart ) +{ + ShowWindowMode eOldShowWindowMode = meShowWindowMode; + + maLogo.Clear(); + maPauseTimer.Stop(); + GetOutDev()->Erase(); + maShowBackground = Wallpaper( COL_BLACK ); + meShowWindowMode = SHOWWINDOWMODE_NORMAL; + mnPauseTimeout = SLIDE_NO_TIMEOUT; + + if( mpViewShell ) + { + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() ) ); + + if( xSlideShow.is() ) + { + AddWindowToPaintView(); + + if( SHOWWINDOWMODE_BLANK == eOldShowWindowMode || SHOWWINDOWMODE_END == eOldShowWindowMode ) + { + xSlideShow->pause(false); + Invalidate(); + } + else + { + xSlideShow->jumpToPageIndex( nPageIndexToRestart ); + } + } + } + + mnRestartPageIndex = PAGE_NO_END; + + // show navigator? + if( mbShowNavigatorAfterSpecialMode ) + { + if (mpViewShell) + mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR ); + mbShowNavigatorAfterSpecialMode = false; + } +} + +void ShowWindow::DrawPauseScene( bool bTimeoutOnly ) +{ + const MapMode& rMap = GetMapMode(); + const Point aOutOrg( PixelToLogic( Point() ) ); + const Size aOutSize( GetOutDev()->GetOutputSize() ); + const Size aTextSize(OutputDevice::LogicToLogic(Size(0, 14), MapMode(MapUnit::MapPoint), rMap)); + const Size aOffset(OutputDevice::LogicToLogic(Size(1000, 1000), MapMode(MapUnit::Map100thMM), rMap)); + OUString aText( SdResId( STR_PRES_PAUSE ) ); + bool bDrawn = false; + + vcl::Font aFont( GetSettings().GetStyleSettings().GetMenuFont() ); + const vcl::Font aOldFont( GetFont() ); + + aFont.SetFontSize( aTextSize ); + aFont.SetColor( COL_WHITE ); + aFont.SetCharSet( aOldFont.GetCharSet() ); + aFont.SetLanguage( aOldFont.GetLanguage() ); + + if( !bTimeoutOnly && ( maLogo.GetType() != GraphicType::NONE ) ) + { + Size aGrfSize; + + if (maLogo.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel) + aGrfSize = PixelToLogic( maLogo.GetPrefSize() ); + else + aGrfSize = OutputDevice::LogicToLogic( maLogo.GetPrefSize(), maLogo.GetPrefMapMode(), rMap ); + + const Point aGrfPos( std::max( aOutOrg.X() + aOutSize.Width() - aGrfSize.Width() - aOffset.Width(), aOutOrg.X() ), + std::max( aOutOrg.Y() + aOutSize.Height() - aGrfSize.Height() - aOffset.Height(), aOutOrg.Y() ) ); + + if( maLogo.IsAnimated() ) + maLogo.StartAnimation(*GetOutDev(), aGrfPos, aGrfSize, reinterpret_cast(this)); + else + maLogo.Draw(*GetOutDev(), aGrfPos, aGrfSize); + } + + if( SLIDE_NO_TIMEOUT != mnPauseTimeout ) + { + MapMode aVMap( rMap ); + ScopedVclPtrInstance< VirtualDevice > pVDev( *GetOutDev() ); + + aVMap.SetOrigin( Point() ); + pVDev->SetMapMode( aVMap ); + pVDev->SetBackground( Wallpaper( COL_BLACK ) ); + + // set font first, to determine real output height + pVDev->SetFont( aFont ); + + const Size aVDevSize( aOutSize.Width(), pVDev->GetTextHeight() ); + + if( pVDev->SetOutputSize( aVDevSize ) ) + { + // Note: if performance gets an issue here, we can use NumberFormatter directly + SvtSysLocale aSysLocale; + const LocaleDataWrapper& aLocaleData = aSysLocale.GetLocaleData(); + + aText += " ( " + aLocaleData.getDuration( ::tools::Duration( 0, 0, 0, mnPauseTimeout, 0 )) + " )"; + pVDev->DrawText( Point( aOffset.Width(), 0 ), aText ); + GetOutDev()->DrawOutDev( Point( aOutOrg.X(), aOffset.Height() ), aVDevSize, Point(), aVDevSize, *pVDev ); + bDrawn = true; + } + } + + if( !bDrawn ) + { + SetFont( aFont ); + GetOutDev()->DrawText( Point( aOutOrg.X() + aOffset.Width(), aOutOrg.Y() + aOffset.Height() ), aText ); + SetFont( aOldFont ); + } +} + +void ShowWindow::DrawEndScene() +{ + const vcl::Font aOldFont( GetFont() ); + vcl::Font aFont( GetSettings().GetStyleSettings().GetMenuFont() ); + + const Point aOutOrg( PixelToLogic( Point() ) ); + const Size aTextSize(OutputDevice::LogicToLogic(Size(0, 14), MapMode(MapUnit::MapPoint), GetMapMode())); + const OUString aText( SdResId( STR_PRES_SOFTEND ) ); + + aFont.SetFontSize( aTextSize ); + aFont.SetColor( COL_WHITE ); + aFont.SetCharSet( aOldFont.GetCharSet() ); + aFont.SetLanguage( aOldFont.GetLanguage() ); + SetFont( aFont ); + GetOutDev()->DrawText( Point( aOutOrg.X() + aTextSize.Height(), aOutOrg.Y() + aTextSize.Height() ), aText ); + SetFont( aOldFont ); +} + +IMPL_LINK( ShowWindow, PauseTimeoutHdl, Timer*, pTimer, void ) +{ + if( !( --mnPauseTimeout ) ) + RestartShow(); + else + { + DrawPauseScene( true ); + pTimer->Start(); + } +} + +IMPL_LINK_NOARG(ShowWindow, MouseTimeoutHdl, Timer *, void) +{ + if( mbMouseCursorHidden ) + { + // not enough mouse movements since first recording so + // cancel show mouse pointer for now + mnFirstMouseMove = 0; + } + else + { + // mouse has been idle too long, hide pointer + ShowPointer( false ); + mbMouseCursorHidden = true; + } +} + +IMPL_LINK( ShowWindow, EventHdl, VclWindowEvent&, rEvent, void ) +{ + if( mbMouseAutoHide ) + { + if (rEvent.GetId() == VclEventId::WindowShow) + { + maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT ); + maMouseTimer.Start(); + } + } +} + +void ShowWindow::DeleteWindowFromPaintView() +{ + if( mpViewShell->GetView() ) + mpViewShell->GetView()->DeleteDeviceFromPaintView( *GetOutDev() ); + + sal_uInt16 nChild = GetChildCount(); + while( nChild-- ) + GetChild( nChild )->Show( false ); +} + +void ShowWindow::AddWindowToPaintView() +{ + if( mpViewShell->GetView() ) + mpViewShell->GetView()->AddDeviceToPaintView( *GetOutDev(), nullptr ); + + sal_uInt16 nChild = GetChildCount(); + while( nChild-- ) + GetChild( nChild )->Show(); +} + +// Override the sd::Window's CreateAccessible to create a different accessible object +css::uno::Reference + ShowWindow::CreateAccessible() +{ + css::uno::Reference< css::accessibility::XAccessible > xAcc = GetAccessible(false); + if (xAcc) + { + return xAcc; + } + if (mpViewShell != nullptr) + { + xAcc = mpViewShell->CreateAccessibleDocumentView (this); + SetAccessible(xAcc); + return xAcc; + } + else + { + SAL_WARN("sd", "::sd::Window::CreateAccessible: no view shell"); + return vcl::Window::CreateAccessible (); + } +} +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/showwindow.hxx b/sd/source/ui/slideshow/showwindow.hxx new file mode 100644 index 0000000000..c7a1d9bf02 --- /dev/null +++ b/sd/source/ui/slideshow/showwindow.hxx @@ -0,0 +1,110 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace sd { + +class SlideshowImpl; + +#define SLIDE_NO_TIMEOUT SAL_MAX_INT32 + +enum ShowWindowMode +{ + SHOWWINDOWMODE_NORMAL = 0, + SHOWWINDOWMODE_PAUSE = 1, + SHOWWINDOWMODE_END = 2, + SHOWWINDOWMODE_BLANK = 3, + SHOWWINDOWMODE_PREVIEW = 4 +}; + +class ShowWindow + : public ::sd::Window +{ + +public: + ShowWindow ( ::rtl::Reference< ::sd::SlideshowImpl > xController, vcl::Window* pParent ); + virtual ~ShowWindow() override; + virtual void dispose() override; + + void SetEndMode(); + bool SetPauseMode( sal_Int32 nTimeoutSec, Graphic const * pLogo = nullptr ); + bool SetBlankMode( sal_Int32 nPageIndexToRestart, const Color& rBlankColor ); + + const Color& GetBlankColor() const { return maShowBackground.GetColor(); } + + void SetPreviewMode(); + + void SetMouseAutoHide( bool bMouseAutoHide ) { mbMouseAutoHide = bMouseAutoHide; } + + ShowWindowMode GetShowWindowMode() const { return meShowWindowMode; } + + void RestartShow( sal_Int32 nPageIndexToRestart ); + + virtual void LoseFocus() override; + + virtual void KeyInput(const KeyEvent& rKEvt) override; + virtual void MouseMove(const MouseEvent& rMEvt) override; + virtual void MouseButtonUp(const MouseEvent& rMEvt) override; + virtual void MouseButtonDown(const MouseEvent& rMEvt) override; + virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override; + /// Override the sd::Window's CreateAccessible to create a different accessible object + virtual css::uno::Reference + CreateAccessible() override; + + void TerminateShow(); + void RestartShow(); + +private: + void DrawPauseScene( bool bTimeoutOnly ); + void DrawEndScene(); + + void DeleteWindowFromPaintView(); + void AddWindowToPaintView(); + +private: + Timer maPauseTimer; + Timer maMouseTimer; + Wallpaper maShowBackground; + Graphic maLogo; + sal_uLong mnPauseTimeout; + sal_Int32 mnRestartPageIndex; + ShowWindowMode meShowWindowMode; + bool mbShowNavigatorAfterSpecialMode; + bool mbMouseAutoHide; + bool mbMouseCursorHidden; + sal_uInt64 mnFirstMouseMove; + + DECL_LINK( PauseTimeoutHdl, Timer*, void ); + DECL_LINK(MouseTimeoutHdl, Timer *, void); + DECL_LINK( EventHdl, VclWindowEvent&, void ); + + ::rtl::Reference< SlideshowImpl > mxController; +}; + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/slideshow.cxx b/sd/source/ui/slideshow/slideshow.cxx new file mode 100644 index 0000000000..1c21ef7ee0 --- /dev/null +++ b/sd/source/ui/slideshow/slideshow.cxx @@ -0,0 +1,1189 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include "slideshowimpl.hxx" +#include +#include +#include +#include +#include +#include +#include "SlideShowRestarter.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::com::sun::star::presentation::XSlideShowController; +using ::sd::framework::FrameworkHelper; +using ::com::sun::star::awt::XWindow; +using namespace ::sd; +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::animations; +using namespace ::com::sun::star::drawing::framework; + +namespace { + /** This local version of the work window overrides DataChanged() so that it + can restart the slide show when a display is added or removed. + */ + class FullScreenWorkWindow : public WorkWindow + { + public: + FullScreenWorkWindow ( + const ::rtl::Reference& rpSlideShow, + ViewShellBase* pViewShellBase) + : WorkWindow(nullptr, WB_HIDE | WB_CLIPCHILDREN), + mpRestarter(std::make_shared(rpSlideShow, pViewShellBase)) + {} + + void Restart(bool bForce) + { + mpRestarter->Restart(bForce); + } + + virtual void DataChanged (const DataChangedEvent& rEvent) override + { + if (rEvent.GetType() == DataChangedEventType::DISPLAY) + Restart(false); + } + + private: + ::std::shared_ptr mpRestarter; + }; +} + +static std::span ImplGetPresentationPropertyMap() +{ + // NOTE: First member must be sorted + static const SfxItemPropertyMapEntry aPresentationPropertyMap_Impl[] = + { + { u"AllowAnimations"_ustr, ATTR_PRESENT_ANIMATION_ALLOWED, cppu::UnoType::get(), 0, 0 }, + { u"CustomShow"_ustr, ATTR_PRESENT_CUSTOMSHOW, ::cppu::UnoType::get(), 0, 0 }, + { u"Display"_ustr, ATTR_PRESENT_DISPLAY, ::cppu::UnoType::get(), 0, 0 }, + { u"FirstPage"_ustr, ATTR_PRESENT_DIANAME, ::cppu::UnoType::get(), 0, 0 }, + { u"IsAlwaysOnTop"_ustr, ATTR_PRESENT_ALWAYS_ON_TOP, cppu::UnoType::get(), 0, 0 }, + { u"IsAutomatic"_ustr, ATTR_PRESENT_MANUEL, cppu::UnoType::get(), 0, 0 }, + { u"IsEndless"_ustr, ATTR_PRESENT_ENDLESS, cppu::UnoType::get(), 0, 0 }, + { u"IsFullScreen"_ustr, ATTR_PRESENT_FULLSCREEN, cppu::UnoType::get(), 0, 0 }, + { u"IsShowAll"_ustr, ATTR_PRESENT_ALL, cppu::UnoType::get(), 0, 0 }, + { u"IsMouseVisible"_ustr, ATTR_PRESENT_MOUSE, cppu::UnoType::get(), 0, 0 }, + { u"IsShowLogo"_ustr, ATTR_PRESENT_SHOW_PAUSELOGO, cppu::UnoType::get(), 0, 0 }, + { u"IsTransitionOnClick"_ustr, ATTR_PRESENT_CHANGE_PAGE, cppu::UnoType::get(), 0, 0 }, + { u"Pause"_ustr, ATTR_PRESENT_PAUSE_TIMEOUT, ::cppu::UnoType::get(), 0, 0 }, + { u"StartWithNavigator"_ustr, ATTR_PRESENT_NAVIGATOR, cppu::UnoType::get(), 0, 0 }, + { u"UsePen"_ustr, ATTR_PRESENT_PEN, cppu::UnoType::get(), 0, 0 }, + }; + + return aPresentationPropertyMap_Impl; +} + + +SlideShow::SlideShow( SdDrawDocument* pDoc ) +: maPropSet(ImplGetPresentationPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool()) +, mbIsInStartup(false) +, mpDoc( pDoc ) +, mpCurrentViewShellBase( nullptr ) +, mpFullScreenViewShellBase( nullptr ) +, mpFullScreenFrameView( nullptr ) +, mnInPlaceConfigEvent( nullptr ) +{ +} + +void SlideShow::ThrowIfDisposed() const +{ + if( mpDoc == nullptr ) + throw DisposedException(); +} + +/// used by the model to create a slideshow for it +rtl::Reference< SlideShow > SlideShow::Create( SdDrawDocument* pDoc ) +{ + return new SlideShow( pDoc ); +} + +rtl::Reference< SlideShow > SlideShow::GetSlideShow( SdDrawDocument const * pDocument ) +{ + rtl::Reference< SlideShow > xRet; + + if( pDocument ) + xRet = GetSlideShow( *pDocument ); + + return xRet; +} + +rtl::Reference< SlideShow > SlideShow::GetSlideShow( SdDrawDocument const & rDocument ) +{ + return rtl::Reference< SlideShow >( + dynamic_cast< SlideShow* >( rDocument.getPresentation().get() ) ); +} + +rtl::Reference< SlideShow > SlideShow::GetSlideShow( ViewShellBase const & rBase ) +{ + return GetSlideShow( rBase.GetDocument() ); +} + +css::uno::Reference< css::presentation::XSlideShowController > SlideShow::GetSlideShowController(ViewShellBase const & rBase ) +{ + rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) ); + + Reference< XSlideShowController > xRet; + if( xSlideShow.is() ) + xRet = xSlideShow->getController(); + + return xRet; +} + +bool SlideShow::StartPreview( ViewShellBase const & rBase, + const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage, + const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode ) +{ + rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) ); + if( !xSlideShow.is() ) + return false; + + xSlideShow->startPreview( xDrawPage, xAnimationNode ); + return true; +} + +void SlideShow::Stop( ViewShellBase const & rBase ) +{ + rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) ); + if( xSlideShow.is() ) + xSlideShow->end(); +} + +bool SlideShow::IsRunning( ViewShellBase const & rBase ) +{ + rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) ); + return xSlideShow.is() && xSlideShow->isRunning(); +} + +bool SlideShow::IsRunning( const ViewShell& rViewShell ) +{ + rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rViewShell.GetViewShellBase() ) ); + return xSlideShow.is() && xSlideShow->isRunning() && (xSlideShow->mxController->getViewShell() == &rViewShell); +} + +void SlideShow::CreateController( ViewShell* pViewSh, ::sd::View* pView, vcl::Window* pParentWindow ) +{ + SAL_INFO_IF( !mxController.is(), "sd.slideshow", "sd::SlideShow::CreateController(), clean up old controller first!" ); + + Reference< XPresentation2 > xThis( this ); + + rtl::Reference xController ( + new SlideshowImpl(xThis, pViewSh, pView, mpDoc, pParentWindow)); + + // Reset mbIsInStartup. From here mxController.is() is used to prevent + // multiple slide show instances for one document. + mxController = xController; + mbIsInStartup = false; + +} + +// XServiceInfo +OUString SAL_CALL SlideShow::getImplementationName( ) +{ + return "com.sun.star.comp.sd.SlideShow"; +} + +sal_Bool SAL_CALL SlideShow::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +Sequence< OUString > SAL_CALL SlideShow::getSupportedServiceNames( ) +{ + return { "com.sun.star.presentation.Presentation" }; +} + +// XPropertySet +Reference< XPropertySetInfo > SAL_CALL SlideShow::getPropertySetInfo() +{ + SolarMutexGuard aGuard; + static Reference< XPropertySetInfo > xInfo = maPropSet.getPropertySetInfo(); + return xInfo; + } + +void SAL_CALL SlideShow::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) +{ + SolarMutexGuard aGuard; + ThrowIfDisposed(); + + sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings(); + + const SfxItemPropertyMapEntry* pEntry = maPropSet.getPropertyMapEntry(aPropertyName); + + if( pEntry && ((pEntry->nFlags & PropertyAttribute::READONLY) != 0) ) + throw PropertyVetoException(); + + bool bValuesChanged = false; + bool bIllegalArgument = true; + + switch( pEntry ? pEntry->nWID : -1 ) + { + case ATTR_PRESENT_ALL: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if( rPresSettings.mbAll != bVal ) + { + rPresSettings.mbAll = bVal; + bValuesChanged = true; + if( bVal ) + rPresSettings.mbCustomShow = false; + } + } + break; + } + case ATTR_PRESENT_CHANGE_PAGE: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if( bVal == rPresSettings.mbLockedPages ) + { + bValuesChanged = true; + rPresSettings.mbLockedPages = !bVal; + } + } + break; + } + + case ATTR_PRESENT_ANIMATION_ALLOWED: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if(rPresSettings.mbAnimationAllowed != bVal) + { + bValuesChanged = true; + rPresSettings.mbAnimationAllowed = bVal; + } + } + break; + } + case ATTR_PRESENT_CUSTOMSHOW: + { + OUString aShowName; + if( aValue >>= aShowName ) + { + bIllegalArgument = false; + + SdCustomShowList* pCustomShowList = mpDoc->GetCustomShowList(); + if(pCustomShowList) + { + SdCustomShow* pCustomShow; + for( pCustomShow = pCustomShowList->First(); pCustomShow != nullptr; pCustomShow = pCustomShowList->Next() ) + { + if( pCustomShow->GetName() == aShowName ) + break; + } + + rPresSettings.mbCustomShow = true; + bValuesChanged = true; + } + } + break; + } + case ATTR_PRESENT_ENDLESS: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if( rPresSettings.mbEndless != bVal) + { + bValuesChanged = true; + rPresSettings.mbEndless = bVal; + } + } + break; + } + case ATTR_PRESENT_FULLSCREEN: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + if( rPresSettings.mbFullScreen != bVal) + { + bValuesChanged = true; + rPresSettings.mbFullScreen = bVal; + } + } + break; + } + case ATTR_PRESENT_DIANAME: + { + OUString aPresPage; + aValue >>= aPresPage; + bIllegalArgument = false; + if( (rPresSettings.maPresPage != aPresPage) || !rPresSettings.mbCustomShow || !rPresSettings.mbAll ) + { + bValuesChanged = true; + rPresSettings.maPresPage = getUiNameFromPageApiNameImpl(aPresPage); + rPresSettings.mbCustomShow = false; + rPresSettings.mbAll = false; + } + break; + } + case ATTR_PRESENT_MANUEL: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if( rPresSettings.mbManual != bVal) + { + bValuesChanged = true; + rPresSettings.mbManual = bVal; + } + } + break; + } + case ATTR_PRESENT_MOUSE: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + if( rPresSettings.mbMouseVisible != bVal) + { + bValuesChanged = true; + rPresSettings.mbMouseVisible = bVal; + } + } + break; + } + case ATTR_PRESENT_ALWAYS_ON_TOP: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if( rPresSettings.mbAlwaysOnTop != bVal) + { + bValuesChanged = true; + rPresSettings.mbAlwaysOnTop = bVal; + } + } + break; + } + case ATTR_PRESENT_NAVIGATOR: + bIllegalArgument = false; + //ignored, but exists in some older documents + break; + case ATTR_PRESENT_PEN: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if(rPresSettings.mbMouseAsPen != bVal) + { + bValuesChanged = true; + rPresSettings.mbMouseAsPen = bVal; + } + } + break; + } + case ATTR_PRESENT_PAUSE_TIMEOUT: + { + sal_Int32 nValue = 0; + if( (aValue >>= nValue) && (nValue >= 0) ) + { + bIllegalArgument = false; + if( rPresSettings.mnPauseTimeout != nValue ) + { + bValuesChanged = true; + rPresSettings.mnPauseTimeout = nValue; + } + } + break; + } + case ATTR_PRESENT_SHOW_PAUSELOGO: + { + bool bVal = false; + + if( aValue >>= bVal ) + { + bIllegalArgument = false; + + if( rPresSettings.mbShowPauseLogo != bVal ) + { + bValuesChanged = true; + rPresSettings.mbShowPauseLogo = bVal; + } + } + break; + } + case ATTR_PRESENT_DISPLAY: + { + sal_Int32 nDisplay = 0; + if( aValue >>= nDisplay ) + { + bIllegalArgument = false; + + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + pOptions->SetDisplay( nDisplay ); + + FullScreenWorkWindow *pWin = dynamic_cast(GetWorkWindow()); + if( !pWin ) + return; + pWin->Restart(true); + } + break; + } + + default: + throw UnknownPropertyException( OUString::number(pEntry ? pEntry->nWID : -1), static_cast(this)); + } + + if( bIllegalArgument ) + throw IllegalArgumentException(); + + if( bValuesChanged ) + mpDoc->SetChanged(); +} + +Any SAL_CALL SlideShow::getPropertyValue( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + ThrowIfDisposed(); + + const sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings(); + + const SfxItemPropertyMapEntry* pEntry = maPropSet.getPropertyMapEntry(PropertyName); + + switch( pEntry ? pEntry->nWID : -1 ) + { + case ATTR_PRESENT_ALL: + return Any( !rPresSettings.mbCustomShow && rPresSettings.mbAll ); + case ATTR_PRESENT_CHANGE_PAGE: + return Any( !rPresSettings.mbLockedPages ); + case ATTR_PRESENT_ANIMATION_ALLOWED: + return Any( rPresSettings.mbAnimationAllowed ); + case ATTR_PRESENT_CUSTOMSHOW: + { + SdCustomShowList* pList = mpDoc->GetCustomShowList(); + SdCustomShow* pShow = (pList && rPresSettings.mbCustomShow) ? pList->GetCurObject() : nullptr; + OUString aShowName; + + if(pShow) + aShowName = pShow->GetName(); + + return Any( aShowName ); + } + case ATTR_PRESENT_ENDLESS: + return Any( rPresSettings.mbEndless ); + case ATTR_PRESENT_FULLSCREEN: + return Any( rPresSettings.mbFullScreen ); + case ATTR_PRESENT_DIANAME: + { + OUString aSlideName; + + if( !rPresSettings.mbCustomShow && !rPresSettings.mbAll ) + aSlideName = getPageApiNameFromUiName( rPresSettings.maPresPage ); + + return Any( aSlideName ); + } + case ATTR_PRESENT_MANUEL: + return Any( rPresSettings.mbManual ); + case ATTR_PRESENT_MOUSE: + return Any( rPresSettings.mbMouseVisible ); + case ATTR_PRESENT_ALWAYS_ON_TOP: + return Any( rPresSettings.mbAlwaysOnTop ); + case ATTR_PRESENT_NAVIGATOR: + return Any( false ); + case ATTR_PRESENT_PEN: + return Any( rPresSettings.mbMouseAsPen ); + case ATTR_PRESENT_PAUSE_TIMEOUT: + return Any( rPresSettings.mnPauseTimeout ); + case ATTR_PRESENT_SHOW_PAUSELOGO: + return Any( rPresSettings.mbShowPauseLogo ); + case ATTR_PRESENT_DISPLAY: + { + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + return Any(pOptions->GetDisplay()); + } + + default: + throw UnknownPropertyException( OUString::number(pEntry ? pEntry->nWID : -1), static_cast(this)); + } +} + +void SAL_CALL SlideShow::addPropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >& ) +{ +} + +void SAL_CALL SlideShow::removePropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >& ) +{ +} + +void SAL_CALL SlideShow::addVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >& ) +{ +} + +void SAL_CALL SlideShow::removeVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >& ) +{ +} + +// XPresentation + +void SAL_CALL SlideShow::start() +{ + const Sequence< PropertyValue > aArguments; + startWithArguments( aArguments ); +} + +WorkWindow *SlideShow::GetWorkWindow() +{ + if( !mpFullScreenViewShellBase ) + return nullptr; + + PresentationViewShell* pShell = dynamic_cast(mpFullScreenViewShellBase->GetMainViewShell().get()); + + if( !pShell || !pShell->GetViewFrame() ) + return nullptr; + + return dynamic_cast(pShell->GetViewFrame()->GetFrame().GetWindow().GetParent()); +} + +bool SlideShow::IsExitAfterPresenting() const +{ + SolarMutexGuard aGuard; + ThrowIfDisposed(); + return mpDoc->IsExitAfterPresenting(); +} + +void SlideShow::SetExitAfterPresenting(bool bExit) +{ + SolarMutexGuard aGuard; + ThrowIfDisposed(); + mpDoc->SetExitAfterPresenting(bExit); +} + +void SAL_CALL SlideShow::end() +{ + SolarMutexGuard aGuard; + + // The mbIsInStartup flag should have been reset during the start of the + // slide show. Reset it here just in case that something has horribly + // gone wrong. + assert(!mbIsInStartup); + + rtl::Reference< SlideshowImpl > xController( mxController ); + if( !xController.is() ) + return; + + mxController.clear(); + + if( mpFullScreenFrameView ) + { + delete mpFullScreenFrameView; + mpFullScreenFrameView = nullptr; + } + + ViewShellBase* pFullScreenViewShellBase = mpFullScreenViewShellBase; + mpFullScreenViewShellBase = nullptr; + + // dispose before fullscreen window changes screens + // (potentially). If this needs to be moved behind + // pWorkWindow->StartPresentationMode() again, read issue + // pWorkWindow->i94007 & implement the solution outlined + // there. + xController->dispose(); + + if( pFullScreenViewShellBase ) + { + PresentationViewShell* pShell = dynamic_cast(pFullScreenViewShellBase->GetMainViewShell().get()); + + if( pShell && pShell->GetViewFrame() ) + { + WorkWindow* pWorkWindow = dynamic_cast(pShell->GetViewFrame()->GetFrame().GetWindow().GetParent()); + if( pWorkWindow ) + { + pWorkWindow->StartPresentationMode( (mxController.is() && mxController->maPresSettings.mbAlwaysOnTop) + ? PresentationFlags::HideAllApps : PresentationFlags::NONE ); + } + } + } + + if( pFullScreenViewShellBase ) + { + PresentationViewShell* pShell = nullptr; + { + // Get the shell pointer in its own scope to be sure that + // the shared_ptr to the shell is released before DoClose() + // is called. + ::std::shared_ptr pSharedView (pFullScreenViewShellBase->GetMainViewShell()); + pShell = dynamic_cast(pSharedView.get()); + } + if( pShell && pShell->GetViewFrame() ) + pShell->GetViewFrame()->DoClose(); + } + else if( mpCurrentViewShellBase ) + { + ViewShell* pViewShell = mpCurrentViewShellBase->GetMainViewShell().get(); + + if( pViewShell ) + { + FrameView* pFrameView = pViewShell->GetFrameView(); + + if( pFrameView && (pFrameView->GetPresentationViewShellId() != SID_VIEWSHELL0) ) + { + ViewShell::ShellType ePreviousType (pFrameView->GetPreviousViewShellType()); + pFrameView->SetPreviousViewShellType(ViewShell::ST_NONE); + + pFrameView->SetPresentationViewShellId(SID_VIEWSHELL0); + pFrameView->SetPreviousViewShellType(pViewShell->GetShellType()); + + framework::FrameworkHelper::Instance(*mpCurrentViewShellBase)->RequestView( + framework::FrameworkHelper::GetViewURL(ePreviousType), + framework::FrameworkHelper::msCenterPaneURL); + + pViewShell->GetViewFrame()->GetBindings().InvalidateAll( true ); + } + } + } + + if( mpCurrentViewShellBase ) + { + if (ViewShell* const pViewShell = mpCurrentViewShellBase->GetMainViewShell().get()) + { + // invalidate the view shell so the presentation slot will be re-enabled + // and the rehearsing will be updated + pViewShell->Invalidate(); + + if( xController->meAnimationMode ==ANIMATIONMODE_SHOW ) + { + // switch to the previously visible Slide + DrawViewShell* pDrawViewShell = dynamic_cast( pViewShell ); + if( pDrawViewShell ) + pDrawViewShell->SwitchPage( static_cast(xController->getRestoreSlide()) ); + else + { + DrawController& rDrawController = + *mpCurrentViewShellBase->GetDrawController(); + rDrawController.setCurrentPage( + Reference( + mpDoc->GetSdPage(xController->getRestoreSlide(), PageKind::Standard)->getUnoPage(), + UNO_QUERY)); + } + } + + if( pViewShell->GetDoc()->IsExitAfterPresenting() ) + { + pViewShell->GetDoc()->SetExitAfterPresenting( false ); + + Reference xProvider(pViewShell->GetViewShellBase().GetController()->getFrame(), + UNO_QUERY); + if( xProvider.is() ) + { + util::URL aURL; + aURL.Complete = ".uno:CloseFrame"; + + uno::Reference< frame::XDispatch > xDispatch( + xProvider->queryDispatch( + aURL, OUString(), 0)); + if( xDispatch.is() ) + { + xDispatch->dispatch(aURL, + uno::Sequence< beans::PropertyValue >()); + } + } + } + + // In case mbMouseAsPen was set, a new layer DrawnInSlideshow might have been generated + // during slideshow, which is not known to FrameView yet. + if (any2bool(getPropertyValue("UsePen")) + && pViewShell->GetDoc()->GetLayerAdmin().GetLayer("DrawnInSlideshow")) + { + SdrLayerIDSet aDocLayerIDSet; + pViewShell->GetDoc()->GetLayerAdmin().getVisibleLayersODF(aDocLayerIDSet); + if (pViewShell->GetFrameView()->GetVisibleLayers() != aDocLayerIDSet) + { + pViewShell->GetFrameView()->SetVisibleLayers(aDocLayerIDSet); + } + pViewShell->GetDoc()->GetLayerAdmin().getPrintableLayersODF(aDocLayerIDSet); + if (pViewShell->GetFrameView()->GetPrintableLayers() != aDocLayerIDSet) + { + pViewShell->GetFrameView()->SetPrintableLayers(aDocLayerIDSet); + } + pViewShell->GetDoc()->GetLayerAdmin().getLockedLayersODF(aDocLayerIDSet); + if (pViewShell->GetFrameView()->GetLockedLayers() != aDocLayerIDSet) + { + pViewShell->GetFrameView()->SetLockedLayers(aDocLayerIDSet); + } + pViewShell->InvalidateWindows(); + } + + // Fire the acc focus event when focus is switched back. The above method + // mpCurrentViewShellBase->GetWindow()->GrabFocus() will set focus to WorkWindow + // instead of the sd::window, so here call Shell's method to fire the focus event + pViewShell->SwitchActiveViewFireFocus(); + } + } + mpCurrentViewShellBase = nullptr; +} + +void SAL_CALL SlideShow::rehearseTimings() +{ + Sequence< PropertyValue > aArguments{ comphelper::makePropertyValue("RehearseTimings", true) }; + startWithArguments( aArguments ); +} + +// XPresentation2 + +void SAL_CALL SlideShow::startWithArguments(const Sequence< PropertyValue >& rArguments) +{ + SolarMutexGuard aGuard; + ThrowIfDisposed(); + + // Stop a running show before starting a new one. + if( mxController.is() ) + { + assert(!mbIsInStartup); + end(); + } + else if (mbIsInStartup) + { + // We are already somewhere in process of starting a slide show but + // have not yet got to the point where mxController is set. There + // is not yet a slide show to end so return silently. + return; + } + + // Prevent multiple instance of the SlideShow class for one document. + mbIsInStartup = true; + + mxCurrentSettings = std::make_shared( mpDoc->getPresentationSettings() ); + mxCurrentSettings->SetArguments( rArguments ); + + // if there is no view shell base set, use the current one or the first using this document + if( mpCurrentViewShellBase == nullptr ) + { + // first check current + ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( SfxViewFrame::Current() ); + if( pBase && pBase->GetDocument() == mpDoc ) + { + mpCurrentViewShellBase = pBase; + } + else + { + // current is not ours, so get first from ours + mpCurrentViewShellBase = ::sd::ViewShellBase::GetViewShellBase( SfxViewFrame::GetFirst( mpDoc->GetDocSh() ) ); + } + } + + // #i118456# make sure TextEdit changes get pushed to model. + // mpDrawView is tested against NULL above already. + if(mpCurrentViewShellBase) + { + ViewShell* pViewShell = mpCurrentViewShellBase->GetMainViewShell().get(); + + if(pViewShell && pViewShell->GetView()) + { + pViewShell->GetView()->SdrEndTextEdit(); + } + } + + // Start either a full-screen or an in-place show. + if(mxCurrentSettings->mbFullScreen && !mxCurrentSettings->mbPreview) + StartFullscreenPresentation(); + else + StartInPlacePresentation(); + +} + +sal_Bool SAL_CALL SlideShow::isRunning( ) +{ + SolarMutexGuard aGuard; + return mxController.is() && mxController->isRunning(); +} + +Reference< XSlideShowController > SAL_CALL SlideShow::getController( ) +{ + ThrowIfDisposed(); + + return mxController; +} + +// XComponent + +void SlideShow::disposing(std::unique_lock&) +{ + SolarMutexGuard aGuard; + + if( mnInPlaceConfigEvent ) + { + Application::RemoveUserEvent( mnInPlaceConfigEvent ); + mnInPlaceConfigEvent = nullptr; + } + + if( mxController.is() ) + { + mxController->dispose(); + mxController.clear(); + } + + mpCurrentViewShellBase = nullptr; + mpFullScreenViewShellBase = nullptr; + mpDoc = nullptr; +} + +void SlideShow::startPreview( const Reference< XDrawPage >& xDrawPage, const Reference< XAnimationNode >& xAnimationNode ) +{ + Sequence< PropertyValue > aArguments{ + comphelper::makePropertyValue("Preview", true), + comphelper::makePropertyValue("FirstPage", xDrawPage), + comphelper::makePropertyValue("AnimationNode", xAnimationNode), + comphelper::makePropertyValue("ParentWindow", Reference< XWindow >()), + }; + + startWithArguments( aArguments ); +} + +OutputDevice* SlideShow::getShowWindow() +{ + return mxController.is() ? mxController->mpShowWindow->GetOutDev() : nullptr; +} + +int SlideShow::getAnimationMode() const +{ + return mxController.is() ? mxController->meAnimationMode : ANIMATIONMODE_SHOW; +} + +void SlideShow::jumpToPageIndex( sal_Int32 nPageIndex ) +{ + if( mxController.is() ) + mxController->displaySlideIndex( nPageIndex ); +} + +void SlideShow::jumpToPageNumber( sal_Int32 nPageNumber ) +{ + if( mxController.is() ) + mxController->displaySlideNumber( nPageNumber ); +} + +sal_Int32 SlideShow::getCurrentPageNumber() const +{ + return mxController.is() ? mxController->getCurrentSlideNumber() : 0; +} + +void SlideShow::jumpToBookmark( const OUString& sBookmark ) +{ + if( mxController.is() ) + mxController->jumpToBookmark( sBookmark ); +} + +bool SlideShow::isFullScreen() const +{ + return mxController.is() && mxController->maPresSettings.mbFullScreen; +} + +void SlideShow::resize( const Size &rSize ) +{ + if( mxController.is() ) + mxController->resize( rSize ); +} + +bool SlideShow::activate( ViewShellBase& rBase ) +{ + if( (mpFullScreenViewShellBase == &rBase) && !mxController.is() ) + { + ::std::shared_ptr pShell = std::dynamic_pointer_cast(rBase.GetMainViewShell()); + if (pShell != nullptr) + { + pShell->FinishInitialization( mpFullScreenFrameView ); + mpFullScreenFrameView = nullptr; + + CreateController( pShell.get(), pShell->GetView(), rBase.GetViewWindow() ); + + if (!mxController->startShow(mxCurrentSettings.get())) + return false; + + pShell->Resize(); + // Defer the sd::ShowWindow's GrabFocus to here. so that the accessible event can be fired correctly. + pShell->GetActiveWindow()->GrabFocus(); + } + } + + if( mxController.is() ) + mxController->activate(); + + return true; +} + +void SlideShow::deactivate() +{ + mxController->deactivate(); +} + +bool SlideShow::keyInput(const KeyEvent& rKEvt) +{ + return mxController.is() && mxController->keyInput(rKEvt); +} + +void SlideShow::paint() +{ + if( mxController.is() ) + mxController->paint(); +} + +void SlideShow::pause( bool bPause ) +{ + if( mxController.is() ) + { + if( bPause ) + mxController->pause(); + else + mxController->resume(); + } +} + +bool SlideShow::swipe(const CommandGestureSwipeData& rSwipeData) +{ + return mxController.is() && mxController->swipe(rSwipeData); +} + +bool SlideShow::longpress(const CommandGestureLongPressData& rLongPressData) +{ + return mxController.is() && mxController->longpress(rLongPressData); +} + +void SlideShow::StartInPlacePresentationConfigurationCallback() +{ + if( mnInPlaceConfigEvent != nullptr ) + Application::RemoveUserEvent( mnInPlaceConfigEvent ); + + mnInPlaceConfigEvent = Application::PostUserEvent( LINK( this, SlideShow, StartInPlacePresentationConfigurationHdl ) ); +} + +IMPL_LINK_NOARG(SlideShow, StartInPlacePresentationConfigurationHdl, void*, void) +{ + mnInPlaceConfigEvent = nullptr; + StartInPlacePresentation(); +} + +void SlideShow::StartInPlacePresentation() +{ + if( mpCurrentViewShellBase ) + { + // Save the current view shell type so that it can be restored after the + // show has ended. If there already is a saved shell type then that is + // not overwritten. + + ViewShell::ShellType eShell = ViewShell::ST_NONE; + + ::std::shared_ptr pHelper(FrameworkHelper::Instance(*mpCurrentViewShellBase)); + ::std::shared_ptr pMainViewShell(pHelper->GetViewShell(FrameworkHelper::msCenterPaneURL)); + + if( pMainViewShell ) + eShell = pMainViewShell->GetShellType(); + + if( eShell != ViewShell::ST_IMPRESS ) + { + // Switch temporary to a DrawViewShell which supports the in-place presentation. + + if( pMainViewShell ) + { + FrameView* pFrameView = pMainViewShell->GetFrameView(); + pFrameView->SetPresentationViewShellId(SID_VIEWSHELL1); + pFrameView->SetPreviousViewShellType (pMainViewShell->GetShellType()); + pFrameView->SetPageKind (PageKind::Standard); + } + + pHelper->RequestView( FrameworkHelper::msImpressViewURL, FrameworkHelper::msCenterPaneURL ); + pHelper->RunOnConfigurationEvent( + FrameworkHelper::msConfigurationUpdateEndEvent, + [this] (bool const) { return this->StartInPlacePresentationConfigurationCallback(); } ); + return; + } + else + { + vcl::Window* pParentWindow = mxCurrentSettings->mpParentWindow; + if( pParentWindow == nullptr ) + pParentWindow = mpCurrentViewShellBase->GetViewWindow(); + + CreateController( pMainViewShell.get(), pMainViewShell->GetView(), pParentWindow ); + } + } + else if( mxCurrentSettings->mpParentWindow ) + { + // no current view shell, but parent window + CreateController( nullptr, nullptr, mxCurrentSettings->mpParentWindow ); + } + + if( !mxController.is() ) + return; + + bool bSuccess = false; + if( mxCurrentSettings && mxCurrentSettings->mbPreview ) + { + bSuccess = mxController->startPreview(mxCurrentSettings->mxStartPage, mxCurrentSettings->mxAnimationNode, mxCurrentSettings->mpParentWindow ); + } + else + { + bSuccess = mxController->startShow(mxCurrentSettings.get()); + } + + if( !bSuccess ) + end(); + else + { + if( mpCurrentViewShellBase && ( !mxCurrentSettings || ( mxCurrentSettings && !mxCurrentSettings->mbPreview ) ) ) + mpCurrentViewShellBase->GetWindow()->GrabFocus(); + } +} + +void SlideShow::StartFullscreenPresentation( ) +{ + // Create the top level window in which the PresentationViewShell(Base) + // will be created. This is done here explicitly so that we can make it + // fullscreen. + const sal_Int32 nDisplay (GetDisplay()); + VclPtr pWorkWindow = VclPtr::Create(this, mpCurrentViewShellBase); + pWorkWindow->SetBackground(Wallpaper(COL_BLACK)); + OUString Title(SdResId(STR_FULLSCREEN_SLIDESHOW)); + Title = Title.replaceFirst("%s", + mpCurrentViewShellBase->GetDocShell()->GetTitle(SFX_TITLE_DETECT)); + pWorkWindow->SetText(Title); + pWorkWindow->StartPresentationMode( true, mpDoc->getPresentationSettings().mbAlwaysOnTop ? PresentationFlags::HideAllApps : PresentationFlags::NONE, nDisplay); + // pWorkWindow->ShowFullScreenMode(sal_False, nDisplay); + + if (!pWorkWindow->IsVisible()) + return; + + // Initialize the new presentation view shell with a copy of the + // frame view of the current view shell. This avoids that + // changes made by the presentation have an effect on the other + // view shells. + FrameView* pOriginalFrameView = nullptr; + ::std::shared_ptr xShell(mpCurrentViewShellBase->GetMainViewShell()); + if (xShell) + pOriginalFrameView = xShell->GetFrameView(); + + delete mpFullScreenFrameView; + mpFullScreenFrameView = new FrameView(mpDoc, pOriginalFrameView); + + // The new frame is created hidden. To make it visible and activate the + // new view shell--a prerequisite to process slot calls and initialize + // its panes--a GrabFocus() has to be called later on. + SfxFrame* pNewFrame = SfxFrame::CreateHidden( *mpDoc->GetDocSh(), *pWorkWindow, PRESENTATION_FACTORY_ID ); + pNewFrame->SetPresentationMode(true); + + mpFullScreenViewShellBase = static_cast(pNewFrame->GetCurrentViewFrame()->GetViewShell()); + if(mpFullScreenViewShellBase != nullptr) + { + // The following GrabFocus() is responsible for activating the + // new view shell. Without it the screen remains blank (under + // Windows and some Linux variants.) + mpFullScreenViewShellBase->GetWindow()->GrabFocus(); + } +} + +/// convert configuration setting display concept to real screens +sal_Int32 SlideShow::GetDisplay() +{ + sal_Int32 nDisplay = 0; + + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + if( pOptions ) + nDisplay = pOptions->GetDisplay(); + + if( nDisplay < 0 ) + nDisplay = -1; + else if( nDisplay == 0) + nDisplay = static_cast(Application::GetDisplayExternalScreen()); + else + nDisplay--; + + SAL_INFO("sd", "Presenting on real screen " << nDisplay); + + return nDisplay; +} + +bool SlideShow::dependsOn( ViewShellBase const * pViewShellBase ) +{ + return mxController.is() && (pViewShellBase == mpCurrentViewShellBase) && mpFullScreenViewShellBase; +} + +Reference< presentation::XPresentation2 > CreatePresentation( const SdDrawDocument& rDocument ) +{ + return Reference< presentation::XPresentation2 >( SlideShow::Create( const_cast< SdDrawDocument* >( &rDocument ) ) ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/slideshowimpl.cxx b/sd/source/ui/slideshow/slideshowimpl.cxx new file mode 100644 index 0000000000..4bf43fc3bd --- /dev/null +++ b/sd/source/ui/slideshow/slideshowimpl.cxx @@ -0,0 +1,3619 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "slideshowimpl.hxx" +#include "slideshowviewimpl.hxx" +#include "PaneHider.hxx" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CM_SLIDES 21 + +using ::com::sun::star::animations::XAnimationNode; +using ::com::sun::star::animations::XAnimationListener; +using ::com::sun::star::awt::XWindow; +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::beans; + +namespace sd +{ +/** Slots, which will be disabled in the slide show and are managed by Sfx. + Have to be sorted in the order of the SIDs */ +sal_uInt16 const pAllowed[] = +{ + SID_OPENDOC , // 5501 ///< that internally jumps work + SID_JUMPTOMARK , // 5598 + SID_OPENHYPERLINK , // 6676 + SID_PRESENTATION_END // 27218 +}; + +class AnimationSlideController +{ +public: + enum Mode { ALL, FROM, CUSTOM, PREVIEW }; + +public: + AnimationSlideController( Reference< XIndexAccess > const & xSlides, Mode eMode ); + + void setStartSlideNumber( sal_Int32 nSlideNumber ) { mnStartSlideNumber = nSlideNumber; } + sal_Int32 getStartSlideIndex() const; + + sal_Int32 getCurrentSlideNumber() const; + sal_Int32 getCurrentSlideIndex() const; + + sal_Int32 getSlideIndexCount() const { return maSlideNumbers.size(); } + sal_Int32 getSlideNumberCount() const { return mnSlideCount; } + + sal_Int32 getSlideNumber( sal_Int32 nSlideIndex ) const; + + void insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible = true ); + void setPreviewNode( const Reference< XAnimationNode >& xPreviewNode ); + + bool jumpToSlideIndex( sal_Int32 nNewSlideIndex ); + bool jumpToSlideNumber( sal_Int32 nNewSlideIndex ); + + bool nextSlide(); + bool previousSlide(); + + void displayCurrentSlide( const Reference< XSlideShow >& xShow, + const Reference< XDrawPagesSupplier>& xDrawPages, + const bool bSkipAllMainSequenceEffects ); + + sal_Int32 getNextSlideIndex() const; + sal_Int32 getPreviousSlideIndex() const; + + bool isVisibleSlideNumber( sal_Int32 nSlideNumber ) const; + + Reference< XDrawPage > getSlideByNumber( sal_Int32 nSlideNumber ) const; + + sal_Int32 getNextSlideNumber() const; + + bool hasSlides() const { return !maSlideNumbers.empty(); } + +private: + bool getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode ); + sal_Int32 findSlideIndex( sal_Int32 nSlideNumber ) const; + + bool isValidIndex( sal_Int32 nIndex ) const { return (nIndex >= 0) && (o3tl::make_unsigned(nIndex) < maSlideNumbers.size()); } + bool isValidSlideNumber( sal_Int32 nSlideNumber ) const { return (nSlideNumber >= 0) && (nSlideNumber < mnSlideCount); } + +private: + Mode meMode; + sal_Int32 mnStartSlideNumber; + std::vector< sal_Int32 > maSlideNumbers; + std::vector< bool > maSlideVisible; + std::vector< bool > maSlideVisited; + Reference< XAnimationNode > mxPreviewNode; + sal_Int32 mnSlideCount; + sal_Int32 mnCurrentSlideIndex; + sal_Int32 mnHiddenSlideNumber; + Reference< XIndexAccess > mxSlides; +}; + +Reference< XDrawPage > AnimationSlideController::getSlideByNumber( sal_Int32 nSlideNumber ) const +{ + Reference< XDrawPage > xSlide; + if( mxSlides.is() && (nSlideNumber >= 0) && (nSlideNumber < mxSlides->getCount()) ) + mxSlides->getByIndex( nSlideNumber ) >>= xSlide; + return xSlide; +} + +bool AnimationSlideController::isVisibleSlideNumber( sal_Int32 nSlideNumber ) const +{ + sal_Int32 nIndex = findSlideIndex( nSlideNumber ); + + if( nIndex != -1 ) + return maSlideVisible[ nIndex ]; + else + return false; +} + +void AnimationSlideController::setPreviewNode( const Reference< XAnimationNode >& xPreviewNode ) +{ + mxPreviewNode = xPreviewNode; +} + +AnimationSlideController::AnimationSlideController( Reference< XIndexAccess > const & xSlides, Mode eMode ) +: meMode( eMode ) +, mnStartSlideNumber(-1) +, mnSlideCount( 0 ) +, mnCurrentSlideIndex(0) +, mnHiddenSlideNumber( -1 ) +, mxSlides( xSlides ) +{ + if( mxSlides.is() ) + mnSlideCount = xSlides->getCount(); +} + +sal_Int32 AnimationSlideController::getStartSlideIndex() const +{ + if( mnStartSlideNumber >= 0 ) + { + sal_Int32 nIndex; + const sal_Int32 nCount = maSlideNumbers.size(); + + for( nIndex = 0; nIndex < nCount; nIndex++ ) + { + if( maSlideNumbers[nIndex] == mnStartSlideNumber ) + return nIndex; + } + } + + return 0; +} + +sal_Int32 AnimationSlideController::getCurrentSlideNumber() const +{ + if( mnHiddenSlideNumber != -1 ) + return mnHiddenSlideNumber; + else if( !maSlideNumbers.empty() ) + return maSlideNumbers[mnCurrentSlideIndex]; + else + return 0; +} + +sal_Int32 AnimationSlideController::getCurrentSlideIndex() const +{ + if( mnHiddenSlideNumber != -1 ) + return -1; + else + return mnCurrentSlideIndex; +} + +bool AnimationSlideController::jumpToSlideIndex( sal_Int32 nNewSlideIndex ) +{ + if( isValidIndex( nNewSlideIndex ) ) + { + mnCurrentSlideIndex = nNewSlideIndex; + mnHiddenSlideNumber = -1; + maSlideVisited[mnCurrentSlideIndex] = true; + return true; + } + else + { + return false; + } +} + +bool AnimationSlideController::jumpToSlideNumber( sal_Int32 nNewSlideNumber ) +{ + sal_Int32 nIndex = findSlideIndex( nNewSlideNumber ); + if( isValidIndex( nIndex ) ) + { + return jumpToSlideIndex( nIndex ); + } + else if( (nNewSlideNumber >= 0) && (nNewSlideNumber < mnSlideCount) ) + { + // jump to a hidden slide + mnHiddenSlideNumber = nNewSlideNumber; + return true; + } + else + { + return false; + } +} + +sal_Int32 AnimationSlideController::getSlideNumber( sal_Int32 nSlideIndex ) const +{ + if( isValidIndex( nSlideIndex ) ) + return maSlideNumbers[nSlideIndex]; + else + return -1; +} + +void AnimationSlideController::insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible /* = true */ ) +{ + DBG_ASSERT( isValidSlideNumber( nSlideNumber ), "sd::AnimationSlideController::insertSlideNumber(), illegal index" ); + if( isValidSlideNumber( nSlideNumber ) ) + { + maSlideNumbers.push_back( nSlideNumber ); + maSlideVisible.push_back( bVisible ); + maSlideVisited.push_back( false ); + } +} + +bool AnimationSlideController::getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode ) +{ + if( isValidSlideNumber( nSlideNumber ) ) try + { + xSlide.set( mxSlides->getByIndex(nSlideNumber), UNO_QUERY_THROW ); + + if( meMode == PREVIEW ) + { + xAnimNode = mxPreviewNode; + } + else + { + Reference< animations::XAnimationNodeSupplier > xAnimNodeSupplier( xSlide, UNO_QUERY_THROW ); + xAnimNode = xAnimNodeSupplier->getAnimationNode(); + } + + return true; + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::AnimationSlideController::getSlideAPI()" ); + } + + return false; +} + +sal_Int32 AnimationSlideController::findSlideIndex( sal_Int32 nSlideNumber ) const +{ + sal_Int32 nIndex; + const sal_Int32 nCount = maSlideNumbers.size(); + + for( nIndex = 0; nIndex < nCount; nIndex++ ) + { + if( maSlideNumbers[nIndex] == nSlideNumber ) + return nIndex; + } + + return -1; +} + +sal_Int32 AnimationSlideController::getNextSlideIndex() const +{ + switch( meMode ) + { + case ALL: + { + sal_Int32 nNewSlideIndex = mnCurrentSlideIndex + 1; + if( isValidIndex( nNewSlideIndex ) ) + { + // if the current slide is not excluded, make sure the + // next slide is also not excluded. + // if the current slide is excluded, we want to go + // to the next slide, even if this is also excluded. + if( maSlideVisible[mnCurrentSlideIndex] ) + { + while( isValidIndex( nNewSlideIndex ) ) + { + if( maSlideVisible[nNewSlideIndex] ) + break; + + nNewSlideIndex++; + } + } + } + return isValidIndex( nNewSlideIndex ) ? nNewSlideIndex : -1; + } + + case FROM: + case CUSTOM: + return mnHiddenSlideNumber == -1 ? mnCurrentSlideIndex + 1 : mnCurrentSlideIndex; + + default: + case PREVIEW: + return -1; + + } +} + +sal_Int32 AnimationSlideController::getNextSlideNumber() const +{ + sal_Int32 nNextSlideIndex = getNextSlideIndex(); + if( isValidIndex( nNextSlideIndex ) ) + { + return maSlideNumbers[nNextSlideIndex]; + } + else + { + return -1; + } +} + +bool AnimationSlideController::nextSlide() +{ + return jumpToSlideIndex( getNextSlideIndex() ); +} + +sal_Int32 AnimationSlideController::getPreviousSlideIndex() const +{ + sal_Int32 nNewSlideIndex = mnCurrentSlideIndex - 1; + + switch( meMode ) + { + case ALL: + { + // make sure the previous slide is visible + // or was already visited + while( isValidIndex( nNewSlideIndex ) ) + { + if( maSlideVisible[nNewSlideIndex] || maSlideVisited[nNewSlideIndex] ) + break; + + nNewSlideIndex--; + } + + break; + } + + case PREVIEW: + return -1; + + default: + break; + } + + return nNewSlideIndex; +} + +bool AnimationSlideController::previousSlide() +{ + return jumpToSlideIndex( getPreviousSlideIndex() ); +} + +void AnimationSlideController::displayCurrentSlide( const Reference< XSlideShow >& xShow, + const Reference< XDrawPagesSupplier>& xDrawPages, + const bool bSkipAllMainSequenceEffects ) +{ + const sal_Int32 nCurrentSlideNumber = getCurrentSlideNumber(); + + if( !(xShow.is() && (nCurrentSlideNumber != -1 )) ) + return; + + Reference< XDrawPage > xSlide; + Reference< XAnimationNode > xAnimNode; + ::std::vector aProperties; + + const sal_Int32 nNextSlideNumber = getNextSlideNumber(); + if( getSlideAPI( nNextSlideNumber, xSlide, xAnimNode ) ) + { + Sequence< Any > aValue{ Any(xSlide), Any(xAnimNode) }; + aProperties.emplace_back( "Prefetch" , + -1, + Any(aValue), + PropertyState_DIRECT_VALUE); + } + if (bSkipAllMainSequenceEffects) + { + // Add one property that prevents the slide transition from being + // shown (to speed up the transition to the previous slide) and + // one to show all main sequence effects so that the user can + // continue to undo effects. + aProperties.emplace_back( "SkipAllMainSequenceEffects", + -1, + Any(true), + PropertyState_DIRECT_VALUE); + aProperties.emplace_back("SkipSlideTransition", + -1, + Any(true), + PropertyState_DIRECT_VALUE); + } + + if( getSlideAPI( nCurrentSlideNumber, xSlide, xAnimNode ) ) + xShow->displaySlide( xSlide, xDrawPages, xAnimNode, comphelper::containerToSequence(aProperties) ); +} + +constexpr OUString gsOnClick( u"OnClick"_ustr ); +constexpr OUString gsBookmark( u"Bookmark"_ustr ); +constexpr OUString gsVerb( u"Verb"_ustr ); + +SlideshowImpl::SlideshowImpl( const Reference< XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, vcl::Window* pParentWindow ) +: mxModel(pDoc->getUnoModel()) +, maUpdateTimer("SlideShowImpl maUpdateTimer") +, maInputFreezeTimer("SlideShowImpl maInputFreezeTimer") +, maDeactivateTimer("SlideShowImpl maDeactivateTimer") +, mpView(pView) +, mpViewShell(pViewSh) +, mpDocSh(pDoc->GetDocSh()) +, mpDoc(pDoc) +, mpParentWindow(pParentWindow) +, mpShowWindow(nullptr) +, mnRestoreSlide(0) +, maPresSize( -1, -1 ) +, meAnimationMode(ANIMATIONMODE_SHOW) +, mpOldActiveWindow(nullptr) +, mnChildMask( 0 ) +, mbDisposed(false) +, mbAutoSaveWasOn(false) +, mbRehearseTimings(false) +, mbIsPaused(false) +, mbWasPaused(false) +, mbInputFreeze(false) +, mbActive(false) +, maPresSettings( pDoc->getPresentationSettings() ) +, mnUserPaintColor( 0x80ff0000L ) +, mbUsePen(false) +, mdUserPaintStrokeWidth ( 150.0 ) +, mnEndShowEvent(nullptr) +, mnContextMenuEvent(nullptr) +, mnEventObjectChange(nullptr) +, mnEventPageOrderChange(nullptr) +, mxPresentation( xPresentation ) +{ + if( mpViewShell ) + mpOldActiveWindow = mpViewShell->GetActiveWindow(); + + maUpdateTimer.SetInvokeHandler(LINK(this, SlideshowImpl, updateHdl)); + // Priority must not be too high or we'll starve input handling etc. + maUpdateTimer.SetPriority(TaskPriority::REPAINT); + + maDeactivateTimer.SetInvokeHandler(LINK(this, SlideshowImpl, deactivateHdl)); + maDeactivateTimer.SetTimeout( 20 ); + + maInputFreezeTimer.SetInvokeHandler( LINK( this, SlideshowImpl, ReadyForNextInputHdl ) ); + maInputFreezeTimer.SetTimeout( 20 ); + + // no autosave during show + if (officecfg::Office::Recovery::AutoSave::Enabled::get()) + mbAutoSaveWasOn = true; + + Application::AddEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) ); + + mbUsePen = maPresSettings.mbMouseAsPen; + + SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress); + if( pOptions ) + { + mnUserPaintColor = pOptions->GetPresentationPenColor(); + mdUserPaintStrokeWidth = pOptions->GetPresentationPenWidth(); + } + + // to be able to react on various changes in the DrawModel, this class + // is now derived from SfxListener and registers itself at the DrawModel + if (nullptr != mpDoc) + StartListening(*mpDoc); +} + +SlideshowImpl::~SlideshowImpl() +{ + // stop listening to DrawModel (see above) + if (nullptr != mpDoc) + EndListening(*mpDoc); + + SdModule *pModule = SD_MOD(); + //rhbz#806663 SlideshowImpl can outlive SdModule + SdOptions* pOptions = pModule ? + pModule->GetSdOptions(DocumentType::Impress) : nullptr; + if( pOptions ) + { + pOptions->SetPresentationPenColor(mnUserPaintColor); + pOptions->SetPresentationPenWidth(mdUserPaintStrokeWidth); + } + + Application::RemoveEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) ); + + maDeactivateTimer.Stop(); + + if( !mbDisposed ) + { + OSL_FAIL("SlideshowImpl::~SlideshowImpl(), component was not disposed!"); + std::unique_lock g(m_aMutex); + disposing(g); + } +} + +void SlideshowImpl::disposing(std::unique_lock&) +{ +#ifdef ENABLE_SDREMOTE + RemoteServer::presentationStopped(); +#endif + if( mxShow.is() && mpDoc ) + NotifyDocumentEvent( + *mpDoc, + "OnEndPresentation" ); + + if( mbAutoSaveWasOn ) + setAutoSaveState( true ); + + if( mnEndShowEvent ) + Application::RemoveUserEvent( mnEndShowEvent ); + if( mnContextMenuEvent ) + Application::RemoveUserEvent( mnContextMenuEvent ); + if( mnEventObjectChange ) + Application::RemoveUserEvent( mnEventObjectChange ); + if( mnEventPageOrderChange ) + Application::RemoveUserEvent( mnEventPageOrderChange ); + + maInputFreezeTimer.Stop(); + + SolarMutexGuard aSolarGuard; + + if( !mxShow.is() ) + return; + + if( mxPresentation.is() ) + mxPresentation->end(); + + maUpdateTimer.Stop(); + + removeShapeEvents(); + + if( mxListenerProxy.is() ) + mxListenerProxy->removeAsSlideShowListener(); + + try + { + if( mxView.is() ) + mxShow->removeView( mxView ); + + Reference< XComponent > xComponent( mxShow, UNO_QUERY ); + if( xComponent.is() ) + xComponent->dispose(); + + if( mxView.is() ) + mxView->dispose(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::stop()" ); + } + + mxShow.clear(); + mxView.clear(); + mxListenerProxy.clear(); + mpSlideController.reset(); + + // take DrawView from presentation window, but give the old window back + if( mpShowWindow && mpView ) + mpView->DeleteDeviceFromPaintView( *mpShowWindow->GetOutDev() ); + + if( mpView ) + mpView->SetAnimationPause( false ); + + if( mpViewShell ) + { + mpViewShell->SetActiveWindow(mpOldActiveWindow); + if (mpShowWindow) + mpShowWindow->SetViewShell( nullptr ); + } + + if( mpView ) + mpView->InvalidateAllWin(); + + if( maPresSettings.mbFullScreen ) + { +#if HAVE_FEATURE_SCRIPTING + // restore StarBASICErrorHdl + StarBASIC::SetGlobalErrorHdl(maStarBASICGlobalErrorHdl); + maStarBASICGlobalErrorHdl = Link(); +#endif + } + else + { + if( mpShowWindow ) + mpShowWindow->Hide(); + } + + if( meAnimationMode == ANIMATIONMODE_SHOW ) + { + mpDocSh->SetSlotFilter(); + mpDocSh->ApplySlotFilter(); + + Help::EnableContextHelp(); + Help::EnableExtHelp(); + + showChildWindows(); + mnChildMask = 0; + } + + // show current window again + if( mpViewShell && dynamic_cast< PresentationViewShell *>( mpViewShell ) == nullptr) + { + if( meAnimationMode == ANIMATIONMODE_SHOW ) + { + mpViewShell->GetViewShellBase().ShowUIControls (true); + mpPaneHider.reset(); + } + else if( meAnimationMode == ANIMATIONMODE_PREVIEW ) + { + mpViewShell->ShowUIControls(true); + } + } + + if( mpShowWindow ) + mpShowWindow->Hide(); + mpShowWindow.disposeAndClear(); + + if ( mpViewShell ) + { + if( meAnimationMode == ANIMATIONMODE_SHOW ) + { + ::sd::Window* pActWin = mpViewShell->GetActiveWindow(); + + if (pActWin) + { + Size aVisSizePixel = pActWin->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = pActWin->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + mpViewShell->VisAreaChanged(aVisAreaWin); + if (mpView) + mpView->VisAreaChanged(pActWin->GetOutDev()); + pActWin->GrabFocus(); + } + } + + // restart the custom show dialog if he started us + if( mpViewShell->IsStartShowWithDialog() && getDispatcher() ) + { + mpViewShell->SetStartShowWithDialog( false ); + getDispatcher()->Execute( SID_CUSTOMSHOW_DLG, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } + + mpViewShell->GetViewShellBase().UpdateBorder(true); + } + + if( mpShowWindow ) + { + mpShowWindow.disposeAndClear(); + } + + setActiveXToolbarsVisible( true ); + + mbDisposed = true; +} + +bool SlideshowImpl::startPreview( + const Reference< XDrawPage >& xDrawPage, + const Reference< XAnimationNode >& xAnimationNode, + vcl::Window * pParent ) +{ + bool bRet = false; + + try + { + const Reference xServiceInfo( xDrawPage, UNO_QUERY ); + if (xServiceInfo.is()) { + const Sequence supportedServices( + xServiceInfo->getSupportedServiceNames() ); + if (comphelper::findValue(supportedServices, "com.sun.star.drawing.MasterPage") != -1) { + OSL_FAIL("sd::SlideshowImpl::startPreview() " + "not allowed on master page!"); + return false; + } + } + + mxPreviewDrawPage = xDrawPage; + mxPreviewAnimationNode = xAnimationNode; + meAnimationMode = ANIMATIONMODE_PREVIEW; + + maPresSettings.mbAll = false; + maPresSettings.mbEndless = false; + maPresSettings.mbCustomShow = false; + maPresSettings.mbManual = false; + maPresSettings.mbMouseVisible = false; + maPresSettings.mbMouseAsPen = false; + maPresSettings.mbLockedPages = false; + maPresSettings.mbAlwaysOnTop = false; + maPresSettings.mbFullScreen = false; + maPresSettings.mbAnimationAllowed = true; + maPresSettings.mnPauseTimeout = 0; + maPresSettings.mbShowPauseLogo = false; + + Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW ); + Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW ); + mpSlideController = std::make_shared( xSlides, AnimationSlideController::PREVIEW ); + + sal_Int32 nSlideNumber = 0; + Reference< XPropertySet > xSet( mxPreviewDrawPage, UNO_QUERY_THROW ); + xSet->getPropertyValue( "Number" ) >>= nSlideNumber; + mpSlideController->insertSlideNumber( nSlideNumber-1 ); + mpSlideController->setPreviewNode( xAnimationNode ); + + mpShowWindow = VclPtr::Create( this, ((pParent == nullptr) && mpViewShell) ? mpParentWindow.get() : pParent ); + if( mpViewShell ) + { + mpViewShell->SetActiveWindow( mpShowWindow ); + mpShowWindow->SetViewShell (mpViewShell); + mpViewShell->ShowUIControls (false); + } + + if( mpView ) + { + mpView->AddDeviceToPaintView( *mpShowWindow->GetOutDev(), nullptr ); + mpView->SetAnimationPause( true ); + } + + // call resize handler + if( pParent ) + { + maPresSize = pParent->GetSizePixel(); + } + else if( mpViewShell ) + { + ::tools::Rectangle aContentRect (mpViewShell->GetViewShellBase().getClientRectangle()); + if (AllSettings::GetLayoutRTL()) + { + aContentRect.SetLeft( aContentRect.Right() ); + aContentRect.AdjustRight(aContentRect.Right() ); + } + maPresSize = aContentRect.GetSize(); + mpShowWindow->SetPosPixel( aContentRect.TopLeft() ); + } + else + { + OSL_FAIL("sd::SlideshowImpl::startPreview(), I need either a parent window or a viewshell!"); + } + resize( maPresSize ); + + sal_Int32 nPropertyCount = 1; + if( mxPreviewAnimationNode.is() ) + nPropertyCount++; + + Sequence< beans::PropertyValue > aProperties(nPropertyCount); + auto pProperties = aProperties.getArray(); + pProperties[0].Name = "AutomaticAdvancement"; + pProperties[0].Value <<= 1.0; // one second timeout + + if( mxPreviewAnimationNode.is() ) + { + pProperties[1].Name = "NoSlideTransitions"; + pProperties[1].Value <<= true; + } + + bRet = startShowImpl( aProperties ); + + if( mpShowWindow != nullptr && meAnimationMode == ANIMATIONMODE_PREVIEW ) + mpShowWindow->SetPreviewMode(); + + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startPreview()" ); + bRet = false; + } + + return bRet; +} + +bool SlideshowImpl::startShow( PresentationSettingsEx const * pPresSettings ) +{ + const rtl::Reference xKeepAlive(this); + + DBG_ASSERT( !mxShow.is(), "sd::SlideshowImpl::startShow(), called twice!" ); + if( mxShow.is() ) + return true; + DBG_ASSERT( mpParentWindow!=nullptr, "sd::SlideshowImpl::startShow() called without parent window" ); + if (mpParentWindow == nullptr) + return false; + + // Autoplay (pps/ppsx) + if (mpViewShell->GetDoc()->IsStartWithPresentation()){ + mpViewShell->GetDoc()->SetExitAfterPresenting(true); + } + + bool bRet = false; + + try + { + if( pPresSettings ) + { + maPresSettings = *pPresSettings; + mbRehearseTimings = pPresSettings->mbRehearseTimings; + } + + OUString aPresSlide( maPresSettings.maPresPage ); + SdPage* pStartPage = mpViewShell->GetActualPage(); + bool bStartWithActualSlide = pStartPage; + + // times should be measured? + if( mbRehearseTimings ) + { + maPresSettings.mbEndless = false; + maPresSettings.mbManual = true; + maPresSettings.mbMouseVisible = true; + maPresSettings.mbMouseAsPen = false; + maPresSettings.mnPauseTimeout = 0; + maPresSettings.mbShowPauseLogo = false; + } + + if( pStartPage ) + { + if( pStartPage->GetPageKind() == PageKind::Notes ) + { + // we are in notes page mode, so get + // the corresponding draw page + const sal_uInt16 nPgNum = ( pStartPage->GetPageNum() - 2 ) >> 1; + pStartPage = mpDoc->GetSdPage( nPgNum, PageKind::Standard ); + } + } + + if( bStartWithActualSlide ) + { + if ( aPresSlide.isEmpty()) + { + // no preset slide yet, so pick current on one + aPresSlide = pStartPage->GetName(); + // if the starting slide is hidden, we can't set slide controller to ALL mode + maPresSettings.mbAll = !pStartPage->IsExcluded(); + } + + if( meAnimationMode != ANIMATIONMODE_SHOW ) + { + if( pStartPage->GetPageKind() == PageKind::Standard ) + { + maPresSettings.mbAll = false; + } + } + } + + // build page list + createSlideList( maPresSettings.mbAll, aPresSlide ); + + // remember Slide number from where the show was started + if( pStartPage ) + mnRestoreSlide = ( pStartPage->GetPageNum() - 1 ) / 2; + + if( mpSlideController->hasSlides() ) + { + // hide child windows + hideChildWindows(); + + mpShowWindow = VclPtr::Create( this, mpParentWindow ); + mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible ); + mpViewShell->SetActiveWindow( mpShowWindow ); + mpShowWindow->SetViewShell (mpViewShell); + mpViewShell->GetViewShellBase().ShowUIControls (false); + // Hide the side panes for in-place presentations. + if ( ! maPresSettings.mbFullScreen) + mpPaneHider.reset(new PaneHider(*mpViewShell,this)); + + // these Slots are forbidden in other views for this document + if( mpDocSh ) + { + mpDocSh->SetSlotFilter( true, pAllowed ); + mpDocSh->ApplySlotFilter(); + } + + Help::DisableContextHelp(); + Help::DisableExtHelp(); + + if( maPresSettings.mbFullScreen ) + { +#if HAVE_FEATURE_SCRIPTING + // disable basic ide error handling + maStarBASICGlobalErrorHdl = StarBASIC::GetGlobalErrorHdl(); + StarBASIC::SetGlobalErrorHdl( Link() ); +#endif + } + + // call resize handler + maPresSize = mpParentWindow->GetSizePixel(); + if (!maPresSettings.mbFullScreen) + { + const ::tools::Rectangle& aClientRect = mpViewShell->GetViewShellBase().getClientRectangle(); + maPresSize = aClientRect.GetSize(); + mpShowWindow->SetPosPixel( aClientRect.TopLeft() ); + resize( maPresSize ); + } + + // #i41824# + // Note: In FullScreen Mode the OS (window manager) sends a resize to + // the WorkWindow once it actually resized it to full size. The + // WorkWindow propagates the resize to the DrawViewShell which calls + // resize() at the SlideShow (this). Calling resize here results in a + // temporary display of a black window in the window's default size + + if( mpView ) + { + mpView->AddDeviceToPaintView( *mpShowWindow->GetOutDev(), nullptr ); + mpView->SetAnimationPause( true ); + } + + SfxBindings* pBindings = getBindings(); + if( pBindings ) + { + pBindings->Invalidate( SID_PRESENTATION ); + pBindings->Invalidate( SID_REHEARSE_TIMINGS ); + } + + // Defer the sd::ShowWindow's GrabFocus to SlideShow::activate. so that the accessible event can be fired correctly. + //mpShowWindow->GrabFocus(); + + std::vector aProperties; + aProperties.reserve( 4 ); + + aProperties.emplace_back( "AdvanceOnClick" , + -1, Any( !maPresSettings.mbLockedPages ), + beans::PropertyState_DIRECT_VALUE ); + + aProperties.emplace_back( "ImageAnimationsAllowed" , + -1, Any( maPresSettings.mbAnimationAllowed ), + beans::PropertyState_DIRECT_VALUE ); + + const bool bZOrderEnabled( + SD_MOD()->GetSdOptions( mpDoc->GetDocumentType() )->IsSlideshowRespectZOrder() ); + aProperties.emplace_back( "DisableAnimationZOrder" , + -1, Any( !bZOrderEnabled ), + beans::PropertyState_DIRECT_VALUE ); + + aProperties.emplace_back( "ForceManualAdvance" , + -1, Any( maPresSettings.mbManual ), + beans::PropertyState_DIRECT_VALUE ); + + if( mbUsePen ) + { + aProperties.emplace_back( "UserPaintColor" , + // User paint color is black by default. + -1, Any( mnUserPaintColor ), + beans::PropertyState_DIRECT_VALUE ); + + aProperties.emplace_back( "UserPaintStrokeWidth" , + // User paint color is black by default. + -1, Any( mdUserPaintStrokeWidth ), + beans::PropertyState_DIRECT_VALUE ); + } + + if (mbRehearseTimings) { + aProperties.emplace_back( "RehearseTimings" , + -1, Any(true), beans::PropertyState_DIRECT_VALUE ); + } + + bRet = startShowImpl( Sequence( + aProperties.data(), aProperties.size() ) ); + + } + + setActiveXToolbarsVisible( false ); + } + catch (const Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startShow()" ); + bRet = false; + } + + return bRet; +} + +bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProperties ) +{ + try + { + mxShow.set( createSlideShow(), UNO_SET_THROW ); + + mxView = new SlideShowView( + *mpShowWindow, + mpDoc, + meAnimationMode, + this, + maPresSettings.mbFullScreen); + + // try add wait symbol to properties: + const Reference xSpriteCanvas( + mxView->getCanvas() ); + if (xSpriteCanvas.is()) + { + BitmapEx waitSymbolBitmap(BMP_WAIT_ICON); + const Reference xBitmap( + vcl::unotools::xBitmapFromBitmapEx( waitSymbolBitmap ) ); + if (xBitmap.is()) + { + mxShow->setProperty( + beans::PropertyValue( "WaitSymbolBitmap" , + -1, + Any( xBitmap ), + beans::PropertyState_DIRECT_VALUE ) ); + } + + BitmapEx pointerSymbolBitmap(BMP_POINTER_ICON); + const Reference xPointerBitmap( + vcl::unotools::xBitmapFromBitmapEx( pointerSymbolBitmap ) ); + if (xPointerBitmap.is()) + { + mxShow->setProperty( + beans::PropertyValue( "PointerSymbolBitmap" , + -1, + Any( xPointerBitmap ), + beans::PropertyState_DIRECT_VALUE ) ); + } + if (officecfg::Office::Impress::Misc::Start::ShowNavigationPanel::get()) + { + NavbarButtonSize btnScale = static_cast(officecfg::Office::Impress::Layout::Display::NavigationBtnScale::get()); + OUString prevSlidePath = ""; + OUString nextSlidePath = ""; + OUString menuPath = ""; + switch (btnScale) + { + case NavbarButtonSize::Large: + { + prevSlidePath = BMP_PREV_SLIDE_LARGE; + nextSlidePath = BMP_NEXT_SLIDE_LARGE; + menuPath = BMP_MENU_SLIDE_LARGE; + break; + } + case NavbarButtonSize::XLarge: + { + prevSlidePath = BMP_PREV_SLIDE_EXTRALARGE; + nextSlidePath = BMP_NEXT_SLIDE_EXTRALARGE; + menuPath = BMP_MENU_SLIDE_EXTRALARGE; + break; + } + case NavbarButtonSize::Auto: + case NavbarButtonSize::Small: + default: + { + prevSlidePath = BMP_PREV_SLIDE_SMALL; + nextSlidePath = BMP_NEXT_SLIDE_SMALL; + menuPath = BMP_MENU_SLIDE_SMALL; + break; + } + } + BitmapEx prevSlideBm(prevSlidePath); + const Reference xPrevSBitmap( + vcl::unotools::xBitmapFromBitmapEx(prevSlideBm)); + if (xPrevSBitmap.is()) + { + mxShow->setProperty(beans::PropertyValue("NavigationSlidePrev", -1, + Any(xPrevSBitmap), + beans::PropertyState_DIRECT_VALUE)); + } + BitmapEx menuSlideBm(menuPath); + const Reference xMenuSBitmap( + vcl::unotools::xBitmapFromBitmapEx(menuSlideBm)); + if (xMenuSBitmap.is()) + { + mxShow->setProperty(beans::PropertyValue("NavigationSlideMenu", -1, + Any(xMenuSBitmap), + beans::PropertyState_DIRECT_VALUE)); + } + BitmapEx nextSlideBm(nextSlidePath); + const Reference xNextSBitmap( + vcl::unotools::xBitmapFromBitmapEx(nextSlideBm)); + if (xNextSBitmap.is()) + { + mxShow->setProperty(beans::PropertyValue("NavigationSlideNext", -1, + Any(xNextSBitmap), + beans::PropertyState_DIRECT_VALUE)); + } + } + } + + for( const auto& rProp : aProperties ) + mxShow->setProperty( rProp ); + + mxShow->addView( mxView ); + + mxListenerProxy.set( new SlideShowListenerProxy( this, mxShow ) ); + mxListenerProxy->addAsSlideShowListener(); + + NotifyDocumentEvent( + *mpDoc, + "OnStartPresentation"); + displaySlideIndex( mpSlideController->getStartSlideIndex() ); + + return true; + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startShowImpl()" ); + return false; + } +} + +/** called only by the slideshow view when the first paint event occurs. + This actually starts the slideshow. */ +void SlideshowImpl::onFirstPaint() +{ + if( mpShowWindow ) + { + /* + mpShowWindow->SetBackground( Wallpaper( COL_BLACK ) ); + mpShowWindow->Erase(); + mpShowWindow->SetBackground(); + */ + } + + SolarMutexGuard aSolarGuard; + maUpdateTimer.SetTimeout( sal_uLong(100) ); + maUpdateTimer.Start(); +} + +void SlideshowImpl::paint() +{ + if( mxView.is() ) try + { + awt::PaintEvent aEvt; + // aEvt.UpdateRect = TODO + mxView->paint( aEvt ); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::paint()" ); + } +} + +void SAL_CALL SlideshowImpl::addSlideShowListener( const Reference< XSlideShowListener >& xListener ) +{ + if( mxListenerProxy.is() ) + mxListenerProxy->addSlideShowListener( xListener ); +} + +void SAL_CALL SlideshowImpl::removeSlideShowListener( const Reference< XSlideShowListener >& xListener ) +{ + if( mxListenerProxy.is() ) + mxListenerProxy->removeSlideShowListener( xListener ); +} + +void SlideshowImpl::slideEnded(const bool bReverse) +{ + if (bReverse) + gotoPreviousSlide(true); + else + gotoNextSlide(); +} + +bool SlideshowImpl::swipe(const CommandGestureSwipeData &rSwipeData) +{ + if (mbUsePen || mnContextMenuEvent) + return false; + double nVelocityX = rSwipeData.getVelocityX(); + // tdf#108475 make it swipe only if some reasonable movement was involved + if (fabs(nVelocityX) < 50) + return false; + if (nVelocityX > 0) + { + gotoPreviousSlide(); + } + else + { + gotoNextEffect(); + } + //a swipe is followed by a mouse up, tell the view to ignore that mouse up as we've reacted + //to the swipe instead + mxView->ignoreNextMouseReleased(); + return true; +} + +bool SlideshowImpl::longpress(const CommandGestureLongPressData &rLongPressData) +{ + if (mnContextMenuEvent) + return false; + + maPopupMousePos = Point(rLongPressData.getX(), rLongPressData.getY()); + mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) ); + + return true; +} + +void SlideshowImpl::removeShapeEvents() +{ + if( !(mxShow.is() && mxListenerProxy.is()) ) + return; + + try + { + for( const auto& rEntry : maShapeEventMap ) + { + mxListenerProxy->removeShapeEventListener( rEntry.first ); + mxShow->setShapeCursor( rEntry.first, awt::SystemPointer::ARROW ); + } + + maShapeEventMap.clear(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::removeShapeEvents()" ); + } +} + +void SlideshowImpl::registerShapeEvents(sal_Int32 nSlideNumber) +{ + if( nSlideNumber < 0 ) + return; + + try + { + Reference< XDrawPagesSupplier > xDrawPages( mxModel, UNO_QUERY_THROW ); + Reference< XIndexAccess > xPages( xDrawPages->getDrawPages(), UNO_QUERY_THROW ); + + Reference< XShapes > xDrawPage; + xPages->getByIndex(nSlideNumber) >>= xDrawPage; + + if( xDrawPage.is() ) + { + Reference< XMasterPageTarget > xMasterPageTarget( xDrawPage, UNO_QUERY ); + if( xMasterPageTarget.is() ) + { + Reference< XShapes > xMasterPage = xMasterPageTarget->getMasterPage(); + if( xMasterPage.is() ) + registerShapeEvents( xMasterPage ); + } + registerShapeEvents( xDrawPage ); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::registerShapeEvents()" ); + } +} + +void SlideshowImpl::registerShapeEvents( Reference< XShapes > const & xShapes ) +{ + try + { + const sal_Int32 nShapeCount = xShapes->getCount(); + sal_Int32 nShape; + for( nShape = 0; nShape < nShapeCount; nShape++ ) + { + Reference< XShape > xShape; + xShapes->getByIndex( nShape ) >>= xShape; + + if( xShape.is() && xShape->getShapeType() == "com.sun.star.drawing.GroupShape" ) + { + Reference< XShapes > xSubShapes( xShape, UNO_QUERY ); + if( xSubShapes.is() ) + registerShapeEvents( xSubShapes ); + } + + Reference< XPropertySet > xSet( xShape, UNO_QUERY ); + if( !xSet.is() ) + continue; + + Reference< XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() ); + if( !xSetInfo.is() || !xSetInfo->hasPropertyByName( gsOnClick ) ) + continue; + + WrappedShapeEventImplPtr pEvent = std::make_shared(); + xSet->getPropertyValue( gsOnClick ) >>= pEvent->meClickAction; + + switch( pEvent->meClickAction ) + { + case ClickAction_PREVPAGE: + case ClickAction_NEXTPAGE: + case ClickAction_FIRSTPAGE: + case ClickAction_LASTPAGE: + case ClickAction_STOPPRESENTATION: + break; + case ClickAction_BOOKMARK: + if( xSetInfo->hasPropertyByName( gsBookmark ) ) + xSet->getPropertyValue( gsBookmark ) >>= pEvent->maStrBookmark; + if( getSlideNumberForBookmark( pEvent->maStrBookmark ) == -1 ) + continue; + break; + case ClickAction_DOCUMENT: + case ClickAction_SOUND: + case ClickAction_PROGRAM: + case ClickAction_MACRO: + if( xSetInfo->hasPropertyByName( gsBookmark ) ) + xSet->getPropertyValue( gsBookmark ) >>= pEvent->maStrBookmark; + break; + case ClickAction_VERB: + if( xSetInfo->hasPropertyByName( gsVerb ) ) + xSet->getPropertyValue( gsVerb ) >>= pEvent->mnVerb; + break; + default: + continue; // skip all others + } + + maShapeEventMap[ xShape ] = pEvent; + + if( mxListenerProxy.is() ) + mxListenerProxy->addShapeEventListener( xShape ); + mxShow->setShapeCursor( xShape, awt::SystemPointer::REFHAND ); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::registerShapeEvents()" ); + } +} + +void SlideshowImpl::displayCurrentSlide (const bool bSkipAllMainSequenceEffects) +{ + stopSound(); + removeShapeEvents(); + + if( mpSlideController && mxShow.is() ) + { + Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), + UNO_QUERY_THROW ); + mpSlideController->displayCurrentSlide( mxShow, xDrawPages, bSkipAllMainSequenceEffects ); + registerShapeEvents(mpSlideController->getCurrentSlideNumber()); + update(); + + } + // send out page change event and notify to update all acc info for current page + if (mpViewShell) + { + sal_Int32 currentPageIndex = getCurrentSlideIndex(); + mpViewShell->fireSwitchCurrentPage(currentPageIndex); + mpViewShell->NotifyAccUpdate(); + } +} + +void SlideshowImpl::endPresentation() +{ + if( maPresSettings.mbMouseAsPen) + { + Reference< XMultiServiceFactory > xDocFactory(mpDoc->getUnoModel(), UNO_QUERY ); + if( xDocFactory.is() ) + mxShow->registerUserPaintPolygons(xDocFactory); + } + + if( !mnEndShowEvent ) + mnEndShowEvent = Application::PostUserEvent( LINK(this, SlideshowImpl, endPresentationHdl) ); +} + +IMPL_LINK_NOARG(SlideshowImpl, endPresentationHdl, void*, void) +{ + mnEndShowEvent = nullptr; + + stopSound(); + + if( mxPresentation.is() ) + mxPresentation->end(); +} + +void SAL_CALL SlideshowImpl::pause() +{ + SolarMutexGuard aSolarGuard; + + if( mbIsPaused ) + return; + + try + { + mbIsPaused = true; + if( mxShow.is() ) + { + mxShow->pause(true); + + if( mxListenerProxy.is() ) + mxListenerProxy->paused(); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::pause()" ); + } +} + +void SAL_CALL SlideshowImpl::resume() +{ + SolarMutexGuard aSolarGuard; + + if( mbIsPaused ) try + { + if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK || mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END ) + { + mpShowWindow->RestartShow(); + } + else + { + mbIsPaused = false; + if( mxShow.is() ) + { + mxShow->pause(false); + update(); + + if( mxListenerProxy.is() ) + mxListenerProxy->resumed(); + } + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::resume()" ); + } +#ifdef ENABLE_SDREMOTE + RemoteServer::presentationStarted( this ); +#endif +} + +sal_Bool SAL_CALL SlideshowImpl::isPaused() +{ + SolarMutexGuard aSolarGuard; + return mbIsPaused; +} + +void SAL_CALL SlideshowImpl::blankScreen( sal_Int32 nColor ) +{ + SolarMutexGuard aSolarGuard; + + if( mpShowWindow && mpSlideController ) + { + if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), Color(ColorTransparency, nColor) ) ) + { + pause(); + } + } +} + +// XShapeEventListener + +void SlideshowImpl::click( const Reference< XShape >& xShape ) +{ + SolarMutexGuard aSolarGuard; + + WrappedShapeEventImplPtr pEvent = maShapeEventMap[xShape]; + if( !pEvent ) + return; + + switch( pEvent->meClickAction ) + { + case ClickAction_PREVPAGE: gotoPreviousSlide(); break; + case ClickAction_NEXTPAGE: gotoNextSlide(); break; + case ClickAction_FIRSTPAGE: gotoFirstSlide(); break; + case ClickAction_LASTPAGE: gotoLastSlide(); break; + case ClickAction_STOPPRESENTATION: endPresentation(); break; + case ClickAction_BOOKMARK: + { + gotoBookmark( pEvent->maStrBookmark ); + } + break; + case ClickAction_SOUND: + { +#if HAVE_FEATURE_AVMEDIA + try + { + mxPlayer.set(avmedia::MediaWindow::createPlayer(pEvent->maStrBookmark, ""/*TODO?*/), uno::UNO_SET_THROW ); + mxPlayer->start(); + } + catch( uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::click()" ); + } +#endif + } + break; + + case ClickAction_DOCUMENT: + { + OUString aBookmark( pEvent->maStrBookmark ); + + sal_Int32 nPos = aBookmark.indexOf( '#' ); + if( nPos >= 0 ) + { + OUString aURL( aBookmark.copy( 0, nPos+1 ) ); + OUString aName( aBookmark.copy( nPos+1 ) ); + aURL += getUiNameFromPageApiNameImpl( aName ); + aBookmark = aURL; + } + + mpDocSh->OpenBookmark( aBookmark ); + } + break; + + case ClickAction_PROGRAM: + { + INetURLObject aURL( + ::URIHelper::SmartRel2Abs( + INetURLObject(mpDocSh->GetMedium()->GetBaseURL()), + pEvent->maStrBookmark, ::URIHelper::GetMaybeFileHdl(), true, + false, INetURLObject::EncodeMechanism::WasEncoded, + INetURLObject::DecodeMechanism::Unambiguous ) ); + + if( INetProtocol::File == aURL.GetProtocol() ) + { + SfxStringItem aUrl( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ); + SfxBoolItem aBrowsing( SID_BROWSE, true ); + + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + { + SfxUnoFrameItem aDocFrame(SID_FILLFRAME, pViewFrm->GetFrame().GetFrameInterface()); + pViewFrm->GetDispatcher()->ExecuteList( SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aUrl, &aBrowsing }, { &aDocFrame } ); + } + } + } + break; + +#if HAVE_FEATURE_SCRIPTING + case presentation::ClickAction_MACRO: + { + const OUString aMacro( pEvent->maStrBookmark ); + + if ( SfxApplication::IsXScriptURL( aMacro ) ) + { + Any aRet; + Sequence< sal_Int16 > aOutArgsIndex; + Sequence< Any > aOutArgs; + Sequence< Any >* pInArgs = new Sequence< Any >(0); + mpDocSh->CallXScript( aMacro, *pInArgs, aRet, aOutArgsIndex, aOutArgs); + } + else + { + // aMacro has the following syntax: + // "Macroname.Modulname.Libname.Documentname" or + // "Macroname.Modulname.Libname.Applicationname" + sal_Int32 nIdx{ 0 }; + const std::u16string_view aMacroName = o3tl::getToken(aMacro, 0, '.', nIdx); + const std::u16string_view aModulName = o3tl::getToken(aMacro, 0, '.', nIdx); + + // todo: is the limitation still given that only + // Modulname+Macroname can be used here? + OUString aExecMacro = OUString::Concat(aModulName) + "." + aMacroName; + mpDocSh->GetBasic()->Call(aExecMacro); + } + } + break; +#endif + + case ClickAction_VERB: + { + // todo, better do it async? + SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape); + SdrOle2Obj* pOleObject = dynamic_cast< SdrOle2Obj* >(pObj); + if (pOleObject && mpViewShell ) + mpViewShell->ActivateObject(pOleObject, pEvent->mnVerb); + } + break; + default: + break; + } +} + +sal_Int32 SlideshowImpl::getSlideNumberForBookmark( const OUString& rStrBookmark ) +{ + bool bIsMasterPage; + OUString aBookmark = getUiNameFromPageApiNameImpl( rStrBookmark ); + sal_uInt16 nPgNum = mpDoc->GetPageByName( aBookmark, bIsMasterPage ); + + if( nPgNum == SDRPAGE_NOTFOUND ) + { + // Is the bookmark an object? + SdrObject* pObj = mpDoc->GetObj( aBookmark ); + + if( pObj ) + { + nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum(); + bIsMasterPage = pObj->getSdrPageFromSdrObject()->IsMasterPage(); + } + } + + if( (nPgNum == SDRPAGE_NOTFOUND) || bIsMasterPage || static_cast(mpDoc->GetPage(nPgNum))->GetPageKind() != PageKind::Standard ) + return -1; + + return ( nPgNum - 1) >> 1; +} + +void SlideshowImpl::contextMenuShow(const css::awt::Point& point) +{ + maPopupMousePos = { point.X, point.Y }; + mnContextMenuEvent = Application::PostUserEvent(LINK(this, SlideshowImpl, ContextMenuHdl)); +} + +void SlideshowImpl::hyperLinkClicked( OUString const& aHyperLink ) +{ + OUString aBookmark( aHyperLink ); + + sal_Int32 nPos = aBookmark.indexOf( '#' ); + if( nPos >= 0 ) + { + OUString aURL( aBookmark.copy( 0, nPos+1 ) ); + OUString aName( aBookmark.copy( nPos+1 ) ); + aURL += getUiNameFromPageApiNameImpl( aName ); + aBookmark = aURL; + } + + mpDocSh->OpenBookmark( aBookmark ); +} + +void SlideshowImpl::displaySlideNumber( sal_Int32 nSlideNumber ) +{ + if( mpSlideController ) + { + if( mpSlideController->jumpToSlideNumber( nSlideNumber ) ) + { + displayCurrentSlide(); + } + } +} + +/** nSlideIndex == -1 displays current slide again */ +void SlideshowImpl::displaySlideIndex( sal_Int32 nSlideIndex ) +{ + if( mpSlideController ) + { + if( (nSlideIndex == -1) || mpSlideController->jumpToSlideIndex( nSlideIndex ) ) + { + displayCurrentSlide(); + } + } +} + +void SlideshowImpl::jumpToBookmark( const OUString& sBookmark ) +{ + sal_Int32 nSlideNumber = getSlideNumberForBookmark( sBookmark ); + if( nSlideNumber != -1 ) + displaySlideNumber( nSlideNumber ); +} + +sal_Int32 SlideshowImpl::getCurrentSlideNumber() const +{ + return mpSlideController ? mpSlideController->getCurrentSlideNumber() : -1; +} + +sal_Bool SAL_CALL SlideshowImpl::isEndless() +{ + SolarMutexGuard aSolarGuard; + return maPresSettings.mbEndless; +} + +void SlideshowImpl::update() +{ + startUpdateTimer(); +} + +void SlideshowImpl::startUpdateTimer() +{ + SolarMutexGuard aSolarGuard; + maUpdateTimer.SetTimeout( 0 ); + maUpdateTimer.Start(); +} + +/** this timer is called 20ms after a new slide was displayed. + This is used to unfreeze user input that was disabled after + slide change to skip input that was buffered during slide + transition preparation */ +IMPL_LINK_NOARG(SlideshowImpl, ReadyForNextInputHdl, Timer *, void) +{ + mbInputFreeze = false; +} + +/** if I catch someone someday who calls this method by hand + and not by using the timer, I will personally punish this + person seriously, even if this person is me. +*/ +IMPL_LINK_NOARG(SlideshowImpl, updateHdl, Timer *, void) +{ + updateSlideShow(); +} + +void SlideshowImpl::updateSlideShow() +{ + // prevent me from deletion when recursing (App::EnableYieldMode does) + const rtl::Reference xKeepAlive(this); + + Reference< XSlideShow > xShow( mxShow ); + if ( ! xShow.is()) + return; + + try + { + double fUpdate = 0.0; + if( !xShow->update(fUpdate) ) + fUpdate = -1.0; + + if (mxShow.is() && (fUpdate >= 0.0)) + { + if (::basegfx::fTools::equalZero(fUpdate)) + { + // Make sure idle tasks don't starve when we don't have to wait. + // Don't process any events generated after invoking the function. + Application::Reschedule(/*bHandleAllCurrentEvents=*/true); + } + else + { + // Avoid busy loop when the previous call to update() + // returns a small positive number but not 0 (which is + // handled above). Also, make sure that calls to update() + // have a minimum frequency. + // => Allow up to 60 frames per second. Call at least once + // every 4 seconds. + const static sal_Int32 nMaximumFrameCount (60); + const static double nMinimumTimeout (1.0 / nMaximumFrameCount); + const static double nMaximumTimeout (4.0); + fUpdate = std::clamp(fUpdate, nMinimumTimeout, nMaximumTimeout); + + // Make sure that the maximum frame count has not been set + // too high (only then conversion to milliseconds and long + // integer may lead to zero value.) + OSL_ASSERT(static_cast(fUpdate * 1000.0) > 0); + } + + // Use our high resolution timers for the asynchronous callback. + maUpdateTimer.SetTimeout(static_cast(fUpdate * 1000.0)); + maUpdateTimer.Start(); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::updateSlideShow()" ); + } +} + +bool SlideshowImpl::keyInput(const KeyEvent& rKEvt) +{ + if( !mxShow.is() || mbInputFreeze ) + return false; + + bool bRet = true; + + try + { + const int nKeyCode = rKEvt.GetKeyCode().GetCode(); + switch( nKeyCode ) + { + case awt::Key::CONTEXTMENU: + if( !mnContextMenuEvent ) + { + if( mpShowWindow ) + maPopupMousePos = mpShowWindow->GetPointerState().maPos; + mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) ); + } + break; + + // cancel show + case KEY_ESCAPE: + case KEY_SUBTRACT: + // in case the user cancels the presentation, switch to current slide + // in edit mode + if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) ) + { + if( mpSlideController->getCurrentSlideNumber() != -1 ) + mnRestoreSlide = mpSlideController->getCurrentSlideNumber(); + } + endPresentation(); + break; + + // advance show + case KEY_PAGEDOWN: + if(rKEvt.GetKeyCode().IsMod2()) + { + gotoNextSlide(); + break; + } + [[fallthrough]]; + case KEY_SPACE: + case KEY_RIGHT: + case KEY_DOWN: + case KEY_XF86FORWARD: + gotoNextEffect(); + break; + + case KEY_RETURN: + { + if( !maCharBuffer.isEmpty() ) + { + if( mpSlideController ) + { + if( mpSlideController->jumpToSlideNumber( maCharBuffer.toInt32() - 1 ) ) + displayCurrentSlide(); + } + maCharBuffer.clear(); + } + else + { + gotoNextEffect(); + } + } + break; + + // numeric: add to buffer + case KEY_0: + case KEY_1: + case KEY_2: + case KEY_3: + case KEY_4: + case KEY_5: + case KEY_6: + case KEY_7: + case KEY_8: + case KEY_9: + maCharBuffer += OUStringChar( rKEvt.GetCharCode() ); + break; + + case KEY_PAGEUP: + if(rKEvt.GetKeyCode().IsMod2()) + { + gotoPreviousSlide(); + break; + } + [[fallthrough]]; + case KEY_LEFT: + case KEY_UP: + case KEY_BACKSPACE: + case KEY_XF86BACK: + gotoPreviousEffect(); + break; + + case KEY_P: + setUsePen( !mbUsePen ); + break; + + // tdf#149351 Ctrl+A disables pointer as pen mode + case KEY_A: + if(rKEvt.GetKeyCode().IsMod1()) + { + setUsePen( false ); + break; + } + break; + + case KEY_E: + setEraseAllInk( true ); + updateSlideShow(); + break; + + case KEY_HOME: + gotoFirstSlide(); + break; + + case KEY_END: + gotoLastSlide(); + break; + + case KEY_B: + case KEY_W: + case KEY_POINT: + case KEY_COMMA: + { + blankScreen( ((nKeyCode == KEY_W ) || (nKeyCode == KEY_COMMA)) ? 0x00ffffff : 0x00000000 ); + } + break; + + default: + bRet = false; + break; + } + } + catch( Exception& ) + { + bRet = false; + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::keyInput()" ); + } + + return bRet; +} + +IMPL_LINK( SlideshowImpl, EventListenerHdl, VclSimpleEvent&, rSimpleEvent, void ) +{ + if( !mxShow.is() || mbInputFreeze ) + return; + + if( !((rSimpleEvent.GetId() == VclEventId::WindowCommand) && static_cast(&rSimpleEvent)->GetData()) ) + return; + + const CommandEvent& rEvent = *static_cast(static_cast(&rSimpleEvent)->GetData()); + + if( rEvent.GetCommand() != CommandEventId::Media ) + return; + + CommandMediaData* pMediaData = rEvent.GetMediaData(); + pMediaData->SetPassThroughToOS(false); + switch (pMediaData->GetMediaId()) + { +#if defined( MACOSX ) + case MediaCommand::Menu: + if( !mnContextMenuEvent ) + { + if( mpShowWindow ) + maPopupMousePos = mpShowWindow->GetPointerState().maPos; + mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) ); + } + break; + case MediaCommand::VolumeDown: + gotoPreviousSlide(); + break; + case MediaCommand::VolumeUp: + gotoNextEffect(); + break; +#endif + case MediaCommand::NextTrack: + gotoNextEffect(); + break; + case MediaCommand::Pause: + if( !mbIsPaused ) + blankScreen(0); + break; + case MediaCommand::Play: + if( mbIsPaused ) + resume(); + break; + + case MediaCommand::PlayPause: + if( mbIsPaused ) + resume(); + else + blankScreen(0); + break; + case MediaCommand::PreviousTrack: + gotoPreviousSlide(); + break; + case MediaCommand::NextTrackHold: + gotoLastSlide(); + break; + + case MediaCommand::Rewind: + gotoFirstSlide(); + break; + case MediaCommand::Stop: + // in case the user cancels the presentation, switch to current slide + // in edit mode + if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) ) + { + if( mpSlideController->getCurrentSlideNumber() != -1 ) + mnRestoreSlide = mpSlideController->getCurrentSlideNumber(); + } + endPresentation(); + break; + default: + pMediaData->SetPassThroughToOS(true); + break; + } +} + +void SlideshowImpl::mouseButtonUp(const MouseEvent& rMEvt) +{ + if( rMEvt.IsRight() && !mnContextMenuEvent ) + { + maPopupMousePos = rMEvt.GetPosPixel(); + mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) ); + } +} + +IMPL_LINK_NOARG(SlideshowImpl, ContextMenuHdl, void*, void) +{ + mnContextMenuEvent = nullptr; + + if (mpSlideController == nullptr) + return; + + mbWasPaused = mbIsPaused; + if( !mbWasPaused ) + pause(); + + std::unique_ptr xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/slidecontextmenu.ui")); + std::unique_ptr xMenu(xBuilder->weld_menu("menu")); + OUString sNextImage(BMP_MENU_NEXT), sPrevImage(BMP_MENU_PREV); + xMenu->insert(0, "next", SdResId(RID_SVXSTR_MENU_NEXT), &sNextImage, nullptr, nullptr, TRISTATE_INDET); + xMenu->insert(1, "prev", SdResId(RID_SVXSTR_MENU_PREV), &sPrevImage, nullptr, nullptr, TRISTATE_INDET); + + // Adding button to display if in Pen mode + xMenu->set_active("pen", mbUsePen); + + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + xMenu->set_visible("next", mpSlideController->getNextSlideIndex() != -1); + xMenu->set_visible("prev", (mpSlideController->getPreviousSlideIndex() != -1 ) || (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK)); + xMenu->set_visible("edit", mpViewShell->GetDoc()->IsStartWithPresentation()); + + std::unique_ptr xPageMenu(xBuilder->weld_menu("gotomenu")); + OUString sFirstImage(BMP_MENU_FIRST), sLastImage(BMP_MENU_LAST); + xPageMenu->insert(0, "first", SdResId(RID_SVXSTR_MENU_FIRST), &sFirstImage, nullptr, nullptr, TRISTATE_INDET); + xPageMenu->insert(1, "last", SdResId(RID_SVXSTR_MENU_LAST), &sLastImage, nullptr, nullptr, TRISTATE_INDET); + + // populate slide goto list + const sal_Int32 nPageNumberCount = mpSlideController->getSlideNumberCount(); + if( nPageNumberCount <= 1 ) + { + xMenu->set_visible("goto", false); + } + else + { + sal_Int32 nCurrentSlideNumber = mpSlideController->getCurrentSlideNumber(); + if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) ) + nCurrentSlideNumber = -1; + + xPageMenu->set_visible("first", mpSlideController->getSlideNumber(0) != nCurrentSlideNumber); + xPageMenu->set_visible("last", mpSlideController->getSlideNumber(mpSlideController->getSlideIndexCount() - 1) != nCurrentSlideNumber); + + sal_Int32 nPageNumber; + + for( nPageNumber = 0; nPageNumber < nPageNumberCount; nPageNumber++ ) + { + if( mpSlideController->isVisibleSlideNumber( nPageNumber ) ) + { + SdPage* pPage = mpDoc->GetSdPage(static_cast(nPageNumber), PageKind::Standard); + if (pPage) + { + OUString sId(OUString::number(CM_SLIDES + nPageNumber)); + xPageMenu->append_check(sId, pPage->GetName()); + if (nPageNumber == nCurrentSlideNumber) + xPageMenu->set_active(sId, true); + } + } + } + } + + std::unique_ptr xBlankMenu(xBuilder->weld_menu("screenmenu")); + + if (mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK) + { + xBlankMenu->set_active((mpShowWindow->GetBlankColor() == COL_WHITE) ? "white" : "black", true); + } + + std::unique_ptr xWidthMenu(xBuilder->weld_menu("widthmenu")); + + // populate color width list + sal_Int32 nIterator; + double nWidth; + + nWidth = 4.0; + for( nIterator = 1; nIterator < 6; nIterator++) + { + switch(nIterator) + { + case 1: + nWidth = 4.0; + break; + case 2: + nWidth = 100.0; + break; + case 3: + nWidth = 150.0; + break; + case 4: + nWidth = 200.0; + break; + case 5: + nWidth = 400.0; + break; + default: + break; + } + + if (nWidth == mdUserPaintStrokeWidth) + xWidthMenu->set_active(OUString::number(nWidth), true); + } + + ::tools::Rectangle aRect(maPopupMousePos, Size(1,1)); + weld::Window* pParent = weld::GetPopupParent(*mpShowWindow, aRect); + ContextMenuSelectHdl(xMenu->popup_at_rect(pParent, aRect)); + + if( mxView.is() ) + mxView->ignoreNextMouseReleased(); + + if( !mbWasPaused ) + resume(); +} + +void SlideshowImpl::ContextMenuSelectHdl(std::u16string_view rMenuId) +{ + if (rMenuId == u"prev") + { + gotoPreviousSlide(); + mbWasPaused = false; + } + else if(rMenuId == u"next") + { + gotoNextSlide(); + mbWasPaused = false; + } + else if (rMenuId == u"first") + { + gotoFirstSlide(); + mbWasPaused = false; + } + else if (rMenuId == u"last") + { + gotoLastSlide(); + mbWasPaused = false; + } + else if (rMenuId == u"black" || rMenuId == u"white") + { + const Color aBlankColor(rMenuId == u"white" ? COL_WHITE : COL_BLACK); + if( mbWasPaused ) + { + if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK ) + { + if( mpShowWindow->GetBlankColor() == aBlankColor ) + { + mbWasPaused = false; + mpShowWindow->RestartShow(); + return; + } + } + mpShowWindow->RestartShow(); + } + if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), aBlankColor ) ) + { + pause(); + mbWasPaused = true; + } + } + else if (rMenuId == u"color") + { + //Open a color picker based on SvColorDialog + ::Color aColor( ColorTransparency, mnUserPaintColor ); + SvColorDialog aColorDlg; + aColorDlg.SetColor( aColor ); + + if (aColorDlg.Execute(mpShowWindow->GetFrameWeld())) + { + aColor = aColorDlg.GetColor(); + setPenColor(sal_Int32(aColor)); + } + mbWasPaused = false; + } + else if (rMenuId == u"4") + { + setPenWidth(4.0); + mbWasPaused = false; + } + else if (rMenuId == u"100") + { + setPenWidth(100.0); + mbWasPaused = false; + } + else if (rMenuId == u"150") + { + setPenWidth(150.0); + mbWasPaused = false; + } + else if (rMenuId == u"200") + { + setPenWidth(200.0); + mbWasPaused = false; + } + else if (rMenuId == u"400") + { + setPenWidth(400.0); + mbWasPaused = false; + } + else if (rMenuId == u"erase") + { + setEraseAllInk(true); + mbWasPaused = false; + } + else if (rMenuId == u"pen") + { + setUsePen(!mbUsePen); + mbWasPaused = false; + } + else if (rMenuId == u"edit") + { + // When in autoplay mode (pps/ppsx), offer editing of the presentation + // Turn autostart off, else Impress will close when exiting the Presentation + mpViewShell->GetDoc()->SetExitAfterPresenting(false); + if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) ) + { + if( mpSlideController->getCurrentSlideNumber() != -1 ) + { + mnRestoreSlide = mpSlideController->getCurrentSlideNumber(); + } + } + endPresentation(); + } + else if (rMenuId == u"end") + { + // in case the user cancels the presentation, switch to current slide + // in edit mode + if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) ) + { + if( mpSlideController->getCurrentSlideNumber() != -1 ) + { + mnRestoreSlide = mpSlideController->getCurrentSlideNumber(); + } + } + endPresentation(); + } + else if (!rMenuId.empty()) + { + sal_Int32 nPageNumber = o3tl::toInt32(rMenuId) - CM_SLIDES; + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) ) + { + mpShowWindow->RestartShow( nPageNumber ); + } + else if( nPageNumber != mpSlideController->getCurrentSlideNumber() ) + { + displaySlideNumber( nPageNumber ); + } + mbWasPaused = false; + } +} + +Reference< XSlideShow > SlideshowImpl::createSlideShow() +{ + Reference< XSlideShow > xShow; + + try + { + Reference< uno::XComponentContext > xContext = + ::comphelper::getProcessComponentContext(); + + xShow.set( presentation::SlideShow::create(xContext), UNO_SET_THROW ); + } + catch( uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::createSlideShow()" ); + } + + return xShow; +} + +void SlideshowImpl::createSlideList( bool bAll, std::u16string_view rPresSlide ) +{ + const sal_uInt16 nSlideCount = mpDoc->GetSdPageCount( PageKind::Standard ); + + if( !nSlideCount ) + return; + + SdCustomShow* pCustomShow; + + if( mpDoc->GetCustomShowList() && maPresSettings.mbCustomShow ) + pCustomShow = mpDoc->GetCustomShowList()->GetCurObject(); + else + pCustomShow = nullptr; + + // create animation slide controller + AnimationSlideController::Mode eMode = + ( pCustomShow && !pCustomShow->PagesVector().empty() ) ? AnimationSlideController::CUSTOM : + (bAll ? AnimationSlideController::ALL : AnimationSlideController::FROM); + + Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW ); + Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW ); + mpSlideController = std::make_shared( xSlides, eMode ); + + if( eMode != AnimationSlideController::CUSTOM ) + { + sal_Int32 nFirstVisibleSlide = 0; + + // normal presentation + if( !rPresSlide.empty() ) + { + sal_Int32 nSlide; + bool bTakeNextAvailable = false; + + for( nSlide = 0, nFirstVisibleSlide = -1; + ( nSlide < nSlideCount ) && ( -1 == nFirstVisibleSlide ); nSlide++ ) + { + SdPage* pTestSlide = mpDoc->GetSdPage( static_cast(nSlide), PageKind::Standard ); + + if( pTestSlide->GetName() == rPresSlide ) + { + if( pTestSlide->IsExcluded() ) + bTakeNextAvailable = true; + else + nFirstVisibleSlide = nSlide; + } + else if( bTakeNextAvailable && !pTestSlide->IsExcluded() ) + nFirstVisibleSlide = nSlide; + } + + if( -1 == nFirstVisibleSlide ) + nFirstVisibleSlide = 0; + } + + for( sal_Int32 i = 0; i < nSlideCount; i++ ) + { + bool bVisible = ! mpDoc->GetSdPage( static_cast(i), PageKind::Standard )->IsExcluded(); + if( bVisible || (eMode == AnimationSlideController::ALL) ) + mpSlideController->insertSlideNumber( i, bVisible ); + } + + mpSlideController->setStartSlideNumber( nFirstVisibleSlide ); + } + else + { + if( meAnimationMode != ANIMATIONMODE_SHOW && !rPresSlide.empty() ) + { + sal_Int32 nSlide; + for( nSlide = 0; nSlide < nSlideCount; nSlide++ ) + if( rPresSlide == mpDoc->GetSdPage( static_cast(nSlide), PageKind::Standard )->GetName() ) + break; + + if( nSlide < nSlideCount ) + mpSlideController->insertSlideNumber( static_cast(nSlide) ); + } + + for( const auto& rpPage : pCustomShow->PagesVector() ) + { + const sal_uInt16 nSdSlide = ( rpPage->GetPageNum() - 1 ) / 2; + + if( ! mpDoc->GetSdPage( nSdSlide, PageKind::Standard )->IsExcluded()) + mpSlideController->insertSlideNumber( nSdSlide ); + } + } +} + +typedef sal_uInt16 (*FncGetChildWindowId)(); + +const FncGetChildWindowId aShowChildren[] = +{ + &AnimationChildWindow::GetChildWindowId, + &Svx3DChildWindow::GetChildWindowId, + &SvxFontWorkChildWindow::GetChildWindowId, + &SvxColorChildWindow::GetChildWindowId, + &SvxSearchDialogWrapper::GetChildWindowId, + &SvxBmpMaskChildWindow::GetChildWindowId, + &SvxIMapDlgChildWindow::GetChildWindowId, + &SvxHlinkDlgWrapper::GetChildWindowId, + &SfxInfoBarContainerChild::GetChildWindowId +}; + +void SlideshowImpl::hideChildWindows() +{ + mnChildMask = 0; + + if( ANIMATIONMODE_SHOW != meAnimationMode ) + return; + + SfxViewFrame* pViewFrame = getViewFrame(); + + if( !pViewFrame ) + return; + + for( sal_uLong i = 0; i < SAL_N_ELEMENTS( aShowChildren ); i++ ) + { + const sal_uInt16 nId = ( *aShowChildren[ i ] )(); + + if( pViewFrame->GetChildWindow( nId ) ) + { + pViewFrame->SetChildWindow( nId, false ); + mnChildMask |= ::tools::ULong(1) << i; + } + } +} + +void SlideshowImpl::showChildWindows() +{ + if( ANIMATIONMODE_SHOW == meAnimationMode ) + { + SfxViewFrame* pViewFrame = getViewFrame(); + if( pViewFrame ) + { + for( sal_uLong i = 0; i < SAL_N_ELEMENTS(aShowChildren); i++ ) + { + if( mnChildMask & ( ::tools::ULong(1) << i ) ) + pViewFrame->SetChildWindow( ( *aShowChildren[ i ] )(), true ); + } + } + } +} + +SfxViewFrame* SlideshowImpl::getViewFrame() const +{ + return mpViewShell ? mpViewShell->GetViewFrame() : nullptr; +} + +SfxDispatcher* SlideshowImpl::getDispatcher() const +{ + return (mpViewShell && mpViewShell->GetViewFrame()) ? mpViewShell->GetViewFrame()->GetDispatcher() : nullptr; +} + +SfxBindings* SlideshowImpl::getBindings() const +{ + return (mpViewShell && mpViewShell->GetViewFrame()) ? &mpViewShell->GetViewFrame()->GetBindings() : nullptr; +} + +void SlideshowImpl::resize( const Size& rSize ) +{ + maPresSize = rSize; + + if(mpShowWindow) + { + mpShowWindow->SetSizePixel( maPresSize ); + mpShowWindow->Show(); + } + + if( mxView.is() ) try + { + awt::WindowEvent aEvt; + mxView->windowResized(aEvt); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::resize()" ); + } +} + +void SlideshowImpl::setActiveXToolbarsVisible( bool bVisible ) +{ + // in case of ActiveX control the toolbars should not be visible if slide show runs in window mode + // actually it runs always in window mode in case of ActiveX control + if ( !(!maPresSettings.mbFullScreen && mpDocSh && mpDocSh->GetMedium()) ) + return; + + const SfxBoolItem* pItem = mpDocSh->GetMedium()->GetItemSet().GetItem(SID_VIEWONLY, false); + if ( !(pItem && pItem->GetValue()) ) + return; + + // this is a plugin/activex mode, no toolbars should be visible during slide show + // after the end of slide show they should be visible again + SfxViewFrame* pViewFrame = getViewFrame(); + if( !pViewFrame ) + return; + + try + { + Reference< frame::XLayoutManager > xLayoutManager; + Reference< beans::XPropertySet > xFrameProps( pViewFrame->GetFrame().GetFrameInterface(), UNO_QUERY_THROW ); + if ( ( xFrameProps->getPropertyValue( "LayoutManager" ) + >>= xLayoutManager ) + && xLayoutManager.is() ) + { + xLayoutManager->setVisible( bVisible ); + } + } + catch( uno::Exception& ) + {} +} + +void SAL_CALL SlideshowImpl::activate() +{ + SolarMutexGuard aSolarGuard; + + maDeactivateTimer.Stop(); + + if( mbActive || !mxShow.is() ) + return; + + mbActive = true; + + if( ANIMATIONMODE_SHOW == meAnimationMode ) + { + if( mbAutoSaveWasOn ) + setAutoSaveState( false ); + + if( mpShowWindow ) + { + SfxViewFrame* pViewFrame = getViewFrame(); + SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : nullptr; + + hideChildWindows(); + + if( pDispatcher ) + { + // filter all forbidden slots + pDispatcher->SetSlotFilter( SfxSlotFilterState::ENABLED, pAllowed ); + } + + if( getBindings() ) + getBindings()->InvalidateAll(true); + + mpShowWindow->GrabFocus(); + } + } + + resume(); +} + +void SAL_CALL SlideshowImpl::deactivate() +{ + SolarMutexGuard aSolarGuard; + + if( mbActive && mxShow.is() ) + { + maDeactivateTimer.Start(); + } +} + +IMPL_LINK_NOARG(SlideshowImpl, deactivateHdl, Timer *, void) +{ + if( !(mbActive && mxShow.is()) ) + return; + + mbActive = false; + + pause(); + + if( ANIMATIONMODE_SHOW == meAnimationMode ) + { + if( mbAutoSaveWasOn ) + setAutoSaveState( true ); + + if( mpShowWindow ) + { + showChildWindows(); + } + } +} + +sal_Bool SAL_CALL SlideshowImpl::isActive() +{ + SolarMutexGuard aSolarGuard; + return mbActive; +} + +void SlideshowImpl::setAutoSaveState( bool bOn) +{ + try + { + uno::Reference xContext( ::comphelper::getProcessComponentContext() ); + + uno::Reference< util::XURLTransformer > xParser(util::URLTransformer::create(xContext)); + util::URL aURL; + aURL.Complete = "vnd.sun.star.autorecovery:/setAutoSaveState"; + xParser->parseStrict(aURL); + + Sequence< beans::PropertyValue > aArgs{ comphelper::makePropertyValue("AutoSaveState", bOn) }; + + uno::Reference< frame::XDispatch > xAutoSave = frame::theAutoRecovery::get(xContext); + xAutoSave->dispatch(aURL, aArgs); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::setAutoSaveState()"); + } +} + +Reference< XDrawPage > SAL_CALL SlideshowImpl::getCurrentSlide() +{ + SolarMutexGuard aSolarGuard; + + Reference< XDrawPage > xSlide; + if( mxShow.is() && mpSlideController ) + { + sal_Int32 nSlide = getCurrentSlideNumber(); + if( (nSlide >= 0) && (nSlide < mpSlideController->getSlideNumberCount() ) ) + xSlide = mpSlideController->getSlideByNumber( nSlide ); + } + + return xSlide; +} + +sal_Int32 SAL_CALL SlideshowImpl::getNextSlideIndex() +{ + SolarMutexGuard aSolarGuard; + + if( mxShow.is() ) + { + return mpSlideController->getNextSlideIndex(); + } + else + { + return -1; + } +} + +sal_Int32 SAL_CALL SlideshowImpl::getCurrentSlideIndex() +{ + return mpSlideController ? mpSlideController->getCurrentSlideIndex() : -1; +} + +// css::presentation::XSlideShowController: + +::sal_Int32 SAL_CALL SlideshowImpl::getSlideCount() +{ + return mpSlideController ? mpSlideController->getSlideIndexCount() : 0; +} + +Reference< XDrawPage > SAL_CALL SlideshowImpl::getSlideByIndex(::sal_Int32 Index) +{ + if ((mpSlideController == nullptr) || (Index < 0) + || (Index >= mpSlideController->getSlideIndexCount())) + throw IndexOutOfBoundsException(); + + return mpSlideController->getSlideByNumber( mpSlideController->getSlideNumber( Index ) ); +} + +sal_Bool SAL_CALL SlideshowImpl::getAlwaysOnTop() +{ + SolarMutexGuard aSolarGuard; + return maPresSettings.mbAlwaysOnTop; +} + +void SAL_CALL SlideshowImpl::setAlwaysOnTop( sal_Bool bAlways ) +{ + SolarMutexGuard aSolarGuard; + if( maPresSettings.mbAlwaysOnTop != bool(bAlways) ) + { + maPresSettings.mbAlwaysOnTop = bAlways; + // todo, can this be changed while running? + } +} + +sal_Bool SAL_CALL SlideshowImpl::isFullScreen() +{ + SolarMutexGuard aSolarGuard; + return maPresSettings.mbFullScreen; +} + +sal_Bool SAL_CALL SlideshowImpl::getMouseVisible() +{ + SolarMutexGuard aSolarGuard; + return maPresSettings.mbMouseVisible; +} + +void SAL_CALL SlideshowImpl::setMouseVisible( sal_Bool bVisible ) +{ + SolarMutexGuard aSolarGuard; + if( maPresSettings.mbMouseVisible != bool(bVisible) ) + { + maPresSettings.mbMouseVisible = bVisible; + if( mpShowWindow ) + mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible ); + } +} + +sal_Bool SAL_CALL SlideshowImpl::getUsePen() +{ + SolarMutexGuard aSolarGuard; + return mbUsePen; +} + +void SAL_CALL SlideshowImpl::setUsePen( sal_Bool bMouseAsPen ) +{ + SolarMutexGuard aSolarGuard; + mbUsePen = bMouseAsPen; + if( !mxShow.is() ) + return; + + try + { + // For Pencolor; + Any aValue; + if( mbUsePen ) + aValue <<= mnUserPaintColor; + beans::PropertyValue aPenProp; + aPenProp.Name = "UserPaintColor"; + aPenProp.Value = aValue; + mxShow->setProperty( aPenProp ); + + //for StrokeWidth : + if( mbUsePen ) + { + beans::PropertyValue aPenPropWidth; + aPenPropWidth.Name = "UserPaintStrokeWidth"; + aPenPropWidth.Value <<= mdUserPaintStrokeWidth; + mxShow->setProperty( aPenPropWidth ); + + // for Pen Mode + beans::PropertyValue aPenPropSwitchPenMode; + aPenPropSwitchPenMode.Name = "SwitchPenMode"; + aPenPropSwitchPenMode.Value <<= true; + mxShow->setProperty( aPenPropSwitchPenMode ); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::setUsePen()" ); + } +} + +double SAL_CALL SlideshowImpl::getPenWidth() +{ + SolarMutexGuard aSolarGuard; + return mdUserPaintStrokeWidth; +} + +void SAL_CALL SlideshowImpl::setPenWidth( double dStrokeWidth ) +{ + SolarMutexGuard aSolarGuard; + mdUserPaintStrokeWidth = dStrokeWidth; + setUsePen( true ); // enable pen mode, update color and width +} + +sal_Int32 SAL_CALL SlideshowImpl::getPenColor() +{ + SolarMutexGuard aSolarGuard; + return mnUserPaintColor; +} + +void SAL_CALL SlideshowImpl::setPenColor( sal_Int32 nColor ) +{ + SolarMutexGuard aSolarGuard; + mnUserPaintColor = nColor; + setUsePen( true ); // enable pen mode, update color +} + +void SAL_CALL SlideshowImpl::setEraseAllInk(sal_Bool bEraseAllInk) +{ + if( !bEraseAllInk ) + return; + + SolarMutexGuard aSolarGuard; + if( !mxShow.is() ) + return; + + try + { + beans::PropertyValue aPenPropEraseAllInk; + aPenPropEraseAllInk.Name = "EraseAllInk"; + aPenPropEraseAllInk.Value <<= bEraseAllInk; + mxShow->setProperty( aPenPropEraseAllInk ); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd.slideshow", "sd::SlideshowImpl::setEraseAllInk()" ); + } +} + +// XSlideShowController Methods +sal_Bool SAL_CALL SlideshowImpl::isRunning( ) +{ + SolarMutexGuard aSolarGuard; + return mxShow.is(); +} + +void SAL_CALL SlideshowImpl::gotoNextEffect( ) +{ + SolarMutexGuard aSolarGuard; + + if( !(mxShow.is() && mpSlideController && mpShowWindow) ) + return; + + if( mbIsPaused && mpShowWindow->GetShowWindowMode() != SHOWWINDOWMODE_END ) + resume(); + + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + if( eMode == SHOWWINDOWMODE_END ) + { + endPresentation(); + } + else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) ) + { + mpShowWindow->RestartShow(); + } + else + { + mxShow->nextEffect(); + update(); + } +} + +void SAL_CALL SlideshowImpl::gotoPreviousEffect( ) +{ + SolarMutexGuard aSolarGuard; + + if( !(mxShow.is() && mpSlideController && mpShowWindow) ) + return; + + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) || mbIsPaused ) + { + resume(); + } + else + { + mxShow->previousEffect(); + update(); + } +} + +void SAL_CALL SlideshowImpl::gotoFirstSlide( ) +{ + SolarMutexGuard aSolarGuard; + + if( !(mpShowWindow && mpSlideController) ) + return; + + if( mbIsPaused ) + resume(); + + if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END ) + { + if( mpSlideController->getSlideIndexCount() ) + mpShowWindow->RestartShow( 0); + } + else + { + displaySlideIndex( 0 ); + } +} + +void SAL_CALL SlideshowImpl::gotoNextSlide( ) +{ + SolarMutexGuard aSolarGuard; + + if( mbIsPaused ) + resume(); + + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) ) + { + mpShowWindow->RestartShow(); + } + else + { + // if this is a show, ignore user inputs and + // start 20ms timer to reenable inputs to filter + // buffered inputs during slide transition + if( meAnimationMode == ANIMATIONMODE_SHOW ) + { + mbInputFreeze = true; + maInputFreezeTimer.Start(); + } + + if( mpSlideController ) + { + if( mpSlideController->nextSlide() ) + { + displayCurrentSlide(); + } + else + { + stopSound(); + + if( meAnimationMode == ANIMATIONMODE_PREVIEW ) + { + endPresentation(); + } + else if( maPresSettings.mbEndless ) + { + if( maPresSettings.mnPauseTimeout ) + { + if( mpShowWindow ) + { + if ( maPresSettings.mbShowPauseLogo ) + { + Graphic aGraphic(SfxApplication::GetApplicationLogo(360)); + mpShowWindow->SetPauseMode( maPresSettings.mnPauseTimeout, &aGraphic ); + } + else + mpShowWindow->SetPauseMode( maPresSettings.mnPauseTimeout ); + } + } + else + { + displaySlideIndex( 0 ); + } + } + else + { + if( mpShowWindow ) + { + mpShowWindow->SetEndMode(); + if( !mpViewShell->GetDoc()->IsStartWithPresentation() ) + pause(); + } + } + } + } + } +} + +void SAL_CALL SlideshowImpl::gotoPreviousSlide( ) +{ + gotoPreviousSlide(false); +} + +void SlideshowImpl::gotoPreviousSlide (const bool bSkipAllMainSequenceEffects) +{ + SolarMutexGuard aSolarGuard; + + if( !(mxShow.is() && mpSlideController) ) + return; + + try + { + if( mbIsPaused ) + resume(); + + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + if( eMode == SHOWWINDOWMODE_END ) + { + mpShowWindow->RestartShow( mpSlideController->getCurrentSlideIndex() ); + } + else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) ) + { + mpShowWindow->RestartShow(); + } + else + { + if( mpSlideController->previousSlide()) + displayCurrentSlide(bSkipAllMainSequenceEffects); + else if (bSkipAllMainSequenceEffects) + { + // We could not go to the previous slide (probably because + // the current slide is already the first one). We still + // have to call displayCurrentSlide because the calling + // slideshow can not determine whether there is a previous + // slide or not and has already prepared for a slide change. + // This slide change has to be completed now, even when + // changing to the same slide. + // Note that in this special case we do NOT pass + // bSkipAllMainSequenceEffects because we display the same + // slide as before and do not want to show all its effects. + displayCurrentSlide(); + } + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::gotoPreviousSlide()" ); + } +} + +void SAL_CALL SlideshowImpl::gotoLastSlide() +{ + SolarMutexGuard aSolarGuard; + + if( !mpSlideController ) + return; + + if( mbIsPaused ) + resume(); + + const sal_Int32 nLastSlideIndex = mpSlideController->getSlideIndexCount() - 1; + if( nLastSlideIndex >= 0 ) + { + if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END ) + { + mpShowWindow->RestartShow( nLastSlideIndex ); + } + else + { + displaySlideIndex( nLastSlideIndex ); + } + } +} + +void SAL_CALL SlideshowImpl::gotoBookmark( const OUString& rBookmark ) +{ + SolarMutexGuard aSolarGuard; + + if( mbIsPaused ) + resume(); + + sal_Int32 nSlideNumber = getSlideNumberForBookmark( rBookmark ); + if( nSlideNumber != -1 ) + displaySlideNumber( nSlideNumber ); +} + +void SAL_CALL SlideshowImpl::gotoSlide( const Reference< XDrawPage >& xSlide ) +{ + SolarMutexGuard aSolarGuard; + + if( !(mpSlideController && xSlide.is()) ) + return; + + if( mbIsPaused ) + resume(); + + const sal_Int32 nSlideCount = mpSlideController->getSlideNumberCount(); + for( sal_Int32 nSlide = 0; nSlide < nSlideCount; nSlide++ ) + { + if( mpSlideController->getSlideByNumber( nSlide ) == xSlide ) + { + displaySlideNumber( nSlide ); + } + } +} + +void SAL_CALL SlideshowImpl::gotoSlideIndex( sal_Int32 nIndex ) +{ + SolarMutexGuard aSolarGuard; + + if( mbIsPaused ) + resume(); + + displaySlideIndex( nIndex ); +} + +void SAL_CALL SlideshowImpl::stopSound( ) +{ + SolarMutexGuard aSolarGuard; + + try + { + if( mxPlayer.is() ) + { + mxPlayer->stop(); + mxPlayer.clear(); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::stopSound()" ); + } +} + +// XIndexAccess + +::sal_Int32 SAL_CALL SlideshowImpl::getCount( ) +{ + return getSlideCount(); +} + +css::uno::Any SAL_CALL SlideshowImpl::getByIndex( ::sal_Int32 Index ) +{ + return Any( getSlideByIndex( Index ) ); +} + +css::uno::Type SAL_CALL SlideshowImpl::getElementType( ) +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SlideshowImpl::hasElements( ) +{ + return getSlideCount() != 0; +} + +namespace +{ + class AsyncUpdateSlideshow_Impl + { + public: + struct AsyncUpdateSlideshowData + { + SlideshowImpl* pSlideshowImpl; + uno::Reference< css::drawing::XDrawPage > XCurrentSlide; + SdrHintKind eHintKind; + }; + + static ImplSVEvent* AsyncUpdateSlideshow( + SlideshowImpl* pSlideshowImpl, + uno::Reference< css::drawing::XDrawPage >& rXCurrentSlide, + SdrHintKind eHintKind) + { + AsyncUpdateSlideshowData* pNew(new AsyncUpdateSlideshowData); + pNew->pSlideshowImpl = pSlideshowImpl; + pNew->XCurrentSlide = rXCurrentSlide; + pNew->eHintKind = eHintKind; + return Application::PostUserEvent(LINK(nullptr, AsyncUpdateSlideshow_Impl, Update), pNew); + // coverity[leaked_storage] - pDisruptor takes care of its own destruction at idle time + } + + DECL_STATIC_LINK(AsyncUpdateSlideshow_Impl, Update, void*, void); + }; + + IMPL_STATIC_LINK(AsyncUpdateSlideshow_Impl, Update, void*, pData, void) + { + AsyncUpdateSlideshowData* pSlideData(static_cast(pData)); + pSlideData->pSlideshowImpl->AsyncNotifyEvent(pSlideData->XCurrentSlide, pSlideData->eHintKind); + delete pSlideData; + } +} + +void SlideshowImpl::AsyncNotifyEvent( + const uno::Reference< css::drawing::XDrawPage >& rXCurrentSlide, + const SdrHintKind eHintKind) +{ + if (SdrHintKind::ObjectChange == eHintKind) + { + mnEventObjectChange = nullptr; + + // refresh single slide + gotoSlide(rXCurrentSlide); + } + else if (SdrHintKind::PageOrderChange == eHintKind) + { + mnEventPageOrderChange = nullptr; + + // order of pages (object pages or master pages) changed (Insert/Remove/ChangePos) + // rXCurrentSlide is the current slide before the change. + Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW ); + Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW ); + const sal_Int32 nNewSlideCount(xSlides.is() ? xSlides->getCount() : 0); + + if (nNewSlideCount != mpSlideController->getSlideNumberCount()) + { + // need to reinitialize AnimationSlideController + OUString aPresSlide( maPresSettings.maPresPage ); + createSlideList( maPresSettings.mbAll, aPresSlide ); + } + + // Check if current slide before change is still valid (maybe removed) + const sal_Int32 nSlideCount(mpSlideController->getSlideNumberCount()); + bool bSlideStillValid(false); + + for (sal_Int32 nSlide(0); !bSlideStillValid && nSlide < nSlideCount; nSlide++) + { + if (rXCurrentSlide == mpSlideController->getSlideByNumber(nSlide)) + { + bSlideStillValid = true; + } + } + + if(bSlideStillValid) + { + // stay on that slide + gotoSlide(rXCurrentSlide); + } + else + { + // not possible to stay on that slide, go to 1st slide (kinda restart) + gotoFirstSlide(); + } + } +} + +void SlideshowImpl::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint) +{ + if (SfxHintId::ThisIsAnSdrHint != rHint.GetId()) + // nothing to do for non-SdrHints + return; + + if (nullptr == mpDoc) + // better do nothing when no DrawModel (should not happen) + return; + + // tdf#158664 I am surprised, but the 'this' instance keeps incarnated + // when the slideshow was running once, so need to check for + // SlideShow instance/running to be safe. + // NOTE: isRunning() checks mxShow.is(), that is what we want + if (!isRunning()) + // no SlideShow instance or not running, nothing to do + return; + + const SdrHintKind eHintKind(static_cast(rHint).GetKind()); + + if (SdrHintKind::ObjectChange == eHintKind) + { + if (nullptr != mnEventObjectChange) + // avoid multiple events + return; + + // Object changed, object & involved page included in rHint. + uno::Reference< css::drawing::XDrawPage > XCurrentSlide(getCurrentSlide()); + if (!XCurrentSlide.is()) + return; + + SdrPage* pCurrentSlide(GetSdrPageFromXDrawPage(XCurrentSlide)); + if (nullptr == pCurrentSlide) + return; + + const SdrPage* pHintPage(static_cast(rHint).GetPage()); + if (nullptr == pHintPage) + return; + + bool bCurrentSlideIsInvolved(false); + + if (pHintPage->IsMasterPage()) + { + if (pCurrentSlide->TRG_HasMasterPage()) + { + // current slide uses MasterPage on which the change happened + bCurrentSlideIsInvolved = (pHintPage == &pCurrentSlide->TRG_GetMasterPage()); + } + } + else + { + // object on current slide was changed + bCurrentSlideIsInvolved = (pHintPage == pCurrentSlide); + } + + if (!bCurrentSlideIsInvolved) + // nothing to do when current slide is not involved + return; + + // Refresh current slide. Need to do that asynchronous, else e.g. + // text edit changes EditEngine/Outliner are not progressed far + // enough (ObjectChanged broadcast which we are in here seems + // to early for some cases) + mnEventObjectChange = AsyncUpdateSlideshow_Impl::AsyncUpdateSlideshow(this, XCurrentSlide, eHintKind); + } + else if (SdrHintKind::PageOrderChange == eHintKind) + { + // Unfortunately we get multiple events, e.g. when drag/drop position change in + // slide sorter on left side of EditView. This includes some with page number +1, + // then again -1 (it's a position change). Problem is that in-between already + // a re-schedule seems to happen, so indeed AsyncNotifyEvent will change to +1/-1 + // already. Since we get even more, at least try to take the last one. I found no + // good solution yet for this. + if (nullptr != mnEventPageOrderChange) + Application::RemoveUserEvent( mnEventPageOrderChange ); + + // order of pages (object pages or master pages) changed (Insert/Remove/ChangePos) + uno::Reference< css::drawing::XDrawPage > XCurrentSlide(getCurrentSlide()); + mnEventPageOrderChange = AsyncUpdateSlideshow_Impl::AsyncUpdateSlideshow(this, XCurrentSlide, eHintKind); + } + else if (SdrHintKind::ModelCleared == eHintKind) + { + // immediately end presentation + endPresentation(); + } + + // maybe need to add reactions here to other Hint-Types +} + +Reference< XSlideShow > SAL_CALL SlideshowImpl::getSlideShow() +{ + return mxShow; +} + +PresentationSettingsEx::PresentationSettingsEx( const PresentationSettingsEx& r ) +: PresentationSettings( r ) +, mbRehearseTimings(r.mbRehearseTimings) +, mbPreview(r.mbPreview) +, mpParentWindow( nullptr ) +{ +} + +PresentationSettingsEx::PresentationSettingsEx( PresentationSettings const & r ) +: PresentationSettings( r ) +, mbRehearseTimings(false) +, mbPreview(false) +, mpParentWindow(nullptr) +{ +} + +void PresentationSettingsEx::SetArguments( const Sequence< PropertyValue >& rArguments ) +{ + for( const PropertyValue& rValue : rArguments ) + { + SetPropertyValue( rValue.Name, rValue.Value ); + } +} + +void PresentationSettingsEx::SetPropertyValue( std::u16string_view rProperty, const Any& rValue ) +{ + if ( rProperty == u"RehearseTimings" ) + { + if( rValue >>= mbRehearseTimings ) + return; + } + else if ( rProperty == u"Preview" ) + { + if( rValue >>= mbPreview ) + return; + } + else if ( rProperty == u"AnimationNode" ) + { + if( rValue >>= mxAnimationNode ) + return; + } + else if ( rProperty == u"ParentWindow" ) + { + Reference< XWindow > xWindow; + if( rValue >>= xWindow ) + { + mpParentWindow = xWindow.is() ? VCLUnoHelper::GetWindow( xWindow ) + : nullptr; + return; + } + } + else if ( rProperty == u"AllowAnimations" ) + { + if( rValue >>= mbAnimationAllowed ) + return; + } + else if ( rProperty == u"FirstPage" ) + { + OUString aPresPage; + if( rValue >>= aPresPage ) + { + maPresPage = getUiNameFromPageApiNameImpl(aPresPage); + mbCustomShow = false; + mbAll = false; + return; + } + else + { + if( rValue >>= mxStartPage ) + return; + } + } + else if ( rProperty == u"IsAlwaysOnTop" ) + { + if( rValue >>= mbAlwaysOnTop ) + return; + } + else if ( rProperty == u"IsAutomatic" ) + { + if( rValue >>= mbManual ) + return; + } + else if ( rProperty == u"IsEndless" ) + { + if( rValue >>= mbEndless ) + return; + } + else if ( rProperty == u"IsFullScreen" ) + { + if( rValue >>= mbFullScreen ) + return; + } + else if ( rProperty == u"IsMouseVisible" ) + { + if( rValue >>= mbMouseVisible ) + return; + } + else if ( rProperty == u"Pause" ) + { + sal_Int32 nPause = -1; + if( (rValue >>= nPause) && (nPause >= 0) ) + { + mnPauseTimeout = nPause; + return; + } + } + else if ( rProperty == u"UsePen" ) + { + if( rValue >>= mbMouseAsPen ) + return; + } + throw IllegalArgumentException(); +} + +// XAnimationListener + +SlideShowListenerProxy::SlideShowListenerProxy( rtl::Reference< SlideshowImpl > xController, css::uno::Reference< css::presentation::XSlideShow > xSlideShow ) +: mxController(std::move( xController )) +, mxSlideShow(std::move( xSlideShow )) +{ +} + +SlideShowListenerProxy::~SlideShowListenerProxy() +{ +} + +void SlideShowListenerProxy::addAsSlideShowListener() +{ + if( mxSlideShow.is() ) + { + Reference< XSlideShowListener > xSlideShowListener( this ); + mxSlideShow->addSlideShowListener( xSlideShowListener ); + } +} + +void SlideShowListenerProxy::removeAsSlideShowListener() +{ + if( mxSlideShow.is() ) + { + Reference< XSlideShowListener > xSlideShowListener( this ); + mxSlideShow->removeSlideShowListener( xSlideShowListener ); + } +} + +void SlideShowListenerProxy::addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape ) +{ + if( mxSlideShow.is() ) + { + Reference< XShapeEventListener > xListener( this ); + mxSlideShow->addShapeEventListener( xListener, xShape ); + } +} + +void SlideShowListenerProxy::removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape ) +{ + if( mxSlideShow.is() ) + { + Reference< XShapeEventListener > xListener( this ); + mxSlideShow->removeShapeEventListener( xListener, xShape ); + } +} + +void SlideShowListenerProxy::addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener ) +{ + std::unique_lock g(m_aMutex); + maListeners.addInterface(g, xListener); +} + +void SlideShowListenerProxy::removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener ) +{ + std::unique_lock g(m_aMutex); + maListeners.removeInterface(g, xListener); +} + +void SAL_CALL SlideShowListenerProxy::beginEvent( const Reference< XAnimationNode >& xNode ) +{ + std::unique_lock aGuard( m_aMutex ); + + if( maListeners.getLength(aGuard) >= 0 ) + { + maListeners.forEach(aGuard, + [&] (Reference const& xListener) { + return xListener->beginEvent(xNode); + } ); + } +} + +void SAL_CALL SlideShowListenerProxy::endEvent( const Reference< XAnimationNode >& xNode ) +{ + std::unique_lock aGuard( m_aMutex ); + + if( maListeners.getLength(aGuard) >= 0 ) + { + maListeners.forEach(aGuard, + [&] (Reference const& xListener) { + return xListener->endEvent(xNode); + } ); + } +} + +void SAL_CALL SlideShowListenerProxy::repeat( const Reference< XAnimationNode >& xNode, ::sal_Int32 nRepeat ) +{ + std::unique_lock aGuard( m_aMutex ); + + if( maListeners.getLength(aGuard) >= 0 ) + { + maListeners.forEach(aGuard, + [&] (Reference const& xListener) { + return xListener->repeat(xNode, nRepeat); + } ); + } +} + +// css::presentation::XSlideShowListener: + +void SAL_CALL SlideShowListenerProxy::paused( ) +{ + std::unique_lock aGuard( m_aMutex ); + + maListeners.forEach(aGuard, + [](uno::Reference const& xListener) + { + xListener->paused(); + }); +} + +void SAL_CALL SlideShowListenerProxy::resumed( ) +{ + std::unique_lock aGuard( m_aMutex ); + + maListeners.forEach(aGuard, + [](uno::Reference const& xListener) + { + xListener->resumed(); + }); +} + +void SAL_CALL SlideShowListenerProxy::slideTransitionStarted( ) +{ + std::unique_lock aGuard( m_aMutex ); + + maListeners.forEach(aGuard, + [](uno::Reference const& xListener) + { + xListener->slideTransitionStarted(); + }); +} + +void SAL_CALL SlideShowListenerProxy::slideTransitionEnded( ) +{ + std::unique_lock aGuard( m_aMutex ); + + maListeners.forEach(aGuard, + [](uno::Reference const& xListener) + { + xListener->slideTransitionEnded (); + }); +} + +void SAL_CALL SlideShowListenerProxy::slideAnimationsEnded( ) +{ + std::unique_lock aGuard( m_aMutex ); + + maListeners.forEach(aGuard, + [](uno::Reference const& xListener) + { + xListener->slideAnimationsEnded (); + }); +} + +void SlideShowListenerProxy::slideEnded(sal_Bool bReverse) +{ + { + std::unique_lock aGuard( m_aMutex ); + + if( maListeners.getLength(aGuard) >= 0 ) + { + maListeners.forEach(aGuard, + [&] (Reference const& xListener) { + return xListener->slideEnded(bReverse); + } ); + } + } + + { + SolarMutexGuard aSolarGuard; + if( mxController.is() ) + mxController->slideEnded(bReverse); + } +} + +void SlideShowListenerProxy::hyperLinkClicked( OUString const& aHyperLink ) +{ + { + std::unique_lock aGuard( m_aMutex ); + + if( maListeners.getLength(aGuard) >= 0 ) + { + maListeners.forEach(aGuard, + [&] (Reference const& xListener) { + return xListener->hyperLinkClicked(aHyperLink); + } ); + } + } + + { + SolarMutexGuard aSolarGuard; + if( mxController.is() ) + mxController->hyperLinkClicked(aHyperLink); + } +} + +// XEventListener + +void SAL_CALL SlideShowListenerProxy::disposing( const css::lang::EventObject& aDisposeEvent ) +{ + std::unique_lock g(m_aMutex); + maListeners.disposeAndClear( g, aDisposeEvent ); + mxController.clear(); + mxSlideShow.clear(); +} + +// XShapeEventListener + +void SAL_CALL SlideShowListenerProxy::click( const Reference< XShape >& xShape, const css::awt::MouseEvent& /*aOriginalEvent*/ ) +{ + SolarMutexGuard aSolarGuard; + if( mxController.is() ) + mxController->click(xShape ); +} + +void SAL_CALL SlideShowListenerProxy::contextMenuShow(const css::awt::Point& point) +{ + SolarMutexGuard aSolarGuard; + if (mxController.is()) + mxController->contextMenuShow(point); +} + +} // namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/slideshowimpl.hxx b/sd/source/ui/slideshow/slideshowimpl.hxx new file mode 100644 index 0000000000..155cdc329f --- /dev/null +++ b/sd/source/ui/slideshow/slideshowimpl.hxx @@ -0,0 +1,355 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "showwindow.hxx" + +#include + +namespace com::sun::star::frame { class XModel; } +namespace com::sun::star::media { class XPlayer; } +namespace sd { class DrawDocShell; } +namespace sd { class ViewShell; } + +class SfxBindings; +class SfxDispatcher; +class SfxViewFrame; +class StarBASIC; + +namespace sd +{ +class SlideShowView; +class AnimationSlideController; +class PaneHider; + +struct PresentationSettingsEx : public PresentationSettings +{ + bool mbRehearseTimings; + bool mbPreview; + VclPtr mpParentWindow; + css::uno::Reference< css::drawing::XDrawPage > mxStartPage; + css::uno::Reference< css::animations::XAnimationNode > mxAnimationNode; + + PresentationSettingsEx( const PresentationSettingsEx& ); + explicit PresentationSettingsEx( PresentationSettings const & ); + + /// @throws css::lang::IllegalArgumentException + void SetArguments( const css::uno::Sequence< css::beans::PropertyValue >& rArguments ); + + /// @throws css::lang::IllegalArgumentException + void SetPropertyValue( std::u16string_view rProperty, const css::uno::Any& rValue ); +}; + +struct WrappedShapeEventImpl +{ + css::presentation::ClickAction meClickAction; + sal_Int32 mnVerb; + OUString maStrBookmark; + WrappedShapeEventImpl() : meClickAction( css::presentation::ClickAction_NONE ), mnVerb( 0 ) {}; +}; + +typedef std::shared_ptr< WrappedShapeEventImpl > WrappedShapeEventImplPtr; + +class SlideShowListenerProxy : + public ::cppu::WeakImplHelper< css::presentation::XSlideShowNavigationListener, css::presentation::XShapeEventListener > +{ +public: + SlideShowListenerProxy( rtl::Reference< SlideshowImpl > xController, css::uno::Reference< css::presentation::XSlideShow > xSlideShow ); + virtual ~SlideShowListenerProxy() override; + + void addAsSlideShowListener(); + void removeAsSlideShowListener(); + + void addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ); + void removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ); + + void addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape ); + void removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape ); + + // css::animations::XAnimationListener + virtual void SAL_CALL beginEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override; + virtual void SAL_CALL endEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override; + virtual void SAL_CALL repeat( const css::uno::Reference< css::animations::XAnimationNode >& Node, ::sal_Int32 Repeat ) override; + + // css::presentation::XSlideShowListener: + virtual void SAL_CALL paused() override; + virtual void SAL_CALL resumed() override; + virtual void SAL_CALL slideTransitionStarted() override; + virtual void SAL_CALL slideTransitionEnded() override; + virtual void SAL_CALL slideAnimationsEnded() override; + virtual void SAL_CALL slideEnded(sal_Bool bReverse) override; + virtual void SAL_CALL hyperLinkClicked(const OUString & hyperLink) override; + + // css::presentation::XSlideShowNavigationListener: + virtual void SAL_CALL contextMenuShow(const css::awt::Point& point) override; + + // css::lang::XEventListener: + virtual void SAL_CALL disposing(const css::lang::EventObject & Source) override; + + // css::presentation::XShapeEventListener: + virtual void SAL_CALL click(const css::uno::Reference< css::drawing::XShape > & xShape, const css::awt::MouseEvent & aOriginalEvent) override; + +private: + std::mutex m_aMutex; + ::comphelper::OInterfaceContainerHelper4 maListeners; + rtl::Reference< SlideshowImpl > mxController; + css::uno::Reference< css::presentation::XSlideShow > mxSlideShow; +}; + +typedef comphelper::WeakComponentImplHelper< css::presentation::XSlideShowController, css::container::XIndexAccess > SlideshowImplBase; + +class SlideshowImpl final : public SlideshowImplBase, public SfxListener +{ +friend class SlideShow; +friend class SlideShowView; + +public: + explicit SlideshowImpl( const css::uno::Reference< css::presentation::XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, vcl::Window* pParentWindow); + + // css::presentation::XSlideShowController: + virtual sal_Bool SAL_CALL getAlwaysOnTop() override; + virtual void SAL_CALL setAlwaysOnTop( sal_Bool _alwaysontop ) override; + virtual sal_Bool SAL_CALL getMouseVisible() override; + virtual void SAL_CALL setMouseVisible( sal_Bool _mousevisible ) override; + virtual sal_Bool SAL_CALL getUsePen() override; + virtual void SAL_CALL setUsePen( sal_Bool _usepen ) override; + virtual ::sal_Int32 SAL_CALL getPenColor() override; + virtual void SAL_CALL setPenColor( ::sal_Int32 _pencolor ) override; + virtual double SAL_CALL getPenWidth() override; + virtual void SAL_CALL setPenWidth( double dStrokeWidth ) override; + /// @throws css::uno::RuntimeException + virtual void SAL_CALL setEraseAllInk( sal_Bool bEraseAllInk ) override; + virtual sal_Bool SAL_CALL isRunning( ) override; + virtual ::sal_Int32 SAL_CALL getSlideCount( ) override; + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getSlideByIndex( ::sal_Int32 Index ) override; + virtual void SAL_CALL addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) override; + virtual void SAL_CALL removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) override; + virtual void SAL_CALL gotoNextEffect( ) override; + virtual void SAL_CALL gotoPreviousEffect( ) override; + virtual void SAL_CALL gotoFirstSlide( ) override; + virtual void SAL_CALL gotoNextSlide( ) override; + virtual void SAL_CALL gotoPreviousSlide( ) override; + virtual void SAL_CALL gotoLastSlide( ) override; + virtual void SAL_CALL gotoBookmark( const OUString& Bookmark ) override; + virtual void SAL_CALL gotoSlide( const css::uno::Reference< css::drawing::XDrawPage >& Page ) override; + virtual void SAL_CALL gotoSlideIndex( ::sal_Int32 Index ) override; + virtual void SAL_CALL stopSound( ) override; + virtual void SAL_CALL pause( ) override; + virtual void SAL_CALL resume( ) override; + virtual sal_Bool SAL_CALL isPaused( ) override; + virtual void SAL_CALL blankScreen( ::sal_Int32 Color ) override; + virtual void SAL_CALL activate( ) override; + virtual void SAL_CALL deactivate( ) override; + virtual sal_Bool SAL_CALL isActive( ) override; + virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getCurrentSlide( ) override; + virtual ::sal_Int32 SAL_CALL getCurrentSlideIndex( ) override; + virtual ::sal_Int32 SAL_CALL getNextSlideIndex( ) override; + virtual sal_Bool SAL_CALL isEndless( ) override; + virtual sal_Bool SAL_CALL isFullScreen( ) override; + virtual css::uno::Reference< css::presentation::XSlideShow > SAL_CALL getSlideShow( ) override; + + // XIndexAccess + virtual ::sal_Int32 SAL_CALL getCount( ) override; + virtual css::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) override; + virtual css::uno::Type SAL_CALL getElementType( ) override; + virtual sal_Bool SAL_CALL hasElements( ) override; + + // SfxListener + virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; + + // will be called from the SlideShowListenerProxy when this event is fired from the XSlideShow + void slideEnded(const bool bReverse); + void contextMenuShow(const css::awt::Point& point); + /// @throws css::uno::RuntimeException + void hyperLinkClicked(const OUString & hyperLink); + void click(const css::uno::Reference< css::drawing::XShape > & xShape); + bool swipe(const CommandGestureSwipeData &rSwipeData); + bool longpress(const CommandGestureLongPressData& rLongPressData); + + /// ends the presentation async + void endPresentation(); + + // possibly triggered from events @SlideshowImpl::Notify if needed, but make it asynchronous to + // allow the noted event to completely finish in the core + void AsyncNotifyEvent(const css::uno::Reference< css::drawing::XDrawPage >&, const SdrHintKind); + + ViewShell* getViewShell() const { return mpViewShell; } + + void paint(); + bool keyInput(const KeyEvent& rKEvt); + void mouseButtonUp(const MouseEvent& rMEvt); + +private: + SlideshowImpl(SlideshowImpl const &) = delete; + void operator =(SlideshowImpl const &) = delete; + + virtual ~SlideshowImpl() override; + + // override WeakComponentImplHelperBase::disposing() + // This function is called upon disposing the component, + // if your component needs special work when it becomes + // disposed, do it here. + virtual void disposing(std::unique_lock&) override; + + // internal + bool startShow( PresentationSettingsEx const * pPresSettings ); + bool startPreview( + const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage, + const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode, + vcl::Window* pParent ); + + /** forces an async call to update in the main thread */ + void startUpdateTimer(); + + void update(); + + void createSlideList( bool bAll, std::u16string_view rPresSlide ); + + void displayCurrentSlide (const bool bSkipAllMainSequenceEffects = false); + + void displaySlideNumber( sal_Int32 nSlide ); + void displaySlideIndex( sal_Int32 nIndex ); + sal_Int32 getCurrentSlideNumber() const; + bool isInputFreezed() const { return mbInputFreeze; } + + void jumpToBookmark( const OUString& sBookmark ); + + void hideChildWindows(); + void showChildWindows(); + + void resize( const Size& rSize ); + + void setActiveXToolbarsVisible( bool bVisible ); + + DECL_LINK( updateHdl, Timer *, void ); + DECL_LINK( ReadyForNextInputHdl, Timer *, void ); + DECL_LINK( endPresentationHdl, void*, void ); + void ContextMenuSelectHdl(std::u16string_view rIdent); + DECL_LINK( ContextMenuHdl, void*, void ); + DECL_LINK( deactivateHdl, Timer *, void ); + DECL_LINK( EventListenerHdl, VclSimpleEvent&, void ); + + /** called only by the slideshow view when the first paint event occurs. + This actually starts the slideshow. */ + void onFirstPaint(); + + ::tools::Long getRestoreSlide() const { return mnRestoreSlide; } + +private: + bool startShowImpl( + const css::uno::Sequence< css::beans::PropertyValue >& aProperties ); + + SfxViewFrame* getViewFrame() const; + SfxDispatcher* getDispatcher() const; + SfxBindings* getBindings() const; + + sal_Int32 getSlideNumberForBookmark( const OUString& rStrBookmark ); + + void removeShapeEvents(); + void registerShapeEvents( sal_Int32 nSlideNumber ); + /// @throws css::uno::Exception + void registerShapeEvents( css::uno::Reference< css::drawing::XShapes > const & xShapes ); + + static css::uno::Reference< css::presentation::XSlideShow > createSlideShow(); + + static void setAutoSaveState( bool bOn ); + void gotoPreviousSlide (const bool bSkipAllMainSequenceEffects); + + /** Called by our maUpdateTimer's updateHdl handler this method is + responsible to call the slideshow update() method and, depending on + its return value, wait for a certain amount of time before another + call to update() is scheduled. + */ + void updateSlideShow(); + + css::uno::Reference< css::presentation::XSlideShow > mxShow; + rtl::Reference mxView; + css::uno::Reference< css::frame::XModel > mxModel; + + Timer maUpdateTimer; + Timer maInputFreezeTimer; + Timer maDeactivateTimer; + + ::sd::View* mpView; + ViewShell* mpViewShell; + DrawDocShell* mpDocSh; + SdDrawDocument* mpDoc; + + VclPtr mpParentWindow; + VclPtr mpShowWindow; + + std::shared_ptr< AnimationSlideController > mpSlideController; + + ::tools::Long mnRestoreSlide; + Point maPopupMousePos; + Size maPresSize; + AnimationMode meAnimationMode; + OUString maCharBuffer; + VclPtr< ::sd::Window> mpOldActiveWindow; + Link maStarBASICGlobalErrorHdl; + ::tools::ULong mnChildMask; + bool mbDisposed; + bool mbAutoSaveWasOn; + bool mbRehearseTimings; + bool mbIsPaused; + bool mbWasPaused; // used to cache pause state during context menu + bool mbInputFreeze; + bool mbActive; + + PresentationSettings maPresSettings; + sal_Int32 mnUserPaintColor; + + bool mbUsePen; + double mdUserPaintStrokeWidth; + + std::map< css::uno::Reference< css::drawing::XShape >, WrappedShapeEventImplPtr > + maShapeEventMap; + + css::uno::Reference< css::drawing::XDrawPage > mxPreviewDrawPage; + css::uno::Reference< css::animations::XAnimationNode > mxPreviewAnimationNode; + + css::uno::Reference< css::media::XPlayer > mxPlayer; + + ::std::unique_ptr mpPaneHider; + + ImplSVEvent * mnEndShowEvent; + ImplSVEvent * mnContextMenuEvent; + ImplSVEvent * mnEventObjectChange; + ImplSVEvent * mnEventPageOrderChange; + + css::uno::Reference< css::presentation::XPresentation2 > mxPresentation; + ::rtl::Reference< SlideShowListenerProxy > mxListenerProxy; +}; + +} // namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/slideshowviewimpl.cxx b/sd/source/ui/slideshow/slideshowviewimpl.cxx new file mode 100644 index 0000000000..d6addc3f87 --- /dev/null +++ b/sd/source/ui/slideshow/slideshowviewimpl.cxx @@ -0,0 +1,626 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "slideshowviewimpl.hxx" +#include "slideshowimpl.hxx" +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::WeakReference; +using ::com::sun::star::uno::Exception; + +using namespace ::com::sun::star; + +namespace sd +{ + +void SlideShowViewMouseListeners::notify( std::unique_lock& rGuard, const WrappedMouseEvent& rEvent ) +{ + forEach(rGuard, + [&rEvent] (const Reference& rListener) + { + switch( rEvent.meType ) + { + case WrappedMouseEvent::PRESSED: + rListener->mousePressed( rEvent.maEvent ); + break; + + case WrappedMouseEvent::RELEASED: + rListener->mouseReleased( rEvent.maEvent ); + break; + + case WrappedMouseEvent::ENTERED: + rListener->mouseEntered( rEvent.maEvent ); + break; + + case WrappedMouseEvent::EXITED: + rListener->mouseExited( rEvent.maEvent ); + break; + } + }); +} + + +void SlideShowViewMouseMotionListeners::notify( std::unique_lock& rGuard,const WrappedMouseMotionEvent& rEvent ) +{ + forEach(rGuard, + [&rEvent] (const Reference< awt::XMouseMotionListener >& rListener) + { + switch( rEvent.meType ) + { + case WrappedMouseMotionEvent::DRAGGED: + rListener->mouseDragged( rEvent.maEvent ); + break; + + case WrappedMouseMotionEvent::MOVED: + rListener->mouseMoved( rEvent.maEvent ); + break; + } + }); +} + +// SlideShowView +SlideShowView::SlideShowView( ShowWindow& rOutputWindow, + SdDrawDocument* pDoc, + AnimationMode eAnimationMode, + SlideshowImpl* pSlideShow, + bool bFullScreen ) +: mpCanvas( ::cppcanvas::VCLFactory::createSpriteCanvas( rOutputWindow ) ), + mxWindow( VCLUnoHelper::GetInterface( &rOutputWindow ), uno::UNO_SET_THROW ), + mxWindowPeer( mxWindow, uno::UNO_QUERY_THROW ), + mpSlideShow( pSlideShow ), + mrOutputWindow( rOutputWindow ), + mpDoc( pDoc ), + mbIsMouseMotionListener( false ), + meAnimationMode( eAnimationMode ), + mbFirstPaint( true ), + mbMousePressedEaten( false ) +{ + mxWindow->addWindowListener( this ); + mxWindow->addMouseListener( this ); + + mxPointer = awt::Pointer::create( ::comphelper::getProcessComponentContext() ); + + getTransformation(); + + // #i48939# only switch on kind of hacky scroll optimization, when + // running fullscreen. this minimizes the probability that other + // windows partially cover the show. + if( bFullScreen ) + { + try + { + Reference< beans::XPropertySet > xCanvasProps( getCanvas(), + uno::UNO_QUERY_THROW ); + xCanvasProps->setPropertyValue("UnsafeScrolling", + uno::Any( true ) ); + } + catch( uno::Exception& ) + { + } + } + + mTranslationOffset.Width = 0; + mTranslationOffset.Height = 0; +} + +// Dispose all internal references +void SlideShowView::disposing(std::unique_lock& rGuard) +{ + mpSlideShow = nullptr; + + // deregister listeners + if( mxWindow.is() ) + { + mxWindow->removeWindowListener( this ); + mxWindow->removeMouseListener( this ); + + if( mbIsMouseMotionListener ) + mxWindow->removeMouseMotionListener( this ); + } + + mpCanvas.reset(); + mxWindow.clear(); + + // clear all listener containers + disposingImpl(rGuard); +} + +// Disposing our broadcaster +void SAL_CALL SlideShowView::disposing( const lang::EventObject& ) +{ + std::unique_lock aGuard( m_aMutex ); + + disposingImpl(aGuard); +} + +// Disposing our broadcaster +void SlideShowView::disposingImpl(std::unique_lock& rGuard) +{ + // notify all listeners that _we_ are going down (send a disposing()), + // then delete listener containers: + lang::EventObject const evt( static_cast(this) ); + if (!maViewListeners.empty()) + { + auto tmp = std::move(maViewListeners); + rGuard.unlock(); + for( const auto& rxListener : tmp ) + { + Reference< util::XModifyListener > xListener( rxListener ); + if( xListener.is() ) + xListener->disposing( evt ); + } + rGuard.lock(); + } + if (maPaintListeners.getLength(rGuard)) + { + maPaintListeners.disposeAndClear( rGuard, evt ); + rGuard.lock(); + } + if (maMouseListeners.getLength(rGuard)) + { + maMouseListeners.disposeAndClear( rGuard, evt ); + rGuard.lock(); + } + if (maMouseMotionListeners.getLength(rGuard)) + { + maMouseMotionListeners.disposeAndClear( rGuard, evt ); + rGuard.lock(); + } +} + +void SlideShowView::paint( const awt::PaintEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + + if( mbFirstPaint ) + { + mbFirstPaint = false; + SlideshowImpl* pSlideShow = mpSlideShow; + aGuard.unlock(); + if( pSlideShow ) + pSlideShow->onFirstPaint(); + } + else + { + // Change event source, to enable listeners to match event + // with view + awt::PaintEvent aEvent( e ); + aEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + maPaintListeners.notifyEach( aGuard, &css::awt::XPaintListener::windowPaint, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! + } +} + +// XSlideShowView methods +Reference< rendering::XSpriteCanvas > SAL_CALL SlideShowView::getCanvas( ) +{ + std::unique_lock aGuard( m_aMutex ); + + return mpCanvas ? mpCanvas->getUNOSpriteCanvas() : Reference< rendering::XSpriteCanvas >(); +} + +void SAL_CALL SlideShowView::clear() +{ + // paint background in black + std::unique_lock aGuard( m_aMutex ); + SolarMutexGuard aSolarGuard; + + // fill the bounds rectangle in black + + const Size aWindowSize( mrOutputWindow.GetSizePixel() ); + + ::basegfx::B2DPolygon aPoly( ::basegfx::utils::createPolygonFromRect( + ::basegfx::B2DRectangle(0.0,0.0, + aWindowSize.Width(), + aWindowSize.Height() ) ) ); + ::cppcanvas::PolyPolygonSharedPtr pPolyPoly( + ::cppcanvas::BaseGfxFactory::createPolyPolygon( mpCanvas, aPoly ) ); + + if( pPolyPoly ) + { + pPolyPoly->setRGBAFillColor( 0x000000FFU ); + pPolyPoly->draw(); + } +} + +geometry::IntegerSize2D SAL_CALL SlideShowView::getTranslationOffset( ) +{ + return mTranslationOffset; +} + +geometry::AffineMatrix2D SAL_CALL SlideShowView::getTransformation( ) +{ + std::unique_lock aGuard( m_aMutex ); + SolarMutexGuard aSolarGuard; + + const Size& rTmpSize( mrOutputWindow.GetSizePixel() ); + + if (rTmpSize.IsEmpty()) + { + return geometry::AffineMatrix2D (1,0,0,0,1,0); + } + + const Size aWindowSize( mrOutputWindow.GetSizePixel() ); + Size aOutputSize( aWindowSize ); + + if( meAnimationMode != ANIMATIONMODE_SHOW ) + { + aOutputSize.setWidth( static_cast<::tools::Long>( aOutputSize.Width() / 1.03 ) ); + aOutputSize.setHeight( static_cast<::tools::Long>( aOutputSize.Height() / 1.03 ) ); + } + + SdPage* pP = mpDoc->GetSdPage( 0, PageKind::Standard ); + Size aPageSize( pP->GetSize() ); + + const double page_ratio = static_cast(aPageSize.Width()) / static_cast(aPageSize.Height()); + const double output_ratio = static_cast(aOutputSize.Width()) / static_cast(aOutputSize.Height()); + + if( page_ratio > output_ratio ) + { + aOutputSize.setHeight( ( aOutputSize.Width() * aPageSize.Height() ) / aPageSize.Width() ); + } + else if( page_ratio < output_ratio ) + { + aOutputSize.setWidth( ( aOutputSize.Height() * aPageSize.Width() ) / aPageSize.Height() ); + } + + Point aOutputOffset( ( aWindowSize.Width() - aOutputSize.Width() ) >> 1, + ( aWindowSize.Height() - aOutputSize.Height() ) >> 1 ); + + // Reduce available width by one, as the slides might actually + // render one pixel wider and higher as aPageSize below specifies + // (when shapes of page size have visible border lines) + aOutputSize.AdjustWidth( -1 ); + aOutputSize.AdjustHeight( -1 ); + + // Record mTranslationOffset + mTranslationOffset.Height = aOutputOffset.Y(); + mTranslationOffset.Width = aOutputOffset.X(); + + // scale presentation into available window rect (minus 10%); center in the window + const basegfx::B2DHomMatrix aMatrix(basegfx::utils::createScaleTranslateB2DHomMatrix( + aOutputSize.Width(), aOutputSize.Height(), aOutputOffset.X(), aOutputOffset.Y())); + + geometry::AffineMatrix2D aRes; + + return ::basegfx::unotools::affineMatrixFromHomMatrix( aRes, aMatrix ); +} + +void SAL_CALL SlideShowView::addTransformationChangedListener( const Reference< util::XModifyListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (m_bDisposed) + return; + WeakReference< util::XModifyListener > xWeak( xListener ); + if( std::find( maViewListeners.begin(), maViewListeners.end(), xWeak ) == maViewListeners.end() ) + maViewListeners.push_back( xWeak ); +} + +void SAL_CALL SlideShowView::removeTransformationChangedListener( const Reference< util::XModifyListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (m_bDisposed) + return; + WeakReference< util::XModifyListener > xWeak( xListener ); + auto aIter( std::find( maViewListeners.begin(), maViewListeners.end(), xWeak ) ); + if( aIter != maViewListeners.end() ) + maViewListeners.erase( aIter ); +} + +void SAL_CALL SlideShowView::addPaintListener( const Reference< awt::XPaintListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (!m_bDisposed) + maPaintListeners.addInterface( aGuard, xListener ); +} + +void SAL_CALL SlideShowView::removePaintListener( const Reference< awt::XPaintListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (!m_bDisposed) + maPaintListeners.removeInterface( aGuard, xListener ); +} + +void SAL_CALL SlideShowView::addMouseListener( const Reference< awt::XMouseListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (!m_bDisposed) + maMouseListeners.addInterface( aGuard, xListener ); +} + +void SAL_CALL SlideShowView::removeMouseListener( const Reference< awt::XMouseListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (!m_bDisposed) + maMouseListeners.removeInterface( aGuard, xListener ); +} + +void SAL_CALL SlideShowView::addMouseMotionListener( const Reference< awt::XMouseMotionListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (m_bDisposed) + return; + + if( !mbIsMouseMotionListener && mxWindow.is() ) + { + // delay motion event registration, until we really + // need it + mbIsMouseMotionListener = true; + mxWindow->addMouseMotionListener( this ); + } + + maMouseMotionListeners.addInterface( aGuard, xListener ); +} + +void SAL_CALL SlideShowView::removeMouseMotionListener( const Reference< awt::XMouseMotionListener >& xListener ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (!m_bDisposed) + maMouseMotionListeners.removeInterface( aGuard, xListener ); + + // TODO(P1): Might be nice to deregister for mouse motion + // events, when the last listener is gone. +} + +void SAL_CALL SlideShowView::setMouseCursor( sal_Int16 nPointerShape ) +{ + std::unique_lock aGuard( m_aMutex ); + + // forward to window + if( mxPointer.is() ) + mxPointer->setType( nPointerShape ); + + if( mxWindowPeer.is() ) + mxWindowPeer->setPointer( mxPointer ); +} + +awt::Rectangle SAL_CALL SlideShowView::getCanvasArea( ) +{ + awt::Rectangle aRectangle; + + if( mxWindow.is() ) + return mxWindow->getPosSize(); + + aRectangle.X = aRectangle.Y = aRectangle.Width = aRectangle.Height = 0; + + return aRectangle; +} + +void SlideShowView::updateimpl( std::unique_lock& rGuard, SlideshowImpl* pSlideShow ) +{ + if( !pSlideShow ) + return; + + ::rtl::Reference< SlideshowImpl > xKeepAlive( pSlideShow ); + + if( mbFirstPaint ) + { + mbFirstPaint = false; + SlideshowImpl* pTmpSlideShow = mpSlideShow; + rGuard.unlock(); + if( pTmpSlideShow ) + pTmpSlideShow->onFirstPaint(); + } else + rGuard.unlock(); + + pSlideShow->startUpdateTimer(); +} + +// XWindowListener methods +void SAL_CALL SlideShowView::windowResized( const awt::WindowEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + + if (m_bDisposed) + return; + + if (!maViewListeners.empty()) + { + // Change event source, to enable listeners to match event + // with view + awt::WindowEvent aEvent( e ); + aEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + auto aIter( maViewListeners.begin() ); + while( aIter != maViewListeners.end() ) + { + Reference< util::XModifyListener > xListener( *aIter ); + if( xListener.is() ) + { + aGuard.unlock(); + xListener->modified( aEvent ); + aGuard.lock(); + ++aIter; + } + else + { + aIter = maViewListeners.erase( aIter ); + } + } + } + + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! +} + +void SAL_CALL SlideShowView::windowMoved( const awt::WindowEvent& ) +{ + // ignored +} + +void SAL_CALL SlideShowView::windowShown( const lang::EventObject& ) +{ + // ignored +} + +void SAL_CALL SlideShowView::windowHidden( const lang::EventObject& ) +{ + // ignored +} + +// XMouseListener implementation +void SAL_CALL SlideShowView::mousePressed( const awt::MouseEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + if (m_bDisposed) + return; + + if( mpSlideShow && mpSlideShow->isInputFreezed() ) + { + mbMousePressedEaten = true; + } + else + { + mbMousePressedEaten = false; + + // Change event source, to enable listeners to match event + // with view + WrappedMouseEvent aEvent; + aEvent.meType = WrappedMouseEvent::PRESSED; + aEvent.maEvent = e; + aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + + maMouseListeners.notify( aGuard, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! + } +} + +void SAL_CALL SlideShowView::mouseReleased( const awt::MouseEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + if (m_bDisposed) + return; + + if( mbMousePressedEaten ) + { + // if mouse button down was ignored, also ignore mouse button up + mbMousePressedEaten = false; + } + else if( mpSlideShow && !mpSlideShow->isInputFreezed() ) + { + // Change event source, to enable listeners to match event + // with view + WrappedMouseEvent aEvent; + aEvent.meType = WrappedMouseEvent::RELEASED; + aEvent.maEvent = e; + aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + + maMouseListeners.notify( aGuard, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! + } +} + +void SAL_CALL SlideShowView::mouseEntered( const awt::MouseEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + if (m_bDisposed) + return; + + // Change event source, to enable listeners to match event + // with view + WrappedMouseEvent aEvent; + aEvent.meType = WrappedMouseEvent::ENTERED; + aEvent.maEvent = e; + aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + + maMouseListeners.notify( aGuard, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! +} + +void SAL_CALL SlideShowView::mouseExited( const awt::MouseEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + if (m_bDisposed) + return; + + // Change event source, to enable listeners to match event + // with view + WrappedMouseEvent aEvent; + aEvent.meType = WrappedMouseEvent::EXITED; + aEvent.maEvent = e; + aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + + maMouseListeners.notify( aGuard, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! +} + +// XMouseMotionListener implementation +void SAL_CALL SlideShowView::mouseDragged( const awt::MouseEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + if (m_bDisposed) + return; + + // Change event source, to enable listeners to match event + // with view + WrappedMouseMotionEvent aEvent; + aEvent.meType = WrappedMouseMotionEvent::DRAGGED; + aEvent.maEvent = e; + aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + + maMouseMotionListeners.notify( aGuard, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! +} + +void SAL_CALL SlideShowView::mouseMoved( const awt::MouseEvent& e ) +{ + std::unique_lock aGuard( m_aMutex ); + if (m_bDisposed) + return; + + // Change event source, to enable listeners to match event + // with view + WrappedMouseMotionEvent aEvent; + aEvent.meType = WrappedMouseMotionEvent::MOVED; + aEvent.maEvent = e; + aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); + + maMouseMotionListeners.notify( aGuard, aEvent ); + updateimpl( aGuard, mpSlideShow ); // warning: clears guard! +} + +} // namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/slideshowviewimpl.hxx b/sd/source/ui/slideshow/slideshowviewimpl.hxx new file mode 100644 index 0000000000..3a5018be41 --- /dev/null +++ b/sd/source/ui/slideshow/slideshowviewimpl.hxx @@ -0,0 +1,182 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace com::sun::star::awt { class XPointer; } +namespace com::sun::star::awt { class XWindow; } +namespace com::sun::star::awt { class XWindowPeer; } +namespace com::sun::star::awt { struct WindowEvent; } +namespace com::sun::star::rendering { class XSpriteCanvas; } +class SdDrawDocument; + +namespace sd +{ + +struct WrappedMouseEvent : public css::lang::EventObject +{ + enum EventType + { + PRESSED, + RELEASED, + ENTERED, + EXITED + }; + + EventType meType; + css::awt::MouseEvent maEvent; +}; + +struct WrappedMouseMotionEvent : public css::lang::EventObject +{ + enum EventType + { + DRAGGED, + MOVED + }; + + EventType meType; + css::awt::MouseEvent maEvent; +}; + +// SlideShowViewPaintListeners +typedef ::comphelper::OInterfaceContainerHelper4< css::awt::XPaintListener > SlideShowViewPaintListeners; + + +// SlideShowViewMouseListeners +typedef ::comphelper::OInterfaceContainerHelper4< css::awt::XMouseListener > SlideShowViewMouseListeners_Base; + +class SlideShowViewMouseListeners : public SlideShowViewMouseListeners_Base +{ +public: + void notify(std::unique_lock& rGuard, const WrappedMouseEvent& rEvent); +}; + + +// SlideShowViewMouseMotionListeners +typedef ::comphelper::OInterfaceContainerHelper4< css::awt::XMouseMotionListener > SlideShowViewMouseMotionListeners_Base; + +class SlideShowViewMouseMotionListeners : public SlideShowViewMouseMotionListeners_Base +{ +public: + void notify( std::unique_lock& rGuard, const WrappedMouseMotionEvent& rEvent ); +}; + +// SlideShowView +class ShowWindow; +class SlideshowImpl; + +typedef comphelper::WeakComponentImplHelper< css::presentation::XSlideShowView, + css::awt::XWindowListener, + css::awt::XMouseListener, + css::awt::XMouseMotionListener > SlideShowView_Base; + +class SlideShowView final : public SlideShowView_Base +{ +public: + SlideShowView( ShowWindow& rOutputWindow, + SdDrawDocument* pDoc, + AnimationMode eAnimationMode, + SlideshowImpl* pSlideShow, + bool bFullScreen ); + + void ignoreNextMouseReleased() { mbMousePressedEaten = true; } + + /// Dispose all internal references + virtual void disposing(std::unique_lock&) override; + + /// Disposing our broadcaster + virtual void SAL_CALL disposing( const css::lang::EventObject& ) override; + + /// @throws css::uno::RuntimeException + void paint( const css::awt::PaintEvent& e ); + + // XSlideShowView methods + virtual css::uno::Reference< css::rendering::XSpriteCanvas > SAL_CALL getCanvas( ) override; + virtual void SAL_CALL clear( ) override; + virtual css::geometry::AffineMatrix2D SAL_CALL getTransformation( ) override; + virtual css::geometry::IntegerSize2D SAL_CALL getTranslationOffset( ) override; + virtual void SAL_CALL addTransformationChangedListener( const css::uno::Reference< css::util::XModifyListener >& xListener ) override; + virtual void SAL_CALL removeTransformationChangedListener( const css::uno::Reference< css::util::XModifyListener >& xListener ) override; + virtual void SAL_CALL addPaintListener( const css::uno::Reference< css::awt::XPaintListener >& xListener ) override; + virtual void SAL_CALL removePaintListener( const css::uno::Reference< css::awt::XPaintListener >& xListener ) override; + virtual void SAL_CALL addMouseListener( const css::uno::Reference< css::awt::XMouseListener >& xListener ) override; + virtual void SAL_CALL removeMouseListener( const css::uno::Reference< css::awt::XMouseListener >& xListener ) override; + virtual void SAL_CALL addMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener >& xListener ) override; + virtual void SAL_CALL removeMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener >& xListener ) override; + virtual void SAL_CALL setMouseCursor( sal_Int16 nPointerShape ) override; + virtual css::awt::Rectangle SAL_CALL getCanvasArea( ) override; + + // XWindowListener methods + virtual void SAL_CALL windowResized( const css::awt::WindowEvent& e ) override; + virtual void SAL_CALL windowMoved( const css::awt::WindowEvent& e ) override; + virtual void SAL_CALL windowShown( const css::lang::EventObject& e ) override; + virtual void SAL_CALL windowHidden( const css::lang::EventObject& e ) override; + + // XMouseListener implementation + virtual void SAL_CALL mousePressed( const css::awt::MouseEvent& e ) override; + virtual void SAL_CALL mouseReleased( const css::awt::MouseEvent& e ) override; + virtual void SAL_CALL mouseEntered( const css::awt::MouseEvent& e ) override; + virtual void SAL_CALL mouseExited( const css::awt::MouseEvent& e ) override; + + // XMouseMotionListener implementation + virtual void SAL_CALL mouseDragged( const css::awt::MouseEvent& e ) override; + virtual void SAL_CALL mouseMoved( const css::awt::MouseEvent& e ) override; + +protected: + virtual ~SlideShowView() override {} + +private: + void updateimpl( std::unique_lock& rGuard, SlideshowImpl* pSlideShow ); + + void disposingImpl( std::unique_lock& ); + + ::cppcanvas::SpriteCanvasSharedPtr mpCanvas; + css::uno::Reference< css::awt::XWindow > mxWindow; + css::uno::Reference< css::awt::XWindowPeer > mxWindowPeer; + css::uno::Reference< css::awt::XPointer > mxPointer; + SlideshowImpl* mpSlideShow; + ShowWindow& mrOutputWindow; + std::vector< css::uno::WeakReference< css::util::XModifyListener > > + maViewListeners; + SlideShowViewPaintListeners maPaintListeners; + SlideShowViewMouseListeners maMouseListeners; + SlideShowViewMouseMotionListeners maMouseMotionListeners; + SdDrawDocument* mpDoc; + bool mbIsMouseMotionListener; + AnimationMode meAnimationMode; + bool mbFirstPaint; + bool mbMousePressedEaten; + css::geometry::IntegerSize2D mTranslationOffset; +}; + +} // namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx new file mode 100644 index 0000000000..89acdc564b --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx @@ -0,0 +1,562 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include "SlsBitmapCache.hxx" +#include "SlsCacheCompactor.hxx" +#include "SlsBitmapCompressor.hxx" +#include "SlsCacheConfiguration.hxx" + +#include + +// Define the default value for the maximal cache size that is used for +// previews that are currently not visible. The visible previews are all +// held in memory at all times. This default is used only when the +// configuration does not have a value. +const sal_Int32 MAXIMAL_CACHE_SIZE = 4*1024L*1024L; + +using namespace ::com::sun::star::uno; + +namespace sd::slidesorter::cache { + +class BitmapCache::CacheEntry +{ +public: + CacheEntry(const BitmapEx& rBitmap, sal_Int32 nLastAccessTime, bool bIsPrecious); + CacheEntry(sal_Int32 nLastAccessTime, bool bIsPrecious); + inline void Recycle (const CacheEntry& rEntry); + inline sal_Int32 GetMemorySize() const; + void Compress (const std::shared_ptr& rpCompressor); + inline void Decompress(); + + bool IsUpToDate() const { return mbIsUpToDate; } + void SetUpToDate (bool bIsUpToDate) { mbIsUpToDate = bIsUpToDate; } + sal_Int32 GetAccessTime() const { return mnLastAccessTime; } + void SetAccessTime (sal_Int32 nAccessTime) { mnLastAccessTime = nAccessTime; } + + const BitmapEx& GetPreview() const { return maPreview; } + inline void SetPreview (const BitmapEx& rPreview); + bool HasPreview() const; + + const BitmapEx& GetMarkedPreview() const { return maMarkedPreview; } + inline void SetMarkedPreview (const BitmapEx& rMarkePreview); + + bool HasReplacement() const { return (mpReplacement != nullptr); } + inline bool HasLosslessReplacement() const; + void Invalidate() { mpReplacement.reset(); mpCompressor.reset(); mbIsUpToDate = false; } + bool IsPrecious() const { return mbIsPrecious; } + void SetPrecious (bool bIsPrecious) { mbIsPrecious = bIsPrecious; } + +private: + BitmapEx maPreview; + BitmapEx maMarkedPreview; + std::shared_ptr mpReplacement; + std::shared_ptr mpCompressor; + bool mbIsUpToDate; + sal_Int32 mnLastAccessTime; + // When this flag is set then the bitmap is not modified by a cache + // compactor. + bool mbIsPrecious; +}; + +namespace { + +class CacheHash { +public: + size_t operator()(const BitmapCache::CacheKey& p) const + { return reinterpret_cast(p); } +}; + +} + +class BitmapCache::CacheBitmapContainer + : public std::unordered_map +{ +public: + CacheBitmapContainer() {} +}; + +namespace { + +typedef ::std::vector< + ::std::pair< ::sd::slidesorter::cache::BitmapCache::CacheKey, + ::sd::slidesorter::cache::BitmapCache::CacheEntry> + > SortableBitmapContainer; + + /** Compare elements of the bitmap cache according to their last access + time. + */ + class AccessTimeComparator + { + public: + bool operator () ( + const SortableBitmapContainer::value_type& e1, + const SortableBitmapContainer::value_type& e2) + { + return e1.second.GetAccessTime() < e2.second.GetAccessTime(); + } + }; + +} // end of anonymous namespace + +//===== BitmapCache ========================================================= + +BitmapCache::BitmapCache () + : mpBitmapContainer(new CacheBitmapContainer()), + mnNormalCacheSize(0), + mnPreciousCacheSize(0), + mnCurrentAccessTime(0), + mnMaximalNormalCacheSize(MAXIMAL_CACHE_SIZE), + mbIsFull(false) +{ + Any aCacheSize (CacheConfiguration::Instance()->GetValue("CacheSize")); + if (aCacheSize.has()) + aCacheSize >>= mnMaximalNormalCacheSize; + + mpCacheCompactor = CacheCompactor::Create(*this,mnMaximalNormalCacheSize); +} + +BitmapCache::~BitmapCache() +{ + Clear(); +} + +void BitmapCache::Clear() +{ + std::unique_lock aGuard (maMutex); + + mpBitmapContainer->clear(); + mnNormalCacheSize = 0; + mnPreciousCacheSize = 0; + mnCurrentAccessTime = 0; +} + +bool BitmapCache::HasBitmap (const CacheKey& rKey) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + return (iEntry != mpBitmapContainer->end() + && (iEntry->second.HasPreview() || iEntry->second.HasReplacement())); +} + +bool BitmapCache::BitmapIsUpToDate (const CacheKey& rKey) +{ + std::unique_lock aGuard (maMutex); + + bool bIsUpToDate = false; + CacheBitmapContainer::iterator aIterator (mpBitmapContainer->find(rKey)); + if (aIterator != mpBitmapContainer->end()) + bIsUpToDate = aIterator->second.IsUpToDate(); + + return bIsUpToDate; +} + +BitmapEx BitmapCache::GetBitmap (const CacheKey& rKey) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry == mpBitmapContainer->end()) + { + // Create an empty bitmap for the given key that acts as placeholder + // until we are given the real one. Mark it as not being up to date. + SetBitmap(aGuard, rKey, BitmapEx(), false); + iEntry = mpBitmapContainer->find(rKey); + iEntry->second.SetUpToDate(false); + } + else + { + iEntry->second.SetAccessTime(mnCurrentAccessTime++); + + // Maybe we have to decompress the preview. + if ( ! iEntry->second.HasPreview() && iEntry->second.HasReplacement()) + { + UpdateCacheSize(aGuard, iEntry->second, REMOVE); + iEntry->second.Decompress(); + UpdateCacheSize(aGuard, iEntry->second, ADD); + } + } + return iEntry->second.GetPreview(); +} + +BitmapEx BitmapCache::GetMarkedBitmap (const CacheKey& rKey) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry != mpBitmapContainer->end()) + { + iEntry->second.SetAccessTime(mnCurrentAccessTime++); + return iEntry->second.GetMarkedPreview(); + } + else + return BitmapEx(); +} + +void BitmapCache::ReleaseBitmap (const CacheKey& rKey) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator aIterator (mpBitmapContainer->find(rKey)); + if (aIterator != mpBitmapContainer->end()) + { + UpdateCacheSize(aGuard, aIterator->second, REMOVE); + mpBitmapContainer->erase(aIterator); + } +} + +bool BitmapCache::InvalidateBitmap (const CacheKey& rKey) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry != mpBitmapContainer->end()) + { + iEntry->second.SetUpToDate(false); + + // When there is a preview then we release the replacement. The + // preview itself is kept until a new one is created. + if (iEntry->second.HasPreview()) + { + UpdateCacheSize(aGuard, iEntry->second, REMOVE); + iEntry->second.Invalidate(); + UpdateCacheSize(aGuard, iEntry->second, ADD); + } + return true; + } + else + return false; +} + +void BitmapCache::InvalidateCache() +{ + std::unique_lock aGuard (maMutex); + + for (auto& rEntry : *mpBitmapContainer) + { + rEntry.second.Invalidate(); + } + ReCalculateTotalCacheSize(aGuard); +} + +void BitmapCache::SetBitmap ( + const CacheKey& rKey, + const BitmapEx& rPreview, + bool bIsPrecious) +{ + std::unique_lock aGuard (maMutex); + SetBitmap(aGuard, rKey, rPreview, bIsPrecious); +} + +void BitmapCache::SetBitmap ( + std::unique_lock& rGuard, + const CacheKey& rKey, + const BitmapEx& rPreview, + bool bIsPrecious) +{ + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry != mpBitmapContainer->end()) + { + UpdateCacheSize(rGuard, iEntry->second, REMOVE); + iEntry->second.SetPreview(rPreview); + iEntry->second.SetUpToDate(true); + iEntry->second.SetAccessTime(mnCurrentAccessTime++); + } + else + { + iEntry = mpBitmapContainer->emplace( + rKey, + CacheEntry(rPreview, mnCurrentAccessTime++, bIsPrecious) + ).first; + } + + if (iEntry != mpBitmapContainer->end()) + UpdateCacheSize(rGuard, iEntry->second, ADD); +} + +void BitmapCache::SetMarkedBitmap ( + const CacheKey& rKey, + const BitmapEx& rPreview) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry != mpBitmapContainer->end()) + { + UpdateCacheSize(aGuard, iEntry->second, REMOVE); + iEntry->second.SetMarkedPreview(rPreview); + iEntry->second.SetAccessTime(mnCurrentAccessTime++); + UpdateCacheSize(aGuard, iEntry->second, ADD); + } +} + +void BitmapCache::SetPrecious (const CacheKey& rKey, bool bIsPrecious) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry != mpBitmapContainer->end()) + { + if (iEntry->second.IsPrecious() != bIsPrecious) + { + UpdateCacheSize(aGuard, iEntry->second, REMOVE); + iEntry->second.SetPrecious(bIsPrecious); + UpdateCacheSize(aGuard, iEntry->second, ADD); + } + } + else if (bIsPrecious) + { + iEntry = mpBitmapContainer->emplace( + rKey, + CacheEntry(BitmapEx(), mnCurrentAccessTime++, bIsPrecious) + ).first; + UpdateCacheSize(aGuard, iEntry->second, ADD); + } +} + +void BitmapCache::ReCalculateTotalCacheSize() +{ + std::unique_lock aGuard (maMutex); + ReCalculateTotalCacheSize(aGuard); +} + +void BitmapCache::ReCalculateTotalCacheSize(std::unique_lock& /*rGuard*/) +{ + mnNormalCacheSize = 0; + mnPreciousCacheSize = 0; + for (const auto& rEntry : *mpBitmapContainer) + { + if (rEntry.second.IsPrecious()) + mnPreciousCacheSize += rEntry.second.GetMemorySize(); + else + mnNormalCacheSize += rEntry.second.GetMemorySize(); + } + mbIsFull = (mnNormalCacheSize >= mnMaximalNormalCacheSize); + + SAL_INFO("sd.sls", __func__ << ": cache size is " << mnNormalCacheSize << "/" << mnPreciousCacheSize); +} + +void BitmapCache::Recycle (const BitmapCache& rCache) +{ + std::unique_lock aGuard (maMutex); + + for (const auto& rOtherEntry : *rCache.mpBitmapContainer) + { + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rOtherEntry.first)); + if (iEntry == mpBitmapContainer->end()) + { + iEntry = mpBitmapContainer->emplace( + rOtherEntry.first, + CacheEntry(mnCurrentAccessTime++, true) + ).first; + UpdateCacheSize(aGuard, iEntry->second, ADD); + } + if (iEntry != mpBitmapContainer->end()) + { + UpdateCacheSize(aGuard, iEntry->second, REMOVE); + iEntry->second.Recycle(rOtherEntry.second); + UpdateCacheSize(aGuard, iEntry->second, ADD); + } + } +} + +BitmapCache::CacheIndex BitmapCache::GetCacheIndex() const +{ + std::unique_lock aGuard (maMutex); + + // Create a copy of the bitmap container. + SortableBitmapContainer aSortedContainer; + aSortedContainer.reserve(mpBitmapContainer->size()); + + // Copy the relevant entries. + for (const auto& rEntry : *mpBitmapContainer) + { + if ( rEntry.second.IsPrecious()) + continue; + + if ( ! rEntry.second.HasPreview()) + continue; + + aSortedContainer.emplace_back(rEntry.first, rEntry.second); + } + + // Sort the remaining entries. + ::std::sort(aSortedContainer.begin(), aSortedContainer.end(), AccessTimeComparator()); + + // Return a list with the keys of the sorted entries. + CacheIndex aIndex; + aIndex.reserve(aSortedContainer.size()); + for (const auto& rIndexEntry : aSortedContainer) + aIndex.push_back(rIndexEntry.first); + return aIndex; +} + +void BitmapCache::Compress ( + const CacheKey& rKey, + const std::shared_ptr& rpCompressor) +{ + std::unique_lock aGuard (maMutex); + + CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey)); + if (iEntry != mpBitmapContainer->end() && iEntry->second.HasPreview()) + { + UpdateCacheSize(aGuard, iEntry->second, REMOVE); + iEntry->second.Compress(rpCompressor); + UpdateCacheSize(aGuard, iEntry->second, ADD); + } +} + +void BitmapCache::UpdateCacheSize (std::unique_lock& /*rGuard*/, const CacheEntry& rEntry, CacheOperation eOperation) +{ + sal_Int32 nEntrySize (rEntry.GetMemorySize()); + sal_Int32& rCacheSize (rEntry.IsPrecious() ? mnPreciousCacheSize : mnNormalCacheSize); + switch (eOperation) + { + case ADD: + rCacheSize += nEntrySize; + if ( ! rEntry.IsPrecious() && mnNormalCacheSize>mnMaximalNormalCacheSize) + { + mbIsFull = true; + SAL_INFO("sd.sls", __func__ << ": cache size is " << mnNormalCacheSize << " > " << mnMaximalNormalCacheSize); + mpCacheCompactor->RequestCompaction(); + } + break; + + case REMOVE: + rCacheSize -= nEntrySize; + if (mnNormalCacheSize < mnMaximalNormalCacheSize) + mbIsFull = false; + break; + + default: + assert(false); + break; + } +} + +//===== CacheEntry ============================================================ + +BitmapCache::CacheEntry::CacheEntry( + sal_Int32 nLastAccessTime, + bool bIsPrecious) + : mbIsUpToDate(true), + mnLastAccessTime(nLastAccessTime), + mbIsPrecious(bIsPrecious) +{ +} + +BitmapCache::CacheEntry::CacheEntry( + const BitmapEx& rPreview, + sal_Int32 nLastAccessTime, + bool bIsPrecious) + : maPreview(rPreview), + mbIsUpToDate(true), + mnLastAccessTime(nLastAccessTime), + mbIsPrecious(bIsPrecious) +{ +} + +inline void BitmapCache::CacheEntry::Recycle (const CacheEntry& rEntry) +{ + if ((rEntry.HasPreview() || rEntry.HasLosslessReplacement()) + && ! (HasPreview() || HasLosslessReplacement())) + { + maPreview = rEntry.maPreview; + maMarkedPreview = rEntry.maMarkedPreview; + mpReplacement = rEntry.mpReplacement; + mpCompressor = rEntry.mpCompressor; + mnLastAccessTime = rEntry.mnLastAccessTime; + mbIsUpToDate = rEntry.mbIsUpToDate; + } +} + +inline sal_Int32 BitmapCache::CacheEntry::GetMemorySize() const +{ + sal_Int32 nSize (0); + nSize += maPreview.GetSizeBytes(); + nSize += maMarkedPreview.GetSizeBytes(); + if (mpReplacement != nullptr) + nSize += mpReplacement->GetMemorySize(); + return nSize; +} + +void BitmapCache::CacheEntry::Compress (const std::shared_ptr& rpCompressor) +{ + if ( maPreview.IsEmpty()) + return; + + if (mpReplacement == nullptr) + { + mpReplacement = rpCompressor->Compress(maPreview); + +#ifdef DEBUG_SD_SLSBITMAPCACHE + sal_uInt32 nOldSize (maPreview.GetSizeBytes()); + sal_uInt32 nNewSize (mpReplacement.get()!=NULL ? mpReplacement->GetMemorySize() : 0); + if (nOldSize == 0) + nOldSize = 1; + sal_Int32 nRatio (100L * nNewSize / nOldSize); + SAL_INFO("sd.sls", __func__ << ": compressing bitmap for " << %x << " from " << nOldSize << " to " << nNewSize << " bytes (" << nRatio << "%)"); +#endif + + mpCompressor = rpCompressor; + } + + maPreview.SetEmpty(); + maMarkedPreview.SetEmpty(); +} + +inline void BitmapCache::CacheEntry::Decompress() +{ + if (mpReplacement != nullptr && mpCompressor != nullptr && maPreview.IsEmpty()) + { + maPreview = mpCompressor->Decompress(*mpReplacement); + maMarkedPreview.SetEmpty(); + if ( ! mpCompressor->IsLossless()) + mbIsUpToDate = false; + } +} + +inline void BitmapCache::CacheEntry::SetPreview (const BitmapEx& rPreview) +{ + maPreview = rPreview; + maMarkedPreview.SetEmpty(); + mpReplacement.reset(); + mpCompressor.reset(); +} + +bool BitmapCache::CacheEntry::HasPreview() const +{ + return ! maPreview.IsEmpty(); +} + +inline void BitmapCache::CacheEntry::SetMarkedPreview (const BitmapEx& rMarkedPreview) +{ + maMarkedPreview = rMarkedPreview; +} + +inline bool BitmapCache::CacheEntry::HasLosslessReplacement() const +{ + return mpReplacement != nullptr && mpCompressor != nullptr && mpCompressor->IsLossless(); +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx b/sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx new file mode 100644 index 0000000000..cf52783249 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx @@ -0,0 +1,214 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdrPage; + +namespace sd::slidesorter::cache +{ +class CacheCompactor; +class BitmapCompressor; + +/** This low level cache is the actual bitmap container. It supports a + precious flag for every preview bitmap and keeps track of total sizes + for all previews with/without this flag. The precious flag is used by + compaction algorithms to determine which previews may be compressed or + even discarded and which have to remain in their original form. The + precious flag is usually set for the visible previews. + + Additionally to the actual preview there is an optional marked preview. + This is used for slides excluded from the slide show which have a preview + that shows a mark (some sort of bitmap overlay) to that effect. +*/ +class BitmapCache +{ +public: + /** The key for looking up preview bitmaps is a pointer to an SdrPage + object. The prior use of PageObjectViewObjectContact objects (which + ultimately use them) turned out to be less suitable because their + life time is shorter then that of the page objects. Frequent + destruction and re-creation of the preview bitmaps was the result. + */ + typedef const SdrPage* CacheKey; + class CacheEntry; + class CacheBitmapContainer; + typedef ::std::vector CacheIndex; + + /** Create a new cache for bitmap objects. + The default value from the configuration is used. + When that does not exist then an internal default value is + used. + */ + explicit BitmapCache(); + + /** The destructor clears the cache and releases all bitmaps still in it. + */ + ~BitmapCache(); + + /** Remove all preview bitmaps from the cache. After this call the + cache is empty. + */ + void Clear(); + + /** Return when the cache is full, i.e. the cache compactor had + to be run. + */ + bool IsFull() const { return mbIsFull; } + + /** Return the memory size that is occupied by all non-precious bitmaps + in the cache. + */ + sal_Int32 GetSize() const { return mnNormalCacheSize; } + + /** Return when a preview bitmap exists for the given key. + */ + bool HasBitmap(const CacheKey& rKey); + + /** Return when a preview bitmap exists for the given key and + when it is up-to-date. + */ + bool BitmapIsUpToDate(const CacheKey& rKey); + + /** Return the preview bitmap for the given contact object. + */ + BitmapEx GetBitmap(const CacheKey& rKey); + + /** Return the marked preview bitmap for the given contact object. + */ + BitmapEx GetMarkedBitmap(const CacheKey& rKey); + + /** Release the reference to the preview bitmap that is associated with + the given key. + */ + void ReleaseBitmap(const CacheKey& rKey); + + /** Mark the specified preview bitmap as not being up-to-date + anymore. + @return + When the key references a page in the cache then + return . When the key is not known then + is returned. + */ + bool InvalidateBitmap(const CacheKey& rKey); + + /** Mark all preview bitmaps as not being up-to-date anymore. + */ + void InvalidateCache(); + + /** Add or replace a bitmap for the given key. + */ + void SetBitmap(const CacheKey& rKey, const BitmapEx& rPreview, bool bIsPrecious); + + /** Add or replace a marked bitmap for the given key. + */ + void SetMarkedBitmap(const CacheKey& rKey, const BitmapEx& rPreview); + + /** Mark the specified preview bitmap as precious, i.e. that it must not + be compressed or otherwise removed from the cache. + */ + void SetPrecious(const CacheKey& rKey, bool bIsPrecious); + + /** Calculate the cache size. This should rarely be necessary because + the cache size is tracked with each modification of preview + bitmaps. + */ + void ReCalculateTotalCacheSize(); + + /** Use the previews in the given cache to initialize missing previews. + */ + void Recycle(const BitmapCache& rCache); + + /** Return a list of sorted cache keys that represent an index into (a + part of) the cache. The entries of the index are sorted according + to last access times with the least recently access time first. + Entries with the precious flag set are omitted. + Entries with that have no preview bitmaps are omitted. + */ + CacheIndex GetCacheIndex() const; + + /** Compress the specified preview bitmap with the given bitmap + compressor. A reference to the compressor is stored for later + decompression. + */ + void Compress(const CacheKey& rKey, const std::shared_ptr& rpCompressor); + +private: + mutable std::mutex maMutex; + + std::unique_ptr mpBitmapContainer; + + /** Total size of bytes that are occupied by bitmaps in the cache for + whom the slides are currently not inside the visible area. + */ + sal_Int32 mnNormalCacheSize; + + /** Total size of bytes that are occupied by bitmaps in the cache for + whom the slides are currently visible. + */ + sal_Int32 mnPreciousCacheSize; + + /** At the moment the access time is not an actual time or date value + but a counter that is increased with every access. It thus defines + the same ordering as a true time. + */ + sal_Int32 mnCurrentAccessTime; + + /** The maximal cache size for the off-screen preview bitmaps. When + mnNormalCacheSize grows larger than this value then the + mpCacheCompactor member is used to reduce the cache size. + */ + sal_Int32 mnMaximalNormalCacheSize; + + /** The cache compactor is used to reduce the number of bytes used by + off-screen preview bitmaps. + */ + ::std::unique_ptr mpCacheCompactor; + + /** This flag stores if the cache is or recently was full, i.e. the + cache compactor has or had to be run in order to reduce the cache + size to the allowed value. + */ + bool mbIsFull; + + /** Update mnNormalCacheSize or mnPreciousCacheSize according to the + precious flag of the specified preview bitmap and the specified + operation. + */ + enum CacheOperation + { + ADD, + REMOVE + }; + void UpdateCacheSize(std::unique_lock& rGuard, const CacheEntry& rKey, + CacheOperation eOperation); + + void ReCalculateTotalCacheSize(std::unique_lock& rGuard); + + void SetBitmap(std::unique_lock& rGuard, const CacheKey& rKey, + const BitmapEx& rPreview, bool bIsPrecious); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx new file mode 100644 index 0000000000..2d63bd4749 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx @@ -0,0 +1,197 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsBitmapCompressor.hxx" + +#include +#include +#include +#include + +namespace sd::slidesorter::cache { + +//===== NoBitmapCompression =================================================== + +/** This dummy replacement simply stores a shared pointer to the original + preview bitmap. +*/ +class NoBitmapCompression::DummyReplacement + : public BitmapReplacement +{ +public: + BitmapEx maPreview; + + explicit DummyReplacement (const BitmapEx& rPreview) : maPreview(rPreview) { } + virtual ~DummyReplacement() {} + virtual sal_Int32 GetMemorySize() const override { return maPreview.GetSizeBytes(); } +}; + +std::shared_ptr NoBitmapCompression::Compress (const BitmapEx& rBitmap) const +{ + return std::make_shared(rBitmap); +} + +BitmapEx NoBitmapCompression::Decompress (const BitmapReplacement& rBitmapData) const +{ + return dynamic_cast(rBitmapData).maPreview; +} + +bool NoBitmapCompression::IsLossless() const +{ + return true; +} + +//===== CompressionByDeletion ================================================= + +std::shared_ptr CompressionByDeletion::Compress (const BitmapEx& ) const +{ + return std::shared_ptr(); +} + +BitmapEx CompressionByDeletion::Decompress (const BitmapReplacement& ) const +{ + // Return a NULL pointer. This will eventually lead to a request for + // the creation of a new one. + return BitmapEx(); +} + +bool CompressionByDeletion::IsLossless() const +{ + return false; +} + +//===== ResolutionReduction =================================================== + +/** Store a scaled down bitmap together with the original size. +*/ +class ResolutionReduction::ResolutionReducedReplacement : public BitmapReplacement +{ +public: + BitmapEx maPreview; + Size maOriginalSize; + + virtual ~ResolutionReducedReplacement(); + virtual sal_Int32 GetMemorySize() const override; +}; + +ResolutionReduction::ResolutionReducedReplacement::~ResolutionReducedReplacement() +{ +} + +sal_Int32 ResolutionReduction::ResolutionReducedReplacement::GetMemorySize() const +{ + return maPreview.GetSizeBytes(); +} + +std::shared_ptr ResolutionReduction::Compress ( + const BitmapEx& rBitmap) const +{ + auto pResult = std::make_shared(); + pResult->maPreview = rBitmap; + Size aSize (rBitmap.GetSizePixel()); + pResult->maOriginalSize = aSize; + if (aSize.Width()>0 && aSize.Width()maPreview.Scale(Size(mnWidth,nHeight)); + } + + return pResult; +} + +BitmapEx ResolutionReduction::Decompress (const BitmapReplacement& rBitmapData) const +{ + BitmapEx aResult; + + const ResolutionReducedReplacement* pData ( + dynamic_cast(&rBitmapData)); + + if ( pData && ! pData->maPreview.IsEmpty()) + { + aResult = pData->maPreview; + if (pData->maOriginalSize.Width() > mnWidth) + aResult.Scale(pData->maOriginalSize); + } + + return aResult; +} + +bool ResolutionReduction::IsLossless() const +{ + return false; +} + +//===== PNGCompression ======================================================== + +class PngCompression::PngReplacement : public BitmapReplacement +{ +public: + void* mpData; + sal_Int32 mnDataSize; + PngReplacement() + : mpData(nullptr), + mnDataSize(0) + {} + virtual ~PngReplacement() + { + delete [] static_cast(mpData); + } + virtual sal_Int32 GetMemorySize() const override + { + return mnDataSize; + } +}; + +std::shared_ptr PngCompression::Compress (const BitmapEx& rBitmap) const +{ + SvMemoryStream aStream (32768, 32768); + vcl::PngImageWriter aWriter(aStream); + aWriter.write(rBitmap); + + auto pResult = std::make_shared(); + pResult->mnDataSize = aStream.Tell(); + pResult->mpData = new char[pResult->mnDataSize]; + memcpy(pResult->mpData, aStream.GetData(), pResult->mnDataSize); + + return pResult; +} + +BitmapEx PngCompression::Decompress ( + const BitmapReplacement& rBitmapData) const +{ + BitmapEx aResult; + const PngReplacement* pData (dynamic_cast(&rBitmapData)); + if (pData != nullptr) + { + SvMemoryStream aStream (pData->mpData, pData->mnDataSize, StreamMode::READ); + vcl::PngImageReader aReader (aStream); + aResult = aReader.read().GetBitmap(); + } + + return aResult; +} + +bool PngCompression::IsLossless() const +{ + return true; +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx new file mode 100644 index 0000000000..4754bead99 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +class BitmapEx; + +namespace sd::slidesorter::cache +{ +class BitmapReplacement; + +/** This interface class provides the minimal method set for classes that + implement the compression and decompression of preview bitmaps. +*/ +class BitmapCompressor +{ +public: + /** Compress the given bitmap into a replacement format that is specific + to the compressor class. + */ + virtual std::shared_ptr Compress(const BitmapEx& rBitmap) const = 0; + + /** Decompress the given replacement data into a preview bitmap. + Depending on the compression technique the returned bitmap may + differ from the original bitmap given to the Compress() method. It + may even of the wrong size or empty or the NULL pointer. It is the + task of the caller to create a new preview bitmap if the returned + one is not as desired. + */ + virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const = 0; + + /** Return whether the compression and decompression is lossless. This + value is used by the caller of Decompress() to decide whether to use + the returned bitmap as is or if a new preview has to be created. + */ + virtual bool IsLossless() const = 0; + +protected: + ~BitmapCompressor() {} +}; + +/** Interface for preview bitmap replacements. Each bitmap + compressor/decompressor has to provide an implementation that is + suitable to store the compressed bitmaps. +*/ +class BitmapReplacement +{ +public: + virtual sal_Int32 GetMemorySize() const { return 0; } + +protected: + ~BitmapReplacement() {} +}; + +/** This is one trivial bitmap compressor. It stores bitmaps unmodified + instead of compressing them. + This compressor is lossless. +*/ +class NoBitmapCompression : public BitmapCompressor +{ + class DummyReplacement; + +public: + virtual ~NoBitmapCompression() {} + virtual std::shared_ptr Compress(const BitmapEx& rpBitmap) const override; + virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override; + virtual bool IsLossless() const override; +}; + +/** This is another trivial bitmap compressor. Instead of compressing a + bitmap, it throws the bitmap away. Its Decompress() method returns a + NULL pointer. The caller has to create a new preview bitmap instead. + This compressor clearly is not lossless. +*/ +class CompressionByDeletion : public BitmapCompressor +{ +public: + virtual ~CompressionByDeletion() {} + virtual std::shared_ptr Compress(const BitmapEx& rBitmap) const override; + virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override; + virtual bool IsLossless() const override; +}; + +/** Compress a preview bitmap by reducing its resolution. While the aspect + ratio is maintained the horizontal resolution is scaled down to 100 + pixels. + This compressor is not lossless. +*/ +class ResolutionReduction : public BitmapCompressor +{ + class ResolutionReducedReplacement; + static const sal_Int32 mnWidth = 100; + +public: + virtual ~ResolutionReduction() {} + virtual std::shared_ptr Compress(const BitmapEx& rpBitmap) const override; + /** Scale the replacement bitmap up to the original size. + */ + virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override; + virtual bool IsLossless() const override; +}; + +/** Compress preview bitmaps using the PNG format. + This compressor is lossless. +*/ +class PngCompression : public BitmapCompressor +{ + class PngReplacement; + +public: + virtual ~PngCompression() {} + virtual std::shared_ptr Compress(const BitmapEx& rBitmap) const override; + virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override; + virtual bool IsLossless() const override; +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx new file mode 100644 index 0000000000..a9182c2a25 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsBitmapFactory.hxx" + +#include +#include +#include + +namespace sd::slidesorter::view { +class SlideSorterView; +class PageObjectViewObjectContact; +} + +namespace sd::slidesorter::cache { + +BitmapFactory::BitmapFactory() + : maRenderer(false) +{ +} + +BitmapFactory::~BitmapFactory() +{ +} + +BitmapEx BitmapFactory::CreateBitmap ( + const SdPage& rPage, + const Size& rPixelSize, + const bool bDoSuperSampling) +{ + Size aSize (rPixelSize); + if (bDoSuperSampling) + { + // Supersampling factor + int aSuperSamplingFactor = 2; + aSize.setWidth( aSize.Width() * aSuperSamplingFactor ); + aSize.setHeight( aSize.Height() * aSuperSamplingFactor ); + } + + BitmapEx aPreview (maRenderer.RenderPage ( + &rPage, + aSize, + true, + false).GetBitmapEx()); + if (bDoSuperSampling) + { + aPreview.Scale(rPixelSize, BmpScaleFlag::BestQuality); + } + + return aPreview; +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx new file mode 100644 index 0000000000..c1733b8251 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class SdPage; +class Size; + +namespace sd::slidesorter::cache +{ +/** This factory class creates preview bitmaps for page objects. It is + merely an adapter for the PreviewRenderer. +*/ +class BitmapFactory +{ +public: + BitmapFactory(); + ~BitmapFactory(); + + BitmapEx CreateBitmap(const SdPage& rPage, const Size& rPixelSize, const bool bDoSuperSampling); + +private: + PreviewRenderer maRenderer; +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx new file mode 100644 index 0000000000..f5fa8690af --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx @@ -0,0 +1,190 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "SlsCacheCompactor.hxx" + +#include "SlsBitmapCompressor.hxx" +#include "SlsBitmapCache.hxx" +#include "SlsCacheConfiguration.hxx" + +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; + +namespace { + +/** This is a trivial implementation of the CacheCompactor interface class. + It ignores calls to RequestCompaction() and thus will never decrease the + total size of off-screen preview bitmaps. +*/ +class NoCacheCompaction + : public ::sd::slidesorter::cache::CacheCompactor +{ +public: + NoCacheCompaction ( + ::sd::slidesorter::cache::BitmapCache& rCache, + sal_Int32 nMaximalCacheSize) + : CacheCompactor(rCache, nMaximalCacheSize) + {} + + virtual void RequestCompaction() override { /* Ignored */ }; + +protected: + virtual void Run() override { /* Do nothing */ }; +}; + +/** This implementation of the CacheCompactor interface class uses one of + several bitmap compression algorithms to reduce the number of the bytes + of the off-screen previews in the bitmap cache. See the documentation + of CacheCompactor::Create() for more details on configuration properties + that control the choice of compression algorithm. +*/ +class CacheCompactionByCompression + : public ::sd::slidesorter::cache::CacheCompactor +{ +public: + CacheCompactionByCompression ( + ::sd::slidesorter::cache::BitmapCache& rCache, + sal_Int32 nMaximalCacheSize, + std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> pCompressor); + +protected: + virtual void Run() override; + +private: + std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> mpCompressor; +}; + +} // end of anonymous namespace + +namespace sd::slidesorter::cache { + +::std::unique_ptr CacheCompactor::Create ( + BitmapCache& rCache, + sal_Int32 nMaximalCacheSize) +{ + static const char sNone[] = "None"; + + std::shared_ptr pCompressor; + OUString sCompressionPolicy("PNGCompression"); + Any aCompressionPolicy (CacheConfiguration::Instance()->GetValue("CompressionPolicy")); + if (aCompressionPolicy.has()) + aCompressionPolicy >>= sCompressionPolicy; + if (sCompressionPolicy == sNone) + pCompressor = std::make_shared(); + else if (sCompressionPolicy == "Erase") + pCompressor = std::make_shared(); + else if (sCompressionPolicy == "ResolutionReduction") + pCompressor = std::make_shared(); + else + pCompressor = std::make_shared(); + + ::std::unique_ptr pCompactor; + OUString sCompactionPolicy("Compress"); + Any aCompactionPolicy (CacheConfiguration::Instance()->GetValue("CompactionPolicy")); + if (aCompactionPolicy.has()) + aCompactionPolicy >>= sCompactionPolicy; + if (sCompactionPolicy == sNone) + pCompactor.reset(new NoCacheCompaction(rCache,nMaximalCacheSize)); + else + pCompactor.reset(new CacheCompactionByCompression(rCache,nMaximalCacheSize,pCompressor)); + + return pCompactor; +} + +void CacheCompactor::RequestCompaction() +{ + if ( ! mbIsCompactionRunning && ! maCompactionTimer.IsActive()) + maCompactionTimer.Start(); +} + +CacheCompactor::CacheCompactor( + BitmapCache& rCache, + sal_Int32 nMaximalCacheSize) + : mrCache(rCache), + mnMaximalCacheSize(nMaximalCacheSize), + maCompactionTimer("sd CacheCompactor maCompactionTimer"), + mbIsCompactionRunning(false) +{ + maCompactionTimer.SetTimeout(100); + maCompactionTimer.SetInvokeHandler(LINK(this,CacheCompactor,CompactionCallback)); +} + +IMPL_LINK_NOARG(CacheCompactor, CompactionCallback, Timer *, void) +{ + mbIsCompactionRunning = true; + + try + { + Run(); + } + catch (const css::uno::RuntimeException&) + { + } + catch (const css::uno::Exception&) + { + } + + mbIsCompactionRunning = false; +} + +} // end of namespace ::sd::slidesorter::cache + +namespace { + +//===== CacheCompactionByCompression ========================================== + +CacheCompactionByCompression::CacheCompactionByCompression ( + ::sd::slidesorter::cache::BitmapCache& rCache, + sal_Int32 nMaximalCacheSize, + std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> pCompressor) + : CacheCompactor(rCache,nMaximalCacheSize), + mpCompressor(std::move(pCompressor)) +{ +} + +void CacheCompactionByCompression::Run() +{ + if (mrCache.GetSize() <= mnMaximalCacheSize) + return; + + SAL_INFO("sd.sls", __func__ << ": bitmap cache uses too much space: " << mrCache.GetSize() << " > " << mnMaximalCacheSize); + + ::sd::slidesorter::cache::BitmapCache::CacheIndex aIndex ( + mrCache.GetCacheIndex()); + for (const auto& rpIndex : aIndex) + { + if (rpIndex == nullptr) + continue; + + mrCache.Compress(rpIndex, mpCompressor); + if (mrCache.GetSize() < mnMaximalCacheSize) + break; + } + mrCache.ReCalculateTotalCacheSize(); + SAL_INFO("sd.sls", __func__ << ": there are now " << mrCache.GetSize() << " bytes occupied"); +} + +} // end of anonymous namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx new file mode 100644 index 0000000000..d694ae1a19 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd::slidesorter::cache { + +class BitmapCache; + +/** This is an interface class whose implementations are created via the + Create() factory method. +*/ +class CacheCompactor +{ +public: + virtual ~CacheCompactor() {}; + + /** Create a new instance of the CacheCompactor interface class. The + type of compaction algorithm used depends on values from the + configuration: the SlideSorter/PreviewCache/CompactionPolicy + property of the Impress.xcs file currently supports the values + "None" and "Compress". With the later the CompressionPolicy + property is evaluated which implementation of the BitmapCompress + interface class to use as bitmap compressor. + @param rCache + The bitmap cache on which to operate. + @param nMaximalCacheSize + The total number of bytes the off-screen bitmaps in the cache + may have. When the Run() method is (indirectly) called the + compactor tries to reduce that summed size of off-screen bitmaps + under this number. However, it is not guaranteed that this + works in all cases. + */ + static ::std::unique_ptr Create ( + BitmapCache& rCache, + sal_Int32 nMaximalCacheSize); + + /** Request a compaction of the off-screen previews in the bitmap + cache. This calls via a timer the Run() method. + */ + virtual void RequestCompaction(); + +protected: + BitmapCache& mrCache; + sal_Int32 mnMaximalCacheSize; + + CacheCompactor( + BitmapCache& rCache, + sal_Int32 nMaximalCacheSize); + + /** This method actually tries to reduce the total number of bytes used + by the off-screen preview bitmaps. + */ + virtual void Run() = 0; + +private: + /** This timer is used to collect calls to RequestCompaction() and + eventually call Run(). + */ + Timer maCompactionTimer; + bool mbIsCompactionRunning; + DECL_LINK(CompactionCallback, Timer *, void); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx new file mode 100644 index 0000000000..fd08c76276 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx @@ -0,0 +1,144 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsCacheConfiguration.hxx" +#include + +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::slidesorter::cache { + +namespace +{ + typedef std::shared_ptr CacheConfigSharedPtr; + CacheConfigSharedPtr& theInstance() + { + static CacheConfigSharedPtr SINGLETON; + return SINGLETON; + } +} + +std::weak_ptr CacheConfiguration::mpWeakInstance; + +std::shared_ptr CacheConfiguration::Instance() +{ + SolarMutexGuard aSolarGuard; + CacheConfigSharedPtr &rInstancePtr = theInstance(); + if (!rInstancePtr) + { + // Maybe somebody else kept a previously created instance alive. + if ( ! mpWeakInstance.expired()) + rInstancePtr = std::shared_ptr(mpWeakInstance); + if (!rInstancePtr) + { + // We have to create a new instance. + rInstancePtr.reset(new CacheConfiguration()); + mpWeakInstance = rInstancePtr; + // Prepare to release this instance in the near future. + rInstancePtr->m_ReleaseTimer.SetInvokeHandler( + LINK(rInstancePtr.get(),CacheConfiguration,TimerCallback)); + rInstancePtr->m_ReleaseTimer.SetTimeout(5000 /* 5s */); + rInstancePtr->m_ReleaseTimer.Start(); + } + } + return rInstancePtr; +} + +CacheConfiguration::CacheConfiguration() + : m_ReleaseTimer("sd::CacheConfiguration maReleaseTimer") +{ + // Get the cache size from configuration. + try + { + // Obtain access to the configuration. + Reference xProvider = + configuration::theDefaultProvider::get( ::comphelper::getProcessComponentContext() ); + + // Obtain access to Impress configuration. + Sequence aCreationArguments(comphelper::InitAnyPropertySequence( + { + {"nodepath", Any(OUString("/org.openoffice.Office.Impress/"))}, + {"depth", Any(sal_Int32(-1))} + })); + + Reference xRoot (xProvider->createInstanceWithArguments( + "com.sun.star.configuration.ConfigurationAccess", + aCreationArguments)); + if ( ! xRoot.is()) + return; + Reference xHierarchy (xRoot, UNO_QUERY); + if ( ! xHierarchy.is()) + return; + + // Get the node for the slide sorter preview cache. + mxCacheNode.set( xHierarchy->getByHierarchicalName("MultiPaneGUI/SlideSorter/PreviewCache"), UNO_QUERY); + } + catch (RuntimeException &) + { + } + catch (Exception &) + { + } +} + +Any CacheConfiguration::GetValue (const OUString& rName) +{ + Any aResult; + + if (mxCacheNode != nullptr) + { + try + { + aResult = mxCacheNode->getByName(rName); + } + catch (Exception &) + { + } + } + + return aResult; +} + +IMPL_STATIC_LINK_NOARG(CacheConfiguration, TimerCallback, Timer *, void) +{ + CacheConfigSharedPtr &rInstancePtr = theInstance(); + // Release our reference to the instance. + rInstancePtr.reset(); + // note: if there are no other references to the instance, m_ReleaseTimer + // will be deleted now +} + +void CacheConfiguration::Shutdown() +{ + CacheConfigSharedPtr &rInstancePtr = theInstance(); + rInstancePtr.reset(); + assert(mpWeakInstance.expired()); // ensure m_ReleaseTimer is destroyed +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx new file mode 100644 index 0000000000..d53bcd713f --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace com::sun::star::container +{ +class XNameAccess; +} + +namespace sd::slidesorter::cache +{ +/** A very simple and easy-to-use access to configuration entries regarding + the slide sorter cache. +*/ +class CacheConfiguration +{ +public: + /** Return an instance to this class. The reference is released after 5 + seconds. Subsequent calls to this function will create a new + instance. + */ + static std::shared_ptr Instance(); + + static void Shutdown(); + + /** Look up the specified value in + MultiPaneGUI/SlideSorter/PreviewCache. When the specified value + does not exist then an empty Any is returned. + */ + css::uno::Any GetValue(const OUString& rName); + +private: + /** When a caller holds a reference after we have released ours we use + this weak pointer to avoid creating a new instance. + */ + static std::weak_ptr mpWeakInstance; + Timer m_ReleaseTimer; + css::uno::Reference mxCacheNode; + + CacheConfiguration(); + + DECL_STATIC_LINK(CacheConfiguration, TimerCallback, Timer*, void); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx new file mode 100644 index 0000000000..6275754fa6 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx @@ -0,0 +1,278 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsGenericPageCache.hxx" + +#include "SlsQueueProcessor.hxx" +#include "SlsRequestPriorityClass.hxx" +#include "SlsRequestFactory.hxx" +#include "SlsBitmapCache.hxx" +#include +#include + +namespace sd::slidesorter::cache { + +GenericPageCache::GenericPageCache ( + const Size& rPreviewSize, + const bool bDoSuperSampling, + const SharedCacheContext& rpCacheContext) + : maRequestQueue(rpCacheContext), + mpCacheContext(rpCacheContext), + maPreviewSize(rPreviewSize), + mbDoSuperSampling(bDoSuperSampling) +{ + // A large size may indicate an error of the caller. After all we + // are creating previews. + DBG_ASSERT (maPreviewSize.Width()<1000 && maPreviewSize.Height()<1000, + "GenericPageCache<>::GetPreviewBitmap(): bitmap requested with large width. " + "This may indicate an error."); +} + +GenericPageCache::~GenericPageCache() +{ + if (mpQueueProcessor != nullptr) + mpQueueProcessor->Stop(); + maRequestQueue.Clear(); + mpQueueProcessor.reset(); + + if (mpBitmapCache != nullptr) + PageCacheManager::Instance()->ReleaseCache(mpBitmapCache); + mpBitmapCache.reset(); +} + +void GenericPageCache::ProvideCacheAndProcessor() +{ + if (mpBitmapCache == nullptr) + mpBitmapCache = PageCacheManager::Instance()->GetCache( + mpCacheContext->GetModel(), + maPreviewSize); + + if (mpQueueProcessor == nullptr) + mpQueueProcessor.reset(new QueueProcessor( + maRequestQueue, + mpBitmapCache, + maPreviewSize, + mbDoSuperSampling, + mpCacheContext)); +} + +void GenericPageCache::ChangePreviewSize ( + const Size& rPreviewSize, + const bool bDoSuperSampling) +{ + if (rPreviewSize==maPreviewSize && bDoSuperSampling==mbDoSuperSampling) + return; + + // A large size may indicate an error of the caller. After all we + // are creating previews. + DBG_ASSERT (maPreviewSize.Width()<1000 && maPreviewSize.Height()<1000, + "GenericPageCache<>::GetPreviewBitmap(): bitmap requested with large width. " + "This may indicate an error."); + + if (mpBitmapCache != nullptr) + { + mpBitmapCache = PageCacheManager::Instance()->ChangeSize( + mpBitmapCache, maPreviewSize, rPreviewSize); + if (mpQueueProcessor != nullptr) + { + mpQueueProcessor->SetPreviewSize(rPreviewSize, bDoSuperSampling); + mpQueueProcessor->SetBitmapCache(mpBitmapCache); + } + } + maPreviewSize = rPreviewSize; + mbDoSuperSampling = bDoSuperSampling; +} + +BitmapEx GenericPageCache::GetPreviewBitmap ( + const CacheKey aKey, + const bool bResize) +{ + assert(aKey != nullptr); + + BitmapEx aPreview; + bool bMayBeUpToDate = true; + ProvideCacheAndProcessor(); + const SdrPage* pPage = mpCacheContext->GetPage(aKey); + if (mpBitmapCache->HasBitmap(pPage)) + { + aPreview = mpBitmapCache->GetBitmap(pPage); + const Size aBitmapSize (aPreview.GetSizePixel()); + if (aBitmapSize != maPreviewSize) + { + // Scale the bitmap to the desired size when that is possible, + // i.e. the bitmap is not empty. + if (bResize && !aBitmapSize.IsEmpty()) + { + aPreview.Scale(maPreviewSize); + } + bMayBeUpToDate = false; + } + else + bMayBeUpToDate = true; + } + else + bMayBeUpToDate = false; + + // Request the creation of a correctly sized preview bitmap. We do this + // even when the size of the bitmap in the cache is correct because its + // content may be not up-to-date anymore. + RequestPreviewBitmap(aKey, bMayBeUpToDate); + + return aPreview; +} + +BitmapEx GenericPageCache::GetMarkedPreviewBitmap ( + const CacheKey aKey) +{ + assert(aKey != nullptr); + + ProvideCacheAndProcessor(); + const SdrPage* pPage = mpCacheContext->GetPage(aKey); + BitmapEx aMarkedPreview (mpBitmapCache->GetMarkedBitmap(pPage)); + + return aMarkedPreview; +} + +void GenericPageCache::SetMarkedPreviewBitmap ( + const CacheKey aKey, + const BitmapEx& rMarkedBitmap) +{ + assert(aKey != nullptr); + + ProvideCacheAndProcessor(); + const SdrPage* pPage = mpCacheContext->GetPage(aKey); + mpBitmapCache->SetMarkedBitmap(pPage, rMarkedBitmap); +} + +void GenericPageCache::RequestPreviewBitmap ( + const CacheKey aKey, + const bool bMayBeUpToDate) +{ + assert(aKey != nullptr); + + const SdrPage* pPage = mpCacheContext->GetPage(aKey); + + ProvideCacheAndProcessor(); + + // Determine if the available bitmap is up to date. + bool bIsUpToDate = false; + if (bMayBeUpToDate) + bIsUpToDate = mpBitmapCache->BitmapIsUpToDate (pPage); + if (bIsUpToDate) + { + const BitmapEx aPreview (mpBitmapCache->GetBitmap(pPage)); + if (aPreview.IsEmpty() || aPreview.GetSizePixel()!=maPreviewSize) + bIsUpToDate = false; + } + + if ( bIsUpToDate) + return; + + // No, the bitmap is not up-to-date. Request a new one. + RequestPriorityClass ePriorityClass (NOT_VISIBLE); + if (mpCacheContext->IsVisible(aKey)) + { + if (mpBitmapCache->HasBitmap(pPage)) + ePriorityClass = VISIBLE_OUTDATED_PREVIEW; + else + ePriorityClass = VISIBLE_NO_PREVIEW; + } + maRequestQueue.AddRequest(aKey, ePriorityClass); + mpQueueProcessor->Start(ePriorityClass); +} + +bool GenericPageCache::InvalidatePreviewBitmap (const CacheKey aKey) +{ + // Invalidate the page in all caches that reference it, not just this one. + std::shared_ptr pCacheManager ( + cache::PageCacheManager::Instance()); + if (pCacheManager) + return pCacheManager->InvalidatePreviewBitmap( + mpCacheContext->GetModel(), + aKey); + else if (mpBitmapCache != nullptr) + return mpBitmapCache->InvalidateBitmap(mpCacheContext->GetPage(aKey)); + else + return false; +} + +void GenericPageCache::InvalidateCache () +{ + if (!mpBitmapCache) + return; + + // When the cache is being invalidated then it makes no sense to + // continue creating preview bitmaps. However, this may be + // re-started below. + mpQueueProcessor->Stop(); + maRequestQueue.Clear(); + + // Mark the previews in the cache as not being up-to-date anymore. + // Depending on the given bUpdateCache flag we start to create new + // preview bitmaps. + mpBitmapCache->InvalidateCache(); + RequestFactory()(maRequestQueue, mpCacheContext); +} + +void GenericPageCache::SetPreciousFlag ( + const CacheKey aKey, + const bool bIsPrecious) +{ + ProvideCacheAndProcessor(); + + // Change the request priority class according to the new precious flag. + if (bIsPrecious) + { + if (mpBitmapCache->HasBitmap(mpCacheContext->GetPage(aKey))) + maRequestQueue.ChangeClass(aKey,VISIBLE_OUTDATED_PREVIEW); + else + maRequestQueue.ChangeClass(aKey,VISIBLE_NO_PREVIEW); + } + else + { + if (mpBitmapCache->IsFull()) + { + // When the bitmap cache is full then requests for slides that + // are not visible are removed. + maRequestQueue.RemoveRequest(aKey); + } + else + maRequestQueue.ChangeClass(aKey,NOT_VISIBLE); + } + + mpBitmapCache->SetPrecious(mpCacheContext->GetPage(aKey), bIsPrecious); +} + +void GenericPageCache::Pause() +{ + ProvideCacheAndProcessor(); + if (mpQueueProcessor != nullptr) + mpQueueProcessor->Pause(); +} + +void GenericPageCache::Resume() +{ + ProvideCacheAndProcessor(); + if (mpQueueProcessor != nullptr) + mpQueueProcessor->Resume(); +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx new file mode 100644 index 0000000000..900d402686 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx @@ -0,0 +1,152 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "SlsRequestQueue.hxx" +#include + +#include + +namespace sd::slidesorter::cache { + +class BitmapCache; +class QueueProcessor; + +/** This basically is the implementation class for the PageCache class. +*/ +class GenericPageCache +{ +public: + /** The page cache is created with a reference to the SlideSorter and + thus has access to both view and model. This allows the cache to + fill itself with requests for all pages or just the visible ones. + @param rPreviewSize + The size of the previews is expected in pixel values. + @param bDoSuperSampling + When the previews are rendered larger and then scaled + down to the requested size to improve image quality. + */ + GenericPageCache ( + const Size& rPreviewSize, + const bool bDoSuperSampling, + const SharedCacheContext& rpCacheContext); + + ~GenericPageCache(); + + /** Change the size of the preview bitmaps. This may be caused by a + resize of the slide sorter window or a change of the number of + columns. + */ + void ChangePreviewSize ( + const Size& rPreviewSize, + const bool bDoSuperSampling); + + /** Request a preview bitmap for the specified page object in the + specified size. The returned bitmap may be a preview of the preview, + i.e. either a scaled (up or down) version of a previous preview (of + the wrong size) or an empty bitmap. In this case a request for the + generation of a new preview is created and inserted into the request + queue. When the preview is available the page shape will be told to + paint itself again. When it then calls this method again if + receives the correctly sized preview bitmap. + @param rRequestData + This data is used to determine the preview. + @param bResize + When then when the available bitmap has not the + requested size, it is scaled before it is returned. When + then the bitmap is returned in the wrong size and it is + the task of the caller to scale it. + @return + Returns a bitmap that is either empty, contains a scaled (up or + down) version or is the requested bitmap. + */ + BitmapEx GetPreviewBitmap ( + const CacheKey aKey, + const bool bResize); + BitmapEx GetMarkedPreviewBitmap ( + const CacheKey aKey); + void SetMarkedPreviewBitmap ( + const CacheKey aKey, + const BitmapEx& rMarkedBitmap); + + /** When the requested preview bitmap does not yet exist or is not + up-to-date then the rendering of one is scheduled. Otherwise this + method does nothing. + @param rRequestData + This data is used to determine the preview. + @param bMayBeUpToDate + This flag helps the method to determine whether an existing + preview that matches the request is up to date. If the caller + knows that it is not then by passing he tells us that we + do not have to check the up-to-date flag a second time. If + unsure use . + */ + void RequestPreviewBitmap ( + const CacheKey aKey, + const bool bMayBeUpToDate); + + /** Tell the cache to replace the bitmap associated with the given + request data with a new one that reflects recent changes in the + content of the page object. + @return + When the key is known then return . + */ + bool InvalidatePreviewBitmap (const CacheKey aKey); + + /** Call this method when all preview bitmaps have to be generated anew. + This is the case when the size of the page objects on the screen has + changed or when the model has changed. + */ + void InvalidateCache (); + + /** With the precious flag you can control whether a bitmap can be + removed from the cache or reduced in size to make room for other + bitmaps or is so precious that it will not be touched. A typical + use is to set the precious flag for the visible pages. + */ + void SetPreciousFlag (const CacheKey aKey, const bool bIsPrecious); + + void Pause(); + void Resume(); + +private: + std::shared_ptr mpBitmapCache; + + RequestQueue maRequestQueue; + + std::unique_ptr mpQueueProcessor; + + SharedCacheContext mpCacheContext; + + /** The current size of preview bitmaps. + */ + Size maPreviewSize; + + bool mbDoSuperSampling; + + /** Both bitmap cache and queue processor are created on demand by this + method. + */ + void ProvideCacheAndProcessor(); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsPageCache.cxx b/sd/source/ui/slidesorter/cache/SlsPageCache.cxx new file mode 100644 index 0000000000..82b1b8ae47 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsPageCache.cxx @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "SlsGenericPageCache.hxx" +#include + +using namespace ::com::sun::star; + +namespace sd::slidesorter::cache { + +//===== PageCache ============================================================= + +PageCache::PageCache ( + const Size& rPreviewSize, + const bool bDoSuperSampling, + const SharedCacheContext& rpCacheContext) + : mpImplementation( + new GenericPageCache( + rPreviewSize, + bDoSuperSampling, + rpCacheContext)) +{ +} + +PageCache::~PageCache() +{ +} + +void PageCache::ChangeSize ( + const Size& rPreviewSize, + const bool bDoSuperSampling) +{ + mpImplementation->ChangePreviewSize(rPreviewSize, bDoSuperSampling); +} + +BitmapEx PageCache::GetPreviewBitmap ( + const CacheKey aKey, + const bool bResize) +{ + return mpImplementation->GetPreviewBitmap(aKey, bResize); +} + +BitmapEx PageCache::GetMarkedPreviewBitmap ( + const CacheKey aKey) +{ + return mpImplementation->GetMarkedPreviewBitmap(aKey); +} + +void PageCache::SetMarkedPreviewBitmap ( + const CacheKey aKey, + const BitmapEx& rMarkedBitmap) +{ + mpImplementation->SetMarkedPreviewBitmap(aKey, rMarkedBitmap); +} + +void PageCache::RequestPreviewBitmap (const CacheKey aKey) +{ + return mpImplementation->RequestPreviewBitmap(aKey, true); +} + +void PageCache::InvalidatePreviewBitmap ( + const CacheKey aKey) +{ + if (mpImplementation->InvalidatePreviewBitmap(aKey)) + RequestPreviewBitmap(aKey); +} + +void PageCache::InvalidateCache() +{ + mpImplementation->InvalidateCache(); +} + +void PageCache::SetPreciousFlag ( + const CacheKey aKey, + const bool bIsPrecious) +{ + mpImplementation->SetPreciousFlag(aKey, bIsPrecious); +} + +void PageCache::Pause() +{ + mpImplementation->Pause(); +} + +void PageCache::Resume() +{ + mpImplementation->Resume(); +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx b/sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx new file mode 100644 index 0000000000..76fc3753fc --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx @@ -0,0 +1,424 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include "SlsBitmapCache.hxx" + +#include +#include +#include +#include +#include + +#include + +namespace { + +/** Collection of data that is stored for all active preview caches. +*/ +class CacheDescriptor +{ +public: + ::sd::slidesorter::cache::PageCacheManager::DocumentKey mpDocument; + Size maPreviewSize; + + CacheDescriptor( + ::sd::slidesorter::cache::PageCacheManager::DocumentKey pDocument, + const Size& rPreviewSize) + :mpDocument(std::move(pDocument)),maPreviewSize(rPreviewSize) + {} + /// Test for equality with respect to all members. + class Equal {public: bool operator() ( + const CacheDescriptor& rDescriptor1, const CacheDescriptor& rDescriptor2) const { + return rDescriptor1.mpDocument==rDescriptor2.mpDocument + && rDescriptor1.maPreviewSize==rDescriptor2.maPreviewSize; + } }; + /// Hash function that takes all members into account. + class Hash {public: size_t operator() (const CacheDescriptor& rDescriptor) const { + return reinterpret_cast(rDescriptor.mpDocument.get()) + rDescriptor.maPreviewSize.Width(); + } }; +}; + +/** Collection of data that is stored for the inactive, recently used + caches. +*/ +class RecentlyUsedCacheDescriptor +{ +public: + Size maPreviewSize; + std::shared_ptr< ::sd::slidesorter::cache::BitmapCache> mpCache; + + RecentlyUsedCacheDescriptor( + const Size& rPreviewSize, + std::shared_ptr< ::sd::slidesorter::cache::BitmapCache> pCache) + :maPreviewSize(rPreviewSize),mpCache(std::move(pCache)) + {} +}; + +/** The list of recently used caches is organized as queue. When elements + are added the list is shortened to the maximally allowed number of + elements by removing the least recently used elements. +*/ +typedef ::std::deque RecentlyUsedQueue; + +/** Compare the caches by preview size. Those that match the given size + come first, then, regardless of the given size, the largest ones before + the smaller ones. +*/ +class BestFittingCacheComparer +{ +public: + explicit BestFittingCacheComparer (const Size& rPreferredSize) + : maPreferredSize(rPreferredSize) + {} + bool operator()(const ::sd::slidesorter::cache::PageCacheManager::BestFittingPageCaches::value_type& rElement1, + const ::sd::slidesorter::cache::PageCacheManager::BestFittingPageCaches::value_type& rElement2) + { + if (rElement2.first == maPreferredSize) + return false; + else if (rElement1.first == maPreferredSize) + return true; + else + return (rElement1.first.Width()*rElement1.first.Height() + > rElement2.first.Width()*rElement2.first.Height()); + } + +private: + Size maPreferredSize; +}; + +} // end of anonymous namespace + +namespace sd::slidesorter::cache { + +/** Container for the active caches. +*/ +class PageCacheManager::PageCacheContainer + : public std::unordered_map, + CacheDescriptor::Hash, + CacheDescriptor::Equal> +{ +public: + PageCacheContainer() {} + + /** Compare entries in the cache container with respect to the cache + address only. + */ + class CompareWithCache { public: + explicit CompareWithCache(std::shared_ptr pCache) + : mpCache(std::move(pCache)) {} + bool operator () (const PageCacheContainer::value_type& rValue) const + { return rValue.second == mpCache; } + private: + std::shared_ptr mpCache; + }; +}; + +/** The recently used caches are stored in one queue for each document. +*/ +class PageCacheManager::RecentlyUsedPageCaches +{ +public: + typedef DocumentKey key_type; + typedef RecentlyUsedQueue mapped_type; + typedef std::map::iterator iterator; +private: + std::map maMap; +public: + RecentlyUsedPageCaches () {}; + + iterator end() { return maMap.end(); } + void clear() { maMap.clear(); } + iterator find(const key_type& key) { return maMap.find(key); } + template + std::pair emplace(Args&&... args) { return maMap.emplace(std::forward(args)...); } +}; + +class PageCacheManager::Deleter +{ +public: + void operator() (PageCacheManager* pObject) { delete pObject; } +}; + +//===== PageCacheManager ==================================================== + +std::weak_ptr PageCacheManager::mpInstance; + +std::shared_ptr PageCacheManager::Instance() +{ + std::shared_ptr pInstance; + + ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); + + pInstance = mpInstance.lock(); + if (pInstance == nullptr) + { + pInstance = std::shared_ptr( + new PageCacheManager(), + PageCacheManager::Deleter()); + mpInstance = pInstance; + } + + return pInstance; +} + +PageCacheManager::PageCacheManager() + : mpPageCaches(new PageCacheContainer()), + mpRecentlyUsedPageCaches(new RecentlyUsedPageCaches()) +{ +} + +PageCacheManager::~PageCacheManager() +{ +} + +std::shared_ptr PageCacheManager::GetCache ( + const DocumentKey& pDocument, + const Size& rPreviewSize) +{ + std::shared_ptr pResult; + + // Look for the cache in the list of active caches. + CacheDescriptor aKey (pDocument, rPreviewSize); + PageCacheContainer::iterator iCache (mpPageCaches->find(aKey)); + if (iCache != mpPageCaches->end()) + pResult = iCache->second; + + // Look for the cache in the list of recently used caches. + if (pResult == nullptr) + pResult = GetRecentlyUsedCache(pDocument, rPreviewSize); + + // Create the cache when no suitable one does exist. + if (pResult == nullptr) + pResult = std::make_shared(); + + // The cache may be newly created and thus empty or is old and may + // contain previews that are not up-to-date. Recycle previews from + // other caches to fill in the holes. + Recycle(pResult, pDocument,rPreviewSize); + + // Put the new (or old) cache into the container. + mpPageCaches->emplace(aKey, pResult); + + return pResult; +} + +void PageCacheManager::Recycle ( + const std::shared_ptr& rpCache, + const DocumentKey& pDocument, + const Size& rPreviewSize) +{ + BestFittingPageCaches aCaches; + + // Add bitmap caches from active caches. + for (auto& rActiveCache : *mpPageCaches) + { + if (rActiveCache.first.mpDocument == pDocument) + aCaches.emplace_back( + rActiveCache.first.maPreviewSize, rActiveCache.second); + } + + // Add bitmap caches from recently used caches. + RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument)); + if (iQueue != mpRecentlyUsedPageCaches->end()) + { + for (const auto& rRecentCache : iQueue->second) + aCaches.emplace_back( + rRecentCache.maPreviewSize, rRecentCache.mpCache); + } + + ::std::sort(aCaches.begin(), aCaches.end(), BestFittingCacheComparer(rPreviewSize)); + + for (const auto& rBestCache : aCaches) + { + rpCache->Recycle(*rBestCache.second); + } +} + +void PageCacheManager::ReleaseCache (const std::shared_ptr& rpCache) +{ + PageCacheContainer::iterator iCache (::std::find_if( + mpPageCaches->begin(), + mpPageCaches->end(), + PageCacheContainer::CompareWithCache(rpCache))); + + if (iCache != mpPageCaches->end()) + { + assert(iCache->second == rpCache); + + PutRecentlyUsedCache(iCache->first.mpDocument,iCache->first.maPreviewSize,rpCache); + + mpPageCaches->erase(iCache); + } +} + +std::shared_ptr PageCacheManager::ChangeSize ( + const std::shared_ptr& rpCache, + const Size&, + const Size& rNewPreviewSize) +{ + std::shared_ptr pResult; + + if (rpCache != nullptr) + { + // Look up the given cache in the list of active caches. + PageCacheContainer::iterator iCacheToChange (::std::find_if( + mpPageCaches->begin(), + mpPageCaches->end(), + PageCacheContainer::CompareWithCache(rpCache))); + if (iCacheToChange != mpPageCaches->end()) + { + assert(iCacheToChange->second == rpCache); + + // Now, we can change the preview size of the existing one by + // removing the cache from the list and re-insert it with the + // updated size. + const ::sd::slidesorter::cache::PageCacheManager::DocumentKey aKey ( + iCacheToChange->first.mpDocument); + mpPageCaches->erase(iCacheToChange); + mpPageCaches->emplace( + CacheDescriptor(aKey,rNewPreviewSize), + rpCache); + + pResult = rpCache; + } + // In multi user view this can happen - no issue (reset after switching MasterPage) + else if (!comphelper::LibreOfficeKit::isActive()) + { + assert(iCacheToChange != mpPageCaches->end()); + } + } + + return pResult; +} + +bool PageCacheManager::InvalidatePreviewBitmap ( + const DocumentKey& pDocument, + const SdrPage* pKey) +{ + bool bHasChanged (false); + + if (pDocument!=nullptr) + { + // Iterate over all caches that are currently in use and invalidate + // the previews in those that belong to the document. + for (auto& rCache : *mpPageCaches) + if (rCache.first.mpDocument == pDocument) + bHasChanged |= rCache.second->InvalidateBitmap(pKey); + + // Invalidate the previews in the recently used caches belonging to + // the given document. + RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument)); + if (iQueue != mpRecentlyUsedPageCaches->end()) + { + for (const auto& rCache2 : iQueue->second) + bHasChanged |= rCache2.mpCache->InvalidateBitmap(pKey); + } + } + + return bHasChanged; +} + +void PageCacheManager::InvalidateAllPreviewBitmaps (const DocumentKey& pDocument) +{ + if (pDocument == nullptr) + return; + + // Iterate over all caches that are currently in use and invalidate the + // previews in those that belong to the document. + for (auto& rCache : *mpPageCaches) + if (rCache.first.mpDocument == pDocument) + rCache.second->InvalidateCache(); + + // Invalidate the previews in the recently used caches belonging to the + // given document. + RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument)); + if (iQueue != mpRecentlyUsedPageCaches->end()) + { + for (const auto& rCache2 : iQueue->second) + rCache2.mpCache->InvalidateCache(); + } +} + +void PageCacheManager::InvalidateAllCaches() +{ + // Iterate over all caches that are currently in use and invalidate + // them. + for (auto& rCache : *mpPageCaches) + rCache.second->InvalidateCache(); + + // Remove all recently used caches, there is not much sense in storing + // invalidated and unused caches. + mpRecentlyUsedPageCaches->clear(); +} + +void PageCacheManager::ReleasePreviewBitmap (const SdrPage* pPage) +{ + for (auto& rCache : *mpPageCaches) + rCache.second->ReleaseBitmap(pPage); +} + +std::shared_ptr PageCacheManager::GetRecentlyUsedCache ( + const DocumentKey& pDocument, + const Size& rPreviewSize) +{ + std::shared_ptr pCache; + + // Look for the cache in the list of recently used caches. + RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument)); + if (iQueue != mpRecentlyUsedPageCaches->end()) + { + RecentlyUsedQueue::iterator iCache = std::find_if(iQueue->second.begin(), iQueue->second.end(), + [&rPreviewSize](const RecentlyUsedCacheDescriptor& rCache) { return rCache.maPreviewSize == rPreviewSize; }); + if (iCache != iQueue->second.end()) + { + pCache = iCache->mpCache; + iQueue->second.erase(iCache); + } + } + + return pCache; +} + +void PageCacheManager::PutRecentlyUsedCache( + DocumentKey const & pDocument, + const Size& rPreviewSize, + const std::shared_ptr& rpCache) +{ + // Look up the list of recently used caches for the given document. + RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument)); + if (iQueue == mpRecentlyUsedPageCaches->end()) + iQueue = mpRecentlyUsedPageCaches->emplace( + pDocument, RecentlyUsedQueue() + ).first; + + if (iQueue != mpRecentlyUsedPageCaches->end()) + { + iQueue->second.push_front(RecentlyUsedCacheDescriptor(rPreviewSize,rpCache)); + // Shorten the list of recently used caches to the allowed maximal length. + while (iQueue->second.size() > mnMaximalRecentlyCacheCount) + iQueue->second.pop_back(); + } +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx new file mode 100644 index 0000000000..2325e232ab --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsQueueProcessor.hxx" +#include "SlsRequestQueue.hxx" +#include "SlsBitmapCache.hxx" + +#include +#include +#include +#include + +namespace sd::slidesorter::cache { + +//===== QueueProcessor ====================================================== + +QueueProcessor::QueueProcessor ( + RequestQueue& rQueue, + std::shared_ptr pCache, + const Size& rPreviewSize, + const bool bDoSuperSampling, + SharedCacheContext pCacheContext) + : maTimer("sd::QueueProcessor maTimer"), + maPreviewSize(rPreviewSize), + mbDoSuperSampling(bDoSuperSampling), + mpCacheContext(std::move(pCacheContext)), + mrQueue(rQueue), + mpCache(std::move(pCache)), + mbIsPaused(false) +{ + maTimer.SetInvokeHandler (LINK(this,QueueProcessor,ProcessRequestHdl)); + maTimer.SetTimeout (10); +} + +QueueProcessor::~QueueProcessor() +{ +} + +void QueueProcessor::Start (int nPriorityClass) +{ + if (mbIsPaused) + return; + if ( ! maTimer.IsActive()) + { + if (nPriorityClass == 0) + maTimer.SetTimeout (10); + else + maTimer.SetTimeout (100); + maTimer.Start(); + } +} + +void QueueProcessor::Stop() +{ + if (maTimer.IsActive()) + maTimer.Stop(); +} + +void QueueProcessor::Pause() +{ + mbIsPaused = true; +} + +void QueueProcessor::Resume() +{ + mbIsPaused = false; + if ( ! mrQueue.IsEmpty()) + Start(mrQueue.GetFrontPriorityClass()); +} + +void QueueProcessor::SetPreviewSize ( + const Size& rPreviewSize, + const bool bDoSuperSampling) +{ + maPreviewSize = rPreviewSize; + mbDoSuperSampling = bDoSuperSampling; +} + +IMPL_LINK_NOARG(QueueProcessor, ProcessRequestHdl, Timer *, void) +{ + ProcessRequests(); +} + +void QueueProcessor::ProcessRequests() +{ + assert(mpCacheContext); + + // Never process more than one request at a time in order to prevent the + // lock up of the edit view. + if ( ! mrQueue.IsEmpty() + && ! mbIsPaused + && mpCacheContext->IsIdle()) + { + CacheKey aKey = nullptr; + RequestPriorityClass ePriorityClass (NOT_VISIBLE); + { + ::osl::MutexGuard aGuard (mrQueue.GetMutex()); + + if ( ! mrQueue.IsEmpty()) + { + // Get the request with the highest priority from the queue. + ePriorityClass = mrQueue.GetFrontPriorityClass(); + aKey = mrQueue.GetFront(); + mrQueue.PopFront(); + } + } + + if (aKey != nullptr) + ProcessOneRequest(aKey, ePriorityClass); + } + + // Schedule the processing of the next element(s). + { + ::osl::MutexGuard aGuard (mrQueue.GetMutex()); + if ( ! mrQueue.IsEmpty()) + Start(mrQueue.GetFrontPriorityClass()); + else + { + comphelper::ProfileZone aZone("QueueProcessor finished processing all elements"); + } + } +} + +void QueueProcessor::ProcessOneRequest ( + CacheKey aKey, + const RequestPriorityClass ePriorityClass) +{ + try + { + std::scoped_lock aGuard (maMutex); + + // Create a new preview bitmap and store it in the cache. + if (mpCache != nullptr && mpCacheContext) + { + const SdPage* pSdPage = dynamic_cast(mpCacheContext->GetPage(aKey)); + if (pSdPage != nullptr) + { + const BitmapEx aPreview ( + maBitmapFactory.CreateBitmap(*pSdPage, maPreviewSize, mbDoSuperSampling)); + mpCache->SetBitmap (pSdPage, aPreview, ePriorityClass!=NOT_VISIBLE); + + // Initiate a repaint of the new preview. + mpCacheContext->NotifyPreviewCreation(aKey); + } + } + } + catch (css::uno::Exception &) + { + TOOLS_WARN_EXCEPTION( "sd", "QueueProcessor"); + } +} + +void QueueProcessor::SetBitmapCache ( + const std::shared_ptr& rpCache) +{ + mpCache = rpCache; +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx new file mode 100644 index 0000000000..70ea8d5b3e --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include "SlsRequestPriorityClass.hxx" +#include "SlsBitmapFactory.hxx" + +#include +#include + +namespace sd::slidesorter::cache { + +class BitmapCache; +class RequestQueue; + +/** This queue processor is timer based, i.e. when an entry is added to the + queue and the processor is started with Start() in the base class a + timer is started that eventually calls ProcessRequest(). This is + repeated until the queue is empty or Stop() is called. +*/ +class QueueProcessor final +{ +public: + QueueProcessor ( + RequestQueue& rQueue, + std::shared_ptr pCache, + const Size& rPreviewSize, + const bool bDoSuperSampling, + SharedCacheContext pCacheContext); + ~QueueProcessor(); + + /** Start the processor. This implementation is timer based and waits + a defined amount of time that depends on the given argument before + the next entry in the queue is processed. + @param nPriorityClass + A priority class of 0 tells the processor that a high priority + request is waiting in the queue. The time to wait is thus + shorter then that for a low priority request (denoted by a value + of 1.) When the timer is already running it is not modified. + */ + void Start (int nPriorityClass); + void Stop(); + void Pause(); + void Resume(); + + void SetPreviewSize ( + const Size& rSize, + const bool bDoSuperSampling); + + /** Use this method when the page cache is (maybe) using a different + BitmapCache. This is usually necessary after calling + PageCacheManager::ChangeSize(). + */ + void SetBitmapCache (const std::shared_ptr& rpCache); + +private: + /** This mutex is used to guard the queue processor. Be careful not to + mix its use with that of the solar mutex. + */ + std::mutex maMutex; + + Timer maTimer; + DECL_LINK(ProcessRequestHdl, Timer *, void); + Size maPreviewSize; + bool mbDoSuperSampling; + SharedCacheContext mpCacheContext; + RequestQueue& mrQueue; + std::shared_ptr mpCache; + BitmapFactory maBitmapFactory; + bool mbIsPaused; + + void ProcessRequests(); + void ProcessOneRequest ( + CacheKey aKey, + const RequestPriorityClass ePriorityClass); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx b/sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx new file mode 100644 index 0000000000..6fc6cabc91 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsRequestFactory.hxx" +#include "SlsRequestQueue.hxx" + +namespace sd::slidesorter::cache { + +void RequestFactory::operator()( + RequestQueue& rRequestQueue, + const SharedCacheContext& rpCacheContext) +{ + std::shared_ptr > aKeys; + + // Add the requests for the visible pages. + aKeys = rpCacheContext->GetEntryList(true); + if (aKeys != nullptr) + { + for (const auto& rKey : *aKeys) + rRequestQueue.AddRequest(rKey, VISIBLE_NO_PREVIEW); + } + + // Add the requests for the non-visible pages. + aKeys = rpCacheContext->GetEntryList(false); + if (aKeys != nullptr) + { + for (const auto& rKey : *aKeys) + rRequestQueue.AddRequest(rKey, NOT_VISIBLE); + } +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx b/sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx new file mode 100644 index 0000000000..3f42077250 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx @@ -0,0 +1,36 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::slidesorter::cache +{ +class RequestQueue; + +class RequestFactory +{ +public: + void operator()(RequestQueue& rRequestQueue, const SharedCacheContext& rpCacheContext); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx b/sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx new file mode 100644 index 0000000000..2c84ecbcf5 --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +namespace sd::slidesorter::cache +{ +/** Each request for a preview creation has a priority. This enum defines + the available priorities. The special values MIN_CLASS and MAX_CLASS + are/can be used for validation and have to be kept up-to-date. +*/ +enum RequestPriorityClass +{ + MIN_CLASS = 0, + + // The slide is visible. A preview does not yet exist. + VISIBLE_NO_PREVIEW = MIN_CLASS, + // The slide is visible. A preview exists but is not up-to-date anymore. + VISIBLE_OUTDATED_PREVIEW, + // The slide is not visible. + NOT_VISIBLE, + + MAX_CLASS = NOT_VISIBLE +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx new file mode 100644 index 0000000000..a0dcc9f0cb --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx @@ -0,0 +1,276 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsRequestQueue.hxx" + +#include + +#include + +#include +#include + +namespace sd::slidesorter::cache { + +namespace { + +/** This class extends the actual request data with additional information + that is used by the priority queues. +*/ +class Request +{ +public: + Request ( + CacheKey aKey, sal_Int32 nPriority, RequestPriorityClass eClass) + : maKey(aKey), mnPriorityInClass(nPriority), meClass(eClass) + {} + /** Sort requests according to priority classes and then to priorities. + */ + class Comparator { public: + bool operator() (const Request& rRequest1, const Request& rRequest2) + const + { + if (rRequest1.meClass == rRequest2.meClass) + { + if (rRequest1.mnPriorityInClass == rRequest2.mnPriorityInClass) + { + return rRequest1.maKey < rRequest2.maKey; + } + return rRequest1.mnPriorityInClass > rRequest2.mnPriorityInClass; + } + return rRequest1.meClass < rRequest2.meClass; + } + }; + /** Request data is compared arbitrarily by their addresses in memory. + This just establishes an order so that the STL containers are happy. + The order is not semantically interpreted. + */ + class DataComparator + { + public: + explicit DataComparator (const CacheKey aKey) + : maKey(aKey) + { + } + bool operator() (const Request& rRequest) const + { + return maKey == rRequest.maKey; + } + private: + const CacheKey maKey; + }; + + CacheKey maKey; + sal_Int32 mnPriorityInClass; + RequestPriorityClass meClass; +}; + +} + +class RequestQueue::Container + : public ::std::set< + Request, + Request::Comparator> +{ +}; + +//===== GenericRequestQueue ================================================= + +RequestQueue::RequestQueue (SharedCacheContext pCacheContext) + : mpRequestQueue(new Container), + mpCacheContext(std::move(pCacheContext)), + mnMinimumPriority(0), + mnMaximumPriority(1) +{ +} + +RequestQueue::~RequestQueue() +{ + Clear(); +} + +void RequestQueue::AddRequest ( + CacheKey aKey, + RequestPriorityClass eRequestClass) +{ + ::osl::MutexGuard aGuard (maMutex); + + assert(eRequestClass>=MIN_CLASS && eRequestClass<=MAX_CLASS); + + // If the request is already a member of the queue then remove it so + // that the following insertion will use the new prioritization. +#if OSL_DEBUG_LEVEL >=2 + bool bRemoved = +#endif + RemoveRequest(aKey); + + // The priority of the request inside its priority class is defined by + // the page number. This ensures a strict top-to-bottom, left-to-right + // order. + sal_Int32 nPriority (mpCacheContext->GetPriority(aKey)); + Request aRequest (aKey, nPriority, eRequestClass); + + std::pair ret = mpRequestQueue->insert(aRequest); + bool bInserted = ret.second; + + if (bInserted) + { + SdrPage *pPage = const_cast(aRequest.maKey); + pPage->AddPageUser(*this); + } + +#if OSL_DEBUG_LEVEL >=2 + SAL_INFO("sd.sls", __func__ << ": " << (bRemoved?"replaced":"added") + << " request for page " << ((aKey->GetPageNum()-1)/2) + << " with priority class " << static_cast(eRequestClass)); +#endif +} + +void RequestQueue::PageInDestruction(const SdrPage& rPage) +{ + //remove any requests pending for this page which is going away now + RemoveRequest(&rPage); +} + +#if OSL_DEBUG_LEVEL >=2 +bool +#else +void +#endif +RequestQueue::RemoveRequest( + CacheKey aKey) +{ + ::osl::MutexGuard aGuard (maMutex); +#if OSL_DEBUG_LEVEL >=2 + bool bIsRemoved = false; +#endif + while(true) + { + Container::const_iterator aRequestIterator = ::std::find_if ( + mpRequestQueue->begin(), + mpRequestQueue->end(), + Request::DataComparator(aKey)); + if (aRequestIterator != mpRequestQueue->end()) + { + if (aRequestIterator->mnPriorityInClass == mnMinimumPriority+1) + mnMinimumPriority++; + else if (aRequestIterator->mnPriorityInClass == mnMaximumPriority-1) + mnMaximumPriority--; + + SdrPage *pPage = const_cast(aRequestIterator->maKey); + pPage->RemovePageUser(*this); + mpRequestQueue->erase(aRequestIterator); +#if OSL_DEBUG_LEVEL >=2 + bIsRemoved = true; +#endif + } + else + break; + } +#if OSL_DEBUG_LEVEL >=2 + return bIsRemoved; +#endif + +} + +void RequestQueue::ChangeClass ( + CacheKey aKey, + RequestPriorityClass eNewRequestClass) +{ + ::osl::MutexGuard aGuard (maMutex); + + assert(eNewRequestClass>=MIN_CLASS && eNewRequestClass<=MAX_CLASS); + + Container::const_iterator iRequest ( + ::std::find_if ( + mpRequestQueue->begin(), + mpRequestQueue->end(), + Request::DataComparator(aKey))); + if (iRequest!=mpRequestQueue->end() && iRequest->meClass!=eNewRequestClass) + { + AddRequest(aKey, eNewRequestClass); + } +} + +CacheKey RequestQueue::GetFront() +{ + ::osl::MutexGuard aGuard (maMutex); + + if (mpRequestQueue->empty()) + throw css::uno::RuntimeException("RequestQueue::GetFront(): queue is empty", + nullptr); + + return mpRequestQueue->begin()->maKey; +} + +RequestPriorityClass RequestQueue::GetFrontPriorityClass() +{ + ::osl::MutexGuard aGuard (maMutex); + + if (mpRequestQueue->empty()) + throw css::uno::RuntimeException("RequestQueue::GetFrontPriorityClass(): queue is empty", + nullptr); + + return mpRequestQueue->begin()->meClass; +} + +void RequestQueue::PopFront() +{ + ::osl::MutexGuard aGuard (maMutex); + + if ( mpRequestQueue->empty()) + return; + + Container::const_iterator aIter(mpRequestQueue->begin()); + SdrPage *pPage = const_cast(aIter->maKey); + pPage->RemovePageUser(*this); + mpRequestQueue->erase(aIter); + + // Reset the priority counter if possible. + if (mpRequestQueue->empty()) + { + mnMinimumPriority = 0; + mnMaximumPriority = 1; + } +} + +bool RequestQueue::IsEmpty() +{ + ::osl::MutexGuard aGuard (maMutex); + return mpRequestQueue->empty(); +} + +void RequestQueue::Clear() +{ + ::osl::MutexGuard aGuard (maMutex); + + for (const auto& rItem : *mpRequestQueue) + { + SdrPage *pPage = const_cast(rItem.maKey); + pPage->RemovePageUser(*this); + } + + mpRequestQueue->clear(); + mnMinimumPriority = 0; + mnMaximumPriority = 1; +} + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx new file mode 100644 index 0000000000..d9a94c862f --- /dev/null +++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx @@ -0,0 +1,122 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include "SlsRequestPriorityClass.hxx" +#include +#include +#include + +#include + +namespace sd::slidesorter::cache +{ +/** The request queue stores requests that are described by the Request + sorted according to priority class and then priority. +*/ +class RequestQueue : public sdr::PageUser +{ +public: + explicit RequestQueue(SharedCacheContext pCacheContext); + virtual ~RequestQueue(); + + /** Insert a request with highest or lowest priority in its priority + class. When the request is already present then it is first + removed. This effect is then a re-prioritization. + @param aKey + The request. + @param eRequestClass + The priority class in which to insert the request with highest + or lowest priority. + @param bInsertWithHighestPriority + When this flag is the request is inserted with highest + priority in its class. When the request is inserted + with lowest priority. + */ + void AddRequest(CacheKey aKey, RequestPriorityClass eRequestClass); + + /** Remove the specified request from the queue. + @param aKey + It is OK when the specified request is not a member of the + queue. + */ +#if OSL_DEBUG_LEVEL >= 2 + bool +#else + void +#endif + RemoveRequest(CacheKey aKey); + + /** Change the priority class of the specified request. + */ + void ChangeClass(CacheKey aKey, RequestPriorityClass eNewRequestClass); + + /** Get the request with the highest priority int the highest priority class. + */ + CacheKey GetFront(); + + // For debugging. + RequestPriorityClass GetFrontPriorityClass(); + + /** Really a synonym for RemoveRequest(GetFront()); + */ + void PopFront(); + + /** Returns when there is no element in the queue. + */ + bool IsEmpty(); + + /** Remove all requests from the queue. This resets the minimum and + maximum priorities to their default values. + */ + void Clear(); + + /** Return the mutex that guards the access to the priority queue. + */ + ::osl::Mutex& GetMutex() { return maMutex; } + + /** Ensure we don't hand out a page deleted before anyone got a + chance to process it + */ + virtual void PageInDestruction(const SdrPage& rPage) override; + +private: + ::osl::Mutex maMutex; + class Container; + std::unique_ptr mpRequestQueue; + SharedCacheContext mpCacheContext; + + /** A lower bound of the lowest priority of all elements in the queues. + The start value is 0. It is assigned and then decreased every time + when an element is inserted or marked as the request with lowest + priority. + */ + int mnMinimumPriority; + /** An upper bound of the highest priority of all elements in the queues. + The start value is 1. It is assigned and then increased every time + when an element is inserted or marked as the request with highest + priority. + */ + int mnMaximumPriority; +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx new file mode 100644 index 0000000000..4a0328e3d4 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx @@ -0,0 +1,910 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include "SlsListener.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::sd::slidesorter::model; +using namespace ::sd::slidesorter::view; +using namespace ::sd::slidesorter::controller; +using namespace ::basegfx; + +namespace sd::slidesorter::controller { + +SlideSorterController::SlideSorterController (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mrModel(mrSlideSorter.GetModel()), + mrView(mrSlideSorter.GetView()), + mpInsertionIndicatorHandler(std::make_shared(rSlideSorter)), + mpAnimator(std::make_shared(rSlideSorter)), + mpVisibleAreaManager(new VisibleAreaManager(rSlideSorter)), + mnModelChangeLockCount(0), + mbIsForcedRearrangePending(false), + mbContextMenuOpen(false), + mbPostModelChangePending(false), + mnCurrentPageBeforeSwitch(0), + mpEditModeChangeMasterPage(nullptr), + mnPaintEntranceCount(0) +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + OSL_ASSERT(pWindow); + if (!pWindow) + return; + + // The whole background is painted by the view and controls. + vcl::Window* pParentWindow = pWindow->GetParent(); + OSL_ASSERT(pParentWindow!=nullptr); + pParentWindow->SetBackground (Wallpaper()); + + // Connect the view with the window that has been created by our base + // class. + pWindow->SetBackground(Wallpaper()); + pWindow->SetCenterAllowed(false); + pWindow->SetMapMode(MapMode(MapUnit::MapPixel)); + pWindow->SetViewSize(mrView.GetModelArea().GetSize()); +} + +void SlideSorterController::Init() +{ + mpCurrentSlideManager = std::make_shared(mrSlideSorter); + mpPageSelector.reset(new PageSelector(mrSlideSorter)); + mpFocusManager.reset(new FocusManager(mrSlideSorter)); + mpSlotManager = std::make_shared(mrSlideSorter); + mpScrollBarManager.reset(new ScrollBarManager(mrSlideSorter)); + mpSelectionManager = std::make_shared(mrSlideSorter); + mpClipboard.reset(new Clipboard(mrSlideSorter)); + + // Create the selection function. + SfxRequest aRequest ( + SID_OBJECT_SELECT, + SfxCallMode::SLOT, + mrModel.GetDocument()->GetItemPool()); + mrSlideSorter.SetCurrentFunction(CreateSelectionFunction(aRequest)); + + mpListener = new Listener(mrSlideSorter); + + mpPageSelector->GetCoreSelection(); + GetSelectionManager()->SelectionHasChanged(); +} + +SlideSorterController::~SlideSorterController() +{ + try + { + uno::Reference xComponent = mpListener; + if (xComponent.is()) + xComponent->dispose(); + } + catch( uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideSorterController::~SlideSorterController()" ); + } + + // dispose should have been called by now so that nothing is to be done + // to shut down cleanly. +} + +void SlideSorterController::Dispose() +{ + mpInsertionIndicatorHandler->End(Animator::AM_Immediate); + mpClipboard.reset(); + mpSelectionManager.reset(); + mpAnimator->Dispose(); +} + +model::SharedPageDescriptor SlideSorterController::GetPageAt ( + const Point& aWindowPosition) +{ + sal_Int32 nHitPageIndex (mrView.GetPageIndexAtPoint(aWindowPosition)); + model::SharedPageDescriptor pDescriptorAtPoint; + if (nHitPageIndex >= 0) + { + pDescriptorAtPoint = mrModel.GetPageDescriptor(nHitPageIndex); + + // Depending on a property we may have to check that the mouse is no + // just over the page object but over the preview area. + if (pDescriptorAtPoint + && ! pDescriptorAtPoint->HasState(PageDescriptor::ST_Selected)) + { + // Make sure that the mouse is over the preview area. + if ( ! mrView.GetLayouter().GetPageObjectLayouter()->GetBoundingBox( + pDescriptorAtPoint, + view::PageObjectLayouter::Part::Preview, + view::PageObjectLayouter::WindowCoordinateSystem).Contains(aWindowPosition)) + { + pDescriptorAtPoint.reset(); + } + } + } + + return pDescriptorAtPoint; +} + +PageSelector& SlideSorterController::GetPageSelector() +{ + OSL_ASSERT(mpPageSelector != nullptr); + return *mpPageSelector; +} + +FocusManager& SlideSorterController::GetFocusManager() +{ + OSL_ASSERT(mpFocusManager != nullptr); + return *mpFocusManager; +} + +Clipboard& SlideSorterController::GetClipboard() +{ + OSL_ASSERT(mpClipboard != nullptr); + return *mpClipboard; +} + +ScrollBarManager& SlideSorterController::GetScrollBarManager() +{ + OSL_ASSERT(mpScrollBarManager != nullptr); + return *mpScrollBarManager; +} + +std::shared_ptr const & SlideSorterController::GetCurrentSlideManager() const +{ + OSL_ASSERT(mpCurrentSlideManager != nullptr); + return mpCurrentSlideManager; +} + +std::shared_ptr const & SlideSorterController::GetSlotManager() const +{ + OSL_ASSERT(mpSlotManager != nullptr); + return mpSlotManager; +} + +std::shared_ptr const & SlideSorterController::GetSelectionManager() const +{ + OSL_ASSERT(mpSelectionManager != nullptr); + return mpSelectionManager; +} + +std::shared_ptr const & + SlideSorterController::GetInsertionIndicatorHandler() const +{ + OSL_ASSERT(mpInsertionIndicatorHandler != nullptr); + return mpInsertionIndicatorHandler; +} + +void SlideSorterController::Paint ( + const ::tools::Rectangle& rBBox, + vcl::Window* pWindow) +{ + if (mnPaintEntranceCount != 0) + return; + + ++mnPaintEntranceCount; + + try + { + mrView.CompleteRedraw(pWindow->GetOutDev(), vcl::Region(rBBox)); + } + catch (const Exception&) + { + // Ignore all exceptions. + } + + --mnPaintEntranceCount; +} + +void SlideSorterController::FuTemporary (SfxRequest& rRequest) +{ + mpSlotManager->FuTemporary (rRequest); +} + +void SlideSorterController::FuPermanent (SfxRequest &rRequest) +{ + mpSlotManager->FuPermanent (rRequest); +} + +void SlideSorterController::FuSupport (SfxRequest &rRequest) +{ + mpSlotManager->FuSupport (rRequest); +} + +bool SlideSorterController::Command ( + const CommandEvent& rEvent, + ::sd::Window* pWindow) +{ + bool bEventHasBeenHandled = false; + + if (pWindow == nullptr) + return false; + + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell == nullptr) + return false; + + switch (rEvent.GetCommand()) + { + case CommandEventId::ContextMenu: + { + SdPage* pPage = nullptr; + OUString aPopupId; + + model::PageEnumeration aSelectedPages ( + PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel)); + if (aSelectedPages.HasMoreElements()) + pPage = aSelectedPages.GetNextElement()->GetPage(); + + if (mrModel.GetEditMode() == EditMode::Page) + { + if (pPage != nullptr) + aPopupId = "pagepane"; + else + aPopupId = "pagepanenosel"; + } + else if (pPage != nullptr) + aPopupId = "pagepanemaster"; + else + aPopupId = "pagepanenoselmaster"; + + std::unique_ptr> xContext; + if (pPage == nullptr) + { + // When there is no selection, then we show the insertion + // indicator so that the user knows where a page insertion + // would take place. + mpInsertionIndicatorHandler->Start(false); + mpInsertionIndicatorHandler->UpdateIndicatorIcon(SD_MOD()->pTransferClip); + mpInsertionIndicatorHandler->UpdatePosition( + pWindow->PixelToLogic(rEvent.GetMousePosPixel()), + InsertionIndicatorHandler::MoveMode); + xContext.reset(new InsertionIndicatorHandler::ForceShowContext( + mpInsertionIndicatorHandler)); + } + + pWindow->ReleaseMouse(); + + Point aMenuLocation (0,0); + if (!rEvent.IsMouseEvent()) + { + // The event is not a mouse event. Use the center of the + // focused page as top left position of the context menu. + model::SharedPageDescriptor pDescriptor ( + GetFocusManager().GetFocusedPageDescriptor()); + if (pDescriptor) + { + ::tools::Rectangle aBBox ( + mrView.GetLayouter().GetPageObjectLayouter()->GetBoundingBox ( + pDescriptor, + PageObjectLayouter::Part::PageObject, + PageObjectLayouter::ModelCoordinateSystem)); + aMenuLocation = aBBox.Center(); + } + } + + if (SfxDispatcher* pDispatcher = pViewShell->GetDispatcher()) + { + mbContextMenuOpen = true; + if (!rEvent.IsMouseEvent()) + pDispatcher->ExecutePopup(aPopupId, pWindow, &aMenuLocation); + else + pDispatcher->ExecutePopup(aPopupId, pWindow); + mbContextMenuOpen = false; + mrSlideSorter.GetView().UpdatePageUnderMouse(); + ::rtl::Reference pFunction(GetCurrentSelectionFunction()); + if (pFunction.is()) + pFunction->ResetMouseAnchor(); + } + if (pPage == nullptr) + { + // Remember the position of the insertion indicator before + // it is hidden, so that a pending slide insertion slot call + // finds the right place to insert a new slide. + GetSelectionManager()->SetInsertionPosition( + GetInsertionIndicatorHandler()->GetInsertionPageIndex()); + } + xContext.reset(); + bEventHasBeenHandled = true; + } + break; + + case CommandEventId::Wheel: + { + const CommandWheelData* pData = rEvent.GetWheelData(); + if (pData == nullptr) + return false; + if (pData->IsMod1()) + { + // We do not support zooming with control+mouse wheel. + return false; + } + // Determine whether to scroll horizontally or vertically. This + // depends on the orientation of the scroll bar and the + // IsHoriz() flag of the event. + if ((mrSlideSorter.GetView().GetOrientation()==view::Layouter::HORIZONTAL) + == pData->IsHorz()) + { + GetScrollBarManager().Scroll( + ScrollBarManager::Orientation_Vertical, + -pData->GetNotchDelta()); + } + else + { + GetScrollBarManager().Scroll( + ScrollBarManager::Orientation_Horizontal, + -pData->GetNotchDelta()); + } + mrSlideSorter.GetView().UpdatePageUnderMouse(rEvent.GetMousePosPixel()); + + bEventHasBeenHandled = true; + } + break; + + default: break; + } + + return bEventHasBeenHandled; +} + +void SlideSorterController::LockModelChange() +{ + mnModelChangeLockCount += 1; +} + +void SlideSorterController::UnlockModelChange() +{ + mnModelChangeLockCount -= 1; + if (mnModelChangeLockCount==0 && mbPostModelChangePending) + { + PostModelChange(); + } +} + +void SlideSorterController::PreModelChange() +{ + // Prevent PreModelChange to execute more than once per model lock. + if (mbPostModelChangePending) + return; + + if (mrSlideSorter.GetViewShell() != nullptr) + mrSlideSorter.GetViewShell()->Broadcast( + ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START)); + + GetCurrentSlideManager()->PrepareModelChange(); + + if (mrSlideSorter.GetContentWindow()) + mrView.PreModelChange(); + + mbPostModelChangePending = true; +} + +void SlideSorterController::PostModelChange() +{ + mbPostModelChangePending = false; + mrModel.Resync(); + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow) + { + GetCurrentSlideManager()->HandleModelChange(); + + mrView.PostModelChange (); + + pWindow->SetViewOrigin (Point (0,0)); + pWindow->SetViewSize (mrView.GetModelArea().GetSize()); + + // The visibility of the scroll bars may have to be changed. Then + // the size of the view has to change, too. Let Rearrange() handle + // that. + Rearrange(mbIsForcedRearrangePending); + } + + if (mrSlideSorter.GetViewShell() != nullptr) + mrSlideSorter.GetViewShell()->Broadcast( + ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END)); +} + +void SlideSorterController::HandleModelChange() +{ + // Ignore this call when the document is not in a valid state, i.e. has + // not the same number of regular and notes pages. + bool bIsDocumentValid = (mrModel.GetDocument()->GetPageCount() % 2 == 1); + + if (bIsDocumentValid) + { + ModelChangeLock aLock (*this); + PreModelChange(); + } +} + +IMPL_LINK(SlideSorterController, ApplicationEventHandler, VclSimpleEvent&, rEvent, void) +{ + auto windowEvent = dynamic_cast(&rEvent); + if (windowEvent != nullptr) { + WindowEventHandler(*windowEvent); + } +} +IMPL_LINK(SlideSorterController, WindowEventHandler, VclWindowEvent&, rEvent, void) +{ + vcl::Window* pWindow = rEvent.GetWindow(); + sd::Window *pActiveWindow (mrSlideSorter.GetContentWindow().get()); + switch (rEvent.GetId()) + { + case VclEventId::WindowActivate: + case VclEventId::WindowShow: + if (pActiveWindow && pWindow == pActiveWindow->GetParent()) + mrView.RequestRepaint(); + break; + + case VclEventId::WindowHide: + if (pActiveWindow && pWindow == pActiveWindow->GetParent()) + mrView.SetPageUnderMouse(SharedPageDescriptor()); + break; + + case VclEventId::WindowGetFocus: + if (pActiveWindow) + if (pWindow == pActiveWindow) + GetFocusManager().ShowFocus(false); + break; + + case VclEventId::WindowLoseFocus: + if (pActiveWindow && pWindow == pActiveWindow) + { + GetFocusManager().HideFocus(); + mrView.GetToolTip().Hide(); + + //don't scroll back to the selected slide when we lose + //focus due to a temporary active context menu + if (!mbContextMenuOpen) + { + // Select the current slide so that it is properly + // visualized when the focus is moved to the edit view. + GetPageSelector().SelectPage(GetCurrentSlideManager()->GetCurrentSlide()); + } + } + break; + + case VclEventId::ApplicationDataChanged: + { + // Invalidate the preview cache. + cache::PageCacheManager::Instance()->InvalidateAllCaches(); + + // Update the draw mode. + DrawModeFlags nDrawMode (Application::GetSettings().GetStyleSettings().GetHighContrastMode() + ? sd::OUTPUT_DRAWMODE_CONTRAST + : sd::OUTPUT_DRAWMODE_COLOR); + if (mrSlideSorter.GetViewShell() != nullptr) + mrSlideSorter.GetViewShell()->GetFrameView()->SetDrawMode(nDrawMode); + if (pActiveWindow != nullptr) + pActiveWindow->GetOutDev()->SetDrawMode(nDrawMode); + mrView.HandleDrawModeChange(); + + // When the system font has changed a layout has to be done. + mrView.Resize(); + + // Update theme colors. + mrSlideSorter.GetProperties()->HandleDataChangeEvent(); + mrSlideSorter.GetTheme()->Update(mrSlideSorter.GetProperties()); + mrView.HandleDataChangeEvent(); + } + break; + + default: + break; + } +} + +void SlideSorterController::GetCtrlState (SfxItemSet& rSet) +{ + if (rSet.GetItemState(SID_RELOAD) != SfxItemState::UNKNOWN) + { + // let SFx en-/disable "last version" + SfxViewFrame* pSlideViewFrame = SfxViewFrame::Current(); + DBG_ASSERT(pSlideViewFrame!=nullptr, + "SlideSorterController::GetCtrlState: ViewFrame not found"); + if (pSlideViewFrame) + { + pSlideViewFrame->GetSlotState (SID_RELOAD, nullptr, &rSet); + } + else // MI says: no MDIFrame --> disable + { + rSet.DisableItem(SID_RELOAD); + } + } + + // Output quality. + if (rSet.GetItemState(SID_OUTPUT_QUALITY_COLOR)==SfxItemState::DEFAULT + ||rSet.GetItemState(SID_OUTPUT_QUALITY_GRAYSCALE)==SfxItemState::DEFAULT + ||rSet.GetItemState(SID_OUTPUT_QUALITY_BLACKWHITE)==SfxItemState::DEFAULT + ||rSet.GetItemState(SID_OUTPUT_QUALITY_CONTRAST)==SfxItemState::DEFAULT) + { + if (mrSlideSorter.GetContentWindow()) + { + DrawModeFlags nMode = mrSlideSorter.GetContentWindow()->GetOutDev()->GetDrawMode(); + sal_uInt16 nQuality = 0; + + if (nMode == sd::OUTPUT_DRAWMODE_COLOR) { + nQuality = 0; + } else if (nMode == sd::OUTPUT_DRAWMODE_GRAYSCALE) { + nQuality = 1; + } else if (nMode == sd::OUTPUT_DRAWMODE_BLACKWHITE) { + nQuality = 2; + } else if (nMode == sd::OUTPUT_DRAWMODE_CONTRAST) { + nQuality = 3; + } + + rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_COLOR, nQuality==0)); + rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_GRAYSCALE, nQuality==1)); + rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_BLACKWHITE, nQuality==2)); + rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_CONTRAST, nQuality==3)); + } + } + + if (rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) == SfxItemState::DEFAULT) + { + rSet.Put (SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, true)); + } +} + +void SlideSorterController::GetStatusBarState (SfxItemSet& rSet) +{ + mpSlotManager->GetStatusBarState (rSet); +} + +void SlideSorterController::ExecCtrl (SfxRequest& rRequest) +{ + mpSlotManager->ExecCtrl (rRequest); +} + +void SlideSorterController::GetAttrState (SfxItemSet& rSet) +{ + mpSlotManager->GetAttrState (rSet); +} + +void SlideSorterController::UpdateAllPages() +{ + // Do a redraw. + mrSlideSorter.GetContentWindow()->Invalidate(); +} + +void SlideSorterController::Resize (const ::tools::Rectangle& rAvailableSpace) +{ + if (maTotalWindowArea != rAvailableSpace) + { + maTotalWindowArea = rAvailableSpace; + Rearrange(true); + } +} + +void SlideSorterController::Rearrange (bool bForce) +{ + if (maTotalWindowArea.IsEmpty()) + return; + + if (mnModelChangeLockCount>0) + { + mbIsForcedRearrangePending |= bForce; + return; + } + else + mbIsForcedRearrangePending = false; + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (!pWindow) + return; + + if (bForce) + mrView.UpdateOrientation(); + + // Place the scroll bars. + ::tools::Rectangle aNewContentArea = GetScrollBarManager().PlaceScrollBars( + maTotalWindowArea, + mrView.GetOrientation() != view::Layouter::VERTICAL, + mrView.GetOrientation() != view::Layouter::HORIZONTAL); + + bool bSizeHasChanged (false); + // Only when bForce is not true we have to test for a size change in + // order to determine whether the window and the view have to be resized. + if ( ! bForce) + { + ::tools::Rectangle aCurrentContentArea (pWindow->GetPosPixel(), pWindow->GetOutputSizePixel()); + bSizeHasChanged = (aNewContentArea != aCurrentContentArea); + } + if (bForce || bSizeHasChanged) + { + // The browser window gets the remaining space. + pWindow->SetPosSizePixel (aNewContentArea.TopLeft(), aNewContentArea.GetSize()); + mrView.Resize(); + } + + // Adapt the scroll bars to the new zoom factor of the browser + // window and the arrangement of the page objects. + GetScrollBarManager().UpdateScrollBars(!bForce); + + // Keep the current slide in the visible area. + GetVisibleAreaManager().RequestCurrentSlideVisible(); + + mrView.RequestRepaint(); +} + +rtl::Reference SlideSorterController::CreateSelectionFunction (SfxRequest& rRequest) +{ + rtl::Reference xFunc( SelectionFunction::Create(mrSlideSorter, rRequest) ); + return xFunc; +} + +::rtl::Reference SlideSorterController::GetCurrentSelectionFunction() const +{ + rtl::Reference pFunction (mrSlideSorter.GetViewShell()->GetCurrentFunction()); + return ::rtl::Reference(dynamic_cast(pFunction.get())); +} + +void SlideSorterController::PrepareEditModeChange() +{ + // Before we throw away the page descriptors we prepare for selecting + // descriptors in the other mode and for restoring the current + // selection when switching back to the current mode. + if (mrModel.GetEditMode() != EditMode::Page) + return; + + maSelectionBeforeSwitch.clear(); + + // Search for the first selected page and determine the master page + // used by its page object. It will be selected after the switch. + // In the same loop the current selection is stored. + PageEnumeration aSelectedPages ( + PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel)); + while (aSelectedPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + SdPage* pPage = pDescriptor->GetPage(); + // Remember the master page of the first selected descriptor. + if (pPage!=nullptr && mpEditModeChangeMasterPage==nullptr) + mpEditModeChangeMasterPage = &static_cast( + pPage->TRG_GetMasterPage()); + + maSelectionBeforeSwitch.push_back(pPage); + } + + // Remember the current page. + if (mrSlideSorter.GetViewShell() != nullptr) + mnCurrentPageBeforeSwitch = (mrSlideSorter.GetViewShell()->GetViewShellBase() + .GetMainViewShell()->GetActualPage()->GetPageNum()-1)/2; +} + +void SlideSorterController::ChangeEditMode (EditMode eEditMode) +{ + if (mrModel.GetEditMode() != eEditMode) + { + ModelChangeLock aLock (*this); + PreModelChange(); + // Do the actual edit mode switching. + bool bResult = mrModel.SetEditMode(eEditMode); + if (bResult) + HandleModelChange(); + } +} + +void SlideSorterController::FinishEditModeChange() +{ + if (mrModel.GetEditMode() == EditMode::MasterPage) + { + mpPageSelector->DeselectAllPages(); + + // Search for the master page that was determined in + // PrepareEditModeChange() and make it the current page. + PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + while (aAllPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + if (pDescriptor->GetPage() == mpEditModeChangeMasterPage) + { + GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor); + mpPageSelector->SelectPage(pDescriptor); + break; + } + } + } + else + { + PageSelector::BroadcastLock aBroadcastLock (*mpPageSelector); + + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnCurrentPageBeforeSwitch)); + GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor); + + // Restore the selection. + mpPageSelector->DeselectAllPages(); + for (const auto& rpPage : maSelectionBeforeSwitch) + { + mpPageSelector->SelectPage(rpPage); + } + maSelectionBeforeSwitch.clear( ); + } + mpEditModeChangeMasterPage = nullptr; +} + +void SlideSorterController::PageNameHasChanged (int nPageIndex, const OUString& rsOldName) +{ + // Request a repaint for the page object whose name has changed. + model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor) + mrView.RequestRepaint(pDescriptor); + + // Get a pointer to the corresponding accessible object and notify + // that of the name change. + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if ( ! pWindow) + return; + + css::uno::Reference< css::accessibility::XAccessible > + xAccessible (pWindow->GetAccessible(false)); + if ( ! xAccessible.is()) + return; + + // Now comes a small hack. We assume that the accessible object is + // an instantiation of AccessibleSlideSorterView and cast it to that + // class. The cleaner alternative to this cast would be a new member + // in which we would store the last AccessibleSlideSorterView object + // created by SlideSorterViewShell::CreateAccessibleDocumentView(). + // But then there is no guaranty that the accessible object obtained + // from the window really is that instance last created by + // CreateAccessibleDocumentView(). + // However, the dynamic cast together with the check of the result + // being NULL should be safe enough. + ::accessibility::AccessibleSlideSorterView* pAccessibleView + = dynamic_cast< ::accessibility::AccessibleSlideSorterView*>(xAccessible.get()); + if (pAccessibleView == nullptr) + return; + + ::accessibility::AccessibleSlideSorterObject* pChild + = pAccessibleView->GetAccessibleChildImplementation(nPageIndex); + if (pChild == nullptr || pChild->GetPage() == nullptr) + return; + + OUString sNewName (pChild->GetPage()->GetName()); + pChild->FireAccessibleEvent( + css::accessibility::AccessibleEventId::NAME_CHANGED, + Any(rsOldName), + Any(sNewName)); +} + +void SlideSorterController::SetDocumentSlides (const Reference& rxSlides) +{ + if (mrModel.GetDocumentSlides() != rxSlides) + { + ModelChangeLock aLock (*this); + PreModelChange(); + + mrModel.SetDocumentSlides(rxSlides); + } +} + +VisibleAreaManager& SlideSorterController::GetVisibleAreaManager() const +{ + OSL_ASSERT(mpVisibleAreaManager); + return *mpVisibleAreaManager; +} + +void SlideSorterController::CheckForMasterPageAssignment() +{ + if (mrModel.GetPageCount()%2==0) + return; + PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + while (aAllPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + if (pDescriptor->UpdateMasterPage()) + { + mrView.GetPreviewCache()->InvalidatePreviewBitmap ( + pDescriptor->GetPage()); + } + } +} + +void SlideSorterController::CheckForSlideTransitionAssignment() +{ + if (mrModel.GetPageCount()%2==0) + return; + PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + while (aAllPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + if (pDescriptor->UpdateTransitionFlag()) + { + mrView.GetPreviewCache()->InvalidatePreviewBitmap ( + pDescriptor->GetPage()); + } + } +} + +//===== SlideSorterController::ModelChangeLock ================================ + +SlideSorterController::ModelChangeLock::ModelChangeLock ( + SlideSorterController& rController) + : mpController(&rController) +{ + mpController->LockModelChange(); +} + +SlideSorterController::ModelChangeLock::~ModelChangeLock() COVERITY_NOEXCEPT_FALSE +{ + Release(); +} + +void SlideSorterController::ModelChangeLock::Release() +{ + if (mpController != nullptr) + { + mpController->UnlockModelChange(); + mpController = nullptr; + } +} + +} // end of namespace ::sd::slidesorter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx b/sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx new file mode 100644 index 0000000000..31978baf71 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx @@ -0,0 +1,129 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include + +namespace sd::slidesorter::controller { + +//===== AnimationBezierFunction =============================================== + +AnimationBezierFunction::AnimationBezierFunction ( + const double nX1, + const double nY1) + : mnX1(nX1), + mnY1(nY1), + mnX2(1-nY1), + mnY2(1-nX1) +{ +} + +::basegfx::B2DPoint AnimationBezierFunction::operator() (const double nT) +{ + return ::basegfx::B2DPoint( + EvaluateComponent(nT, mnX1, mnX2), + EvaluateComponent(nT, mnY1, mnY2)); +} + +double AnimationBezierFunction::EvaluateComponent ( + const double nT, + const double nV1, + const double nV2) +{ + const double nS (1-nT); + + // While the control point values 1 and 2 are explicitly given the start + // and end values are implicitly given. + const double nV0 (0); + const double nV3 (1); + + const double nV01 (nS*nV0 + nT*nV1); + const double nV12 (nS*nV1 + nT*nV2); + const double nV23 (nS*nV2 + nT*nV3); + + const double nV012 (nS*nV01 + nT*nV12); + const double nV123 (nS*nV12 + nT*nV23); + + const double nV0123 (nS*nV012 + nT*nV123); + + return nV0123; +} + +//===== AnimationParametricFunction =========================================== + +AnimationParametricFunction::AnimationParametricFunction (const ParametricFunction& rFunction) +{ + const sal_Int32 nSampleCount (64); + + // Sample the given parametric function. + ::std::vector aPoints; + aPoints.reserve(nSampleCount); + for (sal_Int32 nIndex=0; nIndex nX1 && nIndex(nX * maY.size())); + const double nX0 (nIndex0 / double(maY.size()-1)); + const sal_uInt32 nIndex1 (nIndex0 + 1); + const double nX1 (nIndex1 / double(maY.size()-1)); + + if (nIndex0<=0) + return maY[0]; + else if (o3tl::make_unsigned(nIndex0)>=maY.size() || nIndex1>=maY.size()) + return maY[maY.size()-1]; + + const double nU ((nX-nX1) / (nX0 - nX1)); + return maY[nIndex0]*nU + maY[nIndex1]*(1-nU); +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsAnimator.cxx b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx new file mode 100644 index 0000000000..eb04eceb78 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx @@ -0,0 +1,281 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +namespace sd::slidesorter::controller { + +/** Handle one animation function by using a timer for frequent calls to + the animations operator(). +*/ +class Animator::Animation +{ +public: + Animation ( + Animator::AnimationFunctor aAnimation, + const double nStartOffset, + const double nDuration, + const double nGlobalTime, + const Animator::AnimationId nAnimationId, + Animator::FinishFunctor aFinishFunctor); + /** Run next animation step. If animation has reached its end it is + expired. + */ + bool Run (const double nGlobalTime); + + /** Typically called when an animation has finished, but also from + Animator::Disposed(). The finish functor is called and the + animation is marked as expired to prevent another run. + */ + void Expire(); + bool IsExpired() const { return mbIsExpired;} + + Animator::AnimationFunctor maAnimation; + Animator::FinishFunctor maFinishFunctor; + const Animator::AnimationId mnAnimationId; + const double mnDuration; + const double mnEnd; + const double mnGlobalTimeAtStart; + bool mbIsExpired; +}; + +Animator::Animator (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + maIdle("sd slidesorter controller Animator"), + mbIsDisposed(false), + mnNextAnimationId(0) +{ + maIdle.SetPriority(TaskPriority::REPAINT); + maIdle.SetInvokeHandler(LINK(this,Animator,TimeoutHandler)); +} + +Animator::~Animator() +{ + if ( ! mbIsDisposed) + { + OSL_ASSERT(mbIsDisposed); + Dispose(); + } +} + +void Animator::Dispose() +{ + mbIsDisposed = true; + + AnimationList aCopy (maAnimations); + for (const auto& rxAnimation : aCopy) + rxAnimation->Expire(); + + maIdle.Stop(); + if (mpDrawLock) + { + mpDrawLock->Dispose(); + mpDrawLock.reset(); + } +} + +Animator::AnimationId Animator::AddAnimation ( + const AnimationFunctor& rAnimation, + const FinishFunctor& rFinishFunctor) +{ + // When the animator is already disposed then ignore this call + // silently (well, we show an assertion, but do not throw an exception.) + OSL_ASSERT( ! mbIsDisposed); + if (mbIsDisposed) + return -1; + + std::shared_ptr pAnimation = + std::make_shared( + rAnimation, + 0, + 300 / 1000.0, + maElapsedTime.getElapsedTime(), + ++mnNextAnimationId, + rFinishFunctor); + maAnimations.push_back(pAnimation); + + RequestNextFrame(); + + return pAnimation->mnAnimationId; +} + +void Animator::RemoveAnimation (const Animator::AnimationId nId) +{ + OSL_ASSERT( ! mbIsDisposed); + + const AnimationList::iterator iAnimation (::std::find_if( + maAnimations.begin(), + maAnimations.end(), + [nId] (std::shared_ptr const& pAnim) + { return nId == pAnim->mnAnimationId; })); + if (iAnimation != maAnimations.end()) + { + OSL_ASSERT((*iAnimation)->mnAnimationId == nId); + (*iAnimation)->Expire(); + maAnimations.erase(iAnimation); + } + + if (maAnimations.empty()) + { + // Reset the animation id when we can. + mnNextAnimationId = 0; + + // No more animations => we do not have to suppress painting + // anymore. + mpDrawLock.reset(); + } +} + +void Animator::RemoveAllAnimations() +{ + for (auto const& it : maAnimations) + { + it->Expire(); + } + maAnimations.clear(); + mnNextAnimationId = 0; + + // No more animations => we do not have to suppress painting + // anymore. + mpDrawLock.reset(); +} + +bool Animator::ProcessAnimations (const double nTime) +{ + bool bExpired (false); + + OSL_ASSERT( ! mbIsDisposed); + if (mbIsDisposed) + return bExpired; + + AnimationList aCopy (maAnimations); + for (const auto& rxAnimation : aCopy) + { + bExpired |= rxAnimation->Run(nTime); + } + + return bExpired; +} + +void Animator::CleanUpAnimationList() +{ + OSL_ASSERT( ! mbIsDisposed); + if (mbIsDisposed) + return; + + AnimationList aActiveAnimations; + + for (const auto& rxAnimation : maAnimations) + { + if ( ! rxAnimation->IsExpired()) + aActiveAnimations.push_back(rxAnimation); + } + + maAnimations.swap(aActiveAnimations); +} + +void Animator::RequestNextFrame () +{ + if ( ! maIdle.IsActive()) + { + // Prevent redraws except for the ones in TimeoutHandler. While the + // Animator is active it will schedule repaints regularly. Repaints + // in between would only lead to visual artifacts. + mpDrawLock.reset(new view::SlideSorterView::DrawLock(mrSlideSorter)); + maIdle.Start(); + } +} + +IMPL_LINK_NOARG(Animator, TimeoutHandler, Timer *, void) +{ + if (mbIsDisposed) + return; + + if (ProcessAnimations(maElapsedTime.getElapsedTime())) + CleanUpAnimationList(); + + // Unlock the draw lock. This should lead to a repaint. + mpDrawLock.reset(); + + if (!maAnimations.empty()) + RequestNextFrame(); +} + +//===== Animator::Animation =================================================== + +Animator::Animation::Animation ( + Animator::AnimationFunctor aAnimation, + const double nStartOffset, + const double nDuration, + const double nGlobalTime, + const Animator::AnimationId nId, + Animator::FinishFunctor aFinishFunctor) + : maAnimation(std::move(aAnimation)), + maFinishFunctor(std::move(aFinishFunctor)), + mnAnimationId(nId), + mnDuration(nDuration), + mnEnd(nGlobalTime + nDuration + nStartOffset), + mnGlobalTimeAtStart(nGlobalTime + nStartOffset), + mbIsExpired(false) +{ + Run(nGlobalTime); +} + +bool Animator::Animation::Run (const double nGlobalTime) +{ + if ( ! mbIsExpired) + { + if (mnDuration > 0) + { + if (nGlobalTime >= mnEnd) + { + maAnimation(1.0); + Expire(); + } + else if (nGlobalTime >= mnGlobalTimeAtStart) + { + maAnimation((nGlobalTime - mnGlobalTimeAtStart) / mnDuration); + } + } + else if (mnDuration < 0) + { + // Animations without end have to be expired by their owner. + maAnimation(nGlobalTime); + } + } + + return mbIsExpired; +} + +void Animator::Animation::Expire() +{ + if ( ! mbIsExpired) + { + mbIsExpired = true; + if (maFinishFunctor) + maFinishFunctor(); + } +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsClipboard.cxx b/sd/source/ui/slidesorter/controller/SlsClipboard.cxx new file mode 100644 index 0000000000..90fa0b7d73 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsClipboard.cxx @@ -0,0 +1,919 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::controller { + +namespace { +/** Temporarily deactivate slide tracking of the VisibleAreaManager. + This is used as a workaround to avoid unwanted repositioning of + the visible area when the selection of slides is copied to the + clipboard (cloning of slides leads to model change notifications + for the original model.) +*/ +class TemporarySlideTrackingDeactivator +{ +public: + explicit TemporarySlideTrackingDeactivator (SlideSorterController& rController) + : mrController(rController), + mbIsCurrentSlideTrackingActive ( + mrController.GetVisibleAreaManager().IsCurrentSlideTrackingActive()) + { + if (mbIsCurrentSlideTrackingActive) + mrController.GetVisibleAreaManager().DeactivateCurrentSlideTracking(); + } + ~TemporarySlideTrackingDeactivator() + { + if (mbIsCurrentSlideTrackingActive) + mrController.GetVisibleAreaManager().ActivateCurrentSlideTracking(); + } + +private: + SlideSorterController& mrController; + const bool mbIsCurrentSlideTrackingActive; +}; +} // end of anonymous namespace + +class Clipboard::UndoContext +{ +public: + UndoContext ( + SdDrawDocument* pDocument, + std::shared_ptr pMainViewShell) + : mpDocument(pDocument), + mpMainViewShell(std::move(pMainViewShell)) + { + if (mpDocument!=nullptr && mpDocument->IsUndoEnabled()) + { + if (mpMainViewShell && mpMainViewShell->GetShellType() == ViewShell::ST_DRAW) + mpDocument->BegUndo(SdResId(STRING_DRAG_AND_DROP_PAGES)); + else + mpDocument->BegUndo(SdResId(STRING_DRAG_AND_DROP_SLIDES)); + } + } + + ~UndoContext() + { + if (mpDocument!=nullptr && mpDocument->IsUndoEnabled()) + mpDocument->EndUndo(); + if (mpMainViewShell && mpMainViewShell->GetViewFrame()!=nullptr) + { + SfxBindings& rBindings = mpMainViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_UNDO); + rBindings.Invalidate(SID_REDO); + } + } +private: + SdDrawDocument* mpDocument; + std::shared_ptr mpMainViewShell; +}; + +Clipboard::Clipboard (SlideSorter& rSlideSorter) + : ViewClipboard(rSlideSorter.GetView()), + mrSlideSorter(rSlideSorter), + mrController(mrSlideSorter.GetController()), + mnDragFinishedUserEventId(nullptr) +{ +} + +Clipboard::~Clipboard() +{ + if (mnDragFinishedUserEventId != nullptr) + Application::RemoveUserEvent(mnDragFinishedUserEventId); +} + +/** With the current implementation the forwarded calls to the current + function will come back eventually to call the local Do(Cut|Copy|Paste) + methods. A shortcut is possible but would be an unclean hack. +*/ +void Clipboard::HandleSlotCall (SfxRequest& rRequest) +{ + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + rtl::Reference xFunc; + if (pViewShell != nullptr) + xFunc = pViewShell->GetCurrentFunction(); + switch (rRequest.GetSlot()) + { + case SID_CUT: + if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage) + { + if(xFunc.is()) + xFunc->DoCut(); + else + DoCut(); + } + rRequest.Done(); + break; + + case SID_COPY: + if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage) + { + if(xFunc.is()) + xFunc->DoCopy(); + else + DoCopy(); + } + rRequest.Done(); + break; + + case SID_PASTE: + // Prevent redraws while inserting pages from the clipboard + // because the intermediate inconsistent state might lead to + // a crash. + if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage) + { + view::SlideSorterView::DrawLock aLock (mrSlideSorter); + SelectionObserver::Context aContext (mrSlideSorter); + if(xFunc.is()) + xFunc->DoPaste(); + else + DoPaste(); + } + rRequest.Done(); + break; + + case SID_DELETE: + DoDelete(); + rRequest.Done(); + break; + } +} + +void Clipboard::DoCut () +{ + if (mrSlideSorter.GetModel().GetPageCount() > 1) + { + DoCopy(); + DoDelete(); + } +} + +void Clipboard::DoDelete() +{ + if (mrSlideSorter.GetModel().GetPageCount() > 1) + { + mrController.GetSelectionManager()->DeleteSelectedPages(); + } +} + +void Clipboard::DoCopy () +{ + CreateSlideTransferable( nullptr, false ); +} + +void Clipboard::DoPaste () +{ + SdTransferable* pClipTransferable = SD_MOD()->pTransferClip; + + if (pClipTransferable==nullptr || !pClipTransferable->IsPageTransferable()) + return; + + sal_Int32 nInsertPosition = GetInsertionPosition(); + + if (nInsertPosition >= 0) + { + // Paste the pages from the clipboard. + sal_Int32 nInsertPageCount = PasteTransferable(nInsertPosition); + // Select the pasted pages and make the first of them the + // current page. + mrSlideSorter.GetContentWindow()->GrabFocus(); + SelectPageRange(nInsertPosition, nInsertPageCount); + } +} + +sal_Int32 Clipboard::GetInsertionPosition () +{ + sal_Int32 nInsertPosition = -1; + + // Determine the insertion position: + // a) When the insertion indicator is visible, then at that position. + // b) When the focus indicator is visible, then before or after the + // focused page, depending on user input to a dialog. + // c) When there is a selection but no focus, then after the + // selection. + // d) After the last page when there is no selection and no focus. + + std::shared_ptr pInsertionIndicatorHandler ( + mrController.GetInsertionIndicatorHandler()); + if (pInsertionIndicatorHandler->IsActive()) + { + // Use the insertion index of an active insertion indicator. + nInsertPosition = pInsertionIndicatorHandler->GetInsertionPageIndex(); + } + else if (mrController.GetSelectionManager()->GetInsertionPosition() >= 0) + { + // Use the insertion index of an insertion indicator that has been + // deactivated a short while ago. + nInsertPosition = mrController.GetSelectionManager()->GetInsertionPosition(); + } + else if (mrController.GetFocusManager().IsFocusShowing()) + { + // Use the focus to determine the insertion position. + vcl::Window* pWin = mrSlideSorter.GetContentWindow(); + SdInsertPasteDlg aDialog(pWin ? pWin->GetFrameWeld() : nullptr); + if (aDialog.run() == RET_OK) + { + nInsertPosition = mrController.GetFocusManager().GetFocusedPageIndex(); + if (!aDialog.IsInsertBefore()) + nInsertPosition ++; + } + } + + return nInsertPosition; +} + +sal_Int32 Clipboard::PasteTransferable (sal_Int32 nInsertPosition) +{ + SdTransferable* pClipTransferable = SD_MOD()->pTransferClip; + model::SlideSorterModel& rModel (mrSlideSorter.GetModel()); + bool bMergeMasterPages = !pClipTransferable->HasSourceDoc (rModel.GetDocument()); + sal_uInt16 nInsertIndex (rModel.GetCoreIndex(nInsertPosition)); + sal_Int32 nInsertPageCount (0); + if (pClipTransferable->HasPageBookmarks()) + { + const std::vector &rBookmarkList = pClipTransferable->GetPageBookmarks(); + const SolarMutexGuard aGuard; + + nInsertPageCount = static_cast(rBookmarkList.size()); + rModel.GetDocument()->InsertBookmarkAsPage( + rBookmarkList, + nullptr, + false, + false, + nInsertIndex, + false, + pClipTransferable->GetPageDocShell(), + true, + bMergeMasterPages, + false); + } + else + { + SfxObjectShell* pShell = pClipTransferable->GetDocShell().get(); + DrawDocShell* pDataDocSh = static_cast(pShell); + SdDrawDocument* pDataDoc = pDataDocSh->GetDoc(); + + if (pDataDoc!=nullptr + && pDataDoc->GetSdPageCount(PageKind::Standard)) + { + const SolarMutexGuard aGuard; + + bMergeMasterPages = (pDataDoc != rModel.GetDocument()); + nInsertPageCount = pDataDoc->GetSdPageCount( PageKind::Standard ); + rModel.GetDocument()->InsertBookmarkAsPage( + std::vector(), + nullptr, + false, + false, + nInsertIndex, + false, + pDataDocSh, + true, + bMergeMasterPages, + false); + } + } + mrController.HandleModelChange(); + return nInsertPageCount; +} + +void Clipboard::SelectPageRange (sal_Int32 nFirstIndex, sal_Int32 nPageCount) +{ + // Select the newly inserted pages. That are the nInsertPageCount pages + // after the nInsertIndex position. + PageSelector& rSelector (mrController.GetPageSelector()); + rSelector.DeselectAllPages(); + for (sal_Int32 i=0; iSwitchCurrentSlide(pDescriptor); + } + } + } +} + +void Clipboard::CreateSlideTransferable ( + vcl::Window* pWindow, + bool bDrag) +{ + std::vector aBookmarkList; + + // Insert all selected pages into a bookmark list and remember them in + // maPagesToRemove for possible later removal. + model::PageEnumeration aSelectedPages + (model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + SdDrawDocument* const pDocument = mrSlideSorter.GetModel().GetDocument(); + DrawDocShell* const pDataDocSh = pDocument->GetDocSh(); + + sal_Int32 nUniqueID = 0; + while (aSelectedPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + + //ensure that the slides have unique names + const OUString sOrigName = pDescriptor->GetPage()->GetName(); + if ( pDataDocSh && !pDataDocSh->IsPageNameUnique( sOrigName ) ) + { + OUString sUniqueName; + bool bUnique = false; + while ( !bUnique ) + { + sUniqueName = sOrigName + "_clipboard" + OUString::number(nUniqueID++); + bUnique = pDataDocSh->IsNewPageNameValid( sUniqueName ); + if ( bUnique ) + pDescriptor->GetPage()->SetName(sUniqueName); + } + } + + aBookmarkList.push_back(pDescriptor->GetPage()->GetName()); + maPagesToRemove.push_back (pDescriptor->GetPage()); + } + + // Create a small set of representatives of the selection for which + // previews are included into the transferable so that an insertion + // indicator can be rendered. + aSelectedPages.Rewind(); + ::std::vector aRepresentatives; + aRepresentatives.reserve(3); + std::shared_ptr pPreviewCache ( + mrSlideSorter.GetView().GetPreviewCache()); + while (aSelectedPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + if ( ! pDescriptor || pDescriptor->GetPage()==nullptr) + continue; + BitmapEx aPreview (pPreviewCache->GetPreviewBitmap(pDescriptor->GetPage(), false)); + aRepresentatives.emplace_back( + aPreview, + pDescriptor->HasState(model::PageDescriptor::ST_Excluded)); + if (aRepresentatives.size() >= 3) + break; + } + + if (aBookmarkList.empty()) + return; + + mrSlideSorter.GetView().BrkAction(); + rtl::Reference pTransferable = TransferableData::CreateTransferable ( + pDocument, + dynamic_cast(mrSlideSorter.GetViewShell()), + std::move(aRepresentatives)); + + if (bDrag) + SD_MOD()->pTransferDrag = pTransferable.get(); + else + SD_MOD()->pTransferClip = pTransferable.get(); + + pDocument->CreatingDataObj (pTransferable.get()); + pTransferable->SetWorkDocument(pDocument->AllocSdDrawDocument()); + std::unique_ptr pObjDesc(new TransferableObjectDescriptor); + pTransferable->GetWorkDocument()->GetDocSh() + ->FillTransferableObjectDescriptor (*pObjDesc); + + if (pDataDocSh != nullptr) + pObjDesc->maDisplayName = pDataDocSh->GetMedium()->GetURLObject().GetURLNoPass(); + + vcl::Window* pActionWindow = pWindow; + if (pActionWindow == nullptr) + { + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell != nullptr) + pActionWindow = pViewShell->GetActiveWindow(); + } + + assert(pActionWindow); + + pTransferable->SetStartPos (pActionWindow->PixelToLogic( + pActionWindow->GetPointerPosPixel())); + pTransferable->SetObjectDescriptor (std::move(pObjDesc)); + + { + TemporarySlideTrackingDeactivator aDeactivator (mrController); + pTransferable->SetPageBookmarks (std::move(aBookmarkList), !bDrag); + } + + if (bDrag) + { + pTransferable->SetView (&mrSlideSorter.GetView()); + pTransferable->StartDrag (pActionWindow, DND_ACTION_COPY | DND_ACTION_MOVE); + } + else + pTransferable->CopyToClipboard (pActionWindow); + + pDocument->CreatingDataObj(nullptr); +} + +std::shared_ptr Clipboard::CreateTransferableUserData (SdTransferable* pTransferable) +{ + do + { + SdPageObjsTLV::SdPageObjsTransferable* pTreeListBoxTransferable + = dynamic_cast(pTransferable); + if (pTreeListBoxTransferable == nullptr) + break; + + // Find view shell for the document of the transferable. + ::sd::ViewShell* pViewShell + = SdPageObjsTLV::GetViewShellForDocShell(pTreeListBoxTransferable->GetDocShell()); + if (pViewShell == nullptr) + break; + + // Find slide sorter for the document of the transferable. + SlideSorterViewShell* pSlideSorterViewShell + = SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase()); + if (pSlideSorterViewShell == nullptr) + break; + SlideSorter& rSlideSorter (pSlideSorterViewShell->GetSlideSorter()); + + // Get bookmark from transferable. + TransferableDataHelper aDataHelper (pTransferable); + INetBookmark aINetBookmark; + if ( ! aDataHelper.GetINetBookmark(SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark)) + break; + const OUString sURL (aINetBookmark.GetURL()); + const sal_Int32 nIndex (sURL.indexOf('#')); + if (nIndex == -1) + break; + OUString sBookmark (sURL.copy(nIndex+1)); + + // Make sure that the bookmark points to a page. + SdDrawDocument* pTransferableDocument = rSlideSorter.GetModel().GetDocument(); + if (pTransferableDocument == nullptr) + break; + bool bIsMasterPage = false; + const sal_uInt16 nPageIndex (pTransferableDocument->GetPageByName(sBookmark, bIsMasterPage)); + if (nPageIndex == SDRPAGE_NOTFOUND) + break; + + // Create preview. + ::std::vector aRepresentatives; + aRepresentatives.reserve(1); + std::shared_ptr pPreviewCache ( + rSlideSorter.GetView().GetPreviewCache()); + model::SharedPageDescriptor pDescriptor (rSlideSorter.GetModel().GetPageDescriptor((nPageIndex-1)/2)); + if ( ! pDescriptor || pDescriptor->GetPage()==nullptr) + break; + BitmapEx aPreview (pPreviewCache->GetPreviewBitmap(pDescriptor->GetPage(), false)); + aRepresentatives.emplace_back( + aPreview, + pDescriptor->HasState(model::PageDescriptor::ST_Excluded)); + + // Remember the page in maPagesToRemove so that it can be removed + // when drag and drop action is "move". + Clipboard& rOtherClipboard (pSlideSorterViewShell->GetSlideSorter().GetController().GetClipboard()); + rOtherClipboard.maPagesToRemove.clear(); + rOtherClipboard.maPagesToRemove.push_back(pDescriptor->GetPage()); + + // Create the new transferable. + std::shared_ptr pNewTransferable = + std::make_shared( + pSlideSorterViewShell, + std::move(aRepresentatives)); + pTransferable->SetWorkDocument(pTreeListBoxTransferable->GetSourceDoc()->AllocSdDrawDocument()); + // pTransferable->SetView(&mrSlideSorter.GetView()); + + // Set page bookmark list. + std::vector aPageBookmarks { sBookmark }; + pTransferable->SetPageBookmarks(std::move(aPageBookmarks), false); + + // Replace the view referenced by the transferable with the + // corresponding slide sorter view. + pTransferable->SetView(&pSlideSorterViewShell->GetSlideSorter().GetView()); + + return pNewTransferable; + } + while (false); + + return std::shared_ptr(); +} + +void Clipboard::StartDrag ( + const Point& rPosition, + vcl::Window* pWindow) +{ + maPagesToRemove.clear(); + CreateSlideTransferable(pWindow, true); + + mrController.GetInsertionIndicatorHandler()->UpdatePosition( + rPosition, + InsertionIndicatorHandler::UnknownMode); +} + +void Clipboard::DragFinished (sal_Int8 nDropAction) +{ + if (mnDragFinishedUserEventId == nullptr) + { + mnDragFinishedUserEventId = Application::PostUserEvent( + LINK(this, Clipboard, ProcessDragFinished), + reinterpret_cast(nDropAction)); + } +} + +IMPL_LINK(Clipboard, ProcessDragFinished, void*, pUserData, void) +{ + const sal_Int8 nDropAction (static_cast(reinterpret_cast(pUserData))); + + mnDragFinishedUserEventId = nullptr; + + // Hide the substitution display and insertion indicator. + ::rtl::Reference pFunction (mrController.GetCurrentSelectionFunction()); + if (pFunction.is()) + pFunction->NotifyDragFinished(); + + PageSelector& rSelector (mrController.GetPageSelector()); + if ((nDropAction & DND_ACTION_MOVE) != 0 + && ! maPagesToRemove.empty()) + { + // Remove the pages that have been moved to another place (possibly + // in the same document.) + rSelector.DeselectAllPages(); + for (const auto& rpDraggedPage : maPagesToRemove) + { + rSelector.SelectPage(rpDraggedPage); + } + mrController.GetSelectionManager()->DeleteSelectedPages(); + } + mxUndoContext.reset(); + mxSelectionObserverContext.reset(); +} + +sal_Int8 Clipboard::AcceptDrop ( + const AcceptDropEvent& rEvent, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + sal_Int8 nAction (DND_ACTION_NONE); + + const Clipboard::DropType eDropType (IsDropAccepted()); + + switch (eDropType) + { + case DT_PAGE: + case DT_PAGE_FROM_NAVIGATOR: + { + // Accept a drop. + nAction = rEvent.mnAction; + + // Use the copy action when the drop action is the default, i.e. not + // explicitly set to move or link, and when the source and + // target models are not the same. + SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; + if (pDragTransferable != nullptr + && pDragTransferable->IsPageTransferable() + && ((rEvent.maDragEvent.DropAction + & css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT) != 0) + && (mrSlideSorter.GetModel().GetDocument()->GetDocSh() + != pDragTransferable->GetPageDocShell())) + { + nAction = DND_ACTION_COPY; + } + else if (IsInsertionTrivial(pDragTransferable, nAction)) + { + nAction = DND_ACTION_NONE; + } + + // Show the insertion marker and the substitution for a drop. + SelectionFunction* pSelectionFunction = dynamic_cast( + mrSlideSorter.GetViewShell()->GetCurrentFunction().get()); + if (pSelectionFunction != nullptr) + pSelectionFunction->MouseDragged(rEvent, nAction); + + // Scroll the window when the mouse reaches the window border. + // mrController.GetScrollBarManager().AutoScroll (rEvent.maPosPixel); + } + break; + + case DT_SHAPE: + nAction = ExecuteOrAcceptShapeDrop( + DC_ACCEPT, + rEvent.maPosPixel, + &rEvent, + rTargetHelper, + pTargetWindow, + nPage, + nLayer); + break; + + default: + case DT_NONE: + nAction = DND_ACTION_NONE; + break; + } + + return nAction; +} + +sal_Int8 Clipboard::ExecuteDrop ( + const ExecuteDropEvent& rEvent, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + sal_Int8 nResult = DND_ACTION_NONE; + mxUndoContext.reset(); + const Clipboard::DropType eDropType (IsDropAccepted()); + + switch (eDropType) + { + case DT_PAGE: + case DT_PAGE_FROM_NAVIGATOR: + { + SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; + const Point aEventModelPosition ( + pTargetWindow->PixelToLogic (rEvent.maPosPixel)); + const sal_Int32 nXOffset (std::abs (pDragTransferable->GetStartPos().X() + - aEventModelPosition.X())); + const sal_Int32 nYOffset (std::abs (pDragTransferable->GetStartPos().Y() + - aEventModelPosition.Y())); + bool bContinue = + ( pDragTransferable->GetView() != &mrSlideSorter.GetView() ) + || ( nXOffset >= 2 && nYOffset >= 2 ); + + std::shared_ptr pInsertionIndicatorHandler( + mrController.GetInsertionIndicatorHandler()); + // Get insertion position and then turn off the insertion indicator. + pInsertionIndicatorHandler->UpdatePosition(aEventModelPosition, rEvent.mnAction); + // sal_uInt16 nIndex = DetermineInsertPosition(*pDragTransferable); + + // Do not process the insertion when it is trivial, + // i.e. would insert pages at their original place. + if (IsInsertionTrivial(pDragTransferable, rEvent.mnAction)) + bContinue = false; + + // Tell the insertion indicator handler to hide before the model + // is modified. Doing it later may result in page objects whose + // animation state is not properly reset because they are then + // in another run then before the model change. + pInsertionIndicatorHandler->End(Animator::AM_Immediate); + + if (bContinue) + { + SlideSorterController::ModelChangeLock aModelChangeLock (mrController); + + // Handle a general drop operation. + mxUndoContext.reset(new UndoContext ( + mrSlideSorter.GetModel().GetDocument(), + mrSlideSorter.GetViewShell()->GetViewShellBase().GetMainViewShell())); + mxSelectionObserverContext.reset(new SelectionObserver::Context(mrSlideSorter)); + + if (rEvent.mnAction == DND_ACTION_MOVE) + { + SdDrawDocument* pDoc = mrSlideSorter.GetModel().GetDocument(); + const bool bDoesMakePageObjectsNamesUnique = pDoc->DoesMakePageObjectsNamesUnique(); + pDoc->DoMakePageObjectsNamesUnique(false); + HandlePageDrop(*pDragTransferable); + pDoc->DoMakePageObjectsNamesUnique(bDoesMakePageObjectsNamesUnique); + } + else + HandlePageDrop(*pDragTransferable); + + nResult = rEvent.mnAction; + + // We leave the undo context alive for when moving or + // copying inside one view then the actions in + // NotifyDragFinished should be covered as well as + // well as the ones above. + } + + // When the pages originated in another slide sorter then + // only that is notified automatically about the drag + // operation being finished. Because the target slide sorter + // has be notified, too, add a callback for that. + std::shared_ptr pSlideSorterTransferable ( + TransferableData::GetFromTransferable(pDragTransferable)); + assert(pSlideSorterTransferable); + if (pSlideSorterTransferable + && pSlideSorterTransferable->GetSourceViewShell() != mrSlideSorter.GetViewShell()) + { + DragFinished(nResult); + } + + // Notify the receiving selection function that drag-and-drop is + // finished and the substitution handler can be released. + ::rtl::Reference pFunction ( + mrController.GetCurrentSelectionFunction()); + if (pFunction.is()) + pFunction->NotifyDragFinished(); + } + break; + + case DT_SHAPE: + nResult = ExecuteOrAcceptShapeDrop( + DC_EXECUTE, + rEvent.maPosPixel, + &rEvent, + rTargetHelper, + pTargetWindow, + nPage, + nLayer); + break; + + default: + case DT_NONE: + break; + } + + return nResult; +} + +bool Clipboard::IsInsertionTrivial ( + SdTransferable const * pTransferable, + const sal_Int8 nDndAction) const +{ + std::shared_ptr pSlideSorterTransferable ( + TransferableData::GetFromTransferable(pTransferable)); + if (pSlideSorterTransferable + && pSlideSorterTransferable->GetSourceViewShell() != mrSlideSorter.GetViewShell()) + return false; + return mrController.GetInsertionIndicatorHandler()->IsInsertionTrivial(nDndAction); +} + +void Clipboard::Abort() +{ + if (mxSelectionObserverContext) + { + mxSelectionObserverContext->Abort(); + mxSelectionObserverContext.reset(); + } +} + +sal_uInt16 Clipboard::DetermineInsertPosition () +{ + // Tell the model to move the dragged pages behind the one with the + // index nInsertionIndex which first has to be transformed into an index + // understandable by the document. + const sal_Int32 nInsertionIndex ( + mrController.GetInsertionIndicatorHandler()->GetInsertionPageIndex()); + + // Convert to insertion index to that of an SdModel. + if (nInsertionIndex >= 0) + return mrSlideSorter.GetModel().GetCoreIndex(nInsertionIndex); + else + return 0; +} + +Clipboard::DropType Clipboard::IsDropAccepted() const +{ + const SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; + if (pDragTransferable == nullptr) + return DT_NONE; + + if (pDragTransferable->IsPageTransferable()) + { + if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage) + return DT_PAGE; + else + return DT_NONE; + } + + const SdPageObjsTLV::SdPageObjsTransferable* pPageObjsTransferable + = dynamic_cast(pDragTransferable); + if (pPageObjsTransferable != nullptr) + return DT_PAGE_FROM_NAVIGATOR; + + return DT_SHAPE; +} + +sal_Int8 Clipboard::ExecuteOrAcceptShapeDrop ( + DropCommand eCommand, + const Point& rPosition, + const void* pDropEvent, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + sal_Int8 nResult = 0; + + // The dropping of a shape is accepted or executed only when there is + // DrawViewShell available to which we can forward this call. This has + // technical reasons: The actual code to accept or execute a shape drop + // is implemented in the ViewShell class and uses the page view of the + // main edit view. This is not possible without a DrawViewShell. + std::shared_ptr pDrawViewShell; + if (mrSlideSorter.GetViewShell() != nullptr) + pDrawViewShell = std::dynamic_pointer_cast( + mrSlideSorter.GetViewShell()->GetViewShellBase().GetMainViewShell()); + if (pDrawViewShell != nullptr + && (pDrawViewShell->GetShellType() == ViewShell::ST_IMPRESS + || pDrawViewShell->GetShellType() == ViewShell::ST_DRAW)) + { + // The drop is only accepted or executed when it takes place over a + // page object. Therefore we replace a missing page number by the + // number of the page under the mouse. + if (nPage == SDRPAGE_NOTFOUND) + { + model::SharedPageDescriptor pDescriptor ( + mrSlideSorter.GetModel().GetPageDescriptor( + mrSlideSorter.GetView().GetPageIndexAtPoint(rPosition))); + if (pDescriptor) + nPage = pDescriptor->GetPageIndex(); + } + + // Now comes the code that is different for the Execute and Accept: + // We simply forward the call to the AcceptDrop() or ExecuteDrop() + // methods of the DrawViewShell in the center pane. + if (nPage != SDRPAGE_NOTFOUND) + switch (eCommand) + { + case DC_ACCEPT: + nResult = pDrawViewShell->AcceptDrop( + *static_cast(pDropEvent), + rTargetHelper, + pTargetWindow, + nPage, + nLayer); + break; + + case DC_EXECUTE: + nResult = pDrawViewShell->ExecuteDrop( + *static_cast(pDropEvent), + rTargetHelper, + pTargetWindow, + nPage, + nLayer); + break; + } + } + + return nResult; +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx new file mode 100644 index 0000000000..9203c06e8f --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx @@ -0,0 +1,256 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +using namespace ::sd::slidesorter::model; + +namespace sd::slidesorter::controller { + +CurrentSlideManager::CurrentSlideManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mnCurrentSlideIndex(-1), + maSwitchPageDelayTimer("sd CurrentSlideManager maSwitchPageDelayTimer") +{ + maSwitchPageDelayTimer.SetTimeout(100); + maSwitchPageDelayTimer.SetInvokeHandler(LINK(this,CurrentSlideManager,SwitchPageCallback)); +} + +CurrentSlideManager::~CurrentSlideManager() +{ +} + +void CurrentSlideManager::NotifyCurrentSlideChange (const SdPage* pPage) +{ + if (pPage != nullptr) + NotifyCurrentSlideChange( + mrSlideSorter.GetModel().GetIndex( + Reference( + const_cast(pPage)->getUnoPage(), + UNO_QUERY))); + else + NotifyCurrentSlideChange(-1); +} + +void CurrentSlideManager::NotifyCurrentSlideChange (const sal_Int32 nSlideIndex) +{ + if (mnCurrentSlideIndex == nSlideIndex) + return; + + PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter.GetController().GetPageSelector()); + + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); + + ReleaseCurrentSlide(); + AcquireCurrentSlide(nSlideIndex); + + // Update the selection. + if (mpCurrentSlide) + { + mrSlideSorter.GetController().GetPageSelector().SelectPage(mpCurrentSlide); + mrSlideSorter.GetController().GetFocusManager().SetFocusedPage(mpCurrentSlide); + } +} + +void CurrentSlideManager::ReleaseCurrentSlide() +{ + if (mpCurrentSlide) + mrSlideSorter.GetView().SetState(mpCurrentSlide, PageDescriptor::ST_Current, false); + + mpCurrentSlide.reset(); + mnCurrentSlideIndex = -1; +} + +void CurrentSlideManager::AcquireCurrentSlide (const sal_Int32 nSlideIndex) +{ + mnCurrentSlideIndex = nSlideIndex; + + // if current slide valid + if (mnCurrentSlideIndex >= 0 && mnCurrentSlideIndexGetPage()->GetPageNum()-1)/2); + + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell != nullptr && pViewShell->IsMainViewShell()) + { + // The slide sorter is the main view. + FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView != nullptr) + pFrameView->SetSelectedPage(sal::static_int_cast(mnCurrentSlideIndex)); + mrSlideSorter.GetController().GetPageSelector().SetCoreSelection(); + } + + // We do not tell the XController/ViewShellBase about the new + // slide right away. This is done asynchronously after a short + // delay to allow for more slide switches in the slide sorter. + // This goes under the assumption that slide switching inside + // the slide sorter is fast (no expensive redraw of the new page + // (unless the preview of the new slide is not yet preset)) and + // that slide switching in the edit view is slow (all shapes of + // the new slide have to be repainted.) + maSwitchPageDelayTimer.Start(); + + // We have to store the (index of the) new current slide at + // the tab control because there are other asynchronous + // notifications of the slide switching that otherwise + // overwrite the correct value. + SetCurrentSlideAtTabControl(mpCurrentSlide); + + if (bUpdateSelection) + { + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); + mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor); + } + mrSlideSorter.GetController().GetFocusManager().SetFocusedPage(rpDescriptor); +} + +void CurrentSlideManager::SetCurrentSlideAtViewShellBase (const SharedPageDescriptor& rpDescriptor) +{ + OSL_ASSERT(rpDescriptor); + + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase != nullptr) + { + DrawViewShell* pDrawViewShell = dynamic_cast( + pBase->GetMainViewShell().get()); + if (pDrawViewShell != nullptr) + { + sal_uInt16 nPageNumber = (rpDescriptor->GetPage()->GetPageNum()-1)/2; + pDrawViewShell->SwitchPage(nPageNumber); + TabControl& rPageTabControl = pDrawViewShell->GetPageTabControl(); + rPageTabControl.SetCurPageId(rPageTabControl.GetPageId(nPageNumber)); + } + } +} + +void CurrentSlideManager::SetCurrentSlideAtTabControl (const SharedPageDescriptor& rpDescriptor) +{ + OSL_ASSERT(rpDescriptor); + + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase != nullptr) + { + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pBase->GetMainViewShell())); + if (pDrawViewShell) + { + sal_uInt16 nPageNumber = (rpDescriptor->GetPage()->GetPageNum()-1)/2; + TabControl& rPageTabControl = pDrawViewShell->GetPageTabControl(); + rPageTabControl.SetCurPageId(rPageTabControl.GetPageId(nPageNumber)); + } + } +} + +void CurrentSlideManager::SetCurrentSlideAtXController (const SharedPageDescriptor& rpDescriptor) +{ + OSL_ASSERT(rpDescriptor); + + try + { + Reference xSet (mrSlideSorter.GetXController(), UNO_QUERY); + if (xSet.is()) + { + Any aPage; + aPage <<= rpDescriptor->GetPage()->getUnoPage(); + xSet->setPropertyValue( "CurrentPage", aPage ); + } + } + catch (const Exception&) + { + // We have not been able to set the current page at the main view. + // This is sad but still leaves us in a valid state. Therefore, + // this exception is silently ignored. + } +} + +void CurrentSlideManager::PrepareModelChange() +{ + mpCurrentSlide.reset(); +} + +void CurrentSlideManager::HandleModelChange() +{ + if (mnCurrentSlideIndex >= 0) + { + mpCurrentSlide = mrSlideSorter.GetModel().GetPageDescriptor(mnCurrentSlideIndex); + if (mpCurrentSlide) + mrSlideSorter.GetView().SetState(mpCurrentSlide, PageDescriptor::ST_Current, true); + } +} + +IMPL_LINK_NOARG(CurrentSlideManager, SwitchPageCallback, Timer *, void) +{ + if (mpCurrentSlide) + { + // Set current page. At the moment we have to do this in two + // different ways. The UNO way is the preferable one but, alas, + // it does not work always correctly (after some kinds of model + // changes). Therefore, we call DrawViewShell::SwitchPage(), + // too. + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell==nullptr || ! pViewShell->IsMainViewShell()) + SetCurrentSlideAtViewShellBase(mpCurrentSlide); + SetCurrentSlideAtXController(mpCurrentSlide); + } +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx new file mode 100644 index 0000000000..b635accc55 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsDragAndDropContext.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::controller { + +DragAndDropContext::DragAndDropContext (SlideSorter& rSlideSorter) + : mpTargetSlideSorter(&rSlideSorter), + mnInsertionIndex(-1) +{ + // No Drag-and-Drop for master pages. + if (rSlideSorter.GetModel().GetEditMode() != EditMode::Page) + return; + + // For properly handling transferables created by the navigator we + // need additional information. For this a user data object is + // created that contains the necessary information. + SdTransferable* pTransferable = SD_MOD()->pTransferDrag; + SdPageObjsTLV::SdPageObjsTransferable* pTreeListBoxTransferable + = dynamic_cast(pTransferable); + if (pTreeListBoxTransferable!=nullptr && !TransferableData::GetFromTransferable(pTransferable)) + { + pTransferable->AddUserData( + sd::slidesorter::controller::Clipboard::CreateTransferableUserData(pTransferable)); + } + + rSlideSorter.GetController().GetInsertionIndicatorHandler()->UpdateIndicatorIcon(pTransferable); +} + +DragAndDropContext::~DragAndDropContext() COVERITY_NOEXCEPT_FALSE +{ + SetTargetSlideSorter(); +} + +void DragAndDropContext::Dispose() +{ + mnInsertionIndex = -1; +} + +void DragAndDropContext::UpdatePosition ( + const Point& rMousePosition, + const InsertionIndicatorHandler::Mode eMode, + const bool bAllowAutoScroll) +{ + if (mpTargetSlideSorter == nullptr) + return; + + // Convert window coordinates into model coordinates (we need the + // window coordinates for auto-scrolling because that remains + // constant while scrolling.) + sd::Window *pWindow = mpTargetSlideSorter->GetContentWindow().get(); + const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition)); + std::shared_ptr pInsertionIndicatorHandler ( + mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()); + + bool bDoAutoScroll = bAllowAutoScroll + && mpTargetSlideSorter->GetController().GetScrollBarManager().AutoScroll( + rMousePosition, + [this, eMode, rMousePosition] () { + return this->UpdatePosition(rMousePosition, eMode, false); + }); + + if (!bDoAutoScroll) + { + pInsertionIndicatorHandler->UpdatePosition(aMouseModelPosition, eMode); + + // Remember the new insertion index. + mnInsertionIndex = pInsertionIndicatorHandler->GetInsertionPageIndex(); + if (pInsertionIndicatorHandler->IsInsertionTrivial(mnInsertionIndex, eMode)) + mnInsertionIndex = -1; + } +} + +void DragAndDropContext::SetTargetSlideSorter() +{ + if (mpTargetSlideSorter != nullptr) + { + mpTargetSlideSorter->GetController().GetScrollBarManager().StopAutoScroll(); + mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()->End( + Animator::AM_Animated); + } + + mpTargetSlideSorter = nullptr; +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx new file mode 100644 index 0000000000..cbeb11f8b2 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class Point; + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::controller +{ +/** A DragAndDropContext object handles an active drag and drop operation. + When the mouse is moved from one slide sorter window to another the + target SlideSorter object is exchanged accordingly. +*/ +class DragAndDropContext +{ +public: + /** Create a substitution display of the currently selected pages or, + when provided, the pages in the transferable. + */ + explicit DragAndDropContext(SlideSorter& rSlideSorter); + ~DragAndDropContext() COVERITY_NOEXCEPT_FALSE; + + /** Call this method (for example as reaction to ESC key press) to avoid + processing (ie moving or inserting) the substitution when the called + DragAndDropContext object is destroyed. + */ + void Dispose(); + + /** Move the substitution display by the distance the mouse has + travelled since the last call to this method or to + CreateSubstitution(). The given point becomes the new anchor. + */ + void UpdatePosition(const Point& rMousePosition, const InsertionIndicatorHandler::Mode eMode, + const bool bAllowAutoScroll); + + void SetTargetSlideSorter(); + +private: + SlideSorter* mpTargetSlideSorter; + sal_Int32 mnInsertionIndex; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx new file mode 100644 index 0000000000..fa821b625e --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx @@ -0,0 +1,245 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace sd::slidesorter::controller { + +FocusManager::FocusManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mnPageIndex(0), + mbPageIsFocused(false) +{ + if (mrSlideSorter.GetModel().GetPageCount() > 0) + mnPageIndex = 0; +} + +FocusManager::~FocusManager() +{ +} + +void FocusManager::MoveFocus (FocusMoveDirection eDirection) +{ + if (!(mnPageIndex >= 0 && mbPageIsFocused)) + return; + + HideFocusIndicator (GetFocusedPageDescriptor()); + + const sal_Int32 nColumnCount (mrSlideSorter.GetView().GetLayouter().GetColumnCount()); + const sal_Int32 nPageCount (mrSlideSorter.GetModel().GetPageCount()); + switch (eDirection) + { + case FocusMoveDirection::Left: + if (mnPageIndex > 0) + mnPageIndex -= 1; + break; + + case FocusMoveDirection::Right: + if (mnPageIndex < nPageCount-1) + mnPageIndex += 1; + break; + + case FocusMoveDirection::Up: + { + const sal_Int32 nCandidate (mnPageIndex - nColumnCount); + if (nCandidate >= 0) + { + // Move the focus the previous row. + mnPageIndex = nCandidate; + } + } + break; + + case FocusMoveDirection::Down: + { + const sal_Int32 nCandidate (mnPageIndex + nColumnCount); + if (nCandidate < nPageCount) + { + // Move the focus to the next row. + mnPageIndex = nCandidate; + } + } + break; + } + + if (mnPageIndex < 0) + { + OSL_ASSERT(mnPageIndex>=0); + mnPageIndex = 0; + } + else if (mnPageIndex >= nPageCount) + { + OSL_ASSERT(mnPageIndex= 0) + { + if (mbPageIsFocused) + HideFocus (); + else + ShowFocus (); + } + return mbPageIsFocused; +} + +bool FocusManager::HasFocus() const +{ + return mrSlideSorter.GetContentWindow()->HasFocus(); +} + +model::SharedPageDescriptor FocusManager::GetFocusedPageDescriptor() const +{ + return mrSlideSorter.GetModel().GetPageDescriptor(mnPageIndex); +} + +bool FocusManager::SetFocusedPage (const model::SharedPageDescriptor& rpDescriptor) +{ + if (rpDescriptor) + { + FocusHider aFocusHider (*this); + mnPageIndex = (rpDescriptor->GetPage()->GetPageNum()-1)/2; + return true; + } + return false; +} + +void FocusManager::SetFocusedPage (sal_Int32 nPageIndex) +{ + FocusHider aFocusHider (*this); + mnPageIndex = nPageIndex; +} + +bool FocusManager::SetFocusedPageFromCurrentPage() +{ + return SetFocusedPage(mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); +} + +bool FocusManager::IsFocusShowing() const +{ + return HasFocus() && mbPageIsFocused; +} + +void FocusManager::HideFocusIndicator (const model::SharedPageDescriptor& rpDescriptor) +{ + if (rpDescriptor) + { + mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, false); + + // Hide focus should also fire the focus event, Currently, only accessibility add the focus listener + NotifyFocusChangeListeners(); + } +} + +void FocusManager::ShowFocusIndicator ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bScrollToFocus) +{ + if (!rpDescriptor) + return; + + mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, true); + + if (bScrollToFocus) + { + // Scroll the focused page object into the visible area and repaint + // it, so that the focus indicator becomes visible. + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor,true); + } + mrSlideSorter.GetView().RequestRepaint(rpDescriptor); + + NotifyFocusChangeListeners(); +} + +void FocusManager::AddFocusChangeListener (const Link& rListener) +{ + if (::std::find (maFocusChangeListeners.begin(), maFocusChangeListeners.end(), rListener) + == maFocusChangeListeners.end()) + { + maFocusChangeListeners.push_back (rListener); + } +} + +void FocusManager::RemoveFocusChangeListener (const Link& rListener) +{ + maFocusChangeListeners.erase ( + ::std::find (maFocusChangeListeners.begin(), maFocusChangeListeners.end(), rListener)); +} + +void FocusManager::NotifyFocusChangeListeners() const +{ + // Create a copy of the listener list to be safe when that is modified. + ::std::vector> aListeners (maFocusChangeListeners); + + // Tell the selection change listeners that the selection has changed. + for (const auto& rListener : aListeners) + { + rListener.Call(nullptr); + } +} + +FocusManager::FocusHider::FocusHider (FocusManager& rManager) +: mbFocusVisible(rManager.IsFocusShowing()) +, mrManager(rManager) +{ + mrManager.HideFocus(); +} + +FocusManager::FocusHider::~FocusHider() COVERITY_NOEXCEPT_FALSE +{ + if (mbFocusVisible) + mrManager.ShowFocus(); +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx b/sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx new file mode 100644 index 0000000000..dafeef5a56 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx @@ -0,0 +1,244 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star::datatransfer::dnd::DNDConstants; + +namespace sd::slidesorter::controller { + +InsertionIndicatorHandler::InsertionIndicatorHandler (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mpInsertionIndicatorOverlay(std::make_shared(rSlideSorter)), + meMode(MoveMode), + mbIsInsertionTrivial(false), + mbIsActive(false), + mbIsReadOnly(mrSlideSorter.GetModel().IsReadOnly()), + mbIsOverSourceView(true), + maIconSize(0,0), + mbIsForcedShow(false) +{ +} + +InsertionIndicatorHandler::~InsertionIndicatorHandler() COVERITY_NOEXCEPT_FALSE +{ +} + +void InsertionIndicatorHandler::Start (const bool bIsOverSourceView) +{ + if (mbIsActive) + { + OSL_ASSERT(!mbIsActive); + } + + mbIsReadOnly = mrSlideSorter.GetModel().IsReadOnly(); + if (mbIsReadOnly) + return; + + mbIsActive = true; + mbIsOverSourceView = bIsOverSourceView; +} + +void InsertionIndicatorHandler::End (const controller::Animator::AnimationMode eMode) +{ + if (mbIsForcedShow || ! mbIsActive || mbIsReadOnly) + return; + + GetInsertAnimator()->Reset(eMode); + + mbIsActive = false; + // maInsertPosition = view::InsertPosition(); + meMode = UnknownMode; + + mpInsertionIndicatorOverlay->Hide(); + mpInsertionIndicatorOverlay = std::make_shared(mrSlideSorter); +} + +void InsertionIndicatorHandler::ForceShow() +{ + mbIsForcedShow = true; +} + +void InsertionIndicatorHandler::ForceEnd() +{ + mbIsForcedShow = false; + End(Animator::AM_Immediate); +} + +void InsertionIndicatorHandler::UpdateIndicatorIcon (const SdTransferable* pTransferable) +{ + mpInsertionIndicatorOverlay->Create(pTransferable); + maIconSize = mpInsertionIndicatorOverlay->GetSize(); +} + +InsertionIndicatorHandler::Mode InsertionIndicatorHandler::GetModeFromDndAction ( + const sal_Int8 nDndAction) +{ + if ((nDndAction & ACTION_MOVE) != 0) + return MoveMode; + else if ((nDndAction & ACTION_COPY) != 0) + return CopyMode; + else + return UnknownMode; +} + +void InsertionIndicatorHandler::UpdatePosition ( + const Point& rMouseModelPosition, + const Mode eMode) +{ + if ( ! mbIsActive) + return; + + if (mbIsReadOnly) + return; + + SetPosition(rMouseModelPosition, eMode); +} + +void InsertionIndicatorHandler::UpdatePosition ( + const Point& rMouseModelPosition, + const sal_Int8 nDndAction) +{ + UpdatePosition(rMouseModelPosition, GetModeFromDndAction(nDndAction)); +} + +sal_Int32 InsertionIndicatorHandler::GetInsertionPageIndex() const +{ + if (mbIsReadOnly) + return -1; + else + return maInsertPosition.GetIndex(); +} + +void InsertionIndicatorHandler::SetPosition ( + const Point& rPoint, + const Mode eMode) +{ + view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter()); + + const view::InsertPosition aInsertPosition (rLayouter.GetInsertPosition( + rPoint, + maIconSize, + mrSlideSorter.GetModel())); + + if (maInsertPosition == aInsertPosition && meMode == eMode) + return; + + maInsertPosition = aInsertPosition; + meMode = eMode; + mbIsInsertionTrivial = IsInsertionTrivial(maInsertPosition.GetIndex(), eMode); + if (maInsertPosition.GetIndex()>=0 && ! mbIsInsertionTrivial) + { + mpInsertionIndicatorOverlay->SetLocation(maInsertPosition.GetLocation()); + + GetInsertAnimator()->SetInsertPosition(maInsertPosition); + mpInsertionIndicatorOverlay->Show(); + } + else + { + GetInsertAnimator()->Reset(Animator::AM_Animated); + mpInsertionIndicatorOverlay->Hide(); + } +} + +std::shared_ptr const & InsertionIndicatorHandler::GetInsertAnimator() +{ + if ( ! mpInsertAnimator) + mpInsertAnimator = std::make_shared(mrSlideSorter); + return mpInsertAnimator; +} + +bool InsertionIndicatorHandler::IsInsertionTrivial ( + const sal_Int32 nInsertionIndex, + const Mode eMode) const +{ + if (eMode == CopyMode) + return false; + else if (eMode == UnknownMode) + return true; + + if ( ! mbIsOverSourceView) + return false; + + // Iterate over all selected pages and check whether there are + // holes. While we do this we remember the indices of the first and + // last selected page as preparation for the next step. + sal_Int32 nCurrentIndex = -1; + sal_Int32 nFirstIndex = -1; + sal_Int32 nLastIndex = -1; + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + while (aSelectedPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + + // Get the page number and compare it to the last one. + const sal_Int32 nPageNumber (pDescriptor->GetPageIndex()); + if (nCurrentIndex>=0 && nPageNumber>(nCurrentIndex+1)) + return false; + else + nCurrentIndex = nPageNumber; + + // Remember indices of the first and last page of the selection. + if (nFirstIndex == -1) + nFirstIndex = nPageNumber; + nLastIndex = nPageNumber; + } + + // When we come here then the selection has no holes. We still have + // to check that the insertion position is not directly in front or + // directly behind the selection and thus moving the selection there + // would not change the model. + return nInsertionIndex >= nFirstIndex && nInsertionIndex <= (nLastIndex+1); +} + +bool InsertionIndicatorHandler::IsInsertionTrivial (const sal_Int8 nDndAction) +{ + return IsInsertionTrivial(GetInsertionPageIndex(), GetModeFromDndAction(nDndAction)); +} + +//===== InsertionIndicatorHandler::ForceShowContext =========================== + +InsertionIndicatorHandler::ForceShowContext::ForceShowContext ( + std::shared_ptr pHandler) + : mpHandler(std::move(pHandler)) +{ + mpHandler->ForceShow(); +} + +InsertionIndicatorHandler::ForceShowContext::~ForceShowContext() COVERITY_NOEXCEPT_FALSE +{ + mpHandler->ForceEnd(); +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsListener.cxx b/sd/source/ui/slidesorter/controller/SlsListener.cxx new file mode 100644 index 0000000000..f744c24174 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsListener.cxx @@ -0,0 +1,597 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsListener.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::accessibility; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star; + +namespace sd::slidesorter::controller { + +Listener::Listener ( + SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mrController(mrSlideSorter.GetController()), + mpBase(mrSlideSorter.GetViewShellBase()), + mbListeningToDocument (false), + mbListeningToUNODocument (false), + mbListeningToController (false), + mbListeningToFrame (false), + mbIsMainViewChangePending(false) +{ + StartListening(*mrSlideSorter.GetModel().GetDocument()); + StartListening(*mrSlideSorter.GetModel().GetDocument()->GetDocSh()); + mbListeningToDocument = true; + + // Connect to the UNO document. + Reference xBroadcaster ( + mrSlideSorter.GetModel().GetDocument()->getUnoModel(), uno::UNO_QUERY); + if (xBroadcaster.is()) + { + xBroadcaster->addEventListener (this); + mbListeningToUNODocument = true; + } + + // Listen for disposing events from the document. + Reference xComponent (xBroadcaster, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener ( + Reference( + static_cast(this), UNO_QUERY)); + + // Connect to the frame to listen for controllers being exchanged. + bool bIsMainViewShell (false); + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell != nullptr) + bIsMainViewShell = pViewShell->IsMainViewShell(); + if ( ! bIsMainViewShell) + { + // Listen to changes of certain properties. + Reference xFrame; + Reference xController (mrSlideSorter.GetXController()); + if (xController.is()) + xFrame = xController->getFrame(); + mxFrameWeak = xFrame; + if (xFrame.is()) + { + xFrame->addFrameActionListener(Reference(this)); + mbListeningToFrame = true; + } + + // Connect to the current controller. + ConnectToController (); + } + + // Listen for hints of the MainViewShell as well. If that is not yet + // present then the EventMultiplexer will tell us when it is available. + if (mpBase != nullptr) + { + ViewShell* pMainViewShell = mpBase->GetMainViewShell().get(); + if (pMainViewShell != nullptr + && pMainViewShell!=pViewShell) + { + StartListening(*pMainViewShell); + } + + Link aLink (LINK(this, Listener, EventMultiplexerCallback)); + mpBase->GetEventMultiplexer()->AddEventListener(aLink); + } +} + +Listener::~Listener() +{ + DBG_ASSERT( !mbListeningToDocument && !mbListeningToUNODocument && !mbListeningToFrame, + "sd::Listener::~Listener(), disposing() was not called, ask DBO!" ); +} + +void Listener::ReleaseListeners() +{ + if (mbListeningToDocument) + { + EndListening(*mrSlideSorter.GetModel().GetDocument()->GetDocSh()); + EndListening(*mrSlideSorter.GetModel().GetDocument()); + mbListeningToDocument = false; + } + + if (mbListeningToUNODocument) + { + Reference xBroadcaster ( + mrSlideSorter.GetModel().GetDocument()->getUnoModel(), UNO_QUERY); + if (xBroadcaster.is()) + xBroadcaster->removeEventListener (this); + + // Remove the dispose listener. + Reference xComponent (xBroadcaster, UNO_QUERY); + if (xComponent.is()) + xComponent->removeEventListener ( + Reference( + static_cast(this), UNO_QUERY)); + + mbListeningToUNODocument = false; + } + + if (mbListeningToFrame) + { + // Listen to changes of certain properties. + Reference xFrame (mxFrameWeak); + if (xFrame.is()) + { + xFrame->removeFrameActionListener(Reference(this)); + mbListeningToFrame = false; + } + } + + DisconnectFromController (); + + if (mpBase != nullptr) + { + Link aLink (LINK(this, Listener, EventMultiplexerCallback)); + mpBase->GetEventMultiplexer()->RemoveEventListener(aLink); + } +} + +void Listener::ConnectToController() +{ + ViewShell* pShell = mrSlideSorter.GetViewShell(); + + // Register at the controller of the main view shell (if we are that not + // ourself). + if (pShell!=nullptr && pShell->IsMainViewShell()) + return; + + Reference xController (mrSlideSorter.GetXController()); + + // Listen to changes of certain properties. + Reference xSet (xController, UNO_QUERY); + if (xSet.is()) + { + try + { + xSet->addPropertyChangeListener("CurrentPage", this); + } + catch (beans::UnknownPropertyException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + try + { + xSet->addPropertyChangeListener("IsMasterPageMode", this); + } + catch (beans::UnknownPropertyException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + } + + // Listen for disposing events. + if (xController.is()) + { + xController->addEventListener ( + Reference(static_cast(this), UNO_QUERY)); + + mxControllerWeak = xController; + mbListeningToController = true; + } +} + +void Listener::DisconnectFromController() +{ + if (!mbListeningToController) + return; + + Reference xController = mxControllerWeak; + Reference xSet (xController, UNO_QUERY); + try + { + // Remove the property listener. + if (xSet.is()) + { + xSet->removePropertyChangeListener( "CurrentPage", this ); + xSet->removePropertyChangeListener( "IsMasterPageMode", this); + } + + // Remove the dispose listener. + if (xController.is()) + xController->removeEventListener ( + Reference( + static_cast(this), UNO_QUERY)); + } + catch (beans::UnknownPropertyException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + + mbListeningToController = false; + mxControllerWeak = Reference(); +} + +void Listener::Notify ( + SfxBroadcaster& rBroadcaster, + const SfxHint& rHint) +{ + if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint) + { + const SdrHint* pSdrHint = static_cast(&rHint); + switch (pSdrHint->GetKind()) + { + case SdrHintKind::ModelCleared: + if (&rBroadcaster == mrSlideSorter.GetModel().GetDocument()) + { // rhbz#965646 stop listening to dying document + EndListening(rBroadcaster); + return; + } + break; + case SdrHintKind::PageOrderChange: + if (&rBroadcaster == mrSlideSorter.GetModel().GetDocument()) + HandleModelChange(pSdrHint->GetPage()); + break; + + default: + break; + } + } + else if (rHint.GetId() == SfxHintId::DocChanged) + { + mrController.CheckForMasterPageAssignment(); + mrController.CheckForSlideTransitionAssignment(); + } + else if (auto pViewShellHint = dynamic_cast(&rHint)) + { + switch (pViewShellHint->GetHintId()) + { + case ViewShellHint::HINT_PAGE_RESIZE_START: + // Initiate a model change but do nothing (well, not much) + // until we are told that all slides have been resized. + mpModelChangeLock.reset(new SlideSorterController::ModelChangeLock(mrController), + o3tl::default_delete()); + mrController.HandleModelChange(); + break; + + case ViewShellHint::HINT_PAGE_RESIZE_END: + // All slides have been resized. The model has to be updated. + mpModelChangeLock.reset(); + break; + + case ViewShellHint::HINT_CHANGE_EDIT_MODE_START: + mrController.PrepareEditModeChange(); + break; + + case ViewShellHint::HINT_CHANGE_EDIT_MODE_END: + mrController.FinishEditModeChange(); + break; + + case ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START: + mpModelChangeLock.reset(new SlideSorterController::ModelChangeLock(mrController), + o3tl::default_delete()); + break; + + case ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END: + mpModelChangeLock.reset(); + break; + } + } +} + +IMPL_LINK(Listener, EventMultiplexerCallback, ::sd::tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::MainViewRemoved: + { + if (mpBase != nullptr) + { + ViewShell* pMainViewShell = mpBase->GetMainViewShell().get(); + if (pMainViewShell != nullptr) + EndListening(*pMainViewShell); + } + } + break; + + case EventMultiplexerEventId::MainViewAdded: + mbIsMainViewChangePending = true; + break; + + case EventMultiplexerEventId::ConfigurationUpdated: + if (mbIsMainViewChangePending && mpBase != nullptr) + { + mbIsMainViewChangePending = false; + ViewShell* pMainViewShell = mpBase->GetMainViewShell().get(); + if (pMainViewShell != nullptr + && pMainViewShell!=mrSlideSorter.GetViewShell()) + { + StartListening (*pMainViewShell); + } + } + break; + + case EventMultiplexerEventId::ControllerAttached: + { + ConnectToController(); + // mrController.GetPageSelector().GetCoreSelection(); + UpdateEditMode(); + } + break; + + case EventMultiplexerEventId::ControllerDetached: + DisconnectFromController(); + break; + + case EventMultiplexerEventId::ShapeChanged: + case EventMultiplexerEventId::ShapeInserted: + case EventMultiplexerEventId::ShapeRemoved: + HandleShapeModification(static_cast(rEvent.mpUserData)); + break; + + case EventMultiplexerEventId::EndTextEdit: + if (rEvent.mpUserData != nullptr) + { + const SdrObject* pObject = static_cast(rEvent.mpUserData); + HandleShapeModification(pObject->getSdrPageFromSdrObject()); + } + break; + + default: + break; + } +} + +//===== lang::XEventListener ================================================ + +void SAL_CALL Listener::disposing ( + const lang::EventObject& rEventObject) +{ + if ((mbListeningToDocument || mbListeningToUNODocument) + && mrSlideSorter.GetModel().GetDocument()!=nullptr + && rEventObject.Source + == mrSlideSorter.GetModel().GetDocument()->getUnoModel()) + { + mbListeningToDocument = false; + mbListeningToUNODocument = false; + } + else if (mbListeningToController) + { + Reference xController (mxControllerWeak); + if (rEventObject.Source == xController) + { + mbListeningToController = false; + } + } +} + +//===== document::XEventListener ============================================ + +void SAL_CALL Listener::notifyEvent ( + const document::EventObject& ) +{ +} + +//===== beans::XPropertySetListener ========================================= + +void SAL_CALL Listener::propertyChange ( + const PropertyChangeEvent& rEvent) +{ + if (m_bDisposed) + { + throw lang::DisposedException ("SlideSorterController object has already been disposed", + static_cast(this)); + } + + if (rEvent.PropertyName == "CurrentPage") + { + Any aCurrentPage = rEvent.NewValue; + Reference xPageSet (aCurrentPage, UNO_QUERY); + if (xPageSet.is()) + { + try + { + Any aPageNumber = xPageSet->getPropertyValue ("Number"); + sal_Int32 nCurrentPage = 0; + aPageNumber >>= nCurrentPage; + // The selection is already set but we call SelectPage() + // nevertheless in order to make the new current page the + // last recently selected page of the PageSelector. This is + // used when making the selection visible. + mrController.GetCurrentSlideManager()->NotifyCurrentSlideChange(nCurrentPage-1); + mrController.GetPageSelector().SelectPage(nCurrentPage-1); + } + catch (beans::UnknownPropertyException&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + catch (lang::DisposedException&) + { + // Something is already disposed. There is not much we can + // do, except not to crash. + } + } + } + else if (rEvent.PropertyName == "IsMasterPageMode") + { + bool bIsMasterPageMode = false; + rEvent.NewValue >>= bIsMasterPageMode; + mrController.ChangeEditMode ( + bIsMasterPageMode ? EditMode::MasterPage : EditMode::Page); + } +} + +//===== frame::XFrameActionListener ========================================== + +void SAL_CALL Listener::frameAction (const frame::FrameActionEvent& rEvent) +{ + switch (rEvent.Action) + { + case frame::FrameAction_COMPONENT_DETACHING: + DisconnectFromController(); + break; + + case frame::FrameAction_COMPONENT_REATTACHED: + { + ConnectToController(); + mrController.GetPageSelector().GetCoreSelection(); + UpdateEditMode(); + } + break; + + default: + break; + } +} + +//===== accessibility::XAccessibleEventListener ============================== + +void SAL_CALL Listener::notifyEvent ( + const AccessibleEventObject& ) +{ +} + +void Listener::disposing(std::unique_lock&) +{ + ReleaseListeners(); +} + +void Listener::UpdateEditMode() +{ + // When there is a new controller then the edit mode may have changed at + // the same time. + Reference xController (mxControllerWeak); + Reference xSet (xController, UNO_QUERY); + bool bIsMasterPageMode = false; + if (xSet != nullptr) + { + try + { + Any aValue (xSet->getPropertyValue( "IsMasterPageMode" )); + aValue >>= bIsMasterPageMode; + } + catch (beans::UnknownPropertyException&) + { + // When the property is not supported then the master page mode + // is not supported, too. + bIsMasterPageMode = false; + } + } + mrController.ChangeEditMode ( + bIsMasterPageMode ? EditMode::MasterPage : EditMode::Page); +} + +void Listener::HandleModelChange (const SdrPage* pPage) +{ + // Notify model and selection observer about the page. The return value + // of the model call acts as filter as to which events to pass to the + // selection observer. + if (mrSlideSorter.GetModel().NotifyPageEvent(pPage)) + { + // The page of the hint belongs (or belonged) to the model. + + // Tell the cache manager that the preview bitmaps for a deleted + // page can be removed from all caches. + if (pPage!=nullptr && ! pPage->IsInserted()) + cache::PageCacheManager::Instance()->ReleasePreviewBitmap(pPage); + + mrController.GetSelectionManager()->GetSelectionObserver()->NotifyPageEvent(pPage); + } + + // Tell the controller about the model change only when the document is + // in a sane state, not just in the middle of a larger change. + SdDrawDocument* pDocument (mrSlideSorter.GetModel().GetDocument()); + if (pDocument != nullptr + && pDocument->GetMasterSdPageCount(PageKind::Standard) == pDocument->GetMasterSdPageCount(PageKind::Notes)) + { + // A model change can make updates of some text fields necessary + // (like page numbers and page count.) Invalidate all previews in + // the cache to cope with this. Doing this on demand would be a + // nice optimization. + cache::PageCacheManager::Instance()->InvalidateAllPreviewBitmaps(pDocument->getUnoModel()); + + mrController.HandleModelChange(); + } +} + +void Listener::HandleShapeModification (const SdrPage* pPage) +{ + if (pPage == nullptr) + return; + + // Invalidate the preview of the page (in all slide sorters that display + // it.) + std::shared_ptr pCacheManager (cache::PageCacheManager::Instance()); + if ( ! pCacheManager) + return; + SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); + if (pDocument == nullptr) + { + OSL_ASSERT(pDocument!=nullptr); + return; + } + pCacheManager->InvalidatePreviewBitmap(pDocument->getUnoModel(), pPage); + mrSlideSorter.GetView().GetPreviewCache()->RequestPreviewBitmap(pPage); + + // When the page is a master page then invalidate the previews of all + // pages that are linked to this master page. + if (!pPage->IsMasterPage()) + return; + + for (sal_uInt16 nIndex=0,nCount=pDocument->GetSdPageCount(PageKind::Standard); + nIndexGetSdPage(nIndex, PageKind::Standard); + if (pCandidate!=nullptr && pCandidate->TRG_HasMasterPage()) + { + if (&pCandidate->TRG_GetMasterPage() == pPage) + pCacheManager->InvalidatePreviewBitmap(pDocument->getUnoModel(), pCandidate); + } + else + { + OSL_ASSERT(pCandidate!=nullptr && pCandidate->TRG_HasMasterPage()); + } + } +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsListener.hxx b/sd/source/ui/slidesorter/controller/SlsListener.hxx new file mode 100644 index 0000000000..eff02cf198 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsListener.hxx @@ -0,0 +1,164 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +class SdrPage; + +namespace sd { +class ViewShellBase; +} + +namespace sd::tools { class EventMultiplexerEvent; } +namespace sd::slidesorter { class SlideSorter; } + +namespace sd::slidesorter::controller { + +typedef comphelper::WeakComponentImplHelper< + css::document::XEventListener, + css::beans::XPropertyChangeListener, + css::accessibility::XAccessibleEventListener, + css::frame::XFrameActionListener + > ListenerInterfaceBase; + +/** Listen for events of various types and sources and react to them. This + class is a part of the controller. + + When the view shell in the center pane is replaced by another the + associated controller is replaced as well. Therefore we have to + register at the frame and on certain FrameActionEvents to stop listening + to the old controller and register as listener at the new one. +*/ +class Listener + : public ListenerInterfaceBase, + public SfxListener +{ +public: + explicit Listener (SlideSorter& rSlideSorter); + virtual ~Listener() override; + + /** Connect to the current controller of the view shell as listener. + This method is called once during initialization and every time a + FrameActionEvent signals the current controller being exchanged. + When the connection is successful then the flag + mbListeningToController is set to . + */ + void ConnectToController(); + + /** Disconnect from the current controller of the view shell as + listener. This method is called once during initialization and + every time a FrameActionEvent signals the current controller being + exchanged. When this method terminates then mbListeningToController + is . + */ + void DisconnectFromController(); + + virtual void Notify ( + SfxBroadcaster& rBroadcaster, + const SfxHint& rHint) override; + + //===== lang::XEventListener ============================================ + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + //===== document::XEventListener ======================================== + virtual void SAL_CALL + notifyEvent ( + const css::document::EventObject& rEventObject) override; + + //===== beans::XPropertySetListener ===================================== + virtual void SAL_CALL + propertyChange ( + const css::beans::PropertyChangeEvent& rEvent) override; + + //===== accessibility::XAccessibleEventListener ========================== + virtual void SAL_CALL + notifyEvent ( + const css::accessibility::AccessibleEventObject& + rEvent) override; + + //===== frame::XFrameActionListener ====================================== + /** For certain actions the listener connects to a new controller of the + frame it is listening to. This usually happens when the view shell + in the center pane is replaced by another view shell. + */ + virtual void SAL_CALL + frameAction (const css::frame::FrameActionEvent& rEvent) override; + + virtual void disposing(std::unique_lock&) override; + +private: + SlideSorter& mrSlideSorter; + SlideSorterController& mrController; + ViewShellBase* mpBase; + + /// Remember whether we are listening to the document. + bool mbListeningToDocument; + /// Remember whether we are listening to the UNO document. + bool mbListeningToUNODocument; + /// Remember whether we are listening to the UNO controller. + bool mbListeningToController; + /// Remember whether we are listening to the frame. + bool mbListeningToFrame; + bool mbIsMainViewChangePending; + + css::uno::WeakReference< css::frame::XController> mxControllerWeak; + css::uno::WeakReference< css::frame::XFrame> mxFrameWeak; + + /** This object is used to lock the model between some + events. It is references counted in order to cope with events that + are expected but never sent. + */ + std::shared_ptr mpModelChangeLock; + + void ReleaseListeners(); + + /** Called when the edit mode has changed. Update model accordingly. + */ + void UpdateEditMode(); + + /** Handle a change in the order of slides or when the set of slides has + changed, i.e. a slide has been created. + */ + void HandleModelChange (const SdrPage* pPage); + + /** Handle a modification to a shape on the given page. When this is a + regular page then update its preview. When it is a master page then + additionally update the previews of all pages linked to it. + */ + void HandleShapeModification (const SdrPage* pPage); + + DECL_LINK(EventMultiplexerCallback, tools::EventMultiplexerEvent&, void); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx b/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx new file mode 100644 index 0000000000..f25374e8ac --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx @@ -0,0 +1,386 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::sd::slidesorter::model; +using namespace ::sd::slidesorter::view; + +namespace sd::slidesorter::controller { + +PageSelector::PageSelector (SlideSorter& rSlideSorter) + : mrModel(rSlideSorter.GetModel()), + mrSlideSorter(rSlideSorter), + mrController(mrSlideSorter.GetController()), + mnSelectedPageCount(0), + mnBroadcastDisableLevel(0), + mbSelectionChangeBroadcastPending(false), + mnUpdateLockCount(0), + mbIsUpdateCurrentPagePending(true) +{ + CountSelectedPages (); +} + +void PageSelector::SelectAllPages() +{ + VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter); + PageSelector::UpdateLock aLock (*this); + + int nPageCount = mrModel.GetPageCount(); + for (int nPageIndex=0; nPageIndexGetCoreSelection()) + { + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(pDescriptor); + mrSlideSorter.GetView().RequestRepaint(pDescriptor); + bSelectionHasChanged = true; + } + + if (pDescriptor->HasState(PageDescriptor::ST_Selected)) + mnSelectedPageCount++; + } + + if (bSelectionHasChanged) + { + if (mnBroadcastDisableLevel > 0) + mbSelectionChangeBroadcastPending = true; + else + mrController.GetSelectionManager()->SelectionHasChanged(); + } +} + +void PageSelector::SetCoreSelection() +{ + model::PageEnumeration aAllPages ( + model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + while (aAllPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + pDescriptor->SetCoreSelection(); + } +} + +void PageSelector::SelectPage (int nPageIndex) +{ + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor) + SelectPage(pDescriptor); +} + +void PageSelector::SelectPage (const SdPage* pPage) +{ + const sal_Int32 nPageIndex (mrModel.GetIndex(pPage)); + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor && pDescriptor->GetPage()==pPage) + SelectPage(pDescriptor); +} + +void PageSelector::SelectPage (const SharedPageDescriptor& rpDescriptor) +{ + if (!rpDescriptor + || !mrSlideSorter.GetView().SetState(rpDescriptor, PageDescriptor::ST_Selected, true)) + return; + + ++mnSelectedPageCount; + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor,true); + mrSlideSorter.GetView().RequestRepaint(rpDescriptor); + + mpMostRecentlySelectedPage = rpDescriptor; + if (mpSelectionAnchor == nullptr) + mpSelectionAnchor = rpDescriptor; + + if (mnBroadcastDisableLevel > 0) + mbSelectionChangeBroadcastPending = true; + else + mrController.GetSelectionManager()->SelectionHasChanged(); + UpdateCurrentPage(); + + CheckConsistency(); +} + +void PageSelector::DeselectPage (int nPageIndex) +{ + model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor) + DeselectPage(pDescriptor); +} + +void PageSelector::DeselectPage ( + const SharedPageDescriptor& rpDescriptor, + const bool bUpdateCurrentPage) +{ + if (!rpDescriptor + || !mrSlideSorter.GetView().SetState(rpDescriptor, PageDescriptor::ST_Selected, false)) + return; + + --mnSelectedPageCount; + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor); + mrSlideSorter.GetView().RequestRepaint(rpDescriptor); + if (mpMostRecentlySelectedPage == rpDescriptor) + mpMostRecentlySelectedPage.reset(); + if (mnBroadcastDisableLevel > 0) + mbSelectionChangeBroadcastPending = true; + else + mrController.GetSelectionManager()->SelectionHasChanged(); + if (bUpdateCurrentPage) + UpdateCurrentPage(); + + CheckConsistency(); +} + +void PageSelector::CheckConsistency() const +{ + int nSelectionCount (0); + for (int nPageIndex=0,nPageCount=mrModel.GetPageCount(); nPageIndexHasState(PageDescriptor::ST_Selected)) + ++nSelectionCount; + } + if (nSelectionCount!=mnSelectedPageCount) + { + // #i120020# The former call to assert(..) internally calls + // SlideSorterModel::GetPageDescriptor which will crash in this situation + // (only in non-pro code). All what is wanted there is to assert it (the + // error is already detected), so do this directly. + OSL_ENSURE(false, "PageSelector: Consistency error (!)"); + } +} + +bool PageSelector::IsPageSelected(int nPageIndex) +{ + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor) + return pDescriptor->HasState(PageDescriptor::ST_Selected); + else + return false; +} + +bool PageSelector::IsPageExcluded(int nPageIndex) +{ + SharedPageDescriptor pDescriptor(mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor) + return pDescriptor->HasState(PageDescriptor::ST_Excluded); + else + return false; +} + +int PageSelector::GetPageCount() const +{ + return mrModel.GetPageCount(); +} + +void PageSelector::CountSelectedPages() +{ + mnSelectedPageCount = 0; + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel)); + while (aSelectedPages.HasMoreElements()) + { + mnSelectedPageCount++; + aSelectedPages.GetNextElement(); + } +} + +void PageSelector::EnableBroadcasting() +{ + if (mnBroadcastDisableLevel > 0) + mnBroadcastDisableLevel --; + if (mnBroadcastDisableLevel==0 && mbSelectionChangeBroadcastPending) + { + mrController.GetSelectionManager()->SelectionHasChanged(); + mbSelectionChangeBroadcastPending = false; + } +} + +void PageSelector::DisableBroadcasting() +{ + mnBroadcastDisableLevel ++; +} + +std::shared_ptr PageSelector::GetPageSelection() const +{ + auto pSelection = std::make_shared(); + pSelection->reserve(GetSelectedPageCount()); + + int nPageCount = GetPageCount(); + for (int nIndex=0; nIndexHasState(PageDescriptor::ST_Selected)) + pSelection->push_back(pDescriptor->GetPage()); + } + + return pSelection; +} + +void PageSelector::SetPageSelection ( + const std::shared_ptr& rpSelection, + const bool bUpdateCurrentPage) +{ + for (const auto& rpPage : *rpSelection) + SelectPage(rpPage); + if (bUpdateCurrentPage) + UpdateCurrentPage(); +} + +void PageSelector::UpdateCurrentPage (const bool bUpdateOnlyWhenPending) +{ + if (mnUpdateLockCount > 0) + { + mbIsUpdateCurrentPagePending = true; + return; + } + + if ( ! mbIsUpdateCurrentPagePending && bUpdateOnlyWhenPending) + return; + + mbIsUpdateCurrentPagePending = false; + + // Make the first selected page the current page. + SharedPageDescriptor pCurrentPageDescriptor; + const sal_Int32 nPageCount (GetPageCount()); + for (sal_Int32 nIndex=0; nIndexHasState(PageDescriptor::ST_Selected)) + { + pCurrentPageDescriptor = pDescriptor; + break; + } + } + + if (!pCurrentPageDescriptor) + return; + + // Switching the current slide normally sets also the + // selection to just the new current slide. To prevent that, + // we store (and at the end of this scope restore) the current + // selection. + std::shared_ptr pSelection (GetPageSelection()); + + mrController.GetCurrentSlideManager()->SwitchCurrentSlide(pCurrentPageDescriptor); + + // Restore the selection and prevent a recursive call to + // UpdateCurrentPage(). + SetPageSelection(pSelection, false); +} + +//===== PageSelector::UpdateLock ============================================== + +PageSelector::UpdateLock::UpdateLock (SlideSorter const & rSlideSorter) + : mpSelector(&rSlideSorter.GetController().GetPageSelector()) +{ + ++mpSelector->mnUpdateLockCount; +} + +PageSelector::UpdateLock::UpdateLock (PageSelector& rSelector) + : mpSelector(&rSelector) +{ + ++mpSelector->mnUpdateLockCount; +} + +PageSelector::UpdateLock::~UpdateLock() +{ + Release(); +} + +void PageSelector::UpdateLock::Release() +{ + if (mpSelector != nullptr) + { + --mpSelector->mnUpdateLockCount; + OSL_ASSERT(mpSelector->mnUpdateLockCount >= 0); + if (mpSelector->mnUpdateLockCount == 0) + mpSelector->UpdateCurrentPage(true); + + mpSelector = nullptr; + } +} + +//===== PageSelector::BroadcastLock ============================================== + +PageSelector::BroadcastLock::BroadcastLock (SlideSorter const & rSlideSorter) + : mrSelector(rSlideSorter.GetController().GetPageSelector()) +{ + mrSelector.DisableBroadcasting(); +} + +PageSelector::BroadcastLock::BroadcastLock (PageSelector& rSelector) + : mrSelector(rSelector) +{ + mrSelector.DisableBroadcasting(); +} + +PageSelector::BroadcastLock::~BroadcastLock() +{ + mrSelector.EnableBroadcasting(); +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsProperties.cxx b/sd/source/ui/slidesorter/controller/SlsProperties.cxx new file mode 100644 index 0000000000..cbe0d6e0ea --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsProperties.cxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +namespace sd::slidesorter::controller { + +Properties::Properties() + : maBackgroundColor(Application::GetSettings().GetStyleSettings().GetWindowColor()), + maSelectionColor(Application::GetSettings().GetStyleSettings().GetHighlightColor()) +{ +} + +void Properties::HandleDataChangeEvent() +{ + maBackgroundColor = Application::GetSettings().GetStyleSettings().GetWindowColor(); + maSelectionColor = Application::GetSettings().GetStyleSettings().GetHighlightColor(); +} + +void Properties::SetBackgroundColor (const Color& rColor) +{ + maBackgroundColor = rColor; +} + +void Properties::SetSelectionColor (const Color& rColor) +{ + maSelectionColor = rColor; +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx new file mode 100644 index 0000000000..6ee20c8dd9 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx @@ -0,0 +1,583 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::controller { + +constexpr double gnHorizontalScrollFactor(0.15); +constexpr double gnVerticalScrollFactor(0.25); + +ScrollBarManager::ScrollBarManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mpHorizontalScrollBar(mrSlideSorter.GetHorizontalScrollBar()), + mpVerticalScrollBar(mrSlideSorter.GetVerticalScrollBar()), + mnHorizontalPosition (0), + mnVerticalPosition (0), + maScrollBorder (20,20), + maAutoScrollTimer("sd ScrollBarManager maAutoScrollTimer"), + maAutoScrollOffset(0,0), + mbIsAutoScrollActive(false), + mpContentWindow(mrSlideSorter.GetContentWindow()) +{ + // Hide the scroll bars by default to prevent display errors while + // switching between view shells: In the short time between initiating + // such a switch and the final rearrangement of UI controls the scroll + // bars and the filler where displayed in the upper left corner of the + // ViewTabBar. + mpHorizontalScrollBar->Hide(); + mpVerticalScrollBar->Hide(); + + maAutoScrollTimer.SetTimeout(25); + maAutoScrollTimer.SetInvokeHandler ( + LINK(this, ScrollBarManager, AutoScrollTimeoutHandler)); +} + +ScrollBarManager::~ScrollBarManager() +{ +} + +void ScrollBarManager::Connect() +{ + if (mpVerticalScrollBar != nullptr) + { + mpVerticalScrollBar->SetScrollHdl ( + LINK(this, ScrollBarManager, VerticalScrollBarHandler)); + } + if (mpHorizontalScrollBar != nullptr) + { + mpHorizontalScrollBar->SetScrollHdl( + LINK(this, ScrollBarManager, HorizontalScrollBarHandler)); + } +} + +void ScrollBarManager::Disconnect() +{ + if (mpVerticalScrollBar != nullptr) + { + mpVerticalScrollBar->SetScrollHdl( Link() ); + } + if (mpHorizontalScrollBar != nullptr) + { + mpHorizontalScrollBar->SetScrollHdl( Link() ); + } +} + +/** Placing the scroll bars is an iterative process. The visibility of one + scroll bar affects the remaining size and thus may lead to the other + scroll bar becoming visible. + + First we determine the visibility of the horizontal scroll bar. After + that we do the same for the vertical scroll bar. To have an initial + value for the required size we call the layouter before that. When one + of the two scroll bars is made visible then the size of the browser + window changes and a second call to the layouter becomes necessary. + That call is made anyway after this method returns. +*/ +::tools::Rectangle ScrollBarManager::PlaceScrollBars ( + const ::tools::Rectangle& rAvailableArea, + const bool bIsHorizontalScrollBarAllowed, + const bool bIsVerticalScrollBarAllowed) +{ + ::tools::Rectangle aRemainingSpace (DetermineScrollBarVisibilities( + rAvailableArea, + bIsHorizontalScrollBarAllowed, + bIsVerticalScrollBarAllowed)); + + if (mpHorizontalScrollBar!=nullptr && mpHorizontalScrollBar->IsVisible()) + PlaceHorizontalScrollBar (rAvailableArea); + + if (mpVerticalScrollBar!=nullptr && mpVerticalScrollBar->IsVisible()) + PlaceVerticalScrollBar (rAvailableArea); + + return aRemainingSpace; +} + +void ScrollBarManager::PlaceHorizontalScrollBar (const ::tools::Rectangle& aAvailableArea) +{ + // Save the current relative position. + mnHorizontalPosition = double(mpHorizontalScrollBar->GetThumbPos()) + / double(mpHorizontalScrollBar->GetRange().Len()); + + // Place the scroll bar. + Size aScrollBarSize (mpHorizontalScrollBar->GetSizePixel()); + mpHorizontalScrollBar->SetPosSizePixel ( + Point(aAvailableArea.Left(), + aAvailableArea.Bottom()-aScrollBarSize.Height()+1), + Size (aAvailableArea.GetWidth() - GetVerticalScrollBarWidth(), + aScrollBarSize.Height())); + + // Restore the relative position. + mpHorizontalScrollBar->SetThumbPos( + static_cast<::tools::Long>(0.5 + mnHorizontalPosition * mpHorizontalScrollBar->GetRange().Len())); +} + +void ScrollBarManager::PlaceVerticalScrollBar (const ::tools::Rectangle& aArea) +{ + const sal_Int32 nThumbPosition (mpVerticalScrollBar->GetThumbPos()); + + // Place the scroll bar. + Size aScrollBarSize (mpVerticalScrollBar->GetSizePixel()); + Point aPosition (aArea.Right()-aScrollBarSize.Width()+1, aArea.Top()); + Size aSize (aScrollBarSize.Width(), aArea.GetHeight() - GetHorizontalScrollBarHeight()); + mpVerticalScrollBar->SetPosSizePixel(aPosition, aSize); + + // Restore the position. + mpVerticalScrollBar->SetThumbPos(static_cast<::tools::Long>(nThumbPosition)); + mnVerticalPosition = nThumbPosition / double(mpVerticalScrollBar->GetRange().Len()); +} + +void ScrollBarManager::UpdateScrollBars(bool bUseScrolling) +{ + ::tools::Rectangle aModelArea (mrSlideSorter.GetView().GetModelArea()); + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + Size aWindowModelSize (pWindow->PixelToLogic(pWindow->GetSizePixel())); + + // The horizontal scroll bar is only shown when the window is + // horizontally smaller than the view. + if (mpHorizontalScrollBar != nullptr && mpHorizontalScrollBar->IsVisible()) + { + mpHorizontalScrollBar->Show(); + mpHorizontalScrollBar->SetRange ( + Range(aModelArea.Left(), aModelArea.Right())); + mnHorizontalPosition = + double(mpHorizontalScrollBar->GetThumbPos()) + / double(mpHorizontalScrollBar->GetRange().Len()); + + mpHorizontalScrollBar->SetVisibleSize (aWindowModelSize.Width()); + + const ::tools::Long nWidth (mpContentWindow->PixelToLogic( + mpContentWindow->GetSizePixel()).Width()); + // Make the line size about 10% of the visible width. + mpHorizontalScrollBar->SetLineSize (nWidth / 10); + // Make the page size about 90% of the visible width. + mpHorizontalScrollBar->SetPageSize ((nWidth * 9) / 10); + } + else + { + mnHorizontalPosition = 0; + } + + // The vertical scroll bar is always shown. + if (mpVerticalScrollBar != nullptr && mpVerticalScrollBar->IsVisible()) + { + mpVerticalScrollBar->SetRange ( + Range(aModelArea.Top(), aModelArea.Bottom())); + mnVerticalPosition = + double(mpVerticalScrollBar->GetThumbPos()) + / double(mpVerticalScrollBar->GetRange().Len()); + + mpVerticalScrollBar->SetVisibleSize (aWindowModelSize.Height()); + + const ::tools::Long nHeight (mpContentWindow->PixelToLogic( + mpContentWindow->GetSizePixel()).Height()); + // Make the line size about 10% of the visible height. + mpVerticalScrollBar->SetLineSize (nHeight / 10); + // Make the page size about 90% of the visible height. + mpVerticalScrollBar->SetPageSize ((nHeight * 9) / 10); + } + else + { + mnVerticalPosition = 0; + } + + double nEps (::std::numeric_limits::epsilon()); + if (fabs(mnHorizontalPosition-pWindow->GetVisibleX()) > nEps + || fabs(mnVerticalPosition-pWindow->GetVisibleY()) > nEps) + { + mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); + if (bUseScrolling) + pWindow->SetVisibleXY(mnHorizontalPosition, mnVerticalPosition); + else + SetWindowOrigin(mnHorizontalPosition, mnVerticalPosition); + } +} + +IMPL_LINK_NOARG(ScrollBarManager, VerticalScrollBarHandler, weld::Scrollbar&, void) +{ + if (mpVerticalScrollBar->IsVisible() && mrSlideSorter.GetContentWindow()) + { + double nRelativePosition = double(mpVerticalScrollBar->GetThumbPos()) + / double(mpVerticalScrollBar->GetRange().Len()); + mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); + mrSlideSorter.GetContentWindow()->SetVisibleXY(-1, nRelativePosition); + mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking(); + } +} + +IMPL_LINK_NOARG(ScrollBarManager, HorizontalScrollBarHandler, weld::Scrollbar&, void) +{ + if (mpHorizontalScrollBar->IsVisible() && mrSlideSorter.GetContentWindow()) + { + double nRelativePosition = double(mpHorizontalScrollBar->GetThumbPos()) + / double(mpHorizontalScrollBar->GetRange().Len()); + mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); + mrSlideSorter.GetContentWindow()->SetVisibleXY(nRelativePosition, -1); + mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking(); + } +} + +void ScrollBarManager::SetWindowOrigin ( + double nHorizontalPosition, + double nVerticalPosition) +{ + mnHorizontalPosition = nHorizontalPosition; + mnVerticalPosition = nVerticalPosition; + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + Size aViewSize (pWindow->GetViewSize()); + Point aOrigin ( + static_cast<::tools::Long>(mnHorizontalPosition * aViewSize.Width()), + static_cast<::tools::Long>(mnVerticalPosition * aViewSize.Height())); + + pWindow->SetWinViewPos (aOrigin); + pWindow->UpdateMapMode (); + pWindow->Invalidate (); +} + +/** Determining the visibility of the scroll bars is quite complicated. The + visibility of one influences that of the other because showing a scroll + bar makes the available space smaller and may lead to the need of + displaying the other. + To solve this we test all four combinations of showing or hiding each + scroll bar and use the best one. The best one is that combination that + a) shows the least number of scroll bars with preference of showing the + vertical over showing the horizontal and + b) when not showing a scroll bar the area used by the page objects fits + into the available area in the scroll bars orientation. +*/ +::tools::Rectangle ScrollBarManager::DetermineScrollBarVisibilities ( + const ::tools::Rectangle& rAvailableArea, + const bool bIsHorizontalScrollBarAllowed, + const bool bIsVerticalScrollBarAllowed) +{ + // Test which combination of scroll bars is the best. + bool bShowHorizontal = false; + bool bShowVertical = false; + if (mrSlideSorter.GetModel().GetPageCount() == 0) + { + // No pages => no scroll bars. + } + else if (TestScrollBarVisibilities(false, false, rAvailableArea)) + { + // Nothing to be done. + } + else if (bIsHorizontalScrollBarAllowed + && TestScrollBarVisibilities(true, false, rAvailableArea)) + { + bShowHorizontal = true; + } + else if (bIsVerticalScrollBarAllowed + && TestScrollBarVisibilities(false, true, rAvailableArea)) + { + bShowVertical = true; + } + else + { + bShowHorizontal = true; + bShowVertical = true; + } + + // Make the visibility of the scroll bars permanent. + mpVerticalScrollBar->Show(bShowVertical); + mpHorizontalScrollBar->Show(bShowHorizontal); + + // Adapt the remaining space accordingly. + ::tools::Rectangle aRemainingSpace (rAvailableArea); + if (bShowVertical) + aRemainingSpace.AdjustRight( -(mpVerticalScrollBar->GetSizePixel().Width()) ); + if (bShowHorizontal) + aRemainingSpace.AdjustBottom( -(mpHorizontalScrollBar->GetSizePixel().Height()) ); + + return aRemainingSpace; +} + +bool ScrollBarManager::TestScrollBarVisibilities ( + bool bHorizontalScrollBarVisible, + bool bVerticalScrollBarVisible, + const ::tools::Rectangle& rAvailableArea) +{ + model::SlideSorterModel& rModel (mrSlideSorter.GetModel()); + + // Adapt the available size by subtracting the sizes of the scroll bars + // visible in this combination. + Size aBrowserSize (rAvailableArea.GetSize()); + if (bHorizontalScrollBarVisible) + aBrowserSize.AdjustHeight( -(mpHorizontalScrollBar->GetSizePixel().Height()) ); + if (bVerticalScrollBarVisible) + aBrowserSize.AdjustWidth( -(mpVerticalScrollBar->GetSizePixel().Width()) ); + + // Tell the view to rearrange its page objects and check whether the + // page objects can be shown without clipping. + bool bRearrangeSuccess (mrSlideSorter.GetView().GetLayouter().Rearrange ( + mrSlideSorter.GetView().GetOrientation(), + aBrowserSize, + rModel.GetPageDescriptor(0)->GetPage()->GetSize(), + rModel.GetPageCount())); + + if (bRearrangeSuccess) + { + Size aPageSize = mrSlideSorter.GetView().GetLayouter().GetTotalBoundingBox().GetSize(); + Size aWindowModelSize = mpContentWindow->PixelToLogic(aBrowserSize); + + // The content may be clipped, i.e. not fully visible, in one + // direction only when the scroll bar is visible in that direction. + if (aPageSize.Width() > aWindowModelSize.Width()) + if ( ! bHorizontalScrollBarVisible) + return false; + if (aPageSize.Height() > aWindowModelSize.Height()) + if ( ! bVerticalScrollBarVisible) + return false; + + return true; + } + else + return false; +} + +void ScrollBarManager::SetTopLeft(const Point& rNewTopLeft) +{ + if (( ! mpVerticalScrollBar + || mpVerticalScrollBar->GetThumbPos() == rNewTopLeft.Y()) + && ( ! mpHorizontalScrollBar + || mpHorizontalScrollBar->GetThumbPos() == rNewTopLeft.X())) + return; + + // Flush pending repaints before scrolling to avoid temporary artifacts. + mrSlideSorter.GetContentWindow()->PaintImmediately(); + + if (mpVerticalScrollBar) + { + mpVerticalScrollBar->SetThumbPos(rNewTopLeft.Y()); + mnVerticalPosition = rNewTopLeft.Y() / double(mpVerticalScrollBar->GetRange().Len()); + } + if (mpHorizontalScrollBar) + { + mpHorizontalScrollBar->SetThumbPos(rNewTopLeft.X()); + mnHorizontalPosition = rNewTopLeft.X() / double(mpHorizontalScrollBar->GetRange().Len()); + } + + mrSlideSorter.GetContentWindow()->SetVisibleXY(mnHorizontalPosition, mnVerticalPosition); + mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); +} + +int ScrollBarManager::GetVerticalScrollBarWidth() const +{ + if (mpVerticalScrollBar != nullptr && mpVerticalScrollBar->IsVisible()) + return mpVerticalScrollBar->GetSizePixel().Width(); + else + return 0; +} + +int ScrollBarManager::GetHorizontalScrollBarHeight() const +{ + if (mpHorizontalScrollBar != nullptr && mpHorizontalScrollBar->IsVisible()) + return mpHorizontalScrollBar->GetSizePixel().Height(); + else + return 0; +} + +void ScrollBarManager::CalcAutoScrollOffset (const Point& rMouseWindowPosition) +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + + int nDx = 0; + int nDy = 0; + + Size aWindowSize = pWindow->GetOutputSizePixel(); + ::tools::Rectangle aWindowArea (pWindow->GetPosPixel(), aWindowSize); + ::tools::Rectangle aViewPixelArea ( + pWindow->LogicToPixel(mrSlideSorter.GetView().GetModelArea())); + + if (aWindowSize.Width() > maScrollBorder.Width() * 3 + && mpHorizontalScrollBar != nullptr + && mpHorizontalScrollBar->IsVisible()) + { + if (rMouseWindowPosition.X() < maScrollBorder.Width() + && aWindowArea.Left() > aViewPixelArea.Left()) + { + nDx = -1 + static_cast(gnHorizontalScrollFactor + * (rMouseWindowPosition.X() - maScrollBorder.Width())); + } + + if (rMouseWindowPosition.X() >= (aWindowSize.Width() - maScrollBorder.Width()) + && aWindowArea.Right() < aViewPixelArea.Right()) + { + nDx = 1 + static_cast(gnHorizontalScrollFactor + * (rMouseWindowPosition.X() - aWindowSize.Width() + + maScrollBorder.Width())); + } + } + + if (aWindowSize.Height() > maScrollBorder.Height() * 3 + && aWindowSize.Height() < aViewPixelArea.GetHeight()) + { + if (rMouseWindowPosition.Y() < maScrollBorder.Height() + && aWindowArea.Top() > aViewPixelArea.Top()) + { + nDy = -1 + static_cast(gnVerticalScrollFactor + * (rMouseWindowPosition.Y() - maScrollBorder.Height())); + } + + if (rMouseWindowPosition.Y() >= (aWindowSize.Height() - maScrollBorder.Height()) + && aWindowArea.Bottom() < aViewPixelArea.Bottom()) + { + nDy = 1 + static_cast(gnVerticalScrollFactor + * (rMouseWindowPosition.Y() - aWindowSize.Height() + + maScrollBorder.Height())); + } + } + + maAutoScrollOffset = Size(nDx,nDy); +} + +bool ScrollBarManager::AutoScroll ( + const Point& rMouseWindowPosition, + const ::std::function& rAutoScrollFunctor) +{ + maAutoScrollFunctor = rAutoScrollFunctor; + CalcAutoScrollOffset(rMouseWindowPosition); + bool bResult (true); + if ( ! mbIsAutoScrollActive) + bResult = RepeatAutoScroll(); + + return bResult; +} + +void ScrollBarManager::StopAutoScroll() +{ + maAutoScrollTimer.Stop(); + mbIsAutoScrollActive = false; +} + +bool ScrollBarManager::RepeatAutoScroll() +{ + if (maAutoScrollOffset != Size(0,0)) + { + if (mrSlideSorter.GetViewShell() != nullptr) + { + mrSlideSorter.GetViewShell()->Scroll( + maAutoScrollOffset.Width(), + maAutoScrollOffset.Height()); + mrSlideSorter.GetView().InvalidatePageObjectVisibilities(); + + if (maAutoScrollFunctor) + maAutoScrollFunctor(); + + mbIsAutoScrollActive = true; + maAutoScrollTimer.Start(); + + return true; + } + } + + clearAutoScrollFunctor(); + mbIsAutoScrollActive = false; + return false; +} + +void ScrollBarManager::clearAutoScrollFunctor() +{ + maAutoScrollFunctor = ::std::function(); +} + +IMPL_LINK_NOARG(ScrollBarManager, AutoScrollTimeoutHandler, Timer *, void) +{ + RepeatAutoScroll(); +} + +void ScrollBarManager::Scroll( + const Orientation eOrientation, + const sal_Int32 nDistance) +{ + bool bIsVertical (false); + switch (eOrientation) + { + case Orientation_Horizontal: bIsVertical = false; break; + case Orientation_Vertical: bIsVertical = true; break; + default: + OSL_ASSERT(eOrientation==Orientation_Horizontal || eOrientation==Orientation_Vertical); + return; + } + + Point aNewTopLeft ( + mpHorizontalScrollBar ? mpHorizontalScrollBar->GetThumbPos() : 0, + mpVerticalScrollBar ? mpVerticalScrollBar->GetThumbPos() : 0); + + view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter()); + + // Calculate estimate of new location. + if (bIsVertical) + aNewTopLeft.AdjustY(nDistance * rLayouter.GetPageObjectSize().Height() ); + else + aNewTopLeft.AdjustX(nDistance * rLayouter.GetPageObjectSize().Width() ); + + // Adapt location to show whole slides. + if (bIsVertical) + if (nDistance > 0) + { + const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( + Point(aNewTopLeft.X(), aNewTopLeft.Y()+mpVerticalScrollBar->GetVisibleSize()), + true)); + aNewTopLeft.setY( rLayouter.GetPageObjectBox(nIndex,true).Bottom() + - mpVerticalScrollBar->GetVisibleSize() ); + } + else + { + const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( + Point(aNewTopLeft.X(), aNewTopLeft.Y()), + true)); + aNewTopLeft.setY( rLayouter.GetPageObjectBox(nIndex,true).Top() ); + } + else + if (nDistance > 0) + { + const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( + Point(aNewTopLeft.X()+mpVerticalScrollBar->GetVisibleSize(), aNewTopLeft.Y()), + true)); + aNewTopLeft.setX( rLayouter.GetPageObjectBox(nIndex,true).Right() + - mpVerticalScrollBar->GetVisibleSize() ); + } + else + { + const sal_Int32 nIndex (rLayouter.GetIndexAtPoint( + Point(aNewTopLeft.X(), aNewTopLeft.Y()), + true)); + aNewTopLeft.setX( rLayouter.GetPageObjectBox(nIndex,true).Left() ); + } + + mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking(); + SetTopLeft(aNewTopLeft); +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx new file mode 100644 index 0000000000..1af2abcabf --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx @@ -0,0 +1,1476 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include +#include +#include "SlsDragAndDropContext.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +const sal_uInt32 SINGLE_CLICK (0x00000001); +const sal_uInt32 DOUBLE_CLICK (0x00000002); +const sal_uInt32 LEFT_BUTTON (0x00000010); +const sal_uInt32 RIGHT_BUTTON (0x00000020); +const sal_uInt32 MIDDLE_BUTTON (0x00000040); +const sal_uInt32 BUTTON_DOWN (0x00000100); +const sal_uInt32 BUTTON_UP (0x00000200); +const sal_uInt32 MOUSE_MOTION (0x00000400); +const sal_uInt32 MOUSE_DRAG (0x00000800); +// The rest leaves the lower 16 bit untouched so that it can be used with +// key codes. +const sal_uInt32 OVER_SELECTED_PAGE (0x00010000); +const sal_uInt32 OVER_UNSELECTED_PAGE (0x00020000); +const sal_uInt32 SHIFT_MODIFIER (0x00200000); +const sal_uInt32 CONTROL_MODIFIER (0x00400000); + +// Some absent events are defined so they can be expressed explicitly. +const sal_uInt32 NO_MODIFIER (0x00000000); +const sal_uInt32 NOT_OVER_PAGE (0x00000000); + +// Masks +const sal_uInt32 MODIFIER_MASK (SHIFT_MODIFIER | CONTROL_MODIFIER); + +} // end of anonymous namespace + +// Define some macros to make the following switch statement more readable. +#define ANY_MODIFIER(code) \ + code|NO_MODIFIER: \ + case code|SHIFT_MODIFIER: \ + case code|CONTROL_MODIFIER + +namespace sd::slidesorter::controller { + +//===== SelectionFunction::EventDescriptor ==================================== + +class SelectionFunction::EventDescriptor +{ +public: + Point maMousePosition; + Point maMouseModelPosition; + model::SharedPageDescriptor mpHitDescriptor; + SdrPage* mpHitPage; + sal_uInt32 mnEventCode; + InsertionIndicatorHandler::Mode meDragMode; + bool mbIsLeaving; + + EventDescriptor ( + sal_uInt32 nEventType, + const MouseEvent& rEvent, + SlideSorter const & rSlideSorter); + EventDescriptor ( + sal_uInt32 nEventType, + const AcceptDropEvent& rEvent, + const sal_Int8 nDragAction, + SlideSorter const & rSlideSorter); + +private: + /** Compute a numerical code that describes a mouse event and that can + be used for fast look up of the appropriate reaction. + */ + sal_uInt32 EncodeMouseEvent (const MouseEvent& rEvent) const; + + /** Compute a numerical code that describes the current state like + whether the selection rectangle is visible or whether the page under + the mouse or the one that has the focus is selected. + */ + sal_uInt32 EncodeState() const; +}; + +//===== SelectionFunction::ModeHandler ======================================== + +class SelectionFunction::ModeHandler +{ +public: + ModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction, + const bool bIsMouseOverIndicatorAllowed); + virtual ~ModeHandler() COVERITY_NOEXCEPT_FALSE; + + virtual Mode GetMode() const = 0; + virtual void Abort() = 0; + virtual void ProcessEvent (EventDescriptor& rDescriptor); + + /** Set the selection to exactly the specified page and also set it as + the current page. + */ + void SetCurrentPage (const model::SharedPageDescriptor& rpDescriptor); + + /// Deselect all pages. + void DeselectAllPages(); + void SelectOnePage (const model::SharedPageDescriptor& rpDescriptor); + + /** When the view on which this selection function is working is the + main view then the view is switched to the regular editing view. + */ + void SwitchView (const model::SharedPageDescriptor& rpDescriptor); + + void StartDrag ( + const Point& rMousePosition); + + bool IsMouseOverIndicatorAllowed() const { return mbIsMouseOverIndicatorAllowed;} + +protected: + SlideSorter& mrSlideSorter; + SelectionFunction& mrSelectionFunction; + + virtual bool ProcessButtonDownEvent (EventDescriptor& rDescriptor); + virtual bool ProcessButtonUpEvent (EventDescriptor& rDescriptor); + virtual bool ProcessMotionEvent (EventDescriptor& rDescriptor); + virtual bool ProcessDragEvent (EventDescriptor& rDescriptor); + virtual bool HandleUnprocessedEvent (EventDescriptor& rDescriptor); + + void ReprocessEvent (EventDescriptor& rDescriptor); + +private: + const bool mbIsMouseOverIndicatorAllowed; +}; + +namespace { + +/** This is the default handler for processing events. It activates the + multi selection or drag-and-drop when the right conditions are met. +*/ +class NormalModeHandler : public SelectionFunction::ModeHandler +{ +public: + NormalModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction); + + virtual SelectionFunction::Mode GetMode() const override; + virtual void Abort() override; + + void ResetButtonDownLocation(); + +protected: + virtual bool ProcessButtonDownEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + virtual bool ProcessButtonUpEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + virtual bool ProcessMotionEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + virtual bool ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + +private: + ::std::optional maButtonDownLocation; + + /** Select all pages between and including the selection anchor and the + specified page. + */ + void RangeSelect (const model::SharedPageDescriptor& rpDescriptor); +}; + +/** Handle events during a multi selection, which typically is started by + pressing the left mouse button when not over a page. +*/ +class MultiSelectionModeHandler : public SelectionFunction::ModeHandler +{ +public: + /** Start a rectangle selection at the given position. + */ + MultiSelectionModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction, + const Point& rMouseModelPosition, + const sal_uInt32 nEventCode); + + virtual ~MultiSelectionModeHandler() override; + + virtual SelectionFunction::Mode GetMode() const override; + virtual void Abort() override; + virtual void ProcessEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + + enum SelectionMode { SM_Normal, SM_Add, SM_Toggle }; + + void SetSelectionMode (const SelectionMode eSelectionMode); + void SetSelectionModeFromModifier (const sal_uInt32 nEventCode); + +protected: + virtual bool ProcessButtonUpEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + virtual bool ProcessMotionEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + virtual bool HandleUnprocessedEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + +private: + SelectionMode meSelectionMode; + Point maSecondCorner; + PointerStyle maSavedPointer; + bool mbAutoScrollInstalled; + sal_Int32 mnAnchorIndex; + sal_Int32 mnSecondIndex; + + void UpdateModelPosition (const Point& rMouseModelPosition); + void UpdateSelection(); + + /** Update the rectangle selection so that the given position becomes + the new second point of the selection rectangle. + */ + void UpdatePosition ( + const Point& rMousePosition, + const bool bAllowAutoScroll); + + void UpdateSelectionState ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bIsInSelection) const; +}; + +/** Handle events during drag-and-drop. +*/ +class DragAndDropModeHandler : public SelectionFunction::ModeHandler +{ +public: + DragAndDropModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction, + const Point& rMousePosition, + vcl::Window* pWindow); + virtual ~DragAndDropModeHandler() override; + + virtual SelectionFunction::Mode GetMode() const override; + virtual void Abort() override; + +protected: + virtual bool ProcessButtonUpEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + virtual bool ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor) override; + +private: + std::unique_ptr> mpDragAndDropContext; +}; + +} + +//===== SelectionFunction ===================================================== + + +SelectionFunction::SelectionFunction ( + SlideSorter& rSlideSorter, + SfxRequest& rRequest) + : FuPoor ( + rSlideSorter.GetViewShell(), + rSlideSorter.GetContentWindow(), + &rSlideSorter.GetView(), + rSlideSorter.GetModel().GetDocument(), + rRequest), + mrSlideSorter(rSlideSorter), + mrController(mrSlideSorter.GetController()), + mnShiftKeySelectionAnchor(-1), + mpModeHandler(std::make_shared(rSlideSorter, *this)) +{ +} + +SelectionFunction::~SelectionFunction() +{ + mpModeHandler.reset(); +} + +rtl::Reference SelectionFunction::Create( + SlideSorter& rSlideSorter, + SfxRequest& rRequest) +{ + rtl::Reference xFunc( new SelectionFunction( rSlideSorter, rRequest ) ); + return xFunc; +} + +bool SelectionFunction::MouseButtonDown (const MouseEvent& rEvent) +{ + // remember button state for creation of own MouseEvents + SetMouseButtonCode (rEvent.GetButtons()); + aMDPos = rEvent.GetPosPixel(); + + // mpWindow->CaptureMouse(); + + ProcessMouseEvent(BUTTON_DOWN, rEvent); + + return true; +} + +bool SelectionFunction::MouseMove (const MouseEvent& rEvent) +{ + ProcessMouseEvent(MOUSE_MOTION, rEvent); + return true; +} + +bool SelectionFunction::MouseButtonUp (const MouseEvent& rEvent) +{ + mrController.GetScrollBarManager().StopAutoScroll (); + + ProcessMouseEvent(BUTTON_UP, rEvent); + + return true; +} + +void SelectionFunction::NotifyDragFinished() +{ + SwitchToNormalMode(); +} + +bool SelectionFunction::KeyInput (const KeyEvent& rEvent) +{ + view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); + PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter); + PageSelector::UpdateLock aLock (mrSlideSorter); + FocusManager& rFocusManager (mrController.GetFocusManager()); + bool bResult = false; + + const vcl::KeyCode& rCode (rEvent.GetKeyCode()); + switch (rCode.GetCode()) + { + case KEY_RETURN: + { + model::SharedPageDescriptor pDescriptor (rFocusManager.GetFocusedPageDescriptor()); + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (rFocusManager.HasFocus() && pDescriptor && pViewShell!=nullptr) + { + // The Return key triggers different functions depending on + // whether the slide sorter is the main view or displayed in + // the right pane. + if (pViewShell->IsMainViewShell()) + { + mpModeHandler->SetCurrentPage(pDescriptor); + mpModeHandler->SwitchView(pDescriptor); + } + else if (pViewShell->GetDispatcher() != nullptr) + { + // tdf#111737 - add new (master) page depending on the edit mode + pViewShell->GetDispatcher()->Execute( + mrSlideSorter.GetModel().GetEditMode() == EditMode::Page + ? SID_INSERTPAGE + : SID_INSERT_MASTER_PAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + bResult = true; + } + break; + } + + case KEY_TAB: + if ( ! rFocusManager.IsFocusShowing()) + { + rFocusManager.ShowFocus(); + bResult = true; + } + break; + + case KEY_ESCAPE: + // When there is an active multiselection or drag-and-drop + // operation then stop that. + mpModeHandler->Abort(); + SwitchToNormalMode(); + bResult = true; + break; + + case KEY_SPACE: + { + // Toggle the selection state. + model::SharedPageDescriptor pDescriptor (rFocusManager.GetFocusedPageDescriptor()); + if (pDescriptor && rCode.IsMod1()) + { + if (pDescriptor->HasState(model::PageDescriptor::ST_Selected)) + mrController.GetPageSelector().DeselectPage(pDescriptor, false); + else + mrController.GetPageSelector().SelectPage(pDescriptor); + } + bResult = true; + } + break; + + // Move the focus indicator left. + case KEY_LEFT: + MoveFocus(FocusManager::FocusMoveDirection::Left, rCode.IsShift(), rCode.IsMod1()); + bResult = true; + break; + + // Move the focus indicator right. + case KEY_RIGHT: + MoveFocus(FocusManager::FocusMoveDirection::Right, rCode.IsShift(), rCode.IsMod1()); + bResult = true; + break; + + // Move the focus indicator up. + case KEY_UP: + MoveFocus(FocusManager::FocusMoveDirection::Up, rCode.IsShift(), rCode.IsMod1()); + bResult = true; + break; + + // Move the focus indicator down. + case KEY_DOWN: + MoveFocus(FocusManager::FocusMoveDirection::Down, rCode.IsShift(), rCode.IsMod1()); + bResult = true; + break; + + // Go to previous page. No wrap around. + case KEY_PAGEUP: + GotoNextPage(-1); + bResult = true; + break; + + // Go to next page. No wrap around... + case KEY_PAGEDOWN: + GotoNextPage(+1); + bResult = true; + break; + + case KEY_HOME: + GotoPage(0); + bResult = true; + break; + + case KEY_END: + GotoPage(mrSlideSorter.GetModel().GetPageCount()-1); + bResult = true; + break; + + case KEY_DELETE: + case KEY_BACKSPACE: + { + mrController.GetSelectionManager()->DeleteSelectedPages(rCode.GetCode()==KEY_DELETE); + + mnShiftKeySelectionAnchor = -1; + bResult = true; + } + break; + + case KEY_F10: + if (rCode.IsShift()) + { + mpModeHandler->SelectOnePage( + mrSlideSorter.GetController().GetFocusManager().GetFocusedPageDescriptor()); + } + break; + + default: + break; + } + + if ( ! bResult) + bResult = FuPoor::KeyInput(rEvent); + + return bResult; +} + +void SelectionFunction::MoveFocus ( + const FocusManager::FocusMoveDirection eDirection, + const bool bIsShiftDown, + const bool bIsControlDown) +{ + // Remember the anchor of shift key multi selection. + if (bIsShiftDown) + { + if (mnShiftKeySelectionAnchor<0) + { + model::SharedPageDescriptor pFocusedDescriptor ( + mrController.GetFocusManager().GetFocusedPageDescriptor()); + mnShiftKeySelectionAnchor = pFocusedDescriptor->GetPageIndex(); + } + } + else if ( ! bIsControlDown) + ResetShiftKeySelectionAnchor(); + + mrController.GetFocusManager().MoveFocus(eDirection); + + PageSelector& rSelector (mrController.GetPageSelector()); + model::SharedPageDescriptor pFocusedDescriptor ( + mrController.GetFocusManager().GetFocusedPageDescriptor()); + if (bIsShiftDown) + { + // When shift is pressed then select all pages in the range between + // the currently and the previously focused pages, including them. + if (pFocusedDescriptor) + { + sal_Int32 nPageRangeEnd (pFocusedDescriptor->GetPageIndex()); + model::PageEnumeration aPages ( + model::PageEnumerationProvider::CreateAllPagesEnumeration( + mrSlideSorter.GetModel())); + while (aPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aPages.GetNextElement()); + if (pDescriptor) + { + const sal_Int32 nPageIndex(pDescriptor->GetPageIndex()); + if ((nPageIndex>=mnShiftKeySelectionAnchor && nPageIndex<=nPageRangeEnd) + || (nPageIndex<=mnShiftKeySelectionAnchor && nPageIndex>=nPageRangeEnd)) + { + rSelector.SelectPage(pDescriptor); + } + else + { + rSelector.DeselectPage(pDescriptor); + } + } + } + } + } + else if (bIsControlDown) + { + // When control is pressed then do not alter the selection or the + // current page, just move the focus. + } + else + { + // Without shift just select the focused page. + mpModeHandler->SelectOnePage(pFocusedDescriptor); + } +} + +void SelectionFunction::DoCut() +{ + mrController.GetClipboard().DoCut(); +} + +void SelectionFunction::DoCopy() +{ + mrController.GetClipboard().DoCopy(); +} + +void SelectionFunction::DoPaste() +{ + mrController.GetClipboard().DoPaste(); +} + +bool SelectionFunction::cancel() +{ + mrController.GetFocusManager().ToggleFocus(); + return true; +} + +void SelectionFunction::GotoNextPage (int nOffset) +{ + model::SharedPageDescriptor pDescriptor + = mrController.GetCurrentSlideManager()->GetCurrentSlide(); + if (pDescriptor) + { + SdPage* pPage = pDescriptor->GetPage(); + OSL_ASSERT(pPage!=nullptr); + sal_Int32 nIndex = (pPage->GetPageNum()-1) / 2; + GotoPage(nIndex + nOffset); + } + ResetShiftKeySelectionAnchor(); +} + +void SelectionFunction::GotoPage (int nIndex) +{ + sal_uInt16 nPageCount = static_cast(mrSlideSorter.GetModel().GetPageCount()); + + if (nIndex >= nPageCount) + nIndex = nPageCount - 1; + if (nIndex < 0) + nIndex = 0; + + mrController.GetFocusManager().SetFocusedPage(nIndex); + model::SharedPageDescriptor pNextPageDescriptor ( + mrSlideSorter.GetModel().GetPageDescriptor (nIndex)); + if (pNextPageDescriptor) + mpModeHandler->SetCurrentPage(pNextPageDescriptor); + else + { + OSL_ASSERT(pNextPageDescriptor); + } + ResetShiftKeySelectionAnchor(); +} + +void SelectionFunction::ProcessMouseEvent (sal_uInt32 nEventType, const MouseEvent& rEvent) +{ + // #95491# remember button state for creation of own MouseEvents + SetMouseButtonCode (rEvent.GetButtons()); + + EventDescriptor aEventDescriptor (nEventType, rEvent, mrSlideSorter); + ProcessEvent(aEventDescriptor); +} + +void SelectionFunction::MouseDragged ( + const AcceptDropEvent& rEvent, + const sal_Int8 nDragAction) +{ + EventDescriptor aEventDescriptor (MOUSE_DRAG, rEvent, nDragAction, mrSlideSorter); + ProcessEvent(aEventDescriptor); +} + +void SelectionFunction::ProcessEvent (EventDescriptor& rDescriptor) +{ + // The call to ProcessEvent may switch to another mode handler. + // Prevent the untimely destruction of the called handler by acquiring a + // temporary reference here. + std::shared_ptr pModeHandler (mpModeHandler); + pModeHandler->ProcessEvent(rDescriptor); +} + +static bool Match ( + const sal_uInt32 nEventCode, + const sal_uInt32 nPositivePattern) +{ + return (nEventCode & nPositivePattern)==nPositivePattern; +} + +void SelectionFunction::SwitchToNormalMode() +{ + if (mpModeHandler->GetMode() != NormalMode) + SwitchMode(std::make_shared(mrSlideSorter, *this)); +} + +void SelectionFunction::SwitchToDragAndDropMode (const Point& rMousePosition) +{ + if (mpModeHandler->GetMode() == DragAndDropMode) + return; + + SwitchMode(std::make_shared(mrSlideSorter, *this, rMousePosition, mpWindow)); +} + +void SelectionFunction::SwitchToMultiSelectionMode ( + const Point& rMousePosition, + const sal_uInt32 nEventCode) +{ + if (mpModeHandler->GetMode() != MultiSelectionMode) + SwitchMode(std::make_shared(mrSlideSorter, *this, rMousePosition, nEventCode)); +} + +void SelectionFunction::SwitchMode (const std::shared_ptr& rpHandler) +{ + // Not all modes allow mouse over indicator. + if (mpModeHandler->IsMouseOverIndicatorAllowed() != rpHandler->IsMouseOverIndicatorAllowed()) + { + if ( ! rpHandler->IsMouseOverIndicatorAllowed()) + { + mrSlideSorter.GetView().SetPageUnderMouse(model::SharedPageDescriptor()); + } + else + mrSlideSorter.GetView().UpdatePageUnderMouse(); + } + + mpModeHandler = rpHandler; +} + +void SelectionFunction::ResetShiftKeySelectionAnchor() +{ + mnShiftKeySelectionAnchor = -1; +} + +void SelectionFunction::ResetMouseAnchor() +{ + if (mpModeHandler && mpModeHandler->GetMode() == NormalMode) + { + std::shared_ptr pHandler ( + std::dynamic_pointer_cast(mpModeHandler)); + if (pHandler) + pHandler->ResetButtonDownLocation(); + } +} + +//===== EventDescriptor ======================================================= + +SelectionFunction::EventDescriptor::EventDescriptor ( + const sal_uInt32 nEventType, + const MouseEvent& rEvent, + SlideSorter const & rSlideSorter) + : maMousePosition(rEvent.GetPosPixel()), + mpHitPage(), + mnEventCode(nEventType), + meDragMode(InsertionIndicatorHandler::MoveMode), + mbIsLeaving(false) +{ + maMouseModelPosition = rSlideSorter.GetContentWindow()->PixelToLogic(maMousePosition); + mpHitDescriptor = rSlideSorter.GetController().GetPageAt(maMousePosition); + if (mpHitDescriptor) + { + mpHitPage = mpHitDescriptor->GetPage(); + } + + mnEventCode |= EncodeMouseEvent(rEvent); + mnEventCode |= EncodeState(); + + // Detect the mouse leaving the window. When not button is pressed then + // we can call IsLeaveWindow at the event. Otherwise we have to make an + // explicit test. + mbIsLeaving = rEvent.IsLeaveWindow() + || ! ::tools::Rectangle(Point(0,0), + rSlideSorter.GetContentWindow()->GetOutputSizePixel()).Contains(maMousePosition); +} + +SelectionFunction::EventDescriptor::EventDescriptor ( + const sal_uInt32 nEventType, + const AcceptDropEvent& rEvent, + const sal_Int8 nDragAction, + SlideSorter const & rSlideSorter) + : maMousePosition(rEvent.maPosPixel), + mpHitPage(), + mnEventCode(nEventType), + meDragMode(InsertionIndicatorHandler::GetModeFromDndAction(nDragAction)), + mbIsLeaving(false) +{ + maMouseModelPosition = rSlideSorter.GetContentWindow()->PixelToLogic(maMousePosition); + mpHitDescriptor = rSlideSorter.GetController().GetPageAt(maMousePosition); + if (mpHitDescriptor) + { + mpHitPage = mpHitDescriptor->GetPage(); + } + + mnEventCode |= EncodeState(); + + // Detect the mouse leaving the window. When not button is pressed then + // we can call IsLeaveWindow at the event. Otherwise we have to make an + // explicit test. + mbIsLeaving = rEvent.mbLeaving + || ! ::tools::Rectangle(Point(0,0), + rSlideSorter.GetContentWindow()->GetOutputSizePixel()).Contains(maMousePosition); +} + +sal_uInt32 SelectionFunction::EventDescriptor::EncodeMouseEvent ( + const MouseEvent& rEvent) const +{ + // Initialize with the type of mouse event. + sal_uInt32 nEventCode (mnEventCode & (BUTTON_DOWN | BUTTON_UP | MOUSE_MOTION)); + + // Detect the affected button. + switch (rEvent.GetButtons()) + { + case MOUSE_LEFT: nEventCode |= LEFT_BUTTON; break; + case MOUSE_RIGHT: nEventCode |= RIGHT_BUTTON; break; + case MOUSE_MIDDLE: nEventCode |= MIDDLE_BUTTON; break; + } + + // Detect the number of clicks. + switch (rEvent.GetClicks()) + { + case 1: nEventCode |= SINGLE_CLICK; break; + case 2: nEventCode |= DOUBLE_CLICK; break; + } + + // Detect pressed modifier keys. + if (rEvent.IsShift()) + nEventCode |= SHIFT_MODIFIER; + if (rEvent.IsMod1()) + nEventCode |= CONTROL_MODIFIER; + + return nEventCode; +} + +sal_uInt32 SelectionFunction::EventDescriptor::EncodeState() const +{ + sal_uInt32 nEventCode (0); + + // Detect whether the event has happened over a page object. + if (mpHitPage!=nullptr && mpHitDescriptor) + { + if (mpHitDescriptor->HasState(model::PageDescriptor::ST_Selected)) + nEventCode |= OVER_SELECTED_PAGE; + else + nEventCode |= OVER_UNSELECTED_PAGE; + } + + return nEventCode; +} + +//===== SelectionFunction::ModeHandler ======================================== + +SelectionFunction::ModeHandler::ModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction, + const bool bIsMouseOverIndicatorAllowed) + : mrSlideSorter(rSlideSorter), + mrSelectionFunction(rSelectionFunction), + mbIsMouseOverIndicatorAllowed(bIsMouseOverIndicatorAllowed) +{ +} + +SelectionFunction::ModeHandler::~ModeHandler() COVERITY_NOEXCEPT_FALSE +{ +} + +void SelectionFunction::ModeHandler::ReprocessEvent (EventDescriptor& rDescriptor) +{ + mrSelectionFunction.ProcessEvent(rDescriptor); +} + +void SelectionFunction::ModeHandler::ProcessEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter); + PageSelector::UpdateLock aUpdateLock (mrSlideSorter); + + bool bIsProcessed (false); + switch (rDescriptor.mnEventCode & (BUTTON_DOWN | BUTTON_UP | MOUSE_MOTION | MOUSE_DRAG)) + { + case BUTTON_DOWN: + bIsProcessed = ProcessButtonDownEvent(rDescriptor); + break; + + case BUTTON_UP: + bIsProcessed = ProcessButtonUpEvent(rDescriptor); + break; + + case MOUSE_MOTION: + bIsProcessed = ProcessMotionEvent(rDescriptor); + break; + + case MOUSE_DRAG: + bIsProcessed = ProcessDragEvent(rDescriptor); + break; + } + + if ( ! bIsProcessed) + HandleUnprocessedEvent(rDescriptor); +} + +bool SelectionFunction::ModeHandler::ProcessButtonDownEvent (EventDescriptor&) +{ + return false; +} + +bool SelectionFunction::ModeHandler::ProcessButtonUpEvent (EventDescriptor&) +{ + mrSelectionFunction.SwitchToNormalMode(); + return false; +} + +bool SelectionFunction::ModeHandler::ProcessMotionEvent (EventDescriptor& rDescriptor) +{ + if (mbIsMouseOverIndicatorAllowed) + mrSlideSorter.GetView().UpdatePageUnderMouse(rDescriptor.maMousePosition); + + if (rDescriptor.mbIsLeaving) + { + mrSelectionFunction.SwitchToNormalMode(); + mrSlideSorter.GetView().SetPageUnderMouse(model::SharedPageDescriptor()); + + return true; + } + else + return false; +} + +bool SelectionFunction::ModeHandler::ProcessDragEvent (EventDescriptor&) +{ + return false; +} + +bool SelectionFunction::ModeHandler::HandleUnprocessedEvent (EventDescriptor&) +{ + return false; +} + +void SelectionFunction::ModeHandler::SetCurrentPage ( + const model::SharedPageDescriptor& rpDescriptor) +{ + SelectOnePage(rpDescriptor); + mrSlideSorter.GetController().GetCurrentSlideManager()->SwitchCurrentSlide(rpDescriptor); +} + +void SelectionFunction::ModeHandler::DeselectAllPages() +{ + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); + mrSelectionFunction.ResetShiftKeySelectionAnchor(); +} + +void SelectionFunction::ModeHandler::SelectOnePage ( + const model::SharedPageDescriptor& rpDescriptor) +{ + DeselectAllPages(); + mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor); +} + +void SelectionFunction::ModeHandler::SwitchView (const model::SharedPageDescriptor& rpDescriptor) +{ + // Switch to the draw view. This is done only when the current + // view is the main view. + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell==nullptr || !pViewShell->IsMainViewShell()) + return; + + if (rpDescriptor && rpDescriptor->GetPage()!=nullptr) + { + mrSlideSorter.GetModel().GetDocument()->SetSelected(rpDescriptor->GetPage(), true); + pViewShell->GetFrameView()->SetSelectedPage( + (rpDescriptor->GetPage()->GetPageNum()-1)/2); + } + if (mrSlideSorter.GetViewShellBase() != nullptr) + framework::FrameworkHelper::Instance(*mrSlideSorter.GetViewShellBase())->RequestView( + framework::FrameworkHelper::msImpressViewURL, + framework::FrameworkHelper::msCenterPaneURL); +} + +void SelectionFunction::ModeHandler::StartDrag ( + const Point& rMousePosition) +{ + // Do not start a drag-and-drop operation when one is already active. + // (when dragging pages from one document into another, pressing a + // modifier key can trigger a MouseMotion event in the originating + // window (focus still in there). Together with the mouse button pressed + // (drag-and-drop is active) this triggers the start of drag-and-drop.) + if (SD_MOD()->pTransferDrag != nullptr) + return; + + mrSelectionFunction.SwitchToDragAndDropMode(rMousePosition); +} + +//===== NormalModeHandler ===================================================== + +NormalModeHandler::NormalModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction) + : ModeHandler(rSlideSorter, rSelectionFunction, true) +{ +} + +SelectionFunction::Mode NormalModeHandler::GetMode() const +{ + return SelectionFunction::NormalMode; +} + +void NormalModeHandler::Abort() +{ +} + +bool NormalModeHandler::ProcessButtonDownEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + // Remember the location where the left button is pressed. With + // that we can filter away motion events that are caused by key + // presses. We also can tune the minimal motion distance that + // triggers a drag-and-drop operation. + if ((rDescriptor.mnEventCode & BUTTON_DOWN) != 0) + maButtonDownLocation = rDescriptor.maMousePosition; + + switch (rDescriptor.mnEventCode) + { + case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE: + SetCurrentPage(rDescriptor.mpHitDescriptor); + break; + + case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE: + break; + + case BUTTON_DOWN | LEFT_BUTTON | DOUBLE_CLICK | OVER_SELECTED_PAGE: + case BUTTON_DOWN | LEFT_BUTTON | DOUBLE_CLICK | OVER_UNSELECTED_PAGE: + // A double click always shows the selected slide in the center + // pane in an edit view. + SetCurrentPage(rDescriptor.mpHitDescriptor); + SwitchView(rDescriptor.mpHitDescriptor); + break; + + case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE | SHIFT_MODIFIER: + case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE | SHIFT_MODIFIER: + // Range selection with the shift modifier. + RangeSelect(rDescriptor.mpHitDescriptor); + break; + + // Right button for context menu. + case BUTTON_DOWN | RIGHT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE: + // Single right click and shift+F10 select as preparation to + // show the context menu. Change the selection only when the + // page under the mouse is not selected. In this case the + // selection is set to this single page. Otherwise the + // selection is not modified. + SetCurrentPage(rDescriptor.mpHitDescriptor); + break; + + case BUTTON_DOWN | RIGHT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE: + // Do not change the selection. Just adjust the insertion indicator. + break; + + case BUTTON_DOWN | RIGHT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE: + // Remember the current selection so that when a multi selection + // is started, we can restore the previous selection. + mrSlideSorter.GetModel().SaveCurrentSelection(); + DeselectAllPages(); + break; + + case ANY_MODIFIER(BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE): + // Remember the current selection so that when a multi selection + // is started, we can restore the previous selection. + mrSlideSorter.GetModel().SaveCurrentSelection(); + DeselectAllPages(); + break; + + case BUTTON_DOWN | LEFT_BUTTON | DOUBLE_CLICK | NOT_OVER_PAGE: + { + // Insert a new slide: + // First of all we need to set the insertion indicator which sets the + // position where the new slide will be inserted. + std::shared_ptr pInsertionIndicatorHandler + = mrSlideSorter.GetController().GetInsertionIndicatorHandler(); + + pInsertionIndicatorHandler->Start(false); + pInsertionIndicatorHandler->UpdatePosition( + rDescriptor.maMousePosition, + InsertionIndicatorHandler::MoveMode); + + mrSlideSorter.GetController().GetSelectionManager()->SetInsertionPosition( + pInsertionIndicatorHandler->GetInsertionPageIndex()); + + mrSlideSorter.GetViewShell()->GetDispatcher()->Execute( + SID_INSERTPAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + + pInsertionIndicatorHandler->End(Animator::AM_Immediate); + + break; + } + + default: + return false; + } + return true; +} + +bool NormalModeHandler::ProcessButtonUpEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + bool bIsProcessed (true); + switch (rDescriptor.mnEventCode) + { + case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE: + SetCurrentPage(rDescriptor.mpHitDescriptor); + break; + + // Multi selection with the control modifier. + case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE | CONTROL_MODIFIER: + mrSlideSorter.GetController().GetPageSelector().DeselectPage( + rDescriptor.mpHitDescriptor); + break; + + case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE | CONTROL_MODIFIER: + mrSlideSorter.GetController().GetPageSelector().SelectPage( + rDescriptor.mpHitDescriptor); + mrSlideSorter.GetView().SetPageUnderMouse(rDescriptor.mpHitDescriptor); + break; + case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE: + break; + + default: + bIsProcessed = false; + break; + } + mrSelectionFunction.SwitchToNormalMode(); + return bIsProcessed; +} + +bool NormalModeHandler::ProcessMotionEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + if (ModeHandler::ProcessMotionEvent(rDescriptor)) + return true; + + bool bIsProcessed (true); + switch (rDescriptor.mnEventCode) + { + // A mouse motion without visible substitution starts that. + case ANY_MODIFIER(MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE): + case ANY_MODIFIER(MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE): + { + if (maButtonDownLocation) + { + const sal_Int32 nDistance(std::max( + std::abs(maButtonDownLocation->X() - rDescriptor.maMousePosition.X()), + std::abs(maButtonDownLocation->Y() - rDescriptor.maMousePosition.Y()))); + if (nDistance > 3) + StartDrag(rDescriptor.maMousePosition); + } + break; + } + + // A mouse motion not over a page starts a rectangle selection. + case ANY_MODIFIER(MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE): + mrSelectionFunction.SwitchToMultiSelectionMode( + rDescriptor.maMouseModelPosition, + rDescriptor.mnEventCode); + break; + + default: + bIsProcessed = false; + break; + } + return bIsProcessed; +} + +bool NormalModeHandler::ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor) +{ + mrSelectionFunction.SwitchToDragAndDropMode(rDescriptor.maMousePosition); + ReprocessEvent(rDescriptor); + return true; +} + +void NormalModeHandler::RangeSelect (const model::SharedPageDescriptor& rpDescriptor) +{ + PageSelector::UpdateLock aLock (mrSlideSorter); + PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); + + model::SharedPageDescriptor pAnchor (rSelector.GetSelectionAnchor()); + DeselectAllPages(); + + if (!pAnchor) + return; + + // Select all pages between the anchor and the given one, including + // the two. + const sal_uInt16 nAnchorIndex ((pAnchor->GetPage()->GetPageNum()-1) / 2); + const sal_uInt16 nOtherIndex ((rpDescriptor->GetPage()->GetPageNum()-1) / 2); + + // Iterate over all pages in the range. Start with the anchor + // page. This way the PageSelector will recognize it again as + // anchor (the first selected page after a DeselectAllPages() + // becomes the anchor.) + const sal_uInt16 nStep ((nAnchorIndex < nOtherIndex) ? +1 : -1); + sal_uInt16 nIndex (nAnchorIndex); + while (true) + { + rSelector.SelectPage(nIndex); + if (nIndex == nOtherIndex) + break; + nIndex = nIndex + nStep; + } +} + +void NormalModeHandler::ResetButtonDownLocation() +{ + maButtonDownLocation = ::std::optional(); +} + +//===== MultiSelectionModeHandler ============================================= + +MultiSelectionModeHandler::MultiSelectionModeHandler ( + SlideSorter& rSlideSorter, + SelectionFunction& rSelectionFunction, + const Point& rMouseModelPosition, + const sal_uInt32 nEventCode) + : ModeHandler(rSlideSorter, rSelectionFunction, false), + meSelectionMode(SM_Normal), + maSecondCorner(rMouseModelPosition), + maSavedPointer(mrSlideSorter.GetContentWindow()->GetPointer()), + mbAutoScrollInstalled(false), + mnAnchorIndex(-1), + mnSecondIndex(-1) +{ + + mrSlideSorter.GetContentWindow()->SetPointer(PointerStyle::Text); + SetSelectionModeFromModifier(nEventCode); +} + +MultiSelectionModeHandler::~MultiSelectionModeHandler() +{ + if (mbAutoScrollInstalled) + { + //a call to this handler's MultiSelectionModeHandler::UpdatePosition + //may be still waiting to be called back + mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor(); + } + mrSlideSorter.GetContentWindow()->SetPointer(maSavedPointer); +} + +SelectionFunction::Mode MultiSelectionModeHandler::GetMode() const +{ + return SelectionFunction::MultiSelectionMode; +} + +void MultiSelectionModeHandler::Abort() +{ + mrSlideSorter.GetView().RequestRepaint(mrSlideSorter.GetModel().RestoreSelection()); +} + +void MultiSelectionModeHandler::ProcessEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + // During a multi selection we do not want sudden jumps of the + // visible area caused by moving newly selected pages into view. + // Therefore disable that temporarily. The disabled object is + // released at the end of the event processing, after the focus and + // current slide have been updated. + VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter); + + ModeHandler::ProcessEvent(rDescriptor); +} + +bool MultiSelectionModeHandler::ProcessButtonUpEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + if (mbAutoScrollInstalled) + { + //a call to this handler's MultiSelectionModeHandler::UpdatePosition + //may be still waiting to be called back + mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor(); + mbAutoScrollInstalled = false; + } + + if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK)) + { + mrSelectionFunction.SwitchToNormalMode(); + return true; + } + else + return false; +} + +bool MultiSelectionModeHandler::ProcessMotionEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + // The selection rectangle is visible. Handle events accordingly. + if (Match(rDescriptor.mnEventCode, MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK)) + { + SetSelectionModeFromModifier(rDescriptor.mnEventCode); + UpdatePosition(rDescriptor.maMousePosition, true); + return true; + } + else + return false; +} + +bool MultiSelectionModeHandler::HandleUnprocessedEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + if ( ! ModeHandler::HandleUnprocessedEvent(rDescriptor)) + { + // If the event has not been processed then stop multi selection. + mrSelectionFunction.SwitchToNormalMode(); + ReprocessEvent(rDescriptor); + } + return true; +} + +void MultiSelectionModeHandler::UpdatePosition ( + const Point& rMousePosition, + const bool bAllowAutoScroll) +{ + VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter); + + // Convert window coordinates into model coordinates (we need the + // window coordinates for auto-scrolling because that remains + // constant while scrolling.) + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition)); + + bool bDoAutoScroll = bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll( + rMousePosition, + [this, &rMousePosition] () { return this->UpdatePosition(rMousePosition, false); }); + + if (!bDoAutoScroll) + UpdateModelPosition(aMouseModelPosition); + + mbAutoScrollInstalled |= bDoAutoScroll; +} + +void MultiSelectionModeHandler::SetSelectionModeFromModifier ( + const sal_uInt32 nEventCode) +{ + switch (nEventCode & MODIFIER_MASK) + { + case NO_MODIFIER: + SetSelectionMode(SM_Normal); + break; + + case SHIFT_MODIFIER: + SetSelectionMode(SM_Add); + break; + + case CONTROL_MODIFIER: + SetSelectionMode(SM_Toggle); + break; + } +} + +void MultiSelectionModeHandler::SetSelectionMode (const SelectionMode eSelectionMode) +{ + if (meSelectionMode != eSelectionMode) + { + meSelectionMode = eSelectionMode; + UpdateSelection(); + } +} + +void MultiSelectionModeHandler::UpdateSelectionState ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bIsInSelection) const +{ + // Determine whether the page was selected before the rectangle + // selection was started. + const bool bWasSelected (rpDescriptor->HasState(model::PageDescriptor::ST_WasSelected)); + + // Combine the two selection states depending on the selection mode. + bool bSelect (false); + switch(meSelectionMode) + { + case SM_Normal: + bSelect = bIsInSelection; + break; + + case SM_Add: + bSelect = bIsInSelection || bWasSelected; + break; + + case SM_Toggle: + if (bIsInSelection) + bSelect = !bWasSelected; + else + bSelect = bWasSelected; + break; + } + + // Set the new selection state. + if (bSelect) + mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor); + else + mrSlideSorter.GetController().GetPageSelector().DeselectPage(rpDescriptor); +} + +void MultiSelectionModeHandler::UpdateModelPosition (const Point& rMouseModelPosition) +{ + maSecondCorner = rMouseModelPosition; + UpdateSelection(); +} + +void MultiSelectionModeHandler::UpdateSelection() +{ + view::SlideSorterView::DrawLock aLock (mrSlideSorter); + + model::SlideSorterModel& rModel (mrSlideSorter.GetModel()); + const sal_Int32 nPageCount (rModel.GetPageCount()); + + const sal_Int32 nIndexUnderMouse ( + mrSlideSorter.GetView().GetLayouter().GetIndexAtPoint ( + maSecondCorner, + false, + false)); + if (nIndexUnderMouse < 0 || nIndexUnderMouse >= nPageCount) + return; + + if (mnAnchorIndex < 0) + mnAnchorIndex = nIndexUnderMouse; + mnSecondIndex = nIndexUnderMouse; + + Range aRange (mnAnchorIndex, mnSecondIndex); + aRange.Normalize(); + + for (sal_Int32 nIndex=0; nIndexpTransferDrag; + if (pDragTransferable==nullptr && mrSlideSorter.GetViewShell() != nullptr) + { + SlideSorterViewShell* pSlideSorterViewShell + = dynamic_cast(mrSlideSorter.GetViewShell()); + if (pSlideSorterViewShell != nullptr) + pSlideSorterViewShell->StartDrag(rMousePosition, pWindow); + pDragTransferable = SD_MOD()->pTransferDrag; + } + + mpDragAndDropContext.reset(new DragAndDropContext(mrSlideSorter)); + mrSlideSorter.GetController().GetInsertionIndicatorHandler()->Start( + pDragTransferable != nullptr + && pDragTransferable->GetView()==&mrSlideSorter.GetView()); +} + +DragAndDropModeHandler::~DragAndDropModeHandler() +{ + if (mpDragAndDropContext) + { + // Disconnect the substitution handler from this selection function. + mpDragAndDropContext->SetTargetSlideSorter(); + mpDragAndDropContext.reset(); + } + mrSlideSorter.GetController().GetInsertionIndicatorHandler()->End(Animator::AM_Animated); +} + +SelectionFunction::Mode DragAndDropModeHandler::GetMode() const +{ + return SelectionFunction::DragAndDropMode; +} + +void DragAndDropModeHandler::Abort() +{ + mrSlideSorter.GetController().GetClipboard().Abort(); + if (mpDragAndDropContext) + mpDragAndDropContext->Dispose(); + // mrSlideSorter.GetView().RequestRepaint(mrSlideSorter.GetModel().RestoreSelection()); +} + +bool DragAndDropModeHandler::ProcessButtonUpEvent ( + SelectionFunction::EventDescriptor& rDescriptor) +{ + if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON)) + { + // The following Process() call may lead to the destruction + // of rDescriptor.mpHitDescriptor so release our reference to it. + rDescriptor.mpHitDescriptor.reset(); + mrSelectionFunction.SwitchToNormalMode(); + return true; + } + else + return false; +} + +bool DragAndDropModeHandler::ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor) +{ + OSL_ASSERT(mpDragAndDropContext); + + if (rDescriptor.mbIsLeaving) + { + mrSelectionFunction.SwitchToNormalMode(); + } + else if (mpDragAndDropContext) + { + mpDragAndDropContext->UpdatePosition( + rDescriptor.maMousePosition, + rDescriptor.meDragMode, true); + } + + return true; +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx new file mode 100644 index 0000000000..0d40b7b898 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx @@ -0,0 +1,309 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::uno; +using namespace ::sd::slidesorter::model; +using namespace ::sd::slidesorter::view; +using namespace ::sd::slidesorter::controller; + +namespace sd::slidesorter::controller { + +SelectionManager::SelectionManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mrController(rSlideSorter.GetController()), + mnInsertionPosition(-1), + mpSelectionObserver(std::make_shared(rSlideSorter)) +{ +} + +SelectionManager::~SelectionManager() +{ +} + +void SelectionManager::DeleteSelectedPages (const bool bSelectFollowingPage) +{ + // Create some locks to prevent updates of the model, view, selection + // state while modifying any of them. + SlideSorterController::ModelChangeLock aLock (mrController); + SlideSorterView::DrawLock aDrawLock (mrSlideSorter); + PageSelector::UpdateLock aSelectionLock (mrSlideSorter); + + // Hide focus. + bool bIsFocusShowing = mrController.GetFocusManager().IsFocusShowing(); + if (bIsFocusShowing) + mrController.GetFocusManager().ToggleFocus(); + + // Store pointers to all selected page descriptors. This is necessary + // because the pages get deselected when the first one is deleted. + model::PageEnumeration aPageEnumeration ( + PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel())); + ::std::vector aSelectedPages; + sal_Int32 nNewCurrentSlide (-1); + while (aPageEnumeration.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement()); + aSelectedPages.push_back(pDescriptor->GetPage()); + if (bSelectFollowingPage || nNewCurrentSlide<0) + nNewCurrentSlide = pDescriptor->GetPageIndex(); + } + if (aSelectedPages.empty()) + return; + + // Determine the slide to select (and thereby make the current slide) + // after the deletion. + if (bSelectFollowingPage) + nNewCurrentSlide -= aSelectedPages.size() - 1; + else + --nNewCurrentSlide; + + const auto pViewShell = mrSlideSorter.GetViewShell(); + const auto pDrawViewShell = pViewShell ? std::dynamic_pointer_cast(pViewShell->GetViewShellBase().GetMainViewShell()) : nullptr; + const auto pDrawView = pDrawViewShell ? pDrawViewShell->GetDrawView() : nullptr; + + if (pDrawView) + pDrawView->BlockPageOrderChangedHint(true); + + // Proper naming for the undo action + OUString sUndoComment(SdResId(STR_UNDO_DELETEPAGES)); + if (mrSlideSorter.GetView().GetDoc().GetDocumentType() == DocumentType::Draw) + sUndoComment = SdResId(STR_UNDO_DELETEPAGES_DRAW); + + // The actual deletion of the selected pages is done in one of two + // helper functions. They are specialized for normal respectively for + // master pages. + mrSlideSorter.GetView().BegUndo (sUndoComment); + if (mrSlideSorter.GetModel().GetEditMode() == EditMode::Page) + DeleteSelectedNormalPages(aSelectedPages); + else + DeleteSelectedMasterPages(aSelectedPages); + mrSlideSorter.GetView().EndUndo (); + + mrController.HandleModelChange(); + aLock.Release(); + if (pDrawView) + { + assert(pDrawViewShell); + pDrawView->BlockPageOrderChangedHint(false); + pDrawViewShell->ResetActualPage(); + } + + // Show focus and move it to next valid location. + if (bIsFocusShowing) + mrController.GetFocusManager().ToggleFocus(); + + // Set the new current slide. + if (nNewCurrentSlide < 0) + nNewCurrentSlide = 0; + else if (nNewCurrentSlide >= mrSlideSorter.GetModel().GetPageCount()) + nNewCurrentSlide = mrSlideSorter.GetModel().GetPageCount()-1; + mrController.GetPageSelector().CountSelectedPages(); + mrController.GetPageSelector().SelectPage(nNewCurrentSlide); + mrController.GetFocusManager().SetFocusedPage(nNewCurrentSlide); +} + +void SelectionManager::DeleteSelectedNormalPages (const ::std::vector& rSelectedPages) +{ + // Prepare the deletion via the UNO API. + OSL_ASSERT(mrSlideSorter.GetModel().GetEditMode() == EditMode::Page); + + try + { + Reference xDrawPagesSupplier( mrSlideSorter.GetModel().GetDocument()->getUnoModel(), UNO_QUERY_THROW ); + Reference xPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW ); + + // Iterate over all pages that were selected when this method was called + // and delete the draw page the notes page. The iteration is done in + // reverse order so that when one slide is not deleted (to avoid an + // empty document) the remaining slide is the first one. + ::std::vector::const_reverse_iterator aI; + for (aI=rSelectedPages.rbegin(); aI!=rSelectedPages.rend(); ++aI) + { + // Do not delete the last slide in the document. + if (xPages->getCount() <= 1) + break; + + const sal_uInt16 nPage (model::FromCoreIndex((*aI)->GetPageNum())); + + Reference< XDrawPage > xPage( xPages->getByIndex( nPage ), UNO_QUERY_THROW ); + xPages->remove(xPage); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "SelectionManager::DeleteSelectedNormalPages()"); + } +} + +void SelectionManager::DeleteSelectedMasterPages (const ::std::vector& rSelectedPages) +{ + // Prepare the deletion via the UNO API. + OSL_ASSERT(mrSlideSorter.GetModel().GetEditMode() == EditMode::MasterPage); + + try + { + Reference xDrawPagesSupplier( mrSlideSorter.GetModel().GetDocument()->getUnoModel(), UNO_QUERY_THROW ); + Reference xPages( xDrawPagesSupplier->getMasterPages(), UNO_SET_THROW ); + + // Iterate over all pages that were selected when this method was called + // and delete the draw page the notes page. The iteration is done in + // reverse order so that when one slide is not deleted (to avoid an + // empty document) the remaining slide is the first one. + ::std::vector::const_reverse_iterator aI; + for (aI=rSelectedPages.rbegin(); aI!=rSelectedPages.rend(); ++aI) + { + // Do not delete the last slide in the document. + if (xPages->getCount() <= 1) + break; + + const sal_uInt16 nPage (model::FromCoreIndex((*aI)->GetPageNum())); + + Reference< XDrawPage > xPage( xPages->getByIndex( nPage ), UNO_QUERY_THROW ); + xPages->remove(xPage); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "SelectionManager::DeleteSelectedMasterPages()"); + } +} + +void SelectionManager::SelectionHasChanged () +{ + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell == nullptr) + return; + + pViewShell->Invalidate (SID_EXPAND_PAGE); + pViewShell->Invalidate (SID_SUMMARY_PAGE); + pViewShell->Invalidate(SID_SHOW_SLIDE); + pViewShell->Invalidate(SID_HIDE_SLIDE); + pViewShell->Invalidate(SID_DELETE_PAGE); + pViewShell->Invalidate(SID_DELETE_MASTER_PAGE); + pViewShell->Invalidate(SID_ASSIGN_LAYOUT); + + // StatusBar + pViewShell->Invalidate (SID_STATUS_PAGE); + pViewShell->Invalidate (SID_STATUS_LAYOUT); + pViewShell->Invalidate (SID_SCALE); + + OSL_ASSERT(mrController.GetCurrentSlideManager()); + SharedPageDescriptor pDescriptor(mrController.GetCurrentSlideManager()->GetCurrentSlide()); + if (pDescriptor) + pViewShell->UpdatePreview(pDescriptor->GetPage()); + + // Tell the selection change listeners that the selection has changed. + for (const auto& rLink : maSelectionChangeListeners) + { + rLink.Call(nullptr); + } + + // Reset the insertion position: until set again it is calculated from + // the current selection. + mnInsertionPosition = -1; +} + +void SelectionManager::AddSelectionChangeListener (const Link& rListener) +{ + if (::std::find ( + maSelectionChangeListeners.begin(), + maSelectionChangeListeners.end(), + rListener) == maSelectionChangeListeners.end()) + { + maSelectionChangeListeners.push_back (rListener); + } +} + +void SelectionManager::RemoveSelectionChangeListener(const Link& rListener) +{ + maSelectionChangeListeners.erase ( + ::std::find ( + maSelectionChangeListeners.begin(), + maSelectionChangeListeners.end(), + rListener)); +} + +sal_Int32 SelectionManager::GetInsertionPosition() const +{ + sal_Int32 nInsertionPosition (mnInsertionPosition); + if (nInsertionPosition < 0) + { + model::PageEnumeration aSelectedPages + (model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + // Initialize (for the case of an empty selection) with the position + // at the end of the document. + nInsertionPosition = mrSlideSorter.GetModel().GetPageCount(); + while (aSelectedPages.HasMoreElements()) + { + const sal_Int32 nPosition (aSelectedPages.GetNextElement()->GetPage()->GetPageNum()); + // Convert *2+1 index to straight index (n-1)/2 after the page + // (+1). + nInsertionPosition = model::FromCoreIndex(nPosition) + 1; + } + + } + return nInsertionPosition; +} + +void SelectionManager::SetInsertionPosition (const sal_Int32 nInsertionPosition) +{ + if (nInsertionPosition < 0) + mnInsertionPosition = -1; + else if (nInsertionPosition > mrSlideSorter.GetModel().GetPageCount()) + { + // Assert but then ignore invalid values. + OSL_ASSERT(nInsertionPosition<=mrSlideSorter.GetModel().GetPageCount()); + return; + } + else + mnInsertionPosition = nInsertionPosition; +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx new file mode 100644 index 0000000000..ba835c23b0 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx @@ -0,0 +1,139 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::controller +{ +SelectionObserver::Context::Context(SlideSorter const& rSlideSorter) + : mpSelectionObserver( + rSlideSorter.GetController().GetSelectionManager()->GetSelectionObserver()) +{ + if (mpSelectionObserver) + mpSelectionObserver->StartObservation(); +} + +SelectionObserver::Context::~Context() COVERITY_NOEXCEPT_FALSE +{ + if (mpSelectionObserver) + mpSelectionObserver->EndObservation(); +} + +void SelectionObserver::Context::Abort() +{ + if (mpSelectionObserver) + { + mpSelectionObserver->AbortObservation(); + mpSelectionObserver.reset(); + } +} + +//===== SelectionObserver ===================================================== + +SelectionObserver::SelectionObserver(SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter) + , mbIsObservationActive(false) + , mbPageEventOccurred(false) +{ +} + +SelectionObserver::~SelectionObserver() {} + +void SelectionObserver::NotifyPageEvent(const SdrPage* pSdrPage) +{ + if (!mbIsObservationActive) + return; + + mbPageEventOccurred = true; + + const SdPage* pPage = dynamic_cast(pSdrPage); + if (pPage == nullptr) + return; + + //NotifyPageEvent is called for add, remove, *and* change position so for + //the change position case we must ensure we don't end up with the slide + //duplicated in our list + std::vector::iterator iPage( + std::find(maInsertedPages.begin(), maInsertedPages.end(), pPage)); + if (iPage != maInsertedPages.end()) + maInsertedPages.erase(iPage); + + if (pPage->IsInserted()) + maInsertedPages.push_back(pPage); +} + +void SelectionObserver::StartObservation() +{ + OSL_ASSERT(!mbIsObservationActive); + maInsertedPages.clear(); + mbIsObservationActive = true; +} + +void SelectionObserver::AbortObservation() +{ + OSL_ASSERT(mbIsObservationActive); + mbIsObservationActive = false; + maInsertedPages.clear(); +} + +void SelectionObserver::EndObservation() +{ + OSL_ASSERT(mbIsObservationActive); + mbIsObservationActive = false; + + if (!mbPageEventOccurred) + return; + + PageSelector& rSelector(mrSlideSorter.GetController().GetPageSelector()); + PageSelector::UpdateLock aUpdateLock(mrSlideSorter); + rSelector.DeselectAllPages(); + if (!maInsertedPages.empty()) + { + // Select the inserted pages. + for (const auto& rpPage : maInsertedPages) + { + rSelector.SelectPage(rpPage); + } + maInsertedPages.clear(); + } + + aUpdateLock.Release(); + FocusManager& rFocusManager = mrSlideSorter.GetController().GetFocusManager(); + bool bSuccess = rFocusManager.SetFocusedPageFromCurrentPage(); + // tdf#129346 nothing currently selected, select something, if possible + // but (tdf#129346) only if setting focus to current page failed + if (rSelector.GetPageCount() && rSelector.GetSelectedPageCount() == 0) + { + if (bSuccess) + rSelector.SelectPage(rFocusManager.GetFocusedPageDescriptor()); + else + rSelector.SelectPage(0); + } +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx new file mode 100644 index 0000000000..0a713c06da --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx @@ -0,0 +1,1305 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; + +namespace sd::slidesorter::controller { + +namespace { + +/** The state of a set of slides with respect to being excluded from the + slide show. +*/ +enum SlideExclusionState {UNDEFINED, EXCLUDED, INCLUDED, MIXED}; + +/** Return for the given set of slides whether they included are + excluded from the slide show. +*/ +SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet); + +} // end of anonymous namespace + + +namespace { + +void collectUIInformation(std::map&& aParameters, const OUString& rAction) +{ + EventDescription aDescription; + aDescription.aID = "impress_win_or_draw_win"; + aDescription.aParameters = std::move(aParameters); + aDescription.aAction = rAction; + aDescription.aKeyWord = "ImpressWindowUIObject"; + aDescription.aParent = "MainWindow"; + + UITestLogger::getInstance().logEvent(aDescription); +} + +} + +SlotManager::SlotManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter) +{ +} + +void SlotManager::FuTemporary (SfxRequest& rRequest) +{ + SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); + + SlideSorterViewShell* pShell + = dynamic_cast(mrSlideSorter.GetViewShell()); + if (pShell == nullptr) + return; + + switch (rRequest.GetSlot()) + { + case SID_PRESENTATION: + case SID_PRESENTATION_CURRENT_SLIDE: + case SID_REHEARSE_TIMINGS: + slideshowhelp::ShowSlideShow(rRequest, *mrSlideSorter.GetModel().GetDocument()); + pShell->Cancel(); + rRequest.Done(); + break; + + case SID_HIDE_SLIDE: + ChangeSlideExclusionState(model::SharedPageDescriptor(), true); + break; + + case SID_SHOW_SLIDE: + ChangeSlideExclusionState(model::SharedPageDescriptor(), false); + break; + + case SID_PAGES_PER_ROW: + if (rRequest.GetArgs() != nullptr) + { + const SfxUInt16Item* pPagesPerRow = rRequest.GetArg(SID_PAGES_PER_ROW); + if (pPagesPerRow != nullptr) + { + sal_Int32 nColumnCount = pPagesPerRow->GetValue(); + // Force the given number of columns by setting + // the minimal and maximal number of columns to + // the same value. + mrSlideSorter.GetView().GetLayouter().SetColumnCount ( + nColumnCount, nColumnCount); + // Force a repaint and re-layout. + pShell->ArrangeGUIElements (); + // Rearrange the UI-elements controlled by the + // controller and force a rearrangement of the + // view. + mrSlideSorter.GetController().Rearrange(true); + } + } + rRequest.Done(); + break; + + case SID_SELECTALL: + mrSlideSorter.GetController().GetPageSelector().SelectAllPages(); + rRequest.Done(); + break; + + case SID_SLIDE_TRANSITIONS_PANEL: + { + // First make sure that the sidebar is visible + pShell->GetViewFrame()->ShowChildWindow(SID_SIDEBAR); + ::sfx2::sidebar::Sidebar::ShowPanel( + u"SdSlideTransitionPanel", + pShell->GetViewFrame()->GetFrame().GetFrameInterface()); + rRequest.Ignore (); + break; + } + + case SID_MASTER_SLIDES_PANEL: + { + // First make sure that the sidebar is visible + pShell->GetViewFrame()->ShowChildWindow(SID_SIDEBAR); + ::sfx2::sidebar::Sidebar::ShowPanel( + u"SdAllMasterPagesPanel", + pShell->GetViewFrame()->GetFrame().GetFrameInterface()); + rRequest.Ignore (); + break; + } + + case SID_PRESENTATION_DLG: + FuSlideShowDlg::Create ( + pShell, + mrSlideSorter.GetContentWindow(), + &mrSlideSorter.GetView(), + pDocument, + rRequest); + break; + + case SID_CUSTOMSHOW_DLG: + FuCustomShowDlg::Create ( + pShell, + mrSlideSorter.GetContentWindow(), + &mrSlideSorter.GetView(), + pDocument, + rRequest); + break; + + case SID_EXPAND_PAGE: + FuExpandPage::Create ( + pShell, + mrSlideSorter.GetContentWindow(), + &mrSlideSorter.GetView(), + pDocument, + rRequest); + break; + + case SID_SUMMARY_PAGE: + FuSummaryPage::Create ( + pShell, + mrSlideSorter.GetContentWindow(), + &mrSlideSorter.GetView(), + pDocument, + rRequest); + break; + + case SID_INSERTPAGE: + case SID_INSERT_MASTER_PAGE: + InsertSlide(rRequest); + rRequest.Done(); + break; + + case SID_DUPLICATE_PAGE: + DuplicateSelectedSlides(rRequest); + rRequest.Done(); + break; + + case SID_DELETE_PAGE: + case SID_DELETE_MASTER_PAGE: + case SID_DELETE: // we need SID_CUT to handle the delete key + // (DEL -> accelerator -> SID_CUT). + if (mrSlideSorter.GetModel().GetPageCount() > 1) + { + mrSlideSorter.GetView().EndTextEditAllViews(); + mrSlideSorter.GetController().GetSelectionManager()->DeleteSelectedPages(); + } + + rRequest.Done(); + break; + + case SID_RENAMEPAGE: + case SID_RENAME_MASTER_PAGE: + RenameSlide (rRequest); + rRequest.Done (); + break; + + case SID_ASSIGN_LAYOUT: + { + pShell->mpImpl->AssignLayout( rRequest, PageKind::Standard ); + rRequest.Done (); + } + break; + + case SID_PHOTOALBUM: + { + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = mrSlideSorter.GetContentWindow(); + ScopedVclPtr pDlg(pFact->CreateSdPhotoAlbumDialog( + pWin ? pWin->GetFrameWeld() : nullptr, + pDocument)); + pDlg->Execute(); + rRequest.Done (); + } + break; + + case SID_REMOTE_DLG: + { +#ifdef ENABLE_SDREMOTE + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = mrSlideSorter.GetContentWindow(); + ScopedVclPtr pDlg(pFact->CreateRemoteDialog(pWin ? pWin->GetFrameWeld() : nullptr)); + pDlg->Execute(); +#endif + } + break; + + default: + break; + } +} + +void SlotManager::FuPermanent (SfxRequest& rRequest) +{ + ViewShell* pShell = mrSlideSorter.GetViewShell(); + if (pShell == nullptr) + return; + + if(pShell->GetCurrentFunction().is()) + { + rtl::Reference xEmpty; + if (pShell->GetOldFunction() == pShell->GetCurrentFunction()) + pShell->SetOldFunction(xEmpty); + + pShell->GetCurrentFunction()->Deactivate(); + pShell->SetCurrentFunction(xEmpty); + } + + switch(rRequest.GetSlot()) + { + case SID_OBJECT_SELECT: + pShell->SetCurrentFunction( SelectionFunction::Create(mrSlideSorter, rRequest) ); + rRequest.Done(); + break; + + default: + break; + } + + if(pShell->GetOldFunction().is()) + { + pShell->GetOldFunction()->Deactivate(); + rtl::Reference xEmpty; + pShell->SetOldFunction(xEmpty); + } + + if(pShell->GetCurrentFunction().is()) + { + pShell->GetCurrentFunction()->Activate(); + pShell->SetOldFunction(pShell->GetCurrentFunction()); + } + + //! that's only until ENUM-Slots ?are + // Invalidate( SID_OBJECT_SELECT ); +} + +void SlotManager::FuSupport (SfxRequest& rRequest) +{ + switch (rRequest.GetSlot()) + { + case SID_STYLE_FAMILY: + if (rRequest.GetArgs() != nullptr) + { + SdDrawDocument* pDocument + = mrSlideSorter.GetModel().GetDocument(); + if (pDocument != nullptr) + { + const SfxPoolItem& rItem ( + rRequest.GetArgs()->Get(SID_STYLE_FAMILY)); + pDocument->GetDocSh()->SetStyleFamily( + static_cast(static_cast(rItem).GetValue())); + } + } + break; + + case SID_PASTE: + { + SdTransferable* pTransferClip = SD_MOD()->pTransferClip; + if( pTransferClip ) + { + SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell().get(); + + DrawDocShell* pDocShell = dynamic_cast(pTransferDocShell); + if (pDocShell && pDocShell->GetDoc()->GetPageCount() > 1) + { + mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest); + break; + } + } + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase != nullptr) + { + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pBase->GetMainViewShell())); + if (pDrawViewShell != nullptr) + pDrawViewShell->FuSupport(rRequest); + } + } + break; + + case SID_CUT: + case SID_COPY: + case SID_DELETE: + mrSlideSorter.GetView().EndTextEditAllViews(); + mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest); + break; + + case SID_DRAWINGMODE: + case SID_NOTES_MODE: + case SID_HANDOUT_MASTER_MODE: + case SID_SLIDE_SORTER_MODE: + case SID_OUTLINE_MODE: + { + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase != nullptr) + { + framework::FrameworkHelper::Instance(*pBase)->HandleModeChangeSlot( + rRequest.GetSlot(), rRequest); + rRequest.Done(); + } + break; + } + + case SID_UNDO: + { + SlideSorterViewShell* pViewShell + = dynamic_cast(mrSlideSorter.GetViewShell()); + if (pViewShell != nullptr) + { + pViewShell->ImpSidUndo (rRequest); + } + break; + } + + case SID_REDO: + { + SlideSorterViewShell* pViewShell + = dynamic_cast(mrSlideSorter.GetViewShell()); + if (pViewShell != nullptr) + { + pViewShell->ImpSidRedo (rRequest); + } + break; + } + + default: + break; + } +} + +void SlotManager::ExecCtrl (SfxRequest& rRequest) +{ + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + sal_uInt16 nSlot = rRequest.GetSlot(); + switch (nSlot) + { + case SID_RELOAD: + { + // empty Undo-Manager + mrSlideSorter.GetModel().GetDocument()->GetDocSh()->ClearUndoBuffer(); + + // normal forwarding to ViewFrame for execution + if (pViewShell != nullptr) + pViewShell->GetViewFrame()->ExecuteSlot(rRequest); + + // has to be finished right away + return; + } + + case SID_OUTPUT_QUALITY_COLOR: + case SID_OUTPUT_QUALITY_GRAYSCALE: + case SID_OUTPUT_QUALITY_BLACKWHITE: + case SID_OUTPUT_QUALITY_CONTRAST: + { + // flush page cache + if (pViewShell != nullptr) + pViewShell->ExecReq (rRequest); + break; + } + + case SID_MAIL_SCROLLBODY_PAGEDOWN: + { + if (pViewShell != nullptr) + pViewShell->ExecReq (rRequest); + break; + } + + case SID_OPT_LOCALE_CHANGED: + { + mrSlideSorter.GetController().UpdateAllPages(); + if (pViewShell != nullptr) + pViewShell->UpdatePreview (pViewShell->GetActualPage()); + rRequest.Done(); + break; + } + + case SID_SEARCH_DLG: + // We have to handle the SID_SEARCH_DLG slot explicitly because + // in some cases (when the slide sorter is displayed in the + // center pane) we want to disable the search dialog. Therefore + // we have to handle the execution of that slot as well. + // We try to do that by forwarding the request to the view frame + // of the view shell. + if (pViewShell != nullptr) + pViewShell->GetViewFrame()->ExecuteSlot(rRequest); + break; + + default: + break; + } +} + +void SlotManager::GetAttrState (SfxItemSet& rSet) +{ + // Iterate over all items. + SfxWhichIter aIter (rSet); + sal_uInt16 nWhich = aIter.FirstWhich(); + while (nWhich) + { + sal_uInt16 nSlotId (nWhich); + if (SfxItemPool::IsWhich(nWhich) && mrSlideSorter.GetViewShell()!=nullptr) + nSlotId = mrSlideSorter.GetViewShell()->GetPool().GetSlotId(nWhich); + switch (nSlotId) + { + case SID_PAGES_PER_ROW: + rSet.Put ( + SfxUInt16Item ( + nSlotId, + static_cast(mrSlideSorter.GetView().GetLayouter().GetColumnCount()) + ) + ); + break; + } + nWhich = aIter.NextWhich(); + } +} + +void SlotManager::GetMenuState (SfxItemSet& rSet) +{ + EditMode eEditMode = mrSlideSorter.GetModel().GetEditMode(); + ViewShell* pShell = mrSlideSorter.GetViewShell(); + DrawDocShell* pDocShell = mrSlideSorter.GetModel().GetDocument()->GetDocSh(); + + if (pShell!=nullptr && pShell->GetCurrentFunction().is()) + { + sal_uInt16 nSId = pShell->GetCurrentFunction()->GetSlotID(); + + rSet.Put( SfxBoolItem( nSId, true ) ); + } + rSet.Put( SfxBoolItem( SID_DRAWINGMODE, false ) ); + rSet.Put( SfxBoolItem( SID_SLIDE_SORTER_MODE, true ) ); + rSet.Put( SfxBoolItem( SID_OUTLINE_MODE, false ) ); + rSet.Put( SfxBoolItem( SID_NOTES_MODE, false ) ); + rSet.Put( SfxBoolItem( SID_HANDOUT_MASTER_MODE, false ) ); + + if (pShell!=nullptr && pShell->IsMainViewShell()) + { + rSet.DisableItem(SID_SPELL_DIALOG); + rSet.DisableItem(SID_SEARCH_DLG); + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE)) + { + bool bDisable = true; + if (eEditMode == EditMode::Page) + { + // At least one of the selected pages has to contain an outline + // presentation objects in order to enable the expand page menu + // entry. + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + while (aSelectedPages.HasMoreElements()) + { + SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); + SdrObject* pObj = pPage->GetPresObj(PresObjKind::Outline); + if (pObj!=nullptr ) + { + if( !pObj->IsEmptyPresObj() ) + { + bDisable = false; + } + else + { + // check if the object is in edit, then if it's temporarily not empty + SdrTextObj* pTextObj = DynCastSdrTextObj( pObj ); + if( pTextObj ) + { + if( pTextObj->CanCreateEditOutlinerParaObject() ) + { + bDisable = false; + } + } + } + } + } + } + + if (bDisable) + rSet.DisableItem (SID_EXPAND_PAGE); + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE)) + { + bool bDisable = true; + if (eEditMode == EditMode::Page) + { + // At least one of the selected pages has to contain a title + // presentation objects in order to enable the summary page menu + // entry. + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + while (aSelectedPages.HasMoreElements()) + { + SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); + SdrObject* pObj = pPage->GetPresObj(PresObjKind::Title); + + if (pObj!=nullptr && !pObj->IsEmptyPresObj()) + bDisable = false; + } + } + if (bDisable) + rSet.DisableItem (SID_SUMMARY_PAGE); + } + + // starting of presentation possible? + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_REHEARSE_TIMINGS ) ) + { + bool bDisable = true; + model::PageEnumeration aAllPages ( + model::PageEnumerationProvider::CreateAllPagesEnumeration(mrSlideSorter.GetModel())); + while (aAllPages.HasMoreElements()) + { + SdPage* pPage = aAllPages.GetNextElement()->GetPage(); + + if( !pPage->IsExcluded() ) + bDisable = false; + } + if( bDisable || pDocShell->IsPreview()) + { + rSet.DisableItem( SID_PRESENTATION ); + rSet.DisableItem( SID_REHEARSE_TIMINGS ); + } + } + + // Disable the rename slots when there are no or more than one slides/master + // pages selected; disable the duplicate slot when there are no slides + // selected: + if (rSet.GetItemState(SID_RENAMEPAGE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_RENAME_MASTER_PAGE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_DUPLICATE_PAGE) == SfxItemState::DEFAULT) + { + int n = mrSlideSorter.GetController().GetPageSelector() + .GetSelectedPageCount(); + if (n != 1) + { + rSet.DisableItem(SID_RENAMEPAGE); + rSet.DisableItem(SID_RENAME_MASTER_PAGE); + } + if (n == 0) + { + rSet.DisableItem(SID_DUPLICATE_PAGE); + } + } + + if (rSet.GetItemState(SID_HIDE_SLIDE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_SHOW_SLIDE) == SfxItemState::DEFAULT) + { + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + const SlideExclusionState eState (GetSlideExclusionState(aSelectedPages)); + switch (eState) + { + case MIXED: + // Show both entries. + break; + + case EXCLUDED: + rSet.DisableItem(SID_HIDE_SLIDE); + break; + + case INCLUDED: + rSet.DisableItem(SID_SHOW_SLIDE); + break; + + case UNDEFINED: + rSet.DisableItem(SID_HIDE_SLIDE); + rSet.DisableItem(SID_SHOW_SLIDE); + break; + } + } + + if (eEditMode == EditMode::MasterPage) + { + // Disable some slots when in master page mode. + rSet.DisableItem(SID_ASSIGN_LAYOUT); + rSet.DisableItem(SID_INSERTPAGE); + + if (rSet.GetItemState(SID_DUPLICATE_PAGE) == SfxItemState::DEFAULT) + rSet.DisableItem(SID_DUPLICATE_PAGE); + } +} + +void SlotManager::GetClipboardState ( SfxItemSet& rSet) +{ + SdTransferable* pTransferClip = SD_MOD()->pTransferClip; + + if (rSet.GetItemState(SID_PASTE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_PASTE_SPECIAL) == SfxItemState::DEFAULT) + { + // no own clipboard data? + if ( !pTransferClip || !pTransferClip->GetDocShell().is() ) + { + rSet.DisableItem(SID_PASTE); + rSet.DisableItem(SID_PASTE_SPECIAL); + } + else + { + SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell().get(); + + if( !pTransferDocShell || static_cast(pTransferDocShell)->GetDoc()->GetPageCount() <= 1 ) + { + bool bIsPastingSupported (false); + + // No or just one page. Check if there is anything that can be + // pasted via a DrawViewShell. + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase != nullptr) + { + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pBase->GetMainViewShell())); + if (pDrawViewShell != nullptr) + { + TransferableDataHelper aDataHelper ( + TransferableDataHelper::CreateFromSystemClipboard( + pDrawViewShell->GetActiveWindow())); + if (aDataHelper.GetFormatCount() > 0) + bIsPastingSupported = true; + } + } + + if ( ! bIsPastingSupported) + { + rSet.DisableItem(SID_PASTE); + rSet.DisableItem(SID_PASTE_SPECIAL); + } + } + } + } + + // Cut, copy and paste of master pages is not yet implemented properly + if (rSet.GetItemState(SID_COPY) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_PASTE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_PASTE_SPECIAL) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_CUT) == SfxItemState::DEFAULT) + { + if (mrSlideSorter.GetModel().GetEditMode() == EditMode::MasterPage) + { + if (rSet.GetItemState(SID_CUT) == SfxItemState::DEFAULT) + rSet.DisableItem(SID_CUT); + if (rSet.GetItemState(SID_COPY) == SfxItemState::DEFAULT) + rSet.DisableItem(SID_COPY); + if (rSet.GetItemState(SID_PASTE) == SfxItemState::DEFAULT) + rSet.DisableItem(SID_PASTE); + if (rSet.GetItemState(SID_PASTE_SPECIAL) == SfxItemState::DEFAULT) + rSet.DisableItem(SID_PASTE_SPECIAL); + } + } + + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase && pBase->GetObjectShell()->isContentExtractionLocked()) + { + rSet.DisableItem(SID_COPY); + rSet.DisableItem(SID_CUT); + } + + // Cut, copy, and delete page are disabled when there is no selection. + if (!(rSet.GetItemState(SID_CUT) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_COPY) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_DELETE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_DELETE_PAGE) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_DELETE_MASTER_PAGE) == SfxItemState::DEFAULT)) + return; + + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + + // For copy to work we have to have at least one selected page. + if ( ! aSelectedPages.HasMoreElements()) + rSet.DisableItem(SID_COPY); + + bool bDisable = false; + // The operations that lead to the deletion of a page are valid if + // a) there is at least one selected page + // b) deleting the selected pages leaves at least one page in the + // document + // c) selected master pages must not be used by slides. + + // Test a). + if ( ! aSelectedPages.HasMoreElements()) + bDisable = true; + // Test b): Count the number of selected pages. It has to be less + // than the number of all pages. + else if (mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount() + >= mrSlideSorter.GetController().GetPageSelector().GetPageCount()) + bDisable = true; + // Test c): Iterate over the selected pages and look for a master + // page that is used by at least one page. + else while (aSelectedPages.HasMoreElements()) + { + SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); + int nUseCount (mrSlideSorter.GetModel().GetDocument() + ->GetMasterPageUserCount(pPage)); + if (nUseCount > 0) + { + bDisable = true; + break; + } + } + + if (bDisable) + { + rSet.DisableItem(SID_CUT); + rSet.DisableItem(SID_DELETE_PAGE); + rSet.DisableItem(SID_DELETE_MASTER_PAGE); + } +} + +void SlotManager::GetStatusBarState (SfxItemSet& rSet) +{ + // page view and layout + SdPage* pPage = nullptr; + sal_uInt16 nSelectedPages = mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount(); + View* pDrView = &mrSlideSorter.GetView(); + + //Set number of slides + if (nSelectedPages > 0) + { + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + OUString aPageStr; + if (pDescriptor) + { + pPage = pDescriptor->GetPage(); + sal_uInt16 nFirstPage = (pPage->GetPageNum()/2) + 1; + sal_Int32 nPageCount = mrSlideSorter.GetModel().GetPageCount(); + sal_Int32 nActivePageCount = static_cast(mrSlideSorter.GetModel().GetDocument()->GetActiveSdPageCount()); + + if (pDrView->GetDoc().GetDocumentType() == DocumentType::Draw) + aPageStr = (nPageCount == nActivePageCount) ? SdResId(STR_SD_PAGE_COUNT_DRAW) : SdResId(STR_SD_PAGE_COUNT_CUSTOM_DRAW); + else + aPageStr = (nPageCount == nActivePageCount) ? SdResId(STR_SD_PAGE_COUNT) : SdResId(STR_SD_PAGE_COUNT_CUSTOM); + + aPageStr = aPageStr.replaceFirst("%1", OUString::number(nFirstPage)); + aPageStr = aPageStr.replaceFirst("%2", OUString::number(nPageCount)); + if(nPageCount != nActivePageCount) + aPageStr = aPageStr.replaceFirst("%3", OUString::number(nActivePageCount)); + } + rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) ); + } + //Set layout + if (nSelectedPages == 1 && pPage != nullptr) + { + SdPage* pFirstPage = pPage; + OUString aLayoutStr = pFirstPage->GetLayoutName(); + sal_Int32 nIndex = aLayoutStr.indexOf( SD_LT_SEPARATOR ); + if( nIndex != -1 ) + aLayoutStr = aLayoutStr.copy(0, nIndex); + rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) ); + } + //Scale value + const Fraction& aUIScale = mrSlideSorter.GetModel().GetDocument()->GetUIScale(); + OUString aString = OUString::number(aUIScale.GetNumerator()) + + ":" + OUString::number(aUIScale.GetDenominator()); + rSet.Put( SfxStringItem( SID_SCALE, aString ) ); +} + +void SlotManager::RenameSlide(const SfxRequest& rRequest) +{ + View* pDrView = &mrSlideSorter.GetView(); + + if ( pDrView->IsTextEdit() ) + { + pDrView->SdrEndTextEdit(); + } + + SdPage* pSelectedPage = nullptr; + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + if (aSelectedPages.HasMoreElements()) + pSelectedPage = aSelectedPages.GetNextElement()->GetPage(); + if (pSelectedPage == nullptr) + return; + + // tdf#107183 Set different dialog titles when renaming + // master slides or normal ones + OUString aTitle; + if( rRequest.GetSlot() == SID_RENAME_MASTER_PAGE ) + { + if (pDrView->GetDoc().GetDocumentType() == DocumentType::Draw) + aTitle = SdResId( STR_TITLE_RENAMEMASTERPAGE ); + else + aTitle = SdResId( STR_TITLE_RENAMEMASTERSLIDE ); + } + else + { + if (pDrView->GetDoc().GetDocumentType() == DocumentType::Draw) + aTitle = SdResId( STR_TITLE_RENAMEPAGE ); + else + aTitle = SdResId( STR_TITLE_RENAMESLIDE ); + } + + OUString aDescr( SdResId( STR_DESC_RENAMESLIDE ) ); + OUString aPageName = pSelectedPage->GetName(); + + if(rRequest.GetArgs()) + { + OUString aName = rRequest.GetArgs()->GetItem(SID_RENAMEPAGE)->GetValue(); + + bool bResult = RenameSlideFromDrawViewShell(pSelectedPage->GetPageNum()/2, aName ); + DBG_ASSERT( bResult, "Couldn't rename slide or page" ); + } + else + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + vcl::Window* pWin = mrSlideSorter.GetContentWindow(); + ScopedVclPtr aNameDlg(pFact->CreateSvxNameDialog( + pWin ? pWin->GetFrameWeld() : nullptr, + aPageName, aDescr)); + OUString aOldName; + aNameDlg->GetName( aOldName ); + aNameDlg->SetText( aTitle ); + aNameDlg->SetCheckNameHdl( LINK( this, SlotManager, RenameSlideHdl ) ); + aNameDlg->SetCheckNameTooltipHdl( LINK( this, SlotManager, RenameSlideTooltipHdl ) ); + aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE ); + + if( aNameDlg->Execute() == RET_OK ) + { + OUString aNewName; + aNameDlg->GetName( aNewName ); + if (aNewName != aPageName) + { + bool bResult = + RenameSlideFromDrawViewShell( + pSelectedPage->GetPageNum()/2, aNewName ); + DBG_ASSERT( bResult, "Couldn't rename slide or page" ); + } + } + OUString aNewName; + aNameDlg->GetName( aNewName ); + collectUIInformation({{"OldName", aOldName}, {"NewName", aNewName}}, "RENAME"); + aNameDlg.disposeAndClear(); + } + // Tell the slide sorter about the name change (necessary for + // accessibility.) + mrSlideSorter.GetController().PageNameHasChanged( + (pSelectedPage->GetPageNum()-1)/2, aPageName); +} + +IMPL_LINK(SlotManager, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool) +{ + OUString aNewName; + rDialog.GetName( aNewName ); + + model::SharedPageDescriptor pDescriptor ( + mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); + SdPage* pCurrentPage = nullptr; + if (pDescriptor) + pCurrentPage = pDescriptor->GetPage(); + + return (pCurrentPage!=nullptr && aNewName == pCurrentPage->GetName()) + || (mrSlideSorter.GetViewShell() + && mrSlideSorter.GetViewShell()->GetDocSh()->IsNewPageNameValid( aNewName ) ); +} + +IMPL_STATIC_LINK_NOARG(SlotManager, RenameSlideTooltipHdl, AbstractSvxNameDialog&, OUString) +{ + return SdResId(STR_TOOLTIP_RENAME); +} + +bool SlotManager::RenameSlideFromDrawViewShell( sal_uInt16 nPageId, const OUString & rName ) +{ + bool bOutDummy; + SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); + if( pDocument->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND ) + return false; + + SdPage* pPageToRename = nullptr; + + SfxUndoManager* pManager = pDocument->GetDocSh()->GetUndoManager(); + + if( mrSlideSorter.GetModel().GetEditMode() == EditMode::Page ) + { + model::SharedPageDescriptor pDescriptor ( + mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); + if (pDescriptor) + pPageToRename = pDescriptor->GetPage(); + + if (pPageToRename != nullptr) + { + // Undo + SdPage* pUndoPage = pPageToRename; + SdrLayerAdmin & rLayerAdmin = pDocument->GetLayerAdmin(); + SdrLayerID nBackground = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID nBgObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + SdrLayerIDSet aVisibleLayers = pPageToRename->TRG_GetMasterPageVisibleLayers(); + + // (#67720#) + pManager->AddUndoAction( + std::make_unique( + pDocument, pUndoPage, rName, pUndoPage->GetAutoLayout(), + aVisibleLayers.IsSet( nBackground ), + aVisibleLayers.IsSet( nBgObj ))); + + // rename + pPageToRename->SetName( rName ); + + // also rename notes-page + SdPage* pNotesPage = pDocument->GetSdPage( nPageId, PageKind::Notes ); + if (pNotesPage != nullptr) + pNotesPage->SetName (rName); + } + } + else + { + // rename MasterPage -> rename LayoutTemplate + pPageToRename = pDocument->GetMasterSdPage( nPageId, PageKind::Standard ); + if (pPageToRename != nullptr) + { + const OUString aOldLayoutName( pPageToRename->GetLayoutName() ); + pManager->AddUndoAction( std::make_unique( pDocument, aOldLayoutName, rName ) ); + pDocument->RenameLayoutTemplate( aOldLayoutName, rName ); + } + } + + bool bSuccess = pPageToRename!=nullptr && ( rName == pPageToRename->GetName() ); + + if( bSuccess ) + { + // user edited page names may be changed by the page so update control + // aTabControl.SetPageText( nPageId, rName ); + + // set document to modified state + pDocument->SetChanged(); + + // inform navigator about change + if (mrSlideSorter.GetViewShell() && mrSlideSorter.GetViewShell()->GetViewFrame()) + mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings().Invalidate( + SID_NAVIGATOR_STATE, true); + } + + return bSuccess; +} + +/** Insert a slide. The insertion position depends on a) the selection and + b) the mouse position when there is no selection. + + When there is a selection then insertion takes place after the last + slide of the selection. For this to work all but the last selected + slide are deselected first. + + Otherwise, when there is no selection but the insertion marker is visible + the slide is inserted at that position. The slide before that marker is + selected first. + + When both the selection and the insertion marker are not visible--can + that happen?--the new slide is inserted after the last slide. +*/ +void SlotManager::InsertSlide (SfxRequest& rRequest) +{ + const sal_Int32 nInsertionIndex (GetInsertionPosition()); + + PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter); + + SdPage* pNewPage = nullptr; + if (mrSlideSorter.GetModel().GetEditMode() == EditMode::Page) + { + SlideSorterViewShell* pShell = dynamic_cast( + mrSlideSorter.GetViewShell()); + if (pShell != nullptr) + { + pNewPage = pShell->CreateOrDuplicatePage ( + rRequest, + PageKind::Standard, + nInsertionIndex>=0 + ? mrSlideSorter.GetModel().GetPageDescriptor(nInsertionIndex)->GetPage() + : nullptr); + } + } + else + { + // Use the API to create a new page. + SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); + Reference xMasterPagesSupplier ( + pDocument->getUnoModel(), UNO_QUERY); + if (xMasterPagesSupplier.is()) + { + Reference xMasterPages ( + xMasterPagesSupplier->getMasterPages()); + if (xMasterPages.is()) + { + xMasterPages->insertNewByIndex (nInsertionIndex+1); + + // Create shapes for the default layout. + pNewPage = pDocument->GetMasterSdPage( + static_cast(nInsertionIndex+1), PageKind::Standard); + pNewPage->CreateTitleAndLayout (true,true); + } + } + } + if (pNewPage == nullptr) + return; + + // When a new page has been inserted then select it, make it the + // current page, and focus it. + view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); + PageSelector::UpdateLock aUpdateLock (mrSlideSorter); + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); + mrSlideSorter.GetController().GetPageSelector().SelectPage(pNewPage); + collectUIInformation({{"POS", OUString::number(nInsertionIndex + 2)}}, "Insert_New_Page_or_Slide"); +} + +void SlotManager::DuplicateSelectedSlides (SfxRequest& rRequest) +{ + // Create a list of the pages that are to be duplicated. The process of + // duplication alters the selection. + sal_Int32 nInsertPosition (0); + ::std::vector aPagesToDuplicate; + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel())); + while (aSelectedPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + if (pDescriptor && pDescriptor->GetPage()) + { + aPagesToDuplicate.push_back(pDescriptor->GetPage()); + nInsertPosition = pDescriptor->GetPage()->GetPageNum()+2; + } + } + + // Duplicate the pages in aPagesToDuplicate and collect the newly + // created pages in aPagesToSelect. + const bool bUndo (aPagesToDuplicate.size()>1 && mrSlideSorter.GetView().IsUndoEnabled()); + if (bUndo) + mrSlideSorter.GetView().BegUndo(SdResId(STR_INSERTPAGE)); + + ::std::vector aPagesToSelect; + for(const auto& rpPage : aPagesToDuplicate) + { + aPagesToSelect.push_back( + mrSlideSorter.GetViewShell()->CreateOrDuplicatePage( + rRequest, PageKind::Standard, rpPage, nInsertPosition)); + nInsertPosition += 2; + } + aPagesToDuplicate.clear(); + + if (bUndo) + mrSlideSorter.GetView().EndUndo(); + + // Set the selection to the pages in aPagesToSelect. + PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); + rSelector.DeselectAllPages(); + for (auto const& it: aPagesToSelect) + { + rSelector.SelectPage(it); + } + + collectUIInformation({{"POS", OUString::number(nInsertPosition + 2)}}, "Duplicate"); +} + +void SlotManager::ChangeSlideExclusionState ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bExcludeSlide) +{ + SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); + SfxUndoManager* pManager = pDocument->GetDocSh()->GetUndoManager(); + if (rpDescriptor) + { + mrSlideSorter.GetView().SetState( + rpDescriptor, + model::PageDescriptor::ST_Excluded, + bExcludeSlide); + pManager->AddUndoAction(std::make_unique( + pDocument, rpDescriptor, model::PageDescriptor::ST_Excluded, !bExcludeSlide)); + } + else + { + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + std::unique_ptr pChangeSlideExclusionStateUndoAction( + new ChangeSlideExclusionStateUndoAction(pDocument, model::PageDescriptor::ST_Excluded, + !bExcludeSlide)); + while (aSelectedPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + mrSlideSorter.GetView().SetState( + pDescriptor, + model::PageDescriptor::ST_Excluded, + bExcludeSlide); + pChangeSlideExclusionStateUndoAction->AddPageDescriptor(pDescriptor); + } + pManager->AddUndoAction(std::move(pChangeSlideExclusionStateUndoAction)); + } + + SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings()); + rBindings.Invalidate(SID_PRESENTATION); + rBindings.Invalidate(SID_REHEARSE_TIMINGS); + rBindings.Invalidate(SID_HIDE_SLIDE); + rBindings.Invalidate(SID_SHOW_SLIDE); + mrSlideSorter.GetModel().GetDocument()->SetChanged(); +} + +sal_Int32 SlotManager::GetInsertionPosition() const +{ + PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); + + // The insertion indicator is preferred. After all the user explicitly + // used it to define the insertion position. + if (mrSlideSorter.GetController().GetInsertionIndicatorHandler()->IsActive()) + { + // Select the page before the insertion indicator. + return mrSlideSorter.GetController().GetInsertionIndicatorHandler()->GetInsertionPageIndex() + - 1; + } + + // Is there a stored insertion position? + else if (mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() >= 0) + { + return mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() - 1; + } + + // Use the index of the last selected slide. + else if (rSelector.GetSelectedPageCount() > 0) + { + for (int nIndex=rSelector.GetPageCount()-1; nIndex>=0; --nIndex) + if (rSelector.IsPageSelected(nIndex)) + return nIndex; + + // We should never get here. + OSL_ASSERT(false); + return rSelector.GetPageCount() - 1; + } + + // Select the last page when there is at least one page. + else if (rSelector.GetPageCount() > 0) + { + return rSelector.GetPageCount() - 1; + } + + // Hope for the best that CreateOrDuplicatePage() can cope with an empty + // selection. + else + { + // We should never get here because there has to be at least one page. + OSL_ASSERT(false); + return -1; + } +} + +void SlotManager::NotifyEditModeChange() +{ + SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings()); + rBindings.Invalidate(SID_PRESENTATION); + rBindings.Invalidate(SID_INSERTPAGE); + rBindings.Invalidate(SID_DUPLICATE_PAGE); +} + +namespace { + +SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet) +{ + SlideExclusionState eState (UNDEFINED); + + // Get toggle state of the selected pages. + while (rPageSet.HasMoreElements() && eState!=MIXED) + { + const bool bState = rPageSet.GetNextElement()->GetPage()->IsExcluded(); + switch (eState) + { + case UNDEFINED: + // Use the first selected page to set the initial value. + eState = bState ? EXCLUDED : INCLUDED; + break; + + case EXCLUDED: + // The pages before where all not part of the show, + // this one is. + if ( ! bState) + eState = MIXED; + break; + + case INCLUDED: + // The pages before where all part of the show, + // this one is not. + if (bState) + eState = MIXED; + break; + + default: + // No need to change anything. + break; + } + } + + return eState; +} + +} // end of anonymous namespace + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsTransferableData.cxx b/sd/source/ui/slidesorter/controller/SlsTransferableData.cxx new file mode 100644 index 0000000000..f4b89a5aba --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsTransferableData.cxx @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +namespace sd::slidesorter::controller { + +rtl::Reference TransferableData::CreateTransferable ( + SdDrawDocument* pSrcDoc, + SlideSorterViewShell* pViewShell, + ::std::vector&& rRepresentatives) +{ + rtl::Reference pTransferable = new SdTransferable (pSrcDoc, nullptr, false/*bInitOnGetData*/); + auto pData = std::make_shared(pViewShell, std::move(rRepresentatives)); + pTransferable->AddUserData(pData); + return pTransferable; +} + +std::shared_ptr TransferableData::GetFromTransferable (const SdTransferable* pTransferable) +{ + if (pTransferable) + { + for (sal_Int32 nIndex=0,nCount=pTransferable->GetUserDataCount(); nIndex xData = + std::dynamic_pointer_cast(pTransferable->GetUserData(nIndex)); + if (xData) + return xData; + } + } + return std::shared_ptr(); +} + +TransferableData::TransferableData ( + SlideSorterViewShell* pViewShell, + ::std::vector&& rRepresentatives) + : mpViewShell(pViewShell), + maRepresentatives(std::move(rRepresentatives)) +{ + if (mpViewShell != nullptr) + StartListening(*mpViewShell); +} + +TransferableData::~TransferableData() +{ + if (mpViewShell != nullptr) + EndListening(*mpViewShell); +} + +void TransferableData::Notify (SfxBroadcaster&, const SfxHint& rHint) +{ + if (mpViewShell) + { + if (rHint.GetId() == SfxHintId::Dying) + { + // This hint may come either from the ViewShell or from the + // document (registered by SdTransferable). We do not know + // which but both are sufficient to disconnect from the + // ViewShell. + EndListening(*mpViewShell); + mpViewShell = nullptr; + } + } +} + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx b/sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx new file mode 100644 index 0000000000..6f85f362d1 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx @@ -0,0 +1,234 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::controller { + +namespace { + class VisibleAreaScroller + { + public: + VisibleAreaScroller ( + SlideSorter& rSlideSorter, + const Point& rStart, + const Point& rEnd); + void operator() (const double nValue); + private: + SlideSorter& mrSlideSorter; + Point maStart; + const Point maEnd; + const ::std::function maAccelerationFunction; + }; + +} // end of anonymous namespace + +VisibleAreaManager::VisibleAreaManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mbIsCurrentSlideTrackingActive(true), + mnDisableCount(0) +{ +} + +VisibleAreaManager::~VisibleAreaManager() +{ +} + +void VisibleAreaManager::ActivateCurrentSlideTracking() +{ + mbIsCurrentSlideTrackingActive = true; +} + +void VisibleAreaManager::DeactivateCurrentSlideTracking() +{ + mbIsCurrentSlideTrackingActive = false; +} + +void VisibleAreaManager::RequestVisible ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bForce) +{ + if (!rpDescriptor) + return; + + if (mnDisableCount == 0) + { + maVisibleRequests.push_back( + mrSlideSorter.GetView().GetLayouter().GetPageObjectBox( + rpDescriptor->GetPageIndex(), + true)); + } + if (bForce && ! mbIsCurrentSlideTrackingActive) + ActivateCurrentSlideTracking(); + MakeVisible(); +} + +void VisibleAreaManager::RequestCurrentSlideVisible() +{ + if (mbIsCurrentSlideTrackingActive && mnDisableCount==0) + RequestVisible( + mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); +} + +void VisibleAreaManager::MakeVisible() +{ + if (maVisibleRequests.empty()) + return; + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if ( ! pWindow) + return; + const Point aCurrentTopLeft (pWindow->PixelToLogic(Point(0,0))); + + const ::std::optional aNewVisibleTopLeft (GetRequestedTopLeft()); + maVisibleRequests.clear(); + if ( ! aNewVisibleTopLeft) + return; + + maRequestedVisibleTopLeft = *aNewVisibleTopLeft; + VisibleAreaScroller aAnimation( + mrSlideSorter, + aCurrentTopLeft, + maRequestedVisibleTopLeft); + // Execute the animation at its final value. + aAnimation(1.0); +} + +::std::optional VisibleAreaManager::GetRequestedTopLeft() const +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if ( ! pWindow) + return ::std::optional(); + + // Get the currently visible area and the model area. + const ::tools::Rectangle aVisibleArea (pWindow->PixelToLogic( + ::tools::Rectangle( + Point(0,0), + pWindow->GetOutputSizePixel()))); + const ::tools::Rectangle aModelArea (mrSlideSorter.GetView().GetModelArea()); + + sal_Int32 nVisibleTop (aVisibleArea.Top()); + const sal_Int32 nVisibleWidth (aVisibleArea.GetWidth()); + sal_Int32 nVisibleLeft (aVisibleArea.Left()); + const sal_Int32 nVisibleHeight (aVisibleArea.GetHeight()); + + // Find the longest run of boxes whose union fits into the visible area. + for (const auto& rBox : maVisibleRequests) + { + if (nVisibleTop+nVisibleHeight <= rBox.Bottom()) + nVisibleTop = rBox.Bottom()-nVisibleHeight; + if (nVisibleTop > rBox.Top()) + nVisibleTop = rBox.Top(); + + if (nVisibleLeft+nVisibleWidth <= rBox.Right()) + nVisibleLeft = rBox.Right()-nVisibleWidth; + if (nVisibleLeft > rBox.Left()) + nVisibleLeft = rBox.Left(); + + // Make sure the visible area does not move outside the model area. + if (nVisibleTop + nVisibleHeight > aModelArea.Bottom()) + nVisibleTop = aModelArea.Bottom() - nVisibleHeight; + if (nVisibleTop < aModelArea.Top()) + nVisibleTop = aModelArea.Top(); + + if (nVisibleLeft + nVisibleWidth > aModelArea.Right()) + nVisibleLeft = aModelArea.Right() - nVisibleWidth; + if (nVisibleLeft < aModelArea.Left()) + nVisibleLeft = aModelArea.Left(); + } + + const Point aRequestedTopLeft (nVisibleLeft, nVisibleTop); + if (aRequestedTopLeft == aVisibleArea.TopLeft()) + return ::std::optional(); + else + return ::std::optional(aRequestedTopLeft); +} + +//===== VisibleAreaManager::TemporaryDisabler ================================= + +VisibleAreaManager::TemporaryDisabler::TemporaryDisabler (SlideSorter const & rSlideSorter) + : mrVisibleAreaManager(rSlideSorter.GetController().GetVisibleAreaManager()) +{ + ++mrVisibleAreaManager.mnDisableCount; +} + +VisibleAreaManager::TemporaryDisabler::~TemporaryDisabler() +{ + --mrVisibleAreaManager.mnDisableCount; +} + +//===== VerticalVisibleAreaScroller =========================================== + +namespace { + +const sal_Int32 gnMaxScrollDistance = 300; + +VisibleAreaScroller::VisibleAreaScroller ( + SlideSorter& rSlideSorter, + const Point& rStart, + const Point& rEnd) + : mrSlideSorter(rSlideSorter), + maStart(rStart), + maEnd(rEnd), + maAccelerationFunction( + controller::AnimationParametricFunction( + controller::AnimationBezierFunction (0.1,0.6))) +{ + // When the distance to scroll is larger than a threshold then first + // jump to within this distance of the final value and start the + // animation from there. + if (std::abs(rStart.X()-rEnd.X()) > gnMaxScrollDistance) + { + if (rStart.X() < rEnd.X()) + maStart.setX( rEnd.X()-gnMaxScrollDistance ); + else + maStart.setX( rEnd.X()+gnMaxScrollDistance ); + } + if (std::abs(rStart.Y()-rEnd.Y()) > gnMaxScrollDistance) + { + if (rStart.Y() < rEnd.Y()) + maStart.setY( rEnd.Y()-gnMaxScrollDistance ); + else + maStart.setY( rEnd.Y()+gnMaxScrollDistance ); + } +} + +void VisibleAreaScroller::operator() (const double nTime) +{ + const double nLocalTime (maAccelerationFunction(nTime)); + mrSlideSorter.GetController().GetScrollBarManager().SetTopLeft( + Point( + sal_Int32(0.5 + maStart.X() * (1.0 - nLocalTime) + maEnd.X() * nLocalTime), + sal_Int32 (0.5 + maStart.Y() * (1.0 - nLocalTime) + maEnd.Y() * nLocalTime))); +} + +} // end of anonymous namespace + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx b/sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx new file mode 100644 index 0000000000..12993fdbb0 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace com::sun::star::uno +{ +class XInterface; +} + +class SdrPage; + +namespace sd::slidesorter::cache +{ +typedef const SdrPage* CacheKey; + +/** This interface allows the individualisation of different instances of + the PreviewCache. +*/ +class CacheContext +{ +public: + virtual ~CacheContext() {} + + /** This method is called when the asynchronous creation of a preview + has been finished. + @param aKey + The key of the page for which the preview has been created. + */ + virtual void NotifyPreviewCreation(CacheKey aKey) = 0; + + /** Called to determine whether the system is idle and a preview can be + created without annoying the user. + */ + virtual bool IsIdle() = 0; + + /** This method is used to determine whether a page is currently visible + or not. It is called when the cache becomes too large and some + previews have to be released or scaled down. + */ + virtual bool IsVisible(CacheKey aKey) = 0; + + /** Return the page associated with the given key. Note that different + keys may map to a single page (this may be the case with custom + slide shows.) + */ + virtual const SdrPage* GetPage(CacheKey aKey) = 0; + + /** This method is used when the request queue is filled. It asks for + the list of visible entries and maybe for the list of not visible + entries and creates preview creation requests for them. + @param bVisible + When this is then the implementation can decide whether + to allow rendering of previews that are not visible (ahead of + time). When not then return an empty pointer or an empty vector. + */ + virtual std::shared_ptr> GetEntryList(bool bVisible) = 0; + + /** Return the priority that defines the order in which previews are + created for different keys/pages. Typically the visible pages come + first, then top-down, left-to-right. + */ + virtual sal_Int32 GetPriority(CacheKey aKey) = 0; + + /** Return the model to which the pages belong for which the called + cache manages the previews. Different caches that belong to the + same model but have different preview sizes may access previews of + each other in order to create fast previews of the previews. + */ + virtual css::uno::Reference GetModel() = 0; +}; + +typedef std::shared_ptr SharedCacheContext; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx b/sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx new file mode 100644 index 0000000000..4fb596195e --- /dev/null +++ b/sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class Size; + +namespace sd::slidesorter::cache +{ +class GenericPageCache; + +/** The page cache is responsible for the creation and storage of preview + bitmaps of pages that are shown by the slide sorter. + +

      Bitmaps for previews and a cache are used to speed up the display + (painting) of the slide sorter. But, of course, we have to limit this + time-space-tradeoff by limiting the amount of space that can be use to + store bitmaps.

      + +

      There are several strategies employed by this class to shorten the + perceived time that is used to paint the slide sorter: +

        +
      • Rendering pages ahead of time. Additionally to rendering the + visible slides we try to render part or all of the slides that are not + (yet) visible. This, of course, makes sense only when the computer is + otherwise idle while doing that.
      • +
      • When the size of the slides on the screen changes we mark the + bitmaps as needing an update but use them while the new bitmap in the + correct size is not available.
      • +
      • Give the UI the chance to handle user events between the rendering + of differe slides.
      • +
      • Limit the amount of space that may be used for storing preview + bitmaps and throw.
      • +

        + +

        There is another somewhat similar methods for requesting new previews: + GetPreviewBitmap() schedules a re-rendering (when necessary) and + returns the preview what is currently available, either as a preview of + the preview or, when nothing has changed since the last call, as the + final thing. +

        +*/ +class PageCache +{ +public: + /** The page cache is created with a reference to the slide sorter so + that it has access to both the view and the model and so can fill + itself with requests for all or just the visible pages. + + It is the task of the PageCacheManager to create new objects of this + class. + */ + PageCache(const Size& rPreviewSize, const bool bDoSuperSampling, + const SharedCacheContext& rpCacheContext); + + ~PageCache(); + + void ChangeSize(const Size& rPreviewSize, const bool bDoSuperSampling); + + /** Request a preview bitmap for the specified page object in the + specified size. The returned bitmap may be a preview of the + preview, i.e. either a scaled (up or down) version of a previous + preview (of the wrong size) or an empty bitmap. In this case a + request for the generation of a new preview is created and inserted + into the request queue. When the preview is available in the right + size the page shape will be told to paint itself again. When it + then calls this method again if receives the correctly sized preview + bitmap. + @param rRequestData + This data is used to determine the preview. + @param bResize + When then when the available bitmap has not the + requested size, it is scaled before it is returned. When + then the bitmap is returned in the wrong size and it is + the task of the caller to scale it. + @return + Returns a bitmap that is either empty, contains a scaled (up or + down) version or is the requested bitmap. + */ + BitmapEx GetPreviewBitmap(const CacheKey aKey, const bool bResize); + + BitmapEx GetMarkedPreviewBitmap(const CacheKey aKey); + void SetMarkedPreviewBitmap(const CacheKey aKey, const BitmapEx& rBitmap); + + /** When the requested preview bitmap does not yet exist or is not + up-to-date then the rendering of one is scheduled. Otherwise this + method does nothing. + */ + void RequestPreviewBitmap(const CacheKey aKey); + + /** Tell the cache that the bitmap associated with the given request + data is not up-to-date anymore. This will invalidate all previews + in other caches that represent the same page as well. + A new preview is requested and will lead + eventually to a repaint of the associated page object. + */ + void InvalidatePreviewBitmap(const CacheKey aKey); + + /** Call this method when all preview bitmaps have to be generated anew. + This is the case when the size of the page objects on the screen has + changed or when the model has changed. + */ + void InvalidateCache(); + + /** With the precious flag you can control whether a bitmap can be + removed or reduced in size to make room for other bitmaps or is so + precious that it will not touched. A typical use is to set the + precious flag for exactly the visible pages. + */ + void SetPreciousFlag(const CacheKey aKey, const bool bIsPrecious); + + void Pause(); + void Resume(); + +private: + std::unique_ptr mpImplementation; +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx b/sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx new file mode 100644 index 0000000000..eaddea5b28 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx @@ -0,0 +1,155 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +class Size; +class SdrPage; + +namespace sd::slidesorter::cache { + +class BitmapCache; + +/** Provide and manage the preview bitmap caches for all slide sorter + instances. There is one cache per active slide sorter plus a small + number of caches that are no longer in use. The later are kept to speed + up the switching between views. +*/ +class PageCacheManager +{ +public: + typedef std::vector< std::pair > > BestFittingPageCaches; + typedef css::uno::Reference DocumentKey; + + /** Return the one instance of the PageCacheManager class. + */ + static std::shared_ptr Instance(); + + /** Look up the cache for the given model in which the previews have the + specified size. If no such cache exists, then one is created. When + a new BitmapCache is created its Recycle() method is called with a + sorted list of existing caches from which the new one initialize its + previews. + @return + The returned cache lives as long as somebody keeps a shared + pointer and the ReleaseCache() method has not been called. + */ + std::shared_ptr GetCache ( + const DocumentKey& pDocument, + const Size& rPreviewSize); + + /** Tell the cache manager to release its own reference to the specified + cache. After that the cache will live as long as the caller (and + maybe others) holds its reference. + */ + void ReleaseCache (const std::shared_ptr& rpCache); + + /** This is an information to the cache manager that the size of preview + bitmaps in the specified cache has changed. + + */ + std::shared_ptr ChangeSize ( + const std::shared_ptr& rpCache, + const Size& rOldPreviewSize, + const Size& rNewPreviewSize); + + /** Invalidate the preview bitmap for one slide that belongs to the + specified document. The bitmaps for this slide in all caches are + marked as out-of-date and will be re-created when they are requested + the next time. + */ + bool InvalidatePreviewBitmap ( + const DocumentKey& pDocument, + const SdrPage* pPage); + + /** Invalidate the preview bitmaps for all slides that belong to the + specified document. This is necessary after model changes that + affect e.g. page number fields. + */ + void InvalidateAllPreviewBitmaps (const DocumentKey& pDocument); + + /** Invalidate all the caches that are currently in use and destroy + those that are not. This is used for example when the high contrast + mode is turned on or off. + */ + void InvalidateAllCaches(); + + /** Call this method when a page has been deleted and its preview + is not needed anymore. + */ + void ReleasePreviewBitmap (const SdrPage* pPage); + +private: + /** Singleton instance of the cache manager. Note that this is a weak + pointer. The (implementation class of) ViewShellBase holds a + shared_ptr so that the cache manager has the same life time as the + ViewShellBase. + */ + static std::weak_ptr mpInstance; + + /// List of active caches. + class PageCacheContainer; + std::unique_ptr mpPageCaches; + + /// List of inactive, recently used caches. + class RecentlyUsedPageCaches; + std::unique_ptr mpRecentlyUsedPageCaches; + + /** The maximal number of recently used caches that are kept alive after + they have become inactive, i.e. after they are not used anymore by a + slide sorter. + */ + static const sal_uInt32 mnMaximalRecentlyCacheCount = 2; + + PageCacheManager(); + ~PageCacheManager(); + + class Deleter; + friend class Deleter; + + std::shared_ptr GetRecentlyUsedCache( + const DocumentKey& pDocument, + const Size& rSize); + + /** Add the given cache to the list of recently used caches for the + document. There is one such list per document. Each least has at + most mnMaximalRecentlyCacheCount members. + */ + void PutRecentlyUsedCache( + DocumentKey const & pDocument, + const Size& rPreviewSize, + const std::shared_ptr& rpCache); + + /** This method is used internally to initialize a newly created + BitmapCache with already existing previews. + */ + void Recycle ( + const std::shared_ptr& rpCache, + const DocumentKey& pDocument, + const Size& rPreviewSize); +}; + +} // end of namespace ::sd::slidesorter::cache + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx b/sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx new file mode 100644 index 0000000000..10c2aa13ed --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx @@ -0,0 +1,327 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include + +namespace com::sun::star::container +{ +class XIndexAccess; +} +namespace com::sun::star::uno +{ +template class Reference; +} +namespace sd +{ +class FuPoor; +} +namespace sd +{ +class Window; +} +namespace vcl +{ +class Window; +} + +namespace sd::slidesorter +{ +class SlideSorter; +} +namespace sd::slidesorter::view +{ +class SlideSorterView; +} +namespace sd::slidesorter::model +{ +class SlideSorterModel; +} + +class CommandEvent; +class SdPage; +class SfxItemSet; +class SfxRequest; +class VclSimpleEvent; +class VclWindowEvent; + +namespace sd::slidesorter::controller +{ +class Animator; +class Clipboard; +class CurrentSlideManager; +class FocusManager; +class InsertionIndicatorHandler; +class Listener; +class PageSelector; +class ScrollBarManager; +class SelectionFunction; +class SelectionManager; +class SlotManager; +class VisibleAreaManager; + +class SlideSorterController final +{ +public: + /** Create a new controller for the slide sorter. + @param pParentWindow + The window that contains the controls of the new + controller. + */ + SlideSorterController(SlideSorter& rSlideSorter); + + /** Late initialization. Call this method once a new object has been + created. + */ + void Init(); + + ~SlideSorterController(); + + void Dispose(); + + /** Place and size the scroll bars and the browser window so that the + given rectangle is filled. + */ + void Resize(const ::tools::Rectangle& rAvailableSpace); + + /** Determine which of the UI elements--the scroll bars, the scroll bar + filler, the actual slide sorter view--are visible and place them in + the area last passed to Resize(). + @param bForce + When is given ( is the default) then the content + window and with it the SlideSorterView is resized event when its + size does not change (the size does change when the visibility + of scroll bars changes.) + */ + void Rearrange(bool bForce); + + /** Return the descriptor of the page that is rendered under the + given position. This takes the IsOnlyPreviewTriggersMouseOver + property into account. + @return + Returns a pointer to a page descriptor instead of a + reference because when no page is found at the position + then NULL is returned to indicate this. + */ + model::SharedPageDescriptor GetPageAt(const Point& rPixelPosition); + + // Exported for unit test + SD_DLLPUBLIC PageSelector& GetPageSelector(); + FocusManager& GetFocusManager(); + // Exported for unit test + SD_DLLPUBLIC controller::Clipboard& GetClipboard(); + + /** Return the object that manages the scroll bars. + */ + ScrollBarManager& GetScrollBarManager(); + + std::shared_ptr const& GetCurrentSlideManager() const; + std::shared_ptr const& GetSlotManager() const; + std::shared_ptr const& GetSelectionManager() const; + std::shared_ptr const& GetInsertionIndicatorHandler() const; + + /** This method forwards the call to the SlideSorterView and executes + pending operations like moving selected pages into the visible area. + */ + void Paint(const ::tools::Rectangle& rRect, vcl::Window* pWin); + + void FuTemporary(SfxRequest& rRequest); + void FuPermanent(SfxRequest& rRequest); + void FuSupport(SfxRequest& rRequest); + bool Command(const CommandEvent& rEvent, ::sd::Window* pWindow); + + void GetCtrlState(SfxItemSet& rSet); + void GetStatusBarState(SfxItemSet& rSet); + + void ExecCtrl(SfxRequest& rRequest); + void GetAttrState(SfxItemSet& rSet); + + /** Create an object of this inner class to prevent updates due to model + changes. + */ + class ModelChangeLock + { + public: + ModelChangeLock(SlideSorterController& rController); + ~ModelChangeLock() COVERITY_NOEXCEPT_FALSE; + void Release(); + + private: + SlideSorterController* mpController; + }; + friend class ModelChangeLock; + + /** Handle a change of the model, that is, handle the removal and + insertion of whole pages or a change of the edit mode. + + This method is a convenience function that simply calls + PreModelChange() and then PostModelChange(). + */ + void HandleModelChange(); + + DECL_LINK(WindowEventHandler, VclWindowEvent&, void); + DECL_LINK(ApplicationEventHandler, VclSimpleEvent&, void); + + /** Update the display of all pages. This involves a redraw and + releasing previews and caches. + */ + void UpdateAllPages(); + + /** This factory method creates a selection function. + */ + rtl::Reference CreateSelectionFunction(SfxRequest& rRequest); + + /** When the current function of the view shell is the slide sorter + selection function then return a reference to it. Otherwise return + an empty reference. + */ + ::rtl::Reference GetCurrentSelectionFunction() const; + + /** Prepare for a change of the edit mode. Depending on the current + edit mode we may save the selection so that it can be restored when + later changing back to the current edit mode. + */ + void PrepareEditModeChange(); + + /** Set a new edit mode and return whether the edit mode really + has been changed. For proper saving and restoring of the selection + this method should be called between calls to + PrepareEditModeChange() and FinishEditModeChange(). + */ + void ChangeEditMode(EditMode eEditMode); + + /** Finish the change of the edit mode. Here we may select a page or + restore a previously saved selection. + */ + void FinishEditModeChange(); + + /** Call this method when the name of one of the pages has changed. + This is then notified to the accessibility object, when that exists. + @param nPageIndex + The index of the page whose name has been changed. + @param rsOldName + The old name of the page. The new name can be taken from the + page object. + */ + void PageNameHasChanged(int nPageIndex, const OUString& rsOldName); + + /** Provide the set of pages to be displayed in the slide sorter. The + GetDocumentSlides() method can be found only in the SlideSorterModel. + */ + void SetDocumentSlides(const css::uno::Reference& rxSlides); + + /** Return an Animator object. + */ + const std::shared_ptr& GetAnimator() const { return mpAnimator; } + + VisibleAreaManager& GetVisibleAreaManager() const; + + void CheckForMasterPageAssignment(); + void CheckForSlideTransitionAssignment(); + +private: + SlideSorter& mrSlideSorter; + model::SlideSorterModel& mrModel; + view::SlideSorterView& mrView; + std::unique_ptr mpPageSelector; + std::unique_ptr mpFocusManager; + std::shared_ptr mpSlotManager; + std::unique_ptr mpScrollBarManager; + mutable std::shared_ptr mpCurrentSlideManager; + std::shared_ptr mpSelectionManager; + std::unique_ptr mpClipboard; + std::shared_ptr mpInsertionIndicatorHandler; + std::shared_ptr mpAnimator; + std::unique_ptr mpVisibleAreaManager; + + // The listener listens to UNO events and thus is a UNO object. + ::rtl::Reference mpListener; + + int mnModelChangeLockCount; + bool mbIsForcedRearrangePending; + bool mbContextMenuOpen; + + bool mbPostModelChangePending; + + /** This array stores the indices of the selected page descriptors at + the time when the edit mode is switched to EditMode::MasterPage. With this + we can restore the selection when switching back to EditMode::Page mode. + */ + ::std::vector maSelectionBeforeSwitch; + /// The current page before the edit mode is switched to EditMode::MasterPage. + int mnCurrentPageBeforeSwitch; + + /** The master page to select after the edit mode is changed. This + member is used to pass the pointer from PrepareEditModeChange() to + FinishEditModeChange(). + */ + SdPage* mpEditModeChangeMasterPage; + + /** This rectangle in the parent window encloses scroll bars and slide + sorter window. It is set when Resize() is called. + */ + ::tools::Rectangle maTotalWindowArea; + + /** This counter is used to avoid processing of reentrant calls to + Paint(). + */ + sal_Int32 mnPaintEntranceCount; + + /** Prepare for several model changes, i.e. prevent time-consuming and + non-critical operations like repaints until UnlockModelChange() is + called. Critical operations like releasing references to pages that + do not exist anymore are executed. + */ + void LockModelChange(); + + /** Further calls to HandleModelChange() will result in a full featured + update of model, view, and controller. When HandleModelChange() has + been called since the last LockModelChange() then this is done right + away to bring the view up-to-date. + */ + void UnlockModelChange(); + + /** Prepare for a model change. This method does all the things that + need to be done _before_ the model changes, e.g. because they need + access to the model data before the change. + */ + void PreModelChange(); + + /** Complete a model change. This includes the recreation of data + structures that depend on the model and the request for a repaint to + show the changes. + */ + void PostModelChange(); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx b/sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx new file mode 100644 index 0000000000..b4847de1a0 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + + +namespace sd::slidesorter::controller { + +class AnimationBezierFunction +{ +public: + /** Create a cubic bezier curve whose start and end points are given + implicitly as P0=(0,0) and P3=(1,1). The second control point is + implicitly given as P2=(1-nY1,1-nX1). + */ + AnimationBezierFunction ( + const double nX1, + const double nY1); + + ::basegfx::B2DPoint operator() (const double nT); + +private: + const double mnX1; + const double mnY1; + const double mnX2; + const double mnY2; + + static double EvaluateComponent ( + const double nT, + const double nV1, + const double nV2); +}; + +/** Turn a parametric function into one whose y-Values depend on its + x-Values. Note a lot of interpolation takes place. The resulting + accuracy should be good enough for the purpose of acceleration + function for animations. +*/ +class AnimationParametricFunction +{ +public: + typedef ::std::function ParametricFunction; + AnimationParametricFunction (const ParametricFunction& rFunction); + + double operator() (const double nX); + +private: + /** y-Values of the parametric function given to the constructor + evaluated (and interpolated) for evenly spaced x-Values. + */ + ::std::vector maY; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx b/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx new file mode 100644 index 0000000000..8c9ec9e81e --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx @@ -0,0 +1,122 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd::slidesorter { class SlideSorter; } + +namespace sd::slidesorter::controller { + +/** Experimental class for simple eye candy animations. +*/ +class Animator +{ +public: + /** In some circumstances we have to avoid animation and jump to the + final animation state immediately. Use this enum instead of a bool + to be more expressive. + */ + enum AnimationMode { AM_Animated, AM_Immediate }; + + explicit Animator (SlideSorter& rSlideSorter); + ~Animator(); + Animator(const Animator&) = delete; + Animator& operator=(const Animator&) = delete; + + /** When disposed the animator will stop its work immediately and not + process any timer events anymore. + */ + void Dispose(); + + /** An animation object is called with values between 0 and 1 as single + argument to its operator() method. + */ + typedef ::std::function AnimationFunctor; + typedef ::std::function FinishFunctor; + + typedef sal_Int32 AnimationId; + static const AnimationId NotAnAnimationId = -1; + + /** Schedule a new animation for execution. The () operator of that + animation will be called with increasing values between 0 and 1 for + the specified duration. + @param rAnimation + The animation operation. + */ + AnimationId AddAnimation ( + const AnimationFunctor& rAnimation, + const FinishFunctor& rFinishFunctor); + + /** Abort and remove an animation. In order to reduce the bookkeeping + on the caller side, it is OK to call this method with an animation + function that is not currently being animated. Such a call is + silently ignored. + */ + void RemoveAnimation (const AnimationId nAnimationId); + + /** A typical use case for this method is the temporary shutdown of the + slidesorter when the slide sorter bar is put into a cache due to a + change of the edit mode. + */ + void RemoveAllAnimations(); + +private: + SlideSorter& mrSlideSorter; + Idle maIdle; + bool mbIsDisposed; + class Animation; + typedef ::std::vector > AnimationList; + AnimationList maAnimations; + ::canvas::tools::ElapsedTime maElapsedTime; + + std::unique_ptr> mpDrawLock; + + AnimationId mnNextAnimationId; + + DECL_LINK(TimeoutHandler, Timer *, void); + + /** Execute one step of every active animation. + @param nTime + Time measured in milliseconds with some arbitrary reference point. + @return + When one or more animation has finished then is + returned. Call CleanUpAnimationList() in this case. + */ + bool ProcessAnimations (const double nTime); + + /** Remove animations that have expired. + */ + void CleanUpAnimationList(); + + void RequestNextFrame(); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx b/sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx new file mode 100644 index 0000000000..6ced17486e --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx @@ -0,0 +1,208 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +#include + +class SfxRequest; +struct AcceptDropEvent; +class DropTargetHelper; +struct ExecuteDropEvent; +struct ImplSVEvent; +class Point; +class SdPage; +namespace vcl { class Window; } + +namespace sd { +class Window; +} + +namespace sd::slidesorter { class SlideSorter; } + +namespace sd::slidesorter::controller { + +class SlideSorterController; + +class SAL_DLLPUBLIC_RTTI Clipboard final + : public ViewClipboard +{ +public: + Clipboard (SlideSorter& rSlideSorter); + virtual ~Clipboard() override; + + /** Create a slide sorter transferable from the given sd + transferable. The returned transferable is set up with all + information necessary so that it can be dropped on a slide sorter. + */ + static std::shared_ptr CreateTransferableUserData (SdTransferable* pTransferable); + + void HandleSlotCall (SfxRequest& rRequest); + + void DoCut (); + // Exported for unit test + SD_DLLPUBLIC void DoCopy(); + // Exported for unit test + SD_DLLPUBLIC void DoPaste(); + void DoDelete (); + + void StartDrag ( + const Point& rDragPt, + vcl::Window* pWindow ); + + void DragFinished ( + sal_Int8 nDropAction); + + sal_Int8 AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer ); + + sal_Int8 ExecuteDrop ( + const ExecuteDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer ); + + void Abort(); + +private: + virtual sal_uInt16 DetermineInsertPosition () override; + + SlideSorter& mrSlideSorter; + SlideSorterController& mrController; + + typedef ::std::vector PageList; + /** Remember the pages that are dragged to another document or to + another place in the same document so that they can be removed after + a move operation. + */ + PageList maPagesToRemove; + + /** Used when a drop is executed to combine all undo actions into one. + Typically created in ExecuteDrop() and released in DragFinish(). + */ + class UndoContext; + std::unique_ptr mxUndoContext; + + std::unique_ptr> mxSelectionObserverContext; + ImplSVEvent * mnDragFinishedUserEventId; + + void CreateSlideTransferable ( + vcl::Window* pWindow, + bool bDrag); + + /** Determine the position of where to insert the pages in the current + transferable of the sd module. + @return + The index in the range [0,n] (both inclusive) with n the number + of pages is returned. + */ + sal_Int32 GetInsertionPosition (); + + /** Paste the pages of the transferable of the sd module at the given + position. + @param nInsertPosition + The position at which to insert the pages. The valid range is + [0,n] (both inclusive) with n the number of pages in the + document. + @return + The number of inserted pages is returned. + */ + sal_Int32 PasteTransferable (sal_Int32 nInsertPosition); + + /** Select a range of pages of the model. Typically usage is the + selection of newly inserted pages. + @param nFirstIndex + The index of the first page to select. + @param nPageCount + The number of pages to select. + */ + void SelectPageRange (sal_Int32 nFirstIndex, sal_Int32 nPageCount); + + /** Return when the current transferable in the current state of + the slidesorter is acceptable to be pasted. For this the + transferable has to + a) exist, + b) contain one or more regular draw pages, no master pages. + When master pages are involved, either in the transferable or in the + slide sorter (by it displaying master pages) the drop of the + transferable is not accepted. The reason is the missing + implementation of proper handling master pages copy-and-paste. + */ + enum DropType { DT_PAGE, DT_PAGE_FROM_NAVIGATOR, DT_SHAPE, DT_NONE }; + DropType IsDropAccepted() const; + + /** This method contains the code for AcceptDrop() and ExecuteDrop() shapes. + There are only minor differences for the two cases at this level. + @param eCommand + This parameter specifies whether to do an AcceptDrop() or + ExecuteDrop(). + @param rPosition + Since the event is given as void pointer we can not take the + mouse position from it. The caller has to supply it in this + parameter. + @param pDropEvent + Event though the AcceptDropEvent and ExecuteDropEvent are very + similar they do not have a common base class. Because of that + we have to use a void* to pass these structs. + @param nPage + When the page number is given as 0xffff then it is replaced by + the number of the page at the mouse position. If the mouse is + not over a page then neither AcceptDrop() nor ExecuteDrop() are + executed. + */ + enum DropCommand { DC_ACCEPT, DC_EXECUTE }; + sal_Int8 ExecuteOrAcceptShapeDrop ( + DropCommand eCommand, + const Point& rPosition, + const void* pDropEvent , + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer); + + /** Return whether the insertion defined by the transferable is + trivial, ie would not change either source nor target document. + */ + bool IsInsertionTrivial ( + SdTransferable const * pTransferable, + const sal_Int8 nDndAction) const; + + /** Asynchronous part of DragFinished. The argument is the sal_Int8 + nDropAction, disguised as void*. + */ + DECL_DLLPRIVATE_LINK(ProcessDragFinished, void*, void); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx new file mode 100644 index 0000000000..0c5b3b2439 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +class SdPage; + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::controller +{ +/** Manage the current slide. This includes setting the according flags at + the PageDescriptor objects and setting the current slide at the main + view shell. + + Switching pages is triggered only after a little delay. This allows + fast travelling through a larger set of slides without having to wait + for the edit view to update its content after every slide change. +*/ +class CurrentSlideManager +{ +public: + /** Create a new CurrentSlideManager object that manages the current + slide for the given SlideSorter. + */ + CurrentSlideManager(SlideSorter& rSlideSorter); + + ~CurrentSlideManager(); + + /** Call this when the current page of the main view shell has been + switched. Use SwitchCurrentSlide() to initiate such a switch. + */ + void NotifyCurrentSlideChange(const sal_Int32 nSlideIndex); + void NotifyCurrentSlideChange(const SdPage* pPage); + + /** Call this method to switch the current page of the main view shell + to the given slide. Use CurrentSlideHasChanged() when the current + slide change has been initiated by someone else. + @param nSlideIndex + Zero based index in the range [0,number-of-slides). + The page selection is cleared and only the new + current slide is selected. + */ + void SwitchCurrentSlide(const sal_Int32 nSlideIndex); + void SwitchCurrentSlide(const model::SharedPageDescriptor& rpSlide, + const bool bUpdateSelection = false); + + /** Return the page descriptor for the current slide. Note, that when + there is no current slide then the returned pointer is empty. + */ + const model::SharedPageDescriptor& GetCurrentSlide() const { return mpCurrentSlide; } + + /** Release all references to model data. + */ + void PrepareModelChange(); + + /** Modify inner state in reaction to a change of the SlideSorterModel. + */ + void HandleModelChange(); + +private: + SlideSorter& mrSlideSorter; + sal_Int32 mnCurrentSlideIndex; + model::SharedPageDescriptor mpCurrentSlide; + /** Timer to control the delay after which to ask + XController/ViewShellBase to switch to another slide. + */ + Timer maSwitchPageDelayTimer; + + void SetCurrentSlideAtViewShellBase(const model::SharedPageDescriptor& rpSlide); + void SetCurrentSlideAtTabControl(const model::SharedPageDescriptor& rpSlide); + void SetCurrentSlideAtXController(const model::SharedPageDescriptor& rpSlide); + + /** When switching from one slide to a new current slide then this + method releases all ties to the old slide. + */ + void ReleaseCurrentSlide(); + + /** When switching from one slide to a new current slide then this + method connects to the new current slide. + */ + void AcquireCurrentSlide(const sal_Int32 nSlideIndex); + + DECL_LINK(SwitchPageCallback, Timer*, void); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx new file mode 100644 index 0000000000..6449a7fc83 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx @@ -0,0 +1,214 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include +#include + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::controller +{ +/** This class manages the focus of the slide sorter. There is the focus + page which is or is not focused. Initialized to point to the first page + it can be set to other pages by using the MoveFocus() method. The + focused state of the focus page can be toggled with the ToggleFocus() + method. +*/ +class FocusManager +{ +public: + /** Create a new focus manager that operates on the pages of the model + associated with the given controller. The focus page is set to the + first page. Focused state is off. + */ + FocusManager(SlideSorter& rSlideSorter); + + ~FocusManager(); + + enum class FocusMoveDirection + { + Left, + Right, + Up, + Down + }; + + /** Move the focus from the currently focused page to one that is + displayed adjacent to it, either vertically or horizontally. + @param eDirection + Direction in which to move the focus. Wrap around is done + differently when moving vertically or horizontally. Vertical + wrap around takes place in the same column, i.e. when you are + in the top row and move up you come out in the bottom row in the + same column. Horizontal wrap around moves to the next + (FocusMoveDirection::Right) or previous (FocusMoveDirection::Left) page. Moving to the right + from the last page goes to the first page and vice versa. + The current page index is set to the nearest valid + page index. + */ + void MoveFocus(FocusMoveDirection eDirection); + + /** Show the focus indicator of the current slide. + @param bScrollToFocus + When (the default) then the view is scrolled so that the + focus rectangle lies inside its visible area. + */ + void ShowFocus(const bool bScrollToFocus = true); + + /** Hide the focus indicator. + */ + void HideFocus(); + + /** Toggle the focused state of the current slide. + @return + Returns the focused state of the focus page after the call. + */ + bool ToggleFocus(); + + /** Return whether the window managed by the called focus manager has + the input focus of the application. + */ + bool HasFocus() const; + + /** Return the descriptor of the page that currently has the focus. + @return + When there is no page that currently has the focus then NULL is + returned. + */ + model::SharedPageDescriptor GetFocusedPageDescriptor() const; + + /** Return the index of the page that currently has the focus as it is + accepted by the slide sorter model. + @return + When there is no page that currently has the focus then -1 is + returned. + */ + sal_Int32 GetFocusedPageIndex() const { return mnPageIndex; } + + /** Set the focused page to the one described by the given page + descriptor. The visibility of the focus indicator is not modified. + @param rDescriptor + One of the page descriptors that are currently managed by the + SlideSorterModel. + */ + bool SetFocusedPage(const model::SharedPageDescriptor& rDescriptor); + + /** Set the focused page to the one described by the given page + index. The visibility of the focus indicator is not modified. + @param nPageIndex + A valid page index that is understood by the SlideSorterModel. + */ + void SetFocusedPage(sal_Int32 nPageIndex); + + /** Set the focused page to the one that is the current slide of the + Slide Manager + */ + bool SetFocusedPageFromCurrentPage(); + + /** Return when the focus indicator is currently shown. A + prerequisite is that the window managed by this focus manager has + the input focus as indicated by a return value of + HasFocus(). It is not necessary that the focus indicator is + visible. It may have been scrolled outside the visible area. + */ + bool IsFocusShowing() const; + + /** Add a listener that is called when the focus is shown or hidden or + set to another page object. + @param rListener + When this method is called multiple times for the same listener + the second and all following calls are ignored. Each listener + is added only once. + */ + void AddFocusChangeListener(const Link& rListener); + + /** Remove a focus change listener. + @param rListener + It is safe to pass a listener that was not added are has been + removed previously. Such calls are ignored. + */ + void RemoveFocusChangeListener(const Link& rListener); + + /** Create an instance of this class to temporarily hide the focus + indicator. It is restored to its former visibility state when the + FocusHider is destroyed. + */ + class FocusHider + { + public: + FocusHider(FocusManager&); + ~FocusHider() COVERITY_NOEXCEPT_FALSE; + + private: + bool mbFocusVisible; + FocusManager& mrManager; + }; + +private: + SlideSorter& mrSlideSorter; + + /** Index of the page that may be focused. It is -1 when the model + contains no page. + */ + sal_Int32 mnPageIndex; + + /** This flag indicates whether the page pointed to by mpFocusDescriptor + has the focus. + */ + bool mbPageIsFocused; + + ::std::vector> maFocusChangeListeners; + + /** Reset the focus state of the given descriptor and request a repaint + so that the focus indicator is hidden. + @param pDescriptor + When NULL is given then the call is ignored. + */ + void HideFocusIndicator(const model::SharedPageDescriptor& rpDescriptor); + + /** Set the focus state of the given descriptor, scroll it into the + visible area and request a repaint so that the focus indicator is + made visible. + @param pDescriptor + When NULL is given then the call is ignored. + @param bScrollToFocus + When (the default) then the view is scrolled so that the + focus rectangle lies inside its visible area. + */ + void ShowFocusIndicator(const model::SharedPageDescriptor& rpDescriptor, + const bool bScrollToFocus); + + /** Call all currently registered listeners that a focus change has + happened. The focus may be hidden or shown or moved from one page + object to another. + */ + void NotifyFocusChangeListeners() const; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx b/sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx new file mode 100644 index 0000000000..3109288822 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +namespace sd::slidesorter { class SlideSorter; } +namespace sd::slidesorter::view { +class InsertAnimator; +class InsertionIndicatorOverlay; +} + +class SdTransferable; + +namespace sd::slidesorter::controller { + +/** Manage the visibility and location of the insertion indicator. Its + actual display is controlled by the InsertionIndicatorOverlay. +*/ +class InsertionIndicatorHandler +{ +public: + InsertionIndicatorHandler (SlideSorter& rSlideSorter); + ~InsertionIndicatorHandler() COVERITY_NOEXCEPT_FALSE; + + enum Mode { CopyMode, MoveMode, UnknownMode }; + static Mode GetModeFromDndAction (const sal_Int8 nDndAction); + + /** Activate the insertion marker at the given coordinates. + */ + void Start (const bool bIsOverSourceView); + + /** Deactivate the insertion marker. + */ + void End (const controller::Animator::AnimationMode eMode); + + /** This context make sure that the insertion indicator is shown + (provided that the clipboard is not empty) while the context is + alive. Typically used while a context menu is displayed. + */ + class ForceShowContext + { + public: + ForceShowContext (std::shared_ptr pHandler); + ~ForceShowContext() COVERITY_NOEXCEPT_FALSE; + private: + const std::shared_ptr mpHandler; + }; + + /** Update the indicator icon from the current transferable (from the + clipboard or an active drag and drop operation.) + */ + void UpdateIndicatorIcon (const SdTransferable* pTransferable); + + /** Set the position of the insertion marker to the given coordinates. + */ + void UpdatePosition ( + const Point& rMouseModelPosition, + const Mode eMode); + void UpdatePosition ( + const Point& rMouseModelPosition, + const sal_Int8 nDndAction); + + /** Return whether the insertion marker is active. + */ + bool IsActive() const { return mbIsActive;} + + /** Return the insertion index that corresponds with the current + graphical location of the insertion indicator. + */ + sal_Int32 GetInsertionPageIndex() const; + + /** Determine whether moving the current selection to the current + position of the insertion marker would alter the document. This + would be the case when the selection is not consecutive or would be + moved to a position outside and not adjacent to the selection. + */ + bool IsInsertionTrivial ( + const sal_Int32 nInsertionIndex, + const Mode eMode) const; + /** This method is like the other variant. It operates implicitly + on the current insertion index as would be returned by + GetInsertionPageIndex(). + */ + bool IsInsertionTrivial (const sal_Int8 nDndAction); + +private: + SlideSorter& mrSlideSorter; + std::shared_ptr mpInsertAnimator; + std::shared_ptr mpInsertionIndicatorOverlay; + view::InsertPosition maInsertPosition; + Mode meMode; + bool mbIsInsertionTrivial; + bool mbIsActive; + bool mbIsReadOnly; + bool mbIsOverSourceView; + Size maIconSize; + bool mbIsForcedShow; + + void SetPosition ( + const Point& rPoint, + const Mode eMode); + std::shared_ptr const & GetInsertAnimator(); + + /** Make the insertion indicator visible (that is the show part) and + keep it visible, even when the mouse leaves the window (that is the + force part). We need this when a context menu is displayed (mouse + over the popup menu triggers a mouse leave event) while the + insertion indicator remains visible in the background. + + In effect all calls to End() are ignored until ForceEnd() is called. + */ + void ForceShow(); + void ForceEnd(); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx b/sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx new file mode 100644 index 0000000000..8ea46b3f36 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx @@ -0,0 +1,219 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +#include + +class SdPage; + +namespace sd::slidesorter +{ +class SlideSorter; +} +namespace sd::slidesorter::model +{ +class SlideSorterModel; +} + +namespace sd::slidesorter::controller +{ +class SlideSorterController; + +/** A sub-controller that handles page selection of the slide browser. + Selecting a page does not make it the current page (of the main view) + automatically as this would not be desired in a multi selection. This + has to be done explicitly by calling the + CurrentSlideManager::SetCurrentSlide() method. + + Indices of pages relate always to the number of all pages in the model + (as returned by GetPageCount()) not just the selected pages. +*/ +class PageSelector +{ +public: + explicit PageSelector(SlideSorter& rSlideSorter); + PageSelector(const PageSelector&) = delete; + PageSelector& operator=(const PageSelector&) = delete; + + // Exported for unit test + SD_DLLPUBLIC void SelectAllPages(); + SD_DLLPUBLIC void DeselectAllPages(); + + /** Update the selection state of all page descriptors to be the same as + that of the corresponding pages of the SdPage objects and issue + redraw requests where necessary. + */ + void GetCoreSelection(); + + /** Update the selection state of the SdPage objects to be the same as + that of the corresponding page descriptors. + */ + void SetCoreSelection(); + + /** Select the specified descriptor. The selection state of the other + descriptors is not affected. + */ + void SelectPage(int nPageIndex); + /** Select the descriptor that is associated with the given page. The + selection state of the other descriptors is not affected. + */ + void SelectPage(const SdPage* pPage); + /** Select the specified descriptor. The selection state of the other + descriptors is not affected. + */ + void SelectPage(const model::SharedPageDescriptor& rpDescriptor); + + /** Return whether the specified page is selected. This convenience + method is a substitute for + SlideSorterModel::GetPageDescriptor(i)->HasState(ST_Selected) is + included here to make this class more self contained. + */ + SD_DLLPUBLIC bool IsPageSelected(int nPageIndex); + + /** Return whether the specified page is excluded. This convenience + method is a substitute for + SlideSorterModel::GetPageDescriptor(i)->HasState(ST_Excluded) is + included here to make this class more self contained. + */ + SD_DLLPUBLIC bool IsPageExcluded(int nPageIndex); + + /** Deselect the descriptor that is associated with the given page. + The current page is updated to the first slide + of the remaining selection. + */ + void DeselectPage(int nPageIndex); + void DeselectPage(const model::SharedPageDescriptor& rpDescriptor, + const bool bUpdateCurrentPage = true); + + /** This convenience method returns the same number of pages that + SlideSorterModel.GetPageCount() returns. It is included here so + that it is self contained for iterating over all pages to select or + deselect them. + */ + int GetPageCount() const; + int GetSelectedPageCount() const { return mnSelectedPageCount; } + + /** Return the anchor for a range selection. This usually is the first + selected page after all pages have been deselected. + @return + The returned anchor may be NULL. + */ + const model::SharedPageDescriptor& GetSelectionAnchor() const { return mpSelectionAnchor; } + + typedef ::std::vector PageSelection; + + /** Return an object that describes the current selection. The caller + can use that object to later restore the selection. + @return + The object returned describes the selection via indices. So + even if pages are exchanged a later call to SetPageSelection() + is valid. + */ + std::shared_ptr GetPageSelection() const; + + /** Restore a page selection according to the given selection object. + @param rSelection + Typically obtained by calling GetPageSelection() this object + is used to restore the selection. If pages were exchanged since + the last call to GetPageSelection() it is still valid to call + this method with the selection. When pages have been inserted + or removed the result may be unexpected. + @param bUpdateCurrentPage + When (the default value) then after setting the + selection update the current page to the first page of the + selection. + When called from within UpdateCurrentPage() then this flag is + used to prevent a recursion loop. + */ + void SetPageSelection(const std::shared_ptr& rSelection, + const bool bUpdateCurrentPage); + + /** Call this method after the model has changed to set the number + of selected pages. + */ + void CountSelectedPages(); + + /** Use the UpdateLock whenever you do a complex selection, i.e. call + more than one method in a row. An active lock prevents intermediate + changes of the current slide. + */ + class UpdateLock + { + public: + UpdateLock(SlideSorter const& rSlideSorter); + UpdateLock(PageSelector& rPageSelector); + ~UpdateLock(); + void Release(); + + private: + PageSelector* mpSelector; + }; + + class BroadcastLock + { + public: + BroadcastLock(SlideSorter const& rSlideSorter); + BroadcastLock(PageSelector& rPageSelector); + ~BroadcastLock(); + + private: + PageSelector& mrSelector; + }; + +private: + model::SlideSorterModel& mrModel; + SlideSorter& mrSlideSorter; + SlideSorterController& mrController; + int mnSelectedPageCount; + int mnBroadcastDisableLevel; + bool mbSelectionChangeBroadcastPending; + model::SharedPageDescriptor mpMostRecentlySelectedPage; + /// Anchor for a range selection. + model::SharedPageDescriptor mpSelectionAnchor; + sal_Int32 mnUpdateLockCount; + bool mbIsUpdateCurrentPagePending; + + /** Enable the broadcasting of selection change events. This calls the + SlideSorterController::SelectionHasChanged() method to do the actual + work. When EnableBroadcasting has been called as many times as + DisableBroadcasting() was called before and the selection has been + changed in the meantime, this change will be broadcasted. + */ + void EnableBroadcasting(); + + /** Disable the broadcasting of selection change events. Subsequent + changes of the selection will set a flag that triggers the sending + of events when EnableBroadcasting() is called. + */ + void DisableBroadcasting(); + + void UpdateCurrentPage(const bool bUpdateOnlyWhenPending = false); + + void CheckConsistency() const; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx b/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx new file mode 100644 index 0000000000..479185f536 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::slidesorter::controller +{ +/** An extensible set of properties used throughout the slide sorter. +*/ +class Properties +{ +public: + Properties(); + + /** Call this method after receiving a VclEventId::ApplicationDataChanged + event. + */ + void HandleDataChangeEvent(); + + /** Return the background color. + */ + const Color& GetBackgroundColor() const { return maBackgroundColor; } + void SetBackgroundColor(const Color& rColor); + + /** Return the color in which selections are to be painted. + */ + const Color& GetSelectionColor() const { return maSelectionColor; } + void SetSelectionColor(const Color& rColor); + +private: + Color maBackgroundColor; + Color maSelectionColor; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx new file mode 100644 index 0000000000..df04a3b595 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx @@ -0,0 +1,242 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace sd { class Window; } + +namespace sd::slidesorter { class SlideSorter; } + +namespace sd::slidesorter::controller { + +/** Manage the horizontal and vertical scroll bars. Listen for events, set + their sizes, place them in the window, determine their visibilities. + +

        Handle auto scrolling, i.e. the scrolling of the window when the + mouse comes near the window border while dragging a selection.

        + +

        In order to make the slide sorter be used in the task pane with its + own vertical scrollbars the vertical scrollbar of the use of the slide + sorter is optional. When using it the available area in a window is + used and the vertical scrollbar is displayed when that area is not large + enough. When the vertical scrollbar is not used then the available area + is assumed to be modifiable. In that case the PlaceScrollBars() method + may return an area larger than the one given.

        +*/ +class ScrollBarManager +{ +public: + /** Create a new scroll bar manager that manages three controls: the + horizontal scroll bar, the vertical scroll bar, and the little + window that fills the gap at the bottom right corner that is left + between the two scroll bars. Call LateInitialization() after + constructing a new object. + */ + ScrollBarManager (SlideSorter& rSlideSorter); + + ~ScrollBarManager(); + + /** Register listeners at the scroll bars. This method is called after + startup of a new slide sorter object or after a reactivation of a + slide sorter that for example is taken from a cache. + */ + void Connect(); + + /** Remove listeners from the scroll bars. This method is called when + the slide sorter is destroyed or when it is suspended, e.g. put + into a cache for later reuse. + */ + void Disconnect(); + + /** Set up the scroll bar, i.e. thumb size and position. Call this + method when the content of the browser window changed, i.e. pages + were inserted or deleted, the layout or the zoom factor has + changed. + @param bScrollToCurrentPosition + When then scroll the window to the new offset that is + defined by the scroll bars. Otherwise the new offset is simply + set and the whole window is repainted. + */ + void UpdateScrollBars ( + bool bScrollToCurrentPosition); + + /** Place the scroll bars inside the given area. When the available + area is not large enough for the content to display the horizontal + and/or vertical scroll bar is enabled. + @param rAvailableArea + The scroll bars will be placed inside this rectangle. It is + expected to be given in pixel relative to its parent. + @param bIsHorizontalScrollBarAllowed + Only when this flag is the horizontal scroll may be + displayed. + @param bIsVerticalScrollBarAllowed + Only when this flag is the horizontal scroll may be + displayed. + @return + Returns the space that remains after the scroll bars are + placed. + */ + ::tools::Rectangle PlaceScrollBars ( + const ::tools::Rectangle& rAvailableArea, + const bool bIsHorizontalScrollBarAllowed, + const bool bIsVerticalScrollBarAllowed); + + /** Update the vertical and horizontal scroll bars so that the visible + area has the given top and left values. + */ + void SetTopLeft (const Point& rNewTopLeft); + + /** Return the width of the vertical scroll bar, which--when + shown--should be fixed in contrast to its height. + @return + Returns 0 when the vertical scroll bar is not shown or does not + exist, otherwise its width in pixel is returned. + */ + int GetVerticalScrollBarWidth() const; + + /** Return the height of the horizontal scroll bar, which--when + shown--should be fixed in contrast to its width. + @return + Returns 0 when the vertical scroll bar is not shown or does not + exist, otherwise its height in pixel is returned. + */ + int GetHorizontalScrollBarHeight() const; + + /** Call this method to scroll a window while the mouse is in dragging a + selection. If the mouse is near the window border or is outside the + window then scroll the window accordingly. + @param rMouseWindowPosition + The mouse position for which the scroll amount is calculated. + @param rAutoScrollFunctor + Every time when the window is scrolled then this functor is executed. + @return + When the window is scrolled then this method returns . + When the window is not changed then is returned. + */ + bool AutoScroll ( + const Point& rMouseWindowPosition, + const ::std::function& rAutoScrollFunctor); + + void StopAutoScroll(); + + void clearAutoScrollFunctor(); + + enum Orientation { Orientation_Horizontal, Orientation_Vertical }; + /** Scroll the slide sorter by setting the thumbs of the scroll bars and + by moving the content of the content window. + @param eOrientation + Defines whether to scroll horizontally or vertically. + @param nDistance + distance in slides. + */ + void Scroll( + const Orientation eOrientation, + const sal_Int32 nDistance); + +private: + SlideSorter& mrSlideSorter; + + /** The horizontal scroll bar. Note that is used but not owned by + objects of this class. It is given to the constructor. + */ + VclPtr mpHorizontalScrollBar; + + /** The vertical scroll bar. Note that is used but not owned by + objects of this class. It is given to the constructor. + */ + VclPtr mpVerticalScrollBar; + + /// Relative horizontal position of the visible area in the view. + double mnHorizontalPosition; + /// Relative vertical position of the visible area in the view. + double mnVerticalPosition; + /** The width and height of the border at the inside of the window which + when entered while in drag mode leads to a scrolling of the window. + */ + Size maScrollBorder; + + /** The auto scroll timer is used for keep scrolling the window when the + mouse reaches its border while dragging a selection. When the mouse + is not moved the timer issues events to keep scrolling. + */ + Timer maAutoScrollTimer; + Size maAutoScrollOffset; + bool mbIsAutoScrollActive; + + /** The content window is the one whose view port is controlled by the + scroll bars. + */ + VclPtr mpContentWindow; + + ::std::function maAutoScrollFunctor; + + void SetWindowOrigin ( + double nHorizontalPosition, + double nVerticalPosition); + + /** Determine the visibility of the scroll bars so that the window + content is not clipped in any dimension without showing a scroll + bar. + @param rAvailableArea + The area in which the scroll bars, the scroll bar filler, and + the SlideSorterView will be placed. + @return + The area that is enclosed by the scroll bars is returned. It + will be filled with the SlideSorterView. + */ + ::tools::Rectangle DetermineScrollBarVisibilities( + const ::tools::Rectangle& rAvailableArea, + const bool bIsHorizontalScrollBarAllowed, + const bool bIsVerticalScrollBarAllowed); + + /** Typically called by DetermineScrollBarVisibilities() this method + tests a specific configuration of the two scroll bars being visible + or hidden. + @return + When the window content can be shown with only being clipped in + an orientation where the scroll bar would be shown then + is returned. + */ + bool TestScrollBarVisibilities ( + bool bHorizontalScrollBarVisible, + bool bVerticalScrollBarVisible, + const ::tools::Rectangle& rAvailableArea); + + void CalcAutoScrollOffset (const Point& rMouseWindowPosition); + bool RepeatAutoScroll(); + + DECL_LINK(HorizontalScrollBarHandler, weld::Scrollbar&, void); + DECL_LINK(VerticalScrollBarHandler, weld::Scrollbar&, void); + DECL_LINK(AutoScrollTimeoutHandler, Timer *, void); + + void PlaceHorizontalScrollBar (const ::tools::Rectangle& aArea); + void PlaceVerticalScrollBar (const ::tools::Rectangle& aArea); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx new file mode 100644 index 0000000000..7d80fbd26c --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd::slidesorter +{ +class SlideSorter; +} + +struct AcceptDropEvent; + +namespace sd::slidesorter::controller +{ +class SlideSorterController; + +class SelectionFunction final : public FuPoor +{ +public: + SelectionFunction(const SelectionFunction&) = delete; + SelectionFunction& operator=(const SelectionFunction&) = delete; + + static rtl::Reference Create(SlideSorter& rSlideSorter, SfxRequest& rRequest); + + // Mouse- & Key-Events + virtual bool KeyInput(const KeyEvent& rKEvt) override; + virtual bool MouseMove(const MouseEvent& rMEvt) override; + virtual bool MouseButtonUp(const MouseEvent& rMEvt) override; + virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; + + /// Forward to the clipboard manager. + virtual void DoCut() override; + + /// Forward to the clipboard manager. + virtual void DoCopy() override; + + /// Forward to the clipboard manager. + virtual void DoPaste() override; + + /** is called when the current function should be aborted.

        + This is used when a function gets a KEY_ESCAPE but can also + be called directly. + + @returns + true if an active function was aborted + */ + virtual bool cancel() override; + + void MouseDragged(const AcceptDropEvent& rEvent, const sal_Int8 nDragAction); + + /** Turn of substitution display and insertion indicator. + */ + void NotifyDragFinished(); + + class EventDescriptor; + class ModeHandler; + friend class ModeHandler; + enum Mode + { + NormalMode, + MultiSelectionMode, + DragAndDropMode + }; + void SwitchToNormalMode(); + void SwitchToDragAndDropMode(const Point& rMousePosition); + void SwitchToMultiSelectionMode(const Point& rMousePosition, const sal_uInt32 nEventCode); + + void ResetShiftKeySelectionAnchor(); + /** Special case handling for when the context menu is hidden. This + method will reinitialize the current mouse position to prevent the + mouse motion during the time the context menu is displayed from + being interpreted as drag-and-drop start. + */ + void ResetMouseAnchor(); + +private: + SlideSorter& mrSlideSorter; + SlideSorterController& mrController; + + SelectionFunction(SlideSorter& rSlideSorter, SfxRequest& rRequest); + + virtual ~SelectionFunction() override; + + /** Remember the slide where the shift key was pressed and started a + multiselection via keyboard. + */ + sal_Int32 mnShiftKeySelectionAnchor; + + /** The selection function can be in one of several mutually + exclusive modes. + */ + std::shared_ptr mpModeHandler; + + /** Make the slide nOffset slides away of the current one the new + current slide. When the new index is outside the range of valid + page numbers it is clipped to that range. + @param nOffset + When nOffset is negative then go back. When nOffset if positive go + forward. When it is zero then ignore the call. + */ + void GotoNextPage(int nOffset); + + /** Make the slide with the given index the new current slide. + @param nIndex + Index of the new current slide. When the new index is outside + the range of valid page numbers it is clipped to that range. + */ + void GotoPage(int nIndex); + + void ProcessMouseEvent(sal_uInt32 nEventType, const MouseEvent& rEvent); + + // What follows are a couple of helper methods that are used by + // ProcessMouseEvent(). + + void ProcessEvent(EventDescriptor& rEvent); + + void MoveFocus(const FocusManager::FocusMoveDirection eDirection, const bool bIsShiftDown, + const bool bIsControlDown); + + void SwitchMode(const std::shared_ptr& rpHandler); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx new file mode 100644 index 0000000000..4f52d49e61 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx @@ -0,0 +1,139 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +class SdPage; + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::controller +{ +class SlideSorterController; +class SelectionObserver; + +/** This class is a part of the controller and handles the selection of + slides. +

        It has methods to modify the selected slides (delete them or + move them to other places in the document), change the visible area so + to make the selected slides visible, tell listeners when the selection + changes.

        +*/ +class SelectionManager +{ +public: + /** Create a new SelectionManager for the given slide sorter. + */ + SelectionManager(SlideSorter& rSlideSorter); + + ~SelectionManager(); + + /** Delete the currently selected slides. When this method returns the + selection is empty. + @param bSelectFollowingPage + When then after deleting the selected pages make the + slide after the last selected page the new current page. + When then make the first slide before the selected + pages the new current slide. + */ + void DeleteSelectedPages(const bool bSelectFollowingPage = true); + + /** Call this method after the selection has changed (possible several + calls to the PageSelector) to invalidate the relevant slots and send + appropriate events. + */ + void SelectionHasChanged(); + + /** Add a listener that is called when the selection of the slide sorter + changes. + @param rListener + When this method is called multiple times for the same listener + the second and all following calls are ignored. Each listener + is added only once. + */ + void AddSelectionChangeListener(const Link& rListener); + + /** Remove a listener that was called when the selection of the slide + sorter changes. + @param rListener + It is safe to pass a listener that was not added are has been + removed previously. Such calls are ignored. + */ + void RemoveSelectionChangeListener(const Link& rListener); + + /** Return the position where to insert pasted slides based on the + current selection. When there is a selection then the insert + position is behind the last slide. When the selection is empty then + most of the time the insert position is at the end of the document. + There is an exception right after the display of a popup-menu. The + position of the associated insertion marker is stored here and reset + the next time the selection changes. + */ + sal_Int32 GetInsertionPosition() const; + + /** Store an insertion position temporarily. It is reset when the + selection changes the next time. + */ + void SetInsertionPosition(const sal_Int32 nInsertionPosition); + + const std::shared_ptr& GetSelectionObserver() const + { + return mpSelectionObserver; + } + +private: + SlideSorter& mrSlideSorter; + SlideSorterController& mrController; + + ::std::vector> maSelectionChangeListeners; + + /** The insertion position is only temporarily valid. Negative values + indicate that the explicit insertion position is not valid. In this + case GetInsertionPosition() calculates it from the current selection. + */ + sal_Int32 mnInsertionPosition; + + std::shared_ptr mpSelectionObserver; + + /** Delete the given list of normal pages. This method is a helper + function for DeleteSelectedPages(). + @param rSelectedNormalPages + A list of normal pages. Supplying master pages is an error. + */ + void DeleteSelectedNormalPages(const ::std::vector& rSelectedNormalPages); + + /** Delete the given list of master pages. This method is a helper + function for DeleteSelectedPages(). + @param rSelectedMasterPages + A list of master pages. Supplying normal pages is an error. + */ + void DeleteSelectedMasterPages(const ::std::vector& rSelectedMasterPages); +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx new file mode 100644 index 0000000000..11742b8901 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd::slidesorter +{ +class SlideSorter; +} + +class SdrPage; +class SdPage; + +namespace sd::slidesorter::controller +{ +/** Observe insertions and deletions of pages between calls to + StartObservation() and EndObservation(). When the later is called + the selection is set to just the newly inserted pages. +*/ +class SelectionObserver final +{ +public: + SelectionObserver(SlideSorter& rSlideSorter); + ~SelectionObserver(); + + void NotifyPageEvent(const SdrPage* pPage); + void StartObservation(); + void AbortObservation(); + void EndObservation(); + + /** Use this little class instead of calling StartObservation and + EndObservation directly so that EndObservation is not forgotten or + omitted due to an exception or some break or return in the middle of + code. + */ + class Context + { + public: + Context(SlideSorter const& rSlideSorter); + ~Context() COVERITY_NOEXCEPT_FALSE; + void Abort(); + + private: + std::shared_ptr mpSelectionObserver; + }; + +private: + SlideSorter& mrSlideSorter; + bool mbIsObservationActive; + bool mbPageEventOccurred; + + ::std::vector maInsertedPages; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx new file mode 100644 index 0000000000..57de8422ac --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include + +class AbstractSvxNameDialog; +class SfxItemSet; +class SfxRequest; + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::controller +{ +/** This manager takes over the work of handling slot calls from the + controller of the slide sorter. +*/ +class SlotManager +{ +public: + /** Create a new slot manager that handles slot calls for the controller + of a slide sorter. + @param rController + The controller for which to handle the slot calls. + */ + SlotManager(SlideSorter& rSlideSorter); + + void FuTemporary(SfxRequest& rRequest); + void FuPermanent(SfxRequest& rRequest); + void FuSupport(SfxRequest& rRequest); + void GetMenuState(SfxItemSet& rSet); + void GetClipboardState(SfxItemSet& rSet); + void GetStatusBarState(SfxItemSet& rSet); + void ExecCtrl(SfxRequest& rRequest); + void GetAttrState(SfxItemSet& rSet); + + /** Exclude or include one slide or all selected slides. + @param rpDescriptor + When the pointer is empty then apply the new state to all + selected pages. Otherwise apply the new state to just the + specified state. + */ + void ChangeSlideExclusionState(const model::SharedPageDescriptor& rpDescriptor, + const bool bExcludeSlide); + + /** Call this after a change from normal mode to master mode or back. + The affected slots are invalidated. + */ + void NotifyEditModeChange(); + +private: + /// The controller for which we manage the slot calls. + SlideSorter& mrSlideSorter; + + /** The implementation is a copy of the code for SID_RENAMEPAGE in + drviews2.cxx. + */ + void RenameSlide(const SfxRequest& rRequest); + DECL_LINK(RenameSlideHdl, AbstractSvxNameDialog&, bool); + DECL_STATIC_LINK(SlotManager, RenameSlideTooltipHdl, AbstractSvxNameDialog&, OUString); + bool RenameSlideFromDrawViewShell(sal_uInt16 nPageId, const OUString& rName); + + /** Handle SID_INSERTPAGE slot calls. + */ + void InsertSlide(SfxRequest& rRequest); + + void DuplicateSelectedSlides(SfxRequest& rRequest); + + /** Use one of several ways to determine where to insert a new page. + This can be the current selection or the insertion indicator. + */ + sal_Int32 GetInsertionPosition() const; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx b/sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx new file mode 100644 index 0000000000..863c2fe73f --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx @@ -0,0 +1,78 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include + +#include + +class SdDrawDocument; +namespace sd::slidesorter { class SlideSorterViewShell; } + +namespace sd::slidesorter::controller { + +/** Represent previews and other information so that they can be + attached to an existing transferable. +*/ +class TransferableData final + : public SdTransferable::UserData, + public SfxListener +{ +public: + class Representative + { + public: + Representative (const BitmapEx& rBitmap, const bool bIsExcluded) + : maBitmap(rBitmap), mbIsExcluded(bIsExcluded) {} + + BitmapEx maBitmap; + bool mbIsExcluded; + }; + + static rtl::Reference CreateTransferable ( + SdDrawDocument* pSrcDoc, + SlideSorterViewShell* pViewShell, + ::std::vector&& rRepresentatives); + + static std::shared_ptr GetFromTransferable (const SdTransferable* pTransferable); + + TransferableData ( + SlideSorterViewShell* pViewShell, + ::std::vector&& rRepresentatives); + virtual ~TransferableData() override; + + const ::std::vector& GetRepresentatives() const { return maRepresentatives;} + + /** Return the view shell for which the transferable was created. + */ + SlideSorterViewShell* GetSourceViewShell() const { return mpViewShell;} + +private: + SlideSorterViewShell* mpViewShell; + const ::std::vector maRepresentatives; + + virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override; +}; + +} // end of namespace ::sd::slidesorter::controller + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx new file mode 100644 index 0000000000..d9f5845af6 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx @@ -0,0 +1,90 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::controller +{ +/** Manage requests for scrolling page objects into view. +*/ +class VisibleAreaManager +{ +public: + explicit VisibleAreaManager(SlideSorter& rSlideSorter); + ~VisibleAreaManager(); + VisibleAreaManager(const VisibleAreaManager&) = delete; + VisibleAreaManager& operator=(const VisibleAreaManager&) = delete; + + void ActivateCurrentSlideTracking(); + void DeactivateCurrentSlideTracking(); + bool IsCurrentSlideTrackingActive() const { return mbIsCurrentSlideTrackingActive; } + + /** Request the current slide to be moved into the visible area. + This request is only obeyed when the current slide tracking is + active. + @see ActivateCurrentSlideTracking() and DeactivateCurrentSlideTracking() + */ + void RequestCurrentSlideVisible(); + + /** Request to make the specified page object visible. + */ + void RequestVisible(const model::SharedPageDescriptor& rpDescriptor, const bool bForce = false); + + /** Temporarily disable the update of the visible area. + */ + class TemporaryDisabler + { + public: + explicit TemporaryDisabler(SlideSorter const& rSlideSorter); + ~TemporaryDisabler(); + + private: + VisibleAreaManager& mrVisibleAreaManager; + }; + +private: + SlideSorter& mrSlideSorter; + + /** List of rectangle that someone wants to be moved into the visible + area. + Cleared on every call to ForgetVisibleRequests() and MakeVisible(). + */ + ::std::vector<::tools::Rectangle> maVisibleRequests; + + Point maRequestedVisibleTopLeft; + bool mbIsCurrentSlideTrackingActive; + int mnDisableCount; + + void MakeVisible(); + ::std::optional GetRequestedTopLeft() const; +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx b/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx new file mode 100644 index 0000000000..90223a1bc8 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx @@ -0,0 +1,227 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +class SdDrawDocument; +class SdrPage; +class SdPage; +namespace sd::slidesorter +{ +class SlideSorter; +} +namespace com::sun::star::container +{ +class XIndexAccess; +} +namespace com::sun::star::drawing +{ +class XDrawPage; +} + +namespace sd::slidesorter::model +{ +inline sal_Int32 FromCoreIndex(const sal_uInt16 nCoreIndex) { return (nCoreIndex - 1) / 2; } + +/** The model of the slide sorter gives access to the slides that are to be + displayed in the slide sorter view. Via the SetDocumentSlides() method + this set of slides can be modified (but do not call it directly, use + SlideSorterController::SetDocumentSlides() instead.) +*/ +class SlideSorterModel final +{ +public: + SlideSorterModel(SlideSorter& rSlideSorter); + + ~SlideSorterModel(); + void Dispose(); + + /** This method is present to let the view create a ShowView for + displaying slides. + */ + SdDrawDocument* GetDocument(); + + /** Set a new edit mode and return whether the edit mode really + has been changed. When the edit mode is changed then the + previous page descriptor list is replaced by a new one which + has to be repainted. + @return + A return value of indicates that the edit mode has + changed and thus the page descriptor list has been set up + to reflect that change. A repaint is necessary. + */ + bool SetEditMode(EditMode eEditMode); + + EditMode GetEditMode() const { return meEditMode; } + + /** Return the number of slides in the document regardless of whether + they are visible or not or whether they are hidden or not. + The number of slides depends on the set of slides available through + the XIndexAccess given to SetDocumentSlides(). + */ + sal_Int32 GetPageCount() const; + + /** Return a page descriptor for the page with the specified index. + Page descriptors are created on demand. The page descriptor is + found (or not found) in constant time. + @param nPageIndex + The index of the requested slide. The valid values + are 0 to GetPageCount()-1. + @param bCreate + When and the requested page descriptor is missing then + it is created. When then an empty reference is + returned for missing descriptors. + @return + When the given index is not valid, i.e. lower than zero or + larger than or equal to the number of pages then an empty + reference is returned. Note that the page count may change + between calls to GetPageCount() and GetPageDescriptor(). + */ + SharedPageDescriptor GetPageDescriptor(const sal_Int32 nPageIndex, + const bool bCreate = true) const; + + /** Return a page descriptor for the given XDrawPage. Page descriptors + are created on demand. The page descriptor is found (or not found) + in (at most) linear time. Note that all page descriptors in front of + the one associated with the given XDrawPage are created when not yet + present. When the XDrawPage is not found then all descriptors are + created. + @return + Returns the index to the requested page descriptor or -1 when + there is no such page descriptor. + */ + sal_Int32 GetIndex(const css::uno::Reference& rxSlide) const; + + /** Return a page descriptor for the given SdrPage. Page descriptors + are created on demand. The page descriptor is found (or not found) + in (at most) linear time. Note that all page descriptors in front of + the one associated with the given XDrawPage are created when not yet + present. When the SdrPage is not found then all descriptors are + created. + @return + Returns the index to the requested page descriptor or -1 when + there is no such page descriptor. + */ + sal_Int32 GetIndex(const SdrPage* pPage) const; + + /** Return an index for accessing an SdrModel that corresponds to the + given SlideSorterModel index. In many cases we just have to apply + the n*2+1 magic. Only when a special model is set, like a custom + slide show, then the returned value is different. + */ + sal_uInt16 GetCoreIndex(const sal_Int32 nIndex) const; + + /** Call this method after the document has changed its structure. This + will get the model in sync with the SdDrawDocument. This method + tries not to throw away too much information already gathered. This + is especially important for previews of complex pages that take some + time to create. + */ + void Resync(); + + /** Delete all descriptors that currently are in the container. The size + of the container, however, is not altered. Use the AdaptSize + method for that. + */ + void ClearDescriptorList(); + + /** Set the selection of the document to exactly that of the called model. + */ + void SynchronizeDocumentSelection(); + + /** Set the selection of the called model to exactly that of the document. + */ + void SynchronizeModelSelection(); + + /** Return the mutex so that the caller can lock it and then safely + access the model. + */ + ::osl::Mutex& GetMutex() { return maMutex; } + + /** Set the XIndexAccess from which the called SlideSorterModel takes + its pages. + @param rxSlides + The set of slides accessible through this XIndexAccess are not + necessarily the same as the ones of the XModel of the + XController (although it typically is a subset). + */ + void SetDocumentSlides(const css::uno::Reference& rxSlides); + + /** Return the set of pages that is currently displayed by the slide sorter. + */ + css::uno::Reference GetDocumentSlides() const; + + /** This method is called when the edit mode has changed. It calls + SetDocumentSlides() with the set of slides or master pages obtained + from the model of the XController. + */ + void UpdatePageList(); + + bool IsReadOnly() const; + + /** The current selection is saved by copying the ST_Selected state into + ST_WasSelected for slides. + */ + void SaveCurrentSelection(); + + /** The current selection is restored from the ST_WasSelected state from + the slides. + @returns + The returned region has to be repainted to reflect the updated + selection states. + */ + vcl::Region RestoreSelection(); + + /** Typically called from controller::Listener this method handles the + insertion and deletion of single pages. + @return + Returns when the given page is relevant for the current + page kind and edit mode. + */ + bool NotifyPageEvent(const SdrPage* pPage); + +private: + mutable ::osl::Mutex maMutex; + SlideSorter& mrSlideSorter; + css::uno::Reference mxSlides; + EditMode meEditMode; + mutable ::std::vector maPageDescriptors; + + /** Resize the descriptor container according to current values of + page kind and edit mode. + */ + void AdaptSize(); + + SdPage* GetPage(const sal_Int32 nCoreIndex) const; + void InsertSlide(SdPage* pPage, bool bMarkSelected); + // return if this page was marked as selected before being removed + bool DeleteSlide(const SdPage* pPage); + void UpdateIndices(const sal_Int32 nFirstIndex); +}; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx b/sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx new file mode 100644 index 0000000000..289f859113 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::slidesorter::model +{ +/** Interface to generic enumerations. Designed to operate on shared + pointers. Therefore GetNextElement() returns T and not T&. +*/ +template class Enumeration +{ +public: + virtual ~Enumeration() {} + + virtual bool HasMoreElements() const = 0; + /** Returns T instead of T& so that it can handle shared pointers. + */ + virtual T GetNextElement() = 0; + virtual void Rewind() = 0; + virtual ::std::unique_ptr> Clone() = 0; +}; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx b/sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx new file mode 100644 index 0000000000..4f3be3b428 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx @@ -0,0 +1,144 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include + +namespace com::sun::star::drawing { class XDrawPage; } + +class SdPage; +class SdrPage; + +namespace sd::slidesorter::model { + +/** Each PageDescriptor object represents the preview of one draw page, + slide, or master page of a Draw or Impress document as they are displayed + in the slide sorter. This class gives access to some associated + information like prerendered preview or position on the screen. + +

        Bounding boxes of page objects come in four varieties: + Model and screen/pixel coordinates and the bounding boxes of the actual + page objects and the larger bounding boxes that include page names and + fade symbol.

        +*/ +class PageDescriptor + : public ::std::enable_shared_from_this +{ +public: + /** Create a PageDescriptor for the given SdPage object. + @param rxPage + The page that is represented by the new PageDescriptor object. + @param pPage + The page pointer can in some situations not be detected from + rxPage, e.g. after undo of page deletion. Therefore supply it + separately. + @param nIndex + This index is displayed in the view as page number. It is not + necessarily the page index (not even when you add or subtract 1 + or use (x-1)/2 magic). + */ + PageDescriptor ( + const css::uno::Reference& rxPage, + SdPage* pPage, + const sal_Int32 nIndex); + + ~PageDescriptor(); + + /** Return the page that is represented by the descriptor as SdPage pointer . + */ + SdPage* GetPage() const { return mpPage;} + + /** Return the page that is represented by the descriptor as XDrawPage reference. + */ + const css::uno::Reference& GetXDrawPage() const { return mxPage;} + + /** Returns the index of the page as it is displayed in the view as page + number. The value may differ from the index returned by the + XDrawPage when there are hidden slides and the XIndexAccess used to + access the model filters them out. + */ + sal_Int32 GetPageIndex() const { return mnIndex;} + void SetPageIndex (const sal_Int32 nIndex); + + bool UpdateMasterPage(); + bool UpdateTransitionFlag(); + + enum State { ST_Visible, ST_Selected, ST_WasSelected, + ST_Focused, ST_MouseOver, ST_Current, ST_Excluded }; + + bool HasState (const State eState) const; + + bool SetState (const State eState, const bool bStateValue); + + /** Set the internal mbIsSelected flag to the selection state of the + page. Use this method to synchronize a page descriptor with the + page it describes and determine whether a redraw to update the + selection indicator is necessary. + @return + When the two selection states were different is + returned. When they were the same this method returns + . + */ + bool GetCoreSelection(); + + /** Set the selection flags of the SdPage objects to the corresponding + selection states of the page descriptors. + */ + void SetCoreSelection(); + + VisualState& GetVisualState() { return maVisualState;} + + ::tools::Rectangle GetBoundingBox() const; + Point GetLocation (const bool bIgnoreLocation) const; + void SetBoundingBox (const ::tools::Rectangle& rBoundingBox); + +private: + SdPage* mpPage; + css::uno::Reference mxPage; + SdrPage const* mpMasterPage; + + /** This index is displayed as page number in the view. It may or may + not be the actual page index. + */ + sal_Int32 mnIndex; + + ::tools::Rectangle maBoundingBox; + VisualState maVisualState; + + bool mbIsSelected : 1; + bool mbWasSelected : 1; + bool mbIsVisible : 1; + bool mbIsFocused : 1; + bool mbIsCurrent : 1; + bool mbIsMouseOver : 1; + bool mbHasTransition : 1; + + PageDescriptor (const PageDescriptor& rDescriptor) = delete; + + PageDescriptor& operator= (const PageDescriptor& rDescriptor) = delete; +}; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx b/sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx new file mode 100644 index 0000000000..6901a9ff16 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include + +namespace sd::slidesorter::model +{ +class SlideSorterModel; + +/** Public class of page enumerations that delegates its calls to an + implementation object that can filter pages by using a given predicate. + + @see PageEnumerationProvider + The PageEnumerationProvider has methods for creating different types + of page enumerations. +*/ +class PageEnumeration final : public Enumeration +{ +public: + /** Create a new page enumeration that enumerates a subset of the pages + of the given model. + @param rModel + The new page enumeration enumerates the pages of this model. + @param rPredicate + This predicate determines which pages to include in the + enumeration. Pages for which rPredicate returns are + exclude. + */ + typedef ::std::function PagePredicate; + static PageEnumeration Create(const SlideSorterModel& rModel, const PagePredicate& rPredicate); + + /** This copy constructor creates a copy of the given enumeration. + */ + PageEnumeration(const PageEnumeration& rEnumeration); + + virtual ~PageEnumeration() override; + + /** Create and return an exact copy of the called object. + */ + virtual ::std::unique_ptr> Clone() override; + + PageEnumeration& operator=(const PageEnumeration& rEnumeration); + + /** Return when the enumeration has more elements, i.e. it is + save to call GetNextElement() at least one more time. + */ + virtual bool HasMoreElements() const override; + + /** Return the next element of the enumeration. Call the + HasMoreElements() before to make sure that there exists at least one + more element. Calling this method with HasMoreElements() returning + is an error. + */ + virtual SharedPageDescriptor GetNextElement() override; + + /** Rewind the enumeration so that the next call to GetNextElement() + will return its first element. + */ + virtual void Rewind() override; + +private: + /// Implementation object. + ::std::unique_ptr> mpImpl; + + /** This constructor expects an implementation object that holds + the predicate that filters the pages. + */ + PageEnumeration(::std::unique_ptr>&& pImpl); +}; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx b/sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx new file mode 100644 index 0000000000..b6de98d139 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::slidesorter::model +{ +class SlideSorterModel; + +/** Collection of methods that create enumeration of slides. +*/ +class PageEnumerationProvider +{ +public: + /** The returned enumeration of slides iterates over all slides of the + given model. + */ + static PageEnumeration CreateAllPagesEnumeration(const SlideSorterModel& rModel); + + /** The returned enumeration of slides iterates over the currently + selected slides of the given model. + */ + static PageEnumeration CreateSelectedPagesEnumeration(const SlideSorterModel& rModel); + + /** The returned enumeration of slides iterates over the slides + (partially) inside the visible area. + */ + static PageEnumeration CreateVisiblePagesEnumeration(const SlideSorterModel& rModel); +}; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx b/sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx new file mode 100644 index 0000000000..6ee1e2b22d --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::slidesorter::model +{ +class PageDescriptor; + +typedef std::shared_ptr SharedPageDescriptor; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx b/sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx new file mode 100644 index 0000000000..89eae16ca5 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd::slidesorter::model +{ +/** This class gives access to values related to the visualization of page + objects. This includes animation state when blending from one state to + another. +*/ +class VisualState +{ +public: + VisualState(const sal_Int32 nPageId); + + const Point& GetLocationOffset() const { return maLocationOffset; } + void SetLocationOffset(const Point& rPoint); + + sal_Int32 mnPageId; // For debugging + +private: + Point maLocationOffset; +}; + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx b/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx new file mode 100644 index 0000000000..0f3493ab36 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx @@ -0,0 +1,225 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace sd::slidesorter::cache { class PageCache; } +namespace sd::slidesorter::model { class SlideSorterModel; } +namespace sd { class Window; } +namespace sd::slidesorter { class SlideSorter; } +namespace sd::slidesorter::view { + +class LayeredDevice; +class PageObjectPainter; +class ToolTip; + +class SlideSorterView final + : public sd::View +{ +public: + + /** Create a new view for the slide sorter. + @param rViewShell + This reference is simply passed to the base class and not used + by this class. + + */ + explicit SlideSorterView (SlideSorter& rSlideSorter); + void Init(); + + virtual ~SlideSorterView() override; + void Dispose(); + + SlideSorterView(const SlideSorterView&) = delete; + SlideSorterView& operator=(const SlideSorterView&) = delete; + + /** Set the general way of layouting the page objects. Note that this + method does not trigger any repaints or layouts. + */ + bool SetOrientation (const Layouter::Orientation eOrientation); + Layouter::Orientation GetOrientation() const { return meOrientation;} + + void RequestRepaint(); + void RequestRepaint (const model::SharedPageDescriptor& rDescriptor); + void RequestRepaint (const ::tools::Rectangle& rRepaintBox); + void RequestRepaint (const vcl::Region& rRepaintRegion); + + ::tools::Rectangle GetModelArea() const; + + /** Return the index of the page that is rendered at the given position. + @param rPosition + The position is expected to be in pixel coordinates. + @return + The returned index is -1 when there is no page object at the + given position. + */ + sal_Int32 GetPageIndexAtPoint (const Point& rPosition) const; + + view::Layouter& GetLayouter(); + + virtual void ModelHasChanged() override; + + /** This method is typically called before a model change takes place. + All references to model data are released. PostModelChange() has to + be called to complete the handling of the model change. When the + calls to Pre- and PostModelChange() are very close to each other you + may call HandleModelChange() instead. + */ + void PreModelChange(); + + /** This method is typically called after a model change took place. + References to model data are re-allocated. Call this method only + after PreModelChange() has been called. + */ + void PostModelChange(); + + /** This method is a convenience function that simply calls + PreModelChange() and then PostModelChange(). + */ + void HandleModelChange(); + + void HandleDrawModeChange(); + + void Resize(); + virtual void CompleteRedraw ( + OutputDevice* pDevice, + const vcl::Region& rPaintArea, + sdr::contact::ViewObjectContactRedirector* pRedirector = nullptr) override; + void Paint (OutputDevice& rDevice, const ::tools::Rectangle& rRepaintArea); + + virtual void ConfigurationChanged ( + utl::ConfigurationBroadcaster* pBroadcaster, + ConfigurationHints nHint) override; + + void HandleDataChangeEvent(); + + void Layout(); + /** This tells the view that it has to re-determine the visibility of + the page objects before painting them the next time. + */ + void InvalidatePageObjectVisibilities(); + + std::shared_ptr const & GetPreviewCache(); + + /** Return the range of currently visible page objects including the + first and last one in that range. + @return + The returned pair of page object indices is empty when the + second index is lower than the first. + */ + Range const & GetVisiblePageRange(); + + /** Add a shape to the page. Typically used from inside + PostModelChange(). + */ + // void AddSdrObject (SdrObject& rObject); + + /** Add a listener that is called when the set of visible slides. + @param rListener + When this method is called multiple times for the same listener + the second and all following calls are ignored. Each listener + is added only once. + */ + void AddVisibilityChangeListener (const Link& rListener); + + /** Remove a listener that is called when the set of visible slides changes. + @param rListener + It is safe to pass a listener that was not added or has been + removed previously. Such calls are ignored. + */ + void RemoveVisibilityChangeListener (const Link& rListener); + + /** The page under the mouse is not highlighted in some contexts. Call + this method on context changes. + */ + void UpdatePageUnderMouse (); + void UpdatePageUnderMouse (const Point& rMousePosition); + void SetPageUnderMouse (const model::SharedPageDescriptor& rpDescriptor); + + bool SetState ( + const model::SharedPageDescriptor& rpDescriptor, + const model::PageDescriptor::State eState, + const bool bStateValue); + + void UpdateOrientation(); + + std::shared_ptr const & GetPageObjectPainter(); + const std::shared_ptr& GetLayeredDevice() const { return mpLayeredDevice;} + + class DrawLock + { + public: + DrawLock (SlideSorter const & rSlideSorter); + ~DrawLock(); + /** When the DrawLock is disposed then it will not request a repaint + on destruction. + */ + void Dispose(); + private: + view::SlideSorterView& mrView; + VclPtr mpWindow; + }; + + ToolTip& GetToolTip() const; + + virtual void DragFinished (sal_Int8 nDropAction) override; + +private: + SlideSorter& mrSlideSorter; + model::SlideSorterModel& mrModel; + bool mbIsDisposed; + ::std::unique_ptr mpLayouter; + bool mbPageObjectVisibilitiesValid; + std::shared_ptr mpPreviewCache; + std::shared_ptr mpLayeredDevice; + Range maVisiblePageRange; + Size maPreviewSize; + bool mbPreciousFlagUpdatePending; + Layouter::Orientation meOrientation; + model::SharedPageDescriptor mpPageUnderMouse; + std::shared_ptr mpPageObjectPainter; + vcl::Region maRedrawRegion; + SharedILayerPainter mpBackgroundPainter; + std::unique_ptr> mpToolTip; + bool mbIsRearrangePending; + ::std::vector> maVisibilityChangeListeners; + + /** Determine the visibility of all page objects. + */ + void DeterminePageObjectVisibilities(); + + void UpdatePreciousFlags(); + void RequestRearrange(); + void Rearrange(); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx b/sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx new file mode 100644 index 0000000000..57b90af0a7 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +class OutputDevice; +namespace tools { class Rectangle; } + +namespace sd::slidesorter::view { + +class ILayerInvalidator +{ +public: + virtual ~ILayerInvalidator() {} + + virtual void Invalidate (const ::tools::Rectangle& rInvalidationBox) = 0; +}; +typedef std::shared_ptr SharedILayerInvalidator; + +class ILayerPainter +{ +public: + virtual ~ILayerPainter() {} + + virtual void SetLayerInvalidator ( + const SharedILayerInvalidator& rpInvalidator) = 0; + virtual void Paint ( + OutputDevice& rDevice, + const ::tools::Rectangle& rRepaintArea) = 0; +}; +typedef std::shared_ptr SharedILayerPainter; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx b/sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx new file mode 100644 index 0000000000..c74d06cb9b --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd::slidesorter::view +{ +class InsertPosition; + +/** Animate the positions of page objects to make room at the insert + position while a move or copy operation takes place. +*/ +class InsertAnimator +{ +public: + explicit InsertAnimator(SlideSorter& rSlideSorter); + InsertAnimator(const InsertAnimator&) = delete; + InsertAnimator& operator=(const InsertAnimator&) = delete; + + /** Set the position at which we have to make room for the display of an + icon. + */ + void SetInsertPosition(const InsertPosition& rInsertPosition); + + /** Restore the normal position of all page objects. + @param eMode + This flag controls whether to start an animation that ends in the + normal positions of all slides (AM_Animated) or to restore the + normal positions immediately (AM_Immediate). + */ + void Reset(const controller::Animator::AnimationMode eMode); + +private: + class Implementation; + std::shared_ptr mpImplementation; +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx b/sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx new file mode 100644 index 0000000000..3f4cc22186 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx @@ -0,0 +1,101 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include +#include +#include + +class OutputDevice; +class SdTransferable; + +namespace sd::slidesorter { class SlideSorter; } + +namespace sd::slidesorter::view { + +class FramePainter; + +/** The insertion indicator is painted as a vertical or horizontal bar + in the space between slides. +*/ +class InsertionIndicatorOverlay final + : public ILayerPainter, + public std::enable_shared_from_this +{ +public: + InsertionIndicatorOverlay (SlideSorter& rSlideSorter); + virtual ~InsertionIndicatorOverlay() override; + + virtual void SetLayerInvalidator (const SharedILayerInvalidator& rpInvalidator) override; + + void Create (const SdTransferable* pTransferable); + + /** Given a position in model coordinates this method calculates the + insertion marker both as an index in the document and as a location + used for drawing the insertion indicator. + */ + void SetLocation (const Point& rPosition); + + Size GetSize() const; + + virtual void Paint ( + OutputDevice& rDevice, + const ::tools::Rectangle& rRepaintArea) override; + + bool IsVisible() const { return mbIsVisible;} + void Hide(); + void Show(); + + ::tools::Rectangle GetBoundingBox() const; + +private: + SlideSorter& mrSlideSorter; + bool mbIsVisible; + SharedILayerInvalidator mpLayerInvalidator; + // Center of the insertion indicator. + Point maLocation; + BitmapEx maIcon; + std::unique_ptr mpShadowPainter; + + Point PaintRepresentatives ( + OutputDevice& rContent, + const Size& rPreviewSize, + const sal_Int32 nOffset, + const ::std::vector& rPages) const; + void PaintPageCount ( + OutputDevice& rDevice, + const sal_Int32 nSelectionCount, + const Size& rPreviewSize, + const Point& rFirstPageOffset) const; + /** Setup the insertion indicator by creating the icon. It consists of + scaled down previews of some of the selected pages. + */ + void Create ( + const ::std::vector& rPages, + const sal_Int32 nSelectionCount); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx new file mode 100644 index 0000000000..b91ae83c54 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx @@ -0,0 +1,237 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include + +namespace sd { class Window; } +namespace sd::slidesorter::model { class SlideSorterModel; } +namespace sd::slidesorter::view { class PageObjectLayouter; } +namespace sd::slidesorter::view { class Theme; } + +namespace sd::slidesorter::view { + +class InsertPosition; + +/** Calculate the size and position of page objects displayed by a slide + sorter. The layouter takes into account various input values: + 1.) Size of the window in which the slide sorter is displayed. + 2.) Desired and minimal and maximal widths of page objects. + 3.) Minimal and maximal number of columns. + 4.) Vertical and horizontal gaps between objects in adjacent columns. + 5.) Borders around every page object. + 6.) Vertical and horizontal borders between enclosing page and outer + page objects. + From these, it calculates various output values: + 1.) The width of page objects. + 2.) The number of columns. + 3.) The size of the enclosing page. + +

        Sizes and lengths are all in pixel except where explicitly stated + otherwise.

        + +

        The GetIndex... methods may return indices that are larger than or + equal to (zero based) the number of pages. This is so because the + number of pages is not known to the class instances. Indices are + calculated with reference to the general grid layout of page + objects.

        +*/ +class Layouter +{ +public: + enum Orientation { HORIZONTAL, VERTICAL, GRID }; + + Layouter ( + sd::Window *rpWindow, + const std::shared_ptr& rpTheme); + ~Layouter(); + + std::shared_ptr const & GetPageObjectLayouter() const; + /** Set the interval of valid column counts. When nMinimalColumnCount + <= nMaximalColumnCount is not fulfilled then the call is ignored. + @param nMinimalColumnCount + The default value is 1. The question whether higher values make + any sense is left to the caller. + @param nMaximalColumnCount + The default value is 5. + */ + void SetColumnCount (sal_Int32 nMinimalColumnCount, + sal_Int32 nMaximalColumnCount); + + /** Central method of this class. It takes the input values and + calculates the output values. Both given sizes must not be 0 in any + dimension or the call is ignored. + @param eOrientation + This defines the generally layout and specifies whether there may + be more than one row or more than one column. + @param rWindowSize + The size of the window in pixels that the slide sorter is + displayed in. This can differ from the size of mpWindow during + detection of whether or not the scroll bars should be visible. + @param rPreviewModelSize + Size of each page in model coordinates. + @param rpWindow + The map mode of this window is adapted to the new layout of the + page objects. + @return + The return value indicates whether the Get... methods can be + used to obtain valid values (). + */ + bool Rearrange ( + const Orientation eOrientation, + const Size& rWindowSize, + const Size& rPreviewModelSize, + const sal_uInt32 nPageCount); + + /** Return the number of columns. + */ + sal_Int32 GetColumnCount() const; + + sal_Int32 GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const; + + Size const & GetPageObjectSize() const; + + /** Return the bounding box in window coordinates of the nIndex-th page + object. + */ + ::tools::Rectangle GetPageObjectBox ( + const sal_Int32 nIndex, + const bool bIncludeBorderAndGap) const; + + /** Return the bounding box in model coordinates of the page that + contains the given amount of page objects. + */ + ::tools::Rectangle GetTotalBoundingBox() const; + + /** Return the index of the first fully or partially visible page + object. This takes into account only the vertical dimension. + @return + The second index may be larger than the number of existing + page objects. + */ + Range GetRangeOfVisiblePageObjects (const ::tools::Rectangle& rVisibleArea) const; + + /** Return the index of the page object that is rendered at the given + point. + @param rPosition + The position is expected to be in model coordinates relative to + the page origin. + @param bIncludePageBorders + When then include the page borders into the calculation, + i.e. when a point lies in the border of a page object but not on + the actual page area the index of that page is returned; + otherwise -1 would be returned to indicate that no page object + has been hit. + @param bClampToValidRange + When then values outside the valid range [0,mnPageCount) + are mapped to 0 (when smaller than 0) or mnPageCount-1 when + equal to or larger than mnPageCount. + When then -1 is returned for values outside the valid range. + @return + The returned index may be larger than the number of existing + page objects. + */ + sal_Int32 GetIndexAtPoint ( + const Point& rModelPosition, + const bool bIncludePageBorders, + const bool bClampToValidRange = true) const; + + /** Return an object that describes the logical and visual properties of + where to do an insert operation when the user would release the + mouse button at the given position after a drag operation and of + where and how to display an insertion indicator. + @param rModelPosition + The position in the model coordinate system for which to + determine the insertion page index. The position does not have + to be over a page object to return a valid value. + @param rIndicatorSize + The size of the insertion indicator. This size is used to adapt + the location when at the left or right of a row or at the top or + bottom of a column. + @param rModel + The model is used to get access to the selection states of the + pages. This in turn is used to determine the visual bounding + boxes. + */ + InsertPosition GetInsertPosition ( + const Point& rModelPosition, + const Size& rIndicatorSize, + model::SlideSorterModel const & rModel) const; + + Range GetValidHorizontalSizeRange() const; + Range GetValidVerticalSizeRange() const; + + class Implementation; + +private: + std::unique_ptr mpImplementation; + VclPtr mpWindow; +}; + +/** Collect all values concerning the logical and visual properties of the + insertion position that is used for drag-and-drop and copy-and-paste. +*/ +class InsertPosition +{ +public: + InsertPosition(); + bool operator== (const InsertPosition& rInsertPosition) const; + bool operator!= (const InsertPosition& rInsertPosition) const; + + void SetLogicalPosition ( + const sal_Int32 nRow, + const sal_Int32 nColumn, + const sal_Int32 nIndex, + const bool bIsAtRunStart, + const bool bIsAtRunEnd, + const bool bIsExtraSpaceNeeded); + void SetGeometricalPosition( + const Point& rLocation, + const Point& rLeadingOffset, + const Point& rTrailingOffset); + + sal_Int32 GetRow() const { return mnRow; } + sal_Int32 GetColumn() const { return mnColumn; } + sal_Int32 GetIndex() const { return mnIndex; } + const Point& GetLocation() const { return maLocation; } + const Point& GetLeadingOffset() const { return maLeadingOffset; } + const Point& GetTrailingOffset() const { return maTrailingOffset; } + bool IsAtRunStart() const { return mbIsAtRunStart; } + bool IsAtRunEnd() const { return mbIsAtRunEnd; } + bool IsExtraSpaceNeeded() const { return mbIsExtraSpaceNeeded; } + +private: + sal_Int32 mnRow; + sal_Int32 mnColumn; + sal_Int32 mnIndex; + bool mbIsAtRunStart : 1; + bool mbIsAtRunEnd : 1; + bool mbIsExtraSpaceNeeded : 1; + Point maLocation; + Point maLeadingOffset; + Point maTrailingOffset; +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx new file mode 100644 index 0000000000..8bb77a988f --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx @@ -0,0 +1,144 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace vcl { class Font; } +namespace sd { class Window; } + +namespace sd::slidesorter::view { + +/** In contrast to the Layouter that places page objects in the view, the + PageObjectLayouter places the parts of individual page objects like page + number area, borders, preview. +*/ +class PageObjectLayouter +{ +public: + /** Create a new PageObjectLayouter object. + @param rPageObjectSize + In general either the width or the height will be 0 in order to + signal that this size component has to be calculated from the other. + This calculation will make the preview as large as possible. + @param nPageCount + The page count is used to determine how wide the page number + area has to be, how many digits to except for the largest page number. + */ + PageObjectLayouter( + const Size& rPageObjectWindowSize, + const Size& rPreviewModelSize, + sd::Window *pWindow, + const sal_Int32 nPageCount); + ~PageObjectLayouter(); + + enum class Part { + // The focus indicator is painted outside the actual page object. + FocusIndicator, + // This is the outer bounding box that includes the preview, page + // number, title. + PageObject, + // Bounding box of the actual preview. + Preview, + // Bounding box of the page number. + PageNumber, + // Indicator whether or not there is a slide transition associated + // with this slide. + TransitionEffectIndicator, + // Indicator whether or not there is a custom animation associated + // with this slide. + CustomAnimationEffectIndicator + }; + /** Two coordinate systems are supported. They differ only in + translation not in scale. Both relate to pixel values in the window. + A position in the model coordinate system does not change when the window content is + scrolled up or down. In the window coordinate system (relative + to the top left point of the window)scrolling leads to different values. + */ + enum CoordinateSystem { + WindowCoordinateSystem, + ModelCoordinateSystem + }; + + /** Return the bounding box of the page object or one of its graphical + parts. + @param rWindow + This device is used to translate between model and window + coordinates. + @param rpPageDescriptor + The page for which to calculate the bounding box. This may be + NULL. When it is NULL then a generic bounding box is calculated + for the location (0,0). + @param ePart + The part of the page object for which to return the bounding + box. + @param eCoordinateSystem + The bounding box can be returned in model and in pixel + (window) coordinates. + @param bIgnoreLocation + Return a position ignoring the slides' location, ie. as if + we were the first slide. + */ + ::tools::Rectangle GetBoundingBox ( + const model::SharedPageDescriptor& rpPageDescriptor, + const Part ePart, + const CoordinateSystem eCoordinateSystem, + bool bIgnoreLocation = false); + + /// the size of the embedded preview: position independent, in window coordinate system + Size GetPreviewSize(); + + /// the maximum size of each tile, also position independent, in window coordinate system + Size GetGridMaxSize(); + + const Image& GetTransitionEffectIcon() const { return maTransitionEffectIcon;} + const Image& GetCustomAnimationEffectIcon() const { return maCustomAnimationEffectIcon;} + +private: + ::tools::Rectangle GetBoundingBox ( + const Point& rPageObjectLocation, + const Part ePart, + const CoordinateSystem eCoordinateSystem); + +private: + VclPtr mpWindow; + ::tools::Rectangle maFocusIndicatorBoundingBox; + ::tools::Rectangle maPageObjectBoundingBox; + ::tools::Rectangle maPageNumberAreaBoundingBox; + ::tools::Rectangle maPreviewBoundingBox; + ::tools::Rectangle maTransitionEffectBoundingBox; + ::tools::Rectangle maCustomAnimationEffectBoundingBox; + const Image maTransitionEffectIcon; + const Image maCustomAnimationEffectIcon; + const std::shared_ptr mpPageNumberFont; + + Size GetPageNumberAreaSize (const int nPageCount); + ::tools::Rectangle CalculatePreviewBoundingBox ( + Size& rPageObjectSize, + const Size& rPreviewModelSize, + const sal_Int32 nPageNumberAreaWidth, + const sal_Int32 nFocusIndicatorWidth); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx new file mode 100644 index 0000000000..747c09500c --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd::slidesorter::cache { class PageCache; } +namespace sd::slidesorter { class SlideSorter; } + +namespace sd::slidesorter::view { + +class Layouter; +class PageObjectLayouter; +class FramePainter; + +class PageObjectPainter +{ +public: + PageObjectPainter (const SlideSorter& rSlideSorter); + ~PageObjectPainter(); + + void PaintPageObject ( + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor); + + /** Called when the theme changes, either because it is replaced with + another or because the system colors have changed. So, even when + the given theme is the same object as the one already in use by this + painter everything that depends on the theme is updated. + */ + void SetTheme (const std::shared_ptr& rpTheme); + + /** Return a preview bitmap for the given page descriptor. When the + page is excluded from the show then the preview is marked + accordingly. + @rpDescriptor + Defines the page for which to return the preview. + @pReferenceDevice + When not then this reference device is used to created a + compatible bitmap. + @return + The returned bitmap may have a different size then the preview area. + */ + BitmapEx GetPreviewBitmap ( + const model::SharedPageDescriptor& rpDescriptor, + const OutputDevice* pReferenceDevice) const; + +private: + const Layouter& mrLayouter; + std::shared_ptr mpCache; + std::shared_ptr mpTheme; + std::shared_ptr mpPageNumberFont; + std::unique_ptr mpShadowPainter; + std::unique_ptr mpFocusBorderPainter; + + void PaintBackground ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const; + void PaintPreview ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const; + void PaintPageNumber ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const; + static void PaintTransitionEffect ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor); + static void PaintCustomAnimationEffect ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor); + void PaintBorder ( + OutputDevice& rDevice, + const Theme::GradientColorType eColorType, + const ::tools::Rectangle& rBox) const; + void PaintBackgroundDetail( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const; + + static BitmapEx CreateMarkedPreview( + const Size& rSize, + const BitmapEx& rPreview, + const BitmapEx& rOverlay, + const OutputDevice* pReferenceDevice); + + /** Update the local pointer to the page object layouter to the + one owned by the general layouter. + Return when after the call we have a valid page object layouter. + */ + bool UpdatePageObjectLayouter(); +}; + +} // end of namespace sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx new file mode 100644 index 0000000000..efb7b2a3eb --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include + +namespace vcl { class Font; } + +namespace sd::slidesorter::controller { class Properties; } + +namespace sd::slidesorter::view { + +const int Theme_FocusIndicatorWidth = 3; + +/** Collection of colors and styles that are used to paint the slide sorter + view. +*/ +class Theme +{ +public: + Theme (const std::shared_ptr& rpProperties); + + /** Call this method to update some colors as response to a change of + a system color change. + */ + void Update ( + const std::shared_ptr& rpProperties); + + // BitmapEx GetInsertIndicatorIcon() const; + + enum FontType { + Font_PageNumber, + Font_PageCount + }; + static std::shared_ptr GetFont ( + const FontType eType, + const OutputDevice& rDevice); + + enum ColorType { + Color_Background, + Color_PageNumberDefault, + Color_PageNumberHover, + Color_PageNumberHighContrast, + Color_PageNumberBrightBackground, + Color_PageNumberDarkBackground, + Color_Selection, + Color_PreviewBorder, + Color_PageCountFontColor, + ColorType_Size_ + }; + Color GetColor (const ColorType eType); + + enum GradientColorType { + Gradient_NormalPage, + Gradient_SelectedPage, + Gradient_SelectedAndFocusedPage, + Gradient_MouseOverPage, + Gradient_MouseOverSelected, + Gradient_MouseOverSelectedAndFocusedPage, + Gradient_FocusedPage, + GradientColorType_Size_ + }; + enum class GradientColorClass { + Border1, + Border2, + Fill1, + Fill2 + }; + Color GetGradientColor ( + const GradientColorType eType, + const GradientColorClass eClass); + void SetGradient ( + const GradientColorType eType, + const Color aBaseColor, + const sal_Int32 nSaturationOverride, + const sal_Int32 nBrightnessOverride, + const sal_Int32 nFillStartOffset, + const sal_Int32 nFillEndOffset, + const sal_Int32 nBorderStartOffset, + const sal_Int32 nBorderEndOffset); + + enum IconType + { + Icon_RawShadow, + Icon_RawInsertShadow, + Icon_HideSlideOverlay, + Icon_FocusBorder, + IconType_Size_ + }; + const BitmapEx& GetIcon (const IconType eType); + +private: + class GradientDescriptor + { + public: + Color maFillColor1; + Color maFillColor2; + Color maBorderColor1; + Color maBorderColor2; + }; + Color maBackgroundColor; + ::std::vector maGradients; + ::std::vector maIcons; + ::std::vector maColor; + + GradientDescriptor& GetGradient (const GradientColorType eType); + /** Guarded initialization of the specified icon in the maIcons + container. + */ + void InitializeIcon(const IconType eType, const OUString& rResourceId); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx b/sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx new file mode 100644 index 0000000000..6c3557e647 --- /dev/null +++ b/sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::view +{ +/** Manage the display of tool tips. The tool tip text changes when the + mouse is moved from slide to slide or from button to button. + After the mouse enters a slide the first display of the tool tip is + delayed for a short time in order to not draw attention from the slide + or its button bar. +*/ +class ToolTip +{ +public: + ToolTip(SlideSorter& rSlideSorter); + ~ToolTip(); + + /** Set a new page. This modifies the default help text. After a page + change a timer is started to delay the display of the tool tip for + the new page. + @param rpPage + When this is empty then the tool tip is hidden. + */ + void SetPage(const model::SharedPageDescriptor& rpPage); + + /** Hide the tool tip. + @return + Returns whether the tool tip was visible at the time this method + was called. + */ + bool Hide(); + +private: + SlideSorter& mrSlideSorter; + model::SharedPageDescriptor mpDescriptor; + OUString msCurrentHelpText; + void* mnHelpWindowHandle; + Timer maShowTimer; + Timer maHiddenTimer; + + void DoShow(); + + DECL_LINK(DelayTrigger, Timer*, void); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/model/SlideSorterModel.cxx b/sd/source/ui/slidesorter/model/SlideSorterModel.cxx new file mode 100644 index 0000000000..15dd9d3936 --- /dev/null +++ b/sd/source/ui/slidesorter/model/SlideSorterModel.cxx @@ -0,0 +1,676 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::slidesorter::model { + +namespace { + bool PrintModel (const SlideSorterModel& rModel) + { + for (sal_Int32 nIndex=0,nCount=rModel.GetPageCount(); nIndexGetPageIndex() << " " + << pDescriptor->GetVisualState().mnPageId << " " + << FromCoreIndex(pDescriptor->GetPage()->GetPageNum()) + << " " << pDescriptor->GetPage()); + } + else + { + SAL_INFO("sd.sls", nIndex); + } + } + + return true; + } + bool CheckModel (const SlideSorterModel& rModel) + { + for (sal_Int32 nIndex=0,nCount=rModel.GetPageCount(); nIndexGetPageIndex()) + { + PrintModel(rModel); + assert(nIndex == pDescriptor->GetPageIndex()); + return false; + } + if (nIndex != pDescriptor->GetVisualState().mnPageId) + { + PrintModel(rModel); + assert(nIndex == pDescriptor->GetVisualState().mnPageId); + return false; + } + } + + return true; + } +} + +namespace { + +void collectUIInformation(const OUString& num, const OUString& rAction) +{ + EventDescription aDescription; + aDescription.aID = "impress_win_or_draw_win"; + aDescription.aParameters = {{"POS", num}}; + aDescription.aAction = rAction; + aDescription.aKeyWord = "ImpressWindowUIObject"; + aDescription.aParent = "MainWindow"; + + UITestLogger::getInstance().logEvent(aDescription); +} + +} + +SlideSorterModel::SlideSorterModel (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + meEditMode(EditMode::Page), + maPageDescriptors(0) +{ +} + +SlideSorterModel::~SlideSorterModel() +{ + ClearDescriptorList (); +} + +void SlideSorterModel::Dispose() +{ + ClearDescriptorList (); +} + +SdDrawDocument* SlideSorterModel::GetDocument() +{ + if (mrSlideSorter.GetViewShellBase() != nullptr) + return mrSlideSorter.GetViewShellBase()->GetDocument(); + else + return nullptr; +} + +bool SlideSorterModel::SetEditMode (EditMode eEditMode) +{ + bool bEditModeChanged = false; + if (meEditMode != eEditMode) + { + meEditMode = eEditMode; + UpdatePageList(); + bEditModeChanged = true; + } + return bEditModeChanged; +} + +sal_Int32 SlideSorterModel::GetPageCount() const +{ + return maPageDescriptors.size(); +} + +SharedPageDescriptor SlideSorterModel::GetPageDescriptor ( + const sal_Int32 nPageIndex, + const bool bCreate) const +{ + ::osl::MutexGuard aGuard (maMutex); + + SharedPageDescriptor pDescriptor; + + if (nPageIndex>=0 && nPageIndex( + Reference(mxSlides->getByIndex(nPageIndex),UNO_QUERY), + pPage, + nPageIndex); + maPageDescriptors[nPageIndex] = pDescriptor; + } + } + + return pDescriptor; +} + +sal_Int32 SlideSorterModel::GetIndex (const Reference& rxSlide) const +{ + ::osl::MutexGuard aGuard (maMutex); + + // First try to guess the right index. + Reference xSet (rxSlide, UNO_QUERY); + if (xSet.is()) + { + try + { + const Any aNumber (xSet->getPropertyValue("Number")); + sal_Int16 nNumber (-1); + aNumber >>= nNumber; + nNumber -= 1; + SharedPageDescriptor pDescriptor (GetPageDescriptor(nNumber, false)); + if (pDescriptor + && pDescriptor->GetXDrawPage() == rxSlide) + { + return nNumber; + } + } + catch (uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + } + + // Guess was wrong, iterate over all slides and search for the right + // one. + const sal_Int32 nCount (maPageDescriptors.size()); + for (sal_Int32 nIndex=0; nIndexGetXDrawPage() == rxSlide) + return nIndex; + } + + return -1; +} + +sal_Int32 SlideSorterModel::GetIndex (const SdrPage* pPage) const +{ + if (pPage == nullptr) + return -1; + + ::osl::MutexGuard aGuard (maMutex); + + // First try to guess the right index. + sal_Int16 nNumber ((pPage->GetPageNum()-1)/2); + SharedPageDescriptor pDescriptor (GetPageDescriptor(nNumber, false)); + if (pDescriptor + && pDescriptor->GetPage() == pPage) + { + return nNumber; + } + + // Guess was wrong, iterate over all slides and search for the right + // one. + const sal_Int32 nCount (maPageDescriptors.size()); + for (sal_Int32 nIndex=0; nIndexGetPage() == pPage) + return nIndex; + } + + return -1; +} + +sal_uInt16 SlideSorterModel::GetCoreIndex (const sal_Int32 nIndex) const +{ + SharedPageDescriptor pDescriptor (GetPageDescriptor(nIndex)); + if (pDescriptor) + return pDescriptor->GetPage()->GetPageNum(); + else + return mxSlides->getCount()*2+1; +} + +/** For now this method uses a trivial algorithm: throw away all descriptors + and create them anew (on demand). The main problem that we are facing + when designing a better algorithm is that we can not compare pointers to + pages stored in the PageDescriptor objects and those obtained from the + document: pages may have been deleted and others may have been created + at the exact same memory locations. +*/ +void SlideSorterModel::Resync() +{ + ::osl::MutexGuard aGuard (maMutex); + + // Check if document and this model really differ. + bool bIsUpToDate (true); + SdDrawDocument* pDocument = GetDocument(); + if (pDocument!=nullptr && maPageDescriptors.size()==pDocument->GetSdPageCount(PageKind::Standard)) + { + for (sal_Int32 nIndex=0,nCount=maPageDescriptors.size(); nIndexGetPage() + != GetPage(nIndex)) + { + SAL_INFO("sd.sls", "page " << nIndex << " differs"); + bIsUpToDate = false; + break; + } + } + } + else + { + bIsUpToDate = false; + } + + if ( ! bIsUpToDate) + { + SynchronizeDocumentSelection(); // Try to make the current selection persistent. + ClearDescriptorList (); + AdaptSize(); + SynchronizeModelSelection(); + mrSlideSorter.GetController().GetPageSelector().CountSelectedPages(); + } + CheckModel(*this); +} + +void SlideSorterModel::ClearDescriptorList() +{ + ::std::vector aDescriptors; + + { + ::osl::MutexGuard aGuard (maMutex); + aDescriptors.swap(maPageDescriptors); + } + + for (auto& rxDescriptor : aDescriptors) + { + if (rxDescriptor != nullptr) + { + if (rxDescriptor.use_count() > 1) + { + SAL_INFO( + "sd.sls", + "trying to delete page descriptor that is still used with" + " count " << rxDescriptor.use_count()); + // No assertion here because that can hang the office when + // opening a dialog from here. + } + rxDescriptor.reset(); + } + } +} + +void SlideSorterModel::SynchronizeDocumentSelection() +{ + ::osl::MutexGuard aGuard (maMutex); + + PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this)); + while (aAllPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + const bool bIsSelected (pDescriptor->HasState(PageDescriptor::ST_Selected)); + pDescriptor->GetPage()->SetSelected(bIsSelected); + } +} + +void SlideSorterModel::SynchronizeModelSelection() +{ + ::osl::MutexGuard aGuard (maMutex); + + PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this)); + while (aAllPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + const bool bIsSelected (pDescriptor->GetPage()->IsSelected()); + pDescriptor->SetState(PageDescriptor::ST_Selected, bIsSelected); + } +} + +void SlideSorterModel::SetDocumentSlides ( + const Reference& rxSlides) +{ + ::osl::MutexGuard aGuard (maMutex); + + // Make the current selection persistent and then release the + // current set of pages. + SynchronizeDocumentSelection(); + mxSlides = nullptr; + ClearDescriptorList (); + + // Reset the current page to cause everybody to release references to it. + mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(-1); + + // Set the new set of pages. + mxSlides = rxSlides; + AdaptSize(); + SynchronizeModelSelection(); + mrSlideSorter.GetController().GetPageSelector().CountSelectedPages(); + + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration(*this)); + if (aSelectedPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + pDescriptor->GetPage()); + } + + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell != nullptr) + { + SdPage* pPage = pViewShell->getCurrentPage(); + if (pPage != nullptr) + mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + pPage); + else + { + // No current page. This can only be when the slide sorter is + // the main view shell. Get current slide form frame view. + const FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView != nullptr) + mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + pFrameView->GetSelectedPage()); + else + { + // No frame view. As a last resort use the first slide as + // current slide. + mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + sal_Int32(0)); + } + } + } + + mrSlideSorter.GetController().GetSlotManager()->NotifyEditModeChange(); +} + +Reference SlideSorterModel::GetDocumentSlides() const +{ + ::osl::MutexGuard aGuard (maMutex); + return mxSlides; +} + +void SlideSorterModel::UpdatePageList() +{ + ::osl::MutexGuard aGuard (maMutex); + + Reference xPages; + + // Get the list of pages according to the edit mode. + Reference xController (mrSlideSorter.GetXController()); + if (xController.is()) + { + switch (meEditMode) + { + case EditMode::MasterPage: + { + Reference xSupplier ( + xController->getModel(), UNO_QUERY); + if (xSupplier.is()) + { + xPages = xSupplier->getMasterPages(); + } + } + break; + + case EditMode::Page: + { + Reference xSupplier ( + xController->getModel(), UNO_QUERY); + if (xSupplier.is()) + { + xPages = xSupplier->getDrawPages(); + } + } + break; + + default: + // We should never get here. + assert(false); + break; + } + } + + mrSlideSorter.GetController().SetDocumentSlides(xPages); +} + +void SlideSorterModel::AdaptSize() +{ + if (mxSlides.is()) + maPageDescriptors.resize(mxSlides->getCount()); + else + maPageDescriptors.resize(0); +} + +bool SlideSorterModel::IsReadOnly() const +{ + if (mrSlideSorter.GetViewShellBase() != nullptr + && mrSlideSorter.GetViewShellBase()->GetDocShell()) + return mrSlideSorter.GetViewShellBase()->GetDocShell()->IsReadOnly(); + else + return true; +} + +void SlideSorterModel::SaveCurrentSelection() +{ + PageEnumeration aPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this)); + while (aPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aPages.GetNextElement()); + pDescriptor->SetState( + PageDescriptor::ST_WasSelected, + pDescriptor->HasState(PageDescriptor::ST_Selected)); + } +} + +vcl::Region SlideSorterModel::RestoreSelection() +{ + vcl::Region aRepaintRegion; + PageEnumeration aPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this)); + while (aPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aPages.GetNextElement()); + if (pDescriptor->SetState( + PageDescriptor::ST_Selected, + pDescriptor->HasState(PageDescriptor::ST_WasSelected))) + { + aRepaintRegion.Union(pDescriptor->GetBoundingBox()); + } + } + return aRepaintRegion; +} + +bool SlideSorterModel::NotifyPageEvent (const SdrPage* pSdrPage) +{ + ::osl::MutexGuard aGuard (maMutex); + + SdPage* pPage = const_cast(dynamic_cast(pSdrPage)); + if (pPage == nullptr) + return false; + + // We are only interested in pages that are currently served by this + // model. + if (pPage->GetPageKind() != PageKind::Standard) + return false; + if (pPage->IsMasterPage() != (meEditMode==EditMode::MasterPage)) + return false; + + //NotifyPageEvent is called for add, remove, *and* change position so for + //the change position case we must ensure we don't end up with the slide + //duplicated in our list + bool bSelected = DeleteSlide(pPage); + if (pPage->IsInserted()) + { + InsertSlide(pPage, bSelected); + } + CheckModel(*this); + + return true; +} + +void SlideSorterModel::InsertSlide(SdPage* pPage, bool bMarkSelected) +{ + // Find the index at which to insert the given page. + sal_uInt16 nCoreIndex (pPage->GetPageNum()); + sal_Int32 nIndex (FromCoreIndex(nCoreIndex)); + if (pPage != GetPage(nIndex)) + return; + + // Check that the pages in the document before and after the given page + // are present in this model. + if (nIndex>0) + if (GetPage(nIndex-1) != GetPageDescriptor(nIndex-1)->GetPage()) + return; + if (nIndex < static_cast(maPageDescriptors.size()) -1) + if (GetPage(nIndex+1) != GetPageDescriptor(nIndex)->GetPage()) + return; + + auto iter = maPageDescriptors.begin() + nIndex; + + // Insert the given page at index nIndex + iter = maPageDescriptors.insert( + iter, + std::make_shared( + Reference(mxSlides->getByIndex(nIndex),UNO_QUERY), + pPage, + nIndex)); + + if (bMarkSelected) + (*iter)->SetState(PageDescriptor::ST_Selected, true); + + // Update page indices. + UpdateIndices(nIndex+1); +} + +bool SlideSorterModel::DeleteSlide (const SdPage* pPage) +{ + sal_Int32 nIndex(0); + + // Caution, GetIndex() may be negative since it uses GetPageNumber()-1 + // for calculation, so do this only when page is inserted, else the + // GetPageNumber() will be zero and thus GetIndex() == -1 + if(pPage->IsInserted()) + { + nIndex = GetIndex(pPage); + } + else + { + // if not inserted, search for page + for(; nIndex < static_cast(maPageDescriptors.size()); nIndex++) + { + if(maPageDescriptors[nIndex]->GetPage() == pPage) + { + break; + } + } + } + + bool bMarkedSelected(false); + + if(nIndex >= 0 && o3tl::make_unsigned(nIndex) < maPageDescriptors.size()) + { + if (maPageDescriptors[nIndex]) + if (maPageDescriptors[nIndex]->GetPage() != pPage) + return false; + + auto iter = maPageDescriptors.begin() + nIndex; + bMarkedSelected = (*iter)->HasState(PageDescriptor::ST_Selected); + maPageDescriptors.erase(iter); + UpdateIndices(nIndex); + + collectUIInformation(OUString::number(nIndex + 1), "Delete_Slide_or_Page"); + } + return bMarkedSelected; +} + +void SlideSorterModel::UpdateIndices (const sal_Int32 nFirstIndex) +{ + for (sal_Int32 nDescriptorIndex=0,nCount=maPageDescriptors.size(); + nDescriptorIndexGetPageIndex()!=nDescriptorIndex) + { + assert(rpDescriptor->GetPageIndex()==nDescriptorIndex); + } + } + else + { + rpDescriptor->SetPageIndex(nDescriptorIndex); + } + } + } +} + +SdPage* SlideSorterModel::GetPage (const sal_Int32 nSdIndex) const +{ + SdDrawDocument* pModel = const_cast(this)->GetDocument(); + if (pModel != nullptr) + { + if (meEditMode == EditMode::Page) + return pModel->GetSdPage (static_cast(nSdIndex), PageKind::Standard); + else + return pModel->GetMasterSdPage (static_cast(nSdIndex), PageKind::Standard); + } + else + return nullptr; +} + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx b/sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx new file mode 100644 index 0000000000..5118cf58ec --- /dev/null +++ b/sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx @@ -0,0 +1,226 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star; + +namespace sd::slidesorter::model { + +PageDescriptor::PageDescriptor ( + const Reference& rxPage, + SdPage* pPage, + const sal_Int32 nIndex) + : mpPage(pPage), + mxPage(rxPage), + mpMasterPage(nullptr), + mnIndex(nIndex), + maVisualState(nIndex), + mbIsSelected(false), + mbWasSelected(false), + mbIsVisible(false), + mbIsFocused(false), + mbIsCurrent(false), + mbIsMouseOver(false), + mbHasTransition(false) +{ + assert(mpPage); + assert(mpPage == SdPage::getImplementation(rxPage)); + if (mpPage != nullptr) + { + if (mpPage->TRG_HasMasterPage()) + mpMasterPage = &mpPage->TRG_GetMasterPage(); + if (mpPage->getTransitionType() > 0) + mbHasTransition = true; + } +} + +PageDescriptor::~PageDescriptor() +{ +} + +void PageDescriptor::SetPageIndex (const sal_Int32 nNewIndex) +{ + mnIndex = nNewIndex; + maVisualState.mnPageId = nNewIndex; +} + +bool PageDescriptor::UpdateMasterPage() +{ + const SdrPage* pMaster = nullptr; + if (mpPage!=nullptr && mpPage->TRG_HasMasterPage()) + pMaster = &mpPage->TRG_GetMasterPage(); + if (mpMasterPage != pMaster) + { + mpMasterPage = pMaster; + return true; + } + else + return false; +} + +bool PageDescriptor::UpdateTransitionFlag() +{ + bool bHasSlideTransition (false); + if (mpPage != nullptr) + bHasSlideTransition = mpPage->getTransitionType() > 0; + if (bHasSlideTransition != mbHasTransition) + { + mbHasTransition = bHasSlideTransition; + return true; + } + else + return false; +} + +bool PageDescriptor::HasState (const State eState) const +{ + switch (eState) + { + case ST_Visible: + return mbIsVisible; + + case ST_Selected: + return mbIsSelected; + + case ST_WasSelected: + return mbWasSelected; + + case ST_Focused: + return mbIsFocused; + + case ST_MouseOver: + return mbIsMouseOver; + + case ST_Current: + return mbIsCurrent; + + case ST_Excluded: + return mpPage!=nullptr && mpPage->IsExcluded(); + + default: + assert(false); + return false; + } +} + +bool PageDescriptor::SetState (const State eState, const bool bNewStateValue) +{ + bool bModified (false); + switch (eState) + { + case ST_Visible: + bModified = (bNewStateValue!=mbIsVisible); + if (bModified) + mbIsVisible = bNewStateValue; + break; + + case ST_Selected: + bModified = (bNewStateValue!=mbIsSelected); + if (bModified) + mbIsSelected = bNewStateValue; + break; + + case ST_WasSelected: + bModified = (bNewStateValue!=mbWasSelected); + if (bModified) + mbWasSelected = bNewStateValue; + break; + + case ST_Focused: + bModified = (bNewStateValue!=mbIsFocused); + if (bModified) + mbIsFocused = bNewStateValue; + break; + + case ST_MouseOver: + bModified = (bNewStateValue!=mbIsMouseOver); + if (bModified) + mbIsMouseOver = bNewStateValue; + break; + + case ST_Current: + bModified = (bNewStateValue!=mbIsCurrent); + if (bModified) + mbIsCurrent = bNewStateValue; + break; + + case ST_Excluded: + // This is a state of the page and has to be handled differently + // from the view-only states. + if (mpPage != nullptr) + if (bNewStateValue != mpPage->IsExcluded()) + { + mpPage->SetExcluded(bNewStateValue); + bModified = true; + } + break; + } + + return bModified; +} + +bool PageDescriptor::GetCoreSelection() +{ + if (mpPage!=nullptr && mpPage->IsSelected() != mbIsSelected) + return SetState(ST_Selected, !mbIsSelected); + else + return false; +} + +void PageDescriptor::SetCoreSelection() +{ + if (mpPage != nullptr) + if (HasState(ST_Selected)) + mpPage->SetSelected(true); + else + mpPage->SetSelected(false); + else + { + assert(mpPage!=nullptr); + } +} + +::tools::Rectangle PageDescriptor::GetBoundingBox() const +{ + ::tools::Rectangle aBox (maBoundingBox); + const Point aOffset (maVisualState.GetLocationOffset()); + aBox.Move(aOffset.X(), aOffset.Y()); + return aBox; +} + +Point PageDescriptor::GetLocation (const bool bIgnoreOffset) const +{ + if (bIgnoreOffset) + return maBoundingBox.TopLeft(); + else + return maBoundingBox.TopLeft() + maVisualState.GetLocationOffset(); +} + +void PageDescriptor::SetBoundingBox (const ::tools::Rectangle& rBoundingBox) +{ + maBoundingBox = rBoundingBox; +} + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx b/sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx new file mode 100644 index 0000000000..a0a3db221d --- /dev/null +++ b/sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx @@ -0,0 +1,202 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include + +#include +#include + +using namespace ::sd::slidesorter; +using namespace ::sd::slidesorter::model; + +namespace { + +class PageEnumerationImpl + : public Enumeration +{ +public: + PageEnumerationImpl ( + const SlideSorterModel& rModel, + PageEnumeration::PagePredicate aPredicate); + PageEnumerationImpl(const PageEnumerationImpl&) = delete; + PageEnumerationImpl& operator=(const PageEnumerationImpl&) = delete; + /** Create a copy of the called enumeration object. + */ + virtual ::std::unique_ptr > Clone() override; + + virtual bool HasMoreElements() const override; + virtual SharedPageDescriptor GetNextElement() override; + virtual void Rewind() override; + +private: + const SlideSorterModel& mrModel; + const PageEnumeration::PagePredicate maPredicate; + int mnIndex; + + /** This constructor sets the internal page index to the given value. + It does not call AdvanceToNextValidElement() to skip elements that + do not fulfill Predicate. + */ + PageEnumerationImpl ( + const SlideSorterModel& rModel, + PageEnumeration::PagePredicate aPredicate, + int nIndex); + + /** Skip all elements that do not fulfill Predicate starting with the + one pointed to by mnIndex. + */ + void AdvanceToNextValidElement(); +}; + +} // end of anonymous namespace + +namespace sd::slidesorter::model { + +PageEnumeration PageEnumeration::Create ( + const SlideSorterModel& rModel, + const PagePredicate& rPredicate) +{ + return PageEnumeration(::std::unique_ptr >( + new PageEnumerationImpl(rModel, rPredicate))); +} + +PageEnumeration::PageEnumeration ( + ::std::unique_ptr > && pImpl) + : mpImpl(std::move(pImpl)) +{ +} + +PageEnumeration::PageEnumeration (const PageEnumeration& rEnumeration ) +: sd::slidesorter::model::Enumeration() +{ + mpImpl = rEnumeration.mpImpl->Clone(); +} + +PageEnumeration::~PageEnumeration() +{ +} + +PageEnumeration& PageEnumeration::operator= ( + const PageEnumeration& rEnumeration) +{ + mpImpl = rEnumeration.mpImpl->Clone(); + return *this; +} + +::std::unique_ptr > PageEnumeration::Clone() +{ + return ::std::unique_ptr >( + new PageEnumeration (*this)); +} + +bool PageEnumeration::HasMoreElements() const +{ + return mpImpl->HasMoreElements(); +} + +SharedPageDescriptor PageEnumeration::GetNextElement() +{ + return mpImpl->GetNextElement(); +} + +void PageEnumeration::Rewind() +{ + return mpImpl->Rewind(); +} + +} // end of namespace ::sd::slidesorter::model + +namespace { + +PageEnumerationImpl::PageEnumerationImpl ( + const SlideSorterModel& rModel, + PageEnumeration::PagePredicate aPredicate) + : mrModel(rModel), + maPredicate(std::move(aPredicate)), + mnIndex(0) +{ + Rewind(); +} + +PageEnumerationImpl::PageEnumerationImpl ( + const SlideSorterModel& rModel, + PageEnumeration::PagePredicate aPredicate, + int nIndex) + : mrModel(rModel), + maPredicate(std::move(aPredicate)), + mnIndex(nIndex) +{ +} + +::std::unique_ptr > + PageEnumerationImpl::Clone() +{ + return ::std::unique_ptr >( + new PageEnumerationImpl(mrModel,maPredicate,mnIndex)); +} + +bool PageEnumerationImpl::HasMoreElements() const +{ + return (mnIndex < mrModel.GetPageCount()); +} + +SharedPageDescriptor PageEnumerationImpl::GetNextElement() +{ + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex)); + + // Go to the following valid element. + mnIndex += 1; + AdvanceToNextValidElement(); + + return pDescriptor; +} + +void PageEnumerationImpl::Rewind() +{ + // Go to first valid element. + mnIndex = 0; + AdvanceToNextValidElement(); +} + +void PageEnumerationImpl::AdvanceToNextValidElement() +{ + while (mnIndex < mrModel.GetPageCount()) + { + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex)); + + // Test for the predicate being fulfilled. + if (pDescriptor && maPredicate(pDescriptor)) + { + // This predicate is valid. + break; + } + else + { + // Advance to next predicate. + mnIndex += 1; + } + } +} + +} // end of anonymous namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx b/sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx new file mode 100644 index 0000000000..800fa12db7 --- /dev/null +++ b/sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +namespace sd::slidesorter::model { + +namespace { + +class AllPagesPredicate +{ +public: + bool operator() (const SharedPageDescriptor&) const + { + return true; + } +}; + +class SelectedPagesPredicate +{ +public: + bool operator() (const SharedPageDescriptor& rpDescriptor) + { + return rpDescriptor->HasState(PageDescriptor::ST_Selected); + } +}; + +class VisiblePagesPredicate +{ +public: + bool operator() (const SharedPageDescriptor& rpDescriptor) + { + return rpDescriptor->HasState(PageDescriptor::ST_Visible); + } +}; + +} + +PageEnumeration PageEnumerationProvider::CreateAllPagesEnumeration ( + const SlideSorterModel& rModel) +{ + return PageEnumeration::Create(rModel, AllPagesPredicate()); +} + +PageEnumeration PageEnumerationProvider::CreateSelectedPagesEnumeration ( + const SlideSorterModel& rModel) +{ + return PageEnumeration::Create( + rModel, + SelectedPagesPredicate()); +} + +PageEnumeration PageEnumerationProvider::CreateVisiblePagesEnumeration ( + const SlideSorterModel& rModel) +{ + return PageEnumeration::Create( + rModel, + VisiblePagesPredicate()); +} + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/model/SlsVisualState.cxx b/sd/source/ui/slidesorter/model/SlsVisualState.cxx new file mode 100644 index 0000000000..3e16823ff8 --- /dev/null +++ b/sd/source/ui/slidesorter/model/SlsVisualState.cxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +namespace sd::slidesorter::model +{ +VisualState::VisualState(const sal_Int32 nPageId) + : mnPageId(nPageId) + , maLocationOffset(0, 0) +{ +} + +void VisualState::SetLocationOffset(const Point& rOffset) +{ + if (maLocationOffset != rOffset) + { + maLocationOffset = rOffset; + } +} + +} // end of namespace ::sd::slidesorter::model + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/shell/SlideSorter.cxx b/sd/source/ui/slidesorter/shell/SlideSorter.cxx new file mode 100644 index 0000000000..3428f19804 --- /dev/null +++ b/sd/source/ui/slidesorter/shell/SlideSorter.cxx @@ -0,0 +1,318 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star; + +namespace sd::slidesorter { + +//===== SlideSorter =========================================================== + +std::shared_ptr SlideSorter::CreateSlideSorter( + ViewShell& rViewShell, + sd::Window* pContentWindow, + ScrollAdaptor* pHorizontalScrollBar, + ScrollAdaptor* pVerticalScrollBar) +{ + std::shared_ptr pSlideSorter( + new SlideSorter( + rViewShell, + pContentWindow, + pHorizontalScrollBar, + pVerticalScrollBar), + o3tl::default_delete()); + pSlideSorter->Init(); + return pSlideSorter; +} + +SlideSorter::SlideSorter ( + ViewShell& rViewShell, + sd::Window* pContentWindow, + ScrollAdaptor* pHorizontalScrollBar, + ScrollAdaptor* pVerticalScrollBar) + : mpViewShell(&rViewShell), + mpViewShellBase(&rViewShell.GetViewShellBase()), + mpContentWindow(pContentWindow), + mpHorizontalScrollBar(pHorizontalScrollBar), + mpVerticalScrollBar(pVerticalScrollBar), + mpProperties(std::make_shared()), + mpTheme(std::make_shared(mpProperties)) +{ +} + +void SlideSorter::Init() +{ + if (mpViewShellBase != nullptr) + mxControllerWeak = mpViewShellBase->GetController(); + + // Reinitialize colors in Properties with window specific values. + if (mpContentWindow) + { + mpProperties->SetBackgroundColor( + mpContentWindow->GetSettings().GetStyleSettings().GetWindowColor()); + mpProperties->SetSelectionColor( + mpContentWindow->GetSettings().GetStyleSettings().GetMenuHighlightColor()); + } + + CreateModelViewController (); + + SetupListeners (); + + // Initialize the window. + sd::Window *pContentWindow = GetContentWindow().get(); + if (!pContentWindow) + return; + + vcl::Window* pParentWindow = pContentWindow->GetParent(); + if (pParentWindow != nullptr) + pParentWindow->SetBackground(Application::GetSettings().GetStyleSettings().GetFaceColor()); + pContentWindow->SetBackground(Wallpaper()); + pContentWindow->SetViewOrigin (Point(0,0)); + // We do our own scrolling while dragging a page selection. + pContentWindow->SetUseDropScroll (false); + // Change the winbits so that the active window accepts the focus. + pContentWindow->SetStyle ((pContentWindow->GetStyle() & ~WB_DIALOGCONTROL) | WB_TABSTOP); + pContentWindow->Hide(); + + // Set view pointer of base class. + SetupControls(); +} + +SlideSorter::~SlideSorter() +{ + ReleaseListeners(); + + // Dispose model, view and controller to avoid calls between them when + // they are being destructed and one or two of them are already gone. + mpSlideSorterController->Dispose(); + mpSlideSorterView->Dispose(); + mpSlideSorterModel->Dispose(); + + // Reset the auto pointers explicitly to control the order of destruction. + mpSlideSorterController.reset(); + mpSlideSorterView.reset(); + mpSlideSorterModel.reset(); + + mpHorizontalScrollBar.reset(); + mpVerticalScrollBar.reset(); +} + +model::SlideSorterModel& SlideSorter::GetModel() const +{ + assert(mpSlideSorterModel); + return *mpSlideSorterModel; +} + +view::SlideSorterView& SlideSorter::GetView() const +{ + assert(mpSlideSorterView); + return *mpSlideSorterView; +} + +controller::SlideSorterController& SlideSorter::GetController() const +{ + assert(mpSlideSorterController); + return *mpSlideSorterController; +} + +Reference SlideSorter::GetXController() const +{ + Reference xController(mxControllerWeak); + return xController; +} + +void SlideSorter::SetupControls() +{ + GetVerticalScrollBar()->Show(); +} + +void SlideSorter::SetupListeners() +{ + sd::Window *pWindow = GetContentWindow().get(); + if (pWindow) + { + vcl::Window* pParentWindow = pWindow->GetParent(); + if (pParentWindow != nullptr) + pParentWindow->AddEventListener( + LINK( + mpSlideSorterController.get(), + controller::SlideSorterController, + WindowEventHandler)); + pWindow->AddEventListener( + LINK( + mpSlideSorterController.get(), + controller::SlideSorterController, + WindowEventHandler)); + } + Application::AddEventListener( + LINK( + mpSlideSorterController.get(), + controller::SlideSorterController, + ApplicationEventHandler)); + + mpSlideSorterController->GetScrollBarManager().Connect(); +} + +void SlideSorter::ReleaseListeners() +{ + mpSlideSorterController->GetScrollBarManager().Disconnect(); + + sd::Window *pWindow (GetContentWindow().get()); + if (pWindow) + { + pWindow->RemoveEventListener( + LINK(mpSlideSorterController.get(), + controller::SlideSorterController, + WindowEventHandler)); + + vcl::Window* pParentWindow = pWindow->GetParent(); + if (pParentWindow != nullptr) + pParentWindow->RemoveEventListener( + LINK(mpSlideSorterController.get(), + controller::SlideSorterController, + WindowEventHandler)); + } + Application::RemoveEventListener( + LINK(mpSlideSorterController.get(), + controller::SlideSorterController, + ApplicationEventHandler)); +} + +void SlideSorter::CreateModelViewController() +{ + mpSlideSorterModel.reset(CreateModel()); + DBG_ASSERT(mpSlideSorterModel != nullptr, "Can not create model for slide browser"); + + mpSlideSorterView.reset(new view::SlideSorterView (*this)); + mpSlideSorterController.reset(new controller::SlideSorterController(*this)); + + // Now that model, view, and controller are constructed, do the + // initialization that relies on all three being in place. + mpSlideSorterController->Init(); + mpSlideSorterView->Init(); +} + +model::SlideSorterModel* SlideSorter::CreateModel() +{ + // Get pointers to the document. + ViewShellBase* pViewShellBase = GetViewShellBase(); + if (pViewShellBase != nullptr) + { + assert (pViewShellBase->GetDocument() != nullptr); + + return new model::SlideSorterModel(*this); + } + else + return nullptr; +} + +void SlideSorter::ArrangeGUIElements ( + const Point& rOffset, + const Size& rSize) +{ + Point aOrigin (rOffset); + + if (rSize.Width()>0 + && rSize.Height()>0 + && GetContentWindow() + && GetContentWindow()->IsVisible()) + { + // Prevent untimely redraws while the view is not yet correctly + // resized. + view::SlideSorterView::DrawLock aLock (*this); + GetContentWindow()->EnablePaint (false); + + mpSlideSorterController->Resize (::tools::Rectangle(aOrigin, rSize)); + + GetContentWindow()->EnablePaint (true); + } +} + +void SlideSorter::RelocateToWindow (vcl::Window* pParentWindow) +{ + // Stop all animations for they have been started for the old window. + mpSlideSorterController->GetAnimator()->RemoveAllAnimations(); + + ReleaseListeners(); + + if (mpViewShell) + { + mpViewShell->ViewShell::RelocateToParentWindow(pParentWindow); + } + + SetupControls(); + SetupListeners(); + + // For accessibility we have to shortly hide the content window. This + // triggers the construction of a new accessibility object for the new + // view shell. (One is created earlier while the constructor of the base + // class is executed. But because at that time the correct + // accessibility object can not be constructed we do that now.) + if (mpContentWindow) + { + mpContentWindow->Hide(); + mpContentWindow->Show(); + } +} + +void SlideSorter::SetCurrentFunction (const rtl::Reference& rpFunction) +{ + if (GetViewShell() != nullptr) + { + GetViewShell()->SetCurrentFunction(rpFunction); + GetViewShell()->SetOldFunction(rpFunction); + } +} + +std::shared_ptr const & SlideSorter::GetProperties() const +{ + assert(mpProperties); + return mpProperties; +} + +std::shared_ptr const & SlideSorter::GetTheme() const +{ + assert(mpTheme); + return mpTheme; +} + +} // end of namespace ::sd::slidesorter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx b/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx new file mode 100644 index 0000000000..6df53600e3 --- /dev/null +++ b/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx @@ -0,0 +1,923 @@ +#/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::sd::slidesorter; +#define ShellClass_SlideSorterViewShell +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; +using ::vcl::EnumContext; +using namespace sfx2::sidebar; + +namespace sd::slidesorter { + +namespace { + +bool inChartOrMathContext(const sd::View* pView) +{ + if (!pView) + return false; + + SfxViewShell* pViewShell = pView->GetSfxViewShell(); + SidebarController* pSidebar = SidebarController::GetSidebarControllerForView(pViewShell); + if (pSidebar) + return pSidebar->hasChartOrMathContextCurrently(); + + return false; +} + +} // anonymous namespace + + +SFX_IMPL_INTERFACE(SlideSorterViewShell, SfxShell) + +void SlideSorterViewShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterChildWindow(::sfx2::sidebar::SidebarChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId()); +} + + +std::shared_ptr SlideSorterViewShell::Create ( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameViewArgument) +{ + std::shared_ptr pViewShell; + try + { + pViewShell.reset( + new SlideSorterViewShell(pFrame,rViewShellBase,pParentWindow,pFrameViewArgument)); + pViewShell->Initialize(); + if (pViewShell->mpSlideSorter == nullptr) + pViewShell.reset(); + } + catch(Exception&) + { + pViewShell.reset(); + } + return pViewShell; +} + +SlideSorterViewShell::SlideSorterViewShell ( + SfxViewFrame* /*pFrame*/, + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameViewArgument) + : ViewShell (pParentWindow, rViewShellBase), + mbIsArrangeGUIElementsPending(true) +{ + GetContentWindow()->set_id("slidesorter"); + meShellType = ST_SLIDE_SORTER; + + if (pFrameViewArgument != nullptr) + mpFrameView = pFrameViewArgument; + else + mpFrameView = new FrameView(GetDoc()); + GetFrameView()->Connect(); + + SetName ("SlideSorterViewShell"); + + pParentWindow->SetStyle(pParentWindow->GetStyle() | WB_DIALOGCONTROL); +} + +SlideSorterViewShell::~SlideSorterViewShell() +{ + DisposeFunctions(); + + try + { + ::sd::Window* pWindow = GetActiveWindow(); + if (pWindow!=nullptr) + { + css::uno::Reference xComponent ( + pWindow->GetAccessible(false), + css::uno::UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + } + } + catch( css::uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SlideSorterViewShell::~SlideSorterViewShell()" ); + } + GetFrameView()->Disconnect(); +} + +void SlideSorterViewShell::Initialize() +{ + mpSlideSorter = SlideSorter::CreateSlideSorter( + *this, + mpContentWindow, + mpHorizontalScrollBar, + mpVerticalScrollBar); + mpView = &mpSlideSorter->GetView(); + + doShow(); + + SetPool( &GetDoc()->GetPool() ); + SetUndoManager( GetDoc()->GetDocSh()->GetUndoManager() ); + + // For accessibility we have to shortly hide the content window. + // This triggers the construction of a new accessibility object for + // the new view shell. (One is created earlier while the constructor + // of the base class is executed. At that time the correct + // accessibility object can not be constructed.) + sd::Window *pWindow (mpSlideSorter->GetContentWindow().get()); + if (pWindow) + { + pWindow->Hide(); + pWindow->Show(); + } +} + +void SlideSorterViewShell::Init (bool bIsMainViewShell) +{ + ViewShell::Init(bIsMainViewShell); + + // since the updatePageList will show focus, the window.show() must be called ahead. This show is deferred from Init() + ::sd::Window* pActiveWindow = GetActiveWindow(); + if (pActiveWindow) + pActiveWindow->Show(); + mpSlideSorter->GetModel().UpdatePageList(); + + if (mpContentWindow) + mpContentWindow->SetViewShell(this); +} + +SlideSorterViewShell* SlideSorterViewShell::GetSlideSorter (ViewShellBase& rBase) +{ + SlideSorterViewShell* pViewShell = nullptr; + + // Test the center and left pane for showing a slide sorter. + OUString aPaneURLs[] = { + FrameworkHelper::msCenterPaneURL, + FrameworkHelper::msFullScreenPaneURL, + FrameworkHelper::msLeftImpressPaneURL, + FrameworkHelper::msLeftDrawPaneURL, + OUString()}; + + try + { + std::shared_ptr pFrameworkHelper (FrameworkHelper::Instance(rBase)); + if (pFrameworkHelper->IsValid()) + for (int i=0; pViewShell==nullptr && !aPaneURLs[i].isEmpty(); ++i) + { + pViewShell = dynamic_cast( + pFrameworkHelper->GetViewShell(aPaneURLs[i]).get()); + } + } + catch (RuntimeException&) + {} + + return pViewShell; +} + +Reference SlideSorterViewShell::CreateSubController() +{ + Reference xSubController; + + if (IsMainViewShell()) + { + // Create uno controller for the main view shell. + xSubController.set( new SdUnoSlideView( *mpSlideSorter)); + } + + return xSubController; +} + +/** If there is a valid controller then create a new instance of + AccessibleSlideSorterView. Otherwise delegate this call + to the base class to return a default object (probably an empty + reference). +*/ +css::uno::Reference + SlideSorterViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow) +{ + // When the view is not set then the initialization is not yet complete + // and we can not yet provide an accessibility object. + if (mpView == nullptr || mpSlideSorter == nullptr) + return nullptr; + + assert(mpSlideSorter); + + rtl::Reference<::accessibility::AccessibleSlideSorterView> pAccessibleView = + new ::accessibility::AccessibleSlideSorterView( + *mpSlideSorter, + pWindow); + + pAccessibleView->Init(); + + return pAccessibleView; +} + +void SlideSorterViewShell::SwitchViewFireFocus(const css::uno::Reference< css::accessibility::XAccessible >& xAcc ) +{ + if (xAcc) + { + ::accessibility::AccessibleSlideSorterView* pBase = static_cast< ::accessibility::AccessibleSlideSorterView* >(xAcc.get()); + if (pBase) + { + pBase->SwitchViewActivated(); + } + } +} + +SlideSorter& SlideSorterViewShell::GetSlideSorter() const +{ + assert(mpSlideSorter); + return *mpSlideSorter; +} + +bool SlideSorterViewShell::RelocateToParentWindow (vcl::Window* pParentWindow) +{ + assert(mpSlideSorter); + if ( ! mpSlideSorter) + return false; + + mpSlideSorter->RelocateToWindow(pParentWindow); + ReadFrameViewData(mpFrameView); + + return true; +} + +SfxUndoManager* SlideSorterViewShell::ImpGetUndoManager() const +{ + SfxShell* pObjectBar = GetViewShellBase().GetViewShellManager()->GetTopShell(); + if (pObjectBar != nullptr) + { + // When it exists then return the undo manager of the currently + // active object bar. The object bar is missing when the + // SlideSorterViewShell is not the main view shell. + return pObjectBar->GetUndoManager(); + } + else + { + // Return the undo manager of this shell when there is no object or + // tool bar. + return const_cast(this)->GetUndoManager(); + } +} + +SdPage* SlideSorterViewShell::getCurrentPage() const +{ + // since SlideSorterViewShell::GetActualPage() currently also + // returns master pages, which is a wrong behaviour for GetActualPage(), + // we can just use that for now + return const_cast(this)->GetActualPage(); +} + +SdPage* SlideSorterViewShell::GetActualPage() +{ + SdPage* pCurrentPage = nullptr; + + // 1. Try to get the current page from the view shell in the center pane + // (if we are that not ourself). + if ( ! IsMainViewShell()) + { + std::shared_ptr pMainViewShell = GetViewShellBase().GetMainViewShell(); + if (pMainViewShell != nullptr) + pCurrentPage = pMainViewShell->GetActualPage(); + } + + if (pCurrentPage == nullptr) + { + model::SharedPageDescriptor pDescriptor ( + mpSlideSorter->GetController().GetCurrentSlideManager()->GetCurrentSlide()); + if (pDescriptor) + pCurrentPage = pDescriptor->GetPage(); + } + + return pCurrentPage; +} + +void SlideSorterViewShell::GetMenuState ( SfxItemSet& rSet) +{ + ViewShell::GetMenuState(rSet); + assert(mpSlideSorter); + mpSlideSorter->GetController().GetSlotManager()->GetMenuState(rSet); +} + +void SlideSorterViewShell::GetClipboardState ( SfxItemSet& rSet) +{ + ViewShell::GetMenuState(rSet); + assert(mpSlideSorter); + mpSlideSorter->GetController().GetSlotManager()->GetClipboardState(rSet); +} + +void SlideSorterViewShell::ExecCtrl (SfxRequest& rRequest) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().ExecCtrl(rRequest); +} + +void SlideSorterViewShell::GetCtrlState (SfxItemSet& rSet) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetCtrlState(rSet); +} + +void SlideSorterViewShell::FuSupport (SfxRequest& rRequest) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().FuSupport(rRequest); +} + +/** We have to handle those slot calls here that need to have access to + private or protected members and methods of this class. +*/ +void SlideSorterViewShell::FuTemporary (SfxRequest& rRequest) +{ + assert(mpSlideSorter); + switch (rRequest.GetSlot()) + { + case SID_MODIFYPAGE: + { + SdPage* pCurrentPage = GetActualPage(); + if (pCurrentPage != nullptr) + mpImpl->ProcessModifyPageSlot ( + rRequest, + pCurrentPage, + PageKind::Standard); + Cancel(); + rRequest.Done (); + } + break; + + default: + mpSlideSorter->GetController().FuTemporary(rRequest); + break; + } +} + +void SlideSorterViewShell::GetStatusBarState (SfxItemSet& rSet) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetStatusBarState(rSet); +} + +void SlideSorterViewShell::FuPermanent (SfxRequest& rRequest) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().FuPermanent(rRequest); +} + +void SlideSorterViewShell::GetAttrState (SfxItemSet& rSet) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetAttrState(rSet); +} + +void SlideSorterViewShell::ExecStatusBar (SfxRequest& ) +{ +} + +void SlideSorterViewShell::Paint ( + const ::tools::Rectangle& rBBox, + ::sd::Window* pWindow) +{ + SetActiveWindow (pWindow); + assert(mpSlideSorter); + if (mpSlideSorter) + mpSlideSorter->GetController().Paint(rBBox,pWindow); +} + +void SlideSorterViewShell::ArrangeGUIElements() +{ + if (IsActive()) + { + assert(mpSlideSorter); + mpSlideSorter->ArrangeGUIElements(maViewPos, maViewSize); + mbIsArrangeGUIElementsPending = false; + } + else + mbIsArrangeGUIElementsPending = true; +} + +void SlideSorterViewShell::Activate (bool bIsMDIActivate) +{ + if(inChartOrMathContext(GetView())) + { + // Avoid context changes for chart/math during activation / deactivation. + const bool bIsContextBroadcasterEnabled (SfxShell::SetContextBroadcasterEnabled(false)); + + ViewShell::Activate(bIsMDIActivate); + + SfxShell::SetContextBroadcasterEnabled(bIsContextBroadcasterEnabled); + return; + } + + ViewShell::Activate(bIsMDIActivate); + if (mbIsArrangeGUIElementsPending) + ArrangeGUIElements(); + + // Determine and broadcast the context that belongs to the main view shell. + EnumContext::Context eContext = EnumContext::Context::Unknown; + std::shared_ptr pMainViewShell (GetViewShellBase().GetMainViewShell()); + ViewShell::ShellType eMainViewShellType ( + pMainViewShell + ? pMainViewShell->GetShellType() + : ViewShell::ST_NONE); + switch (eMainViewShellType) + { + case ViewShell::ST_IMPRESS: + case ViewShell::ST_SLIDE_SORTER: + case ViewShell::ST_NOTES: + case ViewShell::ST_DRAW: + eContext = EnumContext::Context::DrawPage; + if( nullptr != dynamic_cast< const DrawViewShell *>( pMainViewShell.get() )) + { + DrawViewShell* pDrawViewShell = dynamic_cast(pMainViewShell.get()); + if (pDrawViewShell != nullptr) + eContext = EnumContext::GetContextEnum(pDrawViewShell->GetSidebarContextName()); + } + break; + + default: + break; + } + ContextChangeEventMultiplexer::NotifyContextChange( + &GetViewShellBase(), + eContext); +} + +void SlideSorterViewShell::Deactivate (bool /*bIsMDIActivate*/) +{ + // Save Settings - Specifically SlidesPerRow to retrieve it later + WriteFrameViewData(); +} + +void SlideSorterViewShell::Command ( + const CommandEvent& rEvent, + ::sd::Window* pWindow) +{ + assert(mpSlideSorter); + if ( ! mpSlideSorter->GetController().Command (rEvent, pWindow)) + ViewShell::Command (rEvent, pWindow); +} + +void SlideSorterViewShell::ReadFrameViewData (FrameView* pFrameView) +{ + assert(mpSlideSorter); + if (pFrameView != nullptr) + { + view::SlideSorterView& rView (mpSlideSorter->GetView()); + + sal_uInt16 nSlidesPerRow (pFrameView->GetSlidesPerRow()); + if (nSlidesPerRow > 0 + && rView.GetOrientation() == view::Layouter::GRID + && IsMainViewShell()) + { + rView.GetLayouter().SetColumnCount(nSlidesPerRow,nSlidesPerRow); + } + if (IsMainViewShell()) + mpSlideSorter->GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + mpFrameView->GetSelectedPage()); + mpSlideSorter->GetController().Rearrange(true); + + // DrawMode for 'main' window + if (GetActiveWindow()->GetOutDev()->GetDrawMode() != pFrameView->GetDrawMode() ) + GetActiveWindow()->GetOutDev()->SetDrawMode( pFrameView->GetDrawMode() ); + } + + // When this slide sorter is not displayed in the main window then we do + // not share the same frame view and have to find other ways to acquire + // certain values. + if ( ! IsMainViewShell()) + { + std::shared_ptr pMainViewShell = GetViewShellBase().GetMainViewShell(); + if (pMainViewShell != nullptr) + mpSlideSorter->GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + pMainViewShell->getCurrentPage()); + } +} + +void SlideSorterViewShell::WriteFrameViewData() +{ + assert(mpSlideSorter); + if (mpFrameView == nullptr) + return; + + view::SlideSorterView& rView (mpSlideSorter->GetView()); + mpFrameView->SetSlidesPerRow(static_cast(rView.GetLayouter().GetColumnCount())); + + // DrawMode for 'main' window + if( mpFrameView->GetDrawMode() != GetActiveWindow()->GetOutDev()->GetDrawMode() ) + mpFrameView->SetDrawMode( GetActiveWindow()->GetOutDev()->GetDrawMode() ); + + SdPage* pActualPage = GetActualPage(); + if (pActualPage != nullptr) + { + if (IsMainViewShell()) + mpFrameView->SetSelectedPage((pActualPage->GetPageNum()- 1) / 2); + // else + // The slide sorter is not expected to switch the current page + // other than by double clicks. That is handled separately. + } + else + { + // We have no current page to set but at least we can make sure + // that the index of the frame view has a legal value. + if (mpFrameView->GetSelectedPage() >= mpSlideSorter->GetModel().GetPageCount()) + mpFrameView->SetSelectedPage(static_cast(mpSlideSorter->GetModel().GetPageCount())-1); + } +} + +void SlideSorterViewShell::SetZoom (::tools::Long ) +{ + // Ignored. + // The zoom scale is adapted internally to fit a number of columns in + // the window. +} + +void SlideSorterViewShell::SetZoomRect (const ::tools::Rectangle& rZoomRect) +{ + assert(mpSlideSorter); + Size aPageSize (mpSlideSorter->GetView().GetLayouter().GetPageObjectSize()); + + ::tools::Rectangle aRect(rZoomRect); + + if (aRect.GetWidth() < aPageSize.Width()) + { + ::tools::Long nWidthDiff = (aPageSize.Width() - aRect.GetWidth()) / 2; + + aRect.AdjustLeft( -nWidthDiff ); + aRect.AdjustRight(nWidthDiff ); + + if (aRect.Left() < 0) + { + aRect.SetPos(Point(0, aRect.Top())); + } + } + + if (aRect.GetHeight() < aPageSize.Height()) + { + ::tools::Long nHeightDiff = (aPageSize.Height() - aRect.GetHeight()) / 2; + + aRect.AdjustTop( -nHeightDiff ); + aRect.AdjustBottom(nHeightDiff ); + + if (aRect.Top() < 0) + { + aRect.SetPos(Point(aRect.Left(), 0)); + } + } + + ViewShell::SetZoomRect(aRect); + + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); +} + +void SlideSorterViewShell::UpdateScrollBars() +{ + // Do not call the overwritten method of the base class: We do all the + // scroll bar setup by ourselves. + mpSlideSorter->GetController().GetScrollBarManager().UpdateScrollBars(true); +} + +void SlideSorterViewShell::StartDrag ( + const Point& rDragPt, + vcl::Window* pWindow ) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetClipboard().StartDrag ( + rDragPt, + pWindow); +} + +sal_Int8 SlideSorterViewShell::AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + assert(mpSlideSorter); + return mpSlideSorter->GetController().GetClipboard().AcceptDrop ( + rEvt, + rTargetHelper, + pTargetWindow, + nPage, + nLayer); +} + +sal_Int8 SlideSorterViewShell::ExecuteDrop ( + const ExecuteDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + assert(mpSlideSorter); + return mpSlideSorter->GetController().GetClipboard().ExecuteDrop ( + rEvt, + rTargetHelper, + pTargetWindow, + nPage, + nLayer); +} + +std::shared_ptr + SlideSorterViewShell::GetPageSelection() const +{ + assert(mpSlideSorter); + return mpSlideSorter->GetController().GetPageSelector().GetPageSelection(); +} + +void SlideSorterViewShell::SetPageSelection ( + const std::shared_ptr& rSelection) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetPageSelector().SetPageSelection(rSelection, true); +} + +void SlideSorterViewShell::AddSelectionChangeListener ( + const Link& rCallback) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetSelectionManager()->AddSelectionChangeListener(rCallback); +} + +void SlideSorterViewShell::RemoveSelectionChangeListener ( + const Link& rCallback) +{ + assert(mpSlideSorter); + mpSlideSorter->GetController().GetSelectionManager()->RemoveSelectionChangeListener(rCallback); +} + +void SlideSorterViewShell::MainViewEndEditAndUnmarkAll() +{ + std::shared_ptr pMainViewShell = GetViewShellBase().GetMainViewShell(); + DrawViewShell* pDrawViewShell = dynamic_cast(pMainViewShell.get()); + SdrView* pView = pDrawViewShell ? pDrawViewShell->GetDrawView() : nullptr; + if (pView) + { + pView->SdrEndTextEdit(); + pView->UnmarkAll(); + } +} + +std::pair SlideSorterViewShell::SyncPageSelectionToDocument(const std::shared_ptr &rpSelection) +{ + sal_uInt16 firstSelectedPageNo = SAL_MAX_UINT16; + sal_uInt16 lastSelectedPageNo = 0; + + GetDoc()->UnselectAllPages(); + for (auto& rpPage : *rpSelection) + { + // Check page number + sal_uInt16 pageNo = rpPage->GetPageNum(); + if (pageNo > lastSelectedPageNo) + lastSelectedPageNo = pageNo; + if (pageNo < firstSelectedPageNo) + firstSelectedPageNo = pageNo; + GetDoc()->SetSelected(rpPage, true); + } + + return std::make_pair(firstSelectedPageNo, lastSelectedPageNo); +} + +void SlideSorterViewShell::ExecMovePageFirst (SfxRequest& /*rReq*/) +{ + MainViewEndEditAndUnmarkAll(); + + std::shared_ptr xSelection(GetPageSelection()); + + // SdDrawDocument MovePages is based on SdPage IsSelected, so + // transfer the SlideSorter selection to SdPages + SyncPageSelectionToDocument(xSelection); + + // Moves selected pages after page -1 + GetDoc()->MovePages( sal_uInt16(-1) ); + + PostMoveSlidesActions(xSelection); +} + +void SlideSorterViewShell::GetStateMovePageFirst (SfxItemSet& rSet) +{ + if ( ! IsMainViewShell()) + { + std::shared_ptr pMainViewShell = GetViewShellBase().GetMainViewShell(); + DrawViewShell* pDrawViewShell = dynamic_cast(pMainViewShell.get()); + if (pDrawViewShell != nullptr && pDrawViewShell->GetPageKind() == PageKind::Handout) + { + rSet.DisableItem( SID_MOVE_PAGE_FIRST ); + rSet.DisableItem( SID_MOVE_PAGE_UP ); + return; + } + } + + std::shared_ptr xSelection(GetPageSelection()); + + // SdDrawDocument MovePages is based on SdPage IsSelected, so + // transfer the SlideSorter selection to SdPages + sal_uInt16 firstSelectedPageNo = SyncPageSelectionToDocument(xSelection).first; + // Now compute human page number from internal page number + firstSelectedPageNo = (firstSelectedPageNo - 1) / 2; + + if (firstSelectedPageNo == 0) + { + rSet.DisableItem( SID_MOVE_PAGE_FIRST ); + rSet.DisableItem( SID_MOVE_PAGE_UP ); + } +} + +void SlideSorterViewShell::ExecMovePageUp (SfxRequest& /*rReq*/) +{ + MainViewEndEditAndUnmarkAll(); + + std::shared_ptr xSelection(GetPageSelection()); + + // SdDrawDocument MovePages is based on SdPage IsSelected, so + // transfer the SlideSorter selection to SdPages + sal_uInt16 firstSelectedPageNo = SyncPageSelectionToDocument(xSelection).first; + + // In case no slide is selected + if (firstSelectedPageNo == SAL_MAX_UINT16) + return; + + // Now compute human page number from internal page number + firstSelectedPageNo = (firstSelectedPageNo - 1) / 2; + + if (firstSelectedPageNo == 0) + return; + + // Move pages before firstSelectedPageNo - 1 (so after firstSelectedPageNo - 2), + // remembering that -1 means at first, which is good. + GetDoc()->MovePages( firstSelectedPageNo - 2 ); + + PostMoveSlidesActions(xSelection); +} + +void SlideSorterViewShell::GetStateMovePageUp (SfxItemSet& rSet) +{ + GetStateMovePageFirst(rSet); +} + +void SlideSorterViewShell::ExecMovePageDown (SfxRequest& /*rReq*/) +{ + MainViewEndEditAndUnmarkAll(); + + std::shared_ptr xSelection(GetPageSelection()); + + // SdDrawDocument MovePages is based on SdPage IsSelected, so + // transfer the SlideSorter selection to SdPages + sal_uInt16 lastSelectedPageNo = SyncPageSelectionToDocument(xSelection).second; + + // Get page number of the last page + sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard); + + // Now compute human page number from internal page number + lastSelectedPageNo = (lastSelectedPageNo - 1) / 2; + if (lastSelectedPageNo == nNoOfPages - 1) + return; + + // Move to position after lastSelectedPageNo + GetDoc()->MovePages( lastSelectedPageNo + 1 ); + + PostMoveSlidesActions(xSelection); +} + +void SlideSorterViewShell::GetStateMovePageDown (SfxItemSet& rSet) +{ + GetStateMovePageLast( rSet ); +} + +void SlideSorterViewShell::ExecMovePageLast (SfxRequest& /*rReq*/) +{ + MainViewEndEditAndUnmarkAll(); + + std::shared_ptr xSelection(GetPageSelection()); + + // SdDrawDocument MovePages is based on SdPage IsSelected, so + // transfer the SlideSorter selection to SdPages + SyncPageSelectionToDocument(xSelection); + + // Get page number of the last page + sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard); + + // Move to position after last page No (=Number of pages - 1) + GetDoc()->MovePages( nNoOfPages - 1 ); + + PostMoveSlidesActions(xSelection); +} + +void SlideSorterViewShell::GetStateMovePageLast (SfxItemSet& rSet) +{ + std::shared_ptr pMainViewShell = GetViewShellBase().GetMainViewShell(); + DrawViewShell* pDrawViewShell = dynamic_cast(pMainViewShell.get()); + if (pDrawViewShell != nullptr && pDrawViewShell->GetPageKind() == PageKind::Handout) + { + rSet.DisableItem( SID_MOVE_PAGE_LAST ); + rSet.DisableItem( SID_MOVE_PAGE_DOWN ); + return; + } + + std::shared_ptr xSelection(GetPageSelection()); + + // SdDrawDocument MovePages is based on SdPage IsSelected, so + // transfer the SlideSorter selection to SdPages + sal_uInt16 lastSelectedPageNo = SyncPageSelectionToDocument(xSelection).second; + + // Get page number of the last page + sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard); + + // Now compute human page number from internal page number + lastSelectedPageNo = (lastSelectedPageNo - 1) / 2; + if (lastSelectedPageNo == nNoOfPages - 1) + { + rSet.DisableItem( SID_MOVE_PAGE_LAST ); + rSet.DisableItem( SID_MOVE_PAGE_DOWN ); + } +} + +void SlideSorterViewShell::PostMoveSlidesActions(const std::shared_ptr &rpSelection) +{ + sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard); + for (sal_uInt16 nPage = 0; nPage < nNoOfPages; nPage++) + { + SdPage* pPage = GetDoc()->GetSdPage(nPage, PageKind::Standard); + GetDoc()->SetSelected(pPage, false); + } + + mpSlideSorter->GetController().GetPageSelector().DeselectAllPages(); + for (const auto& rpPage : *rpSelection) + { + mpSlideSorter->GetController().GetPageSelector().SelectPage(rpPage); + } + + // Refresh toolbar icons + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_MOVE_PAGE_FIRST); + rBindings.Invalidate(SID_MOVE_PAGE_UP); + rBindings.Invalidate(SID_MOVE_PAGE_DOWN); + rBindings.Invalidate(SID_MOVE_PAGE_LAST); + +} + +} // end of namespace ::sd::slidesorter + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlideSorterView.cxx b/sd/source/ui/slidesorter/view/SlideSorterView.cxx new file mode 100644 index 0000000000..d15b213745 --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlideSorterView.cxx @@ -0,0 +1,856 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include "SlsViewCacheContext.hxx" +#include "SlsLayeredDevice.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +//#define DEBUG_TIMING +#ifdef DEBUG_TIMING +#include +#include +#endif + +using namespace ::sd::slidesorter::model; +using namespace ::drawinglayer::primitive2d; + +namespace sd::slidesorter::view { + +namespace { + /** Wrapper around the SlideSorterView that supports the IPainter + interface and that allows the LayeredDevice to hold the + SlideSorterView (held as unique_ptr by the SlideSorter) as + shared_ptr. + */ + class Painter : public ILayerPainter + { + public: + explicit Painter (SlideSorterView& rView) : mrView(rView) {} + + virtual void Paint (OutputDevice& rDevice, const ::tools::Rectangle& rRepaintArea) override + { + mrView.Paint(rDevice,rRepaintArea); + } + + virtual void SetLayerInvalidator (const SharedILayerInvalidator&) override {} + + private: + SlideSorterView& mrView; + }; +} + +namespace { + +class BackgroundPainter + : public ILayerPainter +{ +public: + explicit BackgroundPainter (const Color& rBackgroundColor) : maBackgroundColor(rBackgroundColor) {} + BackgroundPainter(const BackgroundPainter&) = delete; + BackgroundPainter& operator=(const BackgroundPainter&) = delete; + + virtual void Paint (OutputDevice& rDevice, const ::tools::Rectangle& rRepaintArea) override + { + rDevice.SetFillColor(maBackgroundColor); + rDevice.SetLineColor(); + rDevice.DrawRect(rRepaintArea); + } + + virtual void SetLayerInvalidator (const SharedILayerInvalidator&) override {} + + void SetColor (const Color& rColor) { maBackgroundColor = rColor; } + +private: + Color maBackgroundColor; +}; + +} + +SlideSorterView::SlideSorterView (SlideSorter& rSlideSorter) + : ::sd::View ( + *rSlideSorter.GetModel().GetDocument(), + rSlideSorter.GetContentWindow()->GetOutDev(), + rSlideSorter.GetViewShell()), + mrSlideSorter(rSlideSorter), + mrModel(rSlideSorter.GetModel()), + mbIsDisposed(false), + mpLayouter (new Layouter(rSlideSorter.GetContentWindow(), rSlideSorter.GetTheme())), + mbPageObjectVisibilitiesValid (false), + mpLayeredDevice(std::make_shared(rSlideSorter.GetContentWindow())), + maVisiblePageRange(-1,-1), + maPreviewSize(0,0), + mbPreciousFlagUpdatePending(true), + meOrientation(Layouter::GRID), + mpBackgroundPainter( + std::make_shared(mrSlideSorter.GetTheme()->GetColor(Theme::Color_Background))), + mpToolTip(new ToolTip(mrSlideSorter)), + mbIsRearrangePending(true) +{ + // Hide the page that contains the page objects. + SetPageVisible (false); + + // Register the background painter on level 1 to avoid the creation of a + // background buffer. + mpLayeredDevice->RegisterPainter(mpBackgroundPainter, 1); + + // Wrap a shared_ptr-held-wrapper around this view and register it as + // painter at the layered device. There is no explicit destruction: in + // the SlideSorterView destructor the layered device is destroyed and + // with it the only reference to the wrapper which therefore is also + // destroyed. + SharedILayerPainter pPainter = std::make_shared(*this); + + // The painter is placed on level 1 to avoid buffering. This should be + // a little faster during animations because the previews are painted + // directly into the window, not via the buffer. + mpLayeredDevice->RegisterPainter(pPainter, 1); +} + +SlideSorterView::~SlideSorterView() +{ + if ( ! mbIsDisposed) + { + OSL_ASSERT(mbIsDisposed); + Dispose(); + } +} + +void SlideSorterView::Init() +{ + HandleModelChange(); +} + +void SlideSorterView::Dispose() +{ + mpLayeredDevice->Dispose(); + mpPreviewCache.reset(); + + SetPageUnderMouse(SharedPageDescriptor()); + + // Hide the page to avoid problems in the view when deleting + // visualized objects + HideSdrPage(); + + // Deletion of the objects and the page will be done in SdrModel + // destructor (as long as objects and pages are added) + + OSL_ASSERT(mpLayeredDevice.use_count() == 1); + mpLayeredDevice.reset(); + + mbIsDisposed = true; +} + +sal_Int32 SlideSorterView::GetPageIndexAtPoint (const Point& rWindowPosition) const +{ + sal_Int32 nIndex (-1); + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow) + { + nIndex = mpLayouter->GetIndexAtPoint(pWindow->PixelToLogic(rWindowPosition), false, false); + + // Clip the page index against the page count. + if (nIndex >= mrModel.GetPageCount()) + nIndex = -1; + } + + return nIndex; +} + +Layouter& SlideSorterView::GetLayouter() { return *mpLayouter; } + +void SlideSorterView::ModelHasChanged() +{ + // Ignore this call. Rely on hints sent by the model to get informed of + // model changes. +} + +void SlideSorterView::PreModelChange() +{ + // Reset the slide under the mouse. It will be re-set in PostModelChange(). + SetPageUnderMouse(SharedPageDescriptor()); +} + +void SlideSorterView::PostModelChange() +{ + // In PreModelChange() the page objects have been released. Here we + // create new ones. + ::osl::MutexGuard aGuard (mrModel.GetMutex()); + + model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel); + + // The new page objects have to be scaled and positioned. + RequestRearrange(); + RequestRepaint(); +} + +/** At the moment for every model change all page objects are destroyed and + re-created again. This can be optimized by accepting hints that + describe the type of change so that existing page objects can be + reused. +*/ +void SlideSorterView::HandleModelChange() +{ + PreModelChange (); + PostModelChange(); +} + +void SlideSorterView::HandleDrawModeChange() +{ + // Replace the preview cache with a new and empty one. The + // PreviewRenderer that is used by the cache is replaced by this as + // well. + mpPreviewCache.reset(); + GetPreviewCache()->InvalidateCache(); + + RequestRepaint(); +} + +void SlideSorterView::HandleDataChangeEvent() +{ + GetPageObjectPainter()->SetTheme(mrSlideSorter.GetTheme()); + + // Update the color used by the background painter. + std::shared_ptr pPainter ( + std::dynamic_pointer_cast(mpBackgroundPainter)); + if (pPainter) + pPainter->SetColor(mrSlideSorter.GetTheme()->GetColor(Theme::Color_Background)); + + RequestRepaint(); +} + +void SlideSorterView::Resize() +{ + UpdateOrientation(); + + mpLayeredDevice->Resize(); + RequestRearrange(); +} + +void SlideSorterView::RequestRearrange() +{ + mbIsRearrangePending = true; + Rearrange(); +} + +void SlideSorterView::Rearrange() +{ + if ( ! mbIsRearrangePending) + return; + if (mrModel.GetPageCount() <= 0) + return; + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if ( ! pWindow) + return; + const Size aWindowSize (pWindow->GetSizePixel()); + if (aWindowSize.IsEmpty()) + return; + + const bool bRearrangeSuccess ( + mpLayouter->Rearrange ( + meOrientation, + aWindowSize, + mrModel.GetPageDescriptor(0)->GetPage()->GetSize(), + mrModel.GetPageCount())); + if (bRearrangeSuccess) + { + mbIsRearrangePending = false; + Layout(); + UpdatePageUnderMouse(); + // RequestRepaint(); + } +} + +void SlideSorterView::UpdateOrientation() +{ + // The layout of slides depends on whether the slide sorter is + // displayed in the center or the side pane. + if (mrSlideSorter.GetViewShell()->IsMainViewShell()) + SetOrientation(Layouter::GRID); + else + { + // Get access to the docking window. + vcl::Window* pWindow = mrSlideSorter.GetContentWindow(); + TitledDockingWindow* pDockingWindow = nullptr; + while (pWindow!=nullptr && pDockingWindow==nullptr) + { + pDockingWindow = dynamic_cast(pWindow); + pWindow = pWindow->GetParent(); + } + + if (pDockingWindow != nullptr) + { + const ::tools::Long nScrollBarSize ( + Application::GetSettings().GetStyleSettings().GetScrollBarSize()); + switch (pDockingWindow->GetOrientation()) + { + case TitledDockingWindow::HorizontalOrientation: + if (SetOrientation(Layouter::HORIZONTAL)) + { + const Range aRange (mpLayouter->GetValidVerticalSizeRange()); + pDockingWindow->SetValidSizeRange(Range( + aRange.Min() + nScrollBarSize, + aRange.Max() + nScrollBarSize)); + } + break; + + case TitledDockingWindow::VerticalOrientation: + if (SetOrientation(Layouter::VERTICAL)) + { + const Range aRange (mpLayouter->GetValidHorizontalSizeRange()); + pDockingWindow->SetValidSizeRange(Range( + aRange.Min() + nScrollBarSize, + aRange.Max() + nScrollBarSize)); + } + break; + + case TitledDockingWindow::UnknownOrientation: + if (SetOrientation(Layouter::GRID)) + { + const sal_Int32 nAdditionalSize (10); + pDockingWindow->SetMinOutputSizePixel(Size( + mpLayouter->GetValidHorizontalSizeRange().Min() + + nScrollBarSize + + nAdditionalSize, + mpLayouter->GetValidVerticalSizeRange().Min() + + nScrollBarSize + + nAdditionalSize)); + } + return; + } + } + else + { + // We are not placed in a docking window. One possible reason + // is that the slide sorter is temporarily into a cache and was + // reparented to a non-docking window. + SetOrientation(Layouter::GRID); + } + } +} + +void SlideSorterView::Layout () +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow) + { + // Set the model area, i.e. the smallest rectangle that includes all + // page objects. + const ::tools::Rectangle aViewBox (mpLayouter->GetTotalBoundingBox()); + pWindow->SetViewOrigin (aViewBox.TopLeft()); + pWindow->SetViewSize (aViewBox.GetSize()); + + std::shared_ptr pPageObjectLayouter( + mpLayouter->GetPageObjectLayouter()); + if (pPageObjectLayouter) + { + const Size aNewPreviewSize (mpLayouter->GetPageObjectLayouter()->GetPreviewSize()); + if (maPreviewSize != aNewPreviewSize && GetPreviewCache()) + { + mpPreviewCache->ChangeSize(aNewPreviewSize, Bitmap::HasFastScale()); + maPreviewSize = aNewPreviewSize; + } + } + + // Iterate over all page objects and place them relative to the + // containing page. + model::PageEnumeration aPageEnumeration ( + model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + while (aPageEnumeration.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement()); + pDescriptor->SetBoundingBox(mpLayouter->GetPageObjectBox(pDescriptor->GetPageIndex(), false)); + } + } + + InvalidatePageObjectVisibilities (); +} + +void SlideSorterView::InvalidatePageObjectVisibilities() +{ + mbPageObjectVisibilitiesValid = false; +} + +void SlideSorterView::DeterminePageObjectVisibilities() +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (!pWindow) + return; + + // Set this flag to true here so that an invalidate during the + // visibility calculation can correctly invalidate it again. + mbPageObjectVisibilitiesValid = true; + + ::tools::Rectangle aViewArea (pWindow->PixelToLogic(::tools::Rectangle(Point(0,0),pWindow->GetSizePixel()))); + const Range aRange (mpLayouter->GetRangeOfVisiblePageObjects(aViewArea)); + const Range aUnion( + ::std::min(maVisiblePageRange.Min(), aRange.Min()), + ::std::max(maVisiblePageRange.Max(), aRange.Max())); + + // For page objects that just dropped off the visible area we + // decrease the priority of pending requests for preview bitmaps. + if (maVisiblePageRange != aRange) + mbPreciousFlagUpdatePending |= true; + + model::SharedPageDescriptor pDescriptor; + for (::tools::Long nIndex=aUnion.Min(); nIndex<=aUnion.Max(); nIndex++) + { + pDescriptor = mrModel.GetPageDescriptor(nIndex); + if (pDescriptor) + SetState( + pDescriptor, + PageDescriptor::ST_Visible, + aRange.Contains(nIndex)); + } + + // Broadcast a change of the set of visible page objects. + if (maVisiblePageRange != aRange) + { + maVisiblePageRange = aRange; + + // Tell the listeners that the visibility of some objects has + // changed. + ::std::vector>& aChangeListeners (maVisibilityChangeListeners); + for (const auto& rLink : aChangeListeners) + { + rLink.Call(nullptr); + } + } + + // Restore the mouse over state. + UpdatePageUnderMouse(); +} + +void SlideSorterView::UpdatePreciousFlags() +{ + if (!mbPreciousFlagUpdatePending) + return; + + mbPreciousFlagUpdatePending = false; + + model::SharedPageDescriptor pDescriptor; + std::shared_ptr pCache = GetPreviewCache(); + sal_Int32 nPageCount (mrModel.GetPageCount()); + + for (int nIndex=0; nIndex<=nPageCount; ++nIndex) + { + pDescriptor = mrModel.GetPageDescriptor(nIndex); + if (pDescriptor) + { + pCache->SetPreciousFlag( + pDescriptor->GetPage(), + maVisiblePageRange.Contains(nIndex)); + } + else + { + // At least one cache entry can not be updated. Remember to + // repeat the whole updating later and leave the loop now. + mbPreciousFlagUpdatePending = true; + break; + } + } +} + +bool SlideSorterView::SetOrientation (const Layouter::Orientation eOrientation) +{ + if (meOrientation != eOrientation) + { + meOrientation = eOrientation; + return true; + } + else + return false; +} + +void SlideSorterView::RequestRepaint() +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow) + { + mpLayeredDevice->InvalidateAllLayers( + ::tools::Rectangle( + pWindow->PixelToLogic(Point(0,0)), + pWindow->PixelToLogic(pWindow->GetSizePixel()))); + pWindow->Invalidate(); + } +} + +void SlideSorterView::RequestRepaint (const model::SharedPageDescriptor& rpDescriptor) +{ + if (rpDescriptor) + RequestRepaint(rpDescriptor->GetBoundingBox()); +} + +void SlideSorterView::RequestRepaint (const ::tools::Rectangle& rRepaintBox) +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow) + { + mpLayeredDevice->InvalidateAllLayers(rRepaintBox); + pWindow->Invalidate(rRepaintBox); + } +} + +void SlideSorterView::RequestRepaint (const vcl::Region& rRepaintRegion) +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow) + { + mpLayeredDevice->InvalidateAllLayers(rRepaintRegion); + pWindow->Invalidate(rRepaintRegion); + } +} + +::tools::Rectangle SlideSorterView::GetModelArea() const +{ + return mpLayouter->GetTotalBoundingBox(); +} + +#ifdef DEBUG_TIMING +static ::canvas::tools::ElapsedTime gaTimer; +static const size_t gFrameTimeCount (10); +static size_t gFrameTimeIndex (0); +static ::std::vector gFrameTimes (gFrameTimeCount, 0); +static double gFrameTimeSum (0); +static const ::tools::Rectangle gFrameTimeBox (10,10,150,20); +static double gnLastFrameStart = 0; +#endif + +void SlideSorterView::CompleteRedraw ( + OutputDevice* pDevice, + const vcl::Region& rPaintArea, + sdr::contact::ViewObjectContactRedirector* pRedirector) +{ + (void)pRedirector; + + if (comphelper::LibreOfficeKit::isActive()) + return; + + if (pDevice == nullptr || pDevice!=mrSlideSorter.GetContentWindow()->GetOutDev()) + return; + +#ifdef DEBUG_TIMING + const double nStartTime (gaTimer.getElapsedTime()); + SAL_INFO("sd.timing", "SlideSorterView::CompleteRedraw start" << (mnLockRedrawSmph ? " locked" : "")); +#endif + + // The parent implementation of CompleteRedraw is called only when + // painting is locked. We do all the painting ourself. When painting + // is locked the parent implementation keeps track of the repaint + // requests and later, when painting is unlocked, calls CompleteRedraw + // for all missed repaints. + + if (mnLockRedrawSmph == 0) + { + if (mpLayeredDevice->HandleMapModeChange()) + DeterminePageObjectVisibilities(); + mpLayeredDevice->Repaint(rPaintArea); + } + else + { + maRedrawRegion.Union(rPaintArea); + } + +#ifdef DEBUG_TIMING + const double nEndTime (gaTimer.getElapsedTime()); + SAL_INFO("sd.timing", "SlideSorterView::CompleteRedraw end after " << (nEndTime-nStartTime)*1000 << " ms"); + gFrameTimeSum -= gFrameTimes[gFrameTimeIndex]; + gFrameTimes[gFrameTimeIndex] = nStartTime - gnLastFrameStart; + gnLastFrameStart = nStartTime; + gFrameTimeSum += gFrameTimes[gFrameTimeIndex]; + gFrameTimeIndex = (gFrameTimeIndex+1) % gFrameTimeCount; + + mrSlideSorter.GetContentWindow()->SetFillColor(COL_BLUE); + mrSlideSorter.GetContentWindow()->DrawRect(gFrameTimeBox); + mrSlideSorter.GetContentWindow()->SetTextColor(COL_WHITE); + mrSlideSorter.GetContentWindow()->DrawText( + gFrameTimeBox, + OUString::number(1 / (gFrameTimeSum / gFrameTimeCount)), + DrawTextFlags::Right | DrawTextFlags::VCenter); + // mrSlideSorter.GetContentWindow()->Invalidate(gFrameTimeBox); +#endif +} + +void SlideSorterView::Paint ( + OutputDevice& rDevice, + const ::tools::Rectangle& rRepaintArea) +{ + if (rRepaintArea.IsEmpty()) + return; + + if ( ! mpPageObjectPainter) + if ( ! GetPageObjectPainter()) + return; + + // Update the page visibilities when they have been invalidated. + if ( ! mbPageObjectVisibilitiesValid) + DeterminePageObjectVisibilities(); + + if (mbPreciousFlagUpdatePending) + UpdatePreciousFlags(); + + if (mbIsRearrangePending) + Rearrange(); + + // Paint all page objects that are fully or partially inside the + // repaint region. + const Range aRange (mpLayouter->GetRangeOfVisiblePageObjects(rRepaintArea)); + // Try to prefetch all graphics from the pages to paint. This will be done + // in threads to be more efficient than loading them on-demand one by one. + std::vector graphics; + for (::tools::Long nIndex=aRange.Min(); nIndex<=aRange.Max(); ++nIndex) + { + model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex)); + if (!pDescriptor || ! pDescriptor->HasState(PageDescriptor::ST_Visible)) + continue; + pDescriptor->GetPage()->getGraphicsForPrefetch(graphics); + } + // Handle also one page before and after to have those in advance on scrolling. + for (::tools::Long nIndex : { aRange.Min() - 1, aRange.Max() + 1 }) + { + model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex)); + if (!pDescriptor) + continue; + pDescriptor->GetPage()->getGraphicsForPrefetch(graphics); + } + if(graphics.size() > 1) // threading does not help with loading just one + GraphicFilter::GetGraphicFilter().MakeGraphicsAvailableThreaded(graphics); + + for (::tools::Long nIndex=aRange.Min(); nIndex<=aRange.Max(); ++nIndex) + { + model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex)); + if (!pDescriptor || ! pDescriptor->HasState(PageDescriptor::ST_Visible)) + continue; + + mpPageObjectPainter->PaintPageObject(rDevice, pDescriptor); + } +} + +void SlideSorterView::ConfigurationChanged ( + utl::ConfigurationBroadcaster* pBroadcaster, + ConfigurationHints nHint) +{ + // Some changes of the configuration (some of the colors for example) + // may affect the previews. Throw away the old ones and create new ones. + cache::PageCacheManager::Instance()->InvalidateAllCaches(); + + ::sd::View::ConfigurationChanged(pBroadcaster, nHint); + RequestRepaint(); + +} + +std::shared_ptr const & SlideSorterView::GetPreviewCache() +{ + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow && mpPreviewCache == nullptr) + { + mpPreviewCache = + std::make_shared( + mpLayouter->GetPageObjectSize(), + Bitmap::HasFastScale(), + std::make_shared(mrSlideSorter)); + } + + return mpPreviewCache; +} + +Range const & SlideSorterView::GetVisiblePageRange() +{ + if ( ! mbPageObjectVisibilitiesValid) + DeterminePageObjectVisibilities(); + return maVisiblePageRange; +} + +void SlideSorterView::AddVisibilityChangeListener (const Link& rListener) +{ + if (::std::find ( + maVisibilityChangeListeners.begin(), + maVisibilityChangeListeners.end(), + rListener) == maVisibilityChangeListeners.end()) + { + maVisibilityChangeListeners.push_back(rListener); + } +} + +void SlideSorterView::RemoveVisibilityChangeListener(const Link&rListener) +{ + maVisibilityChangeListeners.erase ( + ::std::find ( + maVisibilityChangeListeners.begin(), + maVisibilityChangeListeners.end(), + rListener)); +} + +ToolTip& SlideSorterView::GetToolTip() const +{ + OSL_ASSERT(mpToolTip); + return *mpToolTip; +} + +void SlideSorterView::DragFinished (sal_Int8 nDropAction) +{ + mrSlideSorter.GetController().GetClipboard().DragFinished(nDropAction); + + View::DragFinished(nDropAction); +} + +void SlideSorterView::UpdatePageUnderMouse () +{ + // Tracking TODO check + VclPtr pVScrollBar (mrSlideSorter.GetVerticalScrollBar()); + VclPtr pHScrollBar (mrSlideSorter.GetHorizontalScrollBar()); + if ((pVScrollBar && pVScrollBar->IsVisible() && pVScrollBar->HasGrab()) + || (pHScrollBar && pHScrollBar->IsVisible() && pHScrollBar->HasGrab())) + { + // One of the scroll bars is tracking mouse movement. Do not + // highlight the slide under the mouse in this case. + SetPageUnderMouse(SharedPageDescriptor()); + return; + } + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (pWindow && pWindow->IsVisible() && ! pWindow->IsMouseCaptured()) + { + const Window::PointerState aPointerState (pWindow->GetPointerState()); + const ::tools::Rectangle aWindowBox (pWindow->GetPosPixel(), pWindow->GetSizePixel()); + if (aWindowBox.Contains(aPointerState.maPos)) + { + UpdatePageUnderMouse(aPointerState.maPos); + return; + } + } + + SetPageUnderMouse(SharedPageDescriptor()); +} + +void SlideSorterView::UpdatePageUnderMouse ( + const Point& rMousePosition) +{ + SetPageUnderMouse(mrSlideSorter.GetController().GetPageAt(rMousePosition)); +} + +void SlideSorterView::SetPageUnderMouse ( + const model::SharedPageDescriptor& rpDescriptor) +{ + if (mpPageUnderMouse == rpDescriptor) + return; + + if (mpPageUnderMouse) + SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, false); + + mpPageUnderMouse = rpDescriptor; + + if (mpPageUnderMouse) + SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, true); + + // Change the quick help text to display the name of the page under + // the mouse. + mpToolTip->SetPage(rpDescriptor); +} + +bool SlideSorterView::SetState ( + const model::SharedPageDescriptor& rpDescriptor, + const PageDescriptor::State eState, + const bool bStateValue) +{ + if ( ! rpDescriptor) + return false; + + const bool bModified (rpDescriptor->SetState(eState, bStateValue)); + if ( ! bModified) + return false; + + // When the page object is not visible (i.e. not on the screen then + // nothing has to be painted. + if (rpDescriptor->HasState(PageDescriptor::ST_Visible)) + { + // For most states a change of that state leads to visible + // difference and we have to request a repaint. + if (eState != PageDescriptor::ST_WasSelected) + RequestRepaint(rpDescriptor); + } + + return bModified; +} + +std::shared_ptr const & SlideSorterView::GetPageObjectPainter() +{ + if ( ! mpPageObjectPainter) + mpPageObjectPainter = std::make_shared(mrSlideSorter); + return mpPageObjectPainter; +} + +//===== SlideSorterView::DrawLock ============================================= + +SlideSorterView::DrawLock::DrawLock (SlideSorter const & rSlideSorter) + : mrView(rSlideSorter.GetView()), + mpWindow(rSlideSorter.GetContentWindow()) +{ + if (mrView.mnLockRedrawSmph == 0) + mrView.maRedrawRegion.SetEmpty(); + ++mrView.mnLockRedrawSmph; +} + +SlideSorterView::DrawLock::~DrawLock() +{ + OSL_ASSERT(mrView.mnLockRedrawSmph>0); + --mrView.mnLockRedrawSmph; + if (mrView.mnLockRedrawSmph == 0) + if (mpWindow) + { + mpWindow->Invalidate(mrView.maRedrawRegion); + } +} + +void SlideSorterView::DrawLock::Dispose() +{ + mpWindow.reset(); +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsFramePainter.cxx b/sd/source/ui/slidesorter/view/SlsFramePainter.cxx new file mode 100644 index 0000000000..31c301868a --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsFramePainter.cxx @@ -0,0 +1,225 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsFramePainter.hxx" +#include +#include + +namespace sd::slidesorter::view { + +FramePainter::FramePainter (const BitmapEx& rShadowBitmap) + : maTopLeft(rShadowBitmap,-1,-1), + maTop(rShadowBitmap,0,-1), + maTopRight(rShadowBitmap,+1,-1), + maLeft(rShadowBitmap,-1,0), + maRight(rShadowBitmap,+1,0), + maBottomLeft(rShadowBitmap,-1,+1), + maBottom(rShadowBitmap,0,+1), + maBottomRight(rShadowBitmap,+1,+1), + maCenter(rShadowBitmap,0,0), + mbIsValid(false) +{ + if (rShadowBitmap.GetSizePixel().Width() == rShadowBitmap.GetSizePixel().Height() + && (rShadowBitmap.GetSizePixel().Width()-1)%2 == 0 + && ((rShadowBitmap.GetSizePixel().Width()-1)/2)%2 == 1) + { + mbIsValid = true; + } + else + { + OSL_ASSERT(rShadowBitmap.GetSizePixel().Width() == rShadowBitmap.GetSizePixel().Height()); + OSL_ASSERT((rShadowBitmap.GetSizePixel().Width()-1)%2 == 0); + OSL_ASSERT(((rShadowBitmap.GetSizePixel().Width()-1)/2)%2 == 1); + } +} + +FramePainter::~FramePainter() +{ +} + +void FramePainter::PaintFrame ( + OutputDevice& rDevice, + const ::tools::Rectangle& rBox) const +{ + if ( ! mbIsValid) + return; + + // Paint the shadow. + maTopLeft.PaintCorner(rDevice, rBox.TopLeft()); + maTopRight.PaintCorner(rDevice, rBox.TopRight()); + maBottomLeft.PaintCorner(rDevice, rBox.BottomLeft()); + maBottomRight.PaintCorner(rDevice, rBox.BottomRight()); + maLeft.PaintSide(rDevice, rBox.TopLeft(), rBox.BottomLeft(), maTopLeft, maBottomLeft); + maRight.PaintSide(rDevice, rBox.TopRight(), rBox.BottomRight(), maTopRight, maBottomRight); + maTop.PaintSide(rDevice, rBox.TopLeft(), rBox.TopRight(), maTopLeft, maTopRight); + maBottom.PaintSide(rDevice, rBox.BottomLeft(), rBox.BottomRight(), maBottomLeft, maBottomRight); + maCenter.PaintCenter(rDevice,rBox); +} + +void FramePainter::AdaptColor ( + const Color aNewColor) +{ + // Get the source color. + if (maCenter.maBitmap.IsEmpty()) + return; + const Color aSourceColor = maCenter.maBitmap.GetPixelColor(0,0); + + // Erase the center bitmap. + maCenter.maBitmap.SetEmpty(); + + // Replace the color in all bitmaps. + maTopLeft.maBitmap.Replace(aSourceColor, aNewColor); + maTop.maBitmap.Replace(aSourceColor, aNewColor); + maTopRight.maBitmap.Replace(aSourceColor, aNewColor); + maLeft.maBitmap.Replace(aSourceColor, aNewColor); + maCenter.maBitmap.Replace(aSourceColor, aNewColor); + maRight.maBitmap.Replace(aSourceColor, aNewColor); + maBottomLeft.maBitmap.Replace(aSourceColor, aNewColor); + maBottom.maBitmap.Replace(aSourceColor, aNewColor); + maBottomRight.maBitmap.Replace(aSourceColor, aNewColor); +} + +//===== FramePainter::OffsetBitmap ============================================ + +FramePainter::OffsetBitmap::OffsetBitmap ( + const BitmapEx& rBitmap, + const sal_Int32 nHorizontalPosition, + const sal_Int32 nVerticalPosition) +{ + OSL_ASSERT(nHorizontalPosition>=-1 && nHorizontalPosition<=+1); + OSL_ASSERT(nVerticalPosition>=-1 && nVerticalPosition<=+1); + + const sal_Int32 nS (1); + const sal_Int32 nC (::std::max(0,(rBitmap.GetSizePixel().Width()-nS)/2)); + const sal_Int32 nO (nC/2); + + const Point aOrigin( + nHorizontalPosition<0 ? 0 : (nHorizontalPosition == 0 ? nC : nC+nS), + nVerticalPosition<0 ? 0 : (nVerticalPosition == 0 ? nC : nC+nS)); + const Size aSize( + nHorizontalPosition==0 ? nS : nC, + nVerticalPosition==0 ? nS : nC); + maBitmap = BitmapEx(rBitmap, aOrigin, aSize); + if (maBitmap.IsEmpty()) + return; + maOffset = Point( + nHorizontalPosition<0 ? -nO : nHorizontalPosition>0 ? -nO : 0, + nVerticalPosition<0 ? -nO : nVerticalPosition>0 ? -nO : 0); + + // Enlarge the side bitmaps so that painting the frame requires less + // paint calls. + const sal_Int32 nSideBitmapSize (64); + if (nHorizontalPosition == 0 && nVerticalPosition == 0) + { + maBitmap.Scale(Size(nSideBitmapSize,nSideBitmapSize)); + } + else if (nHorizontalPosition == 0) + { + maBitmap.Scale(Size(nSideBitmapSize,aSize.Height())); + } + else if (nVerticalPosition == 0) + { + maBitmap.Scale(Size(maBitmap.GetSizePixel().Width(), nSideBitmapSize)); + } +} + +void FramePainter::OffsetBitmap::PaintCorner ( + OutputDevice& rDevice, + const Point& rAnchor) const +{ + if ( ! maBitmap.IsEmpty()) + rDevice.DrawBitmapEx(rAnchor+maOffset, maBitmap); +} + +void FramePainter::OffsetBitmap::PaintSide ( + OutputDevice& rDevice, + const Point& rAnchor1, + const Point& rAnchor2, + const OffsetBitmap& rCornerBitmap1, + const OffsetBitmap& rCornerBitmap2) const +{ + if (maBitmap.IsEmpty()) + return; + + const Size aBitmapSize (maBitmap.GetSizePixel()); + if (rAnchor1.Y() == rAnchor2.Y()) + { + // Side is horizontal. + const sal_Int32 nY (rAnchor1.Y() + maOffset.Y()); + const sal_Int32 nLeft ( + rAnchor1.X() + + rCornerBitmap1.maBitmap.GetSizePixel().Width() + + rCornerBitmap1.maOffset.X()); + const sal_Int32 nRight ( + rAnchor2.X() + + rCornerBitmap2.maOffset.X() + - 1); + for (sal_Int32 nX=nLeft; nX<=nRight; nX+=aBitmapSize.Width()) + { + rDevice.DrawBitmapEx( + Point(nX,nY), + Size(std::min(aBitmapSize.Width(),static_cast<::tools::Long>(nRight-nX+1)),aBitmapSize.Height()), + maBitmap); + } + } + else if (rAnchor1.X() == rAnchor2.X()) + { + // Side is vertical. + const sal_Int32 nX (rAnchor1.X() + maOffset.X()); + const sal_Int32 nTop ( + rAnchor1.Y() + + rCornerBitmap1.maBitmap.GetSizePixel().Height() + + rCornerBitmap1.maOffset.Y()); + const sal_Int32 nBottom ( + rAnchor2.Y() + + rCornerBitmap2.maOffset.Y() + - 1); + for (sal_Int32 nY=nTop; nY<=nBottom; nY+=aBitmapSize.Height()) + { + rDevice.DrawBitmapEx( + Point(nX,nY), + Size(aBitmapSize.Width(), std::min(aBitmapSize.Height(), static_cast<::tools::Long>(nBottom-nY+1))), + maBitmap); + } + } + else + { + // Diagonal sides indicates an error. + OSL_ASSERT(false); + } +} + +void FramePainter::OffsetBitmap::PaintCenter ( + OutputDevice& rDevice, + const ::tools::Rectangle& rBox) const +{ + const Size aBitmapSize (maBitmap.GetSizePixel()); + for (::tools::Long nY=rBox.Top(); nY<=rBox.Bottom(); nY+=aBitmapSize.Height()) + for (::tools::Long nX=rBox.Left(); nX<=rBox.Right(); nX+=aBitmapSize.Width()) + rDevice.DrawBitmapEx( + Point(nX,nY), + Size( + ::std::min(aBitmapSize.Width(), rBox.Right()-nX+1), + std::min(aBitmapSize.Height(), rBox.Bottom()-nY+1)), + maBitmap); +} + +} // end of namespace sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsFramePainter.hxx b/sd/source/ui/slidesorter/view/SlsFramePainter.hxx new file mode 100644 index 0000000000..9398cb94ec --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsFramePainter.hxx @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace sd::slidesorter::view { + +class FramePainter +{ +public: + explicit FramePainter (const BitmapEx& rBitmap); + ~FramePainter(); + + /** Paint a border around the given box by using a set of bitmaps for + the corners and sides. + */ + void PaintFrame (OutputDevice&rDevice, const ::tools::Rectangle& rBox) const; + + /** Special functionality that takes the color from the center + bitmap and replaces that color in all bitmaps by the given new + color. Alpha values are not modified. + The center bitmap is erased. + */ + void AdaptColor (const Color aNewColor); + +private: + /** Bitmap with offset that is used when the bitmap is painted. The bitmap + */ + class OffsetBitmap { + public: + BitmapEx maBitmap; + Point maOffset; + + /** Create one of the eight shadow bitmaps from one that combines + them all. This larger bitmap is expected to have dimension NxN + with N=1+2*M. Of this larger bitmap there are created four + corner bitmaps of size 2*M x 2*M and four side bitmaps of sizes + 1xM (top and bottom) and Mx1 (left and right). The corner + bitmaps have each one quadrant of size MxM that is painted under + the interior of the frame. + @param rBitmap + The larger bitmap of which the eight shadow bitmaps are cut + out from. + @param nHorizontalPosition + Valid values are -1 (left), 0 (center), and +1 (right). + @param nVerticalPosition + Valid values are -1 (top), 0 (center), and +1 (bottom). + */ + OffsetBitmap ( + const BitmapEx& rBitmap, + const sal_Int32 nHorizontalPosition, + const sal_Int32 nVerticalPosition); + + /** Use the given device to paint the bitmap at the location that is + the sum of the given anchor and the internal offset. + */ + void PaintCorner (OutputDevice& rDevice, const Point& rAnchor) const; + + /** Use the given device to paint the bitmap stretched between the + two given locations. Offsets of the adjacent corner bitmaps and + the offset of the side bitmap are used to determine the area + that is to be filled with the side bitmap. + */ + void PaintSide ( + OutputDevice& rDevice, + const Point& rAnchor1, + const Point& rAnchor2, + const OffsetBitmap& rCornerBitmap1, + const OffsetBitmap& rCornerBitmap2) const; + + /** Fill the given rectangle with the bitmap. + */ + void PaintCenter ( + OutputDevice& rDevice, + const ::tools::Rectangle& rBox) const; + }; + OffsetBitmap maTopLeft; + OffsetBitmap maTop; + OffsetBitmap maTopRight; + OffsetBitmap maLeft; + OffsetBitmap maRight; + OffsetBitmap maBottomLeft; + OffsetBitmap maBottom; + OffsetBitmap maBottomRight; + OffsetBitmap maCenter; + bool mbIsValid; +}; + +} // end of namespace sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx b/sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx new file mode 100644 index 0000000000..361c55f05a --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx @@ -0,0 +1,428 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace sd::slidesorter::view { + +namespace { + +class PageObjectRun; + +class AnimatorAccess +{ +public: + virtual void AddRun (const std::shared_ptr& rRun) = 0; + virtual void RemoveRun (const std::shared_ptr& rRun) = 0; + virtual model::SlideSorterModel& GetModel () const = 0; + virtual view::SlideSorterView& GetView () const = 0; + virtual std::shared_ptr GetAnimator () = 0; + virtual VclPtr GetContentWindow () = 0; + +protected: + ~AnimatorAccess() COVERITY_NOEXCEPT_FALSE {} +}; + +/** Controller of the position offsets of all page objects in one row or one + column. +*/ +class PageObjectRun : public std::enable_shared_from_this +{ +public: + PageObjectRun ( + AnimatorAccess& rAnimatorAccess, + const sal_Int32 nRunIndex, + const sal_Int32 nStartIndex, + const sal_Int32 nEndIndex); + + void operator () (const double nTime); + + void UpdateOffsets( + const InsertPosition& rInsertPosition, + const view::Layouter& GetLayouter); + void ResetOffsets (const controller::Animator::AnimationMode eMode); + + /// Index of the row or column that this run represents. + sal_Int32 mnRunIndex; + /// The index at which to make place for the insertion indicator (-1 for + /// no indicator). + sal_Int32 mnLocalInsertIndex; + /// Index of the first page in the run. + sal_Int32 mnStartIndex; + /// Index of the last page in the run. + sal_Int32 mnEndIndex; + /// Offset of each item in the run at the start of the current animation. + ::std::vector maStartOffset; + /// Target offset of each item in the run at the end of the current animation. + ::std::vector maEndOffset; + /// Time at which the current animation started. + double mnStartTime; + + class Comparator + { + public: bool operator() ( + const std::shared_ptr& rpRunA, + const std::shared_ptr& rpRunB) const + { + return rpRunA->mnRunIndex < rpRunB->mnRunIndex; + } + }; +private: + controller::Animator::AnimationId mnAnimationId; + AnimatorAccess& mrAnimatorAccess; + ::std::function maAccelerationFunction; + + void RestartAnimation(); +}; +typedef std::shared_ptr SharedPageObjectRun; + +Point Blend (const Point& rPointA, const Point& rPointB, const double nT) +{ + return Point( + sal_Int32(rPointA.X() * (1-nT) + rPointB.X() * nT), + sal_Int32(rPointA.Y() * (1-nT) + rPointB.Y() * nT)); +} + +} // end of anonymous namespace + +class InsertAnimator::Implementation : public AnimatorAccess +{ +public: + explicit Implementation (SlideSorter& rSlideSorter); + virtual ~Implementation(); + + void SetInsertPosition ( + const InsertPosition& rInsertPosition, + const controller::Animator::AnimationMode eAnimationMode); + + virtual void AddRun (const std::shared_ptr& rRun) override; + virtual void RemoveRun (const std::shared_ptr& rRun) override; + + virtual model::SlideSorterModel& GetModel() const override { return mrModel; } + virtual view::SlideSorterView& GetView() const override { return mrView; } + virtual std::shared_ptr GetAnimator() override { return mpAnimator; } + virtual VclPtr GetContentWindow() override { return mrSlideSorter.GetContentWindow(); } + +private: + model::SlideSorterModel& mrModel; + view::SlideSorterView& mrView; + SlideSorter& mrSlideSorter; + std::shared_ptr mpAnimator; + typedef ::std::set RunContainer; + RunContainer maRuns; + InsertPosition maInsertPosition; + + SharedPageObjectRun GetRun ( + view::Layouter const & rLayouter, + const InsertPosition& rInsertPosition); + RunContainer::const_iterator FindRun (const sal_Int32 nRunIndex) const; +}; + +//===== InsertAnimator ======================================================== + +InsertAnimator::InsertAnimator (SlideSorter& rSlideSorter) + : mpImplementation(std::make_shared(rSlideSorter)) +{ +} + +void InsertAnimator::SetInsertPosition (const InsertPosition& rInsertPosition) +{ + mpImplementation->SetInsertPosition(rInsertPosition, controller::Animator::AM_Animated); +} + +void InsertAnimator::Reset (const controller::Animator::AnimationMode eMode) +{ + mpImplementation->SetInsertPosition(InsertPosition(), eMode); +} + +//===== InsertAnimator::Implementation ======================================== + +InsertAnimator::Implementation::Implementation (SlideSorter& rSlideSorter) + : mrModel(rSlideSorter.GetModel()), + mrView(rSlideSorter.GetView()), + mrSlideSorter(rSlideSorter), + mpAnimator(rSlideSorter.GetController().GetAnimator()) +{ +} + +InsertAnimator::Implementation::~Implementation() +{ + SetInsertPosition(InsertPosition(), controller::Animator::AM_Immediate); +} + +void InsertAnimator::Implementation::SetInsertPosition ( + const InsertPosition& rInsertPosition, + const controller::Animator::AnimationMode eMode) +{ + if (maInsertPosition == rInsertPosition) + return; + + SharedPageObjectRun pOldRun (GetRun(mrView.GetLayouter(), maInsertPosition)); + SharedPageObjectRun pCurrentRun (GetRun(mrView.GetLayouter(), rInsertPosition)); + maInsertPosition = rInsertPosition; + + // When the new insert position is in a different run then move the page + // objects in the old run to their default positions. + if (pOldRun != pCurrentRun && pOldRun) + pOldRun->ResetOffsets(eMode); + + if (pCurrentRun) + { + pCurrentRun->UpdateOffsets(rInsertPosition, mrView.GetLayouter()); + } +} + +SharedPageObjectRun InsertAnimator::Implementation::GetRun ( + view::Layouter const & rLayouter, + const InsertPosition& rInsertPosition) +{ + const sal_Int32 nRow (rInsertPosition.GetRow()); + if (nRow < 0) + return SharedPageObjectRun(); + + RunContainer::const_iterator iRun (maRuns.end()); + if (rLayouter.GetColumnCount() == 1) + { + // There is only one run that contains all slides. + if (maRuns.empty()) + maRuns.insert(std::make_shared( + *this, + 0, + 0, + mrModel.GetPageCount()-1)); + iRun = maRuns.begin(); + } + else + { + iRun = FindRun(nRow); + if (iRun == maRuns.end()) + { + // Create a new run. + const sal_Int32 nStartIndex (rLayouter.GetIndex(nRow, 0)); + const sal_Int32 nEndIndex (rLayouter.GetIndex(nRow, rLayouter.GetColumnCount()-1)); + if (nStartIndex <= nEndIndex) + { + iRun = maRuns.insert(std::make_shared( + *this, + nRow, + nStartIndex, + nEndIndex)).first; + OSL_ASSERT(iRun != maRuns.end()); + } + } + } + + if (iRun != maRuns.end()) + return *iRun; + else + return SharedPageObjectRun(); +} + +InsertAnimator::Implementation::RunContainer::const_iterator + InsertAnimator::Implementation::FindRun (const sal_Int32 nRunIndex) const +{ + return std::find_if( + maRuns.begin(), + maRuns.end(), + [nRunIndex] (std::shared_ptr const& rRun) + { return rRun->mnRunIndex == nRunIndex; }); +} + +void InsertAnimator::Implementation::AddRun (const std::shared_ptr& rRun) +{ + if (rRun) + { + maRuns.insert(rRun); + } + else + { + OSL_ASSERT(rRun); + } +} + +void InsertAnimator::Implementation::RemoveRun (const std::shared_ptr& rRun) +{ + if (rRun) + { + // Do not remove runs that show the space for the insertion indicator. + if (rRun->mnLocalInsertIndex == -1) + { + InsertAnimator::Implementation::RunContainer::const_iterator iRun (FindRun(rRun->mnRunIndex)); + if (iRun != maRuns.end()) + { + OSL_ASSERT(*iRun == rRun); + maRuns.erase(iRun); + } + } + } + else + { + OSL_ASSERT(rRun); + } +} + +//===== PageObjectRun ========================================================= + +PageObjectRun::PageObjectRun ( + AnimatorAccess& rAnimatorAccess, + const sal_Int32 nRunIndex, + const sal_Int32 nStartIndex, + const sal_Int32 nEndIndex) + : mnRunIndex(nRunIndex), + mnLocalInsertIndex(-1), + mnStartIndex(nStartIndex), + mnEndIndex(nEndIndex), + mnStartTime(-1), + mnAnimationId(controller::Animator::NotAnAnimationId), + mrAnimatorAccess(rAnimatorAccess), + maAccelerationFunction( + controller::AnimationParametricFunction( + controller::AnimationBezierFunction (0.1,0.7))) +{ + maStartOffset.resize(nEndIndex - nStartIndex + 1); + maEndOffset.resize(nEndIndex - nStartIndex + 1); +} + +void PageObjectRun::UpdateOffsets( + const InsertPosition& rInsertPosition, + const view::Layouter& rLayouter) +{ + const bool bIsVertical (rLayouter.GetColumnCount()==1); + const sal_Int32 nLocalInsertIndex(bIsVertical + ? rInsertPosition.GetRow() + : rInsertPosition.GetColumn()); + if (nLocalInsertIndex == mnLocalInsertIndex) + return; + + mnLocalInsertIndex = nLocalInsertIndex; + + model::SlideSorterModel& rModel (mrAnimatorAccess.GetModel()); + const sal_Int32 nRunLength (mnEndIndex - mnStartIndex + 1); + for (sal_Int32 nIndex=0; nIndexGetVisualState().GetLocationOffset(); + maEndOffset[nIndex] = nIndex < mnLocalInsertIndex + ? rInsertPosition.GetLeadingOffset() + : rInsertPosition.GetTrailingOffset(); + if (bIsVertical) + maEndOffset[nIndex].setX( 0 ); + else + maEndOffset[nIndex].setY( 0 ); + } + RestartAnimation(); +} + +void PageObjectRun::ResetOffsets (const controller::Animator::AnimationMode eMode) +{ + mnLocalInsertIndex = -1; + const sal_Int32 nRunLength (mnEndIndex - mnStartIndex + 1); + model::SlideSorterModel& rModel (mrAnimatorAccess.GetModel()); + view::SlideSorterView& rView (mrAnimatorAccess.GetView()); + for (sal_Int32 nIndex=0; nIndexGetVisualState().GetLocationOffset(); + else + { + const ::tools::Rectangle aOldBoundingBox (pDescriptor->GetBoundingBox()); + pDescriptor->GetVisualState().SetLocationOffset(Point(0,0)); + rView.RequestRepaint(aOldBoundingBox); + rView.RequestRepaint(pDescriptor); + } + } + maEndOffset[nIndex] = Point(0,0); + } + if (eMode == controller::Animator::AM_Animated) + RestartAnimation(); + else + mrAnimatorAccess.RemoveRun(shared_from_this()); +} + +void PageObjectRun::RestartAnimation() +{ + // Stop the current animation. + if (mnAnimationId != controller::Animator::NotAnAnimationId) + { + mrAnimatorAccess.GetAnimator()->RemoveAnimation(mnAnimationId); + } + + // Restart the animation. + mrAnimatorAccess.AddRun(shared_from_this()); + auto sharedThis(shared_from_this()); + mnAnimationId = mrAnimatorAccess.GetAnimator()->AddAnimation( + [this] (double const val) { (*this)(val); }, + [sharedThis] () { sharedThis->mrAnimatorAccess.RemoveRun(sharedThis); } + ); +} + +void PageObjectRun::operator () (const double nGlobalTime) +{ + if (mnStartTime < 0) + mnStartTime = nGlobalTime; + + double nLocalTime (nGlobalTime - mnStartTime); + if (nLocalTime > 1.0) + nLocalTime = 1.0; + nLocalTime = maAccelerationFunction(nLocalTime); + + model::SlideSorterModel& rModel (mrAnimatorAccess.GetModel()); + view::SlideSorterView& rView (mrAnimatorAccess.GetView()); + for (sal_Int32 nIndex=mnStartIndex; nIndex<=mnEndIndex; ++nIndex) + { + model::SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex)); + if ( ! pDescriptor) + continue; + const ::tools::Rectangle aOldBoundingBox (pDescriptor->GetBoundingBox()); + pDescriptor->GetVisualState().SetLocationOffset( + Blend( + maStartOffset[nIndex-mnStartIndex], + maEndOffset[nIndex-mnStartIndex], + nLocalTime)); + + // Request a repaint of the old and new bounding box (which largely overlap.) + rView.RequestRepaint(aOldBoundingBox); + rView.RequestRepaint(pDescriptor); + } + + // Call Flush to make + // a) animations a bit more smooth and + // b) on Mac without the Flush a Reset of the page locations is not properly + // visualized when the mouse leaves the window during drag-and-drop. + mrAnimatorAccess.GetContentWindow()->GetOutDev()->Flush(); +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx new file mode 100644 index 0000000000..3e5139d32f --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx @@ -0,0 +1,360 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include "SlsFramePainter.hxx" +#include "SlsLayeredDevice.hxx" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace { + +const double gnPreviewOffsetScale = 1.0 / 8.0; + +::tools::Rectangle GrowRectangle (const ::tools::Rectangle& rBox, const sal_Int32 nOffset) +{ + return ::tools::Rectangle ( + rBox.Left() - nOffset, + rBox.Top() - nOffset, + rBox.Right() + nOffset, + rBox.Bottom() + nOffset); +} + +sal_Int32 RoundToInt (const double nValue) { return sal_Int32(::rtl::math::round(nValue)); } + +} // end of anonymous namespace + +namespace sd::slidesorter::view { + +//===== InsertionIndicatorOverlay =========================================== + +const sal_Int32 gnShadowBorder = 3; +const sal_Int32 gnLayerIndex = 2; + +InsertionIndicatorOverlay::InsertionIndicatorOverlay (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mbIsVisible(false), + mpShadowPainter( + new FramePainter(mrSlideSorter.GetTheme()->GetIcon(Theme::Icon_RawInsertShadow))) +{ +} + +InsertionIndicatorOverlay::~InsertionIndicatorOverlay() +{ + // cid#1491947 silence Uncaught exception + suppress_fun_call_w_exception(Hide()); +} + +void InsertionIndicatorOverlay::Create (const SdTransferable* pTransferable) +{ + if (pTransferable == nullptr) + return; + + std::shared_ptr pData ( + controller::TransferableData::GetFromTransferable(pTransferable)); + if ( ! pData) + return; + sal_Int32 nSelectionCount (0); + if (pTransferable->HasPageBookmarks()) + nSelectionCount = pTransferable->GetPageBookmarks().size(); + else + { + DrawDocShell* pDataDocShell = dynamic_cast(pTransferable->GetDocShell().get()); + if (pDataDocShell != nullptr) + { + SdDrawDocument* pDataDocument = pDataDocShell->GetDoc(); + if (pDataDocument != nullptr) + nSelectionCount = pDataDocument->GetSdPageCount(PageKind::Standard); + } + } + Create(pData->GetRepresentatives(), nSelectionCount); +} + +void InsertionIndicatorOverlay::Create ( + const ::std::vector& rRepresentatives, + const sal_Int32 nSelectionCount) +{ + view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter()); + const std::shared_ptr& pPageObjectLayouter ( + rLayouter.GetPageObjectLayouter()); + std::shared_ptr pTheme (mrSlideSorter.GetTheme()); + const Size aOriginalPreviewSize (pPageObjectLayouter->GetPreviewSize()); + + const double nPreviewScale (0.5); + const Size aPreviewSize ( + RoundToInt(aOriginalPreviewSize.Width()*nPreviewScale), + RoundToInt(aOriginalPreviewSize.Height()*nPreviewScale)); + const sal_Int32 nOffset ( + RoundToInt(std::min(aPreviewSize.Width(),aPreviewSize.Height()) * gnPreviewOffsetScale)); + + // Determine size and offset depending on the number of previews. + sal_Int32 nCount (rRepresentatives.size()); + if (nCount > 0) + --nCount; + Size aIconSize( + aPreviewSize.Width() + 2 * gnShadowBorder + nCount*nOffset, + aPreviewSize.Height() + 2 * gnShadowBorder + nCount*nOffset); + + // Create virtual devices for bitmap and mask whose bitmaps later be + // combined to form the BitmapEx of the icon. + ScopedVclPtrInstance pContent( + *mrSlideSorter.GetContentWindow()->GetOutDev(), DeviceFormat::WITH_ALPHA); + pContent->SetOutputSizePixel(aIconSize); + + pContent->SetFillColor(); + pContent->SetLineColor(pTheme->GetColor(Theme::Color_PreviewBorder)); + const Point aOffset = PaintRepresentatives(*pContent, aPreviewSize, nOffset, rRepresentatives); + + PaintPageCount(*pContent, nSelectionCount, aPreviewSize, aOffset); + + maIcon = pContent->GetBitmapEx(Point(0,0), aIconSize); + maIcon.Scale(aIconSize); +} + +Point InsertionIndicatorOverlay::PaintRepresentatives ( + OutputDevice& rContent, + const Size& rPreviewSize, + const sal_Int32 nOffset, + const ::std::vector& rRepresentatives) const +{ + const Point aOffset (0,rRepresentatives.size()==1 ? -nOffset : 0); + + // Paint the pages. + Point aPageOffset (0,0); + double nTransparency (0); + const BitmapEx aExclusionOverlay (mrSlideSorter.GetTheme()->GetIcon(Theme::Icon_HideSlideOverlay)); + for (sal_Int32 nIndex=2; nIndex>=0; --nIndex) + { + if (rRepresentatives.size() <= o3tl::make_unsigned(nIndex)) + continue; + switch(nIndex) + { + case 0 : + aPageOffset = Point(0, nOffset); + nTransparency = 0.85; + break; + case 1: + aPageOffset = Point(nOffset, 0); + nTransparency = 0.75; + break; + case 2: + aPageOffset = Point(2*nOffset, 2*nOffset); + nTransparency = 0.65; + break; + } + aPageOffset += aOffset; + aPageOffset.AdjustX(gnShadowBorder ); + aPageOffset.AdjustY(gnShadowBorder ); + + // Paint the preview. + BitmapEx aPreview (rRepresentatives[nIndex].maBitmap); + aPreview.Scale(rPreviewSize, BmpScaleFlag::BestQuality); + rContent.DrawBitmapEx(aPageOffset, aPreview); + + // When the page is marked as excluded from the slide show then + // paint an overlay that visualizes this. + if (rRepresentatives[nIndex].mbIsExcluded) + { + const vcl::Region aSavedClipRegion (rContent.GetClipRegion()); + rContent.IntersectClipRegion(::tools::Rectangle(aPageOffset, rPreviewSize)); + // Paint bitmap tiled over the preview to mark it as excluded. + const sal_Int32 nIconWidth (aExclusionOverlay.GetSizePixel().Width()); + const sal_Int32 nIconHeight (aExclusionOverlay.GetSizePixel().Height()); + if (nIconWidth>0 && nIconHeight>0) + { + for (::tools::Long nX=0; nXPaintFrame(rContent, aBorderBox); + } + + return aPageOffset; +} + +void InsertionIndicatorOverlay::PaintPageCount ( + OutputDevice& rDevice, + const sal_Int32 nSelectionCount, + const Size& rPreviewSize, + const Point& rFirstPageOffset) const +{ + // Paint the number of slides. + std::shared_ptr pTheme (mrSlideSorter.GetTheme()); + std::shared_ptr pFont(Theme::GetFont(Theme::Font_PageCount, rDevice)); + if (!pFont) + return; + + OUString sNumber (OUString::number(nSelectionCount)); + + // Determine the size of the (painted) text and create a bounding + // box that centers the text on the first preview. + rDevice.SetFont(*pFont); + ::tools::Rectangle aTextBox; + rDevice.GetTextBoundRect(aTextBox, sNumber); + Point aTextOffset (aTextBox.TopLeft()); + Size aTextSize (aTextBox.GetSize()); + // Place text inside the first page preview. + Point aTextLocation(rFirstPageOffset); + // Center the text. + aTextLocation += Point( + (rPreviewSize.Width()-aTextBox.GetWidth())/2, + (rPreviewSize.Height()-aTextBox.GetHeight())/2); + aTextBox = ::tools::Rectangle(aTextLocation, aTextSize); + + // Paint background, border and text. + static const sal_Int32 nBorder = 5; + rDevice.SetFillColor(pTheme->GetColor(Theme::Color_Selection)); + rDevice.SetLineColor(pTheme->GetColor(Theme::Color_Selection)); + rDevice.DrawRect(GrowRectangle(aTextBox, nBorder)); + + rDevice.SetFillColor(); + rDevice.SetLineColor(pTheme->GetColor(Theme::Color_PageCountFontColor)); + rDevice.DrawRect(GrowRectangle(aTextBox, nBorder-1)); + + rDevice.SetTextColor(pTheme->GetColor(Theme::Color_PageCountFontColor)); + rDevice.DrawText(aTextBox.TopLeft()-aTextOffset, sNumber); +} + +void InsertionIndicatorOverlay::SetLocation (const Point& rLocation) +{ + const Point aTopLeft ( + rLocation - Point( + maIcon.GetSizePixel().Width()/2, + maIcon.GetSizePixel().Height()/2)); + if (maLocation != aTopLeft) + { + const ::tools::Rectangle aOldBoundingBox (GetBoundingBox()); + + maLocation = aTopLeft; + + if (mpLayerInvalidator && IsVisible()) + { + mpLayerInvalidator->Invalidate(aOldBoundingBox); + mpLayerInvalidator->Invalidate(GetBoundingBox()); + } + } +} + +void InsertionIndicatorOverlay::Paint ( + OutputDevice& rDevice, + const ::tools::Rectangle&) +{ + if ( ! IsVisible()) + return; + + rDevice.DrawImage(maLocation, Image(maIcon)); +} + +void InsertionIndicatorOverlay::SetLayerInvalidator (const SharedILayerInvalidator& rpInvalidator) +{ + mpLayerInvalidator = rpInvalidator; + + if (mbIsVisible && mpLayerInvalidator) + mpLayerInvalidator->Invalidate(GetBoundingBox()); +} + +void InsertionIndicatorOverlay::Show() +{ + if ( mbIsVisible) + return; + + mbIsVisible = true; + + std::shared_ptr pLayeredDevice ( + mrSlideSorter.GetView().GetLayeredDevice()); + if (pLayeredDevice) + { + pLayeredDevice->RegisterPainter(shared_from_this(), gnLayerIndex); + if (mpLayerInvalidator) + mpLayerInvalidator->Invalidate(GetBoundingBox()); + } +} + +void InsertionIndicatorOverlay::Hide() +{ + if (!mbIsVisible) + return; + + mbIsVisible = false; + + std::shared_ptr pLayeredDevice ( + mrSlideSorter.GetView().GetLayeredDevice()); + if (pLayeredDevice) + { + if (mpLayerInvalidator) + mpLayerInvalidator->Invalidate(GetBoundingBox()); + pLayeredDevice->RemovePainter(shared_from_this(), gnLayerIndex); + } +} + +::tools::Rectangle InsertionIndicatorOverlay::GetBoundingBox() const +{ + return ::tools::Rectangle(maLocation, maIcon.GetSizePixel()); +} + +Size InsertionIndicatorOverlay::GetSize() const +{ + return Size( + maIcon.GetSizePixel().Width() + 10, + maIcon.GetSizePixel().Height() + 10); +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx b/sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx new file mode 100644 index 0000000000..4bd3808992 --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx @@ -0,0 +1,492 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsLayeredDevice.hxx" +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace sd::slidesorter::view { + +namespace { +const sal_Int32 gnMaximumLayerCount = 8; + +class LayerInvalidator : public ILayerInvalidator +{ +public: + LayerInvalidator ( + std::shared_ptr pLayeredDevice, + sd::Window *pTargetWindow, + const int nLayer) + : mpLayeredDevice(std::move(pLayeredDevice)), + mpTargetWindow(pTargetWindow), + mnLayer(nLayer) + { + } + + virtual void Invalidate (const ::tools::Rectangle& rInvalidationBox) override + { + mpLayeredDevice->Invalidate(rInvalidationBox, mnLayer); + mpTargetWindow->Invalidate(rInvalidationBox); + } + +private: + const std::shared_ptr mpLayeredDevice; + VclPtr mpTargetWindow; + const int mnLayer; +}; + +void DeviceCopy ( + vcl::RenderContext& rTargetDevice, + vcl::RenderContext const & rSourceDevice, + const ::tools::Rectangle& rBox) +{ + rTargetDevice.DrawOutDev( + rBox.TopLeft(), + rBox.GetSize(), + rBox.TopLeft(), + rBox.GetSize(), + rSourceDevice); +} + +void ForAllRectangles (const vcl::Region& rRegion, const std::function& aFunction) +{ + OSL_ASSERT(aFunction); + RectangleVector aRectangles; + rRegion.GetRegionRectangles(aRectangles); + + if(aRectangles.empty()) + { + aFunction(::tools::Rectangle()); + } + else + { + for(const auto& rRect : aRectangles) + { + aFunction(rRect); + } + + //Region aMutableRegionCopy (rRegion); + //RegionHandle aHandle(aMutableRegionCopy.BeginEnumRects()); + //Rectangle aBox; + //while (aMutableRegionCopy.GetEnumRects(aHandle, aBox)) + // aFunction(aBox); + //aMutableRegionCopy.EndEnumRects(aHandle); + } +} + +class Layer +{ +public: + Layer(); + Layer(const Layer&) = delete; + Layer& operator=(const Layer&) = delete; + + void Initialize (sd::Window *pTargetWindow); + void InvalidateRectangle (const ::tools::Rectangle& rInvalidationBox); + void InvalidateRegion (const vcl::Region& rInvalidationRegion); + void Validate (const MapMode& rMapMode); + void Repaint ( + OutputDevice& rTargetDevice, + const ::tools::Rectangle& rRepaintRectangle); + void Resize (const Size& rSize); + void AddPainter (const SharedILayerPainter& rpPainter); + void RemovePainter (const SharedILayerPainter& rpPainter); + bool HasPainter() const; + void Dispose(); + +private: + ScopedVclPtr mpLayerDevice; + ::std::vector maPainters; + vcl::Region maInvalidationRegion; + + void ValidateRectangle (const ::tools::Rectangle& rBox); +}; +typedef std::shared_ptr SharedLayer; + +} // end of anonymous namespace + +class LayeredDevice::LayerContainer +{ +public: + LayerContainer() {} + + bool empty() const { return mvLayers.empty(); } + + size_t size() const { return mvLayers.size(); } + + const SharedLayer& back() const { return mvLayers.back(); } + + ::std::vector::const_iterator begin() const { return mvLayers.begin(); } + ::std::vector::const_iterator end() const { return mvLayers.end(); } + + void clear() { mvLayers.clear(); } + + void pop_back() { mvLayers.pop_back(); } + + void resize(size_t n) { mvLayers.resize(n); } + + SharedLayer& operator[](size_t i) { return mvLayers[i]; } + +private: + ::std::vector mvLayers; +}; + +//===== LayeredDevice ========================================================= + +LayeredDevice::LayeredDevice (const VclPtr& pTargetWindow) + : mpTargetWindow(pTargetWindow), + mpLayers(new LayerContainer()), + mpBackBuffer(VclPtr::Create(*mpTargetWindow->GetOutDev())), + maSavedMapMode(pTargetWindow->GetMapMode()) +{ + mpBackBuffer->SetOutputSizePixel(mpTargetWindow->GetSizePixel()); +} + +LayeredDevice::~LayeredDevice() +{ +} + +void LayeredDevice::Invalidate ( + const ::tools::Rectangle& rInvalidationArea, + const sal_Int32 nLayer) +{ + if (nLayer<0 || o3tl::make_unsigned(nLayer)>=mpLayers->size()) + { + OSL_ASSERT(nLayer>=0 && o3tl::make_unsigned(nLayer)size()); + return; + } + + (*mpLayers)[nLayer]->InvalidateRectangle(rInvalidationArea); +} + +void LayeredDevice::InvalidateAllLayers (const ::tools::Rectangle& rInvalidationArea) +{ + for (size_t nLayer=0; nLayersize(); ++nLayer) + (*mpLayers)[nLayer]->InvalidateRectangle(rInvalidationArea); +} + +void LayeredDevice::InvalidateAllLayers (const vcl::Region& rInvalidationRegion) +{ + for (size_t nLayer=0; nLayersize(); ++nLayer) + (*mpLayers)[nLayer]->InvalidateRegion(rInvalidationRegion); +} + +void LayeredDevice::RegisterPainter ( + const SharedILayerPainter& rpPainter, + const sal_Int32 nLayer) +{ + OSL_ASSERT(mpLayers); + if ( ! rpPainter) + { + OSL_ASSERT(rpPainter); + return; + } + if (nLayer<0 || nLayer>=gnMaximumLayerCount) + { + OSL_ASSERT(nLayer>=0 && nLayer= mpLayers->size()) + { + const sal_Int32 nOldLayerCount (mpLayers->size()); + mpLayers->resize(nLayer+1); + + for (size_t nIndex=nOldLayerCount; nIndexsize(); ++nIndex) + (*mpLayers)[nIndex] = std::make_shared(); + } + + (*mpLayers)[nLayer]->AddPainter(rpPainter); + if (nLayer == 0) + (*mpLayers)[nLayer]->Initialize(mpTargetWindow); + + rpPainter->SetLayerInvalidator( + std::make_shared(shared_from_this(),mpTargetWindow,nLayer)); +} + +void LayeredDevice::RemovePainter ( + const SharedILayerPainter& rpPainter, + const sal_Int32 nLayer) +{ + if ( ! rpPainter) + { + OSL_ASSERT(rpPainter); + return; + } + if (nLayer<0 || o3tl::make_unsigned(nLayer)>=mpLayers->size()) + { + OSL_ASSERT(nLayer>=0 && o3tl::make_unsigned(nLayer)size()); + return; + } + + rpPainter->SetLayerInvalidator(SharedILayerInvalidator()); + + (*mpLayers)[nLayer]->RemovePainter(rpPainter); + + // Remove top most layers that do not contain any painters. + while ( ! mpLayers->empty() && ! mpLayers->back()->HasPainter()) + mpLayers->pop_back(); +} + +void LayeredDevice::Repaint (const vcl::Region& rRepaintRegion) +{ + // Validate the contents of all layers (that have their own devices.) + for (auto const& it : *mpLayers) + { + it->Validate(mpTargetWindow->GetMapMode()); + } + + ForAllRectangles(rRepaintRegion, + [this] (::tools::Rectangle const& r) { this->RepaintRectangle(r); }); +} + +void LayeredDevice::RepaintRectangle (const ::tools::Rectangle& rRepaintRectangle) +{ + if (mpLayers->empty()) + return; + else if (mpLayers->size() == 1) + { + // Just copy the main layer into the target device. + (*mpLayers)[0]->Repaint(*mpTargetWindow->GetOutDev(), rRepaintRectangle); + } + else + { + // Paint all layers first into the back buffer (to avoid flickering + // due to synchronous paints) and then copy that into the target + // device. + mpBackBuffer->SetMapMode(mpTargetWindow->GetMapMode()); + for (auto const& it : *mpLayers) + { + it->Repaint(*mpBackBuffer, rRepaintRectangle); + } + DeviceCopy(*mpTargetWindow->GetOutDev(), *mpBackBuffer, rRepaintRectangle); + } +} + +void LayeredDevice::Resize() +{ + const Size aSize (mpTargetWindow->GetSizePixel()); + mpBackBuffer->SetOutputSizePixel(aSize); + for (auto const& it : *mpLayers) + { + it->Resize(aSize); + } +} + +void LayeredDevice::Dispose() +{ + for (auto const& it : *mpLayers) + { + it->Dispose(); + } + mpLayers->clear(); +} + +bool LayeredDevice::HandleMapModeChange() +{ + const MapMode& rMapMode (mpTargetWindow->GetMapMode()); + if (maSavedMapMode == rMapMode) + return false; + + const ::tools::Rectangle aLogicWindowBox ( + mpTargetWindow->PixelToLogic(::tools::Rectangle(Point(0,0), mpTargetWindow->GetSizePixel()))); + if (maSavedMapMode.GetScaleX() != rMapMode.GetScaleX() + || maSavedMapMode.GetScaleY() != rMapMode.GetScaleY() + || maSavedMapMode.GetMapUnit() != rMapMode.GetMapUnit()) + { + // When the scale has changed then we have to paint everything. + InvalidateAllLayers(aLogicWindowBox); + } + else if (maSavedMapMode.GetOrigin() != rMapMode.GetOrigin()) + { + // Window has been scrolled. Adapt contents of backbuffers and + // layer devices. + const Point aDelta (rMapMode.GetOrigin() - maSavedMapMode.GetOrigin()); + mpBackBuffer->CopyArea( + aLogicWindowBox.TopLeft(), + mpTargetWindow->PixelToLogic(Point(0,0), maSavedMapMode), + aLogicWindowBox.GetSize()); + + // Invalidate the area(s) that have been exposed. + const ::tools::Rectangle aWindowBox (Point(0,0), mpTargetWindow->GetSizePixel()); + if (aDelta.Y() < 0) + InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle( + aWindowBox.Left(), + aWindowBox.Bottom()+aDelta.Y(), + aWindowBox.Right(), + aWindowBox.Bottom()))); + else if (aDelta.Y() > 0) + InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle( + aWindowBox.Left(), + aWindowBox.Top(), + aWindowBox.Right(), + aWindowBox.Top()+aDelta.Y()))); + if (aDelta.X() < 0) + InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle( + aWindowBox.Right()+aDelta.X(), + aWindowBox.Top(), + aWindowBox.Right(), + aWindowBox.Bottom()))); + else if (aDelta.X() > 0) + InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle( + aWindowBox.Left(), + aWindowBox.Top(), + aWindowBox.Left()+aDelta.X(), + aWindowBox.Bottom()))); + } + else + { + // Can this happen? Lets trigger a warning when it does. + OSL_ASSERT(false); + } + + maSavedMapMode = rMapMode; + + return true; +} + +//===== Layer ================================================================= + +Layer::Layer() +{ +} + +void Layer::Initialize (sd::Window *pTargetWindow) +{ +#if 0 + (void)pTargetWindow; +#else + if ( ! mpLayerDevice) + { + mpLayerDevice.disposeAndReset(VclPtr::Create(*pTargetWindow->GetOutDev())); + mpLayerDevice->SetOutputSizePixel(pTargetWindow->GetSizePixel()); + } +#endif +} + +void Layer::InvalidateRectangle (const ::tools::Rectangle& rInvalidationBox) +{ + maInvalidationRegion.Union(rInvalidationBox); +} + +void Layer::InvalidateRegion (const vcl::Region& rInvalidationRegion) +{ + maInvalidationRegion.Union(rInvalidationRegion); +} + +void Layer::Validate (const MapMode& rMapMode) +{ + if (mpLayerDevice && ! maInvalidationRegion.IsEmpty()) + { + vcl::Region aRegion (maInvalidationRegion); + maInvalidationRegion.SetEmpty(); + + mpLayerDevice->SetMapMode(rMapMode); + ForAllRectangles( + aRegion, + [this] (::tools::Rectangle const& r) { return this->ValidateRectangle(r); }); + } +} + +void Layer::ValidateRectangle (const ::tools::Rectangle& rBox) +{ + if ( ! mpLayerDevice) + return; + const vcl::Region aSavedClipRegion (mpLayerDevice->GetClipRegion()); + mpLayerDevice->IntersectClipRegion(rBox); + + for (const auto& rxPainter : maPainters) + { + rxPainter->Paint(*mpLayerDevice, rBox); + } + + mpLayerDevice->SetClipRegion(aSavedClipRegion); +} + +void Layer::Repaint ( + OutputDevice& rTargetDevice, + const ::tools::Rectangle& rRepaintRectangle) +{ + if (mpLayerDevice) + { + DeviceCopy(rTargetDevice, *mpLayerDevice, rRepaintRectangle); + } + else + { + for (auto const& it : maPainters) + { + it->Paint(rTargetDevice, rRepaintRectangle); + } + } +} + +void Layer::Resize (const Size& rSize) +{ + if (mpLayerDevice) + { + mpLayerDevice->SetOutputSizePixel(rSize); + maInvalidationRegion = ::tools::Rectangle(Point(0,0), rSize); + } +} + +void Layer::AddPainter (const SharedILayerPainter& rpPainter) +{ + OSL_ASSERT(::std::find(maPainters.begin(), maPainters.end(), rpPainter) == maPainters.end()); + + maPainters.push_back(rpPainter); +} + +void Layer::RemovePainter (const SharedILayerPainter& rpPainter) +{ + const ::std::vector::iterator iPainter ( + ::std::find(maPainters.begin(), maPainters.end(), rpPainter)); + if (iPainter != maPainters.end()) + { + maPainters.erase(iPainter); + } + else + { + SAL_WARN("sd", "LayeredDevice::RemovePainter called for painter that is not registered"); + } +} + +bool Layer::HasPainter() const +{ + return !maPainters.empty(); +} + +void Layer::Dispose() +{ + maPainters.clear(); +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx b/sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx new file mode 100644 index 0000000000..5ec0d0e9f5 --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +#include + +namespace sd { class Window; } +namespace tools { class Rectangle; } +namespace vcl { class Region; } + +class VirtualDevice; + +namespace sd::slidesorter::view { + +/** A simple wrapper around an OutputDevice that provides support for + independent layers and buffering. + Each layer may contain any number of painters. +*/ +class LayeredDevice + : public std::enable_shared_from_this + +{ +public: + explicit LayeredDevice (const VclPtr& pTargetWindow); + ~LayeredDevice (); + + void Invalidate ( + const ::tools::Rectangle& rInvalidationBox, + const sal_Int32 nLayer); + void InvalidateAllLayers ( + const ::tools::Rectangle& rInvalidationBox); + void InvalidateAllLayers ( + const vcl::Region& rInvalidationRegion); + + void RegisterPainter ( + const SharedILayerPainter& rPainter, + const sal_Int32 nLayer); + + void RemovePainter ( + const SharedILayerPainter& rPainter, + const sal_Int32 nLayer); + + bool HandleMapModeChange(); + void Repaint (const vcl::Region& rRepaintRegion); + + void Resize(); + + void Dispose(); + +private: + VclPtr mpTargetWindow; + class LayerContainer; + std::unique_ptr mpLayers; + ScopedVclPtr mpBackBuffer; + MapMode maSavedMapMode; + + void RepaintRectangle (const ::tools::Rectangle& rRepaintRectangle); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsLayouter.cxx b/sd/source/ui/slidesorter/view/SlsLayouter.cxx new file mode 100644 index 0000000000..8bc0daf3f5 --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsLayouter.cxx @@ -0,0 +1,1226 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::view { + +class Layouter::Implementation +{ +public: + VclPtr mpWindow; + static const sal_Int32 mnRequestedLeftBorder = 5; + static const sal_Int32 mnRequestedRightBorder = 5; + static const sal_Int32 mnRequestedTopBorder = 5; + static const sal_Int32 mnRequestedBottomBorder = 5; + sal_Int32 mnLeftBorder; + sal_Int32 mnRightBorder; + sal_Int32 mnTopBorder; + sal_Int32 mnBottomBorder; + static const sal_Int32 gnVerticalGap = 10 - 2*Theme_FocusIndicatorWidth; + static const sal_Int32 gnHorizontalGap = 10 - 2*Theme_FocusIndicatorWidth; + Size maMinimalSize; + Size maPreferredSize; + Size maMaximalSize; + sal_Int32 mnMinimalColumnCount; + sal_Int32 mnMaximalColumnCount; + sal_Int32 mnPageCount; + sal_Int32 mnColumnCount; + sal_Int32 mnRowCount; + /// The maximum number of columns. Can only be larger than the current + /// number of columns when there are not enough pages to fill all + /// available columns. + sal_Int32 mnMaxColumnCount; + /// The maximum number of rows. Can only be larger than the current + /// number of rows when there are not enough pages to fill all available + /// rows. + sal_Int32 mnMaxRowCount; + Size maPageObjectSize; + std::shared_ptr mpPageObjectLayouter; + std::shared_ptr mpTheme; + + /** Specify how the gap between two page objects is associated with the + page objects. + */ + enum GapMembership { + GM_NONE, // Gap is not associated with any page object. + GM_PREVIOUS, // The whole gap is associated with the previous page + // object (left or above the gap.) + GM_BOTH, // Half of the gap is associated with previous, half + // with the next page object. + GM_NEXT, // The whole gap is associated with the next page + // object (right or below the gap.) + GM_PAGE_BORDER + }; + + static Implementation* Create ( + const Implementation& rImplementation, + const Layouter::Orientation eOrientation); + + virtual Layouter::Orientation GetOrientation() const = 0; + + bool Rearrange ( + const Size& rWindowSize, + const Size& rPreviewModelSize, + const sal_uInt32 nPageCount); + + /** Calculate the row that the point with the given vertical coordinate + is over. The horizontal component is ignored. + @param nYPosition + Vertical position in model coordinates. + @param bIncludeBordersAndGaps + When this flag is then the area of borders and gaps are + interpreted as belonging to one of the rows. + @param eGapMembership + Specifies to what row the gap areas belong. Here GM_NONE + corresponds to bIncludeBordersAndGaps being . When + GM_BOTH is given then the upper half is associated to the row + above and the lower half to the row below. Values of + GM_PREVIOUS and GM_NEXT associate the whole gap area with the + row above or below respectively. + */ + sal_Int32 GetRowAtPosition ( + sal_Int32 nYPosition, + bool bIncludeBordersAndGaps, + GapMembership eGapMembership) const; + + /** Calculate the column that the point with the given horizontal + coordinate is over. The vertical component is ignored. + @param nXPosition + Horizontal position in model coordinates. + @param bIncludeBordersAndGaps + When this flag is then the area of borders and gaps are + interpreted as belonging to one of the columns. + @param eGapMembership + Specifies to what column the gap areas belong. + */ + sal_Int32 GetColumnAtPosition ( + sal_Int32 nXPosition, + bool bIncludeBordersAndGaps, + GapMembership eGapMembership) const; + + /** This method is typically called from GetRowAtPosition() and + GetColumnAtPosition() to handle a position that lies inside the gap + between two adjacent rows or columns. + @param nDistanceIntoGap + Vertical distance from the bottom of the upper row down into the + gap or horizontal distance from the right edge right into the + gap. + @param eGapMemberhship + This value decides what areas in the gap belong to which (or no) + row or column. + @param nIndex + The row index of the upper row or the column index of the left + column. + @param nGap + Width or height of the gap in model coordinates between the + page borders. + @return + Returns either the index of the upper row (as given as nRow), the + index of the lower row (nRow+1) or -1 to indicate that the + position belongs to no row. + */ + static sal_Int32 ResolvePositionInGap ( + sal_Int32 nDistanceIntoGap, + GapMembership eGapMembership, + sal_Int32 nIndex, + sal_Int32 nGap); + + /** Calculate the logical part of the insert position, i.e. the page + after which to insert. + */ + virtual void CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const = 0; + + /** Calculate the geometrical part of the insert position, i.e. the + location of where to display the insertion indicator and the + distances about which the leading and trailing pages have to be + moved to make room for the indicator. + */ + void CalculateGeometricPosition ( + InsertPosition& rPosition, + const Size& rIndicatorSize, + const bool bIsVertical, + model::SlideSorterModel const & rModel) const; + + /** Return the bounding box of the preview or, when selected, of the page + object. Thus, it returns something like a visual bounding box. + */ + ::tools::Rectangle GetInnerBoundingBox ( + model::SlideSorterModel const & rModel, + const sal_Int32 nIndex) const; + + Range GetValidHorizontalSizeRange() const; + Range GetValidVerticalSizeRange() const; + + Range GetRangeOfVisiblePageObjects (const ::tools::Rectangle& aVisibleArea) const; + sal_Int32 GetIndex ( + const sal_Int32 nRow, + const sal_Int32 nColumn, + const bool bClampToValidRange) const; + + ::tools::Rectangle GetPageObjectBox ( + const sal_Int32 nIndex, + const bool bIncludeBorderAndGap = false) const; + + ::tools::Rectangle GetPageObjectBox ( + const sal_Int32 nRow, + const sal_Int32 nColumn) const; + + ::tools::Rectangle AddBorderAndGap ( + const ::tools::Rectangle& rBoundingBox, + const sal_Int32 nRow, + const sal_Int32 nColumn) const; + + ::tools::Rectangle GetTotalBoundingBox() const; + + virtual ~Implementation(); + +protected: + Implementation ( + sd::Window *pWindow, + std::shared_ptr pTheme); + explicit Implementation (const Implementation& rImplementation); + + virtual void CalculateRowAndColumnCount (const Size& rWindowSize) = 0; + virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) = 0; + virtual Size CalculateTargetSize ( + const Size& rWindowSize) const = 0; + Size GetTargetSize ( + const Size& rWindowSize, + const bool bCalculateWidth, + const bool bCalculateHeight) const; + void CalculateVerticalLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const; +}; + +namespace { + +/** The vertical layouter has one column and as many rows as there are + pages. +*/ +class VerticalImplementation : public Layouter::Implementation +{ +public: + explicit VerticalImplementation (const Implementation& rImplementation); + + virtual Layouter::Orientation GetOrientation() const override; + + void CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const override; + +protected: + virtual void CalculateRowAndColumnCount (const Size& rWindowSize) override; + virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) override; + virtual Size CalculateTargetSize ( + const Size& rWindowSize) const override; +}; + +/** The horizontal layouter has one row and as many columns as there are + pages. +*/ +class HorizontalImplementation : public Layouter::Implementation +{ +public: + explicit HorizontalImplementation(const Implementation& rImplementation); + + virtual Layouter::Orientation GetOrientation() const override; + + void CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const override; + +protected: + virtual void CalculateRowAndColumnCount (const Size& rWindowSize) override; + virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) override; + virtual Size CalculateTargetSize ( + const Size& rWindowSize) const override; +}; + +/** The number of columns of the grid layouter is defined via a control in + the slide sorter tool bar. The number of rows is calculated from the + number of columns and the number of pages. +*/ +class GridImplementation : public Layouter::Implementation +{ +public: + GridImplementation ( + sd::Window *pWindow, + const std::shared_ptr& rpTheme); + explicit GridImplementation(const Implementation& rImplementation); + + virtual Layouter::Orientation GetOrientation() const override; + + void CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const override; + +protected: + virtual void CalculateRowAndColumnCount (const Size& rWindowSize) override; + virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) override; + virtual Size CalculateTargetSize ( + const Size& rWindowSize) const override; +}; + +} + +//===== Layouter ============================================================== + +Layouter::Layouter ( + sd::Window *pWindow, + const std::shared_ptr& rpTheme) + : mpImplementation(new GridImplementation(pWindow, rpTheme)), + mpWindow(pWindow) +{ +} + +Layouter::~Layouter() +{ +} + +std::shared_ptr const & Layouter::GetPageObjectLayouter() const +{ + return mpImplementation->mpPageObjectLayouter; +} + +void Layouter::SetColumnCount ( + sal_Int32 nMinimalColumnCount, + sal_Int32 nMaximalColumnCount) +{ + if (nMinimalColumnCount <= nMaximalColumnCount) + { + mpImplementation->mnMinimalColumnCount = nMinimalColumnCount; + mpImplementation->mnMaximalColumnCount = nMaximalColumnCount; + } +} + +bool Layouter::Rearrange ( + const Orientation eOrientation, + const Size& rWindowSize, + const Size& rPageSize, + const sal_uInt32 nPageCount) +{ + OSL_ASSERT(mpWindow); + + if (eOrientation != mpImplementation->GetOrientation()) + mpImplementation.reset(Implementation::Create(*mpImplementation, eOrientation)); + + return mpImplementation->Rearrange(rWindowSize, rPageSize, nPageCount); +} + +sal_Int32 Layouter::GetColumnCount() const +{ + return mpImplementation->mnColumnCount; +} + +sal_Int32 Layouter::GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const +{ + return mpImplementation->GetIndex(nRow,nColumn,true); +} + +Size const & Layouter::GetPageObjectSize() const +{ + return mpImplementation->maPageObjectSize; +} + +::tools::Rectangle Layouter::GetPageObjectBox ( + const sal_Int32 nIndex, + const bool bIncludeBorderAndGap) const +{ + return mpImplementation->GetPageObjectBox(nIndex, bIncludeBorderAndGap); +} + +::tools::Rectangle Layouter::GetTotalBoundingBox() const +{ + return mpImplementation->GetTotalBoundingBox(); +} + +InsertPosition Layouter::GetInsertPosition ( + const Point& rModelPosition, + const Size& rIndicatorSize, + model::SlideSorterModel const & rModel) const +{ + InsertPosition aPosition; + mpImplementation->CalculateLogicalInsertPosition( + rModelPosition, + aPosition); + mpImplementation->CalculateGeometricPosition( + aPosition, + rIndicatorSize, + GetColumnCount()==1, + rModel); + return aPosition; +} + +Range Layouter::GetValidHorizontalSizeRange() const +{ + return mpImplementation->GetValidHorizontalSizeRange(); +} + +Range Layouter::GetValidVerticalSizeRange() const +{ + return mpImplementation->GetValidVerticalSizeRange(); +} + +Range Layouter::GetRangeOfVisiblePageObjects (const ::tools::Rectangle& aVisibleArea) const +{ + return mpImplementation->GetRangeOfVisiblePageObjects(aVisibleArea); +} + +sal_Int32 Layouter::GetIndexAtPoint ( + const Point& rPosition, + const bool bIncludePageBorders, + const bool bClampToValidRange) const +{ + const sal_Int32 nRow ( + mpImplementation->GetRowAtPosition ( + rPosition.Y(), + bIncludePageBorders, + bIncludePageBorders ? Implementation::GM_PAGE_BORDER : Implementation::GM_NONE)); + const sal_Int32 nColumn ( + mpImplementation->GetColumnAtPosition ( + rPosition.X(), + bIncludePageBorders, + bIncludePageBorders ? Implementation::GM_PAGE_BORDER : Implementation::GM_NONE)); + + return mpImplementation->GetIndex(nRow,nColumn,bClampToValidRange); +} + +//===== Layouter::Implementation ============================================== + +Layouter::Implementation* Layouter::Implementation::Create ( + const Implementation& rImplementation, + const Layouter::Orientation eOrientation) +{ + switch (eOrientation) + { + case HORIZONTAL: return new HorizontalImplementation(rImplementation); + case VERTICAL: return new VerticalImplementation(rImplementation); + case GRID: + default: return new GridImplementation(rImplementation); + } +} + +Layouter::Implementation::Implementation ( + sd::Window *pWindow, + std::shared_ptr pTheme) + : mpWindow(pWindow), + mnLeftBorder(5), + mnRightBorder(5), + mnTopBorder(5), + mnBottomBorder(5), + maMinimalSize(132,98), + maPreferredSize(200,150), + maMaximalSize(600,400), + mnMinimalColumnCount(1), + mnMaximalColumnCount(15), + mnPageCount(0), + mnColumnCount(1), + mnRowCount(0), + mnMaxColumnCount(0), + mnMaxRowCount(0), + maPageObjectSize(1,1), + mpTheme(std::move(pTheme)) +{ +} + +Layouter::Implementation::Implementation (const Implementation& rImplementation) + : mpWindow(rImplementation.mpWindow), + mnLeftBorder(rImplementation.mnLeftBorder), + mnRightBorder(rImplementation.mnRightBorder), + mnTopBorder(rImplementation.mnTopBorder), + mnBottomBorder(rImplementation.mnBottomBorder), + maMinimalSize(rImplementation.maMinimalSize), + maPreferredSize(rImplementation.maPreferredSize), + maMaximalSize(rImplementation.maMaximalSize), + mnMinimalColumnCount(rImplementation.mnMinimalColumnCount), + mnMaximalColumnCount(rImplementation.mnMaximalColumnCount), + mnPageCount(rImplementation.mnPageCount), + mnColumnCount(rImplementation.mnColumnCount), + mnRowCount(rImplementation.mnRowCount), + mnMaxColumnCount(rImplementation.mnMaxColumnCount), + mnMaxRowCount(rImplementation.mnMaxRowCount), + maPageObjectSize(rImplementation.maPageObjectSize), + mpTheme(rImplementation.mpTheme) +{ +} + +Layouter::Implementation::~Implementation() +{ +} + +bool Layouter::Implementation::Rearrange ( + const Size& rWindowSize, + const Size& rPreviewModelSize, + const sal_uInt32 nPageCount) +{ + mnPageCount = nPageCount; + + // Return early when the window or the model have not yet been initialized. + if (rWindowSize.IsEmpty()) + return false; + if (rPreviewModelSize.IsEmpty()) + return false; + + CalculateRowAndColumnCount(rWindowSize); + + // Update the border values. + mnLeftBorder = mnRequestedLeftBorder; + mnTopBorder = mnRequestedTopBorder; + mnRightBorder = mnRequestedRightBorder; + mnBottomBorder = mnRequestedBottomBorder; + if (mnColumnCount > 1) + { + int nMinimumBorderWidth = gnHorizontalGap/2; + if (mnLeftBorder < nMinimumBorderWidth) + mnLeftBorder = nMinimumBorderWidth; + if (mnRightBorder < nMinimumBorderWidth) + mnRightBorder = nMinimumBorderWidth; + } + else + { + int nMinimumBorderHeight = gnVerticalGap/2; + if (mnTopBorder < nMinimumBorderHeight) + mnTopBorder = nMinimumBorderHeight; + if (mnBottomBorder < nMinimumBorderHeight) + mnBottomBorder = nMinimumBorderHeight; + } + + mpPageObjectLayouter = + std::make_shared( + CalculateTargetSize(rWindowSize), + rPreviewModelSize, + mpWindow, + mnPageCount); + + maPageObjectSize = mpPageObjectLayouter->GetGridMaxSize(); + + CalculateMaxRowAndColumnCount(rWindowSize); + + return true; +} + +sal_Int32 Layouter::Implementation::GetRowAtPosition ( + sal_Int32 nYPosition, + bool bIncludeBordersAndGaps, + GapMembership eGapMembership) const +{ + sal_Int32 nRow = -1; + + const sal_Int32 nY = nYPosition - mnTopBorder; + if (nY >= 0) + { + // Vertical distance from one row to the next. + const sal_Int32 nRowOffset (maPageObjectSize.Height() + gnVerticalGap); + + // Calculate row consisting of page objects and gap below. + nRow = nY / nRowOffset; + + const sal_Int32 nDistanceIntoGap ((nY - nRow*nRowOffset) - maPageObjectSize.Height()); + // When inside the gap below then nYPosition is not over a page + // object. + if (nDistanceIntoGap > 0) + { + sal_Int32 nResolvedRow = ResolvePositionInGap( + nDistanceIntoGap, + eGapMembership, + nRow, + gnVerticalGap); + if (!bIncludeBordersAndGaps || nResolvedRow != -1) + nRow = nResolvedRow; + } + } + else if (bIncludeBordersAndGaps) + { + // We are in the top border area. Set nRow to the first row when + // the top border shall be considered to belong to the first row. + nRow = 0; + } + + return nRow; +} + +sal_Int32 Layouter::Implementation::GetColumnAtPosition ( + sal_Int32 nXPosition, + bool bIncludeBordersAndGaps, + GapMembership eGapMembership) const +{ + sal_Int32 nColumn = -1; + + sal_Int32 nX = nXPosition - mnLeftBorder; + if (nX >= 0) + { + // Horizontal distance from one column to the next. + const sal_Int32 nColumnOffset (maPageObjectSize.Width() + gnHorizontalGap); + + // Calculate row consisting of page objects and gap below. + nColumn = nX / nColumnOffset; + if (nColumn < 0) + nColumn = 0; + else if (nColumn >= mnColumnCount) + nColumn = mnColumnCount-1; + + const sal_Int32 nDistanceIntoGap ((nX - nColumn*nColumnOffset) - maPageObjectSize.Width()); + // When inside the gap at the right then nXPosition is not over a + // page object. + if (nDistanceIntoGap > 0) + { + sal_Int32 nResolvedColumn = ResolvePositionInGap( + nDistanceIntoGap, + eGapMembership, + nColumn, + gnHorizontalGap); + if (!bIncludeBordersAndGaps || nResolvedColumn != -1) + nColumn = nResolvedColumn; + } + } + else if (bIncludeBordersAndGaps) + { + // We are in the left border area. Set nColumn to the first column + // when the left border shall be considered to belong to the first + // column. + nColumn = 0; + } + return nColumn; +} + +sal_Int32 Layouter::Implementation::ResolvePositionInGap ( + sal_Int32 nDistanceIntoGap, + GapMembership eGapMembership, + sal_Int32 nIndex, + sal_Int32 nGap) +{ + switch (eGapMembership) + { + case GM_NONE: + // The gap is no man's land. + nIndex = -1; + break; + + case GM_BOTH: + { + // The lower half of the gap belongs to the next row or column. + sal_Int32 nFirstHalfGapWidth = nGap / 2; + if (nDistanceIntoGap > nFirstHalfGapWidth) + nIndex ++; + break; + } + + case GM_PREVIOUS: + // Row or column already at correct value. + break; + + case GM_NEXT: + // The complete gap belongs to the next row or column. + nIndex ++; + break; + + case GM_PAGE_BORDER: + if (nDistanceIntoGap > 0) + { + if (nDistanceIntoGap > nGap) + { + // Inside the border of the next row or column. + nIndex ++; + } + else + { + // Inside the gap between the page borders. + nIndex = -1; + } + } + break; + + default: + nIndex = -1; + } + + return nIndex; +} + +void Layouter::Implementation::CalculateGeometricPosition ( + InsertPosition& rPosition, + const Size& rIndicatorSize, + const bool bIsVertical, + model::SlideSorterModel const & rModel) const +{ + // 1. Determine right/bottom of the leading page and the left/top of the + // trailing page object and how to distribute the missing space. + sal_Int32 nLeadingLocation (0); + sal_Int32 nTrailingLocation (0); + bool bIsLeadingFixed (false); + bool bIsTrailingFixed (false); + sal_Int32 nSecondaryLocation (0); + const sal_Int32 nIndex (rPosition.GetIndex()); + + if (rPosition.IsAtRunStart()) + { + // Place indicator at the top of the column. + const ::tools::Rectangle aOuterBox (GetPageObjectBox(nIndex)); + const ::tools::Rectangle aInnerBox (GetInnerBoundingBox(rModel, nIndex)); + if (bIsVertical) + { + nLeadingLocation = aOuterBox.Top(); + nTrailingLocation = aInnerBox.Top(); + nSecondaryLocation = aInnerBox.Center().X(); + } + else + { + nLeadingLocation = aOuterBox.Left(); + nTrailingLocation = aInnerBox.Left(); + nSecondaryLocation = aInnerBox.Center().Y(); + } + bIsLeadingFixed = true; + } + else if (rPosition.IsAtRunEnd()) + { + // Place indicator at the bottom/right of the column/row. + + const ::tools::Rectangle aOuterBox (GetPageObjectBox(nIndex-1)); + const ::tools::Rectangle aInnerBox (GetInnerBoundingBox(rModel, nIndex-1)); + if (bIsVertical) + { + nLeadingLocation = aInnerBox.Bottom(); + nTrailingLocation = aOuterBox.Bottom(); + nSecondaryLocation = aInnerBox.Center().X(); + } + else + { + nLeadingLocation = aInnerBox.Right(); + nTrailingLocation = aOuterBox.Right(); + nSecondaryLocation = aInnerBox.Center().Y(); + } + bIsTrailingFixed = true; + if ( ! rPosition.IsExtraSpaceNeeded()) + bIsLeadingFixed = true; + } + else + { + // Place indicator between two rows/columns. + const ::tools::Rectangle aBox1 (GetInnerBoundingBox(rModel, nIndex-1)); + const ::tools::Rectangle aBox2 (GetInnerBoundingBox(rModel, nIndex)); + if (bIsVertical) + { + nLeadingLocation = aBox1.Bottom(); + nTrailingLocation = aBox2.Top(); + nSecondaryLocation = (aBox1.Center().X() + aBox2.Center().X()) / 2; + } + else + { + nLeadingLocation = aBox1.Right(); + nTrailingLocation = aBox2.Left(); + nSecondaryLocation = (aBox1.Center().Y() + aBox2.Center().Y()) / 2; + } + } + + // 2. Calculate the location of the insert indicator and the offsets of + // leading and trailing pages. + const sal_Int32 nAvailableSpace (nTrailingLocation - nLeadingLocation); + const sal_Int32 nRequiredSpace (bIsVertical ? rIndicatorSize.Height():rIndicatorSize.Width()); + const sal_Int32 nMissingSpace (::std::max(sal_Int32(0), nRequiredSpace - nAvailableSpace)); + sal_Int32 nPrimaryLocation (0); + sal_Int32 nLeadingOffset (0); + sal_Int32 nTrailingOffset (0); + if (bIsLeadingFixed) + { + nPrimaryLocation = nLeadingLocation + nRequiredSpace/2; + if ( ! bIsTrailingFixed) + nTrailingOffset = nMissingSpace; + } + else if (bIsTrailingFixed) + { + nPrimaryLocation = nTrailingLocation - nRequiredSpace/2; + nLeadingOffset = -nMissingSpace; + } + else + { + nPrimaryLocation = (nLeadingLocation + nTrailingLocation) /2; + nLeadingOffset = -nMissingSpace/2; + nTrailingOffset = nMissingSpace + nLeadingOffset; + } + + if (bIsVertical) + { + rPosition.SetGeometricalPosition( + Point(nSecondaryLocation, nPrimaryLocation), + Point(0, nLeadingOffset), + Point(0, nTrailingOffset)); + } + else + { + rPosition.SetGeometricalPosition( + Point(nPrimaryLocation, nSecondaryLocation), + Point(nLeadingOffset, 0), + Point(nTrailingOffset, 0)); + } +} + +::tools::Rectangle Layouter::Implementation::GetInnerBoundingBox ( + model::SlideSorterModel const & rModel, + const sal_Int32 nIndex) const +{ + model::SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex)); + if ( ! pDescriptor) + return ::tools::Rectangle(); + + PageObjectLayouter::Part ePart = PageObjectLayouter::Part::Preview; + + if (pDescriptor->HasState(model::PageDescriptor::ST_Selected)) + ePart = PageObjectLayouter::Part::PageObject; + + return mpPageObjectLayouter->GetBoundingBox( + pDescriptor, ePart, + PageObjectLayouter::ModelCoordinateSystem, true); +} + +Range Layouter::Implementation::GetValidHorizontalSizeRange() const +{ + return Range( + mnLeftBorder + maMinimalSize.Width() + mnRightBorder, + mnLeftBorder + maMaximalSize.Width() + mnRightBorder); +} + +Range Layouter::Implementation::GetValidVerticalSizeRange() const +{ + return Range( + mnTopBorder + maMinimalSize.Height() + mnBottomBorder, + mnTopBorder + maMaximalSize.Height() + mnBottomBorder); +} + +Range Layouter::Implementation::GetRangeOfVisiblePageObjects (const ::tools::Rectangle& aVisibleArea) const +{ + // technically that's not empty, but it's the default, so... + if (aVisibleArea.IsEmpty()) + return Range(-1, -1); + + const sal_Int32 nRow0 (GetRowAtPosition(aVisibleArea.Top(), true, GM_NEXT)); + const sal_Int32 nCol0 (GetColumnAtPosition(aVisibleArea.Left(),true, GM_NEXT)); + const sal_Int32 nRow1 (GetRowAtPosition(aVisibleArea.Bottom(), true, GM_PREVIOUS)); + const sal_Int32 nCol1 (GetColumnAtPosition(aVisibleArea.Right(), true, GM_PREVIOUS)); + + // When start and end lie in different rows then the range may include + // slides outside (left or right of) the given area. + return Range(GetIndex(nRow0,nCol0,true), GetIndex(nRow1,nCol1,true)); +} + +Size Layouter::Implementation::GetTargetSize ( + const Size& rWindowSize, + const bool bCalculateWidth, + const bool bCalculateHeight) const +{ + if (mnColumnCount<=0 || mnRowCount<=0) + return maPreferredSize; + if ( ! (bCalculateWidth || bCalculateHeight)) + { + OSL_ASSERT(bCalculateWidth || bCalculateHeight); + return maPreferredSize; + } + + // Calculate the width of each page object. + Size aTargetSize (0,0); + if (bCalculateWidth) + aTargetSize.setWidth( + (rWindowSize.Width() - mnLeftBorder - mnRightBorder + - (mnColumnCount-1) * gnHorizontalGap) + / mnColumnCount); + else if (bCalculateHeight) + aTargetSize.setHeight( + (rWindowSize.Height() - mnTopBorder - mnBottomBorder + - (mnRowCount-1) * gnVerticalGap) + / mnRowCount); + + if (bCalculateWidth) + { + if (aTargetSize.Width() < maMinimalSize.Width()) + aTargetSize.setWidth(maMinimalSize.Width()); + else if (aTargetSize.Width() > maMaximalSize.Width()) + aTargetSize.setWidth(maMaximalSize.Width()); + } + else if (bCalculateHeight) + { + if (aTargetSize.Height() < maMinimalSize.Height()) + aTargetSize.setHeight(maMinimalSize.Height()); + else if (aTargetSize.Height() > maMaximalSize.Height()) + aTargetSize.setHeight(maMaximalSize.Height()); + } + + return aTargetSize; +} + +sal_Int32 Layouter::Implementation::GetIndex ( + const sal_Int32 nRow, + const sal_Int32 nColumn, + const bool bClampToValidRange) const +{ + if (nRow >= 0 && nColumn >= 0) + { + const sal_Int32 nIndex (nRow * mnColumnCount + nColumn); + if (nIndex >= mnPageCount) + if (bClampToValidRange) + return mnPageCount-1; + else + return -1; + else + return nIndex; + } + else if (bClampToValidRange) + return 0; + else + return -1; +} + +::tools::Rectangle Layouter::Implementation::GetPageObjectBox ( + const sal_Int32 nIndex, + const bool bIncludeBorderAndGap) const +{ + const sal_Int32 nRow (nIndex / mnColumnCount); + const sal_Int32 nColumn (nIndex % mnColumnCount); + + const ::tools::Rectangle aBoundingBox (GetPageObjectBox(nRow,nColumn)); + if (bIncludeBorderAndGap) + return AddBorderAndGap(aBoundingBox, nRow, nColumn); + else + return aBoundingBox; +} + +::tools::Rectangle Layouter::Implementation::GetPageObjectBox ( + const sal_Int32 nRow, + const sal_Int32 nColumn) const +{ + return ::tools::Rectangle( + Point (mnLeftBorder + + nColumn * maPageObjectSize.Width() + + std::max(nColumn,0) * gnHorizontalGap, + mnTopBorder + + nRow * maPageObjectSize.Height() + + std::max(nRow,0) * gnVerticalGap), + maPageObjectSize); +} + +::tools::Rectangle Layouter::Implementation::AddBorderAndGap ( + const ::tools::Rectangle& rBoundingBox, + const sal_Int32 nRow, + const sal_Int32 nColumn) const +{ + ::tools::Rectangle aBoundingBox (rBoundingBox); + + if (nColumn == 0) + aBoundingBox.SetLeft( 0 ); + else + aBoundingBox.AdjustLeft( -(gnHorizontalGap/2) ); + if (nColumn == mnColumnCount-1) + aBoundingBox.AdjustRight(mnRightBorder ); + else + aBoundingBox.AdjustRight(gnHorizontalGap/2 ); + if (nRow == 0) + aBoundingBox.SetTop( 0 ); + else + aBoundingBox.AdjustTop( -(gnVerticalGap/2) ); + if (nRow == mnRowCount-1) + aBoundingBox.AdjustBottom(mnBottomBorder ); + else + aBoundingBox.AdjustBottom(gnVerticalGap/2 ); + return aBoundingBox; +} + +::tools::Rectangle Layouter::Implementation::GetTotalBoundingBox() const +{ + sal_Int32 nHorizontalSize = 0; + sal_Int32 nVerticalSize = 0; + if (mnColumnCount > 0) + { + sal_Int32 nRowCount = (mnPageCount+mnColumnCount-1) / mnColumnCount; + nHorizontalSize = + mnLeftBorder + + mnRightBorder + + mnColumnCount * maPageObjectSize.Width(); + if (mnColumnCount > 1) + nHorizontalSize += (mnColumnCount-1) * gnHorizontalGap; + nVerticalSize = + mnTopBorder + + mnBottomBorder + + nRowCount * maPageObjectSize.Height(); + if (nRowCount > 1) + nVerticalSize += (nRowCount-1) * gnVerticalGap; + } + + return ::tools::Rectangle ( + Point(0,0), + Size (nHorizontalSize, nVerticalSize) + ); +} + +void Layouter::Implementation::CalculateVerticalLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const +{ + const sal_Int32 nY = rModelPosition.Y() - mnTopBorder + maPageObjectSize.Height()/2; + const sal_Int32 nRowHeight (maPageObjectSize.Height() + gnVerticalGap); + const sal_Int32 nRow (::std::min(mnPageCount, nY / nRowHeight)); + rPosition.SetLogicalPosition ( + nRow, + 0, + nRow, + (nRow == 0), + (nRow == mnRowCount), + (nRow >= mnMaxRowCount)); +} + +//===== HorizontalImplementation ================================================ + +HorizontalImplementation::HorizontalImplementation (const Implementation& rImplementation) + : Implementation(rImplementation) +{ +} + +Layouter::Orientation HorizontalImplementation::GetOrientation() const +{ + return Layouter::HORIZONTAL; +} + +void HorizontalImplementation::CalculateRowAndColumnCount (const Size&) +{ + // Row and column count are fixed (for a given page count.) + mnColumnCount = mnPageCount; + mnRowCount = 1; +} + +void HorizontalImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize) +{ + mnMaxColumnCount = (rWindowSize.Width() - mnLeftBorder - mnRightBorder) + / (maPageObjectSize.Width() + gnHorizontalGap); + mnMaxRowCount = 1; +} + +Size HorizontalImplementation::CalculateTargetSize ( + const Size& rWindowSize) const +{ + return Implementation::GetTargetSize(rWindowSize, false, true); +} + +void HorizontalImplementation::CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const +{ + const sal_Int32 nX = rModelPosition.X() - mnLeftBorder + maPageObjectSize.Width()/2; + const sal_Int32 nColumnWidth (maPageObjectSize.Width() + gnHorizontalGap); + const sal_Int32 nColumn (::std::min(mnPageCount, nX / nColumnWidth)); + rPosition.SetLogicalPosition ( + 0, + nColumn, + nColumn, + (nColumn == 0), + (nColumn == mnColumnCount), + (nColumn >= mnMaxColumnCount)); +} + +//===== VerticalImplementation ================================================ + +VerticalImplementation::VerticalImplementation (const Implementation& rImplementation) + : Implementation(rImplementation) +{ +} + +Layouter::Orientation VerticalImplementation::GetOrientation() const +{ + return Layouter::VERTICAL; +} + +void VerticalImplementation::CalculateRowAndColumnCount (const Size&) +{ + // Row and column count are fixed (for a given page count.) + mnRowCount = mnPageCount; + mnColumnCount = 1; + +} + +void VerticalImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize) +{ + mnMaxRowCount = (rWindowSize.Height() - mnTopBorder - mnBottomBorder) + / (maPageObjectSize.Height() + gnVerticalGap); + mnMaxColumnCount = 1; +} + +Size VerticalImplementation::CalculateTargetSize ( + const Size& rWindowSize) const +{ + return Implementation::GetTargetSize(rWindowSize, true, false); +} + +void VerticalImplementation::CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const +{ + return CalculateVerticalLogicalInsertPosition(rModelPosition, rPosition); +} + +//===== GridImplementation ================================================ + +GridImplementation::GridImplementation ( + sd::Window *pWindow, + const std::shared_ptr& rpTheme) + : Implementation(pWindow, rpTheme) +{ +} + +GridImplementation::GridImplementation (const Implementation& rImplementation) + : Implementation(rImplementation) +{ +} + +Layouter::Orientation GridImplementation::GetOrientation() const +{ + return Layouter::GRID; +} + +void GridImplementation::CalculateRowAndColumnCount (const Size& rWindowSize) +{ + // Calculate the column count. + mnColumnCount + = (rWindowSize.Width() - mnRequestedLeftBorder - mnRequestedRightBorder) + / (maPreferredSize.Width() + gnHorizontalGap); + if (mnColumnCount < mnMinimalColumnCount) + mnColumnCount = mnMinimalColumnCount; + if (mnColumnCount > mnMaximalColumnCount) + mnColumnCount = mnMaximalColumnCount; + mnRowCount = (mnPageCount + mnColumnCount-1)/mnColumnCount; +} + +void GridImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize) +{ + mnMaxColumnCount = (rWindowSize.Width() - mnLeftBorder - mnRightBorder) + / (maPageObjectSize.Width() + gnHorizontalGap); + mnMaxRowCount = (rWindowSize.Height() - mnTopBorder - mnBottomBorder) + / (maPageObjectSize.Height() + gnVerticalGap); +} + +Size GridImplementation::CalculateTargetSize ( + const Size& rWindowSize) const +{ + return Implementation::GetTargetSize(rWindowSize, true, true); +} + +void GridImplementation::CalculateLogicalInsertPosition ( + const Point& rModelPosition, + InsertPosition& rPosition) const +{ + if (mnColumnCount == 1) + { + CalculateVerticalLogicalInsertPosition(rModelPosition, rPosition); + } + else + { + // Handle the general case of more than one column. + sal_Int32 nRow (::std::min( + mnRowCount-1, + GetRowAtPosition (rModelPosition.Y(), true, GM_BOTH))); + const sal_Int32 nX = rModelPosition.X() - mnLeftBorder + maPageObjectSize.Width()/2; + const sal_Int32 nColumnWidth (maPageObjectSize.Width() + gnHorizontalGap); + sal_Int32 nColumn (::std::min(mnColumnCount, nX / nColumnWidth)); + sal_Int32 nIndex (nRow * mnColumnCount + nColumn); + bool bIsAtRunEnd (nColumn == mnColumnCount); + + if (nIndex >= mnPageCount) + { + nIndex = mnPageCount; + nRow = mnRowCount-1; + nColumn = ::std::min(::std::min(mnPageCount, mnColumnCount), nColumn); + bIsAtRunEnd = true; + } + + rPosition.SetLogicalPosition ( + nRow, + nColumn, + nIndex, + (nColumn == 0), + bIsAtRunEnd, + (nColumn >= mnMaxColumnCount)); + } +} + +//===== InsertPosition ======================================================== + +InsertPosition::InsertPosition() + : mnRow(-1), + mnColumn(-1), + mnIndex(-1), + mbIsAtRunStart(false), + mbIsAtRunEnd(false), + mbIsExtraSpaceNeeded(false), + maLocation(0,0), + maLeadingOffset(0,0), + maTrailingOffset(0,0) +{ +} + +bool InsertPosition::operator== (const InsertPosition& rInsertPosition) const +{ + // Do not compare the geometrical information (maLocation). + return mnRow==rInsertPosition.mnRow + && mnColumn==rInsertPosition.mnColumn + && mnIndex==rInsertPosition.mnIndex + && mbIsAtRunStart==rInsertPosition.mbIsAtRunStart + && mbIsAtRunEnd==rInsertPosition.mbIsAtRunEnd + && mbIsExtraSpaceNeeded==rInsertPosition.mbIsExtraSpaceNeeded; +} + +bool InsertPosition::operator!= (const InsertPosition& rInsertPosition) const +{ + return !operator==(rInsertPosition); +} + +void InsertPosition::SetLogicalPosition ( + const sal_Int32 nRow, + const sal_Int32 nColumn, + const sal_Int32 nIndex, + const bool bIsAtRunStart, + const bool bIsAtRunEnd, + const bool bIsExtraSpaceNeeded) +{ + mnRow = nRow; + mnColumn = nColumn; + mnIndex = nIndex; + mbIsAtRunStart = bIsAtRunStart; + mbIsAtRunEnd = bIsAtRunEnd; + mbIsExtraSpaceNeeded = bIsExtraSpaceNeeded; +} + +void InsertPosition::SetGeometricalPosition( + const Point& rLocation, + const Point& rLeadingOffset, + const Point& rTrailingOffset) +{ + maLocation = rLocation; + maLeadingOffset = rLeadingOffset; + maTrailingOffset = rTrailingOffset; +} + +} // end of namespace ::sd::slidesorter::namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx new file mode 100644 index 0000000000..b26eb0746f --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx @@ -0,0 +1,259 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include + +#include +#include + +namespace sd::slidesorter::view { + +namespace { +const sal_Int32 gnLeftPageNumberOffset = 2; +const sal_Int32 gnRightPageNumberOffset = 5; +const sal_Int32 gnOuterBorderWidth = 5; +const sal_Int32 gnInfoAreaMinWidth = 26; +} + +PageObjectLayouter::PageObjectLayouter ( + const Size& rPageObjectWindowSize, + const Size& rPageSize, + sd::Window *pWindow, + const sal_Int32 nPageCount) + : mpWindow(pWindow), + maTransitionEffectIcon(IconCache::Instance().GetIcon(BMP_FADE_EFFECT_INDICATOR)), + maCustomAnimationEffectIcon(IconCache::Instance().GetIcon(BMP_CUSTOM_ANIMATION_INDICATOR)), + mpPageNumberFont(Theme::GetFont(Theme::Font_PageNumber, *pWindow->GetOutDev())) +{ + const Size aPageNumberAreaSize (GetPageNumberAreaSize(nPageCount)); + + const int nMaximumBorderWidth (gnOuterBorderWidth); + const int nFocusIndicatorWidth (Theme_FocusIndicatorWidth); + + Size aPageObjectSize(rPageObjectWindowSize.Width(), rPageObjectWindowSize.Height()); + maPreviewBoundingBox = CalculatePreviewBoundingBox( + aPageObjectSize, + Size(rPageSize.Width(), rPageSize.Height()), + aPageNumberAreaSize.Width(), + nFocusIndicatorWidth); + maFocusIndicatorBoundingBox = ::tools::Rectangle(Point(0,0), aPageObjectSize); + maPageObjectBoundingBox = ::tools::Rectangle( + Point( + nFocusIndicatorWidth, + nFocusIndicatorWidth), + Size( + aPageObjectSize.Width()-2*nFocusIndicatorWidth, + aPageObjectSize.Height()-2*nFocusIndicatorWidth)); + + maPageNumberAreaBoundingBox = ::tools::Rectangle( + Point( + std::max(gnLeftPageNumberOffset, + sal_Int32(maPreviewBoundingBox.Left() + - gnRightPageNumberOffset + - aPageNumberAreaSize.Width())), + nMaximumBorderWidth), + aPageNumberAreaSize); + + const Size aIconSize (maTransitionEffectIcon.GetSizePixel()); + maTransitionEffectBoundingBox = ::tools::Rectangle( + Point( + (maPreviewBoundingBox.Left() - 2*aIconSize.Width()) / 2, + maPreviewBoundingBox.Bottom() - aIconSize.Height()), + aIconSize); + maCustomAnimationEffectBoundingBox = ::tools::Rectangle( + Point( + (maPreviewBoundingBox.Left() - 2*aIconSize.Width()) / 2, + maPreviewBoundingBox.Bottom() - 2*aIconSize.Height()), + aIconSize); +} + +PageObjectLayouter::~PageObjectLayouter() +{ +} + +::tools::Rectangle PageObjectLayouter::CalculatePreviewBoundingBox ( + Size& rPageObjectSize, + const Size& rPageSize, + const sal_Int32 nPageNumberAreaWidth, + const sal_Int32 nFocusIndicatorWidth) +{ + const sal_Int32 nIconWidth (maTransitionEffectIcon.GetSizePixel().Width()); + const sal_Int32 nLeftAreaWidth ( + ::std::max( + gnInfoAreaMinWidth, + gnRightPageNumberOffset + + ::std::max( + nPageNumberAreaWidth, + nIconWidth))); + sal_Int32 nPreviewWidth; + sal_Int32 nPreviewHeight; + const double nPageAspectRatio (double(rPageSize.Width()) / double(rPageSize.Height())); + if (rPageObjectSize.Height() == 0) + { + // Calculate height so that the preview fills the available + // horizontal space completely while observing the aspect ratio of + // the preview. + nPreviewWidth = rPageObjectSize.Width() + - nLeftAreaWidth - gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1; + nPreviewHeight = ::basegfx::fround(nPreviewWidth / nPageAspectRatio); + rPageObjectSize.setHeight(nPreviewHeight + 2*gnOuterBorderWidth + 2*nFocusIndicatorWidth + 1); + } + else if (rPageObjectSize.Width() == 0) + { + // Calculate the width of the page object so that the preview fills + // the available vertical space completely while observing the + // aspect ratio of the preview. + nPreviewHeight = rPageObjectSize.Height() - 2*gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1; + nPreviewWidth = ::basegfx::fround(nPreviewHeight * nPageAspectRatio); + rPageObjectSize.setWidth(nPreviewWidth + + nLeftAreaWidth + gnOuterBorderWidth + 2*nFocusIndicatorWidth + 1); + + } + else + { + // The size of the page object is given. Calculate the size of the + // preview. + nPreviewWidth = rPageObjectSize.Width() + - nLeftAreaWidth - gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1; + nPreviewHeight = rPageObjectSize.Height() + - gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1; + if (double(nPreviewWidth)/double(nPreviewHeight) > nPageAspectRatio) + nPreviewWidth = ::basegfx::fround(nPreviewHeight * nPageAspectRatio); + else + nPreviewHeight = ::basegfx::fround(nPreviewWidth / nPageAspectRatio); + } + // When the preview does not fill the available space completely then + // place it flush right and vertically centered. + const int nLeft (rPageObjectSize.Width() + - gnOuterBorderWidth - nPreviewWidth - nFocusIndicatorWidth - 1); + const int nTop ((rPageObjectSize.Height() - nPreviewHeight)/2); + return ::tools::Rectangle( + nLeft, + nTop, + nLeft + nPreviewWidth, + nTop + nPreviewHeight); +} + +::tools::Rectangle PageObjectLayouter::GetBoundingBox ( + const model::SharedPageDescriptor& rpPageDescriptor, + const Part ePart, + const CoordinateSystem eCoordinateSystem, + bool bIgnoreLocation) +{ + OSL_ASSERT(rpPageDescriptor); + Point aLocation(0,0); + if (rpPageDescriptor) + aLocation = rpPageDescriptor->GetLocation( bIgnoreLocation ); + return GetBoundingBox(aLocation, ePart, eCoordinateSystem); +} + +::tools::Rectangle PageObjectLayouter::GetBoundingBox ( + const Point& rPageObjectLocation, + const Part ePart, + const CoordinateSystem eCoordinateSystem) +{ + ::tools::Rectangle aBoundingBox; + switch (ePart) + { + case Part::FocusIndicator: + aBoundingBox = maFocusIndicatorBoundingBox; + break; + + case Part::PageObject: + aBoundingBox = maPageObjectBoundingBox; + break; + + case Part::Preview: + aBoundingBox = maPreviewBoundingBox; + break; + + case Part::PageNumber: + aBoundingBox = maPageNumberAreaBoundingBox; + break; + + case Part::TransitionEffectIndicator: + aBoundingBox = maTransitionEffectBoundingBox; + break; + case Part::CustomAnimationEffectIndicator: + aBoundingBox = maCustomAnimationEffectBoundingBox; + break; + } + + // Adapt coordinates to the requested coordinate system. + Point aLocation (rPageObjectLocation); + if (eCoordinateSystem == WindowCoordinateSystem) + aLocation += mpWindow->GetMapMode().GetOrigin(); + + return ::tools::Rectangle( + aBoundingBox.TopLeft() + aLocation, + aBoundingBox.BottomRight() + aLocation); +} + +Size PageObjectLayouter::GetPreviewSize () +{ + return GetBoundingBox(Point(0,0), PageObjectLayouter::Part::Preview, + WindowCoordinateSystem).GetSize(); +} + +Size PageObjectLayouter::GetGridMaxSize() +{ + return GetBoundingBox(Point(0,0), PageObjectLayouter::Part::FocusIndicator, + WindowCoordinateSystem).GetSize(); +} + +Size PageObjectLayouter::GetPageNumberAreaSize (const int nPageCount) +{ + OSL_ASSERT(mpWindow); + + // Set the correct font. + vcl::Font aOriginalFont (mpWindow->GetFont()); + if (mpPageNumberFont) + mpWindow->SetFont(*mpPageNumberFont); + + OUString sPageNumberTemplate; + if (nPageCount < 10) + sPageNumberTemplate = "9"; + else if (nPageCount < 100) + sPageNumberTemplate = "99"; + else if (nPageCount < 200) + // Just for the case that 1 is narrower than 9. + sPageNumberTemplate = "199"; + else if (nPageCount < 1000) + sPageNumberTemplate = "999"; + else + sPageNumberTemplate = "9999"; + // More than 9999 pages are not handled. + + const Size aSize ( + mpWindow->GetTextWidth(sPageNumberTemplate), + mpWindow->GetTextHeight()); + + mpWindow->SetFont(aOriginalFont); + + return aSize; +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx new file mode 100644 index 0000000000..26131a8cd9 --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx @@ -0,0 +1,442 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include "SlsFramePainter.hxx" +#include +#include +#include +#include +#include +#include +#include + +using namespace ::drawinglayer::primitive2d; + +namespace sd::slidesorter::view { + +//===== PageObjectPainter ===================================================== + +PageObjectPainter::PageObjectPainter ( + const SlideSorter& rSlideSorter) + : mrLayouter(rSlideSorter.GetView().GetLayouter()), + mpCache(rSlideSorter.GetView().GetPreviewCache()), + mpTheme(rSlideSorter.GetTheme()), + mpPageNumberFont(Theme::GetFont(Theme::Font_PageNumber, *rSlideSorter.GetContentWindow()->GetOutDev())), + mpShadowPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_RawShadow))), + mpFocusBorderPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_FocusBorder))) +{ + // Replace the color (not the alpha values) in the focus border with a + // color derived from the current selection color. + Color aColor (mpTheme->GetColor(Theme::Color_Selection)); + sal_uInt16 nHue, nSat, nBri; + aColor.RGBtoHSB(nHue, nSat, nBri); + aColor = Color::HSBtoRGB(nHue, 28, 65); + mpFocusBorderPainter->AdaptColor(aColor); +} + +PageObjectPainter::~PageObjectPainter() +{ +} + +void PageObjectPainter::PaintPageObject ( + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) +{ + if (!UpdatePageObjectLayouter()) + return; + + PageObjectLayouter *pPageObjectLayouter = mrLayouter.GetPageObjectLayouter().get(); + // Turn off antialiasing to avoid the bitmaps from being + // shifted by fractions of a pixel and thus show blurry edges. + const AntialiasingFlags nSavedAntialiasingMode (rDevice.GetAntialiasing()); + rDevice.SetAntialiasing(nSavedAntialiasingMode & ~AntialiasingFlags::Enable); + + PaintBackground(pPageObjectLayouter, rDevice, rpDescriptor); + PaintPreview(pPageObjectLayouter, rDevice, rpDescriptor); + PaintPageNumber(pPageObjectLayouter, rDevice, rpDescriptor); + PaintTransitionEffect(pPageObjectLayouter, rDevice, rpDescriptor); + if (rpDescriptor->GetPage()->hasAnimationNode()) + PaintCustomAnimationEffect(pPageObjectLayouter, rDevice, rpDescriptor); + rDevice.SetAntialiasing(nSavedAntialiasingMode); +} + +bool PageObjectPainter::UpdatePageObjectLayouter() +{ + // The page object layouter is quite volatile. It may have been replaced + // since the last call. Update it now. + PageObjectLayouter *pPageObjectLayouter = mrLayouter.GetPageObjectLayouter().get(); + if ( ! pPageObjectLayouter) + { + OSL_FAIL("no page object layouter"); + return false; + } + + return true; +} + +void PageObjectPainter::SetTheme (const std::shared_ptr& rpTheme) +{ + mpTheme = rpTheme; +} + +void PageObjectPainter::PaintBackground ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const +{ + PaintBackgroundDetail(pPageObjectLayouter, rDevice, rpDescriptor); + + // Fill the interior of the preview area with the default background + // color of the page. + SdPage* pPage = rpDescriptor->GetPage(); + if (pPage != nullptr) + { + rDevice.SetFillColor(pPage->GetPageBackgroundColor(nullptr)); + rDevice.SetLineColor(pPage->GetPageBackgroundColor(nullptr)); + const ::tools::Rectangle aPreviewBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::Preview, + PageObjectLayouter::ModelCoordinateSystem)); + rDevice.DrawRect(aPreviewBox); + } +} + +void PageObjectPainter::PaintPreview ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const +{ + const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::Preview, + PageObjectLayouter::ModelCoordinateSystem)); + + if (mpCache == nullptr) + return; + + const SdrPage* pPage = rpDescriptor->GetPage(); + mpCache->SetPreciousFlag(pPage, true); + + const BitmapEx aPreview (GetPreviewBitmap(rpDescriptor, &rDevice)); + if ( ! aPreview.IsEmpty()) + { + if (aPreview.GetSizePixel() != aBox.GetSize()) + rDevice.DrawBitmapEx(aBox.TopLeft(), aBox.GetSize(), aPreview); + else + rDevice.DrawBitmapEx(aBox.TopLeft(), aPreview); + } +} + +BitmapEx PageObjectPainter::CreateMarkedPreview ( + const Size& rSize, + const BitmapEx& rPreview, + const BitmapEx& rOverlay, + const OutputDevice* pReferenceDevice) +{ + ScopedVclPtr pDevice; + if (pReferenceDevice != nullptr) + pDevice.disposeAndReset(VclPtr::Create(*pReferenceDevice)); + else + pDevice.disposeAndReset(VclPtr::Create()); + pDevice->SetOutputSizePixel(rSize); + + pDevice->DrawBitmapEx(Point(0,0), rSize, rPreview); + + // Paint bitmap tiled over the preview to mark it as excluded. + const sal_Int32 nIconWidth (rOverlay.GetSizePixel().Width()); + const sal_Int32 nIconHeight (rOverlay.GetSizePixel().Height()); + if (nIconWidth>0 && nIconHeight>0) + { + for (::tools::Long nX=0; nXDrawBitmapEx(Point(nX,nY), rOverlay); + } + return pDevice->GetBitmapEx(Point(0,0), rSize); +} + +BitmapEx PageObjectPainter::GetPreviewBitmap ( + const model::SharedPageDescriptor& rpDescriptor, + const OutputDevice* pReferenceDevice) const +{ + const SdrPage* pPage = rpDescriptor->GetPage(); + const bool bIsExcluded (rpDescriptor->HasState(model::PageDescriptor::ST_Excluded)); + + if (bIsExcluded) + { + PageObjectLayouter *pPageObjectLayouter = mrLayouter.GetPageObjectLayouter().get(); + + BitmapEx aMarkedPreview (mpCache->GetMarkedPreviewBitmap(pPage)); + const ::tools::Rectangle aPreviewBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::Preview, + PageObjectLayouter::ModelCoordinateSystem)); + if (aMarkedPreview.IsEmpty() || aMarkedPreview.GetSizePixel()!=aPreviewBox.GetSize()) + { + aMarkedPreview = CreateMarkedPreview( + aPreviewBox.GetSize(), + mpCache->GetPreviewBitmap(pPage,true), + mpTheme->GetIcon(Theme::Icon_HideSlideOverlay), + pReferenceDevice); + mpCache->SetMarkedPreviewBitmap(pPage, aMarkedPreview); + } + return aMarkedPreview; + } + else + { + return mpCache->GetPreviewBitmap(pPage,false); + } +} + +void PageObjectPainter::PaintPageNumber ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const +{ + const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::PageNumber, + PageObjectLayouter::ModelCoordinateSystem)); + + // Determine the color of the page number. + Color aPageNumberColor (mpTheme->GetColor(Theme::Color_PageNumberDefault)); + if (rpDescriptor->HasState(model::PageDescriptor::ST_MouseOver) || + rpDescriptor->HasState(model::PageDescriptor::ST_Selected)) + { + // Page number is painted on background for hover or selection or + // both. Each of these background colors has a predefined luminance + // which is compatible with the PageNumberHover color. + aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberHover); + } + else + { + const Color aBackgroundColor (mpTheme->GetColor(Theme::Color_Background)); + const sal_Int32 nBackgroundLuminance (aBackgroundColor.GetLuminance()); + // When the background color is black then this is interpreted as + // high contrast mode and the font color is set to white. + if (nBackgroundLuminance == 0) + aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberHighContrast); + else + { + // Compare luminance of default page number color and background + // color. When the two are similar then use a darker + // (preferred) or brighter font color. + const sal_Int32 nFontLuminance (aPageNumberColor.GetLuminance()); + if (abs(nBackgroundLuminance - nFontLuminance) < 60) + { + if (nBackgroundLuminance > nFontLuminance-30) + aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberBrightBackground); + else + aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberDarkBackground); + } + } + } + + // Paint the page number. + OSL_ASSERT(rpDescriptor->GetPage()!=nullptr); + const sal_Int32 nPageNumber ((rpDescriptor->GetPage()->GetPageNum() - 1) / 2 + 1); + const OUString sPageNumber(OUString::number(nPageNumber)); + rDevice.SetFont(*mpPageNumberFont); + rDevice.SetTextColor(aPageNumberColor); + rDevice.DrawText(aBox, sPageNumber, DrawTextFlags::Right | DrawTextFlags::VCenter); +} + +void PageObjectPainter::PaintTransitionEffect ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) +{ + const SdPage* pPage = rpDescriptor->GetPage(); + if (pPage!=nullptr && pPage->getTransitionType() > 0) + { + const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::TransitionEffectIndicator, + PageObjectLayouter::ModelCoordinateSystem)); + + rDevice.DrawBitmapEx( + aBox.TopCenter(), + pPageObjectLayouter->GetTransitionEffectIcon().GetBitmapEx()); + } +} + +void PageObjectPainter::PaintCustomAnimationEffect ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) +{ + SdPage* pPage = rpDescriptor->GetPage(); + std::shared_ptr< MainSequence > aMainSequence = pPage->getMainSequence(); + EffectSequence::iterator aIter = aMainSequence->getBegin(); + EffectSequence::iterator aEnd = aMainSequence->getEnd(); + if ( aIter != aEnd ) + { + const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::CustomAnimationEffectIndicator, + PageObjectLayouter::ModelCoordinateSystem)); + rDevice.DrawBitmapEx( + aBox.TopCenter(), + pPageObjectLayouter->GetCustomAnimationEffectIcon().GetBitmapEx()); + } +} + +void PageObjectPainter::PaintBackgroundDetail ( + PageObjectLayouter *pPageObjectLayouter, + OutputDevice& rDevice, + const model::SharedPageDescriptor& rpDescriptor) const +{ + enum State { None = 0x00, Selected = 0x01, MouseOver = 0x02, Focused = 0x04 }; + const int eState = + (rpDescriptor->HasState(model::PageDescriptor::ST_Selected) ? Selected : None) + | (rpDescriptor->HasState(model::PageDescriptor::ST_MouseOver) ? MouseOver : None) + | (rpDescriptor->HasState(model::PageDescriptor::ST_Focused) ? Focused : None); + + bool bHasFocusBorder; + Theme::GradientColorType eColorType; + + switch (eState) + { + case MouseOver | Selected | Focused: + eColorType = Theme::Gradient_MouseOverSelectedAndFocusedPage; + bHasFocusBorder = true; + break; + + case MouseOver | Selected: + eColorType = Theme::Gradient_MouseOverSelected; + bHasFocusBorder = false; + break; + + case MouseOver: + eColorType = Theme::Gradient_MouseOverPage; + bHasFocusBorder = false; + break; + + case MouseOver | Focused: + eColorType = Theme::Gradient_MouseOverPage; + bHasFocusBorder = true; + break; + + case Selected | Focused: + eColorType = Theme::Gradient_SelectedAndFocusedPage; + bHasFocusBorder = true; + break; + + case Selected: + eColorType = Theme::Gradient_SelectedPage; + bHasFocusBorder = false; + break; + + case Focused: + eColorType = Theme::Gradient_FocusedPage; + bHasFocusBorder = true; + break; + + case None: + default: + eColorType = Theme::Gradient_NormalPage; + bHasFocusBorder = false; + break; + } + + const ::tools::Rectangle aFocusSize (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::FocusIndicator, + PageObjectLayouter::ModelCoordinateSystem)); + + const ::tools::Rectangle aPageObjectBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::PageObject, + PageObjectLayouter::ModelCoordinateSystem)); + + // Fill the background with the background color of the slide sorter. + const Color aBackgroundColor (mpTheme->GetColor(Theme::Color_Background)); + rDevice.SetFillColor(aBackgroundColor); + rDevice.SetLineColor(aBackgroundColor); + rDevice.DrawRect(aFocusSize); + + // Paint the slide area with a linear gradient that starts some pixels + // below the top and ends some pixels above the bottom. + const Color aTopColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Fill1)); + const Color aBottomColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Fill2)); + if (aTopColor != aBottomColor) + { + Gradient gradient(css::awt::GradientStyle_LINEAR, aTopColor, aBottomColor); + rDevice.DrawGradient(aPageObjectBox, gradient); + } + else + { + rDevice.SetFillColor(aTopColor); + rDevice.DrawRect(aPageObjectBox); + } + + // Paint the simple border and, for some backgrounds, the focus border. + if (bHasFocusBorder) + mpFocusBorderPainter->PaintFrame(rDevice, aPageObjectBox); + else + PaintBorder(rDevice, eColorType, aPageObjectBox); + + // Get bounding box of the preview around which a shadow is painted. + // Compensate for the border around the preview. + const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox( + rpDescriptor, + PageObjectLayouter::Part::Preview, + PageObjectLayouter::ModelCoordinateSystem)); + ::tools::Rectangle aFrameBox (aBox.Left()-1,aBox.Top()-1,aBox.Right()+1,aBox.Bottom()+1); + mpShadowPainter->PaintFrame(rDevice, aFrameBox); +} + +void PageObjectPainter::PaintBorder ( + OutputDevice& rDevice, + const Theme::GradientColorType eColorType, + const ::tools::Rectangle& rBox) const +{ + rDevice.SetFillColor(); + const sal_Int32 nBorderWidth (1); + for (int nIndex=0; nIndexGetGradientColor(eColorType, Theme::GradientColorClass::Border2)); + rDevice.DrawLine( + Point(rBox.Left()-nDelta, rBox.Top()-nDelta), + Point(rBox.Left()-nDelta, rBox.Bottom()+nDelta)); + rDevice.DrawLine( + Point(rBox.Left()-nDelta, rBox.Bottom()+nDelta), + Point(rBox.Right()+nDelta, rBox.Bottom()+nDelta)); + rDevice.DrawLine( + Point(rBox.Right()+nDelta, rBox.Bottom()+nDelta), + Point(rBox.Right()+nDelta, rBox.Top()-nDelta)); + + rDevice.SetLineColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Border1)); + rDevice.DrawLine( + Point(rBox.Left()-nDelta, rBox.Top()-nDelta), + Point(rBox.Right()+nDelta, rBox.Top()-nDelta)); + } +} + +} // end of namespace sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsTheme.cxx b/sd/source/ui/slidesorter/view/SlsTheme.cxx new file mode 100644 index 0000000000..5172e6241e --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsTheme.cxx @@ -0,0 +1,239 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sd::slidesorter::view { + +const Color Black(0x000000); +const Color White(0xffffff); + +static Color ChangeLuminance (Color aColor, const int nValue) +{ + if (nValue > 0) + aColor.IncreaseLuminance(nValue); + else + aColor.DecreaseLuminance(-nValue); + return aColor; +} + +static Color HGBAdapt ( + const Color aColor, + const sal_Int32 nNewSaturation, + const sal_Int32 nNewBrightness) +{ + sal_uInt16 nHue (0); + sal_uInt16 nSaturation (0); + sal_uInt16 nBrightness (0); + aColor.RGBtoHSB(nHue, nSaturation, nBrightness); + return Color::HSBtoRGB( + nHue, + nNewSaturation>=0 ? nNewSaturation : nSaturation, + nNewBrightness>=0 ? nNewBrightness : nBrightness); +} + +Theme::Theme (const std::shared_ptr& rpProperties) + : maBackgroundColor(rpProperties->GetBackgroundColor()) +{ + maColor.resize(ColorType_Size_); + maColor[Color_Background] = maBackgroundColor; + maColor[Color_PageNumberDefault] = Color(0x0808080); + maColor[Color_PageNumberHover] = Color(0x4c4c4c); + maColor[Color_PageNumberHighContrast] = White; + maColor[Color_PageNumberBrightBackground] = Color(0x333333); + maColor[Color_PageNumberDarkBackground] = Color(0xcccccc); + maColor[Color_PreviewBorder] = Color(0x949599); + + Update(rpProperties); +} + +void Theme::Update (const std::shared_ptr& rpProperties) +{ + // Set up colors. + maBackgroundColor = rpProperties->GetBackgroundColor(); + + maColor[Color_Background] = maBackgroundColor; + + maGradients.resize(GradientColorType_Size_); + + maColor[Color_Background] = maBackgroundColor; + const Color aSelectionColor (rpProperties->GetSelectionColor()); + maColor[Color_Selection] = aSelectionColor; + if (aSelectionColor.IsBright()) + maColor[Color_PageCountFontColor] = Black; + else + maColor[Color_PageCountFontColor] = White; + + // Set up gradients. + SetGradient(Gradient_MouseOverPage, aSelectionColor, 0, 60, +80,+100, +50,+25); + SetGradient(Gradient_SelectedPage, aSelectionColor, 50, 50, +80,+100, +50,+25); + SetGradient(Gradient_FocusedPage, aSelectionColor, -1,-1, 0,0, -50,-75); + SetGradient(Gradient_MouseOverSelected, aSelectionColor, 55, 60, +80,+100, +50,+25); + SetGradient(Gradient_SelectedAndFocusedPage, aSelectionColor, 50, 50, +80,+100, -50,-75); + SetGradient(Gradient_MouseOverSelectedAndFocusedPage, aSelectionColor, 55, 60, +80,+100, -50,-75); + + SetGradient(Gradient_NormalPage, maBackgroundColor, -1,-1, 0,0, 0,0); + + // The focused gradient needs special handling because its fill color is + // like that of the NormalPage gradient. + GetGradient(Gradient_FocusedPage).maFillColor1 = GetGradient(Gradient_NormalPage).maFillColor1; + GetGradient(Gradient_FocusedPage).maFillColor2 = GetGradient(Gradient_NormalPage).maFillColor2; + + // Set up icons. + if (maIcons.empty()) + { + maIcons.resize(IconType_Size_); + + InitializeIcon(Icon_RawShadow, IMAGE_SHADOW); + InitializeIcon(Icon_RawInsertShadow, IMAGE_INSERT_SHADOW); + InitializeIcon(Icon_HideSlideOverlay, IMAGE_HIDE_SLIDE_OVERLAY); + InitializeIcon(Icon_FocusBorder, IMAGE_FOCUS_BORDER); + } +} + +std::shared_ptr Theme::GetFont ( + const FontType eType, + const OutputDevice& rDevice) +{ + std::shared_ptr pFont; + + switch (eType) + { + case Font_PageNumber: + pFont = std::make_shared(Application::GetSettings().GetStyleSettings().GetAppFont()); + pFont->SetTransparent(true); + pFont->SetWeight(WEIGHT_BOLD); + break; + + case Font_PageCount: + pFont = std::make_shared(Application::GetSettings().GetStyleSettings().GetAppFont()); + pFont->SetTransparent(true); + pFont->SetWeight(WEIGHT_NORMAL); + { + const Size aSize (pFont->GetFontSize()); + pFont->SetFontSize(Size(aSize.Width()*5/3, aSize.Height()*5/3)); + } + break; + } + + if (pFont) + { + // Transform the point size to pixel size. + const MapMode aFontMapMode (MapUnit::MapPoint); + const Size aFontSize (rDevice.LogicToPixel(pFont->GetFontSize(), aFontMapMode)); + + // Transform the font size to the logical coordinates of the device. + pFont->SetFontSize(rDevice.PixelToLogic(aFontSize)); + } + + return pFont; +} + +Color Theme::GetColor (const ColorType eType) +{ + if (sal_uInt32(eType)=0 || nBrightnessOverride>=0 + ? HGBAdapt(aBaseColor, nSaturationOverride, nBrightnessOverride) + : aBaseColor); + + rGradient.maFillColor1 = ChangeLuminance(aColor, nFillStartOffset); + rGradient.maFillColor2 = ChangeLuminance(aColor, nFillEndOffset); + rGradient.maBorderColor1 = ChangeLuminance(aColor, nBorderStartOffset); + rGradient.maBorderColor2 = ChangeLuminance(aColor, nBorderEndOffset); +} + +const BitmapEx& Theme::GetIcon (const IconType eType) +{ + if (size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType) +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd::slidesorter::view { + +ToolTip::ToolTip (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mnHelpWindowHandle(nullptr), + maShowTimer("sd::slidesorter::view::ToolTip maShowTimer"), + maHiddenTimer("sd::slidesorter::view::ToolTip maHiddenTimer") +{ + maShowTimer.SetTimeout(HelpSettings::GetTipDelay()); + maShowTimer.SetInvokeHandler(LINK(this, ToolTip, DelayTrigger)); + maHiddenTimer.SetTimeout(HelpSettings::GetTipDelay()); +} + +ToolTip::~ToolTip() +{ + maShowTimer.Stop(); + maHiddenTimer.Stop(); + Hide(); +} + +void ToolTip::SetPage (const model::SharedPageDescriptor& rpDescriptor) +{ + if (mpDescriptor == rpDescriptor) + return; + + maShowTimer.Stop(); + bool bWasVisible = Hide(); + + if (bWasVisible) + { + maHiddenTimer.Start(); + } + + mpDescriptor = rpDescriptor; + + if (mpDescriptor) + { + SdPage* pPage = mpDescriptor->GetPage(); + OUString sHelpText; + if (pPage != nullptr) + sHelpText = pPage->GetName(); + else + { + OSL_ASSERT(mpDescriptor->GetPage() != nullptr); + } + if (sHelpText.isEmpty()) + { + sHelpText = SdResId(STR_PAGE) + + OUString::number(mpDescriptor->GetPageIndex()+1); + } + + msCurrentHelpText = sHelpText; + // show new tooltip immediately, if last one was recently hidden + if(maHiddenTimer.IsActive()) + DoShow(); + else + maShowTimer.Start(); + } + else + { + msCurrentHelpText.clear(); + } +} + +void ToolTip::DoShow() +{ + if (maShowTimer.IsActive()) + { + // The delay timer is active. Wait for it to trigger the showing of + // the tool tip. + return; + } + + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + if (msCurrentHelpText.isEmpty() || !pWindow) + return; + + ::tools::Rectangle aBox ( + mrSlideSorter.GetView().GetLayouter().GetPageObjectLayouter()->GetBoundingBox( + mpDescriptor, + PageObjectLayouter::Part::Preview, + PageObjectLayouter::WindowCoordinateSystem)); + + // Do not show the help text when the (lower edge of the ) preview + // is not visible. The tool tip itself may still be outside the + // window. + if (aBox.Bottom() >= pWindow->GetSizePixel().Height()) + return; + + vcl::Window* pParent (pWindow); + while (pParent!=nullptr && pParent->GetParent()!=nullptr) + pParent = pParent->GetParent(); + const Point aOffset (pWindow->GetWindowExtentsRelative(*pParent).TopLeft()); + + // We do not know how high the tool tip will be but want its top + // edge not its bottom to be at a specific position (a little below + // the preview). Therefore we use a little trick and place the tool + // tip at the top of a rectangle that is placed below the preview. + aBox.Move(aOffset.X(), aOffset.Y() + aBox.GetHeight() + 3); + mnHelpWindowHandle = Help::ShowPopover( + pWindow, + aBox, + msCurrentHelpText, + QuickHelpFlags::Center | QuickHelpFlags::Top); +} + +bool ToolTip::Hide() +{ + if (mnHelpWindowHandle) + { + sd::Window *pWindow (mrSlideSorter.GetContentWindow().get()); + Help::HidePopover(pWindow, mnHelpWindowHandle); + mnHelpWindowHandle = nullptr; + return true; + } + else + return false; +} + +IMPL_LINK_NOARG(ToolTip, DelayTrigger, Timer *, void) +{ + DoShow(); +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx b/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx new file mode 100644 index 0000000000..ce27cec28d --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "SlsViewCacheContext.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd::slidesorter::view { + +ViewCacheContext::ViewCacheContext (SlideSorter& rSlideSorter) + : mrModel(rSlideSorter.GetModel()), + mrSlideSorter(rSlideSorter) +{ +} + +ViewCacheContext::~ViewCacheContext() +{ +} + +void ViewCacheContext::NotifyPreviewCreation(cache::CacheKey aKey) +{ + const model::SharedPageDescriptor pDescriptor (GetDescriptor(aKey)); + if (pDescriptor) + { + // Force a repaint that will trigger their re-creation. + mrSlideSorter.GetView().RequestRepaint(pDescriptor); + } + else + { + // It is OK when a preview was created for a page that is not + // currently displayed because both normal and master pages are + // kept in the same cache. + } +} + +bool ViewCacheContext::IsIdle() +{ + tools::IdleState nIdleState (tools::IdleDetection::GetIdleState(mrSlideSorter.GetContentWindow())); + return nIdleState == tools::IdleState::Idle; +} + +bool ViewCacheContext::IsVisible (cache::CacheKey aKey) +{ + const model::SharedPageDescriptor pDescriptor (GetDescriptor(aKey)); + return pDescriptor && pDescriptor->HasState(model::PageDescriptor::ST_Visible); +} + +const SdrPage* ViewCacheContext::GetPage (cache::CacheKey aKey) +{ + return aKey; +} + +std::shared_ptr > ViewCacheContext::GetEntryList (bool bVisible) +{ + auto pKeys = std::make_shared>(); + + model::PageEnumeration aPageEnumeration ( + bVisible + ? model::PageEnumerationProvider::CreateVisiblePagesEnumeration(mrModel) + : model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + + while (aPageEnumeration.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement()); + pKeys->push_back(pDescriptor->GetPage()); + } + + return pKeys; +} + +sal_Int32 ViewCacheContext::GetPriority (cache::CacheKey aKey) +{ + return - (aKey->GetPageNum()-1) / 2; +} + +model::SharedPageDescriptor ViewCacheContext::GetDescriptor (cache::CacheKey aKey) +{ + sal_uInt16 nPageIndex ((aKey->GetPageNum() - 1) / 2); + return mrModel.GetPageDescriptor(nPageIndex); +} + +css::uno::Reference ViewCacheContext::GetModel() +{ + if (mrModel.GetDocument() == nullptr) + return nullptr; + else + return mrModel.GetDocument()->getUnoModel(); +} + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx b/sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx new file mode 100644 index 0000000000..501517cb83 --- /dev/null +++ b/sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd::slidesorter::model +{ +class SlideSorterModel; +} +namespace sd::slidesorter +{ +class SlideSorter; +} + +namespace sd::slidesorter::view +{ +/** The cache context for the SlideSorter as used by Draw and Impress. See + the base class for documentation of the individual methods. +*/ +class ViewCacheContext : public cache::CacheContext +{ +public: + explicit ViewCacheContext(SlideSorter& rSlideSorter); + virtual ~ViewCacheContext() override; + virtual void NotifyPreviewCreation(cache::CacheKey aKey) override; + virtual bool IsIdle() override; + virtual bool IsVisible(cache::CacheKey aKey) override; + virtual const SdrPage* GetPage(cache::CacheKey aKey) override; + virtual std::shared_ptr> GetEntryList(bool bVisible) override; + virtual sal_Int32 GetPriority(cache::CacheKey aKey) override; + virtual css::uno::Reference GetModel() override; + +private: + model::SlideSorterModel& mrModel; + SlideSorter& mrSlideSorter; + + model::SharedPageDescriptor GetDescriptor(cache::CacheKey aKey); +}; + +} // end of namespace ::sd::slidesorter::view + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/table/TableDesignPane.cxx b/sd/source/ui/table/TableDesignPane.cxx new file mode 100644 index 0000000000..7c5154a0e1 --- /dev/null +++ b/sd/source/ui/table/TableDesignPane.cxx @@ -0,0 +1,1077 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::view; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::ui; + +namespace sd { + +const sal_Int32 nPreviewColumns = 5; +const sal_Int32 nPreviewRows = 5; +const sal_Int32 nCellWidth = 12; // one pixel is shared with the next cell! +const sal_Int32 nCellHeight = 7; // one pixel is shared with the next cell! +const sal_Int32 nBitmapWidth = (nCellWidth * nPreviewColumns) - (nPreviewColumns - 1); +const sal_Int32 nBitmapHeight = (nCellHeight * nPreviewRows) - (nPreviewRows - 1); + +const std::u16string_view gPropNames[CB_COUNT] = +{ + u"UseFirstRowStyle", + u"UseLastRowStyle", + u"UseBandingRowStyle", + u"UseFirstColumnStyle", + u"UseLastColumnStyle", + u"UseBandingColumnStyle" +}; + +constexpr std::u16string_view aTableStyleBaseName = u"table"; + +TableDesignWidget::TableDesignWidget(weld::Builder& rBuilder, ViewShellBase& rBase) + : mrBase(rBase) + , m_xMenu(rBuilder.weld_menu("menu")) + , m_xValueSet(new TableValueSet(rBuilder.weld_scrolled_window("previewswin", true))) + , m_xValueSetWin(new weld::CustomWeld(rBuilder, "previews", *m_xValueSet)) +{ + m_xValueSet->SetStyle(m_xValueSet->GetStyle() | WB_NO_DIRECTSELECT | WB_FLATVALUESET | WB_ITEMBORDER); + m_xValueSet->SetExtraSpacing(8); + m_xValueSet->setModal(false); + m_xValueSet->SetColor(); + m_xValueSet->SetSelectHdl(LINK(this, TableDesignWidget, implValueSetHdl)); + m_xValueSet->SetContextMenuHandler(LINK(this, TableDesignWidget, implContextMenuHandler)); + + for (sal_uInt16 i = CB_HEADER_ROW; i <= CB_BANDED_COLUMNS; ++i) + { + m_aCheckBoxes[i] = rBuilder.weld_check_button(OUString(gPropNames[i])); + m_aCheckBoxes[i]->connect_toggled(LINK(this, TableDesignWidget, implCheckBoxHdl)); + } + + // get current controller and initialize listeners + try + { + mxView.set(mrBase.GetController(), UNO_QUERY); + addListener(); + + Reference< XController > xController( mrBase.GetController(), UNO_SET_THROW ); + Reference< XStyleFamiliesSupplier > xFamiliesSupp( xController->getModel(), UNO_QUERY_THROW ); + Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() ); + mxTableFamily.set( xFamilies->getByName( "table" ), UNO_QUERY_THROW ); + mxCellFamily.set( xFamilies->getByName( "cell" ), UNO_QUERY_THROW ); + } + catch (const Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::CustomAnimationPane()" ); + } + + onSelectionChanged(); + updateControls(); +} + +TableDesignWidget::~TableDesignWidget() +{ + removeListener(); +} + +void TableDesignWidget::setDocumentModified() +{ + try + { + Reference xController(mrBase.GetController(), UNO_SET_THROW); + Reference xModifiable(xController->getModel(), UNO_QUERY_THROW); + xModifiable->setModified(true); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::setDocumentModified()"); + } +} + +IMPL_LINK(TableDesignWidget, implContextMenuHandler, const Point*, pPoint, void) +{ + auto nClickedItemId = pPoint ? m_xValueSet->GetItemId(*pPoint) : m_xValueSet->GetSelectedItemId(); + + try + { + if (nClickedItemId > mxTableFamily->getCount()) + return; + + if (nClickedItemId) + { + Reference xStyle(mxTableFamily->getByIndex(nClickedItemId - 1), UNO_QUERY_THROW); + + m_xMenu->set_visible("clone", true); + m_xMenu->set_visible("format", true); + m_xMenu->set_visible("delete", xStyle->isUserDefined()); + m_xMenu->set_visible("reset", !xStyle->isUserDefined()); + m_xMenu->set_sensitive("reset", Reference(xStyle, UNO_QUERY_THROW)->isModified()); + } + else + { + m_xMenu->set_visible("clone", false); + m_xMenu->set_visible("format", false); + m_xMenu->set_visible("delete", false); + m_xMenu->set_visible("reset", false); + } + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::implContextMenuHandler()"); + } + + m_xValueSet->SelectItem(nClickedItemId); + + Point aPosition = pPoint ? *pPoint : m_xValueSet->GetItemRect(nClickedItemId).Center(); + OUString aCommand = m_xMenu->popup_at_rect(m_xValueSet->GetDrawingArea(), ::tools::Rectangle(aPosition, Size(1,1))); + + if (aCommand == "new") + InsertStyle(); + else if (aCommand == "clone") + CloneStyle(); + else if (aCommand == "delete") + DeleteStyle(); + else if (aCommand == "reset") + ResetStyle(); + else if (!aCommand.isEmpty()) + EditStyle(aCommand); +} + +namespace +{ + OUString getNewStyleName(const Reference& rFamily, std::u16string_view rBaseName) + { + OUString aName(rBaseName); + sal_Int32 nIndex = 1; + while(rFamily->hasByName(aName)) + { + aName = rBaseName + OUString::number(nIndex++); + } + + return aName; + } +} + +void TableDesignWidget::InsertStyle() +{ + try + { + Reference xFactory(mxTableFamily, UNO_QUERY_THROW); + Reference xTableFamily(mxTableFamily, UNO_QUERY_THROW); + Reference xTableStyle(xFactory->createInstance(), UNO_QUERY_THROW); + const OUString aName(getNewStyleName(xTableFamily, aTableStyleBaseName)); + xTableFamily->insertByName(aName, Any(xTableStyle)); + + Reference xCellStyle(mxCellFamily->getByName("default"), UNO_QUERY_THROW); + + xTableStyle->replaceByName("body", Any(xCellStyle)); + xTableStyle->replaceByName("odd-rows" , Any(xCellStyle)); + xTableStyle->replaceByName("odd-columns" , Any(xCellStyle)); + xTableStyle->replaceByName("first-row" , Any(xCellStyle)); + xTableStyle->replaceByName("first-column" , Any(xCellStyle)); + xTableStyle->replaceByName("last-row" , Any(xCellStyle)); + xTableStyle->replaceByName("last-column" , Any(xCellStyle)); + + updateControls(); + selectStyle(aName); + setDocumentModified(); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::InsertStyle()"); + } +} + +void TableDesignWidget::CloneStyle() +{ + try + { + Reference xSrcTableStyle(mxTableFamily->getByIndex(m_xValueSet->GetSelectedItemId() - 1), UNO_QUERY_THROW); + + Reference xFactory(mxTableFamily, UNO_QUERY_THROW); + Reference xTableFamily(mxTableFamily, UNO_QUERY_THROW); + Reference xDestTableStyle(xFactory->createInstance(), UNO_QUERY_THROW); + const OUString aName(getNewStyleName(xTableFamily, aTableStyleBaseName)); + xTableFamily->insertByName(aName, Any(xDestTableStyle)); + + auto aNames(xSrcTableStyle->getElementNames()); + for (const auto& name : aNames) + { + Reference xSrcCellStyle(xSrcTableStyle->getByName(name), UNO_QUERY); + if (xSrcCellStyle && xSrcCellStyle->isUserDefined()) + { + Reference xCellFactory(mxCellFamily, UNO_QUERY_THROW); + Reference xDestCellStyle(xCellFactory->createInstance(), UNO_QUERY_THROW); + xDestCellStyle->setParentStyle(xSrcCellStyle->getParentStyle()); + const OUString aStyleName(getNewStyleName(mxCellFamily, Concat2View(aName + "-" + name))); + mxCellFamily->insertByName(aStyleName, Any(xDestCellStyle)); + + rtl::Reference xSrcStyleSheet = static_cast(xSrcCellStyle.get()); + rtl::Reference xDestStyleSheet = static_cast(xDestCellStyle.get()); + + xDestStyleSheet->GetItemSet().Put(xSrcStyleSheet->GetItemSet()); + + xDestTableStyle->replaceByName(name, Any(xDestCellStyle)); + } + else + xDestTableStyle->replaceByName(name, Any(xSrcCellStyle)); + } + + updateControls(); + selectStyle(aName); + setDocumentModified(); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::CloneStyle()"); + } +} + +void TableDesignWidget::ResetStyle() +{ + try + { + Reference xTableStyle(mxTableFamily->getByIndex(m_xValueSet->GetSelectedItemId() - 1), UNO_QUERY_THROW); + + for (sal_Int32 i = 0; i < xTableStyle->getCount(); ++i) + { + Reference xCellStyle(xTableStyle->getByIndex(i), UNO_QUERY); + while (xCellStyle && xCellStyle->isUserDefined() && !xCellStyle->getParentStyle().isEmpty()) + xCellStyle.set(mxCellFamily->getByName(xCellStyle->getParentStyle()), UNO_QUERY); + + xTableStyle->replaceByIndex(i, Any(xCellStyle)); + } + + endTextEditForStyle(xTableStyle); + Reference(xTableStyle, UNO_QUERY_THROW)->setModified(false); + + updateControls(); + setDocumentModified(); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::ResetStyle()"); + } +} + +void TableDesignWidget::DeleteStyle() +{ + try + { + Reference xTableStyle(mxTableFamily->getByIndex(m_xValueSet->GetSelectedItemId() - 1), UNO_QUERY_THROW); + + if (xTableStyle->isInUse()) + { + std::unique_ptr xBox(Application::CreateMessageDialog( + m_xValueSet->GetDrawingArea(), VclMessageType::Question, VclButtonsType::YesNo, SdResId(STR_REMOVE_TABLESTYLE))); + + if (xBox->run() != RET_YES) + return; + + endTextEditForStyle(xTableStyle); + } + + Reference(mxTableFamily, UNO_QUERY_THROW)->removeByName(xTableStyle->getName()); + + updateControls(); + setDocumentModified(); + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::DeleteStyle()"); + } +} + +void TableDesignWidget::EditStyle(const OUString& rCommand) +{ + try + { + Reference xTableStyle(mxTableFamily->getByIndex(m_xValueSet->GetSelectedItemId() - 1), UNO_QUERY_THROW); + Reference xCellStyle(xTableStyle->getByName(rCommand), UNO_QUERY_THROW); + rtl::Reference xStyleSheet = static_cast(xCellStyle.get()); + + bool bUserDefined = xStyleSheet->IsEditable(); + if (!bUserDefined) + { + Reference xFactory(mxCellFamily, UNO_QUERY_THROW); + xCellStyle.set(xFactory->createInstance(), UNO_QUERY_THROW); + xCellStyle->setParentStyle(xStyleSheet->getName()); + xStyleSheet = static_cast(xCellStyle.get()); + } + + SfxItemSet aNewAttr(xStyleSheet->GetItemSet()); + + // merge drawing layer text distance items into SvxBoxItem used by the dialog + SvxBoxItem aBoxItem(sdr::table::SvxTableController::TextDistancesToSvxBoxItem(aNewAttr)); + aNewAttr.Put(aBoxItem); + + // inner borders do not apply to a cell style + SvxBoxInfoItem aBoxInfoItem(aNewAttr.Get(SDRATTR_TABLE_BORDER_INNER)); + aBoxInfoItem.SetTable(false); + aNewAttr.Put(aBoxInfoItem); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact ? pFact->CreateSvxFormatCellsDialog( + mrBase.GetFrameWeld(), aNewAttr, mrBase.GetDrawView()->GetModel(), true) : nullptr); + if (pDlg && pDlg->Execute() == RET_OK) + { + endTextEditForStyle(xTableStyle); + + if (!bUserDefined) + { + Reference xNamed(xTableStyle, UNO_QUERY_THROW); + const OUString aStyleName(getNewStyleName(mxCellFamily, Concat2View(xNamed->getName() + "-" + rCommand))); + mxCellFamily->insertByName(aStyleName, Any(xCellStyle)); + xTableStyle->replaceByName(rCommand, Any(xCellStyle)); + } + + SfxItemSet aNewSet(*pDlg->GetOutputItemSet()); + sdr::table::SvxTableController::SvxBoxItemToTextDistances(aBoxItem, aNewSet); + sdr::properties::CleanupFillProperties(aNewSet); + xStyleSheet->GetItemSet().Put(aNewSet); + xStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + + updateControls(); + setDocumentModified(); + } + } + catch (Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::EditStyle()"); + } +} + +static SfxBindings* getBindings( ViewShellBase const & rBase ) +{ + if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() ) + return &rBase.GetMainViewShell()->GetViewFrame()->GetBindings(); + else + return nullptr; +} + +static SfxDispatcher* getDispatcher( ViewShellBase const & rBase ) +{ + if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() ) + return rBase.GetMainViewShell()->GetViewFrame()->GetDispatcher(); + else + return nullptr; +} + +IMPL_LINK_NOARG(TableDesignWidget, implValueSetHdl, ValueSet*, void) +{ + ApplyStyle(); +} + +void TableDesignWidget::ApplyStyle() +{ + try + { + OUString sStyleName; + sal_Int32 nIndex = static_cast< sal_Int32 >( m_xValueSet->GetSelectedItemId() ) - 1; + + if( (nIndex >= 0) && (nIndex < mxTableFamily->getCount()) ) + { + Reference< XNameAccess > xNames( mxTableFamily, UNO_QUERY_THROW ); + sStyleName = xNames->getElementNames()[nIndex]; + } + else if (nIndex == mxTableFamily->getCount()) + { + InsertStyle(); + return; + } + + if( sStyleName.isEmpty() ) + return; + + SdrView* pView = mrBase.GetDrawView(); + if( mxSelectedTable.is() ) + { + if( pView ) + { + if (pView->IsTextEdit()) + pView->SdrEndTextEdit(); + + SfxRequest aReq( SID_TABLE_STYLE, SfxCallMode::SYNCHRON, SfxGetpApp()->GetPool() ); + aReq.AppendItem( SfxStringItem( SID_TABLE_STYLE, sStyleName ) ); + + const rtl::Reference< sdr::SelectionController >& xController( pView->getSelectionController() ); + if( xController.is() ) + xController->Execute( aReq ); + + SfxBindings* pBindings = getBindings( mrBase ); + if( pBindings ) + { + pBindings->Invalidate( SID_UNDO ); + pBindings->Invalidate( SID_REDO ); + } + } + setDocumentModified(); + } + else + { + SfxDispatcher* pDispatcher = getDispatcher( mrBase ); + SfxStringItem aArg( SID_TABLE_STYLE, sStyleName ); + pDispatcher->ExecuteList(SID_INSERT_TABLE, SfxCallMode::ASYNCHRON, + { &aArg }); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::implValueSetHdl()"); + } +} + +IMPL_LINK_NOARG(TableDesignWidget, implCheckBoxHdl, weld::Toggleable&, void) +{ + ApplyOptions(); + FillDesignPreviewControl(); +} + +void TableDesignWidget::ApplyOptions() +{ + static const sal_uInt16 gParamIds[CB_COUNT] = + { + ID_VAL_USEFIRSTROWSTYLE, ID_VAL_USELASTROWSTYLE, ID_VAL_USEBANDINGROWSTYLE, + ID_VAL_USEFIRSTCOLUMNSTYLE, ID_VAL_USELASTCOLUMNSTYLE, ID_VAL_USEBANDINGCOLUMNSTYLE + }; + + if( !mxSelectedTable.is() ) + return; + + SfxRequest aReq( SID_TABLE_STYLE_SETTINGS, SfxCallMode::SYNCHRON, SfxGetpApp()->GetPool() ); + + for( sal_uInt16 i = CB_HEADER_ROW; i <= CB_BANDED_COLUMNS; ++i ) + { + aReq.AppendItem( SfxBoolItem( gParamIds[i], m_aCheckBoxes[i]->get_active() ) ); + } + + SdrView* pView = mrBase.GetDrawView(); + if( !pView ) + return; + + const rtl::Reference< sdr::SelectionController >& xController( pView->getSelectionController() ); + if( xController.is() ) + { + xController->Execute( aReq ); + + SfxBindings* pBindings = getBindings( mrBase ); + if( pBindings ) + { + pBindings->Invalidate( SID_UNDO ); + pBindings->Invalidate( SID_REDO ); + } + } + setDocumentModified(); +} + +void TableDesignWidget::onSelectionChanged() +{ + Reference< XPropertySet > xNewSelection; + + if( mxView.is() ) try + { + Reference< XSelectionSupplier > xSel( mxView, UNO_QUERY_THROW ); + Any aSel( xSel->getSelection() ); + Sequence< XShape > xShapeSeq; + if( aSel >>= xShapeSeq ) + { + if( xShapeSeq.getLength() == 1 ) + aSel <<= xShapeSeq[0]; + } + else + { + Reference< XShapes > xShapes( aSel, UNO_QUERY ); + if( xShapes.is() && (xShapes->getCount() == 1) ) + aSel = xShapes->getByIndex(0); + } + + Reference< XShapeDescriptor > xDesc( aSel, UNO_QUERY ); + if( xDesc.is() && ( xDesc->getShapeType() == "com.sun.star.drawing.TableShape" || xDesc->getShapeType() == "com.sun.star.presentation.TableShape" ) ) + { + xNewSelection.set( xDesc, UNO_QUERY ); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::onSelectionChanged()" ); + } + + if( mxSelectedTable != xNewSelection ) + { + mxSelectedTable = xNewSelection; + updateControls(); + } +} + +bool TableValueSet::Command(const CommandEvent& rEvent) +{ + if (rEvent.GetCommand() != CommandEventId::ContextMenu) + return ValueSet::Command(rEvent); + + maContextMenuHandler.Call(rEvent.IsMouseEvent() ? &rEvent.GetMousePosPixel() : nullptr); + return true; +} + +void TableValueSet::Resize() +{ + ValueSet::Resize(); + // Calculate the number of rows and columns. + if( GetItemCount() <= 0 ) + return; + + Size aValueSetSize = GetOutputSizePixel(); + + Image aImage = GetItemImage(GetItemId(0)); + Size aItemSize = aImage.GetSizePixel(); + + aItemSize.AdjustHeight(10 ); + int nColumnCount = (aValueSetSize.Width() - GetScrollWidth()) / aItemSize.Width(); + if (nColumnCount < 1) + nColumnCount = 1; + + int nRowCount = (GetItemCount() + nColumnCount - 1) / nColumnCount; + if (nRowCount < 1) + nRowCount = 1; + + int nVisibleRowCount = std::min(nRowCount, getMaxRowCount()); + + SetColCount (static_cast(nColumnCount)); + SetLineCount (static_cast(nVisibleRowCount)); + + if( !m_bModal ) + { + WinBits nStyle = GetStyle() & ~WB_VSCROLL; + if( nRowCount > nVisibleRowCount ) + { + nStyle |= WB_VSCROLL; + } + SetStyle( nStyle ); + } +} + +TableValueSet::TableValueSet(std::unique_ptr pScrolledWindow) + : ValueSet(std::move(pScrolledWindow)) + , m_bModal(false) +{ +} + +void TableValueSet::StyleUpdated() +{ + updateSettings(); +} + +void TableValueSet::updateSettings() +{ + if( !m_bModal ) + { + Color aColor = Application::GetSettings().GetStyleSettings().GetWindowColor(); + SetColor(aColor); + SetExtraSpacing(8); + } +} + +void TableDesignWidget::updateControls() +{ + static const bool gDefaults[CB_COUNT] = { true, false, true, false, false, false }; + + const bool bHasTable = mxSelectedTable.is(); + + for (sal_uInt16 i = CB_HEADER_ROW; i <= CB_BANDED_COLUMNS; ++i) + { + bool bUse = gDefaults[i]; + if( bHasTable ) try + { + mxSelectedTable->getPropertyValue( OUString(gPropNames[i]) ) >>= bUse; + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::updateControls()"); + } + m_aCheckBoxes[i]->set_active(bUse); + m_aCheckBoxes[i]->set_sensitive(bHasTable); + } + + FillDesignPreviewControl(); + m_xValueSet->updateSettings(); + m_xValueSet->Resize(); + + if( mxSelectedTable.is() ) + { + Reference< XNamed > xNamed( mxSelectedTable->getPropertyValue( "TableTemplate" ), UNO_QUERY ); + if( xNamed.is() ) + selectStyle(xNamed->getName()); + } +} + +void TableDesignWidget::selectStyle(std::u16string_view rStyle) +{ + Reference< XNameAccess > xNames( mxTableFamily, UNO_QUERY ); + if( xNames.is() ) + { + Sequence< OUString > aNames( xNames->getElementNames() ); + sal_Int32 nIndex = comphelper::findValue(aNames, rStyle); + if (nIndex != -1) + m_xValueSet->SelectItem(static_cast(nIndex) + 1); + } +} + +void TableDesignWidget::endTextEditForStyle(const Reference& rStyle) +{ + if (!mxSelectedTable) + return; + + Reference xTableStyle(mxSelectedTable->getPropertyValue("TableTemplate"), UNO_QUERY); + if (xTableStyle != rStyle) + return; + + if (mrBase.GetDrawView()->IsTextEdit()) + mrBase.GetDrawView()->SdrEndTextEdit(); +} + +void TableDesignWidget::addListener() +{ + Link aLink( LINK(this,TableDesignWidget,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->AddEventListener( aLink ); +} + +void TableDesignWidget::removeListener() +{ + Link aLink( LINK(this,TableDesignWidget,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); +} + +IMPL_LINK(TableDesignWidget,EventMultiplexerListener, + tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::CurrentPageChanged: + case EventMultiplexerEventId::EditViewSelection: + onSelectionChanged(); + break; + + case EventMultiplexerEventId::MainViewRemoved: + mxView.clear(); + onSelectionChanged(); + break; + + case EventMultiplexerEventId::MainViewAdded: + mxView.set( mrBase.GetController(), UNO_QUERY ); + onSelectionChanged(); + break; + + default: break; + } +} + +namespace { + +struct CellInfo +{ + Color maCellColor; + Color maTextColor; + std::shared_ptr maBorder; + + explicit CellInfo( const Reference< XStyle >& xStyle ); +}; + +} + +CellInfo::CellInfo( const Reference< XStyle >& xStyle ) +: maBorder(std::make_shared(SDRATTR_TABLE_BORDER)) +{ + SfxStyleSheet* pStyleSheet = SfxUnoStyleSheet::getUnoStyleSheet( xStyle ); + if( !pStyleSheet ) + return; + + SfxItemSet& rSet = pStyleSheet->GetItemSet(); + + // get style fill color + maCellColor = GetDraftFillColor(rSet).value_or(COL_TRANSPARENT); + + // get style text color + const SvxColorItem* pTextColor = rSet.GetItem(EE_CHAR_COLOR); + if( pTextColor ) + maTextColor = pTextColor->GetValue(); + else + maTextColor = COL_TRANSPARENT; + + // get border + const SvxBoxItem* pBoxItem = rSet.GetItem( SDRATTR_TABLE_BORDER ); + if( pBoxItem ) + maBorder.reset(pBoxItem->Clone()); +} + +typedef std::vector< std::shared_ptr< CellInfo > > CellInfoVector; +typedef std::shared_ptr< CellInfo > CellInfoMatrix[nPreviewColumns * nPreviewRows]; + +namespace { + +struct TableStyleSettings +{ + bool mbUseFirstRow; + bool mbUseLastRow; + bool mbUseFirstColumn; + bool mbUseLastColumn; + bool mbUseRowBanding; + bool mbUseColumnBanding; + + TableStyleSettings() + : mbUseFirstRow(true) + , mbUseLastRow(false) + , mbUseFirstColumn(false) + , mbUseLastColumn(false) + , mbUseRowBanding(true) + , mbUseColumnBanding(false) {} +}; + +} + +static void FillCellInfoVector( const Reference< XIndexAccess >& xTableStyle, CellInfoVector& rVector ) +{ + DBG_ASSERT( xTableStyle.is() && (xTableStyle->getCount() == sdr::table::style_count ), "sd::FillCellInfoVector(), invalid table style!" ); + if( !xTableStyle.is() ) + return; + + try + { + rVector.resize( sdr::table::style_count ); + + for( sal_Int32 nStyle = 0; nStyle < sdr::table::style_count; ++nStyle ) + { + Reference< XStyle > xStyle( xTableStyle->getByIndex( nStyle ), UNO_QUERY ); + if( xStyle.is() ) + rVector[nStyle] = std::make_shared( xStyle ); + } + } + catch(Exception&) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::FillCellInfoVector()"); + } +} + +static void FillCellInfoMatrix( const CellInfoVector& rStyle, const TableStyleSettings& rSettings, CellInfoMatrix& rMatrix ) +{ + for( sal_Int32 nRow = 0; nRow < nPreviewColumns; ++nRow ) + { + const bool bFirstRow = rSettings.mbUseFirstRow && (nRow == 0); + const bool bLastRow = rSettings.mbUseLastRow && (nRow == nPreviewColumns - 1); + + for( sal_Int32 nCol = 0; nCol < nPreviewColumns; ++nCol ) + { + std::shared_ptr< CellInfo > xCellInfo; + + // first and last row win first, if used and available + if( bFirstRow ) + { + xCellInfo = rStyle[sdr::table::first_row_style]; + } + else if( bLastRow ) + { + xCellInfo = rStyle[sdr::table::last_row_style]; + } + + if( !xCellInfo ) + { + // next come first and last column, if used and available + if( rSettings.mbUseFirstColumn && (nCol == 0) ) + { + xCellInfo = rStyle[sdr::table::first_column_style]; + } + else if( rSettings.mbUseLastColumn && (nCol == nPreviewColumns-1) ) + { + xCellInfo = rStyle[sdr::table::last_column_style]; + } + } + + if( !xCellInfo ) + { + if( rSettings.mbUseRowBanding ) + { + if( (nRow & 1) == 0 ) + { + xCellInfo = rStyle[sdr::table::even_rows_style]; + } + else + { + xCellInfo = rStyle[sdr::table::odd_rows_style]; + } + } + } + + if( !xCellInfo ) + { + if( rSettings.mbUseColumnBanding ) + { + if( (nCol & 1) == 0 ) + { + xCellInfo = rStyle[sdr::table::even_columns_style]; + } + else + { + xCellInfo = rStyle[sdr::table::odd_columns_style]; + } + } + } + + if( !xCellInfo ) + { + // use default cell style if non found yet + xCellInfo = rStyle[sdr::table::body_style]; + } + + rMatrix[(nCol * nPreviewColumns) + nRow] = xCellInfo; + } + } +} + +static BitmapEx CreateDesignPreview( const Reference< XIndexAccess >& xTableStyle, const TableStyleSettings& rSettings, bool bIsPageDark ) +{ + CellInfoVector aCellInfoVector(sdr::table::style_count); + FillCellInfoVector( xTableStyle, aCellInfoVector ); + + CellInfoMatrix aMatrix; + FillCellInfoMatrix( aCellInfoVector, rSettings, aMatrix ); + + // bbbbbbbbbbbb w = 12 pixel + // bccccccccccb h = 7 pixel + // bccccccccccb b = border color + // bcttttttttcb c = cell color + // bccccccccccb t = text color + // bccccccccccb + // bbbbbbbbbbbb + + ScopedVclPtr pVirDev(VclPtr::Create()); + Size aBmpSize(nBitmapWidth, nBitmapHeight); + pVirDev->SetOutputSizePixel(aBmpSize); + + pVirDev->SetBackground( bIsPageDark ? COL_BLACK : COL_WHITE ); + pVirDev->Erase(); + + // first draw cell background and text line previews + sal_Int32 nY = 0; + sal_Int32 nRow; + for( nRow = 0; nRow < nPreviewRows; ++nRow, nY += nCellHeight-1 ) + { + sal_Int32 nX = 0; + for( sal_Int32 nCol = 0; nCol < nPreviewColumns; ++nCol, nX += nCellWidth-1 ) + { + std::shared_ptr< CellInfo > xCellInfo(aMatrix[(nCol * nPreviewColumns) + nRow]); + + Color aTextColor( COL_AUTO ); + if( xCellInfo ) + { + // fill cell background + const ::tools::Rectangle aRect( nX, nY, nX + nCellWidth - 1, nY + nCellHeight - 1 ); + + if( xCellInfo->maCellColor != COL_TRANSPARENT ) + { + pVirDev->SetFillColor( xCellInfo->maCellColor ); + pVirDev->DrawRect( aRect ); + } + + aTextColor = xCellInfo->maTextColor; + } + + // draw text preview line + if( aTextColor == COL_AUTO ) + aTextColor = bIsPageDark ? COL_WHITE : COL_BLACK; + pVirDev->SetLineColor( aTextColor ); + const Point aPnt1( nX + 2, nY + ((nCellHeight - 1 ) >> 1) ); + const Point aPnt2( nX + nCellWidth - 3, aPnt1.Y() ); + pVirDev->DrawLine( aPnt1, aPnt2 ); + } + } + + // second draw border lines + nY = 0; + for( nRow = 0; nRow < nPreviewRows; ++nRow, nY += nCellHeight-1 ) + { + sal_Int32 nX = 0; + for( sal_Int32 nCol = 0; nCol < nPreviewColumns; ++nCol, nX += nCellWidth-1 ) + { + std::shared_ptr< CellInfo > xCellInfo(aMatrix[(nCol * nPreviewColumns) + nRow]); + + if( xCellInfo ) + { + const Point aPntTL( nX, nY ); + const Point aPntTR( nX + nCellWidth - 1, nY ); + const Point aPntBL( nX, nY + nCellHeight - 1 ); + const Point aPntBR( nX + nCellWidth - 1, nY + nCellHeight - 1 ); + + sal_Int32 border_diffs[8] = { 0,-1, 0,1, -1,0, 1,0 }; + sal_Int32* pDiff = &border_diffs[0]; + + // draw top border + for( SvxBoxItemLine nLine : o3tl::enumrange() ) + { + const ::editeng::SvxBorderLine* pBorderLine = xCellInfo->maBorder->GetLine(nLine); + if( !pBorderLine || ((pBorderLine->GetOutWidth() == 0) && (pBorderLine->GetInWidth()==0)) ) + continue; + + sal_Int32 nBorderCol = nCol + *pDiff++; + sal_Int32 nBorderRow = nRow + *pDiff++; + if( (nBorderCol >= 0) && (nBorderCol < nPreviewColumns) && (nBorderRow >= 0) && (nBorderRow < nPreviewRows) ) + { + // check border + std::shared_ptr< CellInfo > xBorderInfo(aMatrix[(nBorderCol * nPreviewColumns) + nBorderRow]); + if( xBorderInfo ) + { + const ::editeng::SvxBorderLine* pBorderLine2 = xBorderInfo->maBorder->GetLine(static_cast(static_cast(nLine)^1)); + if( pBorderLine2 && pBorderLine2->HasPriority(*pBorderLine) ) + continue; // other border line wins + } + } + + pVirDev->SetLineColor( pBorderLine->GetColor() ); + switch( nLine ) + { + case SvxBoxItemLine::TOP: pVirDev->DrawLine( aPntTL, aPntTR ); break; + case SvxBoxItemLine::BOTTOM: pVirDev->DrawLine( aPntBL, aPntBR ); break; + case SvxBoxItemLine::LEFT: pVirDev->DrawLine( aPntTL, aPntBL ); break; + case SvxBoxItemLine::RIGHT: pVirDev->DrawLine( aPntTR, aPntBR ); break; + } + } + } + } + } + + return pVirDev->GetBitmapEx(Point(0,0), aBmpSize); +} + +void TableDesignWidget::FillDesignPreviewControl() +{ + sal_uInt16 nSelectedItem = m_xValueSet->GetSelectedItemId(); + m_xValueSet->Clear(); + try + { + TableStyleSettings aSettings; + if( mxSelectedTable.is() ) + { + aSettings.mbUseFirstRow = m_aCheckBoxes[CB_HEADER_ROW]->get_active(); + aSettings.mbUseLastRow = m_aCheckBoxes[CB_TOTAL_ROW]->get_active(); + aSettings.mbUseRowBanding = m_aCheckBoxes[CB_BANDED_ROWS]->get_active(); + aSettings.mbUseFirstColumn = m_aCheckBoxes[CB_FIRST_COLUMN]->get_active(); + aSettings.mbUseLastColumn = m_aCheckBoxes[CB_LAST_COLUMN]->get_active(); + aSettings.mbUseColumnBanding = m_aCheckBoxes[CB_BANDED_COLUMNS]->get_active(); + } + + bool bIsPageDark = false; + if( mxView.is() ) + { + Reference< XPropertySet > xPageSet( mxView->getCurrentPage(), UNO_QUERY ); + if( xPageSet.is() ) + { + xPageSet->getPropertyValue("IsBackgroundDark") >>= bIsPageDark; + } + } + + sal_Int32 nCount = mxTableFamily->getCount(); + for( sal_Int32 nIndex = 0; nIndex < nCount; ++nIndex ) try + { + Reference< XIndexAccess > xTableStyle( mxTableFamily->getByIndex( nIndex ), UNO_QUERY ); + if( xTableStyle.is() ) + m_xValueSet->InsertItem( sal::static_int_cast( nIndex + 1 ), Image( CreateDesignPreview( xTableStyle, aSettings, bIsPageDark ) ) ); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::FillDesignPreviewControl()"); + } + m_xValueSet->InsertItem(++nCount, Image(StockImage::Yes, BMP_INSERT_TABLESTYLE), SdResId(STR_INSERT_TABLESTYLE)); + + sal_Int32 nCols = 3; + sal_Int32 nRows = std::min((nCount+2)/3, TableValueSet::getMaxRowCount()); + m_xValueSet->SetColCount(nCols); + m_xValueSet->SetLineCount(nRows); + WinBits nStyle = m_xValueSet->GetStyle() & ~WB_VSCROLL; + m_xValueSet->SetStyle(nStyle); + + m_xValueSet->SetOptimalSize(); + weld::DrawingArea* pDrawingArea = m_xValueSet->GetDrawingArea(); + Size aSize = pDrawingArea->get_preferred_size(); + aSize.AdjustWidth(10 * nCols); + aSize.AdjustHeight(10 * nRows); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + + m_xValueSet->Resize(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::FillDesignPreviewControl()"); + } + m_xValueSet->SelectItem(nSelectedItem); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/table/tablefunction.cxx b/sd/source/ui/table/tablefunction.cxx new file mode 100644 index 0000000000..67196e864b --- /dev/null +++ b/sd/source/ui/table/tablefunction.cxx @@ -0,0 +1,293 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::sd; +using namespace sdr::table; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::util; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::linguistic2; + +namespace sd +{ + +static void apply_table_style( SdrTableObj* pObj, SdrModel const * pModel, const OUString& sTableStyle ) +{ + if( !(pModel && pObj) ) + return; + + Reference< XNameAccess > xPool( + static_cast< cppu::OWeakObject* >( pModel->GetStyleSheetPool() ), css::uno::UNO_QUERY ); + if( !xPool.is() ) + return; + + try + { + Reference< XNameContainer > xTableFamily( xPool->getByName( "table" ), UNO_QUERY_THROW ); + OUString aStdName( "default" ); + if( !sTableStyle.isEmpty() ) + aStdName = sTableStyle; + Reference< XIndexAccess > xStyle( xTableFamily->getByName( aStdName ), UNO_QUERY_THROW ); + pObj->setTableStyle( xStyle ); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::apply_default_table_style()"); + } +} + +static void InsertTableImpl(const DrawViewShell* pShell, + ::sd::View* pView, + sal_Int32 nColumns, + sal_Int32 nRows, + const OUString& sTableStyle) +{ + ::tools::Rectangle aRect; + + SdrObject* pPickObj = pView->GetEmptyPresentationObject( PresObjKind::Table ); + if( pPickObj ) + { + aRect = pPickObj->GetLogicRect(); + aRect.setHeight( 200 ); + } + else + { + Size aSize(14100, 200); + + Point aPos; + ::tools::Rectangle aWinRect(aPos, pShell->GetActiveWindow()->GetOutputSizePixel()); + aWinRect = pShell->GetActiveWindow()->PixelToLogic(aWinRect); + + // make sure that the default size of the table fits on the paper and is inside the viewing area. + // if zoomed in close, don't make the table bigger than the viewing window. + Size aMaxSize = pShell->getCurrentPage()->GetSize(); + + if (comphelper::LibreOfficeKit::isActive()) + { + // aWinRect is nonsensical in the LOK case + aWinRect = ::tools::Rectangle(aPos, aMaxSize); + } + else + { + if( aMaxSize.Height() > aWinRect.getOpenHeight() ) + aMaxSize.setHeight( aWinRect.getOpenHeight() ); + if( aMaxSize.Width() > aWinRect.getOpenWidth() ) + aMaxSize.setWidth( aWinRect.getOpenWidth() ); + } + + if( aSize.Width() > aMaxSize.getWidth() ) + aSize.setWidth( aMaxSize.getWidth() ); + + // adjust height based on # of rows. + if( nRows > 0 ) + { + aSize.setHeight( aSize.Height() * nRows ); + if( aSize.Height() > aMaxSize.getHeight() ) + aSize.setHeight( aMaxSize.getHeight() ); + } + + aPos = aWinRect.Center(); + aPos.AdjustX( -(aSize.Width() / 2) ); + aPos.AdjustY( -(aSize.Height() / 2) ); + aRect = ::tools::Rectangle(aPos, aSize); + } + + rtl::Reference pObj = new sdr::table::SdrTableObj( + *pShell->GetDoc(), // TTTT should be reference + aRect, + nColumns, + nRows); + pObj->NbcSetStyleSheet( pShell->GetDoc()->GetDefaultStyleSheet(), true ); + apply_table_style( pObj.get(), pShell->GetDoc(), sTableStyle ); + SdrPageView* pPV = pView->GetSdrPageView(); + + // #i123359# if an object is to be replaced/manipulated it may be that it is in text edit mode, + // so to be on the safe side call SdrEndTextEdit here + SdrTextObj* pCheckForTextEdit = DynCastSdrTextObj(pPickObj); + + if(pCheckForTextEdit && pCheckForTextEdit->IsInEditMode()) + { + pView->SdrEndTextEdit(); + } + + // if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj + if( pPickObj ) + { + SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject()); + if(pPage && pPage->IsPresObj(pPickObj)) + { + pObj->SetUserCall( pPickObj->GetUserCall() ); + pPage->InsertPresObj( pObj.get(), PresObjKind::Table ); + } + } + + pShell->GetParentWindow()->GrabFocus(); + if( pPickObj ) + pView->ReplaceObjectAtView(pPickObj, *pPV, pObj.get() ); + else + pView->InsertObjectAtView(pObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER); +} + +void DrawViewShell::FuTable(SfxRequest& rReq) +{ + switch( rReq.GetSlot() ) + { + case SID_INSERT_TABLE: + { + sal_Int32 nColumns = 0; + sal_Int32 nRows = 0; + OUString sTableStyle; + DrawViewShell* pShell = this; + ::sd::View* pView = mpView; + + const SfxUInt16Item* pCols = rReq.GetArg(SID_ATTR_TABLE_COLUMN); + const SfxUInt16Item* pRows = rReq.GetArg(SID_ATTR_TABLE_ROW); + const SfxStringItem* pStyle = rReq.GetArg(SID_TABLE_STYLE); + + if( pCols ) + nColumns = pCols->GetValue(); + + if( pRows ) + nRows = pRows->GetValue(); + + if( pStyle ) + sTableStyle = pStyle->GetValue(); + + if( (nColumns == 0) || (nRows == 0) ) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + std::shared_ptr pDlg( pFact->CreateSvxNewTableDialog(rReq.GetFrameWeld()) ); + + weld::DialogController::runAsync(pDlg->getDialogController(), + [pDlg, pShell, pView, sTableStyle] (sal_Int32 nResult) { + if (nResult == RET_OK) + { + sal_Int32 nColumnsIn = pDlg->getColumns(); + sal_Int32 nRowsIn = pDlg->getRows(); + + InsertTableImpl(pShell, pView, nColumnsIn, nRowsIn, sTableStyle); + } + }); + } + else + { + InsertTableImpl(pShell, pView, nColumns, nRows, sTableStyle); + } + + rReq.Ignore(); + SfxViewShell* pViewShell = GetViewShell(); + OSL_ASSERT (pViewShell!=nullptr); + SfxBindings& rBindings = pViewShell->GetViewFrame().GetBindings(); + rBindings.Invalidate( SID_INSERT_TABLE, true ); + break; + } + case SID_TABLEDESIGN: + { + // First make sure that the sidebar is visible + GetViewFrame()->ShowChildWindow(SID_SIDEBAR); + ::sfx2::sidebar::Sidebar::TogglePanel( + u"SdTableDesignPanel", + GetViewFrame()->GetFrame().GetFrameInterface()); + + Cancel(); + rReq.Done (); + break; + } + default: + break; + } +} + +void DrawViewShell::GetTableMenuState( SfxItemSet &rSet ) +{ + OUString aActiveLayer = mpDrawView->GetActiveLayer(); + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + + if( + ( !aActiveLayer.isEmpty() && pPV && ( pPV->IsLayerLocked(aActiveLayer) || + !pPV->IsLayerVisible(aActiveLayer) ) ) || + SD_MOD()->GetWaterCan() ) + { + rSet.DisableItem( SID_INSERT_TABLE ); + } +} + +void CreateTableFromRTF( SvStream& rStream, SdDrawDocument* pModel ) +{ + rStream.Seek( 0 ); + + if( !pModel ) + return; + + SdrPage* pPage = pModel->GetPage(0); + if( !pPage ) + return; + + Size aSize( 200, 200 ); + ::tools::Rectangle aRect (Point(), aSize); + rtl::Reference pObj = new sdr::table::SdrTableObj( + *pModel, + aRect, + 1, + 1); + pObj->NbcSetStyleSheet( pModel->GetDefaultStyleSheet(), true ); + apply_table_style( pObj.get(), pModel, OUString() ); + + pPage->NbcInsertObject( pObj.get() ); + + sdr::table::ImportAsRTF( rStream, *pObj ); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/table/tableobjectbar.cxx b/sd/source/ui/table/tableobjectbar.cxx new file mode 100644 index 0000000000..6dfd869285 --- /dev/null +++ b/sd/source/ui/table/tableobjectbar.cxx @@ -0,0 +1,224 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "tableobjectbar.hxx" + +using namespace sd; +using namespace sd::ui::table; + +#define ShellClass_TableObjectBar +#include + +namespace sd::ui::table { + +/** creates a table object bar for the given ViewShell */ +SfxShell* CreateTableObjectBar( ViewShell& rShell, ::sd::View* pView ) +{ + return new TableObjectBar( &rShell, pView ); +} + +/** registers the interfaces from the table ui */ +void RegisterInterfaces(const SfxModule* pMod) +{ + TableObjectBar::RegisterInterface(pMod); +} + + +SFX_IMPL_INTERFACE(TableObjectBar, SfxShell) + +void TableObjectBar::InitInterface_Impl() +{ +} + +TableObjectBar::TableObjectBar( ViewShell* pSdViewShell, ::sd::View* pSdView ) +: SfxShell( pSdViewShell->GetViewShell() ) +, mpView( pSdView ) +, mpViewSh( pSdViewShell ) +{ + DrawDocShell* pDocShell = mpViewSh->GetDocSh(); + if( pDocShell ) + { + SetPool( &pDocShell->GetPool() ); + SetUndoManager( pDocShell->GetUndoManager() ); + } + SetRepeatTarget( mpView ); + SetName( SdResId( RID_DRAW_TABLE_TOOLBOX ) ); + SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::Table)); +} + +TableObjectBar::~TableObjectBar() +{ + SetRepeatTarget( nullptr ); +} + +void TableObjectBar::GetState( SfxItemSet& rSet ) +{ + if( mpView ) + { + rtl::Reference< sdr::SelectionController > xController( mpView->getSelectionController() ); + if( xController.is() ) + { + xController->GetState( rSet ); + } + } +} + +void TableObjectBar::GetAttrState( SfxItemSet& rSet ) +{ + DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewSh ); + if( pDrawViewShell ) + pDrawViewShell->GetAttrState( rSet ); +} + +void TableObjectBar::Execute( SfxRequest& rReq ) +{ + if( !mpView ) + return; + + SdrView* pView = mpView; + SfxBindings* pBindings = &mpViewSh->GetViewFrame()->GetBindings(); + + rtl::Reference< sdr::SelectionController > xController( mpView->getSelectionController() ); + sal_uInt16 nSlotId = rReq.GetSlot(); + if( xController.is() ) + { + switch( nSlotId ) + { + case SID_TABLE_INSERT_ROW_DLG: + case SID_TABLE_INSERT_ROW_BEFORE: + case SID_TABLE_INSERT_ROW_AFTER: + case SID_TABLE_INSERT_COL_DLG: + case SID_TABLE_INSERT_COL_BEFORE: + case SID_TABLE_INSERT_COL_AFTER: + { + ScopedVclPtr pDlg; + if (nSlotId == SID_TABLE_INSERT_ROW_DLG || nSlotId == SID_TABLE_INSERT_COL_DLG) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + vcl::Window* pWin = mpView->GetViewShell()->GetParentWindow(); + pDlg.disposeAndReset( pFact->CreateSvxInsRowColDlg(pWin ? pWin->GetFrameWeld() : nullptr, + nSlotId == SID_TABLE_INSERT_COL_DLG, + SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommand()) ); + + if (pDlg->Execute() != 1) + break; + } + + sal_uInt16 nCount = 1; + bool bInsertAfter = (nSlotId == SID_TABLE_INSERT_ROW_AFTER) || (nSlotId == SID_TABLE_INSERT_COL_AFTER); + + if (nSlotId == SID_TABLE_INSERT_ROW_DLG) + { + nCount = pDlg->getInsertCount(); + bInsertAfter = !pDlg->isInsertBefore(); + } + else if (nSlotId == SID_TABLE_INSERT_COL_DLG) + { + nCount = pDlg->getInsertCount(); + bInsertAfter = !pDlg->isInsertBefore(); + } + + if (nSlotId == SID_TABLE_INSERT_ROW_DLG || nSlotId == SID_TABLE_INSERT_ROW_BEFORE || nSlotId == SID_TABLE_INSERT_ROW_AFTER) + nSlotId = SID_TABLE_INSERT_ROW; + else + nSlotId = SID_TABLE_INSERT_COL; + + rReq.AppendItem(SfxInt16Item(nSlotId, nCount)); + rReq.AppendItem(SfxBoolItem(SID_TABLE_PARAM_INSERT_AFTER, bInsertAfter)); + + rReq.SetSlot( nSlotId ); + } + } + + xController->Execute( rReq ); + } + + // note: we may be deleted at this point, no more member access possible + + switch( rReq.GetSlot() ) + { + case SID_ATTR_BORDER: + case SID_TABLE_MERGE_CELLS: + case SID_TABLE_SPLIT_CELLS: + case SID_OPTIMIZE_TABLE: + case SID_TABLE_DELETE_ROW: + case SID_TABLE_DELETE_COL: + case SID_TABLE_DELETE_TABLE: + case SID_FORMAT_TABLE_DLG: + case SID_TABLE_INSERT_ROW: + case SID_TABLE_INSERT_COL: + { + pView->AdjustMarkHdl(); + pBindings->Invalidate( SID_TABLE_DELETE_ROW ); + pBindings->Invalidate( SID_TABLE_DELETE_COL ); + pBindings->Invalidate( SID_TABLE_DELETE_TABLE ); + pBindings->Invalidate( SID_FRAME_LINESTYLE ); + pBindings->Invalidate( SID_FRAME_LINECOLOR ); + pBindings->Invalidate( SID_ATTR_BORDER ); + pBindings->Invalidate( SID_ATTR_FILL_STYLE ); + pBindings->Invalidate( SID_ATTR_FILL_USE_SLIDE_BACKGROUND ); + pBindings->Invalidate( SID_ATTR_FILL_TRANSPARENCE ); + pBindings->Invalidate( SID_ATTR_FILL_FLOATTRANSPARENCE ); + pBindings->Invalidate( SID_TABLE_MERGE_CELLS ); + pBindings->Invalidate( SID_TABLE_SPLIT_CELLS ); + pBindings->Invalidate( SID_OPTIMIZE_TABLE ); + pBindings->Invalidate( SID_TABLE_VERT_BOTTOM ); + pBindings->Invalidate( SID_TABLE_VERT_CENTER ); + pBindings->Invalidate( SID_TABLE_VERT_NONE ); + break; + } + case SID_TABLE_VERT_BOTTOM: + case SID_TABLE_VERT_CENTER: + case SID_TABLE_VERT_NONE: + { + pBindings->Invalidate( SID_TABLE_VERT_BOTTOM ); + pBindings->Invalidate( SID_TABLE_VERT_CENTER ); + pBindings->Invalidate( SID_TABLE_VERT_NONE ); + break; + } + } + + pBindings->Invalidate( SID_UNDO ); + pBindings->Invalidate( SID_REDO ); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/table/tableobjectbar.hxx b/sd/source/ui/table/tableobjectbar.hxx new file mode 100644 index 0000000000..c5d513bffb --- /dev/null +++ b/sd/source/ui/table/tableobjectbar.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +namespace sd { + +class View; +class ViewShell; + +} + +namespace sd::ui::table { + +class TableObjectBar final : public SfxShell +{ +public: + SFX_DECL_INTERFACE( SD_IF_SDDRAWTABLEOBJECTBAR ) + + TableObjectBar( ::sd::ViewShell* pSdViewShell, ::sd::View* pSdView); + virtual ~TableObjectBar() override; + + void GetState( SfxItemSet& rSet ); + void GetAttrState( SfxItemSet& rSet ); + void Execute( SfxRequest& rReq ); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + + ::sd::View* mpView; + ::sd::ViewShell* mpViewSh; +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/AsynchronousCall.cxx b/sd/source/ui/tools/AsynchronousCall.cxx new file mode 100644 index 0000000000..b7b70f63a0 --- /dev/null +++ b/sd/source/ui/tools/AsynchronousCall.cxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +namespace sd::tools +{ +AsynchronousCall::AsynchronousCall() + : maTimer("sd AsynchronousCall") +{ + maTimer.SetInvokeHandler(LINK(this, AsynchronousCall, TimerCallback)); +} + +AsynchronousCall::~AsynchronousCall() +{ + mpFunction.reset(); + maTimer.Stop(); +} + +void AsynchronousCall::Post(const AsynchronousFunction& rFunction) +{ + mpFunction.reset(new AsynchronousFunction(rFunction)); + maTimer.SetTimeout(10); + maTimer.Start(); +} + +IMPL_LINK(AsynchronousCall, TimerCallback, Timer*, pTimer, void) +{ + if (pTimer == &maTimer) + { + ::std::unique_ptr pFunction; + pFunction.swap(mpFunction); + (*pFunction)(); + } +} + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/ConfigurationAccess.cxx b/sd/source/ui/tools/ConfigurationAccess.cxx new file mode 100644 index 0000000000..35ccadba37 --- /dev/null +++ b/sd/source/ui/tools/ConfigurationAccess.cxx @@ -0,0 +1,113 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd::tools { + +ConfigurationAccess::ConfigurationAccess ( + const OUString& rsRootName, + const WriteMode eMode) +{ + Reference xProvider = + configuration::theDefaultProvider::get( ::comphelper::getProcessComponentContext() ); + Initialize(xProvider, rsRootName, eMode); +} + +void ConfigurationAccess::Initialize ( + const Reference& rxProvider, + const OUString& rsRootName, + const WriteMode eMode) +{ + try + { + Sequence aCreationArguments(comphelper::InitAnyPropertySequence( + { + {"nodepath", Any(rsRootName)}, + {"depth", Any(sal_Int32(-1))} + })); + + OUString sAccessService; + if (eMode == READ_ONLY) + sAccessService = "com.sun.star.configuration.ConfigurationAccess"; + else + sAccessService = "com.sun.star.configuration.ConfigurationUpdateAccess"; + + mxRoot = rxProvider->createInstanceWithArguments( + sAccessService, + aCreationArguments); + } + catch (Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd.tools"); + } +} + +Any ConfigurationAccess::GetConfigurationNode ( + const OUString& sPathToNode) +{ + return GetConfigurationNode( + Reference(mxRoot, UNO_QUERY), + sPathToNode); +} + +Any ConfigurationAccess::GetConfigurationNode ( + const css::uno::Reference& rxNode, + const OUString& sPathToNode) +{ + if (sPathToNode.isEmpty()) + return Any(rxNode); + + try + { + if (rxNode.is()) + { + return rxNode->getByHierarchicalName(sPathToNode); + } + } + catch (const Exception&) + { + TOOLS_WARN_EXCEPTION("sd", "caught exception while getting configuration node" << sPathToNode); + } + + return Any(); +} + +void ConfigurationAccess::CommitChanges() +{ + Reference xConfiguration (mxRoot, UNO_QUERY); + if (xConfiguration.is()) + xConfiguration->commitChanges(); +} + +} // end of namespace sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/EventMultiplexer.cxx b/sd/source/ui/tools/EventMultiplexer.cxx new file mode 100644 index 0000000000..59cf49569d --- /dev/null +++ b/sd/source/ui/tools/EventMultiplexer.cxx @@ -0,0 +1,658 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +class SdDrawDocument; + +namespace { +const sal_Int32 ResourceActivationEvent = 0; +const sal_Int32 ResourceDeactivationEvent = 1; +const sal_Int32 ConfigurationUpdateEvent = 2; +} + +namespace sd::tools { + +typedef comphelper::WeakComponentImplHelper< + css::beans::XPropertyChangeListener, + css::frame::XFrameActionListener, + css::view::XSelectionChangeListener, + css::drawing::framework::XConfigurationChangeListener + > EventMultiplexerImplementationInterfaceBase; + +class EventMultiplexer::Implementation + : public EventMultiplexerImplementationInterfaceBase, + public SfxListener +{ +public: + explicit Implementation (ViewShellBase& rBase); + virtual ~Implementation() override; + + void AddEventListener ( + const Link& rCallback); + + void RemoveEventListener ( + const Link& rCallback); + + void CallListeners (EventMultiplexerEvent& rEvent); + + //===== lang::XEventListener ============================================== + virtual void SAL_CALL + disposing (const css::lang::EventObject& rEventObject) override; + + //===== beans::XPropertySetListener ======================================= + virtual void SAL_CALL + propertyChange ( + const css::beans::PropertyChangeEvent& rEvent) override; + + //===== view::XSelectionChangeListener ==================================== + virtual void SAL_CALL + selectionChanged ( + const css::lang::EventObject& rEvent) override; + + //===== frame::XFrameActionListener ====================================== + /** For certain actions the listener connects to a new controller of the + frame it is listening to. This usually happens when the view shell + in the center pane is replaced by another view shell. + */ + virtual void SAL_CALL + frameAction (const css::frame::FrameActionEvent& rEvent) override; + + //===== drawing::framework::XConfigurationChangeListener ================== + virtual void SAL_CALL + notifyConfigurationChange ( + const css::drawing::framework::ConfigurationChangeEvent& rEvent) override; + + virtual void disposing(std::unique_lock&) override; + +protected: + virtual void Notify ( + SfxBroadcaster& rBroadcaster, + const SfxHint& rHint) override; + +private: + ViewShellBase& mrBase; + typedef ::std::vector> ListenerList; + ListenerList maListeners; + + /// Remember whether we are listening to the UNO controller. + bool mbListeningToController; + /// Remember whether we are listening to the frame. + bool mbListeningToFrame; + + css::uno::WeakReference mxControllerWeak; + css::uno::WeakReference mxFrameWeak; + SdDrawDocument* mpDocument; + css::uno::WeakReference + mxConfigurationControllerWeak; + + void ReleaseListeners(); + + void ConnectToController(); + void DisconnectFromController(); + + void CallListeners ( + EventMultiplexerEventId eId, + void const * pUserData = nullptr); + + DECL_LINK(SlideSorterSelectionChangeListener, LinkParamNone*, void); +}; + +constexpr OUString aCurrentPagePropertyName = u"CurrentPage"_ustr; +constexpr OUString aEditModePropertyName = u"IsMasterPageMode"_ustr; + +//===== EventMultiplexer ====================================================== + +EventMultiplexer::EventMultiplexer (ViewShellBase& rBase) + : mpImpl (new EventMultiplexer::Implementation(rBase)) +{ +} + +EventMultiplexer::~EventMultiplexer() +{ + try + { + mpImpl->dispose(); + } + catch (const RuntimeException&) + { + } + catch (const Exception&) + { + } +} + +void EventMultiplexer::AddEventListener ( + const Link& rCallback) +{ + mpImpl->AddEventListener(rCallback); +} + +void EventMultiplexer::RemoveEventListener ( + const Link& rCallback) +{ + mpImpl->RemoveEventListener(rCallback); +} + +void EventMultiplexer::MultiplexEvent( + EventMultiplexerEventId eEventId, + void const * pUserData ) +{ + EventMultiplexerEvent aEvent(eEventId, pUserData); + mpImpl->CallListeners(aEvent); +} + +//===== EventMultiplexer::Implementation ====================================== + +EventMultiplexer::Implementation::Implementation (ViewShellBase& rBase) + : mrBase (rBase), + mbListeningToController (false), + mbListeningToFrame (false), + mxControllerWeak(nullptr), + mxFrameWeak(nullptr), + mpDocument(nullptr) +{ + // Connect to the frame to listen for controllers being exchanged. + // Listen to changes of certain properties. + Reference xFrame = + mrBase.GetFrame()->GetFrame().GetFrameInterface(); + mxFrameWeak = xFrame; + if (xFrame.is()) + { + xFrame->addFrameActionListener ( Reference(this) ); + mbListeningToFrame = true; + } + + // Connect to the current controller. + ConnectToController (); + + // Listen for document changes. + mpDocument = mrBase.GetDocument(); + if (mpDocument != nullptr) + StartListening (*mpDocument); + + // Listen for configuration changes. + DrawController& rDrawController = *mrBase.GetDrawController(); + + Reference xConfigurationController ( + rDrawController.getConfigurationController()); + mxConfigurationControllerWeak = xConfigurationController; + if (!xConfigurationController.is()) + return; + + Reference xComponent (xConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->addEventListener(static_cast(this)); + + xConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationEvent, + Any(ResourceActivationEvent)); + xConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceDeactivationEvent, + Any(ResourceDeactivationEvent)); + xConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msConfigurationUpdateEndEvent, + Any(ConfigurationUpdateEvent)); +} + +EventMultiplexer::Implementation::~Implementation() +{ + DBG_ASSERT( !mbListeningToFrame, + "sd::EventMultiplexer::Implementation::~Implementation(), disposing was not called!" ); +} + +void EventMultiplexer::Implementation::ReleaseListeners() +{ + if (mbListeningToFrame) + { + mbListeningToFrame = false; + + // Stop listening for changes of certain properties. + Reference xFrame (mxFrameWeak); + if (xFrame.is()) + { + xFrame->removeFrameActionListener ( + Reference(this) ); + } + } + + DisconnectFromController (); + + if (mpDocument != nullptr) + { + EndListening (*mpDocument); + mpDocument = nullptr; + } + + // Stop listening for configuration changes. + Reference xConfigurationController (mxConfigurationControllerWeak); + if (xConfigurationController.is()) + { + Reference xComponent (xConfigurationController, UNO_QUERY); + if (xComponent.is()) + xComponent->removeEventListener(static_cast(this)); + + xConfigurationController->removeConfigurationChangeListener(this); + } +} + +void EventMultiplexer::Implementation::AddEventListener ( + const Link& rCallback) +{ + for (auto const & i : maListeners) + if (i == rCallback) + return; + maListeners.push_back(rCallback); +} + +void EventMultiplexer::Implementation::RemoveEventListener ( + const Link& rCallback) +{ + auto iListener = std::find(maListeners.begin(), maListeners.end(), rCallback); + if (iListener != maListeners.end()) + maListeners.erase(iListener); +} + +void EventMultiplexer::Implementation::ConnectToController() +{ + // Just in case that we missed some event we now disconnect from the old + // controller. + DisconnectFromController (); + + // Register at the controller of the main view shell. + + // We have to store a (weak) reference to the controller so that we can + // unregister without having to ask the mrBase member (which at that + // time may be destroyed.) + Reference xController = mrBase.GetController(); + mxControllerWeak = mrBase.GetController(); + + try + { + // Listen for disposing events. + if (xController.is()) + { + xController->addEventListener ( + Reference( + static_cast(this), UNO_QUERY)); + mbListeningToController = true; + } + + // Listen to changes of certain properties. + Reference xSet (xController, UNO_QUERY); + if (xSet.is()) + { + try + { + xSet->addPropertyChangeListener(aCurrentPagePropertyName, this); + } + catch (const beans::UnknownPropertyException&) + { + SAL_WARN("sd", "EventMultiplexer::ConnectToController: CurrentPage unknown"); + } + + try + { + xSet->addPropertyChangeListener(aEditModePropertyName, this); + } + catch (const beans::UnknownPropertyException&) + { + SAL_WARN("sd", "EventMultiplexer::ConnectToController: IsMasterPageMode unknown"); + } + } + + // Listen for selection change events. + Reference xSelection (xController, UNO_QUERY); + if (xSelection.is()) + { + xSelection->addSelectionChangeListener(this); + } + } + catch (const lang::DisposedException&) + { + mbListeningToController = false; + } +} + +void EventMultiplexer::Implementation::DisconnectFromController() +{ + if (!mbListeningToController) + return; + + mbListeningToController = false; + + Reference xController = mxControllerWeak; + + Reference xSet (xController, UNO_QUERY); + // Remove the property listener. + if (xSet.is()) + { + try + { + xSet->removePropertyChangeListener(aCurrentPagePropertyName, this); + } + catch (const beans::UnknownPropertyException&) + { + SAL_WARN("sd", "DisconnectFromController: CurrentPage unknown"); + } + + try + { + xSet->removePropertyChangeListener(aEditModePropertyName, this); + } + catch (const beans::UnknownPropertyException&) + { + SAL_WARN("sd", "DisconnectFromController: IsMasterPageMode unknown"); + } + } + + // Remove selection change listener. + Reference xSelection (xController, UNO_QUERY); + if (xSelection.is()) + { + xSelection->removeSelectionChangeListener(this); + } + + // Remove listener for disposing events. + if (xController.is()) + { + xController->removeEventListener ( + Reference(static_cast(this), UNO_QUERY)); + } +} + +//===== lang::XEventListener ================================================ + +void SAL_CALL EventMultiplexer::Implementation::disposing ( + const lang::EventObject& rEventObject) +{ + if (mbListeningToController) + { + Reference xController (mxControllerWeak); + if (rEventObject.Source == xController) + { + mbListeningToController = false; + } + } + + Reference xConfigurationController ( + mxConfigurationControllerWeak); + if (xConfigurationController.is() + && rEventObject.Source == xConfigurationController) + { + mxConfigurationControllerWeak.clear(); + } +} + +//===== beans::XPropertySetListener ========================================= + +void SAL_CALL EventMultiplexer::Implementation::propertyChange ( + const beans::PropertyChangeEvent& rEvent) +{ + if (m_bDisposed) + { + throw lang::DisposedException ( + "SlideSorterController object has already been disposed", + static_cast(this)); + } + + if ( rEvent.PropertyName == aCurrentPagePropertyName ) + { + CallListeners(EventMultiplexerEventId::CurrentPageChanged); + } + else if ( rEvent.PropertyName == aEditModePropertyName ) + { + bool bIsMasterPageMode (false); + rEvent.NewValue >>= bIsMasterPageMode; + if (bIsMasterPageMode) + CallListeners(EventMultiplexerEventId::EditModeMaster); + else + CallListeners(EventMultiplexerEventId::EditModeNormal); + } +} + +//===== frame::XFrameActionListener ========================================== + +void SAL_CALL EventMultiplexer::Implementation::frameAction ( + const frame::FrameActionEvent& rEvent) +{ + Reference xFrame (mxFrameWeak); + if (rEvent.Frame != xFrame) + return; + + switch (rEvent.Action) + { + case frame::FrameAction_COMPONENT_DETACHING: + DisconnectFromController(); + CallListeners (EventMultiplexerEventId::ControllerDetached); + break; + + case frame::FrameAction_COMPONENT_REATTACHED: + CallListeners (EventMultiplexerEventId::ControllerDetached); + DisconnectFromController(); + ConnectToController(); + CallListeners (EventMultiplexerEventId::ControllerAttached); + break; + + case frame::FrameAction_COMPONENT_ATTACHED: + ConnectToController(); + CallListeners (EventMultiplexerEventId::ControllerAttached); + break; + + default: + break; + } +} + +//===== view::XSelectionChangeListener ======================================== + +void SAL_CALL EventMultiplexer::Implementation::selectionChanged ( + const lang::EventObject& ) +{ + CallListeners (EventMultiplexerEventId::EditViewSelection); +} + +//===== drawing::framework::XConfigurationChangeListener ================== + +void SAL_CALL EventMultiplexer::Implementation::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + sal_Int32 nEventType = 0; + rEvent.UserData >>= nEventType; + switch (nEventType) + { + case ResourceActivationEvent: + if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)) + { + CallListeners (EventMultiplexerEventId::ViewAdded); + + if (rEvent.ResourceId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + CallListeners (EventMultiplexerEventId::MainViewAdded); + } + + // Add selection change listener at slide sorter. + if (rEvent.ResourceId->getResourceURL() == FrameworkHelper::msSlideSorterURL) + { + slidesorter::SlideSorterViewShell* pViewShell + = dynamic_cast( + FrameworkHelper::GetViewShell( + Reference(rEvent.ResourceObject,UNO_QUERY)).get()); + if (pViewShell != nullptr) + pViewShell->AddSelectionChangeListener ( + LINK(this, + EventMultiplexer::Implementation, + SlideSorterSelectionChangeListener)); + } + } + break; + + case ResourceDeactivationEvent: + if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)) + { + if (rEvent.ResourceId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + CallListeners (EventMultiplexerEventId::MainViewRemoved); + } + + // Remove selection change listener from slide sorter. Add + // selection change listener at slide sorter. + if (rEvent.ResourceId->getResourceURL() == FrameworkHelper::msSlideSorterURL) + { + slidesorter::SlideSorterViewShell* pViewShell + = dynamic_cast( + FrameworkHelper::GetViewShell( + Reference(rEvent.ResourceObject, UNO_QUERY)).get()); + if (pViewShell != nullptr) + pViewShell->RemoveSelectionChangeListener ( + LINK(this, + EventMultiplexer::Implementation, + SlideSorterSelectionChangeListener)); + } + } + break; + + case ConfigurationUpdateEvent: + CallListeners (EventMultiplexerEventId::ConfigurationUpdated); + break; + } + +} + +void EventMultiplexer::Implementation::disposing(std::unique_lock& rGuard) +{ + ListenerList aCopyListeners( maListeners ); + + rGuard.unlock(); + + EventMultiplexerEvent rEvent(EventMultiplexerEventId::Disposing, nullptr); + for (const auto& rListener : aCopyListeners) + rListener.Call(rEvent); + + rGuard.lock(); + + ReleaseListeners(); +} + +void EventMultiplexer::Implementation::Notify ( + SfxBroadcaster&, + const SfxHint& rHint) +{ + if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint) + { + const SdrHint* pSdrHint = static_cast(&rHint); + switch (pSdrHint->GetKind()) + { + case SdrHintKind::ModelCleared: + case SdrHintKind::PageOrderChange: + CallListeners (EventMultiplexerEventId::PageOrder); + break; + + case SdrHintKind::SwitchToPage: + CallListeners (EventMultiplexerEventId::CurrentPageChanged); + break; + + case SdrHintKind::ObjectChange: + CallListeners(EventMultiplexerEventId::ShapeChanged, + static_cast(pSdrHint->GetPage())); + break; + + case SdrHintKind::ObjectInserted: + CallListeners(EventMultiplexerEventId::ShapeInserted, + static_cast(pSdrHint->GetPage())); + break; + + case SdrHintKind::ObjectRemoved: + CallListeners(EventMultiplexerEventId::ShapeRemoved, + static_cast(pSdrHint->GetPage())); + break; + default: + break; + } + } + else + { + if (rHint.GetId() == SfxHintId::Dying) + mpDocument = nullptr; + } +} + +void EventMultiplexer::Implementation::CallListeners ( + EventMultiplexerEventId eId, + void const * pUserData) +{ + EventMultiplexerEvent aEvent(eId, pUserData); + CallListeners(aEvent); +} + +void EventMultiplexer::Implementation::CallListeners (EventMultiplexerEvent& rEvent) +{ + ListenerList aCopyListeners( maListeners ); + for (const auto& rListener : aCopyListeners) + { + rListener.Call(rEvent); + } +} + +IMPL_LINK_NOARG(EventMultiplexer::Implementation, SlideSorterSelectionChangeListener, LinkParamNone*, void) +{ + CallListeners(EventMultiplexerEventId::SlideSortedSelection); +} + +//===== EventMultiplexerEvent ================================================= + +EventMultiplexerEvent::EventMultiplexerEvent ( + EventMultiplexerEventId eEventId, + const void* pUserData) + : meEventId(eEventId), + mpUserData(pUserData) +{ +} + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/GraphicSizeCheck.cxx b/sd/source/ui/tools/GraphicSizeCheck.cxx new file mode 100644 index 0000000000..68bd33a3e1 --- /dev/null +++ b/sd/source/ui/tools/GraphicSizeCheck.cxx @@ -0,0 +1,217 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd +{ +namespace +{ +/** + * Interface for the visitor class, which handles each visited SdrObject + * in the DOM. + */ +class ModelTraverseHandler +{ +public: + virtual ~ModelTraverseHandler() {} + + virtual void handleSdrObject(SdrObject* pObject) = 0; +}; + +/** + * Traverses the DOM and calls a handler for each object (SdrObject) it + * encounters. + */ +class ModelTraverser +{ +private: + std::vector> m_pNodeHandler; + SdDrawDocument* m_pDocument; + +public: + ModelTraverser(SdDrawDocument* pDocument) + : m_pDocument(pDocument) + { + } + + void traverse() + { + if (!m_pDocument) + return; + + for (sal_uInt16 nPage = 0; nPage < m_pDocument->GetPageCount(); ++nPage) + { + SdrPage* pPage = m_pDocument->GetPage(nPage); + if (pPage) + { + for (const rtl::Reference& pObject : *pPage) + { + for (auto& pNodeHandler : m_pNodeHandler) + { + pNodeHandler->handleSdrObject(pObject.get()); + } + } + } + } + } + + void addNodeHandler(std::shared_ptr pHandler) + { + m_pNodeHandler.push_back(pHandler); + } +}; +} + +GraphicSizeViolation::GraphicSizeViolation(sal_Int32 nDPI, SdrGrafObj* pGraphicObject) + : m_pGraphicObject(pGraphicObject) +{ + constexpr double fLowPercentage = 110; + constexpr double fHighPercentage = 50; + + m_nLowDPILimit = sal_Int32(100.0 / fLowPercentage * nDPI); + m_nHighDPILimit = sal_Int32(100.0 / fHighPercentage * nDPI); +} + +bool GraphicSizeViolation::check() +{ + Graphic aGraphic = m_pGraphicObject->GetGraphic(); + Size aSizePixel = aGraphic.GetSizePixel(); + Size aGraphicSize = m_pGraphicObject->GetLogicRect().GetSize(); + + double nSizeXInch + = o3tl::convert(double(aGraphicSize.Width()), o3tl::Length::mm100, o3tl::Length::in); + double nSizeYInch + = o3tl::convert(double(aGraphicSize.Height()), o3tl::Length::mm100, o3tl::Length::in); + + m_nDPIX = sal_Int32(aSizePixel.Width() / nSizeXInch); + m_nDPIY = sal_Int32(aSizePixel.Height() / nSizeYInch); + + return isDPITooLow() || isDPITooHigh(); +} + +const OUString& GraphicSizeViolation::getGraphicName() { return m_pGraphicObject->GetName(); } + +namespace +{ +class GraphicSizeCheckHandler : public ModelTraverseHandler +{ + sal_Int32 m_nDPI; + std::vector>& m_rGraphicSizeViolationList; + +public: + GraphicSizeCheckHandler( + sal_Int32 nDPI, + std::vector>& rGraphicSizeViolationList) + : m_nDPI(nDPI) + , m_rGraphicSizeViolationList(rGraphicSizeViolationList) + { + } + + void handleSdrObject(SdrObject* pObject) override + { + auto* pGraphicObject = dynamic_cast(pObject); + if (!pGraphicObject) + return; + + auto pEntry = std::make_unique(m_nDPI, pGraphicObject); + if (pEntry->check()) + { + m_rGraphicSizeViolationList.push_back(std::move(pEntry)); + } + } +}; + +} // end anonymous namespace + +void GraphicSizeCheck::check() +{ + if (!m_pDocument) + return; + + sal_Int32 nDPI = m_pDocument->getImagePreferredDPI(); + if (nDPI == 0) + return; + + auto pHandler = std::make_shared(nDPI, m_aGraphicSizeViolationList); + + ModelTraverser aModelTraverser(m_pDocument); + aModelTraverser.addNodeHandler(pHandler); + aModelTraverser.traverse(); +} + +OUString GraphicSizeCheckGUIEntry::getText() +{ + OUString sText; + + if (m_pViolation->isDPITooLow()) + { + sText = SdResId(STR_WARNING_GRAPHIC_PIXEL_COUNT_LOW); + } + else if (m_pViolation->isDPITooHigh()) + { + sText = SdResId(STR_WARNING_GRAPHIC_PIXEL_COUNT_HIGH); + } + + sText = sText.replaceAll("%NAME%", m_pViolation->getGraphicName()); + sText = sText.replaceAll("%DPIX%", OUString::number(m_pViolation->getDPIX())); + sText = sText.replaceAll("%DPIY%", OUString::number(m_pViolation->getDPIY())); + + return sText; +} + +void GraphicSizeCheckGUIEntry::markObject() +{ + sd::ViewShell* pViewShell = m_pDocument->GetDocSh()->GetViewShell(); + SdrView* pView = pViewShell->GetView(); + pView->ShowSdrPage(m_pViolation->getObject()->getSdrPageFromSdrObject()); + pView->UnmarkAll(); + pView->MarkObj(m_pViolation->getObject(), pView->GetSdrPageView()); +} + +void GraphicSizeCheckGUIEntry::runProperties() +{ + markObject(); + sd::ViewShell* pViewShell = m_pDocument->GetDocSh()->GetViewShell(); + pViewShell->GetDispatcher()->Execute(SID_ATTR_GRAF_CROP, SfxCallMode::SYNCHRON); +} + +GraphicSizeCheckGUIResult::GraphicSizeCheckGUIResult(SdDrawDocument* pDocument) +{ + GraphicSizeCheck aCheck(pDocument); + aCheck.check(); + + auto& rCollection = getCollection(); + for (auto& rpViolation : aCheck.getViolationList()) + { + auto rGUIEntry + = std::make_unique(pDocument, std::move(rpViolation)); + rCollection.push_back(std::move(rGUIEntry)); + } +} + +OUString GraphicSizeCheckGUIResult::getTitle() +{ + return SdResId(STR_GRAPHIC_SIZE_CHECK_DIALOG_TITLE); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/IconCache.cxx b/sd/source/ui/tools/IconCache.cxx new file mode 100644 index 0000000000..0ce80922b8 --- /dev/null +++ b/sd/source/ui/tools/IconCache.cxx @@ -0,0 +1,106 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include + +namespace sd +{ +//===== IconCache::Implementation ============================================= + +class IconCache::Implementation +{ +private: + friend class IconCache; + + /** This pointer holds a valid reference from first time that + IconCache::Instance() is called to the end of the sd module when the + cache is destroyed from SdGlobalResourceContainer. + */ + static IconCache* s_pIconCache; + + typedef std::unordered_map ImageContainer; + ImageContainer maContainer; + + Image GetIcon(const OUString& rResourceId); +}; + +IconCache* IconCache::Implementation::s_pIconCache = nullptr; + +Image IconCache::Implementation::GetIcon(const OUString& rResourceId) +{ + Image aResult; + ImageContainer::iterator iImage = maContainer.find(rResourceId); + if (iImage == maContainer.end()) + { + aResult = Image(StockImage::Yes, rResourceId); + maContainer[rResourceId] = aResult; + } + else + aResult = iImage->second; + return aResult; +} + +//===== IconCache ============================================================= + +//static +IconCache& IconCache::Instance() +{ + if (Implementation::s_pIconCache == nullptr) + { + ::osl::GetGlobalMutex aMutexFunctor; + ::osl::MutexGuard aGuard(aMutexFunctor()); + if (Implementation::s_pIconCache == nullptr) + { + IconCache* pCache = new IconCache(); + SdGlobalResourceContainer::Instance().AddResource( + ::std::unique_ptr(pCache)); + OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); + Implementation::s_pIconCache = pCache; + } + } + else + { + OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); + } + + DBG_ASSERT(Implementation::s_pIconCache != nullptr, "IconCache::Instance(): instance is NULL"); + return *Implementation::s_pIconCache; +} + +Image IconCache::GetIcon(const OUString& rResourceId) { return mpImpl->GetIcon(rResourceId); } + +IconCache::IconCache() + : mpImpl(new Implementation) +{ +} + +IconCache::~IconCache() +{ + // empty +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/IdleDetection.cxx b/sd/source/ui/tools/IdleDetection.cxx new file mode 100644 index 0000000000..988bd849bf --- /dev/null +++ b/sd/source/ui/tools/IdleDetection.cxx @@ -0,0 +1,103 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include + +#include +#include + +using namespace ::com::sun::star; + +namespace sd::tools { + +IdleState IdleDetection::GetIdleState (const vcl::Window* pWindow) +{ + IdleState nResult (CheckInputPending() | CheckSlideShowRunning()); + if (pWindow != nullptr) + nResult |= CheckWindowPainting(*pWindow); + return nResult; +} + +IdleState IdleDetection::CheckInputPending() +{ + if (Application::AnyInput(VclInputFlags::MOUSE | VclInputFlags::KEYBOARD | VclInputFlags::PAINT)) + return IdleState::SystemEventPending; + else + return IdleState::Idle; +} + +IdleState IdleDetection::CheckSlideShowRunning() +{ + IdleState eResult (IdleState::Idle); + + // Iterate over all view frames. + for (SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst(); + pViewFrame!=nullptr; + pViewFrame = SfxViewFrame::GetNext(*pViewFrame)) + { + // Ignore the current frame when it does not exist, is not valid, or + // is not active. + bool bIgnoreFrame (true); + uno::Reference xFrame (pViewFrame->GetFrame().GetFrameInterface()); + try + { + if (xFrame.is() && xFrame->isActive()) + bIgnoreFrame = false; + } + catch (const uno::RuntimeException&) + { + } + if (bIgnoreFrame) + continue; + + // Get sd::ViewShell from active frame. + ViewShellBase* pBase = ViewShellBase::GetViewShellBase(pViewFrame); + if (pBase != nullptr) + { + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( *pBase ) ); + if( xSlideShow.is() && xSlideShow->isRunning() ) + { + if (xSlideShow->isFullScreen()) + eResult |= IdleState::FullScreenShowActive; + else + eResult |= IdleState::WindowShowActive; + } + } + } + + return eResult; +} + +IdleState IdleDetection::CheckWindowPainting (const vcl::Window& rWindow) +{ + if (rWindow.IsInPaint()) + return IdleState::WindowPainting; + else + return IdleState::Idle; +} + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/PreviewRenderer.cxx b/sd/source/ui/tools/PreviewRenderer.cxx new file mode 100644 index 0000000000..d3fc73bf93 --- /dev/null +++ b/sd/source/ui/tools/PreviewRenderer.cxx @@ -0,0 +1,524 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd { + +const int PreviewRenderer::snSubstitutionTextSize = 11; +const int PreviewRenderer::snFrameWidth = 1; + +namespace { + /** This incarnation of the ViewObjectContactRedirector filters away all + PageObj objects, unconditionally. + */ + class ViewRedirector : public sdr::contact::ViewObjectContactRedirector + { + public: + ViewRedirector(); + + virtual void createRedirectedPrimitive2DSequence( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override; + }; +} + +//===== PreviewRenderer ======================================================= + +PreviewRenderer::PreviewRenderer ( + const bool bHasFrame) + : mpPreviewDevice (VclPtr::Create()), + mpDocShellOfView(nullptr), + maFrameColor (svtools::ColorConfig().GetColorValue(svtools::DOCBOUNDARIES).nColor), + mbHasFrame(bHasFrame) +{ + mpPreviewDevice->SetBackground(Wallpaper( + Application::GetSettings().GetStyleSettings().GetWindowColor())); +} + +PreviewRenderer::~PreviewRenderer() +{ + if (mpDocShellOfView != nullptr) + EndListening (*mpDocShellOfView); +} + +Image PreviewRenderer::RenderPage ( + const SdPage* pPage, + const sal_Int32 nWidth) +{ + if (pPage != nullptr) + { + const Size aPageModelSize (pPage->GetSize()); + const double nAspectRatio ( + double(aPageModelSize.Width()) / double(aPageModelSize.Height())); + const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0); + const sal_Int32 nHeight (sal::static_int_cast( + (nWidth - 2*nFrameWidth) / nAspectRatio + 2*nFrameWidth + 0.5)); + return RenderPage ( + pPage, + Size(nWidth,nHeight), + false/*bObeyHighContrastMode*/); + } + else + return Image(); +} + +Image PreviewRenderer::RenderPage ( + const SdPage* pPage, + Size aPixelSize, + const bool bObeyHighContrastMode, + const bool bDisplayPresentationObjects) +{ + Image aPreview; + + if (pPage != nullptr) + { + try + { + if (Initialize(pPage, aPixelSize, bObeyHighContrastMode)) + { + PaintPage(pPage, bDisplayPresentationObjects); + PaintSubstitutionText(""); + PaintFrame(); + + Size aSize (mpPreviewDevice->GetOutputSizePixel()); + aPreview = Image(mpPreviewDevice->GetBitmapEx( + mpPreviewDevice->PixelToLogic(Point(0,0)), + mpPreviewDevice->PixelToLogic(aSize))); + + mpView->HideSdrPage(); + } + } + catch (const css::uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd.tools"); + } + } + + return aPreview; +} + +Image PreviewRenderer::RenderSubstitution ( + const Size& rPreviewPixelSize, + const OUString& rSubstitutionText) +{ + Image aPreview; + + try + { + // Set size. + mpPreviewDevice->SetOutputSizePixel(rPreviewPixelSize); + + // Adjust contrast mode. + const bool bUseContrast ( + Application::GetSettings().GetStyleSettings().GetHighContrastMode()); + mpPreviewDevice->SetDrawMode (bUseContrast + ? sd::OUTPUT_DRAWMODE_CONTRAST + : sd::OUTPUT_DRAWMODE_COLOR); + + // Set a map mode that makes a typical substitution text completely + // visible. + MapMode aMapMode (mpPreviewDevice->GetMapMode()); + aMapMode.SetMapUnit(MapUnit::Map100thMM); + Fraction aFinalScale(25 * rPreviewPixelSize.Width(), 28000); + aMapMode.SetScaleX(aFinalScale); + aMapMode.SetScaleY(aFinalScale); + const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0); + aMapMode.SetOrigin(mpPreviewDevice->PixelToLogic( + Point(nFrameWidth,nFrameWidth),aMapMode)); + mpPreviewDevice->SetMapMode (aMapMode); + + // Clear the background. + const ::tools::Rectangle aPaintRectangle ( + Point(0,0), + mpPreviewDevice->GetOutputSizePixel()); + mpPreviewDevice->EnableMapMode(false); + mpPreviewDevice->SetLineColor(); + svtools::ColorConfig aColorConfig; + mpPreviewDevice->SetFillColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor); + mpPreviewDevice->DrawRect (aPaintRectangle); + mpPreviewDevice->EnableMapMode(); + + // Paint substitution text and a frame around it. + PaintSubstitutionText (rSubstitutionText); + PaintFrame(); + + const Size aSize (mpPreviewDevice->GetOutputSizePixel()); + aPreview = Image(mpPreviewDevice->GetBitmapEx( + mpPreviewDevice->PixelToLogic(Point(0,0)), + mpPreviewDevice->PixelToLogic(aSize))); + } + catch (const css::uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd.tools"); + } + + return aPreview; +} + +bool PreviewRenderer::Initialize ( + const SdPage* pPage, + const Size& rPixelSize, + const bool bObeyHighContrastMode) +{ + if (!pPage) + return false; + + SetupOutputSize(*pPage, rPixelSize); + SdDrawDocument& rDocument(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage())); + DrawDocShell* pDocShell = rDocument.GetDocSh(); + + if (!pDocShell) + return false; + + // Create view + ProvideView (pDocShell); + if (mpView == nullptr) + return false; + + // Adjust contrast mode. + bool bUseContrast (bObeyHighContrastMode + && Application::GetSettings().GetStyleSettings().GetHighContrastMode()); + mpPreviewDevice->SetDrawMode (bUseContrast + ? sd::OUTPUT_DRAWMODE_CONTRAST + : sd::OUTPUT_DRAWMODE_COLOR); + mpPreviewDevice->SetSettings(Application::GetSettings()); + + // Tell the view to show the given page. + SdPage* pNonConstPage = const_cast(pPage); + if (pPage->IsMasterPage()) + { + mpView->ShowSdrPage(mpView->GetModel().GetMasterPage(pPage->GetPageNum())); + } + else + { + mpView->ShowSdrPage(pNonConstPage); + } + + // Make sure that a page view exists. + SdrPageView* pPageView = mpView->GetSdrPageView(); + + if (pPageView == nullptr) + return false; + + // #i121224# No need to set SetApplicationBackgroundColor (which is the color + // of the area 'behind' the page (formerly called 'Wiese') since the page previews + // produced exactly cover the page's area, so it would never be visible. What + // needs to be set is the ApplicationDocumentColor which is derived from + // svtools::DOCCOLOR normally + Color aApplicationDocumentColor; + + if (pPageView->GetApplicationDocumentColor() == COL_AUTO) + { + svtools::ColorConfig aColorConfig; + aApplicationDocumentColor = aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor; + } + else + { + aApplicationDocumentColor = pPageView->GetApplicationDocumentColor(); + } + + pPageView->SetApplicationDocumentColor(aApplicationDocumentColor); + SdrOutliner& rOutliner(rDocument.GetDrawOutliner()); + rOutliner.SetBackgroundColor(aApplicationDocumentColor); + rOutliner.SetDefaultLanguage(rDocument.GetLanguage(EE_CHAR_LANGUAGE)); + mpPreviewDevice->SetBackground(Wallpaper(aApplicationDocumentColor)); + mpPreviewDevice->Erase(); + + return true; +} + +void PreviewRenderer::PaintPage ( + const SdPage* pPage, + const bool bDisplayPresentationObjects) +{ + // Paint the page. + ::tools::Rectangle aPaintRectangle (Point(0,0), pPage->GetSize()); + vcl::Region aRegion (aPaintRectangle); + + // Turn off online spelling and redlining. + SdrOutliner* pOutliner = nullptr; + EEControlBits nSavedControlWord = EEControlBits::NONE; + if (mpDocShellOfView!=nullptr && mpDocShellOfView->GetDoc()!=nullptr) + { + pOutliner = &mpDocShellOfView->GetDoc()->GetDrawOutliner(); + nSavedControlWord = pOutliner->GetControlWord(); + pOutliner->SetControlWord(nSavedControlWord & ~EEControlBits::ONLINESPELLING); + } + + // Use a special redirector to prevent PresObj shapes from being painted. + std::unique_ptr pRedirector; + if ( ! bDisplayPresentationObjects) + pRedirector.reset(new ViewRedirector()); + + try + { + mpView->CompleteRedraw(mpPreviewDevice.get(), aRegion, pRedirector.get()); + } + catch (const css::uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd.tools"); + } + + // Restore the previous online spelling and redlining states. + if (pOutliner != nullptr) + pOutliner->SetControlWord(nSavedControlWord); +} + +void PreviewRenderer::PaintSubstitutionText (const OUString& rSubstitutionText) +{ + if (rSubstitutionText.isEmpty()) + return; + + // Set the font size. + const vcl::Font& rOriginalFont (mpPreviewDevice->GetFont()); + vcl::Font aFont (mpPreviewDevice->GetSettings().GetStyleSettings().GetAppFont()); + sal_Int32 nHeight (mpPreviewDevice->PixelToLogic(Size(0,snSubstitutionTextSize)).Height()); + aFont.SetFontHeight(nHeight); + mpPreviewDevice->SetFont (aFont); + + // Paint the substitution text. + ::tools::Rectangle aTextBox ( + Point(0,0), + mpPreviewDevice->PixelToLogic( + mpPreviewDevice->GetOutputSizePixel())); + DrawTextFlags const nTextStyle = + DrawTextFlags::Center + | DrawTextFlags::VCenter + | DrawTextFlags::MultiLine + | DrawTextFlags::WordBreak; + mpPreviewDevice->DrawText (aTextBox, rSubstitutionText, nTextStyle); + + // Restore the font. + mpPreviewDevice->SetFont (rOriginalFont); +} + +void PreviewRenderer::PaintFrame() +{ + if (mbHasFrame) + { + // Paint a frame around the preview. + ::tools::Rectangle aPaintRectangle ( + Point(0,0), + mpPreviewDevice->GetOutputSizePixel()); + mpPreviewDevice->EnableMapMode(false); + mpPreviewDevice->SetLineColor(maFrameColor); + mpPreviewDevice->SetFillColor(); + mpPreviewDevice->DrawRect(aPaintRectangle); + mpPreviewDevice->EnableMapMode(); + } +} + +void PreviewRenderer::SetupOutputSize ( + const SdPage& rPage, + const Size& rFramePixelSize) +{ + // First set the map mode to some arbitrary scale that is numerically + // stable. + MapMode aMapMode (mpPreviewDevice->GetMapMode()); + aMapMode.SetMapUnit(MapUnit::MapPixel); + + // Adapt it to the desired width. + const Size aPageModelSize (rPage.GetSize()); + if (!aPageModelSize.IsEmpty()) + { + const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0); + aMapMode.SetScaleX( + Fraction(rFramePixelSize.Width()-2*nFrameWidth-1, aPageModelSize.Width())); + aMapMode.SetScaleY( + Fraction(rFramePixelSize.Height()-2*nFrameWidth-1, aPageModelSize.Height())); + aMapMode.SetOrigin(mpPreviewDevice->PixelToLogic(Point(nFrameWidth,nFrameWidth),aMapMode)); + } + else + { + // We should never get here. + OSL_ASSERT(false); + aMapMode.SetScaleX(Fraction(1.0)); + aMapMode.SetScaleY(Fraction(1.0)); + } + mpPreviewDevice->SetMapMode (aMapMode); + mpPreviewDevice->SetOutputSizePixel(rFramePixelSize); +} + +void PreviewRenderer::ProvideView (DrawDocShell* pDocShell) +{ + if (pDocShell != mpDocShellOfView) + { + // Destroy the view that is connected to the current doc shell. + mpView.reset(); + + // Switch our attention, i.e. listening for DYING events, to + // the new doc shell. + if (mpDocShellOfView != nullptr) + EndListening (*mpDocShellOfView); + mpDocShellOfView = pDocShell; + if (mpDocShellOfView != nullptr) + StartListening (*mpDocShellOfView); + } + if (mpView == nullptr) + { + mpView.reset (new DrawView (pDocShell, mpPreviewDevice.get(), nullptr)); + } + mpView->SetPreviewRenderer(true); + mpView->SetPageVisible(false); + mpView->SetPageBorderVisible(); + mpView->SetBordVisible(false); + mpView->SetGridVisible(false); + mpView->SetHlplVisible(false); + mpView->SetGlueVisible(false); +} + +Image PreviewRenderer::ScaleBitmap ( + const BitmapEx& rBitmapEx, + int nWidth) +{ + Image aPreview; + + do + { + // Adjust contrast mode. + bool bUseContrast = Application::GetSettings().GetStyleSettings(). + GetHighContrastMode(); + mpPreviewDevice->SetDrawMode (bUseContrast + ? sd::OUTPUT_DRAWMODE_CONTRAST + : sd::OUTPUT_DRAWMODE_COLOR); + + // Set output size. + Size aSize (rBitmapEx.GetSizePixel()); + if (aSize.Width() <= 0) + break; + Size aFrameSize ( + nWidth, + static_cast<::tools::Long>((nWidth*1.0 * aSize.Height()) / aSize.Width() + 0.5)); + Size aPreviewSize (aFrameSize.Width()-2,aFrameSize.Height()-2); + MapMode aMapMode (mpPreviewDevice->GetMapMode()); + aMapMode.SetMapUnit(MapUnit::MapPixel); + aMapMode.SetOrigin (Point()); + aMapMode.SetScaleX (Fraction(1.0)); + aMapMode.SetScaleY (Fraction(1.0)); + mpPreviewDevice->SetMapMode (aMapMode); + mpPreviewDevice->SetOutputSize (aFrameSize); + + // Paint a frame around the preview. + mpPreviewDevice->SetLineColor (maFrameColor); + mpPreviewDevice->SetFillColor (); + mpPreviewDevice->DrawRect (::tools::Rectangle(Point(0,0), aFrameSize)); + + // Paint the bitmap scaled to the desired width. + BitmapEx aScaledBitmap(rBitmapEx); + aScaledBitmap.Scale (aPreviewSize, BmpScaleFlag::BestQuality); + mpPreviewDevice->DrawBitmapEx ( + Point(1,1), + aPreviewSize, + aScaledBitmap); + + // Get the resulting bitmap. + aPreview = Image(mpPreviewDevice->GetBitmapEx(Point(0,0), aFrameSize)); + } + while (false); + + return aPreview; +} + +void PreviewRenderer::Notify(SfxBroadcaster&, const SfxHint& rHint) +{ + if (!mpDocShellOfView) + return; + + if (rHint.GetId() == SfxHintId::Dying) + { + // The doc shell is dying. Our view uses its item pool and + // has to be destroyed as well. The next call to + // ProvideView will create a new one (for another + // doc shell, of course.) + mpView.reset(); + mpDocShellOfView = nullptr; + } +} + +//===== ViewRedirector ======================================================== + +namespace { + +ViewRedirector::ViewRedirector() +{ +} + +void ViewRedirector::createRedirectedPrimitive2DSequence( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) +{ + SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject(); + + if (pObject==nullptr || pObject->getSdrPageFromSdrObject() == nullptr) + { + // not a SdrObject visualisation (maybe e.g. page) or no page + sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence( + rOriginal, + rDisplayInfo, + rVisitor); + return; + } + + const bool bDoCreateGeometry (pObject->getSdrPageFromSdrObject()->checkVisibility( rOriginal, rDisplayInfo, true)); + + if ( ! bDoCreateGeometry + && (pObject->GetObjInventor() != SdrInventor::Default || pObject->GetObjIdentifier() != SdrObjKind::Page)) + { + return; + } + + if (pObject->IsEmptyPresObj()) + return; + + sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence( + rOriginal, + rDisplayInfo, + rVisitor); +} + +} // end of anonymous namespace + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/SdGlobalResourceContainer.cxx b/sd/source/ui/tools/SdGlobalResourceContainer.cxx new file mode 100644 index 0000000000..7f692caa15 --- /dev/null +++ b/sd/source/ui/tools/SdGlobalResourceContainer.cxx @@ -0,0 +1,198 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include <../cache/SlsCacheConfiguration.hxx> + +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd { + +class SdGlobalResourceContainerInstance + : public comphelper::unique_disposing_solar_mutex_reset_ptr +{ +public: + SdGlobalResourceContainerInstance() + : comphelper::unique_disposing_solar_mutex_reset_ptr( + uno::Reference(frame::Desktop::create(comphelper::getProcessComponentContext()), uno::UNO_QUERY_THROW), + new SdGlobalResourceContainer, true) + { + } +}; + +namespace { + +SdGlobalResourceContainerInstance& theSdGlobalResourceContainerInstance() +{ + static SdGlobalResourceContainerInstance SINGLETON; + return SINGLETON; +} + +} // namespace + +//===== SdGlobalResourceContainer::Implementation ============================= + +class SdGlobalResourceContainer::Implementation +{ +private: + friend class SdGlobalResourceContainer; + + std::mutex maMutex; + + /** All instances of SdGlobalResource in this vector are owned by the + container and will be destroyed when the container is destroyed. + */ + std::vector> maResources; + + typedef ::std::vector > SharedResourceList; + SharedResourceList maSharedResources; + + typedef ::std::vector > XInterfaceResourceList; + XInterfaceResourceList maXInterfaceResources; +}; + +// static +SdGlobalResourceContainer& SdGlobalResourceContainer::Instance() +{ + SdGlobalResourceContainer *const pRet(theSdGlobalResourceContainerInstance().get()); + assert(pRet); // error if it has been deleted and is null + return *pRet; +} + +//===== SdGlobalResourceContainer ============================================= + +void SdGlobalResourceContainer::AddResource ( + ::std::unique_ptr pResource) +{ + std::unique_lock aGuard (mpImpl->maMutex); + + assert( std::none_of( + mpImpl->maResources.begin(), + mpImpl->maResources.end(), + [&](const std::unique_ptr& p) { return p == pResource; }) + && "duplicate resource?"); + + mpImpl->maResources.push_back(std::move(pResource)); +} + +void SdGlobalResourceContainer::AddResource ( + const std::shared_ptr& pResource) +{ + std::unique_lock aGuard (mpImpl->maMutex); + + Implementation::SharedResourceList::iterator iResource = ::std::find ( + mpImpl->maSharedResources.begin(), + mpImpl->maSharedResources.end(), + pResource); + if (iResource == mpImpl->maSharedResources.end()) + mpImpl->maSharedResources.push_back(pResource); + else + { + SAL_WARN ("sd.tools", + "SdGlobalResourceContainer:AddResource(): Resource added twice."); + } +} + +void SdGlobalResourceContainer::AddResource (const Reference& rxResource) +{ + std::unique_lock aGuard (mpImpl->maMutex); + + Implementation::XInterfaceResourceList::iterator iResource = ::std::find ( + mpImpl->maXInterfaceResources.begin(), + mpImpl->maXInterfaceResources.end(), + rxResource); + if (iResource == mpImpl->maXInterfaceResources.end()) + mpImpl->maXInterfaceResources.push_back(rxResource); + else + { + SAL_WARN ("sd.tools", + "SdGlobalResourceContainer:AddResource(): Resource added twice."); + } +} + +SdGlobalResourceContainer::SdGlobalResourceContainer() + : mpImpl (new SdGlobalResourceContainer::Implementation) +{ +} + +SdGlobalResourceContainer::~SdGlobalResourceContainer() +{ + std::unique_lock aGuard (mpImpl->maMutex); + + // Release the resources in reversed order of their addition to the + // container. This is because a resource A added before resource B + // may have been created due to a request of B. Thus B depends on A and + // should be destroyed first. + for (auto iResource = mpImpl->maResources.rbegin(); + iResource != mpImpl->maResources.rend(); + ++iResource) + { + iResource->reset(); + } + + + // The SharedResourceList has not to be released manually. We just + // assert resources that are still held by someone other than us. + Implementation::SharedResourceList::reverse_iterator iSharedResource; + for (iSharedResource = mpImpl->maSharedResources.rbegin(); + iSharedResource != mpImpl->maSharedResources.rend(); + ++iSharedResource) + { + if (iSharedResource->use_count() > 1) + { + SdGlobalResource* pResource = iSharedResource->get(); + SAL_INFO( + "sd.tools", pResource << " " << iSharedResource->use_count()); + DBG_ASSERT(iSharedResource->use_count() == 1, + "SdGlobalResource still held in ~SdGlobalResourceContainer"); + } + } + + Implementation::XInterfaceResourceList::reverse_iterator iXInterfaceResource; + for (iXInterfaceResource = mpImpl->maXInterfaceResources.rbegin(); + iXInterfaceResource != mpImpl->maXInterfaceResources.rend(); + ++iXInterfaceResource) + { + Reference xComponent (*iXInterfaceResource, UNO_QUERY); + *iXInterfaceResource = nullptr; + if (xComponent.is()) + xComponent->dispose(); + } + + sd::slidesorter::cache::CacheConfiguration::Shutdown(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/SlotStateListener.cxx b/sd/source/ui/tools/SlotStateListener.cxx new file mode 100644 index 0000000000..9b75b322ee --- /dev/null +++ b/sd/source/ui/tools/SlotStateListener.cxx @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; + +namespace sd::tools { + +SlotStateListener::SlotStateListener ( + Link const & rCallback, + const uno::Reference& rxDispatchProvider, + const OUString& rSlotName) + : mxDispatchProviderWeak(nullptr) +{ + SetCallback(rCallback); + ConnectToDispatchProvider(rxDispatchProvider); + ObserveSlot(rSlotName); +} + +SlotStateListener::~SlotStateListener() +{ + ReleaseListeners(); +} + +void SlotStateListener::SetCallback (const Link& rCallback) +{ + ThrowIfDisposed(); + + maCallback = rCallback; +} + +void SlotStateListener::ConnectToDispatchProvider ( + const uno::Reference& rxDispatchProvider) +{ + ThrowIfDisposed(); + + // When we are listening to state changes of slots of another frame then + // release these listeners first. + if ( ! maRegisteredURLList.empty()) + ReleaseListeners(); + + mxDispatchProviderWeak = rxDispatchProvider; +} + +void SlotStateListener::ObserveSlot (const OUString& rSlotName) +{ + ThrowIfDisposed(); + + if (maCallback.IsSet()) + { + // Connect the state change listener. + util::URL aURL (MakeURL(rSlotName)); + uno::Reference xDispatch (GetDispatch(aURL)); + if (xDispatch.is()) + { + maRegisteredURLList.push_back(aURL); + xDispatch->addStatusListener(this,aURL); + } + } +} + +void SlotStateListener::disposing(std::unique_lock&) +{ + ReleaseListeners(); + mxDispatchProviderWeak.clear(); + maCallback = Link(); +} + +util::URL SlotStateListener::MakeURL (const OUString& rSlotName) +{ + util::URL aURL; + aURL.Complete = rSlotName; + + uno::Reference xTransformer(util::URLTransformer::create(::comphelper::getProcessComponentContext())); + xTransformer->parseStrict(aURL); + + return aURL; +} + +uno::Reference + SlotStateListener::GetDispatch (const util::URL& rURL) const +{ + uno::Reference xDispatch; + + uno::Reference xDispatchProvider (mxDispatchProviderWeak); + if (xDispatchProvider.is()) + xDispatch = xDispatchProvider->queryDispatch(rURL, OUString(), 0); + + return xDispatch; +} + +void SlotStateListener::statusChanged ( + const frame::FeatureStateEvent& rState) +{ + ThrowIfDisposed(); + OUString sSlotName (rState.FeatureURL.Complete); + maCallback.Call(sSlotName); +} + +void SlotStateListener::ReleaseListeners() +{ + for (const auto& rURL : maRegisteredURLList) + { + uno::Reference xDispatch (GetDispatch(rURL)); + if (xDispatch.is()) + { + xDispatch->removeStatusListener(this,rURL); + } + } +} + +//===== lang::XEventListener ================================================ + +void SAL_CALL SlotStateListener::disposing ( + const lang::EventObject& ) +{ +} + +void SlotStateListener::ThrowIfDisposed() +{ + if (m_bDisposed) + { + throw lang::DisposedException ("SlideSorterController object has already been disposed", + static_cast(this)); + } +} + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/tools/TimerBasedTaskExecution.cxx b/sd/source/ui/tools/TimerBasedTaskExecution.cxx new file mode 100644 index 0000000000..bfd2e2fae5 --- /dev/null +++ b/sd/source/ui/tools/TimerBasedTaskExecution.cxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +namespace sd::tools { + +/** Used by the shared_ptr instead of the private destructor. +*/ +class TimerBasedTaskExecution::Deleter +{ +public: + void operator() (TimerBasedTaskExecution* pObject) + { + delete pObject; + } +}; + +std::shared_ptr TimerBasedTaskExecution::Create ( + const std::shared_ptr& rpTask, + sal_uInt32 nMillisecondsBetweenSteps, + sal_uInt32 nMaxTimePerStep) +{ + std::shared_ptr pExecution( + new TimerBasedTaskExecution(rpTask,nMillisecondsBetweenSteps,nMaxTimePerStep), + Deleter()); + // Let the new object have a shared_ptr to itself, so that it can + // release itself when the AsynchronousTask has been executed + // completely. + if (pExecution->mpTask != nullptr) + pExecution->mpSelf = pExecution; + return pExecution; +} + +void TimerBasedTaskExecution::Release() +{ + maTimer.Stop(); + mpSelf.reset(); +} + +//static +void TimerBasedTaskExecution::ReleaseTask ( + const std::weak_ptr& rpExecution) +{ + if ( rpExecution.expired()) + return; + + try + { + std::shared_ptr pExecution (rpExecution); + pExecution->Release(); + } + catch (const std::bad_weak_ptr&) + { + // When a bad_weak_ptr has been thrown then the object pointed + // to by rpTask has been released right after we checked that it + // still existed. Too bad, but that means, that we have nothing + // more do. + } +} + +TimerBasedTaskExecution::TimerBasedTaskExecution ( + std::shared_ptr pTask, + sal_uInt32 nMillisecondsBetweenSteps, + sal_uInt32 nMaxTimePerStep) + : mpTask(std::move(pTask)), + maTimer("sd TimerBasedTaskExecution maTimer"), + mnMaxTimePerStep(nMaxTimePerStep) +{ + maTimer.SetInvokeHandler( LINK(this,TimerBasedTaskExecution,TimerCallback) ); + maTimer.SetTimeout(nMillisecondsBetweenSteps); + maTimer.Start(); +} + +TimerBasedTaskExecution::~TimerBasedTaskExecution() +{ + maTimer.Stop(); +} + +IMPL_LINK_NOARG(TimerBasedTaskExecution, TimerCallback, Timer *, void) +{ + if (mpTask == nullptr) + return; + + if (mpTask->HasNextStep()) + { + // Execute as many steps as fit into the time span of length + // mnMaxTimePerStep. Note that the last step may take longer + // than allowed. + sal_uInt32 nStartTime (::tools::Time( ::tools::Time::SYSTEM ).GetMSFromTime()); + SAL_INFO("sd.tools", __func__ << ": starting TimerBasedTaskExecution at " << nStartTime); + do + { + mpTask->RunNextStep(); + sal_uInt32 nDuration (::tools::Time( ::tools::Time::SYSTEM ).GetMSFromTime()-nStartTime); + SAL_INFO("sd.tools", __func__ << ": executed step in " << nDuration); + if (nDuration > mnMaxTimePerStep) + break; + } + while (mpTask->HasNextStep()); + SAL_INFO("sd.tools", __func__ << ": TimerBasedTaskExecution sleeping"); + maTimer.Start(); + } + else + mpSelf.reset(); +} + +} // end of namespace ::sd::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/uitest/uiobject.cxx b/sd/source/ui/uitest/uiobject.cxx new file mode 100644 index 0000000000..00884fc90d --- /dev/null +++ b/sd/source/ui/uitest/uiobject.cxx @@ -0,0 +1,176 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ +class ImpressSdrObject : public SdrUIObject +{ +public: + ImpressSdrObject(const VclPtr& xImpressWin, OUString aName); + + SdrObject* get_object() override; + +private: + VclPtr mxWindow; + + OUString maName; +}; + +sd::DrawViewShell* getViewShell(const VclPtr& xWindow) +{ + sd::DrawViewShell* pViewShell = dynamic_cast(xWindow->GetViewShell()); + assert(pViewShell); + + return pViewShell; +} + +OUString getObjectName(SdrObject const* pObject) +{ + if (pObject->GetName().isEmpty()) + return "Unnamed Drawinglayer object " + OUString::number(pObject->GetOrdNum()); + else + return pObject->GetName(); +} + +SdrObject* getObject(const VclPtr& xWindow, std::u16string_view rName) +{ + SdrPage* pPage = getViewShell(xWindow)->getCurrentPage(); + + if (!pPage) + return nullptr; + + for (const rtl::Reference& pObj : *pPage) + if (rName == getObjectName(pObj.get())) + return pObj.get(); + + return nullptr; +} +} + +ImpressSdrObject::ImpressSdrObject(const VclPtr& xImpressWin, OUString aName) + : mxWindow(xImpressWin) + , maName(std::move(aName)) +{ +} + +SdrObject* ImpressSdrObject::get_object() { return getObject(mxWindow, maName); } + +ImpressWindowUIObject::ImpressWindowUIObject(const VclPtr& xWindow) + : WindowUIObject(xWindow) + , mxWindow(xWindow) +{ +} + +StringMap ImpressWindowUIObject::get_state() +{ + StringMap aMap = WindowUIObject::get_state(); + + aMap["SelectedText"] = getViewShell(mxWindow)->GetSelectionText(false); + aMap["CurrentSlide"] = OUString::number(getViewShell(mxWindow)->GetCurPagePos() + 1); + aMap["Zoom"] = OUString::number(getViewShell(mxWindow)->GetZoom()); + + return aMap; +} + +void ImpressWindowUIObject::execute(const OUString& rAction, const StringMap& rParameters) +{ + if (rAction == "SET") + { + if (rParameters.find("ZOOM") != rParameters.end()) + { + auto itr = rParameters.find("ZOOM"); + OUString aVal = itr->second; + sal_Int32 nVal = aVal.toInt32(); + getViewShell(mxWindow)->SetZoom(nVal); + } + } + else if (rAction == "GOTO") + { + if (rParameters.find("PAGE") != rParameters.end()) + { + auto itr = rParameters.find("PAGE"); + OUString aVal = itr->second; + sal_Int32 nVal = aVal.toInt32(); + getViewShell(mxWindow)->SwitchPage(nVal - 1); + } + } + else if (rAction == "SELECT") + { + if (rParameters.find("OBJECT") != rParameters.end()) + { + auto itr = rParameters.find("OBJECT"); + OUString aName = itr->second; + SdrObject* pObj = getObject(mxWindow, aName); + SdrPageView* pPageView = getViewShell(mxWindow)->GetView()->GetSdrPageView(); + getViewShell(mxWindow)->GetView()->MarkObj(pObj, pPageView); + } + } + else if (rAction == "SIDEBAR") + { + SfxViewFrame* pViewFrm = SfxViewFrame::Current(); + DBG_ASSERT(pViewFrm, "ImpressWindowUIObject::execute: no viewframe"); + pViewFrm->ShowChildWindow(SID_SIDEBAR); + + auto itr = rParameters.find("PANEL"); + if (itr != rParameters.end()) + { + OUString aVal = itr->second; + ::sfx2::sidebar::Sidebar::ShowPanel(aVal, pViewFrm->GetFrame().GetFrameInterface()); + } + } + else if (rAction == "DESELECT") + { + getViewShell(mxWindow)->GetView()->UnMarkAll(); + } + else + WindowUIObject::execute(rAction, rParameters); +} + +std::unique_ptr ImpressWindowUIObject::get_child(const OUString& rID) +{ + return std::unique_ptr(new ImpressSdrObject(mxWindow, rID)); +} + +std::set ImpressWindowUIObject::get_children() const +{ + SdrPage* pPage = getViewShell(mxWindow)->getCurrentPage(); + + std::set aRet; + if (!pPage) + return aRet; + + for (const rtl::Reference& pObject : *pPage) + aRet.insert(getObjectName(pObject.get())); + + return aRet; +} + +OUString ImpressWindowUIObject::get_name() const { return "ImpressWindowUIObject"; } + +std::unique_ptr ImpressWindowUIObject::create(vcl::Window* pWindow) +{ + sd::Window* pWin = dynamic_cast(pWindow); + assert(pWin); + return std::unique_ptr(new ImpressWindowUIObject(pWin)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/DrawController.cxx b/sd/source/ui/unoidl/DrawController.cxx new file mode 100644 index 0000000000..011bfe9398 --- /dev/null +++ b/sd/source/ui/unoidl/DrawController.cxx @@ -0,0 +1,792 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using vcl::EnumContext; + +namespace sd { + +DrawController::DrawController (ViewShellBase& rBase) noexcept + : DrawControllerInterfaceBase(&rBase), + BroadcastHelperOwner(SfxBaseController::m_aMutex), + OPropertySetHelper(BroadcastHelperOwner::maBroadcastHelper), + mpCurrentLayer(nullptr), + m_aSelectionTypeIdentifier( + cppu::UnoType::get()), + mpBase(&rBase), + mpCurrentPage(nullptr), + mbMasterPageMode(false), + mbLayerMode(false), + mbDisposing(false) +{ + ProvideFrameworkControllers(); +} + +DrawController::~DrawController() noexcept +{ +} + +void DrawController::SetSubController ( + const Reference& rxSubController) +{ + // Update the internal state. + mxSubController = rxSubController; + mpPropertyArrayHelper.reset(); + maLastVisArea = ::tools::Rectangle(); + + // Inform listeners about the changed state. + FireSelectionChangeListener(); +} + +// XInterface + +IMPLEMENT_FORWARD_XINTERFACE2( + DrawController, + DrawControllerInterfaceBase, + OPropertySetHelper); + +// XTypeProvider + +Sequence SAL_CALL DrawController::getTypes() +{ + ThrowIfDisposed(); + // OPropertySetHelper does not provide getTypes, so we have to + // implement this method manually and list its three interfaces. + OTypeCollection aTypeCollection ( + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get()); + + return ::comphelper::concatSequences( + SfxBaseController::getTypes(), + aTypeCollection.getTypes(), + DrawControllerInterfaceBase::getTypes()); +} + +IMPLEMENT_GET_IMPLEMENTATION_ID(DrawController); + +// XComponent + +void SAL_CALL DrawController::dispose() +{ + if( mbDisposing ) + return; + + SolarMutexGuard aGuard; + + if( mbDisposing ) + return; + + mbDisposing = true; + + std::shared_ptr pViewShell; + if (mpBase) + pViewShell = mpBase->GetMainViewShell(); + if ( pViewShell ) + { + pViewShell->DeactivateCurrentFunction(); + auto* pView = pViewShell->GetView(); + if (pView) + pView->getSearchContext().resetSearchFunction(); + } + pViewShell.reset(); + + // When the controller has not been detached from its view + // shell, i.e. mpViewShell is not NULL, then tell PaneManager + // and ViewShellManager to clear the shell stack. + if (mxSubController.is() && mpBase!=nullptr) + { + mpBase->DisconnectAllClients(); + mpBase->GetViewShellManager()->Shutdown(); + } + + OPropertySetHelper::disposing(); + + DisposeFrameworkControllers(); + + SfxBaseController::dispose(); +} + +void SAL_CALL DrawController::addEventListener( + const Reference& xListener) +{ + ThrowIfDisposed(); + SfxBaseController::addEventListener( xListener ); +} + +void SAL_CALL DrawController::removeEventListener ( + const Reference& aListener) +{ + if(!rBHelper.bDisposed && !rBHelper.bInDispose && !mbDisposing) + SfxBaseController::removeEventListener( aListener ); +} + +// XController +sal_Bool SAL_CALL DrawController::suspend( sal_Bool Suspend ) +{ + if( Suspend ) + { + ViewShellBase* pViewShellBase = GetViewShellBase(); + if( pViewShellBase ) + { + // do not allow suspend if a slideshow needs this controller! + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( *pViewShellBase ) ); + if( xSlideShow.is() && xSlideShow->dependsOn(pViewShellBase) ) + return false; + } + } + + return SfxBaseController::suspend( Suspend ); +} + +// XServiceInfo +OUString SAL_CALL DrawController::getImplementationName( ) +{ + // Do not throw an exception at the moment. This leads to a crash + // under Solaris on reload. See issue i70929 for details. + // ThrowIfDisposed(); + return "DrawController" ; +} + +constexpr OUString ssServiceName = u"com.sun.star.drawing.DrawingDocumentDrawView"_ustr; + +sal_Bool SAL_CALL DrawController::supportsService (const OUString& rsServiceName) +{ + return cppu::supportsService(this, rsServiceName); +} + +Sequence SAL_CALL DrawController::getSupportedServiceNames() +{ + ThrowIfDisposed(); + Sequence aSupportedServices { ssServiceName }; + return aSupportedServices; +} + +//------ XSelectionSupplier -------------------------------------------- +sal_Bool SAL_CALL DrawController::select (const Any& aSelection) +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + if (mxSubController.is()) + return mxSubController->select(aSelection); + else + return false; +} + +Any SAL_CALL DrawController::getSelection() +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + if (mxSubController.is()) + return mxSubController->getSelection(); + else + return Any(); +} + +void SAL_CALL DrawController::addSelectionChangeListener( + const Reference< view::XSelectionChangeListener >& xListener) +{ + if( mbDisposing ) + throw lang::DisposedException(); + + BroadcastHelperOwner::maBroadcastHelper.addListener (m_aSelectionTypeIdentifier, xListener); +} + +void SAL_CALL DrawController::removeSelectionChangeListener( + const Reference< view::XSelectionChangeListener >& xListener ) +{ + if (rBHelper.bDisposed) + throw lang::DisposedException(); + + BroadcastHelperOwner::maBroadcastHelper.removeListener (m_aSelectionTypeIdentifier, xListener); +} + +//===== lang::XEventListener ================================================ + +void SAL_CALL + DrawController::disposing (const lang::EventObject& ) +{ +} + +//===== view::XSelectionChangeListener ====================================== + +void SAL_CALL + DrawController::selectionChanged (const lang::EventObject& rEvent) +{ + ThrowIfDisposed(); + // Have to forward the event to our selection change listeners. + OInterfaceContainerHelper* pListeners = BroadcastHelperOwner::maBroadcastHelper.getContainer( + cppu::UnoType::get()); + if (!pListeners) + return; + + // Re-send the event to all of our listeners. + OInterfaceIteratorHelper aIterator (*pListeners); + while (aIterator.hasMoreElements()) + { + try + { + view::XSelectionChangeListener* pListener = + static_cast( + aIterator.next()); + if (pListener != nullptr) + pListener->selectionChanged (rEvent); + } + catch (const RuntimeException&) + { + } + } +} + +// XDrawView + +void SAL_CALL DrawController::setCurrentPage( const Reference< drawing::XDrawPage >& xPage ) +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + + if (mxSubController.is()) + mxSubController->setCurrentPage(xPage); +} + +Reference< drawing::XDrawPage > SAL_CALL DrawController::getCurrentPage() +{ + ThrowIfDisposed(); + SolarMutexGuard aGuard; + Reference xPage; + + // Get current page from sub controller. + if (mxSubController.is()) + xPage = mxSubController->getCurrentPage(); + + // When there is not yet a sub controller (during initialization) then fall back + // to the current page in mpCurrentPage. + if ( ! xPage.is() ) + if (rtl::Reference pPage = mpCurrentPage.get()) + xPage.set(pPage->getUnoPage(), UNO_QUERY); + + return xPage; +} + +void DrawController::FireVisAreaChanged (const ::tools::Rectangle& rVisArea) noexcept +{ + if( maLastVisArea == rVisArea ) + return; + + Any aNewValue; + aNewValue <<= awt::Rectangle( + rVisArea.Left(), + rVisArea.Top(), + rVisArea.GetWidth(), + rVisArea.GetHeight() ); + + Any aOldValue; + aOldValue <<= awt::Rectangle( + maLastVisArea.Left(), + maLastVisArea.Top(), + maLastVisArea.GetWidth(), + maLastVisArea.GetHeight() ); + + FirePropertyChange (PROPERTY_WORKAREA, aNewValue, aOldValue); + + maLastVisArea = rVisArea; +} + +void DrawController::FireSelectionChangeListener() noexcept +{ + OInterfaceContainerHelper * pLC = BroadcastHelperOwner::maBroadcastHelper.getContainer( + m_aSelectionTypeIdentifier); + if( !pLC ) + return; + + Reference< XInterface > xSource( static_cast(this) ); + const lang::EventObject aEvent( xSource ); + + // iterate over all listeners and send events + OInterfaceIteratorHelper aIt( *pLC); + while( aIt.hasMoreElements() ) + { + try + { + view::XSelectionChangeListener * pL = + static_cast(aIt.next()); + if (pL != nullptr) + pL->selectionChanged( aEvent ); + } + catch (const RuntimeException&) + { + } + } +} + +void DrawController::FireChangeEditMode (bool bMasterPageMode) noexcept +{ + if (bMasterPageMode != mbMasterPageMode ) + { + FirePropertyChange( + PROPERTY_MASTERPAGEMODE, + Any(bMasterPageMode), + Any(mbMasterPageMode)); + + mbMasterPageMode = bMasterPageMode; + } +} + +void DrawController::FireChangeLayerMode (bool bLayerMode) noexcept +{ + if (bLayerMode != mbLayerMode) + { + FirePropertyChange( + PROPERTY_LAYERMODE, + Any(bLayerMode), + Any(mbLayerMode)); + + mbLayerMode = bLayerMode; + } +} + +void DrawController::FireSwitchCurrentPage (SdPage* pNewCurrentPage) noexcept +{ + rtl::Reference pCurrentPage = mpCurrentPage.get(); + if (pNewCurrentPage == pCurrentPage.get()) + return; + + try + { + Any aNewValue ( + Any(Reference(pNewCurrentPage->getUnoPage(), UNO_QUERY))); + + Any aOldValue; + if (pCurrentPage != nullptr) + { + Reference xOldPage (pCurrentPage->getUnoPage(), UNO_QUERY); + aOldValue <<= xOldPage; + } + + FirePropertyChange(PROPERTY_CURRENTPAGE, aNewValue, aOldValue); + + mpCurrentPage = pNewCurrentPage; + } + catch (const uno::Exception&) + { + TOOLS_WARN_EXCEPTION("sd", "sd::SdUnoDrawView::FireSwitchCurrentPage()"); + } +} + +void DrawController::NotifyAccUpdate() +{ + sal_Int32 nHandle = PROPERTY_UPDATEACC; + Any aNewValue, aOldValue; + fire (&nHandle, &aNewValue, &aOldValue, 1, false); +} + +void DrawController::fireChangeLayer( css::uno::Reference< css::drawing::XLayer>* pCurrentLayer ) noexcept +{ + if( pCurrentLayer != mpCurrentLayer ) + { + sal_Int32 nHandle = PROPERTY_ACTIVE_LAYER; + + Any aNewValue ( *pCurrentLayer); + + Any aOldValue ; + + fire (&nHandle, &aNewValue, &aOldValue, 1, false); + + mpCurrentLayer = pCurrentLayer; + } +} + +// This method is only called in slide show and outline view +//void DrawController::fireSwitchCurrentPage(String pageName ) throw() +void DrawController::fireSwitchCurrentPage(sal_Int32 pageIndex ) noexcept +{ + Any aNewValue; + Any aOldValue; + //OUString aPageName( pageName ); + //aNewValue <<= aPageName ; + aNewValue <<= pageIndex; + + // Use new property to handle page change event + sal_Int32 nHandles = PROPERTY_PAGE_CHANGE; + fire( &nHandles, &aNewValue, &aOldValue, 1, false ); +} + +void DrawController::FirePropertyChange ( + sal_Int32 nHandle, + const Any& rNewValue, + const Any& rOldValue) +{ + try + { + fire (&nHandle, &rNewValue, &rOldValue, 1, false); + } + catch (const RuntimeException&) + { + // Ignore this exception. Exceptions should be handled in the + // fire() function so that all listeners are called. This is + // not the case at the moment, so we simply ignore the + // exception. + } + +} + +void DrawController::BroadcastContextChange() const +{ + std::shared_ptr pViewShell (mpBase->GetMainViewShell()); + if ( ! pViewShell) + return; + + EnumContext::Context eContext (EnumContext::Context::Unknown); + switch (pViewShell->GetShellType()) + { + case ViewShell::ST_IMPRESS: + case ViewShell::ST_DRAW: + if (mbMasterPageMode) + eContext = EnumContext::Context::MasterPage; + else + eContext = EnumContext::Context::DrawPage; + break; + + case ViewShell::ST_NOTES: + eContext = EnumContext::Context::NotesPage; + break; + + case ViewShell::ST_HANDOUT: + eContext = EnumContext::Context::HandoutPage; + break; + + case ViewShell::ST_OUTLINE: + eContext = EnumContext::Context::OutlineText; + break; + + case ViewShell::ST_SLIDE_SORTER: + eContext = EnumContext::Context::SlidesorterPage; + break; + + case ViewShell::ST_PRESENTATION: + case ViewShell::ST_NONE: + default: + eContext = EnumContext::Context::Empty; + break; + } + + ContextChangeEventMultiplexer::NotifyContextChange(mpBase, eContext); +} + +void DrawController::ReleaseViewShellBase() +{ + DisposeFrameworkControllers(); + mpBase = nullptr; +} + +//===== XControllerManager ============================================================== + +Reference SAL_CALL + DrawController::getConfigurationController() +{ + ThrowIfDisposed(); + + return mxConfigurationController; +} + +Reference SAL_CALL + DrawController::getModuleController() +{ + ThrowIfDisposed(); + + return mxModuleController; +} + +//===== Properties ============================================================ + +void DrawController::FillPropertyTable ( + ::std::vector& rProperties) +{ + rProperties.emplace_back("VisibleArea", + PROPERTY_WORKAREA, + ::cppu::UnoType< css::awt::Rectangle>::get(), + beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY); + rProperties.emplace_back( + "SubController", + PROPERTY_SUB_CONTROLLER, + cppu::UnoType::get(), + beans::PropertyAttribute::BOUND); + rProperties.emplace_back( + "CurrentPage", + PROPERTY_CURRENTPAGE, + cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("IsLayerMode", + PROPERTY_LAYERMODE, + cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("IsMasterPageMode", + PROPERTY_MASTERPAGEMODE, + cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("ActiveLayer", + PROPERTY_ACTIVE_LAYER, + cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("ZoomValue", + PROPERTY_ZOOMVALUE, + ::cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("ZoomType", + PROPERTY_ZOOMTYPE, + ::cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("ViewOffset", + PROPERTY_VIEWOFFSET, + ::cppu::UnoType< css::awt::Point>::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back("DrawViewMode", + PROPERTY_DRAWVIEWMODE, + ::cppu::UnoType< css::awt::Point>::get(), + beans::PropertyAttribute::BOUND|beans::PropertyAttribute::READONLY|beans::PropertyAttribute::MAYBEVOID ); + // add new property to update current page's acc information + rProperties.emplace_back( "UpdateAcc", + PROPERTY_UPDATEACC, + ::cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); + rProperties.emplace_back( "PageChange", + PROPERTY_PAGE_CHANGE, + ::cppu::UnoType::get(), + beans::PropertyAttribute::BOUND ); +} + +IPropertyArrayHelper & DrawController::getInfoHelper() +{ + SolarMutexGuard aGuard; + + if (mpPropertyArrayHelper == nullptr) + { + ::std::vector aProperties; + FillPropertyTable(aProperties); + mpPropertyArrayHelper.reset(new OPropertyArrayHelper(comphelper::containerToSequence(aProperties), false)); + } + + return *mpPropertyArrayHelper; +} + +Reference < beans::XPropertySetInfo > DrawController::getPropertySetInfo() +{ + SolarMutexGuard aGuard; + + static Reference < beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) ); + return xInfo; +} + +uno::Reference< form::runtime::XFormController > SAL_CALL DrawController::getFormController( const uno::Reference< form::XForm >& Form ) +{ + SolarMutexGuard aGuard; + + FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell(); + SdrView* pSdrView = mpBase->GetDrawView(); + std::shared_ptr pViewShell = mpBase->GetMainViewShell(); + ::sd::Window* pWindow = pViewShell ? pViewShell->GetActiveWindow() : nullptr; + + uno::Reference< form::runtime::XFormController > xController; + if ( pFormShell && pSdrView && pWindow ) + xController = FmFormShell::GetFormController( Form, *pSdrView, *pWindow->GetOutDev() ); + return xController; +} + +sal_Bool SAL_CALL DrawController::isFormDesignMode( ) +{ + SolarMutexGuard aGuard; + + bool bIsDesignMode = true; + + FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell(); + if ( pFormShell ) + bIsDesignMode = pFormShell->IsDesignMode(); + + return bIsDesignMode; +} + +void SAL_CALL DrawController::setFormDesignMode( sal_Bool DesignMode ) +{ + SolarMutexGuard aGuard; + + FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell(); + if ( pFormShell ) + pFormShell->SetDesignMode( DesignMode ); +} + +uno::Reference< awt::XControl > SAL_CALL DrawController::getControl( const uno::Reference< awt::XControlModel >& xModel ) +{ + SolarMutexGuard aGuard; + + FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell(); + SdrView* pSdrView = mpBase->GetDrawView(); + std::shared_ptr pViewShell = mpBase->GetMainViewShell(); + ::sd::Window* pWindow = pViewShell ? pViewShell->GetActiveWindow() : nullptr; + + uno::Reference< awt::XControl > xControl; + if ( pFormShell && pSdrView && pWindow ) + pFormShell->GetFormControl( xModel, *pSdrView, *pWindow->GetOutDev(), xControl ); + return xControl; +} + +sal_Bool DrawController::convertFastPropertyValue ( + Any & rConvertedValue, + Any & rOldValue, + sal_Int32 nHandle, + const Any& rValue) +{ + bool bResult = false; + + if (nHandle == PROPERTY_SUB_CONTROLLER) + { + rOldValue <<= mxSubController; + rConvertedValue <<= Reference(rValue, UNO_QUERY); + bResult = (rOldValue != rConvertedValue); + } + else if (mxSubController.is()) + { + rConvertedValue = rValue; + try + { + rOldValue = mxSubController->getFastPropertyValue(nHandle); + bResult = (rOldValue != rConvertedValue); + } + catch (const beans::UnknownPropertyException&) + { + // The property is unknown and thus an illegal argument to this method. + throw css::lang::IllegalArgumentException(); + } + } + + return bResult; +} + +void DrawController::setFastPropertyValue_NoBroadcast ( + sal_Int32 nHandle, + const Any& rValue) +{ + SolarMutexGuard aGuard; + if (nHandle == PROPERTY_SUB_CONTROLLER) + SetSubController(Reference(rValue, UNO_QUERY)); + else if (mxSubController.is()) + mxSubController->setFastPropertyValue(nHandle, rValue); +} + +void DrawController::getFastPropertyValue ( + Any & rRet, + sal_Int32 nHandle ) const +{ + SolarMutexGuard aGuard; + + switch( nHandle ) + { + case PROPERTY_WORKAREA: + rRet <<= awt::Rectangle( + maLastVisArea.Left(), + maLastVisArea.Top(), + maLastVisArea.GetWidth(), + maLastVisArea.GetHeight()); + break; + + case PROPERTY_SUB_CONTROLLER: + rRet <<= mxSubController; + break; + + default: + if (mxSubController.is()) + rRet = mxSubController->getFastPropertyValue(nHandle); + break; + } +} + +void DrawController::ProvideFrameworkControllers() +{ + SolarMutexGuard aGuard; + try + { + mxConfigurationController = new sd::framework::ConfigurationController(this); + mxModuleController = new sd::framework::ModuleController(this); + } + catch (const RuntimeException&) + { + mxConfigurationController = nullptr; + mxModuleController = nullptr; + } +} + +void DrawController::DisposeFrameworkControllers() +{ + if (mxModuleController.is()) + mxModuleController->dispose(); + + if (mxConfigurationController.is()) + mxConfigurationController->dispose(); +} + +void DrawController::ThrowIfDisposed() const +{ + if (rBHelper.bDisposed || rBHelper.bInDispose || mbDisposing) + { + SAL_WARN("sd", "Calling disposed DrawController object. Throwing exception."); + throw lang::DisposedException ( + "DrawController object has already been disposed", + const_cast(static_cast(this))); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/SdUnoDrawView.cxx b/sd/source/ui/unoidl/SdUnoDrawView.cxx new file mode 100644 index 0000000000..790fb24a9c --- /dev/null +++ b/sd/source/ui/unoidl/SdUnoDrawView.cxx @@ -0,0 +1,547 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include "unolayer.hxx" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; + +namespace sd { + +SdUnoDrawView::SdUnoDrawView( + DrawViewShell& rViewShell, + View& rView) noexcept + : mrDrawViewShell(rViewShell), + mrView(rView) +{ +} + +SdUnoDrawView::~SdUnoDrawView() noexcept +{ +} + +bool SdUnoDrawView::getMasterPageMode() const noexcept +{ + return (mrDrawViewShell.GetEditMode() == EditMode::MasterPage); +} + +void SdUnoDrawView::setMasterPageMode (bool bMasterPageMode) noexcept +{ + if ((mrDrawViewShell.GetEditMode() == EditMode::MasterPage) != bMasterPageMode) + { + mrDrawViewShell.ChangeEditMode ( + bMasterPageMode ? EditMode::MasterPage : EditMode::Page, + mrDrawViewShell.IsLayerModeActive()); + } +} + +bool SdUnoDrawView::getLayerMode() const noexcept +{ + return mrDrawViewShell.IsLayerModeActive(); +} + +void SdUnoDrawView::setLayerMode (bool bLayerMode) noexcept +{ + if (mrDrawViewShell.IsLayerModeActive() != bLayerMode) + { + mrDrawViewShell.ChangeEditMode ( + mrDrawViewShell.GetEditMode(), + bLayerMode); + } +} + +Reference SdUnoDrawView::getActiveLayer() const +{ + Reference xCurrentLayer; + + do + { + // Retrieve the layer manager from the model. + SdXImpressDocument* pModel = GetModel(); + if (pModel == nullptr) + break; + + SdDrawDocument* pSdModel = pModel->GetDoc(); + if (pSdModel == nullptr) + break; + + // From the model get the current SdrLayer object via the layer admin. + SdrLayerAdmin& rLayerAdmin = pSdModel->GetLayerAdmin (); + SdrLayer* pLayer = rLayerAdmin.GetLayer (mrView.GetActiveLayer()); + if (pLayer == nullptr) + break; + + // Get the corresponding XLayer object from the implementation + // object of the layer manager. + Reference xManager (pModel->getLayerManager(), uno::UNO_QUERY); + SdLayerManager* pManager = dynamic_cast (xManager.get()); + if (pManager != nullptr) + xCurrentLayer = pManager->GetLayer (pLayer); + } + while (false); + + return xCurrentLayer; +} + +void SdUnoDrawView::setActiveLayer (const Reference& rxLayer) +{ + // Get the SdrLayer object corresponding to the given reference. + if ( ! rxLayer.is()) + return; + + SdLayer* pLayer = dynamic_cast (rxLayer.get()); + if (pLayer == nullptr) + return; + + SdrLayer* pSdrLayer = pLayer->GetSdrLayer(); + if (pSdrLayer == nullptr) + return; + + // Set the new active layer and make the change visible. + mrView.SetActiveLayer (pSdrLayer->GetName()); + mrDrawViewShell.ResetActualLayer (); +} + +// XSelectionSupplier + +sal_Bool SAL_CALL SdUnoDrawView::select( const Any& aSelection ) +{ + bool bOk = true; + + ::std::vector aObjects; + + SdrPage* pSdrPage = nullptr; + + Reference< drawing::XShape > xShape; + aSelection >>= xShape; + + if(xShape.is()) + { + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape ); + if( pObj ) + { + pSdrPage = pObj->getSdrPageFromSdrObject(); + aObjects.push_back( pObj ); + } + else + { + bOk = false; + } + } + else + { + Reference< drawing::XShapes > xShapes; + aSelection >>= xShapes; + if( xShapes.is() ) + { + const sal_uInt32 nCount = xShapes->getCount(); + for( sal_uInt32 i = 0; i < nCount; i++ ) + { + xShapes->getByIndex(i) >>= xShape; + if( xShape.is() ) + { + SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape); + if( !pObj ) + { + bOk = false; + break; + } + + if( pSdrPage == nullptr ) + { + pSdrPage = pObj->getSdrPageFromSdrObject(); + } + else if( pSdrPage != pObj->getSdrPageFromSdrObject() ) + { + bOk = false; + break; + } + + aObjects.push_back( pObj ); + } + } + } + } + + if( bOk ) + { + if( pSdrPage ) + { + setMasterPageMode( pSdrPage->IsMasterPage() ); + mrDrawViewShell.SwitchPage( (pSdrPage->GetPageNum() - 1) >> 1 ); + mrDrawViewShell.WriteFrameViewData(); + } + + SdrPageView *pPV = mrView.GetSdrPageView(); + + if(pPV) + { + // first deselect all + mrView.UnmarkAllObj( pPV ); + + for( SdrObject* pObj : aObjects ) + { + mrView.MarkObj( pObj, pPV ); + } + } + else + { + bOk = false; + } + } + + return bOk; +} + +Any SAL_CALL SdUnoDrawView::getSelection() +{ + Any aAny; + + if( mrView.IsTextEdit() ) + mrView.getTextSelection( aAny ); + + if( !aAny.hasValue() ) + { + const SdrMarkList& rMarkList = mrView.GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + if( nCount ) + { + Reference< drawing::XShapes > xShapes = drawing::ShapeCollection::create( + comphelper::getProcessComponentContext()); + for( size_t nNum = 0; nNum < nCount; ++nNum) + { + SdrMark *pMark = rMarkList.GetMark(nNum); + if(pMark==nullptr) + continue; + + SdrObject *pObj = pMark->GetMarkedSdrObj(); + if(pObj==nullptr || pObj->getSdrPageFromSdrObject() == nullptr) + continue; + + Reference< drawing::XDrawPage > xPage( pObj->getSdrPageFromSdrObject()->getUnoPage(), UNO_QUERY); + + if(!xPage.is()) + continue; + + SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel( xPage ); + + if(pDrawPage==nullptr) + continue; + + Reference< drawing::XShape > xShape( pObj->getUnoShape(), UNO_QUERY ); + + if(xShape.is()) + xShapes->add(xShape); + } + aAny <<= xShapes; + } + } + + return aAny; +} + +void SAL_CALL SdUnoDrawView::addSelectionChangeListener ( + const css::uno::Reference&) +{} + +void SAL_CALL SdUnoDrawView::removeSelectionChangeListener ( + const css::uno::Reference&) +{} + +void SdUnoDrawView::setFastPropertyValue ( + sal_Int32 nHandle, + const Any& rValue) +{ + switch( nHandle ) + { + case DrawController::PROPERTY_CURRENTPAGE: + { + Reference< drawing::XDrawPage > xPage; + rValue >>= xPage; + setCurrentPage( xPage ); + } + break; + + case DrawController::PROPERTY_MASTERPAGEMODE: + { + bool bValue = false; + rValue >>= bValue; + setMasterPageMode( bValue ); + } + break; + + case DrawController::PROPERTY_LAYERMODE: + { + bool bValue = false; + rValue >>= bValue; + setLayerMode( bValue ); + } + break; + case DrawController::PROPERTY_ACTIVE_LAYER: + { + Reference xLayer; + rValue >>= xLayer; + setActiveLayer (xLayer); + } + break; + case DrawController::PROPERTY_ZOOMVALUE: + { + sal_Int16 nZoom = 0; + rValue >>= nZoom; + SetZoom( nZoom ); + } + break; + case DrawController::PROPERTY_ZOOMTYPE: + { + sal_Int16 nType = 0; + rValue >>= nType; + SetZoomType( nType ); + } + break; + case DrawController::PROPERTY_VIEWOFFSET: + { + awt::Point aOffset; + rValue >>= aOffset; + SetViewOffset( aOffset ); + } + break; + default: + throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast(this)); + } +} + +Any SAL_CALL SdUnoDrawView::getFastPropertyValue ( + sal_Int32 nHandle) +{ + Any aValue; + switch( nHandle ) + { + case DrawController::PROPERTY_CURRENTPAGE: + aValue <<= getCurrentPage(); + break; + + case DrawController::PROPERTY_MASTERPAGEMODE: + aValue <<= getMasterPageMode(); + break; + + case DrawController::PROPERTY_LAYERMODE: + aValue <<= getLayerMode(); + break; + + case DrawController::PROPERTY_ACTIVE_LAYER: + aValue <<= getActiveLayer(); + break; + + case DrawController::PROPERTY_ZOOMVALUE: + aValue <<= GetZoom(); + break; + case DrawController::PROPERTY_ZOOMTYPE: + aValue <<= sal_Int16(css::view::DocumentZoomType::BY_VALUE); + break; + case DrawController::PROPERTY_VIEWOFFSET: + aValue <<= GetViewOffset(); + break; + + case DrawController::PROPERTY_DRAWVIEWMODE: + aValue = getDrawViewMode(); + break; + + default: + throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast(this)); + } + + return aValue; +} + +// XDrawView + +void SAL_CALL SdUnoDrawView::setCurrentPage ( + const Reference< drawing::XDrawPage >& xPage ) +{ + SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel( xPage ); + SdrPage *pSdrPage = pDrawPage ? pDrawPage->GetSdrPage() : nullptr; + + if(pSdrPage) + { + // End editing of text. Otherwise the edited text object would + // still be visible on the new page. + mrDrawViewShell.GetView()->SdrEndTextEdit(); + + setMasterPageMode( pSdrPage->IsMasterPage() ); + mrDrawViewShell.SwitchPage( (pSdrPage->GetPageNum() - 1) >> 1 ); + mrDrawViewShell.WriteFrameViewData(); + } +} + +Reference< drawing::XDrawPage > SAL_CALL SdUnoDrawView::getCurrentPage() +{ + Reference< drawing::XDrawPage > xPage; + + SdrPageView *pPV = mrView.GetSdrPageView(); + SdrPage* pPage = pPV ? pPV->GetPage() : nullptr; + + if(pPage) + xPage.set( pPage->getUnoPage(), UNO_QUERY ); + + return xPage; +} + +sal_Int16 SdUnoDrawView::GetZoom() const +{ + if (mrDrawViewShell.GetActiveWindow() ) + { + return static_cast(mrDrawViewShell.GetActiveWindow()->GetZoom()); + } + else + { + return 0; + } +} + +void SdUnoDrawView::SetZoom( sal_Int16 nZoom ) +{ + SvxZoomItem aZoomItem( SvxZoomType::PERCENT, nZoom ); + + SfxViewFrame* pViewFrame = mrDrawViewShell.GetViewFrame(); + if( pViewFrame ) + { + SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher(); + if( pDispatcher ) + { + pDispatcher->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::SYNCHRON, + { &aZoomItem }); + } + } +} + +void SdUnoDrawView::SetViewOffset(const awt::Point& rWinPos ) +{ + Point aWinPos( rWinPos.X, rWinPos.Y ); + aWinPos += mrDrawViewShell.GetViewOrigin(); + mrDrawViewShell.SetWinViewPos( aWinPos ); +} + +awt::Point SdUnoDrawView::GetViewOffset() const +{ + Point aRet = mrDrawViewShell.GetWinViewPos(); + aRet -= mrDrawViewShell.GetViewOrigin(); + + return awt::Point( aRet.X(), aRet.Y() ); +} + +void SdUnoDrawView::SetZoomType ( sal_Int16 nType ) +{ + SfxViewFrame* pViewFrame = mrDrawViewShell.GetViewFrame(); + if( !pViewFrame ) + return; + + SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher(); + if( !pDispatcher ) + return; + + SvxZoomType eZoomType; + switch( nType ) + { + case css::view::DocumentZoomType::OPTIMAL: + eZoomType = SvxZoomType::OPTIMAL; + break; + + case css::view::DocumentZoomType::PAGE_WIDTH: + case css::view::DocumentZoomType::PAGE_WIDTH_EXACT: + eZoomType = SvxZoomType::PAGEWIDTH; + break; + + case css::view::DocumentZoomType::ENTIRE_PAGE: + eZoomType = SvxZoomType::WHOLEPAGE; + break; + + default: + return; + } + SvxZoomItem aZoomItem( eZoomType ); + pDispatcher->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::SYNCHRON, + { &aZoomItem }); +} + +SdXImpressDocument* SdUnoDrawView::GetModel() const noexcept +{ + if (mrView.GetDocSh()!=nullptr) + { + Reference xModel (mrView.GetDocSh()->GetModel()); + return comphelper::getFromUnoTunnel(xModel); + } + else + return nullptr; +} + +Any SdUnoDrawView::getDrawViewMode() const +{ + Any aRet; + switch( mrDrawViewShell.GetPageKind() ) + { + case PageKind::Notes: aRet <<= DrawViewMode_NOTES; break; + case PageKind::Handout: aRet <<= DrawViewMode_HANDOUT; break; + case PageKind::Standard: aRet <<= DrawViewMode_DRAW; break; + } + return aRet; +} + +// XServiceInfo +OUString SAL_CALL SdUnoDrawView::getImplementationName( ) +{ + return "com.sun.star.comp.sd.SdUnoDrawView" ; +} + +sal_Bool SAL_CALL SdUnoDrawView::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +Sequence< OUString > SAL_CALL SdUnoDrawView::getSupportedServiceNames( ) +{ + return { "com.sun.star.drawing.DrawingDocumentDrawView" }; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/SdUnoOutlineView.cxx b/sd/source/ui/unoidl/SdUnoOutlineView.cxx new file mode 100644 index 0000000000..e2f95934d0 --- /dev/null +++ b/sd/source/ui/unoidl/SdUnoOutlineView.cxx @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +#include +#include + +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd { + +SdUnoOutlineView::SdUnoOutlineView( + OutlineViewShell& rViewShell) noexcept + : mrOutlineViewShell(rViewShell) +{ +} + +SdUnoOutlineView::~SdUnoOutlineView() noexcept +{ +} + +//----- XSelectionSupplier ---------------------------------------------------- + +sal_Bool SAL_CALL SdUnoOutlineView::select( const Any& ) +{ + // todo: add selections for text ranges + return false; +} + +Any SAL_CALL SdUnoOutlineView::getSelection() +{ + Any aAny; + return aAny; +} + +void SAL_CALL SdUnoOutlineView::addSelectionChangeListener ( + const css::uno::Reference&) +{} + +void SAL_CALL SdUnoOutlineView::removeSelectionChangeListener ( + const css::uno::Reference&) +{} + +//----- XDrawView ------------------------------------------------------------- +void SAL_CALL SdUnoOutlineView::setCurrentPage ( + const Reference< drawing::XDrawPage >& xPage) +{ + SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel( xPage ); + SdrPage *pSdrPage = pDrawPage ? pDrawPage->GetSdrPage() : nullptr; + SdPage *pSdPage = dynamic_cast(pSdrPage); + + if (pSdPage != nullptr) + mrOutlineViewShell.SetCurrentPage(pSdPage); +} + +Reference< drawing::XDrawPage > SAL_CALL SdUnoOutlineView::getCurrentPage() +{ + Reference xPage; + + SdPage* pPage = mrOutlineViewShell.getCurrentPage(); + if (pPage != nullptr) + xPage.set(pPage->getUnoPage(), UNO_QUERY); + + return xPage; +} + +void SdUnoOutlineView::setFastPropertyValue ( + sal_Int32 nHandle, + const Any& rValue) +{ + switch( nHandle ) + { + case DrawController::PROPERTY_CURRENTPAGE: + { + Reference< drawing::XDrawPage > xPage; + rValue >>= xPage; + setCurrentPage( xPage ); + } + break; + + default: + throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast(this)); + } +} + +Any SAL_CALL SdUnoOutlineView::getFastPropertyValue ( + sal_Int32 nHandle) +{ + Any aValue; + + switch( nHandle ) + { + case DrawController::PROPERTY_CURRENTPAGE: + { + SdPage* pPage = mrOutlineViewShell.GetActualPage(); + if (pPage != nullptr) + aValue <<= pPage->getUnoPage(); + } + break; + case DrawController::PROPERTY_VIEWOFFSET: + break; + + default: + throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast(this)); + } + + return aValue; +} + +// XServiceInfo +OUString SAL_CALL SdUnoOutlineView::getImplementationName( ) +{ + return "com.sun.star.comp.sd.SdUnoOutlineView"; +} + +sal_Bool SAL_CALL SdUnoOutlineView::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +Sequence< OUString > SAL_CALL SdUnoOutlineView::getSupportedServiceNames( ) +{ + return { "com.sun.star.presentation.OutlineView" }; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/SdUnoSlideView.cxx b/sd/source/ui/unoidl/SdUnoSlideView.cxx new file mode 100644 index 0000000000..d37c5fb0a2 --- /dev/null +++ b/sd/source/ui/unoidl/SdUnoSlideView.cxx @@ -0,0 +1,171 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd { + +SdUnoSlideView::SdUnoSlideView ( + slidesorter::SlideSorter& rSlideSorter) noexcept + : mrSlideSorter(rSlideSorter) +{ +} + +SdUnoSlideView::~SdUnoSlideView() noexcept +{ +} + +//----- XSelectionSupplier ---------------------------------------------------- + +sal_Bool SAL_CALL SdUnoSlideView::select (const Any& aSelection) +{ + slidesorter::controller::SlideSorterController& rSlideSorterController + = mrSlideSorter.GetController(); + slidesorter::controller::PageSelector& rSelector (rSlideSorterController.GetPageSelector()); + rSelector.DeselectAllPages(); + Sequence > xPages; + aSelection >>= xPages; + for (const auto& rPage : std::as_const(xPages)) + { + Reference xSet (rPage, UNO_QUERY); + if (xSet.is()) + { + try + { + Any aNumber = xSet->getPropertyValue("Number"); + sal_Int32 nPageNumber = 0; + aNumber >>= nPageNumber; + nPageNumber -=1; // Transform 1-based page numbers to 0-based ones. + rSelector.SelectPage(nPageNumber); + } + catch (const RuntimeException&) + { + } + } + } + + return true; +} + +Any SAL_CALL SdUnoSlideView::getSelection() +{ + Any aResult; + + slidesorter::model::PageEnumeration aSelectedPages ( + slidesorter::model::PageEnumerationProvider::CreateSelectedPagesEnumeration( + mrSlideSorter.GetModel())); + int nSelectedPageCount ( + mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount()); + + Sequence > aPages(nSelectedPageCount); + auto aPagesRange = asNonConstRange(aPages); + int nIndex = 0; + while (aSelectedPages.HasMoreElements() && nIndexGetPage()->getUnoPage(); + } + aResult <<= aPages; + + return aResult; +} + +void SAL_CALL SdUnoSlideView::addSelectionChangeListener ( + const css::uno::Reference&) +{} + +void SAL_CALL SdUnoSlideView::removeSelectionChangeListener ( + const css::uno::Reference&) +{} + +//----- XDrawView ------------------------------------------------------------- + +void SAL_CALL SdUnoSlideView::setCurrentPage ( + const css::uno::Reference& rxDrawPage) +{ + Reference xProperties (rxDrawPage, UNO_QUERY); + if (xProperties.is()) + { + sal_uInt16 nPageNumber(0); + if (xProperties->getPropertyValue("Number") >>= nPageNumber) + { + mrSlideSorter.GetController().GetCurrentSlideManager()->SwitchCurrentSlide( + nPageNumber-1); + } + } +} + +css::uno::Reference SAL_CALL + SdUnoSlideView::getCurrentPage() +{ + return mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()->GetXDrawPage(); +} + +//----- XFastPropertySet ------------------------------------------------------ + +void SdUnoSlideView::setFastPropertyValue ( + sal_Int32 nHandle, + const Any&) +{ + throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast(this)); +} + +Any SAL_CALL SdUnoSlideView::getFastPropertyValue ( + sal_Int32 nHandle) +{ + if( nHandle != DrawController::PROPERTY_VIEWOFFSET ) + throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast(this)); + + return Any(); +} + +// XServiceInfo +OUString SAL_CALL SdUnoSlideView::getImplementationName( ) +{ + return "com.sun.star.comp.sd.SdUnoSlideView"; +} + +sal_Bool SAL_CALL SdUnoSlideView::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +Sequence< OUString > SAL_CALL SdUnoSlideView::getSupportedServiceNames( ) +{ + return { "com.sun.star.presentation.SlidesView" }; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/UnoDocumentSettings.cxx b/sd/source/ui/unoidl/UnoDocumentSettings.cxx new file mode 100644 index 0000000000..331f90b53a --- /dev/null +++ b/sd/source/ui/unoidl/UnoDocumentSettings.cxx @@ -0,0 +1,1431 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "UnoDocumentSettings.hxx" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::comphelper; +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::i18n; + +namespace sd +{ + namespace { + + class DocumentSettings : public WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >, + public comphelper::PropertySetHelper, + public DocumentSettingsSerializer + { + public: + explicit DocumentSettings( SdXImpressDocument* pModel ); + + // XInterface + virtual Any SAL_CALL queryInterface( const Type& aType ) override; + virtual void SAL_CALL acquire( ) noexcept override; + virtual void SAL_CALL release( ) noexcept override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // XMultiPropertySet + virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override; + virtual css::uno::Sequence< css::uno::Any > SAL_CALL getPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames ) override; + virtual void SAL_CALL addPropertiesChangeListener( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertiesChangeListener( const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override; + virtual void SAL_CALL firePropertiesChangeEvent( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + + // DocumentSettingsSerializer cf. xmloff + virtual uno::Sequence + filterStreamsFromStorage(OUString const & referer, + const uno::Reference< embed::XStorage > &xStorage, + const uno::Sequence& aConfigProps ) override; + virtual uno::Sequence + filterStreamsToStorage(const uno::Reference< embed::XStorage > &xStorage, + const uno::Sequence& aConfigProps ) override; + + protected: + virtual void _setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const css::uno::Any* pValues ) override; + virtual void _getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, css::uno::Any* pValue ) override; + + private: + bool LoadList( XPropertyListType t, const OUString &rPath, + const OUString &rReferer, + const uno::Reference< embed::XStorage > &xStorage ); + void AssignURL( XPropertyListType t, const Any* pValue, bool *pOk, bool *pChanged ); + void ExtractURL( XPropertyListType t, Any* pValue ); + rtl::Reference mxModel; + }; + + } + + Reference< XInterface > DocumentSettings_createInstance( SdXImpressDocument* pModel ) + noexcept + { + DBG_ASSERT( pModel, "I need a model for the DocumentSettings!" ); + return static_cast(new DocumentSettings( pModel )); + } + +namespace { + +enum SdDocumentSettingsPropertyHandles +{ + HANDLE_PRINTDRAWING, HANDLE_PRINTNOTES, HANDLE_PRINTHANDOUT, HANDLE_PRINTOUTLINE, HANDLE_MEASUREUNIT, HANDLE_SCALE_NUM, + HANDLE_SCALE_DOM, HANDLE_TABSTOP, HANDLE_PRINTPAGENAME, HANDLE_PRINTDATE, HANDLE_PRINTTIME, + HANDLE_PRINTHIDDENPAGES, HANDLE_PRINTFITPAGE, HANDLE_PRINTTILEPAGE, HANDLE_PRINTBOOKLET, HANDLE_PRINTBOOKLETFRONT, + HANDLE_PRINTBOOKLETBACK, HANDLE_PRINTQUALITY, HANDLE_COLORTABLEURL, HANDLE_DASHTABLEURL, HANDLE_LINEENDTABLEURL, HANDLE_HATCHTABLEURL, + HANDLE_GRADIENTTABLEURL, HANDLE_BITMAPTABLEURL, HANDLE_FORBIDDENCHARS, HANDLE_APPLYUSERDATA, HANDLE_SAVETHUMBNAIL, HANDLE_PAGENUMFMT, + HANDLE_PRINTERNAME, HANDLE_PRINTERJOB, HANDLE_PRINTERPAPERSIZE, HANDLE_PARAGRAPHSUMMATION, HANDLE_CHARCOMPRESS, HANDLE_ASIANPUNCT, + HANDLE_UPDATEFROMTEMPLATE, HANDLE_PRINTER_INDEPENDENT_LAYOUT + // #i33095# + ,HANDLE_LOAD_READONLY, HANDLE_MODIFY_PASSWD, HANDLE_SAVE_VERSION + ,HANDLE_SLIDESPERHANDOUT, HANDLE_HANDOUTHORIZONTAL, + HANDLE_EMBED_FONTS, HANDLE_EMBED_USED_FONTS, + HANDLE_EMBED_LATIN_SCRIPT_FONTS, HANDLE_EMBED_ASIAN_SCRIPT_FONTS, HANDLE_EMBED_COMPLEX_SCRIPT_FONTS, + HANDLE_IMAGE_PREFERRED_DPI +}; + +} + +#define MID_PRINTER 1 + + static rtl::Reference createSettingsInfoImpl( bool bIsDraw ) + { + static PropertyMapEntry const aImpressSettingsInfoMap[] = + { + { OUString("IsPrintDrawing"), HANDLE_PRINTDRAWING, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintNotes"), HANDLE_PRINTNOTES, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintHandout"), HANDLE_PRINTHANDOUT, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintOutline"), HANDLE_PRINTOUTLINE, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("SlidesPerHandout"), HANDLE_SLIDESPERHANDOUT, ::cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("HandoutsHorizontal"), HANDLE_HANDOUTHORIZONTAL, cppu::UnoType::get(), 0, MID_PRINTER }, + }; + + static PropertyMapEntry const aDrawSettingsInfoMap[] = + { + { OUString("MeasureUnit"), HANDLE_MEASUREUNIT, ::cppu::UnoType::get(), 0, 0 }, + { OUString("ScaleNumerator"), HANDLE_SCALE_NUM, ::cppu::UnoType::get(), 0, 0 }, + { OUString("ScaleDenominator"), HANDLE_SCALE_DOM, ::cppu::UnoType::get(), 0, 0 }, + }; + + static PropertyMapEntry const aCommonSettingsInfoMap[] = + { + { OUString("DefaultTabStop"), HANDLE_TABSTOP, ::cppu::UnoType::get(), 0, 0 }, + { OUString("PrinterName"), HANDLE_PRINTERNAME, ::cppu::UnoType::get(), 0, 0 }, + { OUString("PrinterSetup"), HANDLE_PRINTERJOB, cppu::UnoType>::get(), 0, MID_PRINTER }, + { OUString("PrinterPaperFromSetup"), HANDLE_PRINTERPAPERSIZE, cppu::UnoType::get(), 0, MID_PRINTER }, + + { OUString("IsPrintPageName"), HANDLE_PRINTPAGENAME, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintDate"), HANDLE_PRINTDATE, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintTime"), HANDLE_PRINTTIME, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintHiddenPages"), HANDLE_PRINTHIDDENPAGES, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintFitPage"), HANDLE_PRINTFITPAGE, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintTilePage"), HANDLE_PRINTTILEPAGE, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintBooklet"), HANDLE_PRINTBOOKLET, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintBookletFront"), HANDLE_PRINTBOOKLETFRONT, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("IsPrintBookletBack"), HANDLE_PRINTBOOKLETBACK, cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("PrintQuality"), HANDLE_PRINTQUALITY, ::cppu::UnoType::get(), 0, MID_PRINTER }, + { OUString("ColorTableURL"), HANDLE_COLORTABLEURL, ::cppu::UnoType::get(), 0, 0 }, + { OUString("DashTableURL"), HANDLE_DASHTABLEURL, ::cppu::UnoType::get(), 0, 0 }, + { OUString("LineEndTableURL"), HANDLE_LINEENDTABLEURL, ::cppu::UnoType::get(), 0, 0 }, + { OUString("HatchTableURL"), HANDLE_HATCHTABLEURL, ::cppu::UnoType::get(), 0, 0 }, + { OUString("GradientTableURL"), HANDLE_GRADIENTTABLEURL, ::cppu::UnoType::get(), 0, 0 }, + { OUString("BitmapTableURL"), HANDLE_BITMAPTABLEURL, ::cppu::UnoType::get(), 0, 0 }, + + { OUString("ForbiddenCharacters"), HANDLE_FORBIDDENCHARS, cppu::UnoType::get(), 0, 0 }, + { OUString("ApplyUserData"), HANDLE_APPLYUSERDATA, cppu::UnoType::get(), 0, 0 }, + { OUString("SaveThumbnail"), HANDLE_SAVETHUMBNAIL, cppu::UnoType::get(), 0, 0 }, + + { OUString("PageNumberFormat"), HANDLE_PAGENUMFMT, ::cppu::UnoType::get(), 0, 0 }, + { OUString("ParagraphSummation"), HANDLE_PARAGRAPHSUMMATION, cppu::UnoType::get(), 0, 0 }, + { OUString("CharacterCompressionType"),HANDLE_CHARCOMPRESS, ::cppu::UnoType::get(), 0, 0 }, + { OUString("IsKernAsianPunctuation"),HANDLE_ASIANPUNCT, cppu::UnoType::get(), 0, 0 }, + { OUString("UpdateFromTemplate"), HANDLE_UPDATEFROMTEMPLATE, cppu::UnoType::get(), 0, 0 }, + { OUString("PrinterIndependentLayout"),HANDLE_PRINTER_INDEPENDENT_LAYOUT,::cppu::UnoType::get(), 0, 0 }, + // --> #i33095# + { OUString("LoadReadonly"), HANDLE_LOAD_READONLY, cppu::UnoType::get(), 0, 0 }, + { OUString("ModifyPasswordInfo"), HANDLE_MODIFY_PASSWD, cppu::UnoType>::get(), 0, 0 }, + { OUString("SaveVersionOnClose"), HANDLE_SAVE_VERSION, cppu::UnoType::get(), 0, 0 }, + { OUString("EmbedFonts"), HANDLE_EMBED_FONTS, cppu::UnoType::get(), 0, 0 }, + { OUString("EmbedOnlyUsedFonts"), HANDLE_EMBED_USED_FONTS, cppu::UnoType::get(), 0, 0 }, + { OUString("EmbedLatinScriptFonts"), HANDLE_EMBED_LATIN_SCRIPT_FONTS, cppu::UnoType::get(), 0, 0 }, + { OUString("EmbedAsianScriptFonts"), HANDLE_EMBED_ASIAN_SCRIPT_FONTS, cppu::UnoType::get(), 0, 0 }, + { OUString("EmbedComplexScriptFonts"), HANDLE_EMBED_COMPLEX_SCRIPT_FONTS, cppu::UnoType::get(), 0, 0 }, + { OUString("ImagePreferredDPI"), HANDLE_IMAGE_PREFERRED_DPI, cppu::UnoType::get(), 0, 0 }, + }; + + rtl::Reference xInfo = new PropertySetInfo( aCommonSettingsInfoMap ); + if (bIsDraw) + xInfo->add( aDrawSettingsInfoMap ); + else + xInfo->add( aImpressSettingsInfoMap ); + + return xInfo; + } +} + +using namespace ::sd; + +DocumentSettings::DocumentSettings( SdXImpressDocument* pModel ) +: PropertySetHelper( createSettingsInfoImpl( !pModel->IsImpressDocument() ) ), + mxModel( pModel ) +{ +} + +bool DocumentSettings::LoadList( XPropertyListType t, const OUString &rInPath, + const OUString &rReferer, + const uno::Reference< embed::XStorage > &xStorage ) +{ + SdDrawDocument* pDoc = mxModel->GetDoc(); + + sal_Int32 nSlash = rInPath.lastIndexOf('/'); + OUString aPath, aName; + if (nSlash < 0) + aName = rInPath; + else { + aName = rInPath.copy( nSlash + 1 ); + aPath = rInPath.copy( 0, nSlash ); + } + + XPropertyListRef pList = XPropertyList::CreatePropertyList( + t, aPath, rReferer ); + pList->SetName( aName ); + + if( pList->LoadFrom( xStorage, rInPath, rReferer ) ) + { + pDoc->SetPropertyList( pList ); + return true; + } + + return false; +} + +void DocumentSettings::AssignURL( XPropertyListType t, const Any* pValue, + bool *pOk, bool *pChanged ) +{ + OUString aURL; + if( !( *pValue >>= aURL ) ) + return; + + if( LoadList( t, aURL, ""/*TODO?*/, uno::Reference< embed::XStorage >() ) ) + *pOk = *pChanged = true; +} + +struct { + const char *pName; + XPropertyListType t; +} const aURLPropertyNames[] = { + { "ColorTableURL", XPropertyListType::Color }, + { "DashTableURL", XPropertyListType::Dash }, + { "LineEndTableURL", XPropertyListType::LineEnd }, + { "HatchTableURL", XPropertyListType::Hatch }, + { "GradientTableURL", XPropertyListType::Gradient }, + { "BitmapTableURL", XPropertyListType::Bitmap } +}; + +static XPropertyListType getTypeOfName( std::u16string_view aName ) +{ + for(const auto & rURLPropertyName : aURLPropertyNames) { + if( o3tl::equalsAscii( aName, rURLPropertyName.pName ) ) + return rURLPropertyName.t; + } + return XPropertyListType::Unknown; +} + +static OUString getNameOfType( XPropertyListType t ) +{ + for(const auto & rURLPropertyName : aURLPropertyNames) { + if( t == rURLPropertyName.t ) + return OUString( rURLPropertyName.pName, + strlen( rURLPropertyName.pName ) - 3, + RTL_TEXTENCODING_ASCII_US ); + } + return OUString(); +} + +uno::Sequence + DocumentSettings::filterStreamsFromStorage( + OUString const & referer, + const uno::Reference< embed::XStorage > &xStorage, + const uno::Sequence& aConfigProps ) +{ + uno::Sequence aRet( aConfigProps.getLength() ); + auto aRetRange = asNonConstRange(aRet); + int nRet = 0; + for( const auto& rConfigProp : aConfigProps ) + { + XPropertyListType t = getTypeOfName( rConfigProp.Name ); + if (t == XPropertyListType::Unknown) + aRetRange[nRet++] = rConfigProp; + else + { + OUString aURL; + rConfigProp.Value >>= aURL; + LoadList( t, aURL, referer, xStorage ); + } + } + aRet.realloc( nRet ); + return aRet; +} + +uno::Sequence + DocumentSettings::filterStreamsToStorage( + const uno::Reference< embed::XStorage > &xStorage, + const uno::Sequence& aConfigProps ) +{ + uno::Sequence aRet( aConfigProps.getLength() ); + + bool bHasEmbed = false; + SdDrawDocument* pDoc = mxModel->GetDoc(); + for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ ) + { + const XPropertyListRef& pList = pDoc->GetPropertyList( static_cast(i) ); + bHasEmbed = pList.is() && pList->IsEmbedInDocument(); + if( bHasEmbed ) + break; + } + if( !bHasEmbed ) + return aConfigProps; + + try { + // create Settings/ sub storage. + uno::Reference< embed::XStorage > xSubStorage = xStorage->openStorageElement( "Settings" , + embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ); + if( !xSubStorage.is() ) + return aRet; + + auto aRetRange = asNonConstRange(aRet); + // now populate it + for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ ) + { + XPropertyListType t = getTypeOfName( aConfigProps[i].Name ); + aRetRange[i] = aConfigProps[i]; + if (t != XPropertyListType::Unknown) { + const XPropertyListRef& pList = pDoc->GetPropertyList( t ); + if( !pList.is() || !pList->IsEmbedInDocument() ) + continue; // no change ... + else + { + // Such specific path construction is grim. + + OUString aName( getNameOfType( t ) ); + OUString aResult; + if( pList->SaveTo( xSubStorage, aName, &aResult ) ) + { + OUString aRealPath = "Settings/" + aResult; + aRetRange[i].Value <<= aRealPath; + } + } + } + } + + // surprisingly difficult to make it really exist + uno::Reference< embed::XTransactedObject > xTrans( xSubStorage, UNO_QUERY ); + if( xTrans.is() ) + xTrans->commit(); + if( xSubStorage.is() ) + xSubStorage->dispose(); + } catch (const uno::Exception &) { +// fprintf (stderr, "saving etc. exception '%s'\n", +// OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); + } + + return aRet; +} + +// Most of the code reading/writing UNO document settings is the same in +// sd, sc and sw and it is mostly copy-pasted back and forth. +// TODO: Move _setPropertyValues and _getPropertyValues to some shared +// place, at least for the settings that are common to sd, sc and sw +void +DocumentSettings::_setPropertyValues(const PropertyMapEntry** ppEntries, + const Any* pValues) +{ + ::SolarMutexGuard aGuard; + + SdDrawDocument* pDoc = mxModel->GetDoc(); + ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell(); + if( nullptr == pDoc || nullptr == pDocSh ) + { + throw RuntimeException("Document or Shell missing", + static_cast(this)); + } + + bool bValue = false; + bool bOk, bChanged = false, bOptionsChanged = false; + + SdOptionsPrintItem aOptionsPrintItem; + + VclPtr pPrinter = pDocSh->GetPrinter( false ); + if( pPrinter ) + { + SdOptionsPrintItem const * pPrinterOptions = pPrinter->GetOptions().GetItemIfSet( ATTR_OPTIONS_PRINT, false ); + if(pPrinterOptions) + aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint(); + } + else + { + aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) ); + } + SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint(); + + for( ; *ppEntries; ppEntries++, pValues++ ) + { + bOk = false; + + switch( (*ppEntries)->mnHandle ) + { + case HANDLE_COLORTABLEURL: + AssignURL( XPropertyListType::Color, pValues, &bOk, &bChanged ); + break; + + case HANDLE_DASHTABLEURL: + AssignURL( XPropertyListType::Dash, pValues, &bOk, &bChanged ); + break; + + case HANDLE_LINEENDTABLEURL: + AssignURL( XPropertyListType::LineEnd, pValues, &bOk, &bChanged ); + break; + + case HANDLE_HATCHTABLEURL: + AssignURL( XPropertyListType::Hatch, pValues, &bOk, &bChanged ); + break; + + case HANDLE_GRADIENTTABLEURL: + AssignURL( XPropertyListType::Gradient, pValues, &bOk, &bChanged ); + break; + + case HANDLE_BITMAPTABLEURL: + AssignURL( XPropertyListType::Bitmap, pValues, &bOk, &bChanged ); + break; + + case HANDLE_FORBIDDENCHARS: + bOk = true; + break; + + case HANDLE_APPLYUSERDATA: + { + bool bApplyUserData = false; + if( *pValues >>= bApplyUserData ) + { + bChanged = ( bApplyUserData != pDocSh->IsUseUserData() ); + pDocSh->SetUseUserData( bApplyUserData ); + bOk = true; + } + } + break; + case HANDLE_SAVETHUMBNAIL: + { + bool bSaveThumbnail = false; + if (*pValues >>= bSaveThumbnail) + { + bChanged = (bSaveThumbnail != pDocSh->IsUseThumbnailSave()); + pDocSh->SetUseThumbnailSave(bSaveThumbnail); + bOk = true; + } + } + break; + + case HANDLE_PRINTDRAWING: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsDraw() != bValue ) + { + aPrintOpts.SetDraw( bValue ); + bOptionsChanged = true; + } + + bOk = true; + } + break; + case HANDLE_PRINTNOTES: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsNotes() != bValue ) + { + aPrintOpts.SetNotes( bValue ); + bOptionsChanged = true; + } + + bOk = true; + } + break; + case HANDLE_PRINTHANDOUT: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsHandout() != bValue) + { + aPrintOpts.SetHandout( bValue ); + bOptionsChanged = true; + } + + bOk = true; + } + break; + case HANDLE_PRINTOUTLINE: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsOutline() != bValue) + { + aPrintOpts.SetOutline( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_SLIDESPERHANDOUT: + { + sal_Int16 nValue = 0; + if( (*pValues >>= nValue) && (nValue >= 1) && (nValue <= 9) ) + { + if( static_cast( aPrintOpts.GetHandoutPages() ) != nValue ) + { + aPrintOpts.SetHandoutPages( static_cast< sal_uInt16 >( nValue ) ); + bOptionsChanged = true; + } + bOk = true; + } + } + break; + case HANDLE_HANDOUTHORIZONTAL: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsHandoutHorizontal() != bValue ) + { + aPrintOpts.SetHandoutHorizontal( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + + case HANDLE_PRINTPAGENAME: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsPagename() != bValue) + { + aPrintOpts.SetPagename( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTDATE: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsDate() != bValue) + { + aPrintOpts.SetDate( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTTIME: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsDate() != bValue) + { + aPrintOpts.SetTime( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTHIDDENPAGES: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsHiddenPages() != bValue) + { + aPrintOpts.SetHiddenPages( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTFITPAGE: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsPagesize() != bValue) + { + aPrintOpts.SetPagesize( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTTILEPAGE: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsPagetile() != bValue) + { + aPrintOpts.SetPagetile( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTBOOKLET: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsBooklet() != bValue) + { + aPrintOpts.SetBooklet( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTBOOKLETFRONT: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsFrontPage() != bValue) + { + aPrintOpts.SetFrontPage( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTBOOKLETBACK: + if( *pValues >>= bValue ) + { + if( aPrintOpts.IsBackPage() != bValue) + { + aPrintOpts.SetBackPage( bValue ); + bOptionsChanged = true; + } + bOk = true; + } + break; + case HANDLE_PRINTQUALITY: + { + sal_Int32 nValue = 0; + if( *pValues >>= nValue ) + { + if( aPrintOpts.GetOutputQuality() != nValue) + { + aPrintOpts.SetOutputQuality( static_cast(nValue) ); + bOptionsChanged = true; + } + bOk = true; + } + } + break; + case HANDLE_MEASUREUNIT: + { + sal_Int16 nValue = 0; + if( *pValues >>= nValue ) + { + FieldUnit nFieldUnit; + if( SvxMeasureUnitToFieldUnit( nValue, nFieldUnit ) ) + { + pDoc->SetUIUnit( nFieldUnit ); + bOk = true; + } + } + } + break; + case HANDLE_SCALE_NUM: + { + sal_Int32 nValue = 0; + if( *pValues >>= nValue ) + { + Fraction aFract( nValue, pDoc->GetUIScale().GetDenominator() ); + pDoc->SetUIScale( aFract ); + bOk = true; + bChanged = true; + } + } + break; + case HANDLE_SCALE_DOM: + { + sal_Int32 nValue = 0; + if( *pValues >>= nValue ) + { + auto nNumerator = pDoc->GetUIScale().GetNumerator(); + assert(nNumerator != 0); + Fraction aFract(nNumerator, nValue); + pDoc->SetUIScale( aFract ); + bOk = true; + bChanged = true; + } + } + break; + + case HANDLE_TABSTOP: + { + sal_Int32 nValue = 0; + if( (*pValues >>= nValue) && (nValue >= 0) ) + { + pDoc->SetDefaultTabulator(static_cast(nValue)); + bOk = true; + bChanged = true; + } + } + break; + case HANDLE_PAGENUMFMT: + { + sal_Int32 nValue = 0; + if( (*pValues >>= nValue ) && (nValue >= css::style::NumberingType::CHARS_UPPER_LETTER ) && (nValue <= css::style::NumberingType::PAGE_DESCRIPTOR) ) + { + pDoc->SetPageNumType(static_cast(nValue)); + bOk = true; + bChanged = true; + } + } + break; + case HANDLE_PRINTERNAME: + { + OUString aPrinterName; + if( *pValues >>= aPrinterName ) + { + bOk = true; + if( !aPrinterName.isEmpty() && pDocSh->GetCreateMode() != SfxObjectCreateMode::EMBEDDED ) + { + SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true ); + if (pTempPrinter) + { + VclPtr pNewPrinter = VclPtr::Create( pTempPrinter->GetOptions().Clone(), aPrinterName ); + pDocSh->SetPrinter( pNewPrinter ); + } + } + } + } + break; + case HANDLE_PRINTERJOB: + { + Sequence < sal_Int8 > aSequence; + if ( *pValues >>= aSequence ) + { + bOk = true; + sal_uInt32 nSize = aSequence.getLength(); + if( nSize ) + { + SvMemoryStream aStream (aSequence.getArray(), nSize, StreamMode::READ ); + aStream.Seek ( STREAM_SEEK_TO_BEGIN ); + std::unique_ptr pItemSet; + + bool bPreferPrinterPapersize = false; + if( pPrinter ) + { + pItemSet = pPrinter->GetOptions().Clone(); + bPreferPrinterPapersize = pPrinter->GetPrinterSettingsPreferred(); + } + else + { + pItemSet = std::make_unique>(pDoc->GetPool()); + } + + pPrinter = SfxPrinter::Create ( aStream, std::move(pItemSet) ); + pPrinter->SetPrinterSettingsPreferred( bPreferPrinterPapersize ); + + MapMode aMM (pPrinter->GetMapMode()); + aMM.SetMapUnit(MapUnit::Map100thMM); + pPrinter->SetMapMode(aMM); + + pDocSh->SetPrinter( pPrinter ); + + pPrinter = nullptr; + } + } + } + break; + + case HANDLE_PRINTERPAPERSIZE: + { + bool bPreferPrinterPapersize; + if( *pValues >>= bPreferPrinterPapersize ) + { + bOk = true; + if( pDocSh->GetCreateMode() != SfxObjectCreateMode::EMBEDDED ) + { + SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true ); + if (pTempPrinter) + pTempPrinter->SetPrinterSettingsPreferred( bPreferPrinterPapersize ); + } + } + } + break; + + case HANDLE_PARAGRAPHSUMMATION : + { + bool bIsSummationOfParagraphs = false; + if ( *pValues >>= bIsSummationOfParagraphs ) + { + bOk = true; + bChanged = true; + if ( pDoc->GetDocumentType() == DocumentType::Impress ) + { + EEControlBits nSum = bIsSummationOfParagraphs ? EEControlBits::ULSPACESUMMATION : EEControlBits::NONE; + EEControlBits nCntrl; + + pDoc->SetSummationOfParagraphs( bIsSummationOfParagraphs ); + SdDrawDocument* pDocument = pDocSh->GetDoc(); + SdrOutliner& rOutl = pDocument->GetDrawOutliner(); + nCntrl = rOutl.GetControlWord() &~ EEControlBits::ULSPACESUMMATION; + rOutl.SetControlWord( nCntrl | nSum ); + SdOutliner* pOutl = pDocument->GetOutliner( false ); + if( pOutl ) + { + nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION; + pOutl->SetControlWord( nCntrl | nSum ); + } + pOutl = pDocument->GetInternalOutliner( false ); + if( pOutl ) + { + nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION; + pOutl->SetControlWord( nCntrl | nSum ); + } + } + } + } + break; + + case HANDLE_CHARCOMPRESS: + { + sal_Int16 nCharCompressType = 0; + if( *pValues >>= nCharCompressType ) + { + bOk = true; + + pDoc->SetCharCompressType( static_cast(nCharCompressType) ); + SdDrawDocument* pDocument = pDocSh->GetDoc(); + SdrOutliner& rOutl = pDocument->GetDrawOutliner(); + rOutl.SetAsianCompressionMode( static_cast(nCharCompressType) ); + SdOutliner* pOutl = pDocument->GetOutliner( false ); + if( pOutl ) + { + pOutl->SetAsianCompressionMode( static_cast(nCharCompressType) ); + } + pOutl = pDocument->GetInternalOutliner( false ); + if( pOutl ) + { + pOutl->SetAsianCompressionMode( static_cast(nCharCompressType) ); + } + } + break; + + } + case HANDLE_ASIANPUNCT: + { + bool bAsianPunct = false; + if( *pValues >>= bAsianPunct ) + { + bOk = true; + + pDoc->SetKernAsianPunctuation( bAsianPunct ); + SdDrawDocument* pDocument = pDocSh->GetDoc(); + SdrOutliner& rOutl = pDocument->GetDrawOutliner(); + rOutl.SetKernAsianPunctuation( bAsianPunct ); + SdOutliner* pOutl = pDocument->GetOutliner( false ); + if( pOutl ) + { + pOutl->SetKernAsianPunctuation( bAsianPunct ); + } + pOutl = pDocument->GetInternalOutliner( false ); + if( pOutl ) + { + pOutl->SetKernAsianPunctuation( bAsianPunct ); + } + } + break; + + } + case HANDLE_UPDATEFROMTEMPLATE: + { + bool value = false; + if( *pValues >>= value ) + { + bChanged = ( value != pDocSh->IsQueryLoadTemplate() ); + pDocSh->SetQueryLoadTemplate( value ); + bOk = true; + } + } + break; + + case HANDLE_PRINTER_INDEPENDENT_LAYOUT: + { + // Just propagate the new printer independent layout mode to + // the document and determine it really differs from the old + // one. + sal_Int16 nOldValue = + static_cast(pDoc->GetPrinterIndependentLayout ()); + sal_Int16 nValue = 0; + if (*pValues >>= nValue) + { + pDoc->SetPrinterIndependentLayout (nValue); + bChanged = (nValue != nOldValue); + bOk = true; + } + } + break; + + // --> #i33095# + case HANDLE_LOAD_READONLY: + { + bool bNewValue = false; + if ( *pValues >>= bNewValue ) + { + bChanged = ( pDocSh->IsLoadReadonly() != bNewValue ); + pDocSh->SetLoadReadonly( bNewValue ); + bOk = true; + } + } + break; + + case HANDLE_MODIFY_PASSWD: + { + uno::Sequence< beans::PropertyValue > aInfo; + if ( !( *pValues >>= aInfo ) ) + throw lang::IllegalArgumentException( + "Value of type Sequence expected!", + uno::Reference< uno::XInterface >(), + 2 ); + + if ( !pDocSh->SetModifyPasswordInfo( aInfo ) ) + throw beans::PropertyVetoException( + "The hash is not allowed to be changed now!" ); + + bOk = true +; + + } + break; + + case HANDLE_SAVE_VERSION: + { + bool bNewValue = false; + if ( *pValues >>= bNewValue ) + { + bChanged = ( pDocSh->IsSaveVersionOnClose() != bNewValue ); + pDocSh->SetSaveVersionOnClose( bNewValue ); + bOk = true; + } + } + break; + + case HANDLE_EMBED_FONTS: + { + if (pValues->has()) + { + bool bNewValue = pValues->get(); + bChanged = (pDoc->IsEmbedFonts() != bNewValue); + pDoc->SetEmbedFonts(bNewValue); + bOk = true; + } + } + break; + + case HANDLE_EMBED_USED_FONTS: + { + if (pValues->has()) + { + bool bNewValue = pValues->get(); + bChanged = (pDoc->IsEmbedUsedFontsOnly() != bNewValue); + pDoc->SetEmbedUsedFontsOnly(bNewValue); + bOk = true; + } + } + break; + + case HANDLE_EMBED_LATIN_SCRIPT_FONTS: + { + if (pValues->has()) + { + bool bNewValue = pValues->get(); + bChanged = (pDoc->IsEmbedFontScriptLatin() != bNewValue); + pDoc->SetEmbedFontScriptLatin(bNewValue); + bOk = true; + } + } + break; + + case HANDLE_EMBED_ASIAN_SCRIPT_FONTS: + { + if (pValues->has()) + { + bool bNewValue = pValues->get(); + bChanged = (pDoc->IsEmbedFontScriptAsian() != bNewValue); + pDoc->SetEmbedFontScriptAsian(bNewValue); + bOk = true; + } + } + break; + + case HANDLE_EMBED_COMPLEX_SCRIPT_FONTS: + { + if (pValues->has()) + { + bool bNewValue = pValues->get(); + bChanged = (pDoc->IsEmbedFontScriptComplex() != bNewValue); + pDoc->SetEmbedFontScriptComplex(bNewValue); + bOk = true; + } + } + break; + + case HANDLE_IMAGE_PREFERRED_DPI: + { + if (pValues->has()) + { + auto nNewValue = pValues->get(); + bChanged = (pDoc->getImagePreferredDPI() != nNewValue); + pDoc->setImagePreferredDPI(nNewValue); + bOk = true; + } + } + break; + + default: + throw UnknownPropertyException( OUString::number((*ppEntries)->mnHandle), static_cast(this)); + } + + if( !bOk ) + throw IllegalArgumentException(); + } + + if( bOptionsChanged ) + { + if( !pPrinter ) + pPrinter = pDocSh->GetPrinter( true ); + SfxItemSet aNewOptions( pPrinter->GetOptions() ); + aNewOptions.Put( aOptionsPrintItem ); + pPrinter->SetOptions( aNewOptions ); + } + + if( bChanged || bOptionsChanged ) + mxModel->SetModified(); +} + +void DocumentSettings::ExtractURL( XPropertyListType t, Any* pValue ) +{ + XPropertyListRef pList = mxModel->GetDoc()->GetPropertyList( t ); + if( !pList.is() ) + return; + + INetURLObject aPathURL( pList->GetPath() ); + aPathURL.insertName( pList->GetName() ); + aPathURL.setExtension( pList->GetDefaultExt() ); + OUString aPath( aPathURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ); + *pValue <<= aPath; +} + +void +DocumentSettings::_getPropertyValues( + const PropertyMapEntry** ppEntries, Any* pValue) +{ + ::SolarMutexGuard aGuard; + + SdDrawDocument* pDoc = mxModel->GetDoc(); + ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell(); + if( nullptr == pDoc || nullptr == pDocSh ) + { + throw RuntimeException("Document or Shell missing", + static_cast(this)); + } + + SdOptionsPrintItem aOptionsPrintItem; + + SfxPrinter* pPrinter = pDocSh->GetPrinter( false ); + if( pPrinter ) + { + SdOptionsPrintItem const * pPrinterOptions = pPrinter->GetOptions().GetItemIfSet( ATTR_OPTIONS_PRINT, false ); + if (pPrinterOptions) + aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint(); + } + else + { + aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) ); + } + SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint(); + + for( ; *ppEntries; ppEntries++, pValue++ ) + { + switch( (*ppEntries)->mnHandle ) + { + case HANDLE_COLORTABLEURL: + ExtractURL( XPropertyListType::Color, pValue ); + break; + case HANDLE_DASHTABLEURL: + ExtractURL( XPropertyListType::Dash, pValue ); + break; + case HANDLE_LINEENDTABLEURL: + ExtractURL( XPropertyListType::LineEnd, pValue ); + break; + case HANDLE_HATCHTABLEURL: + ExtractURL( XPropertyListType::Hatch, pValue ); + break; + case HANDLE_GRADIENTTABLEURL: + ExtractURL( XPropertyListType::Gradient, pValue ); + break; + case HANDLE_BITMAPTABLEURL: + ExtractURL( XPropertyListType::Bitmap, pValue ); + break; + case HANDLE_FORBIDDENCHARS: + *pValue <<= mxModel->getForbiddenCharsTable(); + break; + case HANDLE_APPLYUSERDATA: + *pValue <<= pDocSh->IsUseUserData(); + break; + case HANDLE_SAVETHUMBNAIL: + *pValue <<= pDocSh->IsUseThumbnailSave(); + break; + case HANDLE_PRINTDRAWING: + *pValue <<= aPrintOpts.IsDraw(); + break; + case HANDLE_PRINTNOTES: + *pValue <<= aPrintOpts.IsNotes(); + break; + case HANDLE_PRINTHANDOUT: + *pValue <<= aPrintOpts.IsHandout(); + break; + case HANDLE_PRINTOUTLINE: + *pValue <<= aPrintOpts.IsOutline(); + break; + case HANDLE_SLIDESPERHANDOUT: + *pValue <<= static_cast(aPrintOpts.GetHandoutPages()); + break; + case HANDLE_HANDOUTHORIZONTAL: + *pValue <<= aPrintOpts.IsHandoutHorizontal(); + break; + case HANDLE_PRINTPAGENAME: + *pValue <<= aPrintOpts.IsPagename(); + break; + case HANDLE_PRINTDATE: + *pValue <<= aPrintOpts.IsDate(); + break; + case HANDLE_PRINTTIME: + *pValue <<= aPrintOpts.IsTime(); + break; + case HANDLE_PRINTHIDDENPAGES: + *pValue <<= aPrintOpts.IsHiddenPages(); + break; + case HANDLE_PRINTFITPAGE: + *pValue <<= aPrintOpts.IsPagesize(); + break; + case HANDLE_PRINTTILEPAGE: + *pValue <<= aPrintOpts.IsPagetile(); + break; + case HANDLE_PRINTBOOKLET: + *pValue <<= aPrintOpts.IsBooklet(); + break; + case HANDLE_PRINTBOOKLETFRONT: + *pValue <<= aPrintOpts.IsFrontPage(); + break; + case HANDLE_PRINTBOOKLETBACK: + *pValue <<= aPrintOpts.IsBackPage(); + break; + case HANDLE_PRINTQUALITY: + *pValue <<= static_cast(aPrintOpts.GetOutputQuality()); + break; + case HANDLE_MEASUREUNIT: + { + short nMeasure; + SvxFieldUnitToMeasureUnit( pDoc->GetUIUnit(), nMeasure ); + *pValue <<= static_cast(nMeasure); + } + break; + case HANDLE_SCALE_NUM: + *pValue <<= pDoc->GetUIScale().GetNumerator(); + break; + case HANDLE_SCALE_DOM: + *pValue <<= pDoc->GetUIScale().GetDenominator(); + break; + case HANDLE_TABSTOP: + *pValue <<= static_cast(pDoc->GetDefaultTabulator()); + break; + case HANDLE_PAGENUMFMT: + *pValue <<= static_cast(pDoc->GetPageNumType()); + break; + case HANDLE_PRINTERNAME: + { + SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false ); + *pValue <<= pTempPrinter ? pTempPrinter->GetName() : OUString(); + } + break; + case HANDLE_PRINTERJOB: + { + SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false ); + if (pTempPrinter) + { + SvMemoryStream aStream; + pTempPrinter->Store( aStream ); + *pValue <<= Sequence< sal_Int8 >( static_cast< const sal_Int8* >( aStream.GetData() ), + aStream.TellEnd() ); + } + else + { + Sequence < sal_Int8 > aSequence; + *pValue <<= aSequence; + } + } + break; + + case HANDLE_PRINTERPAPERSIZE: + { + SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false ); + *pValue <<= pTempPrinter && pTempPrinter->GetPrinterSettingsPreferred(); + } + break; + + case HANDLE_PARAGRAPHSUMMATION : + { + bool bIsSummationOfParagraphs = pDoc->IsSummationOfParagraphs(); + *pValue <<= bIsSummationOfParagraphs; + } + break; + + case HANDLE_CHARCOMPRESS: + { + *pValue <<= static_cast(pDoc->GetCharCompressType()); + break; + } + + case HANDLE_ASIANPUNCT: + { + *pValue <<= pDoc->IsKernAsianPunctuation(); + break; + } + + case HANDLE_UPDATEFROMTEMPLATE: + { + *pValue <<= pDocSh->IsQueryLoadTemplate(); + } + break; + + case HANDLE_PRINTER_INDEPENDENT_LAYOUT: + { + sal_Int16 nPrinterIndependentLayout = + static_cast(pDoc->GetPrinterIndependentLayout()); + *pValue <<= nPrinterIndependentLayout; + } + break; + + // --> #i33095# + case HANDLE_LOAD_READONLY: + { + *pValue <<= pDocSh->IsLoadReadonly(); + } + break; + + case HANDLE_MODIFY_PASSWD: + { + *pValue <<= pDocSh->GetModifyPasswordInfo(); + } + break; + + case HANDLE_SAVE_VERSION: + { + *pValue <<= pDocSh->IsSaveVersionOnClose(); + } + break; + + case HANDLE_EMBED_FONTS: + { + *pValue <<= pDoc->IsEmbedFonts(); + } + break; + + case HANDLE_EMBED_USED_FONTS: + { + *pValue <<= pDoc->IsEmbedUsedFontsOnly(); + } + break; + + case HANDLE_EMBED_LATIN_SCRIPT_FONTS: + { + *pValue <<= pDoc->IsEmbedFontScriptLatin(); + } + break; + + case HANDLE_EMBED_ASIAN_SCRIPT_FONTS: + { + *pValue <<= pDoc->IsEmbedFontScriptAsian(); + } + break; + + case HANDLE_EMBED_COMPLEX_SCRIPT_FONTS: + { + *pValue <<= pDoc->IsEmbedFontScriptComplex(); + } + break; + + case HANDLE_IMAGE_PREFERRED_DPI: + { + *pValue <<= pDoc->getImagePreferredDPI(); + } + break; + + default: + throw UnknownPropertyException( OUString::number((*ppEntries)->mnHandle), static_cast(this)); + } + } +} + +// XInterface +Any SAL_CALL DocumentSettings::queryInterface( const Type& aType ) +{ + return WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >::queryInterface( aType ); +} + +void SAL_CALL DocumentSettings::acquire( ) noexcept +{ + WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >::acquire(); +} + +void SAL_CALL DocumentSettings::release( ) noexcept +{ + WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >::release(); +} + +// XPropertySet +Reference< XPropertySetInfo > SAL_CALL DocumentSettings::getPropertySetInfo( ) +{ + return PropertySetHelper::getPropertySetInfo(); +} + +void SAL_CALL DocumentSettings::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) +{ + PropertySetHelper::setPropertyValue( aPropertyName, aValue ); +} + +Any SAL_CALL DocumentSettings::getPropertyValue( const OUString& PropertyName ) +{ + return PropertySetHelper::getPropertyValue( PropertyName ); +} + +void SAL_CALL DocumentSettings::addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) +{ + PropertySetHelper::addPropertyChangeListener( aPropertyName, xListener ); +} + +void SAL_CALL DocumentSettings::removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) +{ + PropertySetHelper::removePropertyChangeListener( aPropertyName, aListener ); +} + +void SAL_CALL DocumentSettings::addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) +{ + PropertySetHelper::addVetoableChangeListener( PropertyName, aListener ); +} + +void SAL_CALL DocumentSettings::removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) +{ + PropertySetHelper::removeVetoableChangeListener( PropertyName, aListener ); +} + +// XMultiPropertySet +void SAL_CALL DocumentSettings::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) +{ + PropertySetHelper::setPropertyValues( aPropertyNames, aValues ); +} + +Sequence< Any > SAL_CALL DocumentSettings::getPropertyValues( const Sequence< OUString >& aPropertyNames ) +{ + return PropertySetHelper::getPropertyValues( aPropertyNames ); +} + +void SAL_CALL DocumentSettings::addPropertiesChangeListener( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener ) +{ + PropertySetHelper::addPropertiesChangeListener( aPropertyNames, xListener ); +} + +void SAL_CALL DocumentSettings::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& xListener ) +{ + PropertySetHelper::removePropertiesChangeListener( xListener ); +} + +void SAL_CALL DocumentSettings::firePropertiesChangeEvent( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener ) +{ + PropertySetHelper::firePropertiesChangeEvent( aPropertyNames, xListener ); +} + +// XServiceInfo +OUString SAL_CALL DocumentSettings::getImplementationName( ) +{ + return "com.sun.star.comp.Draw.DocumentSettings"; +} + +sal_Bool SAL_CALL DocumentSettings::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService(this, ServiceName); +} + +Sequence< OUString > SAL_CALL DocumentSettings::getSupportedServiceNames( ) +{ + return { "com.sun.star.document.Settings" , + mxModel->IsImpressDocument()?OUString("com.sun.star.presentation.DocumentSettings"):OUString("com.sun.star.drawing.DocumentSettings") }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/UnoDocumentSettings.hxx b/sd/source/ui/unoidl/UnoDocumentSettings.hxx new file mode 100644 index 0000000000..bba3c66b1b --- /dev/null +++ b/sd/source/ui/unoidl/UnoDocumentSettings.hxx @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +namespace com::sun::star::uno +{ +class XInterface; +} + +class SdXImpressDocument; + +namespace sd +{ +css::uno::Reference +DocumentSettings_createInstance(SdXImpressDocument* pDoc) noexcept; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/randomnode.cxx b/sd/source/ui/unoidl/randomnode.cxx new file mode 100644 index 0000000000..74f4eb0a30 --- /dev/null +++ b/sd/source/ui/unoidl/randomnode.cxx @@ -0,0 +1,569 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::XInterface; +using ::com::sun::star::uno::WeakReference; +using ::com::sun::star::beans::NamedValue; +using ::com::sun::star::lang::IllegalArgumentException; +using ::com::sun::star::container::XEnumeration; +using ::com::sun::star::container::XEnumerationAccess; +using ::com::sun::star::util::XCloneable; +using ::com::sun::star::lang::XServiceInfo; +using ::com::sun::star::lang::XInitialization; +using ::com::sun::star::uno::Type; +using ::com::sun::star::uno::XWeak; +using ::com::sun::star::presentation::ParagraphTarget; +using ::com::sun::star::drawing::XShape; + +using namespace ::com::sun::star::animations; + +namespace sd +{ + +typedef ::cppu::WeakImplHelper< XTimeContainer, XEnumerationAccess, XCloneable, XServiceInfo, XInitialization > RandomAnimationNodeBase; + +namespace { + +class RandomAnimationNode : public RandomAnimationNodeBase +{ +public: + RandomAnimationNode( const RandomAnimationNode& rNode ); + explicit RandomAnimationNode( sal_Int16 nPresetClass ); + RandomAnimationNode(); + + void init( sal_Int16 nPresetClass ); + + // XInitialization + void SAL_CALL initialize( const Sequence< Any >& aArguments ) override; + + // XChild + Reference< XInterface > SAL_CALL getParent( ) override; + void SAL_CALL setParent( const Reference< XInterface >& Parent ) override; + + // XCloneable + virtual Reference< XCloneable > SAL_CALL createClone() override; + + // XServiceInfo + OUString SAL_CALL getImplementationName() override; + Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; + + // XAnimationNode + ::sal_Int16 SAL_CALL getType() override; + Any SAL_CALL getBegin() override; + void SAL_CALL setBegin( const Any& _begin ) override; + Any SAL_CALL getDuration() override; + void SAL_CALL setDuration( const Any& _duration ) override; + Any SAL_CALL getEnd() override; + void SAL_CALL setEnd( const Any& _end ) override; + Any SAL_CALL getEndSync() override; + void SAL_CALL setEndSync( const Any& _endsync ) override; + Any SAL_CALL getRepeatCount() override; + void SAL_CALL setRepeatCount( const Any& _repeatcount ) override; + Any SAL_CALL getRepeatDuration() override; + void SAL_CALL setRepeatDuration( const Any& _repeatduration ) override; + ::sal_Int16 SAL_CALL getFill() override; + void SAL_CALL setFill( ::sal_Int16 _fill ) override; + ::sal_Int16 SAL_CALL getFillDefault() override; + void SAL_CALL setFillDefault( ::sal_Int16 _filldefault ) override; + ::sal_Int16 SAL_CALL getRestart() override; + void SAL_CALL setRestart( ::sal_Int16 _restart ) override; + ::sal_Int16 SAL_CALL getRestartDefault() override; + void SAL_CALL setRestartDefault( ::sal_Int16 _restartdefault ) override; + double SAL_CALL getAcceleration() override; + void SAL_CALL setAcceleration( double _acceleration ) override; + double SAL_CALL getDecelerate() override; + void SAL_CALL setDecelerate( double _decelerate ) override; + sal_Bool SAL_CALL getAutoReverse() override; + void SAL_CALL setAutoReverse( sal_Bool _autoreverse ) override; + Sequence< NamedValue > SAL_CALL getUserData() override; + void SAL_CALL setUserData( const Sequence< NamedValue >& _userdata ) override; + + // XElementAccess + virtual Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XEnumerationAccess + virtual Reference< XEnumeration > SAL_CALL createEnumeration() override; + + // XTimeContainer + Reference< XAnimationNode > SAL_CALL insertBefore( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& refChild ) override; + Reference< XAnimationNode > SAL_CALL insertAfter( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& refChild ) override; + Reference< XAnimationNode > SAL_CALL replaceChild( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& oldChild ) override; + Reference< XAnimationNode > SAL_CALL removeChild( const Reference< XAnimationNode >& oldChild ) override; + Reference< XAnimationNode > SAL_CALL appendChild( const Reference< XAnimationNode >& newChild ) override; + +private: + // our first, last and only protection from multi-threads! + std::mutex maMutex; + + sal_Int16 mnPresetClass; + WeakReference mxParent; + + Any maBegin, maDuration, maEnd, maEndSync, maRepeatCount, maRepeatDuration, maTarget; + sal_Int16 mnFill, mnFillDefault, mnRestart, mnRestartDefault; + double mfAcceleration, mfDecelerate; + bool mbAutoReverse; + Sequence< NamedValue > maUserData; + + Reference< XAnimate > mxFirstNode; +}; + +} + +Reference< XInterface > RandomAnimationNode_createInstance( sal_Int16 nPresetClass ) +{ + Reference< XInterface > xInt( static_cast( new RandomAnimationNode( nPresetClass ) ) ); + return xInt; +} + +RandomAnimationNode::RandomAnimationNode( const RandomAnimationNode& rNode ) +: RandomAnimationNodeBase(rNode), + mnPresetClass( rNode.mnPresetClass ), + maBegin( rNode.maBegin ), + maDuration( rNode.maDuration ), + maEnd( rNode.maEnd ), + maEndSync( rNode.maEndSync ), + maRepeatCount( rNode.maRepeatCount ), + maRepeatDuration( rNode.maRepeatDuration ), + maTarget( rNode.maTarget ), + mnFill( rNode.mnFill ), + mnFillDefault( rNode.mnFillDefault ), + mnRestart( rNode.mnRestart ), + mnRestartDefault( rNode.mnRestartDefault ), + mfAcceleration( rNode.mfAcceleration ), + mfDecelerate( rNode.mfDecelerate ), + mbAutoReverse( rNode.mbAutoReverse ), + maUserData( rNode.maUserData ) +{ +} + +RandomAnimationNode::RandomAnimationNode( sal_Int16 nPresetClass ) +{ + init( nPresetClass ); +} + +RandomAnimationNode::RandomAnimationNode() +{ + init( 1 ); +} + +void RandomAnimationNode::init( sal_Int16 nPresetClass ) +{ + mnPresetClass = nPresetClass; + mnFill = AnimationFill::DEFAULT; + mnFillDefault = AnimationFill::INHERIT; + mnRestart = AnimationRestart::DEFAULT; + mnRestartDefault = AnimationRestart::INHERIT; + mfAcceleration = 0.0; + mfDecelerate = 0.0; + mbAutoReverse = false; +} + +// XInitialization +void SAL_CALL RandomAnimationNode::initialize( const Sequence< Any >& aArguments ) +{ + if( aArguments.getLength() != 1 ) + throw IllegalArgumentException(); + + if( aArguments[0].getValueType() == ::cppu::UnoType::get() ) + { + aArguments[0] >>= mnPresetClass; + } + else if( aArguments[0].getValueType() != ::cppu::UnoType::get() ) + { + Reference< XShape > xShape; + aArguments[0] >>= xShape; + if( !xShape.is() ) + throw IllegalArgumentException(); + } + maTarget = aArguments[0]; +} + +// XAnimationNode +sal_Int16 SAL_CALL RandomAnimationNode::getType() +{ + return css::animations::AnimationNodeType::PAR; +} + +// XAnimationNode +Any SAL_CALL RandomAnimationNode::getBegin() +{ + std::unique_lock aGuard( maMutex ); + return maBegin; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setBegin( const Any& _begin ) +{ + std::unique_lock aGuard( maMutex ); + maBegin = _begin; +} + +// XAnimationNode +Any SAL_CALL RandomAnimationNode::getDuration() +{ + std::unique_lock aGuard( maMutex ); + return maDuration; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setDuration( const Any& _duration ) +{ + std::unique_lock aGuard( maMutex ); + maDuration = _duration; +} + +// XAnimationNode +Any SAL_CALL RandomAnimationNode::getEnd() +{ + std::unique_lock aGuard( maMutex ); + return maEnd; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setEnd( const Any& _end ) +{ + std::unique_lock aGuard( maMutex ); + maEnd = _end; +} + +// XAnimationNode +Any SAL_CALL RandomAnimationNode::getEndSync() +{ + std::unique_lock aGuard( maMutex ); + return maEndSync; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setEndSync( const Any& _endsync ) +{ + std::unique_lock aGuard( maMutex ); + maEndSync = _endsync; +} + +// XAnimationNode +Any SAL_CALL RandomAnimationNode::getRepeatCount() +{ + std::unique_lock aGuard( maMutex ); + return maRepeatCount; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setRepeatCount( const Any& _repeatcount ) +{ + std::unique_lock aGuard( maMutex ); + maRepeatCount = _repeatcount; +} + +// XAnimationNode +Any SAL_CALL RandomAnimationNode::getRepeatDuration() +{ + std::unique_lock aGuard( maMutex ); + return maRepeatDuration; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setRepeatDuration( const Any& _repeatduration ) +{ + std::unique_lock aGuard( maMutex ); + maRepeatDuration = _repeatduration; +} + +// XAnimationNode +sal_Int16 SAL_CALL RandomAnimationNode::getFill() +{ + std::unique_lock aGuard( maMutex ); + return mnFill; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setFill( sal_Int16 _fill ) +{ + std::unique_lock aGuard( maMutex ); + mnFill = _fill; +} + +// XAnimationNode +sal_Int16 SAL_CALL RandomAnimationNode::getFillDefault() +{ + std::unique_lock aGuard( maMutex ); + return mnFillDefault; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setFillDefault( sal_Int16 _filldefault ) +{ + std::unique_lock aGuard( maMutex ); + mnFillDefault = _filldefault; +} + +// XAnimationNode +sal_Int16 SAL_CALL RandomAnimationNode::getRestart() +{ + std::unique_lock aGuard( maMutex ); + return mnRestart; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setRestart( sal_Int16 _restart ) +{ + std::unique_lock aGuard( maMutex ); + mnRestart = _restart; +} + +// XAnimationNode +sal_Int16 SAL_CALL RandomAnimationNode::getRestartDefault() +{ + std::unique_lock aGuard( maMutex ); + return mnRestartDefault; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setRestartDefault( sal_Int16 _restartdefault ) +{ + std::unique_lock aGuard( maMutex ); + mnRestartDefault = _restartdefault; +} + +// XAnimationNode +double SAL_CALL RandomAnimationNode::getAcceleration() +{ + std::unique_lock aGuard( maMutex ); + return mfAcceleration; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setAcceleration( double _acceleration ) +{ + std::unique_lock aGuard( maMutex ); + mfAcceleration = _acceleration; +} + +// XAnimationNode +double SAL_CALL RandomAnimationNode::getDecelerate() +{ + std::unique_lock aGuard( maMutex ); + return mfDecelerate; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setDecelerate( double _decelerate ) +{ + std::unique_lock aGuard( maMutex ); + mfDecelerate = _decelerate; +} + +// XAnimationNode +sal_Bool SAL_CALL RandomAnimationNode::getAutoReverse() +{ + std::unique_lock aGuard( maMutex ); + return mbAutoReverse; +} + +// XAnimationNode +void SAL_CALL RandomAnimationNode::setAutoReverse( sal_Bool _autoreverse ) +{ + std::unique_lock aGuard( maMutex ); + mbAutoReverse = _autoreverse; +} + +Sequence< NamedValue > SAL_CALL RandomAnimationNode::getUserData() +{ + std::unique_lock aGuard( maMutex ); + return maUserData; +} + +void SAL_CALL RandomAnimationNode::setUserData( const Sequence< NamedValue >& _userdata ) +{ + std::unique_lock aGuard( maMutex ); + maUserData = _userdata; +} + +// XChild +Reference< XInterface > SAL_CALL RandomAnimationNode::getParent() +{ + std::unique_lock aGuard( maMutex ); + return mxParent.get(); +} + +// XChild +void SAL_CALL RandomAnimationNode::setParent( const Reference< XInterface >& Parent ) +{ + std::unique_lock aGuard( maMutex ); + mxParent = Parent; +} + +// XCloneable +Reference< XCloneable > SAL_CALL RandomAnimationNode::createClone() +{ + Reference< XCloneable > xNewNode( new RandomAnimationNode( *this ) ); + return xNewNode; +} + +// XElementAccess +Type SAL_CALL RandomAnimationNode::getElementType() +{ + return cppu::UnoType::get(); +} + +// XElementAccess +sal_Bool SAL_CALL RandomAnimationNode::hasElements() +{ + return true; +} + +// XEnumerationAccess +Reference< XEnumeration > SAL_CALL RandomAnimationNode::createEnumeration() +{ + std::unique_lock aGuard( maMutex ); + + if( !maTarget.hasValue() && mxFirstNode.is() ) + { + Any aTarget( mxFirstNode->getTarget() ); + if( aTarget.hasValue() ) + { + maTarget = aTarget; + mxFirstNode.clear(); + } + } + + Reference< XEnumeration > xEnum; + + Reference< XEnumerationAccess > aEnumAccess( CustomAnimationPresets::getCustomAnimationPresets().getRandomPreset( mnPresetClass ), UNO_QUERY ); + + if( aEnumAccess.is() ) + { + Reference< XEnumeration > xEnumeration = aEnumAccess->createEnumeration(); + if( xEnumeration.is() ) + { + while( xEnumeration->hasMoreElements() ) + { + Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY ); + if( xAnimate.is() ) + xAnimate->setTarget( maTarget ); + } + } + xEnum = aEnumAccess->createEnumeration(); + } + else + { + // no presets? give empty node! + Reference< XParallelTimeContainer > xTimeContainer = ParallelTimeContainer::create( comphelper::getProcessComponentContext() ); + xEnum = xTimeContainer->createEnumeration(); + } + + return xEnum; +} + +// XTimeContainer +Reference< XAnimationNode > SAL_CALL RandomAnimationNode::insertBefore( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& ) +{ + return appendChild( newChild ); +} + +// XTimeContainer +Reference< XAnimationNode > SAL_CALL RandomAnimationNode::insertAfter( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& ) +{ + return appendChild( newChild ); +} + +// XTimeContainer +Reference< XAnimationNode > SAL_CALL RandomAnimationNode::replaceChild( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& ) +{ + return appendChild( newChild ); +} + +// XTimeContainer +Reference< XAnimationNode > SAL_CALL RandomAnimationNode::removeChild( const Reference< XAnimationNode >& oldChild ) +{ + return oldChild; +} + +// XTimeContainer +Reference< XAnimationNode > SAL_CALL RandomAnimationNode::appendChild( const Reference< XAnimationNode >& newChild ) +{ + Reference< XAnimate > xAnimate( newChild, UNO_QUERY ); + if( xAnimate.is() ) + { + Any aTarget( xAnimate->getTarget() ); + if( aTarget.hasValue() ) + maTarget = aTarget; + } + + if( !maTarget.hasValue() && !mxFirstNode.is() ) + mxFirstNode = xAnimate; + + return newChild; +} + +// XServiceInfo +OUString RandomAnimationNode::getImplementationName() +{ + return "sd::RandomAnimationNode" ; +} + +// XServiceInfo +sal_Bool RandomAnimationNode::supportsService(const OUString& ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +// XServiceInfo +Sequence< OUString > RandomAnimationNode::getSupportedServiceNames() +{ + return { "com.sun.star.animations.ParallelTimeContainer", "com.sun.star.comp.sd.RandomAnimationNode" }; +} + +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +RandomAnimationNode_get_implementation(css::uno::XComponentContext*, + css::uno::Sequence const &) +{ + return cppu::acquire(new sd::RandomAnimationNode()); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/sddetect.cxx b/sd/source/ui/unoidl/sddetect.cxx new file mode 100644 index 0000000000..cfa50d1418 --- /dev/null +++ b/sd/source/ui/unoidl/sddetect.cxx @@ -0,0 +1,160 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "sddetect.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::lang; +using utl::MediaDescriptor; + +SdFilterDetect::SdFilterDetect() +{ +} + +SdFilterDetect::~SdFilterDetect() +{ +} + +OUString SAL_CALL SdFilterDetect::detect( Sequence< beans::PropertyValue >& lDescriptor ) +{ + MediaDescriptor aMediaDesc( lDescriptor ); + OUString aTypeName = aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_TYPENAME, OUString() ); + uno::Reference< io::XInputStream > xInStream ( aMediaDesc[MediaDescriptor::PROP_INPUTSTREAM], uno::UNO_QUERY ); + if ( !xInStream.is() ) + return OUString(); + + SfxMedium aMedium; + aMedium.UseInteractionHandler( false ); + aMedium.setStreamToLoadFrom( xInStream, true ); + + SvStream *pInStrm = aMedium.GetInStream(); + if ( !pInStrm || pInStrm->GetError() ) + return OUString(); + + if ( aTypeName.startsWith( "impress_MS_PowerPoint_97" ) ) + { + // Do not attempt to create an SotStorage on a + // 0-length stream as that would create the compound + // document header on the stream and effectively write to + // disk! + pInStrm->Seek( STREAM_SEEK_TO_BEGIN ); + if ( pInStrm->remainingSize() == 0 ) + return OUString(); + + try + { + tools::SvRef aStorage = new SotStorage( pInStrm, false ); + if ( !aStorage->GetError() && aStorage->IsStream( "PowerPoint Document" ) ) + return aTypeName; + } + catch (const css::ucb::ContentCreationException&) + { + } + } + else + { + pInStrm->Seek( STREAM_SEEK_TO_BEGIN ); + + const OUString aFileName( aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_URL, OUString() ) ); + GraphicDescriptor aDesc( *pInStrm, &aFileName ); + if( !aDesc.Detect() ) + { + INetURLObject aCheckURL( aFileName ); + if( aCheckURL.getExtension().equalsIgnoreAsciiCase("cgm") ) + { + sal_uInt8 n8; + pInStrm->Seek( STREAM_SEEK_TO_BEGIN ); + pInStrm->ReadUChar( n8 ); + if ( ( n8 & 0xf0 ) == 0 ) + // we are supporting binary cgm format only, so + // this is a small test to exclude cgm text + return "impress_CGM_Computer_Graphics_Metafile"; + } + } + else + { + OUString aShortName( GraphicDescriptor::GetImportFormatShortName( aDesc.GetFileFormat() ) ); + GraphicFilter &rGrfFilter = GraphicFilter::GetGraphicFilter(); + const OUString aName( rGrfFilter.GetImportFormatTypeName( rGrfFilter.GetImportFormatNumberForShortName( aShortName ) ) ); + + if ( aShortName.equalsIgnoreAsciiCase( "PCD" ) ) // there is a multiple pcd selection possible + { + sal_Int32 nBase = 2; // default Base0 + if ( aTypeName == "pcd_Photo_CD_Base4" ) + nBase = 1; + else if ( aTypeName == "pcd_Photo_CD_Base16" ) + nBase = 0; + FilterConfigItem aFilterConfigItem( u"Office.Common/Filter/Graphic/Import/PCD" ); + aFilterConfigItem.WriteInt32( "Resolution" , nBase ); + } + + SfxFilterMatcher aMatch("sdraw"); + std::shared_ptr pFilter = aMatch.GetFilter4FilterName( aName ); + if ( pFilter ) + return pFilter->GetRealTypeName(); + } + } + + return OUString(); +} + +// XServiceInfo +OUString SAL_CALL SdFilterDetect::getImplementationName() +{ + return "com.sun.star.comp.draw.FormatDetector"; +} + +// XServiceInfo +sal_Bool SAL_CALL SdFilterDetect::supportsService( const OUString& sServiceName ) +{ + return cppu::supportsService(this, sServiceName); +} + +// XServiceInfo +Sequence< OUString > SAL_CALL SdFilterDetect::getSupportedServiceNames() +{ + return { "com.sun.star.frame.ExtendedTypeDetection" }; +} + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_draw_FormatDetector_get_implementation(css::uno::XComponentContext*, + css::uno::Sequence const &) +{ + return cppu::acquire(new SdFilterDetect()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/sddetect.hxx b/sd/source/ui/unoidl/sddetect.hxx new file mode 100644 index 0000000000..3d22cc12c8 --- /dev/null +++ b/sd/source/ui/unoidl/sddetect.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include + +#include + + +namespace com::sun::star::beans { struct PropertyValue; } + +class SdFilterDetect : public ::cppu::WeakImplHelper< css::document::XExtendedFilterDetection, css::lang::XServiceInfo > +{ +public: + SdFilterDetect(); + virtual ~SdFilterDetect() override; + + // XServiceInfo + + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& sServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XExtendedFilterDetect + + virtual OUString SAL_CALL detect( css::uno::Sequence< css::beans::PropertyValue >& lDescriptor ) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unocpres.cxx b/sd/source/ui/unoidl/unocpres.cxx new file mode 100644 index 0000000000..fa329df6f7 --- /dev/null +++ b/sd/source/ui/unoidl/unocpres.cxx @@ -0,0 +1,451 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "unocpres.hxx" +#include +#include +#include + +using namespace ::com::sun::star; + +uno::Reference< uno::XInterface > createUnoCustomShow( SdCustomShow* pShow ) +{ + return static_cast(new SdXCustomPresentation( pShow )); +} + +SdXCustomPresentation::SdXCustomPresentation() noexcept +: mpSdCustomShow(nullptr), mpModel(nullptr), + bDisposing( false ) +{ +} + +SdXCustomPresentation::SdXCustomPresentation( SdCustomShow* pShow) noexcept +: mpSdCustomShow(pShow), mpModel(nullptr), + bDisposing( false ) +{ +} + +SdXCustomPresentation::~SdXCustomPresentation() noexcept +{ +} + +// XServiceInfo +OUString SAL_CALL SdXCustomPresentation::getImplementationName() +{ + return "SdXCustomPresentation" ; +} + +sal_Bool SAL_CALL SdXCustomPresentation::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdXCustomPresentation::getSupportedServiceNames() +{ + return { "com.sun.star.presentation.CustomPresentation" }; +} + +// XIndexContainer +void SAL_CALL SdXCustomPresentation::insertByIndex( sal_Int32 Index, const uno::Any& Element ) +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + throw lang::DisposedException(); + + if( Index < 0 || o3tl::make_unsigned(Index) > ( mpSdCustomShow ? mpSdCustomShow->PagesVector().size() : 0 ) ) + throw lang::IndexOutOfBoundsException(); + + uno::Reference< drawing::XDrawPage > xPage; + Element >>= xPage; + + if(!xPage.is()) + throw lang::IllegalArgumentException(); + + SdDrawPage* pPage = comphelper::getFromUnoTunnel( xPage ); + + if(pPage) + { + if (!mpModel) + mpModel = pPage->GetModel(); + + if (!mpSdCustomShow) + mpSdCustomShow = new SdCustomShow; + + mpSdCustomShow->PagesVector().insert(mpSdCustomShow->PagesVector().begin() + Index, + static_cast(pPage->GetSdrPage())); + } + + if( mpModel ) + mpModel->SetModified(); +} + +void SAL_CALL SdXCustomPresentation::removeByIndex( sal_Int32 Index ) +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + throw lang::DisposedException(); + + if(mpSdCustomShow) + { + uno::Reference< drawing::XDrawPage > xPage; + getByIndex( Index ) >>= xPage; + + if( xPage.is() ) + { + SvxDrawPage* pPage = comphelper::getFromUnoTunnel( xPage ); + if(pPage) + { + SdCustomShow::PageVec::iterator it = std::find( + mpSdCustomShow->PagesVector().begin(), + mpSdCustomShow->PagesVector().end(), + pPage->GetSdrPage()); + if (it != mpSdCustomShow->PagesVector().end()) + mpSdCustomShow->PagesVector().erase(it); + } + } + } + + if( mpModel ) + mpModel->SetModified(); +} + +// XIndexReplace +void SAL_CALL SdXCustomPresentation::replaceByIndex( sal_Int32 Index, const uno::Any& Element ) +{ + removeByIndex( Index ); + insertByIndex( Index, Element ); +} + +// XElementAccess +uno::Type SAL_CALL SdXCustomPresentation::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdXCustomPresentation::hasElements() +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + throw lang::DisposedException(); + + return getCount() > 0; +} + +// XIndexAccess +sal_Int32 SAL_CALL SdXCustomPresentation::getCount() +{ + SolarMutexGuard aGuard; + if( bDisposing ) + throw lang::DisposedException(); + + return mpSdCustomShow ? mpSdCustomShow->PagesVector().size() : 0; +} + +uno::Any SAL_CALL SdXCustomPresentation::getByIndex( sal_Int32 Index ) +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + throw lang::DisposedException(); + + if (Index < 0 || !mpSdCustomShow || o3tl::make_unsigned(Index) >= mpSdCustomShow->PagesVector().size()) + throw lang::IndexOutOfBoundsException(); + + uno::Any aAny; + SdrPage * pPage = const_cast(mpSdCustomShow->PagesVector()[Index]); + + if( pPage ) + { + uno::Reference< drawing::XDrawPage > xRef( pPage->getUnoPage(), uno::UNO_QUERY ); + aAny <<= xRef; + } + + return aAny; +} + +// XNamed +OUString SAL_CALL SdXCustomPresentation::getName() +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + throw lang::DisposedException(); + + if(mpSdCustomShow) + return mpSdCustomShow->GetName(); + + return OUString(); +} + +void SAL_CALL SdXCustomPresentation::setName( const OUString& aName ) +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + throw lang::DisposedException(); + + if(mpSdCustomShow) + mpSdCustomShow->SetName( aName ); +} + +// XComponent +void SAL_CALL SdXCustomPresentation::dispose() +{ + SolarMutexGuard aGuard; + + if( bDisposing ) + return; // caught a recursion + + bDisposing = true; + + uno::Reference< uno::XInterface > xSource( static_cast(this) ); + + std::unique_lock aGuard2(aDisposeContainerMutex); + lang::EventObject aEvt; + aEvt.Source = xSource; + aDisposeListeners.disposeAndClear(aGuard2, aEvt); + + mpSdCustomShow = nullptr; +} + +void SAL_CALL SdXCustomPresentation::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) +{ + if( bDisposing ) + throw lang::DisposedException(); + + std::unique_lock aGuard(aDisposeContainerMutex); + aDisposeListeners.addInterface(aGuard, xListener); +} + +void SAL_CALL SdXCustomPresentation::removeEventListener( const uno::Reference< lang::XEventListener >& aListener ) +{ + if( !bDisposing ) + { + std::unique_lock aGuard(aDisposeContainerMutex); + aDisposeListeners.removeInterface(aGuard, aListener); + } +} + +/*===========================================================================* + * class SdXCustomPresentationAccess : public XCustomPresentationAccess, * + * public UsrObject * + *===========================================================================*/ + +SdXCustomPresentationAccess::SdXCustomPresentationAccess(SdXImpressDocument& rMyModel) noexcept +: mrModel(rMyModel) +{ +} + +SdXCustomPresentationAccess::~SdXCustomPresentationAccess() noexcept +{ +} + +// XServiceInfo +OUString SAL_CALL SdXCustomPresentationAccess::getImplementationName() +{ + return "SdXCustomPresentationAccess"; +} + +sal_Bool SAL_CALL SdXCustomPresentationAccess::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdXCustomPresentationAccess::getSupportedServiceNames() +{ + return { "com.sun.star.presentation.CustomPresentationAccess" }; +} + +// XSingleServiceFactory +uno::Reference< uno::XInterface > SAL_CALL SdXCustomPresentationAccess::createInstance() +{ + uno::Reference< uno::XInterface > xRef( static_cast(new SdXCustomPresentation()) ); + return xRef; +} + +uno::Reference< uno::XInterface > SAL_CALL SdXCustomPresentationAccess::createInstanceWithArguments( const uno::Sequence< uno::Any >& ) +{ + return createInstance(); +} + +// XNameContainer +void SAL_CALL SdXCustomPresentationAccess::insertByName( const OUString& aName, const uno::Any& aElement ) +{ + SolarMutexGuard aGuard; + + // get the documents custom show list + SdCustomShowList* pList = nullptr; + if(mrModel.GetDoc()) + pList = mrModel.GetDoc()->GetCustomShowList(true); + + // no list, no cookies + if( nullptr == pList) + throw uno::RuntimeException(); + + // do we have a container::XIndexContainer? + SdXCustomPresentation* pXShow = nullptr; + + uno::Reference< container::XIndexContainer > xContainer; + if( (aElement >>= xContainer) && xContainer.is() ) + pXShow = dynamic_cast(xContainer.get()); + + if( nullptr == pXShow ) + throw lang::IllegalArgumentException(); + + // get the internal custom show from the api wrapper + SdCustomShow* pShow = pXShow->GetSdCustomShow(); + if( nullptr == pShow ) + { + pShow = new SdCustomShow( xContainer ); + pXShow->SetSdCustomShow( pShow ); + } + else + { + if( nullptr == pXShow->GetModel() || *pXShow->GetModel() != mrModel ) + throw lang::IllegalArgumentException(); + } + + // give it a name + pShow->SetName( aName); + + // check if this or another customshow with the same name already exists + for( SdCustomShow* pCompare = pList->First(); + pCompare; + pCompare = pList->Next() ) + { + if( pCompare == pShow || pCompare->GetName() == pShow->GetName() ) + throw container::ElementExistException(); + } + + pList->push_back(std::unique_ptr(pShow)); + + mrModel.SetModified(); +} + +void SAL_CALL SdXCustomPresentationAccess::removeByName( const OUString& Name ) +{ + SolarMutexGuard aGuard; + + SdCustomShow* pShow = getSdCustomShow(Name); + + SdCustomShowList* pList = GetCustomShowList(); + if(!pList || !pShow) + throw container::NoSuchElementException(); + + pList->erase( pShow ); + + mrModel.SetModified(); +} + +// XNameReplace +void SAL_CALL SdXCustomPresentationAccess::replaceByName( const OUString& aName, const uno::Any& aElement ) +{ + removeByName( aName ); + insertByName( aName, aElement ); +} + +// XNameAccess +uno::Any SAL_CALL SdXCustomPresentationAccess::getByName( const OUString& aName ) +{ + SolarMutexGuard aGuard; + + SdCustomShow* pShow = getSdCustomShow(aName); + if(!pShow) + { + throw container::NoSuchElementException(); + } + + uno::Reference< container::XIndexContainer > xRef( pShow->getUnoCustomShow(), uno::UNO_QUERY ); + return uno::Any(xRef); +} + +uno::Sequence< OUString > SAL_CALL SdXCustomPresentationAccess::getElementNames() +{ + SolarMutexGuard aGuard; + + SdCustomShowList* pList = GetCustomShowList(); + const sal_uInt32 nCount = pList ? pList->size() : 0; + + uno::Sequence< OUString > aSequence( nCount ); + OUString* pStringList = aSequence.getArray(); + + sal_uInt32 nIdx = 0; + while( nIdx < nCount ) + { + const SdCustomShow* pShow = (*pList)[nIdx].get(); + pStringList[nIdx] = pShow->GetName(); + nIdx++; + } + + return aSequence; +} + +sal_Bool SAL_CALL SdXCustomPresentationAccess::hasByName( const OUString& aName ) +{ + SolarMutexGuard aGuard; + return getSdCustomShow(aName) != nullptr; +} + +// XElementAccess +uno::Type SAL_CALL SdXCustomPresentationAccess::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdXCustomPresentationAccess::hasElements() +{ + SolarMutexGuard aGuard; + + SdCustomShowList* pList = GetCustomShowList(); + return pList && !pList->empty(); +} + +SdCustomShow * SdXCustomPresentationAccess::getSdCustomShow( std::u16string_view rName ) const noexcept +{ + sal_uInt32 nIdx = 0; + + SdCustomShowList* pList = GetCustomShowList(); + const sal_uInt32 nCount = pList ? pList->size() : 0; + + while( nIdx < nCount ) + { + SdCustomShow* pShow = (*pList)[nIdx].get(); + if( pShow->GetName() == rName ) + return pShow; + nIdx++; + } + return nullptr; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unocpres.hxx b/sd/source/ui/unoidl/unocpres.hxx new file mode 100644 index 0000000000..f1630d461b --- /dev/null +++ b/sd/source/ui/unoidl/unocpres.hxx @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + + +class SdCustomShow; + +class SdXCustomPresentation : public ::cppu::WeakImplHelper< css::container::XIndexContainer, + css::container::XNamed, + css::lang::XComponent, + css::lang::XServiceInfo > +{ +private: + SdCustomShow* mpSdCustomShow; + SdXImpressDocument* mpModel; + + // for xComponent + std::mutex aDisposeContainerMutex; + ::comphelper::OInterfaceContainerHelper4 aDisposeListeners; + bool bDisposing; + +public: + SdXCustomPresentation() noexcept; + explicit SdXCustomPresentation( SdCustomShow* mpSdCustomShow ) noexcept; + virtual ~SdXCustomPresentation() noexcept override; + + // internal + SdCustomShow* GetSdCustomShow() const noexcept { return mpSdCustomShow; } + void SetSdCustomShow( SdCustomShow* pShow ) noexcept { mpSdCustomShow = pShow; } + SdXImpressDocument* GetModel() const noexcept { return mpModel; } + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XIndexContainer + virtual void SAL_CALL insertByIndex( sal_Int32 Index, const css::uno::Any& Element ) override; + virtual void SAL_CALL removeByIndex( sal_Int32 Index ) override; + + // XIndexReplace + virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const css::uno::Any& Element ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XNamed + virtual OUString SAL_CALL getName( ) override; + virtual void SAL_CALL setName( const OUString& aName ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; +}; + +class SdXCustomPresentationAccess : public ::cppu::WeakImplHelper< css::container::XNameContainer, + css::lang::XSingleServiceFactory, + css::lang::XServiceInfo > +{ +private: + SdXImpressDocument& mrModel; + + // internal + inline SdCustomShowList* GetCustomShowList() const noexcept; + SdCustomShow * getSdCustomShow( std::u16string_view Name ) const noexcept; + +public: + explicit SdXCustomPresentationAccess(SdXImpressDocument& rMyModel) noexcept; + virtual ~SdXCustomPresentationAccess() noexcept override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XSingleServiceFactory + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const css::uno::Sequence< css::uno::Any >& aArguments ) override; + + // XNameContainer + virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override; + virtual void SAL_CALL removeByName( const OUString& Name ) override; + + // XNameReplace + virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; +}; + +inline SdCustomShowList* SdXCustomPresentationAccess::GetCustomShowList() const noexcept +{ + if(mrModel.GetDoc()) + return mrModel.GetDoc()->GetCustomShowList(); + else + return nullptr; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unodoc.cxx b/sd/source/ui/unoidl/unodoc.cxx new file mode 100644 index 0000000000..cfb97c186c --- /dev/null +++ b/sd/source/ui/unoidl/unodoc.cxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; + +// com.sun.star.comp.Draw.DrawingDocument + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +sd_DrawingDocument_get_implementation( + css::uno::XComponentContext* , css::uno::Sequence const& args) +{ + SolarMutexGuard aGuard; + + SdDLL::Init(); + + css::uno::Reference xInterface = sfx2::createSfxModelInstance(args, + [](SfxModelFlags _nCreationFlags) + { + SfxObjectShell* pShell = new ::sd::GraphicDocShell( _nCreationFlags ); + return uno::Reference< uno::XInterface >( pShell->GetModel() ); + }); + xInterface->acquire(); + return xInterface.get(); +} + + +// com.sun.star.comp.Draw.PresentationDocument + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +sd_PresentationDocument_get_implementation( + css::uno::XComponentContext* , css::uno::Sequence const& args) +{ + SolarMutexGuard aGuard; + + SdDLL::Init(); + + css::uno::Reference xInterface = sfx2::createSfxModelInstance(args, + [](SfxModelFlags _nCreationFlags) + { + SfxObjectShell* pShell = + new ::sd::DrawDocShell( + _nCreationFlags, false, DocumentType::Impress ); + return pShell->GetModel(); + }); + xInterface->acquire(); + return xInterface.get(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unolayer.cxx b/sd/source/ui/unoidl/unolayer.cxx new file mode 100644 index 0000000000..1f1880f815 --- /dev/null +++ b/sd/source/ui/unoidl/unolayer.cxx @@ -0,0 +1,702 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include "unolayer.hxx" + +#include +#include +#include +#include +#include +#include +#include + +// following ones for InsertSdPage() +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "unowcntr.hxx" +#include + +using namespace ::com::sun::star; + +// class SdLayer +#define WID_LAYER_LOCKED 1 +#define WID_LAYER_PRINTABLE 2 +#define WID_LAYER_VISIBLE 3 +#define WID_LAYER_NAME 4 +#define WID_LAYER_TITLE 5 +#define WID_LAYER_DESC 6 + +static const SvxItemPropertySet* ImplGetSdLayerPropertySet() +{ + static const SfxItemPropertyMapEntry aSdLayerPropertyMap_Impl[] = + { + { u"" UNO_NAME_LAYER_LOCKED ""_ustr, WID_LAYER_LOCKED, cppu::UnoType::get(), 0, 0 }, + { u"" UNO_NAME_LAYER_PRINTABLE ""_ustr, WID_LAYER_PRINTABLE,cppu::UnoType::get(), 0, 0 }, + { u"" UNO_NAME_LAYER_VISIBLE ""_ustr, WID_LAYER_VISIBLE, cppu::UnoType::get(), 0, 0 }, + { u"" UNO_NAME_LAYER_NAME ""_ustr, WID_LAYER_NAME, ::cppu::UnoType::get(), 0, 0 }, + { u"Title"_ustr, WID_LAYER_TITLE, ::cppu::UnoType::get(), 0, 0 }, + { u"Description"_ustr, WID_LAYER_DESC, ::cppu::UnoType::get(), 0, 0 }, + }; + static SvxItemPropertySet aSDLayerPropertySet_Impl( aSdLayerPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + return &aSDLayerPropertySet_Impl; +} + +SdLayer::SdLayer(SdLayerManager* pLayerManager_, SdrLayer* pSdrLayer_) +: mxLayerManager(pLayerManager_) +, pLayer(pSdrLayer_) +, pPropSet(ImplGetSdLayerPropertySet()) +{ + // no defaults possible yet, a "set" would overwrite existing information + // in view, which is currently needed for saving, because pLayer is not updated + // from view. +} + +SdLayer::~SdLayer() noexcept +{ +} + +// XServiceInfo +OUString SAL_CALL SdLayer::getImplementationName() +{ + return "SdUnoLayer"; +} + +sal_Bool SAL_CALL SdLayer::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdLayer::getSupportedServiceNames() +{ + return { "com.sun.star.drawing.Layer" }; +} + +// beans::XPropertySet +uno::Reference< beans::XPropertySetInfo > SAL_CALL SdLayer::getPropertySetInfo( ) +{ + SolarMutexGuard aGuard; + return pPropSet->getPropertySetInfo(); +} + +void SAL_CALL SdLayer::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue ) +{ + SolarMutexGuard aGuard; + + if(pLayer == nullptr || mxLayerManager == nullptr) + throw lang::DisposedException(); + + const SfxItemPropertyMapEntry* pEntry = pPropSet->getPropertyMapEntry(aPropertyName); + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_LAYER_LOCKED: + { + pLayer->SetLockedODF( cppu::any2bool(aValue) ); + set(LOCKED, cppu::any2bool(aValue)); // changes the View, if any exists + break; + } + case WID_LAYER_PRINTABLE: + { + pLayer->SetPrintableODF( cppu::any2bool(aValue) ); + set(PRINTABLE, cppu::any2bool(aValue)); // changes the View, if any exists + break; + } + case WID_LAYER_VISIBLE: + { + pLayer->SetVisibleODF( cppu::any2bool(aValue) ); + set(VISIBLE, cppu::any2bool(aValue)); // changes the View, if any exists + break; + } + case WID_LAYER_NAME: + { + OUString aName; + if(!(aValue >>= aName)) + throw lang::IllegalArgumentException(); + + pLayer->SetName(aName); + mxLayerManager->UpdateLayerView(); + break; + } + + case WID_LAYER_TITLE: + { + OUString sTitle; + if(!(aValue >>= sTitle)) + throw lang::IllegalArgumentException(); + + pLayer->SetTitle(sTitle); + break; + } + + case WID_LAYER_DESC: + { + OUString sDescription; + if(!(aValue >>= sDescription)) + throw lang::IllegalArgumentException(); + + pLayer->SetDescription(sDescription); + break; + } + + default: + throw beans::UnknownPropertyException( aPropertyName, static_cast(this)); + } + + if( mxLayerManager->GetDocShell() ) + mxLayerManager->GetDocShell()->SetModified(); +} + +uno::Any SAL_CALL SdLayer::getPropertyValue( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + if(pLayer == nullptr || mxLayerManager == nullptr) + throw lang::DisposedException(); + + const SfxItemPropertyMapEntry* pEntry = pPropSet->getPropertyMapEntry(PropertyName); + + uno::Any aValue; + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_LAYER_LOCKED: + aValue <<= get( LOCKED ); + break; + case WID_LAYER_PRINTABLE: + aValue <<= get( PRINTABLE ); + break; + case WID_LAYER_VISIBLE: + aValue <<= get( VISIBLE ); + break; + case WID_LAYER_NAME: + { + OUString aRet(pLayer->GetName()); + aValue <<= aRet; + break; + } + case WID_LAYER_TITLE: + aValue <<= pLayer->GetTitle(); + break; + case WID_LAYER_DESC: + aValue <<= pLayer->GetDescription(); + break; + default: + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + } + + return aValue; +} + +void SAL_CALL SdLayer::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdLayer::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdLayer::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {} +void SAL_CALL SdLayer::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {} + +bool SdLayer::get( LayerAttribute what ) noexcept +{ + if(pLayer && mxLayerManager.is()) + { + // Try 1. is an arbitrary page open? + ::sd::View *pView = mxLayerManager->GetView(); + SdrPageView* pSdrPageView = nullptr; + if(pView) + pSdrPageView = pView->GetSdrPageView(); + + if(pSdrPageView) + { + OUString aLayerName = pLayer->GetName(); + switch(what) + { + case VISIBLE: return pSdrPageView->IsLayerVisible(aLayerName); + case PRINTABLE: return pSdrPageView->IsLayerPrintable(aLayerName); + case LOCKED: return pSdrPageView->IsLayerLocked(aLayerName); + } + } + + // Try 2. get info from FrameView + if(mxLayerManager->GetDocShell()) + { + ::sd::FrameView *pFrameView = mxLayerManager->GetDocShell()->GetFrameView(); + if(pFrameView) + switch(what) + { + case VISIBLE: return pFrameView->GetVisibleLayers().IsSet(pLayer->GetID()); + case PRINTABLE: return pFrameView->GetPrintableLayers().IsSet(pLayer->GetID()); + case LOCKED: return pFrameView->GetLockedLayers().IsSet(pLayer->GetID()); + } + } + + // no view at all, e.g. Draw embedded as OLE in text document, ODF default values + switch(what) + { + case VISIBLE: return true; + case PRINTABLE: return true; + case LOCKED: return false; + } + + } + return false; //TODO: uno::Exception? +} + +void SdLayer::set( LayerAttribute what, bool flag ) noexcept +{ + if(!(pLayer && mxLayerManager.is())) + return; + + // Try 1. is an arbitrary page open? + ::sd::View *pView = mxLayerManager->GetView(); + SdrPageView* pSdrPageView = nullptr; + if(pView) + pSdrPageView = pView->GetSdrPageView(); + + if(pSdrPageView) + { + OUString aLayerName(pLayer->GetName()); + switch(what) + { + case VISIBLE: pSdrPageView->SetLayerVisible(aLayerName,flag); + break; + case PRINTABLE: pSdrPageView->SetLayerPrintable(aLayerName,flag); + break; + case LOCKED: pSdrPageView->SetLayerLocked(aLayerName,flag); + break; + } + } + + // Try 2. get info from FrameView + if(!mxLayerManager->GetDocShell()) + return; + + ::sd::FrameView *pFrameView = mxLayerManager->GetDocShell()->GetFrameView(); + + if(!pFrameView) + return; + + SdrLayerIDSet aNewLayers; + switch(what) + { + case VISIBLE: aNewLayers = pFrameView->GetVisibleLayers(); + break; + case PRINTABLE: aNewLayers = pFrameView->GetPrintableLayers(); + break; + case LOCKED: aNewLayers = pFrameView->GetLockedLayers(); + break; + } + + aNewLayers.Set(pLayer->GetID(),flag); + + switch(what) + { + case VISIBLE: pFrameView->SetVisibleLayers(aNewLayers); + break; + case PRINTABLE: pFrameView->SetPrintableLayers(aNewLayers); + break; + case LOCKED: pFrameView->SetLockedLayers(aNewLayers); + break; + } + return; + //TODO: uno::Exception? +} + +// css::container::XChild +uno::Reference SAL_CALL SdLayer::getParent() +{ + SolarMutexGuard aGuard; + + if( !mxLayerManager.is() ) + throw lang::DisposedException(); + + return uno::Reference (static_cast(mxLayerManager.get()), uno::UNO_QUERY); +} + +void SAL_CALL SdLayer::setParent (const uno::Reference& ) +{ + throw lang::NoSupportException (); +} + +// XComponent +void SAL_CALL SdLayer::dispose( ) +{ + mxLayerManager.clear(); + pLayer = nullptr; +} + +void SAL_CALL SdLayer::addEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL("not implemented!"); +} + +void SAL_CALL SdLayer::removeEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL("not implemented!"); +} + +// class SdLayerManager +SdLayerManager::SdLayerManager( SdXImpressDocument& rMyModel ) noexcept +:mpModel( &rMyModel) +{ + mpLayers.reset(new SvUnoWeakContainer); +} + +SdLayerManager::~SdLayerManager() noexcept +{ + dispose(); +} + +// XComponent +void SAL_CALL SdLayerManager::dispose( ) +{ + mpModel = nullptr; + if( mpLayers ) + { + mpLayers->dispose(); + mpLayers.reset(); + } +} + +void SAL_CALL SdLayerManager::addEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL("not implemented!"); +} + +void SAL_CALL SdLayerManager::removeEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL("not implemented!"); +} + +// XServiceInfo +OUString SAL_CALL SdLayerManager::getImplementationName() +{ + return "SdUnoLayerManager"; +} + +sal_Bool SAL_CALL SdLayerManager::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdLayerManager::getSupportedServiceNames() +{ + return {"com.sun.star.drawing.LayerManager"}; +} + +// XLayerManager +uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::insertNewByIndex( sal_Int32 nIndex ) +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + uno::Reference< drawing::XLayer > xLayer; + + if( mpModel->mpDoc ) + { + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount(); + sal_Int32 nLayer = nLayerCnt - 2 + 1; + OUString aLayerName; + + // Test for existing names + while( aLayerName.isEmpty() || rLayerAdmin.GetLayer( aLayerName ) ) + { + aLayerName = SdResId(STR_LAYER) + OUString::number(nLayer); + ++nLayer; + } + + SdrLayerAdmin& rLA=mpModel->mpDoc->GetLayerAdmin(); + const sal_Int32 nMax=rLA.GetLayerCount(); + if (nIndex>nMax) nIndex=nMax; + xLayer = GetLayer (rLA.NewLayer(aLayerName,static_cast(nIndex))); + mpModel->SetModified(); + } + return xLayer; +} + +void SAL_CALL SdLayerManager::remove( const uno::Reference< drawing::XLayer >& xLayer ) +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + SdLayer* pSdLayer = dynamic_cast(xLayer.get()); + + if(pSdLayer && GetView()) + { + const SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer(); + GetView()->DeleteLayer( pSdrLayer->GetName() ); + + UpdateLayerView(); + } + + mpModel->SetModified(); +} + +void SAL_CALL SdLayerManager::attachShapeToLayer( const uno::Reference< drawing::XShape >& xShape, const uno::Reference< drawing::XLayer >& xLayer ) +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + SdLayer* pSdLayer = dynamic_cast(xLayer.get()); + if(pSdLayer==nullptr) + return; + SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer(); + if(pSdrLayer==nullptr) + return; + + SdrObject* pSdrObject = SdrObject::getSdrObjectFromXShape( xShape ); + + if(pSdrObject) + pSdrObject->SetLayer(pSdrLayer->GetID()); + + mpModel->SetModified(); +} + +uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::getLayerForShape( const uno::Reference< drawing::XShape >& xShape ) +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + uno::Reference< drawing::XLayer > xLayer; + + if(mpModel->mpDoc) + { + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape ); + if(pObj) + { + SdrLayerID aId = pObj->GetLayer(); + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + xLayer = GetLayer (rLayerAdmin.GetLayerPerID(aId)); + } + } + return xLayer; +} + +// XIndexAccess +sal_Int32 SAL_CALL SdLayerManager::getCount() +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + if( mpModel->mpDoc ) + { + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + return rLayerAdmin.GetLayerCount(); + } + + return 0; +} + +uno::Any SAL_CALL SdLayerManager::getByIndex( sal_Int32 nLayer ) +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + if( nLayer >= getCount() || nLayer < 0 ) + throw lang::IndexOutOfBoundsException(); + + uno::Any aAny; + + if( mpModel->mpDoc ) + { + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + uno::Reference xLayer (GetLayer (rLayerAdmin.GetLayer(static_cast(nLayer)))); + aAny <<= xLayer; + } + return aAny; +} + +// XNameAccess +uno::Any SAL_CALL SdLayerManager::getByName( const OUString& aName ) +{ + SolarMutexGuard aGuard; + + if( (mpModel == nullptr) || (mpModel->mpDoc == nullptr ) ) + throw lang::DisposedException(); + + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + SdrLayer* pLayer = rLayerAdmin.GetLayer(aName); + if( pLayer == nullptr ) + throw container::NoSuchElementException(); + + return uno::Any( GetLayer (pLayer) ); +} + +uno::Sequence< OUString > SAL_CALL SdLayerManager::getElementNames() +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + const sal_uInt16 nLayerCount = rLayerAdmin.GetLayerCount(); + + uno::Sequence< OUString > aSeq( nLayerCount ); + + OUString* pStrings = aSeq.getArray(); + + for( sal_uInt16 nLayer = 0; nLayer < nLayerCount; nLayer++ ) + { + SdrLayer* pLayer = rLayerAdmin.GetLayer( nLayer ); + if( pLayer ) + *pStrings++ = pLayer->GetName(); + } + + return aSeq; +} + +sal_Bool SAL_CALL SdLayerManager::hasByName( const OUString& aName ) +{ + SolarMutexGuard aGuard; + + if( mpModel == nullptr ) + throw lang::DisposedException(); + + SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); + + return nullptr != rLayerAdmin.GetLayer(aName); +} + +// XElementAccess +uno::Type SAL_CALL SdLayerManager::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdLayerManager::hasElements() +{ + return getCount() > 0; +} + +/** + * If something was changed at the layers, this methods takes care that the + * changes are made visible in sdbcx::View. + */ +void SdLayerManager::UpdateLayerView() const noexcept +{ + if(!mpModel->mpDocShell) + return; + + ::sd::DrawViewShell* pDrViewSh = dynamic_cast< ::sd::DrawViewShell* >( mpModel->mpDocShell->GetViewShell()); + + if(pDrViewSh) + { + bool bLayerMode = pDrViewSh->IsLayerModeActive(); + pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), !bLayerMode); + pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), bLayerMode); + } + + mpModel->mpDoc->SetChanged(); +} + +/** */ +::sd::View* SdLayerManager::GetView() const noexcept +{ + if( mpModel->mpDocShell ) + { + ::sd::ViewShell* pViewSh = mpModel->mpDocShell->GetViewShell(); + if(pViewSh) + return pViewSh->GetView(); + } + return nullptr; +} + +namespace +{ +/** Compare two pointers to SdrLayer objects. + @param xRef + The implementing SdLayer class provides the first pointer by the + SdLayer::GetSdrLayer method. + @param pSearchData + This void pointer is the second pointer to an SdrLayer + object. + @return + Return if both pointers point to the same object. +*/ +bool compare_layers (const uno::WeakReference& xRef, void const * pSearchData) +{ + uno::Reference xLayer (xRef); + if (xLayer.is()) + { + SdLayer* pSdLayer = dynamic_cast (xLayer.get()); + if (pSdLayer != nullptr) + { + SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer (); + if (pSdrLayer == static_cast(pSearchData)) + return true; + } + } + return false; +} +} + +/** Use the mpLayers container of weak references to either + retrieve and return a previously created XLayer object for + the given SdrLayer object or create and remember a new one. +*/ +uno::Reference SdLayerManager::GetLayer (SdrLayer* pLayer) +{ + uno::WeakReference xRef; + uno::Reference xLayer; + + // Search existing xLayer for the given pLayer. + if (mpLayers->findRef (xRef, static_cast(pLayer), compare_layers)) + xLayer.set(xRef, uno::UNO_QUERY); + + // Create the xLayer if necessary. + if ( ! xLayer.is()) + { + xLayer = new SdLayer (this, pLayer); + + // Remember the new xLayer for future calls. + uno::WeakReference wRef(xLayer); + mpLayers->insert(wRef); + } + + return xLayer; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unolayer.hxx b/sd/source/ui/unoidl/unolayer.hxx new file mode 100644 index 0000000000..42f9b86834 --- /dev/null +++ b/sd/source/ui/unoidl/unolayer.hxx @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include + +#include +#include +#include + +#include + +class SdrLayer; +class SdLayerManager; +class SvUnoWeakContainer; + +namespace sd { +class View; +} +enum LayerAttribute { VISIBLE, PRINTABLE, LOCKED }; + +/*********************************************************************** +* * +***********************************************************************/ +class SdLayer : public ::cppu::WeakImplHelper< css::drawing::XLayer, + css::lang::XServiceInfo, + css::container::XChild, + css::lang::XComponent > +{ +public: + SdLayer(SdLayerManager* pLayerManager_, SdrLayer* pSdrLayer_); + virtual ~SdLayer() noexcept override; + + // internal + SdrLayer* GetSdrLayer() const noexcept { return pLayer; } + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // css::beans::XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // css::container::XChild + + /** Returns the layer manager that manages this layer. + */ + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getParent( ) override; + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; + + /** Not implemented. Always throws an exception. + @throws NoSupportException. + */ + virtual void SAL_CALL setParent( const css::uno::Reference< css::uno::XInterface >& Parent ) override; + +private: + rtl::Reference mxLayerManager; + SdrLayer* pLayer; + const SvxItemPropertySet* pPropSet; + + bool get( LayerAttribute what ) noexcept; + void set( LayerAttribute what, bool flag ) noexcept; + +}; + +/*********************************************************************** +* * +***********************************************************************/ + +class SdLayerManager : public ::cppu::WeakImplHelper< css::drawing::XLayerManager, + css::container::XNameAccess, + css::lang::XServiceInfo, + css::lang::XComponent > +{ + friend class SdLayer; + +public: + explicit SdLayerManager( SdXImpressDocument& rMyModel ) noexcept; + virtual ~SdLayerManager() noexcept override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XLayerManager + virtual css::uno::Reference< css::drawing::XLayer > SAL_CALL insertNewByIndex( sal_Int32 nIndex ) override; + virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XLayer >& xLayer ) override; + virtual void SAL_CALL attachShapeToLayer( const css::uno::Reference< css::drawing::XShape >& xShape, const css::uno::Reference< css::drawing::XLayer >& xLayer ) override; + virtual css::uno::Reference< css::drawing::XLayer > SAL_CALL getLayerForShape( const css::uno::Reference< css::drawing::XShape >& xShape ) override; + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() override ; + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() override; + virtual sal_Bool SAL_CALL hasElements() override; + + /** Return the XLayer object that is associated with the + given SdrLayer object. If the requested object does + not yet exist it is created. All calls with the same argument + return the same object. + @param pLayer + The SdrLayer object for which to return the + associated XLayer object. + @return + The returned value is the unique XLayer object + associated with the specified argument. If no layer can be + created for the argument than an empty reference is returned. + */ + css::uno::Reference< css::drawing::XLayer> GetLayer (SdrLayer* pLayer); + + // XComponent + virtual void SAL_CALL dispose( ) override; + virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override; + virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override; + +private: + SdXImpressDocument* mpModel; + std::unique_ptr mpLayers; + + ::sd::View* GetView() const noexcept; + ::sd::DrawDocShell* GetDocShell() const noexcept { return mpModel->mpDocShell; } + void UpdateLayerView() const noexcept; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx new file mode 100644 index 0000000000..dd9d573955 --- /dev/null +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -0,0 +1,3786 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "unopool.hxx" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Support creation of GraphicStorageHandler and EmbeddedObjectResolver +#include +#include +#include +#include +#include "UnoDocumentSettings.hxx" + +#include +#include +#include +#include +#include + +#include +#include +#include "unolayer.hxx" +#include +#include "unocpres.hxx" +#include "unoobj.hxx" +#include +#include "unopback.hxx" +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::sd; + +const TranslateId aTypeResIds[SdLinkTargetType::Count] = +{ + STR_SD_PAGE, // SdLinkTargetType::Page + STR_NOTES_MODE, // SdLinkTargetType::Notes + STR_HANDOUT, // SdLinkTargetType::Handout + STR_MASTERPAGE_NAME, // SdLinkTargetType::MasterPage +}; + +TranslateId SdTPAction::GetClickActionSdResId( presentation::ClickAction eCA ) +{ + switch( eCA ) + { + case presentation::ClickAction_NONE: return STR_CLICK_ACTION_NONE; + case presentation::ClickAction_PREVPAGE: return STR_CLICK_ACTION_PREVPAGE; + case presentation::ClickAction_NEXTPAGE: return STR_CLICK_ACTION_NEXTPAGE; + case presentation::ClickAction_FIRSTPAGE: return STR_CLICK_ACTION_FIRSTPAGE; + case presentation::ClickAction_LASTPAGE: return STR_CLICK_ACTION_LASTPAGE; + case presentation::ClickAction_BOOKMARK: return STR_CLICK_ACTION_BOOKMARK; + case presentation::ClickAction_DOCUMENT: return STR_CLICK_ACTION_DOCUMENT; + case presentation::ClickAction_PROGRAM: return STR_CLICK_ACTION_PROGRAM; + case presentation::ClickAction_MACRO: return STR_CLICK_ACTION_MACRO; + case presentation::ClickAction_SOUND: return STR_CLICK_ACTION_SOUND; + case presentation::ClickAction_VERB: return STR_CLICK_ACTION_VERB; + case presentation::ClickAction_STOPPRESENTATION: return STR_CLICK_ACTION_STOPPRESENTATION; + default: OSL_FAIL( "No StringResource for ClickAction available!" ); + } + return {}; +} + +namespace { + +class SdUnoForbiddenCharsTable : public SvxUnoForbiddenCharsTable, + public SfxListener +{ +public: + explicit SdUnoForbiddenCharsTable(SdrModel* pModel); + virtual ~SdUnoForbiddenCharsTable() override; + + // SfxListener + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) noexcept override; +protected: + virtual void onChange() override; + +private: + SdrModel* mpModel; +}; + +} + +SdUnoForbiddenCharsTable::SdUnoForbiddenCharsTable( SdrModel* pModel ) +: SvxUnoForbiddenCharsTable( pModel->GetForbiddenCharsTable() ), mpModel( pModel ) +{ + StartListening( *pModel ); +} + +void SdUnoForbiddenCharsTable::onChange() +{ + if( mpModel ) + { + mpModel->ReformatAllTextObjects(); + } +} + +SdUnoForbiddenCharsTable::~SdUnoForbiddenCharsTable() +{ + SolarMutexGuard g; + + if( mpModel ) + EndListening( *mpModel ); +} + +void SdUnoForbiddenCharsTable::Notify( SfxBroadcaster&, const SfxHint& rHint ) noexcept +{ + if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint) + return; + const SdrHint* pSdrHint = static_cast( &rHint ); + if( SdrHintKind::ModelCleared == pSdrHint->GetKind() ) + { + mpModel = nullptr; + } +} + +const sal_uInt16 WID_MODEL_LANGUAGE = 1; +const sal_uInt16 WID_MODEL_TABSTOP = 2; +const sal_uInt16 WID_MODEL_VISAREA = 3; +const sal_uInt16 WID_MODEL_MAPUNIT = 4; +const sal_uInt16 WID_MODEL_FORBCHARS = 5; +const sal_uInt16 WID_MODEL_CONTFOCUS = 6; +const sal_uInt16 WID_MODEL_DSGNMODE = 7; +const sal_uInt16 WID_MODEL_BASICLIBS = 8; +const sal_uInt16 WID_MODEL_RUNTIMEUID = 9; +const sal_uInt16 WID_MODEL_BUILDID = 10; +const sal_uInt16 WID_MODEL_HASVALIDSIGNATURES = 11; +const sal_uInt16 WID_MODEL_DIALOGLIBS = 12; +const sal_uInt16 WID_MODEL_FONTS = 13; +const sal_uInt16 WID_MODEL_INTEROPGRABBAG = 14; +const sal_uInt16 WID_MODEL_THEME = 15; + +static const SvxItemPropertySet* ImplGetDrawModelPropertySet() +{ + // Attention: the first parameter HAS TO BE sorted!!! + const static SfxItemPropertyMapEntry aDrawModelPropertyMap_Impl[] = + { + { u"BuildId"_ustr, WID_MODEL_BUILDID, ::cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_CharLocale, WID_MODEL_LANGUAGE, ::cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_TabStop, WID_MODEL_TABSTOP, ::cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_VisibleArea, WID_MODEL_VISAREA, ::cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_MapUnit, WID_MODEL_MAPUNIT, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { sUNO_Prop_ForbiddenCharacters, WID_MODEL_FORBCHARS, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { sUNO_Prop_AutomContFocus, WID_MODEL_CONTFOCUS, cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_ApplyFrmDsgnMode, WID_MODEL_DSGNMODE, cppu::UnoType::get(), 0, 0}, + { u"BasicLibraries"_ustr, WID_MODEL_BASICLIBS, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"DialogLibraries"_ustr, WID_MODEL_DIALOGLIBS, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { sUNO_Prop_RuntimeUID, WID_MODEL_RUNTIMEUID, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { sUNO_Prop_HasValidSignatures, WID_MODEL_HASVALIDSIGNATURES, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"Fonts"_ustr, WID_MODEL_FONTS, cppu::UnoType>::get(), beans::PropertyAttribute::READONLY, 0}, + { sUNO_Prop_InteropGrabBag, WID_MODEL_INTEROPGRABBAG, cppu::UnoType>::get(), 0, 0}, + { sUNO_Prop_Theme, WID_MODEL_THEME, cppu::UnoType::get(), 0, 0}, + }; + static SvxItemPropertySet aDrawModelPropertySet_Impl( aDrawModelPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + return &aDrawModelPropertySet_Impl; +} + +// this ctor is used from the DocShell +SdXImpressDocument::SdXImpressDocument(::sd::DrawDocShell* pShell, bool bClipBoard) +: SfxBaseModel( pShell ), + mpDocShell( pShell ), + mpDoc( pShell ? pShell->GetDoc() : nullptr ), + mbDisposed(false), + mbImpressDoc( pShell && pShell->GetDoc() && pShell->GetDoc()->GetDocumentType() == DocumentType::Impress ), + mbClipBoard( bClipBoard ), + mpPropSet( ImplGetDrawModelPropertySet() ), + mbPaintTextEdit( true ) +{ + if( mpDoc ) + { + StartListening( *mpDoc ); + } + else + { + OSL_FAIL("DocShell is invalid"); + } +} + +SdXImpressDocument::SdXImpressDocument(SdDrawDocument* pDoc, bool bClipBoard) +: SfxBaseModel( nullptr ), + mpDocShell( nullptr ), + mpDoc( pDoc ), + mbDisposed(false), + mbImpressDoc( pDoc && pDoc->GetDocumentType() == DocumentType::Impress ), + mbClipBoard( bClipBoard ), + mpPropSet( ImplGetDrawModelPropertySet() ), + mbPaintTextEdit( true ) +{ + if( mpDoc ) + { + StartListening( *mpDoc ); + } + else + { + OSL_FAIL("SdDrawDocument is invalid"); + } +} + +/*********************************************************************** +* * +***********************************************************************/ +SdXImpressDocument::~SdXImpressDocument() noexcept +{ +} + +// XInterface +uno::Any SAL_CALL SdXImpressDocument::queryInterface( const uno::Type & rType ) +{ + uno::Any aAny; + + if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (rType == cppu::UnoType::get()) + aAny <<= uno::Reference(this); + else if (mbImpressDoc && rType == cppu::UnoType::get()) + aAny <<= uno::Reference< presentation::XPresentationSupplier >(this); + else if (mbImpressDoc && rType == cppu::UnoType::get()) + aAny <<= uno::Reference< presentation::XCustomPresentationSupplier >(this); + else + return SfxBaseModel::queryInterface(rType); + + return aAny; +} + +void SAL_CALL SdXImpressDocument::acquire() noexcept +{ + SfxBaseModel::acquire(); +} + +void SAL_CALL SdXImpressDocument::release() noexcept +{ + if (osl_atomic_decrement( &m_refCount ) != 0) + return; + + // restore reference count: + osl_atomic_increment( &m_refCount ); + if(!mbDisposed) + { + try + { + dispose(); + } + catch (const uno::RuntimeException&) + { + // don't break throw () + TOOLS_WARN_EXCEPTION( "sd", "" ); + } + } + SfxBaseModel::release(); +} + +// XUnoTunnel +const css::uno::Sequence< sal_Int8 > & SdXImpressDocument::getUnoTunnelId() noexcept +{ + static const comphelper::UnoIdInit theSdXImpressDocumentUnoTunnelId; + return theSdXImpressDocumentUnoTunnelId.getSeq(); +} + +sal_Int64 SAL_CALL SdXImpressDocument::getSomething( const css::uno::Sequence< sal_Int8 >& rIdentifier ) +{ + if (comphelper::isUnoTunnelId(rIdentifier)) + return comphelper::getSomething_cast(mpDoc); + + return comphelper::getSomethingImpl(rIdentifier, this, + comphelper::FallbackToGetSomethingOf{}); +} + +// XTypeProvider +uno::Sequence< uno::Type > SAL_CALL SdXImpressDocument::getTypes( ) +{ + ::SolarMutexGuard aGuard; + + if( !maTypeSequence.hasElements() ) + { + uno::Sequence< uno::Type > aTypes( SfxBaseModel::getTypes() ); + aTypes = comphelper::concatSequences(aTypes, + uno::Sequence { + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get() }); + if( mbImpressDoc ) + { + aTypes = comphelper::concatSequences(aTypes, + uno::Sequence { + cppu::UnoType::get(), + cppu::UnoType::get(), + cppu::UnoType::get() }); + } + maTypeSequence = aTypes; + } + + return maTypeSequence; +} + +uno::Sequence< sal_Int8 > SAL_CALL SdXImpressDocument::getImplementationId( ) +{ + return css::uno::Sequence(); +} + +/*********************************************************************** +* * +***********************************************************************/ +void SdXImpressDocument::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) +{ + if( mpDoc ) + { + if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint) + { + const SdrHint* pSdrHint = static_cast( &rHint ); + if( hasEventListeners() ) + { + document::EventObject aEvent; + if( SvxUnoDrawMSFactory::createEvent( mpDoc, pSdrHint, aEvent ) ) + notifyEvent( aEvent ); + } + + if( pSdrHint->GetKind() == SdrHintKind::ModelCleared ) + { + if( mpDoc ) + EndListening( *mpDoc ); + mpDoc = nullptr; + mpDocShell = nullptr; + } + } + else + { + // did our SdDrawDocument just died? + if(rHint.GetId() == SfxHintId::Dying) + { + // yes, so we ask for a new one + if( mpDocShell ) + { + SdDrawDocument *pNewDoc = mpDocShell->GetDoc(); + + // is there a new one? + if( pNewDoc != mpDoc ) + { + mpDoc = pNewDoc; + if(mpDoc) + StartListening( *mpDoc ); + } + } + } + } + } + SfxBaseModel::Notify( rBC, rHint ); +} + +/****************************************************************************** +* * +******************************************************************************/ +SdPage* SdXImpressDocument::InsertSdPage( sal_uInt16 nPage, bool bDuplicate ) +{ + sal_uInt16 nPageCount = mpDoc->GetSdPageCount( PageKind::Standard ); + SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin(); + SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + + rtl::Reference pStandardPage; + + if( 0 == nPageCount ) + { + // this is only used for clipboard where we only have one page + pStandardPage = mpDoc->AllocSdPage(false); + + Size aDefSize(21000, 29700); // A4 portrait orientation + pStandardPage->SetSize( aDefSize ); + mpDoc->InsertPage(pStandardPage.get(), 0); + } + else + { + // here we determine the page after which we should insert + SdPage* pPreviousStandardPage = mpDoc->GetSdPage( std::min( static_cast(nPageCount - 1), nPage ), PageKind::Standard ); + SdrLayerIDSet aVisibleLayers = pPreviousStandardPage->TRG_GetMasterPageVisibleLayers(); + bool bIsPageBack = aVisibleLayers.IsSet( aBckgrnd ); + bool bIsPageObj = aVisibleLayers.IsSet( aBckgrndObj ); + + // AutoLayouts must be ready + mpDoc->StopWorkStartupDelay(); + + /* First we create a standard page and then a notes page. It is + guaranteed, that after a standard page the corresponding notes page + follows. */ + + sal_uInt16 nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2; + SdPage* pPreviousNotesPage = static_cast( mpDoc->GetPage( nStandardPageNum - 1 ) ); + sal_uInt16 nNotesPageNum = nStandardPageNum + 1; + + /************************************************************** + * standard page + **************************************************************/ + if( bDuplicate ) + pStandardPage = static_cast( pPreviousStandardPage->CloneSdrPage(*mpDoc).get() ); + else + pStandardPage = mpDoc->AllocSdPage(false); + + pStandardPage->SetSize( pPreviousStandardPage->GetSize() ); + pStandardPage->SetBorder( pPreviousStandardPage->GetLeftBorder(), + pPreviousStandardPage->GetUpperBorder(), + pPreviousStandardPage->GetRightBorder(), + pPreviousStandardPage->GetLowerBorder() ); + pStandardPage->SetOrientation( pPreviousStandardPage->GetOrientation() ); + pStandardPage->SetName(OUString()); + + // insert page after current page + mpDoc->InsertPage(pStandardPage.get(), nStandardPageNum); + + if( !bDuplicate ) + { + // use MasterPage of the current page + pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage()); + pStandardPage->SetLayoutName( pPreviousStandardPage->GetLayoutName() ); + pStandardPage->SetAutoLayout(AUTOLAYOUT_NONE, true ); + } + + aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + aVisibleLayers.Set(aBckgrnd, bIsPageBack); + aVisibleLayers.Set(aBckgrndObj, bIsPageObj); + pStandardPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + + /************************************************************** + * notes page + **************************************************************/ + rtl::Reference pNotesPage; + + if( bDuplicate ) + pNotesPage = static_cast( pPreviousNotesPage->CloneSdrPage(*mpDoc).get() ); + else + pNotesPage = mpDoc->AllocSdPage(false); + + pNotesPage->SetSize( pPreviousNotesPage->GetSize() ); + pNotesPage->SetBorder( pPreviousNotesPage->GetLeftBorder(), + pPreviousNotesPage->GetUpperBorder(), + pPreviousNotesPage->GetRightBorder(), + pPreviousNotesPage->GetLowerBorder() ); + pNotesPage->SetOrientation( pPreviousNotesPage->GetOrientation() ); + pNotesPage->SetName(OUString()); + pNotesPage->SetPageKind(PageKind::Notes); + + // insert page after current page + mpDoc->InsertPage(pNotesPage.get(), nNotesPageNum); + + if( !bDuplicate ) + { + // use MasterPage of the current page + pNotesPage->TRG_SetMasterPage(pPreviousNotesPage->TRG_GetMasterPage()); + pNotesPage->SetLayoutName( pPreviousNotesPage->GetLayoutName() ); + pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, true ); + } + } + + SetModified(); + + return pStandardPage.get(); +} + +void SdXImpressDocument::SetModified() noexcept +{ + if( mpDoc ) + mpDoc->SetChanged(); +} + +// XModel +void SAL_CALL SdXImpressDocument::lockControllers( ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + mpDoc->setLock(true); +} + +void SAL_CALL SdXImpressDocument::unlockControllers( ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + if( mpDoc->isLocked() ) + { + mpDoc->setLock(false); + } +} + +sal_Bool SAL_CALL SdXImpressDocument::hasControllersLocked( ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + return mpDoc->isLocked(); +} + +uno::Reference < container::XIndexAccess > SAL_CALL SdXImpressDocument::getViewData() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference < container::XIndexAccess > xRet( SfxBaseModel::getViewData() ); + + if( !xRet.is() ) + { + const std::vector> &rList = mpDoc->GetFrameViewList(); + + if( !rList.empty() ) + { + xRet = new comphelper::IndexedPropertyValuesContainer(); + + uno::Reference < container::XIndexContainer > xCont( xRet, uno::UNO_QUERY ); + DBG_ASSERT( xCont.is(), "SdXImpressDocument::getViewData() failed for OLE object" ); + if( xCont.is() ) + { + for( sal_uInt32 i = 0, n = rList.size(); i < n; i++ ) + { + ::sd::FrameView* pFrameView = rList[ i ].get(); + + uno::Sequence< beans::PropertyValue > aSeq; + pFrameView->WriteUserDataSequence( aSeq ); + xCont->insertByIndex( i, uno::Any( aSeq ) ); + } + } + } + } + + return xRet; +} + +void SAL_CALL SdXImpressDocument::setViewData( const uno::Reference < container::XIndexAccess >& xData ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + SfxBaseModel::setViewData( xData ); + if( !(mpDocShell && (mpDocShell->GetCreateMode() == SfxObjectCreateMode::EMBEDDED) && xData.is()) ) + return; + + const sal_Int32 nCount = xData->getCount(); + + std::vector> &rViews = mpDoc->GetFrameViewList(); + + rViews.clear(); + + uno::Sequence< beans::PropertyValue > aSeq; + for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) + { + if( xData->getByIndex( nIndex ) >>= aSeq ) + { + std::unique_ptr<::sd::FrameView> pFrameView(new ::sd::FrameView( mpDoc )); + pFrameView->ReadUserDataSequence( aSeq ); + rViews.push_back( std::move(pFrameView) ); + } + } +} + +// XDrawPageDuplicator +uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::duplicate( const uno::Reference< drawing::XDrawPage >& xPage ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + // get pPage from xPage and determine the Id (nPos ) afterwards + SvxDrawPage* pSvxPage = comphelper::getFromUnoTunnel( xPage ); + if( pSvxPage ) + { + SdPage* pPage = static_cast( pSvxPage->GetSdrPage() ); + sal_uInt16 nPos = pPage->GetPageNum(); + nPos = ( nPos - 1 ) / 2; + pPage = InsertSdPage( nPos, true ); + if( pPage ) + { + uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY ); + return xDrawPage; + } + } + + uno::Reference< drawing::XDrawPage > xDrawPage; + return xDrawPage; +} + +// XDrawPagesSupplier +uno::Reference< drawing::XDrawPages > SAL_CALL SdXImpressDocument::getDrawPages() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< drawing::XDrawPages > xDrawPages( mxDrawPagesAccess ); + + if( !xDrawPages.is() ) + { + initializeDocument(); + mxDrawPagesAccess = xDrawPages = new SdDrawPagesAccess(*this); + } + + return xDrawPages; +} + +// XMasterPagesSupplier +uno::Reference< drawing::XDrawPages > SAL_CALL SdXImpressDocument::getMasterPages() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< drawing::XDrawPages > xMasterPages( mxMasterPagesAccess ); + + if( !xMasterPages.is() ) + { + if ( !hasControllersLocked() ) + initializeDocument(); + mxMasterPagesAccess = xMasterPages = new SdMasterPagesAccess(*this); + } + + return xMasterPages; +} + +// XLayerManagerSupplier +uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLayerManager( ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< container::XNameAccess > xLayerManager( mxLayerManager ); + + if( !xLayerManager.is() ) + mxLayerManager = xLayerManager = new SdLayerManager(*this); + + return xLayerManager; +} + +// XCustomPresentationSupplier +uno::Reference< container::XNameContainer > SAL_CALL SdXImpressDocument::getCustomPresentations() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< container::XNameContainer > xCustomPres( mxCustomPresentationAccess ); + + if( !xCustomPres.is() ) + mxCustomPresentationAccess = xCustomPres = new SdXCustomPresentationAccess(*this); + + return xCustomPres; +} + +// XPresentationSupplier +uno::Reference< presentation::XPresentation > SAL_CALL SdXImpressDocument::getPresentation() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + return mpDoc->getPresentation(); +} + +// XHandoutMasterSupplier +uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::getHandoutMasterPage() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< drawing::XDrawPage > xPage; + + initializeDocument(); + SdPage* pPage = mpDoc->GetMasterSdPage(0, PageKind::Handout); + if (pPage) + xPage.set(pPage->getUnoPage(), uno::UNO_QUERY); + return xPage; +} + +// XMultiServiceFactory ( SvxFmMSFactory ) + +css::uno::Reference SdXImpressDocument::create( + OUString const & aServiceSpecifier, OUString const & referer) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + if( aServiceSpecifier == "com.sun.star.drawing.DashTable" ) + { + if( !mxDashTable.is() ) + mxDashTable = SvxUnoDashTable_createInstance( mpDoc ); + + return mxDashTable; + } + if( aServiceSpecifier == "com.sun.star.drawing.GradientTable" ) + { + if( !mxGradientTable.is() ) + mxGradientTable = SvxUnoGradientTable_createInstance( mpDoc ); + + return mxGradientTable; + } + if( aServiceSpecifier == "com.sun.star.drawing.HatchTable" ) + { + if( !mxHatchTable.is() ) + mxHatchTable = SvxUnoHatchTable_createInstance( mpDoc ); + + return mxHatchTable; + } + if( aServiceSpecifier == "com.sun.star.drawing.BitmapTable" ) + { + if( !mxBitmapTable.is() ) + mxBitmapTable = SvxUnoBitmapTable_createInstance( mpDoc ); + + return mxBitmapTable; + } + if( aServiceSpecifier == "com.sun.star.drawing.TransparencyGradientTable" ) + { + if( !mxTransGradientTable.is() ) + mxTransGradientTable = SvxUnoTransGradientTable_createInstance( mpDoc ); + + return mxTransGradientTable; + } + if( aServiceSpecifier == "com.sun.star.drawing.MarkerTable" ) + { + if( !mxMarkerTable.is() ) + mxMarkerTable = SvxUnoMarkerTable_createInstance( mpDoc ); + + return mxMarkerTable; + } + if( aServiceSpecifier == "com.sun.star.text.NumberingRules" ) + { + return uno::Reference< uno::XInterface >( SvxCreateNumRule( mpDoc ), uno::UNO_QUERY ); + } + if( aServiceSpecifier == "com.sun.star.drawing.Background" ) + { + return uno::Reference< uno::XInterface >( + static_cast(new SdUnoPageBackground( mpDoc ))); + } + + if( aServiceSpecifier == "com.sun.star.drawing.Defaults" ) + { + if( !mxDrawingPool.is() ) + mxDrawingPool = SdUnoCreatePool( mpDoc ); + + return mxDrawingPool; + + } + + if ( aServiceSpecifier == sUNO_Service_ImageMapRectangleObject ) + { + return SvUnoImageMapRectangleObject_createInstance( ImplGetSupportedMacroItems() ); + } + + if ( aServiceSpecifier == sUNO_Service_ImageMapCircleObject ) + { + return SvUnoImageMapCircleObject_createInstance( ImplGetSupportedMacroItems() ); + } + + if ( aServiceSpecifier == sUNO_Service_ImageMapPolygonObject ) + { + return SvUnoImageMapPolygonObject_createInstance( ImplGetSupportedMacroItems() ); + } + + if( aServiceSpecifier == "com.sun.star.document.Settings" || + ( !mbImpressDoc && ( aServiceSpecifier == "com.sun.star.drawing.DocumentSettings" ) ) || + ( mbImpressDoc && ( aServiceSpecifier == "com.sun.star.presentation.DocumentSettings" ) ) ) + { + return sd::DocumentSettings_createInstance( this ); + } + + if( aServiceSpecifier == "com.sun.star.text.TextField.DateTime" || + aServiceSpecifier == "com.sun.star.text.textfield.DateTime" ) + { + return static_cast(new SvxUnoTextField( text::textfield::Type::DATE )); + } + + if( aServiceSpecifier == "com.sun.star.presentation.TextField.Header" || + aServiceSpecifier == "com.sun.star.presentation.textfield.Header" ) + { + return static_cast(new SvxUnoTextField( text::textfield::Type::PRESENTATION_HEADER )); + } + + if( aServiceSpecifier == "com.sun.star.presentation.TextField.Footer" || + aServiceSpecifier == "com.sun.star.presentation.textfield.Footer" ) + { + return static_cast(new SvxUnoTextField( text::textfield::Type::PRESENTATION_FOOTER )); + } + + if( aServiceSpecifier == "com.sun.star.presentation.TextField.DateTime" || + aServiceSpecifier == "com.sun.star.presentation.textfield.DateTime" ) + { + return static_cast(new SvxUnoTextField( text::textfield::Type::PRESENTATION_DATE_TIME )); + } + + if( aServiceSpecifier == "com.sun.star.text.TextField.PageName" || + aServiceSpecifier == "com.sun.star.text.textfield.PageName" ) + { + return static_cast(new SvxUnoTextField( text::textfield::Type::PAGE_NAME )); + } + + if (aServiceSpecifier == "com.sun.star.text.TextField.DocInfo.Custom" || + aServiceSpecifier == "com.sun.star.text.textfield.DocInfo.Custom") + { + return static_cast(new SvxUnoTextField(text::textfield::Type::DOCINFO_CUSTOM)); + } + + if( aServiceSpecifier == "com.sun.star.xml.NamespaceMap" ) + { + static sal_uInt16 aWhichIds[] = { SDRATTR_XMLATTRIBUTES, EE_CHAR_XMLATTRIBS, EE_PARA_XMLATTRIBS, 0 }; + + return svx::NamespaceMap_createInstance( aWhichIds, &mpDoc->GetItemPool() ); + } + + // Support creation of GraphicStorageHandler and EmbeddedObjectResolver + if (aServiceSpecifier == "com.sun.star.document.ExportGraphicStorageHandler") + { + return static_cast(new SvXMLGraphicHelper( SvXMLGraphicHelperMode::Write )); + } + + if (aServiceSpecifier == "com.sun.star.document.ImportGraphicStorageHandler") + { + return static_cast(new SvXMLGraphicHelper( SvXMLGraphicHelperMode::Read )); + } + + if( aServiceSpecifier == "com.sun.star.document.ExportEmbeddedObjectResolver" ) + { + comphelper::IEmbeddedHelper* pPersist = mpDoc->GetPersist(); + if( nullptr == pPersist ) + throw lang::DisposedException(); + + return static_cast(new SvXMLEmbeddedObjectHelper( *pPersist, SvXMLEmbeddedObjectHelperMode::Write )); + } + + if( aServiceSpecifier == "com.sun.star.document.ImportEmbeddedObjectResolver" ) + { + comphelper::IEmbeddedHelper* pPersist = mpDoc->GetPersist(); + if( nullptr == pPersist ) + throw lang::DisposedException(); + + return static_cast(new SvXMLEmbeddedObjectHelper( *pPersist, SvXMLEmbeddedObjectHelperMode::Read )); + } + + uno::Reference< uno::XInterface > xRet; + + if( aServiceSpecifier.startsWith( "com.sun.star.presentation.") ) + { + const std::u16string_view aType( aServiceSpecifier.subView(26) ); + rtl::Reference pShape; + + SdrObjKind nType = SdrObjKind::Text; + // create a shape wrapper + if( o3tl::starts_with(aType, u"TitleTextShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"OutlinerShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"SubtitleShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"GraphicObjectShape" ) ) + { + nType = SdrObjKind::Graphic; + } + else if( o3tl::starts_with(aType, u"PageShape" ) ) + { + nType = SdrObjKind::Page; + } + else if( o3tl::starts_with(aType, u"OLE2Shape" ) ) + { + nType = SdrObjKind::OLE2; + } + else if( o3tl::starts_with(aType, u"ChartShape" ) ) + { + nType = SdrObjKind::OLE2; + } + else if( o3tl::starts_with(aType, u"CalcShape" ) ) + { + nType = SdrObjKind::OLE2; + } + else if( o3tl::starts_with(aType, u"TableShape" ) ) + { + nType = SdrObjKind::Table; + } + else if( o3tl::starts_with(aType, u"OrgChartShape" ) ) + { + nType = SdrObjKind::OLE2; + } + else if( o3tl::starts_with(aType, u"NotesShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"HandoutShape" ) ) + { + nType = SdrObjKind::Page; + } + else if( o3tl::starts_with(aType, u"FooterShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"HeaderShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"SlideNumberShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"DateTimeShape" ) ) + { + nType = SdrObjKind::Text; + } + else if( o3tl::starts_with(aType, u"MediaShape" ) ) + { + nType = SdrObjKind::Media; + } + else + { + throw lang::ServiceNotRegisteredException(); + } + + // create the API wrapper + pShape = CreateSvxShapeByTypeAndInventor( nType, SdrInventor::Default, referer ); + + // set shape type + if( pShape && !mbClipBoard ) + pShape->SetShapeType(aServiceSpecifier); + + xRet = static_cast(pShape.get()); + } + else if ( aServiceSpecifier == "com.sun.star.drawing.TableShape" ) + { + rtl::Reference pShape = CreateSvxShapeByTypeAndInventor( SdrObjKind::Table, SdrInventor::Default, referer ); + if( pShape && !mbClipBoard ) + pShape->SetShapeType(aServiceSpecifier); + + xRet = static_cast(pShape.get()); + } + else + { + xRet = SvxFmMSFactory::createInstance( aServiceSpecifier ); + } + + uno::Reference< drawing::XShape > xShape( xRet, uno::UNO_QUERY ); + SvxShape* pShape = xShape.is() ? comphelper::getFromUnoTunnel(xShape) : nullptr; + if (pShape) + { + xRet.clear(); + new SdXShape( pShape, this ); + xRet = xShape; + xShape.clear(); + } + + return xRet; +} + +uno::Reference< uno::XInterface > SAL_CALL SdXImpressDocument::createInstance( const OUString& aServiceSpecifier ) +{ + return create(aServiceSpecifier, ""); +} + +css::uno::Reference +SdXImpressDocument::createInstanceWithArguments( + OUString const & ServiceSpecifier, + css::uno::Sequence const & Arguments) +{ + OUString arg; + if ((ServiceSpecifier == "com.sun.star.drawing.GraphicObjectShape" + || ServiceSpecifier == "com.sun.star.drawing.MediaShape" + || ServiceSpecifier == "com.sun.star.presentation.MediaShape") + && Arguments.getLength() == 1 && (Arguments[0] >>= arg)) + { + return create(ServiceSpecifier, arg); + } + return SvxFmMSFactory::createInstanceWithArguments( + ServiceSpecifier, Arguments); +} + +uno::Sequence< OUString > SAL_CALL SdXImpressDocument::getAvailableServiceNames() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + const uno::Sequence< OUString > aSNS_ORG( SvxFmMSFactory::getAvailableServiceNames() ); + + uno::Sequence< OUString > aSNS_Common{ "com.sun.star.drawing.DashTable", + "com.sun.star.drawing.GradientTable", + "com.sun.star.drawing.HatchTable", + "com.sun.star.drawing.BitmapTable", + "com.sun.star.drawing.TransparencyGradientTable", + "com.sun.star.drawing.MarkerTable", + "com.sun.star.text.NumberingRules", + "com.sun.star.drawing.Background", + "com.sun.star.document.Settings", + sUNO_Service_ImageMapRectangleObject, + sUNO_Service_ImageMapCircleObject, + sUNO_Service_ImageMapPolygonObject, + "com.sun.star.xml.NamespaceMap", + + // Support creation of GraphicStorageHandler and EmbeddedObjectResolver + "com.sun.star.document.ExportGraphicStorageHandler", + "com.sun.star.document.ImportGraphicStorageHandler", + "com.sun.star.document.ExportEmbeddedObjectResolver", + "com.sun.star.document.ImportEmbeddedObjectResolver", + "com.sun.star.drawing.TableShape" }; + + uno::Sequence< OUString > aSNS_Specific; + + if(mbImpressDoc) + aSNS_Specific = { "com.sun.star.presentation.TitleTextShape", + "com.sun.star.presentation.OutlinerShape", + "com.sun.star.presentation.SubtitleShape", + "com.sun.star.presentation.GraphicObjectShape", + "com.sun.star.presentation.ChartShape", + "com.sun.star.presentation.PageShape", + "com.sun.star.presentation.OLE2Shape", + "com.sun.star.presentation.TableShape", + "com.sun.star.presentation.OrgChartShape", + "com.sun.star.presentation.NotesShape", + "com.sun.star.presentation.HandoutShape", + "com.sun.star.presentation.DocumentSettings", + "com.sun.star.presentation.FooterShape", + "com.sun.star.presentation.HeaderShape", + "com.sun.star.presentation.SlideNumberShape", + "com.sun.star.presentation.DateTimeShape", + "com.sun.star.presentation.CalcShape", + "com.sun.star.presentation.MediaShape" }; + else + aSNS_Specific = { "com.sun.star.drawing.DocumentSettings" }; + + return comphelper::concatSequences( aSNS_ORG, aSNS_Common, aSNS_Specific ); +} + +// lang::XServiceInfo +OUString SAL_CALL SdXImpressDocument::getImplementationName() +{ + return "SdXImpressDocument"; + /* // Matching the .component information: + return mbImpressDoc + ? OUString("com.sun.star.comp.Draw.PresentationDocument") + : OUString("com.sun.star.comp.Draw.DrawingDocument"); + */ +} + +sal_Bool SAL_CALL SdXImpressDocument::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService(this, ServiceName); +} + +uno::Sequence< OUString > SAL_CALL SdXImpressDocument::getSupportedServiceNames() +{ + ::SolarMutexGuard aGuard; + + return { "com.sun.star.document.OfficeDocument", + "com.sun.star.drawing.GenericDrawingDocument", + "com.sun.star.drawing.DrawingDocumentFactory", + mbImpressDoc?OUString("com.sun.star.presentation.PresentationDocument"):OUString("com.sun.star.drawing.DrawingDocument") }; +} + +// XPropertySet +uno::Reference< beans::XPropertySetInfo > SAL_CALL SdXImpressDocument::getPropertySetInfo( ) +{ + ::SolarMutexGuard aGuard; + return mpPropSet->getPropertySetInfo(); +} + +void SAL_CALL SdXImpressDocument::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName); + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_MODEL_LANGUAGE: + { + lang::Locale aLocale; + if(!(aValue >>= aLocale)) + throw lang::IllegalArgumentException(); + + mpDoc->SetLanguage( LanguageTag::convertToLanguageType(aLocale), EE_CHAR_LANGUAGE ); + break; + } + case WID_MODEL_TABSTOP: + { + sal_Int32 nValue = 0; + if(!(aValue >>= nValue) || nValue < 0 ) + throw lang::IllegalArgumentException(); + + mpDoc->SetDefaultTabulator(static_cast(nValue)); + break; + } + case WID_MODEL_VISAREA: + { + SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh(); + if( !pEmbeddedObj ) + break; + + awt::Rectangle aVisArea; + if( !(aValue >>= aVisArea) || (aVisArea.Width < 0) || (aVisArea.Height < 0) ) + throw lang::IllegalArgumentException(); + + sal_Int32 nRight, nTop; + if (o3tl::checked_add(aVisArea.X, aVisArea.Width, nRight) || o3tl::checked_add(aVisArea.Y, aVisArea.Height, nTop)) + throw lang::IllegalArgumentException(); + + pEmbeddedObj->SetVisArea(::tools::Rectangle(aVisArea.X, aVisArea.Y, nRight, nTop)); + } + break; + case WID_MODEL_CONTFOCUS: + { + bool bFocus = false; + if( !(aValue >>= bFocus ) ) + throw lang::IllegalArgumentException(); + mpDoc->SetAutoControlFocus( bFocus ); + } + break; + case WID_MODEL_DSGNMODE: + { + bool bMode = false; + if( !(aValue >>= bMode ) ) + throw lang::IllegalArgumentException(); + mpDoc->SetOpenInDesignMode( bMode ); + } + break; + case WID_MODEL_BUILDID: + aValue >>= maBuildId; + return; + case WID_MODEL_MAPUNIT: + case WID_MODEL_BASICLIBS: + case WID_MODEL_RUNTIMEUID: // is read-only + case WID_MODEL_DIALOGLIBS: + case WID_MODEL_FONTS: + throw beans::PropertyVetoException(); + case WID_MODEL_INTEROPGRABBAG: + setGrabBagItem(aValue); + break; + case WID_MODEL_THEME: + { + SdrModel& rModel = getSdrModelFromUnoModel(); + std::shared_ptr pTheme = model::Theme::FromAny(aValue); + rModel.setTheme(pTheme); + } + break; + default: + throw beans::UnknownPropertyException( aPropertyName, static_cast(this)); + } + + SetModified(); +} + +uno::Any SAL_CALL SdXImpressDocument::getPropertyValue( const OUString& PropertyName ) +{ + ::SolarMutexGuard aGuard; + + uno::Any aAny; + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName); + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_MODEL_LANGUAGE: + { + LanguageType eLang = mpDoc->GetLanguage( EE_CHAR_LANGUAGE ); + aAny <<= LanguageTag::convertToLocale( eLang); + break; + } + case WID_MODEL_TABSTOP: + aAny <<= static_cast(mpDoc->GetDefaultTabulator()); + break; + case WID_MODEL_VISAREA: + { + SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh(); + if( !pEmbeddedObj ) + break; + + const ::tools::Rectangle& aRect = pEmbeddedObj->GetVisArea(); + awt::Rectangle aVisArea( aRect.Left(), aRect.Top(), aRect.getOpenWidth(), aRect.getOpenHeight() ); + aAny <<= aVisArea; + } + break; + case WID_MODEL_MAPUNIT: + { + SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh(); + if( !pEmbeddedObj ) + break; + + sal_Int16 nMeasureUnit = 0; + SvxMapUnitToMeasureUnit( pEmbeddedObj->GetMapUnit(), nMeasureUnit ); + aAny <<= nMeasureUnit; + } + break; + case WID_MODEL_FORBCHARS: + { + aAny <<= getForbiddenCharsTable(); + } + break; + case WID_MODEL_CONTFOCUS: + aAny <<= mpDoc->GetAutoControlFocus(); + break; + case WID_MODEL_DSGNMODE: + aAny <<= mpDoc->GetOpenInDesignMode(); + break; + case WID_MODEL_BASICLIBS: + aAny <<= mpDocShell->GetBasicContainer(); + break; + case WID_MODEL_DIALOGLIBS: + aAny <<= mpDocShell->GetDialogContainer(); + break; + case WID_MODEL_RUNTIMEUID: + aAny <<= getRuntimeUID(); + break; + case WID_MODEL_BUILDID: + return uno::Any( maBuildId ); + case WID_MODEL_HASVALIDSIGNATURES: + aAny <<= hasValidSignatures(); + break; + case WID_MODEL_FONTS: + { + uno::Sequence aSeq; + int nSeqIndex = 0; + + sal_uInt16 const aWhichIds[] { EE_CHAR_FONTINFO, EE_CHAR_FONTINFO_CJK, + EE_CHAR_FONTINFO_CTL }; + + const SfxItemPool& rPool = mpDoc->GetPool(); + + for(sal_uInt16 nWhichId : aWhichIds) + { + const registeredSfxPoolItems& rSurrogates(rPool.GetItemSurrogates(nWhichId)); + const sal_uInt32 nItems(rSurrogates.size()); + + aSeq.realloc( aSeq.getLength() + nItems*5 + 5 ); + auto pSeq = aSeq.getArray(); + + for (const SfxPoolItem* pItem : rSurrogates) + { + const SvxFontItem *pFont = static_cast(pItem); + + pSeq[nSeqIndex++] <<= pFont->GetFamilyName(); + pSeq[nSeqIndex++] <<= pFont->GetStyleName(); + pSeq[nSeqIndex++] <<= sal_Int16(pFont->GetFamily()); + pSeq[nSeqIndex++] <<= sal_Int16(pFont->GetPitch()); + pSeq[nSeqIndex++] <<= sal_Int16(pFont->GetCharSet()); + } + + const SvxFontItem& rFont = static_cast(rPool.GetDefaultItem( nWhichId )); + + pSeq[nSeqIndex++] <<= rFont.GetFamilyName(); + pSeq[nSeqIndex++] <<= rFont.GetStyleName(); + pSeq[nSeqIndex++] <<= sal_Int16(rFont.GetFamily()); + pSeq[nSeqIndex++] <<= sal_Int16(rFont.GetPitch()); + pSeq[nSeqIndex++] <<= sal_Int16(rFont.GetCharSet()); + + } + + aSeq.realloc( nSeqIndex ); + aAny <<= aSeq; + break; + } + case WID_MODEL_INTEROPGRABBAG: + getGrabBagItem(aAny); + break; + case WID_MODEL_THEME: + { + SdrModel& rModel = getSdrModelFromUnoModel(); + auto const& pTheme = rModel.getTheme(); + if (pTheme) + { + pTheme->ToAny(aAny); + } + else + { + beans::PropertyValues aValues; + aAny <<= aValues; + } + break; + } + default: + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + } + + return aAny; +} + +void SAL_CALL SdXImpressDocument::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdXImpressDocument::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdXImpressDocument::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {} +void SAL_CALL SdXImpressDocument::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {} + +// XLinkTargetSupplier +uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLinks() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< container::XNameAccess > xLinks( mxLinks ); + if( !xLinks.is() ) + mxLinks = xLinks = new SdDocLinkTargets( *this ); + return xLinks; +} + +// XStyleFamiliesSupplier +uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getStyleFamilies( ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + uno::Reference< container::XNameAccess > xStyles( static_cast< OWeakObject* >( mpDoc->GetStyleSheetPool() ), css::uno::UNO_QUERY ); + return xStyles; +} + +// XAnyCompareFactory +uno::Reference< css::ucb::XAnyCompare > SAL_CALL SdXImpressDocument::createAnyCompareByName( const OUString& ) +{ + return SvxCreateNumRuleCompare(); +} + +// XRenderable +sal_Int32 SAL_CALL SdXImpressDocument::getRendererCount( const uno::Any& rSelection, + const uno::Sequence< beans::PropertyValue >& ) +{ + ::SolarMutexGuard aGuard; + sal_Int32 nRet = 0; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + if (mpDocShell) + { + uno::Reference< frame::XModel > xModel; + + rSelection >>= xModel; + + if( xModel == mpDocShell->GetModel() ) + nRet = mpDoc->GetSdPageCount( PageKind::Standard ); + else + { + uno::Reference< drawing::XShapes > xShapes; + + rSelection >>= xShapes; + + if( xShapes.is() && xShapes->getCount() ) + nRet = 1; + } + } + return nRet; +} + +uno::Sequence< beans::PropertyValue > SAL_CALL SdXImpressDocument::getRenderer( sal_Int32 , const uno::Any& , + const uno::Sequence< beans::PropertyValue >& rxOptions ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + bool bExportNotesPages = false; + for( const auto& rOption : rxOptions ) + { + if ( rOption.Name == "ExportNotesPages" ) + rOption.Value >>= bExportNotesPages; + } + uno::Sequence< beans::PropertyValue > aRenderer; + if (mpDocShell) + { + awt::Size aPageSize; + if ( bExportNotesPages ) + { + Size aNotesPageSize = mpDoc->GetSdPage( 0, PageKind::Notes )->GetSize(); + aPageSize = awt::Size( aNotesPageSize.Width(), aNotesPageSize.Height() ); + } + else + { + const ::tools::Rectangle aVisArea( mpDocShell->GetVisArea( embed::Aspects::MSOLE_DOCPRINT ) ); + aPageSize = awt::Size( aVisArea.GetWidth(), aVisArea.GetHeight() ); + } + aRenderer = { comphelper::makePropertyValue("PageSize", aPageSize) }; + } + return aRenderer; +} + +namespace { + +class ImplRenderPaintProc : public sdr::contact::ViewObjectContactRedirector +{ + const SdrLayerAdmin& rLayerAdmin; + SdrPageView* pSdrPageView; + +public: + bool IsVisible ( const SdrObject* pObj ) const; + bool IsPrintable( const SdrObject* pObj ) const; + + ImplRenderPaintProc(const SdrLayerAdmin& rLA, SdrPageView* pView); + + // all default implementations just call the same methods at the original. To do something + // different, override the method and at least do what the method does. + virtual void createRedirectedPrimitive2DSequence( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override; +}; + +} + +ImplRenderPaintProc::ImplRenderPaintProc(const SdrLayerAdmin& rLA, SdrPageView *const pView) + : rLayerAdmin(rLA) + , pSdrPageView(pView) +{ +} + +static sal_Int32 ImplPDFGetBookmarkPage( const OUString& rBookmark, SdDrawDocument const & rDoc ) +{ + sal_Int32 nPage = -1; + + OUString aBookmark( rBookmark ); + + if( rBookmark.startsWith("#") ) + aBookmark = rBookmark.copy( 1 ); + + // is the bookmark a page ? + bool bIsMasterPage; + sal_uInt16 nPgNum = rDoc.GetPageByName( aBookmark, bIsMasterPage ); + + if ( nPgNum == SDRPAGE_NOTFOUND ) + { + // is the bookmark an object ? + SdrObject* pObj = rDoc.GetObj( aBookmark ); + if (pObj) + nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum(); + } + if ( nPgNum != SDRPAGE_NOTFOUND ) + nPage = ( nPgNum - 1 ) / 2; + return nPage; +} + +static void ImplPDFExportComments( const uno::Reference< drawing::XDrawPage >& xPage, vcl::PDFExtOutDevData& rPDFExtOutDevData ) +{ + try + { + uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xPage, uno::UNO_QUERY_THROW ); + uno::Reference< office::XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() ); + + while( xAnnotationEnumeration->hasMoreElements() ) + { + uno::Reference< office::XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement() ); + + geometry::RealPoint2D aRealPoint2D( xAnnotation->getPosition() ); + geometry::RealSize2D aRealSize2D(xAnnotation->getSize()); + uno::Reference< text::XText > xText( xAnnotation->getTextRange() ); + + vcl::PDFNote aNote; + aNote.Title = xAnnotation->getAuthor(); + aNote.Contents = xText->getString(); + aNote.maModificationDate = xAnnotation->getDateTime(); + auto* pAnnotation = dynamic_cast(xAnnotation.get()); + aNote.isFreeText = pAnnotation && pAnnotation->isFreeText(); + if (pAnnotation && pAnnotation->hasCustomAnnotationMarker()) + { + aNote.maPolygons = pAnnotation->getCustomAnnotationMarker().maPolygons; + aNote.annotColor = pAnnotation->getCustomAnnotationMarker().maLineColor; + aNote.interiorColor = pAnnotation->getCustomAnnotationMarker().maFillColor; + } + + rPDFExtOutDevData.CreateNote( + ::tools::Rectangle(Point(static_cast<::tools::Long>(aRealPoint2D.X * 100), + static_cast<::tools::Long>(aRealPoint2D.Y * 100)), + Size(static_cast<::tools::Long>(aRealSize2D.Width * 100), + static_cast<::tools::Long>(aRealSize2D.Height * 100))), + aNote); + } + } + catch (const uno::Exception&) + { + } +} + +static void ImplPDFExportShapeInteraction( const uno::Reference< drawing::XShape >& xShape, SdDrawDocument& rDoc, vcl::PDFExtOutDevData& rPDFExtOutDevData ) +{ + if ( xShape->getShapeType() == "com.sun.star.drawing.GroupShape" ) + { + uno::Reference< container::XIndexAccess > xIndexAccess( xShape, uno::UNO_QUERY ); + if ( xIndexAccess.is() ) + { + sal_Int32 i, nCount = xIndexAccess->getCount(); + for ( i = 0; i < nCount; i++ ) + { + uno::Reference< drawing::XShape > xSubShape( xIndexAccess->getByIndex( i ), uno::UNO_QUERY ); + if ( xSubShape.is() ) + ImplPDFExportShapeInteraction( xSubShape, rDoc, rPDFExtOutDevData ); + } + } + } + else + { + uno::Reference< beans::XPropertySet > xShapePropSet( xShape, uno::UNO_QUERY ); + if( xShapePropSet.is() ) + { + Size aPageSize( rDoc.GetSdPage( 0, PageKind::Standard )->GetSize() ); + Point aPoint( 0, 0 ); + ::tools::Rectangle aPageRect( aPoint, aPageSize ); + + awt::Point aShapePos( xShape->getPosition() ); + awt::Size aShapeSize( xShape->getSize() ); + ::tools::Rectangle aLinkRect( Point( aShapePos.X, aShapePos.Y ), Size( aShapeSize.Width, aShapeSize.Height ) ); + + // Handle linked videos. + if (xShape->getShapeType() == "com.sun.star.drawing.MediaShape" || xShape->getShapeType() == "com.sun.star.presentation.MediaShape") + { + OUString title; + xShapePropSet->getPropertyValue("Title") >>= title; + OUString description; + xShapePropSet->getPropertyValue("Description") >>= description; + OUString const altText(title.isEmpty() + ? description + : description.isEmpty() + ? title + : OUString::Concat(title) + OUString::Concat("\n") + OUString::Concat(description)); + + OUString aMediaURL; + xShapePropSet->getPropertyValue("MediaURL") >>= aMediaURL; + if (!aMediaURL.isEmpty()) + { + SdrObject const*const pSdrObj(SdrObject::getSdrObjectFromXShape(xShape)); + OUString const mimeType(xShapePropSet->getPropertyValue("MediaMimeType").get()); + sal_Int32 nScreenId = rPDFExtOutDevData.CreateScreen(aLinkRect, altText, mimeType, rPDFExtOutDevData.GetCurrentPageNumber(), pSdrObj); + if (aMediaURL.startsWith("vnd.sun.star.Package:")) + { + OUString aTempFileURL; + xShapePropSet->getPropertyValue("PrivateTempFileURL") >>= aTempFileURL; + rPDFExtOutDevData.SetScreenStream(nScreenId, aTempFileURL); + } + else + rPDFExtOutDevData.SetScreenURL(nScreenId, aMediaURL); + } + } + + presentation::ClickAction eCa; + uno::Any aAny( xShapePropSet->getPropertyValue( "OnClick" ) ); + if ( aAny >>= eCa ) + { + OUString const actionName(SdResId(SdTPAction::GetClickActionSdResId(eCa))); + switch ( eCa ) + { + case presentation::ClickAction_LASTPAGE : + { + sal_Int32 nCount = rDoc.GetSdPageCount( PageKind::Standard ); + sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nCount - 1, vcl::PDFWriter::DestAreaType::FitRectangle ); + sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName); + rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId ); + } + break; + case presentation::ClickAction_FIRSTPAGE : + { + sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, 0, vcl::PDFWriter::DestAreaType::FitRectangle ); + sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName); + rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId ); + } + break; + case presentation::ClickAction_PREVPAGE : + { + sal_Int32 nDestPage = rPDFExtOutDevData.GetCurrentPageNumber(); + if ( nDestPage ) + nDestPage--; + sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nDestPage, vcl::PDFWriter::DestAreaType::FitRectangle ); + sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName); + rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId ); + } + break; + case presentation::ClickAction_NEXTPAGE : + { + sal_Int32 nDestPage = rPDFExtOutDevData.GetCurrentPageNumber() + 1; + sal_Int32 nLastPage = rDoc.GetSdPageCount( PageKind::Standard ) - 1; + if ( nDestPage > nLastPage ) + nDestPage = nLastPage; + sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nDestPage, vcl::PDFWriter::DestAreaType::FitRectangle ); + sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName); + rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId ); + } + break; + + case presentation::ClickAction_PROGRAM : + case presentation::ClickAction_BOOKMARK : + case presentation::ClickAction_DOCUMENT : + { + OUString aBookmark; + xShapePropSet->getPropertyValue( "Bookmark" ) >>= aBookmark; + if( !aBookmark.isEmpty() ) + { + switch( eCa ) + { + case presentation::ClickAction_DOCUMENT : + case presentation::ClickAction_PROGRAM : + { + sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName); + rPDFExtOutDevData.SetLinkURL( nLinkId, aBookmark ); + } + break; + case presentation::ClickAction_BOOKMARK : + { + sal_Int32 nPage = ImplPDFGetBookmarkPage( aBookmark, rDoc ); + if ( nPage != -1 ) + { + sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nPage, vcl::PDFWriter::DestAreaType::FitRectangle ); + sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName); + rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId ); + } + } + break; + default: + break; + } + } + } + break; + + case presentation::ClickAction_STOPPRESENTATION : + case presentation::ClickAction_SOUND : + case presentation::ClickAction_INVISIBLE : + case presentation::ClickAction_VERB : + case presentation::ClickAction_VANISH : + case presentation::ClickAction_MACRO : + default : + break; + } + } + } + } +} + +void ImplRenderPaintProc::createRedirectedPrimitive2DSequence( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) +{ + SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject(); + if(!pObject) + { + // not an object, maybe a page + sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo, rVisitor); + return; + } + SdrPage* pSdrPage(pObject->getSdrPageFromSdrObject()); + if(!pSdrPage) + return; + if(!pSdrPage->checkVisibility(rOriginal, rDisplayInfo, false)) + return; + if(!IsVisible(pObject) || !IsPrintable(pObject)) + return; + + sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo, rVisitor); +} + +bool ImplRenderPaintProc::IsVisible( const SdrObject* pObj ) const +{ + bool bVisible = true; + SdrLayerID nLayerId = pObj->GetLayer(); + if( pSdrPageView ) + { + const SdrLayer* pSdrLayer = rLayerAdmin.GetLayerPerID( nLayerId ); + if ( pSdrLayer ) + { + const OUString& aLayerName = pSdrLayer->GetName(); + bVisible = pSdrPageView->IsLayerVisible( aLayerName ); + } + } + return bVisible; +} +bool ImplRenderPaintProc::IsPrintable( const SdrObject* pObj ) const +{ + bool bPrintable = true; + SdrLayerID nLayerId = pObj->GetLayer(); + if( pSdrPageView ) + { + const SdrLayer* pSdrLayer = rLayerAdmin.GetLayerPerID( nLayerId ); + if ( pSdrLayer ) + { + const OUString& aLayerName = pSdrLayer->GetName(); + bPrintable = pSdrPageView->IsLayerPrintable( aLayerName ); + } + } + return bPrintable; + +} + +namespace +{ + sal_Int16 CalcOutputPageNum(vcl::PDFExtOutDevData const * pPDFExtOutDevData, SdDrawDocument const *pDoc, sal_Int16 nPageNumber) + { + //export all pages, simple one to one case + if (pPDFExtOutDevData && pPDFExtOutDevData->GetIsExportHiddenSlides()) + return nPageNumber-1; + //check all preceding pages, and only count non-hidden ones + sal_Int16 nRet = 0; + for (sal_Int16 i = 0; i < nPageNumber-1; ++i) + { + if (!pDoc->GetSdPage(i, PageKind::Standard)->IsExcluded()) + ++nRet; + } + return nRet; + } +} + +void SAL_CALL SdXImpressDocument::render( sal_Int32 nRenderer, const uno::Any& rSelection, + const uno::Sequence< beans::PropertyValue >& rxOptions ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpDoc ) + throw lang::DisposedException(); + + if (!mpDocShell) + return; + + uno::Reference< awt::XDevice > xRenderDevice; + const sal_Int32 nPageNumber = nRenderer + 1; + PageKind ePageKind = PageKind::Standard; + bool bExportNotesPages = false; + + for( const auto& rOption : rxOptions ) + { + if ( rOption.Name == "RenderDevice" ) + rOption.Value >>= xRenderDevice; + else if ( rOption.Name == "ExportNotesPages" ) + { + rOption.Value >>= bExportNotesPages; + if ( bExportNotesPages ) + ePageKind = PageKind::Notes; + } + } + + if( !(xRenderDevice.is() && nPageNumber && ( nPageNumber <= mpDoc->GetSdPageCount( ePageKind ) )) ) + return; + + VCLXDevice* pDevice = dynamic_cast( xRenderDevice.get() ); + VclPtr< OutputDevice> pOut = pDevice ? pDevice->GetOutputDevice() : VclPtr< OutputDevice >(); + + if( !pOut ) + return; + + vcl::PDFExtOutDevData* pPDFExtOutDevData = dynamic_cast( pOut->GetExtOutDevData() ); + + if ( mpDoc->GetSdPage(static_cast(nPageNumber)-1, PageKind::Standard)->IsExcluded() && + !(pPDFExtOutDevData && pPDFExtOutDevData->GetIsExportHiddenSlides()) ) + return; + + if (pPDFExtOutDevData) + { + css::lang::Locale const docLocale(Application::GetSettings().GetLanguageTag().getLocale()); + pPDFExtOutDevData->SetDocumentLocale(docLocale); + } + + ::sd::ClientView aView( mpDocShell, pOut ); + ::tools::Rectangle aVisArea( Point(), mpDoc->GetSdPage( static_cast(nPageNumber) - 1, ePageKind )->GetSize() ); + vcl::Region aRegion( aVisArea ); + + ::sd::ViewShell* pOldViewSh = mpDocShell->GetViewShell(); + ::sd::View* pOldSdView = pOldViewSh ? pOldViewSh->GetView() : nullptr; + + if ( pOldSdView ) + pOldSdView->SdrEndTextEdit(); + + aView.SetHlplVisible( false ); + aView.SetGridVisible( false ); + aView.SetBordVisible( false ); + aView.SetPageVisible( false ); + aView.SetGlueVisible( false ); + + pOut->SetMapMode(MapMode(MapUnit::Map100thMM)); + pOut->IntersectClipRegion( aVisArea ); + + uno::Reference< frame::XModel > xModel; + rSelection >>= xModel; + + if( xModel == mpDocShell->GetModel() ) + { + aView.ShowSdrPage( mpDoc->GetSdPage( static_cast(nPageNumber) - 1, ePageKind )); + SdrPageView* pPV = aView.GetSdrPageView(); + + if( pOldSdView ) + { + SdrPageView* pOldPV = pOldSdView->GetSdrPageView(); + if( pPV && pOldPV ) + { + pPV->SetVisibleLayers( pOldPV->GetVisibleLayers() ); + pPV->SetPrintableLayers( pOldPV->GetPrintableLayers() ); + } + } + + ImplRenderPaintProc aImplRenderPaintProc( mpDoc->GetLayerAdmin(), + pPV); + + // background color for outliner :o + SdPage* pPage = pPV ? static_cast(pPV->GetPage()) : nullptr; + if( pPage ) + { + SdrOutliner& rOutl = mpDoc->GetDrawOutliner(); + bool bScreenDisplay(true); + + // #i75566# printing; suppress AutoColor BackgroundColor generation + // for visibility reasons by giving GetPageBackgroundColor() + // the needed hint + // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see printing) + if (pOut && ((OUTDEV_PRINTER == pOut->GetOutDevType()) + || (OUTDEV_PDF == pOut->GetOutDevType()))) + bScreenDisplay = false; + + // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and + // hint value if screen display. Only then the AutoColor mechanisms shall be applied + rOutl.SetBackgroundColor( pPage->GetPageBackgroundColor( pPV, bScreenDisplay ) ); + } + + // produce link annots for media shapes before painting them + if ( pPDFExtOutDevData && pPage ) + { + try + { + uno::Any aAny; + uno::Reference< drawing::XDrawPage > xPage( uno::Reference< drawing::XDrawPage >::query( pPage->getUnoPage() ) ); + if ( xPage.is() ) + { + if ( pPDFExtOutDevData->GetIsExportNotes() ) + ImplPDFExportComments( xPage, *pPDFExtOutDevData ); + uno::Reference< beans::XPropertySet > xPagePropSet( xPage, uno::UNO_QUERY ); + if( xPagePropSet.is() ) + { + // exporting object interactions to pdf + + // if necessary, the master page interactions will be exported first + bool bIsBackgroundObjectsVisible = false; // #i39428# IsBackgroundObjectsVisible not available for Draw + if ( mbImpressDoc && xPagePropSet->getPropertySetInfo()->hasPropertyByName( "IsBackgroundObjectsVisible" ) ) + xPagePropSet->getPropertyValue( "IsBackgroundObjectsVisible" ) >>= bIsBackgroundObjectsVisible; + if ( bIsBackgroundObjectsVisible && !pPDFExtOutDevData->GetIsExportNotesPages() ) + { + uno::Reference< drawing::XMasterPageTarget > xMasterPageTarget( xPage, uno::UNO_QUERY ); + if ( xMasterPageTarget.is() ) + { + uno::Reference< drawing::XDrawPage > xMasterPage = xMasterPageTarget->getMasterPage(); + if ( xMasterPage.is() ) + { + sal_Int32 i, nCount = xMasterPage->getCount(); + for ( i = 0; i < nCount; i++ ) + { + aAny = xMasterPage->getByIndex( i ); + uno::Reference< drawing::XShape > xShape; + if ( aAny >>= xShape ) + ImplPDFExportShapeInteraction( xShape, *mpDoc, *pPDFExtOutDevData ); + } + } + } + } + + // exporting slide page object interactions + sal_Int32 i, nCount = xPage->getCount(); + for ( i = 0; i < nCount; i++ ) + { + aAny = xPage->getByIndex( i ); + uno::Reference< drawing::XShape > xShape; + if ( aAny >>= xShape ) + ImplPDFExportShapeInteraction( xShape, *mpDoc, *pPDFExtOutDevData ); + } + + // exporting transition effects to pdf + if ( mbImpressDoc && !pPDFExtOutDevData->GetIsExportNotesPages() && pPDFExtOutDevData->GetIsExportTransitionEffects() ) + { + static constexpr OUString sEffect( u"Effect"_ustr ); + static constexpr OUString sSpeed ( u"Speed"_ustr ); + sal_Int32 nTime = 800; + presentation::AnimationSpeed aAs; + if ( xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sSpeed ) ) + { + aAny = xPagePropSet->getPropertyValue( sSpeed ); + if ( aAny >>= aAs ) + { + switch( aAs ) + { + case presentation::AnimationSpeed_SLOW : nTime = 1500; break; + case presentation::AnimationSpeed_FAST : nTime = 300; break; + default: + case presentation::AnimationSpeed_MEDIUM : nTime = 800; + } + } + } + presentation::FadeEffect eFe; + vcl::PDFWriter::PageTransition eType = vcl::PDFWriter::PageTransition::Regular; + if ( xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sEffect ) ) + { + aAny = xPagePropSet->getPropertyValue( sEffect ); + if ( aAny >>= eFe ) + { + switch( eFe ) + { + case presentation::FadeEffect_HORIZONTAL_LINES : + case presentation::FadeEffect_HORIZONTAL_CHECKERBOARD : + case presentation::FadeEffect_HORIZONTAL_STRIPES : eType = vcl::PDFWriter::PageTransition::BlindsHorizontal; break; + + case presentation::FadeEffect_VERTICAL_LINES : + case presentation::FadeEffect_VERTICAL_CHECKERBOARD : + case presentation::FadeEffect_VERTICAL_STRIPES : eType = vcl::PDFWriter::PageTransition::BlindsVertical; break; + + case presentation::FadeEffect_UNCOVER_TO_RIGHT : + case presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT : + case presentation::FadeEffect_ROLL_FROM_LEFT : + case presentation::FadeEffect_FADE_FROM_UPPERLEFT : + case presentation::FadeEffect_MOVE_FROM_UPPERLEFT : + case presentation::FadeEffect_FADE_FROM_LEFT : + case presentation::FadeEffect_MOVE_FROM_LEFT : eType = vcl::PDFWriter::PageTransition::WipeLeftToRight; break; + + case presentation::FadeEffect_UNCOVER_TO_BOTTOM : + case presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT : + case presentation::FadeEffect_ROLL_FROM_TOP : + case presentation::FadeEffect_FADE_FROM_UPPERRIGHT : + case presentation::FadeEffect_MOVE_FROM_UPPERRIGHT : + case presentation::FadeEffect_FADE_FROM_TOP : + case presentation::FadeEffect_MOVE_FROM_TOP : eType = vcl::PDFWriter::PageTransition::WipeTopToBottom; break; + + case presentation::FadeEffect_UNCOVER_TO_LEFT : + case presentation::FadeEffect_UNCOVER_TO_LOWERLEFT : + case presentation::FadeEffect_ROLL_FROM_RIGHT : + + case presentation::FadeEffect_FADE_FROM_LOWERRIGHT : + case presentation::FadeEffect_MOVE_FROM_LOWERRIGHT : + case presentation::FadeEffect_FADE_FROM_RIGHT : + case presentation::FadeEffect_MOVE_FROM_RIGHT : eType = vcl::PDFWriter::PageTransition::WipeRightToLeft; break; + + case presentation::FadeEffect_UNCOVER_TO_TOP : + case presentation::FadeEffect_UNCOVER_TO_UPPERLEFT : + case presentation::FadeEffect_ROLL_FROM_BOTTOM : + case presentation::FadeEffect_FADE_FROM_LOWERLEFT : + case presentation::FadeEffect_MOVE_FROM_LOWERLEFT : + case presentation::FadeEffect_FADE_FROM_BOTTOM : + case presentation::FadeEffect_MOVE_FROM_BOTTOM : eType = vcl::PDFWriter::PageTransition::WipeBottomToTop; break; + + case presentation::FadeEffect_OPEN_VERTICAL : eType = vcl::PDFWriter::PageTransition::SplitHorizontalInward; break; + case presentation::FadeEffect_CLOSE_HORIZONTAL : eType = vcl::PDFWriter::PageTransition::SplitHorizontalOutward; break; + + case presentation::FadeEffect_OPEN_HORIZONTAL : eType = vcl::PDFWriter::PageTransition::SplitVerticalInward; break; + case presentation::FadeEffect_CLOSE_VERTICAL : eType = vcl::PDFWriter::PageTransition::SplitVerticalOutward; break; + + case presentation::FadeEffect_FADE_TO_CENTER : eType = vcl::PDFWriter::PageTransition::BoxInward; break; + case presentation::FadeEffect_FADE_FROM_CENTER : eType = vcl::PDFWriter::PageTransition::BoxOutward; break; + + case presentation::FadeEffect_NONE : eType = vcl::PDFWriter::PageTransition::Regular; break; + + case presentation::FadeEffect_RANDOM : + case presentation::FadeEffect_DISSOLVE : + default: eType = vcl::PDFWriter::PageTransition::Dissolve; break; + } + } + } + + if ( xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sEffect ) || + xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sSpeed ) ) + { + pPDFExtOutDevData->SetPageTransition( eType, nTime ); + } + } + } + } + } + catch (const uno::Exception&) + { + } + } + + aView.SdrPaintView::CompleteRedraw(pOut, aRegion, &aImplRenderPaintProc); + + if (pPDFExtOutDevData && pPage) + { + try + { + Size aPageSize( mpDoc->GetSdPage( 0, PageKind::Standard )->GetSize() ); + Point aPoint( 0, 0 ); + ::tools::Rectangle aPageRect( aPoint, aPageSize ); + + // resolving links found in this page by the method ImpEditEngine::Paint + std::vector< vcl::PDFExtOutDevBookmarkEntry >& rBookmarks = pPDFExtOutDevData->GetBookmarks(); + for ( const auto& rBookmark : rBookmarks ) + { + sal_Int32 nPage = ImplPDFGetBookmarkPage( rBookmark.aBookmark, *mpDoc ); + if ( nPage != -1 ) + { + if ( rBookmark.nLinkId != -1 ) + pPDFExtOutDevData->SetLinkDest( rBookmark.nLinkId, pPDFExtOutDevData->CreateDest( aPageRect, nPage, vcl::PDFWriter::DestAreaType::FitRectangle ) ); + else + pPDFExtOutDevData->DescribeRegisteredDest( rBookmark.nDestId, aPageRect, nPage, vcl::PDFWriter::DestAreaType::FitRectangle ); + } + else + pPDFExtOutDevData->SetLinkURL( rBookmark.nLinkId, rBookmark.aBookmark ); + } + rBookmarks.clear(); + //---> #i56629, #i40318 + //get the page name, will be used as outline element in PDF bookmark pane + OUString aPageName = mpDoc->GetSdPage( static_cast(nPageNumber) - 1 , PageKind::Standard )->GetName(); + if( !aPageName.isEmpty() ) + { + // Destination PageNum + const sal_Int32 nDestPageNum = CalcOutputPageNum(pPDFExtOutDevData, mpDoc, nPageNumber); + + // insert the bookmark to this page into the NamedDestinations + if( pPDFExtOutDevData->GetIsExportNamedDestinations() ) + pPDFExtOutDevData->CreateNamedDest(aPageName, aPageRect, nDestPageNum); + + // add the name to the outline, (almost) same code as in sc/source/ui/unoobj/docuno.cxx + // issue #i40318. + + if( pPDFExtOutDevData->GetIsExportBookmarks() ) + { + // Destination Export + const sal_Int32 nDestId = + pPDFExtOutDevData->CreateDest(aPageRect , nDestPageNum); + + // Create a new outline item: + pPDFExtOutDevData->CreateOutlineItem( -1 , aPageName, nDestId ); + } + } + //<--- #i56629, #i40318 + } + catch (const uno::Exception&) + { + } + + } + } + else + { + uno::Reference< drawing::XShapes > xShapes; + rSelection >>= xShapes; + + if( xShapes.is() && xShapes->getCount() ) + { + SdrPageView* pPV = nullptr; + + ImplRenderPaintProc aImplRenderPaintProc( mpDoc->GetLayerAdmin(), + pOldSdView ? pOldSdView->GetSdrPageView() : nullptr); + + for( sal_uInt32 i = 0, nCount = xShapes->getCount(); i < nCount; i++ ) + { + uno::Reference< drawing::XShape > xShape; + xShapes->getByIndex( i ) >>= xShape; + + if( xShape.is() ) + { + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape ); + if( pObj && pObj->getSdrPageFromSdrObject() + && aImplRenderPaintProc.IsVisible( pObj ) + && aImplRenderPaintProc.IsPrintable( pObj ) ) + { + if( !pPV ) + pPV = aView.ShowSdrPage( pObj->getSdrPageFromSdrObject() ); + + if( pPV ) + aView.MarkObj( pObj, pPV ); + } + } + } + aView.DrawMarkedObj(*pOut); + } + } +} + +DrawViewShell* SdXImpressDocument::GetViewShell() +{ + DrawViewShell* pViewSh = dynamic_cast(mpDocShell->GetViewShell()); + if (!pViewSh) + { + SAL_WARN("sd", "DrawViewShell not available!"); + return nullptr; + } + return pViewSh; +} + +void SdXImpressDocument::paintTile( VirtualDevice& rDevice, + int nOutputWidth, int nOutputHeight, + int nTilePosX, int nTilePosY, + ::tools::Long nTileWidth, ::tools::Long nTileHeight ) +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return; + + // we need to skip tile invalidation for controls on rendering + comphelper::LibreOfficeKit::setTiledPainting(true); + + // Setup drawing layer to work properly. Since we use a custom VirtualDevice + // for the drawing, SdrPaintView::BeginCompleteRedraw() will call FindPaintWindow() + // unsuccessfully and use a temporary window that doesn't keep state. So patch + // the existing SdrPageWindow to use a temporary, and this way the state will be kept. + // Well, at least that's how I understand it based on Writer's RenderContextGuard, + // as the drawing layer classes lack documentation. + SdrPageWindow* patchedPageWindow = nullptr; + SdrPaintWindow* previousPaintWindow = nullptr; + std::unique_ptr temporaryPaintWindow; + if(SdrView* pDrawView = pViewSh->GetDrawView()) + { + if(SdrPageView* pSdrPageView = pDrawView->GetSdrPageView()) + { + pSdrPageView->SetApplicationDocumentColor(pViewSh->GetViewOptions().mnDocBackgroundColor); + patchedPageWindow = pSdrPageView->FindPageWindow(*getDocWindow()->GetOutDev()); + temporaryPaintWindow.reset(new SdrPaintWindow(*pDrawView, rDevice)); + if (patchedPageWindow) + previousPaintWindow = patchedPageWindow->patchPaintWindow(*temporaryPaintWindow); + } + } + + // Scaling. Must convert from pixels to twips. We know + // that VirtualDevices use a DPI of 96. + // We specifically calculate these scales first as we're still + // in TWIPs, and might as well minimize the number of conversions. + const Fraction scale = conversionFract(o3tl::Length::px, o3tl::Length::twip); + Fraction scaleX = Fraction(nOutputWidth, nTileWidth) * scale; + Fraction scaleY = Fraction(nOutputHeight, nTileHeight) * scale; + + // svx seems to be the only component that works natively in + // 100th mm rather than TWIP. It makes most sense just to + // convert here and in getDocumentSize, and leave the tiled + // rendering API working in TWIPs. + ::tools::Long nTileWidthHMM = convertTwipToMm100( nTileWidth ); + ::tools::Long nTileHeightHMM = convertTwipToMm100( nTileHeight ); + int nTilePosXHMM = convertTwipToMm100( nTilePosX ); + int nTilePosYHMM = convertTwipToMm100( nTilePosY ); + + MapMode aMapMode = rDevice.GetMapMode(); + aMapMode.SetMapUnit( MapUnit::Map100thMM ); + aMapMode.SetOrigin( Point( -nTilePosXHMM, + -nTilePosYHMM) ); + aMapMode.SetScaleX( scaleX ); + aMapMode.SetScaleY( scaleY ); + + rDevice.SetMapMode( aMapMode ); + + rDevice.SetOutputSizePixel( Size(nOutputWidth, nOutputHeight) ); + + Point aPoint(nTilePosXHMM, nTilePosYHMM); + Size aSize(nTileWidthHMM, nTileHeightHMM); + ::tools::Rectangle aRect(aPoint, aSize); + + SdrView* pView = pViewSh->GetDrawView(); + if (comphelper::LibreOfficeKit::isActive()) + pView->SetPaintTextEdit(mbPaintTextEdit); + + pViewSh->GetView()->CompleteRedraw(&rDevice, vcl::Region(aRect)); + + if (comphelper::LibreOfficeKit::isActive()) + pView->SetPaintTextEdit(true); + + LokChartHelper::PaintAllChartsOnTile(rDevice, nOutputWidth, nOutputHeight, + nTilePosX, nTilePosY, nTileWidth, nTileHeight); + LokStarMathHelper::PaintAllInPlaceOnTile(rDevice, nOutputWidth, nOutputHeight, nTilePosX, + nTilePosY, nTileWidth, nTileHeight); + + if(patchedPageWindow != nullptr) + patchedPageWindow->unpatchPaintWindow(previousPaintWindow); + + // Draw Form controls + SdrView* pDrawView = pViewSh->GetDrawView(); + SdrPageView* pPageView = pDrawView->GetSdrPageView(); + if (pPageView != nullptr) + { + SdrPage* pPage = pPageView->GetPage(); + ::sd::Window* pActiveWin = pViewSh->GetActiveWindow(); + ::tools::Rectangle aTileRect(Point(nTilePosX, nTilePosY), Size(nTileWidth, nTileHeight)); + Size aOutputSize(nOutputWidth, nOutputHeight); + LokControlHandler::paintControlTile(pPage, pDrawView, *pActiveWin, rDevice, aOutputSize, aTileRect); + } + + comphelper::LibreOfficeKit::setTiledPainting(false); +} + +OString SdXImpressDocument::getViewRenderState(SfxViewShell* pViewShell) +{ + OStringBuffer aState; + DrawViewShell* pView = nullptr; + + if (ViewShellBase* pShellBase = dynamic_cast(pViewShell)) + pView = dynamic_cast(pShellBase->GetMainViewShell().get()); + else + pView = GetViewShell(); + + if (pView) + { + const SdViewOptions& pVOpt = pView->GetViewOptions(); + aState.append(';'); + + OString aThemeName = OUStringToOString(pVOpt.msColorSchemeName, RTL_TEXTENCODING_UTF8); + aState.append(aThemeName); + } + return aState.makeStringAndClear(); +} + +void SdXImpressDocument::selectPart(int nPart, int nSelect) +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return; + + pViewSh->SelectPage(nPart, nSelect); +} + +void SdXImpressDocument::moveSelectedParts(int nPosition, bool bDuplicate) +{ + // Duplicating is currently unsupported. + if (!bDuplicate) + mpDoc->MovePages(nPosition); +} + +OUString SdXImpressDocument::getPartInfo(int nPart) +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return OUString(); + + const SdPage* pSdPage = mpDoc->GetSdPage(nPart, pViewSh->GetPageKind()); + const bool bIsVisible = pSdPage && !pSdPage->IsExcluded(); + const bool bIsSelected = pViewSh->IsSelected(nPart); + const sal_Int16 nMasterPageCount= pViewSh->GetDoc()->GetMasterSdPageCount(pViewSh->GetPageKind()); + + OUString aPartInfo = "{ \"visible\": \"" + + OUString::number(static_cast(bIsVisible)) + + "\", \"selected\": \"" + + OUString::number(static_cast(bIsSelected)) + + "\", \"masterPageCount\": \"" + + OUString::number(nMasterPageCount) + + "\", \"mode\": \"" + + OUString::number(getEditMode()) + + "\" }"; + + return aPartInfo; +} + +void SdXImpressDocument::setPart( int nPart, bool bAllowChangeFocus ) +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return; + + pViewSh->SwitchPage( nPart, bAllowChangeFocus ); +} + +int SdXImpressDocument::getParts() +{ + if (!mpDoc) + return 0; + + if (isMasterViewMode()) + return mpDoc->GetMasterSdPageCount(PageKind::Standard); + + return mpDoc->GetSdPageCount(PageKind::Standard); +} + +int SdXImpressDocument::getPart() +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return 0; + + return pViewSh->GetViewShellBase().getPart(); +} + +OUString SdXImpressDocument::getPartName(int nPart) +{ + SdPage* pPage; + if (isMasterViewMode()) + pPage = mpDoc->GetMasterSdPage(nPart, PageKind::Standard); + else + pPage = mpDoc->GetSdPage(nPart, PageKind::Standard); + + if (!pPage) + { + SAL_WARN("sd", "DrawViewShell not available!"); + return OUString(); + } + + return pPage->GetName(); +} + +OUString SdXImpressDocument::getPartHash(int nPart) +{ + SdPage* pPage; + if (isMasterViewMode()) + pPage = mpDoc->GetMasterSdPage(nPart, PageKind::Standard); + else + pPage = mpDoc->GetSdPage(nPart, PageKind::Standard); + + if (!pPage) + { + SAL_WARN("sd", "DrawViewShell not available!"); + return OUString(); + } + + return OUString::number(pPage->GetHashCode()); +} + +bool SdXImpressDocument::isMasterViewMode() +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return false; + + if (pViewSh->GetDispatcher()) + { + SfxPoolItemHolder aResult; + pViewSh->GetDispatcher()->QueryState(SID_SLIDE_MASTER_MODE, aResult); + const SfxBoolItem* isMasterViewMode(static_cast(aResult.getItem())); + if (isMasterViewMode && isMasterViewMode->GetValue()) + return true; + } + return false; +} + +VclPtr SdXImpressDocument::getDocWindow() +{ + SolarMutexGuard aGuard; + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return {}; + + if (VclPtr pWindow = SfxLokHelper::getInPlaceDocWindow(pViewShell->GetViewShell())) + return pWindow; + + return pViewShell->GetActiveWindow(); +} + +void SdXImpressDocument::setPartMode( int nPartMode ) +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return; + + PageKind aPageKind( PageKind::Standard ); + switch ( nPartMode ) + { + case LOK_PARTMODE_SLIDES: + break; + case LOK_PARTMODE_NOTES: + aPageKind = PageKind::Notes; + break; + } + pViewSh->SetPageKind( aPageKind ); +} + +int SdXImpressDocument::getEditMode() +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return 0; + + return pViewSh->GetViewShellBase().getEditMode(); +} + +void SdXImpressDocument::setEditMode(int nMode) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return; + + pViewSh->GetViewShellBase().setEditMode(nMode); +} + +Size SdXImpressDocument::getDocumentSize() +{ + DrawViewShell* pViewSh = GetViewShell(); + if (!pViewSh) + return Size(); + + SdrView *pSdrView = pViewSh->GetView(); + if (!pSdrView) + return Size(); + + SdrPageView* pCurPageView = pSdrView->GetSdrPageView(); + if (!pCurPageView) + return Size(); + + Size aSize = pCurPageView->GetPageRect().GetSize(); + // Convert the size in 100th mm to TWIP + // See paintTile above for further info. + return o3tl::convert(aSize, o3tl::Length::mm100, o3tl::Length::twip); +} + +void SdXImpressDocument::getPostIts(::tools::JsonWriter& rJsonWriter) +{ + auto commentsNode = rJsonWriter.startNode("comments"); + // Return annotations on master pages too ? + const sal_uInt16 nMaxPages = mpDoc->GetPageCount(); + SdPage* pPage; + for (sal_uInt16 nPage = 0; nPage < nMaxPages; ++nPage) + { + pPage = static_cast(mpDoc->GetPage(nPage)); + const sd::AnnotationVector& aPageAnnotations = pPage->getAnnotations(); + + for (const rtl::Reference& xAnnotation : aPageAnnotations) + { + sal_uInt32 nID = sd::getAnnotationId(xAnnotation); + OString nodeName = "comment" + OString::number(nID); + auto commentNode = rJsonWriter.startNode(nodeName); + rJsonWriter.put("id", nID); + rJsonWriter.put("author", xAnnotation->getAuthor()); + rJsonWriter.put("dateTime", utl::toISO8601(xAnnotation->getDateTime())); + uno::Reference xText(xAnnotation->getTextRange()); + rJsonWriter.put("text", xText->getString()); + rJsonWriter.put("parthash", pPage->GetHashCode()); + geometry::RealPoint2D const & rPoint = xAnnotation->getPosition(); + geometry::RealSize2D const & rSize = xAnnotation->getSize(); + ::tools::Rectangle aRectangle(Point(rPoint.X * 100.0, rPoint.Y * 100.0), Size(rSize.Width * 100.0, rSize.Height * 100.0)); + aRectangle = o3tl::toTwips(aRectangle, o3tl::Length::mm100); + OString sRectangle = aRectangle.toString(); + rJsonWriter.put("rectangle", sRectangle.getStr()); + } + } +} + +void SdXImpressDocument::initializeForTiledRendering(const css::uno::Sequence& rArguments) +{ + SolarMutexGuard aGuard; + + if (DrawViewShell* pViewShell = GetViewShell()) + { + DrawView* pDrawView = pViewShell->GetDrawView(); + for (const beans::PropertyValue& rValue : rArguments) + { + if (rValue.Name == ".uno:ShowBorderShadow" && rValue.Value.has()) + pDrawView->SetPageShadowVisible(rValue.Value.get()); + else if (rValue.Name == ".uno:Author" && rValue.Value.has()) + pDrawView->SetAuthor(rValue.Value.get()); + else if (rValue.Name == ".uno:SpellOnline" && rValue.Value.has()) + mpDoc->SetOnlineSpell(rValue.Value.get()); + } + + // Disable comments if requested + SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType()); + pOptions->SetShowComments(comphelper::LibreOfficeKit::isTiledAnnotations()); + + pViewShell->SetRuler(false); + pViewShell->SetScrollBarsVisible(false); + + if (sd::Window* pWindow = pViewShell->GetActiveWindow()) + { + // get the full page size in pixels + pWindow->EnableMapMode(); + Size aSize(pWindow->LogicToPixel(pDrawView->GetSdrPageView()->GetPage()->GetSize())); + // Disable map mode, so that it's possible to send mouse event + // coordinates in logic units + pWindow->EnableMapMode(false); + + // arrange UI elements again with new view size + pViewShell->GetParentWindow()->SetSizePixel(aSize); + pViewShell->Resize(); + } + + // Forces all images to be swapped in synchronously, this + // ensures that images are available when paintTile is called + // (whereas with async loading images start being loaded after + // we have painted the tile, resulting in an invalidate, followed + // by the tile being rerendered - which is wasteful and ugly). + pDrawView->SetSwapAsynchron(false); + } + + // when the "This document may contain formatting or content that cannot + // be saved..." dialog appears, it is auto-cancelled with tiled rendering, + // causing 'Save' being disabled; so let's always save to the original + // format + auto xChanges = comphelper::ConfigurationChanges::create(); + officecfg::Office::Common::Save::Document::WarnAlienFormat::set(false, xChanges); + xChanges->commit(); + + if (!getenv("LO_TESTNAME")) + SvtSlideSorterBarOptions().SetVisibleImpressView(true); +} + +void SdXImpressDocument::postKeyEvent(int nType, int nCharCode, int nKeyCode) +{ + SolarMutexGuard aGuard; + SfxLokHelper::postKeyEventAsync(getDocWindow(), nType, nCharCode, nKeyCode); +} + +void SdXImpressDocument::postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + constexpr double fScale = o3tl::convert(1.0, o3tl::Length::twip, o3tl::Length::px); + + if (SfxLokHelper::testInPlaceComponentMouseEventHit( + pViewShell->GetViewShell(), nType, nX, nY, nCount, nButtons, nModifier, fScale, fScale)) + return; + + // try to forward mouse event to control + const Point aPointTwip(nX, nY); + const Point aPointHMM = o3tl::convert(aPointTwip, o3tl::Length::twip, o3tl::Length::mm100); + SdrView* pDrawView = pViewShell->GetDrawView(); + SdrPageView* pPageView = pDrawView->GetSdrPageView(); + SdrPage* pPage = pPageView->GetPage(); + ::sd::Window* pActiveWin = pViewShell->GetActiveWindow(); + if (!pActiveWin) + { + return; + } + + if (LokControlHandler::postMouseEvent(pPage, pDrawView, *pActiveWin, nType, aPointHMM, nCount, nButtons, nModifier)) + return; + + LokMouseEventData aMouseEventData(nType, aPointHMM, nCount, MouseEventModifiers::SIMPLECLICK, + nButtons, nModifier); + SfxLokHelper::postMouseEventAsync(pViewShell->GetActiveWindow(), aMouseEventData); +} + +void SdXImpressDocument::setTextSelection(int nType, int nX, int nY) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + LokChartHelper aChartHelper(pViewShell->GetViewShell()); + if (aChartHelper.setTextSelection(nType, nX, nY)) + return; + + Point aPoint(convertTwipToMm100(nX), convertTwipToMm100(nY)); + switch (nType) + { + case LOK_SETTEXTSELECTION_START: + pViewShell->SetCursorMm100Position(aPoint, /*bPoint=*/false, /*bClearMark=*/false); + break; + case LOK_SETTEXTSELECTION_END: + pViewShell->SetCursorMm100Position(aPoint, /*bPoint=*/true, /*bClearMark=*/false); + break; + case LOK_SETTEXTSELECTION_RESET: + pViewShell->SetCursorMm100Position(aPoint, /*bPoint=*/true, /*bClearMark=*/true); + break; + default: + assert(false); + break; + } +} + +uno::Reference SdXImpressDocument::getSelection() +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return uno::Reference(); + + return pViewShell->GetSelectionTransferable(); +} + +void SdXImpressDocument::setGraphicSelection(int nType, int nX, int nY) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + constexpr double fScale = o3tl::convert(1.0, o3tl::Length::twip, o3tl::Length::px); + + LokChartHelper aChartHelper(pViewShell->GetViewShell()); + if (aChartHelper.setGraphicSelection(nType, nX, nY, fScale, fScale)) + return; + + Point aPoint(convertTwipToMm100(nX), convertTwipToMm100(nY)); + switch (nType) + { + case LOK_SETGRAPHICSELECTION_START: + pViewShell->SetGraphicMm100Position(/*bStart=*/true, aPoint); + break; + case LOK_SETGRAPHICSELECTION_END: + pViewShell->SetGraphicMm100Position(/*bStart=*/false, aPoint); + break; + default: + assert(false); + break; + } +} + +void SdXImpressDocument::resetSelection() +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + SdrView* pSdrView = pViewShell->GetView(); + if (!pSdrView) + return; + + if (pSdrView->IsTextEdit()) + { + // Reset the editeng selection. + pSdrView->UnmarkAll(); + // Finish editing. + pSdrView->SdrEndTextEdit(); + } + // Reset graphic selection. + pSdrView->UnmarkAll(); +} + +void SdXImpressDocument::setClientVisibleArea(const ::tools::Rectangle& rRectangle) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + pViewShell->GetViewShellBase().setLOKVisibleArea(rRectangle); +} + +void SdXImpressDocument::setClipboard(const uno::Reference& xClipboard) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + pViewShell->GetActiveWindow()->SetClipboard(xClipboard); +} + +bool SdXImpressDocument::isMimeTypeSupported() +{ + SolarMutexGuard aGuard; + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return false; + + TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromSystemClipboard(pViewShell->GetActiveWindow())); + return EditEngine::HasValidData(aDataHelper.GetTransferable()); +} + +PointerStyle SdXImpressDocument::getPointer() +{ + SolarMutexGuard aGuard; + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return PointerStyle::Arrow; + + Window* pWindow = pViewShell->GetActiveWindow(); + if (!pWindow) + return PointerStyle::Arrow; + + return pWindow->GetPointer(); +} + +uno::Reference< i18n::XForbiddenCharacters > SdXImpressDocument::getForbiddenCharsTable() +{ + uno::Reference< i18n::XForbiddenCharacters > xForb(mxForbiddenCharacters); + + if( !xForb.is() ) + mxForbiddenCharacters = xForb = new SdUnoForbiddenCharsTable( mpDoc ); + + return xForb; +} + +void SdXImpressDocument::initializeDocument() +{ + if( mbClipBoard ) + return; + + switch( mpDoc->GetPageCount() ) + { + case 1: + { + // nasty hack to detect clipboard document + mbClipBoard = true; + break; + } + case 0: + { + mpDoc->CreateFirstPages(); + mpDoc->StopWorkStartupDelay(); + break; + } + } +} + +SdrModel& SdXImpressDocument::getSdrModelFromUnoModel() const +{ + OSL_ENSURE(GetDoc(), "No SdrModel in draw/Impress, should not happen"); + return *GetDoc(); // TTTT should be reference +} + +void SAL_CALL SdXImpressDocument::dispose() +{ + if( mbDisposed ) + return; + + ::SolarMutexGuard aGuard; + + if( mpDoc ) + { + EndListening( *mpDoc ); + mpDoc = nullptr; + } + + // Call the base class dispose() before setting the mbDisposed flag + // to true. The reason for this is that if close() has not yet been + // called this is done in SfxBaseModel::dispose(). At the end of + // that dispose() is called again. It is important to forward this + // second dispose() to the base class, too. + // As a consequence the following code has to be able to be run twice. + SfxBaseModel::dispose(); + mbDisposed = true; + + uno::Reference< container::XNameAccess > xLinks( mxLinks ); + if( xLinks.is() ) + { + uno::Reference< lang::XComponent > xComp( xLinks, uno::UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + + xLinks = nullptr; + } + + uno::Reference< drawing::XDrawPages > xDrawPagesAccess( mxDrawPagesAccess ); + if( xDrawPagesAccess.is() ) + { + uno::Reference< lang::XComponent > xComp( xDrawPagesAccess, uno::UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + + xDrawPagesAccess = nullptr; + } + + uno::Reference< drawing::XDrawPages > xMasterPagesAccess( mxMasterPagesAccess ); + if( xDrawPagesAccess.is() ) + { + uno::Reference< lang::XComponent > xComp( xMasterPagesAccess, uno::UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + + xDrawPagesAccess = nullptr; + } + + uno::Reference< container::XNameAccess > xLayerManager( mxLayerManager ); + if( xLayerManager.is() ) + { + uno::Reference< lang::XComponent > xComp( xLayerManager, uno::UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + + xLayerManager = nullptr; + } + + uno::Reference< container::XNameContainer > xCustomPresentationAccess( mxCustomPresentationAccess ); + if( xCustomPresentationAccess.is() ) + { + uno::Reference< lang::XComponent > xComp( xCustomPresentationAccess, uno::UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + + xCustomPresentationAccess = nullptr; + } + + mxDashTable = nullptr; + mxGradientTable = nullptr; + mxHatchTable = nullptr; + mxBitmapTable = nullptr; + mxTransGradientTable = nullptr; + mxMarkerTable = nullptr; + mxDrawingPool = nullptr; +} + + +SdDrawPagesAccess::SdDrawPagesAccess( SdXImpressDocument& rMyModel ) noexcept +: mpModel( &rMyModel) +{ +} + +SdDrawPagesAccess::~SdDrawPagesAccess() noexcept +{ +} + +// XIndexAccess +sal_Int32 SAL_CALL SdDrawPagesAccess::getCount() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + return mpModel->mpDoc->GetSdPageCount( PageKind::Standard ); +} + +uno::Any SAL_CALL SdDrawPagesAccess::getByIndex( sal_Int32 Index ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + uno::Any aAny; + + if( (Index < 0) || (Index >= mpModel->mpDoc->GetSdPageCount( PageKind::Standard ) ) ) + throw lang::IndexOutOfBoundsException(); + + SdPage* pPage = mpModel->mpDoc->GetSdPage( static_cast(Index), PageKind::Standard ); + if( pPage ) + { + uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY ); + aAny <<= xDrawPage; + } + + return aAny; +} + +// XNameAccess +uno::Any SAL_CALL SdDrawPagesAccess::getByName( const OUString& aName ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + if( !aName.isEmpty() ) + { + const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PageKind::Standard ); + sal_uInt16 nPage; + for( nPage = 0; nPage < nCount; nPage++ ) + { + SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PageKind::Standard ); + if(nullptr == pPage) + continue; + + if( aName == SdDrawPage::getPageApiName( pPage ) ) + { + uno::Any aAny; + uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY ); + aAny <<= xDrawPage; + return aAny; + } + } + } + + throw container::NoSuchElementException(); +} + +uno::Sequence< OUString > SAL_CALL SdDrawPagesAccess::getElementNames() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PageKind::Standard ); + uno::Sequence< OUString > aNames( nCount ); + OUString* pNames = aNames.getArray(); + + sal_uInt16 nPage; + for( nPage = 0; nPage < nCount; nPage++ ) + { + SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PageKind::Standard ); + *pNames++ = SdDrawPage::getPageApiName( pPage ); + } + + return aNames; +} + +sal_Bool SAL_CALL SdDrawPagesAccess::hasByName( const OUString& aName ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PageKind::Standard ); + sal_uInt16 nPage; + for( nPage = 0; nPage < nCount; nPage++ ) + { + SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PageKind::Standard ); + if(nullptr == pPage) + continue; + + if( aName == SdDrawPage::getPageApiName( pPage ) ) + return true; + } + + return false; +} + +// XElementAccess +uno::Type SAL_CALL SdDrawPagesAccess::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdDrawPagesAccess::hasElements() +{ + return getCount() > 0; +} + +// XDrawPages + +/** + * Creates a new page with model at the specified position. + * @returns corresponding SdDrawPage + */ +uno::Reference< drawing::XDrawPage > SAL_CALL SdDrawPagesAccess::insertNewByIndex( sal_Int32 nIndex ) +{ + ::SolarMutexGuard aGuard; + comphelper::ProfileZone aZone("insertNewByIndex"); + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + if( mpModel->mpDoc ) + { + SdPage* pPage = mpModel->InsertSdPage( static_cast(nIndex), false ); + if( pPage ) + { + uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY ); + return xDrawPage; + } + } + uno::Reference< drawing::XDrawPage > xDrawPage; + return xDrawPage; +} + +/** + * Removes the specified SdDrawPage from the model and the internal list. It + * only works, if there is at least one *normal* page in the model after + * removing this page. + */ +void SAL_CALL SdDrawPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel || mpModel->mpDoc == nullptr ) + throw lang::DisposedException(); + + SdDrawDocument& rDoc = *mpModel->mpDoc; + + sal_uInt16 nPageCount = rDoc.GetSdPageCount( PageKind::Standard ); + if( nPageCount > 1 ) + { + // get pPage from xPage and determine the Id (nPos ) afterwards + SdDrawPage* pSvxPage = comphelper::getFromUnoTunnel( xPage ); + if( pSvxPage ) + { + SdPage* pPage = static_cast(pSvxPage->GetSdrPage()); + if(pPage && ( pPage->GetPageKind() == PageKind::Standard ) ) + { + sal_uInt16 nPage = pPage->GetPageNum(); + + SdPage* pNotesPage = static_cast< SdPage* >( rDoc.GetPage( nPage+1 ) ); + + bool bUndo = rDoc.IsUndoEnabled(); + if( bUndo ) + { + // Add undo actions and delete the pages. The order of adding + // the undo actions is important. + rDoc.BegUndo( SdResId( STR_UNDO_DELETEPAGES ) ); + rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage)); + rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage)); + } + + rDoc.RemovePage( nPage ); // the page + rDoc.RemovePage( nPage ); // the notes page + + if( bUndo ) + { + rDoc.EndUndo(); + } + } + } + } + + mpModel->SetModified(); +} + +// XServiceInfo + +OUString SAL_CALL SdDrawPagesAccess::getImplementationName( ) +{ + return "SdDrawPagesAccess"; +} + +sal_Bool SAL_CALL SdDrawPagesAccess::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService(this, ServiceName); +} + +uno::Sequence< OUString > SAL_CALL SdDrawPagesAccess::getSupportedServiceNames( ) +{ + return { "com.sun.star.drawing.DrawPages" }; +} + +// XComponent +void SAL_CALL SdDrawPagesAccess::dispose( ) +{ + mpModel = nullptr; +} + +void SAL_CALL SdDrawPagesAccess::addEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL( "not implemented!" ); +} + +void SAL_CALL SdDrawPagesAccess::removeEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL( "not implemented!" ); +} + + +SdMasterPagesAccess::SdMasterPagesAccess( SdXImpressDocument& rMyModel ) noexcept +: mpModel(&rMyModel) +{ +} + +SdMasterPagesAccess::~SdMasterPagesAccess() noexcept +{ +} + +// XComponent +void SAL_CALL SdMasterPagesAccess::dispose( ) +{ + mpModel = nullptr; +} + +void SAL_CALL SdMasterPagesAccess::addEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL( "not implemented!" ); +} + +void SAL_CALL SdMasterPagesAccess::removeEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL( "not implemented!" ); +} + +// XIndexAccess +sal_Int32 SAL_CALL SdMasterPagesAccess::getCount() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel->mpDoc ) + throw lang::DisposedException(); + + return mpModel->mpDoc->GetMasterSdPageCount(PageKind::Standard); +} + +/** + * Provides a drawing::XDrawPage interface for accessing the Masterpage at the + * specified position in the model. + */ +uno::Any SAL_CALL SdMasterPagesAccess::getByIndex( sal_Int32 Index ) +{ + ::SolarMutexGuard aGuard; + comphelper::ProfileZone aZone("SdMasterPagesAccess::getByIndex"); + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + uno::Any aAny; + + if( (Index < 0) || (Index >= mpModel->mpDoc->GetMasterSdPageCount( PageKind::Standard ) ) ) + throw lang::IndexOutOfBoundsException(); + + SdPage* pPage = mpModel->mpDoc->GetMasterSdPage( static_cast(Index), PageKind::Standard ); + if( pPage ) + { + uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY ); + aAny <<= xDrawPage; + } + + return aAny; +} + +// XElementAccess +uno::Type SAL_CALL SdMasterPagesAccess::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdMasterPagesAccess::hasElements() +{ + return getCount() > 0; +} + +// XDrawPages +uno::Reference< drawing::XDrawPage > SAL_CALL SdMasterPagesAccess::insertNewByIndex( sal_Int32 nInsertPos ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + uno::Reference< drawing::XDrawPage > xDrawPage; + + SdDrawDocument* pDoc = mpModel->mpDoc; + if( pDoc ) + { + // calculate internal index and check for range errors + const sal_Int32 nMPageCount = pDoc->GetMasterPageCount(); + nInsertPos = nInsertPos * 2 + 1; + if( nInsertPos < 0 || nInsertPos > nMPageCount ) + nInsertPos = nMPageCount; + + // now generate a unique name for the new masterpage + const OUString aStdPrefix( SdResId(STR_LAYOUT_DEFAULT_NAME) ); + OUString aPrefix( aStdPrefix ); + + bool bUnique = true; + + std::vector aPageNames; + for (sal_Int32 nMaster = 1; nMaster < nMPageCount; ++nMaster) + { + const SdPage* pPage = static_cast(pDoc->GetMasterPage(static_cast(nMaster))); + if (!pPage) + continue; + aPageNames.push_back(pPage->GetName()); + if (aPageNames.back() == aPrefix) + bUnique = false; + } + + sal_Int32 i = 0; + while (!bUnique) + { + aPrefix = aStdPrefix + " " + OUString::number(++i); + bUnique = std::find(aPageNames.begin(), aPageNames.end(), aPrefix) == aPageNames.end(); + } + + OUString aLayoutName = aPrefix + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE; + + // create styles + static_cast(pDoc->GetStyleSheetPool())->CreateLayoutStyleSheets( aPrefix ); + + // get the first page for initial size and border settings + SdPage* pPage = mpModel->mpDoc->GetSdPage( sal_uInt16(0), PageKind::Standard ); + SdPage* pRefNotesPage = mpModel->mpDoc->GetSdPage( sal_uInt16(0), PageKind::Notes); + + // create and insert new draw masterpage + rtl::Reference pMPage = mpModel->mpDoc->AllocSdPage(true); + pMPage->SetSize( pPage->GetSize() ); + pMPage->SetBorder( pPage->GetLeftBorder(), + pPage->GetUpperBorder(), + pPage->GetRightBorder(), + pPage->GetLowerBorder() ); + pMPage->SetLayoutName( aLayoutName ); + pDoc->InsertMasterPage(pMPage.get(), static_cast(nInsertPos)); + + { + // ensure default MasterPage fill + pMPage->EnsureMasterPageDefaultBackground(); + } + + xDrawPage.set( pMPage->getUnoPage(), uno::UNO_QUERY ); + + // create and insert new notes masterpage + rtl::Reference pMNotesPage = mpModel->mpDoc->AllocSdPage(true); + pMNotesPage->SetSize( pRefNotesPage->GetSize() ); + pMNotesPage->SetPageKind(PageKind::Notes); + pMNotesPage->SetBorder( pRefNotesPage->GetLeftBorder(), + pRefNotesPage->GetUpperBorder(), + pRefNotesPage->GetRightBorder(), + pRefNotesPage->GetLowerBorder() ); + pMNotesPage->SetLayoutName( aLayoutName ); + pDoc->InsertMasterPage(pMNotesPage.get(), static_cast(nInsertPos) + 1); + pMNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, true, true); + mpModel->SetModified(); + } + + return xDrawPage; +} + +/** + * Removes the specified SdMasterPage from the model and the internal list. It + * only works, if there is no *normal* page using this page as MasterPage in + * the model. + */ +void SAL_CALL SdMasterPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage ) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel || mpModel->mpDoc == nullptr ) + throw lang::DisposedException(); + + SdMasterPage* pSdPage = comphelper::getFromUnoTunnel( xPage ); + if(pSdPage == nullptr) + return; + + SdPage* pPage = dynamic_cast< SdPage* > (pSdPage->GetSdrPage()); + + DBG_ASSERT( pPage && pPage->IsMasterPage(), "SdMasterPage is not masterpage?"); + + if( !pPage || !pPage->IsMasterPage() || (mpModel->mpDoc->GetMasterPageUserCount(pPage) > 0)) + return; //Todo: this should be excepted + + // only standard pages can be removed directly + if( pPage->GetPageKind() != PageKind::Standard ) + return; + + sal_uInt16 nPage = pPage->GetPageNum(); + + SdDrawDocument& rDoc = *mpModel->mpDoc; + + SdPage* pNotesPage = static_cast< SdPage* >( rDoc.GetMasterPage( nPage+1 ) ); + + bool bUndo = rDoc.IsUndoEnabled(); + if( bUndo ) + { + // Add undo actions and delete the pages. The order of adding + // the undo actions is important. + rDoc.BegUndo( SdResId( STR_UNDO_DELETEPAGES ) ); + rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage)); + rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage)); + } + + // remove both pages + rDoc.RemoveMasterPage( nPage ); + rDoc.RemoveMasterPage( nPage ); + + if( bUndo ) + { + rDoc.EndUndo(); + } +} + +// XServiceInfo + +OUString SAL_CALL SdMasterPagesAccess::getImplementationName( ) +{ + return "SdMasterPagesAccess"; +} + +sal_Bool SAL_CALL SdMasterPagesAccess::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService(this, ServiceName); +} + +uno::Sequence< OUString > SAL_CALL SdMasterPagesAccess::getSupportedServiceNames( ) +{ + return { "com.sun.star.drawing.MasterPages" }; +} + +SdDocLinkTargets::SdDocLinkTargets(SdXImpressDocument& rMyModel) + : mpModel(&rMyModel) +{ + for (sal_uInt16 i=0; i < SdLinkTargetType::Count; i++) + aNames[i] = SdResId(aTypeResIds[i]); +} + +SdDocLinkTargets::~SdDocLinkTargets() noexcept +{ +} + +// XComponent +void SAL_CALL SdDocLinkTargets::dispose( ) +{ + mpModel = nullptr; +} + +void SAL_CALL SdDocLinkTargets::addEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL( "not implemented!" ); +} + +void SAL_CALL SdDocLinkTargets::removeEventListener( const uno::Reference< lang::XEventListener >& ) +{ + OSL_FAIL( "not implemented!" ); +} + +// XNameAccess +uno::Any SAL_CALL SdDocLinkTargets::getByName( const OUString& aName ) +{ + if (mpModel) + { + for (sal_uInt16 i=0; i < SdLinkTargetType::Count; i++) + if ( aNames[i] == aName ) + return uno::Any(uno::Reference< beans::XPropertySet >(new SdDocLinkTargetType( mpModel, i ))); + } + + throw container::NoSuchElementException(); +} + +uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getElementNames() +{ + uno::Sequence aRet(SdLinkTargetType::Count); + OUString* pArray = aRet.getArray(); + for (sal_uInt16 i=0; i < SdLinkTargetType::Count; i++) + pArray[i] = aNames[i]; + return aRet; +} + +sal_Bool SAL_CALL SdDocLinkTargets::hasByName( const OUString& aName ) +{ + for (const auto & i : aNames) + if ( i == aName ) + return true; + return false; +} + +// container::XElementAccess +uno::Type SAL_CALL SdDocLinkTargets::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdDocLinkTargets::hasElements() +{ + return true; +} + +SdPage* SdDocLinkTarget::FindPage( std::u16string_view rName ) const +{ + SdDrawDocument* pDoc = mpModel->GetDoc(); + if( pDoc == nullptr ) + return nullptr; + + const sal_uInt16 nMaxPages = pDoc->GetPageCount(); + const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount(); + + sal_uInt16 nPage; + SdPage* pPage; + + const bool bDraw = pDoc->GetDocumentType() == DocumentType::Draw; + + // standard pages + for( nPage = 0; nPage < nMaxPages; nPage++ ) + { + pPage = static_cast(pDoc->GetPage( nPage )); + if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) ) + return pPage; + } + + // master pages + for( nPage = 0; nPage < nMaxMasterPages; nPage++ ) + { + pPage = static_cast(pDoc->GetMasterPage( nPage )); + if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) ) + return pPage; + } + + return nullptr; +} + +// XServiceInfo +OUString SAL_CALL SdDocLinkTargets::getImplementationName() +{ + return "SdDocLinkTargets"; +} + +sal_Bool SAL_CALL SdDocLinkTargets::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getSupportedServiceNames() +{ + return { "com.sun.star.document.LinkTargets" }; +} + +SdDocLinkTargetType::SdDocLinkTargetType(SdXImpressDocument* pModel, sal_uInt16 nT) + : mpModel(pModel) + , mnType(nT) +{ + maName = SdResId(aTypeResIds[nT]); +} + +// beans::XPropertySet + +uno::Reference< beans::XPropertySetInfo > SAL_CALL SdDocLinkTargetType::getPropertySetInfo() +{ + static uno::Reference< beans::XPropertySetInfo > aRef;//(new SfxItemPropertySetInfo( lcl_GetLinkTargetMap() )); + return aRef; +} + +void SAL_CALL SdDocLinkTargetType::setPropertyValue(const OUString& /* aPropertyName */, + const uno::Any& /* aValue */) +{ + // everything is read-only +} + +uno::Any SAL_CALL SdDocLinkTargetType::getPropertyValue(const OUString& PropertyName) +{ + uno::Any aRet; + if ( PropertyName == "LinkDisplayName" ) + aRet <<= maName; + + return aRet; +} + +void SAL_CALL SdDocLinkTargetType::addPropertyChangeListener( const OUString&, + const uno::Reference&) +{ OSL_FAIL("not implemented"); } + +void SAL_CALL SdDocLinkTargetType::removePropertyChangeListener( const OUString&, + const uno::Reference&) +{ OSL_FAIL("not implemented"); } + +void SAL_CALL SdDocLinkTargetType::addVetoableChangeListener( const OUString&, + const uno::Reference&) +{ OSL_FAIL("not implemented"); } + +void SAL_CALL SdDocLinkTargetType::removeVetoableChangeListener( const OUString&, + const uno::Reference&) +{ OSL_FAIL("not implemented"); } + +// document::XLinkTargetSupplier + +uno::Reference< container::XNameAccess > SAL_CALL SdDocLinkTargetType::getLinks() +{ + return new SdDocLinkTarget( mpModel, mnType ); +} + +// XServiceInfo +OUString SAL_CALL SdDocLinkTargetType::getImplementationName() +{ + return "SdDocLinkTargetType"; +} + +sal_Bool SAL_CALL SdDocLinkTargetType::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdDocLinkTargetType::getSupportedServiceNames() +{ + return { "com.sun.star.document.LinkTargetSupplier" }; +} + +SdDocLinkTarget::SdDocLinkTarget( SdXImpressDocument* pModel, sal_uInt16 nT ) + : mpModel(pModel) + , mnType(nT) +{ +} + +// container::XNameAccess + +uno::Any SAL_CALL SdDocLinkTarget::getByName(const OUString& aName) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + SdPage* pPage = FindPage( aName ); + + if( pPage == nullptr ) + throw container::NoSuchElementException(); + + uno::Any aAny; + + uno::Reference< beans::XPropertySet > xProps( pPage->getUnoPage(), uno::UNO_QUERY ); + if( xProps.is() ) + aAny <<= xProps; + + return aAny; +} + +uno::Sequence SAL_CALL SdDocLinkTarget::getElementNames() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + SdDrawDocument* pDoc = mpModel->GetDoc(); + if( pDoc == nullptr ) + { + return { }; + } + + if( pDoc->GetDocumentType() == DocumentType::Draw ) + { + const sal_uInt16 nMaxPages = pDoc->GetSdPageCount( PageKind::Standard ); + const sal_uInt16 nMaxMasterPages = pDoc->GetMasterSdPageCount( PageKind::Standard ); + + uno::Sequence< OUString > aSeq( mnType == SdLinkTargetType::Page ? nMaxPages : nMaxMasterPages ); + OUString* pStr = aSeq.getArray(); + + sal_uInt16 nPage; + if (mnType == SdLinkTargetType::Page) + { + // standard pages + for( nPage = 0; nPage < nMaxPages; nPage++ ) + *pStr++ = pDoc->GetSdPage( nPage, PageKind::Standard )->GetName(); + } + else + { + // master pages + for( nPage = 0; nPage < nMaxMasterPages; nPage++ ) + *pStr++ = pDoc->GetMasterSdPage( nPage, PageKind::Standard )->GetName(); + } + return aSeq; + } + else + { + PageKind eKind; + switch (mnType) + { + case SdLinkTargetType::Notes: + eKind = PageKind::Notes; + break; + case SdLinkTargetType::Handout: + eKind = PageKind::Handout; + break; + default: + eKind = PageKind::Standard; + break; + } + const sal_uInt16 nMaxPages = pDoc->GetSdPageCount( eKind ); + const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount(); + + uno::Sequence< OUString > aSeq( mnType == SdLinkTargetType::MasterPage ? nMaxMasterPages : nMaxPages ); + OUString* pStr = aSeq.getArray(); + + sal_uInt16 nPage; + switch (mnType) + { + case SdLinkTargetType::Page: + { + for( nPage = 0; nPage < nMaxPages; nPage++ ) + *pStr++ = pDoc->GetSdPage( nPage, PageKind::Standard )->GetName(); + break; + } + case SdLinkTargetType::Notes: + { + for( nPage = 0; nPage < nMaxPages; nPage++ ) + *pStr++ = pDoc->GetSdPage( nPage, PageKind::Notes )->GetName(); + break; + } + case SdLinkTargetType::Handout: + { + for( nPage = 0; nPage < nMaxPages; nPage++ ) + *pStr++ = pDoc->GetSdPage( nPage, PageKind::Handout )->GetName(); + break; + } + case SdLinkTargetType::MasterPage: + { + for( nPage = 0; nPage < nMaxMasterPages; nPage++ ) + *pStr++ = static_cast(pDoc->GetMasterPage( nPage ))->GetName(); + break; + } + } + return aSeq; + } +} + +sal_Bool SAL_CALL SdDocLinkTarget::hasByName(const OUString& aName) +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + return FindPage( aName ) != nullptr; +} + +// container::XElementAccess + +uno::Type SAL_CALL SdDocLinkTarget::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdDocLinkTarget::hasElements() +{ + ::SolarMutexGuard aGuard; + + if( nullptr == mpModel ) + throw lang::DisposedException(); + + return mpModel->GetDoc() != nullptr; +} + +// XServiceInfo +OUString SAL_CALL SdDocLinkTarget::getImplementationName() +{ + return "SdDocLinkTarget"; +} + +sal_Bool SAL_CALL SdDocLinkTarget::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdDocLinkTarget::getSupportedServiceNames() +{ + return { "com.sun.star.document.LinkTargets" }; +} + +rtl::Reference< SdXImpressDocument > SdXImpressDocument::GetModel( SdDrawDocument const & rDocument ) +{ + rtl::Reference< SdXImpressDocument > xRet; + ::sd::DrawDocShell* pDocShell(rDocument.GetDocSh()); + if( pDocShell ) + { + uno::Reference xModel(pDocShell->GetModel()); + + xRet.set( dynamic_cast< SdXImpressDocument* >( xModel.get() ) ); + } + + return xRet; +} + +void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName ) +{ + rtl::Reference< SdXImpressDocument > xModel( SdXImpressDocument::GetModel( rDocument ) ); + + if( xModel.is() ) + { + uno::Reference< uno::XInterface > xSource( static_cast( xModel.get() ) ); + css::document::EventObject aEvent( xSource, rEventName ); + xModel->notifyEvent(aEvent ); + } +} + +void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName, const uno::Reference< uno::XInterface >& xSource ) +{ + rtl::Reference< SdXImpressDocument > xModel( SdXImpressDocument::GetModel( rDocument ) ); + + if( xModel.is() ) + { + css::document::EventObject aEvent( xSource, rEventName ); + xModel->notifyEvent(aEvent ); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unomodule.cxx b/sd/source/ui/unoidl/unomodule.cxx new file mode 100644 index 0000000000..5ee3cab40d --- /dev/null +++ b/sd/source/ui/unoidl/unomodule.cxx @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include "unomodule.hxx" +#include +#include +#include +#include + +using namespace ::com::sun::star; + + // XNotifyingDispatch +void SAL_CALL SdUnoModule::dispatchWithNotification( const util::URL& aURL, const uno::Sequence< beans::PropertyValue >& aArgs, const uno::Reference< frame::XDispatchResultListener >& xListener ) +{ + // there is no guarantee, that we are holded alive during this method! + // May the outside dispatch container will be updated by a CONTEXT_CHANGED + // asynchronous ... + uno::Reference< uno::XInterface > xThis(static_cast< frame::XNotifyingDispatch* >(this)); + + SolarMutexGuard aGuard; + SdDLL::Init(); + const SfxSlot* pSlot = SD_MOD()->GetInterface()->GetSlot( aURL.Complete ); + + sal_Int16 aState = frame::DispatchResultState::DONTKNOW; + if ( !pSlot ) + aState = frame::DispatchResultState::FAILURE; + else + { + SfxRequest aReq( pSlot, aArgs, SfxCallMode::SYNCHRON, SD_MOD()->GetPool() ); + const SfxPoolItemHolder aResult(SD_MOD()->ExecuteSlot(aReq)); + if (nullptr != aResult.getItem()) + aState = frame::DispatchResultState::SUCCESS; + else + aState = frame::DispatchResultState::FAILURE; + } + + if ( xListener.is() ) + { + xListener->dispatchFinished( + frame::DispatchResultEvent( + xThis, aState, uno::Any())); + } +} + // XDispatch +void SAL_CALL SdUnoModule::dispatch( const util::URL& aURL, const uno::Sequence< beans::PropertyValue >& aArgs ) +{ + dispatchWithNotification(aURL, aArgs, uno::Reference< frame::XDispatchResultListener >()); +} + +void SAL_CALL SdUnoModule::addStatusListener(const uno::Reference< frame::XStatusListener > &, const util::URL&) +{ +} + +void SAL_CALL SdUnoModule::removeStatusListener(const uno::Reference< frame::XStatusListener > &, const util::URL&) +{ +} + +uno::Sequence< uno::Reference< frame::XDispatch > > SAL_CALL SdUnoModule::queryDispatches( const uno::Sequence< frame::DispatchDescriptor >& seqDescripts ) +{ + sal_Int32 nCount = seqDescripts.getLength(); + uno::Sequence< uno::Reference< frame::XDispatch > > lDispatcher( nCount ); + + std::transform(seqDescripts.begin(), seqDescripts.end(), lDispatcher.getArray(), + [this](const frame::DispatchDescriptor& rDescr) -> uno::Reference { + return queryDispatch(rDescr.FeatureURL, rDescr.FrameName, rDescr.SearchFlags); }); + + return lDispatcher; +} + +// XDispatchProvider +uno::Reference< frame::XDispatch > SAL_CALL SdUnoModule::queryDispatch( const util::URL& aURL, const OUString&, sal_Int32 ) +{ + SolarMutexGuard aGuard; + SdDLL::Init(); + const SfxSlot* pSlot = SD_MOD()->GetInterface()->GetSlot( aURL.Complete ); + + uno::Reference< frame::XDispatch > xSlot; + if ( pSlot ) + xSlot = this; + + return xSlot; +} + +// XServiceInfo +OUString SAL_CALL SdUnoModule::getImplementationName( ) +{ + return "com.sun.star.comp.Draw.DrawingModule"; +} + +sal_Bool SAL_CALL SdUnoModule::supportsService( const OUString& sServiceName ) +{ + return cppu::supportsService(this, sServiceName); +} + +uno::Sequence< OUString > SAL_CALL SdUnoModule::getSupportedServiceNames( ) +{ + return { "com.sun.star.drawing.ModuleDispatcher" }; +} + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +com_sun_star_comp_Draw_DrawingModule_get_implementation(css::uno::XComponentContext* , + css::uno::Sequence const &) +{ + SolarMutexGuard aGuard; + + return cppu::acquire(new SdUnoModule); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unomodule.hxx b/sd/source/ui/unoidl/unomodule.hxx new file mode 100644 index 0000000000..bc78c6b197 --- /dev/null +++ b/sd/source/ui/unoidl/unomodule.hxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace com::sun::star::beans { struct PropertyValue; } +namespace com::sun::star::frame { struct DispatchDescriptor; } + +class SdUnoModule : public ::cppu::WeakImplHelper< css::frame::XDispatchProvider, css::frame::XNotifyingDispatch, css::lang::XServiceInfo > +{ +public: + SdUnoModule() {} + + // XnotifyingDispatch + virtual void SAL_CALL dispatchWithNotification( const css::util::URL& URL, const css::uno::Sequence< css::beans::PropertyValue >& Arguments, const css::uno::Reference< css::frame::XDispatchResultListener >& Listener ) override; + + // XDispatch + virtual void SAL_CALL dispatch( const css::util::URL& aURL, const css::uno::Sequence< css::beans::PropertyValue >& aArgs ) override; + virtual void SAL_CALL addStatusListener(const css::uno::Reference< css::frame::XStatusListener > & xControl, const css::util::URL& aURL) override; + virtual void SAL_CALL removeStatusListener(const css::uno::Reference< css::frame::XStatusListener > & xControl, const css::util::URL& aURL) override; + + // XDispatchProvider + virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& seqDescriptor ) override ; + virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch( const css::util::URL & aURL , + const OUString & sTargetFrameName, + sal_Int32 eSearchFlags ) override; + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unoobj.cxx b/sd/source/ui/unoidl/unoobj.cxx new file mode 100644 index 0000000000..d86ffed7c5 --- /dev/null +++ b/sd/source/ui/unoidl/unoobj.cxx @@ -0,0 +1,1618 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "unoobj.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::sd; +using namespace ::com::sun::star; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::animations; + +using ::com::sun::star::uno::Any; +using ::com::sun::star::drawing::XShape; + +#define WID_EFFECT 1 +#define WID_SPEED 2 +#define WID_TEXTEFFECT 3 +#define WID_BOOKMARK 4 +#define WID_CLICKACTION 5 +#define WID_PLAYFULL 6 +#define WID_SOUNDFILE 7 +#define WID_SOUNDON 8 +#define WID_BLUESCREEN 9 +#define WID_VERB 10 +#define WID_DIMCOLOR 11 +#define WID_DIMHIDE 12 +#define WID_DIMPREV 13 +#define WID_PRESORDER 14 +#define WID_STYLE 15 +#define WID_ANIMPATH 16 +#define WID_IMAGEMAP 17 +#define WID_ISANIMATION 18 + +#define WID_ISEMPTYPRESOBJ 20 +#define WID_ISPRESOBJ 21 +#define WID_MASTERDEPEND 22 + +#define WID_NAVORDER 23 +#define WID_PLACEHOLDERTEXT 24 +#define WID_LEGACYFRAGMENT 25 + +#define IMPRESS_MAP_ENTRIES \ + { u"" UNO_NAME_OBJ_LEGACYFRAGMENT ""_ustr,WID_LEGACYFRAGMENT, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_ANIMATIONPATH ""_ustr, WID_ANIMPATH, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_BOOKMARK ""_ustr, WID_BOOKMARK, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_DIMCOLOR ""_ustr, WID_DIMCOLOR, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_DIMHIDE ""_ustr, WID_DIMHIDE, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_DIMPREV ""_ustr, WID_DIMPREV, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_EFFECT ""_ustr, WID_EFFECT, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_ISEMPTYPRESOBJ ""_ustr,WID_ISEMPTYPRESOBJ, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_ISPRESOBJ ""_ustr, WID_ISPRESOBJ, cppu::UnoType::get(), css::beans::PropertyAttribute::READONLY, 0},\ + { u"" UNO_NAME_OBJ_MASTERDEPENDENT ""_ustr,WID_MASTERDEPEND, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_CLICKACTION ""_ustr, WID_CLICKACTION, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_PLAYFULL ""_ustr, WID_PLAYFULL, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_PRESORDER ""_ustr, WID_PRESORDER, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_STYLE ""_ustr, WID_STYLE, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},\ + { u"" UNO_NAME_OBJ_SOUNDFILE ""_ustr, WID_SOUNDFILE, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_SOUNDON ""_ustr, WID_SOUNDON, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_SPEED ""_ustr, WID_SPEED, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_TEXTEFFECT ""_ustr, WID_TEXTEFFECT, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_BLUESCREEN ""_ustr, WID_BLUESCREEN, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_VERB ""_ustr, WID_VERB, cppu::UnoType::get(), 0, 0},\ + { u"IsAnimation"_ustr, WID_ISANIMATION, cppu::UnoType::get(), 0, 0},\ + { u"NavigationOrder"_ustr, WID_NAVORDER, cppu::UnoType::get(), 0, 0},\ + { u"PlaceholderText"_ustr, WID_PLACEHOLDERTEXT, cppu::UnoType::get(), 0, 0},\ + + static std::span lcl_GetImpress_SdXShapePropertyGraphicMap_Impl() + { + static const SfxItemPropertyMapEntry aImpress_SdXShapePropertyGraphicMap_Impl[] = + { + { u"ImageMap"_ustr, WID_IMAGEMAP, cppu::UnoType::get(), 0, 0 }, + IMPRESS_MAP_ENTRIES + }; + return aImpress_SdXShapePropertyGraphicMap_Impl; + } + + static std::span lcl_GetImpress_SdXShapePropertySimpleMap_Impl() + { + static const SfxItemPropertyMapEntry aImpress_SdXShapePropertySimpleMap_Impl[] = + { + IMPRESS_MAP_ENTRIES + }; + return aImpress_SdXShapePropertySimpleMap_Impl; + } + + #define DRAW_MAP_ENTRIES\ + { u"" UNO_NAME_OBJ_BOOKMARK ""_ustr, WID_BOOKMARK, cppu::UnoType::get(), 0, 0},\ + { u"" UNO_NAME_OBJ_CLICKACTION ""_ustr, WID_CLICKACTION, cppu::UnoType::get(),0, 0},\ + { u"" UNO_NAME_OBJ_STYLE ""_ustr, WID_STYLE, cppu::UnoType::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},\ + { u"NavigationOrder"_ustr, WID_NAVORDER, cppu::UnoType::get(), 0, 0},\ + + static std::span lcl_GetDraw_SdXShapePropertySimpleMap_Impl() + { + static const SfxItemPropertyMapEntry aDraw_SdXShapePropertyMap_Impl[] = + { + DRAW_MAP_ENTRIES + }; + return aDraw_SdXShapePropertyMap_Impl; + } + static std::span lcl_GetDraw_SdXShapePropertyGraphicMap_Impl() + { + static const SfxItemPropertyMapEntry aDraw_SdXShapePropertyGraphicMap_Impl[] = + { + { u"ImageMap"_ustr, WID_IMAGEMAP, cppu::UnoType::get(), 0, 0 }, + DRAW_MAP_ENTRIES + }; + return aDraw_SdXShapePropertyGraphicMap_Impl; + } + static std::span lcl_ImplGetShapePropertyMap( bool bImpress, bool bGraphicObj ) + { + std::span pRet; + if( bImpress ) + { + if( bGraphicObj ) + pRet = lcl_GetImpress_SdXShapePropertyGraphicMap_Impl(); + else + pRet = lcl_GetImpress_SdXShapePropertySimpleMap_Impl(); + } + else + { + if( bGraphicObj ) + pRet = lcl_GetDraw_SdXShapePropertyGraphicMap_Impl(); + else + pRet = lcl_GetDraw_SdXShapePropertySimpleMap_Impl(); + } + return pRet; + + } + static const SvxItemPropertySet* lcl_ImplGetShapePropertySet( bool bImpress, bool bGraphicObj ) + { + const SvxItemPropertySet* pRet = nullptr; + if( bImpress ) + { + if( bGraphicObj ) + { + static SvxItemPropertySet aImpress_SdXShapePropertyGraphicSet_Impl( lcl_GetImpress_SdXShapePropertyGraphicMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool()); + pRet = &aImpress_SdXShapePropertyGraphicSet_Impl; + } + else + { + static SvxItemPropertySet aImpress_SdXShapePropertySet_Impl(lcl_GetImpress_SdXShapePropertySimpleMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool()); + pRet = &aImpress_SdXShapePropertySet_Impl; + } + } + else + { + if( bGraphicObj ) + { + static SvxItemPropertySet aDraw_SdXShapePropertyGraphicSet_Impl(lcl_GetDraw_SdXShapePropertyGraphicMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool()); + pRet = &aDraw_SdXShapePropertyGraphicSet_Impl; + } + else + { + static SvxItemPropertySet aDraw_SdXShapePropertySet_Impl( lcl_GetDraw_SdXShapePropertySimpleMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool()); + pRet = &aDraw_SdXShapePropertySet_Impl; + } + } + return pRet; + } + static std::span lcl_GetEmpty_SdXShapePropertyMap_Impl() + { + return {}; + } + + static const SvxItemPropertySet* lcl_GetEmpty_SdXShapePropertySet_Impl() + { + static SvxItemPropertySet aEmptyPropSet( lcl_GetEmpty_SdXShapePropertyMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool() ); + return &aEmptyPropSet; + } +const SvEventDescription* ImplGetSupportedMacroItems() +{ + static const SvEventDescription aMacroDescriptionsImpl[] = + { + { SvMacroItemId::OnMouseOver, "OnMouseOver" }, + { SvMacroItemId::OnMouseOut, "OnMouseOut" }, + { SvMacroItemId::NONE, nullptr } + }; + + return aMacroDescriptionsImpl; +} + +SdXShape::SdXShape(SvxShape* pShape, SdXImpressDocument* pModel) +: mpShape( pShape ), + mpPropSet( pModel? + lcl_ImplGetShapePropertySet(pModel->IsImpressDocument(), pShape->getShapeKind() == SdrObjKind::Graphic ) + : lcl_GetEmpty_SdXShapePropertySet_Impl() ), + mpMap( pModel? + lcl_ImplGetShapePropertyMap(pModel->IsImpressDocument(), pShape->getShapeKind() == SdrObjKind::Graphic ) + : lcl_GetEmpty_SdXShapePropertyMap_Impl() ), + mpModel(pModel) +{ + + pShape->setMaster( this ); +} + +SdXShape::~SdXShape() noexcept +{ +} + +void SdXShape::dispose() +{ + mpShape->setMaster( nullptr ); + delete this; +} + +uno::Any SAL_CALL SdXShape::queryInterface( const uno::Type & rType ) +{ + return mpShape->queryInterface( rType ); +} + +void SAL_CALL SdXShape::acquire() noexcept +{ + mpShape->acquire(); +} + +void SAL_CALL SdXShape::release() noexcept +{ + mpShape->release(); +} + +bool SdXShape::queryAggregation( const css::uno::Type & rType, css::uno::Any& aAny ) +{ + if( mpModel && mpModel ->IsImpressDocument() ) + { + if( rType == cppu::UnoType::get()) + { + aAny <<= uno::Reference< document::XEventsSupplier >(this); + return true; + } + } + + return false; +} + +uno::Sequence< uno::Type > SAL_CALL SdXShape::getTypes() +{ + if( mpModel && !mpModel->IsImpressDocument() ) + { + return mpShape->_getTypes(); + } + else + { + SdrObjKind nObjId = mpShape->getShapeKind(); + uno::Sequence< uno::Type > aTypes; + SdTypesCache& gImplTypesCache = SD_MOD()->gImplTypesCache; + SdTypesCache::iterator aIter( gImplTypesCache.find( nObjId ) ); + if( aIter == gImplTypesCache.end() ) + { + aTypes = mpShape->_getTypes(); + sal_uInt32 nCount = aTypes.getLength(); + aTypes.realloc( nCount+1 ); + aTypes.getArray()[nCount] = cppu::UnoType::get(); + + gImplTypesCache.insert(std::make_pair(nObjId, aTypes)); + } + else + { + // use the already computed implementation id + aTypes = (*aIter).second; + } + return aTypes; + } +} + +// XPropertyState +beans::PropertyState SAL_CALL SdXShape::getPropertyState( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + if( mpPropSet->getPropertyMapEntry(PropertyName) ) + { + return beans::PropertyState_DIRECT_VALUE; + } + else + { + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj == nullptr || ( pObj->getSdrPageFromSdrObject()->IsMasterPage() && pObj->IsEmptyPresObj() ) ) + return beans::PropertyState_DEFAULT_VALUE; + + return mpShape->_getPropertyState( PropertyName ); + } +} + +void SAL_CALL SdXShape::setPropertyToDefault( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + if( mpPropSet->getPropertyMapEntry(PropertyName) ) + { + return; + } + else + { + mpShape->_setPropertyToDefault(PropertyName); + } +} + +uno::Any SAL_CALL SdXShape::getPropertyDefault( const OUString& aPropertyName ) +{ + SolarMutexGuard aGuard; + + if( mpPropSet->getPropertyMapEntry(aPropertyName) ) + { + return getPropertyValue( aPropertyName ); + } + else + { + uno::Any aRet( mpShape->_getPropertyDefault(aPropertyName) ); + return aRet; + } +} + +//XPropertySet +css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL SdXShape::getPropertySetInfo() +{ + std::span nObjId = mpShape->getPropertyMapEntries(); + css::uno::Reference pInfo; + + SdExtPropertySetInfoCache& rCache = (mpModel && mpModel->IsImpressDocument()) ? + SD_MOD()->gImplImpressPropertySetInfoCache : SD_MOD()->gImplDrawPropertySetInfoCache; + + SdExtPropertySetInfoCache::iterator aIter( rCache.find( nObjId ) ); + if( aIter == rCache.end() ) + { + uno::Reference< beans::XPropertySetInfo > xInfo( mpShape->_getPropertySetInfo() ); + pInfo = new SfxExtItemPropertySetInfo( mpMap, xInfo->getProperties() ); + + rCache.insert(std::make_pair(nObjId, pInfo)); + } + else + { + // use the already computed implementation id + pInfo = (*aIter).second; + } + + return pInfo; +} + +void SAL_CALL SdXShape::setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) +{ + SolarMutexGuard aGuard; + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName); + + if( pEntry ) + { + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj ) + { + switch(pEntry->nWID) + { + case WID_NAVORDER: + { + sal_Int32 nNavOrder = 0; + if(!(aValue >>= nNavOrder)) + throw lang::IllegalArgumentException(); + + SdrObjList* pObjList = pObj->getParentSdrObjListFromSdrObject(); + if( pObjList ) + pObjList->SetObjectNavigationPosition( *pObj, (nNavOrder < 0) ? SAL_MAX_UINT32 : static_cast< sal_uInt32 >( nNavOrder ) ); + break; + } + + case WID_EFFECT: + { + AnimationEffect eEffect; + if(!(aValue >>= eEffect)) + throw lang::IllegalArgumentException(); + + EffectMigration::SetAnimationEffect( mpShape, eEffect ); + break; + } + case WID_TEXTEFFECT: + { + AnimationEffect eEffect; + if(!(aValue >>= eEffect)) + throw lang::IllegalArgumentException(); + + EffectMigration::SetTextAnimationEffect( mpShape, eEffect ); + break; + } + case WID_SPEED: + { + AnimationSpeed eSpeed; + if(!(aValue>>=eSpeed)) + throw lang::IllegalArgumentException(); + + EffectMigration::SetAnimationSpeed( mpShape, eSpeed ); + break; + } + case WID_ISANIMATION: + { + bool bIsAnimation(false); + + if(!(aValue >>= bIsAnimation)) + { + throw lang::IllegalArgumentException(); + } + + if(bIsAnimation) + { + SdrObjGroup* pGroup = dynamic_cast< SdrObjGroup* >(pObj); + SdPage* pPage = pGroup ? dynamic_cast< SdPage* >(pGroup->getSdrPageFromSdrObject()) : nullptr; + + if (pPage) + { + // #i42894# Animated Group object, migrate that effect + EffectMigration::CreateAnimatedGroup(*pGroup, *pPage); + + // #i42894# unfortunately when doing this all group members have to + // be moved to the page as direct members, else the currently + // available forms of animation do not work. If it succeeds, + // the group is empty and can be removed and deleted + if(!pGroup->GetSubList()->GetObjCount()) + { + pPage->NbcRemoveObject(pGroup->GetOrdNum()); + } + } + } + //pInfo->mbIsMovie = bIsAnimation; + break; + } + case WID_BOOKMARK: + { + OUString aString; + if(!(aValue >>= aString)) + throw lang::IllegalArgumentException(); + + SdAnimationInfo* pInfo = GetAnimationInfo(true); + pInfo->SetBookmark( SdDrawPage::getUiNameFromPageApiName( aString ) ); + break; + } + case WID_CLICKACTION: + { + SdAnimationInfo* pInfo = GetAnimationInfo(true); + ::cppu::any2enum< presentation::ClickAction >( pInfo->meClickAction, aValue); + break; + } +// TODO: WID_PLAYFULL: + case WID_SOUNDFILE: + { + OUString aString; + if(!(aValue >>= aString)) + throw lang::IllegalArgumentException(); + SdAnimationInfo* pInfo = GetAnimationInfo(true); + pInfo->maSoundFile = aString; + EffectMigration::UpdateSoundEffect( mpShape, pInfo ); + break; + } + + case WID_SOUNDON: + { + SdAnimationInfo* pInfo = GetAnimationInfo(true); + if( !(aValue >>= pInfo->mbSoundOn) ) + throw lang::IllegalArgumentException(); + EffectMigration::UpdateSoundEffect( mpShape, pInfo ); + break; + } + case WID_VERB: + { + sal_Int32 nVerb = 0; + if(!(aValue >>= nVerb)) + throw lang::IllegalArgumentException(); + + SdAnimationInfo* pInfo = GetAnimationInfo(true); + pInfo->mnVerb = static_cast(nVerb); + break; + } + case WID_DIMCOLOR: + { + sal_Int32 nColor = 0; + + if( !(aValue >>= nColor) ) + throw lang::IllegalArgumentException(); + + EffectMigration::SetDimColor( mpShape, nColor ); + break; + } + case WID_DIMHIDE: + { + bool bDimHide = false; + if( !(aValue >>= bDimHide) ) + throw lang::IllegalArgumentException(); + + EffectMigration::SetDimHide( mpShape, bDimHide ); + break; + } + case WID_DIMPREV: + { + bool bDimPrevious = false; + if( !(aValue >>= bDimPrevious) ) + throw lang::IllegalArgumentException(); + + EffectMigration::SetDimPrevious( mpShape, bDimPrevious ); + break; + } + case WID_PRESORDER: + { + sal_Int32 nNewPos = 0; + if( !(aValue >>= nNewPos) ) + throw lang::IllegalArgumentException(); + + EffectMigration::SetPresentationOrder( mpShape, nNewPos ); + break; + } + case WID_STYLE: + SetStyleSheet( aValue ); + break; + case WID_ISEMPTYPRESOBJ: + SetEmptyPresObj( ::cppu::any2bool(aValue) ); + break; + case WID_MASTERDEPEND: + SetMasterDepend( ::cppu::any2bool(aValue) ); + break; + + case WID_LEGACYFRAGMENT: + { + uno::Reference< io::XInputStream > xInputStream; + aValue >>= xInputStream; + if( xInputStream.is() ) + { + SvInputStream aStream( xInputStream ); + SdrObject* pObject = mpShape->GetSdrObject(); + SvxMSDffManager::ReadObjText( aStream, pObject ); + } + } + break; + + case WID_ANIMPATH: + { + uno::Reference< drawing::XShape > xShape( aValue, uno::UNO_QUERY ); + SdrPathObj* pObj2 = xShape.is() ? dynamic_cast(SdrObject::getSdrObjectFromXShape(xShape)) : nullptr; + + if( pObj2 == nullptr ) + throw lang::IllegalArgumentException(); + + EffectMigration::SetAnimationPath( mpShape, pObj2 ); + break; + } + case WID_IMAGEMAP: + { + SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():nullptr; + if( pDoc ) + { + ImageMap aImageMap; + uno::Reference< uno::XInterface > xImageMap; + aValue >>= xImageMap; + + if( !xImageMap.is() || !SvUnoImageMap_fillImageMap( xImageMap, aImageMap ) ) + throw lang::IllegalArgumentException(); + + SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo(pObj); + if( pIMapInfo ) + { + // replace existing image map + pIMapInfo->SetImageMap( aImageMap ); + } + else + { + // insert new user data with image map + pObj->AppendUserData(std::unique_ptr(new SvxIMapInfo(aImageMap) )); + } + } + } + break; + } + } + } + else + { + mpShape->_setPropertyValue(aPropertyName, aValue); + } + + if( mpModel ) + mpModel->SetModified(); +} + +css::uno::Any SAL_CALL SdXShape::getPropertyValue( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + uno::Any aRet; + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName); + + if( pEntry && mpShape->GetSdrObject() ) + { + SdAnimationInfo* pInfo = GetAnimationInfo(); + + switch(pEntry->nWID) + { + case WID_NAVORDER: + { + const sal_uInt32 nNavOrder = mpShape->GetSdrObject()->GetNavigationPosition(); + aRet <<= nNavOrder == SAL_MAX_UINT32 ? static_cast(-1) : static_cast< sal_Int32 >(nNavOrder); + } + break; + case WID_EFFECT: + aRet <<= EffectMigration::GetAnimationEffect( mpShape ); + break; + case WID_TEXTEFFECT: + aRet <<= EffectMigration::GetTextAnimationEffect( mpShape ); + break; + case WID_ISPRESOBJ: + aRet <<= IsPresObj(); + break; + case WID_ISEMPTYPRESOBJ: + aRet <<= IsEmptyPresObj(); + break; + case WID_MASTERDEPEND: + aRet <<= IsMasterDepend(); + break; + case WID_SPEED: + aRet <<= EffectMigration::GetAnimationSpeed( mpShape ); + break; + case WID_ISANIMATION: + aRet <<= (pInfo && pInfo->mbIsMovie); + break; + case WID_PLACEHOLDERTEXT: + aRet <<= GetPlaceholderText(); + break; + case WID_BOOKMARK: + { + OUString aString; + SdDrawDocument* pDoc = mpModel ? mpModel->GetDoc() : nullptr; + if (pInfo && pDoc) + { + // is the bookmark a page? + bool bIsMasterPage; + if(pDoc->GetPageByName( pInfo->GetBookmark(), bIsMasterPage ) != SDRPAGE_NOTFOUND) + { + aString = SdDrawPage::getPageApiNameFromUiName( pInfo->GetBookmark() ); + } + else + { + aString = pInfo->GetBookmark() ; + sal_Int32 nPos = aString.lastIndexOf( '#' ); + if( nPos >= 0 ) + { + OUString aURL( aString.copy( 0, nPos+1 ) ); + OUString aName( aString.copy( nPos+1 ) ); + if(pDoc->GetPageByName( aName, bIsMasterPage ) != SDRPAGE_NOTFOUND) + { + aURL += SdDrawPage::getPageApiNameFromUiName( aName ); + aString = aURL; + } + } + } + } + + aRet <<= aString; + break; + } + case WID_CLICKACTION: + aRet <<= ( pInfo?pInfo->meClickAction:presentation::ClickAction_NONE ); + break; + case WID_PLAYFULL: + aRet <<= ( pInfo && pInfo->mbPlayFull ); + break; + case WID_SOUNDFILE: + aRet <<= EffectMigration::GetSoundFile( mpShape ); + break; + case WID_SOUNDON: + aRet <<= EffectMigration::GetSoundOn( mpShape ); + break; + case WID_BLUESCREEN: + aRet <<= pInfo ? pInfo->maBlueScreen : Color(0x00ffffff); + break; + case WID_VERB: + aRet <<= static_cast( pInfo?pInfo->mnVerb:0 ); + break; + case WID_DIMCOLOR: + aRet <<= EffectMigration::GetDimColor( mpShape ); + break; + case WID_DIMHIDE: + aRet <<= EffectMigration::GetDimHide( mpShape ); + break; + case WID_DIMPREV: + aRet <<= EffectMigration::GetDimPrevious( mpShape ); + break; + case WID_PRESORDER: + aRet <<= EffectMigration::GetPresentationOrder( mpShape ); + break; + case WID_STYLE: + aRet = GetStyleSheet(); + break; + case WID_IMAGEMAP: + { + uno::Reference< uno::XInterface > xImageMap; + + SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():nullptr; + if( pDoc ) + { + + SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo(mpShape->GetSdrObject()); + if( pIMapInfo ) + { + const ImageMap& rIMap = pIMapInfo->GetImageMap(); + xImageMap = SvUnoImageMap_createInstance( rIMap, ImplGetSupportedMacroItems() ); + } + else + { + xImageMap = SvUnoImageMap_createInstance(); + } + } + + aRet <<= uno::Reference< container::XIndexContainer >::query( xImageMap ); + break; + } + } + } + else + { + aRet = mpShape->_getPropertyValue(PropertyName); + } + + return aRet; +} + +/** */ +SdAnimationInfo* SdXShape::GetAnimationInfo( bool bCreate ) const +{ + SdAnimationInfo* pInfo = nullptr; + + SdrObject* pObj = mpShape->GetSdrObject(); + if(pObj) + pInfo = SdDrawDocument::GetShapeUserData(*pObj, bCreate); + + return pInfo; +} + +uno::Sequence< OUString > SAL_CALL SdXShape::getSupportedServiceNames() +{ + std::vector aAdd{ u"com.sun.star.presentation.Shape", + u"com.sun.star.document.LinkTarget" }; + + SdrObject* pObj = mpShape->GetSdrObject(); + if(pObj && pObj->GetObjInventor() == SdrInventor::Default ) + { + SdrObjKind nInventor = pObj->GetObjIdentifier(); + switch( nInventor ) + { + case SdrObjKind::TitleText: + aAdd.emplace_back(u"com.sun.star.presentation.TitleTextShape"); + break; + case SdrObjKind::OutlineText: + aAdd.emplace_back(u"com.sun.star.presentation.OutlinerShape"); + break; + default: ; + } + } + return comphelper::concatSequences(mpShape->_getSupportedServiceNames(), aAdd); +} + +/** checks if this is a presentation object + */ +bool SdXShape::IsPresObj() const +{ + SdrObject* pObj = mpShape->GetSdrObject(); + if(pObj) + { + SdPage* pPage = dynamic_cast(pObj->getSdrPageFromSdrObject()); + if(pPage) + return pPage->GetPresObjKind(pObj) != PresObjKind::NONE; + } + return false; +} + +/** checks if this presentation object is empty + */ +bool SdXShape::IsEmptyPresObj() const +{ + SdrObject* pObj = mpShape->GetSdrObject(); + if( (pObj != nullptr) && pObj->IsEmptyPresObj() ) + { + // check if the object is in edit, then if it's temporarily not empty + SdrTextObj* pTextObj = DynCastSdrTextObj( pObj ); + if( pTextObj == nullptr ) + return true; + + return !pTextObj->CanCreateEditOutlinerParaObject(); + } + + return false; +} + +OUString SdXShape::GetPlaceholderText() const +{ + // only possible if this actually *is* a presentation object + if( !IsPresObj() ) + return OUString(); + + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj == nullptr ) + return OUString(); + + SdPage* pPage = dynamic_cast< SdPage* >(pObj->getSdrPageFromSdrObject()); + DBG_ASSERT( pPage, "no page?" ); + if( pPage == nullptr ) + return OUString(); + + return pPage->GetPresObjText( pPage->GetPresObjKind(pObj) ); +} + +/** sets/reset the empty status of a presentation object +*/ +void SdXShape::SetEmptyPresObj(bool bEmpty) +{ + // only possible if this actually *is* a presentation object + if( !IsPresObj() ) + return; + + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj == nullptr ) + return; + + if( pObj->IsEmptyPresObj() == bEmpty ) + return; + + if(!bEmpty) + { + OutlinerParaObject* pOutlinerParaObject = pObj->GetOutlinerParaObject(); + const bool bVertical = pOutlinerParaObject && pOutlinerParaObject->IsEffectivelyVertical(); + + // really delete SdrOutlinerObj at pObj + pObj->NbcSetOutlinerParaObject(std::nullopt); + if( bVertical ) + if (auto pTextObj = DynCastSdrTextObj( pObj ) ) + pTextObj->SetVerticalWriting( true ); + + SdrGrafObj* pGraphicObj = dynamic_cast( pObj ); + if( pGraphicObj ) + { + Graphic aEmpty; + pGraphicObj->SetGraphic(aEmpty); + } + else + { + SdrOle2Obj* pOleObj = dynamic_cast< SdrOle2Obj* >( pObj ); + if( pOleObj ) + { + pOleObj->ClearGraphic(); + } + } + } + else + { + // now set an empty OutlinerParaObject at pObj without + // any content but with the style of the old OutlinerParaObjects + // first paragraph + do + { + SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():nullptr; + DBG_ASSERT( pDoc, "no document?" ); + if( pDoc == nullptr) + break; + + SdOutliner* pOutliner = pDoc->GetInternalOutliner(); + DBG_ASSERT( pOutliner, "no outliner?" ); + if( pOutliner == nullptr ) + break; + + SdPage* pPage = dynamic_cast< SdPage* >(pObj->getSdrPageFromSdrObject()); + DBG_ASSERT( pPage, "no page?" ); + if( pPage == nullptr ) + break; + + OutlinerParaObject* pOutlinerParaObject = pObj->GetOutlinerParaObject(); + pOutliner->SetText( *pOutlinerParaObject ); + const bool bVertical = pOutliner->IsVertical(); + + pOutliner->Clear(); + pOutliner->SetVertical( bVertical ); + pOutliner->SetStyleSheetPool( static_cast(pDoc->GetStyleSheetPool()) ); + pOutliner->SetStyleSheet( 0, pPage->GetTextStyleSheetForObject( pObj ) ); + pOutliner->Insert( pPage->GetPresObjText( pPage->GetPresObjKind(pObj) ) ); + pObj->SetOutlinerParaObject( pOutliner->CreateParaObject() ); + pOutliner->Clear(); + } + while(false); + } + + pObj->SetEmptyPresObj(bEmpty); +} + +bool SdXShape::IsMasterDepend() const noexcept +{ + SdrObject* pObj = mpShape->GetSdrObject(); + return pObj && pObj->GetUserCall() != nullptr; +} + +void SdXShape::SetMasterDepend( bool bDepend ) noexcept +{ + if( IsMasterDepend() == bDepend ) + return; + + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj ) + { + if( bDepend ) + { + SdPage* pPage = dynamic_cast< SdPage* >(pObj->getSdrPageFromSdrObject()); + pObj->SetUserCall( pPage ); + } + else + { + pObj->SetUserCall( nullptr ); + } + } +} + +void SdXShape::SetStyleSheet( const uno::Any& rAny ) +{ + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj == nullptr ) + throw beans::UnknownPropertyException(); + + uno::Reference< style::XStyle > xStyle( rAny, uno::UNO_QUERY ); + SfxStyleSheet* pStyleSheet = SfxUnoStyleSheet::getUnoStyleSheet( xStyle ); + + const SfxStyleSheet* pOldStyleSheet = pObj->GetStyleSheet(); + if( pOldStyleSheet == pStyleSheet ) + return; + + if( pStyleSheet == nullptr || (pStyleSheet->GetFamily() != SfxStyleFamily::Para && pStyleSheet->GetFamily() != SfxStyleFamily::Page) ) + throw lang::IllegalArgumentException(); + + pObj->SetStyleSheet( pStyleSheet, false ); + + SdDrawDocument* pDoc = mpModel? mpModel->GetDoc() : nullptr; + if( pDoc ) + { + ::sd::DrawDocShell* pDocSh = pDoc->GetDocSh(); + ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : nullptr; + + if( pViewSh ) + pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 ); + } +} + +uno::Any SdXShape::GetStyleSheet() const +{ + SdrObject* pObj = mpShape->GetSdrObject(); + if( pObj == nullptr ) + throw beans::UnknownPropertyException(); + + SfxStyleSheet* pStyleSheet = pObj->GetStyleSheet(); + // it is possible for shapes inside a draw to have a presentation style + // but we don't want this for the api + if( (pStyleSheet == nullptr) || ((pStyleSheet->GetFamily() != SfxStyleFamily::Para) && !mpModel->IsImpressDocument()) ) + return Any(); + + return Any( uno::Reference< style::XStyle >( dynamic_cast< SfxUnoStyleSheet* >( pStyleSheet ) ) ); +} + +class SdUnoEventsAccess : public cppu::WeakImplHelper< css::container::XNameReplace, css::lang::XServiceInfo > +{ +private: + SdXShape* mpShape; + +public: + explicit SdUnoEventsAccess(SdXShape* pShape) noexcept; + + // XNameReplace + virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override; + + // XNameAccess + virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getElementNames( ) override; + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType( ) override; + virtual sal_Bool SAL_CALL hasElements( ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; +}; + +// XEventsSupplier +uno::Reference< container::XNameReplace > SAL_CALL SdXShape::getEvents( ) +{ + return new SdUnoEventsAccess( this ); +} + +constexpr OUString gaStrOnClick( u"OnClick"_ustr ); +constexpr OUString gaStrServiceName( u"com.sun.star.documents.Events"_ustr ); +constexpr OUString gaStrEventType( u"EventType"_ustr ); +constexpr OUString gaStrPresentation( u"Presentation"_ustr ); +constexpr OUString gaStrLibrary(u"Library"_ustr); +constexpr OUString gaStrMacroName(u"MacroName"_ustr); +constexpr OUString gaStrClickAction( u"ClickAction"_ustr ); +constexpr OUString gaStrBookmark( u"Bookmark"_ustr ); +constexpr OUString gaStrEffect( u"Effect"_ustr ); +constexpr OUString gaStrPlayFull( u"PlayFull"_ustr ); +constexpr OUString gaStrVerb( u"Verb"_ustr ); +constexpr OUString gaStrSoundURL( u"SoundURL"_ustr ); +constexpr OUString gaStrSpeed( u"Speed"_ustr ); +constexpr OUStringLiteral gaStrStarBasic( u"StarBasic" ); +constexpr OUString gaStrScript( u"Script"_ustr ); + +SdUnoEventsAccess::SdUnoEventsAccess( SdXShape* pShape ) noexcept + : mpShape( pShape ) +{ +} + +namespace { + +enum class FoundFlags { + NONE = 0x0000, + ClickAction = 0x0001, + Bookmark = 0x0002, + Effect = 0x0004, + PlayFull = 0x0008, + Verb = 0x0010, + SoundUrl = 0x0020, + Speed = 0x0040, + EventType = 0x0080, + Macro = 0x0100, + Library = 0x0200, +}; + +} + +namespace o3tl { + template<> struct typed_flags : is_typed_flags {}; +} + +static void clearEventsInAnimationInfo( SdAnimationInfo* pInfo ) +{ + pInfo->SetBookmark( "" ); + pInfo->mbSecondSoundOn = false; + pInfo->mbSecondPlayFull = false; + pInfo->meClickAction = presentation::ClickAction_NONE; + pInfo->meSecondEffect = presentation::AnimationEffect_NONE; + pInfo->meSecondSpeed = presentation::AnimationSpeed_MEDIUM; + pInfo->mnVerb = 0; +} + +// XNameReplace +void SAL_CALL SdUnoEventsAccess::replaceByName( const OUString& aName, const uno::Any& aElement ) +{ + if( mpShape == nullptr || aName != gaStrOnClick ) + throw container::NoSuchElementException(); + + uno::Sequence< beans::PropertyValue > aProperties; + if( !aElement.hasValue() || aElement.getValueType() != getElementType() || !(aElement >>= aProperties) ) + throw lang::IllegalArgumentException(); + + FoundFlags nFound = FoundFlags::NONE; + + OUString aStrEventType; + presentation::ClickAction eClickAction = presentation::ClickAction_NONE; + presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE; + presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_MEDIUM; + OUString aStrSoundURL; + bool bPlayFull = false; + sal_Int32 nVerb = 0; + OUString aStrMacro; + OUString aStrLibrary; + OUString aStrBookmark; + + for( const beans::PropertyValue& rProperty : std::as_const(aProperties) ) + { + if( !( nFound & FoundFlags::EventType ) && rProperty.Name == gaStrEventType ) + { + if( rProperty.Value >>= aStrEventType ) + { + nFound |= FoundFlags::EventType; + continue; + } + } + else if( !( nFound & FoundFlags::ClickAction ) && rProperty.Name == gaStrClickAction ) + { + if( rProperty.Value >>= eClickAction ) + { + nFound |= FoundFlags::ClickAction; + continue; + } + } + else if( !( nFound & FoundFlags::Macro ) && ( rProperty.Name == gaStrMacroName || rProperty.Name == gaStrScript ) ) + { + if( rProperty.Value >>= aStrMacro ) + { + nFound |= FoundFlags::Macro; + continue; + } + } + else if( !( nFound & FoundFlags::Library ) && rProperty.Name == gaStrLibrary ) + { + if( rProperty.Value >>= aStrLibrary ) + { + nFound |= FoundFlags::Library; + continue; + } + } + else if( !( nFound & FoundFlags::Effect ) && rProperty.Name == gaStrEffect ) + { + if( rProperty.Value >>= eEffect ) + { + nFound |= FoundFlags::Effect; + continue; + } + } + else if( !( nFound & FoundFlags::Bookmark ) && rProperty.Name == gaStrBookmark ) + { + if( rProperty.Value >>= aStrBookmark ) + { + nFound |= FoundFlags::Bookmark; + continue; + } + } + else if( !( nFound & FoundFlags::Speed ) && rProperty.Name == gaStrSpeed ) + { + if( rProperty.Value >>= eSpeed ) + { + nFound |= FoundFlags::Speed; + continue; + } + } + else if( !( nFound & FoundFlags::SoundUrl ) && rProperty.Name == gaStrSoundURL ) + { + if( rProperty.Value >>= aStrSoundURL ) + { + nFound |= FoundFlags::SoundUrl; + continue; + } + } + else if( !( nFound & FoundFlags::PlayFull ) && rProperty.Name == gaStrPlayFull ) + { + if( rProperty.Value >>= bPlayFull ) + { + nFound |= FoundFlags::PlayFull; + continue; + } + } + else if( !( nFound & FoundFlags::Verb ) && rProperty.Name == gaStrVerb ) + { + if( rProperty.Value >>= nVerb ) + { + nFound |= FoundFlags::Verb; + continue; + } + } + + throw lang::IllegalArgumentException(); + } + + bool bOk = false; + do + { + if( !( nFound & FoundFlags::EventType ) ) + break; + + if( aStrEventType == gaStrPresentation ) + { + if( !( nFound & FoundFlags::ClickAction ) ) + break; + + SdAnimationInfo* pInfo = mpShape->GetAnimationInfo(); + if( presentation::ClickAction_NONE == eClickAction && nullptr == pInfo ) + { + bOk = true; + break; + } + + if( nullptr == pInfo ) + pInfo = mpShape->GetAnimationInfo( true ); + + DBG_ASSERT( pInfo, "shape animation info could not be created!" ); + if( nullptr == pInfo ) + break; + + clearEventsInAnimationInfo( pInfo ); + pInfo->meClickAction = eClickAction; + + switch( eClickAction ) + { + case presentation::ClickAction_NONE: + case presentation::ClickAction_PREVPAGE: + case presentation::ClickAction_NEXTPAGE: + case presentation::ClickAction_FIRSTPAGE: + case presentation::ClickAction_LASTPAGE: + case presentation::ClickAction_INVISIBLE: + case presentation::ClickAction_STOPPRESENTATION: + { + bOk = true; + } + break; + + case presentation::ClickAction_PROGRAM: + case presentation::ClickAction_BOOKMARK: + case presentation::ClickAction_DOCUMENT: + if( nFound & FoundFlags::Bookmark ) + { + if( eClickAction == presentation::ClickAction_BOOKMARK ) + { + aStrBookmark = getUiNameFromPageApiNameImpl( aStrBookmark ); + } + else if( eClickAction == presentation::ClickAction_DOCUMENT ) + { + sal_Int32 nPos = aStrBookmark.lastIndexOf( '#' ); + if( nPos >= 0 ) + { + OUString aURL = aStrBookmark.subView( 0, nPos+1 ) + + getUiNameFromPageApiNameImpl( aStrBookmark.copy( nPos+1 ) ); + aStrBookmark = aURL; + } + } + + pInfo->SetBookmark( aStrBookmark ); + bOk = true; + } + break; + + case presentation::ClickAction_MACRO: + if( nFound & FoundFlags::Macro ) + { + pInfo->SetBookmark( aStrMacro ); + bOk = true; + } + break; + + case presentation::ClickAction_VERB: + if( nFound & FoundFlags::Verb ) + { + pInfo->mnVerb = static_cast(nVerb); + bOk = true; + } + break; + + case presentation::ClickAction_VANISH: + if( !( nFound & FoundFlags::Effect ) ) + break; + + pInfo->meSecondEffect = eEffect; + pInfo->meSecondSpeed = nFound & FoundFlags::Speed ? eSpeed : presentation::AnimationSpeed_MEDIUM; + + bOk = true; + + [[fallthrough]]; + + case presentation::ClickAction_SOUND: + if( nFound & FoundFlags::SoundUrl ) + { + pInfo->SetBookmark( aStrSoundURL ); + if( eClickAction != presentation::ClickAction_SOUND ) + pInfo->mbSecondSoundOn = !aStrSoundURL.isEmpty(); + pInfo->mbSecondPlayFull = (nFound & FoundFlags::PlayFull) && bPlayFull; + + bOk = true; + } + break; + default: + break; + } + } + else + { + SdAnimationInfo* pInfo = mpShape->GetAnimationInfo( true ); + + DBG_ASSERT( pInfo, "shape animation info could not be created!" ); + if( nullptr == pInfo ) + break; + + clearEventsInAnimationInfo( pInfo ); + pInfo->meClickAction = presentation::ClickAction_MACRO; + + if ( SfxApplication::IsXScriptURL( aStrMacro ) ) + { + pInfo->SetBookmark( aStrMacro ); + } + else + { + sal_Int32 nIdx{ 0 }; + const std::u16string_view aLibName = o3tl::getToken(aStrMacro, 0, '.', nIdx); + const std::u16string_view aModulName = o3tl::getToken(aStrMacro, 0, '.', nIdx); + const std::u16string_view aMacroName = o3tl::getToken(aStrMacro, 0, '.', nIdx); + + OUStringBuffer sBuffer( + OUString::Concat(aMacroName) + OUStringChar('.') + aModulName + OUStringChar('.') + aLibName + OUStringChar('.') ); + + if ( aStrLibrary == "StarOffice" ) + { + sBuffer.append( "BASIC" ); + } + else + { + sBuffer.append( aStrLibrary ); + } + + pInfo->SetBookmark( sBuffer.makeStringAndClear() ); + } + bOk = true; + } + } + while(false); + + if( !bOk ) + throw lang::IllegalArgumentException(); +} + +// XNameAccess +uno::Any SAL_CALL SdUnoEventsAccess::getByName( const OUString& aName ) +{ + if( mpShape == nullptr || aName != gaStrOnClick ) + throw container::NoSuchElementException(); + + SdAnimationInfo* pInfo = mpShape->GetAnimationInfo(); + + presentation::ClickAction eClickAction = presentation::ClickAction_NONE; + if( pInfo ) + eClickAction = pInfo->meClickAction; + + sal_Int32 nPropertyCount = 2; + switch( eClickAction ) + { + case presentation::ClickAction_NONE: + case presentation::ClickAction_PREVPAGE: + case presentation::ClickAction_NEXTPAGE: + case presentation::ClickAction_FIRSTPAGE: + case presentation::ClickAction_LASTPAGE: + case presentation::ClickAction_INVISIBLE: + case presentation::ClickAction_STOPPRESENTATION: + break; + case presentation::ClickAction_PROGRAM: + case presentation::ClickAction_VERB: + case presentation::ClickAction_BOOKMARK: + case presentation::ClickAction_DOCUMENT: + case presentation::ClickAction_MACRO: + if ( !SfxApplication::IsXScriptURL( pInfo->GetBookmark() ) ) + nPropertyCount += 1; + break; + + case presentation::ClickAction_SOUND: + nPropertyCount += 2; + break; + + case presentation::ClickAction_VANISH: + nPropertyCount += 4; + break; + default: + break; + } + + uno::Sequence< beans::PropertyValue > aProperties( nPropertyCount ); + beans::PropertyValue* pProperties = aProperties.getArray(); + + uno::Any aAny; + + if( eClickAction == presentation::ClickAction_MACRO ) + { + if ( SfxApplication::IsXScriptURL( pInfo->GetBookmark() ) ) + { + // Scripting Framework URL + aAny <<= gaStrScript; + pProperties->Name = gaStrEventType; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + aAny <<= pInfo->GetBookmark(); + pProperties->Name = gaStrScript; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + } + else + { + // Old Basic macro URL + aAny <<= OUString(gaStrStarBasic); + pProperties->Name = gaStrEventType; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + OUString aMacro = pInfo->GetBookmark(); + + // aMacro has got following format: + // "Macroname.Modulname.Libname.Documentname" or + // "Macroname.Modulname.Libname.Applicationname" + sal_Int32 nIdx{ 0 }; + const std::u16string_view aMacroName = o3tl::getToken(aMacro, 0, '.', nIdx); + const std::u16string_view aModulName = o3tl::getToken(aMacro, 0, '.', nIdx); + const std::u16string_view aLibName = o3tl::getToken(aMacro, 0, '.', nIdx); + + OUString sBuffer = OUString::Concat(aLibName) + + "." + + aModulName + + "." + + aMacroName; + + aAny <<= sBuffer; + pProperties->Name = gaStrMacroName; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + aAny <<= OUString( "StarOffice" ); + pProperties->Name = gaStrLibrary; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + } + } + else + { + aAny <<= gaStrPresentation; + pProperties->Name = gaStrEventType; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + aAny <<= eClickAction; + pProperties->Name = gaStrClickAction; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + switch( eClickAction ) + { + case presentation::ClickAction_NONE: + case presentation::ClickAction_PREVPAGE: + case presentation::ClickAction_NEXTPAGE: + case presentation::ClickAction_FIRSTPAGE: + case presentation::ClickAction_LASTPAGE: + case presentation::ClickAction_INVISIBLE: + case presentation::ClickAction_STOPPRESENTATION: + break; + case presentation::ClickAction_BOOKMARK: + { + const OUString aStrBookmark( getPageApiNameFromUiName( pInfo->GetBookmark()) ); + pProperties->Name = gaStrBookmark; + pProperties->Handle = -1; + pProperties->Value <<= aStrBookmark; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + } + break; + + case presentation::ClickAction_DOCUMENT: + case presentation::ClickAction_PROGRAM: + { + OUString aString( pInfo->GetBookmark()); + sal_Int32 nPos = aString.lastIndexOf( '#' ); + if( nPos >= 0 ) + { + OUString aURL = aString.subView( 0, nPos+1 ) + + getPageApiNameFromUiName( aString.copy( nPos+1 ) ); + aString = aURL; + } + pProperties->Name = gaStrBookmark; + pProperties->Handle = -1; + pProperties->Value <<= aString; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + } + break; + + case presentation::ClickAction_VANISH: + aAny <<= pInfo->meSecondEffect; + pProperties->Name = gaStrEffect; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + aAny <<= pInfo->meSecondSpeed; + pProperties->Name = gaStrSpeed; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + [[fallthrough]]; + + case presentation::ClickAction_SOUND: + if( eClickAction == presentation::ClickAction_SOUND || pInfo->mbSecondSoundOn ) + { + aAny <<= pInfo->GetBookmark(); + pProperties->Name = gaStrSoundURL; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + pProperties++; + + pProperties->Name = gaStrPlayFull; + pProperties->Handle = -1; + pProperties->Value <<= pInfo->mbSecondPlayFull; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + } + break; + + case presentation::ClickAction_VERB: + aAny <<= static_cast(pInfo->mnVerb); + pProperties->Name = gaStrVerb; + pProperties->Handle = -1; + pProperties->Value = aAny; + pProperties->State = beans::PropertyState_DIRECT_VALUE; + break; + default: + break; + } + } + + aAny <<= aProperties; + return aAny; +} + +uno::Sequence< OUString > SAL_CALL SdUnoEventsAccess::getElementNames( ) +{ + return { gaStrOnClick }; +} + +sal_Bool SAL_CALL SdUnoEventsAccess::hasByName( const OUString& aName ) +{ + return aName == gaStrOnClick; +} + +// XElementAccess +uno::Type SAL_CALL SdUnoEventsAccess::getElementType( ) +{ + return cppu::UnoType>::get(); +} + +sal_Bool SAL_CALL SdUnoEventsAccess::hasElements( ) +{ + return true; +} + +// XServiceInfo +OUString SAL_CALL SdUnoEventsAccess::getImplementationName( ) +{ + return "SdUnoEventsAccess"; +} + +sal_Bool SAL_CALL SdUnoEventsAccess::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService(this, ServiceName); +} + +uno::Sequence< OUString > SAL_CALL SdUnoEventsAccess::getSupportedServiceNames( ) +{ + return { gaStrServiceName }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unoobj.hxx b/sd/source/ui/unoidl/unoobj.hxx new file mode 100644 index 0000000000..7c78bc520d --- /dev/null +++ b/sd/source/ui/unoidl/unoobj.hxx @@ -0,0 +1,100 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include +#include +#include + +namespace com::sun::star::beans { class XPropertySetInfo; } + +class SdXImpressDocument; +class SdAnimationInfo; +class SvxItemPropertySet; +class SvxShape; +struct SfxItemPropertyMapEntry; + +class SdXShape : public SvxShapeMaster, + public css::document::XEventsSupplier +{ + friend class SdUnoEventsAccess; + +private: + SvxShape* mpShape; + const SvxItemPropertySet* mpPropSet; + std::span mpMap; + SdXImpressDocument* mpModel; + + /// @throws css::lang::IllegalArgumentException + /// @throws css::beans::UnknownPropertyException + /// @throws css::uno::RuntimeException + void SetStyleSheet( const css::uno::Any& rAny ); + /// @throws css::beans::UnknownPropertyException + css::uno::Any GetStyleSheet() const; + + // Intern + /// @throws std::exception + SdAnimationInfo* GetAnimationInfo( bool bCreate = false ) const; + /// @throws std::exception + bool IsPresObj() const; + + bool IsEmptyPresObj() const; + void SetEmptyPresObj(bool bEmpty); + + bool IsMasterDepend() const noexcept; + void SetMasterDepend( bool bDepend ) noexcept; + + OUString GetPlaceholderText() const; + +public: + SdXShape(SvxShape* pShape, SdXImpressDocument* pModel); + virtual ~SdXShape() noexcept; + + virtual bool queryAggregation( const css::uno::Type & rType, css::uno::Any& aAny ) override; + virtual void dispose() override; + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XServiceInfo + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + //XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + + //XPropertyState + virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override; + virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override; + virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override; + + // XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + + // XEventsSupplier + virtual css::uno::Reference< css::container::XNameReplace > SAL_CALL getEvents( ) override; +}; + +struct SvEventDescription; +const SvEventDescription* ImplGetSupportedMacroItems(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx new file mode 100644 index 0000000000..1462e08e36 --- /dev/null +++ b/sd/source/ui/unoidl/unopage.cxx @@ -0,0 +1,3077 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "unoobj.hxx" + +#include +#include +#include +#include "unopback.hxx" +#include +#include +#include +#include +#include +#include + +using ::com::sun::star::animations::XAnimationNode; +using ::com::sun::star::animations::XAnimationNodeSupplier; + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::office; + +namespace { + +// this are the ids for page properties +enum WID_PAGE +{ + WID_PAGE_LEFT, WID_PAGE_RIGHT, WID_PAGE_TOP, WID_PAGE_BOTTOM, WID_PAGE_WIDTH, + WID_PAGE_HEIGHT, WID_PAGE_EFFECT, WID_PAGE_CHANGE, WID_PAGE_SPEED, WID_PAGE_NUMBER, + WID_PAGE_ORIENT, WID_PAGE_LAYOUT, WID_PAGE_DURATION, WID_PAGE_HIGHRESDURATION, WID_PAGE_LDNAME, WID_PAGE_LDBITMAP, + WID_PAGE_BACK, WID_PAGE_PREVIEW, WID_PAGE_PREVIEWBITMAP, WID_PAGE_VISIBLE, WID_PAGE_SOUNDFILE, WID_PAGE_BACKFULL, + WID_PAGE_BACKVIS, WID_PAGE_BACKOBJVIS, WID_PAGE_USERATTRIBS, WID_PAGE_BOOKMARK, WID_PAGE_ISDARK, + WID_PAGE_HEADERVISIBLE, WID_PAGE_HEADERTEXT, WID_PAGE_FOOTERVISIBLE, WID_PAGE_FOOTERTEXT, + WID_PAGE_PAGENUMBERVISIBLE, WID_PAGE_DATETIMEVISIBLE, WID_PAGE_DATETIMEFIXED, + WID_PAGE_DATETIMETEXT, WID_PAGE_DATETIMEFORMAT, WID_TRANSITION_TYPE, WID_TRANSITION_SUBTYPE, + WID_TRANSITION_DIRECTION, WID_TRANSITION_FADE_COLOR, WID_TRANSITION_DURATION, WID_LOOP_SOUND, + WID_NAVORDER, WID_PAGE_PREVIEWMETAFILE, WID_PAGE_THEME, WID_PAGE_THEME_UNO_REPRESENTATION, + WID_PAGE_SLIDE_LAYOUT +}; + +} + +constexpr OUString sEmptyPageName = u"page"_ustr; + +// this function stores the property maps for draw pages in impress and draw +static const SvxItemPropertySet* ImplGetDrawPagePropertySet( bool bImpress, PageKind ePageKind ) +{ + static const SfxItemPropertyMapEntry aDrawPagePropertyMap_Impl[] = + { + { u"" UNO_NAME_PAGE_BACKGROUND ""_ustr, WID_PAGE_BACK, cppu::UnoType::get(), beans::PropertyAttribute::MAYBEVOID,0}, + { u"" UNO_NAME_PAGE_BOTTOM ""_ustr, WID_PAGE_BOTTOM, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_LEFT ""_ustr, WID_PAGE_LEFT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_RIGHT ""_ustr, WID_PAGE_RIGHT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_TOP ""_ustr, WID_PAGE_TOP, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_CHANGE ""_ustr, WID_PAGE_CHANGE, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_DURATION ""_ustr, WID_PAGE_DURATION, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_EFFECT ""_ustr, WID_PAGE_EFFECT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_HEIGHT ""_ustr, WID_PAGE_HEIGHT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_LAYOUT ""_ustr, WID_PAGE_LAYOUT, ::cppu::UnoType::get(), 0, 0}, + { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_NUMBER ""_ustr, WID_PAGE_NUMBER, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_ORIENTATION ""_ustr, WID_PAGE_ORIENT, ::cppu::UnoType::get(),0, 0}, + { u"" UNO_NAME_PAGE_SPEED ""_ustr, WID_PAGE_SPEED, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_WIDTH ""_ustr, WID_PAGE_WIDTH, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_PREVIEW ""_ustr, WID_PAGE_PREVIEW, cppu::UnoType>::get(), css::beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_PREVIEWBITMAP ""_ustr, WID_PAGE_PREVIEWBITMAP, cppu::UnoType>::get(), css::beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_PREVIEWMETAFILE ""_ustr, WID_PAGE_PREVIEWMETAFILE, cppu::UnoType>::get(), css::beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_VISIBLE ""_ustr, WID_PAGE_VISIBLE, cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_OBJ_SOUNDFILE ""_ustr, WID_PAGE_SOUNDFILE, cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_IsBackgroundVisible, WID_PAGE_BACKVIS, cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_IsBackgroundObjectsVisible, WID_PAGE_BACKOBJVIS, cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_BookmarkURL, WID_PAGE_BOOKMARK, ::cppu::UnoType::get(), 0, 0}, + { u"HighResDuration"_ustr, WID_PAGE_HIGHRESDURATION, ::cppu::UnoType::get(), 0, 0}, + { u"IsBackgroundDark"_ustr , WID_PAGE_ISDARK, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"IsFooterVisible"_ustr, WID_PAGE_FOOTERVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"FooterText"_ustr, WID_PAGE_FOOTERTEXT, ::cppu::UnoType::get(), 0, 0}, + { u"IsPageNumberVisible"_ustr, WID_PAGE_PAGENUMBERVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"IsDateTimeVisible"_ustr, WID_PAGE_DATETIMEVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"IsDateTimeFixed"_ustr, WID_PAGE_DATETIMEFIXED, cppu::UnoType::get(), 0, 0}, + { u"DateTimeText"_ustr, WID_PAGE_DATETIMETEXT, ::cppu::UnoType::get(), 0, 0}, + { u"DateTimeFormat"_ustr, WID_PAGE_DATETIMEFORMAT, ::cppu::UnoType::get(), 0, 0}, + { u"TransitionType"_ustr, WID_TRANSITION_TYPE, ::cppu::UnoType::get(), 0, 0}, + { u"TransitionSubtype"_ustr, WID_TRANSITION_SUBTYPE, ::cppu::UnoType::get(), 0, 0}, + { u"TransitionDirection"_ustr, WID_TRANSITION_DIRECTION, ::cppu::UnoType::get(), 0, 0}, + { u"TransitionFadeColor"_ustr, WID_TRANSITION_FADE_COLOR, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_TRANSITION_DURATION ""_ustr, WID_TRANSITION_DURATION, ::cppu::UnoType::get(), 0, 0}, + { u"LoopSound"_ustr, WID_LOOP_SOUND, cppu::UnoType::get(), 0, 0}, + { u"NavigationOrder"_ustr, WID_NAVORDER, cppu::UnoType::get(),0, 0}, + }; + +#define DRAW_PAGE_NOTES_PROPERTIES \ + { u"" UNO_NAME_PAGE_BOTTOM ""_ustr, WID_PAGE_BOTTOM, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_LEFT ""_ustr, WID_PAGE_LEFT, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_RIGHT ""_ustr, WID_PAGE_RIGHT, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_TOP ""_ustr, WID_PAGE_TOP, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_HEIGHT ""_ustr, WID_PAGE_HEIGHT, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_LAYOUT ""_ustr, WID_PAGE_LAYOUT, ::cppu::UnoType::get(), 0, 0}, \ + { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { u"" UNO_NAME_PAGE_NUMBER ""_ustr, WID_PAGE_NUMBER, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { u"" UNO_NAME_PAGE_ORIENTATION ""_ustr, WID_PAGE_ORIENT, ::cppu::UnoType::get(),0, 0}, \ + { u"" UNO_NAME_PAGE_WIDTH ""_ustr, WID_PAGE_WIDTH, ::cppu::UnoType::get(), 0, 0}, \ + { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType::get(), 0, 0},\ + { u"IsHeaderVisible"_ustr, WID_PAGE_HEADERVISIBLE, cppu::UnoType::get(), 0, 0}, \ + { u"HeaderText"_ustr, WID_PAGE_HEADERTEXT, ::cppu::UnoType::get(), 0, 0}, \ + { u"IsBackgroundDark"_ustr, WID_PAGE_ISDARK, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { u"IsFooterVisible"_ustr, WID_PAGE_FOOTERVISIBLE, cppu::UnoType::get(), 0, 0}, \ + { u"FooterText"_ustr, WID_PAGE_FOOTERTEXT, ::cppu::UnoType::get(), 0, 0}, \ + { u"IsPageNumberVisible"_ustr, WID_PAGE_PAGENUMBERVISIBLE, cppu::UnoType::get(), 0, 0}, \ + { u"IsDateTimeVisible"_ustr, WID_PAGE_DATETIMEVISIBLE, cppu::UnoType::get(), 0, 0}, \ + { u"IsDateTimeFixed"_ustr, WID_PAGE_DATETIMEFIXED, cppu::UnoType::get(), 0, 0}, \ + { u"DateTimeText"_ustr, WID_PAGE_DATETIMETEXT, ::cppu::UnoType::get(), 0, 0}, \ + { u"DateTimeFormat"_ustr, WID_PAGE_DATETIMEFORMAT, ::cppu::UnoType::get(), 0, 0}, \ + { u"NavigationOrder"_ustr, WID_NAVORDER, cppu::UnoType::get(),0, 0} + + static const SfxItemPropertyMapEntry aDrawPageNotesHandoutPropertyMap_Impl[] = + { + // this must be the first two entries so they can be excluded for PageKind::Standard + { u"" UNO_NAME_PAGE_BACKGROUND ""_ustr, WID_PAGE_BACK, cppu::UnoType::get(), beans::PropertyAttribute::MAYBEVOID,0}, + DRAW_PAGE_NOTES_PROPERTIES + }; + static const SfxItemPropertyMapEntry aDrawPageNotesHandoutPropertyNoBackMap_Impl[] = + { + DRAW_PAGE_NOTES_PROPERTIES + }; + +#define GRAPHIC_PAGE_PROPERTIES \ + { u"" UNO_NAME_PAGE_BOTTOM ""_ustr, WID_PAGE_BOTTOM, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_LEFT ""_ustr, WID_PAGE_LEFT, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_RIGHT ""_ustr, WID_PAGE_RIGHT, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_TOP ""_ustr, WID_PAGE_TOP, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_HEIGHT ""_ustr, WID_PAGE_HEIGHT, ::cppu::UnoType::get(), 0, 0}, \ + { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { u"" UNO_NAME_PAGE_NUMBER ""_ustr, WID_PAGE_NUMBER, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { u"" UNO_NAME_PAGE_ORIENTATION ""_ustr, WID_PAGE_ORIENT, ::cppu::UnoType::get(),0, 0}, \ + { u"" UNO_NAME_PAGE_WIDTH ""_ustr, WID_PAGE_WIDTH, ::cppu::UnoType::get(), 0, 0}, \ + { u"" UNO_NAME_PAGE_PREVIEW ""_ustr, WID_PAGE_PREVIEW, cppu::UnoType>::get(), css::beans::PropertyAttribute::READONLY, 0}, \ + { u"" UNO_NAME_PAGE_PREVIEWBITMAP ""_ustr, WID_PAGE_PREVIEWBITMAP, cppu::UnoType>::get(), css::beans::PropertyAttribute::READONLY, 0},\ + { u"" UNO_NAME_PAGE_PREVIEWMETAFILE ""_ustr, WID_PAGE_PREVIEWMETAFILE, cppu::UnoType>::get(), css::beans::PropertyAttribute::READONLY, 0},\ + { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType::get(), 0, 0}, \ + { sUNO_Prop_BookmarkURL, WID_PAGE_BOOKMARK, ::cppu::UnoType::get(), 0, 0}, \ + { u"IsBackgroundDark"_ustr, WID_PAGE_ISDARK, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, \ + { u"NavigationOrder"_ustr, WID_NAVORDER, cppu::UnoType::get(),0, 0} + + static const SfxItemPropertyMapEntry aGraphicPagePropertyMap_Impl[] = + { + { u"" UNO_NAME_PAGE_BACKGROUND ""_ustr, WID_PAGE_BACK, cppu::UnoType::get(), beans::PropertyAttribute::MAYBEVOID,0}, + GRAPHIC_PAGE_PROPERTIES + }; + static const SfxItemPropertyMapEntry aGraphicPagePropertyNoBackMap_Impl[] = + { + GRAPHIC_PAGE_PROPERTIES + }; + + bool bWithoutBackground = ePageKind != PageKind::Standard && ePageKind != PageKind::Handout; + const SvxItemPropertySet* pRet = nullptr; + if( bImpress ) + { + if( ePageKind == PageKind::Standard ) + { + //PageKind::Standard always has a background property + static SvxItemPropertySet aDrawPagePropertySet_Impl( aDrawPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aDrawPagePropertySet_Impl; + } + else + { + if(bWithoutBackground) + { + static SvxItemPropertySet aDrawPageNotesHandoutPropertyNoBackSet_Impl( aDrawPageNotesHandoutPropertyNoBackMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aDrawPageNotesHandoutPropertyNoBackSet_Impl; + } + else + { + static SvxItemPropertySet aDrawPageNotesHandoutPropertySet_Impl( aDrawPageNotesHandoutPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aDrawPageNotesHandoutPropertySet_Impl; + } + } + } + else + { + if(bWithoutBackground) + { + static SvxItemPropertySet aGraphicPagePropertyNoBackSet_Impl( aGraphicPagePropertyNoBackMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aGraphicPagePropertyNoBackSet_Impl; + } + else + { + static SvxItemPropertySet aGraphicPagePropertySet_Impl( aGraphicPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aGraphicPagePropertySet_Impl; + } + } + return pRet; +} + +/** this function stores the property map for master pages in impress and draw */ +static const SvxItemPropertySet* ImplGetMasterPagePropertySet( PageKind ePageKind ) +{ + static const SfxItemPropertyMapEntry aMasterPagePropertyMap_Impl[] = + { + { u"" UNO_NAME_PAGE_BACKGROUND ""_ustr, WID_PAGE_BACK, cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_BOTTOM ""_ustr, WID_PAGE_BOTTOM, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_LEFT ""_ustr, WID_PAGE_LEFT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_RIGHT ""_ustr, WID_PAGE_RIGHT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_TOP ""_ustr, WID_PAGE_TOP, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_HEIGHT ""_ustr, WID_PAGE_HEIGHT, ::cppu::UnoType::get(), 0, 0}, + { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_NUMBER ""_ustr, WID_PAGE_NUMBER, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_ORIENTATION ""_ustr, WID_PAGE_ORIENT, ::cppu::UnoType::get(),0, 0}, + { u"" UNO_NAME_PAGE_WIDTH ""_ustr, WID_PAGE_WIDTH, ::cppu::UnoType::get(), 0, 0}, + { u"BackgroundFullSize"_ustr, WID_PAGE_BACKFULL, cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType::get(), 0, 0}, + { u"IsBackgroundDark"_ustr, WID_PAGE_ISDARK, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"Theme"_ustr, WID_PAGE_THEME, cppu::UnoType::get(), 0, 0}, + // backwards compatible view of the theme for use in tests + { u"ThemeUnoRepresentation"_ustr, WID_PAGE_THEME_UNO_REPRESENTATION, cppu::UnoType>::get(), 0, 0}, + { u"SlideLayout"_ustr, WID_PAGE_SLIDE_LAYOUT, ::cppu::UnoType::get(), 0, 0} + }; + + static const SfxItemPropertyMapEntry aHandoutMasterPagePropertyMap_Impl[] = + { + { u"" UNO_NAME_PAGE_BOTTOM ""_ustr, WID_PAGE_BOTTOM, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_LEFT ""_ustr, WID_PAGE_LEFT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_RIGHT ""_ustr, WID_PAGE_RIGHT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_TOP ""_ustr, WID_PAGE_TOP, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_HEIGHT ""_ustr, WID_PAGE_HEIGHT, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_ORIENTATION ""_ustr, WID_PAGE_ORIENT, ::cppu::UnoType::get(),0, 0}, + { u"" UNO_NAME_PAGE_NUMBER ""_ustr, WID_PAGE_NUMBER, ::cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"" UNO_NAME_PAGE_WIDTH ""_ustr, WID_PAGE_WIDTH, ::cppu::UnoType::get(), 0, 0}, + { u"" UNO_NAME_PAGE_LAYOUT ""_ustr, WID_PAGE_LAYOUT, ::cppu::UnoType::get(), 0, 0}, + { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType::get(), 0, 0}, + { u"IsBackgroundDark"_ustr, WID_PAGE_ISDARK, cppu::UnoType::get(), beans::PropertyAttribute::READONLY, 0}, + { u"IsHeaderVisible"_ustr, WID_PAGE_HEADERVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"HeaderText"_ustr, WID_PAGE_HEADERTEXT, ::cppu::UnoType::get(), 0, 0}, + { u"IsFooterVisible"_ustr, WID_PAGE_FOOTERVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"FooterText"_ustr, WID_PAGE_FOOTERTEXT, ::cppu::UnoType::get(), 0, 0}, + { u"IsPageNumberVisible"_ustr, WID_PAGE_PAGENUMBERVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"IsDateTimeVisible"_ustr, WID_PAGE_DATETIMEVISIBLE, cppu::UnoType::get(), 0, 0}, + { u"IsDateTimeFixed"_ustr, WID_PAGE_DATETIMEFIXED, cppu::UnoType::get(), 0, 0}, + { u"DateTimeText"_ustr, WID_PAGE_DATETIMETEXT, ::cppu::UnoType::get(), 0, 0}, + { u"DateTimeFormat"_ustr, WID_PAGE_DATETIMEFORMAT, ::cppu::UnoType::get(), 0, 0} + }; + + const SvxItemPropertySet* pRet = nullptr; + if( ePageKind == PageKind::Handout ) + { + static SvxItemPropertySet aHandoutMasterPagePropertySet_Impl( aHandoutMasterPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aHandoutMasterPagePropertySet_Impl; + } + else + { + static SvxItemPropertySet aMasterPagePropertySet_Impl( aMasterPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + pRet = &aMasterPagePropertySet_Impl; + } + return pRet; +} + +const css::uno::Sequence< sal_Int8 > & SdGenericDrawPage::getUnoTunnelId() noexcept +{ + static const comphelper::UnoIdInit theSdGenericDrawPageUnoTunnelId; + return theSdGenericDrawPageUnoTunnelId.getSeq(); +} + +sal_Int64 SAL_CALL SdGenericDrawPage::getSomething( const css::uno::Sequence< sal_Int8 >& rId ) +{ + return comphelper::getSomethingImpl(rId, this, + comphelper::FallbackToGetSomethingOf{}); +} + +SdGenericDrawPage::SdGenericDrawPage(SdXImpressDocument* _pModel, SdPage* pInPage, const SvxItemPropertySet* _pSet) +: SvxDrawPage( static_cast(pInPage) ), + SdUnoSearchReplaceShape(this), + mpDocModel( _pModel ), + mpSdrModel(nullptr), + mbIsImpressDocument(false), + mnTempPageNumber(0), + mpPropSet ( _pSet ) +{ + mpSdrModel = SvxDrawPage::mpModel; + if( mpDocModel ) + mbIsImpressDocument = mpDocModel->IsImpressDocument(); + +} + +SdGenericDrawPage::~SdGenericDrawPage() noexcept +{ +} + +void SdGenericDrawPage::throwIfDisposed() const +{ + if( (SvxDrawPage::mpModel == nullptr) || (mpDocModel == nullptr) || (SvxDrawPage::mpPage == nullptr) ) + throw lang::DisposedException(); +} + +SdXImpressDocument* SdGenericDrawPage::GetModel() const +{ + if( mpSdrModel != SvxDrawPage::mpModel ) + const_cast(this)->UpdateModel(); + return mpDocModel; +} + +bool SdGenericDrawPage::IsImpressDocument() const +{ + if( mpSdrModel != SvxDrawPage::mpModel ) + const_cast(this)->UpdateModel(); + return mbIsImpressDocument; +} + + +void SdGenericDrawPage::UpdateModel() +{ + mpSdrModel = SvxDrawPage::mpModel; + if( mpSdrModel ) + { + uno::Reference< uno::XInterface > xModel( SvxDrawPage::mpModel->getUnoModel() ); + mpDocModel = comphelper::getFromUnoTunnel( xModel ); + } + else + { + mpDocModel = nullptr; + } + mbIsImpressDocument = mpDocModel && mpDocModel->IsImpressDocument(); +} + +// this is called whenever a SdrObject must be created for an empty api shape wrapper +rtl::Reference SdGenericDrawPage::CreateSdrObject_( const Reference< drawing::XShape >& xShape ) +{ + if( nullptr == SvxDrawPage::mpPage || !xShape.is() ) + return nullptr; + + OUString aType( xShape->getShapeType() ); + static constexpr OUString aPrefix( u"com.sun.star.presentation."_ustr ); + if( !aType.startsWith( aPrefix ) ) + { + return SvxDrawPage::CreateSdrObject_( xShape ); + } + + aType = aType.copy( aPrefix.getLength() ); + + PresObjKind eObjKind = PresObjKind::NONE; + + if( aType == "TitleTextShape" ) + { + eObjKind = PresObjKind::Title; + } + else if( aType == "OutlinerShape" ) + { + eObjKind = PresObjKind::Outline; + } + else if( aType == "SubtitleShape" ) + { + eObjKind = PresObjKind::Text; + } + else if( aType == "OLE2Shape" ) + { + eObjKind = PresObjKind::Object; + } + else if( aType == "ChartShape" ) + { + eObjKind = PresObjKind::Chart; + } + else if( aType == "CalcShape" ) + { + eObjKind = PresObjKind::Calc; + } + else if( aType == "TableShape" ) + { + eObjKind = PresObjKind::Table; + } + else if( aType == "GraphicObjectShape" ) + { + eObjKind = PresObjKind::Graphic; + } + else if( aType == "OrgChartShape" ) + { + eObjKind = PresObjKind::OrgChart; + } + else if( aType == "PageShape" ) + { + if( GetPage()->GetPageKind() == PageKind::Notes && GetPage()->IsMasterPage() ) + eObjKind = PresObjKind::Title; + else + eObjKind = PresObjKind::Page; + } + else if( aType == "NotesShape" ) + { + eObjKind = PresObjKind::Notes; + } + else if( aType == "HandoutShape" ) + { + eObjKind = PresObjKind::Handout; + } + else if( aType == "FooterShape" ) + { + eObjKind = PresObjKind::Footer; + } + else if( aType == "HeaderShape" ) + { + eObjKind = PresObjKind::Header; + } + else if( aType == "SlideNumberShape" ) + { + eObjKind = PresObjKind::SlideNumber; + } + else if( aType == "DateTimeShape" ) + { + eObjKind = PresObjKind::DateTime; + } + else if( aType == "MediaShape" ) + { + eObjKind = PresObjKind::Media; + } + + ::tools::Rectangle aRect( eObjKind == PresObjKind::Title ? GetPage()->GetTitleRect() : GetPage()->GetLayoutRect() ); + + const awt::Point aPos( aRect.Left(), aRect.Top() ); + xShape->setPosition( aPos ); + + const awt::Size aSize( aRect.GetWidth(), aRect.GetHeight() ); + xShape->setSize( aSize ); + + rtl::Reference pPresObj; + if( (eObjKind == PresObjKind::Table) || (eObjKind == PresObjKind::Media) ) + { + pPresObj = SvxDrawPage::CreateSdrObject_( xShape ); + if( pPresObj ) + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + pPresObj->NbcSetStyleSheet(rDoc.GetDefaultStyleSheet(), true); + GetPage()->InsertPresObj( pPresObj.get(), eObjKind ); + } + } + else + { + pPresObj = GetPage()->CreatePresObj( eObjKind, false, aRect ); + } + + if( pPresObj ) + pPresObj->SetUserCall( GetPage() ); + + return pPresObj; +} + +// XInterface +Any SdGenericDrawPage::queryInterface(const uno::Type & rType) +{ + Any aAny; + + if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (rType == cppu::UnoType::get()) + { + aAny <<= Reference(this); + } + else if (IsImpressDocument() && rType == cppu::UnoType::get()) + { + const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PageKind::Standard; + + if( ePageKind == PageKind::Standard ) + return Any( Reference< XAnimationNodeSupplier >( this ) ); + } + else + return SvxDrawPage::queryInterface( rType ); + + return aAny; +} + +// XPropertySet +Reference< beans::XPropertySetInfo > SAL_CALL SdGenericDrawPage::getPropertySetInfo() +{ + ::SolarMutexGuard aGuard; + throwIfDisposed(); + return mpPropSet->getPropertySetInfo(); +} + +void SAL_CALL SdGenericDrawPage::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName); + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_NAVORDER: + setNavigationOrder( aValue ); + break; + case WID_PAGE_LEFT: + case WID_PAGE_RIGHT: + case WID_PAGE_TOP: + case WID_PAGE_BOTTOM: + case WID_PAGE_LAYOUT: + case WID_PAGE_SLIDE_LAYOUT: + case WID_PAGE_DURATION: + case WID_PAGE_CHANGE: + { + sal_Int32 nValue = 0; + if(!(aValue >>= nValue)) + throw lang::IllegalArgumentException(); + + switch( pEntry->nWID ) + { + case WID_PAGE_LEFT: + SetLeftBorder(nValue); + break; + case WID_PAGE_RIGHT: + SetRightBorder( nValue ); + break; + case WID_PAGE_TOP: + SetUpperBorder( nValue ); + break; + case WID_PAGE_BOTTOM: + SetLowerBorder( nValue ); + break; + case WID_PAGE_CHANGE: + GetPage()->SetPresChange( static_cast(nValue) ); + break; + case WID_PAGE_LAYOUT: + GetPage()->SetAutoLayout( static_cast(nValue), true ); + break; + case WID_PAGE_SLIDE_LAYOUT: + mSlideLayout <<= nValue; + break; + case WID_PAGE_DURATION: + GetPage()->SetTime(nValue); + break; + } + break; + } + case WID_PAGE_HIGHRESDURATION: + { + double fValue = 0; + if(!(aValue >>= fValue)) + throw lang::IllegalArgumentException(); + + GetPage()->SetTime(fValue); + break; + } + case WID_PAGE_WIDTH: + { + sal_Int32 nWidth = 0; + if(!(aValue >>= nWidth)) + throw lang::IllegalArgumentException(); + + SetWidth( nWidth ); + break; + } + case WID_PAGE_HEIGHT: + { + sal_Int32 nHeight = 0; + if(!(aValue >>= nHeight)) + throw lang::IllegalArgumentException(); + + SetHeight( nHeight ); + break; + } + case WID_PAGE_ORIENT: + { + sal_Int32 nEnum = 0; + if(!::cppu::enum2int( nEnum, aValue )) + throw lang::IllegalArgumentException(); + + Orientation eOri = (static_cast(nEnum) == view::PaperOrientation_PORTRAIT)?Orientation::Portrait:Orientation::Landscape; + + if( eOri != GetPage()->GetOrientation() ) + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetOrientation( eOri ); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetOrientation( eOri ); + } + } + break; + } + case WID_PAGE_EFFECT: + { + sal_Int32 nEnum = 0; + if(!::cppu::enum2int( nEnum, aValue )) + throw lang::IllegalArgumentException(); + + GetPage()->SetFadeEffect( static_cast(nEnum) ); + break; + } + case WID_PAGE_BACK: + setBackground( aValue ); + break; + case WID_PAGE_SPEED: + { + sal_Int32 nEnum = 0; + if(!::cppu::enum2int( nEnum, aValue )) + throw lang::IllegalArgumentException(); + + GetPage()->setTransitionDuration( nEnum == 0 ? 3.0 : (nEnum == 1 ? 2.0 : 1.0 ) ); + break; + } + case WID_PAGE_VISIBLE : + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + GetPage()->SetExcluded( !bVisible ); + break; + } + case WID_PAGE_SOUNDFILE : + { + OUString aURL; + if( aValue >>= aURL ) + { + GetPage()->SetSoundFile( aURL ); + GetPage()->SetSound( !aURL.isEmpty() ); + break; + } + else + { + bool bStopSound = false; + if( aValue >>= bStopSound ) + { + GetPage()->SetStopSound( bStopSound ); + break; + } + } + + throw lang::IllegalArgumentException(); + } + case WID_LOOP_SOUND: + { + bool bLoop = false; + if( ! (aValue >>= bLoop) ) + throw lang::IllegalArgumentException(); + + GetPage()->SetLoopSound( bLoop ); + break; + } + case WID_PAGE_BACKFULL: + { + bool bFullSize = false; + if( ! ( aValue >>= bFullSize ) ) + throw lang::IllegalArgumentException(); + GetPage()->SetBackgroundFullSize( bFullSize ); + break; + } + case WID_PAGE_BACKVIS: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + SdrPage* pPage = GetPage(); + if( pPage ) + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage())); + if( rDoc.GetMasterPageCount() ) + { + SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin(); + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + aVisibleLayers.Set(rLayerAdmin.GetLayerID(sUNO_LayerName_background), bVisible); + pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + } + break; + } + case WID_PAGE_BACKOBJVIS: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + SdrPage* pPage = GetPage(); + if( pPage ) + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage())); + if( rDoc.GetMasterPageCount() ) + { + SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin(); + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + aVisibleLayers.Set(rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects), bVisible); + pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + } + + break; + } + case WID_PAGE_USERATTRIBS: + { + if( !GetPage()->setAlienAttributes( aValue ) ) + throw lang::IllegalArgumentException(); + break; + } + case WID_PAGE_BOOKMARK: + { + OUString aBookmarkURL; + if( ! ( aValue >>= aBookmarkURL ) ) + throw lang::IllegalArgumentException(); + + setBookmarkURL( aBookmarkURL ); + break; + } + + case WID_PAGE_HEADERVISIBLE: + case WID_PAGE_HEADERTEXT: + case WID_PAGE_FOOTERVISIBLE: + case WID_PAGE_FOOTERTEXT: + case WID_PAGE_PAGENUMBERVISIBLE: + case WID_PAGE_DATETIMEVISIBLE: + case WID_PAGE_DATETIMEFIXED: + case WID_PAGE_DATETIMETEXT: + case WID_PAGE_DATETIMEFORMAT: + { + sd::HeaderFooterSettings aHeaderFooterSettings( GetPage()->getHeaderFooterSettings() ); + + switch( pEntry->nWID ) + { + case WID_PAGE_HEADERVISIBLE: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.mbHeaderVisible = bVisible; + break; + } + case WID_PAGE_HEADERTEXT: + { + OUString aText; + if( ! ( aValue >>= aText ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.maHeaderText = aText; + break; + } + case WID_PAGE_FOOTERVISIBLE: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.mbFooterVisible = bVisible; + break; + } + case WID_PAGE_FOOTERTEXT: + { + OUString aText; + if( ! ( aValue >>= aText ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.maFooterText = aText; + break; + } + case WID_PAGE_PAGENUMBERVISIBLE: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.mbSlideNumberVisible = bVisible; + break; + } + case WID_PAGE_DATETIMEVISIBLE: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.mbDateTimeVisible = bVisible; + break; + } + case WID_PAGE_DATETIMEFIXED: + { + bool bVisible = false; + if( ! ( aValue >>= bVisible ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.mbDateTimeIsFixed = bVisible; + break; + } + case WID_PAGE_DATETIMETEXT: + { + OUString aText; + if( ! ( aValue >>= aText ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.maDateTimeText = aText; + break; + } + case WID_PAGE_DATETIMEFORMAT: + { + sal_Int32 nValue = 0; + if( ! ( aValue >>= nValue ) ) + throw lang::IllegalArgumentException(); + + aHeaderFooterSettings.meDateFormat = static_cast(nValue & 0x0f); + aHeaderFooterSettings.meTimeFormat = static_cast((nValue >> 4) & 0x0f); + break; + } + } + + if( !(aHeaderFooterSettings == GetPage()->getHeaderFooterSettings()) ) + GetPage()->setHeaderFooterSettings( aHeaderFooterSettings ); + + break; + } + + case WID_PAGE_NUMBER: + if( (GetPage()->GetPageKind() == PageKind::Handout) && !GetPage()->IsMasterPage() ) + { + if( !(aValue >>= mnTempPageNumber) ) + throw lang::IllegalArgumentException(); + + break; + } + throw beans::PropertyVetoException(); + + case WID_PAGE_LDBITMAP: + case WID_PAGE_LDNAME: + case WID_PAGE_ISDARK: + throw beans::PropertyVetoException(); + + case WID_TRANSITION_TYPE: + { + sal_Int16 nValue = 0; + if( ! ( aValue >>= nValue ) ) + throw lang::IllegalArgumentException(); + + GetPage()->setTransitionType( nValue ); + break; + } + + case WID_TRANSITION_SUBTYPE: + { + sal_Int16 nValue = 0; + if( ! ( aValue >>= nValue ) ) + throw lang::IllegalArgumentException(); + + GetPage()->setTransitionSubtype( nValue ); + break; + } + + case WID_TRANSITION_DIRECTION: + { + bool bValue = false; + if( ! ( aValue >>= bValue ) ) + throw lang::IllegalArgumentException(); + + GetPage()->setTransitionDirection( bValue ); + break; + } + + case WID_TRANSITION_FADE_COLOR: + { + sal_Int32 nValue = 0; + if( ! ( aValue >>= nValue ) ) + throw lang::IllegalArgumentException(); + + GetPage()->setTransitionFadeColor( nValue ); + break; + } + + case WID_TRANSITION_DURATION: + { + double fValue = 0.0; + if( ! ( aValue >>= fValue ) ) + throw lang::IllegalArgumentException(); + + GetPage()->setTransitionDuration( fValue ); + break; + } + + case WID_PAGE_THEME: + { + SdrPage* pPage = GetPage(); + uno::Reference xTheme; + if (aValue >>= xTheme) + { + auto& rUnoTheme = dynamic_cast(*xTheme); + pPage->getSdrPageProperties().setTheme(rUnoTheme.getTheme()); + } + break; + } + + case WID_PAGE_THEME_UNO_REPRESENTATION: + { + SdrPage* pPage = GetPage(); + std::shared_ptr pTheme = model::Theme::FromAny(aValue); + pPage->getSdrPageProperties().setTheme(pTheme); + break; + } + + default: + throw beans::UnknownPropertyException( aPropertyName, static_cast(this)); + } + + GetModel()->SetModified(); +} + +Any SAL_CALL SdGenericDrawPage::getPropertyValue( const OUString& PropertyName ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + uno::Any aAny; + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName); + + sal_Int16 nEntry = pEntry ? pEntry->nWID : -1; + switch (nEntry) + { + case WID_NAVORDER: + aAny = getNavigationOrder(); + break; + case WID_PAGE_LEFT: + aAny <<= GetPage()->GetLeftBorder(); + break; + case WID_PAGE_RIGHT: + aAny <<= GetPage()->GetRightBorder(); + break; + case WID_PAGE_TOP: + aAny <<= GetPage()->GetUpperBorder(); + break; + case WID_PAGE_BOTTOM: + aAny <<= GetPage()->GetLowerBorder(); + break; + case WID_PAGE_WIDTH: + aAny <<= static_cast( GetPage()->GetSize().getWidth() ); + break; + case WID_PAGE_HEIGHT: + aAny <<= static_cast( GetPage()->GetSize().getHeight() ); + break; + case WID_PAGE_ORIENT: + aAny <<= + GetPage()->GetOrientation() == Orientation::Portrait + ? view::PaperOrientation_PORTRAIT + : view::PaperOrientation_LANDSCAPE; + break; + case WID_PAGE_EFFECT: + aAny <<= GetPage()->GetFadeEffect(); + break; + case WID_PAGE_CHANGE: + aAny <<= static_cast( GetPage()->GetPresChange() ); + break; + case WID_PAGE_SPEED: + { + const double fDuration = GetPage()->getTransitionDuration(); + aAny <<= presentation::AnimationSpeed( + fDuration < 2.0 ? 2 : fDuration > 2.0 ? 0 : 1); + } + break; + case WID_PAGE_LAYOUT: + aAny <<= static_cast( GetPage()->GetAutoLayout() ); + break; + case WID_PAGE_SLIDE_LAYOUT: + aAny = mSlideLayout; + break; + case WID_PAGE_NUMBER: + { + const sal_uInt16 nPageNumber(GetPage()->GetPageNum()); + + if(nPageNumber > 0) + { + // for all other pages calculate the number + aAny <<= static_cast(static_cast((nPageNumber-1)>>1) + 1); + } + else + { + aAny <<= mnTempPageNumber; + } + } + break; + case WID_PAGE_DURATION: + aAny <<= static_cast( GetPage()->GetTime() + .5 ); + break; + case WID_PAGE_HIGHRESDURATION: + aAny <<= GetPage()->GetTime(); + break; + case WID_PAGE_LDNAME: + { + const OUString aName( GetPage()->GetName() ); + aAny <<= aName; + break; + } + case WID_PAGE_LDBITMAP: + { + Reference< awt::XBitmap > xBitmap(VCLUnoHelper::CreateBitmap(BitmapEx(BMP_PAGE))); + aAny <<= xBitmap; + } + break; + case WID_PAGE_BACK: + getBackground( aAny ); + break; + case WID_PAGE_PREVIEW : + case WID_PAGE_PREVIEWMETAFILE : + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + ::sd::DrawDocShell* pDocShell = rDoc.GetDocSh(); + if ( pDocShell ) + { + sal_uInt16 nPgNum = 0; + sal_uInt16 nPageCount = rDoc.GetSdPageCount( PageKind::Standard ); + sal_uInt16 nPageNumber = static_cast( ( GetPage()->GetPageNum() - 1 ) >> 1 ); + while( nPgNum < nPageCount ) + { + rDoc.SetSelected( rDoc.GetSdPage( nPgNum, PageKind::Standard ), nPgNum == nPageNumber ); + nPgNum++; + } + std::shared_ptr xMetaFile = pDocShell->GetPreviewMetaFile(); + if (xMetaFile) + { + Size aSize( GetPage()->GetSize() ); + xMetaFile->AddAction( new MetaFillColorAction( COL_WHITE, true ), 0 ); + xMetaFile->AddAction( new MetaRectAction( ::tools::Rectangle( Point(), aSize ) ), 1 ); + xMetaFile->SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + xMetaFile->SetPrefSize( aSize ); + + SvMemoryStream aDestStrm( 65535, 65535 ); + if (nEntry == WID_PAGE_PREVIEW) + // Preview: WMF format. + ConvertGDIMetaFileToWMF(*xMetaFile, aDestStrm, nullptr, false); + else + { + // PreviewMetafile: SVM format. + SvmWriter aWriter(aDestStrm); + aWriter.Write(*xMetaFile); + } + Sequence aSeq( static_cast(aDestStrm.GetData()), aDestStrm.Tell() ); + aAny <<= aSeq; + } + } + } + break; + + case WID_PAGE_PREVIEWBITMAP : + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + ::sd::DrawDocShell* pDocShell = rDoc.GetDocSh(); + if ( pDocShell ) + { + sal_uInt16 nPgNum = 0; + sal_uInt16 nPageCount = rDoc.GetSdPageCount( PageKind::Standard ); + sal_uInt16 nPageNumber = static_cast( ( GetPage()->GetPageNum() - 1 ) >> 1 ); + while( nPgNum < nPageCount ) + { + rDoc.SetSelected( rDoc.GetSdPage( nPgNum, PageKind::Standard ), nPgNum == nPageNumber ); + nPgNum++; + } + std::shared_ptr xMetaFile = pDocShell->GetPreviewMetaFile(); + BitmapEx aBitmap; + if (xMetaFile && xMetaFile->CreateThumbnail(aBitmap)) + { + SvMemoryStream aMemStream; + WriteDIB(aBitmap.GetBitmap(), aMemStream, false, false); + uno::Sequence aSeq( static_cast(aMemStream.GetData()), aMemStream.Tell() ); + aAny <<= aSeq; + } + } + } + break; + + case WID_PAGE_VISIBLE : + { + bool bVisible = !GetPage()->IsExcluded(); + aAny <<= bVisible; + break; + } + + case WID_PAGE_SOUNDFILE : + { + if( GetPage()->IsStopSound() ) + { + aAny <<= true; + } + else + { + OUString aURL; + if( GetPage()->IsSoundOn() ) + aURL = GetPage()->GetSoundFile(); + aAny <<= aURL; + } + break; + } + case WID_LOOP_SOUND: + { + aAny <<= GetPage()->IsLoopSound(); + break; + } + case WID_PAGE_BACKFULL: + { + bool bFullSize = GetPage()->IsBackgroundFullSize(); + aAny <<= bFullSize; + break; + } + case WID_PAGE_BACKVIS: + { + SdrPage* pPage = GetPage(); + if( pPage ) + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage())); + if( rDoc.GetMasterPageCount() ) + { + SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin(); + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + aAny <<= aVisibleLayers.IsSet(rLayerAdmin.GetLayerID(sUNO_LayerName_background)); + } + else + { + aAny <<= false; + } + } + break; + } + case WID_PAGE_BACKOBJVIS: + { + SdrPage* pPage = GetPage(); + if( pPage ) + { + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage())); + if( rDoc.GetMasterPageCount() ) + { + SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin(); + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + aAny <<= aVisibleLayers.IsSet(rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects)); + } + else + { + aAny <<= false; + } + } + break; + } + case WID_PAGE_USERATTRIBS: + { + GetPage()->getAlienAttributes( aAny ); + break; + } + case WID_PAGE_BOOKMARK: + { + aAny <<= getBookmarkURL(); + break; + } + case WID_PAGE_ISDARK: + { + aAny <<= GetPage()->GetPageBackgroundColor().IsDark(); + break; + } + case WID_PAGE_HEADERVISIBLE: + aAny <<= GetPage()->getHeaderFooterSettings().mbHeaderVisible; + break; + case WID_PAGE_HEADERTEXT: + { + const OUString aText( GetPage()->getHeaderFooterSettings().maHeaderText ); + aAny <<= aText; + } + break; + case WID_PAGE_FOOTERVISIBLE: + aAny <<= GetPage()->getHeaderFooterSettings().mbFooterVisible; + break; + case WID_PAGE_FOOTERTEXT: + { + const OUString aText( GetPage()->getHeaderFooterSettings().maFooterText ); + aAny <<= aText; + } + break; + case WID_PAGE_PAGENUMBERVISIBLE: + aAny <<= GetPage()->getHeaderFooterSettings().mbSlideNumberVisible; + break; + case WID_PAGE_DATETIMEVISIBLE: + aAny <<= GetPage()->getHeaderFooterSettings().mbDateTimeVisible; + break; + case WID_PAGE_DATETIMEFIXED: + aAny <<= GetPage()->getHeaderFooterSettings().mbDateTimeIsFixed; + break; + case WID_PAGE_DATETIMETEXT: + { + const OUString aText( GetPage()->getHeaderFooterSettings().maDateTimeText ); + aAny <<= aText; + } + break; + case WID_PAGE_DATETIMEFORMAT: + { + auto const & rSettings = GetPage()->getHeaderFooterSettings(); + sal_Int32 x = static_cast(rSettings.meDateFormat) | (static_cast(rSettings.meTimeFormat) << 4); + aAny <<= x; + } + break; + + case WID_TRANSITION_TYPE: + aAny <<= GetPage()->getTransitionType(); + break; + + case WID_TRANSITION_SUBTYPE: + aAny <<= GetPage()->getTransitionSubtype(); + break; + + case WID_TRANSITION_DIRECTION: + aAny <<= GetPage()->getTransitionDirection(); + break; + + case WID_TRANSITION_FADE_COLOR: + aAny <<= GetPage()->getTransitionFadeColor(); + break; + + case WID_TRANSITION_DURATION: + aAny <<= GetPage()->getTransitionDuration(); + break; + + case WID_PAGE_THEME: + { + SdrPage* pPage = GetPage(); + css::uno::Reference xTheme; + auto pTheme = pPage->getSdrPageProperties().getTheme(); + if (pTheme) + xTheme = model::theme::createXTheme(pTheme); + aAny <<= xTheme; + break; + } + + case WID_PAGE_THEME_UNO_REPRESENTATION: + { + SdrPage* pPage = GetPage(); + auto pTheme = pPage->getSdrPageProperties().getTheme(); + if (pTheme) + pTheme->ToAny(aAny); + else + { + beans::PropertyValues aValues; + aAny <<= aValues; + } + break; + } + + default: + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + } + return aAny; +} + +void SAL_CALL SdGenericDrawPage::addPropertyChangeListener( const OUString& , const Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdGenericDrawPage::removePropertyChangeListener( const OUString& , const Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdGenericDrawPage::addVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >& ) {} +void SAL_CALL SdGenericDrawPage::removeVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >& ) {} + +// XMultiPropertySet +void SAL_CALL SdGenericDrawPage::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) +{ + if( aPropertyNames.getLength() != aValues.getLength() ) + throw lang::IllegalArgumentException(); + + const OUString* pNames = aPropertyNames.getConstArray(); + const Any* pValues = aValues.getConstArray(); + sal_uInt32 nCount = aValues.getLength(); + while( nCount-- ) + { + try + { + setPropertyValue( *pNames++, *pValues++ ); + } + catch( beans::UnknownPropertyException& ) + { + // ignore for multi property set + // todo: optimize this! + } + } +} + +Sequence< Any > SAL_CALL SdGenericDrawPage::getPropertyValues( const Sequence< OUString >& aPropertyNames ) +{ + sal_Int32 nCount = aPropertyNames.getLength(); + Sequence< Any > aValues( nCount ); + std::transform(aPropertyNames.begin(), aPropertyNames.end(), aValues.getArray(), + [this](const OUString& rName) -> Any { + Any aValue; + try + { + aValue = getPropertyValue(rName); + } + catch( beans::UnknownPropertyException& ) + { + // ignore for multi property set + // todo: optimize this! + } + return aValue; + }); + return aValues; +} + +void SAL_CALL SdGenericDrawPage::addPropertiesChangeListener( const Sequence< OUString >& , const Reference< beans::XPropertiesChangeListener >& ) +{ +} + +void SAL_CALL SdGenericDrawPage::removePropertiesChangeListener( const Reference< beans::XPropertiesChangeListener >& ) +{ +} + +void SAL_CALL SdGenericDrawPage::firePropertiesChangeEvent( const Sequence< OUString >& , const Reference< beans::XPropertiesChangeListener >& ) +{ +} + +Reference< drawing::XShape > SdGenericDrawPage::CreateShape(SdrObject *pObj) const +{ + DBG_ASSERT( GetPage(), "SdGenericDrawPage::CreateShape(), can't create shape for disposed page!" ); + DBG_ASSERT( pObj, "SdGenericDrawPage::CreateShape(), invalid call with pObj == 0!" ); + + if (!pObj) + return Reference< drawing::XShape >(); + + if (GetPage()) + { + PresObjKind eKind = GetPage()->GetPresObjKind(pObj); + + rtl::Reference pShape; + + if(pObj->GetObjInventor() == SdrInventor::Default) + { + SdrObjKind nInventor = pObj->GetObjIdentifier(); + switch( nInventor ) + { + case SdrObjKind::TitleText: + pShape = new SvxShapeText( pObj ); + if( GetPage()->GetPageKind() == PageKind::Notes && GetPage()->IsMasterPage() ) + { + // fake an empty PageShape if it's a title shape on the master page + pShape->SetShapeType("com.sun.star.presentation.PageShape"); + } + else + { + pShape->SetShapeType("com.sun.star.presentation.TitleTextShape"); + } + eKind = PresObjKind::NONE; + break; + case SdrObjKind::OutlineText: + pShape = new SvxShapeText( pObj ); + pShape->SetShapeType("com.sun.star.presentation.OutlinerShape"); + eKind = PresObjKind::NONE; + break; + default: ; + } + } + + Reference< drawing::XShape > xShape( pShape ); + + if(!xShape.is()) + xShape = SvxDrawPage::CreateShape( pObj ); + + if( eKind != PresObjKind::NONE ) + { + OUString aShapeType("com.sun.star.presentation."); + + switch( eKind ) + { + case PresObjKind::Title: + aShapeType += "TitleTextShape"; + break; + case PresObjKind::Outline: + aShapeType += "OutlinerShape"; + break; + case PresObjKind::Text: + aShapeType += "SubtitleShape"; + break; + case PresObjKind::Graphic: + aShapeType += "GraphicObjectShape"; + break; + case PresObjKind::Object: + aShapeType += "OLE2Shape"; + break; + case PresObjKind::Chart: + aShapeType += "ChartShape"; + break; + case PresObjKind::OrgChart: + aShapeType += "OrgChartShape"; + break; + case PresObjKind::Calc: + aShapeType += "CalcShape"; + break; + case PresObjKind::Table: + aShapeType += "TableShape"; + break; + case PresObjKind::Media: + aShapeType += "MediaShape"; + break; + case PresObjKind::Page: + aShapeType += "PageShape"; + break; + case PresObjKind::Handout: + aShapeType += "HandoutShape"; + break; + case PresObjKind::Notes: + aShapeType += "NotesShape"; + break; + case PresObjKind::Footer: + aShapeType += "FooterShape"; + break; + case PresObjKind::Header: + aShapeType += "HeaderShape"; + break; + case PresObjKind::SlideNumber: + aShapeType += "SlideNumberShape"; + break; + case PresObjKind::DateTime: + aShapeType += "DateTimeShape"; + break; + // coverity[dead_error_begin] - following conditions exist to avoid compiler warning + case PresObjKind::NONE: + break; + } + + if( !pShape ) + pShape = comphelper::getFromUnoTunnel( xShape ); + + if( pShape ) + pShape->SetShapeType( aShapeType ); + } + + SvxShape *pSdShape = comphelper::getFromUnoTunnel(xShape); + if (pSdShape) + { + // SdXShape aggregates SvxShape + new SdXShape(pSdShape, GetModel()); + } + return xShape; + } + else + { + return SvxDrawPage::CreateShape( pObj ); + } + +} + +// XServiceInfo +Sequence< OUString > SAL_CALL SdGenericDrawPage::getSupportedServiceNames() +{ + return comphelper::concatSequences( + SvxDrawPage::getSupportedServiceNames(), + std::initializer_list{ u"com.sun.star.drawing.GenericDrawPage", + u"com.sun.star.document.LinkTarget", + u"com.sun.star.document.LinkTargetSupplier" }); +} + +// XLinkTargetSupplier +Reference< container::XNameAccess > SAL_CALL SdGenericDrawPage::getLinks( ) +{ + return new SdPageLinkTargets( this ); +} + +void SdGenericDrawPage::setBackground( const Any& ) +{ + OSL_FAIL( "Don't call me, I'm useless!" ); +} + +void SdGenericDrawPage::getBackground( Any& ) +{ + OSL_FAIL( "Don't call me, I'm useless!" ); +} + +OUString SdGenericDrawPage::getBookmarkURL() const +{ + OUString aRet; + if( SvxDrawPage::mpPage ) + { + OUString aFileName( static_cast(SvxDrawPage::mpPage)->GetFileName() ); + if( !aFileName.isEmpty() ) + { + const OUString aBookmarkName( SdDrawPage::getPageApiNameFromUiName( static_cast(SvxDrawPage::mpPage)->GetBookmarkName() ) ); + aRet = aFileName + "#" + aBookmarkName; + } + } + + return aRet; +} + +void SdGenericDrawPage::setBookmarkURL( std::u16string_view rURL ) +{ + if( !SvxDrawPage::mpPage ) + return; + + size_t nIndex = rURL.find( '#' ); + if( nIndex == std::u16string_view::npos ) + return; + + const OUString aFileName( rURL.substr( 0, nIndex ) ); + const OUString aBookmarkName( SdDrawPage::getUiNameFromPageApiName( OUString(rURL.substr( nIndex+1 )) ) ); + + if( !aFileName.isEmpty() && !aBookmarkName.isEmpty() ) + { + static_cast(SvxDrawPage::mpPage)->DisconnectLink(); + static_cast(SvxDrawPage::mpPage)->SetFileName( aFileName ); + static_cast(SvxDrawPage::mpPage)->SetBookmarkName( aBookmarkName ); + static_cast(SvxDrawPage::mpPage)->ConnectLink(); + } +} + +Reference< drawing::XShape > SAL_CALL SdGenericDrawPage::combine( const Reference< drawing::XShapes >& xShapes ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + DBG_ASSERT(SvxDrawPage::mpPage,"SdrPage is NULL! [CL]"); + DBG_ASSERT(mpView, "SdrView is NULL! [CL]"); + + Reference< drawing::XShape > xShape; + if(mpView==nullptr||!xShapes.is()||GetPage()==nullptr) + return xShape; + + SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() ); + + SelectObjectsInView( xShapes, pPageView ); + + mpView->CombineMarkedObjects( false ); + + mpView->AdjustMarkHdl(); + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( pObj ) + xShape.set( pObj->getUnoShape(), UNO_QUERY ); + } + + mpView->HideSdrPage(); + + GetModel()->SetModified(); + + return xShape; +} + +void SAL_CALL SdGenericDrawPage::split( const Reference< drawing::XShape >& xGroup ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(mpView==nullptr||!xGroup.is()||GetPage()==nullptr) + return; + + SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() ); + SelectObjectInView( xGroup, pPageView ); + mpView->DismantleMarkedObjects(); + mpView->HideSdrPage(); + + GetModel()->SetModified(); +} + +Reference< drawing::XShape > SAL_CALL SdGenericDrawPage::bind( const Reference< drawing::XShapes >& xShapes ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + uno::Reference< drawing::XShape > xShape; + if(mpView==nullptr||!xShapes.is()||GetPage()==nullptr) + return xShape; + + SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() ); + + SelectObjectsInView( xShapes, pPageView ); + + mpView->CombineMarkedObjects(); + + mpView->AdjustMarkHdl(); + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( pObj ) + xShape.set( pObj->getUnoShape(), UNO_QUERY ); + } + + mpView->HideSdrPage(); + + GetModel()->SetModified(); + + return xShape; +} + +void SAL_CALL SdGenericDrawPage::unbind( const Reference< drawing::XShape >& xShape ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(mpView==nullptr||!xShape.is()||GetPage()==nullptr) + return; + + SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() ); + SelectObjectInView( xShape, pPageView ); + mpView->DismantleMarkedObjects( true ); + mpView->HideSdrPage(); + + GetModel()->SetModified(); +} + +void SdGenericDrawPage::SetLeftBorder( sal_Int32 nValue ) +{ + if( nValue == GetPage()->GetLeftBorder() ) + return; + + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetLeftBorder( nValue ); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetLeftBorder( nValue ); + } +} + +void SdGenericDrawPage::SetRightBorder( sal_Int32 nValue ) +{ + if( nValue == GetPage()->GetRightBorder() ) + return; + + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetRightBorder( nValue ); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetRightBorder( nValue ); + } +} + +void SdGenericDrawPage::SetUpperBorder( sal_Int32 nValue ) +{ + if( nValue == GetPage()->GetUpperBorder() ) + return; + + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetUpperBorder( nValue ); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetUpperBorder( nValue ); + } +} + +void SdGenericDrawPage::SetLowerBorder( sal_Int32 nValue ) +{ + if( nValue == GetPage()->GetLowerBorder() ) + return; + + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetLowerBorder( nValue ); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetLowerBorder( nValue ); + } +} + +static void refreshpage( SdDrawDocument* pDoc, const PageKind ePageKind ) +{ + ::sd::DrawDocShell* pDocShell = pDoc->GetDocSh(); + if ( !pDocShell ) + return; + + ::sd::ViewShell* pViewSh = pDocShell->GetViewShell(); + + if( !pViewSh ) + return; + + if( auto pDrawViewShell = dynamic_cast<::sd::DrawViewShell* >(pViewSh) ) + pDrawViewShell->ResetActualPage(); + + Size aPageSize = pDoc->GetSdPage(0, ePageKind)->GetSize(); + const tools::Long nWidth = aPageSize.Width(); + const tools::Long nHeight = aPageSize.Height(); + + Point aPageOrg(nWidth, nHeight / 2); + Size aViewSize(nWidth * 3, nHeight * 2); + + pDoc->SetMaxObjSize(aViewSize); + + pViewSh->InitWindows(aPageOrg, aViewSize, Point(-1, -1), true); + + pViewSh->UpdateScrollBars(); +} + +void SdGenericDrawPage::SetWidth( sal_Int32 nWidth ) +{ + Size aSize( GetPage()->GetSize() ); + if( aSize.getWidth() == nWidth ) + return; + + aSize.setWidth( nWidth ); + + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetSize(aSize); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetSize(aSize); + } + + refreshpage( &rDoc, ePageKind ); +} + +void SdGenericDrawPage::SetHeight( sal_Int32 nHeight ) +{ + Size aSize( GetPage()->GetSize() ); + if( aSize.getHeight() == nHeight ) + return; + + aSize.setHeight( nHeight ); + + SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage())); + const PageKind ePageKind = GetPage()->GetPageKind(); + + sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind); + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind); + pPage->SetSize(aSize); + } + + nPageCnt = rDoc.GetSdPageCount(ePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = rDoc.GetSdPage(i, ePageKind); + pPage->SetSize(aSize); + } + + refreshpage( &rDoc, ePageKind ); +} + +// XComponent +void SdGenericDrawPage::disposing() noexcept +{ + mpDocModel = nullptr; + SvxDrawPage::disposing(); +} + +// XAnimationNodeSupplier +Reference< XAnimationNode > SAL_CALL SdGenericDrawPage::getAnimationNode() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + SdPage *pSdPage = static_cast(SvxDrawPage::mpPage); + + return pSdPage->getAnimationNode(); +} + +// SdPageLinkTargets +SdPageLinkTargets::SdPageLinkTargets( SdGenericDrawPage* pUnoPage ) noexcept +{ + mxPage = pUnoPage; + mpUnoPage = pUnoPage; +} + +SdPageLinkTargets::~SdPageLinkTargets() noexcept +{ +} + +// XElementAccess +uno::Type SAL_CALL SdPageLinkTargets::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdPageLinkTargets::hasElements() +{ + ::SolarMutexGuard aGuard; + + SdPage* pPage = mpUnoPage->GetPage(); + if( pPage != nullptr ) + { + SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups ); + + while( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + OUString aStr( pObj->GetName() ); + if( aStr.isEmpty() ) + if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj )) + aStr = pOleObj->GetPersistName(); + if( !aStr.isEmpty() ) + return true; + } + } + + return false; +} + +// container::XNameAccess + +// XNameAccess +Any SAL_CALL SdPageLinkTargets::getByName( const OUString& aName ) +{ + ::SolarMutexGuard aGuard; + + SdPage* pPage = mpUnoPage->GetPage(); + if( pPage != nullptr ) + { + SdrObject* pObj = FindObject( aName ); + if( pObj ) + { + Reference< beans::XPropertySet > aRef( pObj->getUnoShape(), uno::UNO_QUERY ); + return Any( aRef ); + } + } + + throw container::NoSuchElementException(); +} + +Sequence< OUString > SAL_CALL SdPageLinkTargets::getElementNames() +{ + ::SolarMutexGuard aGuard; + + sal_uInt32 nObjCount = 0; + + SdPage* pPage = mpUnoPage->GetPage(); + if( pPage != nullptr ) + { + SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups ); + while( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + OUString aStr( pObj->GetName() ); + if( aStr.isEmpty() ) + if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj )) + aStr = pOleObj->GetPersistName(); + if( !aStr.isEmpty() ) + nObjCount++; + } + } + + Sequence< OUString > aSeq( nObjCount ); + if( nObjCount > 0 ) + { + OUString* pStr = aSeq.getArray(); + + SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups ); + while( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + OUString aStr( pObj->GetName() ); + if( aStr.isEmpty() ) + if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj )) + aStr = pOleObj->GetPersistName(); + if( !aStr.isEmpty() ) + *pStr++ = aStr; + } + } + + return aSeq; +} + +sal_Bool SAL_CALL SdPageLinkTargets::hasByName( const OUString& aName ) +{ + ::SolarMutexGuard aGuard; + + return FindObject( aName ) != nullptr; +} + +SdrObject* SdPageLinkTargets::FindObject( std::u16string_view rName ) const noexcept +{ + SdPage* pPage = mpUnoPage->GetPage(); + if( pPage == nullptr ) + return nullptr; + + SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups ); + + while( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + OUString aStr( pObj->GetName() ); + if( aStr.isEmpty() ) + if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj )) + aStr = pOleObj->GetPersistName(); + if( !aStr.isEmpty() && (aStr == rName) ) + return pObj; + } + + return nullptr; +} + +// XServiceInfo +OUString SAL_CALL SdPageLinkTargets::getImplementationName() +{ + return "SdPageLinkTargets"; +} + +sal_Bool SAL_CALL SdPageLinkTargets::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +Sequence< OUString > SAL_CALL SdPageLinkTargets::getSupportedServiceNames() +{ + return { "com.sun.star.document.LinkTargets" }; +} + +// SdDrawPage +SdDrawPage::SdDrawPage(SdXImpressDocument* pModel, SdPage* pPage) + : SdGenericDrawPage( pModel, pPage, ImplGetDrawPagePropertySet( pModel->IsImpressDocument(), pPage->GetPageKind() ) ) +{ +} + +SdDrawPage::~SdDrawPage() noexcept +{ +} + +// XInterface +Any SAL_CALL SdDrawPage::queryInterface( const uno::Type & rType ) +{ + if( rType == cppu::UnoType::get() ) + { + return Any( Reference< drawing::XMasterPageTarget >( this ) ); + } + else if( IsImpressDocument() + && rType == cppu::UnoType::get() ) + { + SdPage * p = dynamic_cast(SvxDrawPage::mpPage); + if( p == nullptr || p->GetPageKind() != PageKind::Handout ) + { + return Any( Reference< presentation::XPresentationPage >( this ) ); + } + } + + return SdGenericDrawPage::queryInterface( rType ); +} + +void SAL_CALL SdDrawPage::acquire() noexcept +{ + SvxDrawPage::acquire(); +} + +void SAL_CALL SdDrawPage::release() noexcept +{ + SvxDrawPage::release(); +} + +UNO3_GETIMPLEMENTATION2_IMPL( SdDrawPage, SdGenericDrawPage ); + +// XTypeProvider +Sequence< uno::Type > SAL_CALL SdDrawPage::getTypes() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if( !maTypeSequence.hasElements() ) + { + const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PageKind::Standard; + bool bPresPage = IsImpressDocument() && ePageKind != PageKind::Handout; + + // Collect the types of this class. + ::std::vector aTypes; + aTypes.reserve(13); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + if( bPresPage ) + aTypes.push_back(cppu::UnoType::get()); + if( bPresPage && ePageKind == PageKind::Standard ) + aTypes.push_back(cppu::UnoType::get()); + + // Get types of base class. + // Join those types in a sequence. + return comphelper::concatSequences( + comphelper::containerToSequence(aTypes), + SdGenericDrawPage::getTypes() ); + } + + return maTypeSequence; +} + +Sequence< sal_Int8 > SAL_CALL SdDrawPage::getImplementationId() +{ + return css::uno::Sequence(); +} + +OUString SdDrawPage::getPageApiName( SdPage const * pPage ) +{ + return ::getPageApiName( pPage ); +} + +OUString getPageApiName( SdPage const * pPage ) +{ + OUString aPageName; + + if(pPage) + { + aPageName = pPage->GetRealName(); + + if( aPageName.isEmpty() ) + { + const sal_Int32 nPageNum = ( ( pPage->GetPageNum() - 1 ) >> 1 ) + 1; + aPageName = sEmptyPageName + OUString::number( nPageNum ); + } + } + + return aPageName; +} + +OUString getPageApiNameFromUiName( const OUString& rUIName ) +{ + OUString aApiName; + + OUString aDefPageName(SdResId(STR_PAGE) + " "); + + if( rUIName.startsWith( aDefPageName ) ) + { + aApiName = OUString::Concat(sEmptyPageName) + rUIName.subView( aDefPageName.getLength() ); + } + else + { + aApiName = rUIName; + } + + return aApiName; +} + +OUString SdDrawPage::getPageApiNameFromUiName( const OUString& rUIName ) +{ + return ::getPageApiNameFromUiName( rUIName ); +} + +OUString getUiNameFromPageApiNameImpl( const OUString& rApiName ) +{ + const OUString aDefPageName( sEmptyPageName ); + if( rApiName.startsWith( aDefPageName ) ) + { + std::u16string_view aNumber( rApiName.subView( aDefPageName.getLength() ) ); + + // create the page number + sal_Int32 nPageNumber = o3tl::toInt32(aNumber); + + // check if there are non number characters in the number part + const size_t nChars = aNumber.size(); + const sal_Unicode* pString = aNumber.data(); + for( size_t nChar = 0; nChar < nChars; nChar++, pString++ ) + { + if((*pString < '0') || (*pString > '9')) + { + // found a non number character, so this is not the default + // name for this page + nPageNumber = -1; + break; + } + } + + if( nPageNumber != -1) + { + return SdResId(STR_PAGE) + " " + aNumber; + } + } + + return rApiName; +} + +OUString SdDrawPage::getUiNameFromPageApiName( const OUString& rApiName ) +{ + return getUiNameFromPageApiNameImpl( rApiName ); +} + +// XServiceInfo +OUString SAL_CALL SdDrawPage::getImplementationName() +{ + return "SdDrawPage"; +} + +Sequence< OUString > SAL_CALL SdDrawPage::getSupportedServiceNames() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + std::vector aAdd{ u"com.sun.star.drawing.DrawPage" }; + + if( IsImpressDocument() ) + aAdd.emplace_back(u"com.sun.star.presentation.DrawPage"); + + return comphelper::concatSequences(SdGenericDrawPage::getSupportedServiceNames(), aAdd); +} + +sal_Bool SAL_CALL SdDrawPage::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +// XNamed +void SAL_CALL SdDrawPage::setName( const OUString& rName ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + DBG_ASSERT( GetPage() && !GetPage()->IsMasterPage(), "Don't call base implementation for masterpages!" ); + + OUString aName( rName ); + + if(!(GetPage() && GetPage()->GetPageKind() != PageKind::Notes)) + return; + + // check if this is the default 'page1234' name + std::u16string_view aNumber; + if(o3tl::starts_with(aName, sEmptyPageName, &aNumber )) + { + // ok, it maybe is, aNumber is the number part after 'page' + + // create the page number + sal_Int32 nPageNumber = o3tl::toInt32(aNumber); + + // check if there are non number characters in the number part + const sal_Int32 nChars = aNumber.size(); + const sal_Unicode* pString = aNumber.data(); + sal_Int32 nChar; + for( nChar = 0; nChar < nChars; nChar++, pString++ ) + { + if((*pString < '0') || (*pString > '9')) + { + // found a non number character, so this is not the default + // name for this page + nPageNumber = -1; + break; + } + } + + if( nPageNumber == ( ( GetPage()->GetPageNum() - 1 ) >> 1 ) + 1 ) + aName.clear(); + } + else + { + OUString aDefaultPageName( SdResId(STR_PAGE) + " " ); + if( aName.startsWith( aDefaultPageName ) ) + aName.clear(); + } + + GetPage()->SetName( aName ); + + sal_uInt16 nNotesPageNum = (GetPage()->GetPageNum()-1)>>1; + if( GetModel()->GetDoc()->GetSdPageCount( PageKind::Notes ) > nNotesPageNum ) + { + SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( nNotesPageNum, PageKind::Notes ); + if( pNotesPage ) + pNotesPage->SetName(aName); + } + + // fake a mode change to repaint the page tab bar + ::sd::DrawDocShell* pDocSh = GetModel()->GetDocShell(); + ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : nullptr; + if( auto pDrawViewSh = dynamic_cast<::sd::DrawViewShell* >(pViewSh) ) + { + EditMode eMode = pDrawViewSh->GetEditMode(); + if( eMode == EditMode::Page ) + { + bool bLayer = pDrawViewSh->IsLayerModeActive(); + + pDrawViewSh->ChangeEditMode( eMode, !bLayer ); + pDrawViewSh->ChangeEditMode( eMode, bLayer ); + } + } + + GetModel()->SetModified(); +} + +OUString SAL_CALL SdDrawPage::getName() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + return getPageApiName( GetPage() ); +} + +// XMasterPageTarget +Reference< drawing::XDrawPage > SAL_CALL SdDrawPage::getMasterPage( ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(GetPage()) + { + Reference< drawing::XDrawPage > xPage; + + if(SvxDrawPage::mpPage->TRG_HasMasterPage()) + { + SdrPage& rMasterPage = SvxDrawPage::mpPage->TRG_GetMasterPage(); + xPage.set( rMasterPage.getUnoPage(), uno::UNO_QUERY ); + } + + return xPage; + } + return nullptr; +} + +void SAL_CALL SdDrawPage::setMasterPage( const Reference< drawing::XDrawPage >& xMasterPage ) +{ + ::SolarMutexGuard aGuard; + comphelper::ProfileZone aZone("setMasterPage"); + + throwIfDisposed(); + + if(!SvxDrawPage::mpPage) + return; + + SdMasterPage* pMasterPage = comphelper::getFromUnoTunnel( xMasterPage ); + if( !(pMasterPage && pMasterPage->isValid()) ) + return; + + SvxDrawPage::mpPage->TRG_ClearMasterPage(); + + SdPage* pSdPage = static_cast(pMasterPage->GetSdrPage()); + SvxDrawPage::mpPage->TRG_SetMasterPage(*pSdPage); + + SvxDrawPage::mpPage->SetBorder(pSdPage->GetLeftBorder(),pSdPage->GetUpperBorder(), + pSdPage->GetRightBorder(),pSdPage->GetLowerBorder() ); + + SvxDrawPage::mpPage->SetSize( pSdPage->GetSize() ); + SvxDrawPage::mpPage->SetOrientation( pSdPage->GetOrientation() ); + static_cast(SvxDrawPage::mpPage)->SetLayoutName( pSdPage->GetLayoutName() ); + + // set notes master also + SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( (SvxDrawPage::mpPage->GetPageNum()-1)>>1, PageKind::Notes ); + + pNotesPage->TRG_ClearMasterPage(); + sal_uInt16 nNum = SvxDrawPage::mpPage->TRG_GetMasterPage().GetPageNum() + 1; + pNotesPage->TRG_SetMasterPage(*SvxDrawPage::mpPage->getSdrModelFromSdrPage().GetMasterPage(nNum)); + pNotesPage->SetLayoutName( pSdPage->GetLayoutName() ); + + GetModel()->SetModified(); +} + +// XPresentationPage +Reference< drawing::XDrawPage > SAL_CALL SdDrawPage::getNotesPage() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(SvxDrawPage::mpPage && GetModel()->GetDoc() && SvxDrawPage::mpPage->GetPageNum() ) + { + SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( (SvxDrawPage::mpPage->GetPageNum()-1)>>1, PageKind::Notes ); + if( pNotesPage ) + { + Reference< drawing::XDrawPage > xPage( pNotesPage->getUnoPage(), uno::UNO_QUERY ); + return xPage; + } + } + return nullptr; +} + +// XIndexAccess +sal_Int32 SAL_CALL SdDrawPage::getCount() +{ + return SdGenericDrawPage::getCount(); +} + +Any SAL_CALL SdDrawPage::getByIndex( sal_Int32 Index ) +{ + return SdGenericDrawPage::getByIndex( Index ); +} + +// XElementAccess +uno::Type SAL_CALL SdDrawPage::getElementType() +{ + return SdGenericDrawPage::getElementType(); +} + +sal_Bool SAL_CALL SdDrawPage::hasElements() +{ + return SdGenericDrawPage::hasElements(); +} + +// XShapes +void SAL_CALL SdDrawPage::add( const Reference< drawing::XShape >& xShape ) +{ + SdGenericDrawPage::add( xShape ); +} + +void SAL_CALL SdDrawPage::remove( const Reference< drawing::XShape >& xShape ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape ); + if( pObj ) + { + GetPage()->RemovePresObj(pObj); + pObj->SetUserCall(nullptr); + } + + SdGenericDrawPage::remove( xShape ); +} + +void SdDrawPage::setBackground( const Any& rValue ) +{ + Reference< beans::XPropertySet > xSet; + + if( !(rValue >>= xSet) && !rValue.hasValue() ) + throw lang::IllegalArgumentException(); + + if( !xSet.is() ) + { + // the easy case, no background set. Set drawing::FillStyle_NONE to represent this + GetPage()->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE)); + return; + } + + // is it our own implementation? + SdUnoPageBackground* pBack = dynamic_cast( xSet.get() ); + + SfxItemSetFixed aSet( GetModel()->GetDoc()->GetPool() ); + + if( pBack ) + { + pBack->fillItemSet( static_cast(&GetPage()->getSdrModelFromSdrPage()), aSet ); + } + else + { + rtl::Reference pBackground = new SdUnoPageBackground(); + + Reference< beans::XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() ); + Reference< beans::XPropertySetInfo > xDestSetInfo( pBackground->getPropertySetInfo() ); + + const Sequence< beans::Property > aProperties( xDestSetInfo->getProperties() ); + + for( const beans::Property& rProp : aProperties ) + { + const OUString aPropName( rProp.Name ); + if( xSetInfo->hasPropertyByName( aPropName ) ) + pBackground->setPropertyValue( aPropName, + xSet->getPropertyValue( aPropName ) ); + } + + pBackground->fillItemSet( static_cast(&GetPage()->getSdrModelFromSdrPage()), aSet ); + } + + if( aSet.Count() == 0 ) + { + // no background fill, represent by setting drawing::FillStyle_NONE + GetPage()->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE)); + } + else + { + // background fill, set at page (not sure if ClearItem is needed) + GetPage()->getSdrPageProperties().ClearItem(); + GetPage()->getSdrPageProperties().PutItemSet(aSet); + } + + // repaint only + SvxDrawPage::mpPage->ActionChanged(); +} + +// XAnnotationAccess: +Reference< XAnnotation > SAL_CALL SdGenericDrawPage::createAndInsertAnnotation() +{ + if( !GetPage() ) + throw DisposedException(); + + rtl::Reference< sd::Annotation > xRet; + GetPage()->createAnnotation(xRet); + return xRet; +} + +void SAL_CALL SdGenericDrawPage::removeAnnotation(const Reference< XAnnotation > & annotation) +{ + rtl::Reference xSdAnnotation = dynamic_cast(annotation.get()); + assert(bool(annotation) == bool(xSdAnnotation) && "must be of concrete type sd::Annotation"); + GetPage()->removeAnnotation(xSdAnnotation); +} + +Reference< XAnnotationEnumeration > SAL_CALL SdGenericDrawPage::createAnnotationEnumeration() +{ + return ::sd::createAnnotationEnumeration( std::vector(GetPage()->getAnnotations()) ); +} + +void SdDrawPage::getBackground(Any& rValue) +{ + const SfxItemSet& rFillAttributes = GetPage()->getSdrPageProperties().GetItemSet(); + + if(drawing::FillStyle_NONE == rFillAttributes.Get(XATTR_FILLSTYLE).GetValue()) + { + // no fill set (switched off by drawing::FillStyle_NONE), clear rValue to represent this + rValue.clear(); + } + else + { + // there is a fill set, export to rValue + Reference< beans::XPropertySet > xSet(new SdUnoPageBackground( + GetModel()->GetDoc(), + &GetPage()->getSdrPageProperties().GetItemSet())); + rValue <<= xSet; + } +} + +void SdGenericDrawPage::setNavigationOrder( const Any& rValue ) +{ + Reference< XIndexAccess > xIA( rValue, UNO_QUERY ); + if( xIA.is() ) + { + if( dynamic_cast< SdDrawPage* >( xIA.get() ) == this ) + { + if( GetPage()->HasObjectNavigationOrder() ) + GetPage()->ClearObjectNavigationOrder(); + + return; + } + else if( static_cast(xIA->getCount()) == GetPage()->GetObjCount() ) + { + GetPage()->SetNavigationOrder(xIA); + return; + } + } + throw IllegalArgumentException(); +} + +namespace { + +class SdNavigationOrderAccess : public ::cppu::WeakImplHelper< XIndexAccess > +{ +public: + explicit SdNavigationOrderAccess(SdrPage const * pPage); + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount( ) override; + virtual Any SAL_CALL getByIndex( sal_Int32 Index ) override; + + // XElementAccess + virtual Type SAL_CALL getElementType( ) override; + virtual sal_Bool SAL_CALL hasElements( ) override; + +private: + std::vector< Reference< XShape > > maShapes; +}; + +} + +SdNavigationOrderAccess::SdNavigationOrderAccess( SdrPage const * pPage ) +: maShapes( pPage ? pPage->GetObjCount() : 0 ) +{ + if( pPage ) + { + for (const rtl::Reference& pObj : *pPage) + { + sal_uInt32 nNavPos = pObj->GetNavigationPosition(); + DBG_ASSERT( !maShapes[nNavPos].is(), "sd::SdNavigationOrderAccess::SdNavigationOrderAccess(), duplicate navigation positions from core!" ); + maShapes[nNavPos].set( pObj->getUnoShape(), UNO_QUERY ); + } + } +} + +// XIndexAccess +sal_Int32 SAL_CALL SdNavigationOrderAccess::getCount( ) +{ + return static_cast< sal_Int32 >( maShapes.size() ); +} + +Any SAL_CALL SdNavigationOrderAccess::getByIndex( sal_Int32 Index ) +{ + if( (Index < 0) || (Index > getCount()) ) + throw IndexOutOfBoundsException(); + + return Any( maShapes[Index] ); +} + +// XElementAccess +Type SAL_CALL SdNavigationOrderAccess::getElementType( ) +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdNavigationOrderAccess::hasElements( ) +{ + return !maShapes.empty(); +} + +Any SdGenericDrawPage::getNavigationOrder() +{ + if( GetPage()->HasObjectNavigationOrder() ) + { + return Any( Reference< XIndexAccess >( new SdNavigationOrderAccess( GetPage() ) ) ); + } + else + { + return Any( Reference< XIndexAccess >( this ) ); + } +} + +SdMasterPage::SdMasterPage(SdXImpressDocument* pModel, SdPage* pPage) + : SdGenericDrawPage(pModel, pPage, ImplGetMasterPagePropertySet(pPage->GetPageKind())) +{ +} + +SdMasterPage::~SdMasterPage() noexcept +{ +} + +// XInterface +Any SAL_CALL SdMasterPage::queryInterface( const uno::Type & rType ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + uno::Any aAny; + + if( rType == cppu::UnoType::get() ) + aAny <<= Reference< container::XIndexAccess >(static_cast(this)); + else if( rType == cppu::UnoType::get() ) + aAny <<= Reference< container::XElementAccess >(static_cast(this)); + else if( rType == cppu::UnoType::get() ) + aAny <<= Reference< container::XNamed >(this); + else if( rType == cppu::UnoType::get() && + ( IsImpressDocument() && + GetPage() && GetPage()->GetPageKind() != PageKind::Handout) ) + aAny <<= Reference< presentation::XPresentationPage >( this ); + else + return SdGenericDrawPage::queryInterface( rType ); + + return aAny; +} + +void SAL_CALL SdMasterPage::acquire() noexcept +{ + SvxDrawPage::acquire(); +} + +void SAL_CALL SdMasterPage::release() noexcept +{ + SvxDrawPage::release(); +} + +UNO3_GETIMPLEMENTATION2_IMPL( SdMasterPage, SdGenericDrawPage ); + +// XTypeProvider +Sequence< uno::Type > SAL_CALL SdMasterPage::getTypes() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if( !maTypeSequence.hasElements() ) + { + const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PageKind::Standard; + bool bPresPage = IsImpressDocument() && SvxDrawPage::mpPage && ePageKind != PageKind::Handout; + + // Collect the types of this class. + ::std::vector aTypes; + aTypes.reserve(12); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + aTypes.push_back(cppu::UnoType::get()); + if( bPresPage ) + aTypes.push_back(cppu::UnoType::get()); + if( bPresPage && ePageKind == PageKind::Standard ) + aTypes.push_back(cppu::UnoType::get()); + + // Get types of base class. + // Join those types in a sequence. + return comphelper::concatSequences( + comphelper::containerToSequence(aTypes), + SdGenericDrawPage::getTypes() ); + } + + return maTypeSequence; +} + +Sequence< sal_Int8 > SAL_CALL SdMasterPage::getImplementationId() +{ + return css::uno::Sequence(); +} + +// XServiceInfo +OUString SAL_CALL SdMasterPage::getImplementationName() +{ + return "SdMasterPage"; +} + +Sequence< OUString > SAL_CALL SdMasterPage::getSupportedServiceNames() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + std::vector aAdd{ u"com.sun.star.drawing.MasterPage" }; + + if( SvxDrawPage::mpPage && static_cast(SvxDrawPage::mpPage)->GetPageKind() == PageKind::Handout ) + aAdd.emplace_back(u"com.sun.star.presentation.HandoutMasterPage"); + + return comphelper::concatSequences(SdGenericDrawPage::getSupportedServiceNames(), aAdd); +} + +sal_Bool SAL_CALL SdMasterPage::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +// XElementAccess +sal_Bool SAL_CALL SdMasterPage::hasElements() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if( SvxDrawPage::mpPage == nullptr ) + return false; + + return SvxDrawPage::mpPage->GetObjCount() > 0; +} + +uno::Type SAL_CALL SdMasterPage::getElementType() +{ + return SdGenericDrawPage::getElementType(); +} + +// XIndexAccess +sal_Int32 SAL_CALL SdMasterPage::getCount() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + return SdGenericDrawPage::getCount(); +} + +Any SAL_CALL SdMasterPage::getByIndex( sal_Int32 Index ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + return SdGenericDrawPage::getByIndex(Index); +} + +// internal +void SdMasterPage::setBackground( const Any& rValue ) +{ + // we need at least a beans::XPropertySet + Reference< beans::XPropertySet > xInputSet( rValue, UNO_QUERY ); + if( !xInputSet.is() ) + throw lang::IllegalArgumentException(); + + try + { + if( GetModel() && IsImpressDocument() ) + { + Reference< container::XNameAccess > xFamilies( GetModel()->getStyleFamilies(), UNO_SET_THROW ); + Reference< container::XNameAccess > xFamily( xFamilies->getByName( getName() ), UNO_QUERY_THROW ) ; + + Reference< beans::XPropertySet > xStyleSet( xFamily->getByName( sUNO_PseudoSheet_Background ), UNO_QUERY_THROW ); + + Reference< beans::XPropertySetInfo > xSetInfo( xInputSet->getPropertySetInfo(), UNO_SET_THROW ); + Reference< beans::XPropertyState > xSetStates( xInputSet, UNO_QUERY ); + + for( const auto pProp : ImplGetPageBackgroundPropertySet()->getPropertyMap().getPropertyEntries() ) + { + const OUString& rPropName = pProp->aName; + if( xSetInfo->hasPropertyByName( rPropName ) ) + { + if( !xSetStates.is() || xSetStates->getPropertyState( rPropName ) == beans::PropertyState_DIRECT_VALUE ) + xStyleSet->setPropertyValue( rPropName, xInputSet->getPropertyValue( rPropName ) ); + else + xSetStates->setPropertyToDefault( rPropName ); + } + } + } + else + { + // first fill an item set + // is it our own implementation? + SdUnoPageBackground* pBack = dynamic_cast( xInputSet.get() ); + + SfxItemSetFixed aSet( GetModel()->GetDoc()->GetPool() ); + + if( pBack ) + { + pBack->fillItemSet( static_cast(&GetPage()->getSdrModelFromSdrPage()), aSet ); + } + else + { + rtl::Reference pBackground = new SdUnoPageBackground(); + + Reference< beans::XPropertySetInfo > xInputSetInfo( xInputSet->getPropertySetInfo(), UNO_SET_THROW ); + Reference< beans::XPropertySetInfo > xDestSetInfo( pBackground->getPropertySetInfo(), UNO_SET_THROW ); + + const uno::Sequence< beans::Property> aProperties( xDestSetInfo->getProperties() ); + + for( const beans::Property& rProp : aProperties ) + { + const OUString aPropName( rProp.Name ); + if( xInputSetInfo->hasPropertyByName( aPropName ) ) + pBackground->setPropertyValue( aPropName, xInputSet->getPropertyValue( aPropName ) ); + } + + pBackground->fillItemSet( static_cast(&SvxDrawPage::mpPage->getSdrModelFromSdrPage()), aSet ); + } + + // if we find the background style, copy the set to the background + SdDrawDocument* pDoc = static_cast(&SvxDrawPage::mpPage->getSdrModelFromSdrPage()); + SfxStyleSheetBasePool* pSSPool = pDoc->GetStyleSheetPool(); + if(pSSPool) + { + OUString aLayoutName( static_cast< SdPage* >( SvxDrawPage::mpPage )->GetLayoutName() ); + aLayoutName = OUString::Concat(aLayoutName.subView(0, aLayoutName.indexOf(SD_LT_SEPARATOR)+4)) + + STR_LAYOUT_BACKGROUND; + SfxStyleSheetBase* pStyleSheet = pSSPool->Find( aLayoutName, SfxStyleFamily::Page ); + + if( pStyleSheet ) + { + pStyleSheet->GetItemSet().Put( aSet ); + + // repaint only + SvxDrawPage::mpPage->ActionChanged(); + return; + } + } + + // if no background style is available, set at page directly. This + // is an error and should NOT happen (and will be asserted from the SdrPage) + GetPage()->getSdrPageProperties().PutItemSet(aSet); + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SdMasterPage::setBackground()"); + } +} + +void SdMasterPage::getBackground( Any& rValue ) +{ + if( !GetModel() ) + return; + + try + { + if( IsImpressDocument() ) + { + Reference< container::XNameAccess > xFamilies( GetModel()->getStyleFamilies(), UNO_SET_THROW ); + Reference< container::XNameAccess > xFamily( xFamilies->getByName( getName() ), UNO_QUERY_THROW ); + + rValue <<= Reference< beans::XPropertySet >( xFamily->getByName( sUNO_PseudoSheet_Background ), UNO_QUERY_THROW ); + } + else + { + SdDrawDocument* pDoc = static_cast(&SvxDrawPage::mpPage->getSdrModelFromSdrPage()); + SfxStyleSheetBasePool* pSSPool = pDoc->GetStyleSheetPool(); + if(pSSPool) + { + OUString aLayoutName( static_cast< SdPage* >(SvxDrawPage::mpPage)->GetLayoutName() ); + aLayoutName = OUString::Concat(aLayoutName.subView(0, aLayoutName.indexOf(SD_LT_SEPARATOR)+4)) + + STR_LAYOUT_BACKGROUND; + SfxStyleSheetBase* pStyleSheet = pSSPool->Find( aLayoutName, SfxStyleFamily::Page ); + + if( pStyleSheet ) + { + SfxItemSet aStyleSet( pStyleSheet->GetItemSet()); + if( aStyleSet.Count() ) + { + rValue <<= Reference< beans::XPropertySet >( new SdUnoPageBackground( pDoc, &aStyleSet ) ); + return; + } + } + } + + // No style found, use fill attributes from page background. This + // should NOT happen and is an error + const SfxItemSet& rFallbackItemSet(SvxDrawPage::mpPage->getSdrPageProperties().GetItemSet()); + + if(drawing::FillStyle_NONE == rFallbackItemSet.Get(XATTR_FILLSTYLE).GetValue()) + { + rValue <<= Reference< beans::XPropertySet >( + new SdUnoPageBackground(GetModel()->GetDoc(), &rFallbackItemSet)); + } + else + { + rValue.clear(); + } + } + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::SdMasterPage::getBackground()"); + rValue.clear(); + } +} + +// XNamed +void SAL_CALL SdMasterPage::setName( const OUString& rName ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(!(SvxDrawPage::mpPage && GetPage()->GetPageKind() != PageKind::Notes)) + return; + + SdDrawDocument* pDoc = GetModel()->GetDoc(); + bool bOutDummy; + + // Slide Name has to be unique + if( pDoc && pDoc->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND ) + return; // throw Exception ? + + GetPage()->SetName( rName ); + + if( pDoc ) + pDoc->RenameLayoutTemplate( GetPage()->GetLayoutName(), rName ); + + // fake a mode change to repaint the page tab bar + ::sd::DrawDocShell* pDocSh = GetModel()->GetDocShell(); + ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : nullptr; + if( auto pDrawViewSh = dynamic_cast< ::sd::DrawViewShell* >(pViewSh) ) + { + EditMode eMode = pDrawViewSh->GetEditMode(); + if( eMode == EditMode::MasterPage ) + { + bool bLayer = pDrawViewSh->IsLayerModeActive(); + + pDrawViewSh->ChangeEditMode( eMode, !bLayer ); + pDrawViewSh->ChangeEditMode( eMode, bLayer ); + } + } + + GetModel()->SetModified(); +} + +OUString SAL_CALL SdMasterPage::getName( ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(SvxDrawPage::mpPage) + { + OUString aLayoutName( GetPage()->GetLayoutName() ); + return aLayoutName.copy(0, aLayoutName.indexOf(SD_LT_SEPARATOR)); + } + + return OUString(); +} + +// XPresentationPage +Reference< drawing::XDrawPage > SAL_CALL SdMasterPage::getNotesPage() +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + if(SvxDrawPage::mpPage && GetModel()->GetDoc() ) + { + SdPage* pNotesPage = GetModel()->GetDoc()->GetMasterSdPage( (SvxDrawPage::mpPage->GetPageNum()-1)>>1, PageKind::Notes ); + if( pNotesPage ) + { + Reference< drawing::XDrawPage > xPage( pNotesPage->getUnoPage(), uno::UNO_QUERY ); + return xPage; + } + } + return nullptr; +} + +// XShapes +void SAL_CALL SdMasterPage::add( const Reference< drawing::XShape >& xShape ) +{ + SdGenericDrawPage::add( xShape ); +} + +void SAL_CALL SdMasterPage::remove( const Reference< drawing::XShape >& xShape ) +{ + ::SolarMutexGuard aGuard; + + throwIfDisposed(); + + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape ); + if( pObj && GetPage()->IsPresObj( pObj ) ) + GetPage()->RemovePresObj(pObj); + + SdGenericDrawPage::remove( xShape ); +} + +Reference< uno::XInterface > createUnoPageImpl( SdPage* pPage ) +{ + Reference< uno::XInterface > xPage; + + if( pPage ) + { + SdXImpressDocument* pModel = comphelper::getFromUnoTunnel( pPage->getSdrModelFromSdrPage().getUnoModel() ); + if( pModel ) + { + if( pPage->IsMasterPage() ) + { + xPage = static_cast(new SdMasterPage( pModel, pPage )); + } + else + { + xPage = static_cast(new SdDrawPage( pModel, pPage )); + } + } + } + + return xPage; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unopback.cxx b/sd/source/ui/unoidl/unopback.cxx new file mode 100644 index 0000000000..5b500371f5 --- /dev/null +++ b/sd/source/ui/unoidl/unopback.cxx @@ -0,0 +1,407 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "unopback.hxx" +#include +#include + +using namespace ::com::sun::star; + +const SvxItemPropertySet* ImplGetPageBackgroundPropertySet() +{ + static const SfxItemPropertyMapEntry aPageBackgroundPropertyMap_Impl[] = + { + FILL_PROPERTIES + }; + + static SvxItemPropertySet aPageBackgroundPropertySet_Impl( aPageBackgroundPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); + return &aPageBackgroundPropertySet_Impl; +} + +SdUnoPageBackground::SdUnoPageBackground( + SdDrawDocument* pDoc /* = NULL */, + const SfxItemSet* pSet /* = NULL */) +: mpPropSet(ImplGetPageBackgroundPropertySet()), + mpDoc(pDoc) +{ + if( pDoc ) + { + StartListening( *pDoc ); + mpSet = std::make_unique>( pDoc->GetPool() ); + + if( pSet ) + mpSet->Put(*pSet); + } +} + +SdUnoPageBackground::~SdUnoPageBackground() noexcept +{ + SolarMutexGuard g; + + if( mpDoc ) + EndListening( *mpDoc ); +} + +void SdUnoPageBackground::Notify( SfxBroadcaster&, const SfxHint& rHint ) +{ + if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint) + return; + const SdrHint* pSdrHint = static_cast( &rHint ); + + // delete item set if document is dying because then the pool + // will also die + if( pSdrHint->GetKind() == SdrHintKind::ModelCleared ) + { + mpSet.reset(); + mpDoc = nullptr; + } +} + +void SdUnoPageBackground::fillItemSet( SdDrawDocument* pDoc, SfxItemSet& rSet ) +{ + rSet.ClearItem(); + + if( mpSet == nullptr ) + { + StartListening( *pDoc ); + mpDoc = pDoc; + + mpSet = std::make_unique>( *rSet.GetPool() ); + + if( maUsrAnys.AreThereOwnUsrAnys() ) + { + for( const auto pProp : mpPropSet->getPropertyMap().getPropertyEntries() ) + { + uno::Any* pAny = maUsrAnys.GetUsrAnyForID( *pProp ); + if( pAny ) + { + const OUString & aPropertyName = pProp->aName; + switch( pProp->nWID ) + { + case XATTR_FILLFLOATTRANSPARENCE : + case XATTR_FILLGRADIENT : + { + if ( ( pAny->getValueType() == ::cppu::UnoType< css::awt::Gradient>::get() ) + && ( pProp->nMemberId == MID_FILLGRADIENT ) ) + { + setPropertyValue( aPropertyName, *pAny ); + } + else if ( ( pAny->getValueType() == ::cppu::UnoType::get() ) && + ( pProp->nMemberId == MID_NAME ) ) + { + setPropertyValue( aPropertyName, *pAny ); + } + } + break; + case XATTR_FILLHATCH : + { + if ( ( pAny->getValueType() == ::cppu::UnoType< css::drawing::Hatch>::get() ) + && ( pProp->nMemberId == MID_FILLHATCH ) ) + { + setPropertyValue( aPropertyName, *pAny ); + } + else if ( ( pAny->getValueType() == ::cppu::UnoType::get() ) && + ( pProp->nMemberId == MID_NAME ) ) + { + setPropertyValue( aPropertyName, *pAny ); + } + } + break; + case XATTR_FILLBITMAP : + { + if (pProp->nMemberId == MID_BITMAP && + (pAny->getValueType() == cppu::UnoType::get() || + pAny->getValueType() == cppu::UnoType::get())) + { + setPropertyValue( aPropertyName, *pAny ); + } + else if (pAny->getValueType() == ::cppu::UnoType::get() && pProp->nMemberId == MID_NAME) + { + setPropertyValue( aPropertyName, *pAny ); + } + } + break; + + default: + setPropertyValue( aPropertyName, *pAny ); + } + } + } + } + } + + rSet.Put( *mpSet ); +} + +// XServiceInfo +OUString SAL_CALL SdUnoPageBackground::getImplementationName() +{ + return "SdUnoPageBackground"; +} + +sal_Bool SAL_CALL SdUnoPageBackground::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService( this, ServiceName ); +} + +uno::Sequence< OUString > SAL_CALL SdUnoPageBackground::getSupportedServiceNames() +{ + return { sUNO_Service_PageBackground, sUNO_Service_FillProperties }; +} + +// XPropertySet +uno::Reference< beans::XPropertySetInfo > SAL_CALL SdUnoPageBackground::getPropertySetInfo() +{ + return mpPropSet->getPropertySetInfo(); +} + +void SAL_CALL SdUnoPageBackground::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue ) +{ + SolarMutexGuard aGuard; + + const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( aPropertyName ); + + if( pEntry == nullptr ) + { + throw beans::UnknownPropertyException( aPropertyName, static_cast(this)); + } + + if( mpSet ) + { + if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE ) + { + drawing::BitmapMode eMode; + if( aValue >>= eMode ) + { + mpSet->Put( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) ); + mpSet->Put( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) ); + return; + } + throw lang::IllegalArgumentException(); + } + + SfxItemPool& rPool = *mpSet->GetPool(); + SfxItemSet aSet( rPool, pEntry->nWID, pEntry->nWID); + aSet.Put( *mpSet ); + + if( !aSet.Count() ) + aSet.Put( rPool.GetDefaultItem( pEntry->nWID ) ); + + if( pEntry->nMemberId == MID_NAME && ( pEntry->nWID == XATTR_FILLBITMAP || pEntry->nWID == XATTR_FILLGRADIENT || pEntry->nWID == XATTR_FILLHATCH || pEntry->nWID == XATTR_FILLFLOATTRANSPARENCE ) ) + { + OUString aName; + if(!(aValue >>= aName )) + throw lang::IllegalArgumentException(); + + SvxShape::SetFillAttribute( pEntry->nWID, aName, aSet ); + } + else + { + SvxItemPropertySet_setPropertyValue( pEntry, aValue, aSet ); + } + + mpSet->Put( aSet ); + } + else + { + if(pEntry->nWID) + SvxItemPropertySet::setPropertyValue( pEntry, aValue, maUsrAnys ); + } +} + +uno::Any SAL_CALL SdUnoPageBackground::getPropertyValue( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + uno::Any aAny; + const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(PropertyName); + + if( pEntry == nullptr ) + { + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + } + + if( mpSet ) + { + if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE ) + { + const XFillBmpStretchItem* pStretchItem = mpSet->GetItem(XATTR_FILLBMP_STRETCH); + const XFillBmpTileItem* pTileItem = mpSet->GetItem(XATTR_FILLBMP_TILE); + + if( pStretchItem && pTileItem ) + { + if( pTileItem->GetValue() ) + aAny <<= drawing::BitmapMode_REPEAT; + else if( pStretchItem->GetValue() ) + aAny <<= drawing::BitmapMode_STRETCH; + else + aAny <<= drawing::BitmapMode_NO_REPEAT; + } + } + else + { + SfxItemPool& rPool = *mpSet->GetPool(); + SfxItemSet aSet( rPool, pEntry->nWID, pEntry->nWID); + aSet.Put( *mpSet ); + + if( !aSet.Count() ) + aSet.Put( rPool.GetDefaultItem( pEntry->nWID ) ); + + // get value from ItemSet + aAny = SvxItemPropertySet_getPropertyValue( pEntry, aSet ); + } + } + else + { + if(pEntry->nWID) + aAny = mpPropSet->getPropertyValue( pEntry, maUsrAnys ); + } + return aAny; +} + +void SAL_CALL SdUnoPageBackground::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdUnoPageBackground::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdUnoPageBackground::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {} +void SAL_CALL SdUnoPageBackground::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {} + +// XPropertyState +beans::PropertyState SAL_CALL SdUnoPageBackground::getPropertyState( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(PropertyName); + + if( pEntry == nullptr ) + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + + if( mpSet ) + { + if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE ) + { + if( mpSet->GetItemState( XATTR_FILLBMP_STRETCH, false ) == SfxItemState::SET || + mpSet->GetItemState( XATTR_FILLBMP_TILE, false ) == SfxItemState::SET ) + { + return beans::PropertyState_DIRECT_VALUE; + } + else + { + return beans::PropertyState_AMBIGUOUS_VALUE; + } + } + + switch( mpSet->GetItemState( pEntry->nWID, false ) ) + { + case SfxItemState::SET: + return beans::PropertyState_DIRECT_VALUE; + case SfxItemState::DEFAULT: + return beans::PropertyState_DEFAULT_VALUE; + default: +// case SfxItemState::DONTCARE: +// case SfxItemState::DISABLED: + return beans::PropertyState_AMBIGUOUS_VALUE; + } + } + else + { + if( nullptr == maUsrAnys.GetUsrAnyForID(*pEntry) ) + return beans::PropertyState_DEFAULT_VALUE; + else + return beans::PropertyState_DIRECT_VALUE; + } +} + +uno::Sequence< beans::PropertyState > SAL_CALL SdUnoPageBackground::getPropertyStates( const uno::Sequence< OUString >& aPropertyName ) +{ + SolarMutexGuard aGuard; + + sal_Int32 nCount = aPropertyName.getLength(); + + uno::Sequence< beans::PropertyState > aPropertyStateSequence( nCount ); + + std::transform(aPropertyName.begin(), aPropertyName.end(), aPropertyStateSequence.getArray(), + [this](const OUString& rName) -> beans::PropertyState { return getPropertyState(rName); }); + + return aPropertyStateSequence; +} + +void SAL_CALL SdUnoPageBackground::setPropertyToDefault( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(PropertyName); + + if( pEntry == nullptr ) + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + + if( mpSet ) + { + if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE ) + { + mpSet->ClearItem( XATTR_FILLBMP_STRETCH ); + mpSet->ClearItem( XATTR_FILLBMP_TILE ); + } + else + { + mpSet->ClearItem( pEntry->nWID ); + } + } +} + +uno::Any SAL_CALL SdUnoPageBackground::getPropertyDefault( const OUString& aPropertyName ) +{ + SolarMutexGuard aGuard; + + const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(aPropertyName); + if( pEntry == nullptr || mpSet == nullptr ) + throw beans::UnknownPropertyException( aPropertyName, static_cast(this)); + + uno::Any aAny; + if (pEntry->nWID == OWN_ATTR_FILLBMP_MODE) + { + aAny <<= drawing::BitmapMode_REPEAT; + } + else + { + SfxItemPool& rPool = *mpSet->GetPool(); + SfxItemSet aSet(rPool, pEntry->nWID, pEntry->nWID); + aSet.Put(rPool.GetDefaultItem(pEntry->nWID)); + + aAny = SvxItemPropertySet_getPropertyValue(pEntry, aSet); + } + return aAny; +} + +/** this is used because our property map is not sorted yet */ +const SfxItemPropertyMapEntry* SdUnoPageBackground::getPropertyMapEntry( std::u16string_view rPropertyName ) const noexcept +{ + return mpPropSet->getPropertyMap().getByName(rPropertyName); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unopback.hxx b/sd/source/ui/unoidl/unopback.hxx new file mode 100644 index 0000000000..c2834d9298 --- /dev/null +++ b/sd/source/ui/unoidl/unopback.hxx @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +class SdDrawDocument; +class SdrModel; +class SfxItemSet; +class SvxItemPropertySet; +struct SfxItemPropertyMapEntry; + +const SvxItemPropertySet* ImplGetPageBackgroundPropertySet(); + +class SdUnoPageBackground final : public ::cppu::WeakImplHelper< + css::beans::XPropertySet, + css::lang::XServiceInfo, + css::beans::XPropertyState>, + public SfxListener +{ + const SvxItemPropertySet* mpPropSet; + SvxItemPropertySetUsrAnys maUsrAnys; + std::unique_ptr mpSet; + SdrModel* mpDoc; + + const SfxItemPropertyMapEntry* getPropertyMapEntry( std::u16string_view rPropertyName ) const noexcept; +public: + SdUnoPageBackground( SdDrawDocument* pDoc = nullptr, const SfxItemSet* pSet = nullptr); + virtual ~SdUnoPageBackground() noexcept override; + + // internal + void fillItemSet( SdDrawDocument* pDoc, SfxItemSet& rSet ); + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override; + virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override; + virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; + virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; + virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; + virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; + + // XPropertyState + virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override; + virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL getPropertyStates( const css::uno::Sequence< OUString >& aPropertyName ) override; + virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override; + virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unopool.cxx b/sd/source/ui/unoidl/unopool.cxx new file mode 100644 index 0000000000..72c0062416 --- /dev/null +++ b/sd/source/ui/unoidl/unopool.cxx @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include "unopool.hxx" + +using namespace ::com::sun::star; +using namespace ::cppu; +using namespace ::comphelper; + +static LanguageType SdUnoGetLanguage( const lang::Locale& rLocale ) +{ + // empty language -> LANGUAGE_SYSTEM + if ( rLocale.Language.getLength() == 0 ) + return LANGUAGE_SYSTEM; + + LanguageType eRet = LanguageTag::convertToLanguageType( rLocale, false); + if ( eRet == LANGUAGE_NONE ) + eRet = LANGUAGE_SYSTEM; //! or throw an exception? + + return eRet; +} + +namespace { + +class SdUnoDrawPool final : public SvxUnoDrawPool +{ +public: + explicit SdUnoDrawPool(SdDrawDocument* pModel); + +protected: + virtual void putAny( SfxItemPool* pPool, const PropertyMapEntry* pEntry, const uno::Any& rValue ) override; + +private: + SdDrawDocument* mpDrawModel; +}; + +} + +SdUnoDrawPool::SdUnoDrawPool(SdDrawDocument* pModel) +: SvxUnoDrawPool( pModel, SvxPropertySetInfoPool::getDrawingDefaults() ), mpDrawModel( pModel ) +{ +} + +void SdUnoDrawPool::putAny( SfxItemPool* pPool, const comphelper::PropertyMapEntry* pEntry, const uno::Any& rValue ) +{ + switch( pEntry->mnHandle ) + { + case EE_CHAR_LANGUAGE: + case EE_CHAR_LANGUAGE_CJK: + case EE_CHAR_LANGUAGE_CTL: + { + lang::Locale aLocale; + if( rValue >>= aLocale ) + mpDrawModel->SetLanguage( + SdUnoGetLanguage( aLocale ), + static_cast(pEntry->mnHandle) ); + } + } + SvxUnoDrawPool::putAny( pPool, pEntry, rValue ); +} + +uno::Reference< uno::XInterface > SdUnoCreatePool( SdDrawDocument* pDrawModel ) +{ + return static_cast(new SdUnoDrawPool( pDrawModel )); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unopool.hxx b/sd/source/ui/unoidl/unopool.hxx new file mode 100644 index 0000000000..4188e80a9f --- /dev/null +++ b/sd/source/ui/unoidl/unopool.hxx @@ -0,0 +1,29 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include + +#include +#include + +css::uno::Reference SdUnoCreatePool(SdDrawDocument* pDrawModel); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unosrch.cxx b/sd/source/ui/unoidl/unosrch.cxx new file mode 100644 index 0000000000..6f93ed4c61 --- /dev/null +++ b/sd/source/ui/unoidl/unosrch.cxx @@ -0,0 +1,776 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; + +#define WID_SEARCH_BACKWARDS 0 +#define WID_SEARCH_CASE 1 +#define WID_SEARCH_WORDS 2 + +static std::span ImplGetSearchPropertyMap() +{ + static const SfxItemPropertyMapEntry aSearchPropertyMap_Impl[] = + { + { u"" UNO_NAME_SEARCH_BACKWARDS ""_ustr, WID_SEARCH_BACKWARDS, cppu::UnoType::get(), 0, 0 }, + { u"" UNO_NAME_SEARCH_CASE ""_ustr, WID_SEARCH_CASE, cppu::UnoType::get(), 0, 0 }, + { u"" UNO_NAME_SEARCH_WORDS ""_ustr, WID_SEARCH_WORDS, cppu::UnoType::get(), 0, 0 }, + }; + + return aSearchPropertyMap_Impl; +} + +namespace { + +class SearchContext_impl +{ + uno::Reference< drawing::XShapes > mxShapes; + sal_Int32 mnIndex; + +public: + SearchContext_impl(uno::Reference xShapes) + : mxShapes(std::move( xShapes )), mnIndex( -1 ) {} + + uno::Reference< drawing::XShape > firstShape() + { + mnIndex = -1; + return nextShape(); + } + + uno::Reference< drawing::XShape > nextShape() + { + uno::Reference< drawing::XShape > xShape; + mnIndex++; + if( mxShapes.is() && mxShapes->getCount() > mnIndex ) + { + mxShapes->getByIndex( mnIndex ) >>= xShape; + } + return xShape; + } +}; + +} + +/* ================================================================= */ +/** this class implements a search or replace operation on a given + page or a given sdrobj + */ + +SdUnoSearchReplaceShape::SdUnoSearchReplaceShape( drawing::XDrawPage* pPage ) noexcept + : mpPage(pPage) +{ +} + +SdUnoSearchReplaceShape::~SdUnoSearchReplaceShape() noexcept +{ +} + +// util::XReplaceable +uno::Reference< util::XReplaceDescriptor > SAL_CALL SdUnoSearchReplaceShape::createReplaceDescriptor() +{ + return new SdUnoSearchReplaceDescriptor; +} + +sal_Int32 SAL_CALL SdUnoSearchReplaceShape::replaceAll( const uno::Reference< util::XSearchDescriptor >& xDesc ) +{ + SdUnoSearchReplaceDescriptor* pDescr = dynamic_cast( xDesc.get() ); + if( pDescr == nullptr ) + return 0; + + sal_Int32 nFound = 0; + + uno::Reference< drawing::XShapes > xShapes; + uno::Reference< drawing::XShape > xShape; + + std::vector aContexts; + if(mpPage) + { + xShapes = mpPage; + + if( xShapes->getCount() ) + { + aContexts.push_back(SearchContext_impl(xShapes)); + xShape = aContexts.back().firstShape(); + } + else + { + xShapes = nullptr; + } + } + + while( xShape.is() ) + { + // replace in xShape + uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY); + uno::Reference< text::XTextRange > xRange = xText; + uno::Reference< text::XTextRange > xFound; + + while( xRange.is() ) + { + xFound = Search( xRange, pDescr ); + if( !xFound.is() ) + break; + + xFound->setString( pDescr->getReplaceString() ); + xRange = xFound->getEnd(); + nFound++; + } + // done with xShape -> get next shape + + // test if it's a group + uno::Reference< drawing::XShapes > xGroupShape( xShape, uno::UNO_QUERY ); + if( xGroupShape.is() && ( xGroupShape->getCount() > 0 ) ) + { + aContexts.push_back(SearchContext_impl(xGroupShape)); + xShape = aContexts.back().firstShape(); + } + else + { + if (!aContexts.empty()) + xShape = aContexts.back().nextShape(); + else + xShape = nullptr; + } + + // test parent contexts for next shape if none + // is found in the current context + while (!aContexts.empty() && !xShape.is()) + { + aContexts.pop_back(); + if (!aContexts.empty()) + xShape = aContexts.back().nextShape(); + } + } + + return nFound; +} + +// XSearchable +uno::Reference< css::util::XSearchDescriptor > SAL_CALL SdUnoSearchReplaceShape::createSearchDescriptor( ) +{ + return new SdUnoSearchReplaceDescriptor; +} + +uno::Reference< css::container::XIndexAccess > SAL_CALL SdUnoSearchReplaceShape::findAll( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) +{ + SdUnoSearchReplaceDescriptor* pDescr = dynamic_cast( xDesc.get() ); + if( pDescr == nullptr ) + return uno::Reference< container::XIndexAccess > (); + + sal_Int32 nSequence = 32; + sal_Int32 nFound = 0; + + uno::Sequence < uno::Reference< uno::XInterface > > aSeq( nSequence ); + + uno::Reference< uno::XInterface > * pArray = aSeq.getArray(); + + uno::Reference< drawing::XShapes > xShapes; + uno::Reference< drawing::XShape > xShape; + + std::vector aContexts; + if(mpPage) + { + xShapes = mpPage; + + if( xShapes->getCount() > 0 ) + { + aContexts.push_back(SearchContext_impl(xShapes)); + xShape = aContexts.back().firstShape(); + } + else + { + xShapes = nullptr; + } + } + + while( xShape.is() ) + { + // find in xShape + uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY); + uno::Reference< text::XTextRange > xRange = xText; + uno::Reference< text::XTextRange > xFound; + + while( xRange.is() ) + { + xFound = Search( xRange, pDescr ); + if( !xFound.is() ) + break; + + if( nFound >= nSequence ) + { + nSequence += 32; + aSeq.realloc( nSequence ); + pArray = aSeq.getArray(); + } + + pArray[nFound++] = xFound; + + xRange = xFound->getEnd(); + } + // done with shape -> get next shape + + // test if it's a group + uno::Reference< drawing::XShapes > xGroupShape; + xGroupShape.set( xShape, uno::UNO_QUERY ); + + if( xGroupShape.is() && xGroupShape->getCount() > 0 ) + { + aContexts.push_back(SearchContext_impl(xGroupShape)); + xShape = aContexts.back().firstShape(); + } + else + { + if (!aContexts.empty()) + xShape = aContexts.back().nextShape(); + else + xShape = nullptr; + } + + // test parent contexts for next shape if none + // is found in the current context + while (!aContexts.empty() && !xShape.is()) + { + aContexts.pop_back(); + if (!aContexts.empty()) + xShape = aContexts.back().nextShape(); + } + } + + if( nFound != nSequence ) + aSeq.realloc( nFound ); + + uno::Reference xRet(new SdUnoFindAllAccess(aSeq)); + return xRet; +} + +uno::Reference< css::uno::XInterface > SAL_CALL SdUnoSearchReplaceShape::findFirst( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) +{ + uno::Reference< text::XTextRange > xRange( GetCurrentShape(), uno::UNO_QUERY ); + if( xRange.is() ) + return findNext( xRange, xDesc ); + + return uno::Reference< uno::XInterface > (); +} + +uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetCurrentShape() const noexcept +{ + uno::Reference< drawing::XShape > xShape; + + if( mpPage && mpPage->getCount() > 0) + mpPage->getByIndex(0) >>= xShape; + + return xShape; + +} + +uno::Reference< css::uno::XInterface > SAL_CALL SdUnoSearchReplaceShape::findNext( const css::uno::Reference< css::uno::XInterface >& xStartAt, const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) +{ + SdUnoSearchReplaceDescriptor* pDescr = dynamic_cast( xDesc.get() ); + + uno::Reference< uno::XInterface > xFound; + + uno::Reference< text::XTextRange > xRange( xStartAt, uno::UNO_QUERY ); + if(pDescr && xRange.is() ) + { + + uno::Reference< text::XTextRange > xCurrentRange( xStartAt, uno::UNO_QUERY ); + + uno::Reference< drawing::XShape > xCurrentShape( GetShape( xCurrentRange ) ); + + while(!xFound.is() && xRange.is()) + { + xFound = Search( xRange, pDescr ); + if(!xFound.is()) + { + // we need a new starting range now + xRange = nullptr; + + if(mpPage) + { + // we do a page wide search, so skip to the next shape here + // get next shape on our page + uno::Reference< drawing::XShape > xFound2( GetNextShape( mpPage, xCurrentShape ) ); + if( xFound2.is() && (xFound2.get() != xCurrentShape.get()) ) + xCurrentShape = xFound2; + else + xCurrentShape = nullptr; + + xRange.set( xCurrentShape, uno::UNO_QUERY ); + if(!(xCurrentShape.is() && (xRange.is()))) + xRange = nullptr; + } + else + { + // we search only in this shape, so end search if we have + // not found anything + } + } + } + } + return xFound; +} + +/** this method returns the shape that follows xCurrentShape in the shape collection xShapes. + It steps recursive into groupshapes and returns the xCurrentShape if it is the last + shape in this collection */ +uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetNextShape( const uno::Reference< container::XIndexAccess >& xShapes, const uno::Reference< drawing::XShape >& xCurrentShape ) noexcept +{ + uno::Reference< drawing::XShape > xFound; + + if(xShapes.is() && xCurrentShape.is()) + { + const sal_Int32 nCount = xShapes->getCount(); + for( sal_Int32 i = 0; i < nCount; i++ ) + { + uno::Reference< drawing::XShape > xSearchShape; + xShapes->getByIndex(i) >>= xSearchShape; + + if( xSearchShape.is() ) + { + uno::Reference< container::XIndexAccess > xGroup( xSearchShape, uno::UNO_QUERY ); + + if( xCurrentShape.get() == xSearchShape.get() ) + { + if( xGroup.is() && xGroup->getCount() > 0 ) + { + xGroup->getByIndex( 0 ) >>= xFound; + } + else + { + i++; + if( i < nCount ) + xShapes->getByIndex( i ) >>= xFound; + else + xFound = xCurrentShape; + } + + break; + } + else if( xGroup.is() ) + { + xFound = GetNextShape( xGroup, xCurrentShape ); + if( xFound.is() ) + { + if( xFound.get() == xCurrentShape.get() ) + { + // the current shape was found at the end of the group + i++; + if( i < nCount ) + { + xShapes->getByIndex(i) >>= xFound; + } + } + break; + } + } + } + } + } + + return xFound; +} + +uno::Reference< text::XTextRange > SdUnoSearchReplaceShape::Search( const uno::Reference< text::XTextRange >& xText, SdUnoSearchReplaceDescriptor* pDescr ) +{ + if(!xText.is()) + return uno::Reference< text::XTextRange > (); + + uno::Reference< text::XText > xParent( xText->getText() ); + + if( !xParent.is() ) + { + xParent.set( xText, uno::UNO_QUERY ); + } + + const OUString aText( xParent->getString() ); + + const sal_Int32 nTextLen = aText.getLength(); + + std::unique_ptr pConvertPos( new sal_Int32[nTextLen+2] ); + std::unique_ptr pConvertPara( new sal_Int32[nTextLen+2] ); + + sal_Int32* pPos = pConvertPos.get(); + sal_Int32* pPara = pConvertPara.get(); + + sal_Int32 nLastPos = 0, nLastPara = 0; + + uno::Reference< container::XEnumerationAccess > xEnumAccess( xParent, uno::UNO_QUERY ); + + // first we fill the arrays with the position and paragraph for every character + // inside the text + if( xEnumAccess.is() ) + { + uno::Reference< container::XEnumeration > xParaEnum( xEnumAccess->createEnumeration() ); + + while(xParaEnum->hasMoreElements()) + { + int ndbg = 0; + uno::Reference< text::XTextContent > xParagraph( xParaEnum->nextElement(), uno::UNO_QUERY ); + if( xParagraph.is() ) + xEnumAccess.set(xParagraph, css::uno::UNO_QUERY); + else + xEnumAccess.clear(); + + if( xEnumAccess.is() ) + { + uno::Reference< container::XEnumeration > xPortionEnum( xEnumAccess->createEnumeration() ); + if( xPortionEnum.is() ) + { + while(xPortionEnum->hasMoreElements()) + { + uno::Reference< text::XTextRange > xPortion( xPortionEnum->nextElement(), uno::UNO_QUERY ); + if( xPortion.is() ) + { + const OUString aPortion( xPortion->getString() ); + const sal_Int32 nLen = aPortion.getLength(); + + ESelection aStartSel( GetSelection( xPortion->getStart() ) ); + ESelection aEndSel( GetSelection( xPortion->getEnd() ) ); + + // special case for empty portions with content or length one portions with content (fields) + if( (aStartSel.nStartPos == aEndSel.nStartPos) || ( (aStartSel.nStartPos == (aEndSel.nStartPos - 1)) && (nLen > 1) ) ) + { + for( sal_Int32 i = 0; i < nLen; i++ ) + { + if( ndbg < (nTextLen+2) ) + { + *pPos++ = aStartSel.nStartPos; + *pPara++ = aStartSel.nStartPara; + + ndbg += 1; + } + else + { + OSL_FAIL( "array overflow while searching" ); + } + } + + nLastPos = aStartSel.nStartPos; + } + // normal case + else + { + for( sal_Int32 i = 0; i < nLen; i++ ) + { + if( ndbg < (nTextLen+2) ) + { + *pPos++ = aStartSel.nStartPos++; + *pPara++ = aStartSel.nStartPara; + + ndbg += 1; + } + else + { + OSL_FAIL( "array overflow while searching" ); + } + } + + nLastPos = aStartSel.nStartPos - 1; + DBG_ASSERT( aEndSel.nStartPos == aStartSel.nStartPos, "Search is not working" ); + } + nLastPara = aStartSel.nStartPara; + } + } + } + } + + if( ndbg < (nTextLen+2) ) + { + *pPos++ = nLastPos + 1; + *pPara++ = nLastPara; + } + else + { + OSL_FAIL( "array overflow while searching" ); + } + } + } + + uno::Reference< text::XTextRange > xFound; + ESelection aSel; + + if( xText.is() ) + aSel = GetSelection( xText ); + + sal_Int32 nStartPos; + sal_Int32 nEndPos = 0; + for( nStartPos = 0; nStartPos < nTextLen; nStartPos++ ) + { + if( pConvertPara[nStartPos] == aSel.nStartPara && pConvertPos[nStartPos] == aSel.nStartPos ) + break; + } + + if( Search( aText, nStartPos, nEndPos, pDescr ) ) + { + if( nStartPos <= nTextLen && nEndPos <= nTextLen ) + { + ESelection aSelection( pConvertPara[nStartPos], pConvertPos[nStartPos], + pConvertPara[nEndPos], pConvertPos[nEndPos] ); + + SvxUnoTextBase* pParent = comphelper::getFromUnoTunnel( xParent ); + + if(pParent) + { + rtl::Reference pRange = new SvxUnoTextRange( *pParent ); + xFound = pRange; + pRange->SetSelection(aSelection); + } + } + else + { + OSL_FAIL("Array overflow while searching!"); + } + } + + return xFound; +} + +bool SdUnoSearchReplaceShape::Search( const OUString& rText, sal_Int32& nStartPos, sal_Int32& nEndPos, SdUnoSearchReplaceDescriptor* pDescr ) noexcept +{ + OUString aSearchStr( pDescr->getSearchString() ); + OUString aText( rText ); + + if( !pDescr->IsCaseSensitive() ) + { + aText = aText.toAsciiLowerCase(); + aSearchStr = aSearchStr.toAsciiLowerCase(); + } + + sal_Int32 nFound = aText.indexOf( aSearchStr, nStartPos ); + if( nFound != -1 ) + { + nStartPos = nFound; + nEndPos = nFound + aSearchStr.getLength(); + + if(pDescr->IsWords()) + { + if( (nStartPos > 0 && aText[nStartPos-1] > ' ') || + (nEndPos < aText.getLength() && aText[nEndPos] > ' ') ) + { + nStartPos++; + return Search( aText, nStartPos, nEndPos, pDescr ); + } + } + + return true; + } + else + return false; +} + +ESelection SdUnoSearchReplaceShape::GetSelection( const uno::Reference< text::XTextRange >& xTextRange ) noexcept +{ + ESelection aSel; + SvxUnoTextRangeBase* pRange = comphelper::getFromUnoTunnel( xTextRange ); + + if(pRange) + aSel = pRange->GetSelection(); + + return aSel; +} + +uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetShape( const uno::Reference< text::XTextRange >& xTextRange ) noexcept +{ + uno::Reference< drawing::XShape > xShape; + + if(xTextRange.is()) + { + uno::Reference< text::XText > xText( xTextRange->getText() ); + + if(xText.is()) + { + do + { + xShape.set( xText, uno::UNO_QUERY ); + if(!xShape.is()) + { + uno::Reference< text::XText > xParent( xText->getText() ); + if(!xParent.is() || xText.get() == xParent.get()) + return xShape; + + xText = xParent; + } + } while( !xShape.is() ); + } + } + + return xShape; +} + +/* ================================================================= */ +/** this class holds the parameters and status of a search or replace + operation performed by class SdUnoSearchReplaceShape + */ + +SdUnoSearchReplaceDescriptor::SdUnoSearchReplaceDescriptor() +{ + mpPropSet.reset( new SvxItemPropertySet(ImplGetSearchPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool()) ); + + mbBackwards = false; + mbCaseSensitive = false; + mbWords = false; +} + +SdUnoSearchReplaceDescriptor::~SdUnoSearchReplaceDescriptor() noexcept +{ +} + +// XSearchDescriptor +OUString SAL_CALL SdUnoSearchReplaceDescriptor::getSearchString() +{ + return maSearchStr; +} + +void SAL_CALL SdUnoSearchReplaceDescriptor::setSearchString( const OUString& aString ) +{ + maSearchStr = aString; +} + +// XReplaceDescriptor +OUString SAL_CALL SdUnoSearchReplaceDescriptor::getReplaceString() +{ + return maReplaceStr; +} + +void SAL_CALL SdUnoSearchReplaceDescriptor::setReplaceString( const OUString& aReplaceString ) +{ + maReplaceStr = aReplaceString; +} + +// XPropertySet +uno::Reference< css::beans::XPropertySetInfo > SAL_CALL SdUnoSearchReplaceDescriptor::getPropertySetInfo() +{ + SolarMutexGuard aGuard; + return mpPropSet->getPropertySetInfo(); +} + +void SAL_CALL SdUnoSearchReplaceDescriptor::setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) +{ + SolarMutexGuard aGuard; + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName); + + bool bOk = false; + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_SEARCH_BACKWARDS: + bOk = (aValue >>= mbBackwards); + break; + case WID_SEARCH_CASE: + bOk = (aValue >>= mbCaseSensitive); + break; + case WID_SEARCH_WORDS: + bOk = (aValue >>= mbWords); + break; + default: + throw beans::UnknownPropertyException( aPropertyName, static_cast(this)); + } + + if( !bOk ) + throw lang::IllegalArgumentException(); +} + +uno::Any SAL_CALL SdUnoSearchReplaceDescriptor::getPropertyValue( const OUString& PropertyName ) +{ + SolarMutexGuard aGuard; + + uno::Any aAny; + + const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName); + + switch( pEntry ? pEntry->nWID : -1 ) + { + case WID_SEARCH_BACKWARDS: + aAny <<= mbBackwards; + break; + case WID_SEARCH_CASE: + aAny <<= mbCaseSensitive; + break; + case WID_SEARCH_WORDS: + aAny <<= mbWords; + break; + default: + throw beans::UnknownPropertyException( PropertyName, static_cast(this)); + } + + return aAny; +} + +void SAL_CALL SdUnoSearchReplaceDescriptor::addPropertyChangeListener( const OUString& , const css::uno::Reference< css::beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdUnoSearchReplaceDescriptor::removePropertyChangeListener( const OUString& , const css::uno::Reference< css::beans::XPropertyChangeListener >& ) {} +void SAL_CALL SdUnoSearchReplaceDescriptor::addVetoableChangeListener( const OUString& , const css::uno::Reference< css::beans::XVetoableChangeListener >& ) {} +void SAL_CALL SdUnoSearchReplaceDescriptor::removeVetoableChangeListener( const OUString& , const css::uno::Reference< css::beans::XVetoableChangeListener >& ) {} + +/* ================================================================= */ + +SdUnoFindAllAccess::SdUnoFindAllAccess( uno::Sequence< uno::Reference< uno::XInterface > > const & rSequence ) noexcept +:maSequence( rSequence ) +{ +} + +SdUnoFindAllAccess::~SdUnoFindAllAccess() noexcept +{ +} + +// XElementAccess +uno::Type SAL_CALL SdUnoFindAllAccess::getElementType() +{ + return cppu::UnoType::get(); +} + +sal_Bool SAL_CALL SdUnoFindAllAccess::hasElements() +{ + return maSequence.hasElements(); +} + +// XIndexAccess +sal_Int32 SAL_CALL SdUnoFindAllAccess::getCount() +{ + return maSequence.getLength(); +} + +uno::Any SAL_CALL SdUnoFindAllAccess::getByIndex( sal_Int32 Index ) +{ + if( Index < 0 || Index >= getCount() ) + throw lang::IndexOutOfBoundsException(); + + uno::Any aAny; + aAny <<= maSequence[Index]; + return aAny; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unowcntr.cxx b/sd/source/ui/unoidl/unowcntr.cxx new file mode 100644 index 0000000000..1079477ef3 --- /dev/null +++ b/sd/source/ui/unoidl/unowcntr.cxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include "unowcntr.hxx" + +using namespace ::com::sun::star; + +SvUnoWeakContainer::SvUnoWeakContainer() noexcept +{ +} + +SvUnoWeakContainer::~SvUnoWeakContainer() noexcept +{ +} + +/** inserts the given ref into this container */ +void SvUnoWeakContainer::insert( const uno::WeakReference< uno::XInterface >& xRef ) noexcept +{ + for ( auto it = maVector.begin(); it != maVector.end(); ) + { + uno::WeakReference< uno::XInterface > & rWeakRef = *it; + uno::Reference< uno::XInterface > xTestRef( rWeakRef ); + if ( !xTestRef.is() ) + { + it = maVector.erase( it ); + } + else + { + if ( rWeakRef == xRef ) + return; + ++it; + } + } + maVector.emplace_back( xRef ); +} + +/** searches the container for a ref that returns true on the given + search function +*/ +bool SvUnoWeakContainer::findRef( + uno::WeakReference< uno::XInterface >& rRef, + void const * pSearchData, + weakref_searchfunc pSearchFunc +) +{ + for ( auto it = maVector.begin(); it != maVector.end(); ) + { + uno::WeakReference< uno::XInterface > & itRef = *it; + uno::Reference< uno::XInterface > xTestRef( itRef ); + if ( !xTestRef.is() ) + { + it = maVector.erase( it ); + } + else + { + if( (*pSearchFunc)( itRef, pSearchData ) ) + { + rRef = itRef; + return true; + } + ++it; + } + } + return false; +} + +void SvUnoWeakContainer::dispose() +{ + for (auto const& elem : maVector) + { + uno::Reference< uno::XInterface > xTestRef( elem ); + if ( xTestRef.is() ) + { + uno::Reference< lang::XComponent > xComp( xTestRef, uno::UNO_QUERY ); + if( xComp.is() ) + xComp->dispose(); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/unoidl/unowcntr.hxx b/sd/source/ui/unoidl/unowcntr.hxx new file mode 100644 index 0000000000..a863f09291 --- /dev/null +++ b/sd/source/ui/unoidl/unowcntr.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +typedef bool (*weakref_searchfunc)( const css::uno::WeakReference< css::uno::XInterface >& xRef, void const * pSearchData ); + +class SvUnoWeakContainer +{ +private: + std::vector< css::uno::WeakReference< css::uno::XInterface > > maVector; + +public: + SvUnoWeakContainer() noexcept; + ~SvUnoWeakContainer() noexcept; + + /** inserts the given ref into this container */ + void insert( const css::uno::WeakReference< css::uno::XInterface >& xRef ) noexcept; + + /** searches the container for a ref that returns true on the given + search function + */ + bool findRef( css::uno::WeakReference< css::uno::XInterface >& rRef, void const * pSearchData, weakref_searchfunc pSearchFunc ); + + void dispose(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/DocumentRenderer.cxx b/sd/source/ui/view/DocumentRenderer.cxx new file mode 100644 index 0000000000..c9bed876e7 --- /dev/null +++ b/sd/source/ui/view/DocumentRenderer.cxx @@ -0,0 +1,2253 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd { + +namespace { + + /** Convenience class to extract values from the sequence of properties + given to one of the XRenderable methods. + */ + class PrintOptions + { + public: + PrintOptions ( + const vcl::PrinterOptionsHelper& rHelper, + std::vector&& rSlidesPerPage) + : mrProperties(rHelper), + maSlidesPerPage(std::move(rSlidesPerPage)) + { + } + + bool IsWarningOrientation() const + { + return GetBoolValue(nullptr, true); + } + + bool IsPrintPageName() const + { + return GetBoolValue("IsPrintName", false); + } + + bool IsDate() const + { + return GetBoolValue("IsPrintDateTime", false); + } + + bool IsTime() const + { + return GetBoolValue("IsPrintDateTime", false); + } + + bool IsHiddenPages() const + { + return GetBoolValue("IsPrintHidden", false); + } + + bool IsHandoutHorizontal() const + { + return GetBoolValue("SlidesPerPageOrder", sal_Int32(0)); + } + + sal_Int32 GetHandoutPageCount() const + { + sal_uInt32 nIndex = static_cast(mrProperties.getIntValue("SlidesPerPage", sal_Int32(0))); + if (nIndex(mrProperties.getIntValue( "Quality", sal_Int32(0) )); + return nQuality; + } + + bool IsPageSize() const + { + return GetBoolValue("PageOptions", sal_Int32(1)); + } + + bool IsTilePage() const + { + return GetBoolValue("PageOptions", sal_Int32(2)) || GetBoolValue("PageOptions", sal_Int32(3)); + } + + bool IsCutPage() const + { + return GetBoolValue("PageOptions", sal_Int32(0)); + } + + bool IsBooklet() const + { + return GetBoolValue("PrintProspect", false); + } + + bool IsPrinterPreferred(DocumentType eDocType) const + { + bool bIsDraw = eDocType == DocumentType::Draw; + return IsTilePage() || IsPageSize() || IsBooklet() || (!bIsDraw && !IsNotes()); + } + + bool IsPrintExcluded() const + { + return (IsNotes() || IsDraw() || IsHandout()) && IsHiddenPages(); + } + + bool IsPrintFrontPage() const + { + sal_Int32 nInclude = static_cast(mrProperties.getIntValue( "EvenOdd", 0 )); + return nInclude != 2; + } + + bool IsPrintBackPage() const + { + sal_Int32 nInclude = static_cast(mrProperties.getIntValue( "EvenOdd", 0 )); + return nInclude != 1; + } + + bool IsPaperBin() const + { + return GetBoolValue("PrintPaperFromSetup", false); + } + + bool IsPrintMarkedOnly() const + { + return GetBoolValue("PrintContent", sal_Int32(4)); + } + + OUString GetPrinterSelection (sal_Int32 nPageCount, sal_Int32 nCurrentPageIndex) const + { + sal_Int32 nContent = static_cast(mrProperties.getIntValue( "PrintContent", 0 )); + OUString sFullRange = "1-" + OUString::number(nPageCount); + + if (nContent == 0) // all pages/slides + { + return sFullRange; + } + + if (nContent == 1) // range + { + OUString sValue = mrProperties.getStringValue("PageRange"); + return sValue.isEmpty() ? sFullRange : sValue; + } + + if (nContent == 2 && // selection + nCurrentPageIndex >= 0) + { + return OUString::number(nCurrentPageIndex + 1); + } + + return OUString(); + } + + private: + const vcl::PrinterOptionsHelper& mrProperties; + const std::vector maSlidesPerPage; + + /** When the value of the property with name pName is a boolean then + return its value. When the property is unknown then + bDefaultValue is returned. Otherwise is returned. + */ + bool GetBoolValue ( + const char* pName, + const bool bDefaultValue) const + { + bool bValue = mrProperties.getBoolValue( pName, bDefaultValue ); + return bValue; + } + + /** Return when the value of the property with name pName is + an integer and its value is nTriggerValue. Otherwise is + returned. + */ + bool GetBoolValue ( + const char* pName, + const sal_Int32 nTriggerValue) const + { + sal_Int32 nValue = static_cast(mrProperties.getIntValue( pName, 0 )); + return nValue == nTriggerValue; + } + }; + + /** A collection of values that helps to reduce the number of arguments + given to some functions. Note that not all values are set at the + same time. + */ + class PrintInfo + { + public: + PrintInfo ( + Printer* pPrinter, + const bool bPrintMarkedOnly) + : mpPrinter(pPrinter), + mnDrawMode(DrawModeFlags::Default), + maPrintSize(0,0), + maPageSize(0,0), + meOrientation(Orientation::Portrait), + mbPrintMarkedOnly(bPrintMarkedOnly) + {} + + const VclPtr mpPrinter; + DrawModeFlags mnDrawMode; + OUString msTimeDate; + OUString msPageString; + Size maPrintSize; + Size maPageSize; + Orientation meOrientation; + MapMode maMap; + const bool mbPrintMarkedOnly; + }; + + /** Output one page of the document to the given printer. Note that + more than one document page may be output to one printer page. + */ + void PrintPage ( + Printer& rPrinter, + ::sd::View& rPrintView, + SdPage& rPage, + View const * pView, + const bool bPrintMarkedOnly, + const SdrLayerIDSet& rVisibleLayers, + const SdrLayerIDSet& rPrintableLayers) + { + rPrintView.ShowSdrPage(&rPage); + + const MapMode aOriginalMapMode (rPrinter.GetMapMode()); + + // Set the visible layers + SdrPageView* pPageView = rPrintView.GetSdrPageView(); + OSL_ASSERT(pPageView!=nullptr); + pPageView->SetVisibleLayers(rVisibleLayers); + pPageView->SetPrintableLayers(rPrintableLayers); + + if (pView!=nullptr && bPrintMarkedOnly) + pView->DrawMarkedObj(rPrinter); + else + rPrintView.CompleteRedraw(&rPrinter, + vcl::Region(::tools::Rectangle(Point(0,0), rPage.GetSize()))); + + rPrinter.SetMapMode(aOriginalMapMode); + + rPrintView.HideSdrPage(); + } + + /** Output a string (that typically is not part of a document page) to + the given printer. + */ + void PrintMessage ( + Printer& rPrinter, + const OUString& rsPageString, + const Point& rPageStringOffset) + { + const vcl::Font aOriginalFont (rPrinter.OutputDevice::GetFont()); + rPrinter.SetFont(vcl::Font(FAMILY_SWISS, Size(0, 423))); + rPrinter.DrawText(rPageStringOffset, rsPageString); + rPrinter.SetFont(aOriginalFont); + } + + /** Read the resources and process then into a sequence of properties + that can be passed to the printing dialog. + */ + class DialogCreator + { + public: + DialogCreator (ViewShellBase &rBase, bool bImpress, sal_Int32 nCurPage) + : mrBase(rBase) + , mbImpress(bImpress) + , mnCurPage(nCurPage) + { + ProcessResource(); + } + + const std::vector< beans::PropertyValue >& GetDialogControls() const + { + return maProperties; + } + + const std::vector& GetSlidesPerPage() const + { + return maSlidesPerPage; + } + + private: + ViewShellBase &mrBase; + std::vector maProperties; + std::vector maSlidesPerPage; + bool mbImpress; + sal_Int32 mnCurPage; + + void ProcessResource() + { + // load the writer PrinterOptions into the custom tab + beans::PropertyValue aOptionsUIFile; + aOptionsUIFile.Name = "OptionsUIFile"; + if( mbImpress ) + aOptionsUIFile.Value <<= OUString("modules/simpress/ui/impressprinteroptions.ui"); + else + aOptionsUIFile.Value <<= OUString("modules/sdraw/ui/drawprinteroptions.ui"); + maProperties.push_back(aOptionsUIFile); + + SvtModuleOptions aOpt; + OUString aAppGroupname(SdResId(STR_IMPRESS_PRINT_UI_GROUP_NAME)); + aAppGroupname = aAppGroupname.replaceFirst("%s", aOpt.GetModuleName( + mbImpress ? SvtModuleOptions::EModule::IMPRESS : SvtModuleOptions::EModule::DRAW)); + AddDialogControl(vcl::PrinterOptionsHelper::setGroupControlOpt("tabcontrol-page2", aAppGroupname, ".HelpID:vcl:PrintDialog:TabPage:AppPage")); + + uno::Sequence< OUString > aHelpIds, aWidgetIds; + if( mbImpress ) + { + aHelpIds = { ".HelpID:vcl:PrintDialog:PageContentType:ListBox" }; + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt( + "impressdocument", + SdResId(STR_IMPRESS_PRINT_UI_CONTENT), + aHelpIds, + "PageContentType" , + CreateChoice(STR_IMPRESS_PRINT_UI_CONTENT_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_CONTENT_CHOICES)), + 0) + ); + + aHelpIds = { ".HelpID:vcl:PrintDialog:SlidesPerPage:ListBox" }; + vcl::PrinterOptionsHelper::UIControlOptions aContentOpt( "PageContentType" , 1 ); + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt( + "slidesperpage", + SdResId(STR_IMPRESS_PRINT_UI_SLIDESPERPAGE), + aHelpIds, + "SlidesPerPage" , + GetSlidesPerPageSequence(), + 0, + Sequence< sal_Bool >(), + aContentOpt + ) + ); + + aHelpIds = { ".HelpID:vcl:PrintDialog:SlidesPerPageOrder:ListBox" }; + vcl::PrinterOptionsHelper::UIControlOptions aSlidesPerPageOpt( "SlidesPerPage" , -1, true ); + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt( + "slidesperpageorder", + SdResId(STR_IMPRESS_PRINT_UI_ORDER), + aHelpIds, + "SlidesPerPageOrder" , + CreateChoice(STR_IMPRESS_PRINT_UI_ORDER_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_ORDER_CHOICES)), + 0, + Sequence< sal_Bool >(), + aSlidesPerPageOpt ) + ); + } + + AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("contents", + SdResId(STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT), "" ) ); + + if( mbImpress ) + { + AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printname", + SdResId(STR_IMPRESS_PRINT_UI_IS_PRINT_NAME), + ".HelpID:vcl:PrintDialog:IsPrintName:CheckBox" , + "IsPrintName" , + officecfg::Office::Impress::Print::Other::PageName::get() + ) + ); + } + else + { + AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printname", + SdResId(STR_DRAW_PRINT_UI_IS_PRINT_NAME), + ".HelpID:vcl:PrintDialog:IsPrintName:CheckBox" , + "IsPrintName" , + officecfg::Office::Draw::Print::Other::PageName::get() + ) + ); + } + + AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printdatetime", + SdResId(STR_IMPRESS_PRINT_UI_IS_PRINT_DATE), + ".HelpID:vcl:PrintDialog:IsPrintDateTime:CheckBox" , + "IsPrintDateTime" , + // Separate settings for time and date in Impress/Draw -> Print page, check that both are set + mbImpress ? + officecfg::Office::Impress::Print::Other::Date::get() && + officecfg::Office::Impress::Print::Other::Time::get() : + officecfg::Office::Draw::Print::Other::Date::get() && + officecfg::Office::Draw::Print::Other::Time::get() + ) + ); + + if( mbImpress ) + { + AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printhidden", + SdResId(STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN), + ".HelpID:vcl:PrintDialog:IsPrintHidden:CheckBox" , + "IsPrintHidden" , + officecfg::Office::Impress::Print::Other::HiddenPage::get() + ) + ); + } + + AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("color", + SdResId(STR_IMPRESS_PRINT_UI_QUALITY), "" ) ); + + aHelpIds = { ".HelpID:vcl:PrintDialog:Quality:RadioButton:0", + ".HelpID:vcl:PrintDialog:Quality:RadioButton:1", + ".HelpID:vcl:PrintDialog:Quality:RadioButton:2" }; + aWidgetIds = { "originalcolors", "grayscale", "blackandwhite" }; + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceRadiosControlOpt( + aWidgetIds, + "", + aHelpIds, + "Quality" , + CreateChoice(STR_IMPRESS_PRINT_UI_QUALITY_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_QUALITY_CHOICES)), + mbImpress ? officecfg::Office::Impress::Print::Other::Quality::get() : + officecfg::Office::Draw::Print::Other::Quality::get() ) + + ); + + AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("pagesizes", + SdResId(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS), "" ) ); + + aHelpIds = { ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:0", + ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:1", + ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:2", + ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:3" }; + aWidgetIds = { "originalsize", "fittoprintable", "distributeonmultiple", "tilesheet" }; + + // Mutually exclusive page options settings are stored in separate config keys... + // TODO: There is no config key to set the distributeonmultiple option as default + sal_Int32 nDefaultChoice = 0; + if ( mbImpress ? officecfg::Office::Impress::Print::Page::PageSize::get() : + officecfg::Office::Draw::Print::Page::PageSize::get() ) + { + nDefaultChoice = 1; + } + else if ( mbImpress ? officecfg::Office::Impress::Print::Page::PageTile::get() : + officecfg::Office::Draw::Print::Page::PageTile::get() ) + { + nDefaultChoice = 3; + } + vcl::PrinterOptionsHelper::UIControlOptions aPageOptionsOpt("PrintProspect", 0); + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceRadiosControlOpt( + aWidgetIds, + "", + aHelpIds, + "PageOptions" , + mbImpress ? CreateChoice(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES)) : + CreateChoice(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW)), + nDefaultChoice, + Sequence< sal_Bool >(), + aPageOptionsOpt + ) + ); + + vcl::PrinterOptionsHelper::UIControlOptions aBrochureOpt; + aBrochureOpt.maGroupHint = "LayoutPage" ; + AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("pagesides", + SdResId(STR_IMPRESS_PRINT_UI_PAGE_SIDES), "", + aBrochureOpt ) ); + + // brochure printing + AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("brochure", + SdResId(STR_IMPRESS_PRINT_UI_BROCHURE), + ".HelpID:vcl:PrintDialog:PrintProspect:CheckBox" , + "PrintProspect" , + mbImpress ? officecfg::Office::Impress::Print::Page::Booklet::get() : + officecfg::Office::Draw::Print::Page::Booklet::get(), + aBrochureOpt + ) + ); + + vcl::PrinterOptionsHelper::UIControlOptions + aIncludeOpt( "PrintProspect" , -1, false ); + aIncludeOpt.maGroupHint = "LayoutPage" ; + aHelpIds = { ".HelpID:vcl:PrintDialog:PrintProspectInclude:ListBox" }; + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt( + "brochureinclude", + SdResId(STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE), + aHelpIds, + "PrintProspectInclude" , + CreateChoice(STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST)), + 0, + Sequence< sal_Bool >(), + aIncludeOpt + ) + ); + + // paper tray (on options page) + vcl::PrinterOptionsHelper::UIControlOptions aPaperTrayOpt; + aPaperTrayOpt.maGroupHint = "OptionsPageOptGroup" ; + AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printpaperfromsetup", + SdResId(STR_IMPRESS_PRINT_UI_PAPER_TRAY), + ".HelpID:vcl:PrintDialog:PrintPaperFromSetup:CheckBox" , + "PrintPaperFromSetup" , + false, + aPaperTrayOpt + ) + ); + // print range selection + vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt; + aPrintRangeOpt.mbInternalOnly = true; + aPrintRangeOpt.maGroupHint = "PrintRange" ; + AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("printrange", + mbImpress ? SdResId(STR_IMPRESS_PRINT_UI_SLIDE_RANGE) : SdResId(STR_IMPRESS_PRINT_UI_PAGE_RANGE), + "", + aPrintRangeOpt ) + ); + + // check if there is a selection of slides + OUString aPageRange(OUString::number(mnCurPage + 1)); + int nPrintRange(0); + using sd::slidesorter::SlideSorterViewShell; + SlideSorterViewShell* const pSSViewSh(SlideSorterViewShell::GetSlideSorter(mrBase)); + if (pSSViewSh) + { + const std::shared_ptr pPageSelection(pSSViewSh->GetPageSelection()); + if (bool(pPageSelection) && pPageSelection->size() > 1) + { + OUStringBuffer aBuf; + // TODO: this could be improved by writing ranges instead of consecutive page + // numbers if appropriate. Do we have a helper function for that somewhere? + bool bFirst(true); + for (auto pPage: *pPageSelection) + { + if (bFirst) + bFirst = false; + else + aBuf.append(','); + aBuf.append(static_cast(pPage->GetPageNum() / 2 + 1)); + } + aPageRange = aBuf.makeStringAndClear(); + nPrintRange = 1; + } + } +/* + OUString aPrintRangeName( "PrintContent" ); + aHelpIds.realloc( 1 ); + aHelpIds[0] = ".HelpID:vcl:PrintDialog:PageContentType:ListBox"; + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt( "printpagesbox", OUString(), + aHelpIds, aPrintRangeName, + mbImpress ? CreateChoice( STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE ) ) : + CreateChoice( STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE ) ), + nPrintRange ) ); +*/ + OUString aPrintRangeName( "PrintContent" ); + aHelpIds = { ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:0", + ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:1", + ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:2" }; + aWidgetIds = { "rbAllPages", "rbRangePages", "rbRangeSelection" }; + + AddDialogControl( vcl::PrinterOptionsHelper::setChoiceRadiosControlOpt(aWidgetIds, OUString(), + aHelpIds, aPrintRangeName, + mbImpress ? CreateChoice(STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE)) : + CreateChoice(STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE)), + nPrintRange ) + ); + // create an Edit dependent on "Pages" selected + vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintRangeName, 1, true ); + AddDialogControl(vcl::PrinterOptionsHelper::setEditControlOpt("pagerange", "", + ".HelpID:vcl:PrintDialog:PageRange:Edit", "PageRange", + aPageRange, aPageRangeOpt)); + vcl::PrinterOptionsHelper::UIControlOptions aEvenOddOpt(aPrintRangeName, -1, true); + AddDialogControl(vcl::PrinterOptionsHelper::setChoiceListControlOpt("evenoddbox", "", + uno::Sequence(), "EvenOdd", uno::Sequence(), + 0, uno::Sequence(), aEvenOddOpt)); + } + + void AddDialogControl( const Any& i_rCtrl ) + { + beans::PropertyValue aVal; + aVal.Value = i_rCtrl; + maProperties.push_back( aVal ); + } + + static Sequence CreateChoice(const TranslateId* pResourceId, size_t nCount) + { + Sequence aChoices (nCount); + std::transform(pResourceId, pResourceId + nCount, aChoices.getArray(), + [](const auto& id) { return SdResId(id); }); + return aChoices; + } + + Sequence GetSlidesPerPageSequence() + { + const Sequence aChoice ( + CreateChoice(STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES))); + maSlidesPerPage.clear(); + maSlidesPerPage.push_back(0); // first is using the default + std::transform(std::next(aChoice.begin()), aChoice.end(), std::back_inserter(maSlidesPerPage), + [](const OUString& rChoice) -> sal_Int32 { return rChoice.toInt32(); }); + return aChoice; + } + }; + + /** The Prepare... methods of the DocumentRenderer::Implementation class + create a set of PrinterPage objects that contain all necessary + information to do the actual printing. There is one PrinterPage + object per printed page. Derived classes implement the actual, mode + specific printing. + + This and all derived classes support the asynchronous printing + process by not storing pointers to any data with lifetime shorter + than the PrinterPage objects, i.e. slides, shapes, (one of) the + outliner (of the document). + */ + class PrinterPage + { + public: + PrinterPage ( + const PageKind ePageKind, + const MapMode& rMapMode, + const bool bPrintMarkedOnly, + OUString sPageString, + const Point& rPageStringOffset, + const DrawModeFlags nDrawMode, + const Orientation eOrientation, + const sal_uInt16 nPaperTray) + : mePageKind(ePageKind), + maMap(rMapMode), + mbPrintMarkedOnly(bPrintMarkedOnly), + msPageString(std::move(sPageString)), + maPageStringOffset(rPageStringOffset), + mnDrawMode(nDrawMode), + meOrientation(eOrientation), + mnPaperTray(nPaperTray) + { + } + + virtual ~PrinterPage() {} + + virtual void Print ( + Printer& rPrinter, + SdDrawDocument& rDocument, + ViewShell& rViewShell, + View* pView, + DrawView& rPrintView, + const SdrLayerIDSet& rVisibleLayers, + const SdrLayerIDSet& rPrintableLayers) const = 0; + + DrawModeFlags GetDrawMode() const { return mnDrawMode; } + Orientation GetOrientation() const { return meOrientation; } + sal_uInt16 GetPaperTray() const { return mnPaperTray; } + + protected: + const PageKind mePageKind; + const MapMode maMap; + const bool mbPrintMarkedOnly; + const OUString msPageString; + const Point maPageStringOffset; + const DrawModeFlags mnDrawMode; + const Orientation meOrientation; + const sal_uInt16 mnPaperTray; + }; + + /** The RegularPrinterPage is used for printing one regular slide (no + notes, handout, or outline) to one printer page. + */ + class RegularPrinterPage : public PrinterPage + { + public: + RegularPrinterPage ( + const sal_uInt16 nPageIndex, + const PageKind ePageKind, + const MapMode& rMapMode, + const bool bPrintMarkedOnly, + const OUString& rsPageString, + const Point& rPageStringOffset, + const DrawModeFlags nDrawMode, + const Orientation eOrientation, + const sal_uInt16 nPaperTray) + : PrinterPage(ePageKind, rMapMode, bPrintMarkedOnly, rsPageString, + rPageStringOffset, nDrawMode, eOrientation, nPaperTray), + mnPageIndex(nPageIndex) + { + } + + virtual void Print ( + Printer& rPrinter, + SdDrawDocument& rDocument, + ViewShell&, + View* pView, + DrawView& rPrintView, + const SdrLayerIDSet& rVisibleLayers, + const SdrLayerIDSet& rPrintableLayers) const override + { + SdPage* pPageToPrint = rDocument.GetSdPage(mnPageIndex, mePageKind); + rPrinter.SetMapMode(maMap); + PrintPage( + rPrinter, + rPrintView, + *pPageToPrint, + pView, + mbPrintMarkedOnly, + rVisibleLayers, + rPrintableLayers); + PrintMessage( + rPrinter, + msPageString, + maPageStringOffset); + } + + private: + const sal_uInt16 mnPageIndex; + }; + + /** Print one slide multiple times on a printer page so that the whole + printer page is covered. + */ + class TiledPrinterPage : public PrinterPage + { + public: + TiledPrinterPage ( + const sal_uInt16 nPageIndex, + const PageKind ePageKind, + const bool bPrintMarkedOnly, + const OUString& rsPageString, + const Point& rPageStringOffset, + const DrawModeFlags nDrawMode, + const Orientation eOrientation, + const sal_uInt16 nPaperTray) + : PrinterPage(ePageKind, MapMode(), bPrintMarkedOnly, rsPageString, + rPageStringOffset, nDrawMode, eOrientation, nPaperTray), + mnPageIndex(nPageIndex) + { + } + + virtual void Print ( + Printer& rPrinter, + SdDrawDocument& rDocument, + ViewShell&, + View* pView, + DrawView& rPrintView, + const SdrLayerIDSet& rVisibleLayers, + const SdrLayerIDSet& rPrintableLayers) const override + { + SdPage* pPageToPrint = rDocument.GetSdPage(mnPageIndex, mePageKind); + if (pPageToPrint==nullptr) + return; + MapMode aMap (rPrinter.GetMapMode()); + + const Size aPageSize (pPageToPrint->GetSize()); + const Size aPrintSize (rPrinter.GetOutputSize()); + + const sal_Int32 nPageWidth (aPageSize.Width() + mnGap + - pPageToPrint->GetLeftBorder() - pPageToPrint->GetRightBorder()); + const sal_Int32 nPageHeight (aPageSize.Height() + mnGap + - pPageToPrint->GetUpperBorder() - pPageToPrint->GetLowerBorder()); + if (nPageWidth<=0 || nPageHeight<=0) + return; + + // Print at least two rows and columns. More if the document + // page fits completely onto the printer page. + const sal_Int32 nColumnCount (std::max(sal_Int32(2), + sal_Int32(aPrintSize.Width() / nPageWidth))); + const sal_Int32 nRowCount (std::max(sal_Int32(2), + sal_Int32(aPrintSize.Height() / nPageHeight))); + for (sal_Int32 nRow=0; nRow&& rPageIndices, + const MapMode& rMapMode, + const OUString& rsPageString, + const Point& rPageStringOffset, + const DrawModeFlags nDrawMode, + const Orientation eOrientation, + const sal_uInt16 nPaperTray) + : PrinterPage(PageKind::Handout, rMapMode, false, rsPageString, + rPageStringOffset, nDrawMode, eOrientation, nPaperTray), + mnHandoutPageIndex(nHandoutPageIndex), + maPageIndices(std::move(rPageIndices)) + { + } + + virtual void Print ( + Printer& rPrinter, + SdDrawDocument& rDocument, + ViewShell& rViewShell, + View* pView, + DrawView& rPrintView, + const SdrLayerIDSet& rVisibleLayers, + const SdrLayerIDSet& rPrintableLayers) const override + { + SdPage& rHandoutPage (*rDocument.GetSdPage(0, PageKind::Handout)); + + Reference< css::beans::XPropertySet > xHandoutPage( rHandoutPage.getUnoPage(), UNO_QUERY ); + static constexpr OUString sPageNumber( u"Number"_ustr ); + + // Collect the page objects of the handout master. + std::vector aHandoutPageObjects; + SdrObjListIter aShapeIter (&rHandoutPage); + while (aShapeIter.IsMore()) + { + SdrPageObj* pPageObj = dynamic_cast(aShapeIter.Next()); + if (pPageObj) + aHandoutPageObjects.push_back(pPageObj); + } + if (aHandoutPageObjects.empty()) + return; + + // Connect page objects with pages. + std::vector::iterator aPageObjIter (aHandoutPageObjects.begin()); + for (std::vector::const_iterator + iPageIndex(maPageIndices.begin()), + iEnd(maPageIndices.end()); + iPageIndex!=iEnd && aPageObjIter!=aHandoutPageObjects.end(); + ++iPageIndex) + { + // Check if the page still exists. + if (*iPageIndex >= rDocument.GetSdPageCount(PageKind::Standard)) + continue; + + SdrPageObj* pPageObj = *aPageObjIter++; + pPageObj->SetReferencedPage(rDocument.GetSdPage(*iPageIndex, PageKind::Standard)); + } + + // if there are more page objects than pages left, set the rest to invisible + int nHangoverCount = 0; + while (aPageObjIter != aHandoutPageObjects.end()) + { + (*aPageObjIter++)->SetReferencedPage(nullptr); + nHangoverCount++; + } + + // Hide outlines for objects that have pages attached. + if (nHangoverCount > 0) + { + int nSkip = aHandoutPageObjects.size() - nHangoverCount; + aShapeIter.Reset(); + while (aShapeIter.IsMore()) + { + SdrPathObj* pPathObj = dynamic_cast(aShapeIter.Next()); + if (pPathObj) + { + if (nSkip > 0) + --nSkip; + else + pPathObj->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); + } + } + } + + if( xHandoutPage.is() ) try + { + xHandoutPage->setPropertyValue( sPageNumber, Any( static_cast(mnHandoutPageIndex) ) ); + } + catch( Exception& ) + { + } + rViewShell.SetPrintedHandoutPageNum( mnHandoutPageIndex + 1 ); + + rPrinter.SetMapMode(maMap); + + PrintPage( + rPrinter, + rPrintView, + rHandoutPage, + pView, + false, + rVisibleLayers, + rPrintableLayers); + PrintMessage( + rPrinter, + msPageString, + maPageStringOffset); + + if( xHandoutPage.is() ) try + { + xHandoutPage->setPropertyValue( sPageNumber, Any( static_cast(0) ) ); + } + catch( Exception& ) + { + } + rViewShell.SetPrintedHandoutPageNum(1); + + // Restore outlines. + if (nHangoverCount > 0) + { + aShapeIter.Reset(); + while (aShapeIter.IsMore()) + { + SdrPathObj* pPathObj = dynamic_cast(aShapeIter.Next()); + if (pPathObj != nullptr) + pPathObj->SetMergedItem(XLineStyleItem(drawing::LineStyle_SOLID)); + } + } + + } + + private: + const sal_uInt16 mnHandoutPageIndex; + const std::vector maPageIndices; + }; + + /** The outline information (title, subtitle, outline objects) of the + document. There is no fixed mapping of slides to printer pages. + */ + class OutlinerPrinterPage : public PrinterPage + { + public: + OutlinerPrinterPage ( + std::optional pParaObject, + const MapMode& rMapMode, + const OUString& rsPageString, + const Point& rPageStringOffset, + const DrawModeFlags nDrawMode, + const Orientation eOrientation, + const sal_uInt16 nPaperTray) + : PrinterPage(PageKind::Handout, rMapMode, false, rsPageString, + rPageStringOffset, nDrawMode, eOrientation, nPaperTray), + mpParaObject(std::move(pParaObject)) + { + } + + virtual void Print ( + Printer& rPrinter, + SdDrawDocument& rDocument, + ViewShell&, + View*, + DrawView&, + const SdrLayerIDSet&, + const SdrLayerIDSet&) const override + { + // Set up the printer. + rPrinter.SetMapMode(maMap); + + // Get and set up the outliner. + const ::tools::Rectangle aOutRect (rPrinter.GetPageOffset(), rPrinter.GetOutputSize()); + Outliner* pOutliner = rDocument.GetInternalOutliner(); + const OutlinerMode nSavedOutlMode (pOutliner->GetOutlinerMode()); + const bool bSavedUpdateMode (pOutliner->IsUpdateLayout()); + const Size aSavedPaperSize (pOutliner->GetPaperSize()); + + pOutliner->Init(OutlinerMode::OutlineView); + pOutliner->SetPaperSize(aOutRect.GetSize()); + pOutliner->SetUpdateLayout(true); + pOutliner->Clear(); + pOutliner->SetText(*mpParaObject); + + pOutliner->Draw(rPrinter, aOutRect); + + PrintMessage( + rPrinter, + msPageString, + maPageStringOffset); + + // Restore outliner and printer. + pOutliner->Clear(); + pOutliner->SetUpdateLayout(bSavedUpdateMode); + pOutliner->SetPaperSize(aSavedPaperSize); + pOutliner->Init(nSavedOutlMode); + } + + private: + std::optional mpParaObject; + }; +} + +//===== DocumentRenderer::Implementation ====================================== + +class DocumentRenderer::Implementation + : public SfxListener, + public vcl::PrinterOptionsHelper +{ +public: + explicit Implementation (ViewShellBase& rBase) + : mxObjectShell(rBase.GetDocShell()) + , mrBase(rBase) + , mbIsDisposed(false) + , mpPrinter(nullptr) + , mbHasOrientationWarningBeenShown(false) + { + DialogCreator aCreator( mrBase, mrBase.GetDocShell()->GetDocumentType() == DocumentType::Impress, GetCurrentPageIndex() ); + m_aUIProperties = aCreator.GetDialogControls(); + maSlidesPerPage = aCreator.GetSlidesPerPage(); + + StartListening(mrBase); + } + + virtual ~Implementation() override + { + EndListening(mrBase); + } + + virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override + { + if (&rBroadcaster != &static_cast(mrBase)) + return; + + if (rHint.GetId() == SfxHintId::Dying) + { + mbIsDisposed = true; + } + } + + /** Process the sequence of properties given to one of the XRenderable + methods. + */ + void ProcessProperties (const css::uno::Sequence& rOptions) + { + OSL_ASSERT(!mbIsDisposed); + if (mbIsDisposed) + return; + + bool bIsValueChanged = processProperties( rOptions ); + bool bIsPaperChanged = false; + + // The RenderDevice property is handled specially: its value is + // stored in mpPrinter instead of being retrieved on demand. + Any aDev( getValue( "RenderDevice" ) ); + Reference xRenderDevice; + + if (aDev >>= xRenderDevice) + { + VCLXDevice* pDevice = dynamic_cast(xRenderDevice.get()); + VclPtr< OutputDevice > pOut = pDevice ? pDevice->GetOutputDevice() + : VclPtr< OutputDevice >(); + mpPrinter = dynamic_cast(pOut.get()); + Size aPageSizePixel = mpPrinter ? mpPrinter->GetPaperSizePixel() : Size(); + if( aPageSizePixel != maPrinterPageSizePixel ) + { + bIsPaperChanged = true; + maPrinterPageSizePixel = aPageSizePixel; + } + } + + if (bIsValueChanged && ! mpOptions ) + mpOptions.reset(new PrintOptions(*this, std::vector(maSlidesPerPage))); + if( bIsValueChanged || bIsPaperChanged ) + PreparePages(); + } + + /** Return the number of pages that are to be printed. + */ + sal_Int32 GetPrintPageCount() const + { + OSL_ASSERT(!mbIsDisposed); + if (mbIsDisposed) + return 0; + else + return maPrinterPages.size(); + } + + /** Return a sequence of properties that can be returned by the + XRenderable::getRenderer() method. + */ + css::uno::Sequence GetProperties () const + { + css::uno::Sequence aProperties{ + comphelper::makePropertyValue("ExtraPrintUIOptions", + comphelper::containerToSequence(m_aUIProperties)), + comphelper::makePropertyValue("PageSize", maPrintSize), + // FIXME: is this always true ? + comphelper::makePropertyValue("PageIncludesNonprintableArea", true) + }; + + return aProperties; + } + + /** Print one of the prepared pages. + */ + void PrintPage (const sal_Int32 nIndex) + { + OSL_ASSERT(!mbIsDisposed); + if (mbIsDisposed) + return; + + Printer& rPrinter (*mpPrinter); + + std::shared_ptr pViewShell (mrBase.GetMainViewShell()); + if ( ! pViewShell) + return; + + SdDrawDocument* pDocument = pViewShell->GetDoc(); + OSL_ASSERT(pDocument!=nullptr); + + std::shared_ptr pDrawViewShell( + std::dynamic_pointer_cast(mrBase.GetMainViewShell())); + + if (!mpPrintView) + mpPrintView.reset(new DrawView(mrBase.GetDocShell(), &rPrinter, nullptr)); + + if (nIndex<0 || sal::static_int_cast(nIndex)>=maPrinterPages.size()) + return; + + const std::shared_ptr pPage (maPrinterPages[nIndex]); + OSL_ASSERT(pPage); + if ( ! pPage) + return; + + const Orientation eSavedOrientation (rPrinter.GetOrientation()); + const DrawModeFlags nSavedDrawMode (rPrinter.GetDrawMode()); + const MapMode aSavedMapMode (rPrinter.GetMapMode()); + const sal_uInt16 nSavedPaperBin (rPrinter.GetPaperBin()); + + // Set page orientation. + if ( ! rPrinter.SetOrientation(pPage->GetOrientation())) + { + if ( ! mbHasOrientationWarningBeenShown + && mpOptions->IsWarningOrientation()) + { + mbHasOrientationWarningBeenShown = true; + // Show warning that the orientation could not be set. + std::unique_ptr xWarn(Application::CreateMessageDialog( + pViewShell->GetFrameWeld(), VclMessageType::Warning, VclButtonsType::OkCancel, + SdResId(STR_WARN_PRINTFORMAT_FAILURE))); + xWarn->set_default_response(RET_CANCEL); + if (xWarn->run() != RET_OK) + return; + } + } + + // Set the draw mode. + rPrinter.SetDrawMode(pPage->GetDrawMode()); + + // Set paper tray. + rPrinter.SetPaperBin(pPage->GetPaperTray()); + + // Print the actual page. + pPage->Print( + rPrinter, + *pDocument, + *pViewShell, + pDrawViewShell ? pDrawViewShell->GetView() : nullptr, + *mpPrintView, + pViewShell->GetFrameView()->GetVisibleLayers(), + pViewShell->GetFrameView()->GetPrintableLayers()); + + rPrinter.SetOrientation(eSavedOrientation); + rPrinter.SetDrawMode(nSavedDrawMode); + rPrinter.SetMapMode(aSavedMapMode); + rPrinter.SetPaperBin(nSavedPaperBin); + } + +private: + // rhbz#657394: keep the document alive: prevents crash when + SfxObjectShellRef mxObjectShell; // destroying mpPrintView + ViewShellBase& mrBase; + bool mbIsDisposed; + VclPtr mpPrinter; + Size maPrinterPageSizePixel; + std::unique_ptr mpOptions; + std::vector< std::shared_ptr< ::sd::PrinterPage> > maPrinterPages; + std::unique_ptr mpPrintView; + bool mbHasOrientationWarningBeenShown; + std::vector maSlidesPerPage; + awt::Size maPrintSize; + + sal_Int32 GetCurrentPageIndex() const + { + const ViewShell *pShell = mrBase.GetMainViewShell().get(); + const SdPage *pCurrentPage = pShell ? pShell->getCurrentPage() : nullptr; + return pCurrentPage ? (pCurrentPage->GetPageNum()-1)/2 : -1; + } + + /** Determine and set the paper orientation. + */ + void SetupPaperOrientation ( + const PageKind ePageKind, + PrintInfo& rInfo) + { + SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc(); + rInfo.meOrientation = Orientation::Portrait; + + if( ! mpOptions->IsBooklet()) + { + rInfo.meOrientation = pDocument->GetSdPage(0, ePageKind)->GetOrientation(); + } + else if (rInfo.maPageSize.Width() < rInfo.maPageSize.Height()) + rInfo.meOrientation = Orientation::Landscape; + + // Draw and Notes should usually abide by their specified paper size + Size aPaperSize; + if (!mpOptions->IsPrinterPreferred(pDocument->GetDocumentType())) + { + aPaperSize.setWidth(rInfo.maPageSize.Width()); + aPaperSize.setHeight(rInfo.maPageSize.Height()); + } + else + { + aPaperSize.setWidth(rInfo.mpPrinter->GetPaperSize().Width()); + aPaperSize.setHeight(rInfo.mpPrinter->GetPaperSize().Height()); + } + + maPrintSize = awt::Size(aPaperSize.Width(), aPaperSize.Height()); + + if (mpOptions->IsPrinterPreferred(pDocument->GetDocumentType())) + { + if( (rInfo.meOrientation == Orientation::Landscape && + (aPaperSize.Width() < aPaperSize.Height())) + || + (rInfo.meOrientation == Orientation::Portrait && + (aPaperSize.Width() > aPaperSize.Height())) + ) + { + maPrintSize = awt::Size(aPaperSize.Height(), aPaperSize.Width()); + } + } + } + + /** Top most method for preparing printer pages. In this and the other + Prepare... methods the various special cases are detected and + handled. + For every page that is to be printed (that may contain several + slides) one PrinterPage object is created and inserted into + maPrinterPages. + */ + void PreparePages() + { + mpPrintView.reset(); + maPrinterPages.clear(); + mbHasOrientationWarningBeenShown = false; + + ViewShell* pShell = mrBase.GetMainViewShell().get(); + + PrintInfo aInfo (mpPrinter, mpOptions->IsPrintMarkedOnly()); + + if (aInfo.mpPrinter==nullptr || pShell==nullptr) + return; + + MapMode aMap (aInfo.mpPrinter->GetMapMode()); + aMap.SetMapUnit(MapUnit::Map100thMM); + aInfo.maMap = aMap; + mpPrinter->SetMapMode(aMap); + + ::Outliner& rOutliner = mrBase.GetDocument()->GetDrawOutliner(); + const EEControlBits nSavedControlWord (rOutliner.GetControlWord()); + EEControlBits nCntrl = nSavedControlWord; + nCntrl &= ~EEControlBits::MARKFIELDS; + nCntrl &= ~EEControlBits::ONLINESPELLING; + rOutliner.SetControlWord( nCntrl ); + + // When in outline view then apply all pending changes to the model. + if( auto pOutlineViewShell = dynamic_cast< OutlineViewShell *>( pShell ) ) + pOutlineViewShell->PrepareClose (false); + + // Collect some frequently used data. + if (mpOptions->IsDate()) + { + aInfo.msTimeDate += GetSdrGlobalData().GetLocaleData().getDate( Date( Date::SYSTEM ) ); + aInfo.msTimeDate += " "; + } + + if (mpOptions->IsTime()) + aInfo.msTimeDate += GetSdrGlobalData().GetLocaleData().getTime( ::tools::Time( ::tools::Time::SYSTEM ), false ); + + // Draw and Notes should usually use specified paper size when printing + if (!mpOptions->IsPrinterPreferred(mrBase.GetDocShell()->GetDocumentType())) + { + aInfo.maPrintSize = mrBase.GetDocument()->GetSdPage(0, PageKind::Standard)->GetSize(); + maPrintSize = awt::Size(aInfo.maPrintSize.Width(), + aInfo.maPrintSize.Height()); + } + else + { + aInfo.maPrintSize = aInfo.mpPrinter->GetOutputSize(); + maPrintSize = awt::Size( + aInfo.mpPrinter->GetPaperSize().Width(), + aInfo.mpPrinter->GetPaperSize().Height()); + } + + switch (mpOptions->GetOutputQuality()) + { + case 1: // Grayscale + aInfo.mnDrawMode = DrawModeFlags::GrayLine | DrawModeFlags::GrayFill + | DrawModeFlags::GrayText | DrawModeFlags::GrayBitmap + | DrawModeFlags::GrayGradient; + break; + + case 2: // Black & White + aInfo.mnDrawMode = DrawModeFlags::BlackLine | DrawModeFlags::WhiteFill + | DrawModeFlags::BlackText | DrawModeFlags::GrayBitmap + | DrawModeFlags::WhiteGradient; + break; + + default: + aInfo.mnDrawMode = DrawModeFlags::Default; + } + + if (mpOptions->IsDraw()) + PrepareStdOrNotes(PageKind::Standard, aInfo); + if (mpOptions->IsNotes()) + PrepareStdOrNotes(PageKind::Notes, aInfo); + if (mpOptions->IsHandout()) + { + InitHandoutTemplate(); + PrepareHandout(aInfo); + } + if (mpOptions->IsOutline()) + PrepareOutline(aInfo); + + rOutliner.SetControlWord(nSavedControlWord); + } + + /** Create the page objects of the handout template. When the actual + printing takes place then the page objects are assigned different + sets of slides for each printed page (see HandoutPrinterPage::Print). + */ + void InitHandoutTemplate() + { + const sal_Int32 nSlidesPerHandout (mpOptions->GetHandoutPageCount()); + const bool bHandoutHorizontal (mpOptions->IsHandoutHorizontal()); + + AutoLayout eLayout = AUTOLAYOUT_HANDOUT6; + switch (nSlidesPerHandout) + { + case 0: eLayout = AUTOLAYOUT_NONE; break; // AUTOLAYOUT_HANDOUT1; break; + case 1: eLayout = AUTOLAYOUT_HANDOUT1; break; + case 2: eLayout = AUTOLAYOUT_HANDOUT2; break; + case 3: eLayout = AUTOLAYOUT_HANDOUT3; break; + case 4: eLayout = AUTOLAYOUT_HANDOUT4; break; + default: + case 6: eLayout = AUTOLAYOUT_HANDOUT6; break; + case 9: eLayout = AUTOLAYOUT_HANDOUT9; break; + } + + if( !mrBase.GetDocument() ) + return; + + SdDrawDocument& rModel = *mrBase.GetDocument(); + + // first, prepare handout page (not handout master) + + SdPage* pHandout = rModel.GetSdPage(0, PageKind::Handout); + if( !pHandout ) + return; + + // delete all previous shapes from handout page + while( pHandout->GetObjCount() ) + pHandout->NbcRemoveObject(0); + + const bool bDrawLines (eLayout == AUTOLAYOUT_HANDOUT3); + + std::vector< ::tools::Rectangle > aAreas; + SdPage::CalculateHandoutAreas( rModel, eLayout, bHandoutHorizontal, aAreas ); + + std::vector< ::tools::Rectangle >::iterator iter( aAreas.begin() ); + while( iter != aAreas.end() ) + { + pHandout->NbcInsertObject( + new SdrPageObj( + rModel, + (*iter++))); + + if( bDrawLines && (iter != aAreas.end()) ) + { + ::tools::Rectangle aRect( *iter++ ); + + basegfx::B2DPolygon aPoly; + aPoly.insert(0, basegfx::B2DPoint( aRect.Left(), aRect.Top() ) ); + aPoly.insert(1, basegfx::B2DPoint( aRect.Right(), aRect.Top() ) ); + + basegfx::B2DHomMatrix aMatrix; + aMatrix.translate( 0.0, static_cast< double >( aRect.GetHeight() / 7 ) ); + + basegfx::B2DPolyPolygon aPathPoly; + for( sal_uInt16 nLine = 0; nLine < 7; nLine++ ) + { + aPoly.transform( aMatrix ); + aPathPoly.append( aPoly ); + } + + rtl::Reference pPathObj = new SdrPathObj( + rModel, + SdrObjKind::PathLine, + std::move(aPathPoly)); + pPathObj->SetMergedItem(XLineStyleItem(drawing::LineStyle_SOLID)); + pPathObj->SetMergedItem(XLineColorItem(OUString(), COL_BLACK)); + + pHandout->NbcInsertObject( pPathObj.get() ); + } + } + } + + /** Detect whether the specified slide is to be printed. + @return + When the slide is not to be printed then is returned. + Otherwise a pointer to the slide is returned. + */ + SdPage* GetFilteredPage ( + const sal_Int32 nPageIndex, + const PageKind ePageKind) const + { + OSL_ASSERT(mrBase.GetDocument() != nullptr); + OSL_ASSERT(nPageIndex>=0); + SdPage* pPage = mrBase.GetDocument()->GetSdPage( + sal::static_int_cast(nPageIndex), + ePageKind); + if (pPage == nullptr) + return nullptr; + if ( ! pPage->IsExcluded() || mpOptions->IsPrintExcluded()) + return pPage; + else + return nullptr; + } + + /** Prepare the outline of the document for printing. There is no fixed + number of slides whose outline data is put onto one printer page. + If the current printer page has enough room for the outline of the + current slide then that is added. Otherwise a new printer page is + started. + */ + void PrepareOutline (PrintInfo const & rInfo) + { + MapMode aMap (rInfo.maMap); + Point aPageOfs (rInfo.mpPrinter->GetPageOffset() ); + aMap.SetScaleX(Fraction(1,2)); + aMap.SetScaleY(Fraction(1,2)); + mpPrinter->SetMapMode(aMap); + + ::tools::Rectangle aOutRect(aPageOfs, rInfo.mpPrinter->GetOutputSize()); + if( aOutRect.GetWidth() > aOutRect.GetHeight() ) + { + Size aPaperSize( rInfo.mpPrinter->PixelToLogic( rInfo.mpPrinter->GetPaperSizePixel(), MapMode( MapUnit::Map100thMM ) ) ); + maPrintSize.Width = aPaperSize.Height(); + maPrintSize.Height = aPaperSize.Width(); + const auto nRotatedWidth = aOutRect.GetHeight(); + const auto nRotatedHeight = aOutRect.GetWidth(); + const auto nRotatedX = aPageOfs.Y(); + const auto nRotatedY = aPageOfs.X(); + aOutRect = ::tools::Rectangle(Point( nRotatedX, nRotatedY), + Size(nRotatedWidth, nRotatedHeight)); + } + + Outliner* pOutliner = mrBase.GetDocument()->GetInternalOutliner(); + pOutliner->Init(OutlinerMode::OutlineView); + const OutlinerMode nSavedOutlMode (pOutliner->GetOutlinerMode()); + const bool bSavedUpdateMode (pOutliner->IsUpdateLayout()); + const Size aSavedPaperSize (pOutliner->GetPaperSize()); + const MapMode aSavedMapMode (pOutliner->GetRefMapMode()); + pOutliner->SetPaperSize(aOutRect.GetSize()); + pOutliner->SetUpdateLayout(true); + + ::tools::Long nPageH = aOutRect.GetHeight(); + + std::vector< sal_Int32 > aPages; + sal_Int32 nPageCount = mrBase.GetDocument()->GetSdPageCount(PageKind::Standard); + StringRangeEnumerator::getRangesFromString( + mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()), + aPages, 0, nPageCount-1); + + for (size_t nIndex = 0, nCount = aPages.size(); nIndex < nCount;) + { + pOutliner->Clear(); + + Paragraph* pPara = nullptr; + ::tools::Long nH (0); + while (nH < nPageH && nIndex& pObj : *pPage) + { + if (pObj->GetObjInventor() == SdrInventor::Default + && pObj->GetObjIdentifier() == SdrObjKind::TitleText) + { + pTextObj = DynCastSdrTextObj(pObj.get()); + if (pTextObj) + break; + } + } + + pPara = pOutliner->GetParagraph(pOutliner->GetParagraphCount() - 1); + + if (pTextObj!=nullptr + && !pTextObj->IsEmptyPresObj() + && pTextObj->GetOutlinerParaObject()) + { + pOutliner->AddText(*(pTextObj->GetOutlinerParaObject())); + } + else + pOutliner->Insert(OUString()); + + pTextObj = nullptr; + + for (const rtl::Reference& pObj : *pPage) + { + if (pObj->GetObjInventor() == SdrInventor::Default + && pObj->GetObjIdentifier() == SdrObjKind::OutlineText) + { + pTextObj = DynCastSdrTextObj(pObj.get()); + if (pTextObj) + break; + } + } + + bool bSubTitle (false); + if (!pTextObj) + { + bSubTitle = true; + pTextObj = DynCastSdrTextObj(pPage->GetPresObj(PresObjKind::Text)); // is there a subtitle? + } + + sal_Int32 nParaCount1 = pOutliner->GetParagraphCount(); + + if (pTextObj!=nullptr + && !pTextObj->IsEmptyPresObj() + && pTextObj->GetOutlinerParaObject()) + { + pOutliner->AddText(*(pTextObj->GetOutlinerParaObject())); + } + + if (bSubTitle ) + { + const sal_Int32 nParaCount2 (pOutliner->GetParagraphCount()); + for (sal_Int32 nPara=nParaCount1; nParaGetParagraph(nPara); + if (pP!=nullptr && pOutliner->GetDepth(nPara) > 0) + pOutliner->SetDepth(pP, 0); + } + } + + nH = pOutliner->GetTextHeight(); + } + + // Remove the last paragraph when that does not fit completely on + // the current page. + if (nH > nPageH && pPara!=nullptr) + { + sal_Int32 nCnt = pOutliner->GetAbsPos( + pOutliner->GetParagraph( pOutliner->GetParagraphCount() - 1 ) ); + sal_Int32 nParaPos = pOutliner->GetAbsPos( pPara ); + nCnt -= nParaPos; + pPara = pOutliner->GetParagraph( ++nParaPos ); + if ( nCnt && pPara ) + { + pOutliner->Remove(pPara, nCnt); + --nIndex; + } + } + + if ( CheckForFrontBackPages( nIndex ) ) + { + maPrinterPages.push_back( + std::make_shared( + pOutliner->CreateParaObject(), + aMap, + rInfo.msTimeDate, + aPageOfs, + rInfo.mnDrawMode, + rInfo.meOrientation, + rInfo.mpPrinter->GetPaperBin())); + } + } + + pOutliner->SetRefMapMode(aSavedMapMode); + pOutliner->SetUpdateLayout(bSavedUpdateMode); + pOutliner->SetPaperSize(aSavedPaperSize); + pOutliner->Init(nSavedOutlMode); + } + + /** Prepare handout pages for slides that are to be printed. + */ + void PrepareHandout (PrintInfo& rInfo) + { + SdDrawDocument* pDocument = mrBase.GetDocument(); + OSL_ASSERT(pDocument != nullptr); + SdPage& rHandoutPage (*pDocument->GetSdPage(0, PageKind::Handout)); + + const bool bScalePage (mpOptions->IsPageSize()); + + sal_uInt16 nPaperBin; + if ( ! mpOptions->IsPaperBin()) + nPaperBin = rHandoutPage.GetPaperBin(); + else + nPaperBin = rInfo.mpPrinter->GetPaperBin(); + + // Change orientation? + SdPage& rMaster (dynamic_cast(rHandoutPage.TRG_GetMasterPage())); + rInfo.meOrientation = rMaster.GetOrientation(); + + const Size aPaperSize (rInfo.mpPrinter->GetPaperSize()); + if( (rInfo.meOrientation == Orientation::Landscape && + (aPaperSize.Width() < aPaperSize.Height())) + || + (rInfo.meOrientation == Orientation::Portrait && + (aPaperSize.Width() > aPaperSize.Height())) + ) + { + maPrintSize = awt::Size(aPaperSize.Height(), aPaperSize.Width()); + } + else + { + maPrintSize = awt::Size(aPaperSize.Width(), aPaperSize.Height()); + } + + MapMode aMap (rInfo.maMap); + const Point aPageOfs (rInfo.mpPrinter->GetPageOffset()); + + if ( bScalePage ) + { + const Size aPageSize (rHandoutPage.GetSize()); + const Size aPrintSize (rInfo.mpPrinter->GetOutputSize()); + + const double fHorz = static_cast(aPrintSize.Width()) / aPageSize.Width(); + const double fVert = static_cast(aPrintSize.Height()) / aPageSize.Height(); + + Fraction aFract; + if ( fHorz < fVert ) + aFract = Fraction(aPrintSize.Width(), aPageSize.Width()); + else + aFract = Fraction(aPrintSize.Height(), aPageSize.Height()); + + aMap.SetScaleX(aFract); + aMap.SetScaleY(aFract); + aMap.SetOrigin(Point()); + } + + std::shared_ptr pViewShell (mrBase.GetMainViewShell()); + pViewShell->WriteFrameViewData(); + + // Count page shapes. + sal_uInt32 nShapeCount (0); + SdrObjListIter aShapeIter (&rHandoutPage); + while (aShapeIter.IsMore()) + { + SdrPageObj* pPageObj = dynamic_cast(aShapeIter.Next()); + if (pPageObj) + ++nShapeCount; + } + + const sal_uInt16 nPageCount = mrBase.GetDocument()->GetSdPageCount(PageKind::Standard); + const sal_uInt16 nHandoutPageCount = nShapeCount ? (nPageCount + nShapeCount - 1) / nShapeCount : 0; + pViewShell->SetPrintedHandoutPageCount( nHandoutPageCount ); + mrBase.GetDocument()->setHandoutPageCount( nHandoutPageCount ); + + // Distribute pages to handout pages. + StringRangeEnumerator aRangeEnum( + mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()), + 0, nPageCount-1); + std::vector aPageIndices; + sal_uInt16 nPrinterPageIndex = 0; + StringRangeEnumerator::Iterator it = aRangeEnum.begin(), itEnd = aRangeEnum.end(); + bool bLastLoop = (it == itEnd); + while (!bLastLoop) + { + sal_Int32 nPageIndex = *it; + ++it; + bLastLoop = (it == itEnd); + + if (GetFilteredPage(nPageIndex, PageKind::Standard)) + aPageIndices.push_back(nPageIndex); + else if (!bLastLoop) + continue; + + // Create a printer page when we have found one page for each + // placeholder or when this is the last (and special) loop. + if ( !aPageIndices.empty() && CheckForFrontBackPages( nPageIndex ) + && (aPageIndices.size() == nShapeCount || bLastLoop) ) + { + maPrinterPages.push_back( + std::make_shared( + nPrinterPageIndex++, + std::move(aPageIndices), + aMap, + rInfo.msTimeDate, + aPageOfs, + rInfo.mnDrawMode, + rInfo.meOrientation, + nPaperBin)); + aPageIndices.clear(); + } + } + } + + /** Prepare the notes pages or regular slides. + */ + void PrepareStdOrNotes ( + const PageKind ePageKind, + PrintInfo& rInfo) + { + OSL_ASSERT(rInfo.mpPrinter != nullptr); + + // Fill in page kind specific data. + SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc(); + if (pDocument->GetSdPageCount(ePageKind) == 0) + return; + SdPage* pRefPage = pDocument->GetSdPage(0, ePageKind); + rInfo.maPageSize = pRefPage->GetSize(); + + SetupPaperOrientation(ePageKind, rInfo); + + MapMode aMap (rInfo.maMap); + rInfo.maMap = aMap; + + if (mpOptions->IsBooklet()) + PrepareBooklet(ePageKind, rInfo); + else + PrepareRegularPages(ePageKind, rInfo); + } + + /** Prepare slides in a non-booklet way: one slide per one to many + printer pages. + */ + void PrepareRegularPages ( + const PageKind ePageKind, + PrintInfo& rInfo) + { + std::shared_ptr pViewShell (mrBase.GetMainViewShell()); + pViewShell->WriteFrameViewData(); + + sal_Int32 nPageCount = mrBase.GetDocument()->GetSdPageCount(PageKind::Standard); + StringRangeEnumerator aRangeEnum( + mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()), + 0, nPageCount-1); + for (StringRangeEnumerator::Iterator + it = aRangeEnum.begin(), + itEnd = aRangeEnum.end(); + it != itEnd; + ++it) + { + SdPage* pPage = GetFilteredPage(*it, ePageKind); + if (pPage == nullptr) + continue; + + MapMode aMap (rInfo.maMap); + // is it possible that the page size changed? + const Size aPageSize = pPage->GetSize(); + + if (mpOptions->IsPageSize()) + { + const double fHorz (static_cast(rInfo.maPrintSize.Width()) / aPageSize.Width()); + const double fVert (static_cast(rInfo.maPrintSize.Height()) / aPageSize.Height()); + + Fraction aFract; + if (fHorz < fVert) + aFract = Fraction(rInfo.maPrintSize.Width(), aPageSize.Width()); + else + aFract = Fraction(rInfo.maPrintSize.Height(), aPageSize.Height()); + + aMap.SetScaleX(aFract); + aMap.SetScaleY(aFract); + aMap.SetOrigin(Point()); + } + + if (mpOptions->IsPrintPageName()) + { + rInfo.msPageString = pPage->GetName() + " "; + } + else + rInfo.msPageString.clear(); + rInfo.msPageString += rInfo.msTimeDate; + + ::tools::Long aPageWidth = aPageSize.Width() - pPage->GetLeftBorder() - pPage->GetRightBorder(); + ::tools::Long aPageHeight = aPageSize.Height() - pPage->GetUpperBorder() - pPage->GetLowerBorder(); + // Bugfix for 44530: + // if it was implicitly changed (Landscape/Portrait), + // this is considered for tiling, respectively for the splitting up + // (Poster) + if( ( rInfo.maPrintSize.Width() > rInfo.maPrintSize.Height() + && aPageWidth < aPageHeight ) + || ( rInfo.maPrintSize.Width() < rInfo.maPrintSize.Height() + && aPageWidth > aPageHeight ) ) + { + const sal_Int32 nTmp (rInfo.maPrintSize.Width()); + rInfo.maPrintSize.setWidth( rInfo.maPrintSize.Height() ); + rInfo.maPrintSize.setHeight( nTmp ); + } + + if (mpOptions->IsTilePage() + && aPageWidth < rInfo.maPrintSize.Width() + && aPageHeight < rInfo.maPrintSize.Height()) + { + // Put multiple slides on one printer page. + PrepareTiledPage(*it, *pPage, ePageKind, rInfo); + } + else + { + rInfo.maMap = aMap; + PrepareScaledPage(*it, *pPage, ePageKind, rInfo); + } + } + } + + /** Put two slides on one printer page. + */ + void PrepareBooklet ( + const PageKind ePageKind, + const PrintInfo& rInfo) + { + MapMode aStdMap (rInfo.maMap); + Point aOffset; + Size aPrintSize_2 (rInfo.maPrintSize); + Size aPageSize_2 (rInfo.maPageSize); + + if (rInfo.meOrientation == Orientation::Landscape) + aPrintSize_2.setWidth( aPrintSize_2.Width() >> 1 ); + else + aPrintSize_2.setHeight( aPrintSize_2.Height() >> 1 ); + + const double fPageWH = static_cast(aPageSize_2.Width()) / aPageSize_2.Height(); + const double fPrintWH = static_cast(aPrintSize_2.Width()) / aPrintSize_2.Height(); + + if( fPageWH < fPrintWH ) + { + aPageSize_2.setWidth( static_cast<::tools::Long>( aPrintSize_2.Height() * fPageWH ) ); + aPageSize_2.setHeight( aPrintSize_2.Height() ); + } + else + { + aPageSize_2.setWidth( aPrintSize_2.Width() ); + aPageSize_2.setHeight( static_cast<::tools::Long>( aPrintSize_2.Width() / fPageWH ) ); + } + + MapMode aMap (rInfo.maMap); + aMap.SetScaleX( Fraction( aPageSize_2.Width(), rInfo.maPageSize.Width() ) ); + aMap.SetScaleY( Fraction( aPageSize_2.Height(), rInfo.maPageSize.Height() ) ); + + // calculate adjusted print size + const Size aAdjustedPrintSize (OutputDevice::LogicToLogic( + rInfo.maPrintSize, + aStdMap, + aMap)); + + if (rInfo.meOrientation == Orientation::Landscape) + { + aOffset.setX( ( ( aAdjustedPrintSize.Width() >> 1 ) - rInfo.maPageSize.Width() ) >> 1 ); + aOffset.setY( ( aAdjustedPrintSize.Height() - rInfo.maPageSize.Height() ) >> 1 ); + } + else + { + aOffset.setX( ( aAdjustedPrintSize.Width() - rInfo.maPageSize.Width() ) >> 1 ); + aOffset.setY( ( ( aAdjustedPrintSize.Height() >> 1 ) - rInfo.maPageSize.Height() ) >> 1 ); + } + + // create vector of pages to print + sal_Int32 nPageCount = mrBase.GetDocument()->GetSdPageCount(ePageKind); + StringRangeEnumerator aRangeEnum( + mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()), + 0, nPageCount-1); + std::vector< sal_uInt16 > aPageVector; + for (StringRangeEnumerator::Iterator + it = aRangeEnum.begin(), + itEnd = aRangeEnum.end(); + it != itEnd; + ++it) + { + SdPage* pPage = GetFilteredPage(*it, ePageKind); + if (pPage != nullptr) + aPageVector.push_back(*it); + } + + // create pairs of pages to print on each page + std::vector< std::pair< sal_uInt16, sal_uInt16 > > aPairVector; + if ( ! aPageVector.empty()) + { + sal_uInt32 nFirstIndex = 0, nLastIndex = aPageVector.size() - 1; + + if( aPageVector.size() & 1 ) + aPairVector.emplace_back( sal_uInt16(65535), aPageVector[ nFirstIndex++ ] ); + else + aPairVector.emplace_back( aPageVector[ nLastIndex-- ], aPageVector[ nFirstIndex++ ] ); + + while( nFirstIndex < nLastIndex ) + { + if( nFirstIndex & 1 ) + aPairVector.emplace_back( aPageVector[ nFirstIndex++ ], aPageVector[ nLastIndex-- ] ); + else + aPairVector.emplace_back( aPageVector[ nLastIndex-- ], aPageVector[ nFirstIndex++ ] ); + } + } + + for (sal_uInt32 + nIndex=0, + nCount=aPairVector.size(); + nIndex < nCount; + ++nIndex) + { + if ( CheckForFrontBackPages( nIndex ) ) + { + const std::pair aPair (aPairVector[nIndex]); + Point aSecondOffset (aOffset); + if (rInfo.meOrientation == Orientation::Landscape) + aSecondOffset.AdjustX( aAdjustedPrintSize.Width() / 2 ); + else + aSecondOffset.AdjustY( aAdjustedPrintSize.Height() / 2 ); + maPrinterPages.push_back( + std::make_shared( + aPair.first, + aPair.second, + aOffset, + aSecondOffset, + ePageKind, + aMap, + rInfo.mbPrintMarkedOnly, + rInfo.mnDrawMode, + rInfo.meOrientation, + rInfo.mpPrinter->GetPaperBin())); + + } + } + } + + /** Print one slide multiple times on one printer page so that the whole + printer page is covered. + */ + void PrepareTiledPage ( + const sal_Int32 nPageIndex, + const SdPage& rPage, + const PageKind ePageKind, + const PrintInfo& rInfo) + { + sal_uInt16 nPaperBin; + if ( ! mpOptions->IsPaperBin()) + nPaperBin = rPage.GetPaperBin(); + else + nPaperBin = rInfo.mpPrinter->GetPaperBin(); + + if ( !CheckForFrontBackPages( nPageIndex ) ) + return; + + maPrinterPages.push_back( + std::make_shared( + sal::static_int_cast(nPageIndex), + ePageKind, + rInfo.mbPrintMarkedOnly, + rInfo.msPageString, + rInfo.mpPrinter->GetPageOffset(), + rInfo.mnDrawMode, + rInfo.meOrientation, + nPaperBin)); + } + + /** Print one standard slide or notes page on one to many printer + pages. More than on printer page is used when the slide is larger + than the printable area. + */ + void PrepareScaledPage ( + const sal_Int32 nPageIndex, + const SdPage& rPage, + const PageKind ePageKind, + const PrintInfo& rInfo) + { + const Point aPageOffset (rInfo.mpPrinter->GetPageOffset()); + + sal_uInt16 nPaperBin; + if ( ! mpOptions->IsPaperBin()) + nPaperBin = rPage.GetPaperBin(); + else + nPaperBin = rInfo.mpPrinter->GetPaperBin(); + + // For pages larger then the printable area there + // are three options: + // 1. Scale down to the page to the printable area. + // 2. Print only the upper left part of the page + // (without the unprintable borders). + // 3. Split the page into parts of the size of the + // printable area. + const bool bScalePage (mpOptions->IsPageSize()); + const bool bCutPage (mpOptions->IsCutPage()); + MapMode aMap (rInfo.maMap); + if ( (bScalePage || bCutPage) && CheckForFrontBackPages( nPageIndex ) ) + { + // Handle 1 and 2. + + // if CutPage is set then do not move it, otherwise move the + // scaled page to printable area + maPrinterPages.push_back( + std::make_shared( + sal::static_int_cast(nPageIndex), + ePageKind, + aMap, + rInfo.mbPrintMarkedOnly, + rInfo.msPageString, + aPageOffset, + rInfo.mnDrawMode, + rInfo.meOrientation, + nPaperBin)); + } + else + { + // Handle 3. Print parts of the page in the size of the + // printable area until the whole page is covered. + + // keep the page content at its position if it fits, otherwise + // move it to the printable area + const ::tools::Long nPageWidth ( + rInfo.maPageSize.Width() - rPage.GetLeftBorder() - rPage.GetRightBorder()); + const ::tools::Long nPageHeight ( + rInfo.maPageSize.Height() - rPage.GetUpperBorder() - rPage.GetLowerBorder()); + + Point aOrigin ( 0, 0 ); + + for (Point aPageOrigin = aOrigin; + -aPageOrigin.Y()( + sal::static_int_cast(nPageIndex), + ePageKind, + aMap, + rInfo.mbPrintMarkedOnly, + rInfo.msPageString, + aPageOffset, + rInfo.mnDrawMode, + rInfo.meOrientation, + nPaperBin)); + } + } + } + } + } + +bool CheckForFrontBackPages( sal_Int32 nPage ) +{ + const bool bIsIndexOdd(nPage & 1); + if ((!bIsIndexOdd && mpOptions->IsPrintFrontPage()) + || (bIsIndexOdd && mpOptions->IsPrintBackPage())) + { + return true; + } + else + return false; +} +}; + +//===== DocumentRenderer ====================================================== + +DocumentRenderer::DocumentRenderer (ViewShellBase& rBase) + : mpImpl(new Implementation(rBase)) +{ +} + +DocumentRenderer::~DocumentRenderer() +{ +} + +//----- XRenderable ----------------------------------------------------------- + +sal_Int32 SAL_CALL DocumentRenderer::getRendererCount ( + const css::uno::Any&, + const css::uno::Sequence& rOptions) +{ + mpImpl->ProcessProperties(rOptions); + return mpImpl->GetPrintPageCount(); +} + +Sequence SAL_CALL DocumentRenderer::getRenderer ( + sal_Int32, + const css::uno::Any&, + const css::uno::Sequence& rOptions) +{ + mpImpl->ProcessProperties(rOptions); + return mpImpl->GetProperties(); +} + +void SAL_CALL DocumentRenderer::render ( + sal_Int32 nRenderer, + const css::uno::Any&, + const css::uno::Sequence& rOptions) +{ + mpImpl->ProcessProperties(rOptions); + mpImpl->PrintPage(nRenderer); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/FormShellManager.cxx b/sd/source/ui/view/FormShellManager.cxx new file mode 100644 index 0000000000..d2cb6ebfee --- /dev/null +++ b/sd/source/ui/view/FormShellManager.cxx @@ -0,0 +1,324 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +namespace { + +/** This factory is responsible for creating and deleting the FmFormShell. +*/ +class FormShellManagerFactory + : public ::sd::ShellFactory +{ +public: + FormShellManagerFactory (ViewShell& rViewShell, FormShellManager& rManager); + virtual FmFormShell* CreateShell (ShellId nId) override; + virtual void ReleaseShell (SfxShell* pShell) override; + +private: + ::sd::ViewShell& mrViewShell; + FormShellManager& mrFormShellManager; +}; + +} // end of anonymous namespace + +FormShellManager::FormShellManager (ViewShellBase& rBase) + : mrBase(rBase), + mpFormShell(nullptr), + mbFormShellAboveViewShell(false), + mbIsMainViewChangePending(false), + mpMainViewShellWindow(nullptr) +{ + // Register at the EventMultiplexer to be informed about changes in the + // center pane. + Link aLink (LINK(this, FormShellManager, ConfigurationUpdateHandler)); + mrBase.GetEventMultiplexer()->AddEventListener(aLink); + + RegisterAtCenterPane(); +} + +void FormShellManager::ImplDestroy() +{ + SetFormShell(nullptr); + UnregisterAtCenterPane(); + + // Unregister from the EventMultiplexer. + Link aLink (LINK(this, FormShellManager, ConfigurationUpdateHandler)); + mrBase.GetEventMultiplexer()->RemoveEventListener(aLink); + + if (mpSubShellFactory) + { + ViewShell* pShell = mrBase.GetMainViewShell().get(); + if (pShell != nullptr) + mrBase.GetViewShellManager()->RemoveSubShellFactory(pShell,mpSubShellFactory); + } +} + +FormShellManager::~FormShellManager() +{ + suppress_fun_call_w_exception(ImplDestroy()); +} + +void FormShellManager::SetFormShell (FmFormShell* pFormShell) +{ + if (mpFormShell == pFormShell) + return; + + // Disconnect from the old form shell. + if (mpFormShell != nullptr) + { + mpFormShell->SetControlActivationHandler(Link()); + EndListening(*mpFormShell); + mpFormShell->SetView(nullptr); + } + + mpFormShell = pFormShell; + + // Connect to the new form shell. + if (mpFormShell != nullptr) + { + mpFormShell->SetControlActivationHandler( + LINK( + this, + FormShellManager, + FormControlActivated)); + StartListening(*mpFormShell); + + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + if (pMainViewShell != nullptr) + { + // Prevent setting the view twice at the FmFormShell. + FmFormView* pFormView = pMainViewShell->GetView(); + if (mpFormShell->GetFormView() != pFormView) + mpFormShell->SetView(pFormView); + } + } + + // Tell the ViewShellManager where on the stack to place the form shell. + mrBase.GetViewShellManager()->SetFormShell( + mrBase.GetMainViewShell().get(), + mpFormShell, + mbFormShellAboveViewShell); +} + +void FormShellManager::RegisterAtCenterPane() +{ + ViewShell* pShell = mrBase.GetMainViewShell().get(); + if (pShell == nullptr) + return; + + // No form shell for the slide sorter. Besides that it is not + // necessary, using both together results in crashes. + if (pShell->GetShellType() == ViewShell::ST_SLIDE_SORTER) + return; + + mpMainViewShellWindow = pShell->GetActiveWindow(); + if (mpMainViewShellWindow == nullptr) + return; + + // Register at the window to get informed when to move the form + // shell to the bottom of the shell stack. + mpMainViewShellWindow->AddEventListener( + LINK( + this, + FormShellManager, + WindowEventHandler)); + + // Create a shell factory and with it activate the form shell. + OSL_ASSERT(!mpSubShellFactory); + mpSubShellFactory = std::make_shared(*pShell, *this); + mrBase.GetViewShellManager()->AddSubShellFactory(pShell,mpSubShellFactory); + mrBase.GetViewShellManager()->ActivateSubShell(*pShell, ToolbarId::FormLayer_Toolbox); +} + +void FormShellManager::UnregisterAtCenterPane() +{ + if (mpMainViewShellWindow != nullptr) + { + // Unregister from the window. + mpMainViewShellWindow->RemoveEventListener( + LINK( + this, + FormShellManager, + WindowEventHandler)); + mpMainViewShellWindow = nullptr; + } + + // Unregister form at the form shell. + SetFormShell(nullptr); + + // Deactivate the form shell and destroy the shell factory. + ViewShell* pShell = mrBase.GetMainViewShell().get(); + if (pShell != nullptr) + { + mrBase.GetViewShellManager()->DeactivateSubShell(*pShell, ToolbarId::FormLayer_Toolbox); + mrBase.GetViewShellManager()->RemoveSubShellFactory(pShell, mpSubShellFactory); + } + + mpSubShellFactory.reset(); +} + +IMPL_LINK_NOARG(FormShellManager, FormControlActivated, LinkParamNone*, void) +{ + // The form shell has been activated. To give it priority in reacting to + // slot calls the form shell is moved to the top of the object bar shell + // stack. + ViewShell* pShell = mrBase.GetMainViewShell().get(); + if (pShell!=nullptr && !mbFormShellAboveViewShell) + { + mbFormShellAboveViewShell = true; + + ViewShellManager::UpdateLock aLock (mrBase.GetViewShellManager()); + mrBase.GetViewShellManager()->SetFormShell(pShell,mpFormShell,mbFormShellAboveViewShell); + } +} + +IMPL_LINK(FormShellManager, ConfigurationUpdateHandler, sd::tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::MainViewRemoved: + UnregisterAtCenterPane(); + break; + + case EventMultiplexerEventId::MainViewAdded: + mbIsMainViewChangePending = true; + break; + + case EventMultiplexerEventId::ConfigurationUpdated: + if (mbIsMainViewChangePending) + { + mbIsMainViewChangePending = false; + RegisterAtCenterPane(); + } + break; + + default: + break; + } +} + +IMPL_LINK(FormShellManager, WindowEventHandler, VclWindowEvent&, rEvent, void) +{ + switch (rEvent.GetId()) + { + case VclEventId::WindowGetFocus: + { + // The window of the center pane got the focus. Therefore + // the form shell is moved to the bottom of the object bar + // stack. + ViewShell* pShell = mrBase.GetMainViewShell().get(); + if (pShell!=nullptr && mbFormShellAboveViewShell) + { + mbFormShellAboveViewShell = false; + ViewShellManager::UpdateLock aLock (mrBase.GetViewShellManager()); + mrBase.GetViewShellManager()->SetFormShell( + pShell, + mpFormShell, + mbFormShellAboveViewShell); + } + } + break; + + case VclEventId::WindowLoseFocus: + // We follow the sloppy focus policy. Losing the focus is + // ignored. We wait for the focus to be placed either in + // the window or the form shell. The later, however, is + // notified over the FormControlActivated handler, not this + // one. + break; + + case VclEventId::ObjectDying: + mpMainViewShellWindow = nullptr; + break; + + default: break; + } +} + +void FormShellManager::Notify(SfxBroadcaster&, const SfxHint& rHint) +{ + if (rHint.GetId()!=SfxHintId::Dying) + return; + + // If all goes well this listener is called after the + // FormShellManager was notified about the dying form shell by the + // FormShellManagerFactory. + OSL_ASSERT(mpFormShell==nullptr); + if (mpFormShell != nullptr) + { + mpFormShell = nullptr; + mrBase.GetViewShellManager()->SetFormShell( + mrBase.GetMainViewShell().get(), + nullptr, + false); + } +} + +//===== FormShellManagerFactory =============================================== + +namespace { + +FormShellManagerFactory::FormShellManagerFactory ( + ::sd::ViewShell& rViewShell, + FormShellManager& rManager) + : mrViewShell(rViewShell), + mrFormShellManager(rManager) +{ +} + +FmFormShell* FormShellManagerFactory::CreateShell( ::sd::ShellId nId ) +{ + FmFormShell* pShell = nullptr; + + ::sd::View* pView = mrViewShell.GetView(); + if (nId == ToolbarId::FormLayer_Toolbox) + { + pShell = new FmFormShell(&mrViewShell.GetViewShellBase(), pView); + mrFormShellManager.SetFormShell(pShell); + } + + return pShell; +} + +void FormShellManagerFactory::ReleaseShell (SfxShell* pShell) +{ + if (pShell != nullptr) + { + mrFormShellManager.SetFormShell(nullptr); + delete pShell; + } +} + +} // end of anonymous namespace + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/GraphicObjectBar.cxx b/sd/source/ui/view/GraphicObjectBar.cxx new file mode 100644 index 0000000000..b1e94f7219 --- /dev/null +++ b/sd/source/ui/view/GraphicObjectBar.cxx @@ -0,0 +1,141 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +using namespace sd; +#define ShellClass_GraphicObjectBar +#include + +namespace sd { + + +SFX_IMPL_INTERFACE(GraphicObjectBar, SfxShell) + +void GraphicObjectBar::InitInterface_Impl() +{ +} + + +GraphicObjectBar::GraphicObjectBar ( + const ViewShell* pSdViewShell, + ::sd::View* pSdView ) + : SfxShell (pSdViewShell->GetViewShell()), + mpView ( pSdView ) +{ + DrawDocShell* pDocShell = pSdViewShell->GetDocSh(); + + SetPool( &pDocShell->GetPool() ); + SetUndoManager( pDocShell->GetUndoManager() ); + SetRepeatTarget( mpView ); + SetName( "Graphic objectbar"); +} + +GraphicObjectBar::~GraphicObjectBar() +{ + SetRepeatTarget( nullptr ); +} + +void GraphicObjectBar::GetAttrState( SfxItemSet& rSet ) +{ + if( mpView ) + SvxGrafAttrHelper::GetGrafAttrState( rSet, *mpView ); +} + +void GraphicObjectBar::Execute( SfxRequest& rReq ) +{ + if( mpView ) + { + SvxGrafAttrHelper::ExecuteGrafAttr( rReq, *mpView ); + Invalidate(); + } +} + +void GraphicObjectBar::GetFilterState( SfxItemSet& rSet ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + bool bEnable = false; + + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + + if( auto pGrafObj = dynamic_cast< SdrGrafObj *>( pObj ) ) + if( pGrafObj->GetGraphicType() == GraphicType::Bitmap ) + bEnable = true; + } + + if( !bEnable ) + SvxGraphicFilter::DisableGraphicFilterSlots( rSet ); +} + +void GraphicObjectBar::ExecuteFilter( SfxRequest const & rReq ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + + if( auto pGrafObj = dynamic_cast< SdrGrafObj *>( pObj ) ) + if( pGrafObj->GetGraphicType() == GraphicType::Bitmap ) + { + GraphicObject aFilterObj( pGrafObj->GetGraphicObject() ); + + if( SvxGraphicFilterResult::NONE == + SvxGraphicFilter::ExecuteGrfFilterSlot( rReq, aFilterObj ) ) + { + SdrPageView* pPageView = mpView->GetSdrPageView(); + + if( pPageView ) + { + rtl::Reference pFilteredObj = SdrObject::Clone(static_cast(*pObj), pObj->getSdrModelFromSdrObject()); + OUString aStr = mpView->GetDescriptionOfMarkedObjects() + + " " + SdResId(STR_UNDO_GRAFFILTER); + mpView->BegUndo( aStr ); + pFilteredObj->SetGraphicObject( aFilterObj ); + ::sd::View* const pView = mpView; + pView->ReplaceObjectAtView( pObj, *pPageView, pFilteredObj.get() ); + pView->EndUndo(); + return; + } + } + } + } + + Invalidate(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/GraphicViewShellBase.cxx b/sd/source/ui/view/GraphicViewShellBase.cxx new file mode 100644 index 0000000000..a3f8ece26c --- /dev/null +++ b/sd/source/ui/view/GraphicViewShellBase.cxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd +{ +// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a +// new GraphicViewShellBase object has been constructed. + +SfxViewFactory* GraphicViewShellBase::s_pFactory; +SfxViewShell* GraphicViewShellBase::CreateInstance(SfxViewFrame& rFrame, SfxViewShell* pOldView) +{ + GraphicViewShellBase* pBase = new GraphicViewShellBase(rFrame, pOldView); + pBase->LateInit(framework::FrameworkHelper::msDrawViewURL); + return pBase; +} +void GraphicViewShellBase::RegisterFactory(SfxInterfaceId nPrio) +{ + s_pFactory = new SfxViewFactory(&CreateInstance, nPrio, "Default"); + InitFactory(); +} +void GraphicViewShellBase::InitFactory() { SFX_VIEW_REGISTRATION(GraphicDocShell); } + +GraphicViewShellBase::GraphicViewShellBase(SfxViewFrame& _rFrame, SfxViewShell* pOldShell) + : ViewShellBase(_rFrame, pOldShell) +{ +} + +GraphicViewShellBase::~GraphicViewShellBase() {} + +void GraphicViewShellBase::Execute(SfxRequest& rRequest) +{ + sal_uInt16 nSlotId = rRequest.GetSlot(); + + switch (nSlotId) + { + case SID_NOTES_WINDOW: + case SID_SLIDE_SORTER_MULTI_PANE_GUI: + case SID_SLIDE_SORTER_MODE: + case SID_SLIDE_MASTER_MODE: + case SID_OUTLINE_MODE: + case SID_NOTES_MODE: + case SID_NOTES_MASTER_MODE: + case SID_HANDOUT_MASTER_MODE: + // Prevent some Impress-only slots from being executed. + rRequest.Cancel(); + break; + + case SID_SWITCH_SHELL: + case SID_LEFT_PANE_DRAW: + case SID_LEFT_PANE_IMPRESS: + default: + // The remaining requests are forwarded to our base class. + ViewShellBase::Execute(rRequest); + break; + } +} + +void GraphicViewShellBase::InitializeFramework() +{ + rtl::Reference xController(GetDrawController()); + sd::framework::DrawModule::Initialize(xController); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ImpressViewShellBase.cxx b/sd/source/ui/view/ImpressViewShellBase.cxx new file mode 100644 index 0000000000..929b607dbb --- /dev/null +++ b/sd/source/ui/view/ImpressViewShellBase.cxx @@ -0,0 +1,97 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + + +// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a +// new ImpressViewShellBase object has been constructed. + +SfxViewFactory* ImpressViewShellBase::s_pFactory; +SfxViewShell* ImpressViewShellBase::CreateInstance ( + SfxViewFrame& rFrame, SfxViewShell *pOldView) +{ + ImpressViewShellBase* pBase = new ImpressViewShellBase(rFrame, pOldView); + pBase->LateInit(comphelper::LibreOfficeKit::isActive() ? framework::FrameworkHelper::msImpressViewURL : ""); + return pBase; +} +void ImpressViewShellBase::RegisterFactory( SfxInterfaceId nPrio ) +{ + s_pFactory = new SfxViewFactory(&CreateInstance,nPrio,"Default"); + InitFactory(); +} +void ImpressViewShellBase::InitFactory() +{ + SFX_VIEW_REGISTRATION(DrawDocShell); +} + +ImpressViewShellBase::ImpressViewShellBase ( + SfxViewFrame& _rFrame, + SfxViewShell* pOldShell) + : ViewShellBase (_rFrame, pOldShell) +{ + MasterPageObserver::Instance().RegisterDocument (*GetDocShell()->GetDoc()); +} + +ImpressViewShellBase::~ImpressViewShellBase() +{ + MasterPageObserver::Instance().UnregisterDocument (*GetDocShell()->GetDoc()); +} + +void ImpressViewShellBase::Execute (SfxRequest& rRequest) +{ + sal_uInt16 nSlotId = rRequest.GetSlot(); + + switch (nSlotId) + { + case SID_LEFT_PANE_DRAW: + // Prevent a Draw-only slots from being executed. + rRequest.Cancel(); + break; + + default: + // The remaining requests are forwarded to our base class. + ViewShellBase::Execute(rRequest); + break; + } +} + +void ImpressViewShellBase::InitializeFramework() +{ + rtl::Reference xController(GetDrawController()); + sd::framework::ImpressModule::Initialize(xController); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/MediaObjectBar.cxx b/sd/source/ui/view/MediaObjectBar.cxx new file mode 100644 index 0000000000..232535240e --- /dev/null +++ b/sd/source/ui/view/MediaObjectBar.cxx @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace sd; +using namespace svx; + +#define ShellClass_MediaObjectBar +#include + +namespace sd +{ +SFX_IMPL_INTERFACE(MediaObjectBar, SfxShell) + +void MediaObjectBar::InitInterface_Impl() {} + +MediaObjectBar::MediaObjectBar(const ViewShell* pSdViewShell, ::sd::View* pSdView) + : SfxShell(pSdViewShell->GetViewShell()) + , mpView(pSdView) +{ + DrawDocShell* pDocShell = pSdViewShell->GetDocSh(); + + SetPool(&pDocShell->GetPool()); + SetUndoManager(pDocShell->GetUndoManager()); + SetRepeatTarget(mpView); + SetName(SdResId(RID_DRAW_MEDIA_TOOLBOX)); +} + +MediaObjectBar::~MediaObjectBar() { SetRepeatTarget(nullptr); } + +void MediaObjectBar::GetState(SfxItemSet& rSet) { MediaShellHelpers::GetState(mpView, rSet); } + +void MediaObjectBar::Execute(SfxRequest const& rReq) +{ + const ::avmedia::MediaItem* pMediaItem = MediaShellHelpers::Execute(mpView, rReq); + if (!pMediaItem) + return; + + //if only changing state then don't set modified flag (e.g. playing a video) + if (!(pMediaItem->getMaskSet() & AVMediaSetMask::STATE)) + { + //fdo #32598: after changing playback opts, set document's modified flag + SdDrawDocument& rDoc = mpView->GetDoc(); + rDoc.SetChanged(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/OutlineViewShellBase.cxx b/sd/source/ui/view/OutlineViewShellBase.cxx new file mode 100644 index 0000000000..e3efb3ed59 --- /dev/null +++ b/sd/source/ui/view/OutlineViewShellBase.cxx @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +namespace sd { + +class DrawDocShell; + + +// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a +// new OutlineViewShellBase object has been constructed. + +SfxViewFactory* OutlineViewShellBase::s_pFactory; +SfxViewShell* OutlineViewShellBase::CreateInstance ( + SfxViewFrame& rFrame, SfxViewShell *pOldView) +{ + OutlineViewShellBase* pBase = new OutlineViewShellBase(rFrame, pOldView); + pBase->LateInit(framework::FrameworkHelper::msOutlineViewURL); + return pBase; +} +void OutlineViewShellBase::RegisterFactory( SfxInterfaceId nPrio ) +{ + s_pFactory = new SfxViewFactory(&CreateInstance,nPrio,"Outline"); + InitFactory(); +} +void OutlineViewShellBase::InitFactory() +{ + SFX_VIEW_REGISTRATION(DrawDocShell); +} + +OutlineViewShellBase::OutlineViewShellBase ( + SfxViewFrame& _rFrame, + SfxViewShell* pOldShell) + : ImpressViewShellBase (_rFrame, pOldShell) +{ +} + +OutlineViewShellBase::~OutlineViewShellBase() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx new file mode 100644 index 0000000000..aaf4cc6a81 --- /dev/null +++ b/sd/source/ui/view/Outliner.cxx @@ -0,0 +1,2066 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +class SfxStyleSheetPool; + +class SdOutliner::Implementation +{ +public: + /** The original edit mode directly after switching to a different view + mode. Used for restoring the edit mode when leaving that view mode + again. + */ + EditMode meOriginalEditMode; + + Implementation(); + ~Implementation(); + + /** Return the OutlinerView that was provided by the last call to + ProvideOutlinerView() (or NULL when there was no such call.) + */ + OutlinerView* GetOutlinerView() { return mpOutlineView;} + + /** Provide in the member mpOutlineView an instance of OutlinerView that + is either taken from the ViewShell, when it is an OutlineViewShell, + or is created. When an OutlinerView already exists it is initialized. + */ + void ProvideOutlinerView ( + Outliner& rOutliner, + const std::shared_ptr& rpViewShell, + vcl::Window* pWindow); + + /** This method is called when the OutlinerView is no longer used. + */ + void ReleaseOutlinerView(); + + sd::VectorGraphicSearchContext& getVectorGraphicSearchContext() { return maVectorGraphicSearchContext; } + +private: + /** Flag that specifies whether we own the outline view pointed to by + mpOutlineView and thus have to + delete it in EndSpelling(). + */ + bool mbOwnOutlineView; + + /** The outline view used for searching and spelling. If searching or + spell checking an outline view this data member points to that view. + For all other views an instance is created. The + mbOwnOutlineView distinguishes between both cases. + */ + OutlinerView* mpOutlineView; + + sd::VectorGraphicSearchContext maVectorGraphicSearchContext; +}; + +namespace +{ + +sd::ViewShellBase* getViewShellBase() +{ + return dynamic_cast(SfxViewShell::Current()); +} + +} // end anonymous namespace + +SdOutliner::SdOutliner( SdDrawDocument* pDoc, OutlinerMode nMode ) + : SdrOutliner( &pDoc->GetItemPool(), nMode ), + mpImpl(new Implementation()), + meMode(SEARCH), + mpView(nullptr), + mpWindow(nullptr), + mpDrawDocument(pDoc), + mnConversionLanguage(LANGUAGE_NONE), + mnIgnoreCurrentPageChangesLevel(0), + mbStringFound(false), + mbMatchMayExist(false), + mnPageCount(0), + mbEndOfSearch(false), + mbFoundObject(false), + mbDirectionIsForward(true), + mbRestrictSearchToSelection(false), + mpObj(nullptr), + mpFirstObj(nullptr), + mpSearchSpellTextObj(nullptr), + mnText(0), + mpParaObj(nullptr), + meStartViewMode(PageKind::Standard), + meStartEditMode(EditMode::Page), + mnStartPageIndex(sal_uInt16(-1)), + mpStartEditedObject(nullptr), + mbPrepareSpellingPending(true) +{ + SetStyleSheetPool(static_cast( mpDrawDocument->GetStyleSheetPool() )); + SetEditTextObjectPool( &pDoc->GetItemPool() ); + SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl)); + SetForbiddenCharsTable( pDoc->GetForbiddenCharsTable() ); + + EEControlBits nCntrl = GetControlWord(); + nCntrl |= EEControlBits::ALLOWBIGOBJS; + nCntrl |= EEControlBits::MARKFIELDS; + nCntrl |= EEControlBits::AUTOCORRECT; + + bool bOnlineSpell = false; + + sd::DrawDocShell* pDocSh = mpDrawDocument->GetDocSh(); + + if (pDocSh) + { + bOnlineSpell = mpDrawDocument->GetOnlineSpell(); + } + else + { + bOnlineSpell = false; + + try + { + const SvtLinguConfig aLinguConfig; + Any aAny = aLinguConfig.GetProperty( UPN_IS_SPELL_AUTO ); + aAny >>= bOnlineSpell; + } + catch( ... ) + { + OSL_FAIL( "Ill. type in linguistic property" ); + } + } + + if (bOnlineSpell) + nCntrl |= EEControlBits::ONLINESPELLING; + else + nCntrl &= ~EEControlBits::ONLINESPELLING; + + SetControlWord(nCntrl); + + Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() ); + if ( xSpellChecker.is() ) + SetSpeller( xSpellChecker ); + + Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() ); + if( xHyphenator.is() ) + SetHyphenator( xHyphenator ); + + SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() ); +} + +/// Nothing spectacular in the destructor. +SdOutliner::~SdOutliner() +{ +} + +OutlinerView* SdOutliner::getOutlinerView() +{ + return mpImpl->GetOutlinerView(); +} + +/** Prepare find&replace or spellchecking. This distinguishes between three + cases: +
          +
        1. The current shell is a DrawViewShell: Create a + OutlinerView object and search all objects of (i) the + current mark list, (ii) of the current view, or (iii) of all the view + combinations: +
            +
          1. Draw view, slide view
          2. +
          3. Draw view, background view
          4. +
          5. Notes view, slide view
          6. +
          7. Notes view, background view
          8. +
          9. Handout view, slide view
          10. +
          11. Handout view, background view
          12. +
          + +
        2. When the current shell is a SdOutlineViewShell then + directly operate on it. No switching into other views takes place.
        3. +
        +*/ +void SdOutliner::PrepareSpelling() +{ + mbPrepareSpellingPending = false; + + sd::ViewShellBase* pBase = getViewShellBase(); + if (pBase != nullptr) + SetViewShell (pBase->GetMainViewShell()); + SetRefDevice( SD_MOD()->GetVirtualRefDevice() ); + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (pViewShell) + { + mbStringFound = false; + + // Supposed that we are not located at the very beginning/end of + // the document then there may be a match in the document + // prior/after the current position. + mbMatchMayExist = true; + + maObjectIterator = sd::outliner::Iterator(); + maSearchStartPosition = sd::outliner::Iterator(); + RememberStartPosition(); + + mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow); + + HandleChangedSelection (); + } + ClearModifyFlag(); +} + +void SdOutliner::StartSpelling() +{ + meMode = SPELL; + mbDirectionIsForward = true; + mpSearchItem.reset(); +} + +/** Free all resources acquired during the search/spell check. After a + spell check the start position is restored here. +*/ +void SdOutliner::EndSpelling() +{ + // Keep old view shell alive until we release the outliner view. + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + std::shared_ptr pOldViewShell (pViewShell); + + sd::ViewShellBase* pBase = getViewShellBase(); + if (pBase != nullptr) + pViewShell = pBase->GetMainViewShell(); + else + pViewShell.reset(); + mpWeakViewShell = pViewShell; + + // When in PrepareSpelling() a new outline view has + // been created then delete it here. + bool bViewIsDrawViewShell(dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() )); + if (bViewIsDrawViewShell) + { + SetStatusEventHdl(Link()); + mpView = pViewShell->GetView(); + mpView->UnmarkAllObj (mpView->GetSdrPageView()); + mpView->SdrEndTextEdit(); + // Make FuSelection the current function. + pViewShell->GetDispatcher()->Execute( + SID_OBJECT_SELECT, + SfxCallMode::SYNCHRON | SfxCallMode::RECORD); + + // Remove and, if previously created by us, delete the outline + // view. + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + { + RemoveView(pOutlinerView); + mpImpl->ReleaseOutlinerView(); + } + + SetUpdateLayout(true); + } + + // Before clearing the modify flag use it as a hint that + // changes were done at SpellCheck + if(IsModified()) + { + if(auto pOutlineView = dynamic_cast( mpView )) + pOutlineView->PrepareClose(); + if(mpDrawDocument && !mpDrawDocument->IsChanged()) + mpDrawDocument->SetChanged(); + } + + // Now clear the modify flag to have a specified state of + // Outliner + ClearModifyFlag(); + + // When spell checking then restore the start position. + if (meMode==SPELL || meMode==TEXT_CONVERSION) + RestoreStartPosition (); + + mpWeakViewShell.reset(); + mpView = nullptr; + mpWindow = nullptr; + mnStartPageIndex = sal_uInt16(-1); +} + +bool SdOutliner::SpellNextDocument() +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + { + // When doing a spell check in the outline view then there is + // only one document. + mbEndOfSearch = true; + EndOfSearch (); + } + else + { + if( auto pOutlineView = dynamic_cast( mpView )) + pOutlineView->PrepareClose(); + mpDrawDocument->GetDocSh()->SetWaitCursor( true ); + + Initialize (true); + + mpWindow = pViewShell->GetActiveWindow(); + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + pOutlinerView->SetWindow(mpWindow); + ProvideNextTextObject (); + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + ClearModifyFlag(); + } + + return !mbEndOfSearch; +} + +/** + * check next text object + */ +svx::SpellPortions SdOutliner::GetNextSpellSentence() +{ + svx::SpellPortions aResult; + + DetectChange(); + // Iterate over sentences and text shapes until a sentence with a + // spelling error has been found. If no such sentence can be + // found the loop is left through a break. + // It is the responsibility of the sd outliner object to correctly + // iterate over all text shapes, i.e. switch between views, wrap + // around at the end of the document, stop when all text shapes + // have been examined exactly once. + bool bFoundNextSentence = false; + while ( ! bFoundNextSentence) + { + OutlinerView* pOutlinerView = GetView(0); + if (pOutlinerView != nullptr) + { + ESelection aCurrentSelection (pOutlinerView->GetSelection()); + if ( ! mbMatchMayExist + && maStartSelection < aCurrentSelection) + EndOfSearch(); + + // Advance to the next sentence. + bFoundNextSentence = SpellSentence( pOutlinerView->GetEditView(), aResult); + } + + // When no sentence with spelling errors has been found in the + // currently selected text shape or there is no selected text + // shape then advance to the next text shape. + if ( ! bFoundNextSentence) + if ( ! SpellNextDocument()) + // All text objects have been processed so exit the + // loop and return an empty portions list. + break; + } + + return aResult; +} + +/** Go to next match. +*/ +bool SdOutliner::StartSearchAndReplace (const SvxSearchItem* pSearchItem) +{ + bool bEndOfSearch = true; + + // clear the search toolbar entry + SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::Empty); + + mpDrawDocument->GetDocSh()->SetWaitCursor( true ); + + // Since REPLACE is really a replaceAndSearchNext instead of a searchAndReplace, + // make sure that the search portion has not changed since the last FIND. + if (!mbPrepareSpellingPending && mpSearchItem + && pSearchItem->GetCommand() == SvxSearchCmd::REPLACE + && !mpSearchItem->equalsIgnoring(*pSearchItem, /*bIgnoreReplace=*/true, + /*bIgnoreCommand=*/true)) + { + EndSpelling(); + mbPrepareSpellingPending = true; + } + + if (mbPrepareSpellingPending) + PrepareSpelling(); + sd::ViewShellBase* pBase = getViewShellBase(); + // Determine whether we have to abort the search. This is necessary + // when the main view shell does not support searching. + bool bAbort = false; + if (pBase != nullptr) + { + std::shared_ptr pShell (pBase->GetMainViewShell()); + SetViewShell(pShell); + if (pShell == nullptr) + bAbort = true; + else + switch (pShell->GetShellType()) + { + case sd::ViewShell::ST_DRAW: + case sd::ViewShell::ST_IMPRESS: + case sd::ViewShell::ST_NOTES: + case sd::ViewShell::ST_HANDOUT: + case sd::ViewShell::ST_OUTLINE: + bAbort = false; + break; + default: + bAbort = true; + break; + } + } + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if ( ! pViewShell) + { + OSL_ASSERT(pViewShell); + return true; + } + + if ( ! bAbort) + { + meMode = SEARCH; + mpSearchItem.reset(pSearchItem->Clone()); + + mbFoundObject = false; + + Initialize ( ! mpSearchItem->GetBackward()); + + const SvxSearchCmd nCommand (mpSearchItem->GetCommand()); + if (nCommand == SvxSearchCmd::FIND_ALL || nCommand == SvxSearchCmd::REPLACE_ALL) + { + bEndOfSearch = SearchAndReplaceAll (); + } + else + { + RememberStartPosition (); + bEndOfSearch = SearchAndReplaceOnce (); + // restore start position if nothing was found + if(!mbStringFound) + { + RestoreStartPosition (); + // Nothing was changed, no need to restart the spellchecker. + if (nCommand == SvxSearchCmd::FIND) + bEndOfSearch = false; + } + mnStartPageIndex = sal_uInt16(-1); + } + } + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + + return bEndOfSearch; +} + +void SdOutliner::Initialize (bool bDirectionIsForward) +{ + const bool bIsAtEnd (maObjectIterator == sd::outliner::OutlinerContainer(this).end()); + const bool bOldDirectionIsForward = mbDirectionIsForward; + mbDirectionIsForward = bDirectionIsForward; + + if (maObjectIterator == sd::outliner::Iterator()) + { + // Initialize a new search. + maObjectIterator = sd::outliner::OutlinerContainer(this).current(); + maCurrentPosition = *maObjectIterator; + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if ( ! pViewShell) + { + OSL_ASSERT(pViewShell); + return; + } + + // In case we are searching in an outline view then first remove the + // current selection and place cursor at its start or end. + if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + { + ESelection aSelection = getOutlinerView()->GetSelection (); + if (mbDirectionIsForward) + { + aSelection.nEndPara = aSelection.nStartPara; + aSelection.nEndPos = aSelection.nStartPos; + } + else + { + aSelection.nStartPara = aSelection.nEndPara; + aSelection.nStartPos = aSelection.nEndPos; + } + getOutlinerView()->SetSelection (aSelection); + } + + // When not beginning the search at the beginning of the search area + // then there may be matches before the current position. + mbMatchMayExist = (maObjectIterator!=sd::outliner::OutlinerContainer(this).begin()); + } + else if (bOldDirectionIsForward != mbDirectionIsForward) + { + // Requested iteration direction has changed. Turn around the iterator. + maObjectIterator.Reverse(); + if (bIsAtEnd) + { + // The iterator has pointed to end(), which after the search + // direction is reversed, becomes begin(). + maObjectIterator = sd::outliner::OutlinerContainer(this).begin(); + } + else + { + // The iterator has pointed to the object one ahead/before the current + // one. Now move it to the one before/ahead the current one. + ++maObjectIterator; + if (maObjectIterator != sd::outliner::OutlinerContainer(this).end()) + { + ++maObjectIterator; + } + } + + mbMatchMayExist = true; + } + + // Initialize the last valid position with where the search starts so + // that it always points to a valid position. + maLastValidPosition = *sd::outliner::OutlinerContainer(this).current(); +} + +bool SdOutliner::SearchAndReplaceAll() +{ + bool bRet = true; + + // Save the current position to be restored after having replaced all + // matches. + RememberStartPosition (); + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if ( ! pViewShell) + { + OSL_ASSERT(pViewShell); + return true; + } + + std::vector aSelections; + if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + { + // Put the cursor to the beginning/end of the outliner. + getOutlinerView()->SetSelection (GetSearchStartPosition ()); + + // The outliner does all the work for us when we are in this mode. + SearchAndReplaceOnce(); + } + else if( nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() )) + { + // Disable selection change notifications during search all. + SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase(); + rSfxViewShell.setTiledSearching(true); + comphelper::ScopeGuard aGuard([&rSfxViewShell]() + { + rSfxViewShell.setTiledSearching(false); + }); + + // Go to beginning/end of document. + maObjectIterator = sd::outliner::OutlinerContainer(this).begin(); + // Switch to the first object which contains the search string. + ProvideNextTextObject(); + if( !mbStringFound ) + { + RestoreStartPosition (); + mnStartPageIndex = sal_uInt16(-1); + return true; + } + // Reset the iterator back to the beginning + maObjectIterator = sd::outliner::OutlinerContainer(this).begin(); + + // Search/replace until the end of the document is reached. + bool bFoundMatch; + do + { + bFoundMatch = ! SearchAndReplaceOnce(&aSelections); + if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && comphelper::LibreOfficeKit::isActive() && bFoundMatch && aSelections.size() == 1) + { + // Without this, RememberStartPosition() will think it already has a remembered position. + mnStartPageIndex = sal_uInt16(-1); + + RememberStartPosition(); + + // So when RestoreStartPosition() restores the first match, then spellchecker doesn't kill the selection. + bRet = false; + } + } + while (bFoundMatch); + + if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && comphelper::LibreOfficeKit::isActive() && !aSelections.empty()) + { + boost::property_tree::ptree aTree; + aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr()); + aTree.put("highlightAll", true); + + boost::property_tree::ptree aChildren; + for (const sd::SearchSelection& rSelection : aSelections) + { + boost::property_tree::ptree aChild; + aChild.put("part", OString::number(rSelection.m_nPage).getStr()); + aChild.put("rectangles", rSelection.m_aRectangles.getStr()); + aChildren.push_back(std::make_pair("", aChild)); + } + aTree.add_child("searchResultSelection", aChildren); + + std::stringstream aStream; + boost::property_tree::write_json(aStream, aTree); + OString aPayload( aStream.str() ); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload); + } + } + + RestoreStartPosition (); + + if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && comphelper::LibreOfficeKit::isActive() && !bRet) + { + // Find-all, tiled rendering and we have at least one match. + OString aPayload = OString::number(mnStartPageIndex); + SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase(); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload); + + // Emit a selection callback here: + // 1) The original one is no longer valid, as we there was a SET_PART in between + // 2) The underlying editeng will only talk about the first match till + // it doesn't support multi-selection. + std::vector aRectangles; + for (const sd::SearchSelection& rSelection : aSelections) + { + if (rSelection.m_nPage == mnStartPageIndex) + aRectangles.push_back(rSelection.m_aRectangles); + } + OString sRectangles = comphelper::string::join("; ", aRectangles); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_TEXT_SELECTION, sRectangles); + } + + mnStartPageIndex = sal_uInt16(-1); + + return bRet; +} + +namespace +{ + +basegfx::B2DRectangle getPDFSelection(const std::unique_ptr & rVectorGraphicSearch, + const SdrObject* pObject) +{ + basegfx::B2DRectangle aSelection; + + auto const & rTextRectangles = rVectorGraphicSearch->getTextRectangles(); + if (rTextRectangles.empty()) + return aSelection; + + basegfx::B2DSize aPdfPageSizeHMM = rVectorGraphicSearch->pageSize(); + + basegfx::B2DRectangle aObjectB2DRectHMM(vcl::unotools::b2DRectangleFromRectangle(pObject->GetLogicRect())); + + // Setup coordinate conversion matrix to convert the inner PDF + // coordinates to the page relative coordinates + basegfx::B2DHomMatrix aB2DMatrix; + + aB2DMatrix.scale(aObjectB2DRectHMM.getWidth() / aPdfPageSizeHMM.getWidth(), + aObjectB2DRectHMM.getHeight() / aPdfPageSizeHMM.getHeight()); + + aB2DMatrix.translate(aObjectB2DRectHMM.getMinX(), aObjectB2DRectHMM.getMinY()); + + + for (auto const & rRectangle : rVectorGraphicSearch->getTextRectangles()) + { + basegfx::B2DRectangle aRectangle(rRectangle); + aRectangle *= aB2DMatrix; + + if (aSelection.isEmpty()) + aSelection = aRectangle; + else + aSelection.expand(aRectangle); + } + + return aSelection; +} + +} // end namespace + +void SdOutliner::sendLOKSearchResultCallback(const std::shared_ptr & pViewShell, + const OutlinerView* pOutlinerView, + std::vector* pSelections) +{ + std::vector<::tools::Rectangle> aLogicRects; + auto& rVectorGraphicSearchContext = mpImpl->getVectorGraphicSearchContext(); + if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic) + { + basegfx::B2DRectangle aSelectionHMM = getPDFSelection(rVectorGraphicSearchContext.mpVectorGraphicSearch, mpObj); + + tools::Rectangle aSelection(Point(aSelectionHMM.getMinX(), aSelectionHMM.getMinY()), + Size(aSelectionHMM.getWidth(), aSelectionHMM.getHeight())); + aSelection = o3tl::convert(aSelection, o3tl::Length::mm100, o3tl::Length::twip); + aLogicRects.push_back(aSelection); + } + else + { + pOutlinerView->GetSelectionRectangles(aLogicRects); + + // convert to twips if in 100thmm (seems as if LibreOfficeKit is based on twips?). Do this + // here where we have the only place needing this, *not* in ImpEditView::GetSelectionRectangles + // which makes that method unusable for others + if (pOutlinerView->GetWindow() && MapUnit::Map100thMM == pOutlinerView->GetWindow()->GetMapMode().GetMapUnit()) + { + for (tools::Rectangle& rRectangle : aLogicRects) + { + rRectangle = o3tl::convert(rRectangle, o3tl::Length::mm100, o3tl::Length::twip); + } + } + } + + std::vector aLogicRectStrings; + std::transform(aLogicRects.begin(), aLogicRects.end(), std::back_inserter(aLogicRectStrings), + [](const ::tools::Rectangle& rRectangle) + { + return rRectangle.toString(); + }); + + OString sRectangles = comphelper::string::join("; ", aLogicRectStrings); + + if (!pSelections) + { + // notify LibreOfficeKit about changed page + OString aPayload = OString::number(maCurrentPosition.mnPageIndex); + SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase(); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload); + + // also about search result selections + boost::property_tree::ptree aTree; + aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr()); + aTree.put("highlightAll", false); + + boost::property_tree::ptree aChildren; + boost::property_tree::ptree aChild; + aChild.put("part", OString::number(maCurrentPosition.mnPageIndex).getStr()); + aChild.put("rectangles", sRectangles.getStr()); + aChildren.push_back(std::make_pair("", aChild)); + aTree.add_child("searchResultSelection", aChildren); + + std::stringstream aStream; + boost::property_tree::write_json(aStream, aTree); + aPayload = OString(aStream.str()); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload); + + if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic) + { + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_TEXT_SELECTION, sRectangles); + } + } + else + { + sd::SearchSelection aSelection(maCurrentPosition.mnPageIndex, sRectangles); + bool bDuplicate = !pSelections->empty() && pSelections->back() == aSelection; + if (!bDuplicate) + pSelections->push_back(aSelection); + } +} + +bool SdOutliner::SearchAndReplaceOnce(std::vector* pSelections) +{ + DetectChange (); + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + + if (!getOutlinerView() || !GetEditEngine().HasView(&getOutlinerView()->GetEditView())) + { + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pViewShell)); + + // Perhaps the user switched to a different page/slide between searches. + // If so, reset the starting search position to the current slide like DetectChange does + if (pDrawViewShell && pDrawViewShell->GetCurPagePos() != maCurrentPosition.mnPageIndex) + maObjectIterator = sd::outliner::OutlinerContainer(this).current(); + + mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow); + } + + if (pViewShell) + { + mpView = pViewShell->GetView(); + mpWindow = pViewShell->GetActiveWindow(); + getOutlinerView()->SetWindow(mpWindow); + auto& rVectorGraphicSearchContext = mpImpl->getVectorGraphicSearchContext(); + if (nullptr != dynamic_cast(pViewShell.get())) + { + sal_uLong nMatchCount = 0; + + if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic) + { + OUString const & rString = mpSearchItem->GetSearchString(); + bool bBackwards = mpSearchItem->GetBackward(); + + VectorGraphicSearchOptions aOptions; + aOptions.meStartPosition = bBackwards ? SearchStartPosition::End : SearchStartPosition::Begin; + aOptions.mbMatchCase = mpSearchItem->GetExact(); + aOptions.mbMatchWholeWord = mpSearchItem->GetWordOnly(); + + bool bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->search(rString, aOptions); + + if (bResult) + { + if (bBackwards) + bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->previous(); + else + bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->next(); + } + + if (bResult) + { + nMatchCount = 1; + + SdrPageView* pPageView = mpView->GetSdrPageView(); + mpView->UnmarkAllObj(pPageView); + + std::vector aSubSelections; + basegfx::B2DRectangle aSubSelection = getPDFSelection(rVectorGraphicSearchContext.mpVectorGraphicSearch, mpObj); + if (!aSubSelection.isEmpty()) + aSubSelections.push_back(aSubSelection); + mpView->MarkObj(mpObj, pPageView, false, false, std::move(aSubSelections)); + } + else + { + rVectorGraphicSearchContext.reset(); + } + } + else + { + // When replacing we first check if there is a selection + // indicating a match. If there is then replace it. The + // following call to StartSearchAndReplace will then search for + // the next match. + if (meMode == SEARCH && mpSearchItem->GetCommand() == SvxSearchCmd::REPLACE) + { + if (getOutlinerView()->GetSelection().HasRange()) + getOutlinerView()->StartSearchAndReplace(*mpSearchItem); + } + + // Search for the next match. + if (mpSearchItem->GetCommand() != SvxSearchCmd::REPLACE_ALL) + { + nMatchCount = getOutlinerView()->StartSearchAndReplace(*mpSearchItem); + } + } + + // Go to the next text object when there have been no matches in + // the current object or the whole object has already been + // processed. + if (nMatchCount==0 || mpSearchItem->GetCommand()==SvxSearchCmd::REPLACE_ALL) + { + ProvideNextTextObject (); + + if (!mbEndOfSearch && !rVectorGraphicSearchContext.mbCurrentIsVectorGraphic) + { + // Remember the current position as the last one with a + // text object. + maLastValidPosition = maCurrentPosition; + + // Now that the mbEndOfSearch flag guards this block the + // following assertion and return should not be + // necessary anymore. + DBG_ASSERT(GetEditEngine().HasView(&getOutlinerView()->GetEditView() ), + "SearchAndReplace without valid view!" ); + if ( ! GetEditEngine().HasView( &getOutlinerView()->GetEditView() ) ) + { + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + return true; + } + + if (meMode == SEARCH) + getOutlinerView()->StartSearchAndReplace(*mpSearchItem); + } + } + } + else if (nullptr != dynamic_cast(pViewShell.get())) + { + mpDrawDocument->GetDocSh()->SetWaitCursor(false); + // The following loop is executed more than once only when a + // wrap around search is done. + while (true) + { + int nResult = getOutlinerView()->StartSearchAndReplace(*mpSearchItem); + if (nResult == 0) + { + if (HandleFailedSearch ()) + { + getOutlinerView()->SetSelection (GetSearchStartPosition ()); + continue; + } + } + else + mbStringFound = true; + break; + } + } + } + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + + if (pViewShell && comphelper::LibreOfficeKit::isActive() && mbStringFound) + { + sendLOKSearchResultCallback(pViewShell, getOutlinerView(), pSelections); + } + + return mbEndOfSearch; +} + +/** Try to detect whether the document or the view (shell) has changed since + the last time StartSearchAndReplace() has been called. +*/ +void SdOutliner::DetectChange() +{ + sd::outliner::IteratorPosition aPosition (maCurrentPosition); + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pViewShell)); + + // Detect whether the view has been switched from the outside. + if (pDrawViewShell != nullptr + && (aPosition.meEditMode != pDrawViewShell->GetEditMode() + || aPosition.mePageKind != pDrawViewShell->GetPageKind())) + { + // Either the edit mode or the page kind has changed. + SetStatusEventHdl(Link()); + + SdrPageView* pPageView = mpView->GetSdrPageView(); + if (pPageView != nullptr) + mpView->UnmarkAllObj (pPageView); + mpView->SdrEndTextEdit(); + SetUpdateLayout(false); + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + pOutlinerView->SetOutputArea( ::tools::Rectangle( Point(), Size(1, 1) ) ); + if (meMode == SPELL) + SetPaperSize( Size(1, 1) ); + SetText(OUString(), GetParagraph(0)); + + RememberStartPosition (); + + mnPageCount = mpDrawDocument->GetSdPageCount(pDrawViewShell->GetPageKind()); + maObjectIterator = sd::outliner::OutlinerContainer(this).current(); + } + + // Detect change of the set of selected objects. If their number has + // changed start again with the first selected object. + else if (DetectSelectionChange()) + { + HandleChangedSelection (); + maObjectIterator = sd::outliner::OutlinerContainer(this).current(); + } + + // Detect change of page count. Restart search at first/last page in + // that case. + else if (aPosition.meEditMode == EditMode::Page + && mpDrawDocument->GetSdPageCount(aPosition.mePageKind) != mnPageCount) + { + // The number of pages has changed. + mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind); + maObjectIterator = sd::outliner::OutlinerContainer(this).current(); + } + else if (aPosition.meEditMode == EditMode::MasterPage + && mpDrawDocument->GetSdPageCount(aPosition.mePageKind) != mnPageCount) + { + // The number of master pages has changed. + mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind); + maObjectIterator = sd::outliner::OutlinerContainer(this).current(); + } +} + +bool SdOutliner::DetectSelectionChange() +{ + bool bSelectionHasChanged = false; + + // If mpObj is NULL then we have not yet found our first match. + // Detecting a change makes no sense. + if (mpObj != nullptr) + { + const size_t nMarkCount = mpView ? mpView->GetMarkedObjectList().GetMarkCount() : 0; + switch (nMarkCount) + { + case 0: + // The selection has changed when previously there have been + // selected objects. + bSelectionHasChanged = mbRestrictSearchToSelection; + break; + case 1: + // Check if the only selected object is not the one that we + // had selected. + if (mpView != nullptr) + { + SdrMark* pMark = mpView->GetMarkedObjectList().GetMark(0); + if (pMark != nullptr) + bSelectionHasChanged = (mpObj != pMark->GetMarkedSdrObj ()); + } + break; + default: + // We had selected exactly one object. + bSelectionHasChanged = true; + break; + } + } + + return bSelectionHasChanged; +} + +void SdOutliner::RememberStartPosition() +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if ( ! pViewShell) + { + OSL_ASSERT(pViewShell); + return; + } + + if ( mnStartPageIndex != sal_uInt16(-1) ) + return; + + if( nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() )) + { + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pViewShell)); + if (pDrawViewShell != nullptr) + { + meStartViewMode = pDrawViewShell->GetPageKind(); + meStartEditMode = pDrawViewShell->GetEditMode(); + mnStartPageIndex = pDrawViewShell->GetCurPagePos(); + } + + if (mpView != nullptr) + { + mpStartEditedObject = mpView->GetTextEditObject(); + if (mpStartEditedObject != nullptr) + { + // Try to retrieve current caret position only when there is an + // edited object. + ::Outliner* pOutliner = + static_cast(mpView)->GetTextEditOutliner(); + if (pOutliner!=nullptr && pOutliner->GetViewCount()>0) + { + OutlinerView* pOutlinerView = pOutliner->GetView(0); + maStartSelection = pOutlinerView->GetSelection(); + } + } + } + } + else if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + { + // Remember the current cursor position. + OutlinerView* pView = GetView(0); + if (pView != nullptr) + pView->GetSelection(); + } + else + { + mnStartPageIndex = sal_uInt16(-1); + } +} + +void SdOutliner::RestoreStartPosition() +{ + bool bRestore = true; + // Take a negative start page index as indicator that restoring the + // start position is not requested. + if (mnStartPageIndex == sal_uInt16(-1) ) + bRestore = false; + // Don't restore when the view shell is not valid. + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (pViewShell == nullptr) + bRestore = false; + + if (!bRestore) + return; + + if( nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() )) + { + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(pViewShell)); + SetViewMode (meStartViewMode); + if (pDrawViewShell != nullptr) + { + SetPage (meStartEditMode, mnStartPageIndex); + mpObj = mpStartEditedObject; + if (mpObj) + { + PutTextIntoOutliner(); + EnterEditMode(false); + if (getOutlinerView()) + getOutlinerView()->SetSelection(maStartSelection); + } + } + } + else if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + { + // Set cursor to its old position. + OutlinerView* pView = GetView(0); + if (pView != nullptr) + pView->SetSelection (maStartSelection); + } +} + +namespace +{ + +bool lclIsValidTextObject(const sd::outliner::IteratorPosition& rPosition) +{ + auto* pObject = DynCastSdrTextObj( rPosition.mxObject.get().get() ); + return (pObject != nullptr) && pObject->HasText() && ! pObject->IsEmptyPresObj(); +} + +bool isValidVectorGraphicObject(const sd::outliner::IteratorPosition& rPosition) +{ + rtl::Reference pGraphicObject = dynamic_cast(rPosition.mxObject.get().get()); + if (pGraphicObject) + { + auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData(); + if (pVectorGraphicData && VectorGraphicDataType::Pdf == pVectorGraphicData->getType()) + { + return true; + } + } + return false; +} + +} // end anonymous namespace + + +/** The main purpose of this method is to iterate over all shape objects of + the search area (current selection, current view, or whole document) + until a text object has been found that contains at least one match or + until no such object can be found anymore. These two conditions are + expressed by setting one of the flags mbFoundObject or + mbEndOfSearch to . +*/ +void SdOutliner::ProvideNextTextObject() +{ + mbEndOfSearch = false; + mbFoundObject = false; + + // reset the vector search + auto& rVectorGraphicSearchContext = mpImpl->getVectorGraphicSearchContext(); + rVectorGraphicSearchContext.reset(); + + mpView->UnmarkAllObj (mpView->GetSdrPageView()); + try + { + mpView->SdrEndTextEdit(); + } + catch (const css::uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd.view"); + } + SetUpdateLayout(false); + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + pOutlinerView->SetOutputArea( ::tools::Rectangle( Point(), Size(1, 1) ) ); + if (meMode == SPELL) + SetPaperSize( Size(1, 1) ); + SetText(OUString(), GetParagraph(0)); + + mpSearchSpellTextObj = nullptr; + + // Iterate until a valid text object has been found or the search ends. + do + { + mpObj = nullptr; + mpParaObj = nullptr; + + if (maObjectIterator != sd::outliner::OutlinerContainer(this).end()) + { + maCurrentPosition = *maObjectIterator; + + // LOK: do not descent to notes or master pages when searching + bool bForbiddenPage = comphelper::LibreOfficeKit::isActive() && (maCurrentPosition.mePageKind != PageKind::Standard || maCurrentPosition.meEditMode != EditMode::Page); + + rVectorGraphicSearchContext.reset(); + + if (!bForbiddenPage) + { + // Switch to the current object only if it is a valid text object. + if (lclIsValidTextObject(maCurrentPosition)) + { + // Don't set yet in case of searching: the text object may not match. + if (meMode != SEARCH) + mpObj = SetObject(maCurrentPosition); + else + mpObj = maCurrentPosition.mxObject.get().get(); + } + // Or if the object is a valid graphic object which contains vector graphic + else if (meMode == SEARCH && isValidVectorGraphicObject(maCurrentPosition)) + { + mpObj = maCurrentPosition.mxObject.get().get(); + rVectorGraphicSearchContext.mbCurrentIsVectorGraphic = true; + } + } + + // Advance to the next object + ++maObjectIterator; + + if (mpObj) + { + if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic) + { + // We know here the object is a SdrGrafObj and that it + // contains a vector graphic + auto* pGraphicObject = static_cast(mpObj); + OUString const & rString = mpSearchItem->GetSearchString(); + bool bBackwards = mpSearchItem->GetBackward(); + + VectorGraphicSearchOptions aOptions; + aOptions.meStartPosition = bBackwards ? SearchStartPosition::End : SearchStartPosition::Begin; + aOptions.mbMatchCase = mpSearchItem->GetExact(); + aOptions.mbMatchWholeWord = mpSearchItem->GetWordOnly(); + + rVectorGraphicSearchContext.mpVectorGraphicSearch = std::make_unique(pGraphicObject->GetGraphic()); + + bool bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->search(rString, aOptions); + if (bResult) + { + if (bBackwards) + bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->previous(); + else + bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->next(); + } + + if (bResult) + { + mpObj = SetObject(maCurrentPosition); + + mbStringFound = true; + mbMatchMayExist = true; + mbFoundObject = true; + + SdrPageView* pPageView = mpView->GetSdrPageView(); + mpView->UnmarkAllObj(pPageView); + + std::vector aSubSelections; + basegfx::B2DRectangle aSubSelection = getPDFSelection(rVectorGraphicSearchContext.mpVectorGraphicSearch, mpObj); + if (!aSubSelection.isEmpty()) + aSubSelections.push_back(aSubSelection); + + mpView->MarkObj(mpObj, pPageView, false, false, std::move(aSubSelections)); + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + } + else + { + rVectorGraphicSearchContext.reset(); + } + } + else + { + PutTextIntoOutliner(); + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (pViewShell != nullptr) + { + switch (meMode) + { + case SEARCH: + PrepareSearchAndReplace (); + break; + case SPELL: + PrepareSpellCheck (); + break; + case TEXT_CONVERSION: + PrepareConversion(); + break; + } + } + } + } + } + else + { + rVectorGraphicSearchContext.reset(); + + if (meMode == SEARCH) + // Instead of doing a full-blown SetObject(), which would do the same -- but would also possibly switch pages. + mbStringFound = false; + + mbEndOfSearch = true; + EndOfSearch (); + } + } + while ( ! (mbFoundObject || mbEndOfSearch)); +} + +void SdOutliner::EndOfSearch() +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if ( ! pViewShell) + { + OSL_ASSERT(pViewShell); + return; + } + + // Before we display a dialog we first jump to where the last valid text + // object was found. All page and view mode switching since then was + // temporary and should not be visible to the user. + if( nullptr == dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + SetObject (maLastValidPosition); + + if (mbRestrictSearchToSelection) + ShowEndOfSearchDialog (); + else + { + // When no match has been found so far then terminate the search. + if ( ! mbMatchMayExist) + { + ShowEndOfSearchDialog (); + mbEndOfSearch = true; + } + // Ask the user whether to wrap around and continue the search or + // to terminate. + else if (meMode==TEXT_CONVERSION || ShowWrapAroundDialog ()) + { + mbMatchMayExist = false; + // Everything back to beginning (or end?) of the document. + maObjectIterator = sd::outliner::OutlinerContainer(this).begin(); + if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() )) + { + // Set cursor to first character of the document. + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + pOutlinerView->SetSelection (GetSearchStartPosition ()); + } + + mbEndOfSearch = false; + } + else + { + // No wrap around. + mbEndOfSearch = true; + } + } +} + +void SdOutliner::ShowEndOfSearchDialog() +{ + if (meMode == SEARCH) + { + if (!mbStringFound) + { + SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::NotFound); + std::shared_ptr pViewShell(mpWeakViewShell.lock()); + if (pViewShell) + { + SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase(); + rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SEARCH_NOT_FOUND, mpSearchItem->GetSearchString().toUtf8()); + } + } + + // don't do anything else for search + return; + } + + OUString aString; + if (mpView->AreObjectsMarked()) + aString = SdResId(STR_END_SPELLING_OBJ); + else + aString = SdResId(STR_END_SPELLING); + + // Show the message in an info box that is modal with respect to the whole application. + weld::Window* pParent = GetMessageBoxParent(); + std::unique_ptr xInfoBox(Application::CreateMessageDialog(pParent, + VclMessageType::Info, VclButtonsType::Ok, aString)); + xInfoBox->run(); +} + +bool SdOutliner::ShowWrapAroundDialog() +{ + // Determine whether to show the dialog. + if (mpSearchItem) + { + // When searching display the dialog only for single find&replace. + const SvxSearchCmd nCommand(mpSearchItem->GetCommand()); + if (nCommand == SvxSearchCmd::REPLACE || nCommand == SvxSearchCmd::FIND) + { + if (mbDirectionIsForward) + SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::End); + else + SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::Start); + + return true; + } + else + return false; + } + + // show dialog only for spelling + if (meMode != SPELL) + return false; + + // The question text depends on the search direction. + bool bImpress = mpDrawDocument && mpDrawDocument->GetDocumentType() == DocumentType::Impress; + + TranslateId pStringId; + if (mbDirectionIsForward) + pStringId = bImpress ? STR_SAR_WRAP_FORWARD : STR_SAR_WRAP_FORWARD_DRAW; + else + pStringId = bImpress ? STR_SAR_WRAP_BACKWARD : STR_SAR_WRAP_BACKWARD_DRAW; + + // Pop up question box that asks the user whether to wrap around. + // The dialog is made modal with respect to the whole application. + weld::Window* pParent = GetMessageBoxParent(); + std::unique_ptr xQueryBox(Application::CreateMessageDialog(pParent, + VclMessageType::Question, VclButtonsType::YesNo, SdResId(pStringId))); + sal_uInt16 nBoxResult = xQueryBox->run(); + + return (nBoxResult == RET_YES); +} + +void SdOutliner::PutTextIntoOutliner() +{ + mpSearchSpellTextObj = DynCastSdrTextObj( mpObj ); + if ( mpSearchSpellTextObj && mpSearchSpellTextObj->HasText() && !mpSearchSpellTextObj->IsEmptyPresObj() ) + { + SdrText* pText = mpSearchSpellTextObj->getText( maCurrentPosition.mnText ); + mpParaObj = pText ? pText->GetOutlinerParaObject() : nullptr; + + if (mpParaObj != nullptr) + { + SetText(*mpParaObj); + + ClearModifyFlag(); + } + } + else + { + mpSearchSpellTextObj = nullptr; + } +} + +void SdOutliner::PrepareSpellCheck() +{ + EESpellState eState = HasSpellErrors(); + DBG_ASSERT(eState != EESpellState::NoSpeller, "No SpellChecker"); + + if (eState == EESpellState::Ok) + return; + + // When spell checking we have to test whether we have processed the + // whole document and have reached the start page again. + if (meMode == SPELL) + { + if (maSearchStartPosition == sd::outliner::Iterator()) + // Remember the position of the first text object so that we + // know when we have processed the whole document. + maSearchStartPosition = maObjectIterator; + else if (maSearchStartPosition == maObjectIterator) + { + mbEndOfSearch = true; + } + } + + EnterEditMode( false ); +} + +void SdOutliner::PrepareSearchAndReplace() +{ + if (!HasText( *mpSearchItem )) + return; + + // Set the object now that we know it matches. + mpObj = SetObject(maCurrentPosition); + + mbStringFound = true; + mbMatchMayExist = true; + + EnterEditMode(false); + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + // Start search at the right end of the current object's text + // depending on the search direction. + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + pOutlinerView->SetSelection (GetSearchStartPosition ()); +} + +void SdOutliner::SetViewMode (PageKind ePageKind) +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + std::shared_ptr pDrawViewShell( + std::dynamic_pointer_cast(pViewShell)); + if (pDrawViewShell == nullptr || ePageKind == pDrawViewShell->GetPageKind()) + return; + + // Restore old edit mode. + pDrawViewShell->ChangeEditMode(mpImpl->meOriginalEditMode, false); + + SetStatusEventHdl(Link()); + OUString sViewURL; + switch (ePageKind) + { + case PageKind::Standard: + default: + sViewURL = sd::framework::FrameworkHelper::msImpressViewURL; + break; + case PageKind::Notes: + sViewURL = sd::framework::FrameworkHelper::msNotesViewURL; + break; + case PageKind::Handout: + sViewURL = sd::framework::FrameworkHelper::msHandoutViewURL; + break; + } + // The text object iterator is destroyed when the shells are + // switched but we need it so save it and restore it afterwards. + sd::outliner::Iterator aIterator (maObjectIterator); + bool bMatchMayExist = mbMatchMayExist; + + sd::ViewShellBase& rBase = pViewShell->GetViewShellBase(); + + rtl::Reference xFuSearch; + if (pViewShell->GetView()) + xFuSearch = pViewShell->GetView()->getSearchContext().getFunctionSearch(); + + SetViewShell(std::shared_ptr()); + sd::framework::FrameworkHelper::Instance(rBase)->RequestView( + sViewURL, + sd::framework::FrameworkHelper::msCenterPaneURL); + + // Force (well, request) a synchronous update of the configuration. + // In a better world we would handle the asynchronous view update + // instead. But that would involve major restructuring of the + // Outliner code. + sd::framework::FrameworkHelper::Instance(rBase)->RequestSynchronousUpdate(); + + auto pNewViewShell = rBase.GetMainViewShell(); + SetViewShell(pNewViewShell); + if (xFuSearch.is() && pNewViewShell->GetView()) + pNewViewShell->GetView()->getSearchContext().setSearchFunction(xFuSearch); + + // Switching to another view shell has intermediatly called + // EndSpelling(). A PrepareSpelling() is pending, so call that now. + PrepareSpelling(); + + // Update the number of pages so that + // DetectChange() has the correct value to compare + // to. + mnPageCount = mpDrawDocument->GetSdPageCount(ePageKind); + + maObjectIterator = aIterator; + mbMatchMayExist = bMatchMayExist; + + // Save edit mode so that it can be restored when switching the view + // shell again. + pDrawViewShell = std::dynamic_pointer_cast(pViewShell); + OSL_ASSERT(pDrawViewShell != nullptr); + if (pDrawViewShell != nullptr) + mpImpl->meOriginalEditMode = pDrawViewShell->GetEditMode(); +} + +void SdOutliner::SetPage (EditMode eEditMode, sal_uInt16 nPageIndex) +{ + if ( ! mbRestrictSearchToSelection) + { + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + std::shared_ptr pDrawViewShell( + std::dynamic_pointer_cast(pViewShell)); + OSL_ASSERT(pDrawViewShell != nullptr); + if (pDrawViewShell != nullptr) + { + pDrawViewShell->ChangeEditMode(eEditMode, false); + pDrawViewShell->SwitchPage(nPageIndex); + } + } +} + +void SdOutliner::EnterEditMode (bool bGrabFocus) +{ + OutlinerView* pOutlinerView = getOutlinerView(); + if (!(pOutlinerView && mpSearchSpellTextObj)) + return; + + pOutlinerView->SetOutputArea( ::tools::Rectangle( Point(), Size(1, 1))); + SetPaperSize( mpSearchSpellTextObj->GetLogicRect().GetSize() ); + SdrPageView* pPV = mpView->GetSdrPageView(); + + // Make FuText the current function. + SfxUInt16Item aItem (SID_TEXTEDIT, 1); + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (!(pViewShell && pViewShell->GetDispatcher())) + return; + + pViewShell->GetDispatcher()->ExecuteList( + SID_TEXTEDIT, SfxCallMode::SYNCHRON | SfxCallMode::RECORD, {&aItem}); + + if (mpView->IsTextEdit()) + { + // end text edition before starting it again + mpView->SdrEndTextEdit(); + } + + // To be consistent with the usual behaviour in the Office the text + // object that is put into edit mode would have also to be selected. + // Starting the text edit mode is not enough so we do it here by + // hand. + mpView->UnmarkAllObj(pPV); + mpView->MarkObj(mpSearchSpellTextObj, pPV); + + mpSearchSpellTextObj->setActiveText(mnText); + + // Turn on the edit mode for the text object. + SetUpdateLayout(true); + mpView->SdrBeginTextEdit(mpSearchSpellTextObj, pPV, mpWindow, true, this, + pOutlinerView, true, true, bGrabFocus); + + mbFoundObject = true; +} + +ESelection SdOutliner::GetSearchStartPosition() const +{ + ESelection aPosition; + if (mbDirectionIsForward) + { + // The default constructor uses the beginning of the text as default. + aPosition = ESelection (); + } + else + { + // Retrieve the position after the last character in the last + // paragraph. + sal_Int32 nParagraphCount = GetParagraphCount(); + if (nParagraphCount == 0) + aPosition = ESelection(); + else + { + sal_Int32 nLastParagraphLength = GetEditEngine().GetTextLen ( + nParagraphCount-1); + aPosition = ESelection (nParagraphCount-1, nLastParagraphLength); + } + } + + return aPosition; +} + +bool SdOutliner::HasNoPreviousMatch() +{ + OutlinerView* pOutlinerView = getOutlinerView(); + + DBG_ASSERT (pOutlinerView!=nullptr, "outline view in SdOutliner::HasNoPreviousMatch is NULL"); + + // Detect whether the cursor stands at the beginning + // resp. at the end of the text. + return pOutlinerView->GetSelection() == GetSearchStartPosition(); +} + +bool SdOutliner::HandleFailedSearch() +{ + bool bContinueSearch = false; + + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView && mpSearchItem) + { + // Detect whether there is/may be a prior match. If there is then + // ask the user whether to wrap around. Otherwise tell the user + // that there is no match. + if (HasNoPreviousMatch ()) + { + // No match found in the whole presentation. + SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::NotFound); + } + + else + { + // No further matches found. Ask the user whether to wrap + // around and start again. + bContinueSearch = ShowWrapAroundDialog(); + } + } + + return bContinueSearch; +} + +SdrObject* SdOutliner::SetObject ( + const sd::outliner::IteratorPosition& rPosition) +{ + SetViewMode (rPosition.mePageKind); + SetPage (rPosition.meEditMode, static_cast(rPosition.mnPageIndex)); + mnText = rPosition.mnText; + return rPosition.mxObject.get().get(); +} + +void SdOutliner::SetViewShell (const std::shared_ptr& rpViewShell) +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (pViewShell == rpViewShell) + return; + + // Set the new view shell. + mpWeakViewShell = rpViewShell; + // When the outline view is not owned by us then we have to clear + // that pointer so that the current one for the new view shell will + // be used (in ProvideOutlinerView). + if (rpViewShell) + { + mpView = rpViewShell->GetView(); + + mpWindow = rpViewShell->GetActiveWindow(); + + mpImpl->ProvideOutlinerView(*this, rpViewShell, mpWindow); + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + pOutlinerView->SetWindow(mpWindow); + } + else + { + mpView = nullptr; + mpWindow = nullptr; + } +} + +void SdOutliner::HandleChangedSelection() +{ + maMarkListCopy.clear(); + mbRestrictSearchToSelection = mpView->AreObjectsMarked(); + if (!mbRestrictSearchToSelection) + return; + + // Make a copy of the current mark list. + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + if (nCount > 0) + { + maMarkListCopy.clear(); + maMarkListCopy.reserve (nCount); + for (size_t i=0; iGetMarkedSdrObj ()); + } + else + // No marked object. Is this case possible? + mbRestrictSearchToSelection = false; +} + +void SdOutliner::StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage, + const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive ) +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + bool bMultiDoc = nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() ); + + meMode = TEXT_CONVERSION; + mbDirectionIsForward = true; + mpSearchItem.reset(); + mnConversionLanguage = nSourceLanguage; + + BeginConversion(); + + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + { + pOutlinerView->StartTextConversion( + GetMessageBoxParent(), + nSourceLanguage, + nTargetLanguage, + pTargetFont, + nOptions, + bIsInteractive, + bMultiDoc); + } + + EndConversion(); +} + +/** Prepare to do a text conversion on the current text object. This + includes putting it into edit mode. +*/ +void SdOutliner::PrepareConversion() +{ + SetUpdateLayout(true); + if( HasConvertibleTextPortion( mnConversionLanguage ) ) + { + SetUpdateLayout(false); + mbStringFound = true; + mbMatchMayExist = true; + + EnterEditMode(true); + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + // Start search at the right end of the current object's text + // depending on the search direction. + } + else + { + SetUpdateLayout(false); + } +} + +void SdOutliner::BeginConversion() +{ + SetRefDevice( SD_MOD()->GetVirtualRefDevice() ); + + sd::ViewShellBase* pBase = getViewShellBase(); + if (pBase != nullptr) + SetViewShell (pBase->GetMainViewShell()); + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (pViewShell) + { + mbStringFound = false; + + // Supposed that we are not located at the very beginning/end of the + // document then there may be a match in the document prior/after + // the current position. + mbMatchMayExist = true; + + maObjectIterator = sd::outliner::Iterator(); + maSearchStartPosition = sd::outliner::Iterator(); + RememberStartPosition(); + + mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow); + + HandleChangedSelection (); + } + ClearModifyFlag(); +} + +void SdOutliner::EndConversion() +{ + EndSpelling(); +} + +bool SdOutliner::ConvertNextDocument() +{ + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + if (dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ) ) + return false; + + mpDrawDocument->GetDocSh()->SetWaitCursor( true ); + + Initialize ( true ); + + OutlinerView* pOutlinerView = getOutlinerView(); + if (pOutlinerView != nullptr) + { + mpWindow = pViewShell->GetActiveWindow(); + pOutlinerView->SetWindow(mpWindow); + } + ProvideNextTextObject (); + + mpDrawDocument->GetDocSh()->SetWaitCursor( false ); + ClearModifyFlag(); + + // for text conversion we automatically wrap around one + // time and stop at the start shape + if( mpFirstObj ) + { + if( (mnText == 0) && (mpFirstObj == mpObj) ) + return false; + } + else + { + mpFirstObj = mpObj; + } + + return !mbEndOfSearch; +} + +weld::Window* SdOutliner::GetMessageBoxParent() +{ + // We assume that the parent of the given message box is NULL, i.e. it is + // modal with respect to the top application window. However, this + // does not affect the search dialog. Therefore we have to lock it here + // while the message box is being shown. We also have to take into + // account that we are called during a spell check and the search dialog + // is not available. + weld::Window* pSearchDialog = nullptr; + SfxChildWindow* pChildWindow = nullptr; + switch (meMode) + { + case SEARCH: + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + pChildWindow = pViewFrm->GetChildWindow( + SvxSearchDialogWrapper::GetChildWindowId()); + break; + + case SPELL: + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + pChildWindow = pViewFrm->GetChildWindow( + sd::SpellDialogChildWindow::GetChildWindowId()); + break; + + case TEXT_CONVERSION: + // There should no messages boxes be displayed while doing the + // hangul hanja conversion. + break; + } + + if (pChildWindow != nullptr) + { + auto xController = pChildWindow->GetController(); + pSearchDialog = xController ? xController->getDialog() : nullptr; + } + + if (pSearchDialog) + return pSearchDialog; + + std::shared_ptr pViewShell (mpWeakViewShell.lock()); + auto pWin = pViewShell->GetActiveWindow(); + return pWin ? pWin->GetFrameWeld() : nullptr; +} + +//===== SdOutliner::Implementation ============================================== + +SdOutliner::Implementation::Implementation() + : meOriginalEditMode(EditMode::Page), + mbOwnOutlineView(false), + mpOutlineView(nullptr) +{ +} + +SdOutliner::Implementation::~Implementation() +{ + if (mbOwnOutlineView && mpOutlineView!=nullptr) + { + mpOutlineView->SetWindow(nullptr); + delete mpOutlineView; + mpOutlineView = nullptr; + } +} + +/** We try to create a new OutlinerView only when there is none available, + either from an OutlinerViewShell or a previous call to + ProvideOutlinerView(). This is necessary to support the spell checker + which can not cope with exchanging the OutlinerView. +*/ +void SdOutliner::Implementation::ProvideOutlinerView ( + Outliner& rOutliner, + const std::shared_ptr& rpViewShell, + vcl::Window* pWindow) +{ + if (rpViewShell == nullptr) + return; + + switch (rpViewShell->GetShellType()) + { + case sd::ViewShell::ST_DRAW: + case sd::ViewShell::ST_IMPRESS: + case sd::ViewShell::ST_NOTES: + case sd::ViewShell::ST_HANDOUT: + { + // Create a new outline view to do the search on. + bool bInsert = false; + if (mpOutlineView != nullptr && !mbOwnOutlineView) + mpOutlineView = nullptr; + + if (mpOutlineView == nullptr || !rOutliner.GetEditEngine().HasView(&mpOutlineView->GetEditView())) + { + delete mpOutlineView; + mpOutlineView = new OutlinerView(&rOutliner, pWindow); + mbOwnOutlineView = true; + bInsert = true; + } + else + mpOutlineView->SetWindow(pWindow); + + EVControlBits nStat = mpOutlineView->GetControlWord(); + nStat &= ~EVControlBits::AUTOSCROLL; + mpOutlineView->SetControlWord(nStat); + + if (bInsert) + rOutliner.InsertView( mpOutlineView ); + + rOutliner.SetUpdateLayout(false); + mpOutlineView->SetOutputArea (::tools::Rectangle (Point(), Size(1, 1))); + rOutliner.SetPaperSize( Size(1, 1) ); + rOutliner.SetText(OUString(), rOutliner.GetParagraph(0)); + + meOriginalEditMode = + std::static_pointer_cast(rpViewShell)->GetEditMode(); + } + break; + + case sd::ViewShell::ST_OUTLINE: + { + if (mpOutlineView!=nullptr && mbOwnOutlineView) + delete mpOutlineView; + mpOutlineView = rOutliner.GetView(0); + mbOwnOutlineView = false; + } + break; + + default: + case sd::ViewShell::ST_NONE: + case sd::ViewShell::ST_PRESENTATION: + // Ignored + break; + } +} + +void SdOutliner::Implementation::ReleaseOutlinerView() +{ + if (mbOwnOutlineView) + { + OutlinerView* pView = mpOutlineView; + mpOutlineView = nullptr; + mbOwnOutlineView = false; + if (pView != nullptr) + { + pView->SetWindow(nullptr); + delete pView; + } + } + else + { + mpOutlineView = nullptr; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/OutlinerIterator.cxx b/sd/source/ui/view/OutlinerIterator.cxx new file mode 100644 index 0000000000..a7cd6cf66b --- /dev/null +++ b/sd/source/ui/view/OutlinerIterator.cxx @@ -0,0 +1,800 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace sd::outliner { + +//===== IteratorPosition ====================================================== + +IteratorPosition::IteratorPosition() +: mnText(0) +, mnPageIndex(-1) +, mePageKind(PageKind::Standard) +, meEditMode(EditMode::Page) +{ +} + +bool IteratorPosition::operator== (const IteratorPosition& aPosition) const +{ + return mxObject.get() == aPosition.mxObject.get() + && mnText == aPosition.mnText + && mnPageIndex == aPosition.mnPageIndex + && mePageKind == aPosition.mePageKind + && meEditMode == aPosition.meEditMode; +} + +//===== Iterator ============================================================== + +Iterator::Iterator() +{ +} + +Iterator::Iterator (const Iterator& rIterator) + : mxIterator(rIterator.mxIterator ? rIterator.mxIterator->Clone() : nullptr) +{ +} + +Iterator::Iterator(Iterator&& rIterator) noexcept + : mxIterator(std::move(rIterator.mxIterator)) +{ +} + +Iterator::Iterator (std::unique_ptr pObject) + : mxIterator(std::move(pObject)) +{ +} + +Iterator::~Iterator() +{ +} + +Iterator& Iterator::operator= (const Iterator& rIterator) +{ + if (this != &rIterator) + { + if (rIterator.mxIterator) + mxIterator.reset(rIterator.mxIterator->Clone()); + else + mxIterator.reset(); + } + return *this; +} + +Iterator& Iterator::operator=(Iterator&& rIterator) noexcept +{ + mxIterator = std::move(rIterator.mxIterator); + return *this; +} + +const IteratorPosition& Iterator::operator* () const +{ + DBG_ASSERT (mxIterator, "::sd::outliner::Iterator::operator* : missing implementation object"); + return mxIterator->GetPosition(); +} + +Iterator& Iterator::operator++ () +{ + if (mxIterator) + mxIterator->GotoNextText(); + return *this; +} + +bool Iterator::operator== (const Iterator& rIterator) const +{ + if (!mxIterator || !rIterator.mxIterator) + return mxIterator.get() == rIterator.mxIterator.get(); + else + return *mxIterator == *rIterator.mxIterator; +} + +bool Iterator::operator!= (const Iterator& rIterator) const +{ + return ! operator==(rIterator); +} + +void Iterator::Reverse() +{ + if (mxIterator) + mxIterator->Reverse(); +} + +//===== IteratorFactory ======================================================= + +OutlinerContainer::OutlinerContainer (SdOutliner* pOutliner) +: mpOutliner(pOutliner) +{ +} + +Iterator OutlinerContainer::begin() +{ + return CreateIterator (BEGIN); +} + +Iterator OutlinerContainer::end() +{ + return CreateIterator (END); +} + +Iterator OutlinerContainer::current() +{ + return CreateIterator (CURRENT); +} + +Iterator OutlinerContainer::CreateIterator (IteratorLocation aLocation) +{ + // Decide on certain features of the outliner which kind of iterator to + // use. + if (mpOutliner->mbRestrictSearchToSelection) + // There is a selection. Search only in this. + return CreateSelectionIterator ( + mpOutliner->maMarkListCopy, + mpOutliner->mpDrawDocument, + mpOutliner->mpWeakViewShell.lock(), + mpOutliner->mbDirectionIsForward, + aLocation); + else + // Search in the whole document. + return CreateDocumentIterator ( + mpOutliner->mpDrawDocument, + mpOutliner->mpWeakViewShell.lock(), + mpOutliner->mbDirectionIsForward, + aLocation); +} + +Iterator OutlinerContainer::CreateSelectionIterator ( + const ::std::vector<::unotools::WeakReference>& rObjectList, + SdDrawDocument* pDocument, + const std::shared_ptr& rpViewShell, + bool bDirectionIsForward, + IteratorLocation aLocation) +{ + OSL_ASSERT(rpViewShell); + + sal_Int32 nObjectIndex; + + if (bDirectionIsForward) + switch (aLocation) + { + case CURRENT: + case BEGIN: + default: + nObjectIndex = 0; + break; + case END: + nObjectIndex = rObjectList.size(); + break; + } + else + switch (aLocation) + { + case CURRENT: + case BEGIN: + default: + nObjectIndex = rObjectList.size()-1; + break; + case END: + nObjectIndex = -1; + break; + } + + return Iterator (std::make_unique ( + rObjectList, nObjectIndex, pDocument, rpViewShell, bDirectionIsForward)); +} + +Iterator OutlinerContainer::CreateDocumentIterator ( + SdDrawDocument* pDocument, + const std::shared_ptr& rpViewShell, + bool bDirectionIsForward, + IteratorLocation aLocation) +{ + OSL_ASSERT(rpViewShell); + + PageKind ePageKind; + EditMode eEditMode; + + switch (aLocation) + { + case BEGIN: + default: + if (bDirectionIsForward) + { + ePageKind = PageKind::Standard; + eEditMode = EditMode::Page; + } + else + { + ePageKind = PageKind::Handout; + eEditMode = EditMode::MasterPage; + } + break; + + case END: + if (bDirectionIsForward) + { + ePageKind = PageKind::Handout; + eEditMode = EditMode::MasterPage; + } + else + { + ePageKind = PageKind::Standard; + eEditMode = EditMode::Page; + } + break; + + case CURRENT: + const std::shared_ptr pDrawViewShell( + std::dynamic_pointer_cast(rpViewShell)); + if (pDrawViewShell) + { + ePageKind = pDrawViewShell->GetPageKind(); + eEditMode = pDrawViewShell->GetEditMode(); + } + else + { + ePageKind = PageKind::Standard; + eEditMode = EditMode::Page; + } + break; + } + + sal_Int32 nPageIndex = GetPageIndex (pDocument, rpViewShell, + ePageKind, eEditMode, bDirectionIsForward, aLocation); + + return Iterator ( + std::make_unique (nPageIndex, ePageKind, eEditMode, + pDocument, rpViewShell, bDirectionIsForward)); +} + +sal_Int32 OutlinerContainer::GetPageIndex ( + SdDrawDocument const * pDocument, + const std::shared_ptr& rpViewShell, + PageKind ePageKind, + EditMode eEditMode, + bool bDirectionIsForward, + IteratorLocation aLocation) +{ + OSL_ASSERT(rpViewShell); + + sal_Int32 nPageIndex; + sal_Int32 nPageCount; + + const std::shared_ptr pDrawViewShell( + std::dynamic_pointer_cast(rpViewShell)); + + switch (eEditMode) + { + case EditMode::Page: + nPageCount = pDocument->GetSdPageCount (ePageKind); + break; + case EditMode::MasterPage: + nPageCount = pDocument->GetMasterSdPageCount(ePageKind); + break; + default: + nPageCount = 0; + } + + switch (aLocation) + { + case CURRENT: + if (pDrawViewShell) + nPageIndex = pDrawViewShell->GetCurPagePos(); + else + { + const SdPage* pPage = rpViewShell->GetActualPage(); + if (pPage != nullptr) + nPageIndex = (pPage->GetPageNum()-1)/2; + else + nPageIndex = 0; + } + break; + + case BEGIN: + default: + if (bDirectionIsForward) + nPageIndex = 0; + else + nPageIndex = nPageCount-1; + break; + + case END: + if (bDirectionIsForward) + nPageIndex = nPageCount; + else + nPageIndex = -1; + break; + } + + return nPageIndex; +} + +//===== IteratorImplBase ==================================================== + +IteratorImplBase::IteratorImplBase(SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward) +: mpDocument (pDocument) +, mpViewShellWeak (rpViewShellWeak) +, mbDirectionIsForward (bDirectionIsForward) +{ + std::shared_ptr pDrawViewShell; + if ( ! mpViewShellWeak.expired()) + pDrawViewShell = std::dynamic_pointer_cast(rpViewShellWeak.lock()); + + if (pDrawViewShell) + { + maPosition.mePageKind = pDrawViewShell->GetPageKind(); + maPosition.meEditMode = pDrawViewShell->GetEditMode(); + } + else + { + maPosition.mePageKind = PageKind::Standard; + maPosition.meEditMode = EditMode::Page; + } +} + +IteratorImplBase::IteratorImplBase( SdDrawDocument* pDocument, + std::weak_ptr pViewShellWeak, + bool bDirectionIsForward, PageKind ePageKind, EditMode eEditMode) +: mpDocument (pDocument) +, mpViewShellWeak (std::move(pViewShellWeak)) +, mbDirectionIsForward (bDirectionIsForward) +{ + maPosition.mePageKind = ePageKind; + maPosition.meEditMode = eEditMode; +} + +IteratorImplBase::~IteratorImplBase() +{} + +bool IteratorImplBase::operator== (const IteratorImplBase& rIterator) const +{ + return maPosition == rIterator.maPosition; +} + +bool IteratorImplBase::IsEqualSelection(const IteratorImplBase& rIterator) const +{ + // When this method is executed instead of the ones from derived classes + // then the argument is of another type then the object itself. In this + // just compare the position objects. + return maPosition == rIterator.maPosition; +} + +const IteratorPosition& IteratorImplBase::GetPosition() +{ + return maPosition; +} + +IteratorImplBase* IteratorImplBase::Clone (IteratorImplBase* pObject) const +{ + if (pObject != nullptr) + { + pObject->maPosition = maPosition; + pObject->mpDocument = mpDocument; + pObject->mpViewShellWeak = mpViewShellWeak; + pObject->mbDirectionIsForward = mbDirectionIsForward; + } + return pObject; +} + +void IteratorImplBase::Reverse() +{ + mbDirectionIsForward = ! mbDirectionIsForward; +} + +//===== SelectionIteratorImpl =========================================== + +SelectionIteratorImpl::SelectionIteratorImpl ( + const ::std::vector<::unotools::WeakReference>& rObjectList, + sal_Int32 nObjectIndex, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward) + : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward), + mrObjectList(rObjectList), + mnObjectIndex(nObjectIndex) +{ +} + +SelectionIteratorImpl::~SelectionIteratorImpl() +{} + +IteratorImplBase* SelectionIteratorImpl::Clone (IteratorImplBase* pObject) const +{ + SelectionIteratorImpl* pIterator = static_cast(pObject); + if (pIterator == nullptr) + pIterator = new SelectionIteratorImpl ( + mrObjectList, mnObjectIndex, mpDocument, mpViewShellWeak, mbDirectionIsForward); + return pIterator; +} + +void SelectionIteratorImpl::GotoNextText() +{ + SdrTextObj* pTextObj = DynCastSdrTextObj( mrObjectList.at(mnObjectIndex).get().get() ); + if (mbDirectionIsForward) + { + if( pTextObj ) + { + ++maPosition.mnText; + if( maPosition.mnText >= pTextObj->getTextCount() ) + { + maPosition.mnText = 0; + ++mnObjectIndex; + } + } + else + { + ++mnObjectIndex; + } + } + else + { + if( pTextObj ) + { + --maPosition.mnText; + if( maPosition.mnText < 0 ) + { + maPosition.mnText = -1; + --mnObjectIndex; + } + } + else + { + --mnObjectIndex; + maPosition.mnText = -1; + } + + if( (maPosition.mnText == -1) && (mnObjectIndex >= 0) ) + { + pTextObj = DynCastSdrTextObj( mrObjectList.at(mnObjectIndex).get().get() ); + if( pTextObj ) + maPosition.mnText = pTextObj->getTextCount() - 1; + } + + if( maPosition.mnText == -1 ) + maPosition.mnText = 0; + } +} + +const IteratorPosition& SelectionIteratorImpl::GetPosition() +{ + maPosition.mxObject = mrObjectList.at(mnObjectIndex); + + return maPosition; +} + +bool SelectionIteratorImpl::operator== (const IteratorImplBase& rIterator) const +{ + return rIterator.IsEqualSelection(*this); +} + +bool SelectionIteratorImpl::IsEqualSelection(const IteratorImplBase& rIterator) const +{ + const SelectionIteratorImpl* pSelectionIterator = + static_cast(&rIterator); + return mpDocument == pSelectionIterator->mpDocument + && mnObjectIndex == pSelectionIterator->mnObjectIndex; +} + +//===== ViewIteratorImpl ================================================ + +ViewIteratorImpl::ViewIteratorImpl ( + sal_Int32 nPageIndex, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward) + : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward), + mbPageChangeOccurred(false), + mpPage(nullptr) +{ + SetPage (nPageIndex); +} + +ViewIteratorImpl::ViewIteratorImpl ( + sal_Int32 nPageIndex, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward, + PageKind ePageKind, + EditMode eEditMode) + : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward, ePageKind, eEditMode), + mbPageChangeOccurred(false), + mpPage(nullptr) +{ + SetPage (nPageIndex); +} + +ViewIteratorImpl::~ViewIteratorImpl() +{ +} + +IteratorImplBase* ViewIteratorImpl::Clone (IteratorImplBase* pObject) const +{ + + ViewIteratorImpl* pIterator = static_cast(pObject); + if (pIterator == nullptr) + pIterator = new ViewIteratorImpl ( + maPosition.mnPageIndex, mpDocument, mpViewShellWeak, mbDirectionIsForward); + + IteratorImplBase::Clone (pObject); + + if (moObjectIterator) + { + pIterator->moObjectIterator.emplace(mpPage, SdrIterMode::DeepNoGroups, !mbDirectionIsForward); + + // No direct way to set the object iterator to the current object. + pIterator->maPosition.mxObject = nullptr; + while (pIterator->moObjectIterator->IsMore() && pIterator->maPosition.mxObject.get()!=maPosition.mxObject.get()) + pIterator->maPosition.mxObject = pIterator->moObjectIterator->Next(); + } + else + pIterator->moObjectIterator.reset(); + + return pIterator; +} + +void ViewIteratorImpl::GotoNextText() +{ + SdrTextObj* pTextObj = DynCastSdrTextObj( maPosition.mxObject.get().get() ); + if( pTextObj ) + { + if (mbDirectionIsForward) + { + ++maPosition.mnText; + if( maPosition.mnText < pTextObj->getTextCount() ) + return; + } + else + { + --maPosition.mnText; + if( maPosition.mnText >= 0 ) + return; + } + } + + if (moObjectIterator && moObjectIterator->IsMore()) + maPosition.mxObject = moObjectIterator->Next(); + else + maPosition.mxObject = nullptr; + + if (!maPosition.mxObject.get().is() ) + { + if (mbDirectionIsForward) + SetPage (maPosition.mnPageIndex+1); + else + SetPage (maPosition.mnPageIndex-1); + + if (mpPage != nullptr) + moObjectIterator.emplace( mpPage, SdrIterMode::DeepNoGroups, !mbDirectionIsForward ); + if (moObjectIterator && moObjectIterator->IsMore()) + maPosition.mxObject = moObjectIterator->Next(); + else + maPosition.mxObject = nullptr; + } + + maPosition.mnText = 0; + if( !mbDirectionIsForward && maPosition.mxObject.get().is() ) + { + pTextObj = DynCastSdrTextObj( maPosition.mxObject.get().get() ); + if( pTextObj ) + maPosition.mnText = pTextObj->getTextCount() - 1; + } +} + +void ViewIteratorImpl::SetPage (sal_Int32 nPageIndex) +{ + mbPageChangeOccurred = (maPosition.mnPageIndex!=nPageIndex); + if (mbPageChangeOccurred) + { + maPosition.mnPageIndex = nPageIndex; + + sal_Int32 nPageCount; + if (maPosition.meEditMode == EditMode::Page) + nPageCount = mpDocument->GetSdPageCount(maPosition.mePageKind); + else + nPageCount = mpDocument->GetMasterSdPageCount( + maPosition.mePageKind); + + // Get page pointer. Here we have three cases: regular pages, + // master pages and invalid page indices. The later ones are not + // errors but the effect of the iterator advancing to the next page + // and going past the last one. This dropping of the rim at the far + // side is detected here and has to be reacted to by the caller. + if (nPageIndex>=0 && nPageIndex < nPageCount) + { + if (maPosition.meEditMode == EditMode::Page) + mpPage = mpDocument->GetSdPage ( + static_cast(nPageIndex), + maPosition.mePageKind); + else + mpPage = mpDocument->GetMasterSdPage ( + static_cast(nPageIndex), + maPosition.mePageKind); + } + else + mpPage = nullptr; + } + + // Set up object list iterator. + if (mpPage != nullptr) + moObjectIterator.emplace(mpPage, SdrIterMode::DeepNoGroups, ! mbDirectionIsForward); + else + moObjectIterator.reset(); + + // Get object pointer. + if (moObjectIterator && moObjectIterator->IsMore()) + maPosition.mxObject = moObjectIterator->Next(); + else + maPosition.mxObject = nullptr; + + maPosition.mnText = 0; + if( !mbDirectionIsForward && maPosition.mxObject.get().is() ) + { + SdrTextObj* pTextObj = DynCastSdrTextObj( maPosition.mxObject.get().get() ); + if( pTextObj ) + maPosition.mnText = pTextObj->getTextCount() - 1; + } + +} + +void ViewIteratorImpl::Reverse() +{ + IteratorImplBase::Reverse (); + + // Create reversed object list iterator. + if (mpPage != nullptr) + moObjectIterator.emplace(mpPage, SdrIterMode::DeepNoGroups, ! mbDirectionIsForward); + else + moObjectIterator.reset(); + + // Move iterator to the current object. + ::unotools::WeakReference xObject = std::move(maPosition.mxObject); + maPosition.mxObject = nullptr; + + if (!moObjectIterator) + return; + + while (moObjectIterator->IsMore() && maPosition.mxObject.get() != xObject.get()) + maPosition.mxObject = moObjectIterator->Next(); +} + +//===== DocumentIteratorImpl ============================================ + +DocumentIteratorImpl::DocumentIteratorImpl ( + sal_Int32 nPageIndex, + PageKind ePageKind, EditMode eEditMode, + SdDrawDocument* pDocument, + const std::weak_ptr& rpViewShellWeak, + bool bDirectionIsForward) + : ViewIteratorImpl (nPageIndex, pDocument, rpViewShellWeak, bDirectionIsForward, + ePageKind, eEditMode) +{ + if (eEditMode == EditMode::Page) + mnPageCount = pDocument->GetSdPageCount (ePageKind); + else + mnPageCount = pDocument->GetMasterSdPageCount(ePageKind); +} + +DocumentIteratorImpl::~DocumentIteratorImpl() +{} + +IteratorImplBase* DocumentIteratorImpl::Clone (IteratorImplBase* pObject) const +{ + DocumentIteratorImpl* pIterator = static_cast(pObject); + if (pIterator == nullptr) + pIterator = new DocumentIteratorImpl ( + maPosition.mnPageIndex, maPosition.mePageKind, maPosition.meEditMode, + mpDocument, mpViewShellWeak, mbDirectionIsForward); + // Finish the cloning. + return ViewIteratorImpl::Clone (pIterator); +} + +void DocumentIteratorImpl::GotoNextText() +{ + bool bSetToOnePastLastPage = false; + bool bViewChanged = false; + + ViewIteratorImpl::GotoNextText(); + + if (mbDirectionIsForward) + { + if (maPosition.mnPageIndex >= mnPageCount) + { + // Switch to master page. + if (maPosition.meEditMode == EditMode::Page) + { + maPosition.meEditMode = EditMode::MasterPage; + SetPage (0); + } + + // Switch to next view mode. + else + { + if (maPosition.mePageKind == PageKind::Handout) + // Not really necessary but makes things more clear. + bSetToOnePastLastPage = true; + else + { + maPosition.meEditMode = EditMode::Page; + if (maPosition.mePageKind == PageKind::Standard) + maPosition.mePageKind = PageKind::Notes; + else if (maPosition.mePageKind == PageKind::Notes) + maPosition.mePageKind = PageKind::Handout; + SetPage (0); + } + } + bViewChanged = true; + } + } + else + if (maPosition.mnPageIndex < 0) + { + // Switch from master pages to draw pages. + if (maPosition.meEditMode == EditMode::MasterPage) + { + maPosition.meEditMode = EditMode::Page; + bSetToOnePastLastPage = true; + } + + // Switch to previous view mode. + else + { + if (maPosition.mePageKind == PageKind::Standard) + SetPage (-1); + else + { + maPosition.meEditMode = EditMode::MasterPage; + if (maPosition.mePageKind == PageKind::Handout) + maPosition.mePageKind = PageKind::Notes; + else if (maPosition.mePageKind == PageKind::Notes) + maPosition.mePageKind = PageKind::Standard; + bSetToOnePastLastPage = true; + } + } + bViewChanged = true; + } + + if (!bViewChanged) + return; + + // Get new page count; + sal_Int32 nPageCount; + if (maPosition.meEditMode == EditMode::Page) + nPageCount = mpDocument->GetSdPageCount (maPosition.mePageKind); + else + nPageCount = mpDocument->GetMasterSdPageCount(maPosition.mePageKind); + + // Now that we know the number of pages we can set the current page index. + if (bSetToOnePastLastPage) + SetPage (nPageCount); +} + +} // end of namespace ::sd::outliner + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/PresentationViewShellBase.cxx b/sd/source/ui/view/PresentationViewShellBase.cxx new file mode 100644 index 0000000000..525c0813d9 --- /dev/null +++ b/sd/source/ui/view/PresentationViewShellBase.cxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace sd { + +class DrawDocShell; + + +// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a +// new PresentationViewShellBase object has been constructed. + +SfxViewFactory* PresentationViewShellBase::s_pFactory; +SfxViewShell* PresentationViewShellBase::CreateInstance ( + SfxViewFrame& _rFrame, SfxViewShell *pOldView) +{ + PresentationViewShellBase* pBase = + new PresentationViewShellBase(_rFrame, pOldView); + pBase->LateInit(framework::FrameworkHelper::msPresentationViewURL); + return pBase; +} +void PresentationViewShellBase::RegisterFactory( SfxInterfaceId nPrio ) +{ + s_pFactory = new SfxViewFactory( + &CreateInstance,nPrio,"FullScreenPresentation"); + InitFactory(); +} +void PresentationViewShellBase::InitFactory() +{ + SFX_VIEW_REGISTRATION(DrawDocShell); +} + +PresentationViewShellBase::PresentationViewShellBase ( + SfxViewFrame& _rFrame, + SfxViewShell* pOldShell) + : ViewShellBase (_rFrame, pOldShell) +{ + // Hide the automatic (non-context sensitive) tool bars. + Reference xFrameSet ( + _rFrame.GetFrame().GetFrameInterface(), + UNO_QUERY); + if (xFrameSet.is()) + { + Reference xLayouterSet(xFrameSet->getPropertyValue("LayoutManager"), UNO_QUERY); + if (xLayouterSet.is()) + { + xLayouterSet->setPropertyValue("AutomaticToolbars", Any(false)); + } + } +} + +PresentationViewShellBase::~PresentationViewShellBase() +{ +} + +void PresentationViewShellBase::InitializeFramework() +{ + rtl::Reference xController (GetDrawController()); + sd::framework::PresentationModule::Initialize(xController); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/SlideSorterViewShellBase.cxx b/sd/source/ui/view/SlideSorterViewShellBase.cxx new file mode 100644 index 0000000000..3c5578e8a1 --- /dev/null +++ b/sd/source/ui/view/SlideSorterViewShellBase.cxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +namespace sd { + +class DrawDocShell; + + +// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a +// new SlideSorterViewShellBase object has been constructed. + +SfxViewFactory* SlideSorterViewShellBase::s_pFactory; +SfxViewShell* SlideSorterViewShellBase::CreateInstance ( + SfxViewFrame& rFrame, SfxViewShell *pOldView) +{ + SlideSorterViewShellBase* pBase = new SlideSorterViewShellBase(rFrame, pOldView); + pBase->LateInit(framework::FrameworkHelper::msSlideSorterURL); + return pBase; +} + +void SlideSorterViewShellBase::RegisterFactory( SfxInterfaceId nPrio ) +{ + s_pFactory = new SfxViewFactory(&CreateInstance,nPrio,"SlideSorter"); + InitFactory(); +} + +void SlideSorterViewShellBase::InitFactory() +{ + SFX_VIEW_REGISTRATION(DrawDocShell); +} + +SlideSorterViewShellBase::SlideSorterViewShellBase ( + SfxViewFrame& _rFrame, + SfxViewShell* pOldShell) + : ImpressViewShellBase (_rFrame, pOldShell) +{ +} + +SlideSorterViewShellBase::~SlideSorterViewShellBase() +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ToolBarManager.cxx b/sd/source/ui/view/ToolBarManager.cxx new file mode 100644 index 0000000000..4be073bac6 --- /dev/null +++ b/sd/source/ui/view/ToolBarManager.cxx @@ -0,0 +1,1381 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace { + +using namespace sd; + +class ToolBarRules; + +/** Lock of the frame::XLayoutManager. +*/ +class LayouterLock +{ + Reference mxLayouter; +public: + explicit LayouterLock (const Reference& rxLayouter); + ~LayouterLock(); + bool is() const { return mxLayouter.is(); } +}; + +/** Store a list of tool bars for each of the tool bar groups. From + this the list of requested tool bars is built. +*/ +class ToolBarList +{ +public: + ToolBarList(); + + void ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup); + void AddToolBar (sd::ToolBarManager::ToolBarGroup eGroup, const OUString& rsName); + bool RemoveToolBar (sd::ToolBarManager::ToolBarGroup eGroup, const OUString& rsName); + + void GetToolBarsToActivate (std::vector& rToolBars) const; + void GetToolBarsToDeactivate (std::vector& rToolBars) const; + + void MarkToolBarAsActive (const OUString& rsName); + void MarkToolBarAsNotActive (const OUString& rsName); + void MarkAllToolBarsAsNotActive(); + +private: + typedef ::std::map > Groups; + Groups maGroups; + std::vector maActiveToolBars; + + void MakeRequestedToolBarList (std::vector& rToolBars) const; +}; + +/** Manage tool bars that are implemented as sub shells of a view shell. + The typical procedure of updating the sub shells of a view shell is to + rebuild a list of sub shells that the caller would like to have active. + The methods ClearGroup() and AddShellId() allow the caller to do that. A + final call to UpdateShells() activates the requested shells that are not + active and deactivates the active shells that are not requested . + + This is done by maintaining two lists. One (the current list) + reflects the current state. The other (the requested list) contains the + currently requested shells. UpdateShells() makes the requested + list the current list and clears the current list. + + Each shell belongs to one group. Different groups can be modified + separately. +*/ +class ToolBarShellList +{ +public: + /** Create a new object with an empty current list and an empty + requested list. + */ + ToolBarShellList(); + + /** Remove all shells from a group. Calling this method should normally + not be necessary because after the construction or after a call to + UpdateShells() the requested list is empty. + @param eGroup + The group to clear. Shells in other groups are not modified. + */ + void ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup); + + /** Add a shell. When the specified shell has already been requested + for another group then it is moved to this group. + @param eGroup + The group to which to add the shell. + @param nId + The id of the shell to add. + */ + void AddShellId (sd::ToolBarManager::ToolBarGroup eGroup, sd::ShellId nId); + + /** Releasing all shells means that the given ToolBarRules object is + informed that every shell managed by the called ToolBarShellList is + about to be removed and that the associated framework tool bars can + be removed as well. The caller still has to call UpdateShells(). + */ + void ReleaseAllShells (ToolBarRules& rRules); + + /** The requested list is made the current list by activating all + shells in the requested list and by deactivating the shells in the + current list that are not in the requested list. + @param pMainViewShell + The shells that are activated or deactivated are sub shells of + this view shell. + @param rManager + This ViewShellManager is used to activate or deactivate shells. + */ + void UpdateShells ( + const std::shared_ptr& rpMainViewShell, + const std::shared_ptr& rpManager); + +private: + class ShellDescriptor + {public: + ShellDescriptor (ShellId nId,sd::ToolBarManager::ToolBarGroup eGroup); + ShellId mnId; + sd::ToolBarManager::ToolBarGroup meGroup; + friend bool operator<(const ShellDescriptor& r1, const ShellDescriptor& r2) + { return r1.mnId < r2.mnId; } + }; + + /** The requested list of tool bar shells that will be active after the + next call to UpdateShells(). + */ + typedef ::std::set GroupedShellList; + GroupedShellList maNewList; + + /** The list of tool bar shells that are currently on the shell stack. + Using a GroupedShellList is not strictly necessary but it makes + things easier and does not waste too much memory. + */ + GroupedShellList maCurrentList; +}; + +/** This class concentrates the knowledge about when to show what tool bars + in one place. +*/ +class ToolBarRules +{ +public: + ToolBarRules ( + std::shared_ptr pToolBarManager, + std::shared_ptr pViewShellManager); + + /** This method calls MainViewShellChanged() and SelectionHasChanged() + for the current main view shell and its view. + */ + void Update (ViewShellBase const & rBase); + + /** Reset all tool bars in all groups and add tool bars and tool bar + shells to the ToolBarGroup::Permanent group for the specified ViewShell type. + */ + void MainViewShellChanged (ViewShell::ShellType nShellType); + + /** Reset all tool bars in all groups and add tool bars and tool bar + shells to the ToolBarGroup::Permanent group for the specified ViewShell. + */ + void MainViewShellChanged (const ViewShell& rMainViewShell); + + /** Reset all tool bars in the ToolBarGroup::Function group and add tool bars and tool bar + shells to this group for the current selection. + */ + void SelectionHasChanged ( + const ::sd::ViewShell& rViewShell, + const SdrView& rView); + + /** Add a tool bar for the specified tool bar shell. + */ + void SubShellAdded ( + ::sd::ToolBarManager::ToolBarGroup eGroup, + sd::ShellId nShellId); + + /** Remove a tool bar for the specified tool bar shell. + */ + void SubShellRemoved ( + ::sd::ToolBarManager::ToolBarGroup eGroup, + sd::ShellId nShellId); + +private: + std::shared_ptr mpToolBarManager; + std::shared_ptr mpViewShellManager; +}; + +} // end of anonymous namespace + +namespace sd { + +//===== ToolBarManager::Implementation ======================================== + +class ToolBarManager::Implementation +{ +public: + /** This constructor takes three arguments even though the + ToolBarManager could be taken from the ViewShellBase. This is so to + state explicitly which information has to be present when this + constructor is called. The ViewShellBase may not have been fully + initialized at this point and must not be asked for this values. + */ + Implementation ( + ViewShellBase& rBase, + std::shared_ptr pMultiplexer, + const std::shared_ptr& rpViewShellManager, + const std::shared_ptr& rpToolBarManager); + ~Implementation(); + + void SetValid (bool bValid); + + void ResetToolBars (ToolBarGroup eGroup); + void ResetAllToolBars(); + void AddToolBar (ToolBarGroup eGroup, const OUString& rsToolBarName); + void AddToolBarShell (ToolBarGroup eGroup, ShellId nToolBarId); + void RemoveToolBar (ToolBarGroup eGroup, const OUString& rsToolBarName); + + /** Release all tool bar shells and the associated framework tool bars. + Typically called when the main view shell is being replaced by + another, all tool bar shells are released. In that process the + shells are destroyed anyway and without calling this method they + would still be referenced. + */ + void ReleaseAllToolBarShells(); + + void ToolBarsDestroyed(); + + void RequestUpdate(); + + void PreUpdate(); + void PostUpdate(); + /** Tell the XLayoutManager about the tool bars that we would like to be + shown. + @param rpLayouterLock + This typically is the mpSynchronousLayouterLock that is used in + this method and that is either released at its end or assigned + to mpAsynchronousLock in order to be unlocked later. + */ + void Update (::std::unique_ptr pLayouterLock); + + class UpdateLockImplementation + { + public: + explicit UpdateLockImplementation (Implementation& rImplementation) + : mrImplementation(rImplementation) { mrImplementation.LockUpdate(); } + ~UpdateLockImplementation() { mrImplementation.UnlockUpdate(); } + private: + Implementation& mrImplementation; + }; + + void LockViewShellManager(); + void LockUpdate(); + void UnlockUpdate(); + + ToolBarRules& GetToolBarRules() { return maToolBarRules;} + +private: + mutable ::osl::Mutex maMutex; + ViewShellBase& mrBase; + std::shared_ptr mpEventMultiplexer; + bool mbIsValid; + ToolBarList maToolBarList; + ToolBarShellList maToolBarShellList; + Reference mxLayouter; + sal_Int32 mnLockCount; + bool mbPreUpdatePending; + bool mbPostUpdatePending; + /** The layouter locks manage the locking of the XLayoutManager. The + lock() and unlock() functions are not called directly because the + (final) unlocking is usually done asynchronously *after* the + list of requested toolbars is updated. + */ + ::std::unique_ptr mpSynchronousLayouterLock; + ::std::unique_ptr mpAsynchronousLayouterLock; + ::std::unique_ptr> mpViewShellManagerLock; + ImplSVEvent * mnPendingUpdateCall; + ImplSVEvent * mnPendingSetValidCall; + ToolBarRules maToolBarRules; + + static OUString GetToolBarResourceName (std::u16string_view rsBaseName); + bool CheckPlugInMode (std::u16string_view rsName) const; + + DECL_LINK(UpdateCallback, void *, void); + DECL_LINK(EventMultiplexerCallback, sd::tools::EventMultiplexerEvent&, void); + DECL_LINK(SetValidCallback, void*, void); +}; + +//===== ToolBarManager ======================================================== + +std::shared_ptr ToolBarManager::Create ( + ViewShellBase& rBase, + const std::shared_ptr& rpMultiplexer, + const std::shared_ptr& rpViewShellManager) +{ + std::shared_ptr pManager (new ToolBarManager()); + pManager->mpImpl.reset( + new Implementation(rBase,rpMultiplexer,rpViewShellManager,pManager)); + return pManager; +} + +ToolBarManager::ToolBarManager() +{ +} + +ToolBarManager::~ToolBarManager() +{ +} + +void ToolBarManager::Shutdown() +{ + if (mpImpl != nullptr) + mpImpl.reset(); +} + +void ToolBarManager::ResetToolBars (ToolBarGroup eGroup) +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->ResetToolBars(eGroup); + } +} + +void ToolBarManager::ResetAllToolBars() +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->ResetAllToolBars(); + } +} + +void ToolBarManager::AddToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName) +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->AddToolBar(eGroup,rsToolBarName); + } +} + +void ToolBarManager::AddToolBarShell ( + ToolBarGroup eGroup, + ShellId nToolBarId) +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->AddToolBarShell(eGroup,nToolBarId); + } +} + +void ToolBarManager::RemoveToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName) +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->RemoveToolBar(eGroup,rsToolBarName); + } +} + +void ToolBarManager::SetToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName) +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->ResetToolBars(eGroup); + mpImpl->AddToolBar(eGroup,rsToolBarName); + } +} + +void ToolBarManager::SetToolBarShell ( + ToolBarGroup eGroup, + ShellId nToolBarId) +{ + if (mpImpl != nullptr) + { + UpdateLock aLock (shared_from_this()); + mpImpl->ResetToolBars(eGroup); + mpImpl->AddToolBarShell(eGroup,nToolBarId); + } +} + +void ToolBarManager::PreUpdate() +{ + if (mpImpl != nullptr) + mpImpl->PreUpdate(); +} + +void ToolBarManager::RequestUpdate() +{ + if (mpImpl != nullptr) + mpImpl->RequestUpdate(); +} + +void ToolBarManager::LockViewShellManager() +{ + if (mpImpl != nullptr) + mpImpl->LockViewShellManager(); +} + +void ToolBarManager::LockUpdate() +{ + if (mpImpl != nullptr) + mpImpl->LockUpdate(); +} + +void ToolBarManager::UnlockUpdate() +{ + if (mpImpl != nullptr) + mpImpl->UnlockUpdate(); +} + +void ToolBarManager::MainViewShellChanged () +{ + if (mpImpl != nullptr) + { + mpImpl->ReleaseAllToolBarShells(); + mpImpl->GetToolBarRules().MainViewShellChanged(ViewShell::ST_NONE); + } +} + +void ToolBarManager::MainViewShellChanged (const ViewShell& rMainViewShell) +{ + if (mpImpl != nullptr) + { + mpImpl->ReleaseAllToolBarShells(); + mpImpl->GetToolBarRules().MainViewShellChanged(rMainViewShell); + } +} + +void ToolBarManager::SelectionHasChanged ( + const ViewShell& rViewShell, + const SdrView& rView) +{ + if (mpImpl != nullptr) + mpImpl->GetToolBarRules().SelectionHasChanged(rViewShell,rView); +} + +void ToolBarManager::ToolBarsDestroyed() +{ + if (mpImpl != nullptr) + mpImpl->ToolBarsDestroyed(); +} + +//===== ToolBarManager::Implementation ======================================= + +ToolBarManager::Implementation::Implementation ( + ViewShellBase& rBase, + std::shared_ptr pMultiplexer, + const std::shared_ptr& rpViewShellManager, + const std::shared_ptr& rpToolBarManager) + : mrBase(rBase), + mpEventMultiplexer(std::move(pMultiplexer)), + mbIsValid(false), + mnLockCount(0), + mbPreUpdatePending(false), + mbPostUpdatePending(false), + mnPendingUpdateCall(nullptr), + mnPendingSetValidCall(nullptr), + maToolBarRules(rpToolBarManager,rpViewShellManager) +{ + Link aLink (LINK(this,ToolBarManager::Implementation,EventMultiplexerCallback)); + mpEventMultiplexer->AddEventListener( aLink ); +} + +/** The order of statements is important. + First unregister listeners, which may post user events. + Then remove pending user events. +*/ +ToolBarManager::Implementation::~Implementation() +{ + // Unregister at broadcasters. + Link aLink (LINK(this,ToolBarManager::Implementation,EventMultiplexerCallback)); + mpEventMultiplexer->RemoveEventListener(aLink); + + // Abort pending user calls. + if (mnPendingUpdateCall != nullptr) + Application::RemoveUserEvent(mnPendingUpdateCall); + if (mnPendingSetValidCall != nullptr) + Application::RemoveUserEvent(mnPendingSetValidCall); +} + +void ToolBarManager::Implementation::ToolBarsDestroyed() +{ + maToolBarList.MarkAllToolBarsAsNotActive(); +} + +void ToolBarManager::Implementation::SetValid (bool bValid) +{ + ::osl::MutexGuard aGuard(maMutex); + + if (mbIsValid == bValid) + return; + + UpdateLockImplementation aUpdateLock (*this); + + mbIsValid = bValid; + if (mbIsValid) + { + Reference xFrame = mrBase.GetViewFrame().GetFrame().GetFrameInterface(); + try + { + Reference xFrameProperties (xFrame, UNO_QUERY_THROW); + Any aValue (xFrameProperties->getPropertyValue("LayoutManager")); + aValue >>= mxLayouter; + // tdf#119997 if mpSynchronousLayouterLock was created before mxLayouter was + // set then update it now that its available + if (mpSynchronousLayouterLock && !mpSynchronousLayouterLock->is()) + mpSynchronousLayouterLock.reset(new LayouterLock(mxLayouter)); + } + catch (const RuntimeException&) + { + } + + GetToolBarRules().Update(mrBase); + } + else + { + ResetAllToolBars(); + mxLayouter = nullptr; + } +} + +void ToolBarManager::Implementation::ResetToolBars (ToolBarGroup eGroup) +{ + ::osl::MutexGuard aGuard(maMutex); + + maToolBarList.ClearGroup(eGroup); + maToolBarShellList.ClearGroup(eGroup); + + mbPreUpdatePending = true; +} + +void ToolBarManager::Implementation::ResetAllToolBars() +{ + SAL_INFO("sd.view", __func__ << ": resetting all tool bars"); + for (auto i : o3tl::enumrange()) + ResetToolBars(i); +} + +void ToolBarManager::Implementation::AddToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName) +{ + ::osl::MutexGuard aGuard(maMutex); + + if (CheckPlugInMode(rsToolBarName)) + { + maToolBarList.AddToolBar(eGroup,rsToolBarName); + + mbPostUpdatePending = true; + if (mnLockCount == 0) + PostUpdate(); + } +} + +void ToolBarManager::Implementation::RemoveToolBar ( + ToolBarGroup eGroup, + const OUString& rsToolBarName) +{ + ::osl::MutexGuard aGuard(maMutex); + + if (maToolBarList.RemoveToolBar(eGroup,rsToolBarName)) + { + mbPreUpdatePending = true; + if (mnLockCount == 0) + PreUpdate(); + } +} + +void ToolBarManager::Implementation::AddToolBarShell ( + ToolBarGroup eGroup, + ShellId nToolBarId) +{ + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + if (pMainViewShell != nullptr) + { + maToolBarShellList.AddShellId(eGroup,nToolBarId); + GetToolBarRules().SubShellAdded(eGroup, nToolBarId); + } +} + +void ToolBarManager::Implementation::ReleaseAllToolBarShells() +{ + maToolBarShellList.ReleaseAllShells(GetToolBarRules()); + maToolBarShellList.UpdateShells(mrBase.GetMainViewShell(), mrBase.GetViewShellManager()); +} + +void ToolBarManager::Implementation::RequestUpdate() +{ + if (mnPendingUpdateCall == nullptr) + { + mnPendingUpdateCall = Application::PostUserEvent( + LINK(this,ToolBarManager::Implementation,UpdateCallback)); + } +} + +void ToolBarManager::Implementation::PreUpdate() +{ + ::osl::MutexGuard aGuard(maMutex); + + if (!(mbIsValid + && mbPreUpdatePending + && mxLayouter.is())) + return; + + mbPreUpdatePending = false; + + SAL_INFO("sd.view", __func__ << ": ToolBarManager::PreUpdate ["); + + // Get the list of tool bars that are not used anymore and are to be + // deactivated. + std::vector aToolBars; + maToolBarList.GetToolBarsToDeactivate(aToolBars); + + // Turn off the tool bars. + for (const auto& aToolBar : aToolBars) + { + OUString sFullName (GetToolBarResourceName(aToolBar)); + SAL_INFO("sd.view", __func__ << ": turning off tool bar " << sFullName); + mxLayouter->destroyElement(sFullName); + maToolBarList.MarkToolBarAsNotActive(aToolBar); + } + + SAL_INFO("sd.view", __func__ << ": ToolBarManager::PreUpdate ]"); +} + +void ToolBarManager::Implementation::PostUpdate() +{ + ::osl::MutexGuard aGuard(maMutex); + + if (!(mbIsValid + && mbPostUpdatePending + && mxLayouter.is())) + return; + + mbPostUpdatePending = false; + + // Create the list of requested tool bars. + std::vector aToolBars; + maToolBarList.GetToolBarsToActivate(aToolBars); + + SAL_INFO("sd.view", __func__ << ": ToolBarManager::PostUpdate ["); + + // Turn on the tool bars that are visible in the new context. + for (const auto& aToolBar : aToolBars) + { + OUString sFullName (GetToolBarResourceName(aToolBar)); + SAL_INFO("sd.view", __func__ << ": turning on tool bar " << sFullName); + mxLayouter->requestElement(sFullName); + maToolBarList.MarkToolBarAsActive(aToolBar); + } + + SAL_INFO("sd.view", __func__ << ": ToolBarManager::PostUpdate ]"); +} + +void ToolBarManager::Implementation::LockViewShellManager() +{ + if (mpViewShellManagerLock == nullptr) + mpViewShellManagerLock.reset( + new ViewShellManager::UpdateLock(mrBase.GetViewShellManager())); +} + +void ToolBarManager::Implementation::LockUpdate() +{ + SAL_INFO("sd.view", __func__ << ": LockUpdate " << mnLockCount); + ::osl::MutexGuard aGuard(maMutex); + + DBG_ASSERT(mnLockCount<100, "ToolBarManager lock count unusually high"); + if (mnLockCount == 0) + { + OSL_ASSERT(mpSynchronousLayouterLock == nullptr); + + mpSynchronousLayouterLock.reset(new LayouterLock(mxLayouter)); + } + ++mnLockCount; +} + +void ToolBarManager::Implementation::UnlockUpdate() +{ + SAL_INFO("sd.view", __func__ << ": UnlockUpdate " << mnLockCount); + ::osl::MutexGuard aGuard(maMutex); + + OSL_ASSERT(mnLockCount>0); + --mnLockCount; + if (mnLockCount == 0) + { + Update(std::move(mpSynchronousLayouterLock)); + } +} + +void ToolBarManager::Implementation::Update ( + ::std::unique_ptr pLocalLayouterLock) +{ + // When the lock is released and there are pending changes to the set of + // tool bars then update this set now. + if (mnLockCount != 0) + return; + + // During creation of ViewShellBase we may have the situation that + // the controller has already been created and attached to the frame + // but that the ToolBarManager has not yet completed its + // initialization (by initializing the mxLayouter member.) We do + // this here so that we do not have to wait for the next Update() + // call to show the tool bars. + if (mnPendingSetValidCall != nullptr) + { + Application::RemoveUserEvent(mnPendingSetValidCall); + mnPendingSetValidCall = nullptr; + SetValid(true); + } + + if (mbIsValid && mxLayouter.is() && (mbPreUpdatePending || mbPostUpdatePending)) + { + // 1) Release UNO tool bars that are no longer used. Do this + // now so that they are not updated when the SFX shell stack is + // modified. + if (mbPreUpdatePending) + PreUpdate(); + + // 2) Update the requested shells that represent tool bar + // functionality. Those that are not used anymore are + // deactivated now. Those that are missing are activated in the + // next step together with the view shells. + if (mpViewShellManagerLock == nullptr) + mpViewShellManagerLock.reset( + new ViewShellManager::UpdateLock(mrBase.GetViewShellManager())); + maToolBarShellList.UpdateShells( + mrBase.GetMainViewShell(), + mrBase.GetViewShellManager()); + + // 3) Unlock the ViewShellManager::UpdateLock. This updates the + // shell stack. + mpViewShellManagerLock.reset(); + + // 4) Make the UNO tool bars visible. The outstanding call to + // PostUpdate() is done via PostUserEvent() so that it is + // guaranteed to be executed when the SFX shell stack has been + // updated (under the assumption that our lock to the + // ViewShellManager was the only one open. If that is not the + // case then all should still be well but not as fast.) + + // Note that the lock count may have been increased since + // entering this method. In that case one of the next + // UnlockUpdate() calls will post the UpdateCallback. + if (mnLockCount==0) + { + mpAsynchronousLayouterLock = std::move(pLocalLayouterLock); + if (mnPendingUpdateCall==nullptr) + { + mnPendingUpdateCall = Application::PostUserEvent( + LINK(this,ToolBarManager::Implementation,UpdateCallback)); + } + } + } + else + { + mpViewShellManagerLock.reset(); + pLocalLayouterLock.reset(); + } +} + +IMPL_LINK_NOARG(ToolBarManager::Implementation, UpdateCallback, void*, void) +{ + mnPendingUpdateCall = nullptr; + if (mnLockCount == 0) + { + if (mbPreUpdatePending) + PreUpdate(); + if (mbPostUpdatePending) + PostUpdate(); + if (mbIsValid && mxLayouter.is()) + mpAsynchronousLayouterLock.reset(); + } +} + +IMPL_LINK(ToolBarManager::Implementation,EventMultiplexerCallback, + sd::tools::EventMultiplexerEvent&, rEvent, void) +{ + SolarMutexGuard g; + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::ControllerAttached: + if (mnPendingSetValidCall == nullptr) + mnPendingSetValidCall + = Application::PostUserEvent(LINK(this,Implementation,SetValidCallback)); + break; + + case EventMultiplexerEventId::ControllerDetached: + SetValid(false); + break; + + default: break; + } +} + +IMPL_LINK_NOARG(ToolBarManager::Implementation, SetValidCallback, void*, void) +{ + mnPendingSetValidCall = nullptr; + SetValid(true); +} + +OUString ToolBarManager::Implementation::GetToolBarResourceName ( + std::u16string_view rsBaseName) +{ + return OUString::Concat("private:resource/toolbar/") + rsBaseName; +} + +bool ToolBarManager::Implementation::CheckPlugInMode (std::u16string_view rsName) const +{ + bool bValid (false); + + // Determine the plug in mode. + bool bIsPlugInMode (false); + do + { + SfxObjectShell* pObjectShell = mrBase.GetObjectShell(); + if (pObjectShell == nullptr) + break; + + SfxMedium* pMedium = pObjectShell->GetMedium(); + if (pMedium == nullptr) + break; + + const SfxBoolItem* pViewOnlyItem = pMedium->GetItemSet().GetItem(SID_VIEWONLY, false); + if (pViewOnlyItem == nullptr) + break; + + bIsPlugInMode = pViewOnlyItem->GetValue(); + } + while (false); + + if (rsName == msViewerToolBar) + bValid = bIsPlugInMode; + else + bValid = ! bIsPlugInMode; + + return bValid; +} + +} // end of namespace sd + +namespace { + +using namespace ::sd; + +//===== LayouterLock ========================================================== + +LayouterLock::LayouterLock (const Reference& rxLayouter) + : mxLayouter(rxLayouter) +{ + SAL_INFO("sd.view", __func__ << ": LayouterLock " << (mxLayouter.is() ? 1 :0)); + if (mxLayouter.is()) + mxLayouter->lock(); +} + +LayouterLock::~LayouterLock() +{ + SAL_INFO("sd.view", __func__ << ": ~LayouterLock " << (mxLayouter.is() ? 1 :0)); + if (mxLayouter.is()) + mxLayouter->unlock(); +} + +//===== ToolBarRules ========================================================== + +ToolBarRules::ToolBarRules ( + std::shared_ptr pToolBarManager, + std::shared_ptr pViewShellManager) + : mpToolBarManager(std::move(pToolBarManager)), + mpViewShellManager(std::move(pViewShellManager)) +{ +} + +void ToolBarRules::Update (ViewShellBase const & rBase) +{ + ViewShell* pMainViewShell = rBase.GetMainViewShell().get(); + if (pMainViewShell != nullptr) + { + MainViewShellChanged(pMainViewShell->GetShellType()); + if (pMainViewShell->GetView()) + SelectionHasChanged (*pMainViewShell, *pMainViewShell->GetView()); + } + else + MainViewShellChanged(ViewShell::ST_NONE); +} + +void ToolBarRules::MainViewShellChanged (ViewShell::ShellType nShellType) +{ + ::sd::ToolBarManager::UpdateLock aToolBarManagerLock (mpToolBarManager); + ::sd::ViewShellManager::UpdateLock aViewShellManagerLock (mpViewShellManager); + + mpToolBarManager->ResetAllToolBars(); + + switch(nShellType) + { + case ::sd::ViewShell::ST_IMPRESS: + case ::sd::ViewShell::ST_NOTES: + case ::sd::ViewShell::ST_HANDOUT: + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msOptionsToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msViewerToolBar); + break; + + case ::sd::ViewShell::ST_DRAW: + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msOptionsToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msViewerToolBar); + break; + + case ViewShell::ST_OUTLINE: + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msOutlineToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msViewerToolBar); + mpToolBarManager->AddToolBarShell( + ToolBarManager::ToolBarGroup::Permanent, ToolbarId::Draw_Text_Toolbox_Sd); + break; + + case ViewShell::ST_SLIDE_SORTER: + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msViewerToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msSlideSorterToolBar); + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::Permanent, + ToolBarManager::msSlideSorterObjectBar); + break; + + case ViewShell::ST_NONE: + case ViewShell::ST_PRESENTATION: + case ViewShell::ST_SIDEBAR: + default: + break; + } +} + +void ToolBarRules::MainViewShellChanged (const ViewShell& rMainViewShell) +{ + ::sd::ToolBarManager::UpdateLock aToolBarManagerLock (mpToolBarManager); + ::sd::ViewShellManager::UpdateLock aViewShellManagerLock (mpViewShellManager); + + MainViewShellChanged(rMainViewShell.GetShellType()); + switch(rMainViewShell.GetShellType()) + { + case ::sd::ViewShell::ST_IMPRESS: + case ::sd::ViewShell::ST_DRAW: + case ::sd::ViewShell::ST_NOTES: + { + const DrawViewShell* pDrawViewShell + = dynamic_cast(&rMainViewShell); + if (pDrawViewShell != nullptr) + { + if (pDrawViewShell->GetEditMode() == EditMode::MasterPage) + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::MasterMode, + ToolBarManager::msMasterViewToolBar); + else if ( rMainViewShell.GetShellType() != ::sd::ViewShell::ST_DRAW ) + mpToolBarManager->AddToolBar( + ToolBarManager::ToolBarGroup::CommonTask, + ToolBarManager::msCommonTaskToolBar); + } + break; + } + + default: + break; + } +} + +void ToolBarRules::SelectionHasChanged ( + const ::sd::ViewShell& rViewShell, + const SdrView& rView) +{ + ::sd::ToolBarManager::UpdateLock aLock (mpToolBarManager); + mpToolBarManager->LockViewShellManager(); + bool bTextEdit = rView.IsTextEdit(); + + mpToolBarManager->ResetToolBars(ToolBarManager::ToolBarGroup::Function); + + if (!sfx2::SfxNotebookBar::IsActive()) + { + switch (rView.GetContext()) + { + case SdrViewContext::Graphic: + if (!bTextEdit) + mpToolBarManager->SetToolBarShell(ToolBarManager::ToolBarGroup::Function, + ToolbarId::Draw_Graf_Toolbox); + break; + + case SdrViewContext::Media: + if (!bTextEdit) + mpToolBarManager->SetToolBarShell(ToolBarManager::ToolBarGroup::Function, + ToolbarId::Draw_Media_Toolbox); + break; + + case SdrViewContext::Table: + mpToolBarManager->SetToolBarShell(ToolBarManager::ToolBarGroup::Function, + ToolbarId::Draw_Table_Toolbox); + bTextEdit = true; + break; + + case SdrViewContext::Standard: + default: + if (!bTextEdit) + { + switch(rViewShell.GetShellType()) + { + case ::sd::ViewShell::ST_IMPRESS: + case ::sd::ViewShell::ST_DRAW: + case ::sd::ViewShell::ST_NOTES: + case ::sd::ViewShell::ST_HANDOUT: + mpToolBarManager->SetToolBar(ToolBarManager::ToolBarGroup::Function, + ToolBarManager::msDrawingObjectToolBar); + break; + default: + break; + } + break; + } + } + } + + if( bTextEdit ) + mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Text_Toolbox_Sd); + + SdrView* pView = &const_cast(rView); + // Check if the extrusion tool bar and the fontwork tool bar have to + // be activated. + if (svx::checkForSelectedCustomShapes(pView, true /* bOnlyExtruded */ )) + mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Svx_Extrusion_Bar); + + if (svx::checkForSelectedFontWork(pView)) + mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Svx_Fontwork_Bar); + + // Switch on additional context-sensitive tool bars. + if (rView.GetContext() == SdrViewContext::PointEdit) + mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Bezier_Toolbox_Sd); +} + +void ToolBarRules::SubShellAdded ( + ::sd::ToolBarManager::ToolBarGroup eGroup, + sd::ShellId nShellId) +{ + // For some tool bar shells (those defined in sd) we have to add the + // actual tool bar here. + switch (nShellId) + { + case ToolbarId::Draw_Graf_Toolbox: + mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msGraphicObjectBar); + break; + + case ToolbarId::Draw_Media_Toolbox: + mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msMediaObjectBar); + break; + + case ToolbarId::Draw_Text_Toolbox_Sd: + mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msTextObjectBar); + break; + + case ToolbarId::Bezier_Toolbox_Sd: + mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msBezierObjectBar); + break; + + case ToolbarId::Draw_Table_Toolbox: + // tdf#142489 Do not show the table toolbar when the Notebookbar UI is active + if (!sfx2::SfxNotebookBar::IsActive(true)) + mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msTableObjectBar); + break; + + default: + break; + } +} + +void ToolBarRules::SubShellRemoved ( + ::sd::ToolBarManager::ToolBarGroup eGroup, + sd::ShellId nShellId) +{ + // For some tool bar shells (those defined in sd) we have to add the + // actual tool bar here. + switch (nShellId) + { + case ToolbarId::Draw_Graf_Toolbox: + mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msGraphicObjectBar); + break; + + case ToolbarId::Draw_Media_Toolbox: + mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msMediaObjectBar); + break; + + case ToolbarId::Draw_Text_Toolbox_Sd: + mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msTextObjectBar); + break; + + case ToolbarId::Bezier_Toolbox_Sd: + mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msBezierObjectBar); + break; + + case ToolbarId::Draw_Table_Toolbox: + mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msTableObjectBar); + break; + + default: + break; + } +} + +//===== ToolBarList =========================================================== + +ToolBarList::ToolBarList() +{ +} + +void ToolBarList::ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup) +{ + Groups::iterator iGroup (maGroups.find(eGroup)); + if (iGroup != maGroups.end()) + { + iGroup->second.clear(); + } +} + +void ToolBarList::AddToolBar ( + sd::ToolBarManager::ToolBarGroup eGroup, + const OUString& rsName) +{ + Groups::iterator iGroup (maGroups.find(eGroup)); + if (iGroup == maGroups.end()) + iGroup = maGroups.emplace(eGroup,std::vector()).first; + + if (iGroup != maGroups.end()) + { + auto iBar (std::find(iGroup->second.cbegin(),iGroup->second.cend(),rsName)); + if (iBar == iGroup->second.cend()) + { + iGroup->second.push_back(rsName); + } + } +} + +bool ToolBarList::RemoveToolBar ( + sd::ToolBarManager::ToolBarGroup eGroup, + const OUString& rsName) +{ + Groups::iterator iGroup (maGroups.find(eGroup)); + if (iGroup != maGroups.end()) + { + auto iBar (std::find(iGroup->second.begin(),iGroup->second.end(),rsName)); + if (iBar != iGroup->second.end()) + { + iGroup->second.erase(iBar); + return true; + } + } + return false; +} + +void ToolBarList::MakeRequestedToolBarList (std::vector& rRequestedToolBars) const +{ + for (auto eGroup : o3tl::enumrange()) + { + Groups::const_iterator iGroup (maGroups.find(eGroup)); + if (iGroup != maGroups.end()) + rRequestedToolBars.insert( rRequestedToolBars.end(), + iGroup->second.begin(), + iGroup->second.end() ); + } +} + +void ToolBarList::GetToolBarsToActivate (std::vector& rToolBars) const +{ + std::vector aRequestedToolBars; + MakeRequestedToolBarList(aRequestedToolBars); + + for (const auto& aToolBar : aRequestedToolBars) + { + if (::std::find(maActiveToolBars.begin(),maActiveToolBars.end(),aToolBar) + == maActiveToolBars.end()) + { + rToolBars.push_back(aToolBar); + } + } +} + +void ToolBarList::GetToolBarsToDeactivate (std::vector& rToolBars) const +{ + std::vector aRequestedToolBars; + MakeRequestedToolBarList(aRequestedToolBars); + + for (auto& aToolBar : maActiveToolBars) + { + if (::std::find(aRequestedToolBars.begin(),aRequestedToolBars.end(),aToolBar) + == aRequestedToolBars.end()) + { + rToolBars.push_back(aToolBar); + } + } +} + +void ToolBarList::MarkToolBarAsActive (const OUString& rsName) +{ + maActiveToolBars.push_back(rsName); +} + +void ToolBarList::MarkToolBarAsNotActive (const OUString& rsName) +{ + maActiveToolBars.erase( + ::std::find(maActiveToolBars.begin(),maActiveToolBars.end(), rsName)); +} + +void ToolBarList::MarkAllToolBarsAsNotActive() +{ + maActiveToolBars.clear(); +} + +//===== ToolBarShellList ====================================================== + +ToolBarShellList::ShellDescriptor::ShellDescriptor ( + ShellId nId, + sd::ToolBarManager::ToolBarGroup eGroup) + : mnId(nId), + meGroup(eGroup) +{ +} + +ToolBarShellList::ToolBarShellList() +{ +} + +void ToolBarShellList::ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup) +{ + for (GroupedShellList::iterator iDescriptor = maNewList.begin(); iDescriptor != maNewList.end(); ) + if (iDescriptor->meGroup == eGroup) + iDescriptor = maNewList.erase(iDescriptor); + else + ++iDescriptor; +} + +void ToolBarShellList::AddShellId (sd::ToolBarManager::ToolBarGroup eGroup, sd::ShellId nId) +{ + // Make sure that the shell is not added twice (and possibly in + // different groups.) + ShellDescriptor aDescriptor (nId,eGroup); + GroupedShellList::iterator iDescriptor (maNewList.find(aDescriptor)); + if (iDescriptor != maNewList.end()) + { + // The shell is already requested. + if (iDescriptor->meGroup != eGroup) + { + // It is now being requested for another group. + // (Is this an error?) + // Move it to that group. + maNewList.erase(iDescriptor); + maNewList.insert(aDescriptor); + } + // else nothing to do. + } + else + maNewList.insert(aDescriptor); +} + +void ToolBarShellList::ReleaseAllShells (ToolBarRules& rRules) +{ + // Release the currently active tool bars. + GroupedShellList aList (maCurrentList); + for (const auto& rDescriptor : aList) + { + rRules.SubShellRemoved(rDescriptor.meGroup, rDescriptor.mnId); + } + + // Clear the list of requested tool bars. + maNewList.clear(); +} + +void ToolBarShellList::UpdateShells ( + const std::shared_ptr& rpMainViewShell, + const std::shared_ptr& rpManager) +{ + if (rpMainViewShell == nullptr) + return; + + GroupedShellList aList; + + // Deactivate shells that are in maCurrentList, but not in + // maNewList. + ::std::set_difference(maCurrentList.begin(), maCurrentList.end(), + maNewList.begin(), maNewList.end(), + std::insert_iterator(aList,aList.begin())); + for (const auto& rShell : aList) + { + SAL_INFO("sd.view", __func__ << ": deactivating tool bar shell " << static_cast(rShell.mnId)); + rpManager->DeactivateSubShell(*rpMainViewShell, rShell.mnId); + } + + // Activate shells that are in maNewList, but not in + // maCurrentList. + aList.clear(); + ::std::set_difference(maNewList.begin(), maNewList.end(), + maCurrentList.begin(), maCurrentList.end(), + std::insert_iterator(aList,aList.begin())); + for (const auto& rShell : aList) + { + SAL_INFO("sd.view", __func__ << ": activating tool bar shell " << static_cast(rShell.mnId)); + rpManager->ActivateSubShell(*rpMainViewShell, rShell.mnId); + } + + // The maNewList now reflects the current state and thus is made + // maCurrentList. + maCurrentList = maNewList; +} + +} // end of anonymous namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ViewClipboard.cxx b/sd/source/ui/view/ViewClipboard.cxx new file mode 100644 index 0000000000..c17bf7de1f --- /dev/null +++ b/sd/source/ui/view/ViewClipboard.cxx @@ -0,0 +1,240 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace sd { + +ViewClipboard::ViewClipboard (::sd::View& rView) + : mrView(rView) +{ +} + +ViewClipboard::~ViewClipboard() +{ +} + +void ViewClipboard::HandlePageDrop (const SdTransferable& rTransferable) +{ + // Determine whether to insert the given set of slides or to assign a + // given master page. + // tdf#113405 only assign master pages to normal pages, don't attempt to assign a master + // page to a master page + sd::DrawViewShell* pDrawViewShell = dynamic_cast<::sd::DrawViewShell*>(mrView.GetViewShell()); + SdPage* pMasterPage = (pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::Page) ? GetFirstMasterPage(rTransferable) : nullptr; + if (pMasterPage) + AssignMasterPage (rTransferable, pMasterPage); + else + InsertSlides (rTransferable, DetermineInsertPosition ()); +} + +SdPage* ViewClipboard::GetFirstMasterPage (const SdTransferable& rTransferable) +{ + SdPage* pFirstMasterPage = nullptr; + + if (rTransferable.HasPageBookmarks()) + { + do + { + const std::vector &rBookmarks = rTransferable.GetPageBookmarks(); + + if (rBookmarks.empty()) + break; + + DrawDocShell* pDocShell = rTransferable.GetPageDocShell(); + if (pDocShell == nullptr) + break; + + SdDrawDocument* pDocument = pDocShell->GetDoc(); + if (pDocument == nullptr) + break; + + for (const OUString& sName : rBookmarks) + { + bool bIsMasterPage; + + // SdPage* GetMasterSdPage(sal_uInt16 nPgNum, PageKind ePgKind); + // sal_uInt16 GetMasterSdPageCount(PageKind ePgKind) const; + + sal_uInt16 nBMPage = pDocument->GetPageByName ( + sName, bIsMasterPage); + if ( ! bIsMasterPage) + { + // At least one regular slide: return NULL to indicate + // that not all bookmarks point to master pages. + pFirstMasterPage = nullptr; + break; + } + else if (pFirstMasterPage == nullptr) + { + // Remember the first master page for later. + if (nBMPage != SDRPAGE_NOTFOUND) + pFirstMasterPage = static_cast( + pDocument->GetMasterPage(nBMPage)); + } + } + } + while (false); + } + + return pFirstMasterPage; +} + +void ViewClipboard::AssignMasterPage ( + const SdTransferable& rTransferable, + SdPage const * pMasterPage) +{ + if (pMasterPage == nullptr) + return; + + // Get the target page to which the master page is assigned. + SdrPageView* pPageView = mrView.GetSdrPageView(); + if (pPageView == nullptr) + return; + + SdPage* pPage = static_cast(pPageView->GetPage()); + if (pPage == nullptr) + return; + + SdDrawDocument& rDocument = mrView.GetDoc(); + + if ( ! rTransferable.HasPageBookmarks()) + return; + + DrawDocShell* pDataDocShell = rTransferable.GetPageDocShell(); + if (pDataDocShell == nullptr) + return; + + SdDrawDocument* pSourceDocument = pDataDocShell->GetDoc(); + if (pSourceDocument == nullptr) + return; + + // We have to remove the layout suffix from the layout name which is + // appended again by SetMasterPage() to the given name. Don't ask. + OUString sLayoutSuffix = SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE; + sal_Int32 nLength = sLayoutSuffix.getLength(); + OUString sLayoutName = pMasterPage->GetLayoutName(); + if (sLayoutName.endsWith(sLayoutSuffix)) + sLayoutName = sLayoutName.copy(0, sLayoutName.getLength() - nLength); + + rDocument.SetMasterPage ( + pPage->GetPageNum() / 2, + sLayoutName, + pSourceDocument, + false, // Exchange the master page of only the target page. + false // Keep unused master pages. + ); +} + +sal_uInt16 ViewClipboard::DetermineInsertPosition () +{ + SdDrawDocument& rDoc = mrView.GetDoc(); + sal_uInt16 nPgCnt = rDoc.GetSdPageCount( PageKind::Standard ); + + // Insert position is the behind the last selected page or behind the + // last page when the selection is empty. + sal_uInt16 nInsertPos = rDoc.GetSdPageCount( PageKind::Standard ) * 2 + 1; + for( sal_uInt16 nPage = 0; nPage < nPgCnt; nPage++ ) + { + SdPage* pPage = rDoc.GetSdPage( nPage, PageKind::Standard ); + + if( pPage->IsSelected() ) + nInsertPos = nPage * 2 + 3; + } + + return nInsertPos; +} + +sal_uInt16 ViewClipboard::InsertSlides ( + const SdTransferable& rTransferable, + sal_uInt16 nInsertPosition) +{ + SdDrawDocument& rDoc = mrView.GetDoc(); + + sal_uInt16 nInsertPgCnt = 0; + bool bMergeMasterPages = !rTransferable.HasSourceDoc( &rDoc ); + + // Prepare the insertion. + const std::vector *pBookmarkList = nullptr; + DrawDocShell* pDataDocSh; + if (rTransferable.HasPageBookmarks()) + { + // When the transferable contains page bookmarks then the referenced + // pages are inserted. + pBookmarkList = &rTransferable.GetPageBookmarks(); + pDataDocSh = rTransferable.GetPageDocShell(); + nInsertPgCnt = static_cast(pBookmarkList->size()); + } + else + { + // Otherwise all pages of the document of the transferable are + // inserted. + SfxObjectShell* pShell = rTransferable.GetDocShell().get(); + pDataDocSh = static_cast(pShell); + SdDrawDocument* pDataDoc = pDataDocSh->GetDoc(); + + if (pDataDoc!=nullptr && pDataDoc->GetSdPageCount(PageKind::Standard)) + nInsertPgCnt = pDataDoc->GetSdPageCount(PageKind::Standard); + } + if (nInsertPgCnt > 0) + { + const SolarMutexGuard aGuard; + ::sd::Window* pWin = mrView.GetViewShell()->GetActiveWindow(); + const bool bWait = pWin && pWin->IsWait(); + + if( bWait ) + pWin->LeaveWait(); + + rDoc.InsertBookmarkAsPage( + pBookmarkList ? *pBookmarkList : std::vector(), + nullptr, + false, + false, + nInsertPosition, + (&rTransferable == SD_MOD()->pTransferDrag), + pDataDocSh, + true, + bMergeMasterPages, + false); + + if( bWait ) + pWin->EnterWait(); + } + + return nInsertPgCnt; +} + +} // end of namespace ::sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ViewShellBase.cxx b/sd/source/ui/view/ViewShellBase.cxx new file mode 100644 index 0000000000..9e8e7b1aa5 --- /dev/null +++ b/sd/source/ui/view/ViewShellBase.cxx @@ -0,0 +1,1515 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace sd; +#define ShellClass_ViewShellBase +#include + +using ::sd::framework::FrameworkHelper; + +using namespace com::sun::star; +using namespace com::sun::star::beans; +using namespace com::sun::star::container; +using namespace com::sun::star::drawing::framework; +using namespace com::sun::star::lang; +using namespace com::sun::star::uno; + +namespace { + +class CurrentPageSetter +{ +public: + explicit CurrentPageSetter (ViewShellBase& rBase); + void operator () (bool); +private: + ViewShellBase& mrBase; +}; + +} // end of anonymous namespace + +namespace sd { + +class ViewShellBase::Implementation +{ +public: + /** Main controller of the view shell. During the switching from one + stacked shell to another this pointer may be NULL. + */ + ::rtl::Reference mpController; + + /** The view tab bar is the control for switching between different + views in one pane. + */ + ::rtl::Reference mpViewTabBar; + + // contains the complete area of the current view relative to the frame window + ::tools::Rectangle maClientArea; + + // This is set to true when PrepareClose() is called. + bool mbIsClosing; + + /** The view window is the parent of all UI elements that belong to the + view or ViewShell. This comprises the rulers, the scroll bars, and + the content window. + It does not include the ViewTabBar. + */ + VclPtr mpViewWindow; + std::shared_ptr mpToolBarManager; + std::shared_ptr mpViewShellManager; + std::shared_ptr mpEventMultiplexer; + std::shared_ptr mpFormShellManager; + + explicit Implementation (ViewShellBase& rBase); + ~Implementation(); + + void LateInit(); + + /** Show or hide the ViewTabBar. + @param bShow + When then the ViewTabBar is shown, otherwise it is hidden. + */ + void ShowViewTabBar (bool bShow); + + void SetUserWantsTabBar(bool inValue); + bool GetUserWantsTabBar() const { return mbUserWantsTabBar; } + + /** Common code of ViewShellBase::OuterResizePixel() and + ViewShellBase::InnerResizePixel(). + */ + void ResizePixel ( + const Point& rOrigin, + const Size& rSize, + bool bOuterResize); + + /** Show or hide the specified pane. The visibility state is taken + from the given request. + @param rRequest + The request determines the new visibility state. The state can + either be toggled or be set to a given value. + @param rsPaneURL + This URL specifies the pane whose visibility state to set. + @param rsViewURL + When the pane becomes visible then this view URL specifies which + type of view to show in it. + */ + void SetPaneVisibility ( + const SfxRequest& rRequest, + const OUString& rsPaneURL, + const OUString& rsViewURL); + + void GetSlotState (SfxItemSet& rSet); + + void ProcessRestoreEditingViewSlot(); + +private: + ViewShellBase& mrBase; + bool mbUserWantsTabBar; + bool mbTabBarShouldBeVisible; + /** Hold a reference to the page cache manager of the slide sorter in + order to ensure that it stays alive while the ViewShellBase is + alive. + */ + std::shared_ptr mpPageCacheManager; +}; + +namespace { +/** The only task of this window is to forward key presses to the content + window of the main view shell. With the key press it forwards the focus + so that it is not called very often. +*/ +class FocusForwardingWindow : public vcl::Window +{ +public: + FocusForwardingWindow (vcl::Window& rParentWindow, ViewShellBase& rBase); + virtual ~FocusForwardingWindow() override; + virtual void dispose() override; + virtual void KeyInput (const KeyEvent& rEvent) override; + virtual void Command (const CommandEvent& rEvent) override; + +private: + ViewShellBase& mrBase; +}; +} // end of anonymous namespace + +//===== ViewShellBase ========================================================= + + +// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a +// new ViewShellBase object has been constructed. + +SFX_IMPL_SUPERCLASS_INTERFACE(ViewShellBase, SfxViewShell) + +void ViewShellBase::InitInterface_Impl() +{ +} + +ViewShellBase::ViewShellBase ( + SfxViewFrame& _rFrame, + SfxViewShell*) + : SfxViewShell(_rFrame, SfxViewShellFlags::HAS_PRINTOPTIONS), + mpDocShell (nullptr), + mpDocument (nullptr) +{ + mpImpl.reset(new Implementation(*this)); + mpImpl->mpViewWindow = VclPtr::Create(_rFrame.GetWindow(),*this); + mpImpl->mpViewWindow->SetBackground(Wallpaper()); + + _rFrame.GetWindow().SetBackground(Application::GetSettings().GetStyleSettings().GetLightColor()); + + // Set up the members in the correct order. + if (auto pDrawDocShell = dynamic_cast< DrawDocShell *>( GetViewFrame().GetObjectShell() )) + mpDocShell = pDrawDocShell; + if (mpDocShell != nullptr) + mpDocument = mpDocShell->GetDoc(); + mpImpl->mpViewShellManager = std::make_shared(*this); + + SetWindow(mpImpl->mpViewWindow.get()); + + // Hide the window to avoid complaints from Sfx...SwitchViewShell... + _rFrame.GetWindow().Hide(); +} + +/** In this destructor the order in which some of the members are destroyed + (and/or being prepared to being destroyed) is important. Change it only + when you know what you are doing. +*/ +ViewShellBase::~ViewShellBase() +{ + // Notify other LOK views that we are going away. + SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_VIEW_CURSOR_VISIBLE, "visible", "false"_ostr); + SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_TEXT_VIEW_SELECTION, "selection", ""_ostr); + SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_GRAPHIC_VIEW_SELECTION, "selection", "EMPTY"_ostr); + + sfx2::SfxNotebookBar::CloseMethod(GetFrame()->GetBindings()); + + rtl::Reference xSlideShow(SlideShow::GetSlideShow(*this)); + if (xSlideShow.is() && xSlideShow->dependsOn(this)) + SlideShow::Stop(*this); + xSlideShow.clear(); + + // Tell the controller that the ViewShellBase is not available anymore. + if (mpImpl->mpController) + mpImpl->mpController->ReleaseViewShellBase(); + + // We have to hide the main window to prevent SFX complaining after a + // reload about it being already visible. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell!=nullptr + && pShell->GetActiveWindow()!=nullptr + && pShell->GetActiveWindow()->GetParent()!=nullptr) + { + pShell->GetActiveWindow()->GetParent()->Hide(); + } + + mpImpl->mpToolBarManager->Shutdown(); + mpImpl->mpViewShellManager->Shutdown(); + + EndListening(GetViewFrame()); + EndListening(*GetDocShell()); + + SetWindow(nullptr); + + mpImpl->mpFormShellManager.reset(); +} + +void ViewShellBase::LateInit (const OUString& rsDefaultView) +{ + StartListening(GetViewFrame(), DuplicateHandling::Prevent); + StartListening(*GetDocShell(), DuplicateHandling::Prevent); + mpImpl->LateInit(); + InitializeFramework(); + + mpImpl->mpEventMultiplexer = std::make_shared(*this); + + mpImpl->mpFormShellManager = std::make_shared(*this); + + mpImpl->mpToolBarManager = ToolBarManager::Create( + *this, + mpImpl->mpEventMultiplexer, + mpImpl->mpViewShellManager); + + try + { + rtl::Reference<::sd::DrawController> xControllerManager (GetDrawController()); + Reference xConfigurationController; + if (xControllerManager) + xConfigurationController = xControllerManager->getConfigurationController(); + if (xConfigurationController.is()) + { + OUString sView (rsDefaultView); + if (sView.isEmpty()) + sView = GetInitialViewShellType(); + + FrameworkHelper::Instance(*this); + + // Create the resource ids for the center pane and view. + const Reference xCenterPaneId ( + FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL)); + const Reference xCenterViewId ( + FrameworkHelper::CreateResourceId(sView, xCenterPaneId)); + + // Request center pane and view. + xConfigurationController->requestResourceActivation(xCenterPaneId, ResourceActivationMode_ADD); + xConfigurationController->requestResourceActivation(xCenterViewId, ResourceActivationMode_REPLACE); + + // Process configuration events synchronously until the center view + // has been created. + sd::framework::ConfigurationController* pConfigurationController + = dynamic_cast(xConfigurationController.get()); + if (pConfigurationController != nullptr) + { + while ( + ! pConfigurationController->getResource(xCenterViewId).is() + && pConfigurationController->hasPendingRequests()) + { + pConfigurationController->ProcessEvent(); + } + } + } + } + catch (const RuntimeException&) + { + } + + // AutoLayouts have to be ready. + GetDocument()->StopWorkStartupDelay(); + + UpdateBorder(); + + // Remember the type of the current main view shell in the frame view. + ViewShell* pViewShell = GetMainViewShell().get(); + if (pViewShell != nullptr) + { + FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView != nullptr) + pFrameView->SetViewShellTypeOnLoad(pViewShell->GetShellType()); + } + // Show/Hide the TabBar + SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDocument()->GetDocumentType()); + bool bIsTabBarVisible = pOptions->IsTabBarVisible(); + mpImpl->SetUserWantsTabBar( bIsTabBarVisible ); +} + +std::shared_ptr const & ViewShellBase::GetViewShellManager() const +{ + return mpImpl->mpViewShellManager; +} + +std::shared_ptr ViewShellBase::GetMainViewShell() const +{ + std::shared_ptr pMainViewShell ( + framework::FrameworkHelper::Instance(*const_cast(this)) + ->GetViewShell(framework::FrameworkHelper::msCenterPaneURL)); + if (pMainViewShell == nullptr) + pMainViewShell = framework::FrameworkHelper::Instance(*const_cast(this)) + ->GetViewShell(framework::FrameworkHelper::msFullScreenPaneURL); + return pMainViewShell; +} + +ViewShellBase* ViewShellBase::GetViewShellBase (SfxViewFrame const * pViewFrame) +{ + ViewShellBase* pBase = nullptr; + + if (pViewFrame != nullptr) + { + // Get the view shell for the frame and cast it to + // sd::ViewShellBase. + SfxViewShell* pSfxViewShell = pViewFrame->GetViewShell(); + pBase = dynamic_cast< ::sd::ViewShellBase *>( pSfxViewShell ); + } + + return pBase; +} + +void ViewShellBase::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) +{ + SfxViewShell::Notify(rBC, rHint); + + const SfxHintId nHintId = rHint.GetId(); + + if (nHintId == SfxHintId::ThisIsAnSfxEventHint) + { + switch (static_cast(rHint).GetEventId()) + { + case SfxEventHintId::OpenDoc: + if( GetDocument() && GetDocument()->IsStartWithPresentation() ) + { + GetViewFrame().GetDispatcher()->Execute( + SID_PRESENTATION, SfxCallMode::ASYNCHRON ); + } + break; + + default: + break; + } + } + else + { + switch (nHintId) + { + case SfxHintId::LanguageChanged: + { + GetViewFrame().GetBindings().Invalidate(SID_LANGUAGE_STATUS); + } + break; + + default: + break; + } + } +} + +void ViewShellBase::InitializeFramework() +{ +} + +OUString ViewShellBase::GetSelectionText(bool bCompleteWords, bool /*bOnlyASample*/) +{ + std::shared_ptr const pMainShell(GetMainViewShell()); + DrawViewShell *const pDrawViewShell( + dynamic_cast(pMainShell.get())); + return pDrawViewShell + ? pDrawViewShell->GetSelectionText(bCompleteWords) + : SfxViewShell::GetSelectionText(bCompleteWords); +} + +bool ViewShellBase::HasSelection(bool bText) const +{ + std::shared_ptr const pMainShell(GetMainViewShell()); + DrawViewShell *const pDrawViewShell( + dynamic_cast(pMainShell.get())); + return pDrawViewShell + ? pDrawViewShell->HasSelection(bText) + : SfxViewShell::HasSelection(bText); +} + +void ViewShellBase::InnerResizePixel (const Point& rOrigin, const Size &rSize, bool) +{ + Size aObjSize = GetObjectShell()->GetVisArea().GetSize(); + if ( !aObjSize.IsEmpty() ) + { + SvBorder aBorder( GetBorderPixel() ); + Size aSize( rSize ); + aSize.AdjustWidth( -(aBorder.Left() + aBorder.Right()) ); + aSize.AdjustHeight( -(aBorder.Top() + aBorder.Bottom()) ); + Size aObjSizePixel = mpImpl->mpViewWindow->LogicToPixel(aObjSize, MapMode(MapUnit::Map100thMM)); + SfxViewShell::SetZoomFactor( + Fraction( aSize.Width(), std::max( aObjSizePixel.Width(), static_cast<::tools::Long>(1) ) ), + Fraction( aSize.Height(), std::max( aObjSizePixel.Height(), static_cast<::tools::Long>(1)) ) ); + } + + mpImpl->ResizePixel(rOrigin, rSize, false); +} + +void ViewShellBase::OuterResizePixel (const Point& rOrigin, const Size &rSize) +{ + mpImpl->ResizePixel (rOrigin, rSize, true); +} + +void ViewShellBase::Rearrange() +{ + // There is a bug in the communication between embedded objects and the + // framework::LayoutManager that leads to missing resize updates. The + // following workaround enforces such an update by cycling the border to + // zero and back to the current value. + if (GetWindow() != nullptr) + { + SetBorderPixel(SvBorder()); + UpdateBorder(true); + } + else + { + SAL_WARN("sd.view", "Rearrange: window missing"); + } + + GetViewFrame().Resize(true); +} + +ErrCode ViewShellBase::DoVerb(sal_Int32 nVerb) +{ + ErrCode aResult = ERRCODE_NONE; + + ::sd::ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + aResult = pShell->DoVerb(nVerb); + + return aResult; +} + +Reference ViewShellBase::GetRenderable() +{ + // Create a new DocumentRenderer on every call. It observes the life + // time of this ViewShellBase object. + return Reference(new DocumentRenderer(*this)); +} + +SfxPrinter* ViewShellBase::GetPrinter (bool bCreate) +{ + OSL_ASSERT(mpImpl != nullptr); + + return GetDocShell()->GetPrinter (bCreate); +} + +sal_uInt16 ViewShellBase::SetPrinter ( + SfxPrinter* pNewPrinter, + SfxPrinterChangeFlags nDiffFlags) +{ + OSL_ASSERT(mpImpl != nullptr); + + GetDocShell()->SetPrinter(pNewPrinter); + + if ( (nDiffFlags & SfxPrinterChangeFlags::CHG_ORIENTATION || + nDiffFlags & SfxPrinterChangeFlags::CHG_SIZE) && pNewPrinter ) + { + MapMode aMap = pNewPrinter->GetMapMode(); + aMap.SetMapUnit(MapUnit::Map100thMM); + MapMode aOldMap = pNewPrinter->GetMapMode(); + pNewPrinter->SetMapMode(aMap); + Size aNewSize = pNewPrinter->GetOutputSize(); + + std::shared_ptr pDrawViewShell ( + std::dynamic_pointer_cast(GetMainViewShell())); + if (pDrawViewShell) + { + SdPage* pPage = GetDocument()->GetSdPage( + 0, PageKind::Standard ); + pDrawViewShell->SetPageSizeAndBorder ( + pDrawViewShell->GetPageKind(), + aNewSize, + -1,-1,-1,-1, + false/*bScaleAll*/, + pNewPrinter->GetOrientation(), + pPage->GetPaperBin(), + pPage->IsBackgroundFullSize()); + } + + pNewPrinter->SetMapMode(aOldMap); + } + + return 0; +} + +void ViewShellBase::UIActivating( SfxInPlaceClient* pClient ) +{ + mpImpl->ShowViewTabBar(false); + + ViewShell* pViewShell = GetMainViewShell().get(); + if ( pViewShell ) + pViewShell->UIActivating( pClient ); + + SfxViewShell::UIActivating( pClient ); +} + +void ViewShellBase::UIDeactivated( SfxInPlaceClient* pClient ) +{ + SfxViewShell::UIDeactivated( pClient ); + + mpImpl->ShowViewTabBar(true); + + ViewShell* pViewShell = GetMainViewShell().get(); + if ( pViewShell ) + pViewShell->UIDeactivated( pClient ); +} + +SvBorder ViewShellBase::GetBorder (bool ) +{ + int nTop = 0; + if (mpImpl->mpViewTabBar.is() && mpImpl->mpViewTabBar->GetTabControl()->IsVisible()) + nTop = mpImpl->mpViewTabBar->GetHeight(); + return SvBorder(0,nTop,0,0); +} + +void ViewShellBase::Execute (SfxRequest& rRequest) +{ + sal_uInt16 nSlotId = rRequest.GetSlot(); + + switch (nSlotId) + { + case SID_SWITCH_SHELL: + { + Reference xControllerManager (GetController(), UNO_QUERY); + if (xControllerManager.is()) + { + Reference xConfigurationController ( + xControllerManager->getConfigurationController()); + if (xConfigurationController.is()) + xConfigurationController->update(); + } + } + break; + + case SID_LEFT_PANE_DRAW: + mpImpl->SetPaneVisibility( + rRequest, + framework::FrameworkHelper::msLeftDrawPaneURL, + framework::FrameworkHelper::msSlideSorterURL); + break; + + case SID_LEFT_PANE_IMPRESS: + mpImpl->SetPaneVisibility( + rRequest, + framework::FrameworkHelper::msLeftImpressPaneURL, + framework::FrameworkHelper::msSlideSorterURL); + break; + + case SID_TOGGLE_TABBAR_VISIBILITY: + { + SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDocument()->GetDocumentType()); + bool bIsTabBarVisible = pOptions->IsTabBarVisible(); + pOptions->SetTabBarVisible( !bIsTabBarVisible ); + mpImpl->SetUserWantsTabBar( !bIsTabBarVisible ); + rRequest.Done(); + } + break; + + // draw + case SID_DRAWINGMODE: + // impress normal + case SID_NORMAL_MULTI_PANE_GUI: + case SID_NOTES_MODE: + case SID_OUTLINE_MODE: + case SID_SLIDE_SORTER_MULTI_PANE_GUI: + case SID_SLIDE_SORTER_MODE: + // impress master + case SID_SLIDE_MASTER_MODE: + case SID_NOTES_MASTER_MODE: + case SID_HANDOUT_MASTER_MODE: + framework::FrameworkHelper::Instance(*this)->HandleModeChangeSlot(nSlotId, rRequest); + break; + + case SID_WIN_FULLSCREEN: + // The full screen mode is not supported. Ignore the request. + break; + + case SID_RESTORE_EDITING_VIEW: + mpImpl->ProcessRestoreEditingViewSlot(); + break; + + default: + // Ignore any other slot. + rRequest.Ignore (); + break; + } +} + +void ViewShellBase::GetState (SfxItemSet& rSet) +{ + mpImpl->GetSlotState(rSet); + + FuBullet::GetSlotState( rSet, nullptr, &GetViewFrame() ); +} + +void ViewShellBase::WriteUserDataSequence ( + css::uno::Sequence< css::beans::PropertyValue >& rSequence) +{ + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + pShell->WriteUserDataSequence (rSequence); +} + +void ViewShellBase::ReadUserDataSequence ( + const css::uno::Sequence< css::beans::PropertyValue >& rSequence) +{ + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell == nullptr) + return; + + pShell->ReadUserDataSequence (rSequence); + + // For certain shell types ReadUserDataSequence may have changed the + // type to another one. Make sure that the center pane shows the + // right view shell. + switch (pShell->GetShellType()) + { + case ViewShell::ST_IMPRESS: + case ViewShell::ST_NOTES: + case ViewShell::ST_HANDOUT: + { + OUString sViewURL; + switch (dynamic_cast(*pShell).GetPageKind()) + { + default: + case PageKind::Standard: + sViewURL = framework::FrameworkHelper::msImpressViewURL; + break; + case PageKind::Notes: + sViewURL = framework::FrameworkHelper::msNotesViewURL; + break; + case PageKind::Handout: + sViewURL = framework::FrameworkHelper::msHandoutViewURL; + break; + } + if (!sViewURL.isEmpty()) + framework::FrameworkHelper::Instance(*this)->RequestView( + sViewURL, + framework::FrameworkHelper::msCenterPaneURL); + } + break; + + default: + break; + } +} + +void ViewShellBase::Activate (bool bIsMDIActivate) +{ + SfxViewShell::Activate(bIsMDIActivate); + + Reference xControllerManager (GetController(), UNO_QUERY); + if (xControllerManager.is()) + { + Reference xConfigurationController ( + xControllerManager->getConfigurationController()); + if (xConfigurationController.is()) + xConfigurationController->update(); + } + GetToolBarManager()->RequestUpdate(); +} + +void ViewShellBase::SetZoomFactor ( + const Fraction &rZoomX, + const Fraction &rZoomY) +{ + SfxViewShell::SetZoomFactor (rZoomX, rZoomY); + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + pShell->SetZoomFactor (rZoomX, rZoomY); +} + +bool ViewShellBase::PrepareClose (bool bUI) +{ + bool bResult = SfxViewShell::PrepareClose (bUI); + + if (bResult) + { + mpImpl->mbIsClosing = true; + + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + bResult = pShell->PrepareClose (bUI); + } + + return bResult; +} + +void ViewShellBase::WriteUserData (OUString& rString, bool bBrowse) +{ + SfxViewShell::WriteUserData (rString, bBrowse); + + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + pShell->WriteUserData(); +} + +void ViewShellBase::ReadUserData (const OUString& rString, bool bBrowse) +{ + SfxViewShell::ReadUserData (rString, bBrowse); + + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + pShell->ReadUserData(); +} + +SdrView* ViewShellBase::GetDrawView() const +{ + // Forward call to main sub shell. + ViewShell* pShell = GetMainViewShell().get(); + if (pShell != nullptr) + return pShell->GetDrawView (); + else + return SfxViewShell::GetDrawView(); +} + +void ViewShellBase::SetBusyState (bool bBusy) +{ + if (GetDocShell() != nullptr) + GetDocShell()->SetWaitCursor (bBusy); +} + +void ViewShellBase::UpdateBorder ( bool bForce /* = false */ ) +{ + // The following calls to SetBorderPixel() and InvalidateBorder() are + // made only for the main view shell. This not only avoids unnecessary + // calls for the views in side panes but prevents calling an already + // dying SfxViewShell base class. + // We have to check the existence of the window, too. + // The SfxViewFrame accesses the window without checking it. + ViewShell* pMainViewShell = GetMainViewShell().get(); + if (pMainViewShell == nullptr || GetWindow()==nullptr) + return; + + SvBorder aCurrentBorder (GetBorderPixel()); + bool bOuterResize ( ! GetDocShell()->IsInPlaceActive()); + SvBorder aBorder (GetBorder(bOuterResize)); + aBorder += pMainViewShell->GetBorder(); + + if (bForce || (aBorder != aCurrentBorder)) + { + SetBorderPixel (aBorder); + InvalidateBorder(); + } +} + +void ViewShellBase::ShowUIControls (bool bVisible) +{ + mpImpl->ShowViewTabBar(bVisible); + + ViewShell* pMainViewShell = GetMainViewShell().get(); + if (pMainViewShell != nullptr) + pMainViewShell->ShowUIControls (bVisible); + + UpdateBorder(); + if (bVisible) + Rearrange(); +} + +OUString ViewShellBase::GetInitialViewShellType() const +{ + OUString sRequestedView (FrameworkHelper::msImpressViewURL); + + do + { + Reference xViewDataSupplier ( + GetDocShell()->GetModel(), UNO_QUERY); + if ( ! xViewDataSupplier.is()) + break; + + Reference xViewData (xViewDataSupplier->getViewData()); + if ( ! xViewData.is()) + break; + if (xViewData->getCount() == 0) + break; + + css::uno::Any aAny = xViewData->getByIndex(0); + Sequence aProperties; + if ( ! (aAny >>= aProperties)) + break; + + // Search the properties for the one that tells us what page kind to + // use. + auto pProperty = std::find_if(std::cbegin(aProperties), std::cend(aProperties), + [](const beans::PropertyValue& rProperty) { return rProperty.Name == sUNO_View_PageKind; }); + if (pProperty != std::cend(aProperties)) + { + sal_Int16 nPageKind = 0; + pProperty->Value >>= nPageKind; + switch (static_cast(nPageKind)) + { + case PageKind::Standard: + sRequestedView = FrameworkHelper::msImpressViewURL; + break; + + case PageKind::Handout: + sRequestedView = FrameworkHelper::msHandoutViewURL; + break; + + case PageKind::Notes: + sRequestedView = FrameworkHelper::msNotesViewURL; + break; + + default: + // The page kind is invalid. This is probably an + // error by the caller. We use the standard type to + // keep things going. + SAL_WARN( "sd.view", "ViewShellBase::GetInitialViewShellType: invalid page kind"); + sRequestedView = FrameworkHelper::msImpressViewURL; + break; + } + } + } + while (false); + + return sRequestedView; +} + +std::shared_ptr const & ViewShellBase::GetEventMultiplexer() const +{ + OSL_ASSERT(mpImpl != nullptr); + OSL_ASSERT(mpImpl->mpEventMultiplexer != nullptr); + + return mpImpl->mpEventMultiplexer; +} + +const ::tools::Rectangle& ViewShellBase::getClientRectangle() const +{ + return mpImpl->maClientArea; +} + +std::shared_ptr const & ViewShellBase::GetToolBarManager() const +{ + OSL_ASSERT(mpImpl != nullptr); + OSL_ASSERT(mpImpl->mpToolBarManager != nullptr); + + return mpImpl->mpToolBarManager; +} + +std::shared_ptr const & ViewShellBase::GetFormShellManager() const +{ + OSL_ASSERT(mpImpl != nullptr); + OSL_ASSERT(mpImpl->mpFormShellManager != nullptr); + + return mpImpl->mpFormShellManager; +} + +DrawController* ViewShellBase::GetDrawController() const +{ + OSL_ASSERT(mpImpl != nullptr); + + return mpImpl->mpController.get(); +} + +void ViewShellBase::SetViewTabBar (const ::rtl::Reference& rViewTabBar) +{ + OSL_ASSERT(mpImpl != nullptr); + + mpImpl->mpViewTabBar = rViewTabBar; +} + +vcl::Window* ViewShellBase::GetViewWindow() +{ + OSL_ASSERT(mpImpl != nullptr); + + return mpImpl->mpViewWindow.get(); +} + +OUString ViewShellBase::RetrieveLabelFromCommand( const OUString& aCmdURL ) const +{ + OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(GetMainViewShell()->GetViewFrame()->GetFrame().GetFrameInterface())); + auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(aCmdURL, aModuleName); + return vcl::CommandInfoProvider::GetLabelForCommand(aProperties); +} + +int ViewShellBase::getPart() const +{ + ViewShell* pViewShell = framework::FrameworkHelper::Instance(*const_cast(this))->GetViewShell(FrameworkHelper::msCenterPaneURL).get(); + + if (DrawViewShell* pDrawViewShell = dynamic_cast(pViewShell)) + { + return pDrawViewShell->GetCurPagePos(); + } + + return 0; +} + +int ViewShellBase::getEditMode() const +{ + ViewShell* pViewShell = framework::FrameworkHelper::Instance(*const_cast(this))->GetViewShell(FrameworkHelper::msCenterPaneURL).get(); + + if (DrawViewShell* pDrawViewShell = dynamic_cast(pViewShell)) + { + switch ( pDrawViewShell->GetEditMode() ) + { + case EditMode::Page: + return 0; + case EditMode::MasterPage: + return 1; + } + } + + return 0; +} + +void ViewShellBase::setEditMode(int nMode) +{ + ViewShell* pViewShell = framework::FrameworkHelper::Instance(*this)->GetViewShell(FrameworkHelper::msCenterPaneURL).get(); + + if (DrawViewShell* pDrawViewShell = dynamic_cast(pViewShell)) + { + switch ( nMode ) + { + case 0: + pDrawViewShell->ChangeEditMode(EditMode::Page, false); + break; + case 1: + pDrawViewShell->ChangeEditMode(EditMode::MasterPage, false); + break; + } + } +} + +void ViewShellBase::NotifyCursor(SfxViewShell* pOtherShell) const +{ + ViewShell* pThisShell = framework::FrameworkHelper::Instance(*const_cast(this))->GetViewShell(FrameworkHelper::msCenterPaneURL).get(); + + DrawViewShell* pDrawViewShell = dynamic_cast(pThisShell); + if (!pDrawViewShell) + return; + + if (this == pOtherShell) + return; + + DrawView* pDrawView = pDrawViewShell->GetDrawView(); + if (!pDrawView) + return; + + if (pDrawView->GetTextEditObject()) + { + // Blinking cursor. + EditView& rEditView = pDrawView->GetTextEditOutlinerView()->GetEditView(); + rEditView.RegisterOtherShell(pOtherShell); + rEditView.ShowCursor(); + rEditView.RegisterOtherShell(nullptr); + // Text selection, if any. + rEditView.DrawSelectionXOR(pOtherShell); + + // Shape text lock. + if (OutlinerView* pOutlinerView = pDrawView->GetTextEditOutlinerView()) + { + ::tools::Rectangle aRectangle = pOutlinerView->GetOutputArea(); + vcl::Window* pWin = pThisShell->GetActiveWindow(); + if (pWin && pWin->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + aRectangle = o3tl::toTwips(aRectangle, o3tl::Length::mm100); + OString sRectangle = aRectangle.toString(); + SfxLokHelper::notifyOtherView(&pDrawViewShell->GetViewShellBase(), pOtherShell, LOK_CALLBACK_VIEW_LOCK, "rectangle", sRectangle); + } + } + else + { + // Graphic selection. + pDrawView->AdjustMarkHdl(pOtherShell); + } +} + +::Color ViewShellBase::GetColorConfigColor(svtools::ColorConfigEntry nColorType) const +{ + if (DrawViewShell* pCurrentDrawShell = dynamic_cast(GetMainViewShell().get())) + { + const SdViewOptions& rViewOptions = pCurrentDrawShell->GetViewOptions(); + switch (nColorType) + { + case svtools::ColorConfigEntry::DOCCOLOR: + { + return rViewOptions.mnDocBackgroundColor; + } + // Should never be called for an unimplemented color type + default: + { + O3TL_UNREACHABLE; + } + } + } + else + { + SAL_WARN("sd", "dynamic_cast to DrawViewShell failed"); + } + + return {}; +} + +//===== ViewShellBase::Implementation ========================================= + +ViewShellBase::Implementation::Implementation (ViewShellBase& rBase) + : mbIsClosing(false), + mrBase(rBase), + mbUserWantsTabBar(false), + mbTabBarShouldBeVisible(true), + mpPageCacheManager(slidesorter::cache::PageCacheManager::Instance()) +{ +} + +ViewShellBase::Implementation::~Implementation() +{ + mpController = nullptr; + mpViewTabBar = nullptr; + mpViewWindow.disposeAndClear(); + mpToolBarManager.reset(); +} + +void ViewShellBase::Implementation::LateInit() +{ + mpController = new DrawController(mrBase); +} + +void ViewShellBase::Implementation::ProcessRestoreEditingViewSlot() +{ + ViewShell* pViewShell = mrBase.GetMainViewShell().get(); + if (pViewShell == nullptr) + return; + + FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView == nullptr) + return; + + // Set view shell, edit mode, and page kind. + // pFrameView->SetViewShEditMode( + // pFrameView->GetViewShEditModeOnLoad(), + // pFrameView->GetPageKindOnLoad()); + pFrameView->SetViewShEditMode( + pFrameView->GetViewShEditModeOnLoad() ); + pFrameView->SetPageKind( + pFrameView->GetPageKindOnLoad()); + std::shared_ptr pHelper (FrameworkHelper::Instance(mrBase)); + pHelper->RequestView( + FrameworkHelper::GetViewURL(pFrameView->GetViewShellTypeOnLoad()), + FrameworkHelper::msCenterPaneURL); + pHelper->RunOnConfigurationEvent("ConfigurationUpdateEnd", CurrentPageSetter(mrBase)); +} + +void ViewShellBase::Implementation::SetUserWantsTabBar(bool inValue) +{ + mbUserWantsTabBar = inValue; + // Call ShowViewTabBar to refresh the TabBar visibility + ShowViewTabBar(mbTabBarShouldBeVisible); +} + +void ViewShellBase::Implementation::ShowViewTabBar (bool bShow) +{ + mbTabBarShouldBeVisible = bShow; + bShow = bShow && mbUserWantsTabBar; + + if (mpViewTabBar.is() + && mpViewTabBar->GetTabControl()->IsVisible() != bShow) + { + mpViewTabBar->GetTabControl()->Show(bShow); + mrBase.Rearrange(); + } +} + +void ViewShellBase::Implementation::ResizePixel ( + const Point& rOrigin, + const Size &rSize, + bool bOuterResize) +{ + if (mbIsClosing) + return; + + // Forward the call to both the base class and the main stacked sub + // shell only when main sub shell exists. + ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); + + // Set the ViewTabBar temporarily to full size so that, when asked + // later, it can return its true height. + mrBase.SetWindow (mpViewWindow.get()); + if (mpViewTabBar.is() && mpViewTabBar->GetTabControl()->IsVisible()) + mpViewTabBar->GetTabControl()->SetPosSizePixel (rOrigin, rSize); + + // Calculate and set the border before the controls are placed. + SvBorder aBorder; + if (pMainViewShell != nullptr) + aBorder = pMainViewShell->GetBorder(); + aBorder += mrBase.GetBorder(bOuterResize); + if (mrBase.GetBorderPixel() != aBorder) + mrBase.SetBorderPixel(aBorder); + + // Place the ViewTabBar at the top. It is part of the border. + SvBorder aBaseBorder; + if (mpViewTabBar.is() && mpViewTabBar->GetTabControl()->IsVisible()) + { + aBaseBorder.Top() = mpViewTabBar->GetHeight(); + mpViewTabBar->GetTabControl()->SetPosSizePixel( + rOrigin, Size(rSize.Width(),aBaseBorder.Top())); + } + + // The view window gets the remaining space. + Point aViewWindowPosition ( + rOrigin.X()+aBaseBorder.Left(), + rOrigin.Y()+aBaseBorder.Top()); + + Size aViewWindowSize ( + rSize.Width() - aBaseBorder.Left() - aBaseBorder.Right(), + rSize.Height() - aBaseBorder.Top() - aBaseBorder.Bottom()); + mpViewWindow->SetPosSizePixel(aViewWindowPosition, aViewWindowSize); + + maClientArea = ::tools::Rectangle(Point(0,0), aViewWindowSize); +} + +void ViewShellBase::Implementation::SetPaneVisibility ( + const SfxRequest& rRequest, + const OUString& rsPaneURL, + const OUString& rsViewURL) +{ + try + { + Reference xControllerManager (mrBase.GetController(), UNO_QUERY_THROW); + + const Reference< XComponentContext > xContext( + ::comphelper::getProcessComponentContext() ); + Reference xPaneId (ResourceId::create( + xContext, rsPaneURL)); + Reference xViewId (ResourceId::createWithAnchorURL( + xContext, rsViewURL, rsPaneURL)); + + // Determine the new visibility state. + const SfxItemSet* pArguments = rRequest.GetArgs(); + bool bShowChildWindow; + sal_uInt16 nSlotId = rRequest.GetSlot(); + if (pArguments != nullptr) + bShowChildWindow = static_cast( + pArguments->Get(nSlotId)).GetValue(); + else + { + Reference xConfigurationController ( + xControllerManager->getConfigurationController()); + if ( ! xConfigurationController.is()) + throw RuntimeException(); + Reference xConfiguration ( + xConfigurationController->getRequestedConfiguration()); + if ( ! xConfiguration.is()) + throw RuntimeException(); + + bShowChildWindow = ! xConfiguration->hasResource(xPaneId); + } + + // Set the desired visibility state at the current configuration + // and update it accordingly. + Reference xConfigurationController ( + xControllerManager->getConfigurationController()); + if ( ! xConfigurationController.is()) + throw RuntimeException(); + if (bShowChildWindow) + { + xConfigurationController->requestResourceActivation( + xPaneId, + ResourceActivationMode_ADD); + xConfigurationController->requestResourceActivation( + xViewId, + ResourceActivationMode_REPLACE); + } + else + xConfigurationController->requestResourceDeactivation( + xPaneId); + } + catch (const Exception&) + { + DBG_UNHANDLED_EXCEPTION("sd.view"); + } +} + +void ViewShellBase::Implementation::GetSlotState (SfxItemSet& rSet) +{ + try + { + // Get some frequently used values. + Reference xControllerManager (mrBase.GetController(), UNO_QUERY_THROW); + Reference xConfigurationController ( + xControllerManager->getConfigurationController()); + if ( ! xConfigurationController.is()) + throw RuntimeException(); + Reference xConfiguration ( + xConfigurationController->getRequestedConfiguration()); + if ( ! xConfiguration.is()) + throw RuntimeException(); + + const Reference< XComponentContext > xContext( + ::comphelper::getProcessComponentContext() ); + SfxWhichIter aSetIterator (rSet); + sal_uInt16 nItemId (aSetIterator.FirstWhich()); + + while (nItemId > 0) + { + bool bState (false); + Reference xResourceId; + try + { + // Check if the right view is active + switch (nItemId) + { + case SID_LEFT_PANE_IMPRESS: + xResourceId = ResourceId::create( + xContext, FrameworkHelper::msLeftImpressPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_LEFT_PANE_DRAW: + xResourceId = ResourceId::create( + xContext, FrameworkHelper::msLeftDrawPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_DRAWINGMODE: + case SID_NORMAL_MULTI_PANE_GUI: + case SID_SLIDE_MASTER_MODE: + xResourceId = ResourceId::createWithAnchorURL( + xContext, FrameworkHelper::msImpressViewURL, + FrameworkHelper::msCenterPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_SLIDE_SORTER_MULTI_PANE_GUI: + case SID_SLIDE_SORTER_MODE: + xResourceId = ResourceId::createWithAnchorURL( + xContext, + FrameworkHelper::msSlideSorterURL, + FrameworkHelper::msCenterPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_OUTLINE_MODE: + xResourceId = ResourceId::createWithAnchorURL( + xContext, + FrameworkHelper::msOutlineViewURL, + FrameworkHelper::msCenterPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_HANDOUT_MASTER_MODE: + xResourceId = ResourceId::createWithAnchorURL( + xContext, FrameworkHelper::msHandoutViewURL, + FrameworkHelper::msCenterPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_NOTES_MODE: + case SID_NOTES_MASTER_MODE: + xResourceId = ResourceId::createWithAnchorURL( + xContext, FrameworkHelper::msNotesViewURL, + FrameworkHelper::msCenterPaneURL); + bState = xConfiguration->hasResource(xResourceId); + break; + + case SID_TOGGLE_TABBAR_VISIBILITY: + bState = GetUserWantsTabBar(); + break; + + default: + // Ignore all other items. They are not meant to be + // handled by us. + break; + } + } + catch (const DeploymentException&) + { + } + + // Check if edit mode fits too + if (bState) + { + ViewShell* const pCenterViewShell = FrameworkHelper::Instance(mrBase)->GetViewShell( + FrameworkHelper::msCenterPaneURL).get(); + DrawViewShell* const pShell = dynamic_cast(pCenterViewShell); + if (pShell) + { + switch (nItemId) + { + case SID_DRAWINGMODE: + case SID_NORMAL_MULTI_PANE_GUI: + case SID_NOTES_MODE: + bState = pShell->GetEditMode() == EditMode::Page; + break; + case SID_SLIDE_MASTER_MODE: + case SID_NOTES_MASTER_MODE: + bState = pShell->GetEditMode() == EditMode::MasterPage; + break; + } + } + } + + // And finally set the state. + rSet.Put(SfxBoolItem(nItemId, bState)); + + nItemId = aSetIterator.NextWhich(); + } + } + catch (const RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd.view"); + } + +} + +} // end of namespace sd + +//===== CurrentPageSetter =========================================== + +namespace { + +CurrentPageSetter::CurrentPageSetter (ViewShellBase& rBase) + : mrBase(rBase) +{ +} + +void CurrentPageSetter::operator() (bool) +{ + FrameView* pFrameView = nullptr; + + if (mrBase.GetMainViewShell() != nullptr) + { + pFrameView = mrBase.GetMainViewShell()->GetFrameView(); + } + + if (pFrameView==nullptr) + return; + + try + { + // Get the current page either from the DrawPagesSupplier or the + // MasterPagesSupplier. + Any aPage; + if (pFrameView->GetViewShEditModeOnLoad() == EditMode::Page) + { + Reference xPagesSupplier ( + mrBase.GetController()->getModel(), UNO_QUERY_THROW); + Reference xPages ( + xPagesSupplier->getDrawPages(), UNO_QUERY_THROW); + aPage = xPages->getByIndex(pFrameView->GetSelectedPageOnLoad()); + } + else + { + Reference xPagesSupplier ( + mrBase.GetController()->getModel(), UNO_QUERY_THROW); + Reference xPages ( + xPagesSupplier->getMasterPages(), UNO_QUERY_THROW); + aPage = xPages->getByIndex(pFrameView->GetSelectedPageOnLoad()); + } + // Switch to the page last edited by setting the CurrentPage + // property. + Reference xSet (mrBase.GetController(), UNO_QUERY_THROW); + xSet->setPropertyValue ("CurrentPage", aPage); + } + catch (const RuntimeException&) + { + // We have not been able to set the current page at the main view. + // This is sad but still leaves us in a valid state. Therefore, + // this exception is silently ignored. + } + catch (const beans::UnknownPropertyException&) + { + SAL_WARN("sd.view", "CurrentPage property unknown"); + } +} + +} // end of anonymous namespace + +//===== FocusForwardingWindow ================================================= + +namespace sd { +namespace { + +FocusForwardingWindow::FocusForwardingWindow ( + vcl::Window& rParentWindow, + ViewShellBase& rBase) + : vcl::Window(&rParentWindow, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)), + mrBase(rBase) +{ + SAL_INFO("sd.view", "created FocusForwardingWindow at " << this); +} + +FocusForwardingWindow::~FocusForwardingWindow() +{ + disposeOnce(); +} + +void FocusForwardingWindow::dispose() +{ + SAL_INFO("sd.view", "destroyed FocusForwardingWindow at " << this); + vcl::Window::dispose(); +} + +void FocusForwardingWindow::KeyInput (const KeyEvent& rKEvt) +{ + std::shared_ptr pViewShell = mrBase.GetMainViewShell(); + if (pViewShell != nullptr) + { + vcl::Window* pWindow = pViewShell->GetActiveWindow(); + if (pWindow != nullptr) + { + // Forward the focus so that the window is called directly the + // next time. + pWindow->GrabFocus(); + // Forward the key press as well. + pWindow->KeyInput(rKEvt); + } + } +} + +void FocusForwardingWindow::Command (const CommandEvent& rEvent) +{ + std::shared_ptr pViewShell = mrBase.GetMainViewShell(); + if (pViewShell != nullptr) + { + vcl::Window* pWindow = pViewShell->GetActiveWindow(); + if (pWindow != nullptr) + { + pWindow->Command(rEvent); + } + } +} + +} // end of anonymous namespace + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ViewShellHint.cxx b/sd/source/ui/view/ViewShellHint.cxx new file mode 100644 index 0000000000..b86cbaa325 --- /dev/null +++ b/sd/source/ui/view/ViewShellHint.cxx @@ -0,0 +1,31 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +namespace sd +{ +ViewShellHint::ViewShellHint(HintId eHintId) + : meHintId(eHintId) +{ +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ViewShellImplementation.cxx b/sd/source/ui/view/ViewShellImplementation.cxx new file mode 100644 index 0000000000..c76de5a513 --- /dev/null +++ b/sd/source/ui/view/ViewShellImplementation.cxx @@ -0,0 +1,380 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +namespace sd { + +ViewShell::Implementation::Implementation (ViewShell& rViewShell) + : mbIsMainViewShell(false), + mbIsInitialized(false), + mbArrangeActive(false), + mrViewShell(rViewShell) +{ +} + +ViewShell::Implementation::~Implementation() COVERITY_NOEXCEPT_FALSE +{ + if ( ! mpUpdateLockForMouse.expired()) + { + std::shared_ptr pLock(mpUpdateLockForMouse); + if (pLock != nullptr) + { + // Force the ToolBarManagerLock to be released even when the + // IsUICaptured() returns . + pLock->Release(true); + } + } +} + +void ViewShell::Implementation::ProcessModifyPageSlot ( + SfxRequest& rRequest, + SdPage* pCurrentPage, + PageKind ePageKind) +{ + SdDrawDocument* pDocument = mrViewShell.GetDoc(); + SdrLayerAdmin& rLayerAdmin = pDocument->GetLayerAdmin(); + SdrLayerIDSet aVisibleLayers; + bool bHandoutMode = false; + SdPage* pHandoutMPage = nullptr; + OUString aNewName; + + AutoLayout aNewAutoLayout; + + bool bBVisible; + bool bBObjsVisible; + const SfxItemSet* pArgs = rRequest.GetArgs(); + + if (pCurrentPage != nullptr && pCurrentPage->TRG_HasMasterPage()) + aVisibleLayers = pCurrentPage->TRG_GetMasterPageVisibleLayers(); + else + aVisibleLayers.SetAll(); + + do + { + if (pCurrentPage == nullptr) + break; + + if (!pArgs || pArgs->Count() == 1 || pArgs->Count() == 2 ) + { + // First make sure that the sidebar is visible + mrViewShell.GetDrawView()->SdrEndTextEdit(); + mrViewShell.GetDrawView()->UnmarkAll(); + mrViewShell.GetViewFrame()->ShowChildWindow(SID_SIDEBAR); + sfx2::sidebar::Sidebar::TogglePanel( + u"SdLayoutsPanel", + mrViewShell.GetViewFrame()->GetFrame().GetFrameInterface()); + break; + } + else if (pArgs->Count() == 4) + { + const SfxStringItem* pNewName = rRequest.GetArg(ID_VAL_PAGENAME); + const SfxUInt32Item* pNewAutoLayout = rRequest.GetArg(ID_VAL_WHATLAYOUT); + const SfxBoolItem* pBVisible = rRequest.GetArg(ID_VAL_ISPAGEBACK); + const SfxBoolItem* pBObjsVisible = rRequest.GetArg(ID_VAL_ISPAGEOBJ); + assert(pNewName && pNewAutoLayout && pBVisible && pBObjsVisible && "must be present"); + AutoLayout aLayout (static_cast(pNewAutoLayout->GetValue ())); + if (aLayout >= AUTOLAYOUT_START + && aLayout < AUTOLAYOUT_END) + { + aNewName = pNewName->GetValue (); + aNewAutoLayout = static_cast(pNewAutoLayout->GetValue ()); + bBVisible = pBVisible->GetValue (); + bBObjsVisible = pBObjsVisible->GetValue (); + } + else + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + rRequest.Ignore (); + break; + } + if (ePageKind == PageKind::Handout) + { + bHandoutMode = true; + pHandoutMPage = pDocument->GetMasterSdPage(0, PageKind::Handout); + } + } + else + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + rRequest.Ignore (); + break; + } + + SdPage* pUndoPage = + bHandoutMode ? pHandoutMPage : pCurrentPage; + + SfxUndoManager* pUndoManager = mrViewShell.GetDocSh()->GetUndoManager(); + DBG_ASSERT(pUndoManager, "No UNDO MANAGER ?!?"); + + if( pUndoManager ) + { + OUString aComment( SdResId(STR_UNDO_MODIFY_PAGE) ); + pUndoManager->EnterListAction(aComment, aComment, 0, mrViewShell.GetViewShellBase().GetViewShellId()); + pUndoManager->AddUndoAction( + std::make_unique( + pDocument, pUndoPage, aNewName, aNewAutoLayout, bBVisible, bBObjsVisible)); + + // Clear the selection because the selected object may be removed as + // a result of the assignment of the layout. + mrViewShell.GetDrawView()->UnmarkAll(); + + if (!bHandoutMode) + { + if (pCurrentPage->GetName() != aNewName) + { + pCurrentPage->SetName(aNewName); + + if (ePageKind == PageKind::Standard) + { + sal_uInt16 nPage = (pCurrentPage->GetPageNum()-1) / 2; + SdPage* pNotesPage = pDocument->GetSdPage(nPage, PageKind::Notes); + if (pNotesPage != nullptr) + pNotesPage->SetName(aNewName); + } + } + + pCurrentPage->SetAutoLayout(aNewAutoLayout, true); + + SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + aVisibleLayers.Set(aBckgrnd, bBVisible); + aVisibleLayers.Set(aBckgrndObj, bBObjsVisible); + pCurrentPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + else + { + pHandoutMPage->SetAutoLayout(aNewAutoLayout, true); + } + + mrViewShell.GetViewFrame()->GetDispatcher()->Execute(SID_SWITCHPAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + + bool bSetModified = true; + + if (pArgs->Count() == 1) + { + bSetModified = static_cast(pArgs->Get(SID_MODIFYPAGE)).GetValue(); + } + + pUndoManager->AddUndoAction( std::make_unique( *pUndoPage ) ); + pUndoManager->LeaveListAction(); + + pDocument->SetChanged(bSetModified); + } + } + while (false); + + mrViewShell.Cancel(); + rRequest.Done (); +} + +void ViewShell::Implementation::AssignLayout ( SfxRequest const & rRequest, PageKind ePageKind ) +{ + const SfxUInt32Item* pWhatPage = rRequest.GetArg(ID_VAL_WHATPAGE); + const SfxUInt32Item* pWhatLayout = rRequest.GetArg(ID_VAL_WHATLAYOUT); + + SdDrawDocument* pDocument = mrViewShell.GetDoc(); + if( !pDocument ) + return; + + SdPage* pPage = nullptr; + if( pWhatPage ) + { + pPage = pDocument->GetSdPage(static_cast(pWhatPage->GetValue()), ePageKind); + } + + if( pPage == nullptr ) + pPage = mrViewShell.getCurrentPage(); + + if( !pPage ) + return; + + AutoLayout eLayout = pPage->GetAutoLayout(); + + if( pWhatLayout ) + eLayout = static_cast< AutoLayout >( pWhatLayout->GetValue() ); + + // Transform the given request into the four argument form that is + // understood by ProcessModifyPageSlot(). + SdrLayerAdmin& rLayerAdmin (mrViewShell.GetViewShellBase().GetDocument()->GetLayerAdmin()); + SdrLayerID aBackground (rLayerAdmin.GetLayerID(sUNO_LayerName_background)); + SdrLayerID aBackgroundObject (rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects)); + + SdrLayerIDSet aVisibleLayers; + + if( pPage->GetPageKind() == PageKind::Handout ) + aVisibleLayers.SetAll(); + else + aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + + SfxRequest aRequest(mrViewShell.GetViewShellBase().GetViewFrame(), SID_MODIFYPAGE); + aRequest.AppendItem(SfxStringItem (ID_VAL_PAGENAME, pPage->GetName())); + aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, eLayout)); + aRequest.AppendItem(SfxBoolItem(ID_VAL_ISPAGEBACK, aVisibleLayers.IsSet(aBackground))); + aRequest.AppendItem(SfxBoolItem(ID_VAL_ISPAGEOBJ, aVisibleLayers.IsSet(aBackgroundObject))); + + // Forward the call with the new arguments. + ProcessModifyPageSlot( aRequest, pPage, pPage->GetPageKind()); +} + +SfxInterfaceId ViewShell::Implementation::GetViewId() const +{ + switch (mrViewShell.GetShellType()) + { + case ViewShell::ST_IMPRESS: + case ViewShell::ST_NOTES: + case ViewShell::ST_HANDOUT: + return IMPRESS_FACTORY_ID; + + case ViewShell::ST_DRAW: + return DRAW_FACTORY_ID; + + case ViewShell::ST_OUTLINE: + return OUTLINE_FACTORY_ID; + + case ViewShell::ST_SLIDE_SORTER: + return SLIDE_SORTER_FACTORY_ID; + + case ViewShell::ST_PRESENTATION: + return PRESENTATION_FACTORY_ID; + + // Since we have to return a view id for every possible shell type + // and there is not (yet) a proper ViewShellBase sub class for the + // remaining types we chose the Impress factory as a fall back. + case ViewShell::ST_SIDEBAR: + case ViewShell::ST_NONE: + default: + return IMPRESS_FACTORY_ID; + } +} + +SvxIMapDlg* ViewShell::Implementation::GetImageMapDialog() +{ + SfxViewFrame* pViewFrm = SfxViewFrame::Current(); + if (!pViewFrm) + return nullptr; + + SfxChildWindow* pChildWindow = pViewFrm->GetChildWindow( + SvxIMapDlgChildWindow::GetChildWindowId()); + if (pChildWindow == nullptr) + return nullptr; + + return dynamic_cast(pChildWindow->GetController().get()); +} + +//===== ToolBarManagerLock ==================================================== + +class ViewShell::Implementation::ToolBarManagerLock::Deleter { public: + void operator() (ToolBarManagerLock* pObject) { delete pObject; } +}; + +std::shared_ptr + ViewShell::Implementation::ToolBarManagerLock::Create ( + const std::shared_ptr& rpManager) +{ + std::shared_ptr pLock ( + new ViewShell::Implementation::ToolBarManagerLock(rpManager), + ViewShell::Implementation::ToolBarManagerLock::Deleter()); + pLock->mpSelf = pLock; + return pLock; +} + +ViewShell::Implementation::ToolBarManagerLock::ToolBarManagerLock ( + const std::shared_ptr& rpManager) + : mpLock(new ToolBarManager::UpdateLock(rpManager)), + maTimer("sd ToolBarManagerLock maTimer") +{ + // Start a timer that will unlock the ToolBarManager update lock when + // that is not done explicitly by calling Release(). + maTimer.SetInvokeHandler(LINK(this,ToolBarManagerLock,TimeoutCallback)); + maTimer.SetTimeout(100); + maTimer.Start(); +} + +IMPL_LINK_NOARG(ViewShell::Implementation::ToolBarManagerLock, TimeoutCallback, Timer *, void) +{ + // If possible then release the lock now. Otherwise start the timer + // and try again later. + if (Application::IsUICaptured()) + { + maTimer.Start(); + } + else + { + mpSelf.reset(); + } +} + +void ViewShell::Implementation::ToolBarManagerLock::Release (bool bForce) +{ + // If possible then release the lock now. Otherwise try again when the + // timer expires. + if (bForce || ! Application::IsUICaptured()) + { + mpSelf.reset(); + } +} + +ViewShell::Implementation::ToolBarManagerLock::~ToolBarManagerLock() +{ + mpLock.reset(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ViewShellManager.cxx b/sd/source/ui/view/ViewShellManager.cxx new file mode 100644 index 0000000000..db2ee5f8f1 --- /dev/null +++ b/sd/source/ui/view/ViewShellManager.cxx @@ -0,0 +1,1168 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace sd { + +namespace { + +/** The ShellDescriptor class is used to shells together with their ids and + the factory that was used to create the shell. + + The shell pointer may be NULL. In that case the shell is created on + demand by a factory. + + The factory pointer may be NULL. In that case the shell pointer is + given to the ViewShellManager. + + Shell pointer and factory pointer can but should not be NULL at the same + time. +*/ +class ShellDescriptor { +public: + SfxShell* mpShell; + ShellId mnId; + ViewShellManager::SharedShellFactory mpFactory; + bool mbIsListenerAddedToWindow; + + ShellDescriptor (); + explicit ShellDescriptor (ShellId nId); + vcl::Window* GetWindow() const; +}; + +/** This functor can be used to search for a shell in an STL container when the + shell pointer is given. +*/ +class IsShell +{ +public: + explicit IsShell (const SfxShell* pShell) : mpShell(pShell) {} + bool operator() (const ShellDescriptor& rDescriptor) + { return rDescriptor.mpShell == mpShell; } +private: + const SfxShell* mpShell; +}; + +/** This functor can be used to search for a shell in an STL container when the + id of the shell is given. +*/ +class IsId +{ +public: + explicit IsId (ShellId nId) : mnId(nId) {} + bool operator() (const ShellDescriptor& rDescriptor) + { return rDescriptor.mnId == mnId; } +private: + ShellId mnId; +}; + +} // end of anonymous namespace + +class ViewShellManager::Implementation +{ +public: + Implementation ( + ViewShellBase& rBase); + ~Implementation() COVERITY_NOEXCEPT_FALSE; + + void AddShellFactory ( + const SfxShell* pViewShell, + const SharedShellFactory& rpFactory); + void RemoveShellFactory ( + const SfxShell* pViewShell, + const SharedShellFactory& rpFactory); + void ActivateViewShell ( + ViewShell* pViewShell); + void DeactivateViewShell (const ViewShell& rShell); + void ActivateShell (SfxShell& rShell); + void DeactivateShell (const SfxShell& rShell); + void ActivateShell (const ShellDescriptor& rDescriptor); + void SetFormShell (const ViewShell* pViewShell, FmFormShell* pFormShell, bool bAbove); + void ActivateSubShell (const SfxShell& rParentShell, ShellId nId); + void DeactivateSubShell (const SfxShell& rParentShell, ShellId nId); + void MoveToTop (const SfxShell& rParentShell); + SfxShell* GetShell (ShellId nId) const; + SfxShell* GetTopShell() const; + SfxShell* GetTopViewShell() const; + void Shutdown(); + void InvalidateAllSubShells (const SfxShell* pParentShell); + + /** Remove all shells from the SFX stack above and including the given + shell. + */ + void TakeShellsFromStack (const SfxShell* pShell); + + class UpdateLock + { + public: + explicit UpdateLock (Implementation& rImpl) : mrImpl(rImpl) {mrImpl.LockUpdate();} + ~UpdateLock() COVERITY_NOEXCEPT_FALSE {mrImpl.UnlockUpdate();} + private: + Implementation& mrImpl; + }; + + /** Prevent updates of the shell stack. While the sub shell manager is + locked it will update its internal data structures but not alter the + shell stack. Use this method when there are several modifications + to the shell stack to prevent multiple rebuilds of the shell stack + and resulting broadcasts. + */ + void LockUpdate(); + + /** Allow updates of the shell stack. This method has to be called the + same number of times as LockUpdate() to really allow a rebuild of + the shell stack. + */ + void UnlockUpdate(); + +private: + ViewShellBase& mrBase; + mutable ::osl::Mutex maMutex; + + class ShellHash { public: size_t operator()(const SfxShell* p) const { return reinterpret_cast(p);} }; + typedef std::unordered_multimap + FactoryList; + FactoryList maShellFactories; + + /** List of the active view shells. In order to create gather all shells + to put on the shell stack each view shell in this list is asked for + its sub-shells (typically toolbars). + */ + typedef std::list ActiveShellList; + ActiveShellList maActiveViewShells; + + typedef std::list SubShellSubList; + typedef std::unordered_map SubShellList; + SubShellList maActiveSubShells; + + /** In this member we remember what shells we have pushed on the shell + stack. + */ + typedef ::std::vector ShellStack; + + int mnUpdateLockCount; + + /** The UpdateShellStack() method can be called recursively. This flag + is used to communicate between different levels of invocation: if + the stack has been updated in an inner call the outer call can (has + to) stop and return immediately. + */ + bool mbShellStackIsUpToDate; + + SfxShell* mpFormShell; + const ViewShell* mpFormShellParent; + bool mbFormShellAboveParent; + + SfxShell* mpTopShell; + SfxShell* mpTopViewShell; + + + void UpdateShellStack(); + + void CreateShells(); + + /** This method rebuilds the stack of shells that are stacked upon the + view shell base. + */ + void CreateTargetStack (ShellStack& rStack) const; + + DECL_LINK(WindowEventHandler, VclWindowEvent&, void); + +#if OSL_DEBUG_LEVEL >= 2 + void DumpShellStack (const ShellStack& rStack); + void DumpSfxShellStack(); +#endif + + /** To be called before a shell is taken from the SFX shell stack. This + method deactivates an active text editing to avoid problems with + undo managers. + Afterwards the Deactivate() of the shell is called. + */ + static void Deactivate (SfxShell* pShell); + + ShellDescriptor CreateSubShell ( + SfxShell const * pShell, + ShellId nShellId); + void DestroyViewShell (ShellDescriptor& rDescriptor); + static void DestroySubShell (const ShellDescriptor& rDescriptor); +}; + +//===== ViewShellManager ====================================================== + +ViewShellManager::ViewShellManager (ViewShellBase& rBase) + : mpImpl(new Implementation(rBase)), + mbValid(true) +{ +} + +ViewShellManager::~ViewShellManager() +{ +} + +void ViewShellManager::AddSubShellFactory ( + ViewShell const * pViewShell, + const SharedShellFactory& rpFactory) +{ + if (mbValid) + mpImpl->AddShellFactory(pViewShell, rpFactory); +} + +void ViewShellManager::RemoveSubShellFactory ( + ViewShell const * pViewShell, + const SharedShellFactory& rpFactory) +{ + if (mbValid) + mpImpl->RemoveShellFactory(pViewShell, rpFactory); +} + +void ViewShellManager::ActivateViewShell (ViewShell* pViewShell) +{ + if (mbValid) + return mpImpl->ActivateViewShell(pViewShell); +} + +void ViewShellManager::DeactivateViewShell (const ViewShell* pShell) +{ + if (mbValid && pShell!=nullptr) + mpImpl->DeactivateViewShell(*pShell); +} + +void ViewShellManager::SetFormShell ( + const ViewShell* pParentShell, + FmFormShell* pFormShell, + bool bAbove) +{ + if (mbValid) + mpImpl->SetFormShell(pParentShell,pFormShell,bAbove); +} + +void ViewShellManager::ActivateSubShell (const ViewShell& rViewShell, ShellId nId) +{ + if (mbValid) + mpImpl->ActivateSubShell(rViewShell,nId); +} + +void ViewShellManager::DeactivateSubShell (const ViewShell& rViewShell, ShellId nId) +{ + if (mbValid) + mpImpl->DeactivateSubShell(rViewShell,nId); +} + +void ViewShellManager::InvalidateAllSubShells (ViewShell const * pViewShell) +{ + if (mbValid) + mpImpl->InvalidateAllSubShells(pViewShell); +} + +void ViewShellManager::ActivateShell (SfxShell* pShell) +{ + if (mbValid && pShell!=nullptr) + mpImpl->ActivateShell(*pShell); +} + +void ViewShellManager::DeactivateShell (const SfxShell* pShell) +{ + if (mbValid && pShell!=nullptr) + mpImpl->DeactivateShell(*pShell); +} + +void ViewShellManager::MoveToTop (const ViewShell& rParentShell) +{ + if (mbValid) + mpImpl->MoveToTop(rParentShell); +} + +SfxShell* ViewShellManager::GetShell (ShellId nId) const +{ + if (mbValid) + return mpImpl->GetShell(nId); + else + return nullptr; +} + +SfxShell* ViewShellManager::GetTopShell() const +{ + if (mbValid) + return mpImpl->GetTopShell(); + else + return nullptr; +} + +SfxShell* ViewShellManager::GetTopViewShell() const +{ + if (mbValid) + return mpImpl->GetTopViewShell(); + else + return nullptr; +} + +void ViewShellManager::Shutdown() +{ + if (mbValid) + { + mpImpl->Shutdown(); + mbValid = false; + } +} + +void ViewShellManager::LockUpdate() +{ + mpImpl->LockUpdate(); +} + +void ViewShellManager::UnlockUpdate() +{ + mpImpl->UnlockUpdate(); +} + +//===== ViewShellManager::Implementation ====================================== + +ViewShellManager::Implementation::Implementation ( + ViewShellBase& rBase) + : mrBase(rBase), + mnUpdateLockCount(0), + mbShellStackIsUpToDate(true), + mpFormShell(nullptr), + mpFormShellParent(nullptr), + mbFormShellAboveParent(true), + mpTopShell(nullptr), + mpTopViewShell(nullptr) +{} + +ViewShellManager::Implementation::~Implementation() COVERITY_NOEXCEPT_FALSE +{ + Shutdown(); +} + +void ViewShellManager::Implementation::AddShellFactory ( + const SfxShell* pViewShell, + const SharedShellFactory& rpFactory) +{ + bool bAlreadyAdded (false); + + // Check that the given factory has not already been added. + ::std::pair aRange( + maShellFactories.equal_range(pViewShell)); + for (FactoryList::const_iterator iFactory=aRange.first; iFactory!=aRange.second; ++iFactory) + if (iFactory->second == rpFactory) + { + bAlreadyAdded = true; + break; + } + + // Add the factory if it is not already present. + if ( ! bAlreadyAdded) + maShellFactories.emplace(pViewShell, rpFactory); +} + +void ViewShellManager::Implementation::RemoveShellFactory ( + const SfxShell* pViewShell, + const SharedShellFactory& rpFactory) +{ + ::std::pair aRange( + maShellFactories.equal_range(pViewShell)); + for (FactoryList::iterator iFactory=aRange.first; iFactory!=aRange.second; ++iFactory) + if (iFactory->second == rpFactory) + { + maShellFactories.erase(iFactory); + break; + } +} + +void ViewShellManager::Implementation::ActivateViewShell (ViewShell* pViewShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + ShellDescriptor aResult; + aResult.mpShell = pViewShell; + + // Register as window listener so that the shells of the current + // window can be moved to the top of the shell stack. + if (aResult.mpShell != nullptr) + { + vcl::Window* pWindow = aResult.GetWindow(); + if (pWindow != nullptr) + { + pWindow->AddEventListener( + LINK(this, ViewShellManager::Implementation, WindowEventHandler)); + aResult.mbIsListenerAddedToWindow = true; + } + else + { + SAL_WARN("sd.view", + "ViewShellManager::ActivateViewShell: " + "new view shell has no active window"); + } + } + + ActivateShell(aResult); +} + +void ViewShellManager::Implementation::DeactivateViewShell (const ViewShell& rShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + ActiveShellList::iterator iShell (::std::find_if ( + maActiveViewShells.begin(), + maActiveViewShells.end(), + IsShell(&rShell))); + if (iShell == maActiveViewShells.end()) + return; + + UpdateLock aLocker (*this); + + ShellDescriptor aDescriptor(*iShell); + mrBase.GetDocShell()->Disconnect(dynamic_cast(aDescriptor.mpShell)); + maActiveViewShells.erase(iShell); + TakeShellsFromStack(aDescriptor.mpShell); + + // Deactivate sub shells. + SubShellList::iterator iList (maActiveSubShells.find(&rShell)); + if (iList != maActiveSubShells.end()) + { + SubShellSubList& rList (iList->second); + while ( ! rList.empty()) + DeactivateSubShell(rShell, rList.front().mnId); + } + + DestroyViewShell(aDescriptor); +} + +void ViewShellManager::Implementation::ActivateShell (SfxShell& rShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + // Create a new shell or recycle on in the cache. + ShellDescriptor aDescriptor; + aDescriptor.mpShell = &rShell; + + ActivateShell(aDescriptor); +} + +void ViewShellManager::Implementation::ActivateShell (const ShellDescriptor& rDescriptor) +{ + // Put shell on top of the active view shells. + if (rDescriptor.mpShell != nullptr) + { + maActiveViewShells.insert( maActiveViewShells.begin(), rDescriptor); + } +} + +void ViewShellManager::Implementation::DeactivateShell (const SfxShell& rShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + ActiveShellList::iterator iShell (::std::find_if ( + maActiveViewShells.begin(), + maActiveViewShells.end(), + IsShell(&rShell))); + if (iShell == maActiveViewShells.end()) + return; + + UpdateLock aLocker (*this); + + ShellDescriptor aDescriptor(*iShell); + mrBase.GetDocShell()->Disconnect(dynamic_cast(aDescriptor.mpShell)); + maActiveViewShells.erase(iShell); + TakeShellsFromStack(aDescriptor.mpShell); + + // Deactivate sub shells. + SubShellList::iterator iList (maActiveSubShells.find(&rShell)); + if (iList != maActiveSubShells.end()) + { + SubShellSubList& rList (iList->second); + while ( ! rList.empty()) + DeactivateSubShell(rShell, rList.front().mnId); + } + + DestroyViewShell(aDescriptor); +} + +void ViewShellManager::Implementation::ActivateSubShell ( + const SfxShell& rParentShell, + ShellId nId) +{ + ::osl::MutexGuard aGuard (maMutex); + + // Check that the given view shell is active. + if (std::none_of (maActiveViewShells.begin(), maActiveViewShells.end(), IsShell(&rParentShell))) + return; + + // Create the sub shell list if it does not yet exist. + SubShellList::iterator iList (maActiveSubShells.find(&rParentShell)); + if (iList == maActiveSubShells.end()) + iList = maActiveSubShells.emplace(&rParentShell,SubShellSubList()).first; + + // Do not activate an object bar that is already active. Requesting + // this is not exactly an error but may be an indication of one. + SubShellSubList& rList (iList->second); + if (std::any_of(rList.begin(),rList.end(), IsId(nId))) + return; + + // Add just the id of the sub shell. The actual shell is created + // later in CreateShells(). + UpdateLock aLock (*this); + rList.emplace_back(nId); +} + +void ViewShellManager::Implementation::DeactivateSubShell ( + const SfxShell& rParentShell, + ShellId nId) +{ + ::osl::MutexGuard aGuard (maMutex); + + // Check that the given view shell is active. + SubShellList::iterator iList (maActiveSubShells.find(&rParentShell)); + if (iList == maActiveSubShells.end()) + return; + + // Look up the sub shell. + SubShellSubList& rList (iList->second); + SubShellSubList::iterator iShell ( + ::std::find_if(rList.begin(),rList.end(), IsId(nId))); + if (iShell == rList.end()) + return; + SfxShell* pShell = iShell->mpShell; + if (pShell == nullptr) + return; + + UpdateLock aLock (*this); + + ShellDescriptor aDescriptor(*iShell); + // Remove the sub shell from both the internal structure as well as the + // SFX shell stack above and including the sub shell. + rList.erase(iShell); + TakeShellsFromStack(pShell); + + DestroySubShell(aDescriptor); +} + +void ViewShellManager::Implementation::MoveToTop (const SfxShell& rShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + // Check that we have access to a dispatcher. If not, then we are + // (probably) called while the view shell is still being created or + // initialized. Without dispatcher we can not rebuild the shell stack + // to move the requested shell to the top. So return right away instead + // of making a mess without being able to clean up afterwards. + if (mrBase.GetDispatcher() == nullptr) + return; + + ActiveShellList::iterator iShell (::std::find_if ( + maActiveViewShells.begin(), + maActiveViewShells.end(), + IsShell(&rShell))); + bool bMove = true; + if (iShell != maActiveViewShells.end()) + { + // Is the shell already at the top of the stack? We have to keep + // the case in mind that mbKeepMainViewShellOnTop is true. Shells + // that are not the main view shell are placed on the second-to-top + // position in this case. + if (iShell == maActiveViewShells.begin()) + { + // The shell is at the top position and is either a) the main + // view shell or b) another shell but the main view shell is not + // kept at the top position. We do not have to move the shell. + bMove = false; + } + } + else + { + // The shell is not on the stack. Therefore it can not be moved. + // We could insert it but we don't. Use ActivateViewShell() for + // that. + bMove = false; + } + + // When the shell is not at the right position it is removed from the + // internal list of shells and inserted at the correct position. + if (bMove) + { + UpdateLock aLock (*this); + + ShellDescriptor aDescriptor(*iShell); + + TakeShellsFromStack(&rShell); + maActiveViewShells.erase(iShell); + + maActiveViewShells.insert(maActiveViewShells.begin(), aDescriptor); + } +} + +SfxShell* ViewShellManager::Implementation::GetShell (ShellId nId) const +{ + ::osl::MutexGuard aGuard (maMutex); + + SfxShell* pShell = nullptr; + + // First search the active view shells. + ActiveShellList::const_iterator iShell ( + ::std::find_if ( + maActiveViewShells.begin(), + maActiveViewShells.end(), + IsId(nId))); + if (iShell != maActiveViewShells.end()) + pShell = iShell->mpShell; + else + { + // Now search the active sub shells of every active view shell. + for (auto const& activeSubShell : maActiveSubShells) + { + const SubShellSubList& rList (activeSubShell.second); + SubShellSubList::const_iterator iSubShell( + ::std::find_if(rList.begin(),rList.end(), IsId(nId))); + if (iSubShell != rList.end()) + { + pShell = iSubShell->mpShell; + break; + } + } + } + + return pShell; +} + +SfxShell* ViewShellManager::Implementation::GetTopShell() const +{ + OSL_ASSERT(mpTopShell == mrBase.GetSubShell(0)); + return mpTopShell; +} + +SfxShell* ViewShellManager::Implementation::GetTopViewShell() const +{ + return mpTopViewShell; +} + +void ViewShellManager::Implementation::LockUpdate() +{ + mnUpdateLockCount++; +} + +void ViewShellManager::Implementation::UnlockUpdate() +{ + ::osl::MutexGuard aGuard (maMutex); + + mnUpdateLockCount--; + if (mnUpdateLockCount < 0) + { + // This should not happen. + OSL_ASSERT (mnUpdateLockCount>=0); + mnUpdateLockCount = 0; + } + if (mnUpdateLockCount == 0) + UpdateShellStack(); +} + +/** Update the SFX shell stack (the portion that is visible to us) so that + it matches the internal shell stack. This is done in six steps: + 1. Create the missing view shells and sub shells. + 2. Set up the internal shell stack. + 3. Get the SFX shell stack. + 4. Find the lowest shell in which the two stacks differ. + 5. Remove all shells above and including that shell from the SFX stack. + 6. Push all shells of the internal stack on the SFX shell stack that are + not already present on the later. +*/ +void ViewShellManager::Implementation::UpdateShellStack() +{ + ::osl::MutexGuard aGuard (maMutex); + + // Remember the undo manager from the top-most shell on the stack. + SfxShell* pTopMostShell = mrBase.GetSubShell(0); + SfxUndoManager* pUndoManager = (pTopMostShell!=nullptr) + ? pTopMostShell->GetUndoManager() + : nullptr; + + // 1. Create the missing shells. + CreateShells(); + + // Update the pointer to the top-most active view shell. + mpTopViewShell = (maActiveViewShells.empty()) + ? nullptr : maActiveViewShells.begin()->mpShell; + + + // 2. Create the internal target stack. + ShellStack aTargetStack; + CreateTargetStack(aTargetStack); + + // 3. Get SFX shell stack. + ShellStack aSfxShellStack; + sal_uInt16 nIndex (0); + while (mrBase.GetSubShell(nIndex)!=nullptr) + ++nIndex; + aSfxShellStack.reserve(nIndex); + while (nIndex-- > 0) + aSfxShellStack.push_back(mrBase.GetSubShell(nIndex)); + +#if OSL_DEBUG_LEVEL >= 2 + SAL_INFO("sd.view", __func__ << ": Current SFX Stack"); + DumpShellStack(aSfxShellStack); + SAL_INFO("sd.view", __func__ << ": Target Stack"); + DumpShellStack(aTargetStack); +#endif + + // 4. Find the lowest shell in which the two stacks differ. + auto mismatchIters = std::mismatch(aSfxShellStack.begin(), aSfxShellStack.end(), + aTargetStack.begin(), aTargetStack.end()); + ShellStack::iterator iSfxShell (mismatchIters.first); + ShellStack::iterator iTargetShell (mismatchIters.second); + + // 5. Remove all shells above and including the differing shell from the + // SFX stack starting with the shell on top of the stack. + for (std::reverse_iterator i(aSfxShellStack.end()), iLast(iSfxShell); + i != iLast; ++i) + { + SfxShell* const pShell = *i; + SAL_INFO("sd.view", __func__ << ": removing shell " << pShell << " from stack"); + mrBase.RemoveSubShell(pShell); + } + aSfxShellStack.erase(iSfxShell, aSfxShellStack.end()); + + // 6. Push shells from the given stack onto the SFX stack. + mbShellStackIsUpToDate = false; + while (iTargetShell != aTargetStack.end()) + { + SAL_INFO("sd.view", __func__ << ": pushing shell " << *iTargetShell << " on stack"); + mrBase.AddSubShell(**iTargetShell); + ++iTargetShell; + + // The pushing of the shell on to the shell stack may have lead to + // another invocation of this method. In this case we have to abort + // pushing shells on the stack and return immediately. + if (mbShellStackIsUpToDate) + break; + } + if (mrBase.GetDispatcher() != nullptr) + mrBase.GetDispatcher()->Flush(); + + // Update the pointer to the top-most shell and set its undo manager + // to the one of the previous top-most shell. + mpTopShell = mrBase.GetSubShell(0); + if (mpTopShell!=nullptr && pUndoManager!=nullptr && mpTopShell->GetUndoManager()==nullptr) + mpTopShell->SetUndoManager(pUndoManager); + + // Finally tell an invocation of this method on a higher level that it can (has + // to) abort and return immediately. + mbShellStackIsUpToDate = true; + +#if OSL_DEBUG_LEVEL >= 2 + SAL_INFO("sd.view", __func__ << ": New current stack"); + DumpSfxShellStack(); +#endif +} + +void ViewShellManager::Implementation::TakeShellsFromStack (const SfxShell* pShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + // Remember the undo manager from the top-most shell on the stack. + SfxShell* pTopMostShell = mrBase.GetSubShell(0); + SfxUndoManager* pUndoManager = (pTopMostShell!=nullptr) + ? pTopMostShell->GetUndoManager() + : nullptr; + +#if OSL_DEBUG_LEVEL >= 2 + SAL_INFO("sd.view", __func__ << "TakeShellsFromStack( " << pShell << ")"); + DumpSfxShellStack(); +#endif + + // 0.Make sure that the given shell is on the stack. This is a + // preparation for the following assertion. + for (sal_uInt16 nIndex=0; true; nIndex++) + { + SfxShell* pShellOnStack = mrBase.GetSubShell(nIndex); + if (pShellOnStack == nullptr) + { + // Set pShell to NULL to indicate the following code that the + // shell is not on the stack. + pShell = nullptr; + break; + } + else if (pShellOnStack == pShell) + break; + } + + if (pShell == nullptr) + return; + + // 1. Deactivate our shells on the stack before they are removed so + // that during the Deactivation() calls the stack is still intact. + for (sal_uInt16 nIndex=0; true; nIndex++) + { + SfxShell* pShellOnStack = mrBase.GetSubShell(nIndex); + Deactivate(pShellOnStack); + if (pShellOnStack == pShell) + break; + } + + // 2. Remove the shells from the stack. + while (true) + { + SfxShell* pShellOnStack = mrBase.GetSubShell(0); + SAL_INFO("sd.view", __func__ << "removing shell " << pShellOnStack << " from stack"); + mrBase.RemoveSubShell(pShellOnStack); + if (pShellOnStack == pShell) + break; + } + + // 3. Update the stack. + if (mrBase.GetDispatcher() != nullptr) + mrBase.GetDispatcher()->Flush(); + + // Update the pointer to the top-most shell and set its undo manager + // to the one of the previous top-most shell. + mpTopShell = mrBase.GetSubShell(0); + if (mpTopShell!=nullptr && pUndoManager!=nullptr && mpTopShell->GetUndoManager()==nullptr) + mpTopShell->SetUndoManager(pUndoManager); + +#if OSL_DEBUG_LEVEL >= 2 + SAL_INFO("sd.view", __func__ << "Sfx shell stack is:"); + DumpSfxShellStack(); +#endif +} + +void ViewShellManager::Implementation::CreateShells() +{ + ::osl::MutexGuard aGuard (maMutex); + + // Iterate over all view shells. + ActiveShellList::reverse_iterator iShell; + for (iShell=maActiveViewShells.rbegin(); iShell!=maActiveViewShells.rend(); ++iShell) + { + // Get the list of associated sub shells. + SubShellList::iterator iList (maActiveSubShells.find(iShell->mpShell)); + if (iList != maActiveSubShells.end()) + { + SubShellSubList& rList (iList->second); + + // Iterate over all sub shells of the current view shell. + for (auto & subShell : rList) + { + if (subShell.mpShell == nullptr) + { + subShell = CreateSubShell(iShell->mpShell,subShell.mnId); + } + } + } + } +} + +void ViewShellManager::Implementation::CreateTargetStack (ShellStack& rStack) const +{ + // Create a local stack of the shells that are to push on the shell + // stack. We can thus safely create the required shells while still + // having a valid shell stack. + for (ActiveShellList::const_reverse_iterator iViewShell (maActiveViewShells.rbegin()); + iViewShell != maActiveViewShells.rend(); + ++iViewShell) + { + // Possibly place the form shell below the current view shell. + if ( ! mbFormShellAboveParent + && mpFormShell!=nullptr + && iViewShell->mpShell==mpFormShellParent) + { + rStack.push_back(mpFormShell); + } + + // Put the view shell itself on the local stack. + rStack.push_back (iViewShell->mpShell); + + // Possibly place the form shell above the current view shell. + if (mbFormShellAboveParent + && mpFormShell!=nullptr + && iViewShell->mpShell==mpFormShellParent) + { + rStack.push_back(mpFormShell); + } + + // Add all other sub shells. + SubShellList::const_iterator iList (maActiveSubShells.find(iViewShell->mpShell)); + if (iList != maActiveSubShells.end()) + { + const SubShellSubList& rList (iList->second); + SubShellSubList::const_reverse_iterator iSubShell; + for (iSubShell=rList.rbegin(); iSubShell!=rList.rend(); ++iSubShell) + if (iSubShell->mpShell != mpFormShell) + rStack.push_back(iSubShell->mpShell); + } + } +} + +IMPL_LINK(ViewShellManager::Implementation, WindowEventHandler, VclWindowEvent&, rEvent, void) +{ + vcl::Window* pEventWindow = rEvent.GetWindow(); + + switch (rEvent.GetId()) + { + case VclEventId::WindowGetFocus: + { + for (auto const& activeShell : maActiveViewShells) + { + if (pEventWindow == activeShell.GetWindow()) + { + MoveToTop(*activeShell.mpShell); + break; + } + } + } + break; + + case VclEventId::WindowLoseFocus: + break; + + case VclEventId::ObjectDying: + // Remember that we do not have to remove the window + // listener for this window. + for (auto & activeViewShell : maActiveViewShells) + { + if (activeViewShell.GetWindow() == pEventWindow) + { + activeViewShell.mbIsListenerAddedToWindow = false; + break; + } + } + break; + + default: break; + } +} + +ShellDescriptor ViewShellManager::Implementation::CreateSubShell ( + SfxShell const * pParentShell, + ShellId nShellId) +{ + ::osl::MutexGuard aGuard (maMutex); + ShellDescriptor aResult; + + // Look up the factories for the parent shell. + ::std::pair aRange( + maShellFactories.equal_range(pParentShell)); + + // Try all factories to create the shell. + for (FactoryList::const_iterator iFactory=aRange.first; iFactory!=aRange.second; ++iFactory) + { + SharedShellFactory pFactory = iFactory->second; + if (pFactory != nullptr) + aResult.mpShell = pFactory->CreateShell(nShellId); + + // Exit the loop when the shell has been successfully created. + if (aResult.mpShell != nullptr) + { + aResult.mpFactory = pFactory; + aResult.mnId = nShellId; + break; + } + } + + return aResult; +} + +void ViewShellManager::Implementation::DestroyViewShell ( + ShellDescriptor& rDescriptor) +{ + OSL_ASSERT(rDescriptor.mpShell != nullptr); + + if (rDescriptor.mbIsListenerAddedToWindow) + { + rDescriptor.mbIsListenerAddedToWindow = false; + vcl::Window* pWindow = rDescriptor.GetWindow(); + if (pWindow != nullptr) + { + pWindow->RemoveEventListener( + LINK(this, ViewShellManager::Implementation, WindowEventHandler)); + } + } + + // Destroy the sub shell factories. + ::std::pair aRange( + maShellFactories.equal_range(rDescriptor.mpShell)); + if (aRange.first != maShellFactories.end()) + maShellFactories.erase(aRange.first, aRange.second); + + // Release the shell. + if (rDescriptor.mpFactory) + rDescriptor.mpFactory->ReleaseShell(rDescriptor.mpShell); +} + +void ViewShellManager::Implementation::DestroySubShell ( + const ShellDescriptor& rDescriptor) +{ + OSL_ASSERT(rDescriptor.mpFactory); + rDescriptor.mpFactory->ReleaseShell(rDescriptor.mpShell); +} + +void ViewShellManager::Implementation::InvalidateAllSubShells (const SfxShell* pParentShell) +{ + ::osl::MutexGuard aGuard (maMutex); + + SubShellList::iterator iList (maActiveSubShells.find(pParentShell)); + if (iList != maActiveSubShells.end()) + { + SubShellSubList& rList (iList->second); + for (auto const& shell : rList) + if (shell.mpShell != nullptr) + shell.mpShell->Invalidate(); + } +} + +void ViewShellManager::Implementation::Shutdown() +{ + ::osl::MutexGuard aGuard (maMutex); + + // Take stacked shells from stack. + if ( ! maActiveViewShells.empty()) + { + UpdateLock aLock (*this); + + while ( ! maActiveViewShells.empty()) + { + SfxShell* pShell = maActiveViewShells.front().mpShell; + if (pShell != nullptr) + { + ViewShell* pViewShell = dynamic_cast(pShell); + if (pViewShell != nullptr) + DeactivateViewShell(*pViewShell); + else + DeactivateShell(*pShell); + } + else + { + SAL_WARN("sd.view", + "ViewShellManager::Implementation::Shutdown(): empty active shell descriptor"); + maActiveViewShells.pop_front(); + } + } + } + mrBase.RemoveSubShell (); + + maShellFactories.clear(); +} + +#if OSL_DEBUG_LEVEL >= 2 +void ViewShellManager::Implementation::DumpShellStack (const ShellStack& rStack) +{ + ShellStack::const_reverse_iterator iEntry; + for (iEntry=rStack.rbegin(); iEntry!=rStack.rend(); ++iEntry) + if (*iEntry != NULL) + SAL_INFO("sd.view", __func__ << ": " << + *iEntry << " : " << + (*iEntry)->GetName()); + else + SAL_INFO("sd.view", __func__ << " null"); +} + +void ViewShellManager::Implementation::DumpSfxShellStack() +{ + ShellStack aSfxShellStack; + sal_uInt16 nIndex (0); + while (mrBase.GetSubShell(nIndex)!=NULL) + ++nIndex; + aSfxShellStack.reserve(nIndex); + while (nIndex-- > 0) + aSfxShellStack.push_back(mrBase.GetSubShell(nIndex)); + DumpShellStack(aSfxShellStack); +} +#endif + +void ViewShellManager::Implementation::Deactivate (SfxShell* pShell) +{ + OSL_ASSERT(pShell!=nullptr); + + // We have to end a text edit for view shells that are to be taken from + // the shell stack. + ViewShell* pViewShell = dynamic_cast(pShell); + if (pViewShell != nullptr) + { + sd::View* pView = pViewShell->GetView(); + if (pView!=nullptr && pView->IsTextEdit()) + { + pView->SdrEndTextEdit(); + pView->UnmarkAll(); + pViewShell->GetViewFrame()->GetDispatcher()->Execute( + SID_OBJECT_SELECT, + SfxCallMode::ASYNCHRON); + } + } + + // Now we can deactivate the shell. + pShell->Deactivate(true); +} + +void ViewShellManager::Implementation::SetFormShell ( + const ViewShell* pFormShellParent, + FmFormShell* pFormShell, + bool bFormShellAboveParent) +{ + ::osl::MutexGuard aGuard (maMutex); + + mpFormShellParent = pFormShellParent; + mpFormShell = pFormShell; + mbFormShellAboveParent = bFormShellAboveParent; +} + +namespace { + +ShellDescriptor::ShellDescriptor() + : mpShell(nullptr), + mnId(ToolbarId::None), + mbIsListenerAddedToWindow(false) +{ +} + +ShellDescriptor::ShellDescriptor ( + ShellId nId) + : mpShell(nullptr), + mnId(nId), + mbIsListenerAddedToWindow(false) +{ +} + +vcl::Window* ShellDescriptor::GetWindow() const +{ + ViewShell* pViewShell = dynamic_cast(mpShell); + if (pViewShell != nullptr) + return pViewShell->GetActiveWindow(); + else + return nullptr; +} + +} // end of anonymous namespace + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/ViewTabBar.cxx b/sd/source/ui/view/ViewTabBar.cxx new file mode 100644 index 0000000000..099a333ae5 --- /dev/null +++ b/sd/source/ui/view/ViewTabBar.cxx @@ -0,0 +1,536 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::sd::framework::FrameworkHelper; + +namespace sd { + +namespace { +bool IsEqual (const TabBarButton& rButton1, const TabBarButton& rButton2) +{ + return ((rButton1.ResourceId.is() + && rButton2.ResourceId.is() + && rButton1.ResourceId->compareTo(rButton2.ResourceId) == 0) + || rButton1.ButtonLabel == rButton2.ButtonLabel); +} + +} // end of anonymous namespace + +ViewTabBar::ViewTabBar ( + const Reference& rxViewTabBarId, + const rtl::Reference<::sd::DrawController>& rxController) + : mpTabControl(VclPtr::Create(GetAnchorWindow(rxViewTabBarId,rxController), this)), + mxController(rxController), + mxViewTabBarId(rxViewTabBarId), + mpViewShellBase(nullptr), + mnNoteBookWidthPadding(0) +{ + // Do this manually instead of via uno::Reference, so we don't delete ourselves. + osl_atomic_increment(&m_refCount); + + // Tunnel through the controller and use the ViewShellBase to obtain the + // view frame. + if (mxController) + mpViewShellBase = mxController->GetViewShellBase(); + + // Register as listener at XConfigurationController. + if (mxController.is()) + { + mxConfigurationController = mxController->getConfigurationController(); + if (mxConfigurationController.is()) + { + mxConfigurationController->addConfigurationChangeListener( + this, + FrameworkHelper::msResourceActivationEvent, + Any()); + } + } + + mpTabControl->Show(); + + if (mpViewShellBase != nullptr + && rxViewTabBarId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + mpViewShellBase->SetViewTabBar(this); + } + + osl_atomic_decrement(&m_refCount); +} + +ViewTabBar::~ViewTabBar() +{ +} + +void ViewTabBar::disposing(std::unique_lock&) +{ + if (mpViewShellBase != nullptr + && mxViewTabBarId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + mpViewShellBase->SetViewTabBar(nullptr); + } + + if (mxConfigurationController.is()) + { + // Unregister listener from XConfigurationController. + try + { + mxConfigurationController->removeConfigurationChangeListener(this); + } + catch (const lang::DisposedException&) + { + // Receiving a disposed exception is the normal case. Is there + // a way to avoid it? + } + mxConfigurationController = nullptr; + } + + { + const SolarMutexGuard aSolarGuard; + mpTabControl.disposeAndClear(); + } + + mxController = nullptr; +} + +vcl::Window* ViewTabBar::GetAnchorWindow( + const Reference& rxViewTabBarId, + const rtl::Reference<::sd::DrawController>& rxController) +{ + vcl::Window* pWindow = nullptr; + ViewShellBase* pBase = nullptr; + + // Tunnel through the controller and use the ViewShellBase to obtain the + // view frame. + if (rxController) + pBase = rxController->GetViewShellBase(); + + // The ViewTabBar supports at the moment only the center pane. + if (rxViewTabBarId.is() + && rxViewTabBarId->isBoundToURL( + FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) + { + if (pBase != nullptr) + pWindow = &pBase->GetViewFrame().GetWindow(); + } + + // The rest is (at the moment) just for the emergency case. + if (pWindow == nullptr) + { + Reference xPane; + try + { + Reference xCC ( + rxController->getConfigurationController()); + if (xCC.is()) + xPane.set(xCC->getResource(rxViewTabBarId->getAnchor()), UNO_QUERY); + } + catch (const RuntimeException&) + { + } + + // Tunnel through the XWindow to the VCL side. + try + { + if (auto pPane = dynamic_cast(xPane.get())) + pWindow = pPane->GetWindow()->GetParent(); + } + catch (const RuntimeException&) + { + } + } + + return pWindow; +} + +//----- XConfigurationChangeListener ------------------------------------------ + +void SAL_CALL ViewTabBar::notifyConfigurationChange ( + const ConfigurationChangeEvent& rEvent) +{ + if (rEvent.Type == FrameworkHelper::msResourceActivationEvent + && rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix) + && rEvent.ResourceId->isBoundTo(mxViewTabBarId->getAnchor(), AnchorBindingMode_DIRECT)) + { + UpdateActiveButton(); + } +} + +//----- XEventListener -------------------------------------------------------- + +void SAL_CALL ViewTabBar::disposing( + const lang::EventObject& rEvent) +{ + if (rEvent.Source == mxConfigurationController) + { + mxConfigurationController = nullptr; + mxController = nullptr; + } +} + +//----- XTabBar --------------------------------------------------------------- + +void SAL_CALL ViewTabBar::addTabBarButtonAfter ( + const TabBarButton& rButton, + const TabBarButton& rAnchor) +{ + const SolarMutexGuard aSolarGuard; + AddTabBarButton(rButton, rAnchor); +} + +void SAL_CALL ViewTabBar::appendTabBarButton (const TabBarButton& rButton) +{ + const SolarMutexGuard aSolarGuard; + AddTabBarButton(rButton); +} + +void SAL_CALL ViewTabBar::removeTabBarButton (const TabBarButton& rButton) +{ + const SolarMutexGuard aSolarGuard; + RemoveTabBarButton(rButton); +} + +sal_Bool SAL_CALL ViewTabBar::hasTabBarButton (const TabBarButton& rButton) +{ + const SolarMutexGuard aSolarGuard; + return HasTabBarButton(rButton); +} + +Sequence SAL_CALL ViewTabBar::getTabBarButtons() +{ + const SolarMutexGuard aSolarGuard; + return GetTabBarButtons(); +} + +//----- XResource ------------------------------------------------------------- + +Reference SAL_CALL ViewTabBar::getResourceId() +{ + return mxViewTabBarId; +} + +sal_Bool SAL_CALL ViewTabBar::isAnchorOnly() +{ + return false; +} + +bool ViewTabBar::ActivatePage(size_t nIndex) +{ + try + { + Reference xConfigurationController ( + mxController->getConfigurationController()); + if ( ! xConfigurationController.is()) + throw RuntimeException(); + Reference xView; + try + { + xView.set(xConfigurationController->getResource( + ResourceId::create( + ::comphelper::getProcessComponentContext(), + FrameworkHelper::msCenterPaneURL)), + UNO_QUERY); + } + catch (const DeploymentException&) + { + } + + Client* pIPClient = nullptr; + if (mpViewShellBase != nullptr) + pIPClient = dynamic_cast(mpViewShellBase->GetIPClient()); + if (pIPClient==nullptr || ! pIPClient->IsObjectInPlaceActive()) + { + if (nIndex < maTabBarButtons.size()) + { + xConfigurationController->requestResourceActivation( + maTabBarButtons[nIndex].ResourceId, + ResourceActivationMode_REPLACE); + } + + return true; + } + } + catch (const RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd.view"); + } + + return false; +} + +int ViewTabBar::GetHeight() const +{ + int nHeight (0); + + if (!maTabBarButtons.empty()) + { + if (mpTabControl->IsReallyVisible()) + { + weld::Notebook& rNotebook = mpTabControl->GetNotebook(); + int nAllocatedWidth = mpTabControl->GetAllocatedWidth(); + int nPageWidth = nAllocatedWidth - mnNoteBookWidthPadding; + + // set each page width-request to the size it takes to fit the notebook allocation + for (int nIndex = 1, nPageCount = rNotebook.get_n_pages(); nIndex <= nPageCount; ++nIndex) + { + OUString sIdent(OUString::number(nIndex)); + weld::Container* pContainer = rNotebook.get_page(sIdent); + pContainer->set_size_request(nPageWidth, -1); + } + + // get the height-for-width for this allocation + nHeight = mpTabControl->get_preferred_size().Height(); + } + + if (nHeight <= 0) + { + // Using a default when the real height can not be determined. + // To get correct height this method should be called when the + // control is visible. + nHeight = 21; + } + } + + return nHeight; +} + +void ViewTabBar::AddTabBarButton ( + const css::drawing::framework::TabBarButton& rButton, + const css::drawing::framework::TabBarButton& rAnchor) +{ + TabBarButtonList::size_type nIndex; + + if ( ! rAnchor.ResourceId.is() + || (rAnchor.ResourceId->getResourceURL().isEmpty() + && rAnchor.ButtonLabel.isEmpty())) + { + nIndex = 0; + } + else + { + for (nIndex=0; nIndex= 0 && + nPosition <= mpTabControl->GetNotebook().get_n_pages()) + { + // Insert the button into our local array. + maTabBarButtons.insert(maTabBarButtons.begin() + nPosition, rButton); + UpdateTabBarButtons(); + UpdateActiveButton(); + } +} + +void ViewTabBar::RemoveTabBarButton ( + const css::drawing::framework::TabBarButton& rButton) +{ + for (TabBarButtonList::size_type nIndex=0; nIndex + ViewTabBar::GetTabBarButtons() +{ + return comphelper::containerToSequence(maTabBarButtons); +} + +void ViewTabBar::UpdateActiveButton() +{ + Reference xView; + if (mpViewShellBase != nullptr) + xView = FrameworkHelper::Instance(*mpViewShellBase)->GetView( + mxViewTabBarId->getAnchor()); + if (!xView.is()) + return; + + Reference xViewId (xView->getResourceId()); + for (size_t nIndex=0; nIndexcompareTo(xViewId) == 0) + { + mpTabControl->GetNotebook().set_current_page(nIndex); + break; + } + } +} + +void ViewTabBar::UpdateTabBarButtons() +{ + int nMaxPageWidthReq(0); + + weld::Notebook& rNotebook = mpTabControl->GetNotebook(); + int nPageCount(rNotebook.get_n_pages()); + int nIndex = 1; + for (const auto& rTab : maTabBarButtons) + { + OUString sIdent(OUString::number(nIndex)); + // Create a new tab when there are not enough. + if (nPageCount < nIndex) + rNotebook.append_page(sIdent, rTab.ButtonLabel); + else + { + // Update the tab. + rNotebook.set_tab_label_text(sIdent, rTab.ButtonLabel); + } + + // Set a fairly arbitrary initial width request for the pages so we can + // measure what extra width the notebook itself uses + weld::Container* pContainer = rNotebook.get_page(sIdent); + int nTextWidth = pContainer->get_pixel_size(rTab.ButtonLabel).Width(); + pContainer->set_size_request(nTextWidth, -1); + nMaxPageWidthReq = std::max(nMaxPageWidthReq, nTextWidth); + + ++nIndex; + } + + // Delete tabs that are no longer used. + for (; nIndex<=nPageCount; ++nIndex) + rNotebook.remove_page(OUString::number(nIndex)); + + int nWidthReq = rNotebook.get_preferred_size().Width(); + // The excess width over the page request that the notebook uses we will + // use this later to help measure the best height-for-width given the + // eventual allocated width of the notebook + mnNoteBookWidthPadding = nWidthReq - nMaxPageWidthReq; +} + +//===== TabBarControl ========================================================= + +TabBarControl::TabBarControl ( + vcl::Window* pParentWindow, + ::rtl::Reference pViewTabBar) + : InterimItemWindow(pParentWindow, "modules/simpress/ui/tabviewbar.ui", "TabViewBar") + , mxTabControl(m_xBuilder->weld_notebook("tabcontrol")) + , mpViewTabBar(std::move(pViewTabBar)) + , mnAllocatedWidth(0) +{ + // Because the actual window background is transparent--to avoid + // flickering due to multiple background paintings by this and by child + // windows--we have to paint the background for this control explicitly: + // the actual control is not painted over its whole bounding box. + SetPaintTransparent(false); + SetBackground(Application::GetSettings().GetStyleSettings().GetDialogColor()); + + InitControlBase(mxTabControl.get()); + + mxTabControl->connect_enter_page(LINK(this, TabBarControl, ActivatePageHdl)); + mxTabControl->connect_size_allocate(LINK(this, TabBarControl, NotebookSizeAllocHdl)); +} + +void TabBarControl::dispose() +{ + mxTabControl.reset(); + InterimItemWindow::dispose(); +} + +TabBarControl::~TabBarControl() +{ + disposeOnce(); +} + +IMPL_LINK(TabBarControl, NotebookSizeAllocHdl, const Size&, rSize, void) +{ + mnAllocatedWidth = rSize.Width(); +} + +IMPL_LINK(TabBarControl, ActivatePageHdl, const OUString&, rPage, void) +{ + if (!mpViewTabBar->ActivatePage(mxTabControl->get_page_index(rPage))) + { + // When we run into this else branch then we have an active OLE + // object. We ignore the request to switch views. Additionally + // we put the active tab back to the one for the current view. + mpViewTabBar->UpdateActiveButton(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/WindowUpdater.cxx b/sd/source/ui/view/WindowUpdater.cxx new file mode 100644 index 0000000000..3aa53fe0d2 --- /dev/null +++ b/sd/source/ui/view/WindowUpdater.cxx @@ -0,0 +1,130 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include + +#include + +namespace sd { + +WindowUpdater::WindowUpdater() + : mpDocument (nullptr) +{ + maCTLOptions.AddListener(this); +} + +WindowUpdater::~WindowUpdater() noexcept +{ + maCTLOptions.RemoveListener(this); +} + +void WindowUpdater::RegisterWindow (vcl::Window* pWindow) +{ + if (pWindow != nullptr) + { + tWindowList::iterator aWindowIterator ( + ::std::find ( + maWindowList.begin(), maWindowList.end(), pWindow)); + if (aWindowIterator == maWindowList.end()) + { + // Update the device once right now and add it to the list. + Update (pWindow->GetOutDev()); + maWindowList.emplace_back(pWindow); + } + } +} + +void WindowUpdater::UnregisterWindow (vcl::Window* pWindow) +{ + tWindowList::iterator aWindowIterator ( + ::std::find ( + maWindowList.begin(), maWindowList.end(), pWindow)); + if (aWindowIterator != maWindowList.end()) + { + maWindowList.erase (aWindowIterator); + } +} + +void WindowUpdater::SetDocument (SdDrawDocument* pDocument) +{ + mpDocument = pDocument; +} + +/*static*/ void WindowUpdater::Update (OutputDevice* pDevice) +{ + if (pDevice != nullptr) + { + UpdateWindow (pDevice); + } +} + +/*static*/ void WindowUpdater::UpdateWindow (OutputDevice* pDevice) +{ + if (pDevice == nullptr) + return; + + SvtCTLOptions::TextNumerals aNumeralMode (SvtCTLOptions::GetCTLTextNumerals()); + + LanguageType aLanguage; + // Now this is a bit confusing. The numerals in arabic languages + // are Hindi numerals and what the western world generally uses are + // arabic numerals. The digits used in the Hindi language are not + // used at all. + switch (aNumeralMode) + { + case SvtCTLOptions::NUMERALS_HINDI: + aLanguage = LANGUAGE_ARABIC_SAUDI_ARABIA; + break; + + case SvtCTLOptions::NUMERALS_SYSTEM: + aLanguage = LANGUAGE_SYSTEM; + break; + + case SvtCTLOptions::NUMERALS_ARABIC: + default: + aLanguage = LANGUAGE_ENGLISH; + break; + } + + pDevice->SetDigitLanguage (aLanguage); +} + +void WindowUpdater::ConfigurationChanged( utl::ConfigurationBroadcaster*, ConfigurationHints ) +{ + // Set the current state at all registered output devices. + for (auto& rxWindow : maWindowList) + Update (rxWindow->GetOutDev()); + + // Reformat the document for the modified state to take effect. + if (mpDocument != nullptr) + mpDocument->ReformatAllTextObjects(); + + // Invalidate the windows to make the modified state visible. + for (auto& rxWindow : maWindowList) + rxWindow->Invalidate(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/clview.cxx b/sd/source/ui/view/clview.cxx new file mode 100644 index 0000000000..9f11839da2 --- /dev/null +++ b/sd/source/ui/view/clview.cxx @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +namespace sd +{ +class DrawDocShell; +class DrawViewShell; + +/** + * ClientView is used for DrawDocShell::Draw() + */ + +ClientView::ClientView(DrawDocShell* pDocSh, OutputDevice* pOutDev) + : DrawView(pDocSh, pOutDev, nullptr) +{ +} + +ClientView::~ClientView() {} + +/** + * If View should not Invalidate() the windows, this method has + * to be overridden and properly handled. + */ + +void ClientView::InvalidateOneWin(OutputDevice& rWin) +{ + vcl::Region aRegion; + CompleteRedraw(&rWin, aRegion); +} + +/** + * If View should not Invalidate() the windows, this method has + * to be overridden and properly handled. + */ + +void ClientView::InvalidateOneWin(OutputDevice& rWin, const ::tools::Rectangle& rRect) +{ + CompleteRedraw(&rWin, vcl::Region(rRect)); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drawview.cxx b/sd/source/ui/view/drawview.cxx new file mode 100644 index 0000000000..69555bb741 --- /dev/null +++ b/sd/source/ui/view/drawview.cxx @@ -0,0 +1,621 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; + +namespace sd { + + +/** + * Shows the first page of document at position 0,0. In the case + * that there is no page a page is created. + */ + +DrawView::DrawView( + DrawDocShell* pDocSh, + OutputDevice* pOutDev, + DrawViewShell* pShell) +: ::sd::View(*pDocSh->GetDoc(), pOutDev, pShell) + ,mpDocShell(pDocSh) + ,mpDrawViewShell(pShell) + ,mnPOCHSmph(0) +{ + SetCurrentObj(SdrObjKind::Rectangle); +} + +DrawView::~DrawView() +{ +} + +/** + * Virtual method from SdrView, called at selection change. + */ + +void DrawView::MarkListHasChanged() +{ + ::sd::View::MarkListHasChanged(); + + if (mpDrawViewShell) + mpDrawViewShell->SelectionHasChanged(); +} + +/** + * Virtual method from SdrView, called at model change. + */ + +void DrawView::ModelHasChanged() +{ + ::sd::View::ModelHasChanged(); + + // force framer to rerender + SfxStyleSheetBasePool* pSSPool = mrDoc.GetStyleSheetPool(); + pSSPool->Broadcast(SfxStyleSheetPoolHint()); + + if( mpDrawViewShell ) + mpDrawViewShell->ModelHasChanged(); + +} + +/** + * Redirect attributes onto title and outline text and background + * rectangle of a masterpage into templates, otherwise pass on baseclass. + */ + +bool DrawView::SetAttributes(const SfxItemSet& rSet, + bool bReplaceAll, bool bSlide, bool bMaster) +{ + bool bOk = false; + + if (mpDrawViewShell && bMaster) + { + SfxStyleSheetBasePool* pStShPool = mrDoc.GetStyleSheetPool(); + SdPage& rPage = *mpDrawViewShell->getCurrentPage(); + SdrPage& rMasterPage = rPage.TRG_GetMasterPage(); + for (const rtl::Reference& pObject : rMasterPage) + SetMasterAttributes(pObject.get(), rPage, rSet, pStShPool, bOk, bMaster, bSlide); + return bOk; + } + if (mpDrawViewShell && bSlide) + { + SfxStyleSheetBasePool* pStShPool = mrDoc.GetStyleSheetPool(); + SdPage& rPage = *mpDrawViewShell->getCurrentPage(); + for (const rtl::Reference& pObject : rPage) + SetMasterAttributes(pObject.get(), rPage, rSet, pStShPool, bOk, bMaster, bSlide); + return bOk; + } + + // is there a masterpage edit? + if ( mpDrawViewShell && (mpDrawViewShell->GetEditMode() == EditMode::MasterPage) ) + { + SfxStyleSheetBasePool* pStShPool = mrDoc.GetStyleSheetPool(); + SdPage& rPage = *mpDrawViewShell->getCurrentPage(); + SdrTextObj* pEditObject = GetTextEditObject(); + + if (pEditObject) + { + // Textedit + + SdrInventor nInv = pEditObject->GetObjInventor(); + + if (nInv == SdrInventor::Default) + { + SdrObjKind eObjKind = pEditObject->GetObjIdentifier(); + PresObjKind ePresObjKind = rPage.GetPresObjKind(pEditObject); + + if ( ePresObjKind == PresObjKind::Title || + ePresObjKind == PresObjKind::Notes ) + { + // Presentation object (except outline) + SfxStyleSheet* pSheet = rPage.GetStyleSheetForPresObj( ePresObjKind ); + DBG_ASSERT(pSheet, "StyleSheet not found"); + + SfxItemSet aTempSet( pSheet->GetItemSet() ); + aTempSet.Put( rSet ); + aTempSet.ClearInvalidItems(); + + // Undo-Action + mpDocSh->GetUndoManager()->AddUndoAction( + std::make_unique(&mrDoc, pSheet, &aTempSet)); + + pSheet->GetItemSet().Put(aTempSet); + pSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + bOk = true; + } + else if (eObjKind == SdrObjKind::OutlineText) + { + // Presentation object outline + OutlinerView* pOV = GetTextEditOutlinerView(); + ::Outliner* pOutliner = pOV->GetOutliner(); + + pOutliner->SetUpdateLayout(false); + mpDocSh->SetWaitCursor( true ); + + // replace placeholder by template name + OUString aComment(SdResId(STR_UNDO_CHANGE_PRES_OBJECT)); + aComment = aComment.replaceFirst("$", SdResId(STR_PSEUDOSHEET_OUTLINE)); + mpDocSh->GetUndoManager()->EnterListAction( aComment, OUString(), 0, mpDrawViewShell->GetViewShellBase().GetViewShellId() ); + + std::vector aSelList; + pOV->CreateSelectionList(aSelList); + + std::vector::reverse_iterator iter = aSelList.rbegin(); + Paragraph* pPara = iter != aSelList.rend() ? *iter : nullptr; + + while (pPara) + { + sal_Int32 nParaPos = pOutliner->GetAbsPos( pPara ); + sal_Int16 nDepth = pOutliner->GetDepth( nParaPos ); + OUString aName = rPage.GetLayoutName() + " " + + OUString::number((nDepth <= 0) ? 1 : nDepth + 1); + SfxStyleSheet* pSheet = static_cast(pStShPool->Find(aName, SfxStyleFamily::Page)); + //We have no stylesheet if we access outline level 10 + //in the master preview, there is no true style backing + //that entry + SAL_WARN_IF(!pSheet, "sd", "StyleSheet " << aName << " not found"); + if (pSheet) + { + SfxItemSet aTempSet( pSheet->GetItemSet() ); + aTempSet.Put( rSet ); + aTempSet.ClearInvalidItems(); + + if( nDepth > 0 && aTempSet.GetItemState( EE_PARA_NUMBULLET ) == SfxItemState::SET ) + { + // no SvxNumBulletItem in outline level 1 to 8! + aTempSet.ClearItem( EE_PARA_NUMBULLET ); + } + + // Undo-Action + mpDocSh->GetUndoManager()->AddUndoAction( + std::make_unique(&mrDoc, pSheet, &aTempSet)); + + pSheet->GetItemSet().Put(aTempSet); + pSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + + // now also broadcast any child sheets + sal_Int16 nChild; + for( nChild = nDepth + 1; nChild < 9; nChild++ ) + { + OUString aSheetName = rPage.GetLayoutName() + " " + + OUString::number((nChild <= 0) ? 1 : nChild + 1); + SfxStyleSheet* pOutlSheet = static_cast< SfxStyleSheet* >(pStShPool->Find(aSheetName, SfxStyleFamily::Page)); + + if( pOutlSheet ) + pOutlSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + } + } + + ++iter; + pPara = iter != aSelList.rend() ? *iter : nullptr; + + bool bJumpToLevel1 = false; + if( !pPara && nDepth > 0 && rSet.GetItemState( EE_PARA_NUMBULLET ) == SfxItemState::SET ) + bJumpToLevel1 = true; + + if (bJumpToLevel1) + { + iter = aSelList.rend(); + --iter; + + if (pOutliner->GetDepth(pOutliner->GetAbsPos(*iter)) > 0) + pPara = pOutliner->GetParagraph( 0 ); // Put NumBulletItem in outline level 1 + } + } + + mpDocSh->SetWaitCursor( false ); + pOV->GetOutliner()->SetUpdateLayout(true); + + mpDocSh->GetUndoManager()->LeaveListAction(); + + bOk = true; + } + else + { + bOk = ::sd::View::SetAttributes(rSet, bReplaceAll); + } + } + } + else + { + // Selection + const SdrMarkList& rList = GetMarkedObjectList(); + const size_t nMarkCount = rList.GetMarkCount(); + for (size_t nMark = 0; nMark < nMarkCount; ++nMark) + { + SdrObject* pObject = rList.GetMark(nMark)->GetMarkedSdrObj(); + SetMasterAttributes(pObject, rPage, rSet, pStShPool, bOk, bMaster, bSlide); + } + + if(!bOk) + bOk = ::sd::View::SetAttributes(rSet, bReplaceAll); + } + } + else // not at masterpage + { + bOk = ::sd::View::SetAttributes(rSet, bReplaceAll); + } + + return bOk; +} + +void DrawView::SetMasterAttributes( SdrObject* pObject, const SdPage& rPage, SfxItemSet rSet, SfxStyleSheetBasePool* pStShPool, bool& bOk, bool bMaster, bool bSlide ) +{ + SdrInventor nInv = pObject->GetObjInventor(); + + if (nInv != SdrInventor::Default) + return; + + SdrObjKind eObjKind = pObject->GetObjIdentifier(); + PresObjKind ePresObjKind = rPage.GetPresObjKind(pObject); + if (bSlide && eObjKind == SdrObjKind::Text) + { + // Presentation object (except outline) + SfxStyleSheet* pSheet = rPage.GetTextStyleSheetForObject(pObject); + DBG_ASSERT(pSheet, "StyleSheet not found"); + + SfxItemSet aTempSet( pSheet->GetItemSet() ); + aTempSet.Put( rSet ); + aTempSet.ClearInvalidItems(); + + // Undo-Action + mpDocSh->GetUndoManager()->AddUndoAction( + std::make_unique(&mrDoc, pSheet, &aTempSet)); + + pSheet->GetItemSet().Put(aTempSet,false); + pSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + bOk = true; + } + + if (!bSlide && + (ePresObjKind == PresObjKind::Title || + ePresObjKind == PresObjKind::Notes)) + { + // Presentation object (except outline) + SfxStyleSheet* pSheet = rPage.GetStyleSheetForPresObj( ePresObjKind ); + DBG_ASSERT(pSheet, "StyleSheet not found"); + + SfxItemSet aTempSet( pSheet->GetItemSet() ); + aTempSet.Put( rSet ); + aTempSet.ClearInvalidItems(); + + // Undo-Action + mpDocSh->GetUndoManager()->AddUndoAction( + std::make_unique(&mrDoc, pSheet, &aTempSet)); + + pSheet->GetItemSet().Put(aTempSet,false); + pSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + bOk = true; + } + else if (eObjKind == SdrObjKind::OutlineText) + { + // tdf#127900: do not forget to apply master style to placeholders + if (!rSet.HasItem(EE_PARA_NUMBULLET) || bMaster) + { + // Presentation object outline + for (sal_uInt16 nLevel = 9; nLevel > 0; nLevel--) + { + OUString aName = rPage.GetLayoutName() + " " + + OUString::number(nLevel); + SfxStyleSheet* pSheet = static_cast(pStShPool-> + Find(aName, SfxStyleFamily::Page)); + DBG_ASSERT(pSheet, "StyleSheet not found"); + + SfxItemSet aTempSet( pSheet->GetItemSet() ); + + if( nLevel > 1 ) + { + // for all levels over 1, clear all items that will be + // hard set to level 1 + SfxWhichIter aWhichIter(rSet); + sal_uInt16 nWhich(aWhichIter.FirstWhich()); + while( nWhich ) + { + if( SfxItemState::SET == aWhichIter.GetItemState() ) + aTempSet.ClearItem( nWhich ); + nWhich = aWhichIter.NextWhich(); + } + + } + else + { + // put the items hard into level one + aTempSet.Put( rSet ); + } + + aTempSet.ClearInvalidItems(); + + // Undo-Action + mpDocSh->GetUndoManager()->AddUndoAction( + std::make_unique(&mrDoc, pSheet, &aTempSet)); + + pSheet->GetItemSet().Set(aTempSet,false); + pSheet->Broadcast(SfxHint(SfxHintId::DataChanged)); + } + + // remove all hard set items from shape that are now set in style + SfxWhichIter aWhichIter(rSet); + sal_uInt16 nWhich(aWhichIter.FirstWhich()); + while( nWhich ) + { + if( SfxItemState::SET == aWhichIter.GetItemState() ) + pObject->ClearMergedItem( nWhich ); + nWhich = aWhichIter.NextWhich(); + } + } + else + pObject->SetMergedItemSet(rSet); + + bOk = true; + } +} + +/** + * Notify for change of site arrangement + */ + +void DrawView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) +{ + if ( mpDrawViewShell && rHint.GetId() == SfxHintId::ThisIsAnSdrHint ) + { + SdrHintKind eHintKind = static_cast(rHint).GetKind(); + + if ( mnPOCHSmph == 0 && eHintKind == SdrHintKind::PageOrderChange ) + { + mpDrawViewShell->ResetActualPage(); + } + else if ( eHintKind == SdrHintKind::LayerChange || eHintKind == SdrHintKind::LayerOrderChange ) + { + mpDrawViewShell->ResetActualLayer(); + } + + // switch to that page when it's not a master page + if(SdrHintKind::SwitchToPage == eHintKind) + { + // We switch page only in the current view, which triggered this event + // and keep other views untouched. + SfxViewShell* pViewShell = SfxViewShell::Current(); + if(pViewShell && pViewShell != &mpDrawViewShell->GetViewShellBase()) + return; + + const SdrPage* pPage = static_cast(rHint).GetPage(); + if(pPage && !pPage->IsMasterPage()) + { + if(mpDrawViewShell->GetActualPage() != pPage) + { + sal_uInt16 nPageNum = (pPage->GetPageNum() - 1) / 2; // Sdr --> Sd + mpDrawViewShell->SwitchPage(nPageNum); + } + } + } + } + + ::sd::View::Notify(rBC, rHint); +} + +/** + * Lock/Unlock PageOrderChangedHint + */ + +void DrawView::BlockPageOrderChangedHint(bool bBlock) +{ + if (bBlock) + mnPOCHSmph++; + else + { + DBG_ASSERT(mnPOCHSmph, "counter overflow"); + mnPOCHSmph--; + } +} + +/** + * If presentation objects are selected, intercept stylesheet-positioning at + * masterpage. + */ + +bool DrawView::SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr) +{ + bool bResult = true; + + // is there a masterpage edit? + if (mpDrawViewShell && mpDrawViewShell->GetEditMode() == EditMode::MasterPage) + { + if (IsPresObjSelected(false)) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(mpDrawViewShell->GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + bResult = false; + } + else + { + bResult = ::sd::View::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr); + } + } + else + { + bResult = ::sd::View::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr); + } + return bResult; +} + +/** + * Paint-method: Redirect event to the view + */ + +void DrawView::CompleteRedraw(OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector /*=0*/) +{ + SdDrawDocument* pDoc = mpDocShell->GetDoc(); + if( pDoc && pDoc->GetDocumentType() == DocumentType::Impress) + { + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( pDoc ) ); + if(xSlideshow.is() && xSlideshow->isRunning()) + { + OutputDevice* pShowWindow = xSlideshow->getShowWindow(); + if( (pShowWindow == pOutDev) || (xSlideshow->getAnimationMode() == ANIMATIONMODE_PREVIEW) ) + { + if( pShowWindow == pOutDev && mpViewSh ) + xSlideshow->paint(); + return; + } + } + } + + ::sd::View::CompleteRedraw(pOutDev, rReg, pRedirector); +} + +/** + * Make passed region visible (scrolling if necessary) + */ + +void DrawView::MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin) +{ + if (!rRect.IsEmpty() && mpDrawViewShell) + { + mpDrawViewShell->MakeVisible(rRect, rWin); + } +} + +/** + * Hide page. + */ + +void DrawView::HideSdrPage() +{ + if (mpDrawViewShell) + { + mpDrawViewShell->HidePage(); + } + + ::sd::View::HideSdrPage(); +} + +void DrawView::DeleteMarked() +{ + sd::UndoManager* pUndoManager = mrDoc.GetUndoManager(); + DBG_ASSERT( pUndoManager, "sd::DrawView::DeleteMarked(), ui action without undo manager!?" ); + + if( pUndoManager ) + { + OUString aUndo(SvxResId(STR_EditDelete)); + aUndo = aUndo.replaceFirst("%1", GetDescriptionOfMarkedObjects()); + ViewShellId nViewShellId = mpDrawViewShell ? mpDrawViewShell->GetViewShellBase().GetViewShellId() : ViewShellId(-1); + pUndoManager->EnterListAction(aUndo, aUndo, 0, nViewShellId); + } + + SdPage* pPage = nullptr; + bool bResetLayout = false; + + const size_t nMarkCount = GetMarkedObjectList().GetMarkCount(); + if( nMarkCount ) + { + SdrMarkList aList( GetMarkedObjectList() ); + for (size_t nMark = 0; nMark < nMarkCount; ++nMark) + { + SdrObject* pObj = aList.GetMark(nMark)->GetMarkedSdrObj(); + if( pObj && !pObj->IsEmptyPresObj() && pObj->GetUserCall() ) + { + pPage = static_cast< SdPage* >( pObj->getSdrPageFromSdrObject() ); + if (pPage) + { + PresObjKind ePresObjKind(pPage->GetPresObjKind(pObj)); + switch( ePresObjKind ) + { + case PresObjKind::NONE: + continue; // ignore it + case PresObjKind::Graphic: + case PresObjKind::Object: + case PresObjKind::Chart: + case PresObjKind::OrgChart: + case PresObjKind::Table: + case PresObjKind::Calc: + case PresObjKind::Media: + ePresObjKind = PresObjKind::Outline; + break; + default: + break; + } + SdrTextObj* pTextObj = DynCastSdrTextObj( pObj ); + bool bVertical = pTextObj && pTextObj->IsVerticalWriting(); + ::tools::Rectangle aRect( pObj->GetLogicRect() ); + SdrObject* pNewObj = pPage->InsertAutoLayoutShape( nullptr, ePresObjKind, bVertical, aRect, true ); + + // pUndoManager should not be NULL (see assert above) + // but since we have defensive code + // for it earlier and later in the function + // we might as well be consistent + if(pUndoManager) + { + // Move the new PresObj to the position before the + // object it will replace. + pUndoManager->AddUndoAction( + mrDoc.GetSdrUndoFactory().CreateUndoObjectOrdNum( + *pNewObj, + pNewObj->GetOrdNum(), + pObj->GetOrdNum())); + } + pPage->SetObjectOrdNum( pNewObj->GetOrdNum(), pObj->GetOrdNum() ); + + bResetLayout = true; + } + } + } + } + + ::sd::View::DeleteMarked(); + + if( pPage && bResetLayout ) + pPage->SetAutoLayout( pPage->GetAutoLayout() ); + + if( pUndoManager ) + pUndoManager->LeaveListAction(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drbezob.cxx b/sd/source/ui/view/drbezob.cxx new file mode 100644 index 0000000000..0db363aa21 --- /dev/null +++ b/sd/source/ui/view/drbezob.cxx @@ -0,0 +1,320 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + + +#include + +#include +#include +#include +#include +#include + +using namespace sd; +#define ShellClass_BezierObjectBar +#include + +namespace sd { + +/** + * Declare default interface (Slotmap must not be empty) + */ +SFX_IMPL_INTERFACE(BezierObjectBar, ::SfxShell) + +void BezierObjectBar::InitInterface_Impl() +{ +} + + +BezierObjectBar::BezierObjectBar( + ViewShell* pSdViewShell, + ::sd::View* pSdView) + : SfxShell(pSdViewShell->GetViewShell()), + mpView(pSdView), + mpViewSh(pSdViewShell) +{ + DrawDocShell* pDocShell = mpViewSh->GetDocSh(); + SetPool(&pDocShell->GetPool()); + SetUndoManager(pDocShell->GetUndoManager()); + SetRepeatTarget(mpView); +} + +BezierObjectBar::~BezierObjectBar() +{ + SetRepeatTarget(nullptr); +} + +/** + * Status of attribute items. + */ + +void BezierObjectBar::GetAttrState(SfxItemSet& rSet) +{ + SfxItemSet aAttrSet( mpView->GetDoc().GetPool() ); + mpView->GetAttributes( aAttrSet ); + rSet.Put(aAttrSet, false); // <- sal_False, so DontCare-Status gets acquired + + rtl::Reference xFunc( mpViewSh->GetCurrentFunction() ); + + if(xFunc.is()) + { + if( auto pFuSelection = dynamic_cast< const FuSelection *>( xFunc.get() )) + { + sal_uInt16 nEditMode = pFuSelection->GetEditMode(); + rSet.Put(SfxBoolItem(nEditMode, true)); + } + else if( auto pFuPolygon = dynamic_cast< const FuConstructBezierPolygon *>( xFunc.get() )) + { + sal_uInt16 nEditMode = pFuPolygon->GetEditMode(); + rSet.Put(SfxBoolItem(nEditMode, true)); + } + } + + if(!mpView->IsMoveAllowed() || !mpView->IsResizeAllowed()) + { + // #i77187# if object is move and/or size protected, do not allow point editing at all + rSet.DisableItem(SID_BEZIER_MOVE); + rSet.DisableItem(SID_BEZIER_INSERT); + + rSet.DisableItem(SID_BEZIER_DELETE); + rSet.DisableItem(SID_BEZIER_CUTLINE); + rSet.DisableItem(SID_BEZIER_CONVERT); + + rSet.DisableItem(SID_BEZIER_EDGE); + rSet.DisableItem(SID_BEZIER_SMOOTH); + rSet.DisableItem(SID_BEZIER_SYMMTR); + + rSet.DisableItem(SID_BEZIER_CLOSE); + + rSet.DisableItem(SID_BEZIER_ELIMINATE_POINTS); + } + else + { + IPolyPolygonEditorController* pIPPEC = nullptr; + if( mpView->GetMarkedObjectList().GetMarkCount() ) + pIPPEC = mpView; + else + pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() ); + + if ( !pIPPEC || !pIPPEC->IsRipUpAtMarkedPointsPossible()) + { + rSet.DisableItem(SID_BEZIER_CUTLINE); + } + if (!pIPPEC || !pIPPEC->IsDeleteMarkedPointsPossible()) + { + rSet.DisableItem(SID_BEZIER_DELETE); + } + if (!pIPPEC || !pIPPEC->IsSetMarkedSegmentsKindPossible()) + { + rSet.DisableItem(SID_BEZIER_CONVERT); + } + else + { + SdrPathSegmentKind eSegm = pIPPEC->GetMarkedSegmentsKind(); + switch (eSegm) + { + case SdrPathSegmentKind::DontCare: rSet.InvalidateItem(SID_BEZIER_CONVERT); break; + case SdrPathSegmentKind::Line : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,false)); break; // Button down = curve + case SdrPathSegmentKind::Curve : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,true)); break; + default: break; + } + } + if (!pIPPEC || !pIPPEC->IsSetMarkedPointsSmoothPossible()) + { + rSet.DisableItem(SID_BEZIER_EDGE); + rSet.DisableItem(SID_BEZIER_SMOOTH); + rSet.DisableItem(SID_BEZIER_SYMMTR); + } + else + { + SdrPathSmoothKind eSmooth = pIPPEC->GetMarkedPointsSmooth(); + switch (eSmooth) + { + case SdrPathSmoothKind::DontCare : break; + case SdrPathSmoothKind::Angular : rSet.Put(SfxBoolItem(SID_BEZIER_EDGE, true)); break; + case SdrPathSmoothKind::Asymmetric: rSet.Put(SfxBoolItem(SID_BEZIER_SMOOTH,true)); break; + case SdrPathSmoothKind::Symmetric : rSet.Put(SfxBoolItem(SID_BEZIER_SYMMTR,true)); break; + } + } + if (!pIPPEC || !pIPPEC->IsOpenCloseMarkedObjectsPossible()) + { + rSet.DisableItem(SID_BEZIER_CLOSE); + } + else + { + SdrObjClosedKind eClose = pIPPEC->GetMarkedObjectsClosedState(); + switch (eClose) + { + case SdrObjClosedKind::DontCare: rSet.InvalidateItem(SID_BEZIER_CLOSE); break; + case SdrObjClosedKind::Open : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,false)); break; + case SdrObjClosedKind::Closed : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,true)); break; + default: break; + } + } + + if(pIPPEC == mpView) + rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, mpView->IsEliminatePolyPoints())); + else + rSet.DisableItem( SID_BEZIER_ELIMINATE_POINTS ); // only works for views + } +} + +/** + * Process SfxRequests + */ + +void BezierObjectBar::Execute(SfxRequest& rReq) +{ + sal_uInt16 nSId = rReq.GetSlot(); + + switch (nSId) + { + case SID_BEZIER_CUTLINE: + case SID_BEZIER_CONVERT: + case SID_BEZIER_DELETE: + case SID_BEZIER_EDGE: + case SID_BEZIER_SMOOTH: + case SID_BEZIER_SYMMTR: + case SID_BEZIER_CLOSE: + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + + IPolyPolygonEditorController* pIPPEC = nullptr; + if( rMarkList.GetMarkCount() ) + pIPPEC = mpView; + else + pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() ); + + if( pIPPEC && !mpView->IsAction()) + { + switch (nSId) + { + case SID_BEZIER_DELETE: + pIPPEC->DeleteMarkedPoints(); + break; + + case SID_BEZIER_CUTLINE: + pIPPEC->RipUpAtMarkedPoints(); + break; + + case SID_BEZIER_CONVERT: + { + pIPPEC->SetMarkedSegmentsKind(SdrPathSegmentKind::Toggle); + break; + } + + case SID_BEZIER_EDGE: + case SID_BEZIER_SMOOTH: + case SID_BEZIER_SYMMTR: + { + SdrPathSmoothKind eKind; + + switch (nSId) + { + default: + case SID_BEZIER_EDGE: eKind = SdrPathSmoothKind::Angular; break; + case SID_BEZIER_SMOOTH: eKind = SdrPathSmoothKind::Asymmetric; break; + case SID_BEZIER_SYMMTR: eKind = SdrPathSmoothKind::Symmetric; break; + } + + pIPPEC->SetMarkedPointsSmooth(eKind); + break; + } + + case SID_BEZIER_CLOSE: + { + SdrPathObj* pPathObj = static_cast( rMarkList.GetMark(0)->GetMarkedSdrObj() ); + const bool bUndo = mpView->IsUndoEnabled(); + if( bUndo ) + mpView->BegUndo(SdResId(STR_UNDO_BEZCLOSE)); + + mpView->UnmarkAllPoints(); + + if( bUndo ) + mpView->AddUndo(mpView->GetModel().GetSdrUndoFactory().CreateUndoGeoObject(*pPathObj)); + + pPathObj->ToggleClosed(); + + if( bUndo ) + mpView->EndUndo(); + break; + } + } + } + + if( (pIPPEC == mpView) && !mpView->AreObjectsMarked() ) + mpViewSh->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + rReq.Ignore(); + } + break; + + case SID_BEZIER_ELIMINATE_POINTS: + { + mpView->SetEliminatePolyPoints(!mpView->IsEliminatePolyPoints()); + Invalidate(SID_BEZIER_ELIMINATE_POINTS); + rReq.Done(); + } + break; + + case SID_BEZIER_MOVE: + case SID_BEZIER_INSERT: + { + rtl::Reference xFunc( mpViewSh->GetCurrentFunction() ); + + if(xFunc.is()) + { + if( auto pFuSelection = dynamic_cast( xFunc.get() )) + { + pFuSelection->SetEditMode(rReq.GetSlot()); + } + else if( auto pFuPolygon = dynamic_cast( xFunc.get() )) + { + pFuPolygon->SetEditMode(rReq.GetSlot()); + } + } + + rReq.Ignore (); + } + break; + + default: + break; + } + + Invalidate(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drtxtob.cxx b/sd/source/ui/view/drtxtob.cxx new file mode 100644 index 0000000000..710518185d --- /dev/null +++ b/sd/source/ui/view/drtxtob.cxx @@ -0,0 +1,627 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#define ShellClass_TextObjectBar +using namespace sd; +#include + +using namespace ::com::sun::star; + +namespace sd { + +/** + * Declare default interface (Slotmap must not be empty, therefore enter + * something that (hopefully) never occurs. + */ +SFX_IMPL_INTERFACE(TextObjectBar, SfxShell) + +void TextObjectBar::InitInterface_Impl() +{ +} + + +TextObjectBar::TextObjectBar ( + ViewShell* pSdViewSh, + SfxItemPool& rItemPool, + ::sd::View* pSdView ) + : SfxShell(pSdViewSh->GetViewShell()), + mpViewShell( pSdViewSh ), + mpView( pSdView ) +{ + SetPool(&rItemPool); + + if( mpView ) + { + OutlineView* pOutlinerView = dynamic_cast< OutlineView* >( mpView ); + if( pOutlinerView ) + { + SetUndoManager(&pOutlinerView->GetOutliner().GetUndoManager()); + } + else + { + DrawDocShell* pDocShell = mpView->GetDoc().GetDocSh(); + if( pDocShell ) + { + SetUndoManager(pDocShell->GetUndoManager()); + DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( pSdViewSh ); + if ( pDrawViewShell ) + SetRepeatTarget(pSdView); + } + } + } + + SetName( "TextObjectBar"); + + // SetHelpId( SD_IF_SDDRAWTEXTOBJECTBAR ); +} + +TextObjectBar::~TextObjectBar() +{ + SetRepeatTarget(nullptr); +} + +void TextObjectBar::GetCharState( SfxItemSet& rSet ) +{ + SfxItemSet aCharAttrSet( mpView->GetDoc().GetPool() ); + mpView->GetAttributes( aCharAttrSet ); + + SfxItemSetFixed aNewAttr( mpViewShell->GetPool() ); + + aNewAttr.Put(aCharAttrSet, false); + rSet.Put(aNewAttr, false); + + SvxKerningItem aKern = aCharAttrSet.Get( EE_CHAR_KERNING ); + //aKern.SetWhich(SID_ATTR_CHAR_KERNING); + rSet.Put(aKern); + + SfxItemState eState = aCharAttrSet.GetItemState( EE_CHAR_KERNING ); + if ( eState == SfxItemState::DONTCARE ) + { + rSet.InvalidateItem(EE_CHAR_KERNING); + } +} + +/** + * Status of attribute items. + */ +void TextObjectBar::GetAttrState( SfxItemSet& rSet ) +{ + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + SfxItemSet aAttrSet( mpView->GetDoc().GetPool() ); + bool bDisableParagraphTextDirection = !SvtCTLOptions::IsCTLFontEnabled(); + bool bDisableVerticalText = !SvtCJKOptions::IsVerticalTextEnabled(); + + mpView->GetAttributes( aAttrSet ); + + while ( nWhich ) + { + sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich) + ? GetPool().GetSlotId(nWhich) + : nWhich; + + switch ( nSlotId ) + { + case SID_ATTR_CHAR_FONT: + case SID_ATTR_CHAR_FONTHEIGHT: + case SID_ATTR_CHAR_WEIGHT: + case SID_ATTR_CHAR_POSTURE: + case SID_ATTR_CHAR_SHADOWED: + case SID_ATTR_CHAR_STRIKEOUT: + case SID_ATTR_CHAR_CASEMAP: + { + double stretchY = 100.0; + SvxScriptSetItem aSetItem( nSlotId, GetPool() ); + aSetItem.GetItemSet().Put( aAttrSet, false ); + + SvtScriptType nScriptType = mpView->GetScriptType(); + + if( (nSlotId == SID_ATTR_CHAR_FONT) || (nSlotId == SID_ATTR_CHAR_FONTHEIGHT) ) + { + // input language should be preferred over + // current cursor position to detect script type + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + SdrOutliner *pOutliner = mpView->GetTextEditOutliner(); + + assert(mpViewShell); + + if (OutlineView* pOView = dynamic_cast(mpView)) + pOLV = pOView->GetViewByWindow(mpViewShell->GetActiveWindow()); + + if (pOutliner) + pOutliner->getGlobalScale(o3tl::temporary(double()), stretchY, o3tl::temporary(double()), o3tl::temporary(double())); + + if(pOLV && !pOLV->GetSelection().HasRange()) + { + if (mpViewShell->GetViewShell() && mpViewShell->GetViewShell()->GetWindow()) + { + LanguageType nInputLang = mpViewShell->GetViewShell()->GetWindow()->GetInputLanguage(); + if(nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM) + nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang ); + } + } + } + + const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScriptType ); + if( pI ) + { + if( nSlotId == SID_ATTR_CHAR_FONTHEIGHT ) + { + SvxFontHeightItem aFontItem = dynamic_cast(*pI); + aFontItem.SetHeight(aFontItem.GetHeight() * (stretchY / 100.0), 100, aFontItem.GetPropUnit()); + aFontItem.SetWhich(nWhich); + aAttrSet.Put( aFontItem ); + } + else + { + aAttrSet.Put( pI->CloneSetWhich(nWhich) ); + } + } + else + { + aAttrSet.InvalidateItem( nWhich ); + } + } + break; + + case SID_STYLE_APPLY: + case SID_STYLE_FAMILY2: + { + SfxStyleSheet* pStyleSheet = mpView->GetStyleSheetFromMarked(); + if( pStyleSheet ) + rSet.Put( SfxTemplateItem( nWhich, pStyleSheet->GetName() ) ); + else + { + rSet.Put( SfxTemplateItem( nWhich, OUString() ) ); + } + } + break; + + case SID_OUTLINE_LEFT: + case SID_OUTLINE_RIGHT: + case SID_OUTLINE_UP: + case SID_OUTLINE_DOWN: + { + bool bDisableLeft = true; + bool bDisableRight = true; + bool bDisableUp = true; + bool bDisableDown = true; + + //fdo#78151 it doesn't make sense to promote or demote outline levels in master view. + const DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >(mpViewShell); + const bool bInMasterView = pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::MasterPage; + + if (!bInMasterView) + { + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + if (OutlineView* pOView = dynamic_cast(mpView)) + pOLV = pOView->GetViewByWindow(mpViewShell->GetActiveWindow()); + + bool bOutlineViewSh = dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr; + + if (pOLV) + { + // Outliner at outline-mode + ::Outliner* pOutl = pOLV->GetOutliner(); + + std::vector aSelList; + pOLV->CreateSelectionList(aSelList); + Paragraph* pPara = aSelList.empty() ? nullptr : *(aSelList.begin()); + + // find out if we are an OutlineView + bool bIsOutlineView(OutlinerMode::OutlineView == pOLV->GetOutliner()->GetOutlinerMode()); + + // This is ONLY for OutlineViews + if(bIsOutlineView) + { + // allow move up if position is 2 or greater OR it + // is a title object (and thus depth==1) + if(pOutl->GetAbsPos(pPara) > 1 || ( ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) && pOutl->GetAbsPos(pPara) > 0 ) ) + { + // not at top + bDisableUp = false; + } + } + else + { + // old behaviour for OutlinerMode::OutlineObject + if(pOutl->GetAbsPos(pPara) > 0) + { + // not at top + bDisableUp = false; + } + } + + for (const auto& rpItem : aSelList) + { + pPara = rpItem; + + sal_Int16 nDepth = pOutl->GetDepth( pOutl->GetAbsPos( pPara ) ); + + if (nDepth > 0 || (bOutlineViewSh && (nDepth <= 0) && !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE )) ) + { + // not minimum depth + bDisableLeft = false; + } + + if( (nDepth < pOLV->GetOutliner()->GetMaxDepth() && ( !bOutlineViewSh || pOutl->GetAbsPos(pPara) != 0 )) || + (bOutlineViewSh && (nDepth <= 0) && ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && pOutl->GetAbsPos(pPara) != 0) ) + { + // not maximum depth and not at top + bDisableRight = false; + } + } + + if ( ( pOutl->GetAbsPos(pPara) < pOutl->GetParagraphCount() - 1 ) && + ( pOutl->GetParagraphCount() > 1 || !bOutlineViewSh) ) + { + // not last paragraph + bDisableDown = false; + } + + // disable when first para and 2nd is not a title + pPara = aSelList.empty() ? nullptr : *(aSelList.begin()); + + if(!bDisableDown && bIsOutlineView + && pPara + && 0 == pOutl->GetAbsPos(pPara) + && pOutl->GetParagraphCount() > 1 + && !::Outliner::HasParaFlag( pOutl->GetParagraph(1), ParaFlag::ISPAGE ) ) + { + // Needs to be disabled + bDisableDown = true; + } + } + } + + if (bDisableLeft) + rSet.DisableItem(SID_OUTLINE_LEFT); + if (bDisableRight) + rSet.DisableItem(SID_OUTLINE_RIGHT); + if (bDisableUp) + rSet.DisableItem(SID_OUTLINE_UP); + if (bDisableDown) + rSet.DisableItem(SID_OUTLINE_DOWN); + } + break; + + case SID_TEXTDIRECTION_LEFT_TO_RIGHT: + case SID_TEXTDIRECTION_TOP_TO_BOTTOM: + { + if ( bDisableVerticalText ) + { + rSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT ); + rSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM ); + } + else + { + bool bLeftToRight = true; + + SdrOutliner* pOutl = mpView->GetTextEditOutliner(); + if( pOutl ) + { + if( pOutl->IsVertical() ) + bLeftToRight = false; + } + else + bLeftToRight = aAttrSet.Get( SDRATTR_TEXTDIRECTION ).GetValue() == css::text::WritingMode_LR_TB; + + rSet.Put( SfxBoolItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT, bLeftToRight ) ); + rSet.Put( SfxBoolItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM, !bLeftToRight ) ); + + if( !bLeftToRight ) + bDisableParagraphTextDirection = true; + } + } + break; + + case SID_ULINE_VAL_NONE: + case SID_ULINE_VAL_SINGLE: + case SID_ULINE_VAL_DOUBLE: + case SID_ULINE_VAL_DOTTED: + { + if( aAttrSet.GetItemState( EE_CHAR_UNDERLINE ) >= SfxItemState::DEFAULT ) + { + FontLineStyle eLineStyle = aAttrSet.Get(EE_CHAR_UNDERLINE).GetLineStyle(); + + switch (nSlotId) + { + case SID_ULINE_VAL_NONE: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_NONE)); + break; + case SID_ULINE_VAL_SINGLE: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_SINGLE)); + break; + case SID_ULINE_VAL_DOUBLE: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOUBLE)); + break; + case SID_ULINE_VAL_DOTTED: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOTTED)); + break; + } + } + } + break; + + case SID_GROW_FONT_SIZE: + case SID_SHRINK_FONT_SIZE: + { + // todo + } + break; + + case SID_THES: + { + if (mpView->GetTextEditOutlinerView()) + { + EditView & rEditView = mpView->GetTextEditOutlinerView()->GetEditView(); + OUString aStatusVal; + LanguageType nLang = LANGUAGE_NONE; + bool bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, rEditView ); + rSet.Put( SfxStringItem( SID_THES, aStatusVal ) ); + + // disable "Thesaurus" context menu entry if there is nothing to look up + uno::Reference< linguistic2::XThesaurus > xThes( LinguMgr::GetThesaurus() ); + if (!bIsLookUpWord || + !xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( LanguageTag( nLang). getLocale() )) + rSet.DisableItem( SID_THES ); + } + else + { + rSet.DisableItem( SID_THES ); + } + } + break; + + default: + break; + } + + nWhich = aIter.NextWhich(); + } + + rSet.Put( aAttrSet, false ); // <- sal_False, so DontCare-Status gets acquired + + // these are disabled in outline-mode + if (!mpViewShell || dynamic_cast< const DrawViewShell *>( mpViewShell ) == nullptr) + { + rSet.DisableItem( SID_ATTR_PARA_ADJUST_LEFT ); + rSet.DisableItem( SID_ATTR_PARA_ADJUST_RIGHT ); + rSet.DisableItem( SID_ATTR_PARA_ADJUST_CENTER ); + rSet.DisableItem( SID_ATTR_PARA_ADJUST_BLOCK ); + rSet.DisableItem( SID_ATTR_PARA_LINESPACE_10 ); + rSet.DisableItem( SID_ATTR_PARA_LINESPACE_15 ); + rSet.DisableItem( SID_ATTR_PARA_LINESPACE_20 ); + rSet.DisableItem( SID_DEC_INDENT ); + rSet.DisableItem( SID_INC_INDENT ); + rSet.DisableItem( SID_PARASPACE_INCREASE ); + rSet.DisableItem( SID_PARASPACE_DECREASE ); + rSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM ); + rSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT ); + rSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT ); + rSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT ); + } + else + { + // paragraph spacing + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + if( pOLV ) + { + ESelection aSel = pOLV->GetSelection(); + aSel.Adjust(); + sal_Int32 nStartPara = aSel.nStartPara; + sal_Int32 nEndPara = aSel.nEndPara; + if( !aSel.HasRange() ) + { + nStartPara = 0; + nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1; + } + ::tools::Long nUpper = 0; + + for( sal_Int32 nPara = nStartPara; nPara <= nEndPara; nPara++ ) + { + const SfxItemSet& rItems = pOLV->GetOutliner()->GetParaAttribs( nPara ); + const SvxULSpaceItem& rItem = rItems.Get( EE_PARA_ULSPACE ); + nUpper = std::max( nUpper, static_cast<::tools::Long>(rItem.GetUpper()) ); + } + if( nUpper == 0 ) + rSet.DisableItem( SID_PARASPACE_DECREASE ); + } + else + { + // never disabled at the moment! + //rSet.DisableItem( SID_PARASPACE_INCREASE ); + //rSet.DisableItem( SID_PARASPACE_DECREASE ); + } + + // paragraph justification + const SvxLRSpaceItem& aLR = aAttrSet.Get( EE_PARA_LRSPACE ); + rSet.Put(aLR); + SvxAdjust eAdj = aAttrSet.Get( EE_PARA_JUST ).GetAdjust(); + switch( eAdj ) + { + case SvxAdjust::Left: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, false ) ); + break; + case SvxAdjust::Center: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, false ) ); + break; + case SvxAdjust::Right: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, false ) ); + break; + case SvxAdjust::Block: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, false ) ); + break; + default: + break; + } + + Invalidate(SID_ATTR_PARA_ADJUST_LEFT); + Invalidate(SID_ATTR_PARA_ADJUST_CENTER); + Invalidate(SID_ATTR_PARA_ADJUST_RIGHT); + Invalidate(SID_ATTR_PARA_ADJUST_BLOCK); + Invalidate(SID_ATTR_PARA_LINESPACE); + Invalidate(SID_ATTR_PARA_ULSPACE); + + // paragraph text direction + if( bDisableParagraphTextDirection ) + { + rSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT ); + rSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT ); + } + else + { + switch( aAttrSet.Get( EE_PARA_WRITINGDIR ).GetValue() ) + { + case SvxFrameDirection::Vertical_LR_TB: + case SvxFrameDirection::Vertical_RL_TB: + { + rSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT ); + rSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT ); + } + break; + + case SvxFrameDirection::Horizontal_LR_TB: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, false ) ); + break; + + case SvxFrameDirection::Horizontal_RL_TB: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, true ) ); + break; + + // The case for the superordinate object is missing. + case SvxFrameDirection::Environment: + { + SdDrawDocument& rDoc = mpView->GetDoc(); + css::text::WritingMode eMode = rDoc.GetDefaultWritingMode(); + bool bIsLeftToRight(false); + + if(css::text::WritingMode_LR_TB == eMode + || css::text::WritingMode_TB_RL == eMode) + { + bIsLeftToRight = true; + } + + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, bIsLeftToRight ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, !bIsLeftToRight ) ); + } + break; + default: break; + } + } + + SvxLRSpaceItem aLRSpace = aAttrSet.Get( EE_PARA_LRSPACE ); + aLRSpace.SetWhich(SID_ATTR_PARA_LRSPACE); + rSet.Put(aLRSpace); + Invalidate(SID_ATTR_PARA_LRSPACE); + + //Added by xuxu + SfxItemState eState = aAttrSet.GetItemState( EE_PARA_LRSPACE ); + if ( eState == SfxItemState::DONTCARE ) + { + rSet.InvalidateItem(EE_PARA_LRSPACE); + rSet.InvalidateItem(SID_ATTR_PARA_LRSPACE); + } + sal_uInt16 nLineSpace = aAttrSet.Get( EE_PARA_SBL ).GetPropLineSpace(); + switch( nLineSpace ) + { + case 100: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, false ) ); + break; + case 150: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, false ) ); + break; + case 200: + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, true ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, false ) ); + rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, false ) ); + break; + } + } + + // justification (superscript, subscript) is also needed in outline-mode + SvxEscapement eEsc = static_cast(aAttrSet.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + rSet.Put(SfxBoolItem(SID_SET_SUPER_SCRIPT, eEsc == SvxEscapement::Superscript)); + rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT, eEsc == SvxEscapement::Subscript)); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drtxtob1.cxx b/sd/source/ui/view/drtxtob1.cxx new file mode 100644 index 0000000000..b176db5596 --- /dev/null +++ b/sd/source/ui/view/drtxtob1.cxx @@ -0,0 +1,803 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace sd { + +/** + * Process SfxRequests + */ + +void TextObjectBar::Execute( SfxRequest &rReq ) +{ + const SfxItemSet* pArgs = rReq.GetArgs(); + sal_uInt16 nSlot = rReq.GetSlot(); + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + std::unique_ptr> aGuard; + + assert(mpViewShell); + + if (OutlineView* pOView = dynamic_cast(mpView)) + { + pOLV = pOView->GetViewByWindow(mpViewShell->GetActiveWindow()); + aGuard.reset( new OutlineViewModelChangeGuard( static_cast(*mpView) ) ); + } + + switch (nSlot) + { + case SID_STYLE_APPLY: + { + if( pArgs ) + { + SdDrawDocument& rDoc = mpView->GetDoc(); + assert(mpViewShell->GetViewShell()); + rtl::Reference xFunc( FuTemplate::Create( mpViewShell, static_cast< ::sd::Window*>( mpViewShell->GetViewShell()->GetWindow()), mpView, &rDoc, rReq ) ); + + if(xFunc.is()) + { + xFunc->Activate(); + xFunc->Deactivate(); + + if( rReq.GetSlot() == SID_STYLE_APPLY ) + { + if (mpViewShell->GetViewFrame()) + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY ); + } + } + } + else + { + if (mpViewShell->GetViewFrame()) + mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SfxCallMode::ASYNCHRON ); + } + + rReq.Done(); + } + break; + + case SID_INC_INDENT: + case SID_DEC_INDENT: + { + if( pOLV ) + { + ESelection aSel = pOLV->GetSelection(); + aSel.Adjust(); + sal_Int32 nStartPara = aSel.nStartPara; + sal_Int32 nEndPara = aSel.nEndPara; + if( !aSel.HasRange() ) + { + nStartPara = 0; + nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1; + } + + pOLV->GetOutliner()->UndoActionStart( OLUNDO_ATTR ); + for( sal_Int32 nPara = nStartPara; nPara <= nEndPara; nPara++ ) + { + SfxStyleSheet* pStyleSheet = nullptr; + if (pOLV->GetOutliner() != nullptr) + pStyleSheet = pOLV->GetOutliner()->GetStyleSheet(nPara); + if (pStyleSheet != nullptr) + { + SfxItemSet aAttr( pStyleSheet->GetItemSet() ); + SfxItemSet aTmpSet( pOLV->GetOutliner()->GetParaAttribs( nPara ) ); + aAttr.Put( aTmpSet, false ); + const SvxLRSpaceItem& rItem = aAttr.Get( EE_PARA_LRSPACE ); + std::unique_ptr pNewItem(rItem.Clone()); + + ::tools::Long nLeft = pNewItem->GetLeft(); + if( nSlot == SID_INC_INDENT ) + nLeft += 1000; + else + { + nLeft -= 1000; + nLeft = std::max<::tools::Long>( nLeft, 0 ); + } + pNewItem->SetLeftValue( static_cast(nLeft) ); + + SfxItemSet aNewAttrs( aAttr ); + aNewAttrs.Put( std::move(pNewItem) ); + pOLV->GetOutliner()->SetParaAttribs( nPara, aNewAttrs ); + } + } + pOLV->GetOutliner()->UndoActionEnd(); + mpViewShell->Invalidate( SID_UNDO ); + } + rReq.Done(); + + Invalidate(); + // to refresh preview (in outline mode), slot has to be invalidated: + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + + } + break; + + case SID_PARASPACE_INCREASE: + case SID_PARASPACE_DECREASE: + { + if( pOLV ) + { + ESelection aSel = pOLV->GetSelection(); + aSel.Adjust(); + sal_Int32 nStartPara = aSel.nStartPara; + sal_Int32 nEndPara = aSel.nEndPara; + if( !aSel.HasRange() ) + { + nStartPara = 0; + nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1; + } + + pOLV->GetOutliner()->UndoActionStart( OLUNDO_ATTR ); + for( sal_Int32 nPara = nStartPara; nPara <= nEndPara; nPara++ ) + { + SfxStyleSheet* pStyleSheet = nullptr; + if (pOLV->GetOutliner() != nullptr) + pStyleSheet = pOLV->GetOutliner()->GetStyleSheet(nPara); + if (pStyleSheet != nullptr) + { + SfxItemSet aAttr( pStyleSheet->GetItemSet() ); + SfxItemSet aTmpSet( pOLV->GetOutliner()->GetParaAttribs( nPara ) ); + aAttr.Put( aTmpSet, false ); // sal_False= InvalidItems is not default, handle it as "holes" + const SvxULSpaceItem& rItem = aAttr.Get( EE_PARA_ULSPACE ); + std::unique_ptr pNewItem(rItem.Clone()); + + ::tools::Long nUpper = pNewItem->GetUpper(); + if( nSlot == SID_PARASPACE_INCREASE ) + nUpper += 100; + else + { + nUpper -= 100; + nUpper = std::max<::tools::Long>( nUpper, 0 ); + } + pNewItem->SetUpper( static_cast(nUpper) ); + + ::tools::Long nLower = pNewItem->GetLower(); + if( nSlot == SID_PARASPACE_INCREASE ) + nLower += 100; + else + { + nLower -= 100; + nLower = std::max<::tools::Long>( nLower, 0 ); + } + pNewItem->SetLower( static_cast(nLower) ); + + SfxItemSet aNewAttrs( aAttr ); + aNewAttrs.Put( std::move(pNewItem) ); + pOLV->GetOutliner()->SetParaAttribs( nPara, aNewAttrs ); + } + } + pOLV->GetOutliner()->UndoActionEnd(); + mpViewShell->Invalidate( SID_UNDO ); + } + else + { + // the following code could be enabled, if I get a correct + // DontCare status from JOE. + + // gets enabled, through it doesn't really work (see above) + SfxItemSet aEditAttr( mpView->GetDoc().GetPool() ); + mpView->GetAttributes( aEditAttr ); + if( aEditAttr.GetItemState( EE_PARA_ULSPACE ) >= SfxItemState::DEFAULT ) + { + SfxItemSet aNewAttrs(*(aEditAttr.GetPool()), aEditAttr.GetRanges()); + const SvxULSpaceItem& rItem = aEditAttr.Get( EE_PARA_ULSPACE ); + std::unique_ptr pNewItem(rItem.Clone()); + ::tools::Long nUpper = pNewItem->GetUpper(); + + if( nSlot == SID_PARASPACE_INCREASE ) + nUpper += 100; + else + { + nUpper -= 100; + nUpper = std::max<::tools::Long>( nUpper, 0 ); + } + pNewItem->SetUpper( static_cast(nUpper) ); + + ::tools::Long nLower = pNewItem->GetLower(); + if( nSlot == SID_PARASPACE_INCREASE ) + nLower += 100; + else + { + nLower -= 100; + nLower = std::max<::tools::Long>( nLower, 0 ); + } + pNewItem->SetLower( static_cast(nLower) ); + + aNewAttrs.Put( std::move(pNewItem) ); + + mpView->SetAttributes( aNewAttrs ); + } + } + rReq.Done(); + + Invalidate(); + // to refresh preview (in outline mode), slot has to be invalidated: + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_PARA_ULSPACE, true ); + } + break; + + case SID_OUTLINE_LEFT: + { + if (pOLV) + { + pOLV->AdjustDepth( -1 ); + + // Ensure bold/italic etc. icon state updates + Invalidate(); + // trigger preview refresh + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + } + rReq.Done(); + } + break; + + case SID_OUTLINE_RIGHT: + { + if (pOLV) + { + pOLV->AdjustDepth( 1 ); + + // Ensure bold/italic etc. icon state updates + Invalidate(); + // trigger preview refresh + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + } + rReq.Done(); + } + break; + + case SID_ATTR_PARA_LRSPACE: + { + SvxLRSpaceItem aLRSpace = static_cast(pArgs->Get( + SID_ATTR_PARA_LRSPACE)); + + SfxItemSetFixed aEditAttr( GetPool() ); + aLRSpace.SetWhich( EE_PARA_LRSPACE ); + + aEditAttr.Put( aLRSpace ); + mpView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_LRSPACE); + } + break; + + case SID_HANGING_INDENT: + { + SfxItemSetFixed aLRSpaceSet( GetPool() ); + mpView->GetAttributes( aLRSpaceSet ); + SvxLRSpaceItem aParaMargin( aLRSpaceSet.Get( EE_PARA_LRSPACE ) ); + + SvxLRSpaceItem aNewMargin( EE_PARA_LRSPACE ); + aNewMargin.SetTextLeft( aParaMargin.GetTextLeft() + aParaMargin.GetTextFirstLineOffset() ); + aNewMargin.SetRight( aParaMargin.GetRight() ); + aNewMargin.SetTextFirstLineOffset( ( aParaMargin.GetTextFirstLineOffset() ) * -1 ); + aLRSpaceSet.Put( aNewMargin ); + mpView->SetAttributes( aLRSpaceSet ); + + Invalidate(SID_ATTR_PARA_LRSPACE); + } + break; + + case SID_OUTLINE_UP: + { + if (pOLV) + { + pOLV->AdjustHeight( -1 ); + + // trigger preview refresh + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + } + rReq.Done(); + } + break; + + case SID_OUTLINE_DOWN: + { + if (pOLV) + { + pOLV->AdjustHeight( 1 ); + + // trigger preview refresh + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + } + rReq.Done(); + } + break; + + case SID_TEXTDIRECTION_LEFT_TO_RIGHT: + case SID_TEXTDIRECTION_TOP_TO_BOTTOM: + { + mpView->SdrEndTextEdit(); + // tdf#131571: SdrEndTextEdit invalidates pTextEditOutlinerView, the pointer retrieved for pOLV + // so reinitialize pOLV + pOLV=mpView->GetTextEditOutlinerView(); + SfxItemSetFixed aAttr( mpView->GetDoc().GetPool() ); + aAttr.Put( SvxWritingModeItem( + nSlot == SID_TEXTDIRECTION_LEFT_TO_RIGHT ? + css::text::WritingMode_LR_TB : css::text::WritingMode_TB_RL, + SDRATTR_TEXTDIRECTION ) ); + rReq.Done( aAttr ); + mpView->SetAttributes( aAttr ); + Invalidate(); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + } + break; + + case FN_NUM_BULLET_ON: + { + if (pOLV) + { + bool bMasterPage = false; + SdrPageView* pPageView = mpView->GetSdrPageView(); + if (pPageView) + { + SdPage* pPage = static_cast(pPageView->GetPage()); + bMasterPage = pPage && (pPage->GetPageKind() == PageKind::Standard) && pPage->IsMasterPage(); + } + + if (!bMasterPage) + pOLV->ToggleBullets(); + else + { + //Resolves: fdo#78151 in master pages if we toggle bullets on + //and off then just disable/enable the bulleting, but do not + //change the *level* of the paragraph, because the paragraph is + //effectively a preview of the equivalent style level, and + //changing the level disconnects it from the style + + ::Outliner* pOL = pOLV->GetOutliner(); + if (pOL) + { + const SvxNumBulletItem *pItem = nullptr; + SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool(); + OUString sStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " 1"); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find(sStyleName, SfxStyleFamily::Pseudo); + if( pFirstStyleSheet ) + pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false); + + if (pItem ) + { + SvxNumRule aNewRule(pItem->GetNumRule()); + ESelection aSel = pOLV->GetSelection(); + aSel.Adjust(); + sal_Int32 nStartPara = aSel.nStartPara; + sal_Int32 nEndPara = aSel.nEndPara; + for (sal_Int32 nPara = nStartPara; nPara <= nEndPara; ++nPara) + { + sal_uInt16 nLevel = pOL->GetDepth(nPara); + SvxNumberFormat aFmt(aNewRule.GetLevel(nLevel)); + + if (aFmt.GetNumberingType() == SVX_NUM_NUMBER_NONE) + { + aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL); + SdStyleSheetPool::setDefaultOutlineNumberFormatBulletAndIndent(nLevel, aFmt); + } + else + { + aFmt.SetNumberingType(SVX_NUM_NUMBER_NONE); + aFmt.SetAbsLSpace(0); + aFmt.SetFirstLineOffset(0); + } + + aNewRule.SetLevel(nLevel, aFmt); + } + + pFirstStyleSheet->GetItemSet().Put(SvxNumBulletItem(std::move(aNewRule), EE_PARA_NUMBULLET)); + + SdStyleSheet::BroadcastSdStyleSheetChange(pFirstStyleSheet, PresentationObjects::Outline_1, pSSPool); + } + } + } + } + break; + } + case SID_GROW_FONT_SIZE: + case SID_SHRINK_FONT_SIZE: + { + const SvxFontListItem* pFonts = static_cast(mpViewShell->GetDocSh()->GetItem( SID_ATTR_CHAR_FONTLIST )); + const FontList* pFontList = pFonts ? pFonts->GetFontList(): nullptr; + if( pFontList ) + { + FuText::ChangeFontSize( nSlot == SID_GROW_FONT_SIZE, pOLV, pFontList, mpView ); + if( pOLV ) + pOLV->SetAttribs( pOLV->GetEditView().GetEmptyItemSet() ); + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT ); + } + rReq.Done(); + } + break; + + case SID_THES: + { + OUString aReplaceText; + const SfxStringItem* pItem2 = rReq.GetArg(FN_PARAM_THES_WORD_REPLACE); + if (pItem2) + aReplaceText = pItem2->GetValue(); + if (!aReplaceText.isEmpty()) + ReplaceTextWithSynonym( pOLV->GetEditView(), aReplaceText ); + } + break; + + default: + { + SfxItemSet aEditAttr( mpView->GetDoc().GetPool() ); + mpView->GetAttributes( aEditAttr ); + SfxItemSet aNewAttr(*(aEditAttr.GetPool()), aEditAttr.GetRanges()); + + if( !pArgs ) + { + //aNewAttr.InvalidateAllItems(); <- produces problems (#35465#) + + switch ( nSlot ) + { + case SID_ATTR_CHAR_WEIGHT: + { + FontWeight eFW = aEditAttr.Get( EE_CHAR_WEIGHT ).GetWeight(); + aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? + WEIGHT_BOLD : WEIGHT_NORMAL, + EE_CHAR_WEIGHT ) ); + } + break; + case SID_ATTR_CHAR_POSTURE: + { + FontItalic eFI = aEditAttr.Get( EE_CHAR_ITALIC ).GetPosture(); + aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? + ITALIC_NONE : ITALIC_NORMAL, + EE_CHAR_ITALIC ) ); + } + break; + case SID_ATTR_CHAR_UNDERLINE: + { + FontLineStyle eFU = aEditAttr.Get( EE_CHAR_UNDERLINE ).GetLineStyle(); + aNewAttr.Put( SvxUnderlineItem( eFU == LINESTYLE_SINGLE ? + LINESTYLE_NONE : LINESTYLE_SINGLE, + EE_CHAR_UNDERLINE ) ); + } + break; + + case SID_ULINE_VAL_NONE: + { + aNewAttr.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE)); + break; + } + + case SID_ULINE_VAL_SINGLE: + case SID_ULINE_VAL_DOUBLE: + case SID_ULINE_VAL_DOTTED: + { + FontLineStyle eOld = aEditAttr.Get(EE_CHAR_UNDERLINE).GetLineStyle(); + FontLineStyle eNew = eOld; + + switch (nSlot) + { + case SID_ULINE_VAL_SINGLE: + eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE; + break; + case SID_ULINE_VAL_DOUBLE: + eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE; + break; + case SID_ULINE_VAL_DOTTED: + eNew = ( eOld == LINESTYLE_DOTTED ) ? LINESTYLE_NONE : LINESTYLE_DOTTED; + break; + } + + SvxUnderlineItem aUnderline(eNew, EE_CHAR_UNDERLINE); + aNewAttr.Put(aUnderline); + } + break; + + case SID_ATTR_CHAR_OVERLINE: + { + FontLineStyle eFO = aEditAttr.Get( EE_CHAR_OVERLINE ).GetLineStyle(); + aNewAttr.Put( SvxOverlineItem( eFO == LINESTYLE_SINGLE ? + LINESTYLE_NONE : LINESTYLE_SINGLE, + EE_CHAR_OVERLINE ) ); + } + break; + case SID_ATTR_CHAR_CONTOUR: + { + aNewAttr.Put( SvxContourItem( !aEditAttr.Get( EE_CHAR_OUTLINE ).GetValue(), EE_CHAR_OUTLINE ) ); + } + break; + case SID_ATTR_CHAR_SHADOWED: + { + aNewAttr.Put( SvxShadowedItem( !aEditAttr.Get( EE_CHAR_SHADOW ).GetValue(), EE_CHAR_SHADOW ) ); + } + break; + case SID_ATTR_CHAR_CASEMAP: + { + aNewAttr.Put( aEditAttr.Get( EE_CHAR_CASEMAP ) ); + } + break; + case SID_ATTR_CHAR_STRIKEOUT: + { + FontStrikeout eFSO = aEditAttr.Get( EE_CHAR_STRIKEOUT ).GetStrikeout(); + aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? + STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) ); + } + break; + + case SID_ATTR_PARA_ADJUST_LEFT: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_ADJUST_CENTER: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_ADJUST_RIGHT: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_ADJUST_BLOCK: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Block, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_LINESPACE_10: + { + SvxLineSpacingItem aItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL ); + aItem.SetPropLineSpace( 100 ); + aNewAttr.Put( aItem ); + } + break; + case SID_ATTR_PARA_LINESPACE_15: + { + SvxLineSpacingItem aItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL ); + aItem.SetPropLineSpace( 150 ); + aNewAttr.Put( aItem ); + } + break; + case SID_ATTR_PARA_LINESPACE_20: + { + SvxLineSpacingItem aItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL ); + aItem.SetPropLineSpace( 200 ); + aNewAttr.Put( aItem ); + } + break; + case SID_SET_SUPER_SCRIPT: + { + SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT ); + SvxEscapement eEsc = static_cast(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + + if( eEsc == SvxEscapement::Superscript ) + aItem.SetEscapement( SvxEscapement::Off ); + else + aItem.SetEscapement( SvxEscapement::Superscript ); + aNewAttr.Put( aItem ); + } + break; + case SID_SET_SUB_SCRIPT: + { + SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT ); + SvxEscapement eEsc = static_cast(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + + if( eEsc == SvxEscapement::Subscript ) + aItem.SetEscapement( SvxEscapement::Off ); + else + aItem.SetEscapement( SvxEscapement::Subscript ); + aNewAttr.Put( aItem ); + } + break; + + // attributes for TextObjectBar + case SID_ATTR_CHAR_FONT: + mpViewShell->GetViewFrame()->GetDispatcher()-> + Execute( SID_CHAR_DLG, SfxCallMode::ASYNCHRON ); + break; + case SID_ATTR_CHAR_FONTHEIGHT: + mpViewShell->GetViewFrame()->GetDispatcher()-> + Execute( SID_CHAR_DLG, SfxCallMode::ASYNCHRON ); + break; + case SID_ATTR_CHAR_COLOR: + break; +// #i35937# removed need for FN_NUM_BULLET_ON handling + } + + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + } + else if ( nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT || + nSlot == SID_ATTR_PARA_RIGHT_TO_LEFT ) + { + bool bLeftToRight = nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT; + + SvxAdjust nAdjust = SvxAdjust::Left; + if( const SvxAdjustItem* pAdjustItem = aEditAttr.GetItemIfSet(EE_PARA_JUST) ) + nAdjust = pAdjustItem->GetAdjust(); + + if( bLeftToRight ) + { + aNewAttr.Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR ) ); + if( nAdjust == SvxAdjust::Right ) + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST ) ); + } + else + { + aNewAttr.Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_RL_TB, EE_PARA_WRITINGDIR ) ); + if( nAdjust == SvxAdjust::Left ) + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) ); + } + + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + + Invalidate( SID_RULER_TEXT_RIGHT_TO_LEFT ); + } + else if ( nSlot == SID_ATTR_CHAR_FONT || + nSlot == SID_ATTR_CHAR_FONTHEIGHT || + nSlot == SID_ATTR_CHAR_POSTURE || + nSlot == SID_ATTR_CHAR_WEIGHT ) + { + // #i78017 establish the same behaviour as in Writer + SvtScriptType nScriptType = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX; + if (nSlot == SID_ATTR_CHAR_FONT) + nScriptType = mpView->GetScriptType(); + + SfxItemPool& rPool = mpView->GetDoc().GetPool(); + SvxScriptSetItem aSvxScriptSetItem( nSlot, rPool ); + aSvxScriptSetItem.PutItemForScriptType( nScriptType, pArgs->Get( rPool.GetWhich( nSlot ) ) ); + aNewAttr.Put( aSvxScriptSetItem.GetItemSet() ); + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + } + else if (nSlot == SID_ATTR_PARA_ADJUST_LEFT || + nSlot == SID_ATTR_PARA_ADJUST_CENTER || + nSlot == SID_ATTR_PARA_ADJUST_RIGHT || + nSlot == SID_ATTR_PARA_ADJUST_BLOCK) + { + switch( nSlot ) + { + case SID_ATTR_PARA_ADJUST_LEFT: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_ADJUST_CENTER: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_ADJUST_RIGHT: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) ); + } + break; + case SID_ATTR_PARA_ADJUST_BLOCK: + { + aNewAttr.Put( SvxAdjustItem( SvxAdjust::Block, EE_PARA_JUST ) ); + } + break; + } + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + } + else if(nSlot == SID_ATTR_CHAR_KERNING) + { + aNewAttr.Put(pArgs->Get(pArgs->GetPool()->GetWhich(nSlot))); + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + } + else if(nSlot == SID_SET_SUPER_SCRIPT ) + { + SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT); + SvxEscapement eEsc = static_cast(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + + if( eEsc == SvxEscapement::Superscript ) + aItem.SetEscapement( SvxEscapement::Off ); + else + aItem.SetEscapement( SvxEscapement::Superscript ); + aNewAttr.Put( aItem ); + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + } + else if( nSlot == SID_SET_SUB_SCRIPT ) + { + SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT); + SvxEscapement eEsc = static_cast(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + + if( eEsc == SvxEscapement::Subscript ) + aItem.SetEscapement( SvxEscapement::Off ); + else + aItem.SetEscapement( SvxEscapement::Subscript ); + aNewAttr.Put( aItem ); + rReq.Done( aNewAttr ); + pArgs = rReq.GetArgs(); + } + + std::unique_ptr pNewArgs = pArgs->Clone(); + mpView->SetAttributes(*pNewArgs); + + // invalidate entire shell because of performance and + // extension reasons + Invalidate(); + + // to refresh preview (in outline mode), slot has to be invalidated: + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true ); + } + break; + } + + if ( nSlot != SID_STYLE_APPLY && pOLV ) + { + pOLV->ShowCursor(); + pOLV->GetWindow()->GrabFocus(); + } + + Invalidate( SID_OUTLINE_LEFT ); + Invalidate( SID_OUTLINE_RIGHT ); + Invalidate( SID_OUTLINE_UP ); + Invalidate( SID_OUTLINE_DOWN ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews1.cxx b/sd/source/ui/view/drviews1.cxx new file mode 100644 index 0000000000..a48ab7a115 --- /dev/null +++ b/sd/source/ui/view/drviews1.cxx @@ -0,0 +1,1382 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + +void DrawViewShell::Activate(bool bIsMDIActivate) +{ + ViewShell::Activate(bIsMDIActivate); + + // tdf#150773: do not grab focus on loading + if (mbFirstTimeActivation) + mbFirstTimeActivation = false; + else + { + + // When the mode is switched to normal the main view shell grabs focus. + // This is done for getting cut/copy/paste commands on slides in the left + // pane (slide sorter view shell) to work properly. + SfxShell* pTopViewShell = GetViewShellBase().GetViewShellManager()->GetTopViewShell(); + if (pTopViewShell == this) + { + GetActiveWindow()->GrabFocus(); + } + } +} + +void DrawViewShell::UIActivating( SfxInPlaceClient* pCli ) +{ + ViewShell::UIActivating(pCli); + + // Disable own controls + maTabControl->Disable(); + if (GetLayerTabControl() != nullptr) + GetLayerTabControl()->Disable(); +} + +void DrawViewShell::UIDeactivated( SfxInPlaceClient* pCli ) +{ + // Enable own controls + maTabControl->Enable(); + if (GetLayerTabControl() != nullptr) + GetLayerTabControl()->Enable(); + + ViewShell::UIDeactivated(pCli); +} + +void DrawViewShell::Deactivate(bool bIsMDIActivate) +{ + // Temporarily disable context broadcasting while the Deactivate() + // call is forwarded to our base class. + const bool bIsContextBroadcasterEnabled (SfxShell::SetContextBroadcasterEnabled(false)); + + ViewShell::Deactivate(bIsMDIActivate); + + SfxShell::SetContextBroadcasterEnabled(bIsContextBroadcasterEnabled); +} + +namespace +{ + class LockUI + { + private: + void Lock(bool bLock); + SfxViewFrame *mpFrame; + public: + explicit LockUI(SfxViewFrame *pFrame) : mpFrame(pFrame) { Lock(true); } + ~LockUI() { Lock(false); } + + }; + + void LockUI::Lock(bool bLock) + { + if (!mpFrame) + return; + mpFrame->Enable( !bLock ); + } +} + +/** + * Called, if state of selection of view is changed + */ + +void DrawViewShell::SelectionHasChanged() +{ + Invalidate(); + + //Update3DWindow(); // 3D-Controller + SfxBoolItem aItem( SID_3D_STATE, true ); + GetViewFrame()->GetDispatcher()->ExecuteList( + SID_3D_STATE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem }); + + SdrOle2Obj* pOleObj = nullptr; + + if ( mpDrawView->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nSdrObjKind = pObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2) + { + pOleObj = static_cast(pObj); + UpdateIMapDlg( pObj ); + } + else if (nSdrObjKind == SdrObjKind::Graphic) + UpdateIMapDlg( pObj ); + } + } + + ViewShellBase& rBase = GetViewShellBase(); + rBase.SetVerbs( uno::Sequence< embed::VerbDescriptor >() ); + + try + { + Client* pIPClient = static_cast(rBase.GetIPClient()); + if ( pIPClient && pIPClient->IsObjectInPlaceActive() ) + { + // as appropriate take ole-objects into account and deactivate + + // this means we recently deselected an inplace active ole object so + // we need to deselect it now + if (!pOleObj) + { + //#i47279# disable frame until after object has completed unload + LockUI aUILock(GetViewFrame()); + pIPClient->DeactivateObject(); + //HMHmpDrView->ShowMarkHdl(); + } + else + { + const uno::Reference < embed::XEmbeddedObject >& xObj = pOleObj->GetObjRef(); + if ( xObj.is() ) + { + rBase.SetVerbs( xObj->getSupportedVerbs() ); + } + else + { + rBase.SetVerbs( uno::Sequence < embed::VerbDescriptor >() ); + } + } + } + else + { + if ( pOleObj ) + { + const uno::Reference < embed::XEmbeddedObject >& xObj = pOleObj->GetObjRef(); + if ( xObj.is() ) + { + rBase.SetVerbs( xObj->getSupportedVerbs() ); + } + else + { + rBase.SetVerbs( uno::Sequence < embed::VerbDescriptor >() ); + } + } + else + { + rBase.SetVerbs( uno::Sequence < embed::VerbDescriptor >() ); + } + } + } + catch( css::uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "sd::DrawViewShell::SelectionHasChanged()" ); + } + + if( HasCurrentFunction() ) + { + GetCurrentFunction()->SelectionHasChanged(); + } + else + { + GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView); + } + + // Invalidate for every subshell + GetViewShellBase().GetViewShellManager()->InvalidateAllSubShells(this); + + mpDrawView->UpdateSelectionClipboard(); + + GetViewShellBase().GetDrawController()->FireSelectionChangeListener(); +} + +namespace { + +void collectUIInformation(const OUString& aZoom) +{ + EventDescription aDescription; + aDescription.aID = "impress_win"; + aDescription.aParameters = {{"ZOOM", aZoom}}; + aDescription.aAction = "SET"; + aDescription.aKeyWord = "ImpressWindowUIObject"; + aDescription.aParent = "MainWindow"; + + UITestLogger::getInstance().logEvent(aDescription); +} + +} + +/** + * set zoom factor + */ +void DrawViewShell::SetZoom( ::tools::Long nZoom ) +{ + // Make sure that the zoom factor will not be recalculated on + // following window resizings. + mbZoomOnPage = false; + ViewShell::SetZoom( nZoom ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); + mpViewOverlayManager->onZoomChanged(); + collectUIInformation(OUString::number(nZoom)); +} + +/** + * Set zoom rectangle for active window + */ + +void DrawViewShell::SetZoomRect( const ::tools::Rectangle& rZoomRect ) +{ + ViewShell::SetZoomRect( rZoomRect ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); + mpViewOverlayManager->onZoomChanged(); +} + +/** + * PrepareClose, as appropriate end text input, so other viewshells + * discover a refreshed text object. + */ + +bool DrawViewShell::PrepareClose( bool bUI ) +{ + if ( !ViewShell::PrepareClose(bUI) ) + return false; + + if( HasCurrentFunction() ) + { + sal_uInt16 nID = GetCurrentFunction()->GetSlotID(); + if (nID == SID_TEXTEDIT || nID == SID_ATTR_CHAR) + { + mpDrawView->SdrEndTextEdit(); + } + } + + return true; +} + + +/** + * Set status (enabled/disabled) of menu SfxSlots + */ + +void DrawViewShell::ChangeEditMode(EditMode eEMode, bool bIsLayerModeActive) +{ + if (meEditMode == eEMode && mbIsLayerModeActive == bIsLayerModeActive) + return; + + ViewShellManager::UpdateLock aLock (GetViewShellBase().GetViewShellManager()); + + sal_uInt16 nActualPageId = maTabControl->GetPageId(0); + + if (mePageKind == PageKind::Handout) + { + // at handouts only allow MasterPage + eEMode = EditMode::MasterPage; + } + + GetViewShellBase().GetDrawController()->FireChangeEditMode (eEMode == EditMode::MasterPage); + GetViewShellBase().GetDrawController()->FireChangeLayerMode (bIsLayerModeActive); + + if ( mpDrawView->IsTextEdit() ) + { + // This exits the text edit mode when going in and out of window focus, which is not needed + // Let's keep this call as comment for now as it probably just needs a better conditional. + // mpDrawView->SdrEndTextEdit(); + } + + LayerTabBar* pLayerBar = GetLayerTabControl(); + if (pLayerBar != nullptr) + pLayerBar->EndEditMode(); + maTabControl->EndEditMode(); + + GetViewShellBase().GetDrawController()->BroadcastContextChange(); + + meEditMode = eEMode; + + if(pLayerBar) + { + // #i87182# only switch activation mode of LayerTabBar when there is one, + // else it will not get initialized with the current set of Layers as needed + mbIsLayerModeActive = bIsLayerModeActive; + } + + // Determine whether to show the master view toolbar. The master + // page mode has to be active and the shell must not be a handout + // view. + bool bShowMasterViewToolbar (meEditMode == EditMode::MasterPage + && GetShellType() != ViewShell::ST_HANDOUT); + bool bShowPresentationToolbar (meEditMode != EditMode::MasterPage + && GetShellType() != ViewShell::ST_HANDOUT + && GetShellType() != ViewShell::ST_DRAW); + + // If the master view toolbar is not shown we hide it before + // switching the edit mode. + if (::sd::ViewShell::mpImpl->mbIsInitialized + && IsMainViewShell()) + { + if ( !bShowMasterViewToolbar ) + GetViewShellBase().GetToolBarManager()->ResetToolBars(ToolBarManager::ToolBarGroup::MasterMode); + if ( !bShowPresentationToolbar ) + GetViewShellBase().GetToolBarManager()->ResetToolBars(ToolBarManager::ToolBarGroup::CommonTask); + } + + ConfigureAppBackgroundColor(); + + // tdf#87638 - change slide pane title according to the edit mode + auto setLeftPaneTitleIfPaneExists + = [pViewShell = GetViewFrame()](sal_uInt16 nId, TranslateId aId) + { + if (auto* pChildWindow = pViewShell->GetChildWindow(nId)) + if (auto* pTitledDockingWindow + = static_cast(pChildWindow->GetWindow())) + pTitledDockingWindow->SetTitle(SdResId(aId)); + }; + + if (meEditMode == EditMode::Page) + { + /****************************************************************** + * PAGEMODE + ******************************************************************/ + + maTabControl->Clear(); + + // tdf#87638 - change slide pane title according to the edit mode + setLeftPaneTitleIfPaneExists(SID_LEFT_PANE_DRAW, STR_LEFT_PANE_DRAW_TITLE); + setLeftPaneTitleIfPaneExists(SID_LEFT_PANE_IMPRESS, STR_LEFT_PANE_IMPRESS_TITLE); + + SdPage* pPage; + sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind); + + for (sal_uInt16 i = 0; i < nPageCnt; i++) + { + pPage = GetDoc()->GetSdPage(i, mePageKind); + OUString aPageName = pPage->GetName(); + maTabControl->InsertPage(pPage->getPageId(), aPageName); + + if ( !comphelper::LibreOfficeKit::isActive() && pPage->IsSelected() ) + { + nActualPageId = pPage->getPageId(); + } + } + + maTabControl->SetCurPageId(nActualPageId); + + SwitchPage(maTabControl->GetPagePos(nActualPageId)); + + //tdf#102343 re-enable common undo on switch back from master mode + mpDrawView->GetModel().SetDisableTextEditUsesCommonUndoManager(false); + } + else + { + /****************************************************************** + * MASTERPAGE + ******************************************************************/ + GetViewFrame()->SetChildWindow( + AnimationChildWindow::GetChildWindowId(), false ); + + // tdf#87638 - change slide pane title according to the edit mode + setLeftPaneTitleIfPaneExists(SID_LEFT_PANE_DRAW, STR_LEFT_PANE_DRAW_TITLE_MASTER); + setLeftPaneTitleIfPaneExists(SID_LEFT_PANE_IMPRESS, STR_LEFT_PANE_IMPRESS_TITLE_MASTER); + + if (comphelper::LibreOfficeKit::isActive()) + GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + ".uno:SlideMasterPage=true"_ostr); + if (!mpActualPage) + { + // as long as there is no mpActualPage, take first + mpActualPage = GetDoc()->GetSdPage(0, mePageKind); + } + + maTabControl->Clear(); + sal_uInt16 nActualMasterPageId = maTabControl->GetPageId(0); + sal_uInt16 nMasterPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind); + + for (sal_uInt16 i = 0; i < nMasterPageCnt; i++) + { + SdPage* pMaster = GetDoc()->GetMasterSdPage(i, mePageKind); + OUString aLayoutName = pMaster->GetLayoutName(); + sal_Int32 nPos = aLayoutName.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aLayoutName = aLayoutName.copy(0, nPos); + + maTabControl->InsertPage(pMaster->getPageId(), aLayoutName); + + if (&(mpActualPage->TRG_GetMasterPage()) == pMaster) + { + nActualMasterPageId = pMaster->getPageId(); + } + } + + maTabControl->SetCurPageId(nActualMasterPageId); + SwitchPage(maTabControl->GetPagePos(nActualMasterPageId)); + + //tdf#102343 changing attributes of textboxes in master typically + //changes the stylesheet they are linked to, so if the common + //undo manager is in use, those stylesheet changes are thrown + //away at present + mpDrawView->GetModel().SetDisableTextEditUsesCommonUndoManager(true); + } + + // If the master view toolbar is to be shown we turn it on after the + // edit mode has been changed. + if (::sd::ViewShell::mpImpl->mbIsInitialized && !sfx2::SfxNotebookBar::IsActive() + && IsMainViewShell()) + { + if (bShowMasterViewToolbar) + GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::MasterMode, + ToolBarManager::msMasterViewToolBar); + if (bShowPresentationToolbar) + GetViewShellBase().GetToolBarManager()->SetToolBar( + ToolBarManager::ToolBarGroup::CommonTask, + ToolBarManager::msCommonTaskToolBar); + } + + if ( ! mbIsLayerModeActive) + { + maTabControl->Show(); + // Set the tab control only for draw pages. For master page + // this has been done already above. + if (meEditMode == EditMode::Page) + maTabControl->SetCurPageId (nActualPageId); + } + + ResetActualLayer(); + + Invalidate( SID_PAGEMODE ); + Invalidate( SID_LAYERMODE ); + Invalidate( SID_MASTERPAGE ); + Invalidate( SID_DELETE_MASTER_PAGE ); + Invalidate( SID_DELETE_PAGE ); + Invalidate( SID_SLIDE_MASTER_MODE ); + Invalidate( SID_NOTES_MASTER_MODE ); + Invalidate( SID_HANDOUT_MASTER_MODE ); + InvalidateWindows(); + + if (sfx2::SfxNotebookBar::IsActive()) + UIFeatureChanged(); + + SetContextName(GetSidebarContextName()); + +} + +/** + * Generate horizontal ruler + */ + +VclPtr DrawViewShell::CreateHRuler (::sd::Window* pWin) +{ + VclPtr pRuler; + WinBits aWBits; + SvxRulerSupportFlags nFlags = SvxRulerSupportFlags::OBJECT; + + aWBits = WB_HSCROLL | WB_3DLOOK | WB_BORDER | WB_EXTRAFIELD; + nFlags |= SvxRulerSupportFlags::SET_NULLOFFSET | + SvxRulerSupportFlags::TABS | + SvxRulerSupportFlags::PARAGRAPH_MARGINS; // new + + pRuler = VclPtr::Create(*this, GetParentWindow(), pWin, nFlags, + GetViewFrame()->GetBindings(), aWBits); + + // Metric ... + sal_uInt16 nMetric = static_cast(GetDoc()->GetUIUnit()); + + if( nMetric == 0xffff ) + nMetric = static_cast(GetViewShellBase().GetViewFrame().GetDispatcher()->GetModule()->GetFieldUnit()); + + pRuler->SetUnit( FieldUnit( nMetric ) ); + + // ... and also set DefTab at the ruler + pRuler->SetDefTabDist( GetDoc()->GetDefaultTabulator() ); // new + + Fraction aUIScale(pWin->GetMapMode().GetScaleX()); + aUIScale *= GetDoc()->GetUIScale(); + pRuler->SetZoom(aUIScale); + + return pRuler; +} + +/** + * Generate vertical ruler + */ + +VclPtr DrawViewShell::CreateVRuler(::sd::Window* pWin) +{ + VclPtr pRuler; + WinBits aWBits = WB_VSCROLL | WB_3DLOOK | WB_BORDER; + SvxRulerSupportFlags nFlags = SvxRulerSupportFlags::OBJECT; + + pRuler = VclPtr::Create(*this, GetParentWindow(), pWin, nFlags, + GetViewFrame()->GetBindings(), aWBits); + + // Metric same as HRuler, use document setting + sal_uInt16 nMetric = static_cast(GetDoc()->GetUIUnit()); + + if( nMetric == 0xffff ) + nMetric = static_cast(GetViewShellBase().GetViewFrame().GetDispatcher()->GetModule()->GetFieldUnit()); + + pRuler->SetUnit( FieldUnit( nMetric ) ); + + Fraction aUIScale(pWin->GetMapMode().GetScaleY()); + aUIScale *= GetDoc()->GetUIScale(); + pRuler->SetZoom(aUIScale); + + return pRuler; +} + +/** + * Refresh horizontal ruler + */ + +void DrawViewShell::UpdateHRuler() +{ + Invalidate( SID_ATTR_LONG_LRSPACE ); + Invalidate( SID_RULER_PAGE_POS ); + Invalidate( SID_RULER_OBJECT ); + Invalidate( SID_RULER_TEXT_RIGHT_TO_LEFT ); + + if (mpHorizontalRuler) + mpHorizontalRuler->ForceUpdate(); +} + +/** + * Refresh vertical ruler + */ + +void DrawViewShell::UpdateVRuler() +{ + Invalidate( SID_ATTR_LONG_LRSPACE ); + Invalidate( SID_RULER_PAGE_POS ); + Invalidate( SID_RULER_OBJECT ); + + if (mpVerticalRuler) + mpVerticalRuler->ForceUpdate(); +} + +/** + * Refresh TabControl on splitter change + */ + +IMPL_LINK( DrawViewShell, TabSplitHdl, TabBar *, pTab, void ) +{ + const ::tools::Long nMax = maViewSize.Width() - maScrBarWH.Width() + - maTabControl->GetPosPixel().X() ; + + Size aTabSize = maTabControl->GetSizePixel(); + aTabSize.setWidth( std::min(pTab->GetSplitSize(), static_cast<::tools::Long>(nMax-1)) ); + + maTabControl->SetSizePixel(aTabSize); + + if(GetLayerTabControl()) // #i87182# + { + GetLayerTabControl()->SetSizePixel(aTabSize); + } + + Point aPos = maTabControl->GetPosPixel(); + aPos.AdjustX(aTabSize.Width() ); + + Size aScrSize(nMax - aTabSize.Width(), maScrBarWH.Height()); + mpHorizontalScrollBar->SetPosSizePixel(aPos, aScrSize); +} + +/// inherited from sd::ViewShell +SdPage* DrawViewShell::getCurrentPage() const +{ + const sal_uInt16 nPageCount = (meEditMode == EditMode::Page)? + GetDoc()->GetSdPageCount(mePageKind): + GetDoc()->GetMasterSdPageCount(mePageKind); + + sal_uInt16 nCurrentPage = maTabControl->GetCurPagePos(); + DBG_ASSERT((nCurrentPage= nPageCount) + nCurrentPage = 0; // play safe here + + if (meEditMode == EditMode::Page) + { + return GetDoc()->GetSdPage(nCurrentPage, mePageKind); + } + else // EditMode::MasterPage + { + return GetDoc()->GetMasterSdPage(nCurrentPage, mePageKind); + } +} + +/** + * Select new refreshed page, in case of a page order change (eg. by undo) + */ + +void DrawViewShell::ResetActualPage() +{ + if (!GetDoc()) + return; + + sal_uInt16 nCurrentPageId = maTabControl->GetCurPageId(); + sal_uInt16 nNewPageId; + sal_uInt16 nCurrentPageNum = maTabControl->GetPagePos(nCurrentPageId); + sal_uInt16 nPageCount = (meEditMode == EditMode::Page)?GetDoc()->GetSdPageCount(mePageKind):GetDoc()->GetMasterSdPageCount(mePageKind); + + if (meEditMode == EditMode::Page) + { + + // Update for TabControl + maTabControl->Clear(); + + SdPage* pPage = nullptr; + + for (sal_uInt16 i = 0; i < nPageCount; i++) + { + pPage = GetDoc()->GetSdPage(i, mePageKind); + OUString aPageName = pPage->GetName(); + maTabControl->InsertPage(pPage->getPageId(), aPageName); + + if (nCurrentPageId == pPage->getPageId()) + { + nCurrentPageNum = i; + GetDoc()->SetSelected(pPage, true); + } + else + GetDoc()->SetSelected(pPage, false); + } + + nNewPageId = maTabControl->GetPageId(nCurrentPageNum); + maTabControl->SetCurPageId(nNewPageId); + } + else // EditMode::MasterPage + { + maTabControl->Clear(); + + sal_uInt16 nMasterPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind); + for (sal_uInt16 i = 0; i < nMasterPageCnt; i++) + { + SdPage* pMaster = GetDoc()->GetMasterSdPage(i, mePageKind); + OUString aLayoutName = pMaster->GetLayoutName(); + sal_Int32 nPos = aLayoutName.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aLayoutName = aLayoutName.copy(0, nPos); + maTabControl->InsertPage(pMaster->getPageId(), aLayoutName); + + if (pMaster->getPageId() == nCurrentPageId) + nCurrentPageNum = i; + } + + nNewPageId = maTabControl->GetPageId(nCurrentPageNum); + maTabControl->SetCurPageId(nNewPageId); + SwitchPage(nCurrentPageNum); + } + + bool bAllowChangeFocus = nNewPageId != nCurrentPageId; + SfxBoolItem aI(SID_SWITCHPAGE, bAllowChangeFocus); + GetViewFrame()->GetDispatcher()->ExecuteList(SID_SWITCHPAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aI }); +} + +/** + * Apply "Verb" on OLE-object. + */ +ErrCode DrawViewShell::DoVerb(sal_Int32 nVerb) +{ + if ( mpDrawView->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nSdrObjKind = pObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2) + { + ActivateObject( static_cast(pObj), nVerb); + } + } + } + + return ERRCODE_NONE; +} + +/** + * Activate OLE-object + */ +bool DrawViewShell::ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb) +{ + bool bActivated = false; + + if ( !GetDocSh()->IsUIActive() ) + { + ToolBarManager::UpdateLock aLock (GetViewShellBase().GetToolBarManager()); + + bActivated = ViewShell::ActivateObject(pObj, nVerb); + } + + return bActivated; +} + +/** + * Mark the desired page as selected (1), deselected (0), toggle (2). + * nPage refers to the page in question. + */ +bool DrawViewShell::SelectPage(sal_uInt16 nPage, sal_uInt16 nSelect) +{ + SdPage* pPage = GetDoc()->GetSdPage(nPage, PageKind::Standard); + + //page selector marks pages to selected in view + auto &pageSelector = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase())->GetSlideSorter().GetController().GetPageSelector(); + + if (pPage) + { + if (nSelect == 0) + { + GetDoc()->SetSelected(pPage, false); // Deselect. + pageSelector.DeselectPage(nPage); + } + else if (nSelect == 1) + { + GetDoc()->SetSelected(pPage, true); // Select. + pageSelector.SelectPage(nPage); + } + else + { + // Toggle. + if (pPage->IsSelected()) + { + GetDoc()->SetSelected(pPage, false); + pageSelector.DeselectPage(nPage); + } + else + { + GetDoc()->SetSelected(pPage, true); + pageSelector.SelectPage(nPage); + } + } + return true; + } + + return false; +} + +bool DrawViewShell::IsSelected(sal_uInt16 nPage) +{ + slidesorter::SlideSorterViewShell* pVShell + = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase()); + if (pVShell != nullptr) + return pVShell->GetSlideSorter().GetController().GetPageSelector().IsPageSelected(nPage); + + return false; +} + +/** + * Switch to desired page. + * nSelectPage refers to the current EditMode + * bAllowChangeFocus set to false when slide is inserted before current page + * and we need to only update the current page number, + * do not disturb editing in that case + */ +bool DrawViewShell::SwitchPage(sal_uInt16 nSelectedPage, bool bAllowChangeFocus) +{ + /** Under some circumstances there are nested calls to SwitchPage() and + may crash the application (activation of form controls when the + shell of the edit view is not on top of the shell stack, see issue + 83888 for details.) Therefore the nested calls are ignored (they + would jump to the wrong page anyway.) + */ + + if (mbIsInSwitchPage) + return false; + mbIsInSwitchPage = true; + comphelper::ScopeGuard aGuard( + [this] () { this->mbIsInSwitchPage = false; } ); + + if (GetActiveWindow()->IsInPaint()) + { + // Switching the current page while a Paint is being executed is + // dangerous. So, post it for later execution and return. + maAsynchronousSwitchPageCall.Post( + [this, nSelectedPage] () { this->SwitchPage(nSelectedPage); } ); + return false; + } + + bool bOK = false; + + // With the current implementation of FuSlideShow there is a problem + // when it displays the show in a window: when the show is stopped it + // returns at one point in time SDRPAGE_NOTFOUND as current page index. + // Because FuSlideShow is currently being rewritten this bug is fixed + // here. + // This is not as bad a hack as it may look because making SwitchPage() + // more robust with respect to invalid page numbers is a good thing + // anyway. + if (nSelectedPage == SDRPAGE_NOTFOUND) + { + nSelectedPage = 0; + } + else + { + // Make sure that the given page index points to an existing page. Move + // the index into the valid range if necessary. + sal_uInt16 nPageCount = (meEditMode == EditMode::Page) + ? GetDoc()->GetSdPageCount(mePageKind) + : GetDoc()->GetMasterSdPageCount(mePageKind); + if (nSelectedPage >= nPageCount) + nSelectedPage = nPageCount-1; + } + + if (IsSwitchPageAllowed()) + { + ModifyGuard aGuard2( GetDoc() ); + + bOK = true; + + if (mpActualPage) + { + SdPage* pNewPage = nullptr; + + if (meEditMode == EditMode::MasterPage) + { + if( GetDoc()->GetMasterSdPageCount(mePageKind) > nSelectedPage ) + pNewPage = GetDoc()->GetMasterSdPage(nSelectedPage, mePageKind); + + if( pNewPage ) + { + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + OUString sPageText(pNewPage->GetLayoutName()); + sal_Int32 nPos = sPageText.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + sPageText = sPageText.copy(0, nPos); + if (pPV + && pNewPage == dynamic_cast< SdPage* >( pPV->GetPage() ) + && sPageText == maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage))) + { + // this slide is already visible + return true; + } + } + } + else + { + OSL_ASSERT(mpFrameView!=nullptr); + mpFrameView->SetSelectedPage(nSelectedPage); + + if (GetDoc()->GetSdPageCount(mePageKind) > nSelectedPage) + pNewPage = GetDoc()->GetSdPage(nSelectedPage, mePageKind); + + if (mpActualPage == pNewPage) + { + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + + SdPage* pCurrentPage = pPV ? dynamic_cast(pPV->GetPage()) : nullptr; + if (pCurrentPage + && pNewPage == pCurrentPage + && maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)) == pNewPage->GetName()) + { + // this slide is already visible + return true; + } + } + } + } + + if (bAllowChangeFocus) + mpDrawView->SdrEndTextEdit(); + + mpActualPage = nullptr; + + if (meEditMode == EditMode::Page) + { + mpActualPage = GetDoc()->GetSdPage(nSelectedPage, mePageKind); + } + else + { + SdPage* pMaster = GetDoc()->GetMasterSdPage(nSelectedPage, mePageKind); + + // does the selected page fit to the masterpage? + sal_uInt16 nPageCount = GetDoc()->GetSdPageCount(mePageKind); + for (sal_uInt16 i = 0; i < nPageCount; i++) + { + SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind); + if(pPage && pPage->IsSelected() && pMaster == &(pPage->TRG_GetMasterPage())) + { + mpActualPage = pPage; + break; + } + } + + if (!mpActualPage) + { + // take the first page, that fits to the masterpage + for (sal_uInt16 i = 0; i < nPageCount; i++) + { + SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind); + if(pPage && pMaster == &(pPage->TRG_GetMasterPage())) + { + mpActualPage = pPage; + break; + } + } + } + } + + for (sal_uInt16 i = 0; i < GetDoc()->GetSdPageCount(mePageKind); i++) + { + // deselect all pages + GetDoc()->SetSelected( GetDoc()->GetSdPage(i, mePageKind), false); + } + + if (!mpActualPage) + { + // as far as there is no mpActualPage, take the first + mpActualPage = GetDoc()->GetSdPage(0, mePageKind); + } + + // also select this page (mpActualPage always points at a drawing page, + // never at a masterpage) + GetDoc()->SetSelected(mpActualPage, true); + + if (comphelper::LibreOfficeKit::isActive()) + { + // notify LibreOfficeKit about changed page + OString aPayload = OString::number(nSelectedPage); + if (SfxViewShell* pViewShell = GetViewShell()) + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload); + } + + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) ); + if( !xSlideshow.is() || !xSlideshow->isRunning() || ( xSlideshow->getAnimationMode() != ANIMATIONMODE_SHOW ) ) + { + // tighten VisArea, to possibly deactivate objects + // !!! only if we are not in presentation mode (#96279) !!! + OSL_ASSERT (GetViewShell()!=nullptr); + GetViewShell()->DisconnectAllClients(); + VisAreaChanged(::tools::Rectangle(Point(), Size(1, 1))); + } + + // Try to prefetch all graphics for the active page. This will be done + // in threads to be more efficient than loading them on-demand one by one. + std::vector graphics; + mpActualPage->getGraphicsForPrefetch(graphics); + if(graphics.size() > 1) // threading does not help with loading just one + GraphicFilter::GetGraphicFilter().MakeGraphicsAvailableThreaded(graphics); + + if (meEditMode == EditMode::Page) + { + /********************************************************************** + * PAGEMODE + **********************************************************************/ + GetDoc()->SetSelected(mpActualPage, true); + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if (pPageView) + { + mpFrameView->SetVisibleLayers( pPageView->GetVisibleLayers() ); + mpFrameView->SetPrintableLayers( pPageView->GetPrintableLayers() ); + mpFrameView->SetLockedLayers( pPageView->GetLockedLayers() ); + + if (mePageKind == PageKind::Notes) + { + mpFrameView->SetNotesHelpLines( pPageView->GetHelpLines() ); + } + else if (mePageKind == PageKind::Handout) + { + mpFrameView->SetHandoutHelpLines( pPageView->GetHelpLines() ); + } + else + { + mpFrameView->SetStandardHelpLines( pPageView->GetHelpLines() ); + } + } + + mpDrawView->HideSdrPage(); + maTabControl->SetCurPageId(maTabControl->GetPageId(nSelectedPage)); + mpDrawView->ShowSdrPage(mpActualPage); + GetViewShellBase().GetDrawController()->FireSwitchCurrentPage(mpActualPage); + + SdrPageView* pNewPageView = mpDrawView->GetSdrPageView(); + + if (pNewPageView) + { + pNewPageView->SetVisibleLayers( mpFrameView->GetVisibleLayers() ); + pNewPageView->SetPrintableLayers( mpFrameView->GetPrintableLayers() ); + pNewPageView->SetLockedLayers( mpFrameView->GetLockedLayers() ); + + if (mePageKind == PageKind::Notes) + { + pNewPageView->SetHelpLines( mpFrameView->GetNotesHelpLines() ); + } + else if (mePageKind == PageKind::Handout) + { + pNewPageView->SetHelpLines( mpFrameView->GetHandoutHelpLines() ); + } + else + { + pNewPageView->SetHelpLines( mpFrameView->GetStandardHelpLines() ); + } + } + + OUString aPageName = mpActualPage->GetName(); + + if (maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)) != aPageName) + { + maTabControl->SetPageText(maTabControl->GetPageId(nSelectedPage), aPageName); + } + } + else + { + /********************************************************************** + * MASTERPAGE + **********************************************************************/ + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if (pPageView) + { + mpFrameView->SetVisibleLayers( pPageView->GetVisibleLayers() ); + mpFrameView->SetPrintableLayers( pPageView->GetPrintableLayers() ); + mpFrameView->SetLockedLayers( pPageView->GetLockedLayers() ); + + if (mePageKind == PageKind::Notes) + { + mpFrameView->SetNotesHelpLines( pPageView->GetHelpLines() ); + } + else if (mePageKind == PageKind::Handout) + { + mpFrameView->SetHandoutHelpLines( pPageView->GetHelpLines() ); + } + else + { + mpFrameView->SetStandardHelpLines( pPageView->GetHelpLines() ); + } + } + + mpDrawView->HideSdrPage(); + maTabControl->SetCurPageId(maTabControl->GetPageId(nSelectedPage)); + + SdPage* pMaster = GetDoc()->GetMasterSdPage(nSelectedPage, mePageKind); + + if( !pMaster ) // if this page should not exist + pMaster = GetDoc()->GetMasterSdPage(0, mePageKind); + + sal_uInt16 nNum = pMaster->GetPageNum(); + mpDrawView->ShowSdrPage(mpDrawView->GetModel().GetMasterPage(nNum)); + + GetViewShellBase().GetDrawController()->FireSwitchCurrentPage(pMaster); + + SdrPageView* pNewPageView = mpDrawView->GetSdrPageView(); + + if (pNewPageView) + { + pNewPageView->SetVisibleLayers( mpFrameView->GetVisibleLayers() ); + pNewPageView->SetPrintableLayers( mpFrameView->GetPrintableLayers() ); + pNewPageView->SetLockedLayers( mpFrameView->GetLockedLayers() ); + + if (mePageKind == PageKind::Notes) + { + pNewPageView->SetHelpLines( mpFrameView->GetNotesHelpLines() ); + } + else if (mePageKind == PageKind::Handout) + { + pNewPageView->SetHelpLines( mpFrameView->GetHandoutHelpLines() ); + } + else + { + pNewPageView->SetHelpLines( mpFrameView->GetStandardHelpLines() ); + } + } + + OUString aLayoutName(pMaster->GetLayoutName()); + sal_Int32 nPos = aLayoutName.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aLayoutName = aLayoutName.copy(0, nPos); + + if (maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)) != aLayoutName) + { + maTabControl->SetPageText(maTabControl->GetPageId(nSelectedPage), aLayoutName); + } + + if( mePageKind == PageKind::Handout ) + { + // set pages for all available handout presentation objects + sd::ShapeList& rShapeList = pMaster->GetPresentationShapeList(); + SdrObject* pObj = nullptr; + rShapeList.seekShape(0); + + while( (pObj = rShapeList.getNextShape()) ) + { + if( pMaster->GetPresObjKind(pObj) == PresObjKind::Handout ) + { + // #i105146# We want no content to be displayed for PageKind::Handout, + // so just never set a page as content + static_cast(pObj)->SetReferencedPage(nullptr); + } + } + } + } + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + mpDrawView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + + // so navigator (and effect window) notice that + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_NAVIGATOR_STATE, true); + rBindings.Invalidate(SID_NAVIGATOR_PAGENAME, true); + rBindings.Invalidate(SID_STATUS_PAGE, true); + rBindings.Invalidate(SID_DELETE_MASTER_PAGE, true); + rBindings.Invalidate(SID_DELETE_PAGE, true); + rBindings.Invalidate(SID_ASSIGN_LAYOUT, true); + rBindings.Invalidate(SID_INSERTPAGE, true); + UpdatePreview( mpActualPage ); + + mpDrawView->AdjustMarkHdl(); + } + + return bOK; +} + +/** + * Check if page change is allowed + */ + +bool DrawViewShell::IsSwitchPageAllowed() const +{ + bool bOK = true; + + FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); + if (pFormShell != nullptr && !pFormShell->PrepareClose(false)) + bOK = false; + + return bOK; +} + +/** + * Select new refreshed page, in case of a page order change (eg. by undo) + */ + +void DrawViewShell::ResetActualLayer() +{ + LayerTabBar* pLayerBar = GetLayerTabControl(); + if (pLayerBar == nullptr) + return; + + // remember old tab count and current tab id + // this is needed when one layer is renamed to + // restore current tab + sal_uInt16 nOldLayerCnt = pLayerBar->GetPageCount(); // actually it is tab count + sal_uInt16 nOldLayerPos = pLayerBar->GetCurPageId(); // actually it is a tab nId + + /** + * Update for LayerTab + */ + pLayerBar->Clear(); + + OUString aName; // a real layer name + OUString aActiveLayer = mpDrawView->GetActiveLayer(); + sal_uInt16 nActiveLayerPos = SDRLAYERPOS_NOTFOUND; + SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin(); + sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount(); + + for ( sal_uInt16 nLayerPos = 0; nLayerPos < nLayerCnt; nLayerPos++ ) + { + aName = rLayerAdmin.GetLayer(nLayerPos)->GetName(); + + if ( aName == aActiveLayer ) + { + nActiveLayerPos = nLayerPos; + } + + if ( aName != sUNO_LayerName_background ) // layer "background" has never a tab + { + if (meEditMode == EditMode::MasterPage) + { + // don't show page layer onto the masterpage + if (aName != sUNO_LayerName_layout && + aName != sUNO_LayerName_controls && + aName != sUNO_LayerName_measurelines) + { + TabBarPageBits nBits = TabBarPageBits::NONE; + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + if (pPV) + { + if (!pPV->IsLayerVisible(aName)) + { + nBits |= TabBarPageBits::Blue; + } + if (pPV->IsLayerLocked(aName)) + { + nBits |= TabBarPageBits::Italic; + } + if (!pPV->IsLayerPrintable(aName)) + { + nBits |= TabBarPageBits::Underline; + } + } + + pLayerBar->InsertPage(nLayerPos+1, aName, nBits); // why +1? It is a nId, not a position. Position is APPEND. + } + } + else + { + // don't show masterpage layer onto the page + if (aName != sUNO_LayerName_background_objects) + { + TabBarPageBits nBits = TabBarPageBits::NONE; + if (!mpDrawView->GetSdrPageView()->IsLayerVisible(aName)) + { + nBits = TabBarPageBits::Blue; + } + if (mpDrawView->GetSdrPageView()->IsLayerLocked(aName)) + { + nBits |= TabBarPageBits::Italic; + } + if (!mpDrawView->GetSdrPageView()->IsLayerPrintable(aName)) + { + nBits |= TabBarPageBits::Underline; + } + + pLayerBar->InsertPage(nLayerPos+1, aName, nBits);// why +1? + } + } + } + } + + if ( nActiveLayerPos == SDRLAYERPOS_NOTFOUND ) + { + if( nOldLayerCnt == pLayerBar->GetPageCount() ) + { + nActiveLayerPos = nOldLayerPos - 1; + } + else + { + nActiveLayerPos = ( meEditMode == EditMode::MasterPage ) ? 2 : 0; + } + + mpDrawView->SetActiveLayer( pLayerBar->GetLayerName(nActiveLayerPos + 1) );// why +1? + } + + pLayerBar->SetCurPageId(nActiveLayerPos + 1); + GetViewFrame()->GetBindings().Invalidate( SID_TOGGLELAYERVISIBILITY ); + GetViewFrame()->GetBindings().Invalidate( SID_MODIFYLAYER ); + GetViewFrame()->GetBindings().Invalidate( SID_DELETE_LAYER ); +} + +/** + * AcceptDrop + */ + +sal_Int8 DrawViewShell::AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* /*pTargetWindow*/, + sal_uInt16 /*nPage*/, + SdrLayerID nLayer ) +{ + if( SlideShow::IsRunning( GetViewShellBase() ) ) + return DND_ACTION_NONE; + + return mpDrawView->AcceptDrop( rEvt, rTargetHelper, nLayer ); +} + +/** + * ExecuteDrop + */ + +sal_Int8 DrawViewShell::ExecuteDrop ( + const ExecuteDropEvent& rEvt, + DropTargetHelper& /*rTargetHelper*/, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + if( nPage != SDRPAGE_NOTFOUND ) + nPage = GetDoc()->GetSdPage( nPage, mePageKind )->GetPageNum(); + + if( SlideShow::IsRunning( GetViewShellBase() ) ) + return DND_ACTION_NONE; + + Broadcast(ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START)); + sal_Int8 nResult (mpDrawView->ExecuteDrop( rEvt, pTargetWindow, nPage, nLayer )); + Broadcast(ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END)); + + return nResult; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx new file mode 100644 index 0000000000..90cde7c792 --- /dev/null +++ b/sd/source/ui/view/drviews2.cxx @@ -0,0 +1,4018 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +#define MIN_ACTIONS_FOR_DIALOG 5000 ///< if there are more meta objects, we show a dialog during the break up + +namespace sd { + +namespace { + +const SvxFieldItem* findField(editeng::Section const & rSection) +{ + for (SfxPoolItem const * pPool: rSection.maAttributes) + { + if (pPool->Which() == EE_FEATURE_FIELD) + return static_cast(pPool); + } + return nullptr; +} + +bool hasCustomPropertyField(std::vector const & aSections, std::u16string_view rName) +{ + for (editeng::Section const & rSection : aSections) + { + const SvxFieldItem* pFieldItem = findField(rSection); + if (pFieldItem) + { + const editeng::CustomPropertyField* pCustomPropertyField = dynamic_cast(pFieldItem->GetField()); + if (pCustomPropertyField && pCustomPropertyField->GetName() == rName) + return true; + } + } + return false; +} + +OUString getWeightString(SfxItemSet const & rItemSet) +{ + OUString sWeightString = "NORMAL"; + + if (const SfxPoolItem* pItem = rItemSet.GetItem(EE_CHAR_WEIGHT, false)) + { + const SvxWeightItem* pWeightItem = dynamic_cast(pItem); + if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD) + sWeightString = "BOLD"; + } + return sWeightString; +} + +class ClassificationCommon +{ +protected: + sd::DrawViewShell& m_rDrawViewShell; + uno::Reference m_xDocumentProperties; + uno::Reference m_xPropertyContainer; + sfx::ClassificationKeyCreator m_aKeyCreator; +public: + ClassificationCommon(sd::DrawViewShell& rDrawViewShell, const css::uno::Reference& rDocProps) + : m_rDrawViewShell(rDrawViewShell) + , m_xDocumentProperties(rDocProps) + , m_xPropertyContainer(m_xDocumentProperties->getUserDefinedProperties()) + , m_aKeyCreator(SfxClassificationHelper::getPolicyType()) + {} +}; + +class ClassificationCollector : public ClassificationCommon +{ +private: + std::vector m_aResults; + + void iterateSectionsAndCollect(std::vector const & rSections, EditTextObject const & rEditText) + { + sal_Int32 nCurrentParagraph = -1; + OUString sBlank; + + for (editeng::Section const & rSection : rSections) + { + // Insert new paragraph if needed + while (nCurrentParagraph < rSection.mnParagraph) + { + nCurrentParagraph++; + // Get Weight of current paragraph + OUString sWeightProperty = getWeightString(rEditText.GetParaAttribs(nCurrentParagraph)); + // Insert new paragraph into collection + m_aResults.push_back({ svx::ClassificationType::PARAGRAPH, sWeightProperty, sBlank, sBlank }); + } + + const SvxFieldItem* pFieldItem = findField(rSection); + const editeng::CustomPropertyField* pCustomPropertyField = pFieldItem ? + dynamic_cast(pFieldItem->GetField()) : + nullptr; + if (pCustomPropertyField) + { + const OUString& aKey = pCustomPropertyField->GetName(); + if (m_aKeyCreator.isMarkingTextKey(aKey)) + { + OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey); + m_aResults.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, sBlank }); + } + else if (m_aKeyCreator.isCategoryNameKey(aKey) || m_aKeyCreator.isCategoryIdentifierKey(aKey)) + { + OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey); + m_aResults.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, sBlank }); + } + else if (m_aKeyCreator.isMarkingKey(aKey)) + { + OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey); + m_aResults.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, sBlank }); + } + else if (m_aKeyCreator.isIntellectualPropertyPartKey(aKey)) + { + OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey); + m_aResults.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank, sBlank }); + } + } + } + } + +public: + ClassificationCollector(sd::DrawViewShell & rDrawViewShell, const css::uno::Reference& rDocProps) + : ClassificationCommon(rDrawViewShell, rDocProps) + {} + + std::vector const & getResults() const + { + return m_aResults; + } + + void collect() + { + // Set to MASTER mode + EditMode eOldMode = m_rDrawViewShell.GetEditMode(); + if (eOldMode != EditMode::MasterPage) + m_rDrawViewShell.ChangeEditMode(EditMode::MasterPage, false); + + // Scoped guard to revert to the previous mode + comphelper::ScopeGuard const aGuard([this, eOldMode] () { + m_rDrawViewShell.ChangeEditMode(eOldMode, false); + }); + + const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard); + + for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex) + { + SdPage* pMasterPage = m_rDrawViewShell.GetDoc()->GetMasterSdPage(nPageIndex, PageKind::Standard); + for (const rtl::Reference& pObject : *pMasterPage) + { + SdrRectObj* pRectObject = dynamic_cast(pObject.get()); + if (pRectObject && pRectObject->GetTextKind() == SdrObjKind::Text) + { + OutlinerParaObject* pOutlinerParagraphObject = pRectObject->GetOutlinerParaObject(); + if (pOutlinerParagraphObject) + { + const EditTextObject& rEditText = pOutlinerParagraphObject->GetTextObject(); + std::vector aSections; + rEditText.GetAllSections(aSections); + + // Search for a custom property field that has the classification category identifier key + if (hasCustomPropertyField(aSections, m_aKeyCreator.makeCategoryNameKey())) + { + iterateSectionsAndCollect(aSections, rEditText); + return; + } + } + } + } + } + } +}; + +class ClassificationInserter : public ClassificationCommon +{ +private: + /// Delete the previous existing classification object(s) - if they exist + void deleteExistingObjects() + { + OUString sKey = m_aKeyCreator.makeCategoryNameKey(); + + const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard); + + for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex) + { + SdPage* pMasterPage = m_rDrawViewShell.GetDoc()->GetMasterSdPage(nPageIndex, PageKind::Standard); + for (const rtl::Reference& pObject : *pMasterPage) + { + SdrRectObj* pRectObject = dynamic_cast(pObject.get()); + if (pRectObject && pRectObject->GetTextKind() == SdrObjKind::Text) + { + OutlinerParaObject* pOutlinerParagraphObject = pRectObject->GetOutlinerParaObject(); + if (pOutlinerParagraphObject) + { + const EditTextObject& rEditText = pOutlinerParagraphObject->GetTextObject(); + std::vector aSections; + rEditText.GetAllSections(aSections); + + if (hasCustomPropertyField(aSections, sKey)) + { + pMasterPage->RemoveObject(pRectObject->GetOrdNum()); + } + } + } + } + } + } + + void fillTheOutliner(Outliner* pOutliner, std::vector const & rResults) + { + sal_Int32 nParagraph = -1; + for (svx::ClassificationResult const & rResult : rResults) + { + + ESelection aPosition(nParagraph, EE_TEXTPOS_MAX_COUNT, nParagraph, EE_TEXTPOS_MAX_COUNT); + + switch (rResult.meType) + { + case svx::ClassificationType::TEXT: + { + OUString sKey = m_aKeyCreator.makeNumberedTextKey(); + svx::classification::addOrInsertDocumentProperty(m_xPropertyContainer, sKey, rResult.msName); + pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition); + } + break; + + case svx::ClassificationType::CATEGORY: + { + OUString sKey = m_aKeyCreator.makeCategoryNameKey(); + pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition); + } + break; + + case svx::ClassificationType::MARKING: + { + OUString sKey = m_aKeyCreator.makeNumberedMarkingKey(); + svx::classification::addOrInsertDocumentProperty(m_xPropertyContainer, sKey, rResult.msName); + pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition); + } + break; + + case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART: + { + OUString sKey = m_aKeyCreator.makeNumberedIntellectualPropertyPartKey(); + svx::classification::addOrInsertDocumentProperty(m_xPropertyContainer, sKey, rResult.msName); + pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition); + } + break; + + case svx::ClassificationType::PARAGRAPH: + { + nParagraph++; + pOutliner->Insert(""); + + SfxItemSetFixed aItemSet(m_rDrawViewShell.GetDoc()->GetPool()); + + if (rResult.msName == "BOLD") + aItemSet.Put(SvxWeightItem(WEIGHT_BOLD, EE_CHAR_WEIGHT)); + else + aItemSet.Put(SvxWeightItem(WEIGHT_NORMAL, EE_CHAR_WEIGHT)); + + SvxNumRule aDefaultNumRule(SvxNumRuleFlags::NONE, 0, false); + aItemSet.Put(SvxNumBulletItem(std::move(aDefaultNumRule), EE_PARA_NUMBULLET)); + + pOutliner->SetParaAttribs(nParagraph, aItemSet); + } + break; + + default: + break; + } + } + } + +public: + ClassificationInserter(sd::DrawViewShell & rDrawViewShell, const css::uno::Reference& rDocProps) + : ClassificationCommon(rDrawViewShell, rDocProps) + { + } + + void insert(std::vector const & rResults) + { + // Set to MASTER mode + EditMode eOldMode = m_rDrawViewShell.GetEditMode(); + if (eOldMode != EditMode::MasterPage) + m_rDrawViewShell.ChangeEditMode(EditMode::MasterPage, false); + + // Scoped guard to revert the mode + comphelper::ScopeGuard const aGuard([this, eOldMode] () { + m_rDrawViewShell.ChangeEditMode(eOldMode, false); + }); + + // Delete the previous existing object - if exists + deleteExistingObjects(); + + // Clear properties + svx::classification::removeAllProperties(m_xPropertyContainer); + + SfxClassificationHelper aHelper(m_xDocumentProperties); + + // Apply properties from the BA policy + for (svx::ClassificationResult const & rResult : rResults) + { + if (rResult.meType == svx::ClassificationType::CATEGORY) + aHelper.SetBACName(rResult.msName, SfxClassificationHelper::getPolicyType()); + } + + // Insert full text as document property + svx::classification::insertFullTextualRepresentationAsDocumentProperty(m_xPropertyContainer, m_aKeyCreator, rResults); + + // Create the outliner from the + Outliner* pOutliner = m_rDrawViewShell.GetDoc()->GetInternalOutliner(); + OutlinerMode eOutlinerMode = pOutliner->GetOutlinerMode(); + + comphelper::ScopeGuard const aOutlinerGuard([pOutliner, eOutlinerMode] () { + pOutliner->Init(eOutlinerMode); + }); + + pOutliner->Init(OutlinerMode::TextObject); + + // Fill the outliner with the text from classification result + fillTheOutliner(pOutliner, rResults); + + // Calculate to outliner text size + pOutliner->UpdateFields(); + pOutliner->SetUpdateLayout(true); + Size aTextSize(pOutliner->CalcTextSize()); + pOutliner->SetUpdateLayout(false); + + // Create objects, apply the outliner and add them (objects) to all master pages + const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard); + + for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex) + { + SdPage* pMasterPage = m_rDrawViewShell.GetDoc()->GetMasterSdPage(nPageIndex, PageKind::Standard); + if (!pMasterPage) + continue; + + rtl::Reference pObject = new SdrRectObj( + *m_rDrawViewShell.GetDoc(), // TTTT should be reference + SdrObjKind::Text); + pObject->SetMergedItem(makeSdrTextAutoGrowWidthItem(true)); + pObject->SetOutlinerParaObject(pOutliner->CreateParaObject()); + pMasterPage->InsertObject(pObject.get()); + + // Calculate position + ::tools::Rectangle aRectangle(Point(), pMasterPage->GetSize()); + Point aPosition(aRectangle.Center().X(), aRectangle.Bottom()); + + aPosition.AdjustX( -(aTextSize.Width() / 2) ); + aPosition.AdjustY( -(aTextSize.Height()) ); + + pObject->SetLogicRect(::tools::Rectangle(aPosition, aTextSize)); + } + } +}; + + void lcl_convertStringArguments(const std::unique_ptr& pArgs) + { + const SfxPoolItem* pItem = nullptr; + + if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_LINE_WIDTH_ARG, false, &pItem)) + { + double fValue = static_cast(pItem)->GetValue(); + // FIXME: different units... + int nPow = 100; + int nValue = fValue * nPow; + + XLineWidthItem aItem(nValue); + pArgs->Put(aItem); + } + if (SfxItemState::SET == pArgs->GetItemState(SID_FILL_GRADIENT_JSON, false, &pItem)) + { + const SfxStringItem* pJSON = static_cast(pItem); + if (pJSON) + { + basegfx::BGradient aGradient = basegfx::BGradient::fromJSON(pJSON->GetValue()); + XFillGradientItem aItem(aGradient); + pArgs->Put(aItem); + } + } + } +} + +/** + * SfxRequests for temporary actions + */ + +void DrawViewShell::FuTemporary(SfxRequest& rReq) +{ + // during a native slide show nothing gets executed! + if(SlideShow::IsRunning( GetViewShellBase() ) && (rReq.GetSlot() != SID_NAVIGATOR)) + return; + + DBG_ASSERT( mpDrawView, "sd::DrawViewShell::FuTemporary(), no draw view!" ); + if( !mpDrawView ) + return; + + CheckLineTo (rReq); + + DeactivateCurrentFunction(); + + sal_uInt16 nSId = rReq.GetSlot(); + + switch ( nSId ) + { + case SID_OUTLINE_TEXT_AUTOFIT: + { + SfxUndoManager* pUndoManager = GetDocSh()->GetUndoManager(); + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + pUndoManager->EnterListAction("", "", 0, GetViewShellBase().GetViewShellId()); + mpDrawView->BegUndo(); + + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + bool bSet = pObj->GetMergedItemSet().GetItem(SDRATTR_TEXT_FITTOSIZE)->GetValue() != drawing::TextFitToSizeType_NONE; + + mpDrawView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoAttrObject(*pObj)); + + if (!bSet) + { + //If we are turning on AutoFit we have to turn these off if already on + if (pObj->GetMergedItemSet().GetItem(SDRATTR_TEXT_AUTOGROWHEIGHT)->GetValue()) + pObj->SetMergedItem(makeSdrTextAutoGrowHeightItem(false)); + if (pObj->GetMergedItemSet().GetItem(SDRATTR_TEXT_AUTOGROWWIDTH)->GetValue()) + pObj->SetMergedItem(makeSdrTextAutoGrowWidthItem(false)); + } + + pObj->SetMergedItem(SdrTextFitToSizeTypeItem(bSet ? drawing::TextFitToSizeType_NONE : drawing::TextFitToSizeType_AUTOFIT)); + + mpDrawView->EndUndo(); + pUndoManager->LeaveListAction(); + } + Cancel(); + rReq.Done(); + } + break; + + // area and line attributes: shall have + // an own Execute method (like StateMethode) + case SID_ATTR_FILL_STYLE: + case SID_ATTR_FILL_COLOR: + case SID_ATTR_FILL_GRADIENT: + case SID_ATTR_FILL_HATCH: + case SID_ATTR_FILL_BITMAP: + case SID_ATTR_FILL_SHADOW: + case SID_ATTR_SHADOW_COLOR: + case SID_ATTR_SHADOW_TRANSPARENCE: + case SID_ATTR_SHADOW_BLUR: + case SID_ATTR_SHADOW_XDISTANCE: + case SID_ATTR_SHADOW_YDISTANCE: + case SID_ATTR_FILL_USE_SLIDE_BACKGROUND: + case SID_ATTR_FILL_TRANSPARENCE: + case SID_ATTR_FILL_FLOATTRANSPARENCE: + + case SID_ATTR_LINE_STYLE: + case SID_ATTR_LINE_DASH: + case SID_ATTR_LINE_WIDTH: + case SID_ATTR_LINE_COLOR: + case SID_ATTR_LINEEND_STYLE: + case SID_ATTR_LINE_START: + case SID_ATTR_LINE_END: + case SID_ATTR_LINE_TRANSPARENCE: + case SID_ATTR_LINE_JOINT: + case SID_ATTR_LINE_CAP: + + case SID_ATTR_TEXT_FITTOSIZE: + { + if( rReq.GetArgs() ) + { + std::unique_ptr pNewArgs = rReq.GetArgs()->Clone(); + lcl_convertStringArguments(pNewArgs); + mpDrawView->SetAttributes(*pNewArgs); + rReq.Done(); + } + else + { + switch( rReq.GetSlot() ) + { + case SID_ATTR_FILL_SHADOW: + case SID_ATTR_SHADOW_COLOR: + case SID_ATTR_SHADOW_TRANSPARENCE: + case SID_ATTR_SHADOW_BLUR: + case SID_ATTR_SHADOW_XDISTANCE: + case SID_ATTR_SHADOW_YDISTANCE: + case SID_ATTR_FILL_STYLE: + case SID_ATTR_FILL_COLOR: + case SID_ATTR_FILL_GRADIENT: + case SID_ATTR_FILL_HATCH: + case SID_ATTR_FILL_BITMAP: + case SID_ATTR_FILL_USE_SLIDE_BACKGROUND: + case SID_ATTR_FILL_TRANSPARENCE: + case SID_ATTR_FILL_FLOATTRANSPARENCE: + GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_AREA, SfxCallMode::ASYNCHRON ); + break; + case SID_ATTR_LINE_STYLE: + case SID_ATTR_LINE_DASH: + case SID_ATTR_LINE_WIDTH: + case SID_ATTR_LINE_COLOR: + case SID_ATTR_LINE_TRANSPARENCE: + case SID_ATTR_LINE_JOINT: + case SID_ATTR_LINE_CAP: + GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_LINE, SfxCallMode::ASYNCHRON ); + break; + case SID_ATTR_TEXT_FITTOSIZE: + GetViewFrame()->GetDispatcher()->Execute( SID_TEXTATTR_DLG, SfxCallMode::ASYNCHRON ); + break; + } + } + Cancel(); + } + break; + + case SID_HYPHENATION: + { + const SfxBoolItem* pItem = rReq.GetArg(SID_HYPHENATION); + + if( pItem ) + { + SfxItemSetFixed aSet( GetPool() ); + bool bValue = pItem->GetValue(); + aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) ); + mpDrawView->SetAttributes( aSet ); + } + else // only for testing purpose + { + OSL_FAIL(" no value for hyphenation!"); + SfxItemSetFixed aSet( GetPool() ); + aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, true ) ); + mpDrawView->SetAttributes( aSet ); + } + rReq.Done(); + Cancel(); + } + break; + + case SID_INSERTPAGE: + case SID_INSERTPAGE_QUICK: + { + SdPage* pNewPage = CreateOrDuplicatePage (rReq, mePageKind, GetActualPage()); + Cancel(); + if(HasCurrentFunction(SID_BEZIER_EDIT) ) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + if (pNewPage != nullptr) + SwitchPage((pNewPage->GetPageNum()-1)/2); + rReq.Done (); + } + break; + + case SID_DUPLICATE_PAGE: + { + auto slideSorter = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase()); + SdPage* pNewPage = nullptr; + if(slideSorter) + DuplicateSelectedSlides(rReq); + else + pNewPage = CreateOrDuplicatePage (rReq, mePageKind, GetActualPage()); + Cancel(); + if(HasCurrentFunction(SID_BEZIER_EDIT) ) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + if(!slideSorter && pNewPage != nullptr) + SwitchPage((pNewPage->GetPageNum()-1)/2); + rReq.Done(); + } + break; + + case SID_INSERT_MASTER_PAGE: + { + // Use the API to create a new page. + Reference xMasterPagesSupplier ( + GetDoc()->getUnoModel(), UNO_QUERY); + if (xMasterPagesSupplier.is()) + { + Reference xMasterPages ( + xMasterPagesSupplier->getMasterPages()); + if (xMasterPages.is()) + { + sal_uInt16 nIndex = GetCurPagePos() + 1; + xMasterPages->insertNewByIndex (nIndex); + + // Create shapes for the default layout. + SdPage* pMasterPage = GetDoc()->GetMasterSdPage( + nIndex, PageKind::Standard); + pMasterPage->CreateTitleAndLayout (true,true); + } + } + + Cancel(); + if(HasCurrentFunction(SID_BEZIER_EDIT)) + GetViewFrame()->GetDispatcher()->Execute( + SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + rReq.Done (); + } + break; + + case SID_MODIFYPAGE: + { + if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes || + (mePageKind==PageKind::Handout && meEditMode==EditMode::MasterPage) ) + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + sal_uInt16 nPage = maTabControl->GetCurPagePos(); + mpActualPage = GetDoc()->GetSdPage(nPage, mePageKind); + ::sd::ViewShell::mpImpl->ProcessModifyPageSlot ( + rReq, + mpActualPage, + mePageKind); + } + + Cancel(); + rReq.Done (); + } + break; + + case SID_ASSIGN_LAYOUT: + { + if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes || (mePageKind==PageKind::Handout && meEditMode==EditMode::MasterPage)) + { + if ( mpDrawView->IsTextEdit() ) + mpDrawView->SdrEndTextEdit(); + + ::sd::ViewShell::mpImpl->AssignLayout(rReq, mePageKind); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_RENAMEPAGE: + case SID_RENAME_MASTER_PAGE: + { + if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes ) + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + sal_uInt16 nPage = maTabControl->GetCurPagePos(); + SdPage* pCurrentPage = ( GetEditMode() == EditMode::Page ) + ? GetDoc()->GetSdPage( nPage, GetPageKind() ) + : GetDoc()->GetMasterSdPage( nPage, GetPageKind() ); + + OUString aTitle = SdResId(STR_TITLE_RENAMESLIDE); + OUString aDescr = SdResId(STR_DESC_RENAMESLIDE); + const OUString& aPageName = pCurrentPage->GetName(); + + if(rReq.GetArgs()) + { + OUString aName = rReq.GetArgs()->GetItem(SID_RENAMEPAGE)->GetValue(); + + bool bResult = RenameSlide( maTabControl->GetPageId(nPage), aName ); + DBG_ASSERT( bResult, "Couldn't rename slide" ); + } + else + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr aNameDlg(pFact->CreateSvxNameDialog(GetFrameWeld(), aPageName, aDescr)); + aNameDlg->SetText( aTitle ); + aNameDlg->SetCheckNameHdl( LINK( this, DrawViewShell, RenameSlideHdl ) ); + aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE ); + + if( aNameDlg->Execute() == RET_OK ) + { + OUString aNewName; + aNameDlg->GetName( aNewName ); + if (aNewName != aPageName) + { + bool bResult = RenameSlide( maTabControl->GetPageId(nPage), aNewName ); + DBG_ASSERT( bResult, "Couldn't rename slide" ); + } + } + } + } + Cancel(); + rReq.Ignore(); + } + break; + + case SID_RENAMEPAGE_QUICK: + { + if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes ) + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + maTabControl->StartEditMode( maTabControl->GetCurPageId() ); + } + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_PAGESIZE : // either this (no menu entries or something else!) + { + const SfxItemSet *pArgs = rReq.GetArgs (); + + if (pArgs && pArgs->Count () == 3) + { + const SfxUInt32Item* pWidth = rReq.GetArg(ID_VAL_PAGEWIDTH); + const SfxUInt32Item* pHeight = rReq.GetArg(ID_VAL_PAGEHEIGHT); + const SfxBoolItem* pScaleAll = rReq.GetArg(ID_VAL_SCALEOBJECTS); + + Size aSize (pWidth->GetValue (), pHeight->GetValue ()); + + SetupPage (aSize, 0, 0, 0, 0, true, false, pScaleAll->GetValue ()); + rReq.Ignore (); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + rReq.Ignore (); + break; + } + + case SID_PAGEMARGIN : // or this (no menu entries or something else!) + { + const SfxItemSet *pArgs = rReq.GetArgs (); + + if (pArgs && pArgs->Count () == 5) + { + const SfxUInt32Item* pLeft = rReq.GetArg(ID_VAL_PAGELEFT); + const SfxUInt32Item* pRight = rReq.GetArg(ID_VAL_PAGERIGHT); + const SfxUInt32Item* pUpper = rReq.GetArg(ID_VAL_PAGETOP); + const SfxUInt32Item* pLower = rReq.GetArg(ID_VAL_PAGEBOTTOM); + const SfxBoolItem* pScaleAll = rReq.GetArg(ID_VAL_SCALEOBJECTS); + + Size aEmptySize (0, 0); + + SetupPage (aEmptySize, pLeft->GetValue (), pRight->GetValue (), + pUpper->GetValue (), pLower->GetValue (), + false, true, pScaleAll->GetValue ()); + rReq.Ignore (); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + rReq.Ignore (); + break; + } + + case SID_ATTR_ZOOMSLIDER: + { + const SfxItemSet* pArgs = rReq.GetArgs(); + + const SfxUInt16Item* pScale = (pArgs && pArgs->Count () == 1) ? + rReq.GetArg(SID_ATTR_ZOOMSLIDER) : nullptr; + if (pScale && CHECK_RANGE (5, pScale->GetValue (), 3000)) + { + SetZoom (pScale->GetValue ()); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_ATTR_ZOOM ); + rBindings.Invalidate( SID_ZOOM_IN ); + rBindings.Invalidate( SID_ZOOM_OUT ); + rBindings.Invalidate( SID_ATTR_ZOOMSLIDER ); + + } + + Cancel(); + rReq.Done (); + break; + } + + case SID_ATTR_ZOOM: + { + const SfxItemSet* pArgs = rReq.GetArgs(); + mbZoomOnPage = false; + + if ( pArgs ) + { + SvxZoomType eZT = pArgs->Get( SID_ATTR_ZOOM ).GetType(); + switch( eZT ) + { + case SvxZoomType::PERCENT: + SetZoom( static_cast<::tools::Long>( pArgs->Get( SID_ATTR_ZOOM ).GetValue()) ); + break; + + case SvxZoomType::OPTIMAL: + GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_ALL, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + break; + + case SvxZoomType::PAGEWIDTH: + GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE_WIDTH, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + break; + + case SvxZoomType::WHOLEPAGE: + GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + break; + case SvxZoomType::PAGEWIDTH_NOBORDER: + OSL_FAIL("sd::DrawViewShell::FuTemporary(), SvxZoomType::PAGEWIDTH_NOBORDER not handled!" ); + break; + } + rReq.Ignore (); + } + else + { + // open zoom dialog + SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + } + Cancel(); + } + break; + + case SID_CHANGEBEZIER: + case SID_CHANGEPOLYGON: + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + if( rReq.GetSlot() == SID_CHANGEBEZIER ) + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->ConvertMarkedToPathObj(false); + } + else + { + if( mpDrawView->IsVectorizeAllowed() ) + { + SetCurrentFunction( FuVectorize::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->ConvertMarkedToPolyObj(); + } + } + + Invalidate(SID_CHANGEBEZIER); + Invalidate(SID_CHANGEPOLYGON); + } + Cancel(); + + if( HasCurrentFunction(SID_BEZIER_EDIT) ) + { // where applicable, activate right edit action + GetViewFrame()->GetDispatcher()->Execute(SID_SWITCH_POINTEDIT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + rReq.Ignore (); + break; + + case SID_CONVERT_TO_CONTOUR: + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->ConvertMarkedToPathObj(true); + + Invalidate(SID_CONVERT_TO_CONTOUR); + } + Cancel(); + + rReq.Ignore (); + break; + + case SID_CONVERT_TO_METAFILE: + case SID_CONVERT_TO_BITMAP: + { + // End text edit mode when it is active because the metafile or + // bitmap that will be created does not support it. + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + + if ( mpDrawView->IsPresObjSelected(true,true,true) ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + + // create SdrGrafObj from metafile/bitmap + Graphic aGraphic; + switch (nSId) + { + case SID_CONVERT_TO_METAFILE: + { + // switch on undo for the next operations + mpDrawView->BegUndo(SdResId(STR_UNDO_CONVERT_TO_METAFILE)); + GDIMetaFile aMetaFile(mpDrawView->GetMarkedObjMetaFile()); + aGraphic = Graphic(aMetaFile); + } + break; + case SID_CONVERT_TO_BITMAP: + { + // Disable spelling during conversion + bool bOnlineSpell = GetDoc()->GetOnlineSpell(); + GetDoc()->SetOnlineSpell(false); + + // switch on undo for the next operations + mpDrawView->BegUndo(SdResId(STR_UNDO_CONVERT_TO_BITMAP)); + bool bDone(false); + + // I have to get the image here directly since GetMarkedObjBitmapEx works + // based on Bitmaps, but not on BitmapEx, thus throwing away the alpha + // channel. Argh! GetMarkedObjBitmapEx itself is too widely used to safely + // change that, e.g. in the exchange formats. For now I can only add this + // exception to get good results for Svgs. This is how the code gets more + // and more crowded, at last I made a remark for myself to change this + // as one of the next tasks. + if(1 == mpDrawView->GetMarkedObjectCount()) + { + const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(mpDrawView->GetMarkedObjectByIndex(0)); + + if(pSdrGrafObj && pSdrGrafObj->isEmbeddedVectorGraphicData()) + { + aGraphic = Graphic(pSdrGrafObj->GetGraphic().getVectorGraphicData()->getReplacement()); + bDone = true; + } + } + + if(!bDone) + { + aGraphic = Graphic(mpDrawView->GetMarkedObjBitmapEx()); + } + // Restore online spelling + GetDoc()->SetOnlineSpell(bOnlineSpell); + } + break; + } + + // create new object + rtl::Reference pGraphicObj = new SdrGrafObj( + *GetDoc(), + aGraphic); + + // get some necessary info and ensure it + const SdrMarkList& rMarkList(mpDrawView->GetMarkedObjectList()); + const size_t nMarkCount(rMarkList.GetMarkCount()); + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + OSL_ENSURE(nMarkCount, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP with empty selection (!)"); + OSL_ENSURE(pPageView, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP without SdrPageView (!)"); + + // fit rectangle of new graphic object to selection's mark rect + ::tools::Rectangle aAllMarkedRect; + rMarkList.TakeBoundRect(pPageView, aAllMarkedRect); + pGraphicObj->SetLogicRect(aAllMarkedRect); + + // #i71540# to keep the order, it is necessary to replace the lowest object + // of the selection with the new object. This also means that with multi + // selection, all other objects need to be deleted first + SdrMark* pFirstMark = rMarkList.GetMark(0); + SdrObject* pReplacementCandidate = pFirstMark->GetMarkedSdrObj(); + + if(nMarkCount > 1) + { + // take first object out of selection + mpDrawView->MarkObj(pReplacementCandidate, pPageView, true, true); + + // clear remaining selection + mpDrawView->DeleteMarkedObj(); + } + + // #i124816# copy layer from lowest object which gets replaced + pGraphicObj->SetLayer(pReplacementCandidate->GetLayer()); + + // now replace lowest object with new one + mpDrawView->ReplaceObjectAtView(pReplacementCandidate, *pPageView, pGraphicObj.get()); + + // switch off undo + mpDrawView->EndUndo(); + } + } + + Cancel(); + + rReq.Done (); + break; + + case SID_REMOVE_HYPERLINK: + { + if (mpDrawView->IsTextEdit()) + { + OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView(); + if (pOutView) + URLFieldHelper::RemoveURLField(pOutView->GetEditView()); + } + } + Cancel(); + rReq.Done (); + break; + + case SID_SET_DEFAULT: + { + std::optional pSet; + + if (mpDrawView->IsTextEdit()) + { + pSet.emplace( GetPool(), svl::Items ); + mpDrawView->SetAttributes( *pSet, true ); + } + else + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + + // For every presentation object a SfxItemSet of hard attributes + // and the UserCall is stored in this list. This is because + // at the following mpDrawView->SetAttributes( *pSet, sal_True ) + // they get lost and have to be restored. + std::vector,SdrObjUserCall*> > aAttrList; + SdPage* pPresPage = static_cast( mpDrawView->GetSdrPageView()->GetPage() ); + + for ( size_t i = 0; i < nCount; ++i ) + { + SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); + + if( pPresPage->IsPresObj( pObj ) ) + { + auto pNewSet = std::make_unique>( GetDoc()->GetPool() ); + pNewSet->Put(pObj->GetMergedItemSet()); + aAttrList.emplace_back(std::move(pNewSet), pObj->GetUserCall()); + } + } + + pSet.emplace( GetPool() ); + mpDrawView->SetAttributes( *pSet, true ); + + sal_uLong j = 0; + + for ( size_t i = 0; i < nCount; ++i ) + { + SfxStyleSheet* pSheet = nullptr; + SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); + + if (pObj->GetObjIdentifier() == SdrObjKind::TitleText) + { + pSheet = mpActualPage->GetStyleSheetForPresObj(PresObjKind::Title); + if (pSheet) + pObj->SetStyleSheet(pSheet, false); + } + else if(pObj->GetObjIdentifier() == SdrObjKind::OutlineText) + { + for (sal_uInt16 nLevel = 1; nLevel < 10; nLevel++) + { + pSheet = mpActualPage->GetStyleSheetForPresObj( PresObjKind::Outline ); + DBG_ASSERT(pSheet, "Template for outline object not found"); + if (pSheet) + { + pObj->StartListening(*pSheet); + + if( nLevel == 1 ) + // text frame listens on StyleSheet of level1 + pObj->NbcSetStyleSheet(pSheet, false); + } + } + } + + if( pPresPage->IsPresObj( pObj ) ) + { + std::pair,SdrObjUserCall*> &rAttr = aAttrList[j++]; + + std::unique_ptr & pNewSet(rAttr.first); + SdrObjUserCall* pUserCall = rAttr.second; + + if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_MINFRAMEHEIGHT ) == SfxItemState::SET ) + { + pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_MINFRAMEHEIGHT)); + } + + if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_AUTOGROWHEIGHT ) == SfxItemState::SET ) + { + pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_AUTOGROWHEIGHT)); + } + + if( pUserCall ) + pObj->SetUserCall( pUserCall ); + } + } + } + + pSet.reset(); + Cancel(); + } + break; + + case SID_DELETE_SNAPITEM: + { + SdrPageView* pPV; + Point aMPos = GetActiveWindow()->PixelToLogic( maMousePos ); + sal_uInt16 nHitLog = static_cast(GetActiveWindow()->PixelToLogic( Size( + FuPoor::HITPIX, 0 ) ).Width()); + sal_uInt16 nHelpLine; + + if( mpDrawView->PickHelpLine( aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) ) + { + pPV->DeleteHelpLine( nHelpLine ); + } + Cancel(); + rReq.Ignore (); + } + break; + + case SID_DELETE_PAGE: + case SID_DELETE_MASTER_PAGE: + DeleteActualPage(); + Cancel(); + rReq.Ignore (); + break; + + case SID_DELETE_LAYER: + DeleteActualLayer(); + Cancel(); + rReq.Ignore (); + break; + + case SID_ORIGINAL_SIZE: + mpDrawView->SetMarkedOriginalSize(); + Cancel(); + rReq.Done(); + break; + + case SID_DRAW_FONTWORK: + case SID_DRAW_FONTWORK_VERTICAL: + { + svx::FontworkBar::execute(*mpView, rReq, GetViewFrame()->GetBindings()); // SJ: can be removed (I think) + Cancel(); + rReq.Done(); + } + break; + + case SID_SAVE_GRAPHIC: + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + const SdrGrafObj* pObj = dynamic_cast(rMarkList.GetMark(0)->GetMarkedSdrObj()); + if (pObj && pObj->GetGraphicType() == GraphicType::Bitmap) + { + weld::Window* pFrame = GetFrameWeld(); + GraphicAttr aGraphicAttr = pObj->GetGraphicAttr(); + short nState = RET_CANCEL; + if (aGraphicAttr != GraphicAttr()) // the image has been modified + { + if (pFrame) + { + nState = GraphicHelper::HasToSaveTransformedImage(pFrame); + } + } + else + { + nState = RET_NO; + } + + if (nState == RET_YES) + { + GraphicHelper::ExportGraphic(pFrame, pObj->GetTransformedGraphic(), ""); + } + else if (nState == RET_NO) + { + const GraphicObject& aGraphicObject(pObj->GetGraphicObject()); + GraphicHelper::ExportGraphic(pFrame, aGraphicObject.GetGraphic(), ""); + } + } + } + Cancel(); + rReq.Ignore(); + } + break; + + case SID_EXTERNAL_EDIT: + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + if( auto pGraphicObj = dynamic_cast( pObj ) ) + if( pGraphicObj->GetGraphicType() == GraphicType::Bitmap ) + { + GraphicObject aGraphicObject( pGraphicObj->GetGraphicObject() ); + m_ExternalEdits.push_back( + std::make_unique( + mpDrawView.get(), pGraphicObj)); + m_ExternalEdits.back()->Edit( &aGraphicObject ); + } + } + Cancel(); + rReq.Ignore(); + } + break; + + case SID_COMPRESS_GRAPHIC: + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + + if( auto pGraphicObj = dynamic_cast( pObj ) ) + if( pGraphicObj->GetGraphicType() == GraphicType::Bitmap ) + { + CompressGraphicsDialog dialog(GetFrameWeld(), pGraphicObj, GetViewFrame()->GetBindings() ); + if (dialog.run() == RET_OK) + { + rtl::Reference pNewObject = dialog.GetCompressedSdrGrafObj(); + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + OUString aUndoString = mpDrawView->GetDescriptionOfMarkedObjects() + " Compress"; + mpDrawView->BegUndo( aUndoString ); + mpDrawView->ReplaceObjectAtView( pObj, *pPageView, pNewObject.get() ); + mpDrawView->EndUndo(); + } + } + } + Cancel(); + rReq.Ignore(); + } + break; + + case SID_GRAPHIC_SIZE_CHECK: + { + sd::GraphicSizeCheckGUIResult aResult(GetDoc()); + svx::GenericCheckDialog aDialog(GetFrameWeld(), aResult); + aDialog.run(); + + Cancel(); + rReq.Ignore(); + } + break; + + case SID_ATTRIBUTES_LINE: // BASIC + { + SetCurrentFunction( FuLine::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + if (rReq.GetArgs()) + Cancel(); + } + break; + + case SID_ATTRIBUTES_AREA: // BASIC + { + SetCurrentFunction( FuArea::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + if (rReq.GetArgs()) + Cancel(); + } + break; + + case SID_ATTR_TRANSFORM: + { + SetCurrentFunction( FuTransform::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + // tdf#138963 conditions tested for here must be the same as those + // of the early returns from FuTransform::DoExecute + if (rReq.GetArgs() || !mpDrawView->AreObjectsMarked()) + { + Invalidate(SID_RULER_OBJECT); + Cancel(); + } + } + break; + case SID_MOVE_SHAPE_HANDLE: + { + const SfxItemSet *pArgs = rReq.GetArgs (); + if (pArgs && pArgs->Count () >= 3) + { + const SfxUInt32Item* handleNumItem = rReq.GetArg(FN_PARAM_1); + const SfxUInt32Item* newPosXTwips = rReq.GetArg(FN_PARAM_2); + const SfxUInt32Item* newPosYTwips = rReq.GetArg(FN_PARAM_3); + const SfxInt32Item* OrdNum = rReq.GetArg(FN_PARAM_4); + + const sal_uLong handleNum = handleNumItem->GetValue(); + const sal_uLong newPosX = convertTwipToMm100(newPosXTwips->GetValue()); + const sal_uLong newPosY = convertTwipToMm100(newPosYTwips->GetValue()); + + mpDrawView->MoveShapeHandle(handleNum, Point(newPosX, newPosY), OrdNum ? OrdNum->GetValue() : -1); + Cancel(); + } + break; + } + case SID_CHAR_DLG_EFFECT: + case SID_CHAR_DLG: // BASIC + { + SetCurrentFunction( FuChar::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_PARA_DLG: + { + SetCurrentFunction( FuParagraph::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case FN_NUM_BULLET_ON: + { + // The value (sal_uInt16)0xFFFF means set bullet on/off. + SfxUInt16Item aItem(FN_SVX_SET_BULLET, sal_uInt16(0xFFFF)); + GetViewFrame()->GetDispatcher()->ExecuteList(FN_SVX_SET_BULLET, + SfxCallMode::RECORD, { &aItem }); + } + break; + + case FN_NUM_NUMBERING_ON: + { + // The value (sal_uInt16)0xFFFF means set bullet on/off. + SfxUInt16Item aItem(FN_SVX_SET_NUMBER, sal_uInt16(0xFFFF)); + GetViewFrame()->GetDispatcher()->ExecuteList(FN_SVX_SET_NUMBER, + SfxCallMode::RECORD, { &aItem }); + } + break; + + case SID_OUTLINE_BULLET: + case FN_SVX_SET_BULLET: + case FN_SVX_SET_NUMBER: + { + SetCurrentFunction( FuBulletAndPosition::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case FN_INSERT_SOFT_HYPHEN: + case FN_INSERT_HARDHYPHEN: + case FN_INSERT_HARD_SPACE: + case FN_INSERT_NNBSP: + case SID_INSERT_RLM : + case SID_INSERT_LRM : + case SID_INSERT_WJ : + case SID_INSERT_ZWSP: + case SID_CHARMAP: + { + SetCurrentFunction( FuBullet::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_PRESENTATION_LAYOUT: + { + SetCurrentFunction( FuPresentationLayout::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); + } + break; + + case SID_PASTE_SPECIAL: + { + SetCurrentFunction( FuInsertClipboard::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_CHANGE_PICTURE: + case SID_INSERT_GRAPHIC: + { + SetCurrentFunction( FuInsertGraphic::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, + nSId == SID_CHANGE_PICTURE ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_INSERT_AVMEDIA: + { + SetCurrentFunction( FuInsertAVMedia::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_INSERT_OBJECT: + case SID_INSERT_FLOATINGFRAME: + case SID_INSERT_MATH: + case SID_INSERT_DIAGRAM: + case SID_ATTR_TABLE: + { + SetCurrentFunction( FuInsertOLE::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + // Set the selection tool as the old one. This in particular important for the + // zoom function, in which clicking without dragging zooms as well, and that + // makes exiting the object editing mode impossible. + if (dynamic_cast( GetOldFunction().get() ) == nullptr) + SetOldFunction( FuSelection::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + case SID_CLASSIFICATION_APPLY: + { + const SfxItemSet* pArgs = rReq.GetArgs(); + const SfxPoolItem* pItem = nullptr; + if (pArgs && pArgs->GetItemState(nSId, false, &pItem) == SfxItemState::SET) + { + const OUString& rName = static_cast(pItem)->GetValue(); + auto eType = SfxClassificationPolicyType::IntellectualProperty; + if (pArgs->GetItemState(SID_TYPE_NAME, false, &pItem) == SfxItemState::SET) + { + const OUString& rType = static_cast(pItem)->GetValue(); + eType = SfxClassificationHelper::stringToPolicyType(rType); + } + if (SfxViewFrame* pViewFrame = GetViewFrame()) + { + if (SfxObjectShell* pObjectShell = pViewFrame->GetObjectShell()) + { + SfxClassificationHelper aHelper(pObjectShell->getDocProperties()); + aHelper.SetBACName(rName, eType); + } + } + } + else + SAL_WARN("sd.ui", "missing parameter for SID_CLASSIFICATION_APPLY"); + + Cancel(); + rReq.Ignore(); + } + break; + + case SID_CLASSIFICATION_DIALOG: + { + if (SfxObjectShell* pObjShell = SfxObjectShell::Current()) + { + css::uno::Reference xDocProps(pObjShell->getDocProperties()); + auto xDialog = std::make_shared(GetFrameWeld(), xDocProps, false, [](){} ); + ClassificationCollector aCollector(*this, xDocProps); + aCollector.collect(); + + xDialog->setupValues(std::vector(aCollector.getResults())); + + if (RET_OK == xDialog->run()) + { + ClassificationInserter aInserter(*this, xDocProps); + aInserter.insert(xDialog->getResult()); + } + xDialog.reset(); + } + + Cancel(); + rReq.Ignore(); + } + break; + + case SID_COPYOBJECTS: + { + if ( mpDrawView->IsPresObjSelected(false) ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + SetCurrentFunction( FuCopy::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + } + Cancel(); + rReq.Ignore (); + } + break; + + case SID_INSERTFILE: // BASIC + { + Broadcast (ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START)); + SetCurrentFunction( FuInsertFile::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Broadcast (ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END)); + Cancel(); + rReq.Done (); + } + break; + + case SID_SELECT_BACKGROUND: + case SID_SAVE_BACKGROUND: + case SID_ATTR_PAGE_SIZE: + case SID_ATTR_PAGE: + case SID_PAGESETUP: // BASIC ?? + { + SetCurrentFunction( FuPage::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); // we generate independent macros !! + } + break; + + case SID_BEFORE_OBJ: + case SID_BEHIND_OBJ: + { + SetCurrentFunction( FuDisplayOrder::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + rReq.Done(); + // finishes itself, no Cancel() needed! + } + break; + + case SID_REVERSE_ORDER: // BASIC + { + mpDrawView->ReverseOrderOfMarked(); + Cancel(); + rReq.Done (); + } + break; + + case SID_ANIMATION_EFFECTS: + { + SetCurrentFunction( FuObjectAnimationParameters::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); + } + break; + + case SID_EXECUTE_ANIMATION_EFFECT: + { + SetCurrentFunction(FuExecuteInteraction::Create(this, GetActiveWindow(), + mpDrawView.get(), GetDoc(), rReq)); + Cancel(); + } + break; + + case SID_LINEEND_POLYGON: + { + SetCurrentFunction( FuLineEnd::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_CAPTUREPOINT: + // negative value to signal call from menu + maMousePos = Point(-1,-1); + [[fallthrough]]; + case SID_SET_SNAPITEM: + { + SetCurrentFunction( FuSnapLine::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); + } + break; + + case SID_MANAGE_LINKS: + { + SetCurrentFunction( FuLink::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_THESAURUS: + { + SetCurrentFunction( FuThesaurus::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_TEXTATTR_DLG: + { + if (mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + SetCurrentFunction( FuTextAttrDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_MEASURE_DLG: + { + SetCurrentFunction( FuMeasureDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_CONNECTION_DLG: + { + SetCurrentFunction( FuConnectionDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Done(); + } + break; + + case SID_CONNECTION_NEW_ROUTING: + { + SfxItemSetFixed aDefAttr( GetPool() ); + GetView()->SetAttributes( aDefAttr, true ); // (ReplaceAll) + + Cancel(); + rReq.Done(); + } + break; + + case SID_TWAIN_SELECT: + { + if( mxScannerManager.is() ) + { + try + { + const css::uno::Sequence< css::scanner::ScannerContext > + aContexts( mxScannerManager->getAvailableScanners() ); + + if( aContexts.hasElements() ) + { + css::scanner::ScannerContext aContext( aContexts.getConstArray()[ 0 ] ); + + Reference xInit(mxScannerManager, UNO_QUERY); + if (xInit.is()) + { + // initialize dialog + weld::Window* pWindow = rReq.GetFrameWeld(); + uno::Sequence aSeq(comphelper::InitAnyPropertySequence( + { + {"ParentWindow", pWindow ? uno::Any(pWindow->GetXWindow()) : uno::Any(Reference())} + })); + xInit->initialize( aSeq ); + } + + mxScannerManager->configureScannerAndScan( aContext, mxScannerListener ); + } + } + catch(...) + { + } + } + + Cancel(); + rReq.Done(); + } + break; + + case SID_TWAIN_TRANSFER: + { + bool bDone = false; + + if( mxScannerManager.is() ) + { + try + { + const css::uno::Sequence< css::scanner::ScannerContext > aContexts( mxScannerManager->getAvailableScanners() ); + + if( aContexts.hasElements() ) + { + mxScannerManager->startScan( aContexts.getConstArray()[ 0 ], mxScannerListener ); + bDone = true; + } + } + catch( ... ) + { + } + } + + if( !bDone ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, +#ifndef UNX + SdResId(STR_TWAIN_NO_SOURCE) +#else + SdResId(STR_TWAIN_NO_SOURCE_UNX) +#endif + )); + xInfoBox->run(); + + } + else + { + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_TWAIN_SELECT ); + rBindings.Invalidate( SID_TWAIN_TRANSFER ); + } + + Cancel(); + rReq.Done(); + } + break; + + case SID_POLYGON_MORPHING: + { + SetCurrentFunction( FuMorph::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_INSERTLAYER: + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin(); + sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount(); + sal_uInt16 nLayer = nLayerCnt - 2 + 1; + OUString aLayerName = SdResId(STR_LAYER) + OUString::number(nLayer); + OUString aLayerTitle, aLayerDesc; + bool bIsVisible = false; + bool bIsLocked = false; + bool bIsPrintable = false; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + if (! pArgs) + { + SfxItemSetFixed aNewAttr( GetDoc()->GetPool() ); + + aNewAttr.Put( makeSdAttrLayerName( aLayerName ) ); + aNewAttr.Put( makeSdAttrLayerTitle() ); + aNewAttr.Put( makeSdAttrLayerDesc() ); + aNewAttr.Put( makeSdAttrLayerVisible() ); + aNewAttr.Put( makeSdAttrLayerPrintable() ); + aNewAttr.Put( makeSdAttrLayerLocked() ); + aNewAttr.Put( makeSdAttrLayerThisPage() ); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg( pFact->CreateSdInsertLayerDlg(pWin ? pWin->GetFrameWeld() : nullptr, aNewAttr, true, SdResId(STR_INSERTLAYER)) ); + pDlg->SetHelpId( SD_MOD()->GetSlotPool()->GetSlot( SID_INSERTLAYER )->GetCommand() ); + + // test for already existing names + bool bLoop = true; + while( bLoop && pDlg->Execute() == RET_OK ) + { + pDlg->GetAttr( aNewAttr ); + aLayerName = aNewAttr.Get(ATTR_LAYER_NAME).GetValue (); + + if( rLayerAdmin.GetLayer( aLayerName ) + || aLayerName.isEmpty() + || LayerTabBar::IsLocalizedNameOfStandardLayer( aLayerName) ) + { + // name already exists + std::unique_ptr xWarn(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_WARN_NAME_DUPLICATE))); + xWarn->run(); + } + else + bLoop = false; + } + if( bLoop ) // was canceled + { + pDlg.disposeAndClear(); + Cancel(); + rReq.Ignore (); + break; + } + else + { + aLayerTitle = aNewAttr.Get(ATTR_LAYER_TITLE).GetValue(); + aLayerDesc = aNewAttr.Get(ATTR_LAYER_DESC).GetValue (); + bIsVisible = static_cast( aNewAttr.Get (ATTR_LAYER_VISIBLE)).GetValue (); + bIsLocked = static_cast( aNewAttr.Get (ATTR_LAYER_LOCKED)).GetValue () ; + bIsPrintable = static_cast( aNewAttr.Get (ATTR_LAYER_PRINTABLE)).GetValue () ; + } + } + else if (pArgs->Count () != 4) + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + Cancel(); + rReq.Ignore (); + break; + } + else + { + const SfxStringItem* pLayerName = rReq.GetArg(ID_VAL_LAYERNAME); + const SfxBoolItem* pIsVisible = rReq.GetArg(ID_VAL_ISVISIBLE); + const SfxBoolItem* pIsLocked = rReq.GetArg(ID_VAL_ISLOCKED); + const SfxBoolItem* pIsPrintable = rReq.GetArg(ID_VAL_ISPRINTABLE); + + aLayerName = pLayerName->GetValue (); + bIsVisible = pIsVisible->GetValue (); + bIsLocked = pIsLocked->GetValue (); + bIsPrintable = pIsPrintable->GetValue (); + } + + OUString aPrevLayer = mpDrawView->GetActiveLayer(); + SdrLayer* pLayer; + sal_uInt16 nPrevLayer = 0; + nLayerCnt = rLayerAdmin.GetLayerCount(); + + for ( nLayer = 0; nLayer < nLayerCnt; nLayer++ ) + { + pLayer = rLayerAdmin.GetLayer(nLayer); + OUString aName = pLayer->GetName(); + + if ( aPrevLayer == aName ) + { + nPrevLayer = std::max(nLayer, sal_uInt16(4)); + } + } + + mpDrawView->InsertNewLayer(aLayerName, nPrevLayer + 1); + pLayer = rLayerAdmin.GetLayer(aLayerName); + if( pLayer ) + { + pLayer->SetTitle( aLayerTitle ); + pLayer->SetDescription( aLayerDesc ); + } + + mpDrawView->SetLayerVisible( aLayerName, bIsVisible ); + mpDrawView->SetLayerLocked( aLayerName, bIsLocked); + mpDrawView->SetLayerPrintable(aLayerName, bIsPrintable); + + mpDrawView->SetActiveLayer(aLayerName); + + ResetActualLayer(); + + GetDoc()->SetChanged(); + + GetViewFrame()->GetDispatcher()->Execute(SID_SWITCHLAYER, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + + Cancel(); + rReq.Done (); + } + break; + + case SID_MODIFYLAYER: + { + if(!GetLayerTabControl()) // #i87182# + { + OSL_ENSURE(false, "No LayerTabBar (!)"); + Cancel(); + rReq.Ignore(); + break; + } + + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin(); + sal_uInt16 nCurPage = GetLayerTabControl()->GetCurPageId(); + OUString aLayerName = GetLayerTabControl()->GetLayerName(nCurPage); + SdrLayer* pLayer = rLayerAdmin.GetLayer(aLayerName); + + OUString aLayerTitle = pLayer->GetTitle(); + OUString aLayerDesc = pLayer->GetDescription(); + + OUString aOldLayerName(aLayerName); + OUString aOldLayerTitle(aLayerTitle); + OUString aOldLayerDesc(aLayerDesc); + + bool bIsVisible, bIsLocked, bIsPrintable; + bool bOldIsVisible = bIsVisible = mpDrawView->IsLayerVisible(aLayerName); + bool bOldIsLocked = bIsLocked = mpDrawView->IsLayerLocked(aLayerName); + bool bOldIsPrintable = bIsPrintable = mpDrawView->IsLayerPrintable(aLayerName); + + const SfxItemSet* pArgs = rReq.GetArgs(); + // is it allowed to delete the layer? + bool bDelete = !( LayerTabBar::IsRealNameOfStandardLayer(aLayerName) ); + + if (! pArgs) + { + SfxItemSetFixed aNewAttr( GetDoc()->GetPool() ); + + aNewAttr.Put( makeSdAttrLayerName( aLayerName ) ); + aNewAttr.Put( makeSdAttrLayerTitle( aLayerTitle ) ); + aNewAttr.Put( makeSdAttrLayerDesc( aLayerDesc ) ); + aNewAttr.Put( makeSdAttrLayerVisible( bIsVisible ) ); + aNewAttr.Put( makeSdAttrLayerLocked( bIsLocked ) ); + aNewAttr.Put( makeSdAttrLayerPrintable( bIsPrintable ) ); + aNewAttr.Put( makeSdAttrLayerThisPage() ); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg( pFact->CreateSdInsertLayerDlg(pWin ? pWin->GetFrameWeld() : nullptr, aNewAttr, bDelete, SdResId(STR_MODIFYLAYER)) ); + pDlg->SetHelpId( SD_MOD()->GetSlotPool()->GetSlot( SID_MODIFYLAYER )->GetCommand() ); + + // test for already existing names + bool bLoop = true; + sal_uInt16 nRet = 0; + while( bLoop ) + { + nRet = pDlg->Execute(); + if (nRet != RET_OK) + break; + pDlg->GetAttr( aNewAttr ); + aLayerName = aNewAttr.Get(ATTR_LAYER_NAME).GetValue (); + if (bDelete) + { + if( (rLayerAdmin.GetLayer( aLayerName ) && aLayerName != aOldLayerName) + || LayerTabBar::IsRealNameOfStandardLayer(aLayerName) + || LayerTabBar::IsLocalizedNameOfStandardLayer(aLayerName) + || aLayerName.isEmpty() ) + { + // name already exists + std::unique_ptr xWarn(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Warning, VclButtonsType::Ok, + SdResId(STR_WARN_NAME_DUPLICATE))); + xWarn->run(); + } + else + bLoop = false; + } + else + bLoop = false; // altering name is already disabled in the dialog itself + } + switch (nRet) + { + case RET_OK : + aLayerTitle = aNewAttr.Get(ATTR_LAYER_TITLE).GetValue (); + aLayerDesc = aNewAttr.Get(ATTR_LAYER_DESC).GetValue (); + bIsVisible = static_cast( aNewAttr.Get (ATTR_LAYER_VISIBLE)).GetValue (); + bIsLocked = static_cast( aNewAttr.Get (ATTR_LAYER_LOCKED)).GetValue (); + bIsPrintable = static_cast( aNewAttr.Get (ATTR_LAYER_PRINTABLE)).GetValue (); + break; + + default : + pDlg.disposeAndClear(); + rReq.Ignore (); + Cancel (); + return; + } + } + else if (pArgs->Count () == 4) + { + const SfxStringItem* pLayerName = rReq.GetArg(ID_VAL_LAYERNAME); + const SfxBoolItem* pIsVisible = rReq.GetArg(ID_VAL_ISVISIBLE); + const SfxBoolItem* pIsLocked = rReq.GetArg(ID_VAL_ISLOCKED); + const SfxBoolItem* pIsPrintable = rReq.GetArg(ID_VAL_ISPRINTABLE); + + aLayerName = pLayerName->GetValue (); + bIsVisible = pIsVisible->GetValue (); + bIsLocked = pIsLocked->GetValue (); + bIsPrintable = pIsPrintable->GetValue (); + } + else + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + Cancel (); + rReq.Ignore (); + break; + } + + SfxUndoManager* pManager = GetDoc()->GetDocSh()->GetUndoManager(); + std::unique_ptr pAction( new SdLayerModifyUndoAction( + GetDoc(), + pLayer, + // old values + aOldLayerName, + aOldLayerTitle, + aOldLayerDesc, + bOldIsVisible, + bOldIsLocked, + bOldIsPrintable, + // new values + aLayerName, + aLayerTitle, + aLayerDesc, + bIsVisible, + bIsLocked, + bIsPrintable + ) ); + pManager->AddUndoAction( std::move(pAction) ); + + ModifyLayer( pLayer, aLayerName, aLayerTitle, aLayerDesc, bIsVisible, bIsLocked, bIsPrintable ); + + Cancel(); + rReq.Done (); + } + break; + + case SID_TOGGLELAYERVISIBILITY: + { + // tdf#113439; duplicates LayerTabBar::MouseButtonDown() + sal_uInt16 aTabId = GetLayerTabControl()->GetCurPageId(); + OUString aName( GetLayerTabControl()->GetLayerName(aTabId) ); + + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + bool bVisible = !pPV->IsLayerVisible(aName); + + pPV->SetLayerVisible(aName, bVisible); + + ResetActualLayer(); + GetDoc()->SetChanged(); + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_RENAMELAYER: + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + if(GetLayerTabControl()) // #i87182# + { + GetLayerTabControl()->StartEditMode(GetLayerTabControl()->GetCurPageId()); + } + else + { + OSL_ENSURE(false, "No LayerTabBar (!)"); + } + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_EDIT_HYPERLINK : + { + // Ensure the field is selected first + OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView(); + if (pOutView) + pOutView->SelectFieldAtCursor(); + + GetViewFrame()->GetDispatcher()->Execute( SID_HYPERLINK_DIALOG ); + + Cancel(); + rReq.Done (); + } + break; + + case SID_OPEN_HYPERLINK: + { + OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView(); + if ( pOutView ) + { + const SvxFieldItem* pFieldItem + = pOutView->GetFieldAtSelection(/*AlsoCheckBeforeCursor=*/true); + const SvxFieldData* pField = pFieldItem ? pFieldItem->GetField() : nullptr; + if( auto pURLField = dynamic_cast< const SvxURLField *>( pField ) ) + { + SfxStringItem aUrl( SID_FILE_NAME, pURLField->GetURL() ); + SfxStringItem aTarget( SID_TARGETNAME, pURLField->GetTargetFrame() ); + + OUString aReferName; + SfxViewFrame* pFrame = GetViewFrame(); + SfxMedium* pMed = pFrame->GetObjectShell()->GetMedium(); + if (pMed) + aReferName = pMed->GetName(); + + SfxFrameItem aFrm( SID_DOCFRAME, pFrame ); + SfxStringItem aReferer( SID_REFERER, aReferName ); + + SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, false ); + SfxBoolItem aBrowsing( SID_BROWSE, true ); + + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + { + pViewFrm->GetDispatcher()->ExecuteList(SID_OPENDOC, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aUrl, &aTarget, &aFrm, &aReferer, + &aNewView, &aBrowsing }); + } + } + } + Cancel(); + rReq.Done (); + } + break; + + case SID_COPY_HYPERLINK_LOCATION: + { + OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView(); + if ( pOutView ) + { + const SvxFieldItem* pFieldItem + = pOutView->GetFieldAtSelection(/*AlsoCheckBeforeCursor=*/true); + const SvxFieldData* pField = pFieldItem ? pFieldItem->GetField() : nullptr; + if (const SvxURLField* pURLField = dynamic_cast(pField)) + { + uno::Reference xClipboard + = pOutView->GetWindow()->GetClipboard(); + + vcl::unohelper::TextDataObject::CopyStringTo(pURLField->GetURL(), xClipboard, SfxViewShell::Current()); + } + } + + Cancel(); + rReq.Done (); + } + break; + + case SID_HYPERLINK_SETLINK: + { + const SfxItemSet* pReqArgs = rReq.GetArgs(); + + if (pReqArgs) + { + const SvxHyperlinkItem* pHLItem = + &pReqArgs->Get(SID_HYPERLINK_SETLINK); + + if (pHLItem->GetInsertMode() == HLINK_FIELD) + { + InsertURLField(pHLItem->GetURL(), pHLItem->GetName(), + pHLItem->GetTargetFrame()); + } + else if (pHLItem->GetInsertMode() == HLINK_BUTTON) + { + InsertURLButton(pHLItem->GetURL(), pHLItem->GetName(), + pHLItem->GetTargetFrame(), nullptr); + } + else if (pHLItem->GetInsertMode() == HLINK_DEFAULT) + { + OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView(); + + if (pOlView || comphelper::LibreOfficeKit::isActive()) + { + InsertURLField(pHLItem->GetURL(), pHLItem->GetName(), + pHLItem->GetTargetFrame()); + } + else + { + InsertURLButton(pHLItem->GetURL(), pHLItem->GetName(), + pHLItem->GetTargetFrame(), nullptr); + } + } + } + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_HIDE_LAST_LEVEL: + { + ESelection aSel; + // fdo#78151 editing a PresObjKind::Outline in a master page ? + ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel); + if (pOL) + { + //we are on the last paragraph + aSel.Adjust(); + if (aSel.nEndPara == pOL->GetParagraphCount() - 1) + { + sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara); + //there exists a previous numbering level + if (nDepth != sal_uInt16(-1) && nDepth > 0) + { + Paragraph* pPara = pOL->GetParagraph(aSel.nEndPara); + pOL->Remove(pPara, 1); + } + } + } + Cancel(); + rReq.Done (); + } + break; + + case SID_SHOW_NEXT_LEVEL: + { + const TranslateId STR_PRESOBJ_MPOUTLINE_ARY[] + { + STR_PRESOBJ_MPOUTLINE, + STR_PRESOBJ_MPOUTLLAYER2, + STR_PRESOBJ_MPOUTLLAYER3, + STR_PRESOBJ_MPOUTLLAYER4, + STR_PRESOBJ_MPOUTLLAYER5, + STR_PRESOBJ_MPOUTLLAYER6, + STR_PRESOBJ_MPOUTLLAYER7, + STR_PRESOBJ_MPNOTESTITLE, + STR_PRESOBJ_MPNOTESTEXT, + STR_PRESOBJ_NOTESTEXT + }; + + ESelection aSel; + // fdo#78151 editing a PresObjKind::Outline in a master page ? + ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel); + if (pOL) + { + //we are on the last paragraph + aSel.Adjust(); + if (aSel.nEndPara == pOL->GetParagraphCount() - 1) + { + sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara); + //there exists a previous numbering level + if (nDepth < 8) + { + sal_uInt16 nNewDepth = nDepth+1; + pOL->Insert(SdResId(STR_PRESOBJ_MPOUTLINE_ARY[nNewDepth]), EE_PARA_APPEND, nNewDepth); + } + } + } + Cancel(); + rReq.Done (); + } + break; + + case SID_INSERT_FLD_DATE_FIX: + case SID_INSERT_FLD_DATE_VAR: + case SID_INSERT_FLD_TIME_FIX: + case SID_INSERT_FLD_TIME_VAR: + case SID_INSERT_FLD_AUTHOR: + case SID_INSERT_FLD_PAGE: + case SID_INSERT_FLD_PAGE_TITLE: + case SID_INSERT_FLD_PAGES: + case SID_INSERT_FLD_FILE: + { + sal_uInt16 nMul = 1; + std::unique_ptr pFieldItem; + + switch( nSId ) + { + case SID_INSERT_FLD_DATE_FIX: + pFieldItem.reset(new SvxFieldItem( + SvxDateField( Date( Date::SYSTEM ), SvxDateType::Fix ), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_DATE_VAR: + pFieldItem.reset(new SvxFieldItem( SvxDateField(), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_TIME_FIX: + pFieldItem.reset(new SvxFieldItem( + SvxExtTimeField( ::tools::Time( ::tools::Time::SYSTEM ), SvxTimeType::Fix ), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_TIME_VAR: + pFieldItem.reset(new SvxFieldItem( SvxExtTimeField(), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_AUTHOR: + { + SvtUserOptions aUserOptions; + pFieldItem.reset(new SvxFieldItem( + SvxAuthorField( + aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() ), EE_FEATURE_FIELD )); + } + break; + + case SID_INSERT_FLD_PAGE: + { + pFieldItem.reset(new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD )); + nMul = 3; + } + break; + + case SID_INSERT_FLD_PAGE_TITLE: + { + pFieldItem.reset(new SvxFieldItem( SvxPageTitleField(), EE_FEATURE_FIELD)); + nMul = 3; + } + break; + + case SID_INSERT_FLD_PAGES: + { + pFieldItem.reset(new SvxFieldItem( SvxPagesField(), EE_FEATURE_FIELD )); + nMul = 3; + } + break; + + case SID_INSERT_FLD_FILE: + { + OUString aName; + if( GetDocSh()->HasName() ) + aName = GetDocSh()->GetMedium()->GetName(); + pFieldItem.reset(new SvxFieldItem( SvxExtFileField( aName ), EE_FEATURE_FIELD )); + } + break; + } + + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + + if( pOLV ) + { + const SvxFieldItem* pOldFldItem = pOLV->GetFieldAtSelection(); + + if( pOldFldItem && ( nullptr != dynamic_cast< const SvxURLField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxDateField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxTimeField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxPageField *>( pOldFldItem->GetField() ) ) ) + { + // select field, then it will be deleted when inserting + ESelection aSel = pOLV->GetSelection(); + if( aSel.nStartPos == aSel.nEndPos ) + aSel.nEndPos++; + pOLV->SetSelection( aSel ); + } + + if( pFieldItem ) + pOLV->InsertField( *pFieldItem ); + } + else + { + Outliner* pOutl = GetDoc()->GetInternalOutliner(); + pOutl->Init( OutlinerMode::TextObject ); + OutlinerMode nOutlMode = pOutl->GetOutlinerMode(); + pOutl->SetStyleSheet( 0, nullptr ); + pOutl->QuickInsertField( *pFieldItem, ESelection() ); + std::optional pOutlParaObject = pOutl->CreateParaObject(); + + rtl::Reference pRectObj = new SdrRectObj( + *GetDoc(), + SdrObjKind::Text); + pRectObj->SetMergedItem(makeSdrTextAutoGrowWidthItem(true)); + + pOutl->UpdateFields(); + pOutl->SetUpdateLayout( true ); + Size aSize( pOutl->CalcTextSize() ); + aSize.setWidth( aSize.Width() * nMul ); + pOutl->SetUpdateLayout( false ); + + Point aPos; + ::tools::Rectangle aRect( aPos, GetActiveWindow()->GetOutputSizePixel() ); + aPos = aRect.Center(); + aPos = GetActiveWindow()->PixelToLogic(aPos); + aPos.AdjustX( -(aSize.Width() / 2) ); + aPos.AdjustY( -(aSize.Height() / 2) ); + + ::tools::Rectangle aLogicRect(aPos, aSize); + pRectObj->SetLogicRect(aLogicRect); + pRectObj->SetOutlinerParaObject( std::move(pOutlParaObject) ); + mpDrawView->InsertObjectAtView(pRectObj.get(), *mpDrawView->GetSdrPageView()); + pOutl->Init( nOutlMode ); + } + + pFieldItem.reset(); + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_MODIFY_FIELD: + { + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + + if( pOLV ) + { + const SvxFieldItem* pFldItem = pOLV->GetFieldAtSelection(); + + if( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) ) + { + // Dialog... + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg( pFact->CreateSdModifyFieldDlg(pWin ? pWin->GetFrameWeld() : nullptr, pFldItem->GetField(), pOLV->GetAttribs() ) ); + if( pDlg->Execute() == RET_OK ) + { + // To make a correct SetAttribs() call at the utlinerView + // it is necessary to split the actions here + std::unique_ptr pField(pDlg->GetField()); + ESelection aSel = pOLV->GetSelection(); + bool bSelectionWasModified(false); + + if( pField ) + { + SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD ); + + if( aSel.nStartPos == aSel.nEndPos ) + { + bSelectionWasModified = true; + aSel.nEndPos++; + pOLV->SetSelection( aSel ); + } + + pOLV->InsertField( aFieldItem ); + + // select again for eventual SetAttribs call + pOLV->SetSelection( aSel ); + } + + SfxItemSet aSet( pDlg->GetItemSet() ); + + if( aSet.Count() ) + { + pOLV->SetAttribs( aSet ); + + ::Outliner* pOutliner = pOLV->GetOutliner(); + if( pOutliner ) + pOutliner->UpdateFields(); + } + + if(pField) + { + // restore selection to original + if(bSelectionWasModified) + { + aSel.nEndPos--; + pOLV->SetSelection( aSel ); + } + } + } + } + } + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_OPEN_XML_FILTERSETTINGS: + { + try + { + css::uno::Reference < css::ui::dialogs::XExecutableDialog > xDialog = css::ui::dialogs::XSLTFilterDialog::create( ::comphelper::getProcessComponentContext() ); + xDialog->execute(); + } + catch( css::uno::RuntimeException& ) + { + DBG_UNHANDLED_EXCEPTION("sd.view"); + } + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_GROUP: // BASIC + { + if ( mpDrawView->IsPresObjSelected( true, true, true ) ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + mpDrawView->GroupMarked(); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_UNGROUP: // BASIC + { + mpDrawView->UnGroupMarked(); + Cancel(); + rReq.Done (); + } + break; + + case SID_NAME_GROUP: + { + // only allow for single object selection since the name of an object needs + // to be unique + if(1 == mpDrawView->GetMarkedObjectCount()) + { + // #i68101# + SdrObject* pSelected = mpDrawView->GetMarkedObjectByIndex(0); + OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)"); + OUString aName(pSelected->GetName()); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSvxObjectNameDialog(GetFrameWeld(), aName)); + + pDlg->SetCheckNameHdl(LINK(this, DrawViewShell, NameObjectHdl)); + + if(RET_OK == pDlg->Execute()) + { + pDlg->GetName(aName); + pSelected->SetName(aName); + + SdPage* pPage = GetActualPage(); + if (pPage) + pPage->notifyObjectRenamed(pSelected); + } + } + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_NAVIGATOR_STATE, true ); + rBindings.Invalidate( SID_CONTEXT ); + + Cancel(); + rReq.Ignore(); + break; + } + + // #i68101# + case SID_OBJECT_TITLE_DESCRIPTION: + { + if(1 == mpDrawView->GetMarkedObjectCount()) + { + SdrObject* pSelected = mpDrawView->GetMarkedObjectByIndex(0); + OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)"); + OUString aTitle(pSelected->GetTitle()); + OUString aDescription(pSelected->GetDescription()); + bool isDecorative(pSelected->IsDecorative()); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateSvxObjectTitleDescDialog( + GetFrameWeld(), aTitle, aDescription, isDecorative)); + + if(RET_OK == pDlg->Execute()) + { + pDlg->GetTitle(aTitle); + pDlg->GetDescription(aDescription); + pDlg->IsDecorative(isDecorative); + pSelected->SetTitle(aTitle); + pSelected->SetDescription(aDescription); + pSelected->SetDecorative(isDecorative); + } + } + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_NAVIGATOR_STATE, true ); + rBindings.Invalidate( SID_CONTEXT ); + + Cancel(); + rReq.Ignore(); + break; + } + + case SID_ENTER_GROUP: // BASIC + { + mpDrawView->EnterMarkedGroup(); + Cancel(); + rReq.Done (); + } + break; + + case SID_LEAVE_GROUP: // BASIC + { + mpDrawView->LeaveOneGroup(); + Cancel(); + rReq.Done (); + } + break; + + case SID_LEAVE_ALL_GROUPS: // BASIC + { + mpDrawView->LeaveAllGroup(); + Cancel(); + rReq.Done (); + } + break; + + case SID_TEXT_COMBINE: // BASIC + { + // End text edit to avoid conflicts + if(mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->CombineMarkedTextObjects(); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_COMBINE: // BASIC + { + // End text edit to avoid conflicts + if(mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->CombineMarkedObjects(false); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_DISTRIBUTE_HLEFT: + case SID_DISTRIBUTE_HCENTER: + case SID_DISTRIBUTE_HDISTANCE: + case SID_DISTRIBUTE_HRIGHT: + case SID_DISTRIBUTE_VTOP: + case SID_DISTRIBUTE_VCENTER: + case SID_DISTRIBUTE_VDISTANCE: + case SID_DISTRIBUTE_VBOTTOM: + { + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + mpDrawView->DistributeMarkedObjects(nSId); + } + Cancel(); + rReq.Done (); + } + break; + case SID_POLY_MERGE: + { + // End text edit to avoid conflicts + if(mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->MergeMarkedObjects(SdrMergeMode::Merge); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_POLY_SUBSTRACT: + { + // End text edit to avoid conflicts + if(mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->MergeMarkedObjects(SdrMergeMode::Subtract); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_POLY_INTERSECT: + { + // End text edit to avoid conflicts + if(mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->MergeMarkedObjects(SdrMergeMode::Intersect); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_EQUALIZEWIDTH: + case SID_EQUALIZEHEIGHT: + { + // End text edit to avoid conflicts + if(mpDrawView->IsTextEdit()) + mpDrawView->SdrEndTextEdit(); + + mpDrawView->EqualizeMarkedObjects(nSId == SID_EQUALIZEWIDTH); + Cancel(); + rReq.Done (); + } + break; + + case SID_DISMANTLE: // BASIC + { + if ( mpDrawView->IsDismantlePossible() ) + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->DismantleMarkedObjects(); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_CONNECT: // BASIC + { + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->CombineMarkedObjects(); + } + Cancel(); + rReq.Done (); + } + break; + + case SID_BREAK: // BASIC + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + if ( mpDrawView->IsBreak3DObjPossible() ) + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->Break3DObj(); + } + else if ( mpDrawView->IsDismantlePossible(true) ) + { + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->DismantleMarkedObjects(true); + } + else if ( mpDrawView->IsImportMtfPossible() ) + { + weld::WaitObject aWait(GetFrameWeld()); + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nCnt=rMarkList.GetMarkCount(); + + // determine the sum of meta objects of all selected meta files + sal_uLong nCount = 0; + for(size_t nm=0; nmGetMarkedSdrObj(); + SdrGrafObj* pGraf= dynamic_cast< SdrGrafObj *>( pObj ); + SdrOle2Obj* pOle2= dynamic_cast< SdrOle2Obj *>( pObj ); + + if (pGraf != nullptr) + { + if (pGraf->HasGDIMetaFile()) + { + nCount += pGraf->GetGraphic().GetGDIMetaFile().GetActionSize(); + } + else if (pGraf->isEmbeddedVectorGraphicData()) + { + nCount += pGraf->getMetafileFromEmbeddedVectorGraphicData().GetActionSize(); + } + } + + if(pOle2 && pOle2->GetGraphic()) + { + nCount += pOle2->GetGraphic()->GetGDIMetaFile().GetActionSize(); + } + } + + // decide with the sum of all meta objects if we should show a dialog + if(nCount < MIN_ACTIONS_FOR_DIALOG) + { + // nope, no dialog + mpDrawView->DoImportMarkedMtf(); + } + else + { + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateBreakDlg(GetFrameWeld(), mpDrawView.get(), GetDocSh(), nCount, static_cast(nCnt) )); + pDlg->Execute(); + } + } + + Cancel(); + rReq.Done (); + } + break; + + case SID_CONVERT_TO_3D: + { + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + if (mpDrawView->IsConvertTo3DObjPossible()) + { + if (mpDrawView->IsTextEdit()) + { + mpDrawView->SdrEndTextEdit(); + } + + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->ConvertMarkedObjTo3D(); + } + } + + Cancel(); + rReq.Done(); + } + break; + + case SID_FRAME_TO_TOP: // BASIC + { + mpDrawView->PutMarkedToTop(); + Cancel(); + rReq.Done (); + } + break; + + case SID_MOREFRONT: // BASIC + case SID_FRAME_UP: // BASIC + { + mpDrawView->MovMarkedToTop(); + Cancel(); + rReq.Done (); + } + break; + + case SID_MOREBACK: // BASIC + case SID_FRAME_DOWN: // BASIC + { + mpDrawView->MovMarkedToBtm(); + Cancel(); + rReq.Done (); + } + break; + + case SID_FRAME_TO_BOTTOM: // BASIC + { + mpDrawView->PutMarkedToBtm(); + Cancel(); + rReq.Done (); + } + break; + + case SID_HORIZONTAL: // BASIC + case SID_FLIP_HORIZONTAL: + { + mpDrawView->MirrorAllMarkedHorizontal(); + Cancel(); + rReq.Done (); + } + break; + + case SID_VERTICAL: // BASIC + case SID_FLIP_VERTICAL: + { + mpDrawView->MirrorAllMarkedVertical(); + Cancel(); + rReq.Done (); + } + break; + + case SID_OBJECT_ALIGN_LEFT: // BASIC + { + mpDrawView->AlignMarkedObjects(SdrHorAlign::Left, SdrVertAlign::NONE); + Cancel(); + rReq.Done (); + } + break; + + case SID_OBJECT_ALIGN_CENTER: // BASIC + { + mpDrawView->AlignMarkedObjects(SdrHorAlign::Center, SdrVertAlign::NONE); + Cancel(); + rReq.Done (); + } + break; + + case SID_OBJECT_ALIGN_RIGHT: // BASIC + { + mpDrawView->AlignMarkedObjects(SdrHorAlign::Right, SdrVertAlign::NONE); + Cancel(); + rReq.Done (); + } + break; + + case SID_OBJECT_ALIGN_UP: // BASIC + { + mpDrawView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Top); + Cancel(); + rReq.Done (); + } + break; + + case SID_OBJECT_ALIGN_MIDDLE: // BASIC + { + mpDrawView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Center); + Cancel(); + rReq.Done (); + } + break; + + case SID_OBJECT_ALIGN_DOWN: // BASIC + { + mpDrawView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Bottom); + Cancel(); + rReq.Done (); + } + break; + + case SID_SELECTALL: // BASIC + { + if( (dynamic_cast( GetOldFunction().get() ) != nullptr) && + !GetView()->IsFrameDragSingles() && GetView()->HasMarkablePoints()) + { + if ( !mpDrawView->IsAction() ) + mpDrawView->MarkAllPoints(); + } + else + mpDrawView->SelectAll(); + + FreshNavigatrTree(); + + Cancel(); + rReq.Done (); + } + break; + + case SID_STYLE_NEW: // BASIC ??? + case SID_STYLE_APPLY: + case SID_STYLE_EDIT: + case SID_STYLE_DELETE: + case SID_STYLE_HIDE: + case SID_STYLE_SHOW: + case SID_STYLE_FAMILY: + case SID_STYLE_WATERCAN: + case SID_STYLE_UPDATE_BY_EXAMPLE: + case SID_STYLE_NEW_BY_EXAMPLE: + { + if( rReq.GetSlot() == SID_STYLE_EDIT && !rReq.GetArgs() ) + { + SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet(); + if( pStyleSheet && pStyleSheet->GetFamily() == SfxStyleFamily::Page) + pStyleSheet = static_cast(pStyleSheet)->GetPseudoStyleSheet(); + + if( (pStyleSheet == nullptr) && GetView()->IsTextEdit() ) + { + GetView()->SdrEndTextEdit(); + + pStyleSheet = mpDrawView->GetStyleSheet(); + if(pStyleSheet && pStyleSheet->GetFamily() == SfxStyleFamily::Page) + pStyleSheet = static_cast(pStyleSheet)->GetPseudoStyleSheet(); + } + + if( pStyleSheet == nullptr ) + { + rReq.Ignore(); + break; + } + + SfxAllItemSet aSet(GetDoc()->GetPool()); + + SfxStringItem aStyleNameItem( SID_STYLE_EDIT, pStyleSheet->GetName() ); + aSet.Put(aStyleNameItem); + + SfxUInt16Item aStyleFamilyItem( SID_STYLE_FAMILY, static_cast(pStyleSheet->GetFamily()) ); + aSet.Put(aStyleFamilyItem); + + rReq.SetArgs(aSet); + } + + if( rReq.GetArgs() ) + { + SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + if( rReq.GetSlot() == SID_STYLE_APPLY ) + GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY ); + Cancel(); + } + else if( rReq.GetSlot() == SID_STYLE_APPLY ) + GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SfxCallMode::ASYNCHRON ); + rReq.Ignore (); + } + break; + + case SID_IMAP: + { + sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId(); + + GetViewFrame()->ToggleChildWindow( nId ); + GetViewFrame()->GetBindings().Invalidate( SID_IMAP ); + + if ( GetViewFrame()->HasChildWindow( nId ) + && ( ( ViewShell::Implementation::GetImageMapDialog() ) != nullptr ) ) + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if ( rMarkList.GetMarkCount() == 1 ) + UpdateIMapDlg( rMarkList.GetMark( 0 )->GetMarkedSdrObj() ); + } + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_GRID_FRONT: + { + mpDrawView->SetGridFront( !mpDrawView->IsGridFront() ); + Cancel(); + rReq.Done (); + } + break; + + case SID_HELPLINES_FRONT: + { + mpDrawView->SetHlplFront( !mpDrawView->IsHlplFront() ); + Cancel(); + rReq.Done (); + } + break; + + case SID_FONTWORK: + { + if ( rReq.GetArgs() ) + { + GetViewFrame()->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(), + static_cast(rReq.GetArgs()-> + Get(SID_FONTWORK)).GetValue()); + } + else + { + GetViewFrame()->ToggleChildWindow( SvxFontWorkChildWindow::GetChildWindowId() ); + } + + GetViewFrame()->GetBindings().Invalidate(SID_FONTWORK); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_COLOR_CONTROL: + { + if ( rReq.GetArgs() ) + GetViewFrame()->SetChildWindow(SvxColorChildWindow::GetChildWindowId(), + rReq.GetArgs()->Get(SID_COLOR_CONTROL).GetValue()); + else + GetViewFrame()->ToggleChildWindow(SvxColorChildWindow::GetChildWindowId() ); + + GetViewFrame()->GetBindings().Invalidate(SID_COLOR_CONTROL); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_EXTRUSION_TOGGLE: + case SID_EXTRUSION_TILT_DOWN: + case SID_EXTRUSION_TILT_UP: + case SID_EXTRUSION_TILT_LEFT: + case SID_EXTRUSION_TILT_RIGHT: + case SID_EXTRUSION_3D_COLOR: + case SID_EXTRUSION_DEPTH: + case SID_EXTRUSION_DIRECTION: + case SID_EXTRUSION_PROJECTION: + case SID_EXTRUSION_LIGHTING_DIRECTION: + case SID_EXTRUSION_LIGHTING_INTENSITY: + case SID_EXTRUSION_SURFACE: + case SID_EXTRUSION_DEPTH_FLOATER: + case SID_EXTRUSION_DIRECTION_FLOATER: + case SID_EXTRUSION_LIGHTING_FLOATER: + case SID_EXTRUSION_SURFACE_FLOATER: + case SID_EXTRUSION_DEPTH_DIALOG: + svx::ExtrusionBar::execute( mpDrawView.get(), rReq, GetViewFrame()->GetBindings() ); + Cancel(); + rReq.Ignore (); + break; + + case SID_FONTWORK_SHAPE: + case SID_FONTWORK_SHAPE_TYPE: + case SID_FONTWORK_ALIGNMENT: + case SID_FONTWORK_SAME_LETTER_HEIGHTS: + case SID_FONTWORK_CHARACTER_SPACING: + case SID_FONTWORK_KERN_CHARACTER_PAIRS: + case SID_FONTWORK_GALLERY_FLOATER: + case SID_FONTWORK_CHARACTER_SPACING_FLOATER: + case SID_FONTWORK_ALIGNMENT_FLOATER: + case SID_FONTWORK_CHARACTER_SPACING_DIALOG: + svx::FontworkBar::execute(*mpDrawView, rReq, GetViewFrame()->GetBindings()); + Cancel(); + rReq.Ignore (); + break; + + case SID_BMPMASK: + { + GetViewFrame()->ToggleChildWindow( SvxBmpMaskChildWindow::GetChildWindowId() ); + GetViewFrame()->GetBindings().Invalidate( SID_BMPMASK ); + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_NAVIGATOR: + { + if (comphelper::LibreOfficeKit::isActive()) + { + GetViewFrame()->ShowChildWindow(SID_SIDEBAR); + OUString panelId = "SdNavigatorPanel"; + ::sfx2::sidebar::Sidebar::TogglePanel( + panelId, GetViewFrame()->GetFrame().GetFrameInterface()); + + Cancel(); + rReq.Done(); + } else { + if ( rReq.GetArgs() ) + GetViewFrame()->SetChildWindow(SID_NAVIGATOR, + static_cast(rReq.GetArgs()-> + Get(SID_NAVIGATOR)).GetValue()); + else + GetViewFrame()->ToggleChildWindow( SID_NAVIGATOR ); + + GetViewFrame()->GetBindings().Invalidate(SID_NAVIGATOR); + Cancel(); + rReq.Ignore (); + } + } + break; + + case SID_SLIDE_TRANSITIONS_PANEL: + case SID_MASTER_SLIDES_PANEL: + case SID_CUSTOM_ANIMATION_PANEL: + case SID_GALLERY: + { + // First make sure that the sidebar is visible + GetViewFrame()->ShowChildWindow(SID_SIDEBAR); + + OUString panelId; + if (nSId == SID_CUSTOM_ANIMATION_PANEL) + panelId = "SdCustomAnimationPanel"; + else if (nSId == SID_GALLERY) + panelId = "GalleryPanel"; + else if (nSId == SID_SLIDE_TRANSITIONS_PANEL) + panelId = "SdSlideTransitionPanel"; + else if (nSId == SID_MASTER_SLIDES_PANEL) + panelId = "SdAllMasterPagesPanel"; + + ::sfx2::sidebar::Sidebar::TogglePanel( + panelId, + GetViewFrame()->GetFrame().GetFrameInterface()); + + Cancel(); + rReq.Done(); + } + break; + + case SID_ANIMATION_OBJECTS: + { + if ( rReq.GetArgs() ) + GetViewFrame()->SetChildWindow( + AnimationChildWindow::GetChildWindowId(), + static_cast(rReq.GetArgs()-> + Get(SID_ANIMATION_OBJECTS)).GetValue()); + else + GetViewFrame()->ToggleChildWindow( + AnimationChildWindow::GetChildWindowId() ); + + GetViewFrame()->GetBindings().Invalidate(SID_ANIMATION_OBJECTS); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_3D_WIN: + { + if ( rReq.GetArgs() ) + GetViewFrame()->SetChildWindow( Svx3DChildWindow::GetChildWindowId(), + static_cast(rReq.GetArgs()-> + Get( SID_3D_WIN )).GetValue()); + else + GetViewFrame()->ToggleChildWindow( Svx3DChildWindow::GetChildWindowId() ); + + GetViewFrame()->GetBindings().Invalidate( SID_3D_WIN ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_CONVERT_TO_3D_LATHE_FAST: + { + /* The call is enough. The initialization via Start3DCreation and + CreateMirrorPolygons is no longer needed if the parameter + sal_True is provided. Then a tilted rotary body with an axis left + besides the bounding rectangle of the selected objects is drawn + immediately and without user interaction. */ + mpDrawView->SdrEndTextEdit(); + if(GetActiveWindow()) + GetActiveWindow()->EnterWait(); + mpDrawView->End3DCreation(true); + Cancel(); + rReq.Ignore(); + if(GetActiveWindow()) + GetActiveWindow()->LeaveWait(); + } + break; + + case SID_PRESENTATION_DLG: + { + SetCurrentFunction( FuSlideShowDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_REMOTE_DLG: + { +#ifdef ENABLE_SDREMOTE + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateRemoteDialog(GetFrameWeld())); + pDlg->Execute(); +#endif + } + break; + + case SID_CUSTOMSHOW_DLG: + { + SetCurrentFunction( FuCustomShowDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_EXPAND_PAGE: + { + SetCurrentFunction( FuExpandPage::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_SUMMARY_PAGE: + { + mpDrawView->SdrEndTextEdit(); + SetCurrentFunction( FuSummaryPage::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + +#if HAVE_FEATURE_AVMEDIA + case SID_AVMEDIA_PLAYER: + { + GetViewFrame()->ToggleChildWindow( ::avmedia::MediaPlayer::GetChildWindowId() ); + GetViewFrame()->GetBindings().Invalidate( SID_AVMEDIA_PLAYER ); + Cancel(); + rReq.Ignore (); + } + break; +#endif + + case SID_PRESENTATION_MINIMIZER: + { + Reference xContext(::comphelper::getProcessComponentContext()); + Reference xParser(util::URLTransformer::create(xContext)); + Reference xProvider(GetViewShellBase().GetController()->getFrame(), UNO_QUERY); + if (xProvider.is()) + { + util::URL aURL; + aURL.Complete = "vnd.com.sun.star.comp.PresentationMinimizer:execute"; + xParser->parseStrict(aURL); + uno::Reference xDispatch(xProvider->queryDispatch(aURL, OUString(), 0)); + if (xDispatch.is()) + { + xDispatch->dispatch(aURL, uno::Sequence< beans::PropertyValue >()); + } + } + Cancel(); + rReq.Ignore(); + } + break; + + case SID_DISPLAY_MASTER_BACKGROUND: + case SID_DISPLAY_MASTER_OBJECTS: + { + // Determine current page and toggle visibility of layers + // associated with master page background or master page shapes. + // FIXME: This solution is wrong, because shapes of master pages need + // not be on layer "background" or "backgroundobjects". + // See tdf#118613 + SdPage* pPage = GetActualPage(); + if (pPage != nullptr + && GetDoc() != nullptr) + { + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin(); + SdrLayerID aLayerId; + if (nSId == SID_DISPLAY_MASTER_BACKGROUND) + aLayerId = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + else + aLayerId = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + aVisibleLayers.Set(aLayerId, !aVisibleLayers.IsSet(aLayerId)); + pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + Cancel(); + rReq.Done(); // Mark task as done to auto-update the state of each buttons tdf#132816 + } + break; + + case SID_PHOTOALBUM: + { + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg(pFact->CreateSdPhotoAlbumDialog( + pWin ? pWin->GetFrameWeld() : nullptr, + GetDoc())); + + pDlg->Execute(); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_INSERT_QRCODE: + case SID_EDIT_QRCODE: + { + VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create(); + const uno::Reference xModel = GetViewShellBase().GetController()->getModel(); + ScopedVclPtr pDlg(pFact->CreateQrCodeGenDialog( + GetFrameWeld(), xModel, rReq.GetSlot() == SID_EDIT_QRCODE)); + pDlg->Execute(); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_THEME_DIALOG: + { + SdrPage* pMasterPage = &GetActualPage()->TRG_GetMasterPage(); + auto pTheme = pMasterPage->getSdrPageProperties().getTheme(); + auto pDialog = std::make_shared(GetFrameWeld(), pTheme.get()); + auto* pDocShell = GetDocSh(); + weld::DialogController::runAsync(pDialog, [pDialog, pMasterPage, pDocShell](sal_uInt32 nResult) + { + if (RET_OK != nResult) + return; + + auto pColorSet = pDialog->getCurrentColorSet(); + if (pColorSet) + { + sd::ThemeColorChanger aChanger(pMasterPage, pDocShell); + aChanger.apply(pColorSet); + + if (comphelper::LibreOfficeKit::isActive()) + { + svx::ThemeColorPaletteManager aManager(pColorSet); + SfxLokHelper::notifyAllViews(LOK_CALLBACK_COLOR_PALETTES, aManager.generateJSON()); + } + } + }); + + Cancel(); + rReq.Ignore(); + } + break; + + case SID_ADDITIONS_DIALOG: + { + OUString sAdditionsTag = ""; + + const SfxStringItem* pStringArg = rReq.GetArg(FN_PARAM_ADDITIONS_TAG); + if (pStringArg) + sAdditionsTag = pStringArg->GetValue(); + + VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create(); + ScopedVclPtr pDlg( + pFact->CreateAdditionsDialog(GetFrameWeld(), sAdditionsTag)); + pDlg->Execute(); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_ATTR_GLOW_COLOR: + case SID_ATTR_GLOW_RADIUS: + case SID_ATTR_GLOW_TRANSPARENCY: + case SID_ATTR_SOFTEDGE_RADIUS: + case SID_ATTR_TEXTCOLUMNS_NUMBER: + case SID_ATTR_TEXTCOLUMNS_SPACING: + if (const SfxItemSet* pNewArgs = rReq.GetArgs()) + mpDrawView->SetAttributes(*pNewArgs); + rReq.Done(); + Cancel(); + break; + + default: + { + SAL_WARN( "sd.ui", "Slot without function" ); + Cancel(); + rReq.Ignore (); + } + break; + } + + if(HasCurrentFunction()) + { + GetCurrentFunction()->Activate(); + } +} + +void DrawViewShell::ExecChar( SfxRequest &rReq ) +{ + SdDrawDocument* pDoc = GetDoc(); + if (!pDoc || !mpDrawView) + return; + + SfxItemSet aEditAttr( pDoc->GetPool() ); + mpDrawView->GetAttributes( aEditAttr ); + + //modified by wj for sym2_1580, if put old itemset into new set, + //when mpDrawView->SetAttributes(aNewAttr) it will invalidate all the item + // and use old attr to update all the attributes +// SfxItemSet aNewAttr( GetPool(), +// EE_ITEMS_START, EE_ITEMS_END ); +// aNewAttr.Put( aEditAttr, sal_False ); + SfxItemSet aNewAttr( pDoc->GetPool() ); + //modified end + + sal_uInt16 nSId = rReq.GetSlot(); + + switch ( nSId ) + { + case SID_ATTR_CHAR_FONT: + if( rReq.GetArgs() ) + { + const SvxFontItem* pItem = rReq.GetArg(SID_ATTR_CHAR_FONT); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_FONTHEIGHT: + if( rReq.GetArgs() ) + { + const SvxFontHeightItem* pItem = rReq.GetArg(SID_ATTR_CHAR_FONTHEIGHT); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_WEIGHT: + if( rReq.GetArgs() ) + { + const SvxWeightItem* pItem = rReq.GetArg(SID_ATTR_CHAR_WEIGHT); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_POSTURE: + if( rReq.GetArgs() ) + { + const SvxPostureItem* pItem = rReq.GetArg(SID_ATTR_CHAR_POSTURE); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_UNDERLINE: + if( rReq.GetArgs() ) + { + const SvxUnderlineItem* pItem = rReq.GetArg(SID_ATTR_CHAR_UNDERLINE); + if (pItem) + { + aNewAttr.Put(*pItem); + } + else + { + FontLineStyle eFU = aEditAttr.Get( EE_CHAR_UNDERLINE ).GetLineStyle(); + aNewAttr.Put( SvxUnderlineItem( eFU != LINESTYLE_NONE ?LINESTYLE_NONE : LINESTYLE_SINGLE, EE_CHAR_UNDERLINE ) ); + } + } + break; + case SID_ATTR_CHAR_OVERLINE: + if( rReq.GetArgs() ) + { + const SvxOverlineItem* pItem = rReq.GetArg(SID_ATTR_CHAR_OVERLINE); + if (pItem) + { + aNewAttr.Put(*pItem); + } + else + { + FontLineStyle eFU = aEditAttr.Get( EE_CHAR_OVERLINE ).GetLineStyle(); + aNewAttr.Put( SvxOverlineItem( eFU != LINESTYLE_NONE ?LINESTYLE_NONE : LINESTYLE_SINGLE, EE_CHAR_OVERLINE ) ); + } + } + break; + + case SID_ULINE_VAL_NONE: + { + aNewAttr.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE)); + break; + } + + case SID_ULINE_VAL_SINGLE: + case SID_ULINE_VAL_DOUBLE: + case SID_ULINE_VAL_DOTTED: + { + FontLineStyle eOld = aEditAttr.Get(EE_CHAR_UNDERLINE).GetLineStyle(); + FontLineStyle eNew = eOld; + + switch (nSId) + { + case SID_ULINE_VAL_SINGLE: + eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE; + break; + case SID_ULINE_VAL_DOUBLE: + eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE; + break; + case SID_ULINE_VAL_DOTTED: + eNew = ( eOld == LINESTYLE_DOTTED ) ? LINESTYLE_NONE : LINESTYLE_DOTTED; + break; + } + + SvxUnderlineItem aUnderline(eNew, EE_CHAR_UNDERLINE); + aNewAttr.Put(aUnderline); + } + break; + + case SID_ATTR_CHAR_SHADOWED: + if( rReq.GetArgs() ) + { + const SvxShadowedItem* pItem = rReq.GetArg(SID_ATTR_CHAR_SHADOWED); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_CONTOUR: + if( rReq.GetArgs() ) + { + const SvxContourItem* pItem = rReq.GetArg(SID_ATTR_CHAR_CONTOUR); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + + case SID_ATTR_CHAR_STRIKEOUT: + if( rReq.GetArgs() ) + { + const SvxCrossedOutItem* pItem = rReq.GetArg(SID_ATTR_CHAR_STRIKEOUT); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_COLOR: + if( rReq.GetArgs() ) + { + const SvxColorItem* pItem = rReq.GetArg(SID_ATTR_CHAR_COLOR); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_KERNING: + if( rReq.GetArgs() ) + { + const SvxKerningItem* pItem = rReq.GetArg(SID_ATTR_CHAR_KERNING); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_ATTR_CHAR_CASEMAP: + if( rReq.GetArgs() ) + { + const SvxCaseMapItem* pItem = rReq.GetArg(SID_ATTR_CHAR_CASEMAP); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + case SID_SET_SUB_SCRIPT: + { + SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT ); + SvxEscapement eEsc = static_cast(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + if( eEsc == SvxEscapement::Subscript ) + aItem.SetEscapement( SvxEscapement::Off ); + else + aItem.SetEscapement( SvxEscapement::Subscript ); + aNewAttr.Put( aItem ); + } + break; + case SID_SET_SUPER_SCRIPT: + { + SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT ); + SvxEscapement eEsc = static_cast(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + if( eEsc == SvxEscapement::Superscript ) + aItem.SetEscapement( SvxEscapement::Off ); + else + aItem.SetEscapement( SvxEscapement::Superscript ); + aNewAttr.Put( aItem ); + } + break; + case SID_SHRINK_FONT_SIZE: + case SID_GROW_FONT_SIZE: + { + const SvxFontListItem* pFonts = dynamic_cast(GetDocSh()->GetItem( SID_ATTR_CHAR_FONTLIST ) ); + const FontList* pFontList = pFonts ? pFonts->GetFontList() : nullptr; + if( pFontList ) + { + FuText::ChangeFontSize( nSId == SID_GROW_FONT_SIZE, nullptr, pFontList, mpView ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT ); + } + break; + } + case SID_ATTR_CHAR_BACK_COLOR: + if( rReq.GetArgs() ) + { + const SvxColorItem* pItem = rReq.GetArg(SID_ATTR_CHAR_BACK_COLOR); + if (pItem) + { + aNewAttr.Put(*pItem); + } + } + break; + default: + break; + } + + mpDrawView->SetAttributes(aNewAttr); + rReq.Done(); + Cancel(); +} + +/** This method consists basically of three parts: + 1. Process the arguments of the SFX request. + 2. Use the model to create a new page or duplicate an existing one. + 3. Update the tab control and switch to the new page. +*/ +SdPage* DrawViewShell::CreateOrDuplicatePage ( + SfxRequest& rRequest, + PageKind ePageKind, + SdPage* pPage, + const sal_Int32 nInsertPosition) +{ + SdPage* pNewPage = nullptr; + if (ePageKind == PageKind::Standard && meEditMode != EditMode::MasterPage) + { + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + pNewPage = ViewShell::CreateOrDuplicatePage (rRequest, ePageKind, pPage, nInsertPosition); + } + return pNewPage; +} + +void DrawViewShell::DuplicateSelectedSlides (SfxRequest& rRequest) +{ + // Create a list of the pages that are to be duplicated. The process of + // duplication alters the selection. + sal_Int32 nInsertPosition (0); + ::std::vector aPagesToDuplicate; + sd::slidesorter::SlideSorter &mrSlideSorter = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase())->GetSlideSorter(); + sd::slidesorter::model::PageEnumeration aSelectedPages ( + sd::slidesorter::model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel())); + while (aSelectedPages.HasMoreElements()) + { + sd::slidesorter::model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + if (pDescriptor && pDescriptor->GetPage()) + { + aPagesToDuplicate.push_back(pDescriptor->GetPage()); + nInsertPosition = pDescriptor->GetPage()->GetPageNum()+2; + } + } + + // Duplicate the pages in aPagesToDuplicate and collect the newly + // created pages in aPagesToSelect. + const bool bUndo (aPagesToDuplicate.size()>1 && mrSlideSorter.GetView().IsUndoEnabled()); + if (bUndo) + mrSlideSorter.GetView().BegUndo(SdResId(STR_INSERTPAGE)); + + ::std::vector aPagesToSelect; + for(::std::vector::const_iterator + iPage(aPagesToDuplicate.begin()), + iEnd(aPagesToDuplicate.end()); + iPage!=iEnd; + ++iPage, nInsertPosition+=2) + { + aPagesToSelect.push_back( + mrSlideSorter.GetViewShell()->CreateOrDuplicatePage( + rRequest, PageKind::Standard, *iPage, nInsertPosition)); + } + aPagesToDuplicate.clear(); + + if (bUndo) + mrSlideSorter.GetView().EndUndo(); + + // Set the selection to the pages in aPagesToSelect. + sd::slidesorter::controller::PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); + rSelector.DeselectAllPages(); + for (auto const& it: aPagesToSelect) + { + rSelector.SelectPage(it); + } +} + +void DrawViewShell::ExecutePropPanelAttr (SfxRequest const & rReq) +{ + if(SlideShow::IsRunning( GetViewShellBase() )) + return; + + SdDrawDocument* pDoc = GetDoc(); + if (!pDoc || !mpDrawView) + return; + + sal_uInt16 nSId = rReq.GetSlot(); + SfxItemSet aAttrs( pDoc->GetPool() ); + + switch ( nSId ) + { + case SID_TABLE_VERT_NONE: + case SID_TABLE_VERT_CENTER: + case SID_TABLE_VERT_BOTTOM: + SdrTextVertAdjust eTVA = SDRTEXTVERTADJUST_TOP; + if (nSId == SID_TABLE_VERT_CENTER) + eTVA = SDRTEXTVERTADJUST_CENTER; + else if (nSId == SID_TABLE_VERT_BOTTOM) + eTVA = SDRTEXTVERTADJUST_BOTTOM; + + aAttrs.Put( SdrTextVertAdjustItem(eTVA) ); + mpDrawView->SetAttributes(aAttrs); + + break; + } +} + +void DrawViewShell::GetStatePropPanelAttr(SfxItemSet& rSet) +{ + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + + SdDrawDocument* pDoc = GetDoc(); + if (!pDoc || !mpDrawView) + return; + + SfxItemSet aAttrs( pDoc->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + + while ( nWhich ) + { + sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich) + ? GetPool().GetSlotId(nWhich) + : nWhich; + switch ( nSlotId ) + { + case SID_TABLE_VERT_NONE: + case SID_TABLE_VERT_CENTER: + case SID_TABLE_VERT_BOTTOM: + bool bContour = false; + SfxItemState eConState = aAttrs.GetItemState( SDRATTR_TEXT_CONTOURFRAME ); + if( eConState != SfxItemState::DONTCARE ) + { + bContour = aAttrs.Get( SDRATTR_TEXT_CONTOURFRAME ).GetValue(); + } + if (bContour) break; + + SfxItemState eVState = aAttrs.GetItemState( SDRATTR_TEXT_VERTADJUST ); + //SfxItemState eHState = aAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST ); + + //if(SfxItemState::DONTCARE != eVState && SfxItemState::DONTCARE != eHState) + if(SfxItemState::DONTCARE != eVState) + { + SdrTextVertAdjust eTVA = aAttrs.Get(SDRATTR_TEXT_VERTADJUST).GetValue(); + bool bSet = (nSlotId == SID_TABLE_VERT_NONE && eTVA == SDRTEXTVERTADJUST_TOP) || + (nSlotId == SID_TABLE_VERT_CENTER && eTVA == SDRTEXTVERTADJUST_CENTER) || + (nSlotId == SID_TABLE_VERT_BOTTOM && eTVA == SDRTEXTVERTADJUST_BOTTOM); + rSet.Put(SfxBoolItem(nSlotId, bSet)); + } + else + { + rSet.Put(SfxBoolItem(nSlotId, false)); + } + break; + } + nWhich = aIter.NextWhich(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews3.cxx b/sd/source/ui/view/drviews3.cxx new file mode 100644 index 0000000000..2a3b778531 --- /dev/null +++ b/sd/source/ui/view/drviews3.cxx @@ -0,0 +1,1106 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; +using ::com::sun::star::frame::XFrame; +using ::com::sun::star::frame::XController; + +namespace sd { + +/** + * handle SfxRequests for controller + */ +void DrawViewShell::ExecCtrl(SfxRequest& rReq) +{ + // except a page switch and jumps to bookmarks, nothing is executed during + // a slide show + if( HasCurrentFunction(SID_PRESENTATION) && + rReq.GetSlot() != SID_SWITCHPAGE && + rReq.GetSlot() != SID_JUMPTOMARK) + return; + + CheckLineTo (rReq); + + // End text edit mode for some requests. + sal_uInt16 nSlot = rReq.GetSlot(); + bool bAllowFocusChange = true; + switch (nSlot) + { + case SID_OUTPUT_QUALITY_COLOR: + case SID_OUTPUT_QUALITY_GRAYSCALE: + case SID_OUTPUT_QUALITY_BLACKWHITE: + case SID_OUTPUT_QUALITY_CONTRAST: + // Do nothing. + break; + case SID_SWITCHPAGE: + if (rReq.GetArgs() && rReq.GetArgs()->Count () == 1) + { + const SfxBoolItem* pAllowFocusChange = rReq.GetArg(SID_SWITCHPAGE); + bAllowFocusChange = pAllowFocusChange->GetValue(); + if (!bAllowFocusChange) + break; + } + [[fallthrough]]; + default: + if ( mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + } + + // sal_uInt16 nSlot = rReq.GetSlot(); + switch (nSlot) + { + case SID_SWITCHPAGE: // BASIC + { + // switch page in running slide show + if(SlideShow::IsRunning(GetViewShellBase()) && rReq.GetArgs()) + { + if (const SfxUInt32Item* pWhatPage = rReq.GetArg(ID_VAL_WHATPAGE)) + SlideShow::GetSlideShow(GetViewShellBase())->jumpToPageNumber(static_cast((pWhatPage->GetValue()-1)>>1)); + } + else + { + const SfxItemSet *pArgs = rReq.GetArgs (); + sal_uInt16 nSelectedPage = 0; + + if (! pArgs || pArgs->Count () == 1) + { + nSelectedPage = maTabControl->GetCurPagePos(); + } + else if (pArgs->Count () == 2) + { + const SfxUInt32Item* pWhatPage = rReq.GetArg(ID_VAL_WHATPAGE); + const SfxUInt32Item* pWhatKind = rReq.GetArg(ID_VAL_WHATKIND); + + sal_Int32 nWhatPage = static_cast(pWhatPage->GetValue ()); + PageKind nWhatKind = static_cast(pWhatKind->GetValue ()); + if (nWhatKind < PageKind::Standard || nWhatKind > PageKind::Handout) + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + rReq.Ignore (); + break; + } + else if (meEditMode != EditMode::MasterPage) + { + if (! CHECK_RANGE (0, nWhatPage, GetDoc()->GetSdPageCount(nWhatKind))) + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + rReq.Ignore (); + break; + } + + nSelectedPage = static_cast(nWhatPage); + mePageKind = nWhatKind; + } + } + else + { +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + rReq.Ignore (); + break; + } + + if( GetDocSh() && (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED)) + GetDocSh()->SetModified(); + + SwitchPage(nSelectedPage, bAllowFocusChange); + + if(HasCurrentFunction(SID_BEZIER_EDIT)) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + Invalidate(); + InvalidateWindows(); + rReq.Done (); + } + break; + } + + case SID_SWITCHLAYER: // BASIC + { + const SfxItemSet *pArgs = rReq.GetArgs (); + + // #i87182# + bool bCurPageValid(false); + sal_uInt16 nCurPage(0); + + if(GetLayerTabControl()) + { + nCurPage = GetLayerTabControl()->GetCurPageId(); + bCurPageValid = true; + } + + if(pArgs && 1 == pArgs->Count()) + { + const SfxUInt32Item* pWhatLayer = rReq.GetArg(ID_VAL_WHATLAYER); + + if(pWhatLayer) + { + nCurPage = static_cast(pWhatLayer->GetValue()); + bCurPageValid = true; + } + } + + if(bCurPageValid) + { + OUString aLayerName( GetLayerTabControl()->GetLayerName(nCurPage)); + if (!aLayerName.isEmpty()) + { + mpDrawView->SetActiveLayer(aLayerName); + } + Invalidate(); + } + + rReq.Done (); + + break; + } + + case SID_PAGEMODE: // BASIC + { + + const SfxItemSet *pArgs = rReq.GetArgs(); + + if (pArgs && pArgs->Count () == 2) + { + const SfxBoolItem* pIsActive = rReq.GetArg(ID_VAL_ISACTIVE); + const SfxUInt32Item* pWhatKind = rReq.GetArg(ID_VAL_WHATKIND); + + PageKind nWhatKind = static_cast(pWhatKind->GetValue()); + if ( nWhatKind >= PageKind::Standard && nWhatKind <= PageKind::Handout) + { + mbIsLayerModeActive = pIsActive->GetValue(); + mePageKind = nWhatKind; + } + } + + // turn on default layer of page + mpDrawView->SetActiveLayer(sUNO_LayerName_layout); + + ChangeEditMode(EditMode::Page, mbIsLayerModeActive); + + Invalidate(); + rReq.Done (); + + break; + } + + case SID_LAYERMODE: // BASIC + { + const SfxItemSet *pArgs = rReq.GetArgs(); + + if (pArgs && pArgs->Count() == 2) + { + const SfxUInt32Item* pWhatLayer = rReq.GetArg(ID_VAL_WHATLAYER); + EditMode nWhatLayer = static_cast(pWhatLayer->GetValue()); + if (nWhatLayer == EditMode::Page || nWhatLayer == EditMode::MasterPage) + { + mbIsLayerModeActive = rReq.GetArg(ID_VAL_ISACTIVE)->GetValue(); + meEditMode = nWhatLayer; + } + } + + ChangeEditMode(meEditMode, !mbIsLayerModeActive); + + Invalidate(); + rReq.Done(); + + break; + } + + case SID_HEADER_AND_FOOTER: + case SID_INSERT_PAGE_NUMBER: + case SID_INSERT_DATE_TIME: + { + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + VclPtr pDlg(pFact->CreateHeaderFooterDialog(this, pWin ? pWin->GetFrameWeld() : nullptr, GetDoc(), mpActualPage)); + auto xRequest = std::make_shared(rReq); + rReq.Ignore(); // the 'old' request is not relevant any more + pDlg->StartExecuteAsync([this, pDlg, xRequest](sal_Int32 /*nResult*/){ + GetActiveWindow()->Invalidate(); + UpdatePreview( mpActualPage ); + + Invalidate(); + xRequest->Done(); + + pDlg->disposeOnce(); + }); + break; + } + + case SID_MASTER_LAYOUTS: + { + SdPage* pPage = GetActualPage(); + if (meEditMode == EditMode::MasterPage) + // Use the master page of the current page. + pPage = static_cast(&pPage->TRG_GetMasterPage()); + + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg(pFact->CreateMasterLayoutDialog(pWin ? pWin->GetFrameWeld() : nullptr, GetDoc(), pPage)); + pDlg->Execute(); + Invalidate(); + rReq.Done (); + break; + } + case SID_OBJECTRESIZE: + { + // The server likes to change the client size + OSL_ASSERT (GetViewShell()!=nullptr); + SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient(); + + if ( pIPClient && pIPClient->IsObjectInPlaceActive() ) + { + const SfxRectangleItem& rRect = + rReq.GetArgs()->Get(SID_OBJECTRESIZE); + ::tools::Rectangle aRect( GetActiveWindow()->PixelToLogic( rRect.GetValue() ) ); + + if ( mpDrawView->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( pObj ); + if(pOle2Obj) + { + if( pOle2Obj->GetObjRef().is() ) + { + pOle2Obj->SetLogicRect(aRect); + } + } + } + } + } + rReq.Ignore (); + break; + } + + case SID_RELOAD: + { + sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId(); + SfxViewFrame* pFrame = GetViewFrame(); + + try + { + Reference< XFrame > xFrame( pFrame->GetFrame().GetFrameInterface(), UNO_SET_THROW ); + + // Save the current configuration of panes and views. + Reference xControllerManager ( + GetViewShellBase().GetController(), UNO_QUERY_THROW); + Reference xConfigurationController ( + xControllerManager->getConfigurationController(), UNO_SET_THROW ); + Reference xConfiguration ( + xConfigurationController->getRequestedConfiguration(), UNO_SET_THROW ); + + SfxChildWindow* pWindow = pFrame->GetChildWindow(nId); + if(pWindow) + { + Svx3DWin* p3DWin = static_cast(pWindow->GetWindow()); + if(p3DWin) + p3DWin->DocumentReload(); + } + + // normal forwarding to ViewFrame for execution + GetViewFrame()->ExecuteSlot(rReq); + + // From here on we must cope with this object and the frame already being + // deleted. Do not call any methods or use data members. + Reference xController( xFrame->getController(), UNO_SET_THROW ); + + // Restore the configuration. + xControllerManager.set( xController, UNO_QUERY_THROW ); + xConfigurationController.set( xControllerManager->getConfigurationController() ); + if ( ! xConfigurationController.is()) + throw RuntimeException(); + xConfigurationController->restoreConfiguration(xConfiguration); + } + catch (RuntimeException&) + { + DBG_UNHANDLED_EXCEPTION("sd.view"); + } + + // We have to return immediately to avoid accessing this object. + return; + } + + case SID_JUMPTOMARK: + { + if( rReq.GetArgs() ) + { + const SfxStringItem* pBookmark = rReq.GetArg(SID_JUMPTOMARK); + + if (pBookmark) + { + OUString sBookmark(INetURLObject::decode(pBookmark->GetValue(), INetURLObject::DecodeMechanism::WithCharset)); + + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if(xSlideshow.is() && xSlideshow->isRunning()) + { + xSlideshow->jumpToBookmark(sBookmark); + } + else + { + GotoBookmark(sBookmark); + } + } + } + rReq.Done(); + break; + } + + case SID_OUTPUT_QUALITY_COLOR: + case SID_OUTPUT_QUALITY_GRAYSCALE: + case SID_OUTPUT_QUALITY_BLACKWHITE: + case SID_OUTPUT_QUALITY_CONTRAST: + { + ExecReq( rReq ); + break; + } + + case SID_MAIL_SCROLLBODY_PAGEDOWN: + { + ExecReq( rReq ); + break; + } + + case SID_ATTR_YEAR2000: + { + FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); + if (pFormShell != nullptr) + { + const SfxPoolItem* pItem; + if (rReq.GetArgs()->GetItemState( + SID_ATTR_YEAR2000, true, &pItem) == SfxItemState::SET) + pFormShell->SetY2KState ( + static_cast(pItem)->GetValue()); + } + + rReq.Done(); + } + break; + + case SID_OPT_LOCALE_CHANGED: + { + GetActiveWindow()->Invalidate(); + UpdatePreview( mpActualPage ); + rReq.Done(); + } + break; + + case SID_REGENERATE_DIAGRAM: + case SID_EDIT_DIAGRAM: + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if (1 == rMarkList.GetMarkCount()) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + // Support advanced DiagramHelper + if(nullptr != pObj && pObj->isDiagram()) + { + if(SID_REGENERATE_DIAGRAM == nSlot) + { + mpDrawView->UnmarkAll(); + pObj->getDiagramHelper()->reLayout(*static_cast(pObj)); + mpDrawView->MarkObj(pObj, mpDrawView->GetSdrPageView()); + } + else // SID_EDIT_DIAGRAM + { + VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create(); + ScopedVclPtr pDlg = pFact->CreateDiagramDialog( + GetFrameWeld(), + *static_cast(pObj)); + pDlg->Execute(); + } + } + } + + rReq.Done(); + } + break; + + default: + break; + } +} + +void DrawViewShell::ExecRuler(SfxRequest& rReq) +{ + // nothing is executed during a slide show! + if(HasCurrentFunction(SID_PRESENTATION)) + return; + + CheckLineTo (rReq); + + const SfxItemSet* pArgs = rReq.GetArgs(); + const Point aPagePos( GetActiveWindow()->GetViewOrigin() ); + Size aPageSize = mpActualPage->GetSize(); + Size aViewSize = GetActiveWindow()->GetViewSize(); + + switch ( rReq.GetSlot() ) + { + case SID_ATTR_LONG_LRSPACE: + if (pArgs) + { + std::unique_ptr pUndoGroup(new SdUndoGroup(GetDoc())); + pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEBORDER)); + + const SvxLongLRSpaceItem& rLRSpace = + pArgs->Get(SID_ATTR_LONG_LRSPACE); + + if( mpDrawView->IsTextEdit() ) + { + ::tools::Rectangle aRect = maMarkRect; + aRect.SetPos(aRect.TopLeft() + aPagePos); + aRect.SetLeft( rLRSpace.GetLeft() ); + aRect.SetRight( aViewSize.Width() - rLRSpace.GetRight() ); + aRect.SetPos(aRect.TopLeft() - aPagePos); + if ( aRect != maMarkRect) + { + mpDrawView->SetAllMarkedRect(aRect); + maMarkRect = mpDrawView->GetAllMarkedRect(); + Invalidate( SID_RULER_OBJECT ); + } + } + else + { + ::tools::Long nLeft = std::max(::tools::Long(0), rLRSpace.GetLeft() - aPagePos.X()); + ::tools::Long nRight = std::max(::tools::Long(0), rLRSpace.GetRight() + aPagePos.X() + + aPageSize.Width() - aViewSize.Width()); + + sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind); + sal_uInt16 i; + for ( i = 0; i < nPageCnt; i++) + { + SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind); + SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(), + pPage, + pPage->GetLeftBorder(), + pPage->GetRightBorder(), + nLeft, nRight); + pUndoGroup->AddAction(pUndo); + pPage->SetLeftBorder(nLeft); + pPage->SetRightBorder(nRight); + } + nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind); + SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(), + pPage, + pPage->GetLeftBorder(), + pPage->GetRightBorder(), + nLeft, nRight); + pUndoGroup->AddAction(pUndo); + pPage->SetLeftBorder(nLeft); + pPage->SetRightBorder(nRight); + } + InvalidateWindows(); + } + + // give the undo group to the undo manager + GetViewFrame()->GetObjectShell()->GetUndoManager()-> + AddUndoAction(std::move(pUndoGroup)); + } + break; + case SID_ATTR_LONG_ULSPACE: + if (pArgs) + { + std::unique_ptr pUndoGroup(new SdUndoGroup(GetDoc())); + pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEBORDER)); + + const SvxLongULSpaceItem& rULSpace = + pArgs->Get(SID_ATTR_LONG_ULSPACE); + + if( mpDrawView->IsTextEdit() ) + { + ::tools::Rectangle aRect = maMarkRect; + aRect.SetPos(aRect.TopLeft() + aPagePos); + aRect.SetTop( rULSpace.GetUpper() ); + aRect.SetBottom( aViewSize.Height() - rULSpace.GetLower() ); + aRect.SetPos(aRect.TopLeft() - aPagePos); + + if ( aRect != maMarkRect) + { + mpDrawView->SetAllMarkedRect(aRect); + maMarkRect = mpDrawView->GetAllMarkedRect(); + Invalidate( SID_RULER_OBJECT ); + } + } + else + { + ::tools::Long nUpper = std::max(::tools::Long(0), rULSpace.GetUpper() - aPagePos.Y()); + ::tools::Long nLower = std::max(::tools::Long(0), rULSpace.GetLower() + aPagePos.Y() + + aPageSize.Height() - aViewSize.Height()); + + sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind); + sal_uInt16 i; + for ( i = 0; i < nPageCnt; i++) + { + SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind); + SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(), + pPage, + pPage->GetUpperBorder(), + pPage->GetLowerBorder(), + nUpper, nLower); + pUndoGroup->AddAction(pUndo); + pPage->SetUpperBorder(nUpper); + pPage->SetLowerBorder(nLower); + } + nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind); + + for (i = 0; i < nPageCnt; i++) + { + SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind); + SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(), + pPage, + pPage->GetUpperBorder(), + pPage->GetLowerBorder(), + nUpper, nLower); + pUndoGroup->AddAction(pUndo); + pPage->SetUpperBorder(nUpper); + pPage->SetLowerBorder(nLower); + } + InvalidateWindows(); + } + + // give the undo group to the undo manager + GetViewFrame()->GetObjectShell()->GetUndoManager()-> + AddUndoAction(std::move(pUndoGroup)); + } + break; + case SID_RULER_OBJECT: + if (pArgs) + { + ::tools::Rectangle aRect = maMarkRect; + aRect.SetPos(aRect.TopLeft() + aPagePos); + + const SvxObjectItem& rOI = pArgs->Get(SID_RULER_OBJECT); + + if ( rOI.GetStartX() != rOI.GetEndX() ) + { + aRect.SetLeft( rOI.GetStartX() ); + aRect.SetRight( rOI.GetEndX() ); + } + if ( rOI.GetStartY() != rOI.GetEndY() ) + { + aRect.SetTop( rOI.GetStartY() ); + aRect.SetBottom( rOI.GetEndY() ); + } + aRect.SetPos(aRect.TopLeft() - aPagePos); + if ( aRect != maMarkRect) + { + mpDrawView->SetAllMarkedRect(aRect); + maMarkRect = mpDrawView->GetAllMarkedRect(); + Invalidate( SID_RULER_OBJECT ); + } + } + break; + case SID_ATTR_TABSTOP: + if (pArgs && mpDrawView->IsTextEdit()) + { + const SvxTabStopItem& rItem = pArgs->Get( EE_PARA_TABS ); + + SfxItemSetFixed aEditAttr( GetPool() ); + + aEditAttr.Put( rItem ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_TABSTOP); + } + break; + case SID_ATTR_PARA_LINESPACE: + if (pArgs) + { + SvxLineSpacingItem aParaLineSP = pArgs->Get( + GetPool().GetWhich(SID_ATTR_PARA_LINESPACE)); + + SfxItemSetFixed aEditAttr( GetPool() ); + aParaLineSP.SetWhich( EE_PARA_SBL ); + + aEditAttr.Put( aParaLineSP ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_LINESPACE); + } + break; + case SID_ATTR_PARA_ADJUST_LEFT: + { + SvxAdjustItem aItem( SvxAdjust::Left, EE_PARA_JUST ); + SfxItemSetFixed aEditAttr( GetPool() ); + + aEditAttr.Put( aItem ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_ADJUST_LEFT); + break; + } + case SID_ATTR_PARA_ADJUST_CENTER: + { + SvxAdjustItem aItem( SvxAdjust::Center, EE_PARA_JUST ); + SfxItemSetFixed aEditAttr( GetPool() ); + + aEditAttr.Put( aItem ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_ADJUST_CENTER); + break; + } + case SID_ATTR_PARA_ADJUST_RIGHT: + { + SvxAdjustItem aItem( SvxAdjust::Right, EE_PARA_JUST ); + SfxItemSetFixed aEditAttr( GetPool() ); + + aEditAttr.Put( aItem ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_ADJUST_RIGHT); + break; + } + case SID_ATTR_PARA_ADJUST_BLOCK: + { + SvxAdjustItem aItem( SvxAdjust::Block, EE_PARA_JUST ); + SfxItemSetFixed aEditAttr( GetPool() ); + + aEditAttr.Put( aItem ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_ADJUST_BLOCK); + break; + } + case SID_ATTR_PARA_ULSPACE: + if (pArgs) + { + SvxULSpaceItem aULSP = static_cast(pArgs->Get( + SID_ATTR_PARA_ULSPACE)); + SfxItemSetFixed aEditAttr( GetPool() ); + aULSP.SetWhich( EE_PARA_ULSPACE ); + + aEditAttr.Put( aULSP ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_ULSPACE); + } + break; + case SID_ATTR_PARA_LRSPACE: + if (pArgs) + { + SvxLRSpaceItem aLRSpace = static_cast(pArgs->Get( + SID_ATTR_PARA_LRSPACE)); + + SfxItemSetFixed aEditAttr( GetPool() ); + aLRSpace.SetWhich( EE_PARA_LRSPACE ); + + aEditAttr.Put( aLRSpace ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_LRSPACE); + } + break; + case SID_ATTR_LRSPACE: + if (pArgs && mpDrawView->IsTextEdit()) + { + sal_uInt16 nId = SID_ATTR_PARA_LRSPACE; + const SvxLRSpaceItem& rItem = static_cast( + pArgs->Get( nId )); + + SfxItemSetFixed< + EE_PARA_NUMBULLET, EE_PARA_NUMBULLET, + EE_PARA_OUTLLEVEL, EE_PARA_OUTLLEVEL, + EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttr( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aEditAttr ); + + nId = EE_PARA_LRSPACE; + SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(), + rItem.GetRight(), + rItem.GetTextFirstLineOffset(), nId ); + + const sal_Int16 nOutlineLevel = aEditAttr.Get( EE_PARA_OUTLLEVEL ).GetValue(); + const SvxLRSpaceItem& rOrigLRSpaceItem = aEditAttr.Get( EE_PARA_LRSPACE ); + const SvxNumBulletItem& rNumBulletItem = aEditAttr.Get( EE_PARA_NUMBULLET ); + if( nOutlineLevel != -1 && + rNumBulletItem.GetNumRule().GetLevelCount() > nOutlineLevel ) + { + const SvxNumberFormat& rFormat = rNumBulletItem.GetNumRule().GetLevel(nOutlineLevel); + SvxNumberFormat aFormat(rFormat); + + // left margin gets distributed onto LRSpace item + // and number format AbsLSpace - this fixes + // n#707779 (previously, LRSpace left indent could + // become negative - EditEngine really does not + // like that. + const auto nAbsLSpace=aFormat.GetAbsLSpace(); + const ::tools::Long nTxtLeft=rItem.GetTextLeft(); + const ::tools::Long nLeftIndent=std::max(::tools::Long(0),nTxtLeft - nAbsLSpace); + aLRSpaceItem.SetTextLeft(nLeftIndent); + // control for clipped left indent - remainder + // reduces number format first line indent + aFormat.SetAbsLSpace(nTxtLeft - nLeftIndent); + + // negative first line indent goes to the number + // format, positive to the lrSpace item + if( rItem.GetTextFirstLineOffset() < 0 ) + { + aFormat.SetFirstLineOffset( + rItem.GetTextFirstLineOffset() + - rOrigLRSpaceItem.GetTextFirstLineOffset() + + aFormat.GetCharTextDistance()); + aLRSpaceItem.SetTextFirstLineOffset(0); + } + else + { + aFormat.SetFirstLineOffset(0); + aLRSpaceItem.SetTextFirstLineOffset( + rItem.GetTextFirstLineOffset() + - aFormat.GetFirstLineOffset() //TODO: overflow + + aFormat.GetCharTextDistance()); + } + + if( rFormat != aFormat ) + { + // put all items + const_cast(rNumBulletItem.GetNumRule()).SetLevel(nOutlineLevel,aFormat); + aEditAttr.Put( rNumBulletItem ); + aEditAttr.Put( aLRSpaceItem ); + mpDrawView->SetAttributes( aEditAttr ); + + Invalidate(SID_ATTR_PARA_LRSPACE); + break; + } + } + + // only put lrSpace item + SfxItemSetFixed aEditAttrReduced( GetDoc()->GetPool() ); + aEditAttrReduced.Put( aLRSpaceItem ); + mpDrawView->SetAttributes( aEditAttrReduced ); + + Invalidate(SID_ATTR_PARA_LRSPACE); + } + break; + } +} + +void DrawViewShell::GetRulerState(SfxItemSet& rSet) +{ + Point aOrigin; + + if (mpDrawView->GetSdrPageView()) + { + aOrigin = mpDrawView->GetSdrPageView()->GetPageOrigin(); + } + + Size aViewSize = GetActiveWindow()->GetViewSize(); + + const Point aPagePos( GetActiveWindow()->GetViewOrigin() ); + Size aPageSize = mpActualPage->GetSize(); + + ::tools::Rectangle aRect(aPagePos, Point( aViewSize.Width() - (aPagePos.X() + aPageSize.Width()), + aViewSize.Height() - (aPagePos.Y() + aPageSize.Height()))); + + if( mpDrawView->IsTextEdit() ) + { + Point aPnt1 = GetActiveWindow()->GetWinViewPos(); + ::tools::Rectangle aMinMaxRect( aPnt1, Size(-1, -1) ); + rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aMinMaxRect) ); + } + else + { + rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aRect) ); + } + + SvxLongLRSpaceItem aLRSpace(aPagePos.X() + mpActualPage->GetLeftBorder(), + aRect.Right() + mpActualPage->GetRightBorder(), + SID_ATTR_LONG_LRSPACE); + SvxLongULSpaceItem aULSpace(aPagePos.Y() + mpActualPage->GetUpperBorder(), + aRect.Bottom() + mpActualPage->GetLowerBorder(), + SID_ATTR_LONG_ULSPACE); + rSet.Put(SvxPagePosSizeItem(Point(0,0) - aPagePos, aViewSize.Width(), + aViewSize.Height())); + SfxPointItem aPointItem( SID_RULER_NULL_OFFSET, aPagePos + aOrigin ); + + SvxProtectItem aProtect( SID_RULER_PROTECT ); + + maMarkRect = mpDrawView->GetAllMarkedRect(); + + const bool bRTL = GetDoc() && GetDoc()->GetDefaultWritingMode() == css::text::WritingMode_RL_TB; + rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, bRTL)); + + if( mpDrawView->AreObjectsMarked() ) + { + if( mpDrawView->IsTextEdit() ) + { + SdrObject* pObj = mpDrawView->GetMarkedObjectList().GetMark( 0 )->GetMarkedSdrObj(); + if( pObj->GetObjInventor() == SdrInventor::Default) + { + SfxItemSet aEditAttr( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aEditAttr ); + if( aEditAttr.GetItemState( EE_PARA_TABS ) >= SfxItemState::DEFAULT ) + { + const SvxTabStopItem& rItem = aEditAttr.Get( EE_PARA_TABS ); + rSet.Put( rItem ); + + const SvxLRSpaceItem& rLRSpaceItem = aEditAttr.Get( EE_PARA_LRSPACE ); + SvxLRSpaceItem aLRSpaceItem( rLRSpaceItem.GetLeft(), + rLRSpaceItem.GetRight(), + rLRSpaceItem.GetTextFirstLineOffset(), SID_ATTR_PARA_LRSPACE ); + + const sal_Int16 nOutlineLevel = aEditAttr.Get( EE_PARA_OUTLLEVEL ).GetValue(); + const SvxNumBulletItem& rNumBulletItem = aEditAttr.Get( EE_PARA_NUMBULLET ); + if( nOutlineLevel != -1 && + rNumBulletItem.GetNumRule().GetLevelCount() > nOutlineLevel ) + { + const SvxNumberFormat& rFormat = rNumBulletItem.GetNumRule().GetLevel(nOutlineLevel); + aLRSpaceItem.SetTextLeft(rFormat.GetAbsLSpace() + rLRSpaceItem.GetTextLeft()); + aLRSpaceItem.SetTextFirstLineOffset( + rLRSpaceItem.GetTextFirstLineOffset() + rFormat.GetFirstLineOffset() + //TODO: overflow + - rFormat.GetCharTextDistance()); + } + + rSet.Put( aLRSpaceItem ); + + Point aPos( aPagePos + maMarkRect.TopLeft() ); + + if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SfxItemState::SET ) + { + const SdrMetricItem& rTLDItem = aEditAttr.Get( SDRATTR_TEXT_LEFTDIST ); + ::tools::Long nLD = rTLDItem.GetValue(); + aPos.AdjustX(nLD ); + } + + aPointItem.SetValue( aPos ); + + ::tools::Rectangle aParaRect(maMarkRect); + if (pObj->GetObjIdentifier() == SdrObjKind::Table) + { + sdr::table::SdrTableObj* pTable = static_cast(pObj); + sdr::table::CellPos cellpos; + pTable->getActiveCellPos(cellpos); + pTable->getCellBounds(cellpos, aParaRect); + } + + aLRSpace.SetLeft(aPagePos.X() + aParaRect.Left()); + + if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SfxItemState::SET ) + { + const SdrMetricItem& rTLDItem = aEditAttr.Get( SDRATTR_TEXT_LEFTDIST ); + ::tools::Long nLD = rTLDItem.GetValue(); + aLRSpace.SetLeft( aLRSpace.GetLeft() + nLD ); + } + + aLRSpace.SetRight(aRect.Right() + aPageSize.Width() - aParaRect.Right()); + + if ( aEditAttr.GetItemState( SDRATTR_TEXT_RIGHTDIST ) == SfxItemState::SET ) + { + const SdrMetricItem& rTRDItem = aEditAttr.Get( SDRATTR_TEXT_RIGHTDIST ); + ::tools::Long nRD = rTRDItem.GetValue(); + aLRSpace.SetRight( aLRSpace.GetRight() + nRD ); + } + + aULSpace.SetUpper( aPagePos.Y() + maMarkRect.Top() ); + aULSpace.SetLower( aRect.Bottom() + aPageSize.Height() - maMarkRect.Bottom() ); + + rSet.DisableItem( SID_RULER_OBJECT ); + + // lock page margins + aProtect.SetSizeProtect( true ); + aProtect.SetPosProtect( true ); + } + + if( aEditAttr.GetItemState( EE_PARA_WRITINGDIR ) >= SfxItemState::DEFAULT ) + { + const SvxFrameDirectionItem& rItem = aEditAttr.Get( EE_PARA_WRITINGDIR ); + rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, rItem.GetValue() == SvxFrameDirection::Horizontal_RL_TB)); + } + } + } + else + { + rSet.DisableItem( EE_PARA_TABS ); + rSet.DisableItem( SID_RULER_TEXT_RIGHT_TO_LEFT ); + + if( mpDrawView->IsResizeAllowed(true) ) + { + ::tools::Rectangle aResizeRect( maMarkRect ); + + aResizeRect.SetPos(aResizeRect.TopLeft() + aPagePos); + SvxObjectItem aObjItem(aResizeRect.Left(), aResizeRect.Right(), + aResizeRect.Top(), aResizeRect.Bottom()); + rSet.Put(aObjItem); + rSet.DisableItem( EE_PARA_TABS ); + } + else + { + rSet.DisableItem( SID_RULER_OBJECT ); + } + } + } + else + { + rSet.DisableItem( SID_RULER_OBJECT ); + rSet.DisableItem( EE_PARA_TABS ); + } + + rSet.Put( aLRSpace ); + rSet.Put( aULSpace ); + + rSet.Put( aPointItem ); + rSet.Put( aProtect ); +} + +void DrawViewShell::ExecStatusBar(SfxRequest& rReq) +{ + // nothing is executed during a slide show! + if(HasCurrentFunction(SID_PRESENTATION)) + return; + + CheckLineTo (rReq); + + switch ( rReq.GetSlot() ) + { + case SID_ATTR_SIZE: + { + GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_TRANSFORM, SfxCallMode::ASYNCHRON ); + } + break; + + case SID_STATUS_LAYOUT: + { + GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION_LAYOUT, SfxCallMode::ASYNCHRON ); + } + break; + } +} + +/** + * set state of snap object entries in popup + */ +void DrawViewShell::GetSnapItemState( SfxItemSet &rSet ) +{ + SdrPageView* pPV; + Point aMPos = GetActiveWindow()->PixelToLogic(maMousePos); + sal_uInt16 nHitLog = static_cast(GetActiveWindow()->PixelToLogic( + Size(FuPoor::HITPIX,0)).Width()); + sal_uInt16 nHelpLine; + + if ( !mpDrawView->PickHelpLine(aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) ) + return; + + const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine]; + + if ( rHelpLine.GetKind() == SdrHelpLineKind::Point ) + { + rSet.Put( SfxStringItem( SID_SET_SNAPITEM, + SdResId( STR_POPUP_EDIT_SNAPPOINT)) ); + rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM, + SdResId( STR_POPUP_DELETE_SNAPPOINT)) ); + } + else + { + rSet.Put( SfxStringItem( SID_SET_SNAPITEM, + SdResId( STR_POPUP_EDIT_SNAPLINE)) ); + rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM, + SdResId( STR_POPUP_DELETE_SNAPLINE)) ); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews4.cxx b/sd/source/ui/view/drviews4.cxx new file mode 100644 index 0000000000..4226f0e4e8 --- /dev/null +++ b/sd/source/ui/view/drviews4.cxx @@ -0,0 +1,971 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace { + void EndTextEditOnPage(sal_uInt16 nPageId) + { + SfxViewShell* pShell = SfxViewShell::GetFirst(); + while (pShell) + { + ::sd::ViewShellBase* pBase = dynamic_cast<::sd::ViewShellBase*>(pShell); + if (pBase) + { + ::sd::ViewShell* pViewSh = pBase->GetMainViewShell().get(); + ::sd::DrawViewShell* pDrawSh = dynamic_cast<::sd::DrawViewShell*>(pViewSh); + if (pDrawSh && pDrawSh->GetDrawView() && pDrawSh->getCurrentPage()->getPageId() == nPageId) + pDrawSh->GetDrawView()->SdrEndTextEdit(); + } + + pShell = SfxViewShell::GetNext(*pShell); + } + } +} + +namespace sd { + +#define PIPETTE_RANGE 0 + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; + +void DrawViewShell::DeleteActualPage() +{ + mpDrawView->SdrEndTextEdit(); + + try + { + Reference xDrawPagesSupplier( GetDoc()->getUnoModel(), UNO_QUERY_THROW ); + Reference xPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW ); + sal_uInt16 nPageCount = GetDoc()->GetSdPageCount(mePageKind); + SdPage* pPage = nullptr; + std::vector> pagesToDelete; + + GetView()->BegUndo(SdResId(STR_UNDO_DELETEPAGES)); + + for (sal_uInt16 i = 0; i < nPageCount; i++) + { + pPage = GetDoc()->GetSdPage(i, mePageKind); + sal_uInt16 nPageIndex = maTabControl->GetPagePos(pPage->getPageId()); + + slidesorter::SlideSorterViewShell* pVShell + = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase()); + bool bUseSlideSorter = pVShell != nullptr; + + if((bUseSlideSorter && IsSelected(nPageIndex)) || (!bUseSlideSorter && pPage->IsSelected())) + { + EndTextEditOnPage(pPage->getPageId()); + Reference< XDrawPage > xPage( xPages->getByIndex( nPageIndex ), UNO_QUERY_THROW ); + pagesToDelete.push_back(xPage); + } + } + for (const auto &xPage: pagesToDelete) + { + xPages->remove(xPage); + } + + GetView()->EndUndo(); + } + catch( Exception& ) + { + TOOLS_WARN_EXCEPTION( "sd", "SelectionManager::DeleteSelectedMasterPages()"); + } +} + +void DrawViewShell::DeleteActualLayer() +{ + if(!GetLayerTabControl()) // #i87182# + { + OSL_ENSURE(false, "No LayerTabBar (!)"); + return; + } + + SdrLayerAdmin& rAdmin = GetDoc()->GetLayerAdmin(); + sal_uInt16 nId = GetLayerTabControl()->GetCurPageId(); + const OUString& rName = GetLayerTabControl()->GetLayerName(nId); + if(LayerTabBar::IsRealNameOfStandardLayer(rName)) + { + assert(false && "Standard layer may not be deleted."); + return; + } + const OUString& rDisplayName(GetLayerTabControl()->GetPageText(nId)); + OUString aString(SdResId(STR_ASK_DELETE_LAYER)); + + // replace placeholder + aString = aString.replaceFirst("$", rDisplayName); + + std::unique_ptr xQueryBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Question, VclButtonsType::YesNo, + aString)); + if (xQueryBox->run() == RET_YES) + { + const SdrLayer* pLayer = rAdmin.GetLayer(rName); + mpDrawView->DeleteLayer( pLayer->GetName() ); + + /* in order to redraw TabBar and Window; should be initiated later on by + a hint from Joe (as by a change if the layer order). */ + // ( View::Notify() --> ViewShell::ResetActualLayer() ) + + mbIsLayerModeActive = false; // so that ChangeEditMode() does something + ChangeEditMode(GetEditMode(), true); + } +} + +bool DrawViewShell::KeyInput (const KeyEvent& rKEvt, ::sd::Window* pWin) +{ + bool bRet = false; + + if (!IsInputLocked() || (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)) + { + if(KEY_RETURN == rKEvt.GetKeyCode().GetCode() + && rKEvt.GetKeyCode().IsMod1() + && GetView()->IsTextEdit()) + { + // this should be used for cursor travelling. + SdPage* pActualPage = GetActualPage(); + const SdrMarkList& rMarkList = GetView()->GetMarkedObjectList(); + SdrTextObj* pCandidate = nullptr; + + if(pActualPage && 1 == rMarkList.GetMarkCount()) + { + SdrMark* pMark = rMarkList.GetMark(0); + + // remember which object was the text in edit mode + SdrObject* pOldObj = pMark->GetMarkedSdrObj(); + + // end text edit now + GetView()->SdrEndTextEdit(); + + // look for a new candidate, a successor of pOldObj + SdrObjListIter aIter(pActualPage, SdrIterMode::DeepNoGroups); + bool bDidVisitOldObject(false); + + while(aIter.IsMore() && !pCandidate) + { + SdrObject* pObj = aIter.Next(); + + if(auto pSdrTextObj = DynCastSdrTextObj( pObj )) + { + SdrInventor nInv(pObj->GetObjInventor()); + SdrObjKind nKnd(pObj->GetObjIdentifier()); + + if(SdrInventor::Default == nInv && + (SdrObjKind::TitleText == nKnd || SdrObjKind::OutlineText == nKnd || SdrObjKind::Text == nKnd) + && bDidVisitOldObject) + { + pCandidate = pSdrTextObj; + } + + if(pObj == pOldObj) + { + bDidVisitOldObject = true; + } + } + } + } + + if(pCandidate) + { + // set the new candidate to text edit mode + GetView()->UnMarkAll(); + GetView()->MarkObj(pCandidate, GetView()->GetSdrPageView()); + + GetViewFrame()->GetDispatcher()->Execute( + SID_ATTR_CHAR, SfxCallMode::ASYNCHRON); + } + else + { + // insert a new page with the same page layout + GetViewFrame()->GetDispatcher()->Execute( + SID_INSERTPAGE_QUICK, SfxCallMode::ASYNCHRON); + } + } + else + { + bRet = ViewShell::KeyInput(rKEvt, pWin); + //If object is marked , the corresponding entry is set true , else + //the corresponding entry is set false . + if(KEY_TAB == rKEvt.GetKeyCode().GetCode() + || KEY_ESCAPE == rKEvt.GetKeyCode().GetCode()) + + { + FreshNavigatrTree(); + } + } + if (!bRet && !mbReadOnly) // tdf#139804 + { + bRet = GetView()->KeyInput(rKEvt, pWin); + } + } + + return bRet; +} + +/** + * Start with Drag from ruler (helper lines, origin) + */ +void DrawViewShell::StartRulerDrag ( + const Ruler& rRuler, + const MouseEvent& rMEvt) +{ + GetActiveWindow()->CaptureMouse(); + + Point aWPos = GetActiveWindow()->PixelToLogic(GetActiveWindow()->GetPointerPosPixel()); + + if ( rRuler.GetExtraRect().Contains(rMEvt.GetPosPixel()) ) + { + mpDrawView->BegSetPageOrg(aWPos); + mbIsRulerDrag = true; + } + else + { + // #i34536# if no guide-lines are visible yet, that show them + if( ! mpDrawView->IsHlplVisible()) + mpDrawView->SetHlplVisible(); + + SdrHelpLineKind eKind; + + if ( rMEvt.IsMod1() ) + eKind = SdrHelpLineKind::Point; + else if ( rRuler.IsHorizontal() ) + eKind = SdrHelpLineKind::Horizontal; + else + eKind = SdrHelpLineKind::Vertical; + + mpDrawView->BegDragHelpLine(aWPos, eKind); + mbIsRulerDrag = true; + } +} + +void DrawViewShell::FreshNavigatrTree() +{ + SfxViewFrame *pViewFrame = GetViewFrame(); + if (!pViewFrame) + return; + SfxChildWindow* pWindow = pViewFrame->GetChildWindow( SID_NAVIGATOR ); + if( pWindow ) + { + SdNavigatorFloat* pNavWin = static_cast( pWindow->GetWindow() ); + if( pNavWin ) + pNavWin->FreshTree( GetDoc() ); + } + // sidebar version + SfxBindings& rBindings = pViewFrame->GetBindings(); + rBindings.Invalidate(SID_NAVIGATOR_STATE, true); +} + +void DrawViewShell::MouseButtonDown(const MouseEvent& rMEvt, + ::sd::Window* pWin) +{ + mbMouseButtonDown = true; + mbMouseSelecting = false; + + // We have to check if a context menu is shown and we have an UI + // active inplace client. In that case we have to ignore the mouse + // button down event. Otherwise we would crash (context menu has been + // opened by inplace client and we would deactivate the inplace client, + // the context menu is closed by VCL asynchronously which in the end + // would work on deleted objects or the context menu has no parent anymore) + SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient(); + bool bIsOleActive = ( pIPClient && pIPClient->IsObjectInPlaceActive() ); + + if (bIsOleActive && vcl::IsInPopupMenuExecute()) + return; + + if ( IsInputLocked() ) + return; + + ViewShell::MouseButtonDown(rMEvt, pWin); + + //If object is marked , the corresponding entry is set true , + //else the corresponding entry is set false . + FreshNavigatrTree(); + if (mbPipette) + { + SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()); + SvxBmpMask* pBmpMask = pWnd ? static_cast(pWnd->GetWindow()) : nullptr; + if (pBmpMask) + pBmpMask->PipetteClicked(); + } +} + +void DrawViewShell::MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin) +{ + if ( IsMouseButtonDown() ) + mbMouseSelecting = true; + + if ( IsInputLocked() ) + return; + + if ( mpDrawView->IsAction() ) + { + ::tools::Rectangle aOutputArea(Point(0,0), GetActiveWindow()->GetOutputSizePixel()); + + if ( !aOutputArea.Contains(rMEvt.GetPosPixel()) ) + { + bool bInsideOtherWindow = false; + + if (mpContentWindow) + { + aOutputArea = ::tools::Rectangle(Point(0,0), + mpContentWindow->GetOutputSizePixel()); + + Point aPos = mpContentWindow->GetPointerPosPixel(); + if ( aOutputArea.Contains(aPos) ) + bInsideOtherWindow = true; + } + + if (! GetActiveWindow()->HasFocus ()) + { + GetActiveWindow()->ReleaseMouse (); + mpDrawView->BrkAction (); + return; + } + else if ( bInsideOtherWindow ) + { + GetActiveWindow()->ReleaseMouse(); + pWin->CaptureMouse (); + } + } + else if ( pWin != GetActiveWindow() ) + pWin->CaptureMouse(); + } + + // Since the next MouseMove may execute a IsSolidDraggingNow() in + // SdrCreateView::MovCreateObj and there the ApplicationBackgroundColor + // is needed it is necessary to set it here. + if (GetDoc()) + { + ConfigureAppBackgroundColor(); + mpDrawView->SetApplicationBackgroundColor( GetViewOptions().mnAppBackgroundColor ); + } + + ViewShell::MouseMove(rMEvt, pWin); + + maMousePos = rMEvt.GetPosPixel(); + + ::tools::Rectangle aRect; + + if ( mbIsRulerDrag ) + { + Point aLogPos = GetActiveWindow()->PixelToLogic(maMousePos); + mpDrawView->MovAction(aLogPos); + } + + if ( mpDrawView->IsAction() ) + { + mpDrawView->TakeActionRect(aRect); + aRect = GetActiveWindow()->LogicToPixel(aRect); + } + else + { + aRect = ::tools::Rectangle(maMousePos, maMousePos); + } + + ShowMousePosInfo(aRect, pWin); + + SvxBmpMask* pBmpMask = nullptr; + if (mbPipette && GetViewFrame()->HasChildWindow(SvxBmpMaskChildWindow::GetChildWindowId())) + { + SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()); + pBmpMask = pWnd ? static_cast(pWnd->GetWindow()) : nullptr; + } + + if (!pBmpMask) + return; + + const ::tools::Long nStartX = maMousePos.X() - PIPETTE_RANGE; + const ::tools::Long nEndX = maMousePos.X() + PIPETTE_RANGE; + const ::tools::Long nStartY = maMousePos.Y() - PIPETTE_RANGE; + const ::tools::Long nEndY = maMousePos.Y() + PIPETTE_RANGE; + ::tools::Long nRed = 0; + ::tools::Long nGreen = 0; + ::tools::Long nBlue = 0; + const double fDiv = ( ( PIPETTE_RANGE << 1 ) + 1 ) * ( ( PIPETTE_RANGE << 1 ) + 1 ); + + for ( ::tools::Long nY = nStartY; nY <= nEndY; nY++ ) + { + for( ::tools::Long nX = nStartX; nX <= nEndX; nX++ ) + { + const Color aCol( pWin->GetOutDev()->GetPixel( pWin->PixelToLogic( Point( nX, nY ) ) ) ); + + nRed += aCol.GetRed(); + nGreen += aCol.GetGreen(); + nBlue += aCol.GetBlue(); + } + } + + pBmpMask->SetColor( Color( static_cast( nRed / fDiv + .5 ), + static_cast( nGreen / fDiv + .5 ), + static_cast( nBlue / fDiv + .5 ) ) ); +} + +void DrawViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) +{ + mbMouseButtonDown = false; + + if ( !IsInputLocked() ) + { + bool bIsSetPageOrg = mpDrawView->IsSetPageOrg(); + + if (mbIsRulerDrag) + { + ::tools::Rectangle aOutputArea(Point(0,0), GetActiveWindow()->GetOutputSizePixel()); + + if (aOutputArea.Contains(rMEvt.GetPosPixel())) + { + mpDrawView->EndAction(); + + if (bIsSetPageOrg) + GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET); + } + else if (rMEvt.IsLeft() && bIsSetPageOrg) + { + mpDrawView->BrkAction(); + SdPage* pPage = static_cast( mpDrawView->GetSdrPageView()->GetPage() ); + Point aOrg(pPage->GetLeftBorder(), pPage->GetUpperBorder()); + mpDrawView->GetSdrPageView()->SetPageOrigin(aOrg); + GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET); + } + else + { + mpDrawView->BrkAction(); + } + + GetActiveWindow()->ReleaseMouse(); + mbIsRulerDrag = false; + } + else + ViewShell::MouseButtonUp(rMEvt, pWin); + //If object is marked , the corresponding entry is set true , + //else the corresponding entry is set false . + FreshNavigatrTree(); + } + mbMouseSelecting = false; +} + +void DrawViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin) +{ + // The command event is send to the window after a possible context + // menu from an inplace client is closed. Now we have the chance to + // deactivate the inplace client without any problem regarding parent + // windows and code on the stack. + SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient(); + bool bIsOleActive = ( pIPClient && pIPClient->IsObjectInPlaceActive() ); + if ( bIsOleActive && ( rCEvt.GetCommand() == CommandEventId::ContextMenu )) + { + // Deactivate OLE object + mpDrawView->UnmarkAll(); + SelectionHasChanged(); + return; + } + + if ( IsInputLocked() ) + return; + + if( GetView() &&GetView()->getSmartTags().Command(rCEvt) ) + return; + + const bool bNativeShow (SlideShow::IsRunning(GetViewShellBase())); + + if( rCEvt.GetCommand() == CommandEventId::PasteSelection && !bNativeShow ) + { + TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromPrimarySelection()); + + if( aDataHelper.GetTransferable().is() ) + { + Point aPos; + sal_Int8 nDnDAction = DND_ACTION_COPY; + + if( GetActiveWindow() ) + aPos = GetActiveWindow()->PixelToLogic( rCEvt.GetMousePosPixel() ); + + if( !mpDrawView->InsertData( aDataHelper, aPos, nDnDAction, false ) ) + { + INetBookmark aINetBookmark( "", "" ); + + if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) + { + InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" ); + } + } + } + } + else if( rCEvt.GetCommand() == CommandEventId::ContextMenu && !bNativeShow && + pWin != nullptr && !mpDrawView->IsAction() && !SD_MOD()->GetWaterCan() ) + { + OUString aPopupId; // Resource name for popup menu + + // is there a snap object under the cursor? + SdrPageView* pPV; + Point aMPos = pWin->PixelToLogic( maMousePos ); + sal_uInt16 nHitLog = static_cast(GetActiveWindow()->PixelToLogic( + Size(FuPoor::HITPIX, 0 ) ).Width()); + sal_uInt16 nHelpLine; + // for gluepoints + SdrObject* pObj = nullptr; + sal_uInt16 nPickId = 0; + // for field command + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + const SvxFieldItem* pFldItem = nullptr; + if( pOLV ) + pFldItem = pOLV->GetFieldAtSelection(); + + // helper line + if ( mpDrawView->PickHelpLine( aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) ) + { + ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(10, 10)); + weld::Window* pParent = weld::GetPopupParent(*pWin, aRect); + ShowSnapLineContextMenu(pParent, aRect, *pPV, nHelpLine); + return; + } + // is gluepoint under cursor marked? + else if( mpDrawView->PickGluePoint( aMPos, pObj, nPickId, pPV ) && + mpDrawView->IsGluePointMarked( pObj, nPickId ) ) + { + aPopupId = "gluepoint"; + } + // field command? + else if( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) ) ) + { + LanguageType eLanguage( LANGUAGE_SYSTEM ); + + // Format popup with outliner language, if possible + if( pOLV->GetOutliner() ) + { + ESelection aSelection( pOLV->GetSelection() ); + eLanguage = pOLV->GetOutliner()->GetLanguage( aSelection.nStartPara, aSelection.nStartPos ); + } + + //fdo#44998 if the outliner has captured the mouse events release the lock + //so the SdFieldPopup can get them + pOLV->ReleaseMouse(); + SdFieldPopup aFieldPopup(pFldItem->GetField(), eLanguage); + + if ( rCEvt.IsMouseEvent() ) + aMPos = rCEvt.GetMousePosPixel(); + else + aMPos = Point( 20, 20 ); + ::tools::Rectangle aRect(aMPos, Size(1, 1)); + weld::Window* pParent = weld::GetPopupParent(*pWin, aRect); + + aFieldPopup.Execute(pParent, aRect); + + std::unique_ptr pField(aFieldPopup.GetField()); + if (pField) + { + SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD ); + // select field, so that it will be deleted on insert + ESelection aSel = pOLV->GetSelection(); + bool bSel = true; + if( aSel.nStartPos == aSel.nEndPos ) + { + bSel = false; + aSel.nEndPos++; + } + pOLV->SetSelection( aSel ); + + pOLV->InsertField( aFieldItem ); + + // reset selection back to original state + if( !bSel ) + aSel.nEndPos--; + pOLV->SetSelection( aSel ); + } + } + else + { + // is something selected? + if (mpDrawView->AreObjectsMarked() && + mpDrawView->GetMarkedObjectList().GetMarkCount() == 1 ) + { + pObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + if( HasCurrentFunction(SID_BEZIER_EDIT) && (dynamic_cast< SdrPathObj * >( pObj ) != nullptr ) ) + { + aPopupId = "bezier"; + } + else + { + if( mpDrawView->GetTextEditObject() ) + { + OutlinerView* pOutlinerView = mpDrawView->GetTextEditOutlinerView(); + Point aPos(rCEvt.GetMousePosPixel()); + + if ( pOutlinerView ) + { + if( ( rCEvt.IsMouseEvent() && pOutlinerView->IsWrongSpelledWordAtPos(aPos) ) || + ( !rCEvt.IsMouseEvent() && pOutlinerView->IsCursorAtWrongSpelledWord() ) ) + { + // Popup for Online-Spelling now handled by DrawDocShell + Link aLink = LINK(GetDocSh(), DrawDocShell, OnlineSpellCallback); + + if( !rCEvt.IsMouseEvent() ) + { + aPos = GetActiveWindow()->LogicToPixel( pOutlinerView->GetEditView().GetCursor()->GetPos() ); + } + // While showing the spell context menu + // we lock the input so that another + // context menu can not be opened during + // that time (crash #i43235#). In order + // to not lock the UI completely we + // first release the mouse. + GetActiveWindow()->ReleaseMouse(); + LockInput(); + pOutlinerView->ExecuteSpellPopup(aPos, aLink); + pOutlinerView->GetEditView().Invalidate(); + UnlockInput(); + } + else + { + if( (pObj->GetObjInventor() == SdrInventor::Default) && (pObj->GetObjIdentifier() == SdrObjKind::Table) ) + { + aPopupId = "table"; + } + else + { + aPopupId = "drawtext"; + } + } + } + } + else + { + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nId = pObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default) + { + switch ( nId ) + { + case SdrObjKind::OutlineText: + case SdrObjKind::Caption: + case SdrObjKind::TitleText: + case SdrObjKind::Text: + aPopupId = "textbox"; + break; + + case SdrObjKind::PathLine: + case SdrObjKind::PolyLine: + aPopupId = "curve"; + break; + + case SdrObjKind::FreehandLine: + case SdrObjKind::Edge: + aPopupId = "connector"; + break; + + case SdrObjKind::Line: + aPopupId = "line"; + break; + + case SdrObjKind::Measure: + aPopupId = "measure"; + break; + + case SdrObjKind::Rectangle: + case SdrObjKind::CircleOrEllipse: + case SdrObjKind::FreehandFill: + case SdrObjKind::PathFill: + case SdrObjKind::Polygon: + case SdrObjKind::CircleSection: + case SdrObjKind::CircleArc: + case SdrObjKind::CircleCut: + case SdrObjKind::CustomShape: + aPopupId = "draw"; + break; + + case SdrObjKind::Group: + aPopupId = "group"; + break; + + case SdrObjKind::Graphic: + aPopupId = "graphic"; + break; + + case SdrObjKind::OLE2: + aPopupId = "oleobject"; + break; + case SdrObjKind::Media: + aPopupId = "media"; + break; + case SdrObjKind::Table: + aPopupId = "table"; + break; + default: ; + } + } + else if( nInv == SdrInventor::E3d ) + { + if( nId == SdrObjKind::E3D_Scene ) + { + if( !mpDrawView->IsGroupEntered() ) + aPopupId = "3dscene"; + else + aPopupId = "3dscene2"; + } + else + aPopupId = "3dobject"; + } + else if( nInv == SdrInventor::FmForm ) + { + aPopupId = "form"; + } + } + } + } + + // multiple selection + else if (mpDrawView->AreObjectsMarked() && + mpDrawView->GetMarkedObjectList().GetMarkCount() > 1 ) + { + aPopupId = "multiselect"; + } + + // nothing selected + else + { + aPopupId = "page"; + } + } + // show Popup-Menu + if (!aPopupId.isEmpty()) + { + GetActiveWindow()->ReleaseMouse(); + + if(rCEvt.IsMouseEvent()) + GetViewFrame()->GetDispatcher()->ExecutePopup( aPopupId ); + else + { + //don't open contextmenu at mouse position if not opened via mouse + + //middle of the window if nothing is marked + Point aMenuPos(GetActiveWindow()->GetSizePixel().Width()/2 + ,GetActiveWindow()->GetSizePixel().Height()/2); + + //middle of the bounding rect if something is marked + if( mpDrawView->AreObjectsMarked() && mpDrawView->GetMarkedObjectList().GetMarkCount() >= 1 ) + { + ::tools::Rectangle aMarkRect; + mpDrawView->GetMarkedObjectList().TakeBoundRect(nullptr,aMarkRect); + aMenuPos = GetActiveWindow()->LogicToPixel( aMarkRect.Center() ); + + //move the point into the visible window area + if( aMenuPos.X() < 0 ) + aMenuPos.setX( 0 ); + if( aMenuPos.Y() < 0 ) + aMenuPos.setY( 0 ); + if( aMenuPos.X() > GetActiveWindow()->GetSizePixel().Width() ) + aMenuPos.setX( GetActiveWindow()->GetSizePixel().Width() ); + if( aMenuPos.Y() > GetActiveWindow()->GetSizePixel().Height() ) + aMenuPos.setY( GetActiveWindow()->GetSizePixel().Height() ); + } + + //open context menu at that point + GetViewFrame()->GetDispatcher()->ExecutePopup( aPopupId, GetActiveWindow(), &aMenuPos ); + } + } + } + else + { + ViewShell::Command(rCEvt, pWin); + } +} + +void DrawViewShell::ShowMousePosInfo(const ::tools::Rectangle& rRect, + ::sd::Window const * pWin) +{ + if (mbHasRulers && pWin ) + { + RulerLine pHLines[2]; + RulerLine pVLines[2]; + ::tools::Long nHOffs = 0; + ::tools::Long nVOffs = 0; + sal_uInt16 nCnt; + + if (mpHorizontalRuler) + mpHorizontalRuler->SetLines(); + + if (mpVerticalRuler) + mpVerticalRuler->SetLines(); + + if (mpHorizontalRuler) + { + nHOffs = mpHorizontalRuler->GetNullOffset() + + mpHorizontalRuler->GetPageOffset(); + } + + if (mpVerticalRuler) + { + nVOffs = mpVerticalRuler->GetNullOffset() + + mpVerticalRuler->GetPageOffset(); + } + + nCnt = 1; + pHLines[0].nPos = rRect.Left() - nHOffs; + pVLines[0].nPos = rRect.Top() - nVOffs; + + if ( rRect.Right() != rRect.Left() || rRect.Bottom() != rRect.Top() ) + { + pHLines[1].nPos = rRect.Right() - nHOffs; + pVLines[1].nPos = rRect.Bottom() - nVOffs; + nCnt++; + } + + if (mpHorizontalRuler) + mpHorizontalRuler->SetLines(nCnt, pHLines); + if (mpVerticalRuler) + mpVerticalRuler->SetLines(nCnt, pVLines); + } + + // display with coordinates in StatusBar + OSL_ASSERT (GetViewShell()!=nullptr); + if ( GetViewShell()->GetUIActiveClient() ) + return; + + SfxItemSetFixed< + SID_CONTEXT, SID_CONTEXT, + SID_ATTR_POSITION, SID_ATTR_SIZE> aSet(GetPool()); + + GetStatusBarState(aSet); + + aSet.Put( SfxStringItem( SID_CONTEXT, mpDrawView->GetStatusText() ) ); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.SetState(aSet); + rBindings.Invalidate(SID_CONTEXT); + rBindings.Invalidate(SID_ATTR_POSITION); + rBindings.Invalidate(SID_ATTR_SIZE); +} + +void DrawViewShell::LockInput() +{ + mnLockCount++; +} + +void DrawViewShell::UnlockInput() +{ + DBG_ASSERT( mnLockCount, "Input for this shell is not locked!" ); + if ( mnLockCount ) + mnLockCount--; +} + +void DrawViewShell::ShowSnapLineContextMenu(weld::Window* pParent, const ::tools::Rectangle& rRect, + SdrPageView& rPageView, const sal_uInt16 nSnapLineIndex) +{ + const SdrHelpLine& rHelpLine (rPageView.GetHelpLines()[nSnapLineIndex]); + std::unique_ptr xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/snapmenu.ui")); + std::unique_ptr xMenu(xBuilder->weld_menu("menu")); + + if (rHelpLine.GetKind() == SdrHelpLineKind::Point) + { + xMenu->append(OUString::number(SID_SET_SNAPITEM), SdResId(STR_POPUP_EDIT_SNAPPOINT)); + xMenu->append_separator("separator"); + xMenu->append(OUString::number(SID_DELETE_SNAPITEM), SdResId(STR_POPUP_DELETE_SNAPPOINT)); + } + else + { + xMenu->append(OUString::number(SID_SET_SNAPITEM), SdResId(STR_POPUP_EDIT_SNAPLINE)); + xMenu->append_separator("separator"); + xMenu->append(OUString::number(SID_DELETE_SNAPITEM), SdResId(STR_POPUP_DELETE_SNAPLINE)); + } + + const int nResult = xMenu->popup_at_rect(pParent, rRect).toInt32(); + switch (nResult) + { + case SID_SET_SNAPITEM: + { + SfxUInt32Item aHelpLineItem (ID_VAL_INDEX, nSnapLineIndex); + const SfxPoolItem* aArguments[] = {&aHelpLineItem, nullptr}; + GetViewFrame()->GetDispatcher()->Execute( + SID_SET_SNAPITEM, + SfxCallMode::SLOT, + aArguments); + } + break; + + case SID_DELETE_SNAPITEM: + { + rPageView.DeleteHelpLine(nSnapLineIndex); + } + break; + + default: + break; + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews5.cxx b/sd/source/ui/view/drviews5.cxx new file mode 100644 index 0000000000..8583ecc182 --- /dev/null +++ b/sd/source/ui/view/drviews5.cxx @@ -0,0 +1,653 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +void DrawViewShell::ModelHasChanged() +{ + Invalidate(); + // that the navigator also gets an up to date state + GetViewFrame()->GetBindings().Invalidate( SID_NAVIGATOR_STATE, true ); + + SfxBoolItem aItem( SID_3D_STATE, true ); + GetViewFrame()->GetDispatcher()->ExecuteList( + SID_3D_STATE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem }); + + // now initialize the TextEditOutliner which was newly created by the draw engine + ::Outliner* pOutliner = mpDrawView->GetTextEditOutliner(); + if (pOutliner) + { + SfxStyleSheetPool* pSPool = static_cast( GetDocSh()->GetStyleSheetPool() ); + pOutliner->SetStyleSheetPool(pSPool); + } +} + +void DrawViewShell::Resize() +{ + ViewShell::Resize(); + + // tdf#151621 Do not set if the embedded object is opening in a new window. + if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED + && GetDocSh()->IsInPlaceActive()) + { + SetZoomRect(GetDocSh()->GetVisArea(ASPECT_CONTENT)); + } + + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if( xSlideshow.is() && xSlideshow->isRunning() && !xSlideshow->isFullScreen() ) + { + xSlideshow->resize(maViewSize); + } +} + +void DrawViewShell::ArrangeGUIElements() +{ + // Retrieve the current size (thickness) of the scroll bars. That is + // the width of the vertical and the height of the horizontal scroll + // bar. + int nScrollBarSize = GetParentWindow()->GetSettings().GetStyleSettings().GetScrollBarSize(); + maScrBarWH = Size (nScrollBarSize, nScrollBarSize); + + ViewShell::ArrangeGUIElements (); + + maTabControl->Hide(); + + OSL_ASSERT (GetViewShell()!=nullptr); + Client* pIPClient = static_cast(GetViewShell()->GetIPClient()); + bool bClientActive = false; + if ( pIPClient && pIPClient->IsObjectInPlaceActive() ) + bClientActive = true; + + bool bInPlaceActive = GetViewFrame()->GetFrame().IsInPlace(); + + if ( mbZoomOnPage && !bInPlaceActive && !bClientActive ) + { + // with split, always resize first window + //af pWindow = mpContentWindow.get(); + SfxRequest aReq(SID_SIZE_PAGE, SfxCallMode::SLOT, GetDoc()->GetItemPool()); + ExecuteSlot( aReq ); + } +} + +/** + * Apply data of the FrameView on the current view + */ +void DrawViewShell::ReadFrameViewData(FrameView* pView) +{ + ModifyGuard aGuard( GetDoc() ); + + // this option has to be adjust at the model + GetDoc()->SetPickThroughTransparentTextFrames( + SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType())->IsPickThrough()); + + // initialization of the Character-(Screen-) attribute + if (HasRuler() != pView->HasRuler()) + SetRuler( pView->HasRuler() ); + + if (mpDrawView->GetGridCoarse() != pView->GetGridCoarse()) + mpDrawView->SetGridCoarse( pView->GetGridCoarse() ); + + if (mpDrawView->GetGridFine() != pView->GetGridFine()) + mpDrawView->SetGridFine( pView->GetGridFine() ); + + if (mpDrawView->GetSnapGridWidthX() != pView->GetSnapGridWidthX() || mpDrawView->GetSnapGridWidthY() != pView->GetSnapGridWidthY()) + mpDrawView->SetSnapGridWidth(pView->GetSnapGridWidthX(), pView->GetSnapGridWidthY()); + + if (mpDrawView->IsGridVisible() != pView->IsGridVisible()) + mpDrawView->SetGridVisible( pView->IsGridVisible() ); + + if (mpDrawView->IsGridFront() != pView->IsGridFront()) + mpDrawView->SetGridFront( pView->IsGridFront() ); + + if (mpDrawView->GetSnapAngle() != pView->GetSnapAngle()) + mpDrawView->SetSnapAngle( pView->GetSnapAngle() ); + + if (mpDrawView->IsGridSnap() != pView->IsGridSnap() ) + mpDrawView->SetGridSnap( pView->IsGridSnap() ); + + if (mpDrawView->IsBordSnap() != pView->IsBordSnap() ) + mpDrawView->SetBordSnap( pView->IsBordSnap() ); + + if (mpDrawView->IsHlplSnap() != pView->IsHlplSnap() ) + mpDrawView->SetHlplSnap( pView->IsHlplSnap() ); + + if (mpDrawView->IsOFrmSnap() != pView->IsOFrmSnap() ) + mpDrawView->SetOFrmSnap( pView->IsOFrmSnap() ); + + if (mpDrawView->IsOPntSnap() != pView->IsOPntSnap() ) + mpDrawView->SetOPntSnap( pView->IsOPntSnap() ); + + if (mpDrawView->IsOConSnap() != pView->IsOConSnap() ) + mpDrawView->SetOConSnap( pView->IsOConSnap() ); + + if (mpDrawView->IsHlplVisible() != pView->IsHlplVisible() ) + mpDrawView->SetHlplVisible( pView->IsHlplVisible() ); + + if (mpDrawView->IsDragStripes() != pView->IsDragStripes() ) + mpDrawView->SetDragStripes( pView->IsDragStripes() ); + + if (mpDrawView->IsPlusHandlesAlwaysVisible() != pView->IsPlusHandlesAlwaysVisible() ) + mpDrawView->SetPlusHandlesAlwaysVisible( pView->IsPlusHandlesAlwaysVisible() ); + + if (mpDrawView->GetSnapMagneticPixel() != pView->GetSnapMagneticPixel() ) + mpDrawView->SetSnapMagneticPixel( pView->GetSnapMagneticPixel() ); + + if (mpDrawView->IsMarkedHitMovesAlways() != pView->IsMarkedHitMovesAlways() ) + mpDrawView->SetMarkedHitMovesAlways( pView->IsMarkedHitMovesAlways() ); + + if (mpDrawView->IsMoveOnlyDragging() != pView->IsMoveOnlyDragging() ) + mpDrawView->SetMoveOnlyDragging( pView->IsMoveOnlyDragging() ); + + if (mpDrawView->IsNoDragXorPolys() != pView->IsNoDragXorPolys() ) + mpDrawView->SetNoDragXorPolys( pView->IsNoDragXorPolys() ); + + if (mpDrawView->IsCrookNoContortion() != pView->IsCrookNoContortion() ) + mpDrawView->SetCrookNoContortion( pView->IsCrookNoContortion() ); + + if (mpDrawView->IsAngleSnapEnabled() != pView->IsAngleSnapEnabled() ) + mpDrawView->SetAngleSnapEnabled( pView->IsAngleSnapEnabled() ); + + if (mpDrawView->IsBigOrtho() != pView->IsBigOrtho() ) + mpDrawView->SetBigOrtho( pView->IsBigOrtho() ); + + if (mpDrawView->IsOrtho() != pView->IsOrtho() ) + mpDrawView->SetOrtho( pView->IsOrtho() ); + + if (mpDrawView->GetEliminatePolyPointLimitAngle() != pView->GetEliminatePolyPointLimitAngle() ) + mpDrawView->SetEliminatePolyPointLimitAngle( pView->GetEliminatePolyPointLimitAngle() ); + + if (mpDrawView->IsEliminatePolyPoints() != pView->IsEliminatePolyPoints() ) + mpDrawView->SetEliminatePolyPoints( pView->IsEliminatePolyPoints() ); + + if (mpDrawView->IsSolidDragging() != pView->IsSolidDragging() ) + mpDrawView->SetSolidDragging( pView->IsSolidDragging() ); + + if (mpDrawView->IsQuickTextEditMode() != pView->IsQuickEdit()) + mpDrawView->SetQuickTextEditMode( pView->IsQuickEdit() ); + + // #i26631# + if (mpDrawView->IsMasterPagePaintCaching() != pView->IsMasterPagePaintCaching()) + mpDrawView->SetMasterPagePaintCaching( pView->IsMasterPagePaintCaching() ); + + if (mpDrawView->GetDragThresholdPixels() != pView->GetDragThresholdPixels()) + mpDrawView->SetDragThresholdPixels( pView->GetDragThresholdPixels() ); + + // handle size: 9 pixels + sal_uInt16 nTmp = mpDrawView->GetMarkHdlSizePixel(); + if( nTmp != 9 ) + mpDrawView->SetMarkHdlSizePixel( 9 ); + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + if (pPageView) + { + if ( pPageView->GetVisibleLayers() != pView->GetVisibleLayers() ) + pPageView->SetVisibleLayers( pView->GetVisibleLayers() ); + + if ( pPageView->GetPrintableLayers() != pView->GetPrintableLayers() ) + pPageView->SetPrintableLayers( pView->GetPrintableLayers() ); + + if ( pPageView->GetLockedLayers() != pView->GetLockedLayers() ) + pPageView->SetLockedLayers( pView->GetLockedLayers() ); + + if (mePageKind == PageKind::Notes) + { + if (pPageView->GetHelpLines() != pView->GetNotesHelpLines()) + pPageView->SetHelpLines( pView->GetNotesHelpLines() ); + } + else if (mePageKind == PageKind::Handout) + { + if (pPageView->GetHelpLines() != pView->GetHandoutHelpLines()) + pPageView->SetHelpLines( pView->GetHandoutHelpLines() ); + } + else + { + if (pPageView->GetHelpLines() != pView->GetStandardHelpLines()) + pPageView->SetHelpLines( pView->GetStandardHelpLines() ); + } + } + + if ( mpDrawView->GetActiveLayer() != pView->GetActiveLayer() ) + mpDrawView->SetActiveLayer( pView->GetActiveLayer() ); + + sal_uInt16 nSelectedPage = 0; + + if (mePageKind != PageKind::Handout) + { + nSelectedPage = pView->GetSelectedPage(); + } + + EditMode eNewEditMode = pView->GetViewShEditMode(/*mePageKind*/); + bool bNewLayerMode = pView->IsLayerMode(); + + if(IsLayerModeActive() && bNewLayerMode) + { + // #i57936# Force mbIsLayerModeActive to false so that ChangeEditMode + // below does something regarding LayerTabBar content refresh. That refresh + // is only done when IsLayerModeActive changes. It needs to be done + // since e.g. Layer visibility was changed above and this may need + // a refresh to show the correct graphical representation + mbIsLayerModeActive = false; + } + + ChangeEditMode(eNewEditMode, bNewLayerMode); + SwitchPage(nSelectedPage); + + // restore DrawMode for 'normal' window + if(GetActiveWindow()->GetOutDev()->GetDrawMode() != pView->GetDrawMode()) + GetActiveWindow()->GetOutDev()->SetDrawMode(pView->GetDrawMode()); + + if ( mpDrawView->IsDesignMode() != pView->IsDesignMode() ) + { + SfxBoolItem aDesignModeItem( SID_FM_DESIGN_MODE, pView->IsDesignMode() ); + GetViewFrame()->GetDispatcher()->ExecuteList(SID_FM_DESIGN_MODE, + SfxCallMode::SYNCHRON | SfxCallMode::RECORD, + { &aDesignModeItem }); + } + + // has to be called in the end, because it executes a WriteFrameViewData() + if (mpDrawView->IsFrameDragSingles() != pView->IsFrameDragSingles() ) + mpDrawView->SetFrameDragSingles( pView->IsFrameDragSingles() ); +} + +/** + * Apply data of the current view on the FrameView + */ +void DrawViewShell::WriteFrameViewData() +{ + // store character-(screen-) attribute of FrameView + mpFrameView->SetRuler( HasRuler() ); + mpFrameView->SetGridCoarse( mpDrawView->GetGridCoarse() ); + mpFrameView->SetGridFine( mpDrawView->GetGridFine() ); + mpFrameView->SetSnapGridWidth(mpDrawView->GetSnapGridWidthX(), mpDrawView->GetSnapGridWidthY()); + mpFrameView->SetGridVisible( mpDrawView->IsGridVisible() ); + mpFrameView->SetGridFront( mpDrawView->IsGridFront() ); + mpFrameView->SetSnapAngle( mpDrawView->GetSnapAngle() ); + mpFrameView->SetGridSnap( mpDrawView->IsGridSnap() ); + mpFrameView->SetBordSnap( mpDrawView->IsBordSnap() ); + mpFrameView->SetHlplSnap( mpDrawView->IsHlplSnap() ); + mpFrameView->SetOFrmSnap( mpDrawView->IsOFrmSnap() ); + mpFrameView->SetOPntSnap( mpDrawView->IsOPntSnap() ); + mpFrameView->SetOConSnap( mpDrawView->IsOConSnap() ); + mpFrameView->SetHlplVisible( mpDrawView->IsHlplVisible() ); + mpFrameView->SetDragStripes( mpDrawView->IsDragStripes() ); + mpFrameView->SetPlusHandlesAlwaysVisible( mpDrawView->IsPlusHandlesAlwaysVisible() ); + mpFrameView->SetFrameDragSingles( mpDrawView->IsFrameDragSingles() ); + mpFrameView->SetMarkedHitMovesAlways( mpDrawView->IsMarkedHitMovesAlways() ); + mpFrameView->SetMoveOnlyDragging( mpDrawView->IsMoveOnlyDragging() ); + mpFrameView->SetNoDragXorPolys( mpDrawView->IsNoDragXorPolys() ); + mpFrameView->SetCrookNoContortion( mpDrawView->IsCrookNoContortion() ); + mpFrameView->SetBigOrtho( mpDrawView->IsBigOrtho() ); + mpFrameView->SetEliminatePolyPointLimitAngle( mpDrawView->GetEliminatePolyPointLimitAngle() ); + mpFrameView->SetEliminatePolyPoints( mpDrawView->IsEliminatePolyPoints() ); + + mpFrameView->SetSolidDragging( mpDrawView->IsSolidDragging() ); + mpFrameView->SetQuickEdit( mpDrawView->IsQuickTextEditMode() ); + + mpFrameView->SetDesignMode( mpDrawView->IsDesignMode() ); + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisArea = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + if (comphelper::LibreOfficeKit::isActive()) + { + // aVisArea is nonsensical in the LOK case, use the slide size + aVisArea = ::tools::Rectangle(Point(), getCurrentPage()->GetSize()); + } + + mpFrameView->SetVisArea(aVisArea); + + if( mePageKind == PageKind::Handout ) + mpFrameView->SetSelectedPage(0); + else + { + mpFrameView->SetSelectedPage( maTabControl->GetCurPagePos() ); + } + + mpFrameView->SetViewShEditMode(meEditMode); + mpFrameView->SetLayerMode(IsLayerModeActive()); + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if (pPageView) + { + if ( mpFrameView->GetVisibleLayers() != pPageView->GetVisibleLayers() ) + mpFrameView->SetVisibleLayers( pPageView->GetVisibleLayers() ); + + if ( mpFrameView->GetPrintableLayers() != pPageView->GetPrintableLayers() ) + mpFrameView->SetPrintableLayers( pPageView->GetPrintableLayers() ); + + if ( mpFrameView->GetLockedLayers() != pPageView->GetLockedLayers() ) + mpFrameView->SetLockedLayers( pPageView->GetLockedLayers() ); + + if (mePageKind == PageKind::Notes) + { + mpFrameView->SetNotesHelpLines( pPageView->GetHelpLines() ); + } + else if (mePageKind == PageKind::Handout) + { + mpFrameView->SetHandoutHelpLines( pPageView->GetHelpLines() ); + } + else + { + mpFrameView->SetStandardHelpLines( pPageView->GetHelpLines() ); + } + } + + if ( mpFrameView->GetActiveLayer() != mpDrawView->GetActiveLayer() ) + mpFrameView->SetActiveLayer( mpDrawView->GetActiveLayer() ); + + // store DrawMode for 'normal' window + if(mpFrameView->GetDrawMode() != GetActiveWindow()->GetOutDev()->GetDrawMode()) + mpFrameView->SetDrawMode(GetActiveWindow()->GetOutDev()->GetDrawMode()); +} + +void DrawViewShell::PrePaint() +{ + mpDrawView->PrePaint(); +} + +/** + * The event is forwarded to the Viewshell and the current function by the + * window pWin. + * + * Remark: pWin==NULL, if Paint() is called from ShowWindow! + */ +void DrawViewShell::Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) +{ + /* This is done before each text edit, so why not do it before every paint. + The default language is only used if the outliner only contains one + character in a symbol font */ + GetDoc()->GetDrawOutliner().SetDefaultLanguage( GetDoc()->GetLanguage( EE_CHAR_LANGUAGE ) ); + + // Set Application Background color for usage in SdrPaintView(s) + mpDrawView->SetApplicationBackgroundColor( GetViewOptions().mnAppBackgroundColor ); + + /* This is done before each text edit, so why not do it before every paint. + The default language is only used if the outliner only contains one + character in a symbol font */ + GetDoc()->GetDrawOutliner().SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() ); + + mpDrawView->CompleteRedraw( pWin->GetOutDev(), vcl::Region( rRect ) ); +} + +/** + * adjust zoom factor for InPlace + */ +void DrawViewShell::SetZoomFactor(const Fraction& rZoomX, const Fraction& rZoomY) +{ + ViewShell::SetZoomFactor(rZoomX, rZoomY); + mbZoomOnPage = false; + Point aOrigin = GetActiveWindow()->GetViewOrigin(); + GetActiveWindow()->SetWinViewPos(aOrigin); +} + +void DrawViewShell::HidePage() +{ + FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); + if (pFormShell != nullptr) + pFormShell->PrepareClose(false); +} + +void DrawViewShell::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + WriteFrameViewData(); + + ViewShell::WriteUserDataSequence( rSequence ); + + const sal_Int32 nIndex = rSequence.getLength(); + rSequence.realloc( nIndex + 1 ); + auto pSequence = rSequence.getArray(); + pSequence[nIndex].Name = sUNO_View_ZoomOnPage ; + pSequence[nIndex].Value <<= mbZoomOnPage; + + // Common SdrModel processing + GetDocSh()->GetDoc()->WriteUserDataSequence(rSequence); +} + +void DrawViewShell::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + WriteFrameViewData(); + + ViewShell::ReadUserDataSequence( rSequence ); + + for (const css::beans::PropertyValue& rValue : rSequence) + { + if ( rValue.Name == sUNO_View_ZoomOnPage ) + { + bool bZoomPage = false; + if( rValue.Value >>= bZoomPage ) + { + mbZoomOnPage = bZoomPage; + } + } + // Fallback to common SdrModel processing + else GetDocSh()->GetDoc()->ReadUserDataSequenceValue(&rValue); + } + + // The parameter rSequence contains the config-items from + // . Determine, whether + // they contain "VisibleLayers", "PrintableLayers" and "LockedLayers". If not, it + // is a foreign document or a new document after transition period and the corresponding + // information were read from . In that case we need to bring + // the information from model to view. + bool bHasVisiPrnLockSettings(false); + for ( auto & rPropertyValue : rSequence ) + { + if ( rPropertyValue.Name == sUNO_View_VisibleLayers + || rPropertyValue.Name == sUNO_View_PrintableLayers + || rPropertyValue.Name == sUNO_View_LockedLayers ) + { + bHasVisiPrnLockSettings = true; + break; + } + } + if ( !bHasVisiPrnLockSettings ) + { + const SdrLayerAdmin& rLayerAdmin = GetDocSh()->GetDoc()->GetLayerAdmin(); + SdrLayerIDSet aSdrLayerIDSet; + rLayerAdmin.getVisibleLayersODF( aSdrLayerIDSet ); + mpFrameView -> SetVisibleLayers( aSdrLayerIDSet ); + rLayerAdmin.getPrintableLayersODF( aSdrLayerIDSet ); + mpFrameView -> SetPrintableLayers( aSdrLayerIDSet ); + rLayerAdmin.getLockedLayersODF( aSdrLayerIDSet ); + mpFrameView -> SetLockedLayers( aSdrLayerIDSet ); + } + else + { + // tdf#129898 repair layer "DrawnInSlideshow", which was wrongly written + // in LO 6.2 to 6.4. The ODF defaults were corrected when reading draw:layer-set, but + // not in reading config settings, because there the name is not known. + const SdrLayerAdmin& rLayerAdmin = GetDocSh()->GetDoc()->GetLayerAdmin(); + if (rLayerAdmin.GetLayer("DrawnInSlideshow")) + { + SdrLayerIDSet aSdrLayerIDSet; + rLayerAdmin.getVisibleLayersODF( aSdrLayerIDSet ); + mpFrameView -> SetVisibleLayers( aSdrLayerIDSet ); + rLayerAdmin.getPrintableLayersODF( aSdrLayerIDSet ); + mpFrameView -> SetPrintableLayers( aSdrLayerIDSet ); + rLayerAdmin.getLockedLayersODF( aSdrLayerIDSet ); + mpFrameView -> SetLockedLayers( aSdrLayerIDSet ); + } + } + + + if( mpFrameView->GetPageKind() != mePageKind ) + { + mePageKind = mpFrameView->GetPageKind(); + + if (mePageKind == PageKind::Notes) + { + GetActiveWindow()->SetHelpId( CMD_SID_NOTES_MODE ); + } + else if (mePageKind == PageKind::Handout) + { + GetActiveWindow()->SetHelpId( CMD_SID_HANDOUT_MASTER_MODE ); + } + else + { + GetActiveWindow()->SetHelpId( HID_SDDRAWVIEWSHELL ); + } + } + + ReadFrameViewData( mpFrameView ); + + if( !mbZoomOnPage ) + { + const ::tools::Rectangle aVisArea( mpFrameView->GetVisArea() ); + + // tdf#151621 Do not set if the embedded object is opening in a new window. + if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED + && GetDocSh()->IsInPlaceActive()) + { + GetDocSh()->SetVisArea(aVisArea); + } + + VisAreaChanged(aVisArea); + + ::sd::View* pView = GetView(); + + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } + + SetZoomRect(aVisArea); + } + ChangeEditMode (meEditMode, ! IsLayerModeActive()); + ResetActualLayer(); +} + +void DrawViewShell::VisAreaChanged(const ::tools::Rectangle& rRect) +{ + ViewShell::VisAreaChanged( rRect ); + + DrawController& rController = *GetViewShellBase().GetDrawController(); + rController.FireVisAreaChanged (rRect); +} + +/** If there is a valid controller then create a new instance of + AccessibleDrawDocumentView. Otherwise return an empty + reference. +*/ +css::uno::Reference + DrawViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow) +{ + if (GetViewShellBase().GetController() != nullptr) + { + rtl::Reference pDocumentView = + new accessibility::AccessibleDrawDocumentView ( + pWindow, + this, + GetViewShellBase().GetController(), + pWindow->GetAccessibleParentWindow()->GetAccessible()); + pDocumentView->Init(); + return pDocumentView; + } + + SAL_WARN("sd", "DrawViewShell::CreateAccessibleDocumentView: no controller"); + return css::uno::Reference< css::accessibility::XAccessible>(); +} + +int DrawViewShell::GetActiveTabLayerIndex() const +{ + const LayerTabBar* pBar + = const_cast(this)->GetLayerTabControl (); + if (pBar != nullptr) + return pBar->GetPagePos (pBar->GetCurPageId()); + else + return -1; +} + +void DrawViewShell::SetActiveTabLayerIndex (int nIndex) +{ + LayerTabBar* pBar = GetLayerTabControl (); + if (pBar == nullptr) + return; + + // Ignore invalid indices silently. + if (nIndex>=0 && nIndexGetPageCount()) + { + // Tell the draw view and the tab control of the new active layer. + mpDrawView->SetActiveLayer (pBar->GetLayerName (pBar->GetPageId (static_cast(nIndex)))); + pBar->SetCurPageId (pBar->GetPageId (static_cast(nIndex))); + rtl::Reference pUnoDrawView(new SdUnoDrawView ( + *this, + *GetView())); + css::uno::Reference< css::drawing::XLayer> rLayer = pUnoDrawView->getActiveLayer(); + GetViewShellBase().GetDrawController()->fireChangeLayer( &rLayer ); + } +} + +LayerTabBar* DrawViewShell::GetLayerTabControl() +{ + return mpLayerTabBar.get(); +} + +int DrawViewShell::GetTabLayerCount() const +{ + const LayerTabBar* pBar + = const_cast(this)->GetLayerTabControl (); + if (pBar != nullptr) + return pBar->GetPageCount(); + else + return 0; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews6.cxx b/sd/source/ui/view/drviews6.cxx new file mode 100644 index 0000000000..e02b54f488 --- /dev/null +++ b/sd/source/ui/view/drviews6.cxx @@ -0,0 +1,337 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace sd { + +/** + * handle SfxRequests for FontWork + */ +void DrawViewShell::ExecFormText(SfxRequest& rReq) +{ + // nothing is executed during a slide show! + if(HasCurrentFunction(SID_PRESENTATION)) + return; + + CheckLineTo (rReq); + + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() && + !mpDrawView->IsPresObjSelected() ) + { + const SfxItemSet& rSet = *rReq.GetArgs(); + + if ( mpDrawView->IsTextEdit() ) + mpDrawView->SdrEndTextEdit(); + + mpDrawView->SetAttributes(rSet); + } +} + +/** + * Return state values for FontWork + */ +void DrawViewShell::GetFormTextState(SfxItemSet& rSet) +{ + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const SdrObject* pObj = nullptr; + + if ( rMarkList.GetMarkCount() == 1 ) + pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + const SdrTextObj* pTextObj = DynCastSdrTextObj(pObj); + const bool bDeactivate( + !pObj || + !pTextObj || + !pTextObj->HasText() || + dynamic_cast< const SdrObjCustomShape* >(pObj)); // #121538# no FontWork for CustomShapes + + if(bDeactivate) + { +// automatic open/close the FontWork-Dialog; first deactivate it + + rSet.DisableItem(XATTR_FORMTXTSTYLE); + rSet.DisableItem(XATTR_FORMTXTADJUST); + rSet.DisableItem(XATTR_FORMTXTDISTANCE); + rSet.DisableItem(XATTR_FORMTXTSTART); + rSet.DisableItem(XATTR_FORMTXTMIRROR); + rSet.DisableItem(XATTR_FORMTXTHIDEFORM); + rSet.DisableItem(XATTR_FORMTXTOUTLINE); + rSet.DisableItem(XATTR_FORMTXTSHADOW); + rSet.DisableItem(XATTR_FORMTXTSHDWCOLOR); + rSet.DisableItem(XATTR_FORMTXTSHDWXVAL); + rSet.DisableItem(XATTR_FORMTXTSHDWYVAL); + } + else + { + SfxItemSet aSet( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aSet ); + rSet.Set( aSet ); + } +} + +void DrawViewShell::ExecAnimationWin( SfxRequest& rReq ) +{ + // nothing is executed during a slide show! + if (HasCurrentFunction(SID_PRESENTATION)) + return; + + CheckLineTo (rReq); + + sal_uInt16 nSId = rReq.GetSlot(); + + switch( nSId ) + { + case SID_ANIMATOR_INIT: + case SID_ANIMATOR_ADD: + case SID_ANIMATOR_CREATE: + { + AnimationWindow* pAnimWin; + sal_uInt16 nId = AnimationChildWindow::GetChildWindowId(); + + SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(nId); + + pAnimWin = pWnd ? static_cast(pWnd->GetWindow()) : nullptr; + + if ( pAnimWin ) + { + if( nSId == SID_ANIMATOR_ADD ) + pAnimWin->AddObj( *mpDrawView ); + else if( nSId == SID_ANIMATOR_CREATE ) + pAnimWin->CreateAnimObj( *mpDrawView ); + } + } + break; + + default: + break; + } +} + +/** + * Return status values for animator + * + * nValue == 0 -> No button + * nValue == 1 -> Button 'accept' + * nValue == 2 -> Button 'accept individually' + * nValue == 3 -> Buttons 'accept' and 'accept individually' + */ +void DrawViewShell::GetAnimationWinState( SfxItemSet& rSet ) +{ + // here we could disable buttons etc. + sal_uInt16 nValue; + + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nMarkCount = rMarkList.GetMarkCount(); + + if( nMarkCount == 0 ) + nValue = 0; + else if( nMarkCount > 1 ) + nValue = 3; + else // 1 Object + { + const SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nId = pObj->GetObjIdentifier(); + // 1 selected group object + if( nInv == SdrInventor::Default && nId == SdrObjKind::Group ) + nValue = 3; + else if( nInv == SdrInventor::Default && nId == SdrObjKind::Graphic ) // Animated GIF ? + { + sal_uInt16 nCount = 0; + + if( static_cast(pObj)->IsAnimated() ) + nCount = static_cast(pObj)->GetGraphic().GetAnimation().Count(); + if( nCount > 0 ) + nValue = 2; + else + nValue = 1; + } + else + nValue = 1; + } + rSet.Put( SfxUInt16Item( SID_ANIMATOR_STATE, nValue ) ); +} + +void DrawViewShell::SetChildWindowState( SfxItemSet& rSet ) +{ + // State of SfxChild-Windows (Animator, Fontwork etc.) + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_FONTWORK ) ) + { + sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId(); + rSet.Put(SfxBoolItem(SID_FONTWORK, GetViewFrame()->HasChildWindow(nId))); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_COLOR_CONTROL ) ) + { + sal_uInt16 nId = SvxColorChildWindow::GetChildWindowId(); + rSet.Put(SfxBoolItem(SID_COLOR_CONTROL, GetViewFrame()->HasChildWindow(nId))); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ANIMATION_OBJECTS ) ) + { + sal_uInt16 nId = AnimationChildWindow::GetChildWindowId(); + rSet.Put( SfxBoolItem( SID_ANIMATION_OBJECTS, GetViewFrame()->HasChildWindow( nId ) ) ); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_NAVIGATOR ) ) + { + rSet.Put( SfxBoolItem( SID_NAVIGATOR, GetViewFrame()->HasChildWindow( SID_NAVIGATOR ) ) ); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_BMPMASK ) ) + { + sal_uInt16 nId = SvxBmpMaskChildWindow::GetChildWindowId(); + rSet.Put( SfxBoolItem( SID_BMPMASK, GetViewFrame()->HasChildWindow( nId ) ) ); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_IMAP ) ) + { + sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId(); + rSet.Put( SfxBoolItem( SID_IMAP, GetViewFrame()->HasChildWindow( nId ) ) ); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_3D_WIN ) ) + { + sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId(); + rSet.Put( SfxBoolItem( SID_3D_WIN, GetViewFrame()->HasChildWindow( nId ) ) ); + } +#if HAVE_FEATURE_AVMEDIA + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_AVMEDIA_PLAYER ) ) + { + sal_uInt16 nId = ::avmedia::MediaPlayer::GetChildWindowId(); + rSet.Put( SfxBoolItem( SID_AVMEDIA_PLAYER, GetViewFrame()->HasChildWindow( nId ) ) ); + } +#endif +} + +/** + * Handle SfxRequests for pipette + */ +void DrawViewShell::ExecBmpMask( SfxRequest const & rReq ) +{ + // nothing is executed during a slide show! + if (HasCurrentFunction(SID_PRESENTATION)) + return; + + switch ( rReq.GetSlot() ) + { + case SID_BMPMASK_PIPETTE : + { + mbPipette = rReq.GetArgs()->Get( SID_BMPMASK_PIPETTE ).GetValue(); + } + break; + + case SID_BMPMASK_EXEC : + { + SdrGrafObj* pObj = nullptr; + if( mpDrawView && mpDrawView->GetMarkedObjectList().GetMarkCount() ) + pObj = dynamic_cast< SdrGrafObj* >( mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj() ); + + if ( pObj && !mpDrawView->IsTextEdit() ) + { + rtl::Reference xNewObj(SdrObject::Clone(*pObj, pObj->getSdrModelFromSdrObject())); + bool bCont = true; + + if (xNewObj->IsLinkedGraphic()) + { + std::unique_ptr xBuilder(Application::CreateBuilder(GetFrameWeld(), "modules/sdraw/ui/queryunlinkimagedialog.ui")); + std::unique_ptr xQueryBox(xBuilder->weld_message_dialog("QueryUnlinkImageDialog")); + + if (RET_YES == xQueryBox->run()) + xNewObj->ReleaseGraphicLink(); + else + bCont = false; + } + + SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow( + SvxBmpMaskChildWindow::GetChildWindowId()); + SvxBmpMask* pBmpMask = pWnd ? static_cast(pWnd->GetWindow()) : nullptr; + assert(pBmpMask); + if (bCont && pBmpMask) + { + const Graphic& rOldGraphic = xNewObj->GetGraphic(); + const Graphic aNewGraphic(pBmpMask->Mask(rOldGraphic)); + + if( aNewGraphic != rOldGraphic ) + { + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + + xNewObj->SetEmptyPresObj(false); + xNewObj->SetGraphic(pBmpMask->Mask(xNewObj->GetGraphic())); + + OUString aStr = mpDrawView->GetDescriptionOfMarkedObjects() + + " " + SdResId(STR_EYEDROPPER); + + mpDrawView->BegUndo( aStr ); + mpDrawView->ReplaceObjectAtView(pObj, *pPV, xNewObj.get()); + mpDrawView->EndUndo(); + } + } + } + } + break; + + default: + break; + } +} + +void DrawViewShell::GetBmpMaskState( SfxItemSet& rSet ) +{ + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const SdrObject* pObj = nullptr; + bool bEnable = false; + + if ( rMarkList.GetMarkCount() == 1 ) + pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + // valid graphic object? + if( auto pGrafObj = dynamic_cast< const SdrGrafObj *>( pObj ) ) + if (!pGrafObj->IsEPS() && !mpDrawView->IsTextEdit() ) + bEnable = true; + + // put value + rSet.Put( SfxBoolItem( SID_BMPMASK_EXEC, bEnable ) ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx new file mode 100644 index 0000000000..845bc956ed --- /dev/null +++ b/sd/source/ui/view/drviews7.cxx @@ -0,0 +1,1974 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// #UndoRedo# +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +/** Create a list of clipboard formats that are supported both from the + current clipboard content and the DrawViewShell. + The list is stored in a new instance of SvxClipboardFormatItem. +*/ +static ::std::unique_ptr GetSupportedClipboardFormats ( + TransferableDataHelper& rDataHelper) +{ + ::std::unique_ptr pResult ( + new SvxClipboardFormatItem(SID_CLIPBOARD_FORMAT_ITEMS)); + + sal_uInt32 nFormatCount (rDataHelper.GetFormatCount()); + for (sal_uInt32 i=0; iAddClipbrdFormat(nTestFormat, sName); + else + pResult->AddClipbrdFormat(nTestFormat); + + break; + } + + + case SotClipboardFormatId::LINK_SOURCE: + case SotClipboardFormatId::DRAWING: + case SotClipboardFormatId::SVXB: + case SotClipboardFormatId::GDIMETAFILE: + case SotClipboardFormatId::BITMAP: + case SotClipboardFormatId::NETSCAPE_BOOKMARK: + case SotClipboardFormatId::STRING: + case SotClipboardFormatId::HTML: + case SotClipboardFormatId::HTML_SIMPLE: + case SotClipboardFormatId::RTF: + case SotClipboardFormatId::RICHTEXT: + case SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT: + pResult->AddClipbrdFormat(nTestFormat); + break; + default: break; + } + } + } + + // Check some OLE formats whose names are handled differently. + SotClipboardFormatId nFormat (SotClipboardFormatId::EMBED_SOURCE_OLE); + bool bHasFormat (rDataHelper.HasFormat(nFormat)); + if ( ! bHasFormat) + { + bHasFormat = rDataHelper.HasFormat(nFormat); + } + if (bHasFormat) + { + OUString sName; + OUString sSource; + if (SvPasteObjectHelper::GetEmbeddedName (rDataHelper, sName, sSource, nFormat)) + pResult->AddClipbrdFormat (nFormat, sName); + } + + return pResult; +} + +namespace sd { + +IMPL_LINK( DrawViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void ) +{ + mbPastePossible = ( pDataHelper->GetFormatCount() != 0 ); + + // Update the list of supported clipboard formats according to the + // new clipboard content. + // There are some stack traces that indicate the possibility of the + // DrawViewShell destructor called during the call to + // GetSupportedClipboardFormats(). If that really has happened then + // exit immediately. + TransferableDataHelper aDataHelper ( + TransferableDataHelper::CreateFromSystemClipboard(GetActiveWindow())); + ::std::unique_ptr pFormats (GetSupportedClipboardFormats(aDataHelper)); + if (mpDrawView == nullptr) + return; + mpCurrentClipboardFormats = std::move(pFormats); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_PASTE ); + rBindings.Invalidate( SID_PASTE_SPECIAL ); + rBindings.Invalidate( SID_PASTE_UNFORMATTED ); + rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS ); +} + +void DrawViewShell::GetDrawAttrState(SfxItemSet& rSet) +{ + SfxItemSet aSet( mpDrawView->GetGeoAttrFromMarked() ); + rSet.Put(aSet,false); +} + +::Outliner* DrawViewShell::GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel) +{ + if( !mpDrawView ) + return nullptr; + + //when there is one object selected + if (!mpDrawView->AreObjectsMarked() || (mpDrawView->GetMarkedObjectList().GetMarkCount() != 1)) + return nullptr; + + //and we are editing the outline object + if (!mpDrawView->IsTextEdit()) + return nullptr; + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + if (!pPageView) + return nullptr; + + SdPage* pPage = static_cast(pPageView->GetPage()); + //only show these in a normal master page + if (!pPage || (pPage->GetPageKind() != PageKind::Standard) || !pPage->IsMasterPage()) + return nullptr; + + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + ::Outliner* pOL = pOLV ? pOLV->GetOutliner() : nullptr; + if (!pOL) + return nullptr; + rSel = pOLV->GetSelection(); + + return pOL; +} + +void DrawViewShell::GetMarginProperties( SfxItemSet &rSet ) +{ + SdPage *pPage = getCurrentPage(); + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + while ( nWhich ) + { + switch ( nWhich ) + { + case SID_ATTR_PAGE_LRSPACE: + { + // const SvxLRSpaceItem aTmpPageLRSpace ( rDesc.GetMaster().GetLRSpace() ); + const SvxLongLRSpaceItem aLongLR( + static_cast<::tools::Long>(pPage->GetLeftBorder()), + static_cast<::tools::Long>(pPage->GetRightBorder()), + SID_ATTR_PAGE_LRSPACE ); + rSet.Put( aLongLR ); + } + break; + + case SID_ATTR_PAGE_ULSPACE: + { + // const SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() ); + SvxLongULSpaceItem aLongUL( + static_cast<::tools::Long>(pPage->GetUpperBorder()), + static_cast<::tools::Long>(pPage->GetLowerBorder()), + SID_ATTR_PAGE_ULSPACE ); + rSet.Put( aLongUL ); + } + break; + + default: + break; + } + nWhich = aIter.NextWhich(); + } +} + +bool DrawViewShell::ShouldDisableEditHyperlink() const +{ + if (!mpDrawView) + return true; + if (!mpDrawView->AreObjectsMarked()) + return true; + if (mpDrawView->GetMarkedObjectList().GetMarkCount() != 1) + return true; + + bool bDisableEditHyperlink = true; + if( mpDrawView->IsTextEdit() ) + { + if (URLFieldHelper::IsCursorAtURLField(mpDrawView->GetTextEditOutlinerView(), + /*AlsoCheckBeforeCursor=*/true)) + bDisableEditHyperlink = false; + } + else + { + SdrUnoObj* pUnoCtrl = dynamic_cast( mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj() ); + + if ( pUnoCtrl && SdrInventor::FmForm == pUnoCtrl->GetObjInventor() ) + { + const uno::Reference< awt::XControlModel >& xControlModel( pUnoCtrl->GetUnoControlModel() ); + if( xControlModel.is() ) + { + uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY ); + if( xPropSet.is() ) + { + uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo() ); + if( xPropInfo.is() && xPropInfo->hasPropertyByName( "TargetURL") ) + { + bDisableEditHyperlink = false; + } + } + } + } + } + return bDisableEditHyperlink; +} + +void DrawViewShell::GetMenuState( SfxItemSet &rSet ) +{ + if (mpDrawView == nullptr) + { + // This assertion and return are here to prevent crashes. + DBG_ASSERT(mpDrawView!=nullptr, "Please report this assertion to the Impress team."); + return; + } + + ViewShell::GetMenuState(rSet); + bool bDisableVerticalText = !SvtCJKOptions::IsVerticalTextEnabled(); + + if ( bDisableVerticalText ) + { + rSet.DisableItem( SID_DRAW_FONTWORK_VERTICAL ); + rSet.DisableItem( SID_DRAW_CAPTION_VERTICAL ); + rSet.DisableItem( SID_TEXT_FITTOSIZE_VERTICAL ); + rSet.DisableItem( SID_DRAW_TEXT_VERTICAL ); + } + + bool bConvertToPathPossible = mpDrawView->IsConvertToPathObjPossible(); + + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nMarkCount = rMarkList.GetMarkCount(); + + if( nMarkCount == 1 ) + { + bool bDisable = true; + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( auto pGrafObj = dynamic_cast( pObj) ) + if( pGrafObj->getQrCode() ) + bDisable = false; + if(bDisable) + { + rSet.DisableItem(SID_EDIT_QRCODE); + } + } + + //format paintbrush + FuFormatPaintBrush::GetMenuState( *this, rSet ); + + // State of SfxChild-Windows (Animator, Fontwork etc.) + SetChildWindowState( rSet ); + + if(HasCurrentFunction()) + { + sal_uInt16 nSId = GetCurrentFunction()->GetSlotID(); + rSet.Put( SfxBoolItem( nSId, true ) ); + } + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + GetMenuStateSel(rSet); + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_ASSIGN_LAYOUT)) + { + bool bDisable = true; + if( pPageView ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() ); + + if( pPage && !pPage->IsMasterPage() ) + { + rSet.Put( SfxUInt32Item( SID_ASSIGN_LAYOUT, static_cast< sal_uInt32 >(pPage->GetAutoLayout()) ) ); + bDisable = false; + } + } + + if(bDisable) + { + rSet.DisableItem(SID_ASSIGN_LAYOUT); + } + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE)) + { + bool bDisable = true; + if( pPageView ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() ); + + if( pPage && (pPage->GetPageKind() == PageKind::Standard) && !pPage->IsMasterPage() ) + { + SdrObject* pObj = pPage->GetPresObj(PresObjKind::Outline); + + if (pObj!=nullptr ) + { + if( !pObj->IsEmptyPresObj() ) + { + bDisable = false; + } + else + { + // check if the object is in edit, then if it's temporarily not empty + SdrTextObj* pTextObj = DynCastSdrTextObj( pObj ); + if( pTextObj ) + { + if( pTextObj->CanCreateEditOutlinerParaObject() ) + { + bDisable = false; + } + } + } + } + } + } + + if(bDisable) + { + rSet.DisableItem(SID_EXPAND_PAGE); + } + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE)) + { + bool bDisable = true; + if( pPageView ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() ); + + if( pPage && (pPage->GetPageKind() == PageKind::Standard) && !pPage->IsMasterPage() ) + { + SdrObject* pObj = pPage->GetPresObj(PresObjKind::Title); + + if(pObj && !pObj->IsEmptyPresObj()) + { + bDisable = false; + } + } + } + + if(bDisable) + { + rSet.DisableItem(SID_SUMMARY_PAGE); + } + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_ASSIGN_LAYOUT)) + { + bool bDisable = true; + if( pPageView ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() ); + + if( pPage && !pPage->IsMasterPage() ) + { + rSet.Put( SfxUInt32Item(SID_ASSIGN_LAYOUT, pPage->GetAutoLayout()) ); + bDisable = false; + } + } + + if(bDisable) + { + rSet.DisableItem(SID_ASSIGN_LAYOUT); + } + } + + // is it possible to start the presentation? + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_REHEARSE_TIMINGS ) ) + { + bool bDisable = true; + sal_uInt16 nCount = GetDoc()->GetSdPageCount( PageKind::Standard ); + + for( sal_uInt16 i = 0; i < nCount && bDisable; i++ ) + { + SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard); + + if( !pPage->IsExcluded() ) + bDisable = false; + } + + if( bDisable || GetDocSh()->IsPreview()) + { + rSet.DisableItem( SID_PRESENTATION ); + rSet.DisableItem( SID_REHEARSE_TIMINGS ); + } + } + + // gluepoints + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_EDITMODE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_INSERT_POINT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_PERCENT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_LEFT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_RIGHT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_TOP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_BOTTOM ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_CENTER ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_LEFT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_RIGHT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_CENTER ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_TOP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_BOTTOM ) ) + { + // percent + TriState eState = mpDrawView->IsMarkedGluePointsPercent(); + if( eState == TRISTATE_INDET ) + rSet.InvalidateItem( SID_GLUE_PERCENT ); + else + rSet.Put( SfxBoolItem( SID_GLUE_PERCENT, eState == TRISTATE_TRUE ) ); + + // alignment has no effect by percent + if( eState == TRISTATE_TRUE ) + { + rSet.DisableItem( SID_GLUE_HORZALIGN_CENTER ); + rSet.DisableItem( SID_GLUE_HORZALIGN_LEFT ); + rSet.DisableItem( SID_GLUE_HORZALIGN_RIGHT ); + rSet.DisableItem( SID_GLUE_VERTALIGN_CENTER ); + rSet.DisableItem( SID_GLUE_VERTALIGN_TOP ); + rSet.DisableItem( SID_GLUE_VERTALIGN_BOTTOM ); + } + else + { + // horizontal alignment + SdrAlign nHorz = mpDrawView->GetMarkedGluePointsAlign( false ); + rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_CENTER, nHorz == SdrAlign::HORZ_CENTER ) ); + rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_LEFT, nHorz == SdrAlign::HORZ_LEFT ) ); + rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_RIGHT, nHorz == SdrAlign::HORZ_RIGHT ) ); + // vertical alignment + SdrAlign nVert = mpDrawView->GetMarkedGluePointsAlign( true ); + rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_CENTER, nVert == SdrAlign::VERT_CENTER ) ); + rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_TOP, nVert == SdrAlign::VERT_TOP ) ); + rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_BOTTOM, nVert == SdrAlign::VERT_BOTTOM ) ); + } + + // insert point + rSet.Put( SfxBoolItem( SID_GLUE_INSERT_POINT, mpDrawView->IsInsGluePointMode() ) ); + + // Escape direction + // left + eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::LEFT ); + if( eState == TRISTATE_INDET ) + rSet.InvalidateItem( SID_GLUE_ESCDIR_LEFT ); + else + rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_LEFT, eState == TRISTATE_TRUE ) ); + // right + eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT ); + if( eState == TRISTATE_INDET ) + rSet.InvalidateItem( SID_GLUE_ESCDIR_RIGHT ); + else + rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_RIGHT, eState == TRISTATE_TRUE ) ); + // top + eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::TOP ); + if( eState == TRISTATE_INDET ) + rSet.InvalidateItem( SID_GLUE_ESCDIR_TOP ); + else + rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_TOP, eState == TRISTATE_TRUE ) ); + // bottom + eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM ); + if( eState == TRISTATE_INDET ) + rSet.InvalidateItem( SID_GLUE_ESCDIR_BOTTOM ); + else + rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_BOTTOM, eState == TRISTATE_TRUE ) ); + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_GRID_FRONT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_HELPLINES_FRONT ) ) + { + rSet.Put( SfxBoolItem( SID_GRID_FRONT, mpDrawView->IsGridFront() ) ); + rSet.Put( SfxBoolItem( SID_HELPLINES_FRONT, mpDrawView->IsHlplFront() ) ); + } + + if (!mpDrawView->IsFrameDragSingles()) + rSet.Put(SfxBoolItem(SID_BEZIER_EDIT, true)); + else + rSet.Put(SfxBoolItem(SID_BEZIER_EDIT, false)); + + if(dynamic_cast( GetCurrentFunction().get())) + rSet.Put(SfxBoolItem(SID_GLUE_EDITMODE, true)); + else + rSet.Put(SfxBoolItem(SID_GLUE_EDITMODE, false)); + + if( !mpDrawView->IsMirrorAllowed( true, true ) ) + { + rSet.DisableItem( SID_HORIZONTAL ); + rSet.DisableItem( SID_VERTICAL ); + rSet.DisableItem( SID_FLIP_HORIZONTAL ); + rSet.DisableItem( SID_FLIP_VERTICAL ); + } + + if( !mpDrawView->IsMirrorAllowed() ) + { + rSet.DisableItem( SID_OBJECT_MIRROR ); +// rSet.DisableItem( SID_CONVERT_TO_3D_LATHE ); +// rSet.DisableItem( SID_CONVERT_TO_3D_LATHE_FAST ); + } + + // interactive transparence control + if(!mpDrawView->IsTransparenceAllowed()) + { + rSet.DisableItem( SID_OBJECT_TRANSPARENCE ); + } + + // interactive gradient control + if(!mpDrawView->IsGradientAllowed()) + { + rSet.DisableItem( SID_OBJECT_GRADIENT ); + } + + // disable morphing if necessary + if ( !mpDrawView->IsMorphingAllowed() ) + rSet.DisableItem( SID_POLYGON_MORPHING ); + + if( !mpDrawView->IsReverseOrderPossible() ) + { + rSet.DisableItem( SID_REVERSE_ORDER ); + } + + if ( !bConvertToPathPossible && + !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) ) + { + // implicit transformation into curve not possible + rSet.DisableItem(SID_OBJECT_CROOK_ROTATE); + rSet.DisableItem(SID_OBJECT_CROOK_SLANT); + rSet.DisableItem(SID_OBJECT_CROOK_STRETCH); + } + + if ( !mpDrawView->IsGroupEntered() ) + { + rSet.DisableItem( SID_LEAVE_GROUP ); + rSet.Put( SfxBoolItem( SID_LEAVE_ALL_GROUPS, false ) ); + rSet.ClearItem( SID_LEAVE_ALL_GROUPS ); + rSet.DisableItem( SID_LEAVE_ALL_GROUPS ); + } + else + rSet.Put( SfxBoolItem( SID_LEAVE_ALL_GROUPS, true ) ); + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_THESAURUS ) ) + { + if ( !mpDrawView->IsTextEdit() ) + { + rSet.DisableItem( SID_THESAURUS ); + } + else + { + LanguageType eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE ); + Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() ); + + if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale( LanguageTag::convertToLocale( eLang)) ) + rSet.DisableItem( SID_THESAURUS ); + } + } + + if ( !mpDrawView->IsTextEdit() ) + { + rSet.DisableItem( SID_THESAURUS ); + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SELECTALL ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_SIZE_ALL ) ) + { + if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 ) + { + // should be disabled if there is no object on the draw area: + rSet.DisableItem( SID_SELECTALL ); + rSet.DisableItem( SID_SIZE_ALL ); + } + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CONTEXT ) ) + rSet.Put( SfxStringItem( SID_CONTEXT, mpDrawView->GetStatusText() ) ); + + // clipboard (paste) + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE_SPECIAL ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE_UNFORMATTED ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) ) + { + if ( !mxClipEvtLstnr.is() ) + { + // avoid clipboard initialization for + // read-only presentation views (workaround for NT4.0 + // clipboard prob...) + if( dynamic_cast< const PresentationViewShell *>( this ) == nullptr ) + { + // create listener + mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, DrawViewShell, ClipboardChanged ) ); + mxClipEvtLstnr->AddListener( GetActiveWindow() ); + + // get initial state + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) ); + mbPastePossible = ( aDataHelper.GetFormatCount() != 0 ); + mpCurrentClipboardFormats = GetSupportedClipboardFormats( aDataHelper ); + } + else + mbPastePossible = false; + } + + if( !mbPastePossible ) + { + rSet.DisableItem( SID_PASTE ); + rSet.DisableItem( SID_PASTE_SPECIAL ); + rSet.DisableItem( SID_PASTE_UNFORMATTED ); + rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS ); + } + else if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) ) + { + if (mpCurrentClipboardFormats != nullptr) + rSet.Put(*mpCurrentClipboardFormats); + } + } + + if ( !bConvertToPathPossible ) + { + rSet.DisableItem(SID_CHANGEBEZIER); + } + + if (mpDrawView == nullptr) + { + // The mpDrawView was not NULL but is now. + // The reason for this may be that the DrawViewShell has been + // destroyed in the meantime. + // We can only return immediately and hope that the deleted + // DrawViewShell is not called again. + DBG_ASSERT(mpDrawView!=nullptr, "Please report this assertion to the Impress team."); + return; + } + + if( !( mpDrawView->IsConvertToPolyObjPossible() || mpDrawView->IsVectorizeAllowed() ) ) + rSet.DisableItem(SID_CHANGEPOLYGON); + + if( !( mpDrawView->IsConvertToPolyObjPossible() || mpDrawView->IsConvertToContourPossible() ) ) + rSet.DisableItem(SID_CONVERT_TO_CONTOUR); + + if ( !mpDrawView->IsConvertTo3DObjPossible() ) + { + rSet.DisableItem(SID_CONVERT_TO_3D); + rSet.DisableItem(SID_CONVERT_TO_3D_LATHE); + rSet.DisableItem(SID_CONVERT_TO_3D_LATHE_FAST); + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MANAGE_LINKS ) ) + { + if ( GetDoc()->GetLinkCount() == 0 ) + { + rSet.DisableItem(SID_MANAGE_LINKS); + } + } + + if (mePageKind == PageKind::Handout) + { + rSet.DisableItem(SID_PRESENTATION_LAYOUT); + rSet.DisableItem(SID_SELECT_BACKGROUND); + rSet.DisableItem(SID_SAVE_BACKGROUND); + } + + if (mePageKind == PageKind::Notes) + { + rSet.DisableItem(SID_INSERTPAGE); + rSet.DisableItem(SID_RENAMEPAGE); + rSet.DisableItem(SID_RENAMEPAGE_QUICK); + rSet.DisableItem(SID_DUPLICATE_PAGE); + rSet.ClearItem(SID_ANIMATION_OBJECTS); + rSet.DisableItem(SID_ANIMATION_OBJECTS); + rSet.DisableItem(SID_ANIMATION_EFFECTS); + rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT); + + if (meEditMode == EditMode::MasterPage) + rSet.DisableItem(SID_MODIFYPAGE); + + rSet.DisableItem(SID_SELECT_BACKGROUND); + rSet.DisableItem(SID_SAVE_BACKGROUND); + rSet.DisableItem(SID_INSERTLAYER); + rSet.DisableItem(SID_LAYERMODE); + rSet.DisableItem(SID_INSERTFILE); + } + else if (mePageKind == PageKind::Handout) + { + rSet.DisableItem(SID_INSERTPAGE); + rSet.DisableItem(SID_DUPLICATE_PAGE); + rSet.ClearItem(SID_ANIMATION_OBJECTS); + rSet.DisableItem(SID_ANIMATION_OBJECTS); + rSet.DisableItem(SID_ANIMATION_EFFECTS); + rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT); + rSet.DisableItem(SID_RENAMEPAGE); + rSet.DisableItem(SID_RENAMEPAGE_QUICK); + rSet.DisableItem(SID_INSERTLAYER); + rSet.DisableItem(SID_MODIFYLAYER); + rSet.DisableItem(SID_TOGGLELAYERVISIBILITY); + rSet.DisableItem(SID_RENAMELAYER); + rSet.DisableItem(SID_LAYERMODE); + rSet.DisableItem(SID_INSERTFILE); + rSet.DisableItem(SID_PAGEMODE); + rSet.DisableItem(SID_SELECT_BACKGROUND); + rSet.DisableItem(SID_SAVE_BACKGROUND); + } + else + { + if (meEditMode == EditMode::MasterPage) + { + rSet.DisableItem(SID_INSERTPAGE); + rSet.DisableItem(SID_DUPLICATE_PAGE); + rSet.DisableItem(SID_MODIFYPAGE); + rSet.ClearItem(SID_ANIMATION_OBJECTS); + rSet.DisableItem(SID_ANIMATION_OBJECTS); + } + + rSet.Put (SfxBoolItem (SID_LAYERMODE, IsLayerModeActive())); + } + + if ( ! IsLayerModeActive()) + { + rSet.DisableItem( SID_INSERTLAYER ); + rSet.DisableItem( SID_MODIFYLAYER ); + rSet.DisableItem( SID_TOGGLELAYERVISIBILITY ); + rSet.DisableItem( SID_DELETE_LAYER ); + rSet.DisableItem( SID_RENAMELAYER ); + } + + if (meEditMode == EditMode::Page) + { + /********************************************************************** + * page mode + **********************************************************************/ + rSet.Put(SfxBoolItem(SID_PAGEMODE, true)); + rSet.Put(SfxBoolItem(SID_MASTERPAGE, false)); + rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false)); + + rSet.DisableItem (SID_INSERT_MASTER_PAGE); + rSet.DisableItem (SID_DELETE_MASTER_PAGE); + rSet.DisableItem (SID_RENAME_MASTER_PAGE); + rSet.DisableItem (SID_CLOSE_MASTER_VIEW); + } + else + { + rSet.Put(SfxBoolItem(SID_PAGEMODE, false)); + rSet.Put(SfxBoolItem(SID_MASTERPAGE, true)); + + /********************************************************************** + * Background page mode + **********************************************************************/ + if (mePageKind == PageKind::Standard) + { + rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, true)); + rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false)); + + } + else if (mePageKind == PageKind::Notes) + { + rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, true)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false)); + } + else if (mePageKind == PageKind::Handout) + { + rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, true)); + } + } + + // set state of the ruler + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_RULER ) ) + rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) ); + + // do not delete the last page or a master page + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_PAGE ) + || SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_MASTER_PAGE ) ) + { + if (maTabControl->GetPageCount() == 1 || + meEditMode == EditMode::MasterPage || + mePageKind == PageKind::Notes || + mePageKind == PageKind::Handout || + (GetShellType()!=ST_DRAW&&IsLayerModeActive())) + { + if (rSet.GetItemState(SID_DELETE_PAGE) == SfxItemState::DEFAULT) + rSet.DisableItem(SID_DELETE_PAGE); + if (rSet.GetItemState(SID_DELETE_MASTER_PAGE)==SfxItemState::DEFAULT) + rSet.DisableItem(SID_DELETE_MASTER_PAGE); + } + } + + // is it allowed to delete the current layer? + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_LAYER ) + || SfxItemState::DEFAULT == rSet.GetItemState( SID_RENAMELAYER ) ) + { + if(GetLayerTabControl()) // #i87182# + { + sal_uInt16 nCurrentLayer = GetLayerTabControl()->GetCurPageId(); + const OUString& rName = GetLayerTabControl()->GetLayerName(nCurrentLayer); + + if (!IsLayerModeActive() || LayerTabBar::IsRealNameOfStandardLayer(rName)) + { + rSet.DisableItem(SID_DELETE_LAYER); + rSet.DisableItem(SID_RENAMELAYER); + } + } + else + { + OSL_ENSURE(false, "No LayerTabBar (!)"); + } + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CUT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_COPY ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTLINE_BULLET )) + { + OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView(); + + // special treatment of for SID_OUTLINE_BULLET if objects with different + // kinds of NumBullets are marked + bool bHasOutliner = false; + bool bHasOther = false; + for(size_t nNum = 0; nNum < nMarkCount; ++nNum) + { + SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj(); + if( pObj->GetObjInventor() == SdrInventor::Default ) + { + if( pObj->GetObjIdentifier() == SdrObjKind::OutlineText ) + { + bHasOutliner = true; + if(bHasOther) + break; + } + else + { + bHasOther = true; + if(bHasOutliner) + break; + } + } + } + + if( bHasOther && bHasOutliner ) + rSet.DisableItem( SID_OUTLINE_BULLET ); + + if (pOlView) + { + if (pOlView->GetSelected().isEmpty() || GetObjectShell()->isContentExtractionLocked()) + { + rSet.DisableItem( SID_CUT ); + rSet.DisableItem( SID_COPY ); + } + } + + } + + FuBullet::GetSlotState( rSet, this, GetViewFrame() ); + + if ( GetDocSh()->IsUIActive() ) + { + rSet.DisableItem( SID_INSERT_OBJECT ); + rSet.DisableItem( SID_INSERT_FLOATINGFRAME ); + rSet.DisableItem( SID_INSERT_MATH ); + rSet.DisableItem( SID_INSERT_DIAGRAM ); + rSet.DisableItem( SID_ATTR_TABLE ); + rSet.DisableItem( SID_SIZE_REAL ); + rSet.DisableItem( SID_SIZE_OPTIMAL ); + rSet.DisableItem( SID_SIZE_ALL ); + rSet.DisableItem( SID_SIZE_PAGE_WIDTH ); + rSet.DisableItem( SID_SIZE_PAGE ); + rSet.DisableItem( SID_DUPLICATE_PAGE ); + rSet.DisableItem( SID_ZOOM_TOOLBOX ); + } + + // Zoom-State + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_IN ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_OUT )|| + SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_PANNING ) ) + { + if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() ) + { + rSet.DisableItem( SID_ZOOM_OUT ); + rSet.DisableItem( SID_ZOOM_PANNING ); + } + if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() ) + rSet.DisableItem( SID_ZOOM_IN ); + } + + if (!mpZoomList->IsNextPossible()) + { + rSet.DisableItem(SID_ZOOM_NEXT); + } + if (!mpZoomList->IsPreviousPossible()) + { + rSet.DisableItem(SID_ZOOM_PREV); + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_REMOTE_DLG ) ) + { + + bool bDisableSdremoteForGood = false; +#ifndef ENABLE_SDREMOTE + bDisableSdremoteForGood = true; +#endif + bDisableSdremoteForGood |= !(officecfg::Office::Impress::Misc::Start::EnableSdremote::get() + && officecfg::Office::Security::Net::AllowInsecureImpressRemoteWiFi::get() + ); + + // This dialog is only useful for TCP/IP remote control + // which is unusual, under-tested and a security issue. + if ( bDisableSdremoteForGood ) + { + rSet.Put(SfxVisibilityItem(SID_REMOTE_DLG, false)); + } + } + + // EditText active + if (GetViewShellBase().GetViewShellManager()->GetShell(ToolbarId::Draw_Text_Toolbox_Sd) != nullptr) + { + sal_uInt16 nCurrentSId = SID_ATTR_CHAR; + + if(HasCurrentFunction()) + { + nCurrentSId = GetCurrentFunction()->GetSlotID(); + } + if( nCurrentSId != SID_TEXT_FITTOSIZE && + nCurrentSId != SID_TEXT_FITTOSIZE_VERTICAL && + nCurrentSId != SID_ATTR_CHAR_VERTICAL ) + nCurrentSId = SID_ATTR_CHAR; + + rSet.Put( SfxBoolItem( nCurrentSId, true ) ); + } + + if ( GetDocSh()->IsReadOnly() ) + { + rSet.DisableItem( SID_AUTOSPELL_CHECK ); + } + else + { + if (GetDoc()->GetOnlineSpell()) + { + rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, true)); + } + else + { + rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, false)); + } + } + + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + OUString aActiveLayer = mpDrawView->GetActiveLayer(); + + if ( ( !aActiveLayer.isEmpty() && pPV && ( pPV->IsLayerLocked(aActiveLayer) || + !pPV->IsLayerVisible(aActiveLayer) ) ) || + SD_MOD()->GetWaterCan() ) + { + rSet.DisableItem( SID_PASTE ); + rSet.DisableItem( SID_PASTE_SPECIAL ); + rSet.DisableItem( SID_PASTE_UNFORMATTED ); + rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS ); + + rSet.DisableItem( SID_INSERT_FLD_DATE_FIX ); + rSet.DisableItem( SID_INSERT_FLD_DATE_VAR ); + rSet.DisableItem( SID_INSERT_FLD_TIME_FIX ); + rSet.DisableItem( SID_INSERT_FLD_TIME_VAR ); + rSet.DisableItem( SID_INSERT_FLD_AUTHOR ); + rSet.DisableItem( SID_INSERT_FLD_PAGE ); + rSet.DisableItem( SID_INSERT_FLD_PAGE_TITLE ); + rSet.DisableItem( SID_INSERT_FLD_PAGES ); + rSet.DisableItem( SID_INSERT_FLD_FILE ); + + rSet.DisableItem( SID_INSERT_GRAPHIC ); + rSet.DisableItem( SID_INSERT_AVMEDIA ); + rSet.DisableItem( SID_INSERT_DIAGRAM ); + rSet.DisableItem( SID_INSERT_OBJECT ); + rSet.DisableItem( SID_INSERT_FLOATINGFRAME ); + + rSet.DisableItem( SID_INSERT_MATH ); + rSet.DisableItem( SID_INSERT_FRAME ); + rSet.DisableItem( SID_INSERTFILE ); + rSet.DisableItem( SID_ATTR_TABLE ); + rSet.DisableItem( SID_COPYOBJECTS ); + + rSet.DisableItem( SID_SCAN ); + rSet.DisableItem( SID_TWAIN_SELECT ); + rSet.DisableItem( SID_TWAIN_TRANSFER ); + +// rSet.DisableItem( SID_BEZIER_EDIT ); + rSet.DisableItem( SID_GLUE_EDITMODE ); + rSet.DisableItem( SID_OBJECT_ROTATE ); + rSet.DisableItem( SID_OBJECT_SHEAR ); + rSet.DisableItem( SID_OBJECT_MIRROR ); + rSet.DisableItem( SID_OBJECT_CROP ); + rSet.DisableItem( SID_ATTR_GRAF_CROP ); + rSet.DisableItem( SID_OBJECT_TRANSPARENCE ); + rSet.DisableItem( SID_OBJECT_GRADIENT ); + rSet.DisableItem( SID_OBJECT_CROOK_ROTATE ); + rSet.DisableItem( SID_OBJECT_CROOK_SLANT ); + rSet.DisableItem( SID_OBJECT_CROOK_STRETCH ); + + // Disable all object-creating tools + rSet.ClearItem( SID_ATTR_CHAR ); + rSet.DisableItem( SID_ATTR_CHAR ); + rSet.ClearItem( SID_ATTR_CHAR_VERTICAL ); + rSet.DisableItem( SID_ATTR_CHAR_VERTICAL ); + rSet.ClearItem(SID_DRAW_LINE); + rSet.DisableItem(SID_DRAW_LINE); + rSet.ClearItem(SID_DRAW_MEASURELINE); + rSet.DisableItem(SID_DRAW_MEASURELINE); + rSet.ClearItem(SID_DRAW_XLINE); + rSet.DisableItem(SID_DRAW_XLINE); + rSet.ClearItem( SID_LINE_ARROW_START ); + rSet.DisableItem( SID_LINE_ARROW_START ); + rSet.ClearItem( SID_LINE_ARROW_END ); + rSet.DisableItem( SID_LINE_ARROW_END ); + rSet.ClearItem( SID_LINE_ARROWS ); + rSet.DisableItem( SID_LINE_ARROWS ); + rSet.ClearItem( SID_LINE_ARROW_CIRCLE ); + rSet.DisableItem( SID_LINE_ARROW_CIRCLE ); + rSet.ClearItem( SID_LINE_CIRCLE_ARROW ); + rSet.DisableItem( SID_LINE_CIRCLE_ARROW ); + rSet.ClearItem( SID_LINE_ARROW_SQUARE ); + rSet.DisableItem( SID_LINE_ARROW_SQUARE ); + rSet.ClearItem( SID_LINE_SQUARE_ARROW ); + rSet.DisableItem( SID_LINE_SQUARE_ARROW ); + + rSet.ClearItem(SID_DRAW_RECT); + rSet.DisableItem(SID_DRAW_RECT); + rSet.ClearItem(SID_DRAW_RECT_NOFILL); + rSet.DisableItem(SID_DRAW_RECT_NOFILL); + rSet.ClearItem(SID_DRAW_RECT_ROUND); + rSet.DisableItem(SID_DRAW_RECT_ROUND); + rSet.ClearItem(SID_DRAW_RECT_ROUND_NOFILL); + rSet.DisableItem(SID_DRAW_RECT_ROUND_NOFILL); + rSet.ClearItem(SID_DRAW_SQUARE); + rSet.DisableItem(SID_DRAW_SQUARE); + rSet.ClearItem(SID_DRAW_SQUARE_NOFILL); + rSet.DisableItem(SID_DRAW_SQUARE_NOFILL); + rSet.ClearItem(SID_DRAW_SQUARE_ROUND); + rSet.DisableItem(SID_DRAW_SQUARE_ROUND); + rSet.ClearItem(SID_DRAW_SQUARE_ROUND_NOFILL); + rSet.DisableItem(SID_DRAW_SQUARE_ROUND_NOFILL); + rSet.ClearItem(SID_DRAW_ELLIPSE); + rSet.DisableItem(SID_DRAW_ELLIPSE); + rSet.ClearItem(SID_DRAW_ELLIPSE_NOFILL); + rSet.DisableItem(SID_DRAW_ELLIPSE_NOFILL); + rSet.ClearItem(SID_DRAW_CIRCLE); + rSet.DisableItem(SID_DRAW_CIRCLE); + rSet.ClearItem(SID_DRAW_CIRCLE_NOFILL); + rSet.DisableItem(SID_DRAW_CIRCLE_NOFILL); + rSet.ClearItem(SID_DRAW_CAPTION); + rSet.DisableItem(SID_DRAW_CAPTION); + rSet.ClearItem(SID_DRAW_FONTWORK); + rSet.DisableItem(SID_DRAW_FONTWORK); + rSet.ClearItem(SID_DRAW_FONTWORK_VERTICAL); + rSet.DisableItem(SID_DRAW_FONTWORK_VERTICAL); + rSet.ClearItem(SID_DRAW_CAPTION_VERTICAL); + rSet.DisableItem(SID_DRAW_CAPTION_VERTICAL); + rSet.ClearItem(SID_TEXT_FITTOSIZE); + rSet.DisableItem(SID_TEXT_FITTOSIZE); + rSet.ClearItem(SID_TEXT_FITTOSIZE_VERTICAL); + rSet.DisableItem(SID_TEXT_FITTOSIZE_VERTICAL); + rSet.ClearItem(SID_TOOL_CONNECTOR); + rSet.DisableItem(SID_TOOL_CONNECTOR); + rSet.ClearItem(SID_CONNECTOR_ARROW_START); + rSet.DisableItem(SID_CONNECTOR_ARROW_START); + rSet.ClearItem(SID_CONNECTOR_ARROW_END); + rSet.DisableItem(SID_CONNECTOR_ARROW_END); + rSet.ClearItem(SID_CONNECTOR_ARROWS); + rSet.DisableItem(SID_CONNECTOR_ARROWS); + rSet.ClearItem(SID_CONNECTOR_CIRCLE_START); + rSet.DisableItem(SID_CONNECTOR_CIRCLE_START); + rSet.ClearItem(SID_CONNECTOR_CIRCLE_END); + rSet.DisableItem(SID_CONNECTOR_CIRCLE_END); + rSet.ClearItem(SID_CONNECTOR_CIRCLES); + rSet.DisableItem(SID_CONNECTOR_CIRCLES); + rSet.ClearItem(SID_CONNECTOR_LINE); + rSet.DisableItem(SID_CONNECTOR_LINE); + rSet.ClearItem(SID_CONNECTOR_LINE_ARROW_START); + rSet.DisableItem(SID_CONNECTOR_LINE_ARROW_START); + rSet.ClearItem(SID_CONNECTOR_LINE_ARROW_END); + rSet.DisableItem(SID_CONNECTOR_LINE_ARROW_END); + rSet.ClearItem(SID_CONNECTOR_LINE_ARROWS); + rSet.DisableItem(SID_CONNECTOR_LINE_ARROWS); + rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLE_START); + rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLE_START); + rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLE_END); + rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLE_END); + rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLES); + rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLES); + rSet.ClearItem(SID_CONNECTOR_CURVE); + rSet.DisableItem(SID_CONNECTOR_CURVE); + rSet.ClearItem(SID_CONNECTOR_CURVE_ARROW_START); + rSet.DisableItem(SID_CONNECTOR_CURVE_ARROW_START); + rSet.ClearItem(SID_CONNECTOR_CURVE_ARROW_END); + rSet.DisableItem(SID_CONNECTOR_CURVE_ARROW_END); + rSet.ClearItem(SID_CONNECTOR_CURVE_ARROWS); + rSet.DisableItem(SID_CONNECTOR_CURVE_ARROWS); + rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLE_START); + rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLE_START); + rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLE_END); + rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLE_END); + rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLES); + rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLES); + rSet.ClearItem(SID_CONNECTOR_LINES); + rSet.DisableItem(SID_CONNECTOR_LINES); + rSet.ClearItem(SID_CONNECTOR_LINES_ARROW_START); + rSet.DisableItem(SID_CONNECTOR_LINES_ARROW_START); + rSet.ClearItem(SID_CONNECTOR_LINES_ARROW_END); + rSet.DisableItem(SID_CONNECTOR_LINES_ARROW_END); + rSet.ClearItem(SID_CONNECTOR_LINES_ARROWS); + rSet.DisableItem(SID_CONNECTOR_LINES_ARROWS); + rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLE_START); + rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLE_START); + rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLE_END); + rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLE_END); + rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLES); + rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLES); + rSet.ClearItem(SID_DRAW_ARC); + rSet.DisableItem(SID_DRAW_ARC); + rSet.ClearItem(SID_DRAW_CIRCLEARC); + rSet.DisableItem(SID_DRAW_CIRCLEARC); + rSet.ClearItem(SID_DRAW_PIE); + rSet.DisableItem(SID_DRAW_PIE); + rSet.ClearItem(SID_DRAW_PIE_NOFILL); + rSet.DisableItem(SID_DRAW_PIE_NOFILL); + rSet.ClearItem(SID_DRAW_CIRCLEPIE); + rSet.DisableItem(SID_DRAW_CIRCLEPIE); + rSet.ClearItem(SID_DRAW_CIRCLEPIE_NOFILL); + rSet.DisableItem(SID_DRAW_CIRCLEPIE_NOFILL); + rSet.ClearItem(SID_DRAW_ELLIPSECUT); + rSet.DisableItem(SID_DRAW_ELLIPSECUT); + rSet.ClearItem(SID_DRAW_ELLIPSECUT_NOFILL); + rSet.DisableItem(SID_DRAW_ELLIPSECUT_NOFILL); + rSet.ClearItem(SID_DRAW_CIRCLECUT); + rSet.DisableItem(SID_DRAW_CIRCLECUT); + rSet.ClearItem(SID_DRAW_CIRCLECUT_NOFILL); + rSet.DisableItem(SID_DRAW_CIRCLECUT_NOFILL); + rSet.ClearItem(SID_DRAW_POLYGON); + rSet.DisableItem(SID_DRAW_POLYGON); + rSet.ClearItem(SID_DRAW_POLYGON_NOFILL); + rSet.DisableItem(SID_DRAW_POLYGON_NOFILL); + rSet.ClearItem(SID_DRAW_FREELINE); + rSet.DisableItem(SID_DRAW_FREELINE); + rSet.ClearItem(SID_DRAW_FREELINE_NOFILL); + rSet.DisableItem(SID_DRAW_FREELINE_NOFILL); + rSet.ClearItem(SID_DRAW_XPOLYGON); + rSet.DisableItem(SID_DRAW_XPOLYGON); + rSet.ClearItem(SID_DRAW_XPOLYGON_NOFILL); + rSet.DisableItem(SID_DRAW_XPOLYGON_NOFILL); + rSet.ClearItem(SID_DRAW_BEZIER_FILL); + rSet.DisableItem(SID_DRAW_BEZIER_FILL); + rSet.ClearItem(SID_DRAW_BEZIER_NOFILL); + rSet.DisableItem(SID_DRAW_BEZIER_NOFILL); + rSet.ClearItem(SID_3D_CUBE); + rSet.DisableItem(SID_3D_CUBE); + rSet.ClearItem(SID_3D_SHELL); + rSet.DisableItem(SID_3D_SHELL); + rSet.ClearItem(SID_3D_SPHERE); + rSet.DisableItem(SID_3D_SPHERE); + rSet.ClearItem(SID_3D_HALF_SPHERE); + rSet.DisableItem(SID_3D_HALF_SPHERE); + rSet.ClearItem(SID_3D_CYLINDER); + rSet.DisableItem(SID_3D_CYLINDER); + rSet.ClearItem(SID_3D_CONE); + rSet.DisableItem(SID_3D_CONE); + rSet.ClearItem(SID_3D_TORUS); + rSet.DisableItem(SID_3D_TORUS); + rSet.ClearItem(SID_3D_PYRAMID); + rSet.DisableItem(SID_3D_PYRAMID); + } + + if ( !aActiveLayer.isEmpty() && pPV ) + rSet.Put( SfxBoolItem(SID_TOGGLELAYERVISIBILITY, !pPageView->IsLayerVisible(aActiveLayer)) ); + + // are the modules available? + + if (!SvtModuleOptions().IsCalc()) + { + // remove menu entry if module is not available + rSet.Put( SfxVisibilityItem( SID_ATTR_TABLE, false ) ); + } + if (!SvtModuleOptions().IsChart()) + { + rSet.DisableItem( SID_INSERT_DIAGRAM ); + } + if (!SvtModuleOptions().IsMath()) + { + rSet.DisableItem( SID_INSERT_MATH ); + } + + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if( (xSlideshow.is() && xSlideshow->isRunning() && (xSlideshow->getAnimationMode() != ANIMATIONMODE_PREVIEW) ) || GetDocSh()->IsPreview() ) + { + // Own Slots + rSet.DisableItem( SID_PRESENTATION ); + rSet.DisableItem( SID_ZOOM_IN ); + rSet.DisableItem( SID_ZOOM_OUT ); + rSet.DisableItem( SID_ZOOM_PANNING ); + rSet.DisableItem( SID_ZOOM_MODE ); + rSet.DisableItem( SID_ZOOM_NEXT ); + rSet.DisableItem( SID_ZOOM_PREV ); + rSet.DisableItem( SID_SIZE_REAL ); + rSet.DisableItem( SID_SIZE_OPTIMAL ); + rSet.DisableItem( SID_SIZE_ALL ); + rSet.DisableItem( SID_SIZE_PAGE_WIDTH ); + rSet.DisableItem( SID_SIZE_PAGE ); + rSet.DisableItem( SID_INSERTPAGE ); + rSet.DisableItem( SID_DUPLICATE_PAGE ); + rSet.DisableItem( SID_MODIFYPAGE ); + rSet.DisableItem( SID_RENAMEPAGE ); + rSet.DisableItem( SID_RENAMEPAGE_QUICK ); + rSet.DisableItem( SID_DELETE_PAGE ); + rSet.DisableItem( SID_PAGESETUP ); + + if( xSlideshow.is() && xSlideshow->isRunning() ) + { + rSet.ClearItem(SID_INSERTFILE); + rSet.ClearItem(SID_OBJECT_ROTATE); + rSet.ClearItem(SID_FM_CONFIG); + rSet.ClearItem(SID_ANIMATION_EFFECTS); + rSet.ClearItem(SID_EXECUTE_ANIMATION_EFFECT); + rSet.ClearItem(SID_ANIMATION_OBJECTS); + rSet.ClearItem(SID_3D_WIN); + + rSet.DisableItem(SID_OBJECT_ALIGN); + rSet.DisableItem(SID_ZOOM_TOOLBOX); + rSet.DisableItem(SID_OBJECT_CHOOSE_MODE); + rSet.DisableItem(SID_DRAWTBX_TEXT); + rSet.DisableItem(SID_DRAWTBX_RECTANGLES); + rSet.DisableItem(SID_DRAWTBX_ELLIPSES); + rSet.DisableItem(SID_DRAWTBX_LINES); + rSet.DisableItem(SID_DRAWTBX_ARROWS); + rSet.DisableItem(SID_DRAWTBX_3D_OBJECTS); + rSet.DisableItem(SID_DRAWTBX_CONNECTORS); + rSet.DisableItem(SID_OBJECT_CHOOSE_MODE ); + rSet.DisableItem(SID_DRAWTBX_INSERT); + rSet.DisableItem(SID_INSERTFILE); + rSet.DisableItem(SID_OBJECT_ROTATE); + rSet.DisableItem(SID_POSITION); + rSet.DisableItem(SID_FM_CONFIG); + rSet.DisableItem(SID_ANIMATION_EFFECTS); + rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT); + rSet.DisableItem(SID_ANIMATION_OBJECTS); + rSet.DisableItem(SID_3D_WIN); + } + } + + // Menuoption: Change->Convert->To Bitmap, Change->Convert->To Metafile + // disable, if there only Bitmap or Metafiles marked + // Menuoption: Format->Area, Format->Line + // disabled, if the marked objects not able to handle + // these attributes + + bool bSingleGraphicSelected = false; + + if (!mpDrawView->AreObjectsMarked()) + { + rSet.DisableItem (SID_CONVERT_TO_METAFILE); + rSet.DisableItem (SID_CONVERT_TO_BITMAP); + } + else + { + // get marklist + SdrMarkList aMarkList = mpDrawView->GetMarkedObjectList(); + + bool bFoundBitmap = false; + bool bFoundMetafile = false; + bool bFoundObjNoArea = false; + bool bFoundNoGraphicObj = false; + bool bFoundAny = false; + bool bFoundTable = false; + +// const size_t nMarkCount = aMarkList.GetMarkCount(); + for (size_t i=0; i < nMarkCount && !bFoundAny; ++i) + { + SdrObject* pObj = aMarkList.GetMark(i)->GetMarkedSdrObj(); + SdrObjKind nId = pObj->GetObjIdentifier(); + SdrInventor nInv = pObj->GetObjInventor(); + + if(nInv == SdrInventor::Default) + { + // 2D objects + switch( nId ) + { + case SdrObjKind::PathLine : + case SdrObjKind::PolyLine : + case SdrObjKind::Line: + case SdrObjKind::FreehandLine : + case SdrObjKind::Edge: + case SdrObjKind::CircleArc : + bFoundObjNoArea = true; + bFoundNoGraphicObj = true; + break; + case SdrObjKind::OLE2 : + // #i118485# #i118525# Allow Line, Area and Graphic (Metafile, Bitmap) + bSingleGraphicSelected = nMarkCount == 1; + bFoundBitmap = true; + bFoundMetafile = true; + break; + case SdrObjKind::Graphic : + { + bSingleGraphicSelected = nMarkCount == 1; + const SdrGrafObj* pSdrGrafObj = static_cast< const SdrGrafObj* >(pObj); + + // Current size of the OBJ_GRAF + const ::tools::Rectangle aRect = pObj->GetLogicRect(); + const Size aCurrentSizeofObj = aRect.GetSize(); + + // Original size of the OBJ_GRAF + const Size aOriginalSizeofObj = pSdrGrafObj->getOriginalSize(); + + if(aCurrentSizeofObj == aOriginalSizeofObj ) + rSet.DisableItem(SID_ORIGINAL_SIZE); + + switch(pSdrGrafObj->GetGraphicType()) + { + case GraphicType::Bitmap : + bFoundBitmap = true; + if(pSdrGrafObj->isEmbeddedVectorGraphicData()) + { + bFoundMetafile = true; + } + break; + case GraphicType::GdiMetafile : + bFoundMetafile = true; + break; + default: + break; + } + break; + } + case SdrObjKind::Table: + bFoundTable = true; + break; + default : + bFoundAny = true; + } + } + else if(nInv == SdrInventor::E3d) + { + // 3D objects + bFoundAny = true; + } + } + + if( bFoundTable ) + rSet.DisableItem( SID_ATTRIBUTES_LINE ); + + if (!bFoundAny) + { + // Disable menuitem for area-dialog + if( bFoundObjNoArea ) // #i25616# + rSet.DisableItem( SID_ATTRIBUTES_AREA ); + + if( bFoundBitmap && !bFoundMetafile && !bFoundNoGraphicObj ) // only Bitmaps marked + rSet.DisableItem( SID_CONVERT_TO_BITMAP ); + else if( !bFoundBitmap && bFoundMetafile && !bFoundNoGraphicObj ) // only Metafiles marked + rSet.DisableItem( SID_CONVERT_TO_METAFILE ); + else if( !bFoundBitmap && !bFoundMetafile && !bFoundNoGraphicObj ) // nothing to do + { + rSet.DisableItem( SID_CONVERT_TO_BITMAP ); + rSet.DisableItem( SID_CONVERT_TO_METAFILE ); + } + } + } + + if( !bSingleGraphicSelected ) + { + rSet.DisableItem (SID_OBJECT_CROP); + rSet.DisableItem (SID_ATTR_GRAF_CROP); + } + + // Menuoption: Edit->Hyperlink + // Disable, if there is no hyperlink + bool bDisableEditHyperlink = ShouldDisableEditHyperlink(); + + //highlight selected custom shape + { + if(HasCurrentFunction()) + { + rtl::Reference< FuPoor > xFunc( GetCurrentFunction() ); + FuConstructCustomShape* pShapeFunc = dynamic_cast< FuConstructCustomShape* >( xFunc.get() ); + + static const sal_uInt16 nCSTbArray[] = { SID_DRAWTBX_CS_BASIC, SID_DRAWTBX_CS_SYMBOL, + SID_DRAWTBX_CS_ARROW, SID_DRAWTBX_CS_FLOWCHART, + SID_DRAWTBX_CS_CALLOUT, SID_DRAWTBX_CS_STAR }; + + const sal_uInt16 nCurrentSId = GetCurrentFunction()->GetSlotID(); + for (sal_uInt16 i : nCSTbArray) + { + rSet.ClearItem( i ); // Why is this necessary? + rSet.Put( SfxStringItem( i, nCurrentSId == i && pShapeFunc + ? pShapeFunc->GetShapeType() : OUString() ) ); + } + } + } + + if ( bDisableEditHyperlink || GetDocSh()->IsReadOnly() ) + rSet.DisableItem( SID_EDIT_HYPERLINK ); + + if ( bDisableEditHyperlink ) + { + rSet.DisableItem( SID_OPEN_HYPERLINK ); + rSet.DisableItem( SID_COPY_HYPERLINK_LOCATION ); + } + + //fdo#78151 enable show next level/hide last level if editing a master page + //PresObjKind::Outline object and the current selection allow that to happen + { + bool bDisableShowNextLevel = true; + bool bDisableHideLastLevel = true; + + ESelection aSel; + ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel); + if (pOL) + { + //and are on the last paragraph + aSel.Adjust(); + if (aSel.nEndPara == pOL->GetParagraphCount() - 1) + { + sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara); + if (nDepth != sal_uInt16(-1)) + { + //there exists another numbering level that + //is currently hidden + if (nDepth < 8) + bDisableShowNextLevel = false; + //there exists a previous numbering level + if (nDepth > 0) + bDisableHideLastLevel = false; + } + } + } + + if (bDisableShowNextLevel) + rSet.DisableItem(SID_SHOW_NEXT_LEVEL); + + if (bDisableHideLastLevel) + rSet.DisableItem(SID_HIDE_LAST_LEVEL); + } + +#if defined(_WIN32) || defined UNX + if( !mxScannerManager.is() ) + { + rSet.DisableItem( SID_TWAIN_SELECT ); + rSet.DisableItem( SID_TWAIN_TRANSFER ); + } +#endif + + // Set the state of two entries in the 'Slide' context sub-menu + // concerning the visibility of master page background and master page + // shapes. + if (rSet.GetItemState(SID_DISPLAY_MASTER_BACKGROUND) == SfxItemState::DEFAULT + || rSet.GetItemState(SID_DISPLAY_MASTER_OBJECTS) == SfxItemState::DEFAULT) + { + SdPage* pPage = GetActualPage(); + if (pPage != nullptr && GetDoc() != nullptr) + { + SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); + SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin(); + SdrLayerID aBackgroundId = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aObjectId = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + rSet.Put(SfxBoolItem(SID_DISPLAY_MASTER_BACKGROUND, + aVisibleLayers.IsSet(aBackgroundId))); + rSet.Put(SfxBoolItem(SID_DISPLAY_MASTER_OBJECTS, + aVisibleLayers.IsSet(aObjectId))); + } + } + + if (rSet.GetItemState(SID_SAVE_BACKGROUND) == SfxItemState::DEFAULT) + { + bool bDisableSaveBackground = true; + SdPage* pPage = GetActualPage(); + if (pPage != nullptr && GetDoc() != nullptr) + { + SfxItemSetFixed aMergedAttr(GetDoc()->GetPool()); + SdStyleSheet* pStyleSheet = pPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND); + MergePageBackgroundFilling(pPage, pStyleSheet, meEditMode == EditMode::MasterPage, aMergedAttr); + if (drawing::FillStyle_BITMAP == aMergedAttr.Get(XATTR_FILLSTYLE).GetValue()) + { + bDisableSaveBackground = false; + } + } + if (bDisableSaveBackground) + rSet.DisableItem(SID_SAVE_BACKGROUND); + } + + if (GetObjectShell()->isExportLocked()) + rSet.DisableItem(SID_PRESENTATION_MINIMIZER); + + if (rSet.GetItemState(SID_INSERT_SIGNATURELINE) == SfxItemState::DEFAULT) + { + if (!GetObjectShell()->IsSignPDF()) + { + // Currently SID_INSERT_SIGNATURELINE assumes a PDF that was opened for signing, disable + // it otherwise. + rSet.DisableItem(SID_INSERT_SIGNATURELINE); + } + } + + GetModeSwitchingMenuState (rSet); +} + +void DrawViewShell::GetModeSwitchingMenuState (SfxItemSet &rSet) +{ + //DrawView + rSet.Put(SfxBoolItem(SID_SLIDE_SORTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_OUTLINE_MODE, false)); + rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false)); + if (mePageKind == PageKind::Notes) + { + rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MODE, true)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false)); + } + else if (mePageKind == PageKind::Handout) + { + rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MODE, false)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, true)); + } + else + { + rSet.Put(SfxBoolItem(SID_DRAWINGMODE, true)); + rSet.Put(SfxBoolItem(SID_NOTES_MODE, false)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false)); + } + + // Removed [GetDocSh()->GetCurrentFunction() ||] from the following + // clause because the current function of the docshell can only be + // search and replace or spell checking and in that case switching the + // view mode is allowed. + const bool bIsRunning = SlideShow::IsRunning(GetViewShellBase()); + + if (GetViewFrame()->GetFrame().IsInPlace() || bIsRunning) + { + if ( !GetViewFrame()->GetFrame().IsInPlace() ) + { + rSet.ClearItem( SID_DRAWINGMODE ); + rSet.DisableItem( SID_DRAWINGMODE ); + } + + rSet.ClearItem( SID_NOTES_MODE ); + rSet.DisableItem( SID_NOTES_MODE ); + + rSet.ClearItem( SID_HANDOUT_MASTER_MODE ); + rSet.DisableItem( SID_HANDOUT_MASTER_MODE ); + + rSet.ClearItem( SID_OUTLINE_MODE ); + rSet.DisableItem( SID_OUTLINE_MODE ); + + rSet.ClearItem( SID_SLIDE_MASTER_MODE ); + rSet.DisableItem( SID_SLIDE_MASTER_MODE ); + + rSet.ClearItem( SID_NOTES_MASTER_MODE ); + rSet.DisableItem( SID_NOTES_MASTER_MODE ); + + rSet.ClearItem( SID_SLIDE_SORTER_MODE ); + rSet.DisableItem( SID_SLIDE_SORTER_MODE ); + } + + if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED) + { + // Outplace-Edit: do not allow switch + rSet.ClearItem( SID_OUTLINE_MODE ); + rSet.DisableItem( SID_OUTLINE_MODE ); + + rSet.ClearItem( SID_SLIDE_SORTER_MODE ); + rSet.DisableItem( SID_SLIDE_SORTER_MODE ); + + rSet.ClearItem( SID_NOTES_MODE ); + rSet.DisableItem( SID_NOTES_MODE ); + + rSet.ClearItem( SID_HANDOUT_MASTER_MODE ); + rSet.DisableItem( SID_HANDOUT_MASTER_MODE ); + + rSet.ClearItem( SID_SLIDE_MASTER_MODE ); + rSet.DisableItem( SID_SLIDE_MASTER_MODE ); + + rSet.ClearItem( SID_NOTES_MASTER_MODE ); + rSet.DisableItem( SID_NOTES_MASTER_MODE ); + } + + svx::ExtrusionBar::getState( mpDrawView.get(), rSet ); + svx::FontworkBar::getState( mpDrawView.get(), rSet ); +} + +void DrawViewShell::GetPageProperties( SfxItemSet &rSet ) +{ + SdPage *pPage = getCurrentPage(); + + if (pPage == nullptr || GetDoc() == nullptr) + return; + + SvxPageItem aPageItem(SID_ATTR_PAGE); + aPageItem.SetLandscape( pPage->GetOrientation() == Orientation::Landscape ); + + rSet.Put(SvxSizeItem( SID_ATTR_PAGE_SIZE, pPage->GetSize() )); + rSet.Put(aPageItem); + + const SfxItemSet &rPageAttr = pPage->getSdrPageProperties().GetItemSet(); + const XFillStyleItem* pFillStyle = rPageAttr.GetItem(XATTR_FILLSTYLE); + if (!pFillStyle) + return; + + drawing::FillStyle eXFS = pFillStyle->GetValue(); + XFillStyleItem aFillStyleItem( eXFS ); + aFillStyleItem.SetWhich( SID_ATTR_PAGE_FILLSTYLE ); + rSet.Put(aFillStyleItem); + + switch (eXFS) + { + case drawing::FillStyle_SOLID: + if (const XFillColorItem* pColorItem = rPageAttr.GetItem(XATTR_FILLCOLOR)) + { + Color aColor = pColorItem->GetColorValue(); + XFillColorItem aFillColorItem( OUString(), aColor ); + aFillColorItem.SetWhich( SID_ATTR_PAGE_COLOR ); + rSet.Put( aFillColorItem ); + } + break; + + case drawing::FillStyle_GRADIENT: + { + const XFillGradientItem *pGradient = rPageAttr.GetItem( XATTR_FILLGRADIENT ); + XFillGradientItem aFillGradientItem( pGradient->GetName(), pGradient->GetGradientValue(), SID_ATTR_PAGE_GRADIENT ); + rSet.Put( aFillGradientItem ); + } + break; + + case drawing::FillStyle_HATCH: + { + const XFillHatchItem *pFillHatchItem( rPageAttr.GetItem( XATTR_FILLHATCH ) ); + XFillHatchItem aFillHatchItem( pFillHatchItem->GetName(), pFillHatchItem->GetHatchValue()); + aFillHatchItem.SetWhich( SID_ATTR_PAGE_HATCH ); + rSet.Put( aFillHatchItem ); + } + break; + + case drawing::FillStyle_BITMAP: + { + const XFillBitmapItem *pFillBitmapItem = rPageAttr.GetItem( XATTR_FILLBITMAP ); + XFillBitmapItem aFillBitmapItem( pFillBitmapItem->GetName(), pFillBitmapItem->GetGraphicObject() ); + aFillBitmapItem.SetWhich( SID_ATTR_PAGE_BITMAP ); + rSet.Put( aFillBitmapItem ); + } + break; + + default: + break; + } +} + +void DrawViewShell::SetPageProperties (SfxRequest& rReq) +{ + SdPage *pPage = getCurrentPage(); + if (!pPage) + return; + sal_uInt16 nSlotId = rReq.GetSlot(); + const SfxItemSet *pArgs = rReq.GetArgs(); + if (!pArgs) + return; + + if ( ( nSlotId >= SID_ATTR_PAGE_COLOR ) && ( nSlotId <= SID_ATTR_PAGE_FILLSTYLE ) ) + { + SdrPageProperties& rPageProperties = pPage->getSdrPageProperties(); + const SfxItemSet &aPageItemSet = rPageProperties.GetItemSet(); + SfxItemSet aTempSet = aPageItemSet.CloneAsValue(false, &mpDrawView->GetModel().GetItemPool()); + const SfxPoolItem* pItem = nullptr; + + rPageProperties.ClearItem(XATTR_FILLSTYLE); + rPageProperties.ClearItem(XATTR_FILLGRADIENT); + rPageProperties.ClearItem(XATTR_FILLHATCH); + rPageProperties.ClearItem(XATTR_FILLBITMAP); + + switch (nSlotId) + { + case SID_ATTR_PAGE_FILLSTYLE: + { + XFillStyleItem aFSItem( pArgs->Get( XATTR_FILLSTYLE ) ); + drawing::FillStyle eXFS = aFSItem.GetValue(); + + if ( eXFS == drawing::FillStyle_NONE ) + rPageProperties.PutItem( XFillStyleItem( eXFS ) ); + } + break; + + case SID_ATTR_PAGE_COLOR: + { + rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_SOLID ) ); + if (const XFillColorItem* pColorItem = static_cast(pArgs->GetItem(SID_ATTR_PAGE_COLOR))) + rPageProperties.PutItem(XFillColorItem("", pColorItem->GetColorValue())); + else + rPageProperties.PutItem(pArgs->Get(XATTR_FILLCOLOR)); + } + break; + + case SID_ATTR_PAGE_GRADIENT: + { + if (SfxItemState::SET == pArgs->GetItemState(SID_FILL_GRADIENT_JSON, false, &pItem)) + { + const SfxStringItem* pJSON = static_cast(pItem); + XFillGradientItem aGradientItem( basegfx::BGradient::fromJSON(pJSON->GetValue()) ); + + // MigrateItemSet guarantees unique gradient names + SfxItemSetFixed aMigrateSet(mpDrawView->GetModel().GetItemPool()); + aMigrateSet.Put( aGradientItem ); + SdrModel::MigrateItemSet(&aMigrateSet, &aTempSet, &mpDrawView->GetModel()); + + rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_GRADIENT ) ); + rPageProperties.PutItemSet( aTempSet ); + } + else + { + XFillGradientItem aGradientItem( pArgs->Get( XATTR_FILLGRADIENT ) ); + + // MigrateItemSet guarantees unique gradient names + SfxItemSetFixed aMigrateSet(mpDrawView->GetModel().GetItemPool()); + aMigrateSet.Put( aGradientItem ); + SdrModel::MigrateItemSet(&aMigrateSet, &aTempSet, &mpDrawView->GetModel()); + + rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_GRADIENT ) ); + rPageProperties.PutItemSet( aTempSet ); + } + } + break; + + case SID_ATTR_PAGE_HATCH: + { + XFillHatchItem aHatchItem( pArgs->Get( XATTR_FILLHATCH ) ); + rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_HATCH ) ); + rPageProperties.PutItem( aHatchItem ); + } + break; + + case SID_ATTR_PAGE_BITMAP: + { + XFillBitmapItem aBitmapItem( pArgs->Get( XATTR_FILLBITMAP ) ); + rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_BITMAP ) ); + rPageProperties.PutItem( aBitmapItem ); + } + break; + + default: + break; + } + + rReq.Done(); + } + else + { + PageKind ePageKind = GetPageKind(); + const SfxPoolItem* pPoolItem = nullptr; + Size aNewSize(pPage->GetSize()); + sal_Int32 nLeft = -1, nRight = -1, nUpper = -1, nLower = -1; + bool bScaleAll = true; + Orientation eOrientation = pPage->GetOrientation(); + SdPage* pMasterPage = pPage->IsMasterPage() ? pPage : &static_cast(pPage->TRG_GetMasterPage()); + bool bFullSize = pMasterPage->IsBackgroundFullSize(); + sal_uInt16 nPaperBin = pPage->GetPaperBin(); + + switch (nSlotId) + { + case SID_ATTR_PAGE_LRSPACE: + if( pArgs->GetItemState(SID_ATTR_PAGE_LRSPACE, + true,&pPoolItem) == SfxItemState::SET ) + { + nLeft = static_cast(pPoolItem)->GetLeft(); + nRight = static_cast(pPoolItem)->GetRight(); + if (nLeft != -1) + { + nUpper = pPage->GetUpperBorder(); + nLower = pPage->GetLowerBorder(); + } + SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize ); + } + break; + + case SID_ATTR_PAGE_ULSPACE: + if( pArgs->GetItemState(SID_ATTR_PAGE_ULSPACE, + true,&pPoolItem) == SfxItemState::SET ) + { + nUpper = static_cast(pPoolItem)->GetUpper(); + nLower = static_cast(pPoolItem)->GetLower(); + if (nUpper != -1) + { + nLeft = pPage->GetLeftBorder(); + nRight = pPage->GetRightBorder(); + } + SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize ); + } + break; + + default: + break; + } + } +} + +void DrawViewShell::GetState (SfxItemSet& rSet) +{ + // Iterate over all requested items in the set. + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + while (nWhich) + { + switch (nWhich) + { + case SID_SEARCH_ITEM: + case SID_SEARCH_OPTIONS: + // Forward this request to the common (old) code of the + // document shell. + GetDocSh()->GetState (rSet); + break; + default: + SAL_WARN("sd", "DrawViewShell::GetState(): can not handle which id " << nWhich); + break; + } + nWhich = aIter.NextWhich(); + } +} + +void DrawViewShell::Execute (SfxRequest& rReq) +{ + if(SlideShow::IsRunning(GetViewShellBase())) + { + // Do not execute anything during a native slide show. + return; + } + + switch (rReq.GetSlot()) + { + case SID_SEARCH_ITEM: + // Forward this request to the common (old) code of the + // document shell. + GetDocSh()->Execute (rReq); + break; + + case SID_SPELL_DIALOG: + { + SfxViewFrame* pViewFrame = GetViewFrame(); + if (rReq.GetArgs() != nullptr) + pViewFrame->SetChildWindow (SID_SPELL_DIALOG, + static_cast(rReq.GetArgs()-> + Get(SID_SPELL_DIALOG)).GetValue()); + else + pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG); + + pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG); + rReq.Ignore (); + } + break; + + default: + SAL_WARN("sd", "DrawViewShell::Execute(): can not handle slot " << rReq.GetSlot()); + break; + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews8.cxx b/sd/source/ui/view/drviews8.cxx new file mode 100644 index 0000000000..0f2907d424 --- /dev/null +++ b/sd/source/ui/view/drviews8.cxx @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace sd { + +void DrawViewShell::ScannerEvent() +{ + if( mxScannerManager.is() ) + { + const css::scanner::ScannerContext aContext( mxScannerManager->getAvailableScanners().getConstArray()[ 0 ] ); + const css::scanner::ScanError eError = mxScannerManager->getError( aContext ); + + if( css::scanner::ScanError_ScanErrorNone == eError ) + { + const css::uno::Reference< css::awt::XBitmap > xBitmap( mxScannerManager->getBitmap( aContext ) ); + + if( xBitmap.is() ) + { + const BitmapEx aScanBmp( VCLUnoHelper::GetBitmap( xBitmap ) ); + + if( !aScanBmp.IsEmpty() ) + { + const SolarMutexGuard aGuard; + SdrPage* pPage = mpDrawView->GetSdrPageView()->GetPage(); + Size aBmpSize( aScanBmp.GetPrefSize() ), aPageSize( pPage->GetSize() ); + const MapMode aMap100( MapUnit::Map100thMM ); + + if( !aBmpSize.Width() || !aBmpSize.Height() ) + aBmpSize = aScanBmp.GetSizePixel(); + + if( aScanBmp.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel ) + aBmpSize = GetActiveWindow()->PixelToLogic( aBmpSize, aMap100 ); + else + aBmpSize = OutputDevice::LogicToLogic( aBmpSize, aScanBmp.GetPrefMapMode(), aMap100 ); + + aPageSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) ); + aPageSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) ); + + if( ( ( aBmpSize.Height() > aPageSize.Height() ) || ( aBmpSize.Width() > aPageSize.Width() ) ) && aBmpSize.Height() && aPageSize.Height() ) + { + double fGrfWH = static_cast(aBmpSize.Width()) / aBmpSize.Height(); + double fWinWH = static_cast(aPageSize.Width()) / aPageSize.Height(); + + if( fGrfWH < fWinWH ) + { + aBmpSize.setWidth( FRound( aPageSize.Height() * fGrfWH ) ); + aBmpSize.setHeight( aPageSize.Height() ); + } + else if( fGrfWH > 0.F ) + { + aBmpSize.setWidth( aPageSize.Width() ); + aBmpSize.setHeight( FRound( aPageSize.Width() / fGrfWH ) ); + } + } + + Point aPnt ( ( aPageSize.Width() - aBmpSize.Width() ) >> 1, ( aPageSize.Height() - aBmpSize.Height() ) >> 1 ); + aPnt += Point( pPage->GetLeftBorder(), pPage->GetUpperBorder() ); + ::tools::Rectangle aRect( aPnt, aBmpSize ); + bool bInsertNewObject = true; + + if( GetView()->AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if( rMarkList.GetMarkCount() == 1 ) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + if( auto pGrafObj = dynamic_cast< SdrGrafObj *>( pObj ) ) + { + if( pGrafObj->IsEmptyPresObj() ) + { + bInsertNewObject = false; + pGrafObj->SetEmptyPresObj(false); + pGrafObj->SetOutlinerParaObject(std::nullopt); + pGrafObj->SetGraphic( Graphic( aScanBmp ) ); + } + } + } + } + + if( bInsertNewObject ) + { + rtl::Reference pGrafObj = new SdrGrafObj( + GetView()->getSdrModelFromSdrView(), + Graphic(aScanBmp), + aRect); + SdrPageView* pPV = GetView()->GetSdrPageView(); + GetView()->InsertObjectAtView( pGrafObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER ); + } + } + } + } + } + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_TWAIN_SELECT ); + rBindings.Invalidate( SID_TWAIN_TRANSFER ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviews9.cxx b/sd/source/ui/view/drviews9.cxx new file mode 100644 index 0000000000..1ae793e4d6 --- /dev/null +++ b/sd/source/ui/view/drviews9.cxx @@ -0,0 +1,905 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + +void DrawViewShell::ExecGallery(SfxRequest const & rReq) +{ + // nothing is executed during a slide show! + if(HasCurrentFunction(SID_PRESENTATION)) + return; + + const SfxItemSet* pArgs = rReq.GetArgs(); + + const SvxGalleryItem* pGalleryItem = SfxItemSet::GetItem(pArgs, SID_GALLERY_FORMATS, false); + if ( !pGalleryItem ) + return; + + GetDocSh()->SetWaitCursor( true ); + + sal_Int8 nType( pGalleryItem->GetType() ); + // insert graphic + if (nType == css::gallery::GalleryItemType::GRAPHIC) + { + Graphic aGraphic( pGalleryItem->GetGraphic() ); + + // reduce size if necessary + ScopedVclPtrInstance< Window > aWindow(GetActiveWindow()); + aWindow->SetMapMode(aGraphic.GetPrefMapMode()); + Size aSizePix = aWindow->LogicToPixel(aGraphic.GetPrefSize()); + aWindow->SetMapMode( MapMode(MapUnit::Map100thMM) ); + Size aSize = aWindow->PixelToLogic(aSizePix); + + // constrain size to page size if necessary + SdrPage* pPage = mpDrawView->GetSdrPageView()->GetPage(); + Size aPageSize = pPage->GetSize(); + aPageSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) ); + aPageSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) ); + + // If the image is too large we make it fit into the page + if ( ( ( aSize.Height() > aPageSize.Height() ) || ( aSize.Width() > aPageSize.Width() ) ) && + aSize.Height() && aPageSize.Height() ) + { + float fGrfWH = static_cast(aSize.Width()) / + static_cast(aSize.Height()); + float fWinWH = static_cast(aPageSize.Width()) / + static_cast(aPageSize.Height()); + + // constrain size to page size if necessary + if ((fGrfWH != 0.F) && (fGrfWH < fWinWH)) + { + aSize.setWidth( static_cast<::tools::Long>(aPageSize.Height() * fGrfWH) ); + aSize.setHeight( aPageSize.Height() ); + } + else + { + aSize.setWidth( aPageSize.Width() ); + aSize.setHeight( static_cast<::tools::Long>(aPageSize.Width() / fGrfWH) ); + } + } + + // set output rectangle for graphic + Point aPnt ((aPageSize.Width() - aSize.Width()) / 2, + (aPageSize.Height() - aSize.Height()) / 2); + aPnt += Point(pPage->GetLeftBorder(), pPage->GetUpperBorder()); + ::tools::Rectangle aRect (aPnt, aSize); + + rtl::Reference pGrafObj; + + bool bInsertNewObject = true; + + if ( mpDrawView->AreObjectsMarked() ) + { + // is there an empty graphic object? + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + if (pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Graphic) + { + pGrafObj = static_cast(pObj); + + if( pGrafObj->IsEmptyPresObj() ) + { + // the empty graphic object gets a new graphic + bInsertNewObject = false; + + rtl::Reference pNewGrafObj(SdrObject::Clone(*pGrafObj, pGrafObj->getSdrModelFromSdrObject())); + pNewGrafObj->SetEmptyPresObj(false); + pNewGrafObj->SetOutlinerParaObject(std::nullopt); + pNewGrafObj->SetGraphic(aGraphic); + + OUString aStr = mpDrawView->GetDescriptionOfMarkedObjects() + + " " + SdResId(STR_UNDO_REPLACE); + mpDrawView->BegUndo(aStr); + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + mpDrawView->ReplaceObjectAtView(pGrafObj.get(), *pPV, pNewGrafObj.get()); + mpDrawView->EndUndo(); + } + } + } + } + + if( bInsertNewObject ) + { + pGrafObj = new SdrGrafObj( + GetView()->getSdrModelFromSdrView(), + aGraphic, + aRect); + SdrPageView* pPV = mpDrawView->GetSdrPageView(); + mpDrawView->InsertObjectAtView(pGrafObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER); + } + } + // insert sound + else if( nType == css::gallery::GalleryItemType::MEDIA ) + { + const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, pGalleryItem->GetURL() ); + GetViewFrame()->GetDispatcher()->ExecuteList(SID_INSERT_AVMEDIA, + SfxCallMode::SYNCHRON, { &aMediaURLItem }); + } + + GetDocSh()->SetWaitCursor( false ); +} + +/** + * Edit macros for attribute configuration + */ + +/* the work flow to adjust the attributes is nearly everywhere the same + 1. read existing attributes + 2. read parameter from the basic-set + 3. delete selected item from the attribute-set + 4. create new attribute-item + 5. insert item into set */ +void DrawViewShell::AttrExec (SfxRequest &rReq) +{ + // nothing is executed during a slide show! + if(HasCurrentFunction(SID_PRESENTATION)) + return; + + CheckLineTo (rReq); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + SfxItemSet aAttr( GetDoc()->GetPool() ); + + GetView()->GetAttributes( aAttr ); + const SfxItemSet* pArgs = rReq.GetArgs(); + + switch (rReq.GetSlot ()) + { + // set new fill-style + case SID_SETFILLSTYLE : + if (pArgs && pArgs->Count () == 1) + { + const SfxUInt32Item* pFillStyle = rReq.GetArg(ID_VAL_STYLE); + if (CHECK_RANGE (drawing::FillStyle_NONE, static_cast(pFillStyle->GetValue ()), drawing::FillStyle_BITMAP)) + { + aAttr.ClearItem (XATTR_FILLSTYLE); + XFillStyleItem aStyleItem(static_cast(pFillStyle->GetValue ())); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put (aStyleItem); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + } +#if HAVE_FEATURE_SCRIPTING + else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + // determine new line style + case SID_SETLINESTYLE : + if (pArgs && pArgs->Count () == 1) + { + const SfxUInt32Item* pLineStyle = rReq.GetArg(ID_VAL_STYLE); + if (CHECK_RANGE (sal_Int32(drawing::LineStyle_NONE), static_cast(pLineStyle->GetValue()), sal_Int32(drawing::LineStyle_DASH))) + { + aAttr.ClearItem (XATTR_LINESTYLE); + XLineStyleItem aStyleItem(static_cast(pLineStyle->GetValue())); + aStyleItem.SetWhich(XATTR_LINESTYLE); + aAttr.Put(aStyleItem); + rBindings.Invalidate (SID_ATTR_LINE_STYLE); + } +#if HAVE_FEATURE_SCRIPTING + else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + // set line width + case SID_SETLINEWIDTH : + if (pArgs && pArgs->Count () == 1) + { + const SfxUInt32Item* pLineWidth = rReq.GetArg(ID_VAL_WIDTH); + aAttr.ClearItem (XATTR_LINEWIDTH); + XLineWidthItem aWidthItem(pLineWidth->GetValue()); + aWidthItem.SetWhich(XATTR_LINEWIDTH); + aAttr.Put(aWidthItem); + rBindings.Invalidate (SID_ATTR_LINE_WIDTH); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_SETFILLCOLOR : + if (pArgs && pArgs->Count () == 3) + { + const SfxUInt32Item* pRed = rReq.GetArg(ID_VAL_RED); + const SfxUInt32Item* pGreen = rReq.GetArg(ID_VAL_GREEN); + const SfxUInt32Item* pBlue = rReq.GetArg(ID_VAL_BLUE); + + aAttr.ClearItem (XATTR_FILLCOLOR); + aAttr.ClearItem (XATTR_FILLSTYLE); + XFillColorItem aColorItem(-1, Color (static_cast(pRed->GetValue ()), + static_cast(pGreen->GetValue ()), + static_cast(pBlue->GetValue ()))); + aColorItem.SetWhich(XATTR_FILLCOLOR); + aAttr.Put(aColorItem); + rBindings.Invalidate (SID_ATTR_FILL_COLOR); + rBindings.Invalidate (SID_ATTR_PAGE_COLOR); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_SETLINECOLOR : + if (pArgs && pArgs->Count () == 3) + { + const SfxUInt32Item* pRed = rReq.GetArg(ID_VAL_RED); + const SfxUInt32Item* pGreen = rReq.GetArg(ID_VAL_GREEN); + const SfxUInt32Item* pBlue = rReq.GetArg(ID_VAL_BLUE); + + aAttr.ClearItem (XATTR_LINECOLOR); + XLineColorItem aColorItem(-1, Color(static_cast(pRed->GetValue()), + static_cast(pGreen->GetValue()), + static_cast(pBlue->GetValue()))); + aColorItem.SetWhich(XATTR_LINECOLOR); + aAttr.Put(aColorItem); + rBindings.Invalidate (SID_ATTR_LINE_COLOR); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_SETGRADSTARTCOLOR : + case SID_SETGRADENDCOLOR : + if (pArgs && pArgs->Count () == 4) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + const SfxUInt32Item* pRed = rReq.GetArg(ID_VAL_RED); + const SfxUInt32Item* pGreen = rReq.GetArg(ID_VAL_GREEN); + const SfxUInt32Item* pBlue = rReq.GetArg(ID_VAL_BLUE); + assert(pName && pRed && pGreen && pBlue && "must be present"); + + XGradientListRef pGradientList = GetDoc()->GetGradientList (); + ::tools::Long nCounts = pGradientList->Count (); + Color aColor (static_cast(pRed->GetValue ()), + static_cast(pGreen->GetValue ()), + static_cast(pBlue->GetValue ())); + ::tools::Long i; + + aAttr.ClearItem (XATTR_FILLGRADIENT); + aAttr.ClearItem (XATTR_FILLSTYLE); + + for ( i = 0; i < nCounts; i ++) + { + const XGradientEntry* pEntry = pGradientList->GetGradient(i); + + if (pEntry->GetName () == pName->GetValue ()) + { + basegfx::BGradient aGradient(pEntry->GetGradient()); + basegfx::BColorStops aNewColorStops(aGradient.GetColorStops()); + + if (SID_SETGRADSTARTCOLOR == rReq.GetSlot ()) + { + aNewColorStops.replaceStartColor(aColor.getBColor()); + } + else + { + aNewColorStops.replaceEndColor(aColor.getBColor()); + } + + aGradient.SetColorStops(aNewColorStops); + + XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillGradientItem aGradientItem(pName->GetValue (), aGradient); + aGradientItem.SetWhich(XATTR_FILLGRADIENT); + aAttr.Put(aGradientItem); + break; + } + } + + if (i >= nCounts) + { + Color aBlack (0, 0, 0); + basegfx::BGradient aGradient ( + basegfx::BColorStops( + (rReq.GetSlot () == SID_SETGRADSTARTCOLOR) + ? aColor.getBColor() + : aBlack.getBColor(), + (rReq.GetSlot () == SID_SETGRADENDCOLOR) + ? aColor.getBColor() + : aBlack.getBColor())); + + GetDoc()->GetGradientList()->Insert(std::make_unique(aGradient, pName->GetValue())); + + XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillGradientItem aGradientItem(pName->GetValue(), aGradient); + aGradientItem.SetWhich(XATTR_FILLGRADIENT); + aAttr.Put(aGradientItem); + } + + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + rBindings.Invalidate (SID_ATTR_FILL_GRADIENT); + rBindings.Invalidate (SID_ATTR_PAGE_GRADIENT); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_SETHATCHCOLOR : + if (pArgs && pArgs->Count () == 4) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + const SfxUInt32Item* pRed = rReq.GetArg(ID_VAL_RED); + const SfxUInt32Item* pGreen = rReq.GetArg(ID_VAL_GREEN); + const SfxUInt32Item* pBlue = rReq.GetArg(ID_VAL_BLUE); + assert(pName && pRed && pGreen && pBlue && "must be present"); + + XHatchListRef pHatchList = GetDoc()->GetHatchList (); + ::tools::Long nCounts = pHatchList->Count (); + Color aColor (static_cast(pRed->GetValue ()), + static_cast(pGreen->GetValue ()), + static_cast(pBlue->GetValue ())); + ::tools::Long i; + + aAttr.ClearItem (XATTR_FILLHATCH); + aAttr.ClearItem (XATTR_FILLSTYLE); + + for ( i = 0; i < nCounts; i ++) + { + const XHatchEntry* pEntry = pHatchList->GetHatch(i); + + if (pEntry->GetName () == pName->GetValue ()) + { + XHatch aHatch(pEntry->GetHatch()); + + aHatch.SetColor (aColor); + + XFillStyleItem aStyleItem(drawing::FillStyle_HATCH); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillHatchItem aHatchItem(pName->GetValue(), aHatch); + aHatchItem.SetWhich(XATTR_FILLHATCH); + aAttr.Put(aHatchItem); + break; + } + } + + if (i >= nCounts) + { + XHatch aHatch (aColor); + + GetDoc()->GetHatchList()->Insert(std::make_unique(aHatch, pName->GetValue())); + + XFillStyleItem aStyleItem(drawing::FillStyle_HATCH); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillHatchItem aHatchItem(pName->GetValue (), aHatch); + aHatchItem.SetWhich(XATTR_FILLHATCH); + aAttr.Put(aHatchItem); + } + + rBindings.Invalidate (SID_ATTR_FILL_HATCH); + rBindings.Invalidate (SID_ATTR_PAGE_HATCH); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + // configuration for line-dash + case SID_DASH : + if (pArgs && pArgs->Count () == 7) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + const SfxUInt32Item* pStyle = rReq.GetArg(ID_VAL_STYLE); + const SfxUInt32Item* pDots = rReq.GetArg(ID_VAL_DOTS); + const SfxUInt32Item* pDotLen = rReq.GetArg(ID_VAL_DOTLEN); + const SfxUInt32Item* pDashes = rReq.GetArg(ID_VAL_DASHES); + const SfxUInt32Item* pDashLen = rReq.GetArg(ID_VAL_DASHLEN); + const SfxUInt32Item* pDistance = rReq.GetArg(ID_VAL_DISTANCE); + assert(pName && pStyle && pDots && pDotLen && pDashes && pDashLen && pDistance && "must be present"); + + if (CHECK_RANGE (sal_Int32(css::drawing::DashStyle_RECT), static_cast(pStyle->GetValue()), sal_Int32(css::drawing::DashStyle_ROUNDRELATIVE))) + { + XDash aNewDash (static_cast(pStyle->GetValue ()), static_cast(pDots->GetValue ()), pDotLen->GetValue (), + static_cast(pDashes->GetValue ()), pDashLen->GetValue (), pDistance->GetValue ()); + + aAttr.ClearItem (XATTR_LINEDASH); + aAttr.ClearItem (XATTR_LINESTYLE); + + XDashListRef pDashList = GetDoc()->GetDashList(); + ::tools::Long nCounts = pDashList->Count (); + std::unique_ptr pEntry = std::make_unique(aNewDash, pName->GetValue()); + ::tools::Long i; + + for ( i = 0; i < nCounts; i++ ) + if (pDashList->GetDash (i)->GetName () == pName->GetValue ()) + break; + + if (i < nCounts) + pDashList->Replace(std::move(pEntry), i); + else + pDashList->Insert(std::move(pEntry)); + + XLineDashItem aDashItem(pName->GetValue(), aNewDash); + aDashItem.SetWhich(XATTR_LINEDASH); + aAttr.Put(aDashItem); + XLineStyleItem aStyleItem(drawing::LineStyle_DASH); + aStyleItem.SetWhich(XATTR_LINESTYLE); + aAttr.Put(aStyleItem); + rBindings.Invalidate (SID_ATTR_LINE_DASH); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + } +#if HAVE_FEATURE_SCRIPTING + else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + // configuration for gradients + case SID_GRADIENT : + if (pArgs && pArgs->Count () == 8) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + const SfxUInt32Item* pStyle = rReq.GetArg(ID_VAL_STYLE); + const SfxUInt32Item* pAngle = rReq.GetArg(ID_VAL_ANGLE); + const SfxUInt32Item* pBorder = rReq.GetArg(ID_VAL_BORDER); + const SfxUInt32Item* pCenterX = rReq.GetArg(ID_VAL_CENTER_X); + const SfxUInt32Item* pCenterY = rReq.GetArg(ID_VAL_CENTER_Y); + const SfxUInt32Item* pStart = rReq.GetArg(ID_VAL_STARTINTENS); + const SfxUInt32Item* pEnd = rReq.GetArg(ID_VAL_ENDINTENS); + assert(pName && pStyle && pAngle && pBorder && pCenterX && pCenterY && pStart && pEnd && "must be present"); + + if (CHECK_RANGE (sal_Int32(css::awt::GradientStyle_LINEAR), static_cast(pStyle->GetValue()), sal_Int32(css::awt::GradientStyle_RECT)) && + CHECK_RANGE (0, static_cast(pAngle->GetValue ()), 360) && + CHECK_RANGE (0, static_cast(pBorder->GetValue ()), 100) && + CHECK_RANGE (0, static_cast(pCenterX->GetValue ()), 100) && + CHECK_RANGE (0, static_cast(pCenterY->GetValue ()), 100) && + CHECK_RANGE (0, static_cast(pStart->GetValue ()), 100) && + CHECK_RANGE (0, static_cast(pEnd->GetValue ()), 100)) + { + aAttr.ClearItem (XATTR_FILLGRADIENT); + aAttr.ClearItem (XATTR_FILLSTYLE); + + XGradientListRef pGradientList = GetDoc()->GetGradientList (); + ::tools::Long nCounts = pGradientList->Count (); + ::tools::Long i; + + for ( i = 0; i < nCounts; i++ ) + { + const XGradientEntry* pEntry = pGradientList->GetGradient(i); + + if (pEntry->GetName () == pName->GetValue ()) + { + basegfx::BGradient aGradient(pEntry->GetGradient()); + + aGradient.SetGradientStyle (static_cast(pStyle->GetValue ())); + aGradient.SetAngle (Degree10(pAngle->GetValue () * 10)); + aGradient.SetBorder (static_cast(pBorder->GetValue ())); + aGradient.SetXOffset (static_cast(pCenterX->GetValue ())); + aGradient.SetYOffset (static_cast(pCenterY->GetValue ())); + aGradient.SetStartIntens (static_cast(pStart->GetValue ())); + aGradient.SetEndIntens (static_cast(pEnd->GetValue ())); + + XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillGradientItem aGradientItem(pName->GetValue (), aGradient); + aGradientItem.SetWhich(XATTR_FILLGRADIENT); + aAttr.Put(aGradientItem); + break; + } + } + + if (i >= nCounts) + { + Color aBlack (0, 0, 0); + basegfx::BGradient aGradient ( + basegfx::BColorStops(aBlack.getBColor(), aBlack.getBColor()), + static_cast(pStyle->GetValue ()), + Degree10(pAngle->GetValue () * 10), static_cast(pCenterX->GetValue ()), + static_cast(pCenterY->GetValue ()), static_cast(pBorder->GetValue ()), + static_cast(pStart->GetValue ()), static_cast(pEnd->GetValue ())); + + pGradientList->Insert(std::make_unique(aGradient, pName->GetValue())); + XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillGradientItem aGradientItem(pName->GetValue (), aGradient); + aGradientItem.SetWhich(XATTR_FILLGRADIENT); + aAttr.Put(aGradientItem); + } + + rBindings.Invalidate (SID_ATTR_FILL_GRADIENT); + rBindings.Invalidate (SID_ATTR_PAGE_GRADIENT); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + } +#if HAVE_FEATURE_SCRIPTING + else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + // configuration for hatch + case SID_HATCH : + if (pArgs && pArgs->Count () == 4) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + const SfxUInt32Item* pStyle = rReq.GetArg(ID_VAL_STYLE); + const SfxUInt32Item* pDistance = rReq.GetArg(ID_VAL_DISTANCE); + const SfxUInt32Item* pAngle = rReq.GetArg(ID_VAL_ANGLE); + assert(pName && pStyle && pDistance && pAngle && "must be present"); + + if (CHECK_RANGE (sal_Int32(css::drawing::HatchStyle_SINGLE), static_cast(pStyle->GetValue()), sal_Int32(css::drawing::HatchStyle_TRIPLE)) && + CHECK_RANGE (0, static_cast(pAngle->GetValue ()), 360)) + { + aAttr.ClearItem (XATTR_FILLHATCH); + aAttr.ClearItem (XATTR_FILLSTYLE); + + XHatchListRef pHatchList = GetDoc()->GetHatchList (); + ::tools::Long nCounts = pHatchList->Count (); + ::tools::Long i; + + for ( i = 0; i < nCounts; i++ ) + { + const XHatchEntry* pEntry = pHatchList->GetHatch(i); + + if (pEntry->GetName () == pName->GetValue ()) + { + XHatch aHatch(pEntry->GetHatch()); + + aHatch.SetHatchStyle (static_cast(pStyle->GetValue ())); + aHatch.SetDistance (pDistance->GetValue ()); + aHatch.SetAngle (Degree10(pAngle->GetValue () * 10)); + + XFillStyleItem aStyleItem(drawing::FillStyle_HATCH); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillHatchItem aHatchItem(pName->GetValue (), aHatch); + aHatchItem.SetWhich(XATTR_FILLHATCH); + aAttr.Put(aHatchItem); + break; + } + } + + if (i >= nCounts) + { + XHatch aHatch (Color(0), static_cast(pStyle->GetValue ()), pDistance->GetValue (), + Degree10(pAngle->GetValue () * 10)); + + pHatchList->Insert(std::make_unique(aHatch, pName->GetValue())); + XFillStyleItem aStyleItem(drawing::FillStyle_HATCH); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillHatchItem aHatchItem(pName->GetValue (), aHatch); + aHatchItem.SetWhich(XATTR_FILLHATCH); + aAttr.Put(aHatchItem); + } + + rBindings.Invalidate (SID_ATTR_FILL_HATCH); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + } +#if HAVE_FEATURE_SCRIPTING + else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_SELECTGRADIENT : + if (pArgs && (pArgs->Count() == 1)) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + assert(pName && "must be present"); + + XGradientListRef pGradientList = GetDoc()->GetGradientList (); + ::tools::Long nCounts = pGradientList->Count (); + + for (::tools::Long i = 0; i < nCounts; i ++) + { + const XGradientEntry* pEntry = pGradientList->GetGradient(i); + + if (pEntry->GetName () == pName->GetValue ()) + { + aAttr.ClearItem (XATTR_FILLGRADIENT); + aAttr.ClearItem (XATTR_FILLSTYLE); + XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillGradientItem aGradientItem(pName->GetValue (), pEntry->GetGradient ()); + aGradientItem.SetWhich(XATTR_FILLGRADIENT); + aAttr.Put(aGradientItem); + rBindings.Invalidate (SID_ATTR_FILL_GRADIENT); + rBindings.Invalidate (SID_ATTR_PAGE_GRADIENT); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + break; + } + } + + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_SELECTHATCH : + if (pArgs && pArgs->Count() == 1) + { + const SfxStringItem* pName = rReq.GetArg(ID_VAL_INDEX); + assert(pName && "must be present"); + + XHatchListRef pHatchList = GetDoc()->GetHatchList (); + ::tools::Long nCounts = pHatchList->Count (); + + for (::tools::Long i = 0; i < nCounts; i ++) + { + const XHatchEntry* pEntry = pHatchList->GetHatch(i); + + if (pEntry->GetName () == pName->GetValue ()) + { + aAttr.ClearItem (XATTR_FILLHATCH); + aAttr.ClearItem (XATTR_FILLSTYLE); + XFillStyleItem aStyleItem(drawing::FillStyle_HATCH); + aStyleItem.SetWhich(XATTR_FILLSTYLE); + aAttr.Put(aStyleItem); + XFillHatchItem aHatchItem(pName->GetValue (), pEntry->GetHatch ()); + aHatchItem.SetWhich(XATTR_FILLHATCH); + aAttr.Put(aHatchItem); + + rBindings.Invalidate (SID_ATTR_FILL_HATCH); + rBindings.Invalidate (SID_ATTR_PAGE_HATCH); + rBindings.Invalidate (SID_ATTR_FILL_STYLE); + rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE); + break; + } + } + + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + + case SID_UNSELECT : + mpDrawView->UnmarkAll (); + break; + + case SID_GETRED : + if (pArgs && pArgs->Count () == 1) + { + break; + } +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + break; + +/* case SID_SETFONTFAMILYNAME : + case SID_SETFONTSTYLENAME : + case SID_SETFONTFAMILY : + case SID_SETFONTPITCH : + case SID_SETFONTCHARSET : + case SID_SETFONTPOSTURE : + case SID_SETFONTWEIGHT : + case SID_SETFONTUNDERLINE : + case SID_SETFONTCROSSEDOUT : + case SID_SETFONTSHADOWED : + case SID_SETFONTCONTOUR : + case SID_SETFONTCOLOR : + case SID_SETFONTLANGUAGE : + case SID_SETFONTWORDLINE : + case SID_SETFONTCASEMAP : + case SID_SETFONTESCAPE : + case SID_SETFONTKERNING : + break;*/ + + default : + ; + } + + mpDrawView->SetAttributes (const_cast(aAttr)); + rReq.Ignore (); +} + +/** + * Edit macros for attribute configuration + */ +void DrawViewShell::AttrState (SfxItemSet& rSet) +{ + SfxWhichIter aIter (rSet); + sal_uInt16 nWhich = aIter.FirstWhich (); + SfxItemSet aAttr( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttr ); + + while (nWhich) + { + switch (nWhich) + { + case SID_GETFILLSTYLE : + { + const XFillStyleItem &rFillStyleItem = aAttr.Get (XATTR_FILLSTYLE); + + rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>(rFillStyleItem.GetValue ()))); + break; + } + + case SID_GETLINESTYLE : + { + const XLineStyleItem &rLineStyleItem = aAttr.Get (XATTR_LINESTYLE); + + rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>(rLineStyleItem.GetValue ()))); + break; + } + + case SID_GETLINEWIDTH : + { + const XLineWidthItem &rLineWidthItem = aAttr.Get (XATTR_LINEWIDTH); + + rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>(rLineWidthItem.GetValue ()))); + break; + } + + case SID_GETGREEN : + case SID_GETRED : + case SID_GETBLUE : + { + const SfxUInt32Item &rWhatKind = static_cast( rSet.Get (ID_VAL_WHATKIND) ); + Color aColor; + + switch (rWhatKind.GetValue ()) + { + case 1 : + { + const XLineColorItem &rLineColorItem = aAttr.Get (XATTR_LINECOLOR); + + aColor = rLineColorItem.GetColorValue (); + break; + } + + case 2 : + { + const XFillColorItem &rFillColorItem = aAttr.Get (XATTR_FILLCOLOR); + + aColor = rFillColorItem.GetColorValue (); + break; + } + + case 3 : + case 4 : + { + const XFillGradientItem &rFillGradientItem = aAttr.Get (XATTR_FILLGRADIENT); + const basegfx::BGradient &rGradient = rFillGradientItem.GetGradientValue (); + + aColor = (rWhatKind.GetValue () == 3) + ? Color(rGradient.GetColorStops().front().getStopColor()) + : Color(rGradient.GetColorStops().back().getStopColor()); + break; + } + + case 5: + { + const XFillHatchItem &rFillHatchItem = aAttr.Get (XATTR_FILLHATCH); + const XHatch &rHatch = rFillHatchItem.GetHatchValue (); + + aColor = rHatch.GetColor (); + break; + } + + default : + ; + } + + rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>((nWhich == SID_GETRED) + ? aColor.GetRed () + : (nWhich == SID_GETGREEN) + ? aColor.GetGreen () + : aColor.GetBlue ()))); + break; + } + + default : + ; + } + + nWhich = aIter.NextWhich (); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsa.cxx b/sd/source/ui/view/drviewsa.cxx new file mode 100644 index 0000000000..5d5cfe6132 --- /dev/null +++ b/sd/source/ui/view/drviewsa.cxx @@ -0,0 +1,873 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using vcl::EnumContext; + +namespace sd { + +bool DrawViewShell::mbPipette = false; + +namespace { + +class ScannerEventListener : public ::cppu::WeakImplHelper< lang::XEventListener > +{ +private: + + DrawViewShell* mpParent; + +public: + + explicit ScannerEventListener( DrawViewShell* pParent ) : mpParent( pParent ) {} + + // XEventListener + virtual void SAL_CALL disposing( const lang::EventObject& rEventObject ) override; + + void ParentDestroyed() { mpParent = nullptr; } +}; + +} + +void SAL_CALL ScannerEventListener::disposing( const lang::EventObject& /*rEventObject*/ ) +{ + if( mpParent ) + mpParent->ScannerEvent(); +} + +DrawViewShell::DrawViewShell( ViewShellBase& rViewShellBase, vcl::Window* pParentWindow, PageKind ePageKind, FrameView* pFrameViewArgument ) + : ViewShell (pParentWindow, rViewShellBase) + , maTabControl(VclPtr::Create(this, pParentWindow)) + , mbIsLayerModeActive(false) + , mbIsInSwitchPage(false) + , mpSelectionChangeHandler(new svx::sidebar::SelectionChangeHandler( + [this] () { return this->GetSidebarContextName(); }, + uno::Reference(rViewShellBase.GetDrawController()), + vcl::EnumContext::Context::Default)) + , mbMouseButtonDown(false) + , mbMouseSelecting(false) +{ + if (pFrameViewArgument != nullptr) + mpFrameView = pFrameViewArgument; + else + mpFrameView = new FrameView(GetDoc()); + Construct(GetDocSh(), ePageKind); + + mpSelectionChangeHandler->Connect(); + + SetContextName(GetSidebarContextName()); + + doShow(); + + ConfigureAppBackgroundColor(); + SD_MOD()->GetColorConfig().AddListener(this); + maViewOptions.mnDocBackgroundColor = SD_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor; + + if (comphelper::LibreOfficeKit::isActive()) + { + SdXImpressDocument* pModel = comphelper::getFromUnoTunnel(rViewShellBase.GetCurrentDocument()); + SfxLokHelper::notifyViewRenderState(&rViewShellBase, pModel); + } +} + +DrawViewShell::~DrawViewShell() +{ + suppress_fun_call_w_exception(ImplDestroy()); +} + +void DrawViewShell::ImplDestroy() +{ + SD_MOD()->GetColorConfig().RemoveListener(this); + + mpSelectionChangeHandler->Disconnect(); + + mpAnnotationManager.reset(); + mpViewOverlayManager.reset(); + + OSL_ASSERT (GetViewShell()!=nullptr); + + if( mxScannerListener.is() ) + static_cast< ScannerEventListener* >( mxScannerListener.get() )->ParentDestroyed(); + + // Remove references to items within Svx3DWin + // (maybe do a listening sometime in Svx3DWin) + sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId(); + SfxChildWindow* pWindow = GetViewFrame() ? GetViewFrame()->GetChildWindow(nId) : nullptr; + if(pWindow) + { + Svx3DWin* p3DWin = static_cast< Svx3DWin* > (pWindow->GetWindow()); + if(p3DWin) + p3DWin->DocumentReload(); + } + + EndListening (*GetDoc()); + EndListening (*GetDocSh()); + + if( SlideShow::IsRunning(*this) ) + StopSlideShow(); + + DisposeFunctions(); + + sal_uInt16 aPageCnt = GetDoc()->GetSdPageCount(mePageKind); + + for (sal_uInt16 i = 0; i < aPageCnt; i++) + { + SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind); + + if (pPage == mpActualPage) + { + GetDoc()->SetSelected(pPage, true); + } + else + { + GetDoc()->SetSelected(pPage, false); + } + } + + if ( mxClipEvtLstnr.is() ) + { + mxClipEvtLstnr->RemoveListener( GetActiveWindow() ); + mxClipEvtLstnr->ClearCallbackLink(); // prevent callback if another thread is waiting + mxClipEvtLstnr.clear(); + } + + mpDrawView.reset(); + // Set mpView to NULL so that the destructor of the ViewShell base class + // does not access it. + mpView = nullptr; + + mpFrameView->Disconnect(); + maTabControl.disposeAndClear(); +} + +/** + * common part of both constructors + */ +void DrawViewShell::Construct(DrawDocShell* pDocSh, PageKind eInitialPageKind) +{ + mpActualPage = nullptr; + mbReadOnly = GetDocSh()->IsReadOnly(); + mxClipEvtLstnr.clear(); + mbPastePossible = false; + mbIsLayerModeActive = false; + + mpFrameView->Connect(); + + OSL_ASSERT (GetViewShell()!=nullptr); + + SetPool( &GetDoc()->GetPool() ); + + GetDoc()->CreateFirstPages(); + + mpDrawView.reset( new DrawView(pDocSh, GetActiveWindow()->GetOutDev(), this) ); + mpView = mpDrawView.get(); // Pointer of base class ViewShell + mpDrawView->SetSwapAsynchron(); // Asynchronous load of graphics + + // We do not read the page kind from the frame view anymore so we have + // to set it in order to resync frame view and this view. + mpFrameView->SetPageKind(eInitialPageKind); + mePageKind = eInitialPageKind; + meEditMode = EditMode::Page; + DocumentType eDocType = GetDoc()->GetDocumentType(); // RTTI does not work here + switch (mePageKind) + { + case PageKind::Standard: + meShellType = ST_IMPRESS; + break; + + case PageKind::Notes: + meShellType = ST_NOTES; + break; + + case PageKind::Handout: + meShellType = ST_HANDOUT; + break; + } + + Size aPageSize( GetDoc()->GetSdPage(0, mePageKind)->GetSize() ); + Point aPageOrg( aPageSize.Width(), aPageSize.Height() / 2); + Size aSize(aPageSize.Width() * 3, aPageSize.Height() * 2); + InitWindows(aPageOrg, aSize, Point(-1, -1)); + + Point aVisAreaPos; + + if ( pDocSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED ) + { + aVisAreaPos = pDocSh->GetVisArea(ASPECT_CONTENT).TopLeft(); + } + + mpDrawView->SetWorkArea(::tools::Rectangle(Point() - aVisAreaPos - aPageOrg, aSize)); + + // objects can not grow bigger than ViewSize + GetDoc()->SetMaxObjSize(aSize); + + // Split-Handler for TabControls + maTabControl->SetSplitHdl( LINK( this, DrawViewShell, TabSplitHdl ) ); + + /* In order to set the correct EditMode of the FrameView, we select another + one (small trick). */ + if (mpFrameView->GetViewShEditMode(/*mePageKind*/) == EditMode::Page) + { + meEditMode = EditMode::MasterPage; + } + else + { + meEditMode = EditMode::Page; + } + + // Use configuration of FrameView + ReadFrameViewData(mpFrameView); + + if( eDocType == DocumentType::Draw ) + { + GetActiveWindow()->SetHelpId( HID_SDGRAPHICVIEWSHELL ); + } + else + { + if (mePageKind == PageKind::Notes) + { + GetActiveWindow()->SetHelpId( CMD_SID_NOTES_MODE ); + + // AutoLayouts have to be created + GetDoc()->StopWorkStartupDelay(); + } + else if (mePageKind == PageKind::Handout) + { + GetActiveWindow()->SetHelpId( CMD_SID_HANDOUT_MASTER_MODE ); + + // AutoLayouts have to be created + GetDoc()->StopWorkStartupDelay(); + } + else + { + GetActiveWindow()->SetHelpId( HID_SDDRAWVIEWSHELL ); + } + } + + // start selection function + SfxRequest aReq(SID_OBJECT_SELECT, SfxCallMode::SLOT, GetDoc()->GetItemPool()); + FuPermanent(aReq); + mpDrawView->SetFrameDragSingles(); + + if (pDocSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED) + { + mbZoomOnPage = false; + } + else + { + mbZoomOnPage = true; + } + + mbIsRulerDrag = false; + + SetName ("DrawViewShell"); + + mnLockCount = 0; + + uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() ); + + try + { + mxScannerManager = scanner::ScannerManager::create( xContext ); + + mxScannerListener = new ScannerEventListener( this ); + } + catch (DeploymentException const &) + { + SAL_INFO("sd", "Scanner manager not available"); + } + catch (Exception const &) + { + // Eat the exception and log it + // We can still continue if scanner manager is not available. + DBG_UNHANDLED_EXCEPTION("sd"); + } + + mpAnnotationManager.reset( new AnnotationManager( GetViewShellBase() ) ); + mpViewOverlayManager.reset( new ViewOverlayManager( GetViewShellBase() ) ); +} + +void DrawViewShell::Init (bool bIsMainViewShell) +{ + ViewShell::Init(bIsMainViewShell); + + if (!IsListening(*GetDocSh())) + StartListening (*GetDocSh()); +} + +void DrawViewShell::Shutdown() +{ + ViewShell::Shutdown(); + + if(SlideShow::IsRunning( GetViewShellBase() ) ) + { + // Turn off effects. + GetDrawView()->SetAnimationMode(SdrAnimationMode::Disable); + } +} + +css::uno::Reference DrawViewShell::CreateSubController() +{ + css::uno::Reference xSubController; + + if (IsMainViewShell()) + { + // Create uno sub controller for the main view shell. + xSubController.set( new SdUnoDrawView( *this, *GetView())); + } + + return xSubController; +} + +bool DrawViewShell::RelocateToParentWindow (vcl::Window* pParentWindow) +{ + // DrawViewShells can not be relocated to a new parent window at the + // moment, so return except when the given parent window is the + // parent window that is already in use. + return pParentWindow==GetParentWindow(); +} + +/** + * check if we have to draw a polyline + */ + +/* + Polylines are represented by macros as a sequence of: + MoveTo (x, y) + LineTo (x, y) [or BezierTo (x, y)] + LineTo (x, y) + : + There is no end command for polylines. Therefore, we have to test all + commands in the requests for LineTo (BezierTo) and we have to gather + the point-parameter. The first not-LineTo leads to the creation of the + polyline from the gathered points. +*/ + +void DrawViewShell::CheckLineTo(SfxRequest& rReq) +{ +#ifdef DBG_UTIL + if(rReq.IsAPI()) + { + if(SID_LINETO == rReq.GetSlot() || SID_BEZIERTO == rReq.GetSlot() || SID_MOVETO == rReq.GetSlot() ) + { + OSL_FAIL("DrawViewShell::CheckLineTo: slots SID_LINETO, SID_BEZIERTO, SID_MOVETO no longer supported."); + } + } +#endif + + rReq.Ignore (); +} + +/** + * Change page parameter if SID_PAGESIZE or SID_PAGEMARGIN + */ +void DrawViewShell::SetupPage (Size const &rSize, + ::tools::Long nLeft, + ::tools::Long nRight, + ::tools::Long nUpper, + ::tools::Long nLower, + bool bSize, + bool bMargin, + bool bScaleAll) +{ + sal_uInt16 nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind); + sal_uInt16 i; + + for (i = 0; i < nPageCnt; i++) + { + // first, handle all master pages + SdPage *pPage = GetDoc()->GetMasterSdPage(i, mePageKind); + + if( pPage ) + { + if( bSize ) + { + ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower); + pPage->ScaleObjects(rSize, aBorderRect, bScaleAll); + pPage->SetSize(rSize); + + } + if( bMargin ) + { + pPage->SetLeftBorder(nLeft); + pPage->SetRightBorder(nRight); + pPage->SetUpperBorder(nUpper); + pPage->SetLowerBorder(nLower); + } + + if ( mePageKind == PageKind::Standard ) + { + GetDoc()->GetMasterSdPage(i, PageKind::Notes)->CreateTitleAndLayout(); + } + + pPage->CreateTitleAndLayout(); + } + } + + nPageCnt = GetDoc()->GetSdPageCount(mePageKind); + + for (i = 0; i < nPageCnt; i++) + { + // then, handle all pages + SdPage *pPage = GetDoc()->GetSdPage(i, mePageKind); + + if( pPage ) + { + if( bSize ) + { + ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower); + pPage->ScaleObjects(rSize, aBorderRect, bScaleAll); + pPage->SetSize(rSize); + } + if( bMargin ) + { + pPage->SetLeftBorder(nLeft); + pPage->SetRightBorder(nRight); + pPage->SetUpperBorder(nUpper); + pPage->SetLowerBorder(nLower); + } + + if ( mePageKind == PageKind::Standard ) + { + SdPage* pNotesPage = GetDoc()->GetSdPage(i, PageKind::Notes); + pNotesPage->SetAutoLayout( pNotesPage->GetAutoLayout() ); + } + + pPage->SetAutoLayout( pPage->GetAutoLayout() ); + } + } + + if ( mePageKind == PageKind::Standard ) + { + SdPage* pHandoutPage = GetDoc()->GetSdPage(0, PageKind::Handout); + pHandoutPage->CreateTitleAndLayout(true); + } + + ::tools::Long nWidth = mpActualPage->GetSize().Width(); + ::tools::Long nHeight = mpActualPage->GetSize().Height(); + + Point aPageOrg(nWidth, nHeight / 2); + Size aSize( nWidth * 3, nHeight * 2); + + InitWindows(aPageOrg, aSize, Point(-1, -1), true); + + Point aVisAreaPos; + + if ( GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED ) + { + aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft(); + } + + GetView()->SetWorkArea(::tools::Rectangle(Point() - aVisAreaPos - aPageOrg, aSize)); + + UpdateScrollBars(); + + Point aNewOrigin(mpActualPage->GetLeftBorder(), mpActualPage->GetUpperBorder()); + GetView()->GetSdrPageView()->SetPageOrigin(aNewOrigin); + + GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET); + + // zoom onto (new) page size + GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); +} + +void DrawViewShell::GetStatusBarState(SfxItemSet& rSet) +{ + /* Zoom-Item + Here we should propagate the corresponding value (Optimal ?, page width + or page) with the help of the ZoomItems !!! */ + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOM ) ) + { + if (GetDocSh()->IsUIActive() || SlideShow::IsRunning(GetViewShellBase()) + || !GetActiveWindow()) + { + rSet.DisableItem( SID_ATTR_ZOOM ); + } + else + { + std::unique_ptr pZoomItem; + sal_uInt16 nZoom = static_cast(GetActiveWindow()->GetZoom()); + + if( mbZoomOnPage ) + pZoomItem.reset(new SvxZoomItem( SvxZoomType::WHOLEPAGE, nZoom )); + else + pZoomItem.reset(new SvxZoomItem( SvxZoomType::PERCENT, nZoom )); + + // constrain area + SvxZoomEnableFlags nZoomValues = SvxZoomEnableFlags::ALL; + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 ) + { + nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL; + } + + pZoomItem->SetValueSet( nZoomValues ); + rSet.Put( std::move(pZoomItem) ); + } + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) ) + { + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) ); + if (GetDocSh()->IsUIActive() || (xSlideshow.is() && xSlideshow->isRunning()) || !GetActiveWindow() ) + { + rSet.DisableItem( SID_ATTR_ZOOMSLIDER ); + } + else + { + sd::Window * pActiveWindow = GetActiveWindow(); + SvxZoomSliderItem aZoomItem( static_cast(pActiveWindow->GetZoom()), static_cast(pActiveWindow->GetMinZoom()), static_cast(pActiveWindow->GetMaxZoom()) ) ; + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + if( pPageView ) + { + Point aPagePos(0, 0); + Size aPageSize = pPageView->GetPage()->GetSize(); + + aPagePos.AdjustX(aPageSize.Width() / 2 ); + aPageSize.setWidth( static_cast<::tools::Long>(aPageSize.Width() * 1.03) ); + + aPagePos.AdjustY(aPageSize.Height() / 2 ); + aPageSize.setHeight( static_cast<::tools::Long>(aPageSize.Height() * 1.03) ); + aPagePos.AdjustY( -(aPageSize.Height() / 2) ); + + aPagePos.AdjustX( -(aPageSize.Width() / 2) ); + + ::tools::Rectangle aFullPageZoomRect( aPagePos, aPageSize ); + aZoomItem.AddSnappingPoint( pActiveWindow->GetZoomForRect( aFullPageZoomRect ) ); + } + aZoomItem.AddSnappingPoint(100); + rSet.Put( aZoomItem ); + } + } + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + if (pPageView) + { + Point aPos = GetActiveWindow()->PixelToLogic(maMousePos); + pPageView->LogicToPagePos(aPos); + Fraction aUIScale(GetDoc()->GetUIScale()); + aPos.setX( ::tools::Long(aPos.X() / aUIScale) ); + aPos.setY( ::tools::Long(aPos.Y() / aUIScale) ); + + // position- and size items + if ( mpDrawView->IsAction() ) + { + ::tools::Rectangle aRect; + mpDrawView->TakeActionRect( aRect ); + + if ( aRect.IsEmpty() ) + rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) ); + else + { + pPageView->LogicToPagePos(aRect); + aPos = aRect.TopLeft(); + aPos.setX( ::tools::Long(aPos.X() / aUIScale) ); + aPos.setY( ::tools::Long(aPos.Y() / aUIScale) ); + rSet.Put( SfxPointItem( SID_ATTR_POSITION, aPos) ); + Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() ); + aSize.setHeight( ::tools::Long(aSize.Height() / aUIScale) ); + aSize.setWidth( ::tools::Long(aSize.Width() / aUIScale) ); + rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) ); + } + } + else + { + if ( mpDrawView->AreObjectsMarked() ) + { + ::tools::Rectangle aRect = mpDrawView->GetAllMarkedRect(); + pPageView->LogicToPagePos(aRect); + + // Show the position of the selected shape(s) + Point aShapePosition (aRect.TopLeft()); + aShapePosition.setX( ::tools::Long(aShapePosition.X() / aUIScale) ); + aShapePosition.setY( ::tools::Long(aShapePosition.Y() / aUIScale) ); + rSet.Put (SfxPointItem(SID_ATTR_POSITION, aShapePosition)); + + Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() ); + aSize.setHeight( ::tools::Long(aSize.Height() / aUIScale) ); + aSize.setWidth( ::tools::Long(aSize.Width() / aUIScale) ); + rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) ); + } + else + { + rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) ); + rSet.Put( SvxSizeItem( SID_ATTR_SIZE, Size( 0, 0 ) ) ); + } + } + } + + // Display of current page and layer. + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_STATUS_PAGE ) ) + { + sal_Int32 nPageCount = sal_Int32(GetDoc()->GetSdPageCount(mePageKind)); + sal_Int32 nActivePageCount = sal_Int32(GetDoc()->GetActiveSdPageCount()); + // Always show the slide/page number. + OUString aOUString; + if (GetDoc()->GetDocumentType() == DocumentType::Draw) + aOUString = (nPageCount == nActivePageCount) ? SdResId(STR_SD_PAGE_COUNT_DRAW) : SdResId(STR_SD_PAGE_COUNT_CUSTOM_DRAW); + else + aOUString = (nPageCount == nActivePageCount) ? SdResId(STR_SD_PAGE_COUNT) : SdResId(STR_SD_PAGE_COUNT_CUSTOM); + + aOUString = aOUString.replaceFirst("%1", OUString::number(maTabControl->GetCurPagePos() + 1)); + aOUString = aOUString.replaceFirst("%2", OUString::number(nPageCount)); + if(nPageCount != nActivePageCount) + aOUString = aOUString.replaceFirst("%3", OUString::number(nActivePageCount)); + + // If in layer mode additionally show the layer that contains all + // selected shapes of the page. If the shapes are distributed on + // more than one layer, no layer name is shown. + if (IsLayerModeActive()) + { + SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin(); + SdrLayerID nLayer(0), nOldLayer(0); + SdrObject* pObj = nullptr; + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nMarkCount = rMarkList.GetMarkCount(); + bool bOneLayer = true; + + // Use the first ten selected shapes as a (hopefully + // representative) sample of all shapes of the current page. + // Detect whether they belong to the same layer. + for( size_t j = 0; j < nMarkCount && bOneLayer && j < 10; ++j ) + { + pObj = rMarkList.GetMark( j )->GetMarkedSdrObj(); + if( pObj ) + { + nLayer = pObj->GetLayer(); + + if( j != 0 && nLayer != nOldLayer ) + bOneLayer = false; + + nOldLayer = nLayer; + } + } + + // Append the layer name to the current page number. + if( bOneLayer && nMarkCount ) + { + SdrLayer* pLayer = rLayerAdmin.GetLayerPerID( nLayer ); + if( pLayer ) + { + aOUString += " (" + LayerTabBar::convertToLocalizedName(pLayer->GetName()) + ")"; + } + } + } + + rSet.Put (SfxStringItem (SID_STATUS_PAGE, aOUString)); + } + // Layout + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_STATUS_LAYOUT ) ) + { + OUString aString = mpActualPage->GetLayoutName(); + sal_Int32 nPos = aString.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aString = aString.copy(0, nPos); + rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aString ) ); + } + // Scale + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SCALE ) ) + { + const Fraction& aUIScale = GetDoc()->GetUIScale(); + OUString aString = OUString::number(aUIScale.GetNumerator()) + + ":" + OUString::number(aUIScale.GetDenominator()); + rSet.Put( SfxStringItem( SID_SCALE, aString ) ); + } +} + +void DrawViewShell::Notify (SfxBroadcaster&, const SfxHint& rHint) +{ + if (rHint.GetId()!=SfxHintId::ModeChanged) + return; + + // Change to selection when turning on read-only mode. + if(GetDocSh()->IsReadOnly() && dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) ) + { + SfxRequest aReq(SID_OBJECT_SELECT, SfxCallMode::SLOT, GetDoc()->GetItemPool()); + FuPermanent(aReq); + } + + // Turn on design mode when document is not read-only. + if (GetDocSh()->IsReadOnly() != mbReadOnly ) + { + mbReadOnly = GetDocSh()->IsReadOnly(); + + SfxBoolItem aItem( SID_FM_DESIGN_MODE, !mbReadOnly ); + GetViewFrame()->GetDispatcher()->ExecuteList(SID_FM_DESIGN_MODE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem }); + } + +} + +void DrawViewShell::ExecuteAnnotation (SfxRequest const & rRequest) +{ + if (mpAnnotationManager) + mpAnnotationManager->ExecuteAnnotation( rRequest ); +} + +void DrawViewShell::GetAnnotationState (SfxItemSet& rItemSet ) +{ + if (mpAnnotationManager) + mpAnnotationManager->GetAnnotationState( rItemSet ); +} + +OUString const & DrawViewShell::GetSidebarContextName() const +{ + svx::sidebar::SelectionAnalyzer::ViewType eViewType (svx::sidebar::SelectionAnalyzer::ViewType::Standard); + switch (mePageKind) + { + case PageKind::Handout: + eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Handout; + break; + case PageKind::Notes: + eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Notes; + break; + case PageKind::Standard: + if (meEditMode == EditMode::MasterPage) + eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Master; + else + eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Standard; + break; + } + return EnumContext::GetContextName( + svx::sidebar::SelectionAnalyzer::GetContextForSelection_SD( + mpDrawView->GetMarkedObjectList(), + eViewType)); +} + +void DrawViewShell::ExecGoToNextPage (SfxRequest& rReq) +{ + SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); +} + +void DrawViewShell::GetStateGoToNextPage (SfxItemSet& rSet) +{ + SdPage* pPage = GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + sal_uInt16 totalPages = GetDoc()->GetSdPageCount(pPage->GetPageKind()); + if (nSdPage + 1 >= totalPages) + rSet.DisableItem( SID_GO_TO_NEXT_PAGE ); +} + +void DrawViewShell::ExecGoToPreviousPage (SfxRequest& rReq) +{ + SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); +} + +void DrawViewShell::GetStateGoToPreviousPage (SfxItemSet& rSet) +{ + SdPage* pPage = GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + if (nSdPage == 0) + rSet.DisableItem( SID_GO_TO_PREVIOUS_PAGE ); +} + + +void DrawViewShell::ExecGoToFirstPage (SfxRequest& rReq) +{ + SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); +} + +void DrawViewShell::GetStateGoToFirstPage (SfxItemSet& rSet) +{ + SdPage* pPage = GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + if (nSdPage == 0) + rSet.DisableItem( SID_GO_TO_FIRST_PAGE ); +} + +void DrawViewShell::ExecGoToLastPage (SfxRequest& rReq) +{ + SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + Cancel(); +} + +void DrawViewShell::GetStateGoToLastPage (SfxItemSet& rSet) +{ + SdPage* pPage = GetActualPage(); + sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2; + sal_uInt16 totalPages = GetDoc()->GetSdPageCount(pPage->GetPageKind()); + if (nSdPage + 1 >= totalPages) + rSet.DisableItem( SID_GO_TO_LAST_PAGE ); +} + + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsb.cxx b/sd/source/ui/view/drviewsb.cxx new file mode 100644 index 0000000000..6f6bba8555 --- /dev/null +++ b/sd/source/ui/view/drviewsb.cxx @@ -0,0 +1,205 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +bool DrawViewShell::RenameSlide( sal_uInt16 nPageId, const OUString & rName ) +{ + bool bOutDummy; + if( GetDoc()->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND ) + return false; + + SdPage* pPageToRename = nullptr; + PageKind ePageKind = GetPageKind(); + + if( GetEditMode() == EditMode::Page ) + { + pPageToRename = GetDoc()->GetSdPage( maTabControl->GetPagePos(nPageId), ePageKind ); + + // Undo + SdPage* pUndoPage = pPageToRename; + SdrLayerAdmin & rLayerAdmin = GetDoc()->GetLayerAdmin(); + SdrLayerID nBackground = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID nBgObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + SdrLayerIDSet aVisibleLayers = mpActualPage->TRG_GetMasterPageVisibleLayers(); + + SfxUndoManager* pManager = GetDoc()->GetDocSh()->GetUndoManager(); + pManager->AddUndoAction( + std::make_unique( + GetDoc(), pUndoPage, rName, pUndoPage->GetAutoLayout(), + aVisibleLayers.IsSet( nBackground ), + aVisibleLayers.IsSet( nBgObj ))); + + // rename + pPageToRename->SetName( rName ); + + if( ePageKind == PageKind::Standard ) + { + // also rename notes-page + SdPage* pNotesPage = GetDoc()->GetSdPage( maTabControl->GetPagePos(nPageId), PageKind::Notes ); + pNotesPage->SetName( rName ); + } + } + else + { + // rename MasterPage -> rename LayoutTemplate + pPageToRename = GetDoc()->GetMasterSdPage( maTabControl->GetPagePos(nPageId), ePageKind ); + GetDoc()->RenameLayoutTemplate( pPageToRename->GetLayoutName(), rName ); + } + + bool bSuccess = (rName == pPageToRename->GetName()); + + if( bSuccess ) + { + // user edited page names may be changed by the page so update control + maTabControl->SetPageText( nPageId, rName ); + + // set document to modified state + GetDoc()->SetChanged(); + + // inform navigator about change + if (GetViewFrame()) + { + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_NAVIGATOR_STATE, true); + } + + // Tell the slide sorter about the name change (necessary for + // accessibility.) + slidesorter::SlideSorterViewShell* pSlideSorterViewShell + = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase()); + if (pSlideSorterViewShell != nullptr) + { + pSlideSorterViewShell->GetSlideSorter().GetController().PageNameHasChanged( + maTabControl->GetPagePos(nPageId), rName); + } + } + + return bSuccess; +} + +IMPL_LINK( DrawViewShell, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool ) +{ + OUString aNewName; + rDialog.GetName( aNewName ); + + SdPage* pCurrentPage = GetDoc()->GetSdPage( maTabControl->GetCurPagePos(), GetPageKind() ); + + return pCurrentPage && ( aNewName == pCurrentPage->GetName() || GetDocSh()->IsNewPageNameValid( aNewName ) ); +} + +void DrawViewShell::ModifyLayer ( + SdrLayer* pLayer, + const OUString& rLayerName, + const OUString& rLayerTitle, + const OUString& rLayerDesc, + bool bIsVisible, + bool bIsLocked, + bool bIsPrintable) +{ + if(!GetLayerTabControl()) // #i87182# + { + OSL_ENSURE(false, "No LayerTabBar (!)"); + return; + } + + if( !pLayer ) + return; + + const sal_uInt16 nPageCount = GetLayerTabControl()->GetPageCount(); + sal_uInt16 nCurPage = 0; + sal_uInt16 nPos; + for( nPos = 0; nPos < nPageCount; nPos++ ) + { + sal_uInt16 nId = GetLayerTabControl()->GetPageId( nPos ); + if (GetLayerTabControl()->GetLayerName(nId) == pLayer->GetName()) + { + nCurPage = nId; + break; + } + } + + pLayer->SetName( rLayerName ); + pLayer->SetTitle( rLayerTitle ); + pLayer->SetDescription( rLayerDesc ); + mpDrawView->SetLayerVisible( rLayerName, bIsVisible ); + mpDrawView->SetLayerLocked( rLayerName, bIsLocked); + mpDrawView->SetLayerPrintable(rLayerName, bIsPrintable); + + GetDoc()->SetChanged(); + + GetLayerTabControl()->SetPageText(nCurPage, rLayerName); + + // Set page bits for modified tab name display + + TabBarPageBits nBits = TabBarPageBits::NONE; + + if (!bIsVisible) + { + nBits = TabBarPageBits::Blue; + } + if (bIsLocked) + { + nBits |= TabBarPageBits::Italic; + } + if (!bIsPrintable) + { + nBits |= TabBarPageBits::Underline; + } + + // Save the bits + + GetLayerTabControl()->SetPageBits(nCurPage, nBits); + + GetViewFrame()->GetDispatcher()->Execute( + SID_SWITCHLAYER, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + + // Call Invalidate at the form shell. + FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); + if (pFormShell != nullptr) + pFormShell->Invalidate(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsc.cxx b/sd/source/ui/view/drviewsc.cxx new file mode 100644 index 0000000000..6be86e63cb --- /dev/null +++ b/sd/source/ui/view/drviewsc.cxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace sd { + +void DrawViewShell::UpdateIMapDlg( SdrObject* pObj ) +{ + if( ( dynamic_cast< SdrGrafObj *>( pObj ) == nullptr && dynamic_cast< SdrOle2Obj *>( pObj ) == nullptr ) + || mpDrawView->IsTextEdit() + || !GetViewFrame()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) ) + return; + + Graphic aGraphic; + ImageMap* pIMap = nullptr; + std::unique_ptr pTargetList; + SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo( pObj ); + + // get graphic from shape + SdrGrafObj* pGrafObj = dynamic_cast< SdrGrafObj* >( pObj ); + if( pGrafObj ) + aGraphic = pGrafObj->GetGraphic(); + + if ( pIMapInfo ) + { + pIMap = const_cast(&pIMapInfo->GetImageMap()); + pTargetList.reset(new TargetList); + SfxViewFrame::GetTargetList( *pTargetList ); + } + + SvxIMapDlgChildWindow::UpdateIMapDlg( aGraphic, pIMap, pTargetList.get(), pObj ); +} + +IMPL_LINK( DrawViewShell, NameObjectHdl, AbstractSvxObjectNameDialog&, rDialog, bool ) +{ + OUString aName; + rDialog.GetName( aName ); + return aName.isEmpty() || ( GetDoc() && !GetDoc()->GetObj( aName ) ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsd.cxx b/sd/source/ui/view/drviewsd.cxx new file mode 100644 index 0000000000..1a6bb3aee9 --- /dev/null +++ b/sd/source/ui/view/drviewsd.cxx @@ -0,0 +1,191 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace sd { + +/** + * handle SfxRequests for navigator + */ +void DrawViewShell::ExecNavigatorWin( SfxRequest& rReq ) +{ + CheckLineTo (rReq); + + sal_uInt16 nSId = rReq.GetSlot(); + + switch( nSId ) + { + case SID_NAVIGATOR_INIT: + { + SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( SID_NAVIGATOR ); + if( pWindow ) + { + SdNavigatorFloat* pNavWin = static_cast(pWindow->GetWindow()); + if( pNavWin ) + pNavWin->InitTreeLB( GetDoc() ); + } + } + break; + + case SID_NAVIGATOR_PAGE: + case SID_NAVIGATOR_OBJECT: + { + if (nSId == SID_NAVIGATOR_PAGE) + { + if ( mpDrawView->IsTextEdit() ) + mpDrawView->SdrEndTextEdit(); + + const SfxItemSet* pArgs = rReq.GetArgs(); + PageJump eJump = static_cast( pArgs->Get(SID_NAVIGATOR_PAGE).GetValue() ); + + switch (eJump) + { + case PAGE_FIRST: + { + // jump to first page + SwitchPage(0); + } + break; + + case PAGE_LAST: + { + // jump to last page + SwitchPage(GetDoc()->GetSdPageCount(mpActualPage->GetPageKind()) - 1); + } + break; + + case PAGE_NEXT: + { + // jump to next page + sal_uInt16 nSdPage = (mpActualPage->GetPageNum() - 1) / 2; + + if (nSdPage < GetDoc()->GetSdPageCount(mpActualPage->GetPageKind()) - 1) + { + SwitchPage(nSdPage + 1); + } + } + break; + + case PAGE_PREVIOUS: + { + // jump to previous page + sal_uInt16 nSdPage = (mpActualPage->GetPageNum() - 1) / 2; + + if (nSdPage > 0) + { + SwitchPage(nSdPage - 1); + } + } + break; + + case PAGE_NONE: + break; + } + } + else if (nSId == SID_NAVIGATOR_OBJECT) + { + OUString aBookmarkStr("#"); + const SfxItemSet* pArgs = rReq.GetArgs(); + OUString aTarget = pArgs->Get(SID_NAVIGATOR_OBJECT).GetValue(); + aBookmarkStr += aTarget; + SfxStringItem aStrItem(SID_FILE_NAME, aBookmarkStr); + SfxStringItem aReferer(SID_REFERER, GetDocSh()->GetMedium()->GetName()); + SfxViewFrame* pFrame = GetViewFrame(); + SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); + SfxBoolItem aBrowseItem(SID_BROWSE, true); + pFrame->GetDispatcher()-> + ExecuteList(SID_OPENDOC, SfxCallMode::SYNCHRON | SfxCallMode::RECORD, + { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer }); + } + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_NAVIGATOR_STATE ); + rBindings.Invalidate( SID_NAVIGATOR_PAGENAME ); + } + break; + + default: + break; + } +} + +void DrawViewShell::GetNavigatorWinState( SfxItemSet& rSet ) +{ + NavState nState = NavState::NONE; + sal_uInt16 nCurrentPage = 0; + sal_uInt16 nLastPage; + OUString aPageName; + + nState |= NavState::TableUpdate; + + if (mpActualPage != nullptr) + { + nCurrentPage = ( mpActualPage->GetPageNum() - 1 ) / 2; + aPageName = mpActualPage->GetName(); + } + nLastPage = GetDoc()->GetSdPageCount( mePageKind ) - 1; + + + // first page / previous page + if( nCurrentPage == 0 ) + { + nState |= NavState::BtnFirstDisabled | NavState::BtnPrevDisabled; + } + else + { + nState |= NavState::BtnFirstEnabled | NavState::BtnPrevEnabled; + } + + // last page / next page + if( nCurrentPage == nLastPage ) + { + nState |= NavState::BtnLastDisabled | NavState::BtnNextDisabled; + } + else + { + nState |= NavState::BtnLastEnabled | NavState::BtnNextEnabled; + } + + rSet.Put( SfxUInt32Item( SID_NAVIGATOR_STATE, static_cast(nState) ) ); + rSet.Put( SfxStringItem( SID_NAVIGATOR_PAGENAME, aPageName ) ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx new file mode 100644 index 0000000000..0b293773b0 --- /dev/null +++ b/sd/source/ui/view/drviewse.cxx @@ -0,0 +1,1719 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::beans; + +namespace sd { + +// Permanent Functions + +static void ImpAddPrintableCharactersToTextEdit(SfxRequest const & rReq, ::sd::View* pView) +{ + // evtl. feed characters to activated textedit + const SfxItemSet* pSet = rReq.GetArgs(); + + if(!pSet) + return; + + OUString aInputString; + + if(SfxItemState::SET == pSet->GetItemState(SID_ATTR_CHAR)) + aInputString = pSet->Get(SID_ATTR_CHAR).GetValue(); + + if(aInputString.isEmpty()) + return; + + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + if(pOLV) + { + for(sal_Int32 a(0); a < aInputString.getLength(); a++) + { + vcl::KeyCode aKeyCode; + // tdf#38669 - create the key event using a Unicode character + KeyEvent aKeyEvent(aInputString[a], aKeyCode); + + // add actual character + pOLV->PostKeyEvent(aKeyEvent); + } + } +} + +void DrawViewShell::FuPermanent(SfxRequest& rReq) +{ + // We do not execute a thing during a native slide show + + if (SlideShow::IsRunning(GetViewShellBase())) + return; + + sal_uInt16 nSId = rReq.GetSlot(); + + if( HasCurrentFunction() && + ( nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE || + nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ) ) + { + rtl::Reference xFunc( GetCurrentFunction() ); + + FuText* pFuText = dynamic_cast< FuText* >( xFunc.get() ); + + if( pFuText ) + { + pFuText->SetPermanent(true); + xFunc->ReceiveRequest( rReq ); + + Invalidate(); + + // evtl. feed characters to activated textedit + if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit()) + ImpAddPrintableCharactersToTextEdit(rReq, GetView()); + + rReq.Done(); + return; + } + } + + CheckLineTo (rReq); + sal_uInt16 nOldSId = 0; + bool bPermanent = false; + + if( !mpDrawView ) + return; + + if(HasCurrentFunction()) + { + if( (nSId == SID_FORMATPAINTBRUSH) && (GetCurrentFunction()->GetSlotID() == SID_TEXTEDIT) ) + { + // save text edit mode for format paintbrush! + SetOldFunction( GetCurrentFunction() ); + } + else + { + if(GetOldFunction() == GetCurrentFunction()) + { + SetOldFunction(nullptr); + } + } + + if ( nSId != SID_TEXTEDIT && nSId != SID_ATTR_CHAR && nSId != SID_TEXT_FITTOSIZE && + nSId != SID_ATTR_CHAR_VERTICAL && nSId != SID_TEXT_FITTOSIZE_VERTICAL && + nSId != SID_FORMATPAINTBRUSH && + mpDrawView->IsTextEdit() ) + { + mpDrawView->SdrEndTextEdit(); + } + + if( HasCurrentFunction() ) + { + nOldSId = GetCurrentFunction()->GetSlotID(); + + if (nOldSId == nSId || + ((nOldSId == SID_TEXTEDIT || nOldSId == SID_ATTR_CHAR || nOldSId == SID_TEXT_FITTOSIZE || + nOldSId == SID_ATTR_CHAR_VERTICAL || nOldSId == SID_TEXT_FITTOSIZE_VERTICAL) && + (nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE || + nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ))) + { + bPermanent = true; + } + + GetCurrentFunction()->Deactivate(); + } + + SetCurrentFunction(nullptr); + + SfxBindings& rBind = GetViewFrame()->GetBindings(); + rBind.Invalidate(nOldSId); + rBind.Update(nOldSId); + } + + // for LibreOfficeKit - choosing a shape should construct it directly + bool bCreateDirectly = false; + + switch ( nSId ) + { + case SID_TEXTEDIT: // BASIC ??? + case SID_ATTR_CHAR: + case SID_ATTR_CHAR_VERTICAL: + case SID_TEXT_FITTOSIZE: + case SID_TEXT_FITTOSIZE_VERTICAL: + { + SetCurrentFunction( FuText::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + GetCurrentFunction()->DoExecute(rReq); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_ATTR_CHAR ); + rBindings.Invalidate( SID_ATTR_CHAR_VERTICAL ); + rBindings.Invalidate( SID_TEXT_FITTOSIZE ); + rBindings.Invalidate( SID_TEXT_FITTOSIZE_VERTICAL ); + + // evtl. feed characters to activated textedit + if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit()) + ImpAddPrintableCharactersToTextEdit(rReq, GetView()); + + rReq.Done(); + + const SfxItemSet* pArgs = rReq.GetArgs(); + if (pArgs && pArgs->HasItem(FN_PARAM_1)) + bCreateDirectly = static_cast(pArgs->Get(FN_PARAM_1)).GetValue(); + } + break; + + case SID_FM_CREATE_CONTROL: + { + SetCurrentFunction( FuConstructUnoControl::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) ); + rReq.Done(); + } + break; + + case SID_FM_CREATE_FIELDCONTROL: + { + const SfxUnoAnyItem* pDescriptorItem = rReq.GetArg(SID_FM_DATACCESS_DESCRIPTOR); + DBG_ASSERT( pDescriptorItem, "DrawViewShell::FuPermanent(SID_FM_CREATE_FIELDCONTROL): invalid request args!" ); + + if(pDescriptorItem) + { + // get the form view + FmFormView* pFormView = mpDrawView.get(); + SdrPageView* pPageView = pFormView ? pFormView->GetSdrPageView() : nullptr; + + if(pPageView) + { + svx::ODataAccessDescriptor aDescriptor(pDescriptorItem->GetValue()); + rtl::Reference pNewDBField = pFormView->CreateFieldControl(aDescriptor); + + if(pNewDBField) + { + ::tools::Rectangle aVisArea = GetActiveWindow()->PixelToLogic(::tools::Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel())); + Point aObjPos(aVisArea.Center()); + Size aObjSize(pNewDBField->GetLogicRect().GetSize()); + aObjPos.AdjustX( -(aObjSize.Width() / 2) ); + aObjPos.AdjustY( -(aObjSize.Height() / 2) ); + ::tools::Rectangle aNewObjectRectangle(aObjPos, aObjSize); + + pNewDBField->SetLogicRect(aNewObjectRectangle); + + GetView()->InsertObjectAtView(pNewDBField.get(), *pPageView); + } + } + } + rReq.Done(); + } + break; + + case SID_OBJECT_SELECT: + case SID_OBJECT_ROTATE: + case SID_OBJECT_MIRROR: + case SID_OBJECT_CROP: + case SID_OBJECT_TRANSPARENCE: + case SID_OBJECT_GRADIENT: + case SID_OBJECT_SHEAR: + case SID_OBJECT_CROOK_ROTATE: + case SID_OBJECT_CROOK_SLANT: + case SID_OBJECT_CROOK_STRETCH: + case SID_CONVERT_TO_3D_LATHE: + { + sal_uInt16 nSlotId = rReq.GetSlot(); + + // toggle function + if( nOldSId == nSlotId ) + { + nSlotId = SID_OBJECT_SELECT; + rReq.SetSlot( nSlotId ); + } + + if (nSlotId == SID_OBJECT_CROOK_ROTATE || + nSlotId == SID_OBJECT_CROOK_SLANT || + nSlotId == SID_OBJECT_CROOK_STRETCH) + { + if ( mpDrawView->GetMarkedObjectList().GetMarkCount() > 0 && + !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) ) + { + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + std::unique_ptr xQueryBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Question, VclButtonsType::YesNo, + SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER))); + if (xQueryBox->run() == RET_YES ) + { + // implicit transformation into bezier + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->ConvertMarkedToPathObj(false); + } + } + } + } + else if (nSlotId == SID_OBJECT_SHEAR) + { + size_t i = 0; + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nMarkCnt = rMarkList.GetMarkCount(); + bool b3DObjMarked = false; + + while (i < nMarkCnt && !b3DObjMarked) + { + if (DynCastE3dObject( rMarkList.GetMark(i)->GetMarkedSdrObj() )) + { + b3DObjMarked = true; + } + else + { + i++; + } + } + + if ( nMarkCnt > 0 && !b3DObjMarked && + (!mpDrawView->IsShearAllowed() || !mpDrawView->IsDistortAllowed()) ) + { + if ( mpDrawView->IsPresObjSelected() ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + std::unique_ptr xQueryBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Question, VclButtonsType::YesNo, + SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER))); + if (xQueryBox->run() == RET_YES) + { + // implicit transformation into bezier + weld::WaitObject aWait(GetFrameWeld()); + mpDrawView->ConvertMarkedToPathObj(false); + } + } + } + } + + SetCurrentFunction( FuSelection::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) ); + rReq.Done(); + Invalidate( SID_OBJECT_SELECT ); + } + break; + + case SID_DRAW_LINE: + case SID_DRAW_XLINE: + case SID_DRAW_MEASURELINE: + case SID_LINE_ARROW_START: + case SID_LINE_ARROW_END: + case SID_LINE_ARROWS: + case SID_LINE_ARROW_CIRCLE: + case SID_LINE_CIRCLE_ARROW: + case SID_LINE_ARROW_SQUARE: + case SID_LINE_SQUARE_ARROW: + + case SID_DRAW_RECT: + case SID_DRAW_RECT_NOFILL: + case SID_DRAW_RECT_ROUND: + case SID_DRAW_RECT_ROUND_NOFILL: + case SID_DRAW_SQUARE: + case SID_DRAW_SQUARE_NOFILL: + case SID_DRAW_SQUARE_ROUND: + case SID_DRAW_SQUARE_ROUND_NOFILL: + case SID_DRAW_ELLIPSE: + case SID_DRAW_ELLIPSE_NOFILL: + case SID_DRAW_CIRCLE: + case SID_DRAW_CIRCLE_NOFILL: + case SID_DRAW_CAPTION: + case SID_DRAW_CAPTION_VERTICAL: + case SID_TOOL_CONNECTOR: + case SID_CONNECTOR_ARROW_START: + case SID_CONNECTOR_ARROW_END: + case SID_CONNECTOR_ARROWS: + case SID_CONNECTOR_CIRCLE_START: + case SID_CONNECTOR_CIRCLE_END: + case SID_CONNECTOR_CIRCLES: + case SID_CONNECTOR_LINE: + case SID_CONNECTOR_LINE_ARROW_START: + case SID_CONNECTOR_LINE_ARROW_END: + case SID_CONNECTOR_LINE_ARROWS: + case SID_CONNECTOR_LINE_CIRCLE_START: + case SID_CONNECTOR_LINE_CIRCLE_END: + case SID_CONNECTOR_LINE_CIRCLES: + case SID_CONNECTOR_CURVE: + case SID_CONNECTOR_CURVE_ARROW_START: + case SID_CONNECTOR_CURVE_ARROW_END: + case SID_CONNECTOR_CURVE_ARROWS: + case SID_CONNECTOR_CURVE_CIRCLE_START: + case SID_CONNECTOR_CURVE_CIRCLE_END: + case SID_CONNECTOR_CURVE_CIRCLES: + case SID_CONNECTOR_LINES: + case SID_CONNECTOR_LINES_ARROW_START: + case SID_CONNECTOR_LINES_ARROW_END: + case SID_CONNECTOR_LINES_ARROWS: + case SID_CONNECTOR_LINES_CIRCLE_START: + case SID_CONNECTOR_LINES_CIRCLE_END: + case SID_CONNECTOR_LINES_CIRCLES: + case SID_INSERT_SIGNATURELINE: + { + bCreateDirectly = comphelper::LibreOfficeKit::isActive(); + SetCurrentFunction( FuConstructRectangle::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) ); + rReq.Done(); + } + break; + case SID_DRAW_POLYGON: + case SID_DRAW_POLYGON_NOFILL: + case SID_DRAW_XPOLYGON: + case SID_DRAW_XPOLYGON_NOFILL: + case SID_DRAW_FREELINE: + case SID_DRAW_FREELINE_NOFILL: + case SID_DRAW_BEZIER_FILL: // BASIC + case SID_DRAW_BEZIER_NOFILL: // BASIC + { + SetCurrentFunction( FuConstructBezierPolygon::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent) ); + rReq.Done(); + } + break; + + case SID_GLUE_EDITMODE: + { + if (nOldSId != SID_GLUE_EDITMODE) + { + SetCurrentFunction( FuEditGluePoints::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) ); + } + else + { + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + + rReq.Done(); + } + break; + + case SID_DRAW_ARC: + case SID_DRAW_CIRCLEARC: + case SID_DRAW_PIE: + case SID_DRAW_PIE_NOFILL: + case SID_DRAW_CIRCLEPIE: + case SID_DRAW_CIRCLEPIE_NOFILL: + case SID_DRAW_ELLIPSECUT: + case SID_DRAW_ELLIPSECUT_NOFILL: + case SID_DRAW_CIRCLECUT: + case SID_DRAW_CIRCLECUT_NOFILL: + { + SetCurrentFunction( FuConstructArc::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent) ); + rReq.Done(); + } + break; + + case SID_3D_CUBE: + case SID_3D_SHELL: + case SID_3D_SPHERE: + case SID_3D_TORUS: + case SID_3D_HALF_SPHERE: + case SID_3D_CYLINDER: + case SID_3D_CONE: + case SID_3D_PYRAMID: + { + SetCurrentFunction( FuConstruct3dObject::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) ); + rReq.Done(); + } + break; + + case SID_DRAWTBX_CS_BASIC : + case SID_DRAWTBX_CS_SYMBOL : + case SID_DRAWTBX_CS_ARROW : + case SID_DRAWTBX_CS_FLOWCHART : + case SID_DRAWTBX_CS_CALLOUT : + case SID_DRAWTBX_CS_STAR : + case SID_DRAW_CS_ID : + { + SetCurrentFunction( FuConstructCustomShape::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) ); + rReq.Done(); + + bCreateDirectly = comphelper::LibreOfficeKit::isActive(); + const SfxItemSet* pArgs = rReq.GetArgs(); + if (pArgs && pArgs->HasItem(FN_PARAM_1)) + { + bCreateDirectly = static_cast(pArgs->Get(FN_PARAM_1)).GetValue(); + } + + if ( nSId != SID_DRAW_CS_ID ) + { + SfxBindings& rBind = GetViewFrame()->GetBindings(); + rBind.Invalidate( nSId ); + rBind.Update( nSId ); + } + } + break; + + case SID_FORMATPAINTBRUSH: + { + SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + rReq.Done(); + SfxBindings& rBind = GetViewFrame()->GetBindings(); + rBind.Invalidate( nSId ); + rBind.Update( nSId ); + break; + } + + case SID_ZOOM_MODE: + case SID_ZOOM_PANNING: + { + if (nOldSId != nSId) + { + mbZoomOnPage = false; + SetCurrentFunction( FuZoom::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) ); + } + else + { + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + } + rReq.Done(); + } + break; + + default: + break; + } + + if(HasOldFunction()) + { + sal_uInt16 nSlotId = GetOldFunction()->GetSlotID(); + + GetOldFunction()->Deactivate(); + SetOldFunction(nullptr); + + SfxBindings& rBind = GetViewFrame()->GetBindings(); + rBind.Invalidate( nSlotId ); + rBind.Update( nSlotId ); + } + + if(HasCurrentFunction()) + { + GetCurrentFunction()->Activate(); + SetOldFunction( GetCurrentFunction() ); + } + + // invalidate shell, is faster than every individually (says MI) + // now explicit the last slot incl. Update() + Invalidate(); + + // CTRL-SID_OBJECT_SELECT -> select first draw object if none is selected yet + if(SID_OBJECT_SELECT == nSId && HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1)) + { + if(!GetView()->AreObjectsMarked()) + { + // select first object + GetView()->UnmarkAllObj(); + GetView()->MarkNextObj(true); + + // ...and make it visible + if(GetView()->AreObjectsMarked()) + GetView()->MakeVisible(GetView()->GetAllMarkedRect(), *GetActiveWindow()); + } + } + + // with qualifier construct directly + if(!(HasCurrentFunction() && ((rReq.GetModifier() & KEY_MOD1) || bCreateDirectly))) + return; + + // disable interactive drawing for LOK + if (bCreateDirectly) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + // get SdOptions + SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType()); + sal_uInt32 nDefaultObjectSizeWidth(pOptions->GetDefaultObjectSizeWidth()); + sal_uInt32 nDefaultObjectSizeHeight(pOptions->GetDefaultObjectSizeHeight()); + + // calc position and size + ::tools::Rectangle aVisArea = GetActiveWindow()->PixelToLogic(::tools::Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel())); + if (comphelper::LibreOfficeKit::isActive()) + { + // aVisArea is nonsensical in the LOK case, use the slide size + aVisArea = ::tools::Rectangle(Point(), getCurrentPage()->GetSize()); + } + + Point aPagePos = aVisArea.Center(); + aPagePos.AdjustX( -sal_Int32(nDefaultObjectSizeWidth / 2) ); + aPagePos.AdjustY( -sal_Int32(nDefaultObjectSizeHeight / 2) ); + ::tools::Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight)); + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if(!pPageView) + return; + + // create the default object + rtl::Reference pObj = GetCurrentFunction()->CreateDefaultObject(nSId, aNewObjectRectangle); + + if(!pObj) + return; + + auto pObjTmp = pObj.get(); + // insert into page + GetView()->InsertObjectAtView(pObj.get(), *pPageView); + + // Now that pFuActual has done what it was created for we + // can switch on the edit mode for callout objects. + switch (nSId) + { + case SID_DRAW_CAPTION: + case SID_DRAW_CAPTION_VERTICAL: + { + // Make FuText the current function. + SfxUInt16Item aItem (SID_TEXTEDIT, 1); + GetViewFrame()->GetDispatcher()-> + ExecuteList(SID_TEXTEDIT, SfxCallMode::SYNCHRON | + SfxCallMode::RECORD, { &aItem }); + // Put text object into edit mode. + GetView()->SdrBeginTextEdit(static_cast(pObjTmp), pPageView); + break; + } + } +} + +void DrawViewShell::FuDeleteSelectedObjects() +{ + if( !mpDrawView ) + return; + + bool bConsumed = false; + + //if any placeholders are selected + if (mpDrawView->IsPresObjSelected(false)) + { + //If there are placeholders in the list which can be toggled + //off in edit->master->master elements then do that here, + std::vector aPresMarksToRemove; + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + for (size_t i=0; i < rMarkList.GetMarkCount(); ++i) + { + SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); + SdPage* pPage = static_cast(pObj->getSdrPageFromSdrObject()); + PresObjKind eKind = pPage->GetPresObjKind(pObj); + if (eKind == PresObjKind::Footer || eKind == PresObjKind::Header || + eKind == PresObjKind::DateTime || eKind == PresObjKind::SlideNumber) + { + aPresMarksToRemove.push_back(pObj); + } + } + + for (SdrObject* pObj : aPresMarksToRemove) + { + //Unmark object + mpDrawView->MarkObj(pObj, mpDrawView->GetSdrPageView(), true); + SdPage* pPage = static_cast(pObj->getSdrPageFromSdrObject()); + //remove placeholder from master page + pPage->DestroyDefaultPresObj(pPage->GetPresObjKind(pObj)); + } + + bConsumed = true; + } + + // placeholders which cannot be deleted selected + if (mpDrawView->IsPresObjSelected(false, true, false, true)) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + bConsumed = true; + } + + if (bConsumed) + return; + + vcl::KeyCode aKCode(KEY_DELETE); + KeyEvent aKEvt( 0, aKCode); + + bConsumed = mpDrawView->getSmartTags().KeyInput( aKEvt ); + + if (!bConsumed && HasCurrentFunction()) + bConsumed = GetCurrentFunction()->KeyInput(aKEvt); + + if (!bConsumed) + mpDrawView->DeleteMarked(); +} + +void DrawViewShell::FuSupport(SfxRequest& rReq) +{ + if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs()) + GetDocSh()->SetStyleFamily(static_cast(rReq.GetArgs()->Get( SID_STYLE_FAMILY ).GetValue())); + + // We do not execute a thing during a native slide show + if(SlideShow::IsRunning(GetViewShellBase()) && + (rReq.GetSlot() != SID_PRESENTATION_END && + rReq.GetSlot() != SID_SIZE_PAGE)) + return; + + CheckLineTo (rReq); + + if( !mpDrawView ) + return; + + sal_uInt16 nSId = rReq.GetSlot(); + + switch ( nSId ) + { + case SID_CLEAR_UNDO_STACK: + { + GetDocSh()->ClearUndoBuffer(); + rReq.Ignore (); + } + break; + + case SID_PRESENTATION: + case SID_PRESENTATION_CURRENT_SLIDE: + case SID_REHEARSE_TIMINGS: + { + slideshowhelp::ShowSlideShow(rReq, *GetDoc()); + rReq.Ignore (); + } + break; + + case SID_PRESENTATION_END: + { + StopSlideShow(); + + rReq.Ignore (); + } + break; + + case SID_BEZIER_EDIT: + { + mpDrawView->SetFrameDragSingles(!mpDrawView->IsFrameDragSingles()); + + /****************************************************************** + * turn ObjectBar on + ******************************************************************/ + if( dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) || dynamic_cast< FuConstructBezierPolygon* >( GetCurrentFunction().get() ) ) + { + // Tell the tool bar manager about the context change. + GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView); + } + + Invalidate(SID_BEZIER_EDIT); + rReq.Ignore(); + } + break; + + case SID_OBJECT_CLOSE: + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + if ( rMarkList.GetMark(0) && !mpDrawView->IsAction() ) + { + SdrPathObj* pPathObj = static_cast( rMarkList.GetMark(0)->GetMarkedSdrObj()); + const bool bUndo = mpDrawView->IsUndoEnabled(); + if( bUndo ) + mpDrawView->BegUndo(SdResId(STR_UNDO_BEZCLOSE)); + + mpDrawView->UnmarkAllPoints(); + + if( bUndo ) + mpDrawView->AddUndo(std::make_unique(*pPathObj)); + + pPathObj->ToggleClosed(); + + if( bUndo ) + mpDrawView->EndUndo(); + } + rReq.Done(); + } + break; + + case SID_CUT: + { + if ( mpDrawView->IsPresObjSelected(false, true, false, true) ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + //tdf#126197: EndTextEdit in all views if current one is not in TextEdit + if ( !mpDrawView->IsTextEdit() ) + mpDrawView->EndTextEditAllViews(); + + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoCut(); + } + else if(mpDrawView) + { + mpDrawView->DoCut(); + } + } + rReq.Ignore (); + } + break; + + case SID_COPY: + { + if ( mpDrawView->IsPresObjSelected(false, true, false, true) ) + { + std::unique_ptr xInfoBox(Application::CreateMessageDialog(GetFrameWeld(), + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + else + { + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoCopy(); + } + else if( mpDrawView ) + { + mpDrawView->DoCopy(); + } + } + rReq.Ignore (); + } + break; + + case SID_PASTE: + { + weld::WaitObject aWait(GetFrameWeld()); + + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoPaste(); + } + else if(mpDrawView) + { + mpDrawView->DoPaste(); + } + + rReq.Ignore (); + } + break; + + case SID_UNICODE_NOTATION_TOGGLE: + { + if( mpDrawView->IsTextEdit() ) + { + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + if( pOLV ) + { + OUString sInput = pOLV->GetSurroundingText(); + ESelection aSel( pOLV->GetSelection() ); + if( aSel.nStartPos > aSel.nEndPos ) + aSel.nEndPos = aSel.nStartPos; + + //calculate a valid end-position by reading logical characters + sal_Int32 nUtf16Pos=0; + while( (nUtf16Pos < sInput.getLength()) && (nUtf16Pos < aSel.nEndPos) ) + { + sInput.iterateCodePoints(&nUtf16Pos); + //The mouse can set the cursor in the middle of a multi-unit character, + // so reset to the proper end of the logical characters + if( nUtf16Pos > aSel.nEndPos ) + aSel.nEndPos = nUtf16Pos; + } + + ToggleUnicodeCodepoint aToggle; + while( nUtf16Pos && aToggle.AllowMoreInput( sInput[nUtf16Pos-1]) ) + --nUtf16Pos; + OUString sReplacement = aToggle.ReplacementString(); + if( !sReplacement.isEmpty() ) + { + OUString sStringToReplace = aToggle.StringToReplace(); + mpDrawView->BegUndo(sStringToReplace +"->"+ sReplacement); + aSel.nStartPos = aSel.nEndPos - sStringToReplace.getLength(); + pOLV->SetSelection( aSel ); + pOLV->InsertText(sReplacement, true); + mpDrawView->EndUndo(); + } + } + } + } + break; + + case SID_PASTE_UNFORMATTED: + { + weld::WaitObject aWait(GetFrameWeld()); + + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoPasteUnformatted(); + } + else if(mpDrawView) + { + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) ); + if (aDataHelper.GetTransferable().is()) + { + sal_Int8 nAction = DND_ACTION_COPY; + mpDrawView->InsertData( aDataHelper, + GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ), + nAction, false, SotClipboardFormatId::STRING); + } + } + + rReq.Ignore (); + } + break; + + case SID_CLIPBOARD_FORMAT_ITEMS: + { + weld::WaitObject aWait(GetFrameWeld()); + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) ); + const SfxItemSet* pReqArgs = rReq.GetArgs(); + SotClipboardFormatId nFormat = SotClipboardFormatId::NONE; + + if( pReqArgs ) + { + const SfxUInt32Item* pIsActive = rReq.GetArg(SID_CLIPBOARD_FORMAT_ITEMS); + nFormat = static_cast(pIsActive->GetValue()); + } + + if( nFormat != SotClipboardFormatId::NONE && aDataHelper.GetTransferable().is() ) + { + sal_Int8 nAction = DND_ACTION_COPY; + + if( !mpDrawView->InsertData( aDataHelper, + GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ), + nAction, false, nFormat ) ) + { + INetBookmark aINetBookmark( "", "" ); + + if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) + { + InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" ); + } + } + } + } + break; + + case SID_DELETE: + { + if ( mpDrawView->IsTextEdit() ) + { + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + + if (pOLV) + { + vcl::KeyCode aKCode(KEY_DELETE); + KeyEvent aKEvt( 0, aKCode); + // We use SdrObjEditView to handle DEL for underflow handling + (void)mpDrawView->KeyInput(aKEvt, nullptr); + } + } + else + { + mpDrawView->EndTextEditAllViews(); + FuDeleteSelectedObjects(); + } + rReq.Ignore (); + } + break; + + case SID_NOTES_MODE: + case SID_SLIDE_MASTER_MODE: + case SID_NOTES_MASTER_MODE: + case SID_HANDOUT_MASTER_MODE: + + // AutoLayouts have to be ready. + GetDoc()->StopWorkStartupDelay(); + [[fallthrough]]; + + case SID_DRAWINGMODE: + case SID_SLIDE_SORTER_MODE: + case SID_OUTLINE_MODE: + // Let the sub-shell manager handle the slot handling. + framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot( + nSId, + rReq); + rReq.Ignore (); + break; + + case SID_MASTERPAGE: // BASIC + { + if (comphelper::LibreOfficeKit::isActive()) + GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + ".uno:SlideMasterPage=true"_ostr); + + // AutoLayouts needs to be finished + GetDoc()->StopWorkStartupDelay(); + + const SfxItemSet* pReqArgs = rReq.GetArgs(); + + if ( pReqArgs ) + { + const SfxBoolItem* pIsActive = rReq.GetArg(SID_MASTERPAGE); + mbIsLayerModeActive = pIsActive->GetValue (); + } + + Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); + + // turn on default layer of MasterPage + mpDrawView->SetActiveLayer(sUNO_LayerName_background_objects); + + ChangeEditMode(EditMode::MasterPage, mbIsLayerModeActive); + + if(HasCurrentFunction(SID_BEZIER_EDIT)) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); + + Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); + + InvalidateWindows(); + Invalidate(); + + rReq.Done(); + } + break; + + case SID_CLOSE_MASTER_VIEW: + { + // Notify of disabling master view, which is enabled in DrawViewShell::ChangeEditMode. + if (comphelper::LibreOfficeKit::isActive()) + GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + ".uno:SlideMasterPage=false"_ostr); + + Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); + + // Switch page back to the first one. Not doing so leads to a + // crash. This seems to be some bug in the edit mode switching + // and page switching methods. + SwitchPage (0); + ChangeEditMode(EditMode::Page, IsLayerModeActive()); + Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); + + if(HasCurrentFunction(SID_BEZIER_EDIT)) + { + GetViewFrame()->GetDispatcher()->Execute( + SID_OBJECT_SELECT, + SfxCallMode::ASYNCHRON); + } + + rReq.Done(); + } + break; + + case SID_RULER: + { + const SfxItemSet* pReqArgs = rReq.GetArgs(); + + // Remember old ruler state + bool bOldHasRuler(HasRuler()); + + if ( pReqArgs ) + { + const SfxBoolItem* pIsActive = rReq.GetArg(SID_RULER); + SetRuler (pIsActive->GetValue ()); + } + else SetRuler (!HasRuler()); + + // Did ruler state change? Tell that to SdOptions, too. + bool bHasRuler(HasRuler()); + + if(bOldHasRuler != bHasRuler) + { + SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType()); + + if(pOptions && pOptions->IsRulerVisible() != bHasRuler) + { + pOptions->SetRulerVisible(bHasRuler); + } + } + + Invalidate (SID_RULER); + Resize(); + rReq.Done (); + } + break; + + case SID_SIZE_PAGE: + case SID_SIZE_PAGE_WIDTH: // BASIC + { + mbZoomOnPage = ( rReq.GetSlot() == SID_SIZE_PAGE ); + + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if ( pPageView ) + { + Point aPagePos(0, 0); // = pPageView->GetOffset(); + Size aPageSize = pPageView->GetPage()->GetSize(); + + aPagePos.AdjustX(aPageSize.Width() / 2 ); + aPageSize.setWidth( static_cast<::tools::Long>(aPageSize.Width() * 1.03) ); + + if( rReq.GetSlot() == SID_SIZE_PAGE ) + { + aPagePos.AdjustY(aPageSize.Height() / 2 ); + aPageSize.setHeight( static_cast<::tools::Long>(aPageSize.Height() * 1.03) ); + aPagePos.AdjustY( -(aPageSize.Height() / 2) ); + } + else + { + Point aPt = GetActiveWindow()->PixelToLogic( Point( 0, GetActiveWindow()->GetSizePixel().Height() / 2 ) ); + aPagePos.AdjustY(aPt.Y() ); + aPageSize.setHeight( 2 ); + } + + aPagePos.AdjustX( -(aPageSize.Width() / 2) ); + + SetZoomRect( ::tools::Rectangle( aPagePos, aPageSize ) ); + + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + } + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ZOOM_OUT ); + Invalidate( SID_ZOOM_PANNING ); + rReq.Done (); + } + break; + + case SID_SIZE_REAL: // BASIC + { + mbZoomOnPage = false; + SetZoom( 100 ); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ZOOM_OUT ); + Invalidate( SID_ZOOM_PANNING ); + rReq.Done (); + } + break; + + case SID_ZOOM_OUT: // BASIC + { + const sal_uInt16 nOldZoom = GetActiveWindow()->GetZoom(); + const sal_uInt16 nNewZoom = basegfx::zoomtools::zoomOut(nOldZoom); + SetZoom(nNewZoom); + + mbZoomOnPage = false; + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ZOOM_OUT ); + Invalidate( SID_ZOOM_PANNING ); + rReq.Done (); + } + break; + + case SID_ZOOM_IN: + { + const sal_uInt16 nOldZoom = GetActiveWindow()->GetZoom(); + const sal_uInt16 nNewZoom = basegfx::zoomtools::zoomIn(nOldZoom); + SetZoom(nNewZoom); + + mbZoomOnPage = false; + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + Invalidate( SID_ZOOM_IN ); + Invalidate(SID_ZOOM_OUT); + Invalidate( SID_ZOOM_PANNING ); + rReq.Done (); + } + break; + + case SID_SIZE_VISAREA: + { + ::tools::Rectangle aVisArea = mpFrameView->GetVisArea(); + Size aVisAreaSize = aVisArea.GetSize(); + + if (!aVisAreaSize.IsEmpty()) + { + mbZoomOnPage = false; + SetZoomRect(aVisArea); + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ZOOM_OUT ); + Invalidate( SID_ZOOM_PANNING ); + } + rReq.Done (); + } + break; + + // name confusion: SID_SIZE_OPTIMAL -> Zoom onto selected objects + // --> Is offered as object zoom in program + case SID_SIZE_OPTIMAL: // BASIC + { + mbZoomOnPage = false; + if ( mpDrawView->AreObjectsMarked() ) + { + maMarkRect = mpDrawView->GetAllMarkedRect(); + ::tools::Long nW = static_cast<::tools::Long>(maMarkRect.GetWidth() * 1.03); + ::tools::Long nH = static_cast<::tools::Long>(maMarkRect.GetHeight() * 1.03); + Point aPos = maMarkRect.Center(); + aPos.AdjustX( -(nW / 2) ); + aPos.AdjustY( -(nH / 2) ); + if ( nW && nH ) + { + SetZoomRect(::tools::Rectangle(aPos, Size(nW, nH))); + + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + } + } + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ZOOM_OUT ); + Invalidate( SID_ZOOM_PANNING ); + rReq.Done (); + } + break; + + // name confusion: SID_SIZE_ALL -> Zoom onto all objects + // --> Is offered as optimal in program + case SID_SIZE_ALL: // BASIC + { + mbZoomOnPage = false; + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + + if( pPageView ) + { + ::tools::Rectangle aBoundRect( pPageView->GetObjList()->GetAllObjBoundRect() ); + + ::tools::Long nW = static_cast<::tools::Long>(aBoundRect.GetWidth() * 1.03); + ::tools::Long nH = static_cast<::tools::Long>(aBoundRect.GetHeight() * 1.03); + Point aPos = aBoundRect.Center(); + aPos.AdjustX( -(nW / 2) ); + aPos.AdjustY( -(nH / 2) ); + if ( nW && nH ) + { + SetZoomRect( ::tools::Rectangle( aPos, Size( nW, nH ) ) ); + + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + } + + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ZOOM_OUT ); + Invalidate( SID_ZOOM_PANNING ); + } + rReq.Done (); + } + break; + + case SID_ZOOM_PREV: + { + if (mpDrawView->IsTextEdit()) + { + mpDrawView->SdrEndTextEdit(); + } + + if (mpZoomList->IsPreviousPossible()) + { + // set previous ZoomRect + SetZoomRect(mpZoomList->GetPreviousZoomRect()); + } + rReq.Done (); + } + break; + + case SID_ZOOM_NEXT: + { + if (mpDrawView->IsTextEdit()) + { + mpDrawView->SdrEndTextEdit(); + } + + if (mpZoomList->IsNextPossible()) + { + // set next ZoomRect + SetZoomRect(mpZoomList->GetNextZoomRect()); + } + rReq.Done (); + } + break; + + case SID_GLUE_INSERT_POINT: + case SID_GLUE_PERCENT: + case SID_GLUE_ESCDIR: + case SID_GLUE_ESCDIR_LEFT: + case SID_GLUE_ESCDIR_RIGHT: + case SID_GLUE_ESCDIR_TOP: + case SID_GLUE_ESCDIR_BOTTOM: + case SID_GLUE_HORZALIGN_CENTER: + case SID_GLUE_HORZALIGN_LEFT: + case SID_GLUE_HORZALIGN_RIGHT: + case SID_GLUE_VERTALIGN_CENTER: + case SID_GLUE_VERTALIGN_TOP: + case SID_GLUE_VERTALIGN_BOTTOM: + { + rtl::Reference xFunc( GetCurrentFunction() ); + FuEditGluePoints* pFunc = dynamic_cast< FuEditGluePoints* >( xFunc.get() ); + + if(pFunc) + pFunc->ReceiveRequest(rReq); + + rReq.Done(); + } + break; + + case SID_AUTOSPELL_CHECK: + { + bool bOnlineSpell; + const SfxPoolItem* pItem; + + if (rReq.GetArgs()->HasItem(FN_PARAM_1, &pItem)) + bOnlineSpell = static_cast(pItem)->GetValue(); + else // Toggle + bOnlineSpell = !GetDoc()->GetOnlineSpell(); + + GetDoc()->SetOnlineSpell(bOnlineSpell); + + ::Outliner* pOL = mpDrawView->GetTextEditOutliner(); + + if (pOL) + { + EEControlBits nCntrl = pOL->GetControlWord(); + + if (bOnlineSpell) + nCntrl |= EEControlBits::ONLINESPELLING; + else + nCntrl &= ~EEControlBits::ONLINESPELLING; + + pOL->SetControlWord(nCntrl); + } + + GetActiveWindow()->Invalidate(); + rReq.Done (); + } + break; + + case SID_TRANSLITERATE_SENTENCE_CASE: + case SID_TRANSLITERATE_TITLE_CASE: + case SID_TRANSLITERATE_TOGGLE_CASE: + case SID_TRANSLITERATE_UPPER: + case SID_TRANSLITERATE_LOWER: + case SID_TRANSLITERATE_HALFWIDTH: + case SID_TRANSLITERATE_FULLWIDTH: + case SID_TRANSLITERATE_HIRAGANA: + case SID_TRANSLITERATE_KATAKANA: + { + OutlinerView* pOLV = GetView()->GetTextEditOutlinerView(); + if( pOLV ) + { + TransliterationFlags nType = TransliterationFlags::NONE; + + switch( nSId ) + { + case SID_TRANSLITERATE_SENTENCE_CASE: + nType = TransliterationFlags::SENTENCE_CASE; + break; + case SID_TRANSLITERATE_TITLE_CASE: + nType = TransliterationFlags::TITLE_CASE; + break; + case SID_TRANSLITERATE_TOGGLE_CASE: + nType = TransliterationFlags::TOGGLE_CASE; + break; + case SID_TRANSLITERATE_UPPER: + nType = TransliterationFlags::LOWERCASE_UPPERCASE; + break; + case SID_TRANSLITERATE_LOWER: + nType = TransliterationFlags::UPPERCASE_LOWERCASE; + break; + case SID_TRANSLITERATE_HALFWIDTH: + nType = TransliterationFlags::FULLWIDTH_HALFWIDTH; + break; + case SID_TRANSLITERATE_FULLWIDTH: + nType = TransliterationFlags::HALFWIDTH_FULLWIDTH; + break; + case SID_TRANSLITERATE_HIRAGANA: + nType = TransliterationFlags::KATAKANA_HIRAGANA; + break; + case SID_TRANSLITERATE_KATAKANA: + nType = TransliterationFlags::HIRAGANA_KATAKANA; + break; + } + + pOLV->TransliterateText( nType ); + } + + rReq.Done(); + } + break; + + // #UndoRedo# + case SID_UNDO : + { + // moved implementation to BaseClass + ImpSidUndo(rReq); + } + break; + case SID_REDO : + { + // moved implementation to BaseClass + ImpSidRedo(rReq); + } + break; + + default: + break; + } +} + +void DrawViewShell::FuSupportRotate(SfxRequest const &rReq) +{ + if( rReq.GetSlot() != SID_TRANSLITERATE_ROTATE_CASE ) + return; + + ::sd::View* pView = GetView(); + + if (!pView) + return; + + OutlinerView* pOLV = pView->GetTextEditOutlinerView(); + + if (!pOLV) + return; + + pOLV->TransliterateText( m_aRotateCase.getNextMode() ); +} + +void DrawViewShell::InsertURLField(const OUString& rURL, const OUString& rText, + const OUString& rTarget) +{ + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + + if (pOLV) + { + ESelection aSel( pOLV->GetSelection() ); + SvxFieldItem aURLItem( SvxURLField( rURL, rText, SvxURLFormat::Repr ), EE_FEATURE_FIELD ); + pOLV->InsertField( aURLItem ); + if ( aSel.nStartPos <= aSel.nEndPos ) + aSel.nEndPos = aSel.nStartPos + 1; + else + aSel.nStartPos = aSel.nEndPos + 1; + pOLV->SetSelection( aSel ); + } + else + { + Outliner* pOutl = GetDoc()->GetInternalOutliner(); + pOutl->Init( OutlinerMode::TextObject ); + OutlinerMode nOutlMode = pOutl->GetOutlinerMode(); + + SvxURLField aURLField(rURL, rText, SvxURLFormat::Repr); + aURLField.SetTargetFrame(rTarget); + SvxFieldItem aURLItem(aURLField, EE_FEATURE_FIELD); + pOutl->QuickInsertField( aURLItem, ESelection() ); + std::optional pOutlParaObject = pOutl->CreateParaObject(); + + rtl::Reference pRectObj = new SdrRectObj( + GetView()->getSdrModelFromSdrView(), + SdrObjKind::Text); + + pOutl->UpdateFields(); + pOutl->SetUpdateLayout( true ); + Size aSize(pOutl->CalcTextSize()); + pOutl->SetUpdateLayout( false ); + + Point aPos; + ::tools::Rectangle aRect(aPos, GetActiveWindow()->GetOutputSizePixel() ); + aPos = aRect.Center(); + aPos = GetActiveWindow()->PixelToLogic(aPos); + + if (aPos.getX() - (aSize.Width() / 2) >= 0) + aPos.AdjustX( -(aSize.Width() / 2) ); + if (aPos.getY() - (aSize.Height() / 2) >= 0) + aPos.AdjustY( -(aSize.Height() / 2) ); + + ::tools::Rectangle aLogicRect(aPos, aSize); + pRectObj->SetLogicRect(aLogicRect); + pRectObj->SetOutlinerParaObject( std::move(pOutlParaObject) ); + mpDrawView->InsertObjectAtView(pRectObj.get(), *mpDrawView->GetSdrPageView()); + pOutl->Init( nOutlMode ); + } +} + +void DrawViewShell::InsertURLButton(const OUString& rURL, const OUString& rText, + const OUString& rTarget, const Point* pPos) +{ + bool bNewObj = true; + + const OUString sTargetURL( ::URIHelper::SmartRel2Abs( INetURLObject( GetDocSh()->GetMedium()->GetBaseURL() ), rURL, URIHelper::GetMaybeFileHdl(), true, false, + INetURLObject::EncodeMechanism::WasEncoded, + INetURLObject::DecodeMechanism::Unambiguous ) ); + if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0) + { + SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + if( pMarkedObj ) try + { + // change first marked object + if (SdrInventor::FmForm == pMarkedObj->GetObjInventor()) + { + SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pMarkedObj ); + + Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), UNO_SET_THROW ); + Reference< beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY_THROW ); + + bool bIsButton = pMarkedObj->GetObjIdentifier() == SdrObjKind::FormButton; + if (!bIsButton && pMarkedObj->GetObjIdentifier() == SdrObjKind::UNO) + { + const Reference xInfo(xPropSet->getPropertySetInfo()); + bIsButton = xInfo.is() && xInfo->hasPropertyByName("ButtonType") + && xInfo->hasPropertyByName("Label") + && xInfo->hasPropertyByName("TargetURL"); + } + if (bIsButton) + { + bNewObj = false; + + xPropSet->setPropertyValue("Label", Any(rText)); + xPropSet->setPropertyValue("TargetURL", Any(sTargetURL)); + + if (!rTarget.isEmpty()) + xPropSet->setPropertyValue("TargetFrame", Any(rTarget)); + + xPropSet->setPropertyValue("ButtonType", Any(form::FormButtonType_URL)); +#if HAVE_FEATURE_AVMEDIA + if (::avmedia::MediaWindow::isMediaURL(rURL, ""/*TODO?*/)) + { + xPropSet->setPropertyValue("DispatchURLInternal", Any(true)); + } +#endif + } + } + if (bNewObj) + { + // add url as interaction for first selected shape + bNewObj = false; + + SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj, true); + pInfo->meClickAction = presentation::ClickAction_DOCUMENT; + pInfo->SetBookmark( sTargetURL ); + } + } + catch( uno::Exception& ) + { + } + } + + if (!bNewObj) + return; + + try + { + rtl::Reference pUnoCtrl = static_cast< SdrUnoObj* >( + SdrObjFactory::MakeNewObject( + GetView()->getSdrModelFromSdrView(), + SdrInventor::FmForm, + SdrObjKind::FormButton).get()); //, + //mpDrawView->GetSdrPageView()->GetPage())); + + Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_SET_THROW ); + Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW ); + + xPropSet->setPropertyValue( "Label" , Any( rText ) ); + xPropSet->setPropertyValue( "TargetURL" , Any( sTargetURL ) ); + + if( !rTarget.isEmpty() ) + xPropSet->setPropertyValue( "TargetFrame" , Any( rTarget ) ); + + xPropSet->setPropertyValue( "ButtonType" , Any( form::FormButtonType_URL ) ); +#if HAVE_FEATURE_AVMEDIA + if ( ::avmedia::MediaWindow::isMediaURL( rURL, ""/*TODO?*/ ) ) + xPropSet->setPropertyValue( "DispatchURLInternal" , Any( true ) ); +#endif + + Point aPos; + + if (pPos) + { + aPos = *pPos; + } + else + { + aPos = ::tools::Rectangle(aPos, GetActiveWindow()->GetOutputSizePixel()).Center(); + aPos = GetActiveWindow()->PixelToLogic(aPos); + } + + Size aSize(4000, 1000); + aPos.AdjustX( -(aSize.Width() / 2) ); + aPos.AdjustY( -(aSize.Height() / 2) ); + pUnoCtrl->SetLogicRect(::tools::Rectangle(aPos, aSize)); + + SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER; + + OSL_ASSERT (GetViewShell()!=nullptr); + SfxInPlaceClient* pIpClient = GetViewShell()->GetIPClient(); + if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive()) + { + nOptions |= SdrInsertFlags::DONTMARK; + } + + mpDrawView->InsertObjectAtView(pUnoCtrl.get(), *mpDrawView->GetSdrPageView(), nOptions); + } + catch( Exception& ) + { + } +} + +void DrawViewShell::ShowUIControls (bool bVisible) +{ + ViewShell::ShowUIControls (bVisible); + maTabControl->Show (bVisible); +} + +namespace slideshowhelp +{ + void ShowSlideShow(SfxRequest const & rReq, SdDrawDocument &rDoc) + { + Reference< XPresentation2 > xPresentation( rDoc.getPresentation() ); + if( !xPresentation.is() ) + return; + + sfx2::SfxNotebookBar::LockNotebookBar(); + if (SID_REHEARSE_TIMINGS == rReq.GetSlot()) + xPresentation->rehearseTimings(); + else if (rDoc.getPresentationSettings().mbCustomShow) + { + //fdo#69975 if a custom show has been set, then + //use it whether or not we've been asked to + //start from the current or first slide + xPresentation->start(); + + // if the custom show not set by default, only show it. + if (rDoc.getPresentationSettings().mbStartCustomShow) + rDoc.getPresentationSettings().mbCustomShow = false; + } + else if (SID_PRESENTATION_CURRENT_SLIDE == rReq.GetSlot()) + { + //If there is no custom show set, start will automatically + //start at the current page + xPresentation->start(); + } + else + { + //Start at page 0, this would blow away any custom + //show settings if any were set + Sequence< PropertyValue > aArguments{ comphelper::makePropertyValue("FirstPage", + OUString("0")) }; + xPresentation->startWithArguments( aArguments ); + } + sfx2::SfxNotebookBar::UnlockNotebookBar(); + } +} + +void DrawViewShell::StopSlideShow() +{ + Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() ); + if(xPresentation.is() && xPresentation->isRunning()) + { + if( mpDrawView->IsTextEdit() ) + mpDrawView->SdrEndTextEdit(); + + xPresentation->end(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsf.cxx b/sd/source/ui/view/drviewsf.cxx new file mode 100644 index 0000000000..1844d79603 --- /dev/null +++ b/sd/source/ui/view/drviewsf.cxx @@ -0,0 +1,844 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star::drawing; +using namespace svx::sidebar; +using namespace ::com::sun::star; + +namespace sd { + +/** + * Set state of controller SfxSlots + */ +void DrawViewShell::GetCtrlState(SfxItemSet &rSet) +{ + if (rSet.GetItemState(SID_RELOAD) != SfxItemState::UNKNOWN) + { + // let "last version" of SFx en/disable + GetViewFrame()->GetSlotState (SID_RELOAD, nullptr, &rSet); + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_HYPERLINK_GETLINK)) + { + SvxHyperlinkItem aHLinkItem; + + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + + if (pOLV) + { + const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection(); + const SvxFieldData* pField = pFieldItem ? pFieldItem->GetField() : nullptr; + if( auto pUrlField = dynamic_cast< const SvxURLField *>( pField ) ) + { + aHLinkItem.SetName(pUrlField->GetRepresentation()); + aHLinkItem.SetURL(pUrlField->GetURL()); + aHLinkItem.SetTargetFrame(pUrlField->GetTargetFrame()); + } + else + { + // use selected text as name for urls + OUString sReturn = pOLV->GetSelected(); + if (sReturn.getLength() > 255) + sReturn = sReturn.copy(0, 255); + aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' ')); + } + } + else + { + if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0) + { + bool bFound = false; + + SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + if( pMarkedObj && (SdrInventor::FmForm == pMarkedObj->GetObjInventor()) ) + { + SdrUnoObj* pUnoCtrl = dynamic_cast< SdrUnoObj* >( pMarkedObj ); + + if(pUnoCtrl) try + { + uno::Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_SET_THROW ); + uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW ); + uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo(), uno::UNO_SET_THROW ); + + form::FormButtonType eButtonType = form::FormButtonType_URL; + static constexpr OUString sButtonType( u"ButtonType"_ustr ); + if(xPropInfo->hasPropertyByName( sButtonType ) && (xPropSet->getPropertyValue( sButtonType ) >>= eButtonType ) ) + { + OUString aString; + + // Label + static constexpr OUString sLabel( u"Label"_ustr ); + if(xPropInfo->hasPropertyByName(sLabel)) + { + if( xPropSet->getPropertyValue(sLabel) >>= aString ) + aHLinkItem.SetName(aString); + } + + // URL + static constexpr OUString sTargetURL( u"TargetURL"_ustr ); + if(xPropInfo->hasPropertyByName(sTargetURL)) + { + if( xPropSet->getPropertyValue(sTargetURL) >>= aString ) + aHLinkItem.SetURL(aString); + } + + // Target + static constexpr OUString sTargetFrame( u"TargetFrame"_ustr ); + if(xPropInfo->hasPropertyByName(sTargetFrame) ) + { + if( xPropSet->getPropertyValue(sTargetFrame) >>= aString ) + aHLinkItem.SetTargetFrame(aString); + } + + aHLinkItem.SetInsertMode(HLINK_BUTTON); + bFound = true; + } + } + catch( uno::Exception& ) + { + } + } + + // try interaction link + if( !bFound && pMarkedObj ) + { + SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj); + if( pInfo && (pInfo->meClickAction == presentation::ClickAction_DOCUMENT) ) + aHLinkItem.SetURL( pInfo->GetBookmark()); + aHLinkItem.SetInsertMode(HLINK_BUTTON); + } + } + } + + rSet.Put(aHLinkItem); + } + rSet.Put( SfxBoolItem( SID_READONLY_MODE, mbReadOnly ) ); + + // output quality + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_COLOR ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_GRAYSCALE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_BLACKWHITE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_CONTRAST ) ) + { + const sal_uLong nMode = static_cast(GetActiveWindow()->GetOutDev()->GetDrawMode()); + rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_COLOR, sal_uLong(OUTPUT_DRAWMODE_COLOR) == nMode ) ); + rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_GRAYSCALE, static_cast(OUTPUT_DRAWMODE_GRAYSCALE) == nMode ) ); + rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_BLACKWHITE, static_cast(OUTPUT_DRAWMODE_BLACKWHITE) == nMode ) ); + rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_CONTRAST, static_cast(OUTPUT_DRAWMODE_CONTRAST) == nMode ) ); + } + + if ( SfxItemState::DEFAULT == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) ) + { + rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, true ) ); + } + + if ( SfxItemState::DEFAULT == rSet.GetItemState(SID_ATTR_YEAR2000) ) + { + FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); + if (pFormShell != nullptr) + { + sal_uInt16 nState = 0; + if (pFormShell->GetY2KState(nState)) + rSet.Put( SfxUInt16Item( SID_ATTR_YEAR2000, nState ) ); + else + rSet.DisableItem( SID_ATTR_YEAR2000 ); + } + } + + if ( !GetView()->GetTextEditOutliner() ) + { + if( !SvtCJKOptions::IsChangeCaseMapEnabled() ) + { + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, false ); + } + else + { + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, true ); + } + + rSet.DisableItem( SID_TRANSLITERATE_SENTENCE_CASE ); + rSet.DisableItem( SID_TRANSLITERATE_TITLE_CASE ); + rSet.DisableItem( SID_TRANSLITERATE_TOGGLE_CASE ); + rSet.DisableItem( SID_TRANSLITERATE_UPPER ); + rSet.DisableItem( SID_TRANSLITERATE_LOWER ); + rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH ); + rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH ); + rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA ); + rSet.DisableItem( SID_TRANSLITERATE_KATAKANA ); + } + else + { + if( !SvtCJKOptions::IsChangeCaseMapEnabled() ) + { + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, false ); + rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH ); + rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH ); + rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA ); + rSet.DisableItem( SID_TRANSLITERATE_KATAKANA ); + } + else + { + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, true ); + } + } +} + +void DrawViewShell::GetAttrState( SfxItemSet& rSet ) +{ + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + + bool bAttr = false; + SfxAllItemSet aAllSet( *rSet.GetPool() ); + + while ( nWhich ) + { + sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich) + ? GetPool().GetSlotId(nWhich) + : nWhich; + switch ( nSlotId ) + { + case SID_ATTR_PARA_ADJUST_LEFT: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + + SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust(); + if ( eAdj == SvxAdjust::Left) + { + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, true ) ); + } + + bAttr = true; + + Invalidate(nSlotId); + } + break; + case SID_ATTR_PARA_ADJUST_CENTER: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + + SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust(); + if ( eAdj == SvxAdjust::Center) + { + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, true ) ); + } + + bAttr = true; + + Invalidate(nSlotId); + } + break; + case SID_ATTR_PARA_ADJUST_RIGHT: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + + SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust(); + if ( eAdj == SvxAdjust::Right) + { + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, true ) ); + } + + bAttr = true; + + Invalidate(nSlotId); + } + break; + case SID_ATTR_PARA_ADJUST_BLOCK: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + + SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust(); + if ( eAdj == SvxAdjust::Block) + { + rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, true ) ); + } + + bAttr = true; + + Invalidate(nSlotId); + } + break; + case SID_ATTR_PARA_LRSPACE: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + SvxLRSpaceItem aLRSpace = aAttrs.Get( EE_PARA_LRSPACE ); + aLRSpace.SetWhich(SID_ATTR_PARA_LRSPACE); + rSet.Put(aLRSpace); + bAttr = true; + Invalidate(SID_ATTR_PARA_LRSPACE); + } + break; + case SID_ATTR_PARA_LINESPACE: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + SvxLineSpacingItem aLineLR = aAttrs.Get( EE_PARA_SBL ); + rSet.Put(aLineLR); + bAttr = true; + Invalidate(SID_ATTR_PARA_LINESPACE); + } + break; + case SID_ATTR_PARA_ULSPACE: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + SvxULSpaceItem aULSP = aAttrs.Get( EE_PARA_ULSPACE ); + aULSP.SetWhich(SID_ATTR_PARA_ULSPACE); + rSet.Put(aULSP); + bAttr = true; + Invalidate(SID_ATTR_PARA_ULSPACE); + } + break; + case SID_ULINE_VAL_NONE: + case SID_ULINE_VAL_SINGLE: + case SID_ULINE_VAL_DOUBLE: + case SID_ULINE_VAL_DOTTED: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + if( aAttrs.GetItemState( EE_CHAR_UNDERLINE ) >= SfxItemState::DEFAULT ) + { + FontLineStyle eLineStyle = aAttrs.Get(EE_CHAR_UNDERLINE).GetLineStyle(); + + switch (nSlotId) + { + case SID_ULINE_VAL_NONE: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_NONE)); + break; + case SID_ULINE_VAL_SINGLE: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_SINGLE)); + break; + case SID_ULINE_VAL_DOUBLE: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOUBLE)); + break; + case SID_ULINE_VAL_DOTTED: + rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOTTED)); + break; + } + } + + bAttr = true; + + Invalidate(nSlotId); + } + break; + case SID_ATTR_FILL_STYLE: + case SID_ATTR_FILL_COLOR: + case SID_ATTR_FILL_GRADIENT: + case SID_ATTR_FILL_HATCH: + case SID_ATTR_FILL_BITMAP: + case SID_ATTR_FILL_SHADOW: + case SID_ATTR_SHADOW_COLOR: + case SID_ATTR_SHADOW_TRANSPARENCE: + case SID_ATTR_SHADOW_BLUR: + case SID_ATTR_SHADOW_XDISTANCE: + case SID_ATTR_SHADOW_YDISTANCE: + case SID_ATTR_FILL_USE_SLIDE_BACKGROUND: + case SID_ATTR_FILL_TRANSPARENCE: + case SID_ATTR_FILL_FLOATTRANSPARENCE: + case SID_ATTR_LINE_STYLE: + case SID_ATTR_LINE_DASH: + case SID_ATTR_LINE_WIDTH: + case SID_ATTR_LINE_COLOR: + case SID_ATTR_LINE_TRANSPARENCE: + case SID_ATTR_LINE_JOINT: + case SID_ATTR_LINE_CAP: + case SID_ATTR_TEXT_FITTOSIZE: + case SID_ATTR_CHAR_FONT: + case SID_ATTR_CHAR_FONTHEIGHT: + case SID_ATTR_CHAR_SHADOWED: + case SID_ATTR_CHAR_POSTURE: + case SID_ATTR_CHAR_OVERLINE: + case SID_ATTR_CHAR_UNDERLINE: + case SID_ATTR_CHAR_STRIKEOUT: + case SID_ATTR_CHAR_CONTOUR: + case SID_ATTR_CHAR_WEIGHT: + case SID_ATTR_CHAR_COLOR: + case SID_ATTR_CHAR_KERNING: + case SID_ATTR_CHAR_CASEMAP: + case SID_ATTR_GLOW_COLOR: + case SID_ATTR_GLOW_RADIUS: + case SID_ATTR_GLOW_TRANSPARENCY: + case SID_ATTR_SOFTEDGE_RADIUS: + case SID_SET_SUB_SCRIPT: + case SID_SET_SUPER_SCRIPT: + { + bAttr = true; + } + break; + + case SID_ATTR_TEXTCOLUMNS_NUMBER: + case SID_ATTR_TEXTCOLUMNS_SPACING: + { + SfxItemSet aAttrs(GetDoc()->GetPool()); + mpDrawView->GetAttributes(aAttrs); + const sal_uInt16 nActWhich = nSlotId == SID_ATTR_TEXTCOLUMNS_NUMBER + ? SDRATTR_TEXTCOLUMNS_NUMBER + : SDRATTR_TEXTCOLUMNS_SPACING; + rSet.Put(aAttrs.Get(nActWhich).CloneSetWhich(nSlotId)); + } + break; + + case SID_HYPHENATION: + { + SfxItemSet aAttrs( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aAttrs ); + if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SfxItemState::DEFAULT ) + { + bool bValue = aAttrs.Get( EE_PARA_HYPHENATE ).GetValue(); + rSet.Put( SfxBoolItem( SID_HYPHENATION, bValue ) ); + } + } + break; + + case SID_THEME_DIALOG: + { + bool bDisable = true; + SdrPageView* pPageView = mpDrawView->GetSdrPageView(); + if (pPageView) + { + SdPage* pPage = dynamic_cast(pPageView->GetPage()); + if (pPage && pPage->IsMasterPage()) + bDisable = false; + } + if (bDisable) + rSet.DisableItem(nWhich); + } + break; + + case SID_STYLE_FAMILY2: + case SID_STYLE_FAMILY3: + case SID_STYLE_FAMILY5: + case SID_STYLE_APPLY: // StyleControl + { + SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet(); + if( pStyleSheet ) + { + if( nSlotId != SID_STYLE_APPLY && !mpDrawView->AreObjectsMarked() ) + { + SfxTemplateItem aTmpItem( nWhich, OUString() ); + aAllSet.Put( aTmpItem, aTmpItem.Which() ); + } + else + { + if (pStyleSheet->GetFamily() == SfxStyleFamily::Page) + pStyleSheet = static_cast(pStyleSheet)->GetPseudoStyleSheet(); + + if( pStyleSheet ) + { + SfxStyleFamily eFamily = pStyleSheet->GetFamily(); + + if ((eFamily == SfxStyleFamily::Para && nSlotId == SID_STYLE_FAMILY2) || + (eFamily == SfxStyleFamily::Frame && nSlotId == SID_STYLE_FAMILY3) || + (eFamily == SfxStyleFamily::Pseudo && nSlotId == SID_STYLE_FAMILY5)) + { + SfxTemplateItem aTmpItem ( nWhich, pStyleSheet->GetName() ); + aAllSet.Put( aTmpItem, aTmpItem.Which() ); + } + else + { + SfxTemplateItem aTmpItem(nWhich, OUString()); + aAllSet.Put(aTmpItem,aTmpItem.Which() ); + } + } + } + } + else + { SfxTemplateItem aItem( nWhich, OUString() ); + aAllSet.Put( aItem, aItem.Which() ); + } + } + break; + + case SID_SET_DEFAULT: + { + if( !mpDrawView->GetMarkedObjectList().GetMarkCount() || + ( !mpDrawView->IsTextEdit() && !mpDrawView->GetStyleSheet() ) + ) + rSet.DisableItem( nWhich ); + } + break; + + case SID_REMOVE_HYPERLINK: + { + if (!URLFieldHelper::IsCursorAtURLField(mpDrawView->GetTextEditOutlinerView(), + /*AlsoCheckBeforeCursor=*/true)) + rSet.DisableItem(nWhich); + } + break; + + case SID_STYLE_WATERCAN: + { + std::unique_ptr pFamilyItem; + GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem); + if (pFamilyItem && static_cast(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo) + rSet.Put(SfxBoolItem(nWhich,false)); + else + { + SfxBoolItem aItem(nWhich, SD_MOD()->GetWaterCan()); + aAllSet.Put( aItem, aItem.Which()); + } + } + break; + + case SID_STYLE_NEW: + { + std::unique_ptr pFamilyItem; + GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem); + if (pFamilyItem && static_cast(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo) + { + rSet.DisableItem(nWhich); + } + } + break; + + case SID_STYLE_DRAGHIERARCHIE: + { + std::unique_ptr pFamilyItem; + GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem); + if (pFamilyItem && static_cast(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo) + rSet.DisableItem(nWhich); + } + break; + + case SID_STYLE_NEW_BY_EXAMPLE: + { + // It is not possible to create PseudoStyleSheets 'by Example'; + // normal style sheets need a selected object for that + + std::unique_ptr pFamilyItem; + GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem); + if (pFamilyItem) + { + if (static_cast(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo) + { + rSet.DisableItem(nWhich); + } + else if (static_cast(pFamilyItem->GetValue()) == SfxStyleFamily::Para) + { + if (!mpDrawView->AreObjectsMarked()) + { + rSet.DisableItem(nWhich); + } + } + } + // if there is no (yet) a style designer, we have to go back into the + // view state; an actual set family can not be considered + else + { + if (!mpDrawView->AreObjectsMarked()) + { + rSet.DisableItem(nWhich); + } + } + } + break; + + case SID_STYLE_UPDATE_BY_EXAMPLE: + { + if (!mpDrawView->AreObjectsMarked()) + { + rSet.DisableItem(nWhich); + } + } + break; + case FN_BUL_NUM_RULE_INDEX: + case FN_NUM_NUM_RULE_INDEX: + { + SfxItemSet aEditAttr( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( aEditAttr ); + + SfxItemSetFixed aNewAttr( GetPool() ); + aNewAttr.Put( aEditAttr, false ); + + std::unique_ptr pNumRule; + const SfxPoolItem* pTmpItem=nullptr; + TypedWhichId nNumItemId = SID_ATTR_NUMBERING_RULE; + sal_uInt16 nActNumLvl = mpDrawView->GetSelectionLevel(); + pTmpItem=GetNumBulletItem(aNewAttr, nNumItemId); + + if (pTmpItem) + pNumRule.reset(new SvxNumRule(static_cast(pTmpItem)->GetNumRule())); + + if ( pNumRule ) + { + sal_uInt16 nMask = 1; + sal_uInt16 nCount = 0; + sal_uInt16 nCurLevel = sal_uInt16(0xFFFF); + for(sal_uInt16 i = 0; i < pNumRule->GetLevelCount(); i++) + { + if(nActNumLvl & nMask) + { + nCount++; + nCurLevel = i; + } + nMask <<= 1; + } + if ( nCount == 1 ) + { + const SvxNumberFormat* pNumFmt = pNumRule->Get(nCurLevel); + if ( pNumFmt ) + { + bool bBullets = false; + switch(pNumFmt->GetNumberingType()) + { + case SVX_NUM_CHAR_SPECIAL: + case SVX_NUM_BITMAP: + bBullets = true; + break; + + default: + bBullets = false; + } + + rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,sal_uInt16(0xFFFF))); + rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,sal_uInt16(0xFFFF))); + if ( bBullets ) + { + NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(NBOType::Bullets); + if ( pBullets ) + { + sal_uInt16 nBulIndex = pBullets->GetNBOIndexForNumRule(*pNumRule,nActNumLvl); + rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,nBulIndex)); + } + }else + { + NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(NBOType::Numbering); + if ( pNumbering ) + { + sal_uInt16 nBulIndex = pNumbering->GetNBOIndexForNumRule(*pNumRule,nActNumLvl); + rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,nBulIndex)); + } + } + } + } + } + } + break; + case FN_NUM_BULLET_ON: + case FN_NUM_NUMBERING_ON: + { + bool bEnable = false; + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nMarkCount = rMarkList.GetMarkCount(); + for (size_t nIndex = 0; nIndex < nMarkCount; ++nIndex) + { + SdrTextObj* pTextObj = DynCastSdrTextObj(rMarkList.GetMark(nIndex)->GetMarkedSdrObj()); + if (pTextObj && pTextObj->GetObjInventor() == SdrInventor::Default) + { + if (pTextObj->GetObjIdentifier() != SdrObjKind::OLE2) + { + bEnable = true; + break; + } + } + } + if (bEnable) + { + rSet.Put(SfxBoolItem(FN_NUM_BULLET_ON, false)); + rSet.Put(SfxBoolItem(FN_NUM_NUMBERING_ON, false)); + } + else + { + rSet.DisableItem(FN_NUM_BULLET_ON); + rSet.DisableItem(FN_NUM_NUMBERING_ON); + } + } + break; + } + nWhich = aIter.NextWhich(); + } + + std::optional pSet; + + if( bAttr ) + { + pSet.emplace( GetDoc()->GetPool() ); + mpDrawView->GetAttributes( *pSet ); + rSet.Put( *pSet, false ); + } + + rSet.Put( aAllSet, false ); + + // there were changes at area and/or line attributes + if( !(bAttr && pSet) ) + return; + + // if the view owns selected objects, corresponding items have to be + // changed from SfxItemState::DEFAULT (_ON) to SfxItemState::DISABLED + if( mpDrawView->AreObjectsMarked() ) + { + SfxWhichIter aNewIter( *pSet ); + nWhich = aNewIter.FirstWhich(); + while( nWhich ) + { + if (nWhich >= XATTR_LINE_FIRST && nWhich <= XATTR_LINE_LAST + && SfxItemState::DEFAULT == aNewIter.GetItemState() ) + { + rSet.ClearItem( nWhich ); + rSet.DisableItem( nWhich ); + } + nWhich = aNewIter.NextWhich(); + } + } + + SfxItemState eState = pSet->GetItemState( EE_PARA_LRSPACE ); + if ( eState == SfxItemState::DONTCARE ) + { + rSet.InvalidateItem(EE_PARA_LRSPACE); + rSet.InvalidateItem(SID_ATTR_PARA_LRSPACE); + } + eState = pSet->GetItemState( EE_PARA_SBL ); + if ( eState == SfxItemState::DONTCARE ) + { + rSet.InvalidateItem(EE_PARA_SBL); + rSet.InvalidateItem(SID_ATTR_PARA_LINESPACE); + } + eState = pSet->GetItemState( EE_PARA_ULSPACE ); + if ( eState == SfxItemState::DONTCARE ) + { + rSet.InvalidateItem(EE_PARA_ULSPACE); + rSet.InvalidateItem(SID_ATTR_PARA_ULSPACE); + } + + SvxEscapement eEsc = static_cast(pSet->Get( EE_CHAR_ESCAPEMENT ).GetEnumValue()); + rSet.Put(SfxBoolItem(SID_SET_SUPER_SCRIPT, eEsc == SvxEscapement::Superscript)); + rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT, eEsc == SvxEscapement::Subscript)); + + eState = pSet->GetItemState( EE_CHAR_KERNING ); + if ( eState == SfxItemState::DONTCARE ) + { + rSet.InvalidateItem(EE_CHAR_KERNING); + rSet.InvalidateItem(SID_ATTR_CHAR_KERNING); + } +} + +OUString DrawViewShell::GetSelectionText(bool bCompleteWords) +{ + OUString aStrSelection; + ::Outliner* pOl = mpDrawView->GetTextEditOutliner(); + OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView(); + + if (pOl && pOlView) + { + if (bCompleteWords) + { + ESelection aSel = pOlView->GetSelection(); + OUString aStrCurrentDelimiters = pOl->GetWordDelimiters(); + + pOl->SetWordDelimiters(" .,;\"'"); + aStrSelection = pOl->GetWord( aSel.nEndPara, aSel.nEndPos ); + pOl->SetWordDelimiters( aStrCurrentDelimiters ); + } + else + { + aStrSelection = pOlView->GetSelected(); + } + } + + return aStrSelection; +} + +bool DrawViewShell::HasSelection(bool bText) const +{ + bool bReturn = false; + + if (bText) + { + OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView(); + + if (pOlView && !pOlView->GetSelected().isEmpty()) + { + bReturn = true; + } + } + else if (mpDrawView->GetMarkedObjectList().GetMarkCount() != 0) + { + bReturn = true; + } + + return bReturn; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsg.cxx b/sd/source/ui/view/drviewsg.cxx new file mode 100644 index 0000000000..2563168433 --- /dev/null +++ b/sd/source/ui/view/drviewsg.cxx @@ -0,0 +1,232 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +namespace sd { + +void DrawViewShell::ExecIMap( SfxRequest const & rReq ) +{ + // during a slide show, nothing is executed! + if(HasCurrentFunction(SID_PRESENTATION) ) + return; + + if ( rReq.GetSlot() != SID_IMAP_EXEC ) + return; + + SdrMark* pMark = mpDrawView->GetMarkedObjectList().GetMark(0); + + if ( !pMark ) + return; + + SdrObject* pSdrObj = pMark->GetMarkedSdrObj(); + SvxIMapDlg* pDlg = ViewShell::Implementation::GetImageMapDialog(); + + if ( pDlg->GetEditingObject() == static_cast(pSdrObj) ) + { + const ImageMap& rImageMap = pDlg->GetImageMap(); + SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo( pSdrObj ); + + if ( !pIMapInfo ) + pSdrObj->AppendUserData( std::unique_ptr(new SvxIMapInfo( rImageMap )) ); + else + pIMapInfo->SetImageMap( rImageMap ); + + GetDoc()->SetChanged(); + } +} + +void DrawViewShell::GetIMapState( SfxItemSet& rSet ) +{ + bool bDisable = true; + + if( GetViewFrame()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) ) + { + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + + if ( rMarkList.GetMarkCount() == 1 ) + { + const SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + + SvxIMapDlg* pImageMapDialog = ViewShell::Implementation::GetImageMapDialog(); + if ( ( dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr /*|| pObj->ISA( SdrOle2Obj )*/ ) + && pImageMapDialog!=nullptr + && ( pImageMapDialog->GetEditingObject() == static_cast(pObj) ) ) + { + bDisable = false; + } + } + } + + rSet.Put( SfxBoolItem( SID_IMAP_EXEC, bDisable ) ); +} + +void DrawViewShell::ExecOptionsBar( SfxRequest& rReq ) +{ + // during a slide show, nothing is executed! + if(HasCurrentFunction(SID_PRESENTATION)) + return; + + bool bDefault = false; + sal_uInt16 nSlot = rReq.GetSlot(); + + SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType()); + + switch( nSlot ) + { + case SID_SOLID_CREATE: + pOptions->SetSolidDragging( !mpDrawView->IsSolidDragging() ); + break; + + // Grid- / Help lines option + case SID_GRID_VISIBLE: // not here yet! + { + pOptions->SetGridVisible( !mpDrawView->IsGridVisible() ); + } + break; + + case SID_GRID_USE: + { + pOptions->SetUseGridSnap( !mpDrawView->IsGridSnap() ); + } + break; + + case SID_HELPLINES_VISIBLE: // not here yet! + { + pOptions->SetHelplines( !mpDrawView->IsHlplVisible() ); + } + break; + + case SID_HELPLINES_USE: + { + pOptions->SetSnapHelplines( !mpDrawView->IsHlplSnap() ); + } + break; + + case SID_HELPLINES_MOVE: + { + pOptions->SetDragStripes( !mpDrawView->IsDragStripes() ); + } + break; + + case SID_SNAP_BORDER: + { + pOptions->SetSnapBorder( !mpDrawView->IsBordSnap() ); + } + break; + + case SID_SNAP_FRAME: + { + pOptions->SetSnapFrame( !mpDrawView->IsOFrmSnap() ); + } + break; + + case SID_SNAP_POINTS: + { + pOptions->SetSnapPoints( !mpDrawView->IsOPntSnap() ); + } + break; + + case SID_QUICKEDIT: + { + pOptions->SetQuickEdit( !mpDrawView->IsQuickTextEditMode() ); + } + break; + + case SID_PICK_THROUGH: + { + pOptions->SetPickThrough( + !mpDrawView->GetModel().IsPickThroughTransparentTextFrames() ); + } + break; + + case SID_DOUBLECLICK_TEXTEDIT: + { + pOptions->SetDoubleClickTextEdit( !mpFrameView->IsDoubleClickTextEdit() ); + } + break; + + case SID_CLICK_CHANGE_ROTATION: + { + pOptions->SetClickChangeRotation( !mpFrameView->IsClickChangeRotation() ); + } + break; + + default: + bDefault = true; + break; + } + + if( bDefault ) + return; + + pOptions->StoreConfig(); + + // Saves the configuration IMMEDIATELY + // SfxGetpApp()->SaveConfiguration(); + WriteFrameViewData(); + + mpFrameView->Update( pOptions ); + ReadFrameViewData( mpFrameView ); + + Invalidate( nSlot ); + rReq.Done(); + +} + +void DrawViewShell::GetOptionsBarState( SfxItemSet& rSet ) +{ + rSet.Put( SfxBoolItem( SID_SOLID_CREATE, mpDrawView->IsSolidDragging() ) ); + rSet.Put( SfxBoolItem( SID_GRID_VISIBLE, mpDrawView->IsGridVisible() ) ); + rSet.Put( SfxBoolItem( SID_GRID_USE, mpDrawView->IsGridSnap() ) ); + rSet.Put( SfxBoolItem( SID_HELPLINES_VISIBLE, mpDrawView->IsHlplVisible() ) ); + rSet.Put( SfxBoolItem( SID_HELPLINES_USE, mpDrawView->IsHlplSnap() ) ); + rSet.Put( SfxBoolItem( SID_HELPLINES_MOVE, mpDrawView->IsDragStripes() ) ); + + rSet.Put( SfxBoolItem( SID_SNAP_BORDER, mpDrawView->IsBordSnap() ) ); + rSet.Put( SfxBoolItem( SID_SNAP_FRAME, mpDrawView->IsOFrmSnap() ) ); + rSet.Put( SfxBoolItem( SID_SNAP_POINTS, mpDrawView->IsOPntSnap() ) ); + + rSet.Put( SfxBoolItem( SID_QUICKEDIT, mpDrawView->IsQuickTextEditMode() ) ); + rSet.Put( SfxBoolItem( SID_PICK_THROUGH, + mpDrawView->GetModel().IsPickThroughTransparentTextFrames() ) ); + + rSet.Put( SfxBoolItem( SID_DOUBLECLICK_TEXTEDIT, mpFrameView->IsDoubleClickTextEdit() ) ); + rSet.Put( SfxBoolItem( SID_CLICK_CHANGE_ROTATION, mpFrameView->IsClickChangeRotation() ) ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsh.cxx b/sd/source/ui/view/drviewsh.cxx new file mode 100644 index 0000000000..f323497ac4 --- /dev/null +++ b/sd/source/ui/view/drviewsh.cxx @@ -0,0 +1,203 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include + +#include + +#include + +namespace sd { + +void DrawViewShell::GotoBookmark(std::u16string_view rBookmark) +{ + ::sd::DrawDocShell* pDocSh = GetDocSh(); + if( pDocSh ) + { + if( !pDocSh->GetViewShell() ) //#i26016# this case occurs if the jump-target-document was opened already with file open dialog before triggering the jump via hyperlink + pDocSh->Connect(this); + pDocSh->GotoBookmark(rBookmark); + } +} + +/** + * Make area visible (scroll part of picture) +|* +\************************************************************************/ + +void DrawViewShell::MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin) +{ + if ( (IsMouseButtonDown() && !IsMouseSelecting()) || SlideShow::IsRunning( GetViewShellBase() ) ) + return; + + // tdf#98646 check if Rectangle which contains the bounds of the region to + // be shown eventually contains values that cause overflows when processing + // e.g. when calling GetWidth() + const bool bOverflowInX(!rtl::math::approxEqual(static_cast(rRect.getOpenWidth()), static_cast(rRect.Right()) - static_cast(rRect.Left()))); + const bool bOverflowInY(!rtl::math::approxEqual(static_cast(rRect.getOpenHeight()), static_cast(rRect.Bottom()) - static_cast(rRect.Top()))); + + if(bOverflowInX || bOverflowInY) + { + SAL_WARN("sd", "The given Rectangle contains values that lead to numerical overflows (!)"); + return; + } + + // In older versions, if in X or Y the size of the object was + // smaller than the visible area, the user-defined zoom was + // changed. This was decided to be a bug for + // StarOffice 6.x (Apr 2002), thus I developed a + // version which instead handles X/Y bigger/smaller and visibility + // questions separately + const Size aLogicSize(rRect.GetSize()); + + // visible area + Size aVisSizePixel(rWin.GetOutputSizePixel()); + bool bTiledRendering = comphelper::LibreOfficeKit::isActive() && !rWin.IsMapModeEnabled(); + if (bTiledRendering) + { + rWin.GetOutDev()->Push(vcl::PushFlags::MAPMODE); + rWin.EnableMapMode(); + } + ::tools::Rectangle aVisArea(rWin.PixelToLogic(::tools::Rectangle(Point(0,0), aVisSizePixel))); + if (bTiledRendering) + rWin.GetOutDev()->Pop(); + Size aVisAreaSize(aVisArea.GetSize()); + + if ( aVisArea.Contains(rRect) ) + return; + + // object is not entirely in visible area + sal_Int32 nFreeSpaceX(aVisAreaSize.Width() - aLogicSize.Width()); + sal_Int32 nFreeSpaceY(aVisAreaSize.Height() - aLogicSize.Height()); + + // allow a mode for move-only visibility without zooming. + const sal_Int32 nPercentBorder(30); + const ::tools::Rectangle aInnerRectangle( + aVisArea.Left() + ((aVisAreaSize.Width() * nPercentBorder) / 200), + aVisArea.Top() + ((aVisAreaSize.Height() * nPercentBorder) / 200), + aVisArea.Right() - ((aVisAreaSize.Width() * nPercentBorder) / 200), + aVisArea.Bottom() - ((aVisAreaSize.Height() * nPercentBorder) / 200) + ); + Point aNewPos(aVisArea.TopLeft()); + + if(nFreeSpaceX < 0) + { + if(aInnerRectangle.Left() > rRect.Right()) + { + // object moves out to the left + aNewPos.AdjustX( -(aVisAreaSize.Width() / 2) ); + } + + if(aInnerRectangle.Right() < rRect.Left()) + { + // object moves out to the right + aNewPos.AdjustX(aVisAreaSize.Width() / 2 ); + } + } + else + { + if(nFreeSpaceX > rRect.GetWidth()) + { + nFreeSpaceX = rRect.GetWidth(); + } + + if(nFreeSpaceX <= 0) + { + SAL_WARN("sd", "The given Rectangle contains values that lead to numerical overflows (!)"); + } + else + { + const ::tools::Long distRight(rRect.Right() - aNewPos.X() - aVisAreaSize.Width()); + + if(distRight > 0) + { + ::tools::Long mult = (distRight / nFreeSpaceX) + 1; + aNewPos.AdjustX(mult * nFreeSpaceX ); + } + + const ::tools::Long distLeft(aNewPos.X() - rRect.Left()); + + if(distLeft > 0) + { + ::tools::Long mult = (distLeft / nFreeSpaceX) + 1; + aNewPos.AdjustX( -(mult * nFreeSpaceX) ); + } + } + } + + if(nFreeSpaceY < 0) + { + if(aInnerRectangle.Top() > rRect.Bottom()) + { + // object moves out to the top + aNewPos.AdjustY( -(aVisAreaSize.Height() / 2) ); + } + + if(aInnerRectangle.Bottom() < rRect.Top()) + { + // object moves out to the right + aNewPos.AdjustY(aVisAreaSize.Height() / 2 ); + } + } + else + { + if(nFreeSpaceY > rRect.GetHeight()) + { + nFreeSpaceY = rRect.GetHeight(); + } + + if(nFreeSpaceY <= 0) + { + SAL_WARN("sd", "The given Rectangle contains values that lead to numerical overflows (!)"); + } + else + { + const ::tools::Long distBottom(rRect.Bottom() - aNewPos.Y() - aVisAreaSize.Height()); + + if(distBottom > 0) + { + ::tools::Long mult = (distBottom / nFreeSpaceY) + 1; + aNewPos.AdjustY(mult * nFreeSpaceY ); + } + + const ::tools::Long distTop(aNewPos.Y() - rRect.Top()); + + if(distTop > 0) + { + ::tools::Long mult = (distTop / nFreeSpaceY) + 1; + aNewPos.AdjustY( -(mult * nFreeSpaceY) ); + } + } + } + + // did position change? Does it need to be set? + if(aNewPos != aVisArea.TopLeft()) + { + aVisArea.SetPos(aNewPos); + SetZoomRect(aVisArea); + } +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsi.cxx b/sd/source/ui/view/drviewsi.cxx new file mode 100644 index 0000000000..0398408249 --- /dev/null +++ b/sd/source/ui/view/drviewsi.cxx @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +using namespace ::com::sun::star; + +namespace sd { + +/** + * Handle SfxRequests for EffekteWindow + */ +void DrawViewShell::ExecEffectWin( SfxRequest& rReq ) +{ + CheckLineTo (rReq); + + sal_uInt16 nSId = rReq.GetSlot(); + + switch( nSId ) + { + case SID_3D_INIT: + { + sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId(); + SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( nId ); + if( pWindow ) + { + Svx3DWin* p3DWin = static_cast( pWindow->GetWindow() ); + if( p3DWin ) + p3DWin->InitColorLB(); + } + } + break; + + case SID_3D_STATE: + { + Update3DWindow(); + } + break; + + case SID_3D_ASSIGN: + { + AssignFrom3DWindow(); + } + break; + + } +} + +void DrawViewShell::Update3DWindow() +{ + sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId(); + SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( nId ); + if( pWindow ) + { + Svx3DWin* p3DWin = static_cast( pWindow->GetWindow() ); + if( p3DWin && p3DWin->IsUpdateMode() ) + { + SfxItemSet aTmpItemSet = GetView()->Get3DAttributes(); + p3DWin->Update( aTmpItemSet ); + } + } +} + +/*----------------------------------------------------------------------------*/ + +void DrawViewShell::AssignFrom3DWindow() +{ + sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId(); + SfxChildWindow* pWin = GetViewFrame()->GetChildWindow( nId ); + if( !pWin ) + return; + + Svx3DWin* p3DWin = static_cast( pWin->GetWindow() ); + if( !(p3DWin && GetView()) ) + return; + + if(!GetView()->IsPresObjSelected()) + { + SfxItemSetFixed aSet( GetDoc()->GetPool() ); + p3DWin->GetAttr( aSet ); + + // own UNDO-compounding also around transformation in 3D + GetView()->BegUndo(SdResId(STR_UNDO_APPLY_3D_FAVOURITE)); + + if(GetView()->IsConvertTo3DObjPossible()) + { + // assign only text-attribute + SfxItemSetFixed aTextSet( GetDoc()->GetPool() ); + aTextSet.Put( aSet, false ); + GetView()->SetAttributes( aTextSet ); + + // transform text into 3D + sal_uInt16 nSId = SID_CONVERT_TO_3D; + SfxBoolItem aItem( nSId, true ); + GetViewFrame()->GetDispatcher()->ExecuteList( + nSId, SfxCallMode::SYNCHRON | SfxCallMode::RECORD, + { &aItem }); + + // Determine if a FILL attribute is set. + // If not, hard set a fill attribute + drawing::FillStyle eFillStyle = aSet.Get(XATTR_FILLSTYLE).GetValue(); + if(eFillStyle == drawing::FillStyle_NONE) + aSet.Put(XFillStyleItem (drawing::FillStyle_SOLID)); + + // remove some 3DSCENE attributes since these were + // created by convert to 3D and may not be changed + // to the defaults again. + aSet.ClearItem(SDRATTR_3DSCENE_DISTANCE); + aSet.ClearItem(SDRATTR_3DSCENE_FOCAL_LENGTH); + aSet.ClearItem(SDRATTR_3DOBJ_DEPTH); + } + + // assign attribute + GetView()->Set3DAttributes( aSet ); + + // end UNDO + GetView()->EndUndo(); + } + else + { + vcl::Window* pWindow = GetActiveWindow(); + std::unique_ptr xInfoBox(Application::CreateMessageDialog(pWindow ? pWindow->GetFrameWeld() : nullptr, + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); + } + + // get focus back + GetActiveWindow()->GrabFocus(); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsj.cxx b/sd/source/ui/view/drviewsj.cxx new file mode 100644 index 0000000000..55103bf675 --- /dev/null +++ b/sd/source/ui/view/drviewsj.cxx @@ -0,0 +1,567 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +using namespace com::sun::star; + +namespace sd { + +/** + * Set state (Enabled/Disabled) of Menu-SfxSlots + */ +void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet ) +{ + // Status of menu entries (Buttons,...) + + // Single selection + const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); + const size_t nMarkCount = rMarkList.GetMarkCount(); + + if ( nMarkCount == 1 ) + { + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_BEZIER_EDIT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_UNGROUP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ENTER_GROUP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_NAME_GROUP ) || + + // #i68101# + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_TITLE_DESCRIPTION ) || + + SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_STYLE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_USE_SLIDE_BACKGROUND ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_TRANSPARENCE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_FLOATTRANSPARENCE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_CHANGEBEZIER ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_CHANGEPOLYGON ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_LINEEND_POLYGON ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_MEASURE_DLG ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_CONNECTION_DLG ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_CONNECTION_NEW_ROUTING ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_SHEAR ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_LEFT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_CENTER ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_RIGHT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_UP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_MIDDLE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_DOWN ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_TO_TOP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_MOREFRONT ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_UP ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_MOREBACK ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_DOWN ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_TO_BOTTOM ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_BEFORE_OBJ ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_BEHIND_OBJ ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_REVERSE_ORDER ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ORIGINAL_SIZE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_SAVE_GRAPHIC ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_COMPRESS_GRAPHIC ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_TEXTATTR_DLG ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_EXECUTE_ANIMATION_EFFECT )) + { + const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pObj); + const SdrOle2Obj* pSdrOle2Obj = dynamic_cast< const SdrOle2Obj* >(pObj); + const SdAnimationInfo* pAnimationInfo + = SdDrawDocument::GetAnimationInfo(rMarkList.GetMark(0)->GetMarkedSdrObj()); + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nId = pObj->GetObjIdentifier(); + SdrObjTransformInfoRec aInfoRec; + pObj->TakeObjInfo( aInfoRec ); + + // don't show original size entry if not possible + if(pSdrOle2Obj) + { + if (pSdrOle2Obj->GetObjRef().is() && + (pSdrOle2Obj->GetObjRef()->getStatus( pSdrOle2Obj->GetAspect() ) & embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE) ) + rSet.DisableItem(SID_ORIGINAL_SIZE); + } + + if(!pSdrGrafObj) + { + rSet.DisableItem(SID_SAVE_GRAPHIC); + rSet.DisableItem(SID_COMPRESS_GRAPHIC); + } + + if (!pAnimationInfo + || pAnimationInfo->meClickAction == presentation::ClickAction::ClickAction_NONE + // Sound does not work in edit mode + || pAnimationInfo->meClickAction == presentation::ClickAction::ClickAction_SOUND + // No point in exiting the presentation in edit mode + || pAnimationInfo->meClickAction + == presentation::ClickAction::ClickAction_STOPPRESENTATION) + { + rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT); + } + + /* If it is not a group object or 3D object, we disable "enter + group". */ + const auto* pSdrObjGroup = dynamic_cast(pObj); + + if( !( ( pSdrObjGroup != nullptr && nInv == SdrInventor::Default ) || + DynCastE3dScene(pObj) ) ) + { + rSet.DisableItem( SID_ENTER_GROUP ); + } + + // Don't allow enter Diagrams + if(nullptr != pSdrObjGroup && pSdrObjGroup->isDiagram()) + { + rSet.DisableItem( SID_ENTER_GROUP ); + } + + // If it is not a group object, we disable "ungroup" + if(pSdrObjGroup == nullptr || nInv != SdrInventor::Default) + { + rSet.DisableItem(SID_UNGROUP); + } + + // Support advanced DiagramHelper + if(!pSdrObjGroup || !pSdrObjGroup->isDiagram()) + { + rSet.DisableItem( SID_REGENERATE_DIAGRAM ); + rSet.DisableItem( SID_EDIT_DIAGRAM ); + } + + if( nInv == SdrInventor::Default && + (nId == SdrObjKind::Line || + nId == SdrObjKind::PolyLine || + nId == SdrObjKind::PathLine || + nId == SdrObjKind::FreehandLine )) + { + //rSet.DisableItem( SID_ATTRIBUTES_AREA ); // remove again! + rSet.DisableItem( SID_ATTR_FILL_STYLE ); + rSet.DisableItem( SID_ATTR_FILL_USE_SLIDE_BACKGROUND ); + rSet.DisableItem( SID_ATTR_FILL_TRANSPARENCE ); + rSet.DisableItem( SID_ATTR_FILL_FLOATTRANSPARENCE ); + } + if( (dynamic_cast< const SdrPathObj *>( pObj ) == nullptr&& !aInfoRec.bCanConvToPath) || dynamic_cast< const SdrObjGroup *>( pObj ) != nullptr ) // As long as JOE handles it incorrectly! + { // JOE: a group object may can be converted into a PathObj + rSet.DisableItem( SID_LINEEND_POLYGON ); + } + if(nInv == SdrInventor::Default && + (nId == SdrObjKind::PathFill || nId == SdrObjKind::PathLine || !aInfoRec.bCanConvToPath)) + rSet.DisableItem( SID_CHANGEBEZIER ); + + if( nInv == SdrInventor::Default && + ( nId == SdrObjKind::Polygon || nId == SdrObjKind::PolyLine || !aInfoRec.bCanConvToPoly ) && + !GetView()->IsVectorizeAllowed() ) + { + rSet.DisableItem( SID_CHANGEPOLYGON ); + } + + if(nInv == SdrInventor::Default && nId == SdrObjKind::Table ) + { + rSet.DisableItem( SID_TEXTATTR_DLG ); + } + + if( nInv != SdrInventor::Default || nId != SdrObjKind::Measure ) + rSet.DisableItem( SID_MEASURE_DLG ); + + if( nInv != SdrInventor::Default || nId != SdrObjKind::Edge ) + rSet.DisableItem( SID_CONNECTION_DLG ); + else + { + bool bDisable = true; + SfxItemSet aAttrSet( GetDoc()->GetPool() ); + GetView()->GetAttributes( aAttrSet ); + + if( aAttrSet.GetItemState( SDRATTR_EDGELINE1DELTA ) >= SfxItemState::DEFAULT && + aAttrSet.GetItemState( SDRATTR_EDGELINE2DELTA ) >= SfxItemState::DEFAULT && + aAttrSet.GetItemState( SDRATTR_EDGELINE3DELTA ) >= SfxItemState::DEFAULT ) + { + ::tools::Long nVal1 = aAttrSet.Get( SDRATTR_EDGELINE1DELTA ).GetValue(); + ::tools::Long nVal2 = aAttrSet.Get( SDRATTR_EDGELINE2DELTA ).GetValue(); + ::tools::Long nVal3 = aAttrSet.Get( SDRATTR_EDGELINE3DELTA ).GetValue(); + { + if( nVal1 != 0 || nVal2 != 0 || nVal3 != 0 ) + bDisable = false; + } + } + if( bDisable ) + rSet.DisableItem( SID_CONNECTION_NEW_ROUTING ); + } + + if ( nInv == SdrInventor::E3d || + (!mpDrawView->IsConvertToPathObjPossible() && + !mpDrawView->IsShearAllowed() && + !mpDrawView->IsDistortAllowed()) ) + { + rSet.DisableItem( SID_OBJECT_SHEAR ); + } + + if(dynamic_cast< const E3dCompoundObject *>( pObj ) != nullptr) + { + rSet.DisableItem( SID_OBJECT_ALIGN ); + rSet.DisableItem( SID_OBJECT_ALIGN_LEFT ); + rSet.DisableItem( SID_OBJECT_ALIGN_CENTER ); + rSet.DisableItem( SID_OBJECT_ALIGN_RIGHT ); + rSet.DisableItem( SID_OBJECT_ALIGN_UP ); + rSet.DisableItem( SID_OBJECT_ALIGN_MIDDLE ); + rSet.DisableItem( SID_OBJECT_ALIGN_DOWN ); + rSet.DisableItem( SID_FRAME_TO_TOP ); + rSet.DisableItem( SID_MOREFRONT ); + rSet.DisableItem( SID_FRAME_UP ); + rSet.DisableItem( SID_MOREBACK ); + rSet.DisableItem( SID_FRAME_DOWN ); + rSet.DisableItem( SID_FRAME_TO_BOTTOM ); + rSet.DisableItem( SID_BEFORE_OBJ ); + rSet.DisableItem( SID_BEHIND_OBJ ); + rSet.DisableItem( SID_REVERSE_ORDER ); + rSet.DisableItem( SID_POSITION ); + } + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DISMANTLE ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_BREAK ) ) + { + if ( !mpDrawView->IsDismantlePossible() ) + { + rSet.DisableItem( SID_DISMANTLE ); + } + + if ( !mpDrawView->IsDismantlePossible(true) && + !mpDrawView->IsImportMtfPossible() && + !mpDrawView->IsBreak3DObjPossible() ) + { + rSet.DisableItem( SID_BREAK ); + } + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MODIFY_FIELD ) ) + { + OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); + + if( pOLV ) + { + const SvxFieldItem* pFldItem = pOLV->GetFieldAtSelection(); + + if( !( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) ) ) + { + rSet.DisableItem( SID_MODIFY_FIELD ); + } + } + else + rSet.DisableItem( SID_MODIFY_FIELD ); + } + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTLINE_TEXT_AUTOFIT ) ) + { + const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + const SdrTextFitToSizeTypeItem* pItem = pObj->GetMergedItemSet().GetItem(SDRATTR_TEXT_FITTOSIZE); + const bool bSet = pItem && pItem->GetValue() != drawing::TextFitToSizeType_NONE; + rSet.Put(SfxBoolItem(SID_OUTLINE_TEXT_AUTOFIT, bSet)); + } + + rSet.DisableItem(SID_GROUP); + rSet.DisableItem(SID_TEXT_COMBINE); + rSet.DisableItem(SID_COMBINE); + rSet.DisableItem(SID_DISTRIBUTE_HLEFT); + rSet.DisableItem(SID_DISTRIBUTE_HCENTER); + rSet.DisableItem(SID_DISTRIBUTE_HDISTANCE); + rSet.DisableItem(SID_DISTRIBUTE_HRIGHT); + rSet.DisableItem(SID_DISTRIBUTE_VTOP); + rSet.DisableItem(SID_DISTRIBUTE_VCENTER); + rSet.DisableItem(SID_DISTRIBUTE_VDISTANCE); + rSet.DisableItem(SID_DISTRIBUTE_VBOTTOM); + rSet.DisableItem(SID_POLY_MERGE); + rSet.DisableItem(SID_POLY_SUBSTRACT); + rSet.DisableItem(SID_POLY_INTERSECT); + rSet.DisableItem(SID_EQUALIZEWIDTH); + rSet.DisableItem(SID_EQUALIZEHEIGHT); + rSet.DisableItem(SID_CONNECT); + } + // multi-selection + else if( nMarkCount > 1 ) + { + // distribute dialog for 3+n objects + if(nMarkCount <= 2) + { + rSet.DisableItem(SID_DISTRIBUTE_HLEFT); + rSet.DisableItem(SID_DISTRIBUTE_HCENTER); + rSet.DisableItem(SID_DISTRIBUTE_HDISTANCE); + rSet.DisableItem(SID_DISTRIBUTE_HRIGHT); + rSet.DisableItem(SID_DISTRIBUTE_VTOP); + rSet.DisableItem(SID_DISTRIBUTE_VCENTER); + rSet.DisableItem(SID_DISTRIBUTE_VDISTANCE); + rSet.DisableItem(SID_DISTRIBUTE_VBOTTOM); + } + + rSet.DisableItem( SID_LINEEND_POLYGON ); + rSet.DisableItem( SID_ENTER_GROUP ); + // Now names for objects have to be unique + rSet.DisableItem( SID_NAME_GROUP ); + // #i68101# + rSet.DisableItem( SID_OBJECT_TITLE_DESCRIPTION ); + rSet.DisableItem( SID_MODIFY_FIELD ); + + { + bool bText = false; + bool bLine = false; + bool bGroup = false; + bool bDrawObj = false; + bool b3dObj = false; + bool bTable = false; + bool bMeasureObj = false; + bool bEdgeObj = false; // Connector + bool bE3dCompoundObject = false; + + for( size_t i = 0; i < nMarkCount && !bText && i < 50; ++i ) + { + SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); + SdrInventor nInv = pObj->GetObjInventor(); + SdrObjKind nId = pObj->GetObjIdentifier(); + + if (nInv == SdrInventor::Default) + { + switch (nId) + { + case SdrObjKind::Text: bText = true; break; + + case SdrObjKind::Line: bLine = true; break; + + case SdrObjKind::Edge: bEdgeObj = true; break; + + case SdrObjKind::Measure: bMeasureObj = true; break; + + case SdrObjKind::Rectangle: + case SdrObjKind::CircleOrEllipse: + case SdrObjKind::FreehandLine: + case SdrObjKind::FreehandFill: + case SdrObjKind::PathFill: + case SdrObjKind::PathLine: + case SdrObjKind::CircleSection: + case SdrObjKind::CircleArc: + case SdrObjKind::CircleCut: bDrawObj = true; break; + + case SdrObjKind::Group: bGroup = true; break; + + case SdrObjKind::Graphic: break; + + case SdrObjKind::Table: bTable = true; break; + default: ; + } + } + else if (nInv == SdrInventor::E3d) + { + if(DynCastE3dScene(pObj)) + b3dObj = true; + else if(dynamic_cast< const E3dCompoundObject* >(pObj) != nullptr) + bE3dCompoundObject = true; + } + } + if( bLine && !bText && !bDrawObj &&!b3dObj) + { + rSet.DisableItem( SID_ATTR_FILL_STYLE ); + rSet.DisableItem( SID_ATTR_FILL_USE_SLIDE_BACKGROUND ); + rSet.DisableItem( SID_ATTR_FILL_TRANSPARENCE ); + rSet.DisableItem( SID_ATTR_FILL_FLOATTRANSPARENCE ); + } + if( !bEdgeObj ) + rSet.DisableItem( SID_CONNECTION_DLG ); + + if (b3dObj) + { + rSet.DisableItem( SID_COMBINE ); + rSet.DisableItem(SID_POLY_MERGE); + rSet.DisableItem(SID_POLY_SUBSTRACT); + rSet.DisableItem(SID_POLY_INTERSECT); + rSet.DisableItem(SID_EQUALIZEWIDTH); + rSet.DisableItem(SID_EQUALIZEHEIGHT); + } + + if (b3dObj || + (!mpDrawView->IsConvertToPathObjPossible() && + !mpDrawView->IsShearAllowed() && + !mpDrawView->IsDistortAllowed()) ) + { + rSet.DisableItem( SID_OBJECT_SHEAR ); + } + + if( !bGroup ) + { + rSet.DisableItem( SID_UNGROUP ); + } + if( bTable ) + rSet.DisableItem( SID_TEXTATTR_DLG ); + + if( !bMeasureObj ) + rSet.DisableItem( SID_MEASURE_DLG ); + + if(bE3dCompoundObject) + { + rSet.DisableItem( SID_OBJECT_ALIGN ); + rSet.DisableItem( SID_OBJECT_ALIGN_LEFT ); + rSet.DisableItem( SID_OBJECT_ALIGN_CENTER ); + rSet.DisableItem( SID_OBJECT_ALIGN_RIGHT ); + rSet.DisableItem( SID_OBJECT_ALIGN_UP ); + rSet.DisableItem( SID_OBJECT_ALIGN_MIDDLE ); + rSet.DisableItem( SID_OBJECT_ALIGN_DOWN ); + rSet.DisableItem( SID_FRAME_TO_TOP ); + rSet.DisableItem( SID_MOREFRONT ); + rSet.DisableItem( SID_FRAME_UP ); + rSet.DisableItem( SID_MOREBACK ); + rSet.DisableItem( SID_FRAME_DOWN ); + rSet.DisableItem( SID_FRAME_TO_BOTTOM ); + rSet.DisableItem( SID_BEFORE_OBJ ); + rSet.DisableItem( SID_BEHIND_OBJ ); + rSet.DisableItem( SID_REVERSE_ORDER ); + rSet.DisableItem( SID_POSITION ); + } + } + + if ( !mpDrawView->IsDismantlePossible() ) + { + rSet.DisableItem( SID_DISMANTLE ); + } + if ( !mpDrawView->IsDismantlePossible(true) && + !mpDrawView->IsImportMtfPossible() && + !mpDrawView->IsBreak3DObjPossible() ) + { + rSet.DisableItem( SID_BREAK ); + } + if ( !mpDrawView->IsCombinePossible() ) + { + rSet.DisableItem(SID_COMBINE); + rSet.DisableItem(SID_POLY_MERGE); + rSet.DisableItem(SID_POLY_SUBSTRACT); + rSet.DisableItem(SID_POLY_INTERSECT); + rSet.DisableItem(SID_EQUALIZEWIDTH); + rSet.DisableItem(SID_EQUALIZEHEIGHT); + } + if ( !mpDrawView->IsCombinePossible(true) ) + { + rSet.DisableItem( SID_CONNECT ); + } + if ( !mpDrawView->IsGroupPossible() ) + { + rSet.DisableItem( SID_GROUP ); + } + if ( !mpDrawView->IsUnGroupPossible() ) + { + rSet.DisableItem( SID_UNGROUP ); + } + } + // select no object + else + { + rSet.DisableItem( SID_ENTER_GROUP ); + rSet.DisableItem( SID_CUT ); + rSet.DisableItem( SID_COPY ); + rSet.DisableItem( SID_DELETE ); + rSet.DisableItem( SID_ATTR_TRANSFORM ); + + rSet.DisableItem( SID_OBJECT_ALIGN ); + rSet.DisableItem( SID_OBJECT_ALIGN_LEFT ); + rSet.DisableItem( SID_OBJECT_ALIGN_CENTER ); + rSet.DisableItem( SID_OBJECT_ALIGN_RIGHT ); + rSet.DisableItem( SID_OBJECT_ALIGN_UP ); + rSet.DisableItem( SID_OBJECT_ALIGN_MIDDLE ); + rSet.DisableItem( SID_OBJECT_ALIGN_DOWN ); + + rSet.DisableItem( SID_FRAME_TO_TOP ); + rSet.DisableItem( SID_MOREFRONT ); + rSet.DisableItem( SID_FRAME_UP ); + rSet.DisableItem( SID_MOREBACK ); + rSet.DisableItem( SID_FRAME_DOWN ); + rSet.DisableItem( SID_FRAME_TO_BOTTOM ); + rSet.DisableItem( SID_BEFORE_OBJ ); + rSet.DisableItem( SID_BEHIND_OBJ ); + rSet.DisableItem( SID_POSITION ); + + rSet.DisableItem( SID_SIZE_OPTIMAL ); + rSet.DisableItem( SID_LINEEND_POLYGON ); + rSet.DisableItem( SID_COPYOBJECTS ); + rSet.DisableItem( SID_HORIZONTAL ); + rSet.DisableItem( SID_VERTICAL ); + rSet.DisableItem( SID_FLIP_HORIZONTAL ); + rSet.DisableItem( SID_FLIP_VERTICAL ); + rSet.DisableItem( SID_GROUP ); + rSet.DisableItem( SID_UNGROUP ); + rSet.DisableItem( SID_NAME_GROUP ); + + // #i68101# + rSet.DisableItem( SID_OBJECT_TITLE_DESCRIPTION ); + + rSet.DisableItem( SID_DISMANTLE ); + rSet.DisableItem( SID_BREAK ); + rSet.DisableItem( SID_TEXT_COMBINE ); + rSet.DisableItem( SID_COMBINE ); + rSet.DisableItem(SID_DISTRIBUTE_DLG); + rSet.DisableItem(SID_DISTRIBUTE_HLEFT); + rSet.DisableItem(SID_DISTRIBUTE_HCENTER); + rSet.DisableItem(SID_DISTRIBUTE_HDISTANCE); + rSet.DisableItem(SID_DISTRIBUTE_HRIGHT); + rSet.DisableItem(SID_DISTRIBUTE_VTOP); + rSet.DisableItem(SID_DISTRIBUTE_VCENTER); + rSet.DisableItem(SID_DISTRIBUTE_VDISTANCE); + rSet.DisableItem(SID_DISTRIBUTE_VBOTTOM); + rSet.DisableItem(SID_POLY_MERGE); + rSet.DisableItem(SID_POLY_SUBSTRACT); + rSet.DisableItem(SID_POLY_INTERSECT); + rSet.DisableItem(SID_EQUALIZEWIDTH); + rSet.DisableItem(SID_EQUALIZEHEIGHT); + rSet.DisableItem( SID_CONNECT ); + rSet.DisableItem( SID_ANIMATION_EFFECTS ); + rSet.DisableItem( SID_EXECUTE_ANIMATION_EFFECT ); + rSet.DisableItem( SID_MODIFY_FIELD ); + rSet.DisableItem (SID_OBJECT_SHEAR); + } + + if (GetObjectShell()->isContentExtractionLocked()) + { + rSet.DisableItem(SID_COPY); + rSet.DisableItem(SID_CUT); + } + if(GetObjectShell()->isExportLocked()) + { + rSet.DisableItem(SID_SAVE_GRAPHIC); + rSet.DisableItem(SID_EXTERNAL_EDIT); + } + if (GetDoc()->getImagePreferredDPI() <= 0) + { + rSet.DisableItem(SID_GRAPHIC_SIZE_CHECK); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/drviewsk.cxx b/sd/source/ui/view/drviewsk.cxx new file mode 100644 index 0000000000..92a00d5d2d --- /dev/null +++ b/sd/source/ui/view/drviewsk.cxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace sd { + +void DrawViewShell::ConfigurationChanged( utl::ConfigurationBroadcaster* pCb, ConfigurationHints ) +{ + svtools::ColorConfig *pColorConfig = dynamic_cast(pCb); + ConfigureAppBackgroundColor(pColorConfig); + if (comphelper::LibreOfficeKit::isActive()) + { + SfxViewShell* pCurrentShell = SfxViewShell::Current(); + ViewShellBase* pShellBase = dynamic_cast(pCurrentShell); + if (!pShellBase) + return; + if (DrawViewShell* pCurrentDrawShell = dynamic_cast(pShellBase->GetMainViewShell().get())) + { + pCurrentDrawShell->maViewOptions.mnDocBackgroundColor = pColorConfig->GetColorValue(svtools::DOCCOLOR).nColor; + pCurrentDrawShell->maViewOptions.msColorSchemeName = svtools::ColorConfig::GetCurrentSchemeName(); + } + SdXImpressDocument* pDoc = comphelper::getFromUnoTunnel(pCurrentShell->GetCurrentDocument()); + SfxLokHelper::notifyViewRenderState(pCurrentShell, pDoc); + Color aFillColor(pColorConfig->GetColorValue(svtools::APPBACKGROUND).nColor); + pCurrentShell->libreOfficeKitViewCallback(LOK_CALLBACK_APPLICATION_BACKGROUND_COLOR, + aFillColor.AsRGBHexString().toUtf8()); + } +} + +void DrawViewShell::ConfigureAppBackgroundColor( svtools::ColorConfig *pColorConfig ) +{ + if (!pColorConfig) + pColorConfig = &SD_MOD()->GetColorConfig(); + Color aFillColor( pColorConfig->GetColorValue( svtools::APPBACKGROUND ).nColor ); + if (comphelper::LibreOfficeKit::isActive()) + aFillColor = COL_TRANSPARENT; + // tdf#87905 Use darker background color for master view + if (meEditMode == EditMode::MasterPage) + aFillColor.DecreaseLuminance( 64 ); + maViewOptions.mnAppBackgroundColor = aFillColor; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/source/ui/view/drvwshrg.cxx b/sd/source/ui/view/drvwshrg.cxx new file mode 100644 index 0000000000..792d5b833a --- /dev/null +++ b/sd/source/ui/view/drvwshrg.cxx @@ -0,0 +1,110 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include + +using namespace sd; +#define ShellClass_DrawViewShell +#include +#define ShellClass_GraphicViewShell +#include + +namespace sd +{ +/** + * Declare SFX-Slotmap and Standardinterface + */ + +SFX_IMPL_INTERFACE(DrawViewShell, SfxShell) + +void DrawViewShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterPopupMenu("drawtext"); + + GetStaticInterface()->RegisterChildWindow(SID_NAVIGATOR, true); + + GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxFontWorkChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxColorChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(AnimationChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(Svx3DChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxIMapDlgChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxHlinkDlgWrapper::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(::sd::SpellDialogChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG); +#if HAVE_FEATURE_AVMEDIA + GetStaticInterface()->RegisterChildWindow(::avmedia::MediaPlayer::GetChildWindowId()); +#endif + GetStaticInterface()->RegisterChildWindow( + sfx2::sidebar::SidebarChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId()); +} + +// SdGraphicViewShell +SFX_IMPL_INTERFACE(GraphicViewShell, SfxShell) + +void GraphicViewShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterPopupMenu("drawtext"); + + GetStaticInterface()->RegisterChildWindow(SID_NAVIGATOR, true); + + GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxFontWorkChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxColorChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(Svx3DChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxIMapDlgChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxHlinkDlgWrapper::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(::sd::SpellDialogChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG); +#if HAVE_FEATURE_AVMEDIA + GetStaticInterface()->RegisterChildWindow(::avmedia::MediaPlayer::GetChildWindowId()); +#endif + GetStaticInterface()->RegisterChildWindow( + sfx2::sidebar::SidebarChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId()); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/frmview.cxx b/sd/source/ui/view/frmview.cxx new file mode 100644 index 0000000000..61b7bfdf2e --- /dev/null +++ b/sd/source/ui/view/frmview.cxx @@ -0,0 +1,919 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; + +namespace sd { + +FrameView::FrameView(SdDrawDocument* pDrawDoc, FrameView* pFrameView /* = NULL */) +: SdrView(*pDrawDoc, nullptr), // TTTT SdDrawDocument* -> should be reference + mnRefCount(0), + mnPresViewShellId(SID_VIEWSHELL0), + mbIsNavigatorShowingAllShapes(false) +{ + EndListening(*pDrawDoc); + + EnableExtendedKeyInputDispatcher(false); + EnableExtendedMouseEventDispatcher(false); + + SetGridFront( false ); + SetHlplFront( false ); + SetOConSnap( false ); + SetFrameDragSingles(); + SetSlidesPerRow(4); + + if( nullptr == pFrameView ) + { + DrawDocShell* pDocShell = pDrawDoc->GetDocSh(); + + if ( pDocShell ) + { + // document is loaded, is there a FrameView? + sal_uLong nSdViewShellCount = 0; + SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(pDocShell); + + while (pSfxViewFrame) + { + // Count the FrameViews and remember the type of the main + // view shell. + SfxViewShell* pSfxViewSh = pSfxViewFrame->GetViewShell(); + ViewShellBase* pBase = dynamic_cast( pSfxViewSh ); + + if (pBase != nullptr) + { + nSdViewShellCount++; + + OUString sViewURL; + Reference xView ( + framework::FrameworkHelper::Instance(*pBase)->GetView( + drawing::framework::ResourceId::create( + ::comphelper::getProcessComponentContext(), + framework::FrameworkHelper::msCenterPaneURL))); + if (xView.is()) + sViewURL = xView->getResourceId()->getResourceURL(); + + switch (framework::FrameworkHelper::GetViewId(sViewURL)) + { + default: +// case ViewShell::ST_IMPRESS: +// case ViewShell::ST_NOTES: +// case ViewShell::ST_HANDOUT: + mnPresViewShellId = SID_VIEWSHELL0; + break; + + case ViewShell::ST_SLIDE_SORTER: + mnPresViewShellId = SID_VIEWSHELL1; + break; + + case ViewShell::ST_OUTLINE: + mnPresViewShellId = SID_VIEWSHELL2; + break; + } + } + + pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, pDocShell); + } + + SdDrawDocument* pDoc = pDocShell->GetDoc(); + pFrameView = pDoc->GetFrameView(nSdViewShellCount); + } + } + + if (pFrameView) + { + // initialize FrameView with the FrameView of the DocShell + SetRuler( pFrameView->HasRuler() ); + SetGridCoarse( pFrameView->GetGridCoarse() ); + SetGridFine( pFrameView->GetGridFine() ); + SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY()); + SetGridVisible( pFrameView->IsGridVisible() ); + SetGridFront( pFrameView->IsGridFront() ); + SetSnapAngle( pFrameView->GetSnapAngle() ); + SetGridSnap( pFrameView->IsGridSnap() ); + SetBordSnap( pFrameView->IsBordSnap() ); + SetHlplSnap( pFrameView->IsHlplSnap() ); + SetOFrmSnap( pFrameView->IsOFrmSnap() ); + SetOPntSnap( pFrameView->IsOPntSnap() ); + SetOConSnap( pFrameView->IsOConSnap() ); + SetHlplVisible( pFrameView->IsHlplVisible() ); + SetDragStripes( pFrameView->IsDragStripes() ); + SetPlusHandlesAlwaysVisible( pFrameView->IsPlusHandlesAlwaysVisible() ); + SetFrameDragSingles( pFrameView->IsFrameDragSingles() ); + SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() ); + SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() ); + SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() ); + SetCrookNoContortion( pFrameView->IsCrookNoContortion() ); + SetSlantButShear( pFrameView->IsSlantButShear() ); + SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() ); + SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() ); + SetBigOrtho( pFrameView->IsBigOrtho() ); + SetOrtho( pFrameView->IsOrtho() ); + SetEliminatePolyPointLimitAngle( pFrameView->GetEliminatePolyPointLimitAngle() ); + SetEliminatePolyPoints( pFrameView->IsEliminatePolyPoints() ); + SetDesignMode( pFrameView->IsDesignMode() ); + + SetSolidDragging( pFrameView->IsSolidDragging() ); + + maVisibleLayers = pFrameView->GetVisibleLayers(); + maPrintableLayers = pFrameView->GetPrintableLayers(); + maLockedLayers = pFrameView->GetLockedLayers(); + maStandardHelpLines = pFrameView->GetStandardHelpLines(); + maNotesHelpLines = pFrameView->GetNotesHelpLines(); + maHandoutHelpLines = pFrameView->GetHandoutHelpLines(); + SetActiveLayer( pFrameView->GetActiveLayer() ); + mbNoColors = pFrameView->IsNoColors(); + mbNoAttribs = pFrameView->IsNoAttribs() ; + maVisArea = pFrameView->GetVisArea(); + mePageKind = pFrameView->GetPageKind(); + mePageKindOnLoad = pFrameView->GetPageKindOnLoad(); + mnSelectedPage = pFrameView->GetSelectedPage(); + mnSelectedPageOnLoad = pFrameView->GetSelectedPageOnLoad(); + mePageEditMode = pFrameView->GetViewShEditMode(); + // meStandardEditMode = pFrameView->GetViewShEditMode(PageKind::Standard); + // meNotesEditMode = pFrameView->GetViewShEditMode(PageKind::Notes); + // meHandoutEditMode = pFrameView->GetViewShEditMode(PageKind::Handout); + SetViewShEditModeOnLoad(pFrameView->GetViewShEditModeOnLoad()); + mbLayerMode = pFrameView->IsLayerMode(); + mbQuickEdit = pFrameView->IsQuickEdit(); + + // #i26631# + SetMasterPagePaintCaching( pFrameView->IsMasterPagePaintCaching() ); + + SetDragWithCopy( pFrameView->IsDragWithCopy() ); + mbDoubleClickTextEdit = pFrameView->IsDoubleClickTextEdit(); + mbClickChangeRotation = pFrameView->IsClickChangeRotation(); + mnSlidesPerRow = pFrameView->GetSlidesPerRow(); + mnDrawMode = pFrameView->GetDrawMode(); + mbIsNavigatorShowingAllShapes = pFrameView->IsNavigatorShowingAllShapes(); + SetPreviousViewShellType (pFrameView->GetPreviousViewShellType()); + SetViewShellTypeOnLoad (pFrameView->GetViewShellTypeOnLoad()); + } + else + { + // initialize FrameView with the application data + + // Layers need to be set, otherwise they are not visible and not printable in + // Impress documents. The document contains already the actual layers and their + // settings for visible, printable and locked. In case not read from , + // ODF defaults are used. + SdrLayerAdmin rLayerAdmin = pDrawDoc -> GetLayerAdmin(); + rLayerAdmin.getVisibleLayersODF(maVisibleLayers); + rLayerAdmin.getPrintableLayersODF(maPrintableLayers); + rLayerAdmin.getLockedLayersODF(maLockedLayers); + SetGridCoarse( Size( 1000, 1000 ) ); + SetSnapGridWidth(Fraction(1000, 1), Fraction(1000, 1)); + SetActiveLayer(sUNO_LayerName_layout); + mbNoColors = true; + mbNoAttribs = false; + maVisArea = ::tools::Rectangle( Point(), Size(0, 0) ); + mePageKind = PageKind::Standard; + mePageKindOnLoad = PageKind::Standard; + mnSelectedPage = 0; + mnSelectedPageOnLoad = 0; + mePageEditMode = EditMode::Page; + // meStandardEditMode = EditMode::Page; + // meNotesEditMode = EditMode::Page; + // meHandoutEditMode = EditMode::MasterPage; + SetViewShEditModeOnLoad(EditMode::Page); + mbLayerMode = false; + SetEliminatePolyPoints(false); + mbDoubleClickTextEdit = false; + mbClickChangeRotation = false; + mnSlidesPerRow = 4; + + { + bool bUseContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode(); + mnDrawMode = bUseContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR; + } + mbIsNavigatorShowingAllShapes = true; + SetPreviousViewShellType (ViewShell::ST_NONE); + SetViewShellTypeOnLoad (ViewShell::ST_IMPRESS); + + // get default for design mode + bool bInitDesignMode = pDrawDoc->GetOpenInDesignMode(); + if( pDrawDoc->OpenInDesignModeIsDefaulted() ) + { + bInitDesignMode = true; + } + + SfxObjectShell* pObjShell = pDrawDoc->GetObjectShell(); + if( pObjShell && pObjShell->IsReadOnly() ) + bInitDesignMode = false; + SetDesignMode( bInitDesignMode ); + + Update( SD_MOD()->GetSdOptions(pDrawDoc->GetDocumentType()) ); + } + +} + +FrameView::~FrameView() +{ +} + +void FrameView::Connect() +{ + mnRefCount++; +} + +void FrameView::Disconnect() +{ + if (mnRefCount > 0) + { + mnRefCount--; + } + + if (mnRefCount == 0) + { + delete this; + } +} + +/** + * Update with data from the specified SdOptions + */ +void FrameView::Update(SdOptions const * pOptions) +{ + if (!pOptions) + return; + + mbRuler = pOptions->IsRulerVisible(); + SetGridVisible( pOptions->IsGridVisible() ); + SetSnapAngle( pOptions->GetAngle() ); + SetGridSnap( pOptions->IsUseGridSnap() ); + SetBordSnap( pOptions->IsSnapBorder() ); + SetHlplSnap( pOptions->IsSnapHelplines() ); + SetOFrmSnap( pOptions->IsSnapFrame() ); + SetOPntSnap( pOptions->IsSnapPoints() ); + SetHlplVisible( pOptions->IsHelplines() ); + SetDragStripes( pOptions->IsDragStripes() ); + SetPlusHandlesAlwaysVisible( pOptions->IsHandlesBezier() ); + SetSnapMagneticPixel( pOptions->GetSnapArea() ); + SetMarkedHitMovesAlways( pOptions->IsMarkedHitMovesAlways() ); + SetMoveOnlyDragging( pOptions->IsMoveOnlyDragging() ); + SetSlantButShear( pOptions->IsMoveOnlyDragging() ); + SetNoDragXorPolys ( !pOptions->IsMoveOutline() ); + SetCrookNoContortion( pOptions->IsCrookNoContortion() ); + SetAngleSnapEnabled( pOptions->IsRotate() ); + SetBigOrtho( pOptions->IsBigOrtho() ); + SetOrtho( pOptions->IsOrtho() ); + SetEliminatePolyPointLimitAngle( pOptions->GetEliminatePolyPointLimitAngle() ); + GetModel().SetPickThroughTransparentTextFrames( pOptions->IsPickThrough() ); + + SetSolidDragging( pOptions->IsSolidDragging() ); + + SetGridCoarse( Size( pOptions->GetFieldDrawX(), pOptions->GetFieldDrawY() ) ); + SetGridFine( Size( pOptions->GetFieldDivisionX(), pOptions->GetFieldDivisionY() ) ); + Fraction aFractX(pOptions->GetFieldDrawX(), pOptions->GetFieldDrawX() / ( pOptions->GetFieldDivisionX() ? pOptions->GetFieldDivisionX() : 1 )); + Fraction aFractY(pOptions->GetFieldDrawY(), pOptions->GetFieldDrawY() / ( pOptions->GetFieldDivisionY() ? pOptions->GetFieldDivisionY() : 1 )); + SetSnapGridWidth(aFractX, aFractY); + SetQuickEdit(pOptions->IsQuickEdit()); + + // #i26631# + SetMasterPagePaintCaching( pOptions->IsMasterPagePaintCaching() ); + + SetDragWithCopy(pOptions->IsDragWithCopy()); + SetDragThresholdPixels(pOptions->GetDragThresholdPixels()); + SetDoubleClickTextEdit( pOptions->IsDoubleClickTextEdit() ); + SetClickChangeRotation( pOptions->IsClickChangeRotation() ); +} + +/** + * Set EditMode (Page or MasterPage) of working mode + */ +void FrameView::SetViewShEditMode(EditMode eMode) +{ + mePageEditMode = eMode; +} + +/** + * Return EditMode (Page or MasterPage) of working mode + */ +EditMode FrameView::GetViewShEditMode() const +{ + return mePageEditMode; +} + +void FrameView::SetViewShEditModeOnLoad (EditMode eMode) +{ + meEditModeOnLoad = eMode; +} + +static OUString createHelpLinesString( const SdrHelpLineList& rHelpLines ) +{ + OUStringBuffer aLines; + + const sal_uInt16 nCount = rHelpLines.GetCount(); + for( sal_uInt16 nHlpLine = 0; nHlpLine < nCount; nHlpLine++ ) + { + const SdrHelpLine& rHelpLine = rHelpLines[nHlpLine]; + const Point& rPos = rHelpLine.GetPos(); + + switch( rHelpLine.GetKind() ) + { + case SdrHelpLineKind::Point: + aLines.append( 'P' ); + aLines.append( static_cast(rPos.X()) ); + aLines.append( ',' ); + aLines.append( static_cast(rPos.Y()) ); + break; + case SdrHelpLineKind::Vertical: + aLines.append( 'V' ); + aLines.append( static_cast(rPos.X()) ); + break; + case SdrHelpLineKind::Horizontal: + aLines.append( 'H' ); + aLines.append( static_cast(rPos.Y()) ); + break; + default: + OSL_FAIL( "Unsupported helpline Kind!" ); + } + } + + return aLines.makeStringAndClear(); +} + +void FrameView::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rValues ) +{ + std::vector< std::pair< OUString, Any > > aUserData; + aUserData.reserve(41); // worst case + + aUserData.emplace_back( sUNO_View_GridIsVisible, Any( IsGridVisible() ) ); + aUserData.emplace_back( sUNO_View_GridIsFront, Any( IsGridFront() ) ); + aUserData.emplace_back( sUNO_View_IsSnapToGrid, Any( IsGridSnap() ) ); + aUserData.emplace_back( sUNO_View_IsSnapToPageMargins, Any( IsBordSnap() ) ); + aUserData.emplace_back( sUNO_View_IsSnapToSnapLines, Any( IsHlplSnap() ) ); + aUserData.emplace_back( sUNO_View_IsSnapToObjectFrame, Any( IsOFrmSnap() ) ); + aUserData.emplace_back( sUNO_View_IsSnapToObjectPoints, Any( IsOPntSnap() ) ); + + aUserData.emplace_back( sUNO_View_IsPlusHandlesAlwaysVisible, Any( IsPlusHandlesAlwaysVisible() ) ); + aUserData.emplace_back( sUNO_View_IsFrameDragSingles, Any( IsFrameDragSingles() ) ); + + aUserData.emplace_back( sUNO_View_EliminatePolyPointLimitAngle, Any( static_cast(GetEliminatePolyPointLimitAngle()) ) ); + aUserData.emplace_back( sUNO_View_IsEliminatePolyPoints, Any( IsEliminatePolyPoints() ) ); + + if ( officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::get() ) + { + SdrLayerAdmin& rLayerAdmin = getSdrModelFromSdrView().GetLayerAdmin(); + Any aAny; + rLayerAdmin.QueryValue(GetVisibleLayers(), aAny); + aUserData.emplace_back( sUNO_View_VisibleLayers, aAny ); + + rLayerAdmin.QueryValue(GetPrintableLayers(), aAny); + aUserData.emplace_back( sUNO_View_PrintableLayers, aAny ); + + rLayerAdmin.QueryValue(GetLockedLayers(), aAny); + aUserData.emplace_back( sUNO_View_LockedLayers, aAny ); + } + + aUserData.emplace_back( sUNO_View_NoAttribs, Any( IsNoAttribs() ) ); + aUserData.emplace_back( sUNO_View_NoColors, Any( IsNoColors() ) ); + + if( GetStandardHelpLines().GetCount() ) + aUserData.emplace_back( sUNO_View_SnapLinesDrawing, Any( createHelpLinesString( GetStandardHelpLines() ) ) ); + + if( GetNotesHelpLines().GetCount() ) + aUserData.emplace_back( sUNO_View_SnapLinesNotes, Any( createHelpLinesString( GetNotesHelpLines() ) ) ); + + if( GetHandoutHelpLines().GetCount() ) + aUserData.emplace_back( sUNO_View_SnapLinesHandout, Any( createHelpLinesString( GetHandoutHelpLines() ) ) ); + + aUserData.emplace_back( sUNO_View_RulerIsVisible, Any( HasRuler() ) ); + aUserData.emplace_back( sUNO_View_PageKind, Any( static_cast(GetPageKind()) ) ); + aUserData.emplace_back( sUNO_View_SelectedPage, Any( static_cast(GetSelectedPage()) ) ); + aUserData.emplace_back( sUNO_View_IsLayerMode, Any( IsLayerMode() ) ); + + aUserData.emplace_back( sUNO_View_IsDoubleClickTextEdit, Any( IsDoubleClickTextEdit() ) ); + aUserData.emplace_back( sUNO_View_IsClickChangeRotation, Any( IsClickChangeRotation() ) ); + + aUserData.emplace_back( sUNO_View_SlidesPerRow, Any( static_cast(GetSlidesPerRow()) ) ); + aUserData.emplace_back( sUNO_View_EditMode, Any( static_cast(GetViewShEditMode()) ) ); + // aUserData.emplace_back( sUNO_View_EditModeStandard, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Standard ) ) ); + // aUserData.emplace_back( sUNO_View_EditModeNotes, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Notes ) ) ); + // aUserData.emplace_back( sUNO_View_EditModeHandout, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Handout ) ) ); + + { + const ::tools::Rectangle aVisArea = GetVisArea(); + + aUserData.emplace_back( sUNO_View_VisibleAreaTop, Any( static_cast(aVisArea.Top()) ) ); + aUserData.emplace_back( sUNO_View_VisibleAreaLeft, Any( static_cast(aVisArea.Left()) ) ); + aUserData.emplace_back( sUNO_View_VisibleAreaWidth, Any( static_cast(aVisArea.GetWidth()) ) ); + aUserData.emplace_back( sUNO_View_VisibleAreaHeight, Any( static_cast(aVisArea.GetHeight()) ) ); + } + + aUserData.emplace_back( sUNO_View_GridCoarseWidth, Any( static_cast(GetGridCoarse().Width()) ) ); + aUserData.emplace_back( sUNO_View_GridCoarseHeight, Any( static_cast(GetGridCoarse().Height()) ) ); + aUserData.emplace_back( sUNO_View_GridFineWidth, Any( static_cast(GetGridFine().Width()) ) ); + aUserData.emplace_back( sUNO_View_GridFineHeight, Any( static_cast(GetGridFine().Height()) ) ); + aUserData.emplace_back( sUNO_View_GridSnapWidthXNumerator, Any( GetSnapGridWidthX().GetNumerator() ) ); + aUserData.emplace_back( sUNO_View_GridSnapWidthXDenominator, Any( GetSnapGridWidthX().GetDenominator() ) ); + aUserData.emplace_back( sUNO_View_GridSnapWidthYNumerator, Any( GetSnapGridWidthY().GetNumerator() ) ); + aUserData.emplace_back( sUNO_View_GridSnapWidthYDenominator, Any( GetSnapGridWidthY().GetDenominator() ) ); + aUserData.emplace_back( sUNO_View_IsAngleSnapEnabled, Any( IsAngleSnapEnabled() ) ); + aUserData.emplace_back( sUNO_View_SnapAngle, Any( static_cast(GetSnapAngle()) ) ); + + const sal_Int32 nOldLength = rValues.getLength(); + rValues.realloc( nOldLength + aUserData.size() ); + + PropertyValue* pValue = &(rValues.getArray()[nOldLength]); + + for( const auto& rItem : aUserData ) + { + pValue->Name = rItem.first; + pValue->Value = rItem.second; + ++pValue; + } +} + +static void createHelpLinesFromString( const OUString& rLines, SdrHelpLineList& rHelpLines ) +{ + const sal_Unicode * pStr = rLines.getStr(); + SdrHelpLine aNewHelpLine; + OUStringBuffer sBuffer; + + while( *pStr ) + { + Point aPoint; + + switch( *pStr ) + { + case 'P': + aNewHelpLine.SetKind( SdrHelpLineKind::Point ); + break; + case 'V': + aNewHelpLine.SetKind( SdrHelpLineKind::Vertical ); + break; + case 'H': + aNewHelpLine.SetKind( SdrHelpLineKind::Horizontal ); + break; + default: + OSL_FAIL( "syntax error in snap lines settings string" ); + return; + } + + pStr++; + + while( (*pStr >= '0' && *pStr <= '9') || (*pStr == '+') || (*pStr == '-') ) + { + sBuffer.append( *pStr++ ); + } + + sal_Int32 nValue = o3tl::toInt32(sBuffer); + sBuffer.setLength(0); + + if( aNewHelpLine.GetKind() == SdrHelpLineKind::Horizontal ) + { + aPoint.setY( nValue ); + } + else + { + aPoint.setX( nValue ); + + if( aNewHelpLine.GetKind() == SdrHelpLineKind::Point ) + { + if( *pStr++ != ',' ) + return; + + while( (*pStr >= '0' && *pStr <= '9') || (*pStr == '+') || (*pStr == '-') ) + { + sBuffer.append( *pStr++ ); + } + + aPoint.setY( o3tl::toInt32(sBuffer) ); + sBuffer.setLength(0); + + } + } + + aNewHelpLine.SetPos( aPoint ); + rHelpLines.Insert( aNewHelpLine ); + } +} + +void FrameView::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + const sal_Int32 nLength = rSequence.getLength(); + if (!nLength) + return; + + SdDrawDocument* pDrawDocument = dynamic_cast(&GetModel()); + const bool bImpress = pDrawDocument && pDrawDocument->GetDocumentType() == DocumentType::Impress; + + bool bBool = false; + sal_Int32 nInt32 = 0; + sal_Int16 nInt16 = 0; + OUString aString; + + sal_Int32 aSnapGridWidthXNum = GetSnapGridWidthX().GetNumerator(); + sal_Int32 aSnapGridWidthXDom = GetSnapGridWidthX().GetDenominator(); + + sal_Int32 aSnapGridWidthYNum = GetSnapGridWidthY().GetNumerator(); + sal_Int32 aSnapGridWidthYDom = GetSnapGridWidthY().GetDenominator(); + + for (const css::beans::PropertyValue& rValue : rSequence) + { + if ( rValue.Name == sUNO_View_ViewId ) + { + } + else if ( rValue.Name == sUNO_View_SnapLinesDrawing ) + { + if( rValue.Value >>= aString ) + { + SdrHelpLineList aHelpLines; + createHelpLinesFromString( aString, aHelpLines ); + SetStandardHelpLines( aHelpLines ); + } + } + else if ( rValue.Name == sUNO_View_SnapLinesNotes ) + { + if( rValue.Value >>= aString ) + { + SdrHelpLineList aHelpLines; + createHelpLinesFromString( aString, aHelpLines ); + SetNotesHelpLines( aHelpLines ); + } + } + else if ( rValue.Name == sUNO_View_SnapLinesHandout ) + { + if( rValue.Value >>= aString ) + { + SdrHelpLineList aHelpLines; + createHelpLinesFromString( aString, aHelpLines ); + SetHandoutHelpLines( aHelpLines ); + } + } + else if ( rValue.Name == sUNO_View_RulerIsVisible ) + { + if( rValue.Value >>= bBool ) + { + SetRuler( bBool ); + } + } + else if ( rValue.Name == sUNO_View_PageKind ) + { + if( rValue.Value >>= nInt16 ) + { + SdDrawDocument* pDoc = dynamic_cast(&GetModel()); + if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) ) + SetPageKind( static_cast(nInt16) ); + + SetPageKindOnLoad( static_cast(nInt16) ); + } + } + else if ( rValue.Name == sUNO_View_SelectedPage ) + { + if( rValue.Value >>= nInt16 ) + { + SdDrawDocument* pDoc = dynamic_cast(&GetModel()); + if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) ) + SetSelectedPage( static_cast(nInt16) ); + + SetSelectedPageOnLoad( static_cast(nInt16) ); + } + } + else if ( rValue.Name == sUNO_View_IsLayerMode ) + { + if( rValue.Value >>= bBool ) + { + SetLayerMode( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsDoubleClickTextEdit ) + { + if( rValue.Value >>= bBool ) + { + SetDoubleClickTextEdit( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsClickChangeRotation ) + { + if( rValue.Value >>= bBool ) + { + SetClickChangeRotation( bBool ); + } + } + else if ( rValue.Name == sUNO_View_SlidesPerRow ) + { + if( rValue.Value >>= nInt16 ) + { + SetSlidesPerRow( static_cast(nInt16) ); + } + } + else if ( rValue.Name == sUNO_View_EditMode ) + { + if( rValue.Value >>= nInt32 ) + { + SdDrawDocument* pDoc = dynamic_cast(&GetModel()); + if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) ) + SetViewShEditMode( static_cast(nInt32) ); + } + } + // This one is kept for compatibility. Old value read from sUNO_View_EditModeStandard + // is used. New value will be written into sUNO_View_EditMode. + // Values from sUNO_View_EditModeNotes and sUNO_View_EditModeHangout will be ignored. + else if ( rValue.Name == sUNO_View_EditModeStandard ) + { + if( rValue.Value >>= nInt32 ) + { + SdDrawDocument* pDoc = dynamic_cast(&GetModel()); + if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) ) + SetViewShEditMode( static_cast(nInt32) ); + } + } + else if ( rValue.Name == sUNO_View_VisibleAreaTop ) + { + sal_Int32 nTop = 0; + if( rValue.Value >>= nTop ) + { + ::tools::Rectangle aVisArea( GetVisArea() ); + aVisArea.AdjustBottom(nTop - aVisArea.Top() ); + aVisArea.SetTop( nTop ); + SetVisArea( aVisArea ); + } + } + else if ( rValue.Name == sUNO_View_VisibleAreaLeft ) + { + sal_Int32 nLeft = 0; + if( rValue.Value >>= nLeft ) + { + ::tools::Rectangle aVisArea( GetVisArea() ); + aVisArea.AdjustRight(nLeft - aVisArea.Left() ); + aVisArea.SetLeft( nLeft ); + SetVisArea( aVisArea ); + } + } + else if ( rValue.Name == sUNO_View_VisibleAreaWidth ) + { + sal_Int32 nWidth = 0; + if( rValue.Value >>= nWidth ) + { + ::tools::Rectangle aVisArea( GetVisArea() ); + aVisArea.SetRight( aVisArea.Left() + nWidth - 1 ); + SetVisArea( aVisArea ); + } + } + else if ( rValue.Name == sUNO_View_VisibleAreaHeight ) + { + sal_Int32 nHeight = 0; + if( rValue.Value >>= nHeight ) + { + ::tools::Rectangle aVisArea( GetVisArea() ); + aVisArea.SetBottom( nHeight + aVisArea.Top() - 1 ); + SetVisArea( aVisArea ); + } + } + + else if ( rValue.Name == sUNO_View_GridIsVisible ) + { + if( rValue.Value >>= bBool ) + { + SetGridVisible( bBool ); + } + } + + else if ( rValue.Name == sUNO_View_IsSnapToGrid ) + { + if( rValue.Value >>= bBool ) + { + SetGridSnap( bBool ); + } + } + else if ( rValue.Name == sUNO_View_GridIsFront ) + { + if( rValue.Value >>= bBool ) + { + SetGridFront( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsSnapToPageMargins ) + { + if( rValue.Value >>= bBool ) + { + SetBordSnap( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsSnapToSnapLines ) + { + if( rValue.Value >>= bBool ) + { + SetHlplSnap( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsSnapToObjectFrame ) + { + if( rValue.Value >>= bBool ) + { + SetOFrmSnap( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsSnapToObjectPoints ) + { + if( rValue.Value >>= bBool ) + { + SetOPntSnap( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsPlusHandlesAlwaysVisible ) + { + if( rValue.Value >>= bBool ) + { + SetPlusHandlesAlwaysVisible( bBool ); + } + } + else if ( rValue.Name == sUNO_View_IsFrameDragSingles ) + { + if( rValue.Value >>= bBool ) + { + SetFrameDragSingles( bBool ); + } + } + else if ( rValue.Name == sUNO_View_EliminatePolyPointLimitAngle ) + { + if( rValue.Value >>= nInt32 ) + { + SetEliminatePolyPointLimitAngle( Degree100(nInt32) ); + } + } + else if ( rValue.Name == sUNO_View_IsEliminatePolyPoints ) + { + if( rValue.Value >>= bBool ) + { + SetEliminatePolyPoints( bBool ); + } + } + else if ( rValue.Name == sUNO_View_ActiveLayer ) + { + if( rValue.Value >>= aString ) + { + SetActiveLayer( aString ); + } + } + else if ( rValue.Name == sUNO_View_NoAttribs ) + { + if( rValue.Value >>= bBool ) + { + SetNoAttribs( bBool ); + } + } + else if ( rValue.Name == sUNO_View_NoColors ) + { + if( rValue.Value >>= bBool ) + { + SetNoColors( bBool ); + } + } + else if ( rValue.Name == sUNO_View_GridCoarseWidth ) + { + if( rValue.Value >>= nInt32 ) + { + const Size aCoarse( nInt32, GetGridCoarse().Height() ); + SetGridCoarse( aCoarse ); + } + } + else if ( rValue.Name == sUNO_View_GridCoarseHeight ) + { + if( rValue.Value >>= nInt32 ) + { + const Size aCoarse( GetGridCoarse().Width(), nInt32 ); + SetGridCoarse( aCoarse ); + } + } + else if ( rValue.Name == sUNO_View_GridFineWidth ) + { + if( rValue.Value >>= nInt32 ) + { + const Size aCoarse( nInt32, GetGridFine().Height() ); + SetGridFine( aCoarse ); + } + } + else if ( rValue.Name == sUNO_View_GridFineHeight ) + { + if( rValue.Value >>= nInt32 ) + { + const Size aCoarse( GetGridFine().Width(), nInt32 ); + SetGridFine( aCoarse ); + } + } + else if ( rValue.Name == sUNO_View_IsAngleSnapEnabled ) + { + if( rValue.Value >>= bBool ) + { + SetAngleSnapEnabled( bBool ); + } + } + else if ( rValue.Name == sUNO_View_SnapAngle ) + { + if( rValue.Value >>= nInt32 ) + { + SetSnapAngle( Degree100(nInt32) ); + } + } + else if ( rValue.Name == sUNO_View_GridSnapWidthXNumerator ) + { + rValue.Value >>= aSnapGridWidthXNum; + } + else if ( rValue.Name == sUNO_View_GridSnapWidthXDenominator ) + { + rValue.Value >>= aSnapGridWidthXDom; + } + else if ( rValue.Name == sUNO_View_GridSnapWidthYNumerator ) + { + rValue.Value >>= aSnapGridWidthYNum; + } + else if ( rValue.Name == sUNO_View_GridSnapWidthYDenominator ) + { + rValue.Value >>= aSnapGridWidthYDom; + } + else if (!bImpress && rValue.Name == sUNO_View_VisibleLayers ) + { + SdrLayerIDSet aSdrLayerIDSets; + aSdrLayerIDSets.PutValue( rValue.Value ); + SetVisibleLayers( aSdrLayerIDSets ); + } + else if (!bImpress && rValue.Name == sUNO_View_PrintableLayers ) + { + SdrLayerIDSet aSdrLayerIDSets; + aSdrLayerIDSets.PutValue( rValue.Value ); + SetPrintableLayers( aSdrLayerIDSets ); + } + else if (!bImpress && rValue.Name == sUNO_View_LockedLayers ) + { + SdrLayerIDSet aSdrLayerIDSets; + aSdrLayerIDSets.PutValue( rValue.Value ); + SetLockedLayers( aSdrLayerIDSets ); + } + } + + SetViewShEditModeOnLoad(EditMode::Page); + + const Fraction aSnapGridWidthX( aSnapGridWidthXNum, aSnapGridWidthXDom ); + const Fraction aSnapGridWidthY( aSnapGridWidthYNum, aSnapGridWidthYDom ); + + SetSnapGridWidth( aSnapGridWidthX, aSnapGridWidthY ); +} + +void FrameView::SetPreviousViewShellType (ViewShell::ShellType eType) +{ + mePreviousViewShellType = eType; +} + +void FrameView::SetViewShellTypeOnLoad (ViewShell::ShellType eType) +{ + meViewShellTypeOnLoad = eType; +} + +void FrameView::SetSelectedPage(sal_uInt16 nPage) +{ + mnSelectedPage = nPage; +} + +void FrameView::SetIsNavigatorShowingAllShapes (const bool bIsNavigatorShowingAllShapes) +{ + mbIsNavigatorShowingAllShapes = bIsNavigatorShowingAllShapes; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/grviewsh.cxx b/sd/source/ui/view/grviewsh.cxx new file mode 100644 index 0000000000..b914b2da8c --- /dev/null +++ b/sd/source/ui/view/grviewsh.cxx @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include + +constexpr sal_Int32 TAB_HEIGHT_MARGIN = 10; + +namespace sd { + +GraphicViewShell::GraphicViewShell ( + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameView) + : DrawViewShell ( + rViewShellBase, + pParentWindow, + PageKind::Standard, + pFrameView) +{ + ConstructGraphicViewShell(); +} + +GraphicViewShell::~GraphicViewShell() +{ +} + +void GraphicViewShell::ConstructGraphicViewShell() +{ + meShellType = ST_DRAW; + + mpLayerTabBar.reset (VclPtr::Create(this, GetParentWindow())); + + // #i67363# no layer tabbar in preview mode + if ( !GetObjectShell()->IsPreview() ) + mpLayerTabBar->Show(); +} + +void GraphicViewShell::ChangeEditMode ( + EditMode eMode, + bool ) +{ + // There is no page tab that could be shown instead of the layer tab. + // Therefore we have it always visible regardless of what the caller + // said. (We have to change the callers behaviour, of course.) + DrawViewShell::ChangeEditMode (eMode, true); +} + +void GraphicViewShell::ArrangeGUIElements() +{ + if (mpLayerTabBar && mpLayerTabBar->IsVisible()) + { + Size aSize = mpLayerTabBar->GetSizePixel(); + const Size aFrameSize (GetViewFrame()->GetWindow().GetOutputSizePixel()); + + aSize.setHeight(GetParentWindow()->GetFont().GetFontHeight() + TAB_HEIGHT_MARGIN); + aSize.setWidth( aFrameSize.Width() ); + + Point aPos (0, maViewSize.Height() - aSize.Height()); + + mpLayerTabBar->SetPosSizePixel (aPos, aSize); + } + + DrawViewShell::ArrangeGUIElements(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/outlnvs2.cxx b/sd/source/ui/view/outlnvs2.cxx new file mode 100644 index 0000000000..003a4c1f92 --- /dev/null +++ b/sd/source/ui/view/outlnvs2.cxx @@ -0,0 +1,637 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; + +namespace sd { + +/************************************************************************/ + +/** + * SfxRequests for temporary functions + */ + +void OutlineViewShell::FuTemporary(SfxRequest &rReq) +{ + DeactivateCurrentFunction(); + + OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() ); + sal_uInt16 nSId = rReq.GetSlot(); + + switch( nSId ) + { + case SID_ATTR_ZOOM: + { + const SfxItemSet* pArgs = rReq.GetArgs(); + + if ( pArgs ) + { + SvxZoomType eZT = pArgs->Get( SID_ATTR_ZOOM ).GetType(); + switch( eZT ) + { + case SvxZoomType::PERCENT: + SetZoom( static_cast<::tools::Long>( pArgs->Get( SID_ATTR_ZOOM ).GetValue()) ); + Invalidate( SID_ATTR_ZOOM ); + Invalidate( SID_ATTR_ZOOMSLIDER ); + break; + default: + break; + } + rReq.Done(); + } + else + { + // open the zoom dialog here + SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + } + Cancel(); + } + break; + + case SID_ATTR_ZOOMSLIDER: + { + const SfxItemSet* pArgs = rReq.GetArgs(); + + const SfxUInt16Item* pScale = (pArgs && pArgs->Count () == 1) ? + rReq.GetArg(SID_ATTR_ZOOMSLIDER) : nullptr; + if (pScale && CHECK_RANGE (5, pScale->GetValue (), 3000)) + { + SetZoom (pScale->GetValue ()); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_ATTR_ZOOM ); + rBindings.Invalidate( SID_ZOOM_IN ); + rBindings.Invalidate( SID_ZOOM_OUT ); + rBindings.Invalidate( SID_ATTR_ZOOMSLIDER ); + + } + + Cancel(); + rReq.Done (); + break; + } + + case SID_ZOOM_IN: + { + SetZoom( std::min<::tools::Long>( GetActiveWindow()->GetZoom() * 2, GetActiveWindow()->GetMaxZoom() ) ); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + Invalidate( SID_ATTR_ZOOM ); + Invalidate( SID_ZOOM_IN ); + Invalidate(SID_ZOOM_OUT); + Invalidate( SID_ATTR_ZOOMSLIDER ); + Cancel(); + rReq.Done(); + } + break; + + case SID_SIZE_REAL: + { + SetZoom( 100 ); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + Invalidate( SID_ATTR_ZOOM ); + Invalidate( SID_ATTR_ZOOMSLIDER ); + Cancel(); + rReq.Done(); + } + break; + + case SID_ZOOM_OUT: + { + SetZoom( std::max<::tools::Long>( GetActiveWindow()->GetZoom() / 2, GetActiveWindow()->GetMinZoom() ) ); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), + GetActiveWindow()->GetOutputSizePixel()) ); + mpZoomList->InsertZoomRect(aVisAreaWin); + Invalidate( SID_ATTR_ZOOM ); + Invalidate( SID_ZOOM_OUT); + Invalidate( SID_ZOOM_IN ); + Invalidate( SID_ATTR_ZOOMSLIDER ); + Cancel(); + rReq.Done(); + } + break; + + case SID_OUTLINE_COLLAPSE_ALL: + { + pOutlinerView->CollapseAll(); + Cancel(); + rReq.Done(); + } + break; + + case SID_OUTLINE_COLLAPSE: + { + pOutlinerView->Collapse(); + Cancel(); + rReq.Done(); + } + break; + + case SID_OUTLINE_EXPAND_ALL: + { + pOutlinerView->ExpandAll(); + Cancel(); + rReq.Done(); + } + break; + + case SID_OUTLINE_EXPAND: + { + pOutlinerView->Expand(); + Cancel(); + rReq.Done(); + } + break; + + case SID_OUTLINE_FORMAT: + { + ::Outliner* pOutl = pOutlinerView->GetOutliner(); + pOutl->SetFlatMode( !pOutl->IsFlatMode() ); + Invalidate( SID_COLORVIEW ); + Cancel(); + rReq.Done(); + } + break; + + case SID_SELECTALL: + { + ::Outliner& rOutl = pOlView->GetOutliner(); + sal_Int32 nParaCount = rOutl.GetParagraphCount(); + if (nParaCount > 0) + { + pOutlinerView->SelectRange( 0, nParaCount ); + } + Cancel(); + } + break; + + case SID_PRESENTATION: + case SID_PRESENTATION_CURRENT_SLIDE: + case SID_REHEARSE_TIMINGS: + { + pOlView->PrepareClose(); + slideshowhelp::ShowSlideShow(rReq, *GetDoc()); + Cancel(); + rReq.Done(); + } + break; + + case SID_COLORVIEW: + { + ::Outliner* pOutl = pOutlinerView->GetOutliner(); + EEControlBits nCntrl = pOutl->GetControlWord(); + + if ( !(nCntrl & EEControlBits::NOCOLORS) ) + { + // color view is enabled: disable + pOutl->SetControlWord(nCntrl | EEControlBits::NOCOLORS); + } + else + { + // color view is disabled: enable + pOutl->SetControlWord(nCntrl & ~EEControlBits::NOCOLORS); + } + + InvalidateWindows(); + Invalidate( SID_COLORVIEW ); + Cancel(); + rReq.Done(); + } + break; + + case SID_STYLE_EDIT: + case SID_STYLE_UPDATE_BY_EXAMPLE: + { + if( rReq.GetArgs() ) + { + SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + } + + rReq.Ignore (); + } + break; + + case SID_PRESENTATION_DLG: + { + SetCurrentFunction( FuSlideShowDlg::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_REMOTE_DLG: + { +#ifdef ENABLE_SDREMOTE + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + ScopedVclPtr pDlg(pFact->CreateRemoteDialog(GetFrameWeld())); + pDlg->Execute(); +#endif + } + break; + + case SID_CUSTOMSHOW_DLG: + { + SetCurrentFunction( FuCustomShowDlg::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_PHOTOALBUM: + { + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg(pFact->CreateSdPhotoAlbumDialog( + pWin ? pWin->GetFrameWeld() : nullptr, + GetDoc())); + + pDlg->Execute(); + + Cancel(); + rReq.Ignore (); + } + break; + } + + if(HasCurrentFunction()) + GetCurrentFunction()->Activate(); + + Invalidate( SID_OUTLINE_COLLAPSE_ALL ); + Invalidate( SID_OUTLINE_COLLAPSE ); + Invalidate( SID_OUTLINE_EXPAND_ALL ); + Invalidate( SID_OUTLINE_EXPAND ); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_OUTLINE_LEFT ); + rBindings.Invalidate( SID_OUTLINE_RIGHT ); + rBindings.Invalidate( SID_OUTLINE_UP ); + rBindings.Invalidate( SID_OUTLINE_DOWN ); + + Invalidate( SID_OUTLINE_FORMAT ); + Invalidate( SID_COLORVIEW ); + Invalidate(SID_CUT); + Invalidate(SID_COPY); + Invalidate(SID_PASTE); + Invalidate(SID_PASTE_UNFORMATTED); +} + +void OutlineViewShell::FuTemporaryModify(SfxRequest &rReq) +{ + sal_uInt16 nSId = rReq.GetSlot(); + std::unique_ptr> aGuard; + if (nSId != SID_OUTLINE_BULLET && nSId != FN_SVX_SET_BULLET && nSId != FN_SVX_SET_NUMBER) + { + aGuard.reset( new OutlineViewModelChangeGuard(*pOlView) ); + } + DeactivateCurrentFunction(); + + OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() ); + //sal_uInt16 nSId = rReq.GetSlot(); + + switch( nSId ) + { + case SID_HYPERLINK_SETLINK: + { + const SfxItemSet* pReqArgs = rReq.GetArgs(); + + if (pReqArgs) + { + const SvxHyperlinkItem* pHLItem = + &pReqArgs->Get(SID_HYPERLINK_SETLINK); + + SvxFieldItem aURLItem(SvxURLField(pHLItem->GetURL(), + pHLItem->GetName(), + SvxURLFormat::Repr), EE_FEATURE_FIELD); + ESelection aSel( pOutlinerView->GetSelection() ); + pOutlinerView->InsertField(aURLItem); + if ( aSel.nStartPos <= aSel.nEndPos ) + aSel.nEndPos = aSel.nStartPos + 1; + else + aSel.nStartPos = aSel.nEndPos + 1; + pOutlinerView->SetSelection( aSel ); + } + + Cancel(); + rReq.Ignore (); + } + break; + + case FN_INSERT_SOFT_HYPHEN: + case FN_INSERT_HARDHYPHEN: + case FN_INSERT_HARD_SPACE: + case FN_INSERT_NNBSP: + case SID_INSERT_RLM : + case SID_INSERT_LRM : + case SID_INSERT_WJ : + case SID_INSERT_ZWSP: + case SID_CHARMAP: + { + SetCurrentFunction( FuBullet::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_OUTLINE_BULLET: + case FN_SVX_SET_BULLET: + case FN_SVX_SET_NUMBER: + { + SetCurrentFunction( FuBulletAndPosition::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_THESAURUS: + { + SetCurrentFunction( FuThesaurus::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + rReq.Ignore (); + } + break; + + case SID_CHAR_DLG_EFFECT: + case SID_CHAR_DLG: + { + SetCurrentFunction( FuChar::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + Cancel(); + } + break; + + case SID_INSERTFILE: + { + SetCurrentFunction( FuInsertFile::Create(this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq) ); + Cancel(); + } + break; + + case SID_PRESENTATIONOBJECT: + { + SetCurrentFunction( FuPresentationObjects::Create(this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq) ); + Cancel(); + } + break; + + case SID_SET_DEFAULT: + { + pOutlinerView->RemoveAttribs(true); // sal_True = also paragraph attributes + Cancel(); + rReq.Done(); + } + break; + + case SID_SUMMARY_PAGE: + { + pOlView->SetSelectedPages(); + SetCurrentFunction( FuSummaryPage::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + pOlView->GetOutliner().Clear(); + pOlView->FillOutliner(); + pOlView->GetActualPage(); + Cancel(); + } + break; + + case SID_EXPAND_PAGE: + { + pOlView->SetSelectedPages(); + SetCurrentFunction( FuExpandPage::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) ); + pOlView->GetOutliner().Clear(); + pOlView->FillOutliner(); + pOlView->GetActualPage(); + Cancel(); + } + break; + + case SID_INSERT_FLD_DATE_FIX: + case SID_INSERT_FLD_DATE_VAR: + case SID_INSERT_FLD_TIME_FIX: + case SID_INSERT_FLD_TIME_VAR: + case SID_INSERT_FLD_AUTHOR: + case SID_INSERT_FLD_PAGE: + case SID_INSERT_FLD_PAGE_TITLE: + case SID_INSERT_FLD_PAGES: + case SID_INSERT_FLD_FILE: + { + std::unique_ptr pFieldItem; + + switch( nSId ) + { + case SID_INSERT_FLD_DATE_FIX: + pFieldItem.reset(new SvxFieldItem( + SvxDateField( Date( Date::SYSTEM ), SvxDateType::Fix ), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_DATE_VAR: + pFieldItem.reset(new SvxFieldItem( SvxDateField(), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_TIME_FIX: + pFieldItem.reset(new SvxFieldItem( + SvxExtTimeField( ::tools::Time( ::tools::Time::SYSTEM ), SvxTimeType::Fix ), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_TIME_VAR: + pFieldItem.reset(new SvxFieldItem( SvxExtTimeField(), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_AUTHOR: + { + SvtUserOptions aUserOptions; + pFieldItem.reset(new SvxFieldItem( + SvxAuthorField( + aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() ) + , EE_FEATURE_FIELD )); + } + break; + + case SID_INSERT_FLD_PAGE: + pFieldItem.reset(new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_PAGE_TITLE: + pFieldItem.reset(new SvxFieldItem( SvxPageTitleField(), EE_FEATURE_FIELD)); + break; + + case SID_INSERT_FLD_PAGES: + pFieldItem.reset(new SvxFieldItem( SvxPagesField(), EE_FEATURE_FIELD )); + break; + + case SID_INSERT_FLD_FILE: + { + OUString aName; + if( GetDocSh()->HasName() ) + aName = GetDocSh()->GetMedium()->GetName(); + //else + // aName = GetDocSh()->GetName(); + pFieldItem.reset(new SvxFieldItem( SvxExtFileField( aName ), EE_FEATURE_FIELD )); + } + break; + } + + const SvxFieldItem* pOldFldItem = pOutlinerView->GetFieldAtSelection(); + + if( pOldFldItem && ( nullptr != dynamic_cast< const SvxURLField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxDateField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxTimeField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxPageField *>( pOldFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxPagesField *>( pOldFldItem->GetField() )) ) + { + // select field, so it gets deleted on Insert + ESelection aSel = pOutlinerView->GetSelection(); + if( aSel.nStartPos == aSel.nEndPos ) + aSel.nEndPos++; + pOutlinerView->SetSelection( aSel ); + } + + if( pFieldItem ) + pOutlinerView->InsertField( *pFieldItem ); + + pFieldItem.reset(); + + Cancel(); + rReq.Ignore (); + } + break; + + case SID_MODIFY_FIELD: + { + const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection(); + + if( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) ) + { + // Dialog... + SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); + vcl::Window* pWin = GetActiveWindow(); + ScopedVclPtr pDlg(pFact->CreateSdModifyFieldDlg(pWin ? pWin->GetFrameWeld() : nullptr, pFldItem->GetField(), pOutlinerView->GetAttribs() )); + if( pDlg->Execute() == RET_OK ) + { + std::unique_ptr pField(pDlg->GetField()); + if( pField ) + { + SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD ); + //pOLV->DeleteSelected(); <-- unfortunately missing! + // select field, so it gets deleted on Insert + ESelection aSel = pOutlinerView->GetSelection(); + bool bSel = true; + if( aSel.nStartPos == aSel.nEndPos ) + { + bSel = false; + aSel.nEndPos++; + } + pOutlinerView->SetSelection( aSel ); + + pOutlinerView->InsertField( aFieldItem ); + + // reset selection to original state + if( !bSel ) + aSel.nEndPos--; + pOutlinerView->SetSelection( aSel ); + + pField.reset(); + } + + SfxItemSet aSet( pDlg->GetItemSet() ); + if( aSet.Count() ) + { + pOutlinerView->SetAttribs( aSet ); + + ::Outliner* pOutliner = pOutlinerView->GetOutliner(); + if( pOutliner ) + pOutliner->UpdateFields(); + } + } + } + + Cancel(); + rReq.Ignore (); + } + break; + } + + if(HasCurrentFunction()) + GetCurrentFunction()->Activate(); + + Invalidate( SID_OUTLINE_COLLAPSE_ALL ); + Invalidate( SID_OUTLINE_COLLAPSE ); + Invalidate( SID_OUTLINE_EXPAND_ALL ); + Invalidate( SID_OUTLINE_EXPAND ); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_OUTLINE_LEFT ); + rBindings.Invalidate( SID_OUTLINE_RIGHT ); + rBindings.Invalidate( SID_OUTLINE_UP ); + rBindings.Invalidate( SID_OUTLINE_DOWN ); + + Invalidate( SID_OUTLINE_FORMAT ); + Invalidate( SID_COLORVIEW ); + Invalidate(SID_CUT); + Invalidate(SID_COPY); + Invalidate(SID_PASTE); + Invalidate(SID_PASTE_UNFORMATTED); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/outlnvsh.cxx b/sd/source/ui/view/outlnvsh.cxx new file mode 100644 index 0000000000..718b28514e --- /dev/null +++ b/sd/source/ui/view/outlnvsh.cxx @@ -0,0 +1,1886 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define ShellClass_OutlineViewShell +using namespace sd; +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +namespace sd { + +#define MIN_ZOOM 10 // minimum zoom factor +#define MAX_ZOOM 1000 // maximum zoom factor + +/** + * Declare SFX-Slotmap and standard interface + */ +SFX_IMPL_INTERFACE(OutlineViewShell, SfxShell) + +void OutlineViewShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterPopupMenu("outline"); + + GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_TOOLS, SfxVisibilityFlags::Standard | SfxVisibilityFlags::FullScreen | SfxVisibilityFlags::Server, + ToolbarId::Outline_Toolbox); + GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_APPLICATION, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Client | SfxVisibilityFlags::Viewer | SfxVisibilityFlags::ReadonlyDoc, + ToolbarId::Draw_Viewer_Toolbox); + + GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SvxHlinkDlgWrapper::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(::sd::SpellDialogChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG); + GetStaticInterface()->RegisterChildWindow(sfx2::sidebar::SidebarChildWindow::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId()); +} + + +/** + * common initialization part of both constructors + */ +void OutlineViewShell::Construct() +{ + bool bModified = GetDoc()->IsChanged(); + + meShellType = ST_OUTLINE; + Size aSize(29700, 21000); + Point aWinPos (0, 0); + Point aViewOrigin(0, 0); + GetActiveWindow()->SetMinZoomAutoCalc(false); + GetActiveWindow()->SetMinZoom( MIN_ZOOM ); + GetActiveWindow()->SetMaxZoom( MAX_ZOOM ); + InitWindows(aViewOrigin, aSize, aWinPos); + pOlView.reset( new OutlineView(*GetDocSh(), GetActiveWindow(), *this) ); + mpView = pOlView.get(); // Pointer of base class ViewShell + + SetPool( &GetDoc()->GetPool() ); + + SetZoom(69); + + // Apply settings of FrameView + ReadFrameViewData(mpFrameView); + + ::Outliner& rOutl = pOlView->GetOutliner(); + rOutl.SetUpdateLayout(true); + + if (!bModified) + { + rOutl.ClearModifyFlag(); + } + + pLastPage = GetActualPage(); + + SetName( "OutlineViewShell" ); + + GetActiveWindow()->SetHelpId( HID_SDOUTLINEVIEWSHELL ); +} + +Reference OutlineViewShell::CreateSubController() +{ + Reference xSubController; + + if (IsMainViewShell()) + { + // Create uno sub controller for the main view shell. + xSubController.set( new SdUnoOutlineView(*this) ); + } + + return xSubController; +} + +/** + * Default constructor, windows must not center themselves automatically + */ +OutlineViewShell::OutlineViewShell ( + SfxViewFrame* /*pFrame*/, + ViewShellBase& rViewShellBase, + vcl::Window* pParentWindow, + FrameView* pFrameViewArgument) + : ViewShell(pParentWindow, rViewShellBase), + pLastPage( nullptr ), + bPastePossible(false), + mbInitialized(false) + +{ + if (pFrameViewArgument != nullptr) + mpFrameView = pFrameViewArgument; + else + mpFrameView = new FrameView(GetDoc()); + + mpFrameView->Connect(); + + Construct(); + + SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::OutlineText)); + + m_StrOldPageName.clear(); + + doShow(); +} + +OutlineViewShell::~OutlineViewShell() +{ + DisposeFunctions(); + + pOlView.reset(); + + mpFrameView->Disconnect(); + + if ( mxClipEvtLstnr.is() ) + { + mxClipEvtLstnr->RemoveListener( GetActiveWindow() ); + mxClipEvtLstnr->ClearCallbackLink(); // prevent callback if another thread is waiting + } +} + +void OutlineViewShell::Shutdown() +{ + ViewShell::Shutdown(); + + PrepareClose(); +} + +/** + * Paint method: the event gets forwarded from pWindow to the Viewshell + * and the current function + */ +void OutlineViewShell::Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) +{ + if (pOlView) + { + pOlView->Paint(rRect, pWin); + } +} + +void OutlineViewShell::ArrangeGUIElements () +{ + // Retrieve the current size (thickness) of the scroll bars. That is + // the width of the vertical and the height of the horizontal scroll + // bar. + int nScrollBarSize = + GetParentWindow()->GetSettings().GetStyleSettings().GetScrollBarSize(); + maScrBarWH = Size (nScrollBarSize, nScrollBarSize); + + ViewShell::ArrangeGUIElements (); + + ::sd::Window* pWindow = mpContentWindow.get(); + if (pWindow == nullptr) + return; + + pWindow->SetMinZoomAutoCalc(false); + + // change OutputArea of the OutlinerView + OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow); + + ::tools::Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel()); + + aWin = pWindow->PixelToLogic(aWin); + pOutlinerView->SetOutputArea(aWin); + + ::tools::Rectangle aVis = pOutlinerView->GetVisArea(); + + ::tools::Rectangle aText(Point(0,0), + Size(pOlView->GetPaperWidth(), + pOlView->GetOutliner().GetTextHeight())); + if (aWin.GetHeight() > aText.Bottom()) + aText.SetBottom( aWin.GetHeight() ); + + if (!aWin.IsEmpty()) // not when opening + { + InitWindows(Point(0,0), aText.GetSize(), aVis.TopLeft()); + UpdateScrollBars(); + } +} + +/** + * Handle SfxRequest for the Controller + */ +void OutlineViewShell::ExecCtrl(SfxRequest &rReq) +{ + sal_uInt16 nSlot = rReq.GetSlot(); + switch ( nSlot ) + { + case SID_MAIL_SCROLLBODY_PAGEDOWN: + { + ExecReq( rReq ); + break; + } + + case SID_OPT_LOCALE_CHANGED: + { + pOlView->GetOutliner().UpdateFields(); + UpdatePreview( GetActualPage() ); + rReq.Done(); + break; + } + + default: + break; + } +} + +/** + * Activate(): during the first invocation the fields get updated + */ +void OutlineViewShell::Activate( bool bIsMDIActivate ) +{ + if ( ! mbInitialized) + { + mbInitialized = true; + SfxRequest aRequest (SID_EDIT_OUTLINER, SfxCallMode::SLOT, GetDoc()->GetItemPool()); + FuPermanent (aRequest); + } + + ViewShell::Activate( bIsMDIActivate ); + SfxShell::BroadcastContextForActivation(true); + + pOlView->SetLinks(); + pOlView->ConnectToApplication(); + + if( bIsMDIActivate ) + { + OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() ); + ::Outliner* pOutl = pOutlinerView->GetOutliner(); + pOutl->UpdateFields(); + } +} + +void OutlineViewShell::Deactivate( bool bIsMDIActivate ) +{ + pOlView->DisconnectFromApplication(); + + // Links must be kept also on deactivated viewshell, to allow drag'n'drop + // to function properly + ViewShell::Deactivate( bIsMDIActivate ); +} + +/** + * Set status of Controller-SfxSlots + */ +void OutlineViewShell::GetCtrlState(SfxItemSet &rSet) +{ + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_HYPERLINK_GETLINK)) + { + SvxHyperlinkItem aHLinkItem; + + OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow()); + if (pOLV) + { + const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection(); + if (pFieldItem) + { + ESelection aSel = pOLV->GetSelection(); + if ( abs( aSel.nEndPos - aSel.nStartPos ) == 1 ) + { + const SvxFieldData* pField = pFieldItem->GetField(); + if ( auto pUrlField = dynamic_cast< const SvxURLField *>( pField ) ) + { + aHLinkItem.SetName(pUrlField->GetRepresentation()); + aHLinkItem.SetURL(pUrlField->GetURL()); + aHLinkItem.SetTargetFrame(pUrlField->GetTargetFrame()); + } + } + } + } + rSet.Put(aHLinkItem); + } + rSet.Put( SfxBoolItem( SID_READONLY_MODE, GetDocSh()->IsReadOnly() ) ); + + if ( SfxItemState::DEFAULT == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) ) + rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, true ) ); + + if ( !(SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_HALFWIDTH) || + SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_FULLWIDTH) || + SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_HIRAGANA) || + SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_KATAKANA)) ) + return; + + if( !SvtCJKOptions::IsChangeCaseMapEnabled() ) + { + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, false ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, false ); + rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH ); + rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH ); + rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA ); + rSet.DisableItem( SID_TRANSLITERATE_KATAKANA ); + } + else + { + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, true ); + GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, true ); + } +} + +/** + * SfxRequests for support functions + */ +void OutlineViewShell::FuSupport(SfxRequest &rReq) +{ + if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs()) + GetDocSh()->SetStyleFamily(static_cast(rReq.GetArgs()->Get( SID_STYLE_FAMILY ).GetValue())); + + bool bPreviewState = false; + sal_uInt16 nSlot = rReq.GetSlot(); + + std::unique_ptr> aGuard; + if( pOlView && ( + (nSlot == SID_TRANSLITERATE_SENTENCE_CASE) || + (nSlot == SID_TRANSLITERATE_TITLE_CASE) || + (nSlot == SID_TRANSLITERATE_TOGGLE_CASE) || + (nSlot == SID_TRANSLITERATE_UPPER) || + (nSlot == SID_TRANSLITERATE_LOWER) || + (nSlot == SID_TRANSLITERATE_HALFWIDTH) || + (nSlot == SID_TRANSLITERATE_FULLWIDTH) || + (nSlot == SID_TRANSLITERATE_HIRAGANA) || + (nSlot == SID_TRANSLITERATE_KATAKANA) || + (nSlot == SID_CUT) || + (nSlot == SID_PASTE) || + (nSlot == SID_PASTE_UNFORMATTED) || + (nSlot == SID_DELETE))) + { + aGuard.reset( new OutlineViewModelChangeGuard( *pOlView ) ); + } + + switch ( nSlot ) + { + case SID_CUT: + { + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoCut(); + } + else if (pOlView) + { + pOlView->DoCut(); + } + rReq.Done(); + bPreviewState = true; + } + break; + + case SID_COPY: + { + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoCopy(); + } + else if (pOlView) + { + pOlView->DoCopy(); + } + rReq.Done(); + bPreviewState = true; + } + break; + + case SID_PASTE: + { + OutlineViewPageChangesGuard aGuard2(pOlView.get()); + + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoPaste(); + } + else if (pOlView) + { + pOlView->DoPaste(); + } + rReq.Done(); + bPreviewState = true; + } + break; + + case SID_PASTE_UNFORMATTED: + { + OutlineViewPageChangesGuard aGuard2(pOlView.get()); + + if(HasCurrentFunction()) + { + GetCurrentFunction()->DoPasteUnformatted(); + } + else if(pOlView) + { + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) ); + if (aDataHelper.GetTransferable().is()) + { + sal_Int8 nAction = DND_ACTION_COPY; + pOlView->InsertData( aDataHelper, + GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ), + nAction, false, SotClipboardFormatId::STRING); + } + } + + rReq.Ignore (); + } + break; + case SID_DELETE: + { + if( pOlView ) + { + OutlinerView* pOutlView = pOlView->GetViewByWindow(GetActiveWindow()); + if (pOutlView) + { + OutlineViewPageChangesGuard aGuard2(pOlView.get()); + + vcl::KeyCode aKCode(KEY_DELETE); + KeyEvent aKEvt( 0, aKCode ); + pOutlView->PostKeyEvent(aKEvt); + + rtl::Reference xFunc( GetCurrentFunction() ); + FuOutlineText* pFuOutlineText = dynamic_cast< FuOutlineText* >( xFunc.get() ); + if( pFuOutlineText ) + pFuOutlineText->UpdateForKeyPress (aKEvt); + } + } + rReq.Done(); + bPreviewState = true; + } + break; + + case SID_DRAWINGMODE: + case SID_SLIDE_MASTER_MODE: + case SID_NOTES_MODE: + case SID_NOTES_MASTER_MODE: + case SID_HANDOUT_MASTER_MODE: + case SID_SLIDE_SORTER_MODE: + case SID_OUTLINE_MODE: + framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot( + nSlot, + rReq); + rReq.Done(); + break; + + case SID_RULER: + SetRuler( !HasRuler() ); + Invalidate( SID_RULER ); + rReq.Done(); + break; + + case SID_ZOOM_PREV: + { + if (mpZoomList->IsPreviousPossible()) + { + SetZoomRect(mpZoomList->GetPreviousZoomRect()); + } + rReq.Done (); + } + break; + + case SID_ZOOM_NEXT: + { + if (mpZoomList->IsNextPossible()) + { + SetZoomRect(mpZoomList->GetNextZoomRect()); + } + rReq.Done (); + } + break; + + case SID_AUTOSPELL_CHECK: + { + GetDoc()->SetOnlineSpell(!GetDoc()->GetOnlineSpell()); + rReq.Done (); + } + break; + + case SID_TRANSLITERATE_SENTENCE_CASE: + case SID_TRANSLITERATE_TITLE_CASE: + case SID_TRANSLITERATE_TOGGLE_CASE: + case SID_TRANSLITERATE_UPPER: + case SID_TRANSLITERATE_LOWER: + case SID_TRANSLITERATE_HALFWIDTH: + case SID_TRANSLITERATE_FULLWIDTH: + case SID_TRANSLITERATE_HIRAGANA: + case SID_TRANSLITERATE_KATAKANA: + { + OutlinerView* pOLV = pOlView ? pOlView->GetViewByWindow( GetActiveWindow() ) : nullptr; + if( pOLV ) + { + TransliterationFlags nType = TransliterationFlags::NONE; + + switch( nSlot ) + { + case SID_TRANSLITERATE_SENTENCE_CASE: + nType = TransliterationFlags::SENTENCE_CASE; + break; + case SID_TRANSLITERATE_TITLE_CASE: + nType = TransliterationFlags::TITLE_CASE; + break; + case SID_TRANSLITERATE_TOGGLE_CASE: + nType = TransliterationFlags::TOGGLE_CASE; + break; + case SID_TRANSLITERATE_UPPER: + nType = TransliterationFlags::LOWERCASE_UPPERCASE; + break; + case SID_TRANSLITERATE_LOWER: + nType = TransliterationFlags::UPPERCASE_LOWERCASE; + break; + case SID_TRANSLITERATE_HALFWIDTH: + nType = TransliterationFlags::FULLWIDTH_HALFWIDTH; + break; + case SID_TRANSLITERATE_FULLWIDTH: + nType = TransliterationFlags::HALFWIDTH_FULLWIDTH; + break; + case SID_TRANSLITERATE_HIRAGANA: + nType = TransliterationFlags::KATAKANA_HIRAGANA; + break; + case SID_TRANSLITERATE_KATAKANA: + nType = TransliterationFlags::HIRAGANA_KATAKANA; + break; + } + + pOLV->TransliterateText( nType ); + } + + rReq.Done(); + bPreviewState = true; + } + break; + + // added Undo/Redo handling + case SID_UNDO : + { + OutlineViewPageChangesGuard aGuard2(pOlView.get()); + ImpSidUndo(rReq); + } + break; + case SID_REDO : + { + OutlineViewPageChangesGuard aGuard2(pOlView.get()); + ImpSidRedo(rReq); + } + break; + + default: + break; + } + + if( bPreviewState ) + Invalidate( SID_PREVIEW_STATE ); + + Invalidate(SID_CUT); + Invalidate(SID_COPY); + Invalidate(SID_PASTE); +} + +/** + * SfxRequests for permanent functions + */ +void OutlineViewShell::FuPermanent(SfxRequest &rReq) +{ + if(HasCurrentFunction()) + { + DeactivateCurrentFunction(true); + } + + switch ( rReq.GetSlot() ) + { + case SID_EDIT_OUTLINER: + { + ::Outliner& rOutl = pOlView->GetOutliner(); + rOutl.GetUndoManager().Clear(); + rOutl.UpdateFields(); + + SetCurrentFunction( FuOutlineText::Create(this,GetActiveWindow(),pOlView.get(),GetDoc(),rReq) ); + + rReq.Done(); + } + break; + + default: + break; + } + + if(HasOldFunction()) + { + GetOldFunction()->Deactivate(); + SetOldFunction(nullptr); + } + + if(HasCurrentFunction()) + { + GetCurrentFunction()->Activate(); + SetOldFunction(GetCurrentFunction()); + } +} + +IMPL_LINK( OutlineViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void ) +{ + bPastePossible = pDataHelper->GetFormatCount() != 0 && + ( pDataHelper->HasFormat( SotClipboardFormatId::STRING ) || + pDataHelper->HasFormat( SotClipboardFormatId::RTF ) || + pDataHelper->HasFormat( SotClipboardFormatId::RICHTEXT ) || + pDataHelper->HasFormat( SotClipboardFormatId::HTML ) ); + + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + rBindings.Invalidate( SID_PASTE ); + rBindings.Invalidate( SID_PASTE_SPECIAL ); + rBindings.Invalidate( SID_PASTE_UNFORMATTED ); + rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS ); +} + +/** + * Set Status (Enabled/Disabled) of Menu-SfxSlots + */ +void OutlineViewShell::GetMenuState( SfxItemSet &rSet ) +{ + ViewShell::GetMenuState(rSet); + + rSet.Put(SfxBoolItem(SID_SLIDE_SORTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false)); + rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_OUTLINE_MODE, true)); + rSet.Put(SfxBoolItem(SID_NOTES_MODE, false)); + rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false)); + rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false)); + + if (!mpZoomList->IsNextPossible()) + { + rSet.DisableItem(SID_ZOOM_NEXT); + } + if (!mpZoomList->IsPreviousPossible()) + { + rSet.DisableItem(SID_ZOOM_PREV); + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_IN ) || + SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_OUT ) ) + { + if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() ) + rSet.DisableItem( SID_ZOOM_OUT ); + if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() ) + rSet.DisableItem( SID_ZOOM_IN ); + } + + ::Outliner& rOutl = pOlView->GetOutliner(); + + // allow 'Select All'? + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SELECTALL ) ) + { + sal_Int32 nParaCount = rOutl.GetParagraphCount(); + bool bDisable = nParaCount == 0; + if (!bDisable && nParaCount == 1) + { + OUString aTest = rOutl.GetText(rOutl.GetParagraph(0)); + if (aTest.isEmpty()) + { + bDisable = true; + } + } + if (bDisable) + rSet.DisableItem(SID_SELECTALL); + } + + // set status of Ruler + rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) ); + + // Enable formatting? + rSet.Put( SfxBoolItem( SID_OUTLINE_FORMAT, !rOutl.IsFlatMode() ) ); + + if( rOutl.IsFlatMode() ) + rSet.DisableItem( SID_COLORVIEW ); + else + { + // Enable color view? + EEControlBits nCntrl = rOutl.GetControlWord(); + bool bNoColor = false; + if (nCntrl & EEControlBits::NOCOLORS) + bNoColor = true; + + rSet.Put( SfxBoolItem( SID_COLORVIEW, bNoColor ) ); + } + + // Buttons of toolbar + // first the selection dependent ones: COLLAPSE, EXPAND + bool bDisableCollapse = true; + bool bDisableExpand = true; + bool bUnique = true; + OutlinerView* pOutlinerView = pOlView->GetViewByWindow(GetActiveWindow()); + + std::vector aSelList; + pOutlinerView->CreateSelectionList(aSelList); + + if (!aSelList.empty()) + { + sal_Int16 nTmpDepth = rOutl.GetDepth( rOutl.GetAbsPos( aSelList.front() ) ); + bool bPage = ::Outliner::HasParaFlag( aSelList.front(), ParaFlag::ISPAGE ); + + for (const Paragraph* pPara : aSelList) + { + sal_Int16 nDepth = rOutl.GetDepth( rOutl.GetAbsPos( pPara ) ); + + if( nDepth != nTmpDepth || bPage != ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE )) + bUnique = false; + + if (rOutl.HasChildren(pPara)) + { + if (!rOutl.IsExpanded(pPara)) + bDisableExpand = false; + else + bDisableCollapse = false; + } + } + } + + if (bDisableExpand) + rSet.DisableItem(SID_OUTLINE_EXPAND); + if (bDisableCollapse) + rSet.DisableItem(SID_OUTLINE_COLLAPSE); + + // does the selection provide a unique presentation layout? + // if not, the templates must not be edited + SfxItemSetFixed aSet(*rSet.GetPool()); + GetStatusBarState(aSet); + OUString aTest = aSet.Get(SID_STATUS_LAYOUT).GetValue(); + if (aTest.isEmpty()) + { + bUnique = false; + } + + if (!bUnique) + rSet.DisableItem( SID_PRESENTATIONOBJECT ); + + // now the selection independent ones: COLLAPSE_ALL, EXPAND_ALL + bool bDisableCollapseAll = true; + bool bDisableExpandAll = true; + + // does the selection contain something collapsible/expandable? + if (!bDisableCollapse) + bDisableCollapseAll = false; + if (!bDisableExpand) + bDisableExpandAll = false; + + // otherwise look through all paragraphs + if (bDisableCollapseAll || bDisableExpandAll) + { + sal_Int32 nParaPos = 0; + Paragraph* pPara = rOutl.GetParagraph( nParaPos ); + while (pPara && (bDisableCollapseAll || bDisableExpandAll)) + { + if (!rOutl.IsExpanded(pPara) && rOutl.HasChildren(pPara)) + bDisableExpandAll = false; + + if (rOutl.IsExpanded(pPara) && rOutl.HasChildren(pPara)) + bDisableCollapseAll = false; + + pPara = rOutl.GetParagraph( ++nParaPos ); + } + } + + if (bDisableExpandAll) + rSet.DisableItem(SID_OUTLINE_EXPAND_ALL); + if (bDisableCollapseAll) + rSet.DisableItem(SID_OUTLINE_COLLAPSE_ALL); + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE ) ) + { + if ( !mxClipEvtLstnr.is() ) + { + // create listener + mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, OutlineViewShell, ClipboardChanged ) ); + mxClipEvtLstnr->AddListener( GetActiveWindow() ); + + // get initial state + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) ); + bPastePossible = ( aDataHelper.GetFormatCount() != 0 && + ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) || + aDataHelper.HasFormat( SotClipboardFormatId::RTF ) || + aDataHelper.HasFormat( SotClipboardFormatId::RICHTEXT ) || + aDataHelper.HasFormat( SotClipboardFormatId::HTML ) ) ); + } + + if( !bPastePossible ) + { + rSet.DisableItem( SID_PASTE ); + } + } + + if (!pOlView->GetViewByWindow(GetActiveWindow())->HasSelection() + || GetObjectShell()->isContentExtractionLocked()) + { + rSet.DisableItem(SID_CUT); + rSet.DisableItem(SID_COPY); + } + + if (pOlView->GetOutliner().IsModified()) + { + GetDoc()->SetChanged(); + } + + // the status has to be set here because of overriding + if( !GetDocSh()->IsModified() ) + { + rSet.DisableItem( SID_SAVEDOC ); + } + + if ( GetDocSh()->IsReadOnly() ) + { + rSet.DisableItem( SID_AUTOSPELL_CHECK ); + } + else + { + if (GetDoc()->GetOnlineSpell()) + { + rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, true)); + } + else + { + rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, false)); + } + } + + // field commands + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MODIFY_FIELD ) ) + { + const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection(); + + if( !( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) || + nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) ) ) + { + rSet.DisableItem( SID_MODIFY_FIELD ); + } + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE)) + { + bool bDisable = true; + sal_uInt16 i = 0; + sal_uInt16 nCount = GetDoc()->GetSdPageCount(PageKind::Standard); + pOlView->SetSelectedPages(); + + while (i < nCount && bDisable) + { + SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard); + + if (pPage->IsSelected()) + { + SdrObject* pObj = pPage->GetPresObj(PresObjKind::Outline); + + if (pObj!=nullptr ) + { + if( !pObj->IsEmptyPresObj() ) + { + bDisable = false; + } + else + { + // check if the object is in edit, then if it's temporarily not empty + SdrTextObj* pTextObj = DynCastSdrTextObj( pObj ); + if( pTextObj ) + { + if( pTextObj->CanCreateEditOutlinerParaObject() ) + { + bDisable = false; + } + } + } + } + } + + i++; + } + + if (bDisable) + { + rSet.DisableItem(SID_EXPAND_PAGE); + } + } + + if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE)) + { + bool bDisable = true; + sal_uInt16 i = 0; + sal_uInt16 nCount = GetDoc()->GetSdPageCount(PageKind::Standard); + pOlView->SetSelectedPages(); + + while (i < nCount && bDisable) + { + SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard); + + if (pPage->IsSelected()) + { + SdrObject* pObj = pPage->GetPresObj(PresObjKind::Title); + + if (pObj && !pObj->IsEmptyPresObj()) + { + bDisable = false; + } + } + + i++; + } + + if (bDisable) + { + rSet.DisableItem(SID_SUMMARY_PAGE); + } + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_THESAURUS ) ) + { + if ( !pOlView->IsTextEdit() ) + { + rSet.DisableItem( SID_THESAURUS ); + } + else + { + LanguageType eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE ); + Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() ); + + if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale( LanguageTag::convertToLocale( eLang))) + rSet.DisableItem( SID_THESAURUS ); + } + } + + // is starting the presentation possible? + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) ) + { + bool bDisable = true; + sal_uInt16 nCount = GetDoc()->GetSdPageCount( PageKind::Standard ); + + for( sal_uInt16 i = 0; i < nCount && bDisable; i++ ) + { + SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard); + + if( !pPage->IsExcluded() ) + bDisable = false; + } + if( bDisable || GetDocSh()->IsPreview()) + { + rSet.DisableItem( SID_PRESENTATION ); + } + } + + FuBullet::GetSlotState( rSet, this, GetViewFrame() ); + +} + +/** + * gets invoked when ScrollBar is used + */ +void OutlineViewShell::VirtHScrollHdl(ScrollAdaptor* pHScroll) +{ + ::tools::Long nThumb = pHScroll->GetThumbPos(); + ::tools::Long nRange = pHScroll->GetRange().Len(); + double fX = static_cast(nThumb) / nRange; + + Window* pWin = mpContentWindow.get(); + OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin); + ::tools::Long nViewWidth = pWin->PixelToLogic( + pWin->GetSizePixel()).Width(); + ::tools::Long nTextWidth = pOlView->GetPaperWidth(); + nViewWidth = std::max(nViewWidth, nTextWidth); + ::tools::Long nCurrentPos = pOutlinerView->GetVisArea().Left(); + ::tools::Long nTargetPos = static_cast<::tools::Long>(fX * nViewWidth); + ::tools::Long nDelta = nTargetPos - nCurrentPos; + + pOutlinerView->HideCursor(); + pOutlinerView->Scroll(-nDelta, 0); + pOutlinerView->ShowCursor(false); +} + +void OutlineViewShell::VirtVScrollHdl(ScrollAdaptor* pVScroll) +{ + ::tools::Long nThumb = pVScroll->GetThumbPos(); + ::tools::Long nRange = pVScroll->GetRange().Len(); + double fY = static_cast(nThumb) / nRange; + + Window* pWin = mpContentWindow.get(); + OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin); + ::tools::Long nViewHeight = pWin->PixelToLogic( + pWin->GetSizePixel()).Height(); + ::tools::Long nTextHeight = pOlView->GetOutliner().GetTextHeight(); + nViewHeight += nTextHeight; + ::tools::Long nCurrentPos = pOutlinerView->GetVisArea().Top(); + ::tools::Long nTargetPos = static_cast<::tools::Long>(fY * nViewHeight); + ::tools::Long nDelta = nTargetPos - nCurrentPos; + + pOutlinerView->HideCursor(); + pOutlinerView->Scroll(0, -nDelta); + pOutlinerView->ShowCursor(false); +} + +/** + * PrepareClose, gets called when the Shell shall be destroyed. + * Forwards the invocation to the View + */ +bool OutlineViewShell::PrepareClose( bool bUI ) +{ + if( !ViewShell::PrepareClose(bUI) ) + return false; + + if (pOlView) + pOlView->PrepareClose(); + return true; +} + +/** + * Zoom with zoom factor. Inform OutlinerView + */ +void OutlineViewShell::SetZoom(::tools::Long nZoom) +{ + ViewShell::SetZoom(nZoom); + + ::sd::Window* pWindow = mpContentWindow.get(); + if (pWindow) + { + // change OutputArea of OutlinerView + OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow); + ::tools::Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel()); + aWin = pWindow->PixelToLogic(aWin); + pOutlinerView->SetOutputArea(aWin); + } + + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); +} + +/** + * Zoom with zoom rectangle. Inform OutlinerView + */ +void OutlineViewShell::SetZoomRect(const ::tools::Rectangle& rZoomRect) +{ + ViewShell::SetZoomRect(rZoomRect); + + ::sd::Window* pWindow = mpContentWindow.get(); + if (pWindow) + { + // change OutputArea of OutlinerView + OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow); + ::tools::Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel()); + aWin = pWindow->PixelToLogic(aWin); + pOutlinerView->SetOutputArea(aWin); + } + + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); +} + +/** + * Before saving: Update Model of the Drawing Engine, then forward the + * invocation to the ObjectShell. + */ +void OutlineViewShell::Execute(SfxRequest& rReq) +{ + bool bForwardCall = true; + + switch(rReq.GetSlot()) + { + case SID_SAVEDOC: + case SID_SAVEASDOC: + PrepareClose(); + break; + + case SID_SEARCH_ITEM: + // Forward this request to the common (old) code of the + // document shell. + GetDocSh()->Execute (rReq); + bForwardCall = false; + break; + + case SID_SPELL_DIALOG: + { + SfxViewFrame* pViewFrame = GetViewFrame(); + if (rReq.GetArgs() != nullptr) + pViewFrame->SetChildWindow (SID_SPELL_DIALOG, + static_cast(rReq.GetArgs()-> + Get(SID_SPELL_DIALOG)).GetValue()); + else + pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG); + + pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG); + rReq.Done (); + + bForwardCall = false; + } + break; + + default: + SAL_WARN("sd", "OutlineViewShell::Execute(): can not handle slot " << rReq.GetSlot()); + break; + + } + + if (bForwardCall) + static_cast(GetViewFrame()->GetObjectShell())->ExecuteSlot( rReq ); +} + +/** + * Read FrameViews data and set actual views data + */ +void OutlineViewShell::ReadFrameViewData(FrameView* pView) +{ + ::Outliner& rOutl = pOlView->GetOutliner(); + + rOutl.SetFlatMode( pView->IsNoAttribs() ); + + EEControlBits nCntrl = rOutl.GetControlWord(); + + if ( pView->IsNoColors() ) + rOutl.SetControlWord(nCntrl | EEControlBits::NOCOLORS); + else + rOutl.SetControlWord(nCntrl & ~EEControlBits::NOCOLORS); + + sal_uInt16 nPage = mpFrameView->GetSelectedPage(); + pLastPage = GetDoc()->GetSdPage( nPage, PageKind::Standard ); + pOlView->SetActualPage(pLastPage); +} + +/** + * Write actual views data to FrameView + */ +void OutlineViewShell::WriteFrameViewData() +{ + ::Outliner& rOutl = pOlView->GetOutliner(); + + EEControlBits nCntrl = rOutl.GetControlWord(); + bool bNoColor = false; + if (nCntrl & EEControlBits::NOCOLORS) + bNoColor = true; + mpFrameView->SetNoColors(bNoColor); + mpFrameView->SetNoAttribs( rOutl.IsFlatMode() ); + SdPage* pActualPage = pOlView->GetActualPage(); + DBG_ASSERT(pActualPage, "No current page"); + if( pActualPage ) + mpFrameView->SetSelectedPage((pActualPage->GetPageNum() - 1) / 2); +} + +/** + * Handle SfxRequests for the StatusBar + */ +void OutlineViewShell::ExecStatusBar(SfxRequest&) +{ +} + +void OutlineViewShell::GetStatusBarState(SfxItemSet& rSet) +{ + // Zoom-Item + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOM ) ) + { + sal_uInt16 nZoom = static_cast(GetActiveWindow()->GetZoom()); + + std::unique_ptr pZoomItem(new SvxZoomItem( SvxZoomType::PERCENT, nZoom )); + + // limit area + SvxZoomEnableFlags nZoomValues = SvxZoomEnableFlags::ALL; + nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL; + nZoomValues &= ~SvxZoomEnableFlags::WHOLEPAGE; + nZoomValues &= ~SvxZoomEnableFlags::PAGEWIDTH; + + pZoomItem->SetValueSet( nZoomValues ); + rSet.Put( std::move(pZoomItem) ); + } + + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) ) + { + if (GetDocSh()->IsUIActive() || !GetActiveWindow() ) + { + rSet.DisableItem( SID_ATTR_ZOOMSLIDER ); + } + else + { + sd::Window * pActiveWindow = GetActiveWindow(); + SvxZoomSliderItem aZoomItem( static_cast(pActiveWindow->GetZoom()), static_cast(pActiveWindow->GetMinZoom()), static_cast(pActiveWindow->GetMaxZoom()) ) ; + aZoomItem.AddSnappingPoint(100); + rSet.Put( aZoomItem ); + } + } + + // page view and layout + + sal_uInt16 nPageCount = GetDoc()->GetSdPageCount( PageKind::Standard ); + OUString aPageStr, aLayoutStr; + + ::sd::Window* pWin = GetActiveWindow(); + OutlinerView* pActiveView = pOlView->GetViewByWindow( pWin ); + + std::vector aSelList; + pActiveView->CreateSelectionList(aSelList); + + Paragraph *pFirstPara = nullptr; + Paragraph *pLastPara = nullptr; + + if (!aSelList.empty()) + { + pFirstPara = *(aSelList.begin()); + pLastPara = *(aSelList.rbegin()); + } + + if( !::Outliner::HasParaFlag(pFirstPara,ParaFlag::ISPAGE) ) + pFirstPara = pOlView->GetPrevTitle( pFirstPara ); + + if( !::Outliner::HasParaFlag(pLastPara, ParaFlag::ISPAGE) ) + pLastPara = pOlView->GetPrevTitle( pLastPara ); + + // only one page selected? + if( pFirstPara == pLastPara ) + { + // how many pages are we before the selected page? + sal_uLong nPos = 0; + while( pFirstPara ) + { + pFirstPara = pOlView->GetPrevTitle( pFirstPara ); + if( pFirstPara ) + nPos++; + } + + if( nPos >= GetDoc()->GetSdPageCount( PageKind::Standard ) ) + nPos = 0; + + SdrPage* pPage = GetDoc()->GetSdPage( static_cast(nPos), PageKind::Standard ); + + if (GetDoc()->GetDocumentType() == DocumentType::Draw) + aPageStr = SdResId(STR_SD_PAGE_COUNT_DRAW); + else + aPageStr = SdResId(STR_SD_PAGE_COUNT); + + aPageStr = aPageStr.replaceFirst("%1", OUString::number(static_cast(nPos + 1))); + aPageStr = aPageStr.replaceFirst("%2", OUString::number(nPageCount)); + + aLayoutStr = pPage->GetLayoutName(); + sal_Int32 nIndex = aLayoutStr.indexOf(SD_LT_SEPARATOR); + if (nIndex != -1) + aLayoutStr = aLayoutStr.copy(0, nIndex); + //Now, CurrentPage property change is already sent for DrawView and OutlineView, so it is not necessary to send again here + if(m_StrOldPageName!=aPageStr) + { + GetViewShellBase().GetDrawController()->fireSwitchCurrentPage(nPos); + m_StrOldPageName = aPageStr; + } + } + rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) ); + rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) ); +} + +void OutlineViewShell::Command( const CommandEvent& rCEvt, ::sd::Window* pWin ) +{ + if ( rCEvt.GetCommand() == CommandEventId::ContextMenu ) + { + GetActiveWindow()->ReleaseMouse(); + + OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow()); + Point aPos(rCEvt.GetMousePosPixel()); + + if (pOLV && pOLV->IsWrongSpelledWordAtPos(aPos)) + { + // Popup for Online-Spelling now handled by DrawDocShell + Link aLink = LINK(GetDocSh(), DrawDocShell, OnlineSpellCallback); + + pOLV->ExecuteSpellPopup(aPos, aLink); + pOLV->GetEditView().Invalidate(); + } + else + { + GetViewFrame()->GetDispatcher()->ExecutePopup("outline"); + } + } + else + { + ViewShell::Command( rCEvt, pWin ); + + // if necessary communicate the new context to the Preview + Invalidate( SID_PREVIEW_STATE ); + + } +} + +bool OutlineViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin) +{ + bool bReturn = false; + OutlineViewPageChangesGuard aGuard(pOlView.get()); + + if (pWin == nullptr && HasCurrentFunction()) + { + bReturn = GetCurrentFunction()->KeyInput(rKEvt); + } + + // no, forward to base class + else + { + bReturn = ViewShell::KeyInput(rKEvt, pWin); + } + + Invalidate(SID_STYLE_EDIT); + Invalidate(SID_STYLE_NEW); + Invalidate(SID_STYLE_DELETE); + Invalidate(SID_STYLE_HIDE); + Invalidate(SID_STYLE_SHOW); + Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE); + Invalidate(SID_STYLE_NEW_BY_EXAMPLE); + Invalidate(SID_STYLE_WATERCAN); + Invalidate(SID_STYLE_FAMILY5); + + // check and distinguish cursor movements- or input-keys + vcl::KeyCode aKeyGroup( rKEvt.GetKeyCode().GetGroup() ); + if( (aKeyGroup != KEYGROUP_CURSOR && aKeyGroup != KEYGROUP_FKEYS) || + (GetActualPage() != pLastPage) ) + { + Invalidate( SID_PREVIEW_STATE ); + } + + return bReturn; +} + +/** + * Status of Attribute-Items + */ +void OutlineViewShell::GetAttrState( SfxItemSet& rSet ) +{ + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + SfxAllItemSet aAllSet( *rSet.GetPool() ); + + while ( nWhich ) + { + sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich) + ? GetPool().GetSlotId(nWhich) + : nWhich; + + switch ( nSlotId ) + { + case SID_STYLE_FAMILY2: + case SID_STYLE_FAMILY3: + { + rSet.DisableItem( nWhich ); + } + break; + + case SID_STYLE_FAMILY5: + { + SfxStyleSheet* pStyleSheet = pOlView->GetViewByWindow(GetActiveWindow())->GetStyleSheet(); + + if( pStyleSheet ) + { + pStyleSheet = static_cast(pStyleSheet)->GetPseudoStyleSheet(); + + if (pStyleSheet) + { + SfxTemplateItem aItem( nWhich, pStyleSheet->GetName() ); + aAllSet.Put( aItem, aItem.Which() ); + } + } + + if( !pStyleSheet ) + { + SfxTemplateItem aItem( nWhich, OUString() ); + aAllSet.Put( aItem, aItem.Which() ); + // rSet.DisableItem( nWhich ); + } + } + break; + + case SID_STYLE_EDIT: + { + std::unique_ptr pFamilyItem; + GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem); + if (pFamilyItem && static_cast(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo) + { + SfxItemSetFixed aSet(*rSet.GetPool()); + GetStatusBarState(aSet); + OUString aRealStyle = aSet.Get(SID_STATUS_LAYOUT).GetValue(); + if (aRealStyle.isEmpty()) + { + // no unique layout name found + rSet.DisableItem(nWhich); + } + } + } + break; + + case SID_STYLE_UPDATE_BY_EXAMPLE: + { + ::sd::Window* pActWin = GetActiveWindow(); + OutlinerView* pOV = pOlView->GetViewByWindow(pActWin); + ESelection aESel(pOV->GetSelection()); + + if (aESel.nStartPara != aESel.nEndPara || + aESel.nStartPos != aESel.nEndPos) + // spanned selection, i.e. StyleSheet and/or + // attribution not necessarily unique + rSet.DisableItem(nWhich); + } + break; + + case SID_STYLE_NEW: + case SID_STYLE_DELETE: + case SID_STYLE_HIDE: + case SID_STYLE_SHOW: + case SID_STYLE_NEW_BY_EXAMPLE: + case SID_STYLE_WATERCAN: + { + rSet.DisableItem(nWhich); + } + break; + } + + nWhich = aIter.NextWhich(); + } + + rSet.Put( aAllSet, false ); +} + +void OutlineViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) +{ + // first the base classes + ViewShell::MouseButtonUp(rMEvt, pWin); + + Invalidate(SID_STYLE_EDIT); + Invalidate(SID_STYLE_NEW); + Invalidate(SID_STYLE_DELETE); + Invalidate(SID_STYLE_HIDE); + Invalidate(SID_STYLE_SHOW); + Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE); + Invalidate(SID_STYLE_NEW_BY_EXAMPLE); + Invalidate(SID_STYLE_WATERCAN); + Invalidate(SID_STYLE_FAMILY5); + + // if necessary communicate the new context to the Preview + if( GetActualPage() != pLastPage ) + Invalidate( SID_PREVIEW_STATE ); +} + +SdPage* OutlineViewShell::getCurrentPage() const +{ + // since there are no master pages in outline view, we can + // for now use the GetActualPage method + return const_cast(this)->GetActualPage(); +} + +/** + * Returns the first selected page. + * If nothing is selected, the first page is returned. + */ +SdPage* OutlineViewShell::GetActualPage() +{ + return pOlView->GetActualPage(); +} + +void OutlineViewShell::UpdatePreview( SdPage* pPage ) +{ + const bool bNewPage = pPage != pLastPage; + pLastPage = pPage; + if (bNewPage) + { + OutlineViewPageChangesGuard aGuard(pOlView.get()); + SetCurrentPage(pPage); + } +} + +void OutlineViewShell::UpdateTitleObject( SdPage* pPage, Paragraph const * pPara ) +{ + DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateTitleObject(), pPage == 0?" ); + DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateTitleObject(), pPara == 0?" ); + + if( !pPage || !pPara ) + return; + + ::Outliner& rOutliner = pOlView->GetOutliner(); + SdrTextObj* pTO = OutlineView::GetTitleTextObject( pPage ); + + OUString aTest = rOutliner.GetText(pPara); + bool bText = !aTest.isEmpty(); + + if( bText ) + { + bool bNewObject = false; + // create a title object if we don't have one but have text + if( !pTO ) + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" ); + pTO = OutlineView::CreateTitleTextObject(pPage); + bNewObject = true; + } + + // if we have a title object and a text, set the text + std::optional pOPO; + if (pTO) + pOPO = rOutliner.CreateParaObject(rOutliner.GetAbsPos(pPara), 1); + if (pOPO) + { + pOPO->SetOutlinerMode( OutlinerMode::TitleObject ); + assert(pTO); + pOPO->SetVertical( pTO->IsVerticalWriting() ); + if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) ) + { + // do nothing, same text already set + } + else + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" ); + if( !bNewObject && pOlView->isRecordingUndo() ) + pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0)); + + pTO->SetOutlinerParaObject( std::move(pOPO) ); + pTO->SetEmptyPresObj( false ); + pTO->ActionChanged(); + } + } + } + else if( pTO ) + { + // no text but object available? + // outline object available, but we have no text + if(pPage->IsPresObj(pTO)) + { + // if it is not already empty + if( !pTO->IsEmptyPresObj() ) + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" ); + + // make it empty + if( pOlView->isRecordingUndo() ) + pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0)); + pPage->RestoreDefaultText( pTO ); + pTO->SetEmptyPresObj(true); + pTO->ActionChanged(); + } + } + else + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" ); + // outline object is not part of the layout, delete it + if( pOlView->isRecordingUndo() ) + pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO)); + pPage->RemoveObject(pTO->GetOrdNum()); + } + } +} + +void OutlineViewShell::UpdateOutlineObject( SdPage* pPage, Paragraph* pPara ) +{ + DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateOutlineObject(), pPage == 0?" ); + DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateOutlineObject(), pPara == 0?" ); + + if( !pPage || !pPara ) + return; + + ::Outliner& rOutliner = pOlView->GetOutliner(); + std::optional pOPO; + SdrTextObj* pTO = nullptr; + + OutlinerMode eOutlinerMode = OutlinerMode::TitleObject; + pTO = static_cast(pPage->GetPresObj( PresObjKind::Text )); + if( !pTO ) + { + eOutlinerMode = OutlinerMode::OutlineObject; + pTO = OutlineView::GetOutlineTextObject( pPage ); + } + + // how many paragraphs in the outline? + sal_Int32 nTitlePara = rOutliner.GetAbsPos( pPara ); + sal_Int32 nPara = nTitlePara + 1; + sal_Int32 nParasInLayout = 0; + pPara = rOutliner.GetParagraph( nPara ); + while( pPara && !::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) + { + nParasInLayout++; + pPara = rOutliner.GetParagraph( ++nPara ); + } + if( nParasInLayout ) + { + // create an OutlinerParaObject + pOPO = rOutliner.CreateParaObject( nTitlePara + 1, nParasInLayout ); + } + + if( pOPO ) + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" ); + bool bNewObject = false; + + // do we need an outline text object? + if( !pTO ) + { + pTO = OutlineView::CreateOutlineTextObject( pPage ); + bNewObject = true; + } + + // page object, outline text in Outliner: + // apply text + if( pTO ) + { + pOPO->SetVertical( pTO->IsVerticalWriting() ); + pOPO->SetOutlinerMode( eOutlinerMode ); + if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) ) + { + // do nothing, same text already set + } + else + { + if( !bNewObject && pOlView->isRecordingUndo() ) + pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0)); + + pTO->SetOutlinerParaObject( std::move(pOPO) ); + pTO->SetEmptyPresObj( false ); + pTO->ActionChanged(); + } + } + } + else if( pTO ) + { + // page object but no outline text: + // if the object is in the outline of the page -> default text + + // otherwise delete object + if( pPage->IsPresObj(pTO) ) + { + if( !pTO->IsEmptyPresObj() ) + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" ); + + // delete old OutlinerParaObject, too + if( pOlView->isRecordingUndo() ) + pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0)); + pPage->RestoreDefaultText( pTO ); + pTO->SetEmptyPresObj(true); + pTO->ActionChanged(); + } + } + else + { + DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" ); + if( pOlView->isRecordingUndo() ) + pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO)); + pPage->RemoveObject(pTO->GetOrdNum()); + } + } +} + +/** + * Fill Outliner from Stream + */ +ErrCode OutlineViewShell::ReadRtf(SvStream& rInput) +{ + ErrCode bRet = ERRCODE_NONE; + + ::Outliner& rOutl = pOlView->GetOutliner(); + + OutlineViewPageChangesGuard aGuard( pOlView.get() ); + OutlineViewModelChangeGuard aGuard2( *pOlView ); + + bRet = rOutl.Read( rInput, OUString(), EETextFormat::Rtf, GetDocSh()->GetHeaderAttributes() ); + + SdPage* pPage = GetDoc()->GetSdPage( GetDoc()->GetSdPageCount(PageKind::Standard) - 1, PageKind::Standard ); + SfxStyleSheet* pTitleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title ); + SfxStyleSheet* pOutlSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Outline ); + + sal_Int32 nParaCount = rOutl.GetParagraphCount(); + if ( nParaCount > 0 ) + { + for ( sal_Int32 nPara = 0; nPara < nParaCount; nPara++ ) + { + pOlView->UpdateParagraph( nPara ); + + sal_Int16 nDepth = rOutl.GetDepth( nPara ); + + if( (nDepth == 0) || !nPara ) + { + Paragraph* pPara = rOutl.GetParagraph( nPara ); + rOutl.SetDepth(pPara, -1); + rOutl.SetParaFlag(pPara, ParaFlag::ISPAGE); + + rOutl.SetStyleSheet( nPara, pTitleSheet ); + + if( nPara ) // first slide already exists + pOlView->InsertSlideForParagraph( pPara ); + } + else + { + rOutl.SetDepth( rOutl.GetParagraph( nPara ), nDepth - 1 ); + OUString aStyleSheetName = pOutlSheet->GetName(); + if (!aStyleSheetName.isEmpty()) + aStyleSheetName = aStyleSheetName.copy(0, aStyleSheetName.getLength() - 1); + aStyleSheetName += OUString::number( nDepth ); + SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool(); + SfxStyleSheet* pStyle = static_cast( pStylePool->Find( aStyleSheetName, pOutlSheet->GetFamily() ) ); + DBG_ASSERT( pStyle, "AutoStyleSheetName - Style not found!" ); + if ( pStyle ) + rOutl.SetStyleSheet( nPara, pStyle ); + } + } + } + + rOutl.GetUndoManager().Clear(); + + return bRet; +} + +void OutlineViewShell::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + WriteFrameViewData(); + + ViewShell::WriteUserDataSequence( rSequence ); +} + +void OutlineViewShell::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + WriteFrameViewData(); + + ViewShell::ReadUserDataSequence( rSequence ); + + ReadFrameViewData( mpFrameView ); +} + +void OutlineViewShell::VisAreaChanged(const ::tools::Rectangle& rRect) +{ + ViewShell::VisAreaChanged( rRect ); + + GetViewShellBase().GetDrawController()->FireVisAreaChanged(rRect); +} + +/** If there is a valid controller then create a new instance of + AccessibleDrawDocumentView. Otherwise return an empty + reference. +*/ +css::uno::Reference + OutlineViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow) +{ + OSL_ASSERT (GetViewShell()!=nullptr); + if (GetViewShell()->GetController() != nullptr) + { + rtl::Reference<::accessibility::AccessibleOutlineView> pDocumentView = + new ::accessibility::AccessibleOutlineView ( + pWindow, + this, + GetViewShell()->GetController(), + pWindow->GetAccessibleParentWindow()->GetAccessible()); + pDocumentView->Init(); + return pDocumentView; + } + + SAL_WARN("sd", "OutlineViewShell::CreateAccessibleDocumentView: no controller"); + return css::uno::Reference< css::accessibility::XAccessible >(); +} + +void OutlineViewShell::GetState (SfxItemSet& rSet) +{ + // Iterate over all requested items in the set. + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + while (nWhich) + { + switch (nWhich) + { + case SID_SEARCH_ITEM: + case SID_SEARCH_OPTIONS: + // Call common (old) implementation in the document shell. + GetDocSh()->GetState (rSet); + break; + default: + SAL_WARN("sd", "OutlineViewShell::GetState(): can not handle which id " << nWhich); + break; + } + nWhich = aIter.NextWhich(); + } +} + +void OutlineViewShell::SetCurrentPage (SdPage* pPage) +{ + // Adapt the selection of the model. + for (sal_uInt16 i=0; iGetSdPageCount(PageKind::Standard); i++) + GetDoc()->SetSelected( + GetDoc()->GetSdPage(i, PageKind::Standard), + false); + GetDoc()->SetSelected (pPage, true); + + DrawController& rController(*GetViewShellBase().GetDrawController()); + rController.FireSelectionChangeListener(); + rController.FireSwitchCurrentPage (pPage); + + pOlView->SetActualPage(pPage); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx new file mode 100644 index 0000000000..d424f0117c --- /dev/null +++ b/sd/source/ui/view/outlview.cxx @@ -0,0 +1,1713 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::frame; + +namespace sd { + +// a progress bar gets displayed when more than +// PROCESS_WITH_PROGRESS_THRESHOLD pages are concerned +#define PROCESS_WITH_PROGRESS_THRESHOLD 5 + +OutlineView::OutlineView( DrawDocShell& rDocSh, vcl::Window* pWindow, OutlineViewShell& rOutlineViewShell) +: ::sd::View(*rDocSh.GetDoc(), pWindow->GetOutDev(), &rOutlineViewShell) +, mrOutlineViewShell(rOutlineViewShell) +, mrOutliner(*mrDoc.GetOutliner()) +, mnPagesToProcess(0) +, mnPagesProcessed(0) +, mbFirstPaint(true) +, maDocColor( COL_WHITE ) +, maLRSpaceItem(2000, 0, 0, EE_PARA_OUTLLRSPACE) +{ + bool bInitOutliner = false; + + if (mrOutliner.GetViewCount() == 0) + { + // initialize Outliner: set Reference Device + bInitOutliner = true; + mrOutliner.Init( OutlinerMode::OutlineView ); + mrOutliner.SetRefDevice( SD_MOD()->GetVirtualRefDevice() ); + //viewsize without the width of the image and number in front + mnPaperWidth = (mrOutlineViewShell.GetActiveWindow()->GetViewSize().Width() - 4000); + mrOutliner.SetPaperSize(Size(mnPaperWidth, 400000000)); + } + else + { + // width: DIN A4, two margins at 1 cm each + mnPaperWidth = 19000; + } + + mpOutlinerViews[0].reset( new OutlinerView(&mrOutliner, pWindow) ); + mpOutlinerViews[0]->SetOutputArea(::tools::Rectangle()); + mrOutliner.SetUpdateLayout(false); + mrOutliner.InsertView(mpOutlinerViews[0].get(), EE_APPEND); + + onUpdateStyleSettings( true ); + + if (bInitOutliner) + { + // fill Outliner with contents + FillOutliner(); + } + + Link aLink( LINK(this,OutlineView,EventMultiplexerListener) ); + mrOutlineViewShell.GetViewShellBase().GetEventMultiplexer()->AddEventListener(aLink); + + Reference xFrame = mrOutlineViewShell.GetViewShellBase().GetFrame()->GetFrame().GetFrameInterface(); + maSlideImage = vcl::CommandInfoProvider::GetImageForCommand(".uno:ShowSlide", xFrame, vcl::ImageType::Size26); + + // Tell undo manager of the document about the undo manager of the + // outliner, so that the former can synchronize with the later. + sd::UndoManager* pDocUndoMgr = dynamic_cast(mpDocSh->GetUndoManager()); + if (pDocUndoMgr != nullptr) + pDocUndoMgr->SetLinkedUndoManager(&mrOutliner.GetUndoManager()); +} + +/** + * Destructor, restore Links, clear Outliner + */ +OutlineView::~OutlineView() +{ + DBG_ASSERT(maDragAndDropModelGuard == nullptr, + "sd::OutlineView::~OutlineView(), prior drag operation not finished correctly!"); + + Link aLink( LINK(this,OutlineView,EventMultiplexerListener) ); + mrOutlineViewShell.GetViewShellBase().GetEventMultiplexer()->RemoveEventListener( aLink ); + DisconnectFromApplication(); + + mpProgress.reset(); + + // unregister OutlinerViews and destroy them + for (auto & rpView : mpOutlinerViews) + { + if (rpView) + { + mrOutliner.RemoveView( rpView.get() ); + rpView.reset(); + } + } + + if (mrOutliner.GetViewCount() == 0) + { + // uninitialize Outliner: enable color display + ResetLinks(); + EEControlBits nCntrl = mrOutliner.GetControlWord(); + mrOutliner.SetUpdateLayout(false); // otherwise there will be drawn on SetControlWord + mrOutliner.SetControlWord(nCntrl & ~EEControlBits::NOCOLORS); + mrOutliner.ForceAutoColor( SvtAccessibilityOptions::GetIsAutomaticFontColor() ); + mrOutliner.Clear(); + } +} + +void OutlineView::ConnectToApplication() +{ + // When the mode is switched to outline the main view shell grabs focus. + // This is done for getting cut/copy/paste commands on slides in the left + // pane (slide sorter view shell) to work properly. + SfxShell* pTopViewShell = mrOutlineViewShell.GetViewShellBase().GetViewShellManager()->GetTopViewShell(); + if (pTopViewShell && pTopViewShell == &mrOutlineViewShell) + { + mrOutlineViewShell.GetActiveWindow()->GrabFocus(); + } + + Application::AddEventListener(LINK(this, OutlineView, AppEventListenerHdl)); +} + +void OutlineView::DisconnectFromApplication() +{ + Application::RemoveEventListener(LINK(this, OutlineView, AppEventListenerHdl)); +} + +void OutlineView::Paint(const ::tools::Rectangle& rRect, ::sd::Window const * pWin) +{ + OutlinerView* pOlView = GetViewByWindow(pWin); + + if (pOlView) + { + pOlView->HideCursor(); + pOlView->Paint(rRect); + + pOlView->ShowCursor(mbFirstPaint); + + mbFirstPaint = false; + } +} + +void OutlineView::AddDeviceToPaintView(OutputDevice& rDev, vcl::Window* pWindow) +{ + bool bAdded = false; + bool bValidArea = false; + ::tools::Rectangle aOutputArea; + const Color aWhiteColor( COL_WHITE ); + sal_uInt16 nView = 0; + + while (nView < MAX_OUTLINERVIEWS && !bAdded) + { + if (mpOutlinerViews[nView] == nullptr) + { + mpOutlinerViews[nView].reset( new OutlinerView(&mrOutliner, dynamic_cast< ::sd::Window* >(rDev.GetOwnerWindow())) ); + mpOutlinerViews[nView]->SetBackgroundColor( aWhiteColor ); + mrOutliner.InsertView(mpOutlinerViews[nView].get(), EE_APPEND); + bAdded = true; + + if (bValidArea) + { + mpOutlinerViews[nView]->SetOutputArea(aOutputArea); + } + } + else if (!bValidArea) + { + aOutputArea = mpOutlinerViews[nView]->GetOutputArea(); + bValidArea = true; + } + + nView++; + } + + // white background in Outliner + rDev.SetBackground( Wallpaper( aWhiteColor ) ); + + ::sd::View::AddDeviceToPaintView(rDev, pWindow); +} + +void OutlineView::DeleteDeviceFromPaintView(OutputDevice& rDev) +{ + bool bRemoved = false; + sal_uInt16 nView = 0; + vcl::Window* pWindow; + + while (nView < MAX_OUTLINERVIEWS && !bRemoved) + { + if (mpOutlinerViews[nView] != nullptr) + { + pWindow = mpOutlinerViews[nView]->GetWindow(); + + if (pWindow->GetOutDev() == &rDev) + { + mrOutliner.RemoveView( mpOutlinerViews[nView].get() ); + mpOutlinerViews[nView].reset(); + bRemoved = true; + } + } + + nView++; + } + + ::sd::View::DeleteDeviceFromPaintView(rDev); +} + +/** + * Return a pointer to the OutlinerView corresponding to the window + */ +OutlinerView* OutlineView::GetViewByWindow (vcl::Window const * pWin) const +{ + OutlinerView* pOlView = nullptr; + for (std::unique_ptr const & pView : mpOutlinerViews) + { + if (pView != nullptr) + { + if ( pWin == pView->GetWindow() ) + { + pOlView = pView.get(); + } + } + } + return pOlView; +} + +/** + * Return the title before a random paragraph + */ +Paragraph* OutlineView::GetPrevTitle(const Paragraph* pPara) +{ + sal_Int32 nPos = mrOutliner.GetAbsPos(pPara); + + if (nPos > 0) + { + while(nPos) + { + pPara = mrOutliner.GetParagraph(--nPos); + if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) + { + return const_cast< Paragraph* >( pPara ); + } + } + + } + return nullptr; +} + +/** + * Return the title after a random paragraph + */ +Paragraph* OutlineView::GetNextTitle(const Paragraph* pPara) +{ + Paragraph* pResult = const_cast< Paragraph* >( pPara ); + + sal_Int32 nPos = mrOutliner.GetAbsPos(pResult); + + do + { + pResult = mrOutliner.GetParagraph(++nPos); + if( pResult && ::Outliner::HasParaFlag(pResult, ParaFlag::ISPAGE) ) + return pResult; + } + while( pResult ); + + return nullptr; +} + +/** + * Handler for inserting pages (paragraphs) + */ +IMPL_LINK( OutlineView, ParagraphInsertedHdl, Outliner::ParagraphHdlParam, aParam, void ) +{ + // we get calls to this handler during binary insert of drag and drop contents but + // we ignore it here and handle it later in OnEndPasteOrDrop() + if (maDragAndDropModelGuard != nullptr) + return; + + OutlineViewPageChangesGuard aGuard(this); + + sal_Int32 nAbsPos = mrOutliner.GetAbsPos( aParam.pPara ); + + UpdateParagraph( nAbsPos ); + + if( (nAbsPos == 0) || + ::Outliner::HasParaFlag(aParam.pPara, ParaFlag::ISPAGE) || + ::Outliner::HasParaFlag(mrOutliner.GetParagraph( nAbsPos-1 ), ParaFlag::ISPAGE) ) + { + InsertSlideForParagraph( aParam.pPara ); + } +} + +/** creates and inserts an empty slide for the given paragraph */ +SdPage* OutlineView::InsertSlideForParagraph( Paragraph* pPara ) +{ + DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::InsertSlideForParagraph(), model change without undo?!" ); + + OutlineViewPageChangesGuard aGuard(this); + + mrOutliner.SetParaFlag( pPara, ParaFlag::ISPAGE ); + // how many titles are there before the new title paragraph? + sal_uLong nExample = 0; // position of the "example" page + sal_uLong nTarget = 0; // position of insertion + while(pPara) + { + pPara = GetPrevTitle(pPara); + if (pPara) + nTarget++; + } + + // if a new paragraph is created via RETURN before the first paragraph, the + // Outliner reports the old paragraph (which was moved down) as a new + // paragraph + if (nTarget == 1) + { + OUString aTest = mrOutliner.GetText(mrOutliner.GetParagraph(0)); + if (aTest.isEmpty()) + { + nTarget = 0; + } + } + + // the "example" page is the previous page - if it is available + if (nTarget > 0) + { + nExample = nTarget - 1; + + sal_uInt16 nPageCount = mrDoc.GetSdPageCount( PageKind::Standard ); + if( nExample >= nPageCount ) + nExample = nPageCount - 1; + } + + /********************************************************************** + * All the time, a standard page is created before a notes page. + * It is ensured that after each standard page the corresponding notes page + * follows. A handout page is exactly one handout page. + **********************************************************************/ + + // this page is exemplary + SdPage* pExample = mrDoc.GetSdPage(static_cast(nExample), PageKind::Standard); + rtl::Reference pPage = mrDoc.AllocSdPage(false); + + pPage->SetLayoutName(pExample->GetLayoutName()); + + // insert (page) + mrDoc.InsertPage(pPage.get(), static_cast(nTarget) * 2 + 1); + if( isRecordingUndo() ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoNewPage(*pPage)); + + // assign a master page to the standard page + pPage->TRG_SetMasterPage(pExample->TRG_GetMasterPage()); + + // set page size + pPage->SetSize(pExample->GetSize()); + pPage->SetBorder( pExample->GetLeftBorder(), + pExample->GetUpperBorder(), + pExample->GetRightBorder(), + pExample->GetLowerBorder() ); + + // create new presentation objects (after or <Title with subtitle> + // follows <Title with outline>, otherwise apply the layout of the previous + // page + AutoLayout eAutoLayout = pExample->GetAutoLayout(); + if (eAutoLayout == AUTOLAYOUT_TITLE || + eAutoLayout == AUTOLAYOUT_TITLE_ONLY) + { + pPage->SetAutoLayout(AUTOLAYOUT_TITLE_CONTENT, true); + } + else + { + pPage->SetAutoLayout(pExample->GetAutoLayout(), true); + } + + /********************************************************************** + |* now the notes page + \*********************************************************************/ + pExample = mrDoc.GetSdPage(static_cast<sal_uInt16>(nExample), PageKind::Notes); + rtl::Reference<SdPage> pNotesPage = mrDoc.AllocSdPage(false); + + pNotesPage->SetLayoutName(pExample->GetLayoutName()); + + pNotesPage->SetPageKind(PageKind::Notes); + + // insert (notes page) + mrDoc.InsertPage(pNotesPage.get(), static_cast<sal_uInt16>(nTarget) * 2 + 2); + if( isRecordingUndo() ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage)); + + // assign a master page to the notes page + pNotesPage->TRG_SetMasterPage(pExample->TRG_GetMasterPage()); + + // set page size, there must be already one page available + pNotesPage->SetSize(pExample->GetSize()); + pNotesPage->SetBorder( pExample->GetLeftBorder(), + pExample->GetUpperBorder(), + pExample->GetRightBorder(), + pExample->GetLowerBorder() ); + + // create presentation objects + pNotesPage->SetAutoLayout(pExample->GetAutoLayout(), true); + + mrOutliner.UpdateFields(); + + return pPage.get(); +} + +/** + * Handler for deleting pages (paragraphs) + */ +IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, aParam, void ) +{ + DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphRemovingHdl(), model change without undo?!" ); + + OutlineViewPageChangesGuard aGuard(this); + + Paragraph* pPara = aParam.pPara; + if( !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) ) + return; + + // how many titles are in front of the title paragraph in question? + sal_uLong nPos = 0; + while(pPara) + { + pPara = GetPrevTitle(pPara); + if (pPara) nPos++; + } + + // delete page and notes page + sal_uInt16 nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1; + SdrPage* pPage = mrDoc.GetPage(nAbsPos); + if( isRecordingUndo() ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage)); + mrDoc.RemovePage(nAbsPos); + + nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1; + pPage = mrDoc.GetPage(nAbsPos); + if( isRecordingUndo() ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage)); + mrDoc.RemovePage(nAbsPos); + + // progress display if necessary + if (mnPagesToProcess) + { + mnPagesProcessed++; + + if(mpProgress) + mpProgress->SetState(mnPagesProcessed); + + if (mnPagesProcessed == mnPagesToProcess) + { + mpProgress.reset(); + mnPagesToProcess = 0; + mnPagesProcessed = 0; + } + } + aParam.pOutliner->UpdateFields(); +} + +/** + * Handler for changing the indentation depth of paragraphs (requires inserting + * or deleting of pages in some cases) + */ +IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner::DepthChangeHdlParam, aParam, void ) +{ + DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::DepthChangedHdl(), no undo for model change?!" ); + + OutlineViewPageChangesGuard aGuard(this); + + Paragraph* pPara = aParam.pPara; + ::Outliner* pOutliner = aParam.pOutliner; + if( ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((aParam.nPrevFlags & ParaFlag::ISPAGE) == ParaFlag::NONE) ) + { + // the current paragraph is transformed into a slide + + mrOutliner.SetDepth( pPara, -1 ); + + // are multiple level 1 paragraphs being brought to level 0 and we + // should start a progress view or a timer and didn't already? + if (mnPagesToProcess == 0) + { + Window* pActWin = mrOutlineViewShell.GetActiveWindow(); + OutlinerView* pOlView = GetViewByWindow(pActWin); + + std::vector<Paragraph*> aSelList; + pOlView->CreateSelectionList(aSelList); + + mnPagesToProcess = std::count_if(aSelList.begin(), aSelList.end(), + [&pOutliner](const Paragraph *pParagraph) { + return !Outliner::HasParaFlag(pParagraph, ParaFlag::ISPAGE) && + (pOutliner->GetDepth(pOutliner->GetAbsPos(pParagraph)) <= 0); + }); + + mnPagesToProcess++; // the paragraph being in level 0 already + // should be included + mnPagesProcessed = 0; + + if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD) + { + mpProgress.reset( new SfxProgress( GetDocSh(), SdResId(STR_CREATE_PAGES), mnPagesToProcess ) ); + } + else + { + mpDocSh->SetWaitCursor( true ); + } + } + + ParagraphInsertedHdl( { aParam.pOutliner, aParam.pPara } ); + + mnPagesProcessed++; + + // should there be a progress display? + if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD) + { + if (mpProgress) + mpProgress->SetState(mnPagesProcessed); + } + + // was this the last page? + if (mnPagesProcessed == mnPagesToProcess) + { + if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD && mpProgress) + { + mpProgress.reset(); + } + else + mpDocSh->SetWaitCursor( false ); + + mnPagesToProcess = 0; + mnPagesProcessed = 0; + } + pOutliner->UpdateFields(); + } + else if( !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((aParam.nPrevFlags & ParaFlag::ISPAGE) != ParaFlag::NONE) ) + { + // the paragraph was a page but now becomes a normal paragraph + + // how many titles are before the title paragraph in question? + sal_uLong nPos = 0; + Paragraph* pParagraph = pPara; + while(pParagraph) + { + pParagraph = GetPrevTitle(pParagraph); + if (pParagraph) + nPos++; + } + // delete page and notes page + + sal_uInt16 nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1; + SdrPage* pPage = mrDoc.GetPage(nAbsPos); + if( isRecordingUndo() ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage)); + mrDoc.RemovePage(nAbsPos); + + nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1; + pPage = mrDoc.GetPage(nAbsPos); + if( isRecordingUndo() ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage)); + mrDoc.RemovePage(nAbsPos); + + pPage = GetPageForParagraph( pPara ); + + mrOutliner.SetDepth( pPara, (pPage && (static_cast<SdPage*>(pPage)->GetAutoLayout() == AUTOLAYOUT_TITLE)) ? -1 : 0 ); + + // progress display if necessary + if (mnPagesToProcess) + { + mnPagesProcessed++; + if (mpProgress) + mpProgress->SetState(mnPagesProcessed); + + if (mnPagesProcessed == mnPagesToProcess) + { + mpProgress.reset(); + mnPagesToProcess = 0; + mnPagesProcessed = 0; + } + } + pOutliner->UpdateFields(); + } + else if ( (pOutliner->GetPrevDepth() == 1) && ( pOutliner->GetDepth( pOutliner->GetAbsPos( pPara ) ) == 2 ) ) + { + // how many titles are in front of the title paragraph in question? + sal_Int32 nPos = -1; + + Paragraph* pParagraph = pPara; + while(pParagraph) + { + pParagraph = GetPrevTitle(pParagraph); + if (pParagraph) + nPos++; + } + + if(nPos >= 0) + { + SdPage*pPage = mrDoc.GetSdPage( static_cast<sal_uInt16>(nPos), PageKind::Standard); + + if(pPage && pPage->GetPresObj(PresObjKind::Text)) + pOutliner->SetDepth( pPara, 0 ); + } + + } + // how many titles are in front of the title paragraph in question? + sal_Int32 nPos = -1; + + Paragraph* pTempPara = pPara; + while(pTempPara) + { + pTempPara = GetPrevTitle(pTempPara); + if (pTempPara) + nPos++; + } + + if( nPos < 0 ) + return; + + SdPage* pPage = mrDoc.GetSdPage( static_cast<sal_uInt16>(nPos), PageKind::Standard ); + + if( !pPage ) + return; + + SfxStyleSheet* pStyleSheet = nullptr; + sal_Int32 nPara = pOutliner->GetAbsPos( pPara ); + sal_Int16 nDepth = pOutliner->GetDepth( nPara ); + bool bSubTitle = pPage->GetPresObj(PresObjKind::Text) != nullptr; + + if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) + { + pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title ); + } + else if( bSubTitle ) + { + pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Text ); + } + else + { + pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Outline ); + + if( nDepth > 0 ) + { + OUString aNewStyleSheetName = pStyleSheet->GetName(); + if (!aNewStyleSheetName.isEmpty()) + aNewStyleSheetName = aNewStyleSheetName.copy(0, aNewStyleSheetName.getLength() - 1); + aNewStyleSheetName += OUString::number( nDepth+1 ); + SfxStyleSheetBasePool* pStylePool = mrDoc.GetStyleSheetPool(); + pStyleSheet = static_cast<SfxStyleSheet*>( pStylePool->Find( aNewStyleSheetName, pStyleSheet->GetFamily() ) ); + } + } + + // before we set the style sheet we need to preserve the bullet item + // since all items will be deleted while setting a new style sheet + SfxItemSet aOldAttrs( pOutliner->GetParaAttribs( nPara ) ); + + pOutliner->SetStyleSheet( nPara, pStyleSheet ); + + // restore the old bullet item but not if the style changed + if ( pOutliner->GetPrevDepth() != -1 && nDepth != -1 && + aOldAttrs.GetItemState( EE_PARA_NUMBULLET ) == SfxItemState::SET ) + { + SfxItemSet aAttrs( pOutliner->GetParaAttribs( nPara ) ); + aAttrs.Put( *aOldAttrs.GetItem( EE_PARA_NUMBULLET ) ); + pOutliner->SetParaAttribs( nPara, aAttrs ); + } +} + +/** + * Handler for StatusEvents + */ +IMPL_LINK_NOARG(OutlineView, StatusEventHdl, EditStatus&, void) +{ + ::sd::Window* pWin = mrOutlineViewShell.GetActiveWindow(); + OutlinerView* pOutlinerView = GetViewByWindow(pWin); + ::tools::Rectangle aVis = pOutlinerView->GetVisArea(); + ::tools::Rectangle aText(Point(0,0), + Size(mnPaperWidth, + mrOutliner.GetTextHeight())); + ::tools::Rectangle aWin(Point(0,0), pWin->GetOutputSizePixel()); + aWin = pWin->PixelToLogic(aWin); + + if (!aVis.IsEmpty()) // not when opening + { + if (aWin.GetHeight() > aText.Bottom()) + aText.SetBottom( aWin.GetHeight() ); + + mrOutlineViewShell.InitWindows(Point(0,0), aText.GetSize(), aVis.TopLeft()); + mrOutlineViewShell.UpdateScrollBars(); + } +} + +IMPL_LINK_NOARG(OutlineView, BeginDropHdl, EditView*, void) +{ + DBG_ASSERT(maDragAndDropModelGuard == nullptr, + "sd::OutlineView::BeginDropHdl(), prior drag operation not finished correctly!"); + + maDragAndDropModelGuard.reset( new OutlineViewModelChangeGuard( *this ) ); +} + +IMPL_LINK_NOARG(OutlineView, EndDropHdl, EditView*, void) +{ + maDragAndDropModelGuard.reset(); +} + +/** + * Handler for the start of a paragraph movement + */ +IMPL_LINK( OutlineView, BeginMovingHdl, ::Outliner *, pOutliner, void ) +{ + OutlineViewPageChangesGuard aGuard(this); + + // list of selected title paragraphs + mpOutlinerViews[0]->CreateSelectionList(maSelectedParas); + + std::erase_if(maSelectedParas, + [](const Paragraph* pPara) { return !Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE); }); + + // select the pages belonging to the paragraphs on level 0 to select + sal_uInt16 nPos = 0; + sal_Int32 nParaPos = 0; + Paragraph* pPara = pOutliner->GetParagraph( 0 ); + std::vector<Paragraph*>::const_iterator fiter; + + while(pPara) + { + if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) // one page? + { + maOldParaOrder.push_back(pPara); + SdPage* pPage = mrDoc.GetSdPage(nPos, PageKind::Standard); + + fiter = std::find(maSelectedParas.begin(),maSelectedParas.end(),pPara); + + pPage->SetSelected(fiter != maSelectedParas.end()); + + ++nPos; + } + pPara = pOutliner->GetParagraph( ++nParaPos ); + } +} + +/** + * Handler for the end of a paragraph movement + */ +IMPL_LINK( OutlineView, EndMovingHdl, ::Outliner *, pOutliner, void ) +{ + OutlineViewPageChangesGuard aGuard(this); + + DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::EndMovingHdl(), model change without undo?!" ); + + // look for insertion position via the first paragraph + Paragraph* pSearchIt = maSelectedParas.empty() ? nullptr : *(maSelectedParas.begin()); + + // look for the first of the selected paragraphs in the new ordering + sal_uInt16 nPosNewOrder = 0; + sal_Int32 nParaPos = 0; + Paragraph* pPara = pOutliner->GetParagraph( 0 ); + Paragraph* pPrev = nullptr; + while (pPara && pPara != pSearchIt) + { + if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) + { + nPosNewOrder++; + pPrev = pPara; + } + pPara = pOutliner->GetParagraph( ++nParaPos ); + } + + sal_uInt16 nPos = nPosNewOrder; // don't change nPosNewOrder + if (nPos == 0) + { + nPos = sal_uInt16(-1); // insert before the first page + } + else + { + // look for the predecessor in the old ordering + std::vector<Paragraph*>::const_iterator it = std::find(maOldParaOrder.begin(), + maOldParaOrder.end(), + pPrev); + + if (it != maOldParaOrder.end()) + nPos = static_cast<sal_uInt16>(it-maOldParaOrder.begin()); + else + nPos = 0xffff; + + DBG_ASSERT(nPos != 0xffff, "Paragraph not found"); + } + + mrDoc.MovePages(nPos); + + // deselect the pages again + sal_uInt16 nPageCount = static_cast<sal_uInt16>(maSelectedParas.size()); + while (nPageCount) + { + SdPage* pPage = mrDoc.GetSdPage(nPosNewOrder, PageKind::Standard); + pPage->SetSelected(false); + nPosNewOrder++; + nPageCount--; + } + + pOutliner->UpdateFields(); + + maSelectedParas.clear(); + maOldParaOrder.clear(); +} + +/** + * Look for the title text object in one page of the model + */ +SdrTextObj* OutlineView::GetTitleTextObject(SdrPage const * pPage) +{ + SdrTextObj* pResult = nullptr; + + for (const rtl::Reference<SdrObject>& pObject : *pPage) + { + if (pObject->GetObjInventor() == SdrInventor::Default && + pObject->GetObjIdentifier() == SdrObjKind::TitleText) + { + pResult = static_cast<SdrTextObj*>(pObject.get()); + break; + } + } + return pResult; +} + +/** + * Look for the outline text object in one page of the model + */ +SdrTextObj* OutlineView::GetOutlineTextObject(SdrPage const * pPage) +{ + SdrTextObj* pResult = nullptr; + + for (const rtl::Reference<SdrObject>& pObject : *pPage) + { + if (pObject->GetObjInventor() == SdrInventor::Default && + pObject->GetObjIdentifier() == SdrObjKind::OutlineText) + { + pResult = static_cast<SdrTextObj*>(pObject.get()); + break; + } + } + return pResult; +} + +SdrTextObj* OutlineView::CreateTitleTextObject(SdPage* pPage) +{ + DBG_ASSERT( GetTitleTextObject(pPage) == nullptr, "sd::OutlineView::CreateTitleTextObject(), there is already a title text object!" ); + + if( pPage->GetAutoLayout() == AUTOLAYOUT_NONE ) + { + // simple case + pPage->SetAutoLayout( AUTOLAYOUT_TITLE_ONLY, true ); + } + else + { + // we already have a layout with a title but the title + // object was deleted, create a new one + pPage->InsertAutoLayoutShape( nullptr, PresObjKind::Title, false, pPage->GetTitleRect(), true ); + } + + return GetTitleTextObject(pPage); +} + +SdrTextObj* OutlineView::CreateOutlineTextObject(SdPage* pPage) +{ + DBG_ASSERT( GetOutlineTextObject(pPage) == nullptr, "sd::OutlineView::CreateOutlineTextObject(), there is already a layout text object!" ); + + AutoLayout eNewLayout = pPage->GetAutoLayout(); + switch( eNewLayout ) + { + case AUTOLAYOUT_NONE: + case AUTOLAYOUT_TITLE_ONLY: + case AUTOLAYOUT_TITLE: eNewLayout = AUTOLAYOUT_TITLE_CONTENT; break; + + case AUTOLAYOUT_CHART: eNewLayout = AUTOLAYOUT_CHARTTEXT; break; + + case AUTOLAYOUT_ORG: + case AUTOLAYOUT_TAB: + case AUTOLAYOUT_OBJ: eNewLayout = AUTOLAYOUT_OBJTEXT; break; + default: + break; + } + + if( eNewLayout != pPage->GetAutoLayout() ) + { + pPage->SetAutoLayout( eNewLayout, true ); + } + else + { + // we already have a layout with a text but the text + // object was deleted, create a new one + pPage->InsertAutoLayoutShape( nullptr, + PresObjKind::Outline, + false, pPage->GetLayoutRect(), true ); + } + + return GetOutlineTextObject(pPage); +} + +/** updates draw model with all changes from outliner model */ +void OutlineView::PrepareClose() +{ + ::sd::UndoManager* pDocUndoMgr = dynamic_cast<sd::UndoManager*>(mpDocSh->GetUndoManager()); + if (pDocUndoMgr != nullptr) + pDocUndoMgr->SetLinkedUndoManager(nullptr); + + mrOutliner.GetUndoManager().Clear(); + + BegUndo(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT)); + UpdateDocument(); + EndUndo(); + mrDoc.SetSelected(GetActualPage(), true); +} + +/** + * Set attributes of the selected text + */ +bool OutlineView::SetAttributes(const SfxItemSet& rSet, bool /*bSlide*/, bool /*bReplaceAll*/, bool /*bMaster*/) +{ + bool bOk = false; + + OutlinerView* pOlView = GetViewByWindow(mrOutlineViewShell.GetActiveWindow()); + + if (pOlView) + { + pOlView->SetAttribs(rSet); + bOk = true; + } + + mrOutlineViewShell.Invalidate (SID_PREVIEW_STATE); + + return bOk; +} + +/** + * Get attributes of the selected text + */ +void OutlineView::GetAttributes( SfxItemSet& rTargetSet, bool ) const +{ + OutlinerView* pOlView = GetViewByWindow( + mrOutlineViewShell.GetActiveWindow()); + assert(pOlView && "No OutlinerView found"); + + rTargetSet.Put( pOlView->GetAttribs(), false ); +} + +/** creates outliner model from draw model */ +void OutlineView::FillOutliner() +{ + mrOutliner.GetUndoManager().Clear(); + mrOutliner.EnableUndo(false); + ResetLinks(); + const bool bPrevUpdateLayout = mrOutliner.SetUpdateLayout(false); + + Paragraph* pTitleToSelect = nullptr; + sal_uInt16 nPageCount = mrDoc.GetSdPageCount(PageKind::Standard); + + // fill outliner with paragraphs from slides title & (outlines|subtitles) + for (sal_uInt16 nPage = 0; nPage < nPageCount; nPage++) + { + SdPage* pPage = mrDoc.GetSdPage(nPage, PageKind::Standard); + Paragraph * pPara = nullptr; + + // take text from title shape + SdrTextObj* pTO = GetTitleTextObject(pPage); + if(pTO && !(pTO->IsEmptyPresObj())) + { + OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject(); + if (pOPO) + { + bool bVertical = pOPO->IsEffectivelyVertical(); + pOPO->SetVertical( false ); + mrOutliner.AddText(*pOPO); + pOPO->SetVertical( bVertical ); + pPara = mrOutliner.GetParagraph( mrOutliner.GetParagraphCount()-1 ); + } + } + + if( pPara == nullptr ) // no title, insert an empty paragraph + { + pPara = mrOutliner.Insert(OUString()); + mrOutliner.SetDepth(pPara, -1); + + // do not apply hard attributes from the previous paragraph + mrOutliner.SetParaAttribs( mrOutliner.GetAbsPos(pPara), + mrOutliner.GetEmptyItemSet() ); + + mrOutliner.SetStyleSheet( mrOutliner.GetAbsPos( pPara ), pPage->GetStyleSheetForPresObj( PresObjKind::Title ) ); + } + + mrOutliner.SetParaFlag( pPara, ParaFlag::ISPAGE ); + + sal_Int32 nPara = mrOutliner.GetAbsPos( pPara ); + + UpdateParagraph( nPara ); + + // remember paragraph of currently selected page + if (pPage->IsSelected()) + pTitleToSelect = pPara; + + // take text from subtitle or outline + pTO = static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Text)); + const bool bSubTitle = pTO != nullptr; + + if (!pTO) // if no subtile found, try outline + pTO = GetOutlineTextObject(pPage); + + if(pTO && !(pTO->IsEmptyPresObj())) // found some text + { + OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject(); + if (pOPO) + { + sal_Int32 nParaCount1 = mrOutliner.GetParagraphCount(); + bool bVertical = pOPO->IsEffectivelyVertical(); + pOPO->SetVertical( false ); + mrOutliner.AddText(*pOPO); + pOPO->SetVertical( bVertical ); + + sal_Int32 nParaCount2 = mrOutliner.GetParagraphCount(); + for (sal_Int32 n = nParaCount1; n < nParaCount2; n++) + { + if( bSubTitle ) + { + Paragraph* p = mrOutliner.GetParagraph(n); + if(p && mrOutliner.GetDepth( n ) > 0 ) + mrOutliner.SetDepth(p, 0); + } + + UpdateParagraph( n ); + } + } + } + } + + // place cursor at the start + Paragraph* pFirstPara = mrOutliner.GetParagraph( 0 ); + mpOutlinerViews[0]->Select( pFirstPara ); + mpOutlinerViews[0]->Select( pFirstPara, false ); + + // select title of slide that was selected + if (pTitleToSelect) + mpOutlinerViews[0]->Select(pTitleToSelect); + + SetLinks(); + + mrOutliner.EnableUndo(true); + + mrOutliner.SetUpdateLayout(bPrevUpdateLayout); +} + +/** + * Handler for deleting of level 0 paragraphs (pages): Warning + */ +IMPL_LINK_NOARG(OutlineView, RemovingPagesHdl, OutlinerView*, bool) +{ + sal_Int32 nNumOfPages = mrOutliner.GetSelPageCount(); + + if (nNumOfPages > PROCESS_WITH_PROGRESS_THRESHOLD) + { + mnPagesToProcess = nNumOfPages; + mnPagesProcessed = 0; + } + + if (mnPagesToProcess) + { + mpProgress.reset( new SfxProgress( GetDocSh(), SdResId(STR_DELETE_PAGES), mnPagesToProcess ) ); + } + mrOutliner.UpdateFields(); + + return true; +} + +/** + * Handler for indenting level 0 paragraphs (pages): Warning + */ +IMPL_LINK( OutlineView, IndentingPagesHdl, OutlinerView *, pOutlinerView, bool ) +{ + return RemovingPagesHdl(pOutlinerView); +} + +/** returns the first slide that is selected in the outliner or where + the cursor is located */ +SdPage* OutlineView::GetActualPage() +{ + ::sd::Window* pWin = mrOutlineViewShell.GetActiveWindow(); + OutlinerView* pActiveView = GetViewByWindow(pWin); + + std::vector<Paragraph*> aSelList; + pActiveView->CreateSelectionList(aSelList); + + Paragraph *pPar = aSelList.empty() ? nullptr : *(aSelList.begin()); + SdPage* pCurrent = GetPageForParagraph(pPar); + + DBG_ASSERT( pCurrent || + (mpDocSh->GetUndoManager() && static_cast< sd::UndoManager *>(mpDocSh->GetUndoManager())->IsDoing()) || + maDragAndDropModelGuard, + "sd::OutlineView::GetActualPage(), no current page?" ); + + if( pCurrent ) + return pCurrent; + + return mrDoc.GetSdPage( 0, PageKind::Standard ); +} + +SdPage* OutlineView::GetPageForParagraph( Paragraph* pPara ) +{ + if( !::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) ) + pPara = GetPrevTitle(pPara); + + sal_uInt32 nPageToSelect = 0; + while(pPara) + { + pPara = GetPrevTitle(pPara); + if(pPara) + nPageToSelect++; + } + + if( nPageToSelect < static_cast<sal_uInt32>(mrDoc.GetSdPageCount( PageKind::Standard )) ) + return mrDoc.GetSdPage( static_cast<sal_uInt16>(nPageToSelect), PageKind::Standard ); + + return nullptr; +} + +Paragraph* OutlineView::GetParagraphForPage( ::Outliner const & rOutl, SdPage const * pPage ) +{ + // get the number of paragraphs with ident 0 we need to skip before + // we find the actual page + sal_uInt32 nPagesToSkip = (pPage->GetPageNum() - 1) >> 1; + + sal_Int32 nParaPos = 0; + Paragraph* pPara = rOutl.GetParagraph( 0 ); + while( pPara ) + { + // if this paragraph is a page... + if( ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) ) + { + // see if we already skipped enough pages + if( 0 == nPagesToSkip ) + break; // and if so, end the loop + + // we skipped another page + nPagesToSkip--; + } + + // get next paragraph + pPara = mrOutliner.GetParagraph( ++nParaPos ); + } + + return pPara; +} + +/** selects the paragraph for the given page at the outliner view*/ +void OutlineView::SetActualPage( SdPage const * pActual ) +{ + if( pActual && mrOutliner.GetIgnoreCurrentPageChangesLevel()==0 && !mbFirstPaint) + { + // if we found a paragraph, select its text at the outliner view + Paragraph* pPara = GetParagraphForPage( mrOutliner, pActual ); + if( pPara ) + mpOutlinerViews[0]->Select( pPara ); + } +} + +/** + * Get StyleSheet from the selection + */ +SfxStyleSheet* OutlineView::GetStyleSheet() const +{ + ::sd::Window* pActWin = mrOutlineViewShell.GetActiveWindow(); + OutlinerView* pOlView = GetViewByWindow(pActWin); + SfxStyleSheet* pResult = pOlView->GetStyleSheet(); + return pResult; +} + +/** + * Mark pages as selected / not selected + */ +void OutlineView::SetSelectedPages() +{ + // list of selected title paragraphs + std::vector<Paragraph*> aSelParas; + mpOutlinerViews[0]->CreateSelectionList(aSelParas); + + std::erase_if(aSelParas, + [](const Paragraph* pPara) { return !Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE); }); + + // select the pages belonging to the paragraphs on level 0 to select + sal_uInt16 nPos = 0; + sal_Int32 nParaPos = 0; + Paragraph *pPara = mrOutliner.GetParagraph( 0 ); + std::vector<Paragraph*>::const_iterator fiter; + + while(pPara) + { + if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) // one page + { + SdPage* pPage = mrDoc.GetSdPage(nPos, PageKind::Standard); + DBG_ASSERT(pPage!=nullptr, + "Trying to select non-existing page OutlineView::SetSelectedPages()"); + + if (pPage) + { + fiter = std::find(aSelParas.begin(),aSelParas.end(),pPara); + pPage->SetSelected(fiter != aSelParas.end()); + } + + nPos++; + } + + pPara = mrOutliner.GetParagraph( ++nParaPos ); + } +} + +/** + * Set new links + */ +void OutlineView::SetLinks() +{ + // set notification links + mrOutliner.SetParaInsertedHdl(LINK(this, OutlineView, ParagraphInsertedHdl)); + mrOutliner.SetParaRemovingHdl(LINK(this, OutlineView, ParagraphRemovingHdl)); + mrOutliner.SetDepthChangedHdl(LINK(this, OutlineView, DepthChangedHdl)); + mrOutliner.SetBeginMovingHdl(LINK(this, OutlineView, BeginMovingHdl)); + mrOutliner.SetEndMovingHdl(LINK(this, OutlineView, EndMovingHdl)); + mrOutliner.SetRemovingPagesHdl(LINK(this, OutlineView, RemovingPagesHdl)); + mrOutliner.SetIndentingPagesHdl(LINK(this, OutlineView, IndentingPagesHdl)); + mrOutliner.SetStatusEventHdl(LINK(this, OutlineView, StatusEventHdl)); + mrOutliner.SetBeginDropHdl(LINK(this,OutlineView, BeginDropHdl)); + mrOutliner.SetEndDropHdl(LINK(this,OutlineView, EndDropHdl)); + mrOutliner.SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl)); + mrOutliner.SetBeginPasteOrDropHdl(LINK(this,OutlineView, BeginPasteOrDropHdl)); + mrOutliner.SetEndPasteOrDropHdl(LINK(this,OutlineView, EndPasteOrDropHdl)); +} + +/** + * Restore old links + */ +void OutlineView::ResetLinks() const +{ + mrOutliner.SetParaInsertedHdl(Link<::Outliner::ParagraphHdlParam,void>()); + mrOutliner.SetParaRemovingHdl(Link<::Outliner::ParagraphHdlParam,void>()); + mrOutliner.SetDepthChangedHdl(Link<::Outliner::DepthChangeHdlParam,void>()); + mrOutliner.SetBeginMovingHdl(Link<::Outliner*,void>()); + mrOutliner.SetEndMovingHdl(Link<::Outliner*,void>()); + mrOutliner.SetStatusEventHdl(Link<EditStatus&,void>()); + mrOutliner.SetRemovingPagesHdl(Link<OutlinerView*,bool>()); + mrOutliner.SetIndentingPagesHdl(Link<OutlinerView*,bool>()); + mrOutliner.SetDrawPortionHdl(Link<DrawPortionInfo*,void>()); + mrOutliner.SetBeginPasteOrDropHdl(Link<PasteOrDropInfos*,void>()); + mrOutliner.SetEndPasteOrDropHdl(Link<PasteOrDropInfos*,void>()); +} + +sal_Int8 OutlineView::AcceptDrop( const AcceptDropEvent&, DropTargetHelper&, SdrLayerID) +{ + return DND_ACTION_NONE; +} + +sal_Int8 OutlineView::ExecuteDrop( const ExecuteDropEvent&, ::sd::Window*, sal_uInt16, SdrLayerID) +{ + return DND_ACTION_NONE; +} + +// Re-implement GetScriptType for this view to get correct results +SvtScriptType OutlineView::GetScriptType() const +{ + SvtScriptType nScriptType = ::sd::View::GetScriptType(); + + std::optional<OutlinerParaObject> pTempOPObj = mrOutliner.CreateParaObject(); + if(pTempOPObj) + { + nScriptType = pTempOPObj->GetTextObject().GetScriptType(); + } + + return nScriptType; +} + +void OutlineView::onUpdateStyleSettings( bool bForceUpdate /* = false */ ) +{ + svtools::ColorConfig aColorConfig; + const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor ); + if( !(bForceUpdate || (maDocColor != aDocColor)) ) + return; + + sal_uInt16 nView; + for( nView = 0; nView < MAX_OUTLINERVIEWS; nView++ ) + { + if (mpOutlinerViews[nView] != nullptr) + { + mpOutlinerViews[nView]->SetBackgroundColor( aDocColor ); + + vcl::Window* pWindow = mpOutlinerViews[nView]->GetWindow(); + + if( pWindow ) + pWindow->SetBackground( Wallpaper( aDocColor ) ); + + } + } + + mrOutliner.SetBackgroundColor( aDocColor ); + + maDocColor = aDocColor; +} + +IMPL_LINK_NOARG(OutlineView, AppEventListenerHdl, VclSimpleEvent&, void) +{ + onUpdateStyleSettings(false); +} + +IMPL_LINK(OutlineView, EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::CurrentPageChanged: + SetActualPage(mrOutlineViewShell.GetActualPage()); + break; + + case EventMultiplexerEventId::PageOrder: + if (mrOutliner.GetIgnoreCurrentPageChangesLevel()==0) + { + if (((mrDoc.GetPageCount()-1)%2) == 0) + { + mrOutliner.Clear(); + FillOutliner(); + ::sd::Window* pWindow = mrOutlineViewShell.GetActiveWindow(); + if (pWindow != nullptr) + pWindow->Invalidate(); + } + } + break; + + default: break; + } +} + +void OutlineView::IgnoreCurrentPageChanges (bool bIgnoreChanges) +{ + if (bIgnoreChanges) + mrOutliner.IncreIgnoreCurrentPageChangesLevel(); + else + mrOutliner.DecreIgnoreCurrentPageChangesLevel(); +} + +/** call this method before you do anything that can modify the outliner + and or the drawing document model. It will create needed undo actions */ +void OutlineView::BeginModelChange() +{ + mrOutliner.GetUndoManager().EnterListAction("", "", 0, mrOutlineViewShell.GetViewShellBase().GetViewShellId()); + BegUndo(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT)); +} + +/** call this method after BeginModelChange(), when all possible model + changes are done. */ +void OutlineView::EndModelChange() +{ + UpdateDocument(); + + SfxUndoManager* pDocUndoMgr = mpDocSh->GetUndoManager(); + + bool bHasUndoActions = pDocUndoMgr->GetUndoActionCount() != 0; + + EndUndo(); + + DBG_ASSERT( bHasUndoActions == (mrOutliner.GetUndoManager().GetUndoActionCount() != 0), "sd::OutlineView::EndModelChange(), undo actions not in sync!" ); + + mrOutliner.GetUndoManager().LeaveListAction(); + + if( bHasUndoActions && mrOutliner.GetEditEngine().HasTriedMergeOnLastAddUndo() ) + TryToMergeUndoActions(); + + mrOutlineViewShell.Invalidate( SID_UNDO ); + mrOutlineViewShell.Invalidate( SID_REDO ); +} + +/** updates all changes in the outliner model to the draw model */ +void OutlineView::UpdateDocument() +{ + OutlineViewPageChangesGuard aGuard(this); + + const sal_uInt32 nPageCount = mrDoc.GetSdPageCount(PageKind::Standard); + Paragraph* pPara = mrOutliner.GetParagraph( 0 ); + sal_uInt32 nPage; + for (nPage = 0; nPage < nPageCount; nPage++) + { + SdPage* pPage = mrDoc.GetSdPage( static_cast<sal_uInt16>(nPage), PageKind::Standard); + mrDoc.SetSelected(pPage, false); + + mrOutlineViewShell.UpdateTitleObject( pPage, pPara ); + mrOutlineViewShell.UpdateOutlineObject( pPage, pPara ); + + if( pPara ) + pPara = GetNextTitle(pPara); + } + + DBG_ASSERT( pPara == nullptr, "sd::OutlineView::UpdateDocument(), slides are out of sync, creating missing ones" ); + while( pPara ) + { + SdPage* pPage = InsertSlideForParagraph( pPara ); + mrDoc.SetSelected(pPage, false); + + mrOutlineViewShell.UpdateTitleObject( pPage, pPara ); + mrOutlineViewShell.UpdateOutlineObject( pPage, pPara ); + + pPara = GetNextTitle(pPara); + } +} + +/** merge edit engine undo actions if possible */ +void OutlineView::TryToMergeUndoActions() +{ + SfxUndoManager& rOutlineUndo = mrOutliner.GetUndoManager(); + if( rOutlineUndo.GetUndoActionCount() <= 1 ) + return; + + SfxListUndoAction* pListAction = dynamic_cast< SfxListUndoAction* >( rOutlineUndo.GetUndoAction() ); + SfxListUndoAction* pPrevListAction = dynamic_cast< SfxListUndoAction* >( rOutlineUndo.GetUndoAction(1) ); + if( !(pListAction && pPrevListAction) ) + return; + + // find the top EditUndo action in the top undo action list + size_t nAction = pListAction->maUndoActions.size(); + EditUndo* pEditUndo = nullptr; + while( !pEditUndo && nAction ) + { + pEditUndo = dynamic_cast< EditUndo* >(pListAction->GetUndoAction(--nAction)); + } + + sal_uInt16 nEditPos = nAction; // we need this later to remove the merged undo actions + + // make sure it is the only EditUndo action in the top undo list + while( pEditUndo && nAction ) + { + if( dynamic_cast< EditUndo* >(pListAction->GetUndoAction(--nAction)) ) + pEditUndo = nullptr; + } + + // do we have one and only one EditUndo action in the top undo list? + if( !pEditUndo ) + return; + + // yes, see if we can merge it with the prev undo list + + nAction = pPrevListAction->maUndoActions.size(); + EditUndo* pPrevEditUndo = nullptr; + while( !pPrevEditUndo && nAction ) + pPrevEditUndo = dynamic_cast< EditUndo* >(pPrevListAction->GetUndoAction(--nAction)); + + if( !(pPrevEditUndo && pPrevEditUndo->Merge( pEditUndo )) ) + return; + + // ok we merged the only EditUndo of the top undo list with + // the top EditUndo of the previous undo list + + // first remove the merged undo action + assert( pListAction->GetUndoAction(nEditPos) == pEditUndo && + "sd::OutlineView::TryToMergeUndoActions(), wrong edit pos!" ); + pListAction->Remove(nEditPos); + + if ( !pListAction->maUndoActions.empty() ) + { + // now we have to move all remaining doc undo actions from the top undo + // list to the previous undo list and remove the top undo list + + size_t nCount = pListAction->maUndoActions.size(); + size_t nDestAction = pPrevListAction->maUndoActions.size(); + while( nCount-- ) + { + std::unique_ptr<SfxUndoAction> pTemp = pListAction->Remove(0); + pPrevListAction->Insert( std::move(pTemp), nDestAction++ ); + } + pPrevListAction->nCurUndoAction = pPrevListAction->maUndoActions.size(); + } + + rOutlineUndo.RemoveLastUndoAction(); +} + +IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo, void) +{ + if( !pInfo ) + return; + + Paragraph* pPara = mrOutliner.GetParagraph( pInfo->mnPara ); + EditEngine& rEditEngine = const_cast< EditEngine& >( mrOutliner.GetEditEngine() ); + + Size aImageSize( pInfo->mpOutDev->PixelToLogic( maSlideImage.GetSizePixel() ) ); + Size aOffset( 100, 100 ); + + // paint slide number + if( !(pPara && ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE)) ) + return; + + ::tools::Long nPage = 0; // todo, printing?? + for ( sal_Int32 n = 0; n <= pInfo->mnPara; n++ ) + { + Paragraph* p = mrOutliner.GetParagraph( n ); + if ( ::Outliner::HasParaFlag(p,ParaFlag::ISPAGE) ) + nPage++; + } + + ::tools::Long nBulletHeight = static_cast<::tools::Long>(mrOutliner.GetLineHeight( pInfo->mnPara )); + ::tools::Long nFontHeight = 0; + if ( !rEditEngine.IsFlatMode() ) + { + nFontHeight = nBulletHeight / 5; + } + else + { + nFontHeight = (nBulletHeight * 10) / 25; + } + + Size aFontSz( 0, nFontHeight ); + + Size aOutSize( 2000, nBulletHeight ); + + const float fImageHeight = (static_cast<float>(aOutSize.Height()) * float(4)) / float(7); + if (aImageSize.Width() != 0) + { + const float fImageRatio = static_cast<float>(aImageSize.Height()) / static_cast<float>(aImageSize.Width()); + aImageSize.setWidth( static_cast<::tools::Long>( fImageRatio * fImageHeight ) ); + } + aImageSize.setHeight( static_cast<::tools::Long>(fImageHeight) ); + + Point aImagePos( pInfo->mrStartPos ); + aImagePos.AdjustX(aOutSize.Width() - aImageSize.Width() - aOffset.Width() ) ; + aImagePos.AdjustY((aOutSize.Height() - aImageSize.Height()) / 2 ); + + pInfo->mpOutDev->DrawImage( aImagePos, aImageSize, maSlideImage ); + + const bool bVertical = mrOutliner.IsVertical(); + const bool bRightToLeftPara = rEditEngine.IsRightToLeft( pInfo->mnPara ); + + LanguageType eLang = rEditEngine.GetDefaultLanguage(); + + Point aTextPos( aImagePos.X() - aOffset.Width(), pInfo->mrStartPos.Y() ); + vcl::Font aNewFont( OutputDevice::GetDefaultFont( DefaultFontType::SANS_UNICODE, eLang, GetDefaultFontFlags::NONE ) ); + aNewFont.SetFontSize( aFontSz ); + aNewFont.SetVertical( bVertical ); + aNewFont.SetOrientation( Degree10(bVertical ? 2700 : 0) ); + aNewFont.SetColor( COL_AUTO ); + pInfo->mpOutDev->SetFont( aNewFont ); + OUString aPageText = OUString::number( nPage ); + Size aTextSz; + aTextSz.setWidth( pInfo->mpOutDev->GetTextWidth( aPageText ) ); + aTextSz.setHeight( pInfo->mpOutDev->GetTextHeight() ); + if ( !bVertical ) + { + aTextPos.AdjustY((aOutSize.Height() - aTextSz.Height()) / 2 ); + if ( !bRightToLeftPara ) + { + aTextPos.AdjustX( -(aTextSz.Width()) ); + } + else + { + aTextPos.AdjustX(aTextSz.Width() ); + } + } + else + { + aTextPos.AdjustY( -(aTextSz.Width()) ); + aTextPos.AdjustX(nBulletHeight / 2 ); + } + pInfo->mpOutDev->DrawText( aTextPos, aPageText ); +} + +void OutlineView::UpdateParagraph( sal_Int32 nPara ) +{ + SfxItemSet aNewAttrs2( mrOutliner.GetParaAttribs( nPara ) ); + aNewAttrs2.Put( maLRSpaceItem ); + mrOutliner.SetParaAttribs( nPara, aNewAttrs2 ); +} + +void OutlineView::OnBeginPasteOrDrop( PasteOrDropInfos* /*pInfo*/ ) +{ +} + +/** this is called after a paste or drop operation, make sure that the newly inserted paragraphs + get the correct style sheet and new slides are inserted. */ +void OutlineView::OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) +{ + SdPage* pPage = nullptr; + SfxStyleSheetBasePool* pStylePool = GetDoc().GetStyleSheetPool(); + + for( sal_Int32 nPara = pInfo->nStartPara; nPara <= pInfo->nEndPara; nPara++ ) + { + Paragraph* pPara = mrOutliner.GetParagraph( nPara ); + + bool bPage = ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ); + + if( !bPage ) + { + SdStyleSheet* pStyleSheet = dynamic_cast< SdStyleSheet* >( mrOutliner.GetStyleSheet( nPara ) ); + if( pStyleSheet ) + { + if ( pStyleSheet->GetApiName() == "title" ) + bPage = true; + } + } + + if( !pPara ) + continue; // fatality!? + + if( bPage && (nPara != pInfo->nStartPara) ) + { + // insert new slide for this paragraph + pPage = InsertSlideForParagraph( pPara ); + } + else + { + // newly inserted non page paragraphs get the outline style + if( !pPage ) + pPage = GetPageForParagraph( pPara ); + + if( pPage ) + { + SfxStyleSheet* pStyle = pPage->GetStyleSheetForPresObj( bPage ? PresObjKind::Title : PresObjKind::Outline ); + + if( !bPage ) + { + const sal_Int16 nDepth = mrOutliner.GetDepth( nPara ); + if( nDepth > 0 ) + { + OUString aStyleSheetName = pStyle->GetName(); + if (!aStyleSheetName.isEmpty()) + aStyleSheetName = aStyleSheetName.copy(0, aStyleSheetName.getLength() - 1); + aStyleSheetName += OUString::number( nDepth ); + pStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pStyle->GetFamily() ) ); + DBG_ASSERT( pStyle, "sd::OutlineView::OnEndPasteOrDrop(), Style not found!" ); + } + } + + mrOutliner.SetStyleSheet( nPara, pStyle ); + } + + UpdateParagraph( nPara ); + } + } +} + + +OutlineViewModelChangeGuard::OutlineViewModelChangeGuard( OutlineView& rView ) +: mrView( rView ) +{ + mrView.BeginModelChange(); +} + +OutlineViewModelChangeGuard::~OutlineViewModelChangeGuard() COVERITY_NOEXCEPT_FALSE +{ + mrView.EndModelChange(); +} + + +OutlineViewPageChangesGuard::OutlineViewPageChangesGuard( OutlineView* pView ) +: mpView( pView ) +{ + if( mpView ) + mpView->IgnoreCurrentPageChanges( true ); +} + +OutlineViewPageChangesGuard::~OutlineViewPageChangesGuard() +{ + if( mpView ) + mpView->IgnoreCurrentPageChanges( false ); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/presvish.cxx b/sd/source/ui/view/presvish.cxx new file mode 100644 index 0000000000..34a789f4dd --- /dev/null +++ b/sd/source/ui/view/presvish.cxx @@ -0,0 +1,172 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> + +#include <PresentationViewShell.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/objface.hxx> +#include <sfx2/viewfrm.hxx> +#include <svx/svxids.hrc> +#include <svx/ruler.hxx> +#include <FrameView.hxx> +#include <DrawDocShell.hxx> +#include <slideshow.hxx> +#include <app.hrc> +#include <ViewShellBase.hxx> + +#include <fupoor.hxx> +#include <Window.hxx> + +#define ShellClass_PresentationViewShell +using namespace sd; +#include <sdslots.hxx> + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; + +namespace sd { + +SFX_IMPL_INTERFACE(PresentationViewShell, DrawViewShell) + +void PresentationViewShell::InitInterface_Impl() +{ + GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_TOOLS, SfxVisibilityFlags::Standard | SfxVisibilityFlags::FullScreen | SfxVisibilityFlags::Server, + ToolbarId::Draw_Toolbox_Sd); + GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_APPLICATION, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Client | SfxVisibilityFlags::Viewer | SfxVisibilityFlags::ReadonlyDoc, + ToolbarId::Draw_Viewer_Toolbox); + GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OPTIONS, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Server, + ToolbarId::Draw_Options_Toolbox); + GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_COMMONTASK, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Server, + ToolbarId::Draw_CommonTask_Toolbox); +} + + +PresentationViewShell::PresentationViewShell( ViewShellBase& rViewShellBase, vcl::Window* pParentWindow, FrameView* pFrameView) + : DrawViewShell(rViewShellBase, pParentWindow, PageKind::Standard, pFrameView) + , mnAbortSlideShowEvent(nullptr) +{ + if( GetDocSh() && GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED ) + maOldVisArea = GetDocSh()->GetVisArea( ASPECT_CONTENT ); + meShellType = ST_PRESENTATION; +} + +PresentationViewShell::~PresentationViewShell() +{ + if (mnAbortSlideShowEvent) + Application::RemoveUserEvent(mnAbortSlideShowEvent); + + if( GetDocSh() && GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED && !maOldVisArea.IsEmpty() ) + GetDocSh()->SetVisArea( maOldVisArea ); +} + +void PresentationViewShell::FinishInitialization( FrameView* pFrameView ) +{ + DrawViewShell::Init(true); + + // Use the frame view that comes form the view shell that initiated our + // creation. + if (pFrameView != nullptr) + { + GetFrameView()->Disconnect(); + SetFrameView (pFrameView); + pFrameView->Connect(); + } + SetRuler(false); + WriteFrameViewData(); + + GetActiveWindow()->GrabFocus(); +} + +VclPtr<SvxRuler> PresentationViewShell::CreateHRuler(::sd::Window*) +{ + return nullptr; +} + +VclPtr<SvxRuler> PresentationViewShell::CreateVRuler(::sd::Window*) +{ + return nullptr; +} + +IMPL_LINK_NOARG(PresentationViewShell, AbortSlideShowHdl, void*, void) +{ + mnAbortSlideShowEvent = nullptr; + rtl::Reference<SlideShow> xSlideShow(SlideShow::GetSlideShow(GetViewShellBase())); + if (xSlideShow.is()) + xSlideShow->end(); +} + +void PresentationViewShell::Activate( bool bIsMDIActivate ) +{ + DrawViewShell::Activate( bIsMDIActivate ); + + if( bIsMDIActivate ) + { + SfxBoolItem aItem( SID_NAVIGATOR_INIT, true ); + + GetViewFrame()->GetDispatcher()->ExecuteList(SID_NAVIGATOR_INIT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem }); + + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if( xSlideShow.is() ) + { + bool bSuccess = xSlideShow->activate(GetViewShellBase()); + if (!bSuccess) + { + /* tdf#64711 PresentationViewShell is deleted by 'end' due to end closing + the object shell. So if we call xSlideShow->end during Activate there are + a lot of places in the call stack of Activate which understandable don't + expect this ViewShell to be deleted during use. Defer to the next event + loop the abort of the slideshow + */ + if (!mnAbortSlideShowEvent) + mnAbortSlideShowEvent = Application::PostUserEvent(LINK(this, PresentationViewShell, AbortSlideShowHdl)); + } + } + + if( HasCurrentFunction() ) + GetCurrentFunction()->Activate(); + + ReadFrameViewData(mpFrameView); + } + + GetDocSh()->Connect( this ); +} + +void PresentationViewShell::Paint( const ::tools::Rectangle& /*rRect*/, ::sd::Window* ) +{ + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if( xSlideShow.is() ) + xSlideShow->paint(); +} + +void PresentationViewShell::Resize() +{ + ViewShell::Resize(); // do not call DrawViewShell here! + + rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if( xSlideshow.is() ) + xSlideshow->resize(maViewSize); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdruler.cxx b/sd/source/ui/view/sdruler.cxx new file mode 100644 index 0000000000..571ffb37f8 --- /dev/null +++ b/sd/source/ui/view/sdruler.cxx @@ -0,0 +1,148 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <Ruler.hxx> +#include <svl/ptitem.hxx> +#include <svx/ruler.hxx> +#include <svx/svxids.hrc> +#include <sfx2/ctrlitem.hxx> +#include <sfx2/bindings.hxx> +#include <vcl/commandevent.hxx> + +#include <View.hxx> +#include <DrawViewShell.hxx> +#include <Window.hxx> + +#include <helpids.h> + +namespace sd { + +/** + * Controller-Item for ruler + */ +class RulerCtrlItem : public SfxControllerItem +{ + Ruler &rRuler; + + protected: + virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState, + const SfxPoolItem* pItem ) override; + + public: + RulerCtrlItem(Ruler& rRlr, SfxBindings& rBind); +}; + +RulerCtrlItem::RulerCtrlItem(Ruler& rRlr, SfxBindings& rBind) +: SfxControllerItem(SID_RULER_NULL_OFFSET, rBind) +, rRuler(rRlr) +{ +} + +void RulerCtrlItem::StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState, const SfxPoolItem* pState ) +{ + switch( nSId ) + { + case SID_RULER_NULL_OFFSET: + { + const SfxPointItem* pItem = dynamic_cast< const SfxPointItem* >(pState); + DBG_ASSERT(pState == nullptr || pItem != nullptr, "SfxPointItem expected"); + if ( pItem ) + rRuler.SetNullOffset(pItem->GetValue()); + } + break; + } +} + +Ruler::Ruler( DrawViewShell& rViewSh, vcl::Window* pParent, ::sd::Window* pWin, SvxRulerSupportFlags nRulerFlags, SfxBindings& rBindings, WinBits nWinStyle) + : SvxRuler(pParent, pWin, nRulerFlags, rBindings, nWinStyle) + , pDrViewShell(&rViewSh) +{ + rBindings.EnterRegistrations(); + pCtrlItem.reset( new RulerCtrlItem(*this, rBindings) ); + rBindings.LeaveRegistrations(); + + if ( nWinStyle & WB_HSCROLL ) + { + bHorz = true; + SetHelpId( HID_SD_RULER_HORIZONTAL ); + } + else + { + bHorz = false; + SetHelpId( HID_SD_RULER_VERTICAL ); + } +} + +Ruler::~Ruler() +{ + disposeOnce(); +} + +void Ruler::dispose() +{ + SfxBindings& rBindings = pCtrlItem->GetBindings(); + rBindings.EnterRegistrations(); + pCtrlItem.reset(); + rBindings.LeaveRegistrations(); + SvxRuler::dispose(); +} + +void Ruler::MouseButtonDown(const MouseEvent& rMEvt) +{ + Point aMPos = rMEvt.GetPosPixel(); + RulerType eType = GetRulerType(aMPos); + + if ( !pDrViewShell->GetView()->IsTextEdit() && + rMEvt.IsLeft() && rMEvt.GetClicks() == 1 && + (eType == RulerType::DontKnow || eType == RulerType::Outside) ) + { + pDrViewShell->StartRulerDrag(*this, rMEvt); + } + else + SvxRuler::MouseButtonDown(rMEvt); +} + +void Ruler::SetNullOffset(const Point& rOffset) +{ + ::tools::Long nOffset; + + if ( bHorz ) nOffset = rOffset.X(); + else nOffset = rOffset.Y(); + + SetNullOffsetLogic(nOffset); +} + +void Ruler::Command(const CommandEvent& rCEvt) +{ + if( rCEvt.GetCommand() == CommandEventId::ContextMenu && + !pDrViewShell->GetView()->IsTextEdit() ) + { + SvxRuler::Command( rCEvt ); + } +} + +void Ruler::ExtraDown() +{ + if( !pDrViewShell->GetView()->IsTextEdit() ) + SvxRuler::ExtraDown(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx new file mode 100644 index 0000000000..dd4ddaab1f --- /dev/null +++ b/sd/source/ui/view/sdview.cxx @@ -0,0 +1,1397 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <config_features.h> + +#include <com/sun/star/embed/NoVisualAreaSizeException.hpp> +#include <com/sun/star/embed/XEmbeddedObject.hpp> +#include <com/sun/star/linguistic2/XSpellChecker1.hpp> + +#include <View.hxx> +#include <avmedia/mediawindow.hxx> +#include <editeng/outlobj.hxx> +#include <editeng/unolingu.hxx> +#include <o3tl/deleter.hxx> +#include <svx/obj3d.hxx> +#include <svx/fmview.hxx> +#include <editeng/outliner.hxx> +#include <svx/svdograf.hxx> +#include <svx/svdoole2.hxx> +#include <svx/svdundo.hxx> + +#include <vcl/settings.hxx> + +#include <officecfg/Office/Common.hxx> +#include <sfx2/dispatch.hxx> +#include <svx/svdpagv.hxx> +#include <svx/svdoutl.hxx> +#include <svx/sdr/contact/displayinfo.hxx> + +#include <svx/svdetc.hxx> +#include <editeng/editstat.hxx> + +#include <sfx2/viewfrm.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <svx/xfillit0.hxx> + +#include <app.hrc> +#include <strings.hrc> +#include <Window.hxx> +#include <Client.hxx> +#include <drawdoc.hxx> +#include <DrawDocShell.hxx> +#include <sdmod.hxx> +#include <sdpage.hxx> +#include <sdresid.hxx> +#include <unokywds.hxx> +#include <ViewClipboard.hxx> +#include <undo/undomanager.hxx> +#include <svx/sdr/contact/viewobjectcontact.hxx> +#include <svx/sdr/contact/viewcontact.hxx> +#include <svx/svdotable.hxx> +#include <EventMultiplexer.hxx> +#include <ViewShellBase.hxx> +#include <ViewShell.hxx> + +#include <basegfx/polygon/b2dpolygontools.hxx> +#include <basegfx/color/bcolor.hxx> +#include <drawinglayer/attribute/lineattribute.hxx> +#include <drawinglayer/attribute/strokeattribute.hxx> +#include <drawinglayer/primitive2d/textlayoutdevice.hxx> +#include <drawinglayer/primitive2d/PolygonStrokePrimitive2D.hxx> +#include <svx/sdr/contact/objectcontact.hxx> +#include <svx/sdr/table/tablecontroller.hxx> +#include <basegfx/matrix/b2dhommatrix.hxx> +#include <drawinglayer/primitive2d/textprimitive2d.hxx> +#include <svx/unoapi.hxx> +#include <basegfx/matrix/b2dhommatrixtools.hxx> +#include <comphelper/lok.hxx> +#include <sfx2/lokhelper.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <DrawController.hxx> +#include <svtools/optionsdrawinglayer.hxx> + +#include <memory> +#include <numeric> + +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace sdr::table; +namespace sd { + +View::View( + SdDrawDocument& rDrawDoc, + OutputDevice* pOutDev, + ViewShell* pViewShell) +: FmFormView(rDrawDoc, pOutDev), + mrDoc(rDrawDoc), + mpDocSh(rDrawDoc.GetDocSh()), + mpViewSh(pViewShell), + mpDropMarkerObj(nullptr), + mnDragSrcPgNum(SDRPAGE_NOTFOUND), + mnAction(DND_ACTION_NONE), + maDropErrorIdle("sd View DropError"), + maDropInsertFileIdle("sd View DropInsertFile"), + mnLockRedrawSmph(0), + mbIsDropAllowed(true), + maSmartTags(*this), + mpClipboard (new ViewClipboard (*this)) +{ + // #i73602# Use default from the configuration + SetBufferedOverlayAllowed(SvtOptionsDrawinglayer::IsOverlayBuffer_DrawImpress()); + + // #i74769#, #i75172# Use default from the configuration + SetBufferedOutputAllowed(SvtOptionsDrawinglayer::IsPaintBuffer_DrawImpress()); + + EnableExtendedKeyInputDispatcher(false); + EnableExtendedMouseEventDispatcher(false); + + SetUseIncompatiblePathCreateInterface(false); + + SetMinMoveDistancePixel(2); + SetHitTolerancePixel(2); + SetMeasureLayer(sUNO_LayerName_measurelines); + + // Timer for delayed drop (has to be for MAC) + maDropErrorIdle.SetInvokeHandler( LINK(this, View, DropErrorHdl) ); + maDropInsertFileIdle.SetInvokeHandler( LINK(this, View, DropInsertFileHdl) ); +} + +void View::ImplClearDrawDropMarker() +{ + mpDropMarker.reset(); +} + +View::~View() +{ + maSmartTags.Dispose(); + + // release content of selection clipboard, if we own the content + ClearSelectionClipboard(); + +#if HAVE_FEATURE_AVMEDIA + if (mxDropMediaSizeListener) + { + suppress_fun_call_w_exception(mxDropMediaSizeListener->dispose()); + mxDropMediaSizeListener.clear(); + } +#endif + + maDropErrorIdle.Stop(); + maDropInsertFileIdle.Stop(); + + ImplClearDrawDropMarker(); + + while(PaintWindowCount()) + { + // remove all registered OutDevs + suppress_fun_call_w_exception(DeleteDeviceFromPaintView(*GetFirstOutputDevice())); + } +} + +namespace { + +class ViewRedirector : public sdr::contact::ViewObjectContactRedirector +{ +public: + ViewRedirector(); + + // all default implementations just call the same methods at the original. To do something + // different, override the method and at least do what the method does. + virtual void createRedirectedPrimitive2DSequence( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override; +}; + +} + +ViewRedirector::ViewRedirector() +{ +} + +void ViewRedirector::createRedirectedPrimitive2DSequence( + const sdr::contact::ViewObjectContact& rOriginal, + const sdr::contact::DisplayInfo& rDisplayInfo, + drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) +{ + SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject(); + SdrPage* pSdrPage = pObject ? pObject->getSdrPageFromSdrObject() : nullptr; + if(!pObject || !pSdrPage) + { + // not a SdrObject visualisation (maybe e.g. page) or no page + sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo, rVisitor); + return; + } + + const bool bDoCreateGeometry(pSdrPage->checkVisibility( rOriginal, rDisplayInfo, true )); + + if(!bDoCreateGeometry && + (( pObject->GetObjInventor() != SdrInventor::Default ) || ( pObject->GetObjIdentifier() != SdrObjKind::Page )) ) + return; + + PresObjKind eKind(PresObjKind::NONE); + const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive()); + const bool bIsMasterPageObject(pSdrPage->IsMasterPage()); + const bool bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter()); + const SdrPageView* pPageView = rOriginal.GetObjectContact().TryToGetSdrPageView(); + const SdrPage* pVisualizedPage = GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage()); + const SdPage* pObjectsSdPage = dynamic_cast< SdPage* >(pSdrPage); + const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != pVisualizedPage); + + // check if we need to draw a placeholder border. Never do it for + // objects inside a SdrPageObj and never when printing + if(!bIsInsidePageObj && !bIsPrinting) + { + bool bCreateOutline(false); + + if( pObject->IsEmptyPresObj() && DynCastSdrTextObj( pObject ) != nullptr ) + { + if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() ) + { + eKind = pObjectsSdPage ? pObjectsSdPage->GetPresObjKind(pObject) : PresObjKind::NONE; + bCreateOutline = true; + } + } + else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && ( pObject->GetObjIdentifier() == SdrObjKind::Text ) ) + { + if( pObjectsSdPage ) + { + eKind = pObjectsSdPage->GetPresObjKind(pObject); + + if((eKind == PresObjKind::Footer) || (eKind == PresObjKind::Header) || (eKind == PresObjKind::DateTime) || (eKind == PresObjKind::SlideNumber) ) + { + if( !bSubContentProcessing ) + { + // only draw a boundary for header&footer objects on the masterpage itself + bCreateOutline = true; + } + } + } + } + else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && ( pObject->GetObjIdentifier() == SdrObjKind::Page ) ) + { + // only for handout page, else this frame will be created for each + // page preview object in SlideSorter and PagePane + if(pObjectsSdPage && PageKind::Handout == pObjectsSdPage->GetPageKind()) + { + bCreateOutline = true; + } + } + + if(bCreateOutline) + { + // empty presentation objects get a gray frame + const svtools::ColorConfig aColorConfig; + const svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( svtools::OBJECTBOUNDARIES ) ); + + if( aColor.bIsVisible ) + { + // get basic object transformation + const basegfx::BColor aRGBColor(aColor.nColor.getBColor()); + basegfx::B2DHomMatrix aObjectMatrix; + basegfx::B2DPolyPolygon aObjectPolyPolygon; + pObject->TRGetBaseGeometry(aObjectMatrix, aObjectPolyPolygon); + + // create dashed border + { + // create object polygon + basegfx::B2DPolygon aPolygon(basegfx::utils::createUnitPolygon()); + aPolygon.transform(aObjectMatrix); + + // create line and stroke attribute + ::std::vector< double > aDotDashArray { 160.0, 80.0 }; + + const double fFullDotDashLen(::std::accumulate(aDotDashArray.begin(), aDotDashArray.end(), 0.0)); + const drawinglayer::attribute::LineAttribute aLine(aRGBColor); + drawinglayer::attribute::StrokeAttribute aStroke(std::move(aDotDashArray), fFullDotDashLen); + + // create primitive and add + const drawinglayer::primitive2d::Primitive2DReference xRef(new drawinglayer::primitive2d::PolygonStrokePrimitive2D( + std::move(aPolygon), + aLine, + std::move(aStroke))); + rVisitor.visit(xRef); + } + + // now paint the placeholder description, but only when masterpage + // is displayed as page directly (MasterPage view) + if(!bSubContentProcessing && bIsMasterPageObject) + { + OUString aObjectString; + + switch( eKind ) + { + case PresObjKind::Title: + { + if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PageKind::Standard) + { + static OUString aTitleAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_TITLE)); + aObjectString = aTitleAreaStr; + } + + break; + } + case PresObjKind::Outline: + { + static OUString aOutlineAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_OUTLINE)); + aObjectString = aOutlineAreaStr; + break; + } + case PresObjKind::Footer: + { + static OUString aFooterAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_FOOTER)); + aObjectString = aFooterAreaStr; + break; + } + case PresObjKind::Header: + { + static OUString aHeaderAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_HEADER)); + aObjectString = aHeaderAreaStr; + break; + } + case PresObjKind::DateTime: + { + static OUString aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_DATETIME)); + aObjectString = aDateTimeStr; + break; + } + case PresObjKind::Notes: + { + static OUString aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NOTES)); + aObjectString = aDateTimeStr; + break; + } + case PresObjKind::SlideNumber: + { + if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PageKind::Standard) + { + static OUString aSlideAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_SLIDE)); + aObjectString = aSlideAreaStr; + } + else + { + static OUString aNumberAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NUMBER)); + aObjectString = aNumberAreaStr; + } + break; + } + default: + { + break; + } + } + + if( !aObjectString.isEmpty() ) + { + // decompose object matrix to be able to place text correctly + basegfx::B2DTuple aScale; + basegfx::B2DTuple aTranslate; + double fRotate, fShearX; + aObjectMatrix.decompose(aScale, aTranslate, fRotate, fShearX); + + // create font + SdrTextObj* pTextObj = DynCastSdrTextObj( pObject ); + const SdrTextVertAdjust eTVA(pTextObj ? pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER); + vcl::Font aScaledVclFont; + + // use a text size factor to get more reliable text sizes from the text layouter + // (and from vcl), tipp from HDU + static const sal_uInt32 nTextSizeFactor(100); + + // use a factor to get more linear text size calculations + aScaledVclFont.SetFontHeight( 500 * nTextSizeFactor ); + + // get basic geometry and get text size + drawinglayer::primitive2d::TextLayouterDevice aTextLayouter; + aTextLayouter.setFont(aScaledVclFont); + const sal_Int32 nTextLength(aObjectString.getLength()); + + // do not forget to use the factor again to get the width for the 500 + const double fTextWidth(aTextLayouter.getTextWidth(aObjectString, 0, nTextLength) * (1.0 / nTextSizeFactor)); + const double fTextHeight(aTextLayouter.getTextHeight() * (1.0 / nTextSizeFactor)); + + // calculate text primitive position. If text is at bottom, use top for + // the extra text and vice versa + const double fHorDist(125); + const double fVerDist(125); + const double fPosX((aTranslate.getX() + aScale.getX()) - fTextWidth - fHorDist); + const double fPosY((SDRTEXTVERTADJUST_BOTTOM == eTVA) + ? aTranslate.getY() - fVerDist + fTextHeight + : (aTranslate.getY() + aScale.getY()) - fVerDist); + + // get font attributes; use normally scaled font + vcl::Font aVclFont; + basegfx::B2DVector aTextSizeAttribute; + + aVclFont.SetFontHeight( 500 ); + + drawinglayer::attribute::FontAttribute aFontAttribute( + drawinglayer::primitive2d::getFontAttributeFromVclFont( + aTextSizeAttribute, + aVclFont, + false, + false)); + + // fill text matrix + const basegfx::B2DHomMatrix aTextMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix( + aTextSizeAttribute.getX(), aTextSizeAttribute.getY(), + fShearX, + fRotate, + fPosX, fPosY)); + + // create DXTextArray (can be empty one) + ::std::vector< double > aDXArray{}; + + // create locale; this may need some more information in the future + css::lang::Locale aLocale; + + // create primitive and add + const drawinglayer::primitive2d::Primitive2DReference xRef( + new drawinglayer::primitive2d::TextSimplePortionPrimitive2D( + aTextMatrix, + aObjectString, + 0, + nTextLength, + std::move(aDXArray), + {}, + std::move(aFontAttribute), + std::move(aLocale), + aRGBColor)); + rVisitor.visit(xRef); + } + } + } + } + } + + if(bDoCreateGeometry) + { + sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence( + rOriginal, + rDisplayInfo, rVisitor); + } +} + +namespace +{ + void setOutlinerBgFromPage(::Outliner& rOutl, SdrPageView& rPgView, bool bScreenDisplay) + { + SdPage* pPage = static_cast<SdPage*>(rPgView.GetPage()); + if (pPage) + { + // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and + // hint value if screen display. Only then the AutoColor mechanisms shall be applied + rOutl.SetBackgroundColor(pPage->GetPageBackgroundColor(&rPgView, bScreenDisplay)); + } + } +} + +/** + * The event will be forwarded to the View + */ +void View::CompleteRedraw(OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector /*=0*/) +{ + // execute ?? + if (mnLockRedrawSmph != 0) + return; + + SdrPageView* pPgView = GetSdrPageView(); + + if (pPgView) + { + SdPage* pPage = static_cast<SdPage*>( pPgView->GetPage() ); + if( pPage ) + { + SdrOutliner& rOutl = mrDoc.GetDrawOutliner(); + bool bScreenDisplay(true); + + // #i75566# printing; suppress AutoColor BackgroundColor generation + // for visibility reasons by giving GetPageBackgroundColor() + // the needed hint + // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see printing) + if (pOutDev && ((OUTDEV_PRINTER == pOutDev->GetOutDevType()) + || (OUTDEV_PDF == pOutDev->GetOutDevType()))) + bScreenDisplay = false; + + setOutlinerBgFromPage(rOutl, *pPgView, bScreenDisplay); + } + } + + ViewRedirector aViewRedirector; + FmFormView::CompleteRedraw(pOutDev, rReg, pRedirector ? pRedirector : &aViewRedirector); +} + +void View::MarkListHasChanged() +{ + FmFormView::MarkListHasChanged(); + + if( GetMarkedObjectCount() > 0 ) + maSmartTags.deselect(); +} + +bool View::SetAttributes(const SfxItemSet& rSet, bool bReplaceAll, bool /*bSlide*/, bool /*bMaster*/) +{ + bool bOk = FmFormView::SetAttributes(rSet, bReplaceAll); + return bOk; +} + +void View::GetAttributes( SfxItemSet& rTargetSet, bool bOnlyHardAttr ) const +{ + FmFormView::GetAttributes( rTargetSet, bOnlyHardAttr ); +} + +/** + * Is a presentation object selected? + */ +bool View::IsPresObjSelected(bool bOnPage, bool bOnMasterPage, bool bCheckPresObjListOnly, bool bCheckLayoutOnly) const +{ + SdrMarkList* pMarkList; + + if (mnDragSrcPgNum != SDRPAGE_NOTFOUND && + mnDragSrcPgNum != GetSdrPageView()->GetPage()->GetPageNum()) + { + /* Drag&Drop is in progress + Source and destination page are different: + we use the saved mark list */ + pMarkList = mpDragSrcMarkList.get(); + } + else + { + // We use the current mark list + pMarkList = new SdrMarkList(GetMarkedObjectList()); + } + + SdrMark* pMark; + SdPage* pPage; + + bool bSelected = false; + bool bMasterPage = false; + + for (size_t nMark = pMarkList->GetMarkCount(); nMark && !bSelected; ) + { + --nMark; + // Backwards through mark list + pMark = pMarkList->GetMark(nMark); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + + if ( pObj && ( bCheckPresObjListOnly || pObj->IsEmptyPresObj() || pObj->GetUserCall() ) ) + { + pPage = static_cast<SdPage*>( pObj->getSdrPageFromSdrObject() ); + bMasterPage = pPage && pPage->IsMasterPage(); + + if ( (bMasterPage && bOnMasterPage) || (!bMasterPage && bOnPage) ) + { + if ( pPage && pPage->IsPresObj(pObj) ) + { + if( bCheckLayoutOnly ) + { + PresObjKind eKind = pPage->GetPresObjKind(pObj); + + if((eKind != PresObjKind::Footer) && (eKind != PresObjKind::Header) && (eKind != PresObjKind::DateTime) && (eKind != PresObjKind::SlideNumber) ) + bSelected = true; + } + else + { + bSelected = true; + } + } + } + } + } + + if (pMarkList != mpDragSrcMarkList.get()) + { + delete pMarkList; + } + + return bSelected; +} + +void View::SelectAll() +{ + if ( IsTextEdit() ) + { + OutlinerView* pOLV = GetTextEditOutlinerView(); + const ::Outliner* pOutliner = GetTextEditOutliner(); + pOLV->SelectRange( 0, pOutliner->GetParagraphCount() ); + } + else + { + MarkAll(); + } +} + +bool View::SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr) +{ + // forward to SdrView + FmFormView::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr); + return true; +} + +/** + * Start text input + */ +static void SetSpellOptions( const SdDrawDocument& rDoc, EEControlBits& rCntrl ) +{ + bool bOnlineSpell = rDoc.GetOnlineSpell(); + + if( bOnlineSpell ) + rCntrl |= EEControlBits::ONLINESPELLING; + else + rCntrl &= ~EEControlBits::ONLINESPELLING; +} + +void OutlinerMasterViewFilter::Start(SdrOutliner *pOutl) +{ + m_pOutl = pOutl; + OutlinerView* pOutlView = m_pOutl->GetView(0); + m_bReadOnly = pOutlView->IsReadOnly(); + pOutlView->SetReadOnly(true); +} + +void OutlinerMasterViewFilter::End() +{ + if (m_pOutl) + { + OutlinerView* pOutlView = m_pOutl->GetView(0); + pOutlView->SetReadOnly(m_bReadOnly); + m_pOutl = nullptr; + } +} + +SfxViewShell* View::GetSfxViewShell() const +{ + SfxViewShell* pRet = nullptr; + + if (mpViewSh) + pRet = &mpViewSh->GetViewShellBase(); + + return pRet; +} + +// Create a new view-local UndoManager manager for Impress/Draw +std::unique_ptr<SdrUndoManager> View::createLocalTextUndoManager() +{ + std::unique_ptr<SdrUndoManager> pUndoManager(new sd::UndoManager); + pUndoManager->SetDocShell(mpDocSh); + return pUndoManager; +} + +bool View::SdrBeginTextEdit( + SdrObject* pObj, SdrPageView* pPV, vcl::Window* pWin, + bool bIsNewObj, + SdrOutliner* pOutl, OutlinerView* pGivenOutlinerView, + bool bDontDeleteOutliner, bool bOnlyOneView, bool bGrabFocus ) +{ + SdrPage* pPage = pObj ? pObj->getSdrPageFromSdrObject() : nullptr; + bool bMasterPage = pPage && pPage->IsMasterPage(); + + GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent( + EventMultiplexerEventId::BeginTextEdit, static_cast<void*>(pObj) ); + + if( pOutl==nullptr && pObj ) + pOutl = SdrMakeOutliner(OutlinerMode::TextObject, pObj->getSdrModelFromSdrObject()).release(); + + // make draw&impress specific initialisations + if( pOutl ) + { + pOutl->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>( mrDoc.GetStyleSheetPool() )); + pOutl->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl)); + EEControlBits nCntrl = pOutl->GetControlWord(); + nCntrl |= EEControlBits::ALLOWBIGOBJS; + nCntrl |= EEControlBits::MARKFIELDS; + nCntrl |= EEControlBits::AUTOCORRECT; + + nCntrl &= ~EEControlBits::ULSPACESUMMATION; + if ( mrDoc.IsSummationOfParagraphs() ) + nCntrl |= EEControlBits::ULSPACESUMMATION; + + SetSpellOptions( mrDoc, nCntrl ); + + pOutl->SetControlWord(nCntrl); + + Reference< linguistic2::XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() ); + if ( xSpellChecker.is() ) + pOutl->SetSpeller( xSpellChecker ); + + Reference< linguistic2::XHyphenator > xHyphenator( LinguMgr::GetHyphenator() ); + if( xHyphenator.is() ) + pOutl->SetHyphenator( xHyphenator ); + + pOutl->SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() ); + } + + bool bReturn = FmFormView::SdrBeginTextEdit( + pObj, pPV, pWin, bIsNewObj, pOutl, + pGivenOutlinerView, bDontDeleteOutliner, + bOnlyOneView, bGrabFocus); + + if ( mpViewSh ) + { + mpViewSh->GetViewShellBase().GetDrawController()->FireSelectionChangeListener(); + + if (pObj && pObj->GetObjIdentifier() == SdrObjKind::Table) + mpViewSh->UpdateScrollBars(); + + if (comphelper::LibreOfficeKit::isActive()) + { + if (OutlinerView* pView = GetTextEditOutlinerView()) + { + ::tools::Rectangle aRectangle = pView->GetOutputArea(); + if (pWin && pWin->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + aRectangle = o3tl::convert(aRectangle, o3tl::Length::mm100, o3tl::Length::twip); + } + OString sRectangle = aRectangle.toString(); + SfxLokHelper::notifyOtherViews(&mpViewSh->GetViewShellBase(), LOK_CALLBACK_VIEW_LOCK, "rectangle", sRectangle); + } + } + } + + if (::Outliner* pOL = bReturn ? GetTextEditOutliner() : nullptr) + { + if (pObj) + { + if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Table ) + { + Color aBackground = GetTextEditBackgroundColor(*this); + pOL->SetBackgroundColor( aBackground ); + } + else + { + // tdf#148140 Set the background to determine autocolor. + // Use any explicit bg with fallback to underlying page if + // none found + if (!pObj->setSuitableOutlinerBg(*pOL) && pPV) + setOutlinerBgFromPage(*pOL, *pPV, true); + } + } + + pOL->SetParaInsertedHdl(LINK(this, View, OnParagraphInsertedHdl)); + pOL->SetParaRemovingHdl(LINK(this, View, OnParagraphRemovingHdl)); + } + + if (bMasterPage && bReturn && pOutl) + { + const SdrTextObj* pTextObj = pOutl->GetTextObj(); + const SdPage* pSdPage = pTextObj ? static_cast<const SdPage*>(pTextObj->getSdrPageFromSdrObject()) : nullptr; + const PresObjKind eKind = pSdPage ? pSdPage->GetPresObjKind(const_cast<SdrTextObj*>(pTextObj)) : PresObjKind::NONE; + switch (eKind) + { + case PresObjKind::Title: + case PresObjKind::Outline: + case PresObjKind::Text: + maMasterViewFilter.Start(pOutl); + break; + default: + break; + } + } + + return bReturn; +} + +/** ends current text editing */ +SdrEndTextEditKind View::SdrEndTextEdit(bool bDontDeleteReally) +{ + maMasterViewFilter.End(); + + SdrTextObj* xObj = GetTextEditObject(); + + bool bDefaultTextRestored = RestoreDefaultText( xObj ); + + SdrEndTextEditKind eKind = FmFormView::SdrEndTextEdit(bDontDeleteReally); + + if( bDefaultTextRestored ) + { + if( xObj && !xObj->IsEmptyPresObj() ) + { + xObj->SetEmptyPresObj( true ); + } + else + { + eKind = SdrEndTextEditKind::Unchanged; + } + } + else if( xObj && xObj->IsEmptyPresObj() ) + { + if( xObj && xObj->HasText() ) + { + SdrPage* pPage = xObj->getSdrPageFromSdrObject(); + if( !pPage || !pPage->IsMasterPage() ) + xObj->SetEmptyPresObj( false ); + } + } + + GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent( + EventMultiplexerEventId::EndTextEdit, + static_cast<void*>(xObj) ); + + if( xObj ) + { + if ( mpViewSh ) + { + mpViewSh->GetViewShellBase().GetDrawController()->FireSelectionChangeListener(); + + if (comphelper::LibreOfficeKit::isActive()) + SfxLokHelper::notifyOtherViews(&mpViewSh->GetViewShellBase(), LOK_CALLBACK_VIEW_LOCK, "rectangle", "EMPTY"_ostr); + + } + + SdPage* pPage = dynamic_cast< SdPage* >( xObj->getSdrPageFromSdrObject() ); + if( pPage ) + pPage->onEndTextEdit( xObj ); + } + + return eKind; +} + +/** restores the default text if the given text object is currently in edit mode and + no text has been entered already. Is only useful just before text edit ends. */ +bool View::RestoreDefaultText( SdrTextObj* pTextObj ) +{ + bool bRestored = false; + + if( pTextObj && (pTextObj == GetTextEditObject()) ) + { + if( !pTextObj->HasText() ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pTextObj->getSdrPageFromSdrObject() ); + + if(pPage) + { + bRestored = pPage->RestoreDefaultText( pTextObj ); + if( bRestored ) + { + SdrOutliner* pOutliner = GetTextEditOutliner(); + pTextObj->SetTextEditOutliner( pOutliner ); + OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); + if (pOutliner) + pOutliner->SetText(*pParaObj); + } + } + } + } + + return bRestored; +} + +/** + * Sets the original size of the marked objects. + */ +void View::SetMarkedOriginalSize() +{ + std::unique_ptr<SdrUndoGroup> pUndoGroup(new SdrUndoGroup(mrDoc)); + const size_t nCount = GetMarkedObjectCount(); + bool bOK = false; + + for( size_t i = 0; i < nCount; ++i ) + { + SdrObject* pObj = GetMarkedObjectByIndex(i); + + if( pObj->GetObjInventor() == SdrInventor::Default ) + { + if( pObj->GetObjIdentifier() == SdrObjKind::OLE2 ) + { + uno::Reference < embed::XEmbeddedObject > xObj = static_cast<SdrOle2Obj*>(pObj)->GetObjRef(); + if( xObj.is() ) + { + // TODO/LEAN: working with VisualArea can switch object to running state + + sal_Int64 nAspect = static_cast<SdrOle2Obj*>(pObj)->GetAspect(); + Size aOleSize; + + if ( nAspect == embed::Aspects::MSOLE_ICON ) + { + MapMode aMap100( MapUnit::Map100thMM ); + aOleSize = static_cast<SdrOle2Obj*>(pObj)->GetOrigObjSize( &aMap100 ); + bOK = true; + } + else + { + MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); + try + { + awt::Size aSz = xObj->getVisualAreaSize( nAspect ); + aOleSize = OutputDevice::LogicToLogic(Size(aSz.Width, aSz.Height), MapMode(aUnit), MapMode(MapUnit::Map100thMM)); + bOK = true; + } + catch( embed::NoVisualAreaSizeException& ) + {} + } + + if ( bOK ) + { + ::tools::Rectangle aDrawRect( pObj->GetLogicRect() ); + + pUndoGroup->AddAction( mrDoc.GetSdrUndoFactory().CreateUndoGeoObject( *pObj ) ); + pObj->Resize( aDrawRect.TopLeft(), Fraction( aOleSize.Width(), aDrawRect.GetWidth() ), + Fraction( aOleSize.Height(), aDrawRect.GetHeight() ) ); + } + } + } + else if( pObj->GetObjIdentifier() == SdrObjKind::Graphic ) + { + const SdrGrafObj* pSdrGrafObj = static_cast< const SdrGrafObj* >(pObj); + const Size aSize = pSdrGrafObj->getOriginalSize( ); + pUndoGroup->AddAction(GetModel().GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); + ::tools::Rectangle aRect( pObj->GetLogicRect() ); + aRect.SetSize( aSize ); + pObj->SetLogicRect( aRect ); + bOK = true; + } + } + } + + if( bOK ) + { + pUndoGroup->SetComment(SdResId(STR_UNDO_ORIGINALSIZE)); + mpDocSh->GetUndoManager()->AddUndoAction(std::move(pUndoGroup)); + } +} + +/** + * Connect OLE object to client. + */ +void View::DoConnect(SdrOle2Obj* pObj) +{ + if (!mpViewSh) + return; + + uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() ); + if( !xObj.is() ) + return; + + ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); + SfxInPlaceClient* pSdClient = mpViewSh-> GetViewShellBase().FindIPClient( xObj, pWindow ); + if ( pSdClient ) + return; + + pSdClient = new Client(pObj, mpViewSh, pWindow); + ::tools::Rectangle aRect = pObj->GetLogicRect(); + { + // TODO/LEAN: working with visual area can switch object to running state + Size aDrawSize = aRect.GetSize(); + + MapMode aMapMode( mrDoc.GetScaleUnit() ); + Size aObjAreaSize = pObj->GetOrigObjSize( &aMapMode ); + + Fraction aScaleWidth (aDrawSize.Width(), aObjAreaSize.Width() ); + Fraction aScaleHeight(aDrawSize.Height(), aObjAreaSize.Height() ); + aScaleWidth.ReduceInaccurate(10); // compatible to SdrOle2Obj + aScaleHeight.ReduceInaccurate(10); + pSdClient->SetSizeScale(aScaleWidth, aScaleHeight); + + // visible area is only changed in-place! + // the object area must be set after the scaling, since it triggers resize + aRect.SetSize(aObjAreaSize); + pSdClient->SetObjArea(aRect); + } +} + +bool View::IsMorphingAllowed() const +{ + const SdrMarkList& rMarkList = GetMarkedObjectList(); + bool bRet = false; + + if ( rMarkList.GetMarkCount() == 2 ) + { + const SdrObject* pObj1 = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); + const SdrObject* pObj2 = rMarkList.GetMark( 1 )->GetMarkedSdrObj(); + const SdrObjKind nKind1 = pObj1->GetObjIdentifier(); + const SdrObjKind nKind2 = pObj2->GetObjIdentifier(); + + if ( ( nKind1 != SdrObjKind::Text && nKind2 != SdrObjKind::Text ) && + ( nKind1 != SdrObjKind::TitleText && nKind2 != SdrObjKind::TitleText ) && + ( nKind1 != SdrObjKind::OutlineText && nKind2 != SdrObjKind::OutlineText ) && + ( nKind1 != SdrObjKind::Group && nKind2 != SdrObjKind::Group ) && + ( nKind1 != SdrObjKind::Line && nKind2 != SdrObjKind::Line ) && + ( nKind1 != SdrObjKind::PolyLine && nKind2 != SdrObjKind::PolyLine ) && + ( nKind1 != SdrObjKind::PathLine && nKind2 != SdrObjKind::PathLine ) && + ( nKind1 != SdrObjKind::FreehandLine && nKind2 != SdrObjKind::FreehandLine ) && + ( nKind1 != SdrObjKind::PathPolyLine && nKind2 != SdrObjKind::PathPolyLine ) && + ( nKind1 != SdrObjKind::Measure && nKind2 != SdrObjKind::Measure ) && + ( nKind1 != SdrObjKind::Edge && nKind2 != SdrObjKind::Edge ) && + ( nKind1 != SdrObjKind::Graphic && nKind2 != SdrObjKind::Graphic ) && + ( nKind1 != SdrObjKind::OLE2 && nKind2 != SdrObjKind::OLE2 ) && + ( nKind1 != SdrObjKind::Caption && nKind2 != SdrObjKind::Caption ) && + DynCastE3dObject( pObj1 ) == nullptr && DynCastE3dObject( pObj2 ) == nullptr ) + { + SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLSTYLE> aSet1( mrDoc.GetPool() ); + SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLSTYLE> aSet2( mrDoc.GetPool() ); + + aSet1.Put(pObj1->GetMergedItemSet()); + aSet2.Put(pObj2->GetMergedItemSet()); + + const drawing::FillStyle eFillStyle1 = aSet1.Get( XATTR_FILLSTYLE ).GetValue(); + const drawing::FillStyle eFillStyle2 = aSet2.Get( XATTR_FILLSTYLE ).GetValue(); + + if( ( eFillStyle1 == drawing::FillStyle_NONE || eFillStyle1 == drawing::FillStyle_SOLID ) && + ( eFillStyle2 == drawing::FillStyle_NONE || eFillStyle2 == drawing::FillStyle_SOLID ) ) + bRet = true; + } + } + + return bRet; +} + +bool View::IsVectorizeAllowed() const +{ + const SdrMarkList& rMarkList = GetMarkedObjectList(); + bool bRet = false; + + if( rMarkList.GetMarkCount() == 1 ) + { + const SdrGrafObj* pObj = dynamic_cast< const SdrGrafObj* >(rMarkList.GetMark( 0 )->GetMarkedSdrObj()); + + if(pObj) + { + if(GraphicType::Bitmap == pObj->GetGraphicType() && !pObj->isEmbeddedVectorGraphicData()) + { + bRet = true; + } + } + } + + return bRet; +} + +void View::onAccessibilityOptionsChanged() +{ + if( !mpViewSh ) + return; + + ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); + if( !pWindow ) + return; + + const StyleSettings& rStyleSettings = pWindow->GetSettings().GetStyleSettings(); + + if( mpViewSh->GetViewFrame() && mpViewSh->GetViewFrame()->GetDispatcher() ) + { + sal_uInt16 nOutputSlot, nPreviewSlot; + + if( rStyleSettings.GetHighContrastMode() ) + { + nOutputSlot = SID_OUTPUT_QUALITY_CONTRAST; + } + else + { + nOutputSlot = SID_OUTPUT_QUALITY_COLOR; + } + + if( rStyleSettings.GetHighContrastMode() + && officecfg::Office::Common::Accessibility::IsForPagePreviews::get() ) + { + nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST; + } + else + { + nPreviewSlot = SID_PREVIEW_QUALITY_COLOR; + } + + mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nOutputSlot, SfxCallMode::ASYNCHRON ); + mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nPreviewSlot, SfxCallMode::ASYNCHRON ); + } + + mpViewSh->Invalidate(); +} + +IMPL_LINK( View, OnParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, aParam, void ) +{ + SdrObject* pObj = GetTextEditObject(); + + if( aParam.pPara && pObj ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() ); + if( pPage ) + pPage->onParagraphInserted( aParam.pOutliner, aParam.pPara, pObj ); + } +} + +/** + * Handler for the deletion of the pages (paragraphs). + */ +IMPL_LINK( View, OnParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, aParam, void ) +{ + SdrObject* pObj = GetTextEditObject(); + + if( aParam.pPara && pObj ) + { + SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() ); + if( pPage ) + pPage->onParagraphRemoving( aParam.pOutliner, aParam.pPara, pObj ); + } +} + +bool View::isRecordingUndo() const +{ + if( mrDoc.IsUndoEnabled() ) + { + sd::UndoManager* pUndoManager = mrDoc.GetUndoManager(); + return pUndoManager && pUndoManager->IsInListAction(); + } + else + { + return false; + } +} + +void View::AddCustomHdl() +{ + maSmartTags.addCustomHandles( maHdlList ); +} + +void View::updateHandles() +{ + AdjustMarkHdl(); +} + +SdrViewContext View::GetContext() const +{ + SdrViewContext eContext = SdrViewContext::Standard; + if( maSmartTags.getContext( eContext ) ) + return eContext; + else + return FmFormView::GetContext(); +} + +bool View::HasMarkablePoints() const +{ + if( maSmartTags.HasMarkablePoints() ) + return true; + else + return FmFormView::HasMarkablePoints(); +} + +sal_Int32 View::GetMarkablePointCount() const +{ + sal_Int32 nCount = FmFormView::GetMarkablePointCount(); + nCount += maSmartTags.GetMarkablePointCount(); + return nCount; +} + +bool View::HasMarkedPoints() const +{ + if( maSmartTags.HasMarkedPoints() ) + return true; + else + return FmFormView::HasMarkedPoints(); +} + +bool View::MarkPoint(SdrHdl& rHdl, bool bUnmark ) +{ + if( maSmartTags.MarkPoint( rHdl, bUnmark ) ) + return true; + else + return FmFormView::MarkPoint( rHdl, bUnmark ); +} + +bool View::MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) +{ + if( maSmartTags.MarkPoints( pRect, bUnmark ) ) + return true; + else + return FmFormView::MarkPoints( pRect, bUnmark ); +} + +void View::CheckPossibilities() +{ + FmFormView::CheckPossibilities(); + maSmartTags.CheckPossibilities(); +} + +void View::OnBeginPasteOrDrop( PasteOrDropInfos* pInfo ) +{ + SdrOutliner* pOutliner = GetTextEditOutliner(); + if (!pOutliner) + return; + + // Turn character attributes of the paragraph of the insert position into + // character-level attributes, so they are not lost when OnEndPasteOrDrop() + // sets the paragraph stylesheet. + SfxItemSet aSet(pOutliner->GetParaAttribs(pInfo->nStartPara)); + pOutliner->SetCharAttribs(pInfo->nStartPara, aSet); +} + +/** this is called after a paste or drop operation, make sure that the newly inserted paragraphs + get the correct style sheet. */ +void View::OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) +{ + /* Style Sheet handling */ + SdrTextObj* pTextObj = GetTextEditObject(); + SdrOutliner* pOutliner = GetTextEditOutliner(); + if( !pOutliner || !pTextObj || !pTextObj->getSdrPageFromSdrObject() ) + return; + + SdPage* pPage = static_cast< SdPage* >( pTextObj->getSdrPageFromSdrObject() ); + const PresObjKind eKind = pPage->GetPresObjKind(pTextObj); + + // outline kinds are taken care of in Outliner::ImplSetLevelDependentStyleSheet + if( eKind == PresObjKind::Outline ) + return; + + SfxStyleSheet* pStyleSheet = nullptr; + if( eKind != PresObjKind::NONE ) + pStyleSheet = pPage->GetStyleSheetForPresObj(eKind); + else + pStyleSheet = pTextObj->GetStyleSheet(); + // just put the object style on each new paragraph + for ( sal_Int32 nPara = pInfo->nStartPara; nPara <= pInfo->nEndPara; nPara++ ) + { + pOutliner->SetStyleSheet( nPara, pStyleSheet ); + } +} + +bool View::ShouldToggleOn( + const bool bBulletOnOffMode, + const bool bNormalBullet) +{ + // If setting bullets/numbering by the dialog, always should toggle on. + if (!bBulletOnOffMode) + return true; + SdrModel& rSdrModel = GetModel(); + + bool bToggleOn = false; + std::unique_ptr<SdrOutliner> pOutliner(SdrMakeOutliner(OutlinerMode::TextObject, rSdrModel)); + const size_t nMarkCount = GetMarkedObjectCount(); + for (size_t nIndex = 0; nIndex < nMarkCount && !bToggleOn; ++nIndex) + { + SdrTextObj* pTextObj = DynCastSdrTextObj(GetMarkedObjectByIndex(nIndex)); + if (!pTextObj || pTextObj->IsTextEditActive()) + continue; + if( dynamic_cast< const SdrTableObj *>( pTextObj ) != nullptr) + { + SdrTableObj* pTableObj = dynamic_cast< SdrTableObj* >(pTextObj); + if (!pTableObj) + continue; + CellPos aStart, aEnd; + SvxTableController* pTableController = dynamic_cast< SvxTableController* >(getSelectionController().get()); + if (pTableController) + { + pTableController->getSelectedCells(aStart, aEnd); + } + else + { + aStart = SdrTableObj::getFirstCell(); + aEnd = pTableObj->getLastCell(); + } + sal_Int32 nColCount = pTableObj->getColumnCount(); + for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow && !bToggleOn; nRow++) + { + for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol && !bToggleOn; nCol++) + { + sal_Int32 nCellIndex = nRow * nColCount + nCol; + SdrText* pText = pTableObj->getText(nCellIndex); + if (!pText || !pText->GetOutlinerParaObject()) + continue; + pOutliner->SetText(*(pText->GetOutlinerParaObject())); + sal_Int16 nStatus = pOutliner->GetBulletsNumberingStatus(); + bToggleOn = (bNormalBullet && nStatus != 0) || (!bNormalBullet && nStatus != 1); + pOutliner->Clear(); + } + } + } + else + { + OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); + if (!pParaObj) + continue; + pOutliner->SetText(*pParaObj); + sal_Int16 nStatus = pOutliner->GetBulletsNumberingStatus(); + bToggleOn = (bNormalBullet && nStatus != 0) || (!bNormalBullet && nStatus != 1); + pOutliner->Clear(); + } + } + return bToggleOn; +} + +void View::ChangeMarkedObjectsBulletsNumbering( + const bool bToggle, + const bool bHandleBullets, + const SvxNumRule* pNumRule ) +{ + SdrModel& rSdrModel = GetModel(); + OutputDevice* pOut = GetFirstOutputDevice(); + vcl::Window* pWindow = pOut ? pOut->GetOwnerWindow() : nullptr; + if (!pWindow) + return; + + const bool bUndoEnabled = rSdrModel.IsUndoEnabled(); + std::unique_ptr<SdrUndoGroup> pUndoGroup(bUndoEnabled ? new SdrUndoGroup(rSdrModel) : nullptr); + + const bool bToggleOn = ShouldToggleOn( bToggle, bHandleBullets ); + + std::unique_ptr<SdrOutliner> pOutliner(SdrMakeOutliner(OutlinerMode::TextObject, rSdrModel)); + OutlinerView aOutlinerView(pOutliner.get(), pWindow); + + const size_t nMarkCount = GetMarkedObjectCount(); + for (size_t nIndex = 0; nIndex < nMarkCount; ++nIndex) + { + SdrTextObj* pTextObj = DynCastSdrTextObj(GetMarkedObjectByIndex(nIndex)); + if (!pTextObj || pTextObj->IsTextEditActive()) + continue; + if( dynamic_cast< SdrTableObj *>( pTextObj ) != nullptr) + { + SdrTableObj* pTableObj = dynamic_cast< SdrTableObj* >(pTextObj); + if (!pTableObj) + continue; + CellPos aStart, aEnd; + SvxTableController* pTableController = dynamic_cast< SvxTableController* >(getSelectionController().get()); + if (pTableController) + { + pTableController->getSelectedCells(aStart, aEnd); + } + else + { + aStart = SdrTableObj::getFirstCell(); + aEnd = pTableObj->getLastCell(); + } + sal_Int32 nColCount = pTableObj->getColumnCount(); + for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++) + { + for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++) + { + sal_Int32 nCellIndex = nRow * nColCount + nCol; + SdrText* pText = pTableObj->getText(nCellIndex); + if (!pText || !pText->GetOutlinerParaObject()) + continue; + + pOutliner->SetText(*(pText->GetOutlinerParaObject())); + if (bUndoEnabled) + { + pUndoGroup->AddAction(rSdrModel.GetSdrUndoFactory().CreateUndoObjectSetText(*pTextObj, nCellIndex)); + } + if ( !bToggleOn ) + { + aOutlinerView.SwitchOffBulletsNumbering(); + } + else + { + aOutlinerView.ApplyBulletsNumbering( bHandleBullets, pNumRule, bToggle ); + } + sal_uInt32 nParaCount = pOutliner->GetParagraphCount(); + pText->SetOutlinerParaObject(pOutliner->CreateParaObject(0, static_cast<sal_uInt16>(nParaCount))); + pOutliner->Clear(); + } + } + // Broadcast the object change event. + if (!pTextObj->AdjustTextFrameWidthAndHeight()) + { + pTextObj->SetChanged(); + pTextObj->BroadcastObjectChange(); + } + } + else + { + OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); + if (!pParaObj) + continue; + pOutliner->SetText(*pParaObj); + if (bUndoEnabled) + { + pUndoGroup->AddAction( + rSdrModel.GetSdrUndoFactory().CreateUndoObjectSetText(*pTextObj, 0)); + } + if ( !bToggleOn ) + { + aOutlinerView.SwitchOffBulletsNumbering(); + } + else + { + aOutlinerView.ApplyBulletsNumbering( bHandleBullets, pNumRule, bToggle ); + } + sal_uInt32 nParaCount = pOutliner->GetParagraphCount(); + pTextObj->SetOutlinerParaObject(pOutliner->CreateParaObject(0, static_cast<sal_uInt16>(nParaCount))); + pOutliner->Clear(); + } + } + + if ( bUndoEnabled && pUndoGroup->GetActionCount() > 0 ) + { + rSdrModel.BegUndo(); + rSdrModel.AddUndo(std::move(pUndoGroup)); + rSdrModel.EndUndo(); + } +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdview2.cxx b/sd/source/ui/view/sdview2.cxx new file mode 100644 index 0000000000..af76e39afd --- /dev/null +++ b/sd/source/ui/view/sdview2.cxx @@ -0,0 +1,910 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <View.hxx> + +#include <vector> +#include <com/sun/star/embed/XEmbedPersist.hpp> +#include <com/sun/star/embed/XEmbeddedObject.hpp> +#include <comphelper/sequenceashashmap.hxx> +#include <tools/urlobj.hxx> +#include <svx/svdoole2.hxx> +#include <svx/svxdlg.hxx> +#include <sfx2/docfile.hxx> +#include <svx/svdundo.hxx> +#include <svx/svdpagv.hxx> +#include <svl/urlbmk.hxx> +#include <editeng/outliner.hxx> +#include <svx/xflclit.hxx> +#include <sot/formats.hxx> +#include <editeng/editeng.hxx> + +#include <svtools/embedtransfer.hxx> +#include <tools/debug.hxx> + +#include <anminfo.hxx> +#include <strings.hrc> +#include <sdxfer.hxx> +#include <sdresid.hxx> +#include <sdmod.hxx> +#include <sdtreelb.hxx> +#include <DrawViewShell.hxx> +#include <DrawDocShell.hxx> +#include <fudraw.hxx> +#include <drawdoc.hxx> +#include <Window.hxx> +#include <sdpage.hxx> +#include <unoaprms.hxx> +#include <helpids.h> +#include <vcl/svapp.hxx> + +#include <slideshow.hxx> +#include <memory> + +namespace sd { + +using namespace ::com::sun::star; + +namespace { + +struct SdNavigatorDropEvent : public ExecuteDropEvent +{ + VclPtr< ::sd::Window> mpTargetWindow; + + SdNavigatorDropEvent ( + const ExecuteDropEvent& rEvt, + ::sd::Window* pTargetWindow ) + : ExecuteDropEvent( rEvt ), + mpTargetWindow( pTargetWindow ) + {} +}; + +} + +css::uno::Reference< css::datatransfer::XTransferable > View::CreateClipboardDataObject() +{ + // since SdTransferable::CopyToClipboard is called, this + // dynamically created object is destroyed automatically + rtl::Reference<SdTransferable> pTransferable = new SdTransferable( &mrDoc, nullptr, false ); + + SD_MOD()->pTransferClip = pTransferable.get(); + + mrDoc.CreatingDataObj( pTransferable.get() ); + pTransferable->SetWorkDocument( static_cast<SdDrawDocument*>(CreateMarkedObjModel().release()) ); + mrDoc.CreatingDataObj( nullptr ); + + // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get + // fat lines correctly + const ::tools::Rectangle aMarkRect( GetAllMarkedBoundRect() ); + std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor); + SdrOle2Obj* pSdrOleObj = nullptr; + SdrPageView* pPgView = GetSdrPageView(); + SdPage* pOldPage = pPgView ? static_cast<SdPage*>( pPgView->GetPage() ) : nullptr; + SdPage* pNewPage = const_cast<SdPage*>(static_cast<const SdPage*>( pTransferable->GetWorkDocument()->GetPage( 0 ) )); + + if( pOldPage ) + { + pNewPage->SetSize( pOldPage->GetSize() ); + pNewPage->SetLayoutName( pOldPage->GetLayoutName() ); + } + + if( GetMarkedObjectCount() == 1 ) + { + SdrObject* pObj = GetMarkedObjectByIndex(0); + + if( auto pOle2Obj = dynamic_cast<SdrOle2Obj *>( pObj ) ) + if( pOle2Obj->GetObjRef() ) + { + // If object has no persistence it must be copied as part of the document + try + { + uno::Reference< embed::XEmbedPersist > xPersObj( pOle2Obj->GetObjRef(), uno::UNO_QUERY ); + if ( xPersObj.is() && xPersObj->hasEntry() ) + pSdrOleObj = pOle2Obj; + } + catch( uno::Exception& ) + {} + } + } + + if( pSdrOleObj ) + SvEmbedTransferHelper::FillTransferableObjectDescriptor( *pObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() ); + else + pTransferable->GetWorkDocument()->GetDocSh()->FillTransferableObjectDescriptor( *pObjDesc ); + + if( mpDocSh ) + pObjDesc->maDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); + + pObjDesc->maSize = aMarkRect.GetSize(); + + pTransferable->SetStartPos( aMarkRect.TopLeft() ); + pTransferable->SetObjectDescriptor( std::move(pObjDesc) ); + pTransferable->CopyToClipboard( mpViewSh->GetActiveWindow() ); + + return pTransferable; +} + +css::uno::Reference< css::datatransfer::XTransferable > View::CreateDragDataObject( View* pWorkView, vcl::Window& rWindow, const Point& rDragPos ) +{ + rtl::Reference<SdTransferable> pTransferable = new SdTransferable( &mrDoc, pWorkView, false ); + + SD_MOD()->pTransferDrag = pTransferable.get(); + + std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor); + OUString aDisplayName; + SdrOle2Obj* pSdrOleObj = nullptr; + + if( GetMarkedObjectCount() == 1 ) + { + SdrObject* pObj = GetMarkedObjectByIndex( 0 ); + + if( auto pOle2Obj = dynamic_cast<SdrOle2Obj *>( pObj ) ) + if( pOle2Obj->GetObjRef() ) + { + // If object has no persistence it must be copied as part of the document + try + { + uno::Reference< embed::XEmbedPersist > xPersObj( pOle2Obj->GetObjRef(), uno::UNO_QUERY ); + if ( xPersObj.is() && xPersObj->hasEntry() ) + pSdrOleObj = pOle2Obj; + } + catch( uno::Exception& ) + {} + } + } + + if( mpDocSh ) + aDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); + + if( pSdrOleObj ) + SvEmbedTransferHelper::FillTransferableObjectDescriptor( *pObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() ); + else if (mpDocSh) + mpDocSh->FillTransferableObjectDescriptor( *pObjDesc ); + + pObjDesc->maSize = GetAllMarkedRect().GetSize(); + pObjDesc->maDragStartPos = rDragPos; + pObjDesc->maDisplayName = aDisplayName; + + pTransferable->SetStartPos( rDragPos ); + pTransferable->SetObjectDescriptor( std::move(pObjDesc) ); + pTransferable->StartDrag( &rWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK ); + + return pTransferable; +} + +css::uno::Reference< css::datatransfer::XTransferable > View::CreateSelectionDataObject( View* pWorkView ) +{ + rtl::Reference<SdTransferable> pTransferable = new SdTransferable( &mrDoc, pWorkView, true ); + std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor); + const ::tools::Rectangle aMarkRect( GetAllMarkedRect() ); + + SD_MOD()->pTransferSelection = pTransferable.get(); + + if( mpDocSh ) + { + mpDocSh->FillTransferableObjectDescriptor( *pObjDesc ); + pObjDesc->maDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); + } + + pObjDesc->maSize = aMarkRect.GetSize(); + + pTransferable->SetStartPos( aMarkRect.TopLeft() ); + pTransferable->SetObjectDescriptor( std::move(pObjDesc) ); + pTransferable->CopyToPrimarySelection(); + + return pTransferable; +} + +void View::UpdateSelectionClipboard() // false case +{ + if (!mpViewSh) + return; + if (!mpViewSh->GetActiveWindow()) + return; + if (GetMarkedObjectList().GetMarkCount()) + CreateSelectionDataObject( this ); + else + ClearSelectionClipboard(); +} + +void View::ClearSelectionClipboard() // true case +{ + if (!mpViewSh) + return; + if (!mpViewSh->GetActiveWindow()) + return; + if (SD_MOD()->pTransferSelection && SD_MOD()->pTransferSelection->GetView() == this) + { + TransferableHelper::ClearPrimarySelection(); + SD_MOD()->pTransferSelection = nullptr; + } +} + +void View::DoCut() +{ + const OutlinerView* pOLV = GetTextEditOutlinerView(); + + if( pOLV ) + const_cast<OutlinerView*>(pOLV)->Cut(); + else if( AreObjectsMarked() ) + { + OUString aStr(SdResId(STR_UNDO_CUT)); + + DoCopy(); + BegUndo(aStr + " " + GetDescriptionOfMarkedObjects()); + DeleteMarked(); + EndUndo(); + } +} + +void View::DoCopy() +{ + const OutlinerView* pOLV = GetTextEditOutlinerView(); + + if( pOLV ) + const_cast<OutlinerView*>(pOLV)->Copy(); + else if( AreObjectsMarked() ) + { + BrkAction(); + CreateClipboardDataObject(); + } +} + +void View::DoPaste (::sd::Window* pWindow) +{ + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewSh->GetActiveWindow() ) ); + if( !aDataHelper.GetTransferable().is() ) + return; // empty clipboard? + + const OutlinerView* pOLV = GetTextEditOutlinerView(); + + if( pOLV && EditEngine::HasValidData( aDataHelper.GetTransferable() ) ) + { + const_cast< OutlinerView* >(pOLV)->PasteSpecial(); + + SdrObject* pObj = GetTextEditObject(); + SdPage* pPage = static_cast<SdPage*>( pObj ? pObj->getSdrPageFromSdrObject() : nullptr ); + ::Outliner* pOutliner = pOLV->GetOutliner(); + + if( pOutliner) + { + if( pObj && pPage && pPage->GetPresObjKind(pObj) == PresObjKind::Title ) + { + // remove all hard linebreaks from the title + if (pOutliner->GetParagraphCount() > 1) + { + bool bOldUpdateMode = pOutliner->SetUpdateLayout( false ); + + const EditEngine& rEdit = pOutliner->GetEditEngine(); + const sal_Int32 nParaCount = rEdit.GetParagraphCount(); + + for( sal_Int32 nPara = nParaCount - 2; nPara >= 0; nPara-- ) + { + const sal_Int32 nParaLen = rEdit.GetTextLen( nPara ); + pOutliner->QuickDelete( ESelection( nPara, nParaLen, nPara+1, 0 ) ); + pOutliner->QuickInsertLineBreak( ESelection( nPara, nParaLen, nPara, nParaLen ) ); + } + + DBG_ASSERT( rEdit.GetParagraphCount() <= 1, "Titleobject contains hard line breaks" ); + pOutliner->SetUpdateLayout(bOldUpdateMode); + } + } + + if( !mrDoc.IsChanged() ) + { + if (pOutliner->IsModified()) + mrDoc.SetChanged(); + } + } + } + else + { + Point aPos = pWindow->GetVisibleCenter(); + DrawViewShell* pDrViewSh = static_cast<DrawViewShell*>( mpDocSh->GetViewShell() ); + + if (pDrViewSh != nullptr) + { + sal_Int8 nDnDAction = DND_ACTION_COPY; + if( !InsertData( aDataHelper, aPos, nDnDAction, false ) ) + { + INetBookmark aINetBookmark( "", "" ); + + if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) || + ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) + { + pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" ); + } + } + } + } +} + +void View::StartDrag( const Point& rStartPos, vcl::Window* pWindow ) +{ + if (!AreObjectsMarked() || !IsAction() || !mpViewSh || !pWindow) + return; + + BrkAction(); + + if( IsTextEdit() ) + SdrEndTextEdit(); + + if (DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(mpDocSh ? mpDocSh->GetViewShell() : nullptr)) + { + const rtl::Reference<FuPoor>& xFunction(pDrawViewShell->GetCurrentFunction()); + if (FuDraw* pFunction = dynamic_cast<FuDraw*>(xFunction.get())) + pFunction->ForcePointer(); + } + + mpDragSrcMarkList.reset( new SdrMarkList(GetMarkedObjectList()) ); + mnDragSrcPgNum = GetSdrPageView()->GetPage()->GetPageNum(); + + CreateDragDataObject( this, *pWindow, rStartPos ); +} + +void View::DragFinished( sal_Int8 nDropAction ) +{ + const bool bUndo = IsUndoEnabled(); + const bool bGroupUndo = bUndo && mpDragSrcMarkList; + if (bGroupUndo) + { + OUString aStr(SdResId(STR_UNDO_DRAGDROP)); + BegUndo(aStr + " " + mpDragSrcMarkList->GetMarkDescription()); + } + + SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; + + if( pDragTransferable ) + pDragTransferable->SetView( nullptr ); + + if( ( nDropAction & DND_ACTION_MOVE ) && + pDragTransferable && !pDragTransferable->IsInternalMove() && + mpDragSrcMarkList && mpDragSrcMarkList->GetMarkCount() && + !IsPresObjSelected() ) + { + mpDragSrcMarkList->ForceSort(); + + if( bUndo ) + BegUndo(); + + const size_t nCnt = mpDragSrcMarkList->GetMarkCount(); + + for( size_t nm = nCnt; nm>0; ) + { + --nm; + SdrMark* pM=mpDragSrcMarkList->GetMark(nm); + if( bUndo ) + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject(*pM->GetMarkedSdrObj())); + } + + mpDragSrcMarkList->GetMark(0)->GetMarkedSdrObj()->GetOrdNum(); + + for (size_t nm = nCnt; nm>0;) + { + --nm; + SdrMark* pM=mpDragSrcMarkList->GetMark(nm); + SdrObject* pObj=pM->GetMarkedSdrObj(); + + if( pObj && pObj->getSdrPageFromSdrObject() ) + { + const size_t nOrdNum = pObj->GetOrdNumDirect(); + rtl::Reference<SdrObject> pChkObj = pObj->getSdrPageFromSdrObject()->RemoveObject(nOrdNum); + DBG_ASSERT(pChkObj.get()==pObj,"pChkObj!=pObj in RemoveObject()"); + } + } + + if( bUndo ) + EndUndo(); + } + + if( pDragTransferable ) + pDragTransferable->SetInternalMove( false ); + + if (bGroupUndo) + EndUndo(); + mnDragSrcPgNum = SDRPAGE_NOTFOUND; + mpDragSrcMarkList.reset(); +} + +sal_Int8 View::AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper, + SdrLayerID nLayer ) +{ + OUString aLayerName = GetActiveLayer(); + SdrPageView* pPV = GetSdrPageView(); + sal_Int8 nDropAction = rEvt.mnAction; + sal_Int8 nRet = DND_ACTION_NONE; + + if( nLayer != SDRLAYER_NOTFOUND ) + { + SdrLayerAdmin& rLayerAdmin = mrDoc.GetLayerAdmin(); + SdrLayer* pLayer = rLayerAdmin.GetLayerPerID(nLayer); + assert(pLayer && "layer missing"); + aLayerName = pLayer->GetName(); + } + + if( mbIsDropAllowed && !pPV->IsLayerLocked( aLayerName ) && pPV->IsLayerVisible( aLayerName ) ) + { + const OutlinerView* pOLV = GetTextEditOutlinerView(); + bool bIsInsideOutlinerView = false; + + if( pOLV ) + { + ::tools::Rectangle aRect( pOLV->GetOutputArea() ); + + if (GetMarkedObjectCount() == 1) + { + SdrMark* pMark = GetSdrMarkByIndex(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + aRect.Union( pObj->GetLogicRect() ); + } + + if( aRect.Contains( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ) ) + { + bIsInsideOutlinerView = true; + } + } + + if( !bIsInsideOutlinerView ) + { + SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; + + if(pDragTransferable && (nDropAction & DND_ACTION_LINK)) + { + // suppress own data when it's intention is to use it as fill information + pDragTransferable = nullptr; + } + + if( pDragTransferable ) + { + const View* pSourceView = pDragTransferable->GetView(); + + if( pDragTransferable->IsPageTransferable() ) + { + nRet = DND_ACTION_COPY; + } + else if( pSourceView ) + { + if( !( nDropAction & DND_ACTION_LINK ) || + !pSourceView->GetDocSh()->GetMedium()->GetName().isEmpty() ) + { + nRet = nDropAction; + } + } + } + else + { + const bool bDrawing = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::DRAWING ); + const bool bGraphic = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::SVXB ); + const bool bMtf = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::GDIMETAFILE ); + const bool bBitmap = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::BITMAP ); + bool bBookmark = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK ); + bool bXFillExchange = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::XFA ); + + // check handle insert + if ((bXFillExchange && (SdrDragMode::Gradient == GetDragMode())) + || (SdrDragMode::Transparence == GetDragMode())) + { + const SdrHdlList& rHdlList = GetHdlList(); + + for( size_t n = 0; n < rHdlList.GetHdlCount(); ++n ) + { + SdrHdl* pIAOHandle = rHdlList.GetHdl( n ); + + if( pIAOHandle && ( SdrHdlKind::Color == pIAOHandle->GetKind() ) ) + { + if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) + { + nRet = nDropAction; + static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_SELECTED ); + } + else + { + static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_NORMAL ); + } + } + } + } + + // check object insert + if( !nRet && ( bXFillExchange || ( ( bDrawing || bGraphic || bMtf || bBitmap || bBookmark ) && ( nDropAction & DND_ACTION_LINK ) ) ) ) + { + SdrPageView* pPageView = nullptr; + ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); + Point aPos( pWindow->PixelToLogic( rEvt.maPosPixel ) ); + SdrObject* pPickObj = PickObj(aPos, getHitTolLog(), pPageView); + bool bIsPresTarget = false; + + if (pPickObj && (pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall())) + { + SdPage* pPage = static_cast<SdPage*>( pPickObj->getSdrPageFromSdrObject() ); + + if( pPage && pPage->IsMasterPage() ) + bIsPresTarget = pPage->IsPresObj( pPickObj ); + } + + if (pPickObj && !bIsPresTarget && (bGraphic || bMtf || bBitmap || bXFillExchange)) + { + if( mpDropMarkerObj != pPickObj ) + { + mpDropMarkerObj = pPickObj; + ImplClearDrawDropMarker(); + + if(mpDropMarkerObj) + { + mpDropMarker.reset( new SdrDropMarkerOverlay(*this, *mpDropMarkerObj) ); + } + } + + nRet = nDropAction; + } + else + bXFillExchange = false; + } + + // check normal insert + if( !nRet ) + { + const bool bSBAFormat = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::SVX_FORMFIELDEXCH ); + const bool bEditEngineODF = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT ); + const bool bString = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::STRING ); + const bool bRTF = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::RTF ); + const bool bFile = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE ); + const bool bFileList = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::FILE_LIST ); + + if( mpDropMarker ) + { + ImplClearDrawDropMarker(); + mpDropMarkerObj = nullptr; + } + + if( bBookmark && bFile && ( nDropAction & DND_ACTION_MOVE ) && mpViewSh && SlideShow::IsRunning(mpViewSh->GetViewShellBase()) ) + bBookmark = false; + + if( bDrawing || bGraphic || bMtf || bBitmap || bBookmark || bFile || bFileList || bXFillExchange || bSBAFormat || bEditEngineODF || bString || bRTF ) + nRet = nDropAction; + + // For entries from the navigator, change action copy. + if (bBookmark + && rTargetHelper.IsDropFormatSupported( + SdPageObjsTLV::SdPageObjsTransferable::GetListBoxDropFormatId()) + && (nDropAction & DND_ACTION_MOVE)!=0) + { + nRet = DND_ACTION_COPY; + } + } + } + } + } + + // destroy drop marker if this is a leaving event + if( rEvt.mbLeaving && mpDropMarker ) + { + ImplClearDrawDropMarker(); + mpDropMarkerObj = nullptr; + } + + return nRet; +} + +sal_Int8 View::ExecuteDrop( const ExecuteDropEvent& rEvt, + ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ) +{ + SdrPageView* pPV = GetSdrPageView(); + OUString aActiveLayer = GetActiveLayer(); + sal_Int8 nDropAction = rEvt.mnAction; + sal_Int8 nRet = DND_ACTION_NONE; + + // destroy drop marker if it is shown + if( mpDropMarker ) + { + ImplClearDrawDropMarker(); + mpDropMarkerObj = nullptr; + } + + if( !pPV->IsLayerLocked( aActiveLayer ) ) + { + const OutlinerView* pOLV = GetTextEditOutlinerView(); + bool bIsInsideOutlinerView = false; + + if( pOLV ) + { + ::tools::Rectangle aRect( pOLV->GetOutputArea() ); + + if( GetMarkedObjectCount() == 1 ) + { + SdrMark* pMark = GetSdrMarkByIndex(0); + SdrObject* pObj = pMark->GetMarkedSdrObj(); + aRect.Union( pObj->GetLogicRect() ); + } + + Point aPos( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ); + + if( aRect.Contains( aPos ) ) + { + bIsInsideOutlinerView = true; + } + } + + if( !bIsInsideOutlinerView ) + { + Point aPos; + TransferableDataHelper aDataHelper( rEvt.maDropEvent.Transferable ); + + if( pTargetWindow ) + aPos = pTargetWindow->PixelToLogic( rEvt.maPosPixel ); + + // handle insert? + if ((SdrDragMode::Gradient == GetDragMode()) + || ((SdrDragMode::Transparence == GetDragMode()) + && aDataHelper.HasFormat(SotClipboardFormatId::XFA))) + { + const SdrHdlList& rHdlList = GetHdlList(); + + for( size_t n = 0; !nRet && n < rHdlList.GetHdlCount(); ++n ) + { + SdrHdl* pIAOHandle = rHdlList.GetHdl( n ); + + if( pIAOHandle && ( SdrHdlKind::Color == pIAOHandle->GetKind() ) ) + { + if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) + { + uno::Any const data(aDataHelper.GetAny(SotClipboardFormatId::XFA, "")); + uno::Sequence<beans::NamedValue> props; + if (data >>= props) + { + ::comphelper::SequenceAsHashMap const map(props); + Color aColor(COL_BLACK); + auto const it = map.find("FillColor"); + if (it != map.end()) + { + XFillColorItem color; + color.PutValue(it->second, 0); + aColor = color.GetColorValue(); + } + static_cast< SdrHdlColor* >( pIAOHandle )->SetColor( aColor, true ); + nRet = nDropAction; + } + } + } + } + } + + // standard insert? + if( !nRet && InsertData( aDataHelper, aPos, nDropAction, true, SotClipboardFormatId::NONE, nPage, nLayer ) ) + nRet = nDropAction; + + // special insert? + if( !nRet && mpViewSh ) + { + INetBookmark aINetBookmark( (OUString()), (OUString()) ); + + // insert bookmark + if( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) && + aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) + { + SdPageObjsTLV::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLV::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() ); + + if( pPageObjsTransferable && + ( NAVIGATOR_DRAGTYPE_LINK == pPageObjsTransferable->GetDragType() || + NAVIGATOR_DRAGTYPE_EMBEDDED == pPageObjsTransferable->GetDragType() ) ) + { + // insert bookmark from own navigator (handled async. due to possible message box ) + Application::PostUserEvent( LINK( this, View, ExecuteNavigatorDrop ), + new SdNavigatorDropEvent( rEvt, pTargetWindow ) ); + nRet = nDropAction; + } + else + { + SdrPageView* pPageView = nullptr; + + SdrObject* pPickObj = PickObj(aPos, getHitTolLog(), pPageView); + if (pPickObj) + { + // insert as clip action => jump + OUString aBookmark( aINetBookmark.GetURL() ); + SdAnimationInfo* pInfo = SdDrawDocument::GetAnimationInfo( pPickObj ); + + if( !aBookmark.isEmpty() ) + { + bool bCreated = false; + + presentation::ClickAction eClickAction = presentation::ClickAction_DOCUMENT; + + sal_Int32 nIndex = aBookmark.indexOf( '#' ); + if( nIndex != -1 ) + { + const std::u16string_view aDocName( aBookmark.subView( 0, nIndex ) ); + + if (mpDocSh->GetMedium()->GetName() == aDocName || aDocName == mpDocSh->GetName()) + { + // internal jump, only use the part after and including '#' + eClickAction = presentation::ClickAction_BOOKMARK; + aBookmark = aBookmark.copy( nIndex+1 ); + } + } + + if( !pInfo ) + { + pInfo = SdDrawDocument::GetShapeUserData( *pPickObj, true ); + bCreated = true; + } + + // create undo action with old and new sizes + std::unique_ptr<SdAnimationPrmsUndoAction> pAction(new SdAnimationPrmsUndoAction(&mrDoc, pPickObj, bCreated)); + pAction->SetActive(pInfo->mbActive, pInfo->mbActive); + pAction->SetEffect(pInfo->meEffect, pInfo->meEffect); + pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect); + pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed); + pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious); + pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor); + pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide); + pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn); + pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile); + pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull); + pAction->SetClickAction(pInfo->meClickAction, eClickAction); + pAction->SetBookmark(pInfo->GetBookmark(), aBookmark); + pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb); + pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect); + pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed); + pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn); + pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull); + + OUString aString(SdResId(STR_UNDO_ANIMATION)); + pAction->SetComment(aString); + mpDocSh->GetUndoManager()->AddUndoAction(std::move(pAction)); + pInfo->meClickAction = eClickAction; + pInfo->SetBookmark( aBookmark ); + mrDoc.SetChanged(); + + nRet = nDropAction; + } + } + else if( auto pDrawViewShell = dynamic_cast< DrawViewShell *>( mpViewSh ) ) + { + // insert as normal URL button + pDrawViewShell->InsertURLButton( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), OUString(), &aPos ); + nRet = nDropAction; + } + } + } + } + } + } + + return nRet; +} + +IMPL_LINK( View, ExecuteNavigatorDrop, void*, p, void ) +{ + SdNavigatorDropEvent* pSdNavigatorDropEvent = static_cast<SdNavigatorDropEvent*>(p); + TransferableDataHelper aDataHelper( pSdNavigatorDropEvent->maDropEvent.Transferable ); + SdPageObjsTLV::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLV::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() ); + INetBookmark aINetBookmark; + + if( pPageObjsTransferable && aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) + { + Point aPos; + OUString aBookmark; + SdPage* pPage = static_cast<SdPage*>( GetSdrPageView()->GetPage() ); + sal_uInt16 nPgPos = 0xFFFF; + + if( pSdNavigatorDropEvent->mpTargetWindow ) + aPos = pSdNavigatorDropEvent->mpTargetWindow->PixelToLogic( pSdNavigatorDropEvent->maPosPixel ); + + const OUString& aURL( aINetBookmark.GetURL() ); + sal_Int32 nIndex = aURL.indexOf( '#' ); + if( nIndex != -1 ) + aBookmark = aURL.copy( nIndex+1 ); + + std::vector<OUString> aExchangeList; + std::vector<OUString> aBookmarkList(1,aBookmark); + + if( !pPage->IsMasterPage() ) + { + if( pPage->GetPageKind() == PageKind::Standard ) + nPgPos = pPage->GetPageNum() + 2; + else if( pPage->GetPageKind() == PageKind::Notes ) + nPgPos = pPage->GetPageNum() + 1; + } + + /* In order t ensure unique page names, we test the ones we want to + insert. If necessary. we put them into and replacement list (bNameOK + == sal_False -> User canceled). */ + bool bLink = pPageObjsTransferable->GetDragType() == NAVIGATOR_DRAGTYPE_LINK; + bool bNameOK = GetExchangeList( aExchangeList, aBookmarkList, 2 ); + + /* Since we don't know the type (page or object), we fill a list with + pages and objects. + Of course we have problems if there are pages and objects with the + same name!!! */ + if( bNameOK ) + { + mrDoc.InsertBookmark( aBookmarkList, aExchangeList, + bLink, nPgPos, + &pPageObjsTransferable->GetDocShell(), + &aPos ); + } + } + + delete pSdNavigatorDropEvent; +} + +bool View::GetExchangeList (std::vector<OUString> &rExchangeList, + std::vector<OUString> &rBookmarkList, + const sal_uInt16 nType) +{ + assert(rExchangeList.empty()); + + bool bListIdentical = true; ///< Bookmark list and exchange list are identical + bool bNameOK = true; ///< name is unique + + for ( const auto& rBookmark : rBookmarkList ) + { + OUString aNewName = rBookmark; + + if( nType == 0 || nType == 2 ) + bNameOK = mpDocSh->CheckPageName(mpViewSh->GetFrameWeld(), aNewName); + + if( bNameOK && ( nType == 1 || nType == 2 ) ) + { + if( mrDoc.GetObj( aNewName ) ) + { + OUString aTitle(SdResId(STR_TITLE_NAMEGROUP)); + OUString aDesc(SdResId(STR_DESC_NAMEGROUP)); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog(mpViewSh->GetFrameWeld(), aNewName, aDesc)); + + pDlg->SetEditHelpId( HID_SD_NAMEDIALOG_OBJECT ); + + bNameOK = false; + pDlg->SetText( aTitle ); + + while( !bNameOK && pDlg->Execute() == RET_OK ) + { + pDlg->GetName( aNewName ); + + if( !mrDoc.GetObj( aNewName ) ) + bNameOK = true; + } + } + } + + bListIdentical = rBookmark == aNewName; + + rExchangeList.push_back(aNewName); + + if (!bNameOK) + break; + } + + // Exchange list is identical to bookmark list + if( !rExchangeList.empty() && bListIdentical ) + rExchangeList.clear(); + + return bNameOK; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx new file mode 100644 index 0000000000..ddd0ad28ec --- /dev/null +++ b/sd/source/ui/view/sdview3.cxx @@ -0,0 +1,1620 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <View.hxx> +#include <com/sun/star/embed/XEmbedObjectClipboardCreator.hpp> +#include <com/sun/star/embed/NoVisualAreaSizeException.hpp> +#include <com/sun/star/embed/MSOLEObjectSystemCreator.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <sot/filelist.hxx> +#include <editeng/editdata.hxx> +#include <svx/xfillit0.hxx> +#include <svx/xflclit.hxx> +#include <svx/xlnclit.hxx> +#include <svx/svdpagv.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/mieclip.hxx> +#include <svx/svdoole2.hxx> +#include <svx/svdograf.hxx> +#include <svx/svdundo.hxx> +#include <svl/itempool.hxx> +#include <sot/formats.hxx> +#include <editeng/outliner.hxx> +#include <svx/obj3d.hxx> +#include <svx/e3dundo.hxx> +#include <svx/unomodel.hxx> +#include <svx/ImageMapInfo.hxx> +#include <unotools/streamwrap.hxx> +#include <vcl/graph.hxx> +#include <vcl/metaact.hxx> +#include <vcl/pdfread.hxx> +#include <vcl/TypeSerializer.hxx> +#include <svx/svxids.hrc> +#include <toolkit/helper/vclunohelper.hxx> +#include <svtools/embedhlp.hxx> +#include <osl/diagnose.h> +#include <DrawDocShell.hxx> +#include <fupoor.hxx> +#include <tablefunction.hxx> +#include <Window.hxx> +#include <sdxfer.hxx> +#include <sdpage.hxx> +#include <drawdoc.hxx> +#include <sdmod.hxx> +#include <sdresid.hxx> +#include <strings.hrc> +#include <SlideSorterViewShell.hxx> +#include <unomodel.hxx> +#include <ViewClipboard.hxx> +#include <sfx2/ipclient.hxx> +#include <sfx2/classificationhelper.hxx> +#include <comphelper/sequenceashashmap.hxx> +#include <comphelper/storagehelper.hxx> +#include <comphelper/processfactory.hxx> +#include <svx/sdrhittesthelper.hxx> +#include <svx/xbtmpit.hxx> +#include <memory> + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::datatransfer; +using namespace ::com::sun::star::datatransfer::clipboard; + +namespace sd { + +#define CHECK_FORMAT_TRANS( _def_Type ) ( ( nFormat == (_def_Type) || nFormat == SotClipboardFormatId::NONE ) && aDataHelper.HasFormat( _def_Type ) ) + +/************************************************************************* +|* +|* Paste +|* +\************************************************************************/ + +namespace { + +struct ImpRememberOrigAndClone +{ + SdrObject* pOrig; + SdrObject* pClone; +}; + +} + +static SdrObject* ImpGetClone(std::vector<ImpRememberOrigAndClone>& aConnectorContainer, SdrObject const * pConnObj) +{ + for(const ImpRememberOrigAndClone& rImp : aConnectorContainer) + { + if(pConnObj == rImp.pOrig) + return rImp.pClone; + } + return nullptr; +} + +// restrict movement to WorkArea +static void ImpCheckInsertPos(Point& rPos, const Size& rSize, const ::tools::Rectangle& rWorkArea) +{ + if(rWorkArea.IsEmpty()) + return; + + ::tools::Rectangle aMarkRect(Point(rPos.X() - (rSize.Width() / 2), rPos.Y() - (rSize.Height() / 2)), rSize); + + if(aMarkRect.Contains(rWorkArea)) + return; + + if(aMarkRect.Left() < rWorkArea.Left()) + { + rPos.AdjustX(rWorkArea.Left() - aMarkRect.Left() ); + } + + if(aMarkRect.Right() > rWorkArea.Right()) + { + rPos.AdjustX( -(aMarkRect.Right() - rWorkArea.Right()) ); + } + + if(aMarkRect.Top() < rWorkArea.Top()) + { + rPos.AdjustY(rWorkArea.Top() - aMarkRect.Top() ); + } + + if(aMarkRect.Bottom() > rWorkArea.Bottom()) + { + rPos.AdjustY( -(aMarkRect.Bottom() - rWorkArea.Bottom()) ); + } +} + +bool View::InsertMetaFile( const TransferableDataHelper& rDataHelper, const Point& rPos, ImageMap const * pImageMap, bool bOptimize ) +{ + GDIMetaFile aMtf; + + if( !rDataHelper.GetGDIMetaFile( SotClipboardFormatId::GDIMETAFILE, aMtf ) ) + return false; + + bool bVector = false; + Graphic aGraphic; + + // check if metafile only contains a pixel image, if so insert a bitmap instead + if( bOptimize ) + { + MetaAction* pAction = aMtf.FirstAction(); + while( pAction && !bVector ) + { + switch( pAction->GetType() ) + { + case MetaActionType::POINT: + case MetaActionType::LINE: + case MetaActionType::RECT: + case MetaActionType::ROUNDRECT: + case MetaActionType::ELLIPSE: + case MetaActionType::ARC: + case MetaActionType::PIE: + case MetaActionType::CHORD: + case MetaActionType::POLYLINE: + case MetaActionType::POLYGON: + case MetaActionType::POLYPOLYGON: + case MetaActionType::TEXT: + case MetaActionType::TEXTARRAY: + case MetaActionType::STRETCHTEXT: + case MetaActionType::TEXTRECT: + case MetaActionType::GRADIENT: + case MetaActionType::HATCH: + case MetaActionType::WALLPAPER: + case MetaActionType::EPS: + case MetaActionType::TEXTLINE: + case MetaActionType::FLOATTRANSPARENT: + case MetaActionType::GRADIENTEX: + case MetaActionType::BMPSCALEPART: + case MetaActionType::BMPEXSCALEPART: + bVector = true; + break; + case MetaActionType::BMP: + case MetaActionType::BMPSCALE: + case MetaActionType::BMPEX: + case MetaActionType::BMPEXSCALE: + if( aGraphic.GetType() != GraphicType::NONE ) + { + bVector = true; + } + else switch( pAction->GetType() ) + { + case MetaActionType::BMP: + { + MetaBmpAction* pBmpAction = dynamic_cast< MetaBmpAction* >( pAction ); + if( pBmpAction ) + aGraphic = Graphic(BitmapEx(pBmpAction->GetBitmap())); + } + break; + case MetaActionType::BMPSCALE: + { + MetaBmpScaleAction* pBmpScaleAction = dynamic_cast< MetaBmpScaleAction* >( pAction ); + if( pBmpScaleAction ) + aGraphic = Graphic(BitmapEx(pBmpScaleAction->GetBitmap())); + } + break; + case MetaActionType::BMPEX: + { + MetaBmpExAction* pBmpExAction = dynamic_cast< MetaBmpExAction* >( pAction ); + if( pBmpExAction ) + aGraphic = Graphic(pBmpExAction->GetBitmapEx() ); + } + break; + case MetaActionType::BMPEXSCALE: + { + MetaBmpExScaleAction* pBmpExScaleAction = dynamic_cast< MetaBmpExScaleAction* >( pAction ); + if( pBmpExScaleAction ) + aGraphic = Graphic( pBmpExScaleAction->GetBitmapEx() ); + } + break; + default: break; + } + break; + default: break; + } + + pAction = aMtf.NextAction(); + } + } + + // it is not a vector metafile but it also has no graphic? + if( !bVector && (aGraphic.GetType() == GraphicType::NONE) ) + bVector = true; + + // restrict movement to WorkArea + Point aInsertPos( rPos ); + Size aImageSize = bVector ? aMtf.GetPrefSize() : aGraphic.GetSizePixel(); + ImpCheckInsertPos(aInsertPos, aImageSize, GetWorkArea()); + + if( bVector ) + aGraphic = Graphic( aMtf ); + + aGraphic.SetPrefMapMode( aMtf.GetPrefMapMode() ); + aGraphic.SetPrefSize( aMtf.GetPrefSize() ); + InsertGraphic( aGraphic, mnAction, aInsertPos, nullptr, pImageMap ); + + return true; +} + +bool View::InsertData( const TransferableDataHelper& rDataHelper, + const Point& rPos, sal_Int8& rDnDAction, bool bDrag, + SotClipboardFormatId nFormat, sal_uInt16 nPage, SdrLayerID nLayer ) +{ + maDropPos = rPos; + mnAction = rDnDAction; + mbIsDropAllowed = false; + + TransferableDataHelper aDataHelper( rDataHelper ); + SdrObject* pPickObj = nullptr; + SdPage* pPage = nullptr; + std::unique_ptr<ImageMap> pImageMap; + bool bReturn = false; + bool bLink = ( ( mnAction & DND_ACTION_LINK ) != 0 ); + bool bCopy = ( ( ( mnAction & DND_ACTION_COPY ) != 0 ) || bLink ); + SdrInsertFlags nPasteOptions = SdrInsertFlags::SETDEFLAYER; + + if (mpViewSh != nullptr) + { + OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr); + SfxInPlaceClient* pIpClient = mpViewSh->GetViewShell()->GetIPClient(); + if( dynamic_cast< ::sd::slidesorter::SlideSorterViewShell *>( mpViewSh ) != nullptr + || (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive())) + nPasteOptions |= SdrInsertFlags::DONTMARK; + } + + if( bDrag ) + { + SdrPageView* pPV = nullptr; + pPickObj = PickObj(rPos, getHitTolLog(), pPV); + } + + if( nPage != SDRPAGE_NOTFOUND ) + pPage = static_cast<SdPage*>( mrDoc.GetPage( nPage ) ); + + SdTransferable* pOwnData = nullptr; + SdTransferable* pImplementation = SdTransferable::getImplementation( aDataHelper.GetTransferable() ); + + if(pImplementation && (rDnDAction & DND_ACTION_LINK)) + { + // suppress own data when it's intention is to use it as fill information + pImplementation = nullptr; + } + + bool bSelfDND = false; + + // try to get own transfer data + if( pImplementation ) + { + if( SD_MOD()->pTransferClip == pImplementation ) + pOwnData = SD_MOD()->pTransferClip; + else if( SD_MOD()->pTransferDrag == pImplementation ) + { + pOwnData = SD_MOD()->pTransferDrag; + bSelfDND = true; + } + else if( SD_MOD()->pTransferSelection == pImplementation ) + pOwnData = SD_MOD()->pTransferSelection; + } + + const bool bGroupUndoFromDragWithDrop = bSelfDND && mpDragSrcMarkList && IsUndoEnabled(); + if (bGroupUndoFromDragWithDrop) + { + OUString aStr(SdResId(STR_UNDO_DRAGDROP)); + BegUndo(aStr + " " + mpDragSrcMarkList->GetMarkDescription()); + } + + // ImageMap? + if( !pOwnData && aDataHelper.HasFormat( SotClipboardFormatId::SVIM ) ) + { + ::tools::SvRef<SotTempStream> xStm; + + if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::SVIM, xStm ) ) + { + pImageMap.reset(new ImageMap); + // mba: clipboard always must contain absolute URLs (could be from alien source) + pImageMap->Read( *xStm ); + } + } + + bool bTable = false; + // check special cases for pasting table formats as RTL + if( !bLink && (nFormat == SotClipboardFormatId::NONE || (nFormat == SotClipboardFormatId::RTF) || (nFormat == SotClipboardFormatId::RICHTEXT)) ) + { + // if the object supports rtf and there is a table involved, default is to create a table + bool bIsRTF = aDataHelper.HasFormat( SotClipboardFormatId::RTF ); + if( ( bIsRTF || aDataHelper.HasFormat( SotClipboardFormatId::RICHTEXT ) ) + && ! aDataHelper.HasFormat( SotClipboardFormatId::DRAWING ) ) + { + ::tools::SvRef<SotTempStream> xStm; + + if( aDataHelper.GetSotStorageStream( bIsRTF ? SotClipboardFormatId::RTF : SotClipboardFormatId::RICHTEXT, xStm ) ) + { + xStm->Seek( 0 ); + + OStringBuffer aLine; + while (xStm->ReadLine(aLine)) + { + size_t x = std::string_view(aLine).find( "\\trowd" ); + if (x != std::string_view::npos) + { + bTable = true; + nFormat = bIsRTF ? SotClipboardFormatId::RTF : SotClipboardFormatId::RICHTEXT; + break; + } + } + } + } + } + + // Changed the whole decision tree to be dependent of bReturn as a flag that + // the work was done; this allows to check multiple formats and not just fail + // when a CHECK_FORMAT_TRANS(*format*) detected format does not work. This is + // e.g. necessary for SotClipboardFormatId::BITMAP + + if (!bReturn && pOwnData) + { + // Paste only if SfxClassificationHelper recommends so. + const SfxObjectShellRef& pSource = pOwnData->GetDocShell(); + SfxObjectShell* pDestination = mrDoc.GetDocSh(); + if (pSource.is() && pDestination) + { + SfxClassificationCheckPasteResult eResult = SfxClassificationHelper::CheckPaste(pSource->getDocProperties(), pDestination->getDocProperties()); + if (!SfxClassificationHelper::ShowPasteInfo(eResult)) + bReturn = true; + } + } + + if( !bReturn && pOwnData && nFormat == SotClipboardFormatId::NONE ) + { + const View* pSourceView = pOwnData->GetView(); + + if( pOwnData->GetDocShell().is() && pOwnData->IsPageTransferable() ) + { + mpClipboard->HandlePageDrop (*pOwnData); + bReturn = true; + } + else if( pSourceView ) + { + if( pSourceView == this ) + { + // same view + if( nLayer != SDRLAYER_NOTFOUND ) + { + // drop on layer tab bar + SdrLayerAdmin& rLayerAdmin = mrDoc.GetLayerAdmin(); + SdrLayer* pLayer = rLayerAdmin.GetLayerPerID( nLayer ); + SdrPageView* pPV = GetSdrPageView(); + OUString aLayer = pLayer->GetName(); + + if( !pPV->IsLayerLocked( aLayer ) ) + { + pOwnData->SetInternalMove( true ); + SortMarkedObjects(); + + for( size_t nM = 0; nM < GetMarkedObjectCount(); ++nM ) + { + SdrMark* pM = GetSdrMarkByIndex( nM ); + SdrObject* pO = pM->GetMarkedSdrObj(); + + if( pO ) + { + // #i11702# + if( IsUndoEnabled() ) + { + BegUndo(SdResId(STR_MODIFYLAYER)); + AddUndo(GetModel().GetSdrUndoFactory().CreateUndoObjectLayerChange(*pO, pO->GetLayer(), nLayer)); + EndUndo(); + } + + pO->SetLayer( nLayer ); + } + } + + bReturn = true; + } + } + else + { + SdrPageView* pPV = GetSdrPageView(); + bool bDropOnTabBar = true; + + if( !pPage && pPV->GetPage()->GetPageNum() != mnDragSrcPgNum ) + { + pPage = static_cast<SdPage*>( pPV->GetPage() ); + bDropOnTabBar = false; + } + + if( pPage ) + { + // drop on other page + OUString aActiveLayer = GetActiveLayer(); + + if( !pPV->IsLayerLocked( aActiveLayer ) ) + { + if( !IsPresObjSelected() ) + { + SdrMarkList* pMarkList; + + if( (mnDragSrcPgNum != SDRPAGE_NOTFOUND) && (mnDragSrcPgNum != pPV->GetPage()->GetPageNum()) ) + { + pMarkList = mpDragSrcMarkList.get(); + } + else + { + // actual mark list is used + pMarkList = new SdrMarkList( GetMarkedObjectList()); + } + + pMarkList->ForceSort(); + + // stuff to remember originals and clones + std::vector<ImpRememberOrigAndClone> aConnectorContainer; + size_t nConnectorCount = 0; + Point aCurPos; + + // calculate real position of current + // source objects, if necessary (#103207) + if( pOwnData == SD_MOD()->pTransferSelection ) + { + ::tools::Rectangle aCurBoundRect; + + if( pMarkList->TakeBoundRect( pPV, aCurBoundRect ) ) + aCurPos = aCurBoundRect.TopLeft(); + else + aCurPos = pOwnData->GetStartPos(); + } + else + aCurPos = pOwnData->GetStartPos(); + + const Size aVector( maDropPos.X() - aCurPos.X(), maDropPos.Y() - aCurPos.Y() ); + + std::unordered_set<rtl::OUString> aNameSet; + for(size_t a = 0; a < pMarkList->GetMarkCount(); ++a) + { + SdrMark* pM = pMarkList->GetMark(a); + rtl::Reference<SdrObject> pObj(pM->GetMarkedSdrObj()->CloneSdrObject(pPage->getSdrModelFromSdrPage())); + + if(pObj) + { + if(!bDropOnTabBar) + { + // do a NbcMove(...) instead of setting SnapRects here + pObj->NbcMove(aVector); + } + + SdrObject* pMarkParent = pM->GetMarkedSdrObj()->getParentSdrObjectFromSdrObject(); + if (bCopy || (pMarkParent && pMarkParent->IsGroupObject())) + pPage->InsertObjectThenMakeNameUnique(pObj.get(), aNameSet); + else + pPage->InsertObject(pObj.get()); + + if( IsUndoEnabled() ) + { + BegUndo(SdResId(STR_UNDO_DRAGDROP)); + AddUndo(GetModel().GetSdrUndoFactory().CreateUndoNewObject(*pObj)); + EndUndo(); + } + + ImpRememberOrigAndClone aRem; + aRem.pOrig = pM->GetMarkedSdrObj(); + aRem.pClone = pObj.get(); + aConnectorContainer.push_back(aRem); + + if(dynamic_cast< SdrEdgeObj *>( pObj.get() ) != nullptr) + nConnectorCount++; + } + } + + // try to re-establish connections at clones + if(nConnectorCount) + { + for(size_t a = 0; a < aConnectorContainer.size(); ++a) + { + ImpRememberOrigAndClone* pRem = &aConnectorContainer[a]; + + if(auto pCloneEdge = dynamic_cast<SdrEdgeObj *>( pRem->pClone )) + { + SdrEdgeObj* pOrigEdge = static_cast<SdrEdgeObj*>(pRem->pOrig); + + // test first connection + SdrObjConnection& rConn0 = pOrigEdge->GetConnection(false); + SdrObject* pConnObj = rConn0.GetSdrObject(); + if(pConnObj) + { + SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj); + if(pConnClone) + { + // if dest obj was cloned, too, re-establish connection + pCloneEdge->ConnectToNode(false, pConnClone); + pCloneEdge->GetConnection(false).SetConnectorId(rConn0.GetConnectorId()); + } + else + { + // set position of connection point of original connected object + const SdrGluePointList* pGlueList = pConnObj->GetGluePointList(); + if(pGlueList) + { + sal_uInt16 nInd = pGlueList->FindGluePoint(rConn0.GetConnectorId()); + + if(SDRGLUEPOINT_NOTFOUND != nInd) + { + const SdrGluePoint& rGluePoint = (*pGlueList)[nInd]; + Point aPosition = rGluePoint.GetAbsolutePos(*pConnObj); + aPosition.AdjustX(aVector.Width() ); + aPosition.AdjustY(aVector.Height() ); + pCloneEdge->SetTailPoint(false, aPosition); + } + } + } + } + + // test second connection + SdrObjConnection& rConn1 = pOrigEdge->GetConnection(true); + pConnObj = rConn1.GetSdrObject(); + if(pConnObj) + { + SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj); + if(pConnClone) + { + // if dest obj was cloned, too, re-establish connection + pCloneEdge->ConnectToNode(true, pConnClone); + pCloneEdge->GetConnection(true).SetConnectorId(rConn1.GetConnectorId()); + } + else + { + // set position of connection point of original connected object + const SdrGluePointList* pGlueList = pConnObj->GetGluePointList(); + if(pGlueList) + { + sal_uInt16 nInd = pGlueList->FindGluePoint(rConn1.GetConnectorId()); + + if(SDRGLUEPOINT_NOTFOUND != nInd) + { + const SdrGluePoint& rGluePoint = (*pGlueList)[nInd]; + Point aPosition = rGluePoint.GetAbsolutePos(*pConnObj); + aPosition.AdjustX(aVector.Width() ); + aPosition.AdjustY(aVector.Height() ); + pCloneEdge->SetTailPoint(true, aPosition); + } + } + } + } + } + } + } + + if( pMarkList != mpDragSrcMarkList.get() ) + delete pMarkList; + + bReturn = true; + } + else + { + maDropErrorIdle.Start(); + bReturn = false; + } + } + } + else + { + pOwnData->SetInternalMove( true ); + MoveAllMarked( Size( maDropPos.X() - pOwnData->GetStartPos().X(), + maDropPos.Y() - pOwnData->GetStartPos().Y() ), bCopy ); + bReturn = true; + } + } + } + else + { + // different views + if( !pSourceView->IsPresObjSelected() ) + { + // model is owned by from AllocModel() created DocShell + SdDrawDocument* pSourceDoc = static_cast<SdDrawDocument*>(&pSourceView->GetModel()); + pSourceDoc->CreatingDataObj( pOwnData ); + SdDrawDocument* pModel = static_cast<SdDrawDocument*>( pSourceView->CreateMarkedObjModel().release() ); + bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions); + + if( !pPage ) + pPage = static_cast<SdPage*>( GetSdrPageView()->GetPage() ); + + OUString aLayout = pPage->GetLayoutName(); + sal_Int32 nPos = aLayout.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aLayout = aLayout.copy(0, nPos); + pPage->SetPresentationLayout( aLayout, false, false ); + pSourceDoc->CreatingDataObj( nullptr ); + } + else + { + maDropErrorIdle.Start(); + bReturn = false; + } + } + } + else + { + SdDrawDocument* pWorkModel = const_cast<SdDrawDocument*>(pOwnData->GetWorkDocument()); + SdPage* pWorkPage = pWorkModel->GetSdPage( 0, PageKind::Standard ); + + pWorkPage->SetSdrObjListRectsDirty(); + + // #i120393# Clipboard data uses full object geometry range + const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() ); + + maDropPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) ); + maDropPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) ); + + // delete pages, that are not of any interest for us + for( ::tools::Long i = pWorkModel->GetPageCount() - 1; i >= 0; i-- ) + { + SdPage* pP = static_cast< SdPage* >( pWorkModel->GetPage( static_cast<sal_uInt16>(i) ) ); + + if( pP->GetPageKind() != PageKind::Standard ) + pWorkModel->DeletePage( static_cast<sal_uInt16>(i) ); + } + + bReturn = Paste(*pWorkModel, maDropPos, pPage, nPasteOptions); + + if( !pPage ) + pPage = static_cast<SdPage*>( GetSdrPageView()->GetPage() ); + + OUString aLayout = pPage->GetLayoutName(); + sal_Int32 nPos = aLayout.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aLayout = aLayout.copy(0, nPos); + pPage->SetPresentationLayout( aLayout, false, false ); + } + } + + if(!bReturn && CHECK_FORMAT_TRANS( SotClipboardFormatId::PDF )) + { + ::tools::SvRef<SotTempStream> xStm; + if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::PDF, xStm ) ) + { + Point aInsertPos(rPos); + Graphic aGraphic; + if (vcl::ImportPDF(*xStm, aGraphic)) + { + const sal_uInt64 nGraphicContentSize(xStm->Tell()); + xStm->Seek(0); + BinaryDataContainer aGraphicContent(*xStm, nGraphicContentSize); + aGraphic.SetGfxLink(std::make_shared<GfxLink>(aGraphicContent, GfxLinkType::NativePdf)); + + InsertGraphic(aGraphic, mnAction, aInsertPos, nullptr, nullptr); + bReturn = true; + } + } + } + + if(!bReturn && CHECK_FORMAT_TRANS( SotClipboardFormatId::DRAWING )) + { + ::tools::SvRef<SotTempStream> xStm; + + if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::DRAWING, xStm ) ) + { + DrawDocShellRef xShell = new DrawDocShell(SfxObjectCreateMode::INTERNAL, false, DocumentType::Impress); + xShell->DoInitNew(); + + SdDrawDocument* pModel = xShell->GetDoc(); + pModel->InsertPage(pModel->AllocPage(false).get()); + + Reference< XComponent > xComponent = xShell->GetModel(); + xStm->Seek( 0 ); + + css::uno::Reference< css::io::XInputStream > xInputStream( new utl::OInputStreamWrapper( *xStm ) ); + bReturn = SvxDrawingLayerImport( pModel, xInputStream, xComponent, "com.sun.star.comp.Impress.XMLOasisImporter" ); + + if( pModel->GetPageCount() == 0 ) + { + OSL_FAIL("empty or invalid drawing xml document on clipboard!" ); + } + else + { + bool bChanged = false; + + if( bReturn ) + { + if( pModel->GetSdPage( 0, PageKind::Standard )->GetObjCount() == 1 ) + { + // only one object + SdrObject* pObj = pModel->GetSdPage( 0, PageKind::Standard )->GetObj( 0 ); + SdrPageView* pPV = nullptr; + SdrObject* pPickObj2 = PickObj(rPos, getHitTolLog(), pPV); + + if( ( mnAction & DND_ACTION_MOVE ) && pPickObj2 && pObj ) + { + // replace object + SdrPage* pWorkPage = GetSdrPageView()->GetPage(); + rtl::Reference<SdrObject> pNewObj(pObj->CloneSdrObject(pWorkPage->getSdrModelFromSdrPage())); + ::tools::Rectangle aPickObjRect( pPickObj2->GetCurrentBoundRect() ); + Size aPickObjSize( aPickObjRect.GetSize() ); + Point aVec( aPickObjRect.TopLeft() ); + ::tools::Rectangle aObjRect( pNewObj->GetCurrentBoundRect() ); + Size aObjSize( aObjRect.GetSize() ); + + Fraction aScaleWidth( aPickObjSize.Width(), aObjSize.Width() ); + Fraction aScaleHeight( aPickObjSize.Height(), aObjSize.Height() ); + pNewObj->NbcResize( aObjRect.TopLeft(), aScaleWidth, aScaleHeight ); + + aVec -= aObjRect.TopLeft(); + pNewObj->NbcMove( Size( aVec.X(), aVec.Y() ) ); + + const bool bUndo = IsUndoEnabled(); + + if( bUndo ) + BegUndo(SdResId(STR_UNDO_DRAGDROP)); + pNewObj->NbcSetLayer( pPickObj->GetLayer() ); + pWorkPage->InsertObject( pNewObj.get() ); + if( bUndo ) + { + AddUndo( mrDoc.GetSdrUndoFactory().CreateUndoNewObject( *pNewObj ) ); + AddUndo( mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject( *pPickObj2 ) ); + } + pWorkPage->RemoveObject( pPickObj2->GetOrdNum() ); + + if( bUndo ) + { + EndUndo(); + } + + bChanged = true; + mnAction = DND_ACTION_COPY; + } + else if( ( mnAction & DND_ACTION_LINK ) && pPickObj && pObj && + dynamic_cast< const SdrGrafObj *>( pPickObj ) == nullptr && + dynamic_cast< const SdrOle2Obj *>( pPickObj ) == nullptr ) + { + SfxItemSet aSet( mrDoc.GetPool() ); + + // set new attributes to object + const bool bUndo = IsUndoEnabled(); + if( bUndo ) + { + BegUndo( SdResId(STR_UNDO_DRAGDROP) ); + AddUndo( mrDoc.GetSdrUndoFactory().CreateUndoAttrObject( *pPickObj ) ); + } + + aSet.Put( pObj->GetMergedItemSet() ); + + /* Do not take over corner radius. There are + gradients (rectangles) in the gallery with corner + radius of 0. We should not use that on the + object. */ + aSet.ClearItem( SDRATTR_CORNER_RADIUS ); + + const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pObj); + + if(pSdrGrafObj) + { + // If we have a graphic as source object, use its graphic + // content as fill style + aSet.Put(XFillStyleItem(drawing::FillStyle_BITMAP)); + aSet.Put(XFillBitmapItem(pSdrGrafObj->GetGraphic())); + } + + pPickObj->SetMergedItemSetAndBroadcast( aSet ); + + if( DynCastE3dObject( pPickObj ) && DynCastE3dObject( pObj ) ) + { + // handle 3D attribute in addition + SfxItemSetFixed<SID_ATTR_3D_START, SID_ATTR_3D_END> aNewSet( mrDoc.GetPool() ); + SfxItemSetFixed<SID_ATTR_3D_START, SID_ATTR_3D_END> aOldSet( mrDoc.GetPool() ); + + aOldSet.Put(pPickObj->GetMergedItemSet()); + aNewSet.Put( pObj->GetMergedItemSet() ); + + if( bUndo ) + AddUndo( + std::make_unique<E3dAttributesUndoAction>( + *static_cast< E3dObject* >(pPickObj), + aNewSet, + aOldSet)); + pPickObj->SetMergedItemSetAndBroadcast( aNewSet ); + } + + if( bUndo ) + EndUndo(); + bChanged = true; + } + } + } + + if( !bChanged ) + { + SdrPage* pWorkPage = pModel->GetSdPage( 0, PageKind::Standard ); + + pWorkPage->SetSdrObjListRectsDirty(); + + if( pOwnData ) + { + // #i120393# Clipboard data uses full object geometry range + const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() ); + + maDropPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) ); + maDropPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) ); + } + + bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions); + } + + xShell->DoClose(); + } + } + } + + if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::SBA_FIELDDATAEXCHANGE)) + { + OUString aOUString; + + if( aDataHelper.GetString( SotClipboardFormatId::SBA_FIELDDATAEXCHANGE, aOUString ) ) + { + rtl::Reference<SdrObject> pObj = CreateFieldControl( aOUString ); + + if( pObj ) + { + ::tools::Rectangle aRect( pObj->GetLogicRect() ); + Size aSize( aRect.GetSize() ); + + maDropPos.AdjustX( -( aSize.Width() >> 1 ) ); + maDropPos.AdjustY( -( aSize.Height() >> 1 ) ); + + aRect.SetPos( maDropPos ); + pObj->SetLogicRect( aRect ); + InsertObjectAtView( pObj.get(), *GetSdrPageView(), SdrInsertFlags::SETDEFLAYER ); + bReturn = true; + } + } + } + + if(!bReturn && + !bLink && + (CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBED_SOURCE) || CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBEDDED_OBJ)) && + aDataHelper.HasFormat(SotClipboardFormatId::OBJECTDESCRIPTOR)) + { + //TODO/LATER: is it possible that this format is binary?! (from old versions of SO) + uno::Reference < io::XInputStream > xStm; + TransferableObjectDescriptor aObjDesc; + + if (aDataHelper.GetTransferableObjectDescriptor(SotClipboardFormatId::OBJECTDESCRIPTOR, aObjDesc)) + { + OUString aDocShellID = SfxObjectShell::CreateShellID(mrDoc.GetDocSh()); + xStm = aDataHelper.GetInputStream(nFormat != SotClipboardFormatId::NONE ? nFormat : SotClipboardFormatId::EMBED_SOURCE, aDocShellID); + if (!xStm.is()) + xStm = aDataHelper.GetInputStream(SotClipboardFormatId::EMBEDDED_OBJ, aDocShellID); + } + + if (xStm.is()) + { + if( mrDoc.GetDocSh() && ( mrDoc.GetDocSh()->GetClassName() == aObjDesc.maClassName ) ) + { + uno::Reference < embed::XStorage > xStore( ::comphelper::OStorageHelper::GetStorageFromInputStream( xStm ) ); + ::sd::DrawDocShellRef xDocShRef( new ::sd::DrawDocShell( SfxObjectCreateMode::EMBEDDED, true, mrDoc.GetDocumentType() ) ); + + // mba: BaseURL doesn't make sense for clipboard functionality + SfxMedium *pMedium = new SfxMedium( xStore, OUString() ); + if( xDocShRef->DoLoad( pMedium ) ) + { + SdDrawDocument* pModel = xDocShRef->GetDoc(); + SdPage* pWorkPage = pModel->GetSdPage( 0, PageKind::Standard ); + + pWorkPage->SetSdrObjListRectsDirty(); + + if( pOwnData ) + { + // #i120393# Clipboard data uses full object geometry range + const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() ); + + maDropPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) ); + maDropPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) ); + } + + // delete pages, that are not of any interest for us + for( ::tools::Long i = pModel->GetPageCount() - 1; i >= 0; i-- ) + { + SdPage* pP = static_cast< SdPage* >( pModel->GetPage( static_cast<sal_uInt16>(i) ) ); + + if( pP->GetPageKind() != PageKind::Standard ) + pModel->DeletePage( static_cast<sal_uInt16>(i) ); + } + + bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions); + + if( !pPage ) + pPage = static_cast<SdPage*>(GetSdrPageView()->GetPage()); + + OUString aLayout = pPage->GetLayoutName(); + sal_Int32 nPos = aLayout.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + aLayout = aLayout.copy(0, nPos); + pPage->SetPresentationLayout( aLayout, false, false ); + } + + xDocShRef->DoClose(); + xDocShRef.clear(); + + } + else + { + OUString aName; + uno::Reference < embed::XEmbeddedObject > xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName ); + if ( xObj.is() ) + { + svt::EmbeddedObjectRef aObjRef( xObj, aObjDesc.mnViewAspect ); + + Size aSize; + if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON ) + { + if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() ) + aSize = aObjDesc.maSize; + else + { + MapMode aMapMode( MapUnit::Map100thMM ); + aSize = aObjRef.GetSize( &aMapMode ); + } + } + else + { + awt::Size aSz; + MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) ); + if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() ) + { + Size aTmp(OutputDevice::LogicToLogic(aObjDesc.maSize, MapMode(MapUnit::Map100thMM), MapMode(aMapUnit))); + aSz.Width = aTmp.Width(); + aSz.Height = aTmp.Height(); + xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz ); + } + + try + { + aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect ); + } + catch( embed::NoVisualAreaSizeException& ) + { + // if the size still was not set the default size will be set later + } + + aSize = Size( aSz.Width, aSz.Height ); + + if( !aSize.Width() || !aSize.Height() ) + { + aSize.setWidth( 14100 ); + aSize.setHeight( 10000 ); + aSize = OutputDevice::LogicToLogic(Size(14100, 10000), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)); + aSz.Width = aSize.Width(); + aSz.Height = aSize.Height(); + xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz ); + } + + aSize = OutputDevice::LogicToLogic(aSize, MapMode(aMapUnit), MapMode(MapUnit::Map100thMM)); + } + + Size aMaxSize( mrDoc.GetMaxObjSize() ); + + maDropPos.AdjustX( -(std::min( aSize.Width(), aMaxSize.Width() ) >> 1) ); + maDropPos.AdjustY( -(std::min( aSize.Height(), aMaxSize.Height() ) >> 1) ); + + ::tools::Rectangle aRect( maDropPos, aSize ); + rtl::Reference<SdrOle2Obj> pObj = new SdrOle2Obj( + getSdrModelFromSdrView(), + aObjRef, + aName, + aRect); + SdrPageView* pPV = GetSdrPageView(); + SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER; + + if (mpViewSh!=nullptr) + { + OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr); + SfxInPlaceClient* pIpClient + = mpViewSh->GetViewShell()->GetIPClient(); + if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive()) + nOptions |= SdrInsertFlags::DONTMARK; + } + + // bInserted of false means that pObj has been deleted + bool bInserted = InsertObjectAtView( pObj.get(), *pPV, nOptions ); + + if (bInserted && pImageMap) + pObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new SvxIMapInfo( *pImageMap )) ); + + if (bInserted && pObj->IsChart()) + { + bool bDisableDataTableDialog = false; + svt::EmbeddedObjectRef::TryRunningState( xObj ); + uno::Reference< beans::XPropertySet > xProps( xObj->getComponent(), uno::UNO_QUERY ); + if ( xProps.is() && + ( xProps->getPropertyValue( "DisableDataTableDialog" ) >>= bDisableDataTableDialog ) && + bDisableDataTableDialog ) + { + xProps->setPropertyValue( "DisableDataTableDialog" , uno::Any( false ) ); + xProps->setPropertyValue( "DisableComplexChartTypes" , uno::Any( false ) ); + uno::Reference< util::XModifiable > xModifiable( xProps, uno::UNO_QUERY ); + if ( xModifiable.is() ) + { + xModifiable->setModified( true ); + } + } + } + + bReturn = true; + } + } + } + } + + if(!bReturn && + !bLink && + (CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBEDDED_OBJ_OLE) || CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBED_SOURCE_OLE)) && + aDataHelper.HasFormat(SotClipboardFormatId::OBJECTDESCRIPTOR_OLE)) + { + // online insert ole if format is forced or no gdi metafile is available + if( (nFormat != SotClipboardFormatId::NONE) || !aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) ) + { + uno::Reference < io::XInputStream > xStm; + TransferableObjectDescriptor aObjDesc; + + if ( aDataHelper.GetTransferableObjectDescriptor( SotClipboardFormatId::OBJECTDESCRIPTOR_OLE, aObjDesc ) ) + { + uno::Reference < embed::XEmbeddedObject > xObj; + OUString aName; + + xStm = aDataHelper.GetInputStream(nFormat != SotClipboardFormatId::NONE ? nFormat : SotClipboardFormatId::EMBED_SOURCE_OLE, OUString()); + if (!xStm.is()) + xStm = aDataHelper.GetInputStream(SotClipboardFormatId::EMBEDDED_OBJ_OLE, OUString()); + + if (xStm.is()) + { + xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName ); + } + else + { + try + { + uno::Reference< embed::XStorage > xTmpStor = ::comphelper::OStorageHelper::GetTemporaryStorage(); + uno::Reference < embed::XEmbedObjectClipboardCreator > xClipboardCreator = + embed::MSOLEObjectSystemCreator::create( ::comphelper::getProcessComponentContext() ); + + embed::InsertedObjectInfo aInfo = xClipboardCreator->createInstanceInitFromClipboard( + xTmpStor, + "DummyName" , + uno::Sequence< beans::PropertyValue >() ); + + // TODO/LATER: in future InsertedObjectInfo will be used to get container related information + // for example whether the object should be an iconified one + xObj = aInfo.Object; + if ( xObj.is() ) + mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName ); + } + catch( uno::Exception& ) + {} + } + + if ( xObj.is() ) + { + svt::EmbeddedObjectRef aObjRef( xObj, aObjDesc.mnViewAspect ); + + // try to get the replacement image from the clipboard + Graphic aGraphic; + SotClipboardFormatId nGrFormat = SotClipboardFormatId::NONE; + +// (for Selection Manager in Trusted Solaris) +#ifndef __sun + if( aDataHelper.GetGraphic( SotClipboardFormatId::SVXB, aGraphic ) ) + nGrFormat = SotClipboardFormatId::SVXB; + else if( aDataHelper.GetGraphic( SotClipboardFormatId::GDIMETAFILE, aGraphic ) ) + nGrFormat = SotClipboardFormatId::GDIMETAFILE; + else if( aDataHelper.GetGraphic( SotClipboardFormatId::BITMAP, aGraphic ) ) + nGrFormat = SotClipboardFormatId::BITMAP; +#endif + + // insert replacement image ( if there is one ) into the object helper + if ( nGrFormat != SotClipboardFormatId::NONE ) + { + datatransfer::DataFlavor aDataFlavor; + SotExchange::GetFormatDataFlavor( nGrFormat, aDataFlavor ); + aObjRef.SetGraphic( aGraphic, aDataFlavor.MimeType ); + } + + Size aSize; + if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON ) + { + if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() ) + aSize = aObjDesc.maSize; + else + { + MapMode aMapMode( MapUnit::Map100thMM ); + aSize = aObjRef.GetSize( &aMapMode ); + } + } + else + { + MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) ); + + awt::Size aSz; + try{ + aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect ); + } + catch( embed::NoVisualAreaSizeException& ) + { + // the default size will be set later + } + + if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() ) + { + Size aTmp(OutputDevice::LogicToLogic(aObjDesc.maSize, MapMode(MapUnit::Map100thMM), MapMode(aMapUnit))); + if ( aSz.Width != aTmp.Width() || aSz.Height != aTmp.Height() ) + { + aSz.Width = aTmp.Width(); + aSz.Height = aTmp.Height(); + xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz ); + } + } + + aSize = Size( aSz.Width, aSz.Height ); + + if( !aSize.Width() || !aSize.Height() ) + { + aSize = OutputDevice::LogicToLogic(Size(14100, 10000), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)); + aSz.Width = aSize.Width(); + aSz.Height = aSize.Height(); + xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz ); + } + + aSize = OutputDevice::LogicToLogic(aSize, MapMode(aMapUnit), MapMode(MapUnit::Map100thMM)); + } + + Size aMaxSize( mrDoc.GetMaxObjSize() ); + + maDropPos.AdjustX( -(std::min( aSize.Width(), aMaxSize.Width() ) >> 1) ); + maDropPos.AdjustY( -(std::min( aSize.Height(), aMaxSize.Height() ) >> 1) ); + + ::tools::Rectangle aRect( maDropPos, aSize ); + rtl::Reference<SdrOle2Obj> pObj = new SdrOle2Obj( + getSdrModelFromSdrView(), + aObjRef, + aName, + aRect); + SdrPageView* pPV = GetSdrPageView(); + SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER; + + if (mpViewSh!=nullptr) + { + OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr); + SfxInPlaceClient* pIpClient + = mpViewSh->GetViewShell()->GetIPClient(); + if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive()) + nOptions |= SdrInsertFlags::DONTMARK; + } + + bReturn = InsertObjectAtView( pObj.get(), *pPV, nOptions ); + + if (bReturn) + { + if( pImageMap ) + pObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new SvxIMapInfo( *pImageMap )) ); + + // let the object stay in loaded state after insertion + pObj->Unload(); + } + } + } + } + + if( !bReturn && aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) ) + { + // if no object was inserted, insert a picture + InsertMetaFile( aDataHelper, rPos, pImageMap.get(), true ); + bReturn = true; + } + } + + if(!bReturn && (!bLink || pPickObj) && CHECK_FORMAT_TRANS(SotClipboardFormatId::SVXB)) + { + ::tools::SvRef<SotTempStream> xStm; + + if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::SVXB, xStm ) ) + { + Point aInsertPos( rPos ); + Graphic aGraphic; + + TypeSerializer aSerializer(*xStm); + aSerializer.readGraphic(aGraphic); + + if( pOwnData && pOwnData->GetWorkDocument() ) + { + const SdDrawDocument* pWorkModel = pOwnData->GetWorkDocument(); + SdrPage* pWorkPage = const_cast<SdrPage*>( ( pWorkModel->GetPageCount() > 1 ) ? + pWorkModel->GetSdPage( 0, PageKind::Standard ) : + pWorkModel->GetPage( 0 ) ); + + pWorkPage->SetSdrObjListRectsDirty(); + + // #i120393# Clipboard data uses full object geometry range + const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() ); + + aInsertPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) ); + aInsertPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) ); + } + + // restrict movement to WorkArea + Size aImageMapSize = OutputDevice::LogicToLogic(aGraphic.GetPrefSize(), + aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)); + + ImpCheckInsertPos(aInsertPos, aImageMapSize, GetWorkArea()); + + InsertGraphic( aGraphic, mnAction, aInsertPos, nullptr, pImageMap.get() ); + bReturn = true; + } + } + + if(!bReturn && (!bLink || pPickObj) && CHECK_FORMAT_TRANS(SotClipboardFormatId::GDIMETAFILE)) + { + Point aInsertPos( rPos ); + + if( pOwnData && pOwnData->GetWorkDocument() ) + + { + const SdDrawDocument* pWorkModel = pOwnData->GetWorkDocument(); + SdrPage* pWorkPage = const_cast<SdrPage*>( ( pWorkModel->GetPageCount() > 1 ) ? + pWorkModel->GetSdPage( 0, PageKind::Standard ) : + pWorkModel->GetPage( 0 ) ); + + pWorkPage->SetSdrObjListRectsDirty(); + + // #i120393# Clipboard data uses full object geometry range + const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() ); + + aInsertPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) ); + aInsertPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) ); + } + + bReturn = InsertMetaFile( aDataHelper, aInsertPos, pImageMap.get(), nFormat == SotClipboardFormatId::NONE ); + } + + if(!bReturn && (!bLink || pPickObj) && CHECK_FORMAT_TRANS(SotClipboardFormatId::BITMAP)) + { + BitmapEx aBmpEx; + + // get basic Bitmap data + aDataHelper.GetBitmapEx(SotClipboardFormatId::BITMAP, aBmpEx); + + if(aBmpEx.IsEmpty()) + { + // if this did not work, try to get graphic formats and convert these to bitmap + Graphic aGraphic; + + if(aDataHelper.GetGraphic(SotClipboardFormatId::GDIMETAFILE, aGraphic)) + { + aBmpEx = aGraphic.GetBitmapEx(); + } + else if(aDataHelper.GetGraphic(SotClipboardFormatId::SVXB, aGraphic)) + { + aBmpEx = aGraphic.GetBitmapEx(); + } + else if(aDataHelper.GetGraphic(SotClipboardFormatId::BITMAP, aGraphic)) + { + aBmpEx = aGraphic.GetBitmapEx(); + } + } + + if(!aBmpEx.IsEmpty()) + { + Point aInsertPos( rPos ); + + if( pOwnData && pOwnData->GetWorkDocument() ) + { + const SdDrawDocument* pWorkModel = pOwnData->GetWorkDocument(); + SdrPage* pWorkPage = const_cast<SdrPage*>( ( pWorkModel->GetPageCount() > 1 ) ? + pWorkModel->GetSdPage( 0, PageKind::Standard ) : + pWorkModel->GetPage( 0 ) ); + + pWorkPage->SetSdrObjListRectsDirty(); + + // #i120393# Clipboard data uses full object geometry range + const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() ); + + aInsertPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) ); + aInsertPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) ); + } + + // restrict movement to WorkArea + Size aImageMapSize(aBmpEx.GetPrefSize()); + ImpCheckInsertPos(aInsertPos, aImageMapSize, GetWorkArea()); + + InsertGraphic( aBmpEx, mnAction, aInsertPos, nullptr, pImageMap.get() ); + bReturn = true; + } + } + + if(!bReturn && pPickObj && CHECK_FORMAT_TRANS( SotClipboardFormatId::XFA ) ) + { + uno::Any const data(aDataHelper.GetAny(SotClipboardFormatId::XFA, "")); + uno::Sequence<beans::NamedValue> props; + if (data >>= props) + { + if( IsUndoEnabled() ) + { + BegUndo( SdResId(STR_UNDO_DRAGDROP) ); + AddUndo(GetModel().GetSdrUndoFactory().CreateUndoAttrObject(*pPickObj)); + EndUndo(); + } + + ::comphelper::SequenceAsHashMap const map(props); + drawing::FillStyle eFill(drawing::FillStyle_BITMAP); // default to something that's ignored + Color aColor(COL_BLACK); + auto it = map.find("FillStyle"); + if (it != map.end()) + { + XFillStyleItem style; + style.PutValue(it->second, 0); + eFill = style.GetValue(); + } + it = map.find("FillColor"); + if (it != map.end()) + { + XFillColorItem color; + color.PutValue(it->second, 0); + aColor = color.GetColorValue(); + } + + if( eFill == drawing::FillStyle_SOLID || eFill == drawing::FillStyle_NONE ) + { + SfxItemSet aSet( mrDoc.GetPool() ); + bool bClosed = pPickObj->IsClosedObj(); + ::sd::Window* pWin = mpViewSh->GetActiveWindow(); + double fHitLog = pWin->PixelToLogic(Size(FuPoor::HITPIX, 0 ) ).Width(); + const ::tools::Long n2HitLog = fHitLog * 2; + Point aHitPosR( rPos ); + Point aHitPosL( rPos ); + Point aHitPosT( rPos ); + Point aHitPosB( rPos ); + const SdrLayerIDSet* pVisiLayer = &GetSdrPageView()->GetVisibleLayers(); + + aHitPosR.AdjustX(n2HitLog ); + aHitPosL.AdjustX( -n2HitLog ); + aHitPosT.AdjustY(n2HitLog ); + aHitPosB.AdjustY( -n2HitLog ); + + if( bClosed && + SdrObjectPrimitiveHit(*pPickObj, aHitPosR, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) && + SdrObjectPrimitiveHit(*pPickObj, aHitPosL, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) && + SdrObjectPrimitiveHit(*pPickObj, aHitPosT, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) && + SdrObjectPrimitiveHit(*pPickObj, aHitPosB, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) ) + { + // area fill + if(eFill == drawing::FillStyle_SOLID ) + aSet.Put(XFillColorItem("", aColor)); + + aSet.Put( XFillStyleItem( eFill ) ); + } + else + aSet.Put( XLineColorItem( "", aColor ) ); + + // add text color + pPickObj->SetMergedItemSetAndBroadcast( aSet ); + } + bReturn = true; + } + } + + if(!bReturn && !bLink && CHECK_FORMAT_TRANS(SotClipboardFormatId::HTML)) + { + ::tools::SvRef<SotTempStream> xStm; + + if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::HTML, xStm ) ) + { + xStm->Seek( 0 ); + // mba: clipboard always must contain absolute URLs (could be from alien source) + bReturn = SdrView::Paste( *xStm, EETextFormat::Html, maDropPos, pPage, nPasteOptions ); + } + } + + if(!bReturn && !bLink && CHECK_FORMAT_TRANS(SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT)) + { + ::tools::SvRef<SotTempStream> xStm; + if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT, xStm ) ) + { + OutlinerView* pOLV = GetTextEditOutlinerView(); + + xStm->Seek( 0 ); + + if( pOLV ) + { + ::tools::Rectangle aRect( pOLV->GetOutputArea() ); + Point aPos( pOLV->GetWindow()->PixelToLogic( maDropPos ) ); + + if( aRect.Contains( aPos ) || ( !bDrag && IsTextEdit() ) ) + { + // mba: clipboard always must contain absolute URLs (could be from alien source) + pOLV->Read( *xStm, EETextFormat::Xml, mpDocSh->GetHeaderAttributes() ); + bReturn = true; + } + } + + if( !bReturn ) + // mba: clipboard always must contain absolute URLs (could be from alien source) + bReturn = SdrView::Paste( *xStm, EETextFormat::Xml, maDropPos, pPage, nPasteOptions ); + } + } + + if(!bReturn && !bLink) + { + bool bIsRTF = CHECK_FORMAT_TRANS(SotClipboardFormatId::RTF); + if (bIsRTF || CHECK_FORMAT_TRANS(SotClipboardFormatId::RICHTEXT)) + { + ::tools::SvRef<SotTempStream> xStm; + + if( aDataHelper.GetSotStorageStream( bIsRTF ? SotClipboardFormatId::RTF : SotClipboardFormatId::RICHTEXT, xStm ) ) + { + xStm->Seek( 0 ); + + if( bTable ) + { + bReturn = PasteRTFTable( xStm, pPage, nPasteOptions ); + } + else + { + OutlinerView* pOLV = GetTextEditOutlinerView(); + + if( pOLV ) + { + ::tools::Rectangle aRect( pOLV->GetOutputArea() ); + Point aPos( pOLV->GetWindow()->PixelToLogic( maDropPos ) ); + + if( aRect.Contains( aPos ) || ( !bDrag && IsTextEdit() ) ) + { + // mba: clipboard always must contain absolute URLs (could be from alien source) + pOLV->Read( *xStm, EETextFormat::Rtf, mpDocSh->GetHeaderAttributes() ); + bReturn = true; + } + } + + if( !bReturn ) + // mba: clipboard always must contain absolute URLs (could be from alien source) + bReturn = SdrView::Paste( *xStm, EETextFormat::Rtf, maDropPos, pPage, nPasteOptions ); + } + } + } + + bool bIsHtmlSimple = CHECK_FORMAT_TRANS(SotClipboardFormatId::HTML_SIMPLE); + if (bIsHtmlSimple) + { + ::tools::SvRef<SotTempStream> xStm; + + if (aDataHelper.GetSotStorageStream(SotClipboardFormatId::HTML_SIMPLE, xStm)) + { + xStm->Seek(0); + + OutlinerView* pOLV = GetTextEditOutlinerView(); + MSE40HTMLClipFormatObj aMSE40HTMLClipFormatObj; + SvStream* pHtmlStream = aMSE40HTMLClipFormatObj.IsValid(*xStm); + + if (pOLV) + { + ::tools::Rectangle aRect(pOLV->GetOutputArea()); + Point aPos(pOLV->GetWindow()->PixelToLogic(maDropPos)); + + if (aRect.Contains(aPos) || (!bDrag && IsTextEdit())) + { + // mba: clipboard always must contain absolute URLs (could be from alien source) + pOLV->Read(*pHtmlStream, EETextFormat::Html, mpDocSh->GetHeaderAttributes()); + bReturn = true; + } + } + + if (!bReturn) + // mba: clipboard always must contain absolute URLs (could be from alien source) + bReturn = SdrView::Paste(*pHtmlStream, EETextFormat::Html, maDropPos, pPage, nPasteOptions); + } + } + } + + if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::FILE_LIST)) + { + FileList aDropFileList; + + if( aDataHelper.GetFileList( SotClipboardFormatId::FILE_LIST, aDropFileList ) ) + { + maDropFileVector.clear(); + + for( sal_uLong i = 0, nCount = aDropFileList.Count(); i < nCount; i++ ) + maDropFileVector.push_back( aDropFileList.GetFile( i ) ); + + maDropInsertFileIdle.Start(); + } + + bReturn = true; + } + + if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::SIMPLE_FILE)) + { + OUString aDropFile; + + if( aDataHelper.GetString( SotClipboardFormatId::SIMPLE_FILE, aDropFile ) ) + { + maDropFileVector.clear(); + maDropFileVector.push_back( aDropFile ); + maDropInsertFileIdle.Start(); + } + + bReturn = true; + } + + if(!bReturn && !bLink && CHECK_FORMAT_TRANS(SotClipboardFormatId::STRING)) + { + if( ( SotClipboardFormatId::STRING == nFormat ) || + ( !aDataHelper.HasFormat( SotClipboardFormatId::SOLK ) && + !aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) && + !aDataHelper.HasFormat( SotClipboardFormatId::FILENAME ) ) ) + { + OUString aOUString; + + if( aDataHelper.GetString( SotClipboardFormatId::STRING, aOUString ) ) + { + OutlinerView* pOLV = GetTextEditOutlinerView(); + + if( pOLV ) + { + pOLV->InsertText( aOUString ); + bReturn = true; + } + + if( !bReturn ) + bReturn = SdrView::Paste( aOUString, maDropPos, pPage, nPasteOptions ); + } + } + } + + MarkListHasChanged(); + mbIsDropAllowed = true; + rDnDAction = mnAction; + + if (bGroupUndoFromDragWithDrop) + { + // this is called eventually by the underlying toolkit anyway in the case of a self-dnd + // but we call it early in this case to group its undo actions into this open dnd undo group + // and rely on that repeated calls to View::DragFinished are safe to do + DragFinished(mnAction); + EndUndo(); + } + + return bReturn; +} + +bool View::PasteRTFTable( const ::tools::SvRef<SotTempStream>& xStm, SdrPage* pPage, SdrInsertFlags nPasteOptions ) +{ + DrawDocShellRef xShell = new DrawDocShell(SfxObjectCreateMode::INTERNAL, false, DocumentType::Impress); + xShell->DoInitNew(); + + SdDrawDocument* pModel = xShell->GetDoc(); + pModel->GetItemPool().SetDefaultMetric(MapUnit::Map100thMM); + pModel->InsertPage(pModel->AllocPage(false).get()); + + CreateTableFromRTF(*xStm, pModel); + bool bRet = Paste(*pModel, maDropPos, pPage, nPasteOptions); + + xShell->DoClose(); + + return bRet; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdview4.cxx b/sd/source/ui/view/sdview4.cxx new file mode 100644 index 0000000000..f46c876dac --- /dev/null +++ b/sd/source/ui/view/sdview4.cxx @@ -0,0 +1,641 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <config_features.h> + +#include <View.hxx> + +#include <comphelper/propertyvalue.hxx> +#include <osl/file.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/request.hxx> +#include <sfx2/docfilt.hxx> +#include <sfx2/fcontnr.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/sfxsids.hrc> +#include <vcl/outdev.hxx> +#include <vcl/pdfread.hxx> +#include <vcl/svapp.hxx> +#include <vcl/weld.hxx> +#include <svx/svdpagv.hxx> +#include <svx/xbtmpit.hxx> +#include <svx/svdundo.hxx> +#include <svx/xfillit0.hxx> +#include <svx/svdograf.hxx> +#include <svx/svdomedia.hxx> +#include <svx/svdoole2.hxx> +#include <svx/ImageMapInfo.hxx> +#include <sfx2/app.hxx> +#include <avmedia/mediawindow.hxx> +#include <svtools/ehdl.hxx> +#include <svtools/sfxecode.hxx> +#include <svtools/embedhlp.hxx> +#include <vcl/graphicfilter.hxx> +#include <app.hrc> +#include <Window.hxx> +#include <DrawDocShell.hxx> +#include <DrawViewShell.hxx> +#include <fuinsfil.hxx> +#include <drawdoc.hxx> +#include <sdresid.hxx> +#include <strings.hrc> +#include <sdpage.hxx> +#include <view/SlideSorterView.hxx> +#include <com/sun/star/embed/XEmbedPersist.hpp> +#include <com/sun/star/embed/Aspects.hpp> +#include <com/sun/star/embed/NoVisualAreaSizeException.hpp> +#include <com/sun/star/embed/XEmbeddedObject.hpp> +#include <com/sun/star/media/XPlayer.hpp> +#include <svtools/soerr.hxx> +#include <sfx2/ipclient.hxx> +#include <tools/debug.hxx> + +using namespace com::sun::star; + +namespace sd { + +/** + * If an empty graphic object is provided, we fill it. Otherwise we fill an + * existing object at the specified position. If there is no object at the + * position, we create a new object and return a pointer to it. + */ +SdrGrafObj* View::InsertGraphic( const Graphic& rGraphic, sal_Int8& rAction, + const Point& rPos, SdrObject* pObj, ImageMap const * pImageMap ) +{ + SdrEndTextEdit(); + mnAction = rAction; + + // Is there an object at the position rPos? + rtl::Reference<SdrGrafObj> pNewGrafObj; + SdrPageView* pPV = GetSdrPageView(); + SdrObject* pPickObj = pObj; + const bool bOnMaster = pPV && pPV->GetPage() && pPV->GetPage()->IsMasterPage(); + + if(pPV && dynamic_cast< const ::sd::slidesorter::view::SlideSorterView* >(this) != nullptr) + { + if(!pPV->GetPageRect().Contains(rPos)) + pPV = nullptr; + } + + if( !pPickObj && pPV ) + { + SdrPageView* pPageView = pPV; + pPickObj = PickObj(rPos, getHitTolLog(), pPageView); + } + + const bool bIsGraphic(dynamic_cast< const SdrGrafObj* >(pPickObj) != nullptr); + + if (DND_ACTION_LINK == mnAction + && pPickObj + && pPV + && (bIsGraphic || (pPickObj->IsEmptyPresObj() && !bOnMaster))) // #121603# Do not use pObj, it may be NULL + { + // hit on SdrGrafObj with wanted new linked graphic (or PresObj placeholder hit) + if( IsUndoEnabled() ) + BegUndo(SdResId(STR_INSERTGRAPHIC)); + + SdPage* pPage = static_cast<SdPage*>( pPickObj->getSdrPageFromSdrObject() ); + + if( bIsGraphic ) + { + // We fill the object with the Bitmap + pNewGrafObj = SdrObject::Clone(static_cast<SdrGrafObj&>(*pPickObj), pPickObj->getSdrModelFromSdrObject()); + pNewGrafObj->SetGraphic(rGraphic); + } + else + { + pNewGrafObj = new SdrGrafObj( + getSdrModelFromSdrView(), + rGraphic, + pPickObj->GetLogicRect()); + pNewGrafObj->SetEmptyPresObj(true); + } + + if ( pNewGrafObj->IsEmptyPresObj() ) + { + ::tools::Rectangle aRect( pNewGrafObj->GetLogicRect() ); + pNewGrafObj->AdjustToMaxRect( aRect ); + pNewGrafObj->SetOutlinerParaObject(std::nullopt); + pNewGrafObj->SetEmptyPresObj(false); + } + + if (pPage && pPage->IsPresObj(pPickObj)) + { + // Insert new PresObj into the list + pPage->InsertPresObj( pNewGrafObj.get(), PresObjKind::Graphic ); + pNewGrafObj->SetUserCall(pPickObj->GetUserCall()); + } + + if (pImageMap) + pNewGrafObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(*pImageMap))); + + ReplaceObjectAtView(pPickObj, *pPV, pNewGrafObj.get()); // maybe ReplaceObjectAtView + + if( IsUndoEnabled() ) + EndUndo(); + } + else if (DND_ACTION_LINK == mnAction + && pPickObj + && !bIsGraphic + && pPickObj->IsClosedObj() + && !dynamic_cast< const SdrOle2Obj* >(pPickObj)) + { + // fill style change (fill object with graphic), independent of mnAction + // and thus of DND_ACTION_LINK or DND_ACTION_MOVE + if( IsUndoEnabled() ) + { + BegUndo(SdResId(STR_UNDO_DRAGDROP)); + AddUndo(GetModel().GetSdrUndoFactory().CreateUndoAttrObject(*pPickObj)); + EndUndo(); + } + + SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLBITMAP> aSet(mpDocSh->GetPool()); + + aSet.Put(XFillStyleItem(drawing::FillStyle_BITMAP)); + aSet.Put(XFillBitmapItem(rGraphic)); + pPickObj->SetMergedItemSetAndBroadcast(aSet); + } + + else if ( pPV ) + { + Size aSizePixel = rGraphic.GetSizePixel(); + + // create new object + Size aSize; + + if ( rGraphic.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel ) + { + ::OutputDevice* pOutDev = nullptr; + if( mpViewSh ) + pOutDev = mpViewSh->GetActiveWindow()->GetOutDev(); + + if( !pOutDev ) + pOutDev = Application::GetDefaultDevice(); + + if( pOutDev ) + aSize = pOutDev->PixelToLogic(rGraphic.GetPrefSize(), MapMode(MapUnit::Map100thMM)); + } + else + { + aSize = OutputDevice::LogicToLogic( rGraphic.GetPrefSize(), + rGraphic.GetPrefMapMode(), + MapMode( MapUnit::Map100thMM ) ); + } + + sal_Int32 nPreferredDPI = mrDoc.getImagePreferredDPI(); + + if (rGraphic.GetGfxLink().GetType() == GfxLinkType::NativePdf && nPreferredDPI == 0 && vcl::PDF_INSERT_MAGIC_SCALE_FACTOR > 1) + nPreferredDPI = Application::GetDefaultDevice()->GetDPIX() * vcl::PDF_INSERT_MAGIC_SCALE_FACTOR; + + if (nPreferredDPI > 0) + { + auto nWidth = o3tl::convert(aSizePixel.Width() / double(nPreferredDPI), o3tl::Length::in, o3tl::Length::mm100); + auto nHeight = o3tl::convert(aSizePixel.Height() / double(nPreferredDPI), o3tl::Length::in, o3tl::Length::mm100); + if (nWidth > 0 && nHeight > 0) + aSize = Size(nWidth, nHeight); + } + + pNewGrafObj = new SdrGrafObj(getSdrModelFromSdrView(), rGraphic, ::tools::Rectangle(rPos, aSize)); + + if (nPreferredDPI > 0) + { + // move to the center of insertion point + pNewGrafObj->NbcMove(Size(-aSize.Width() / 2, -aSize.Height() / 2)); + } + else + { + SdrPage* pPage = pPV->GetPage(); + Size aPageSize( pPage->GetSize() ); + aPageSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) ); + aPageSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) ); + pNewGrafObj->AdjustToMaxRect( ::tools::Rectangle( Point(), aPageSize ), true ); + } + + SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER; + bool bIsPresTarget = false; + + if ((mpViewSh + && mpViewSh->GetViewShell()!=nullptr + && mpViewSh->GetViewShell()->GetIPClient() + && mpViewSh->GetViewShell()->GetIPClient()->IsObjectInPlaceActive()) + || dynamic_cast<const ::sd::slidesorter::view::SlideSorterView* >(this)) + nOptions |= SdrInsertFlags::DONTMARK; + + if( ( mnAction & DND_ACTION_MOVE ) && pPickObj && (pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall()) ) + { + SdPage* pP = static_cast< SdPage* >( pPickObj->getSdrPageFromSdrObject() ); + + if ( pP && pP->IsMasterPage() ) + bIsPresTarget = pP->IsPresObj(pPickObj); + } + + if( ( mnAction & DND_ACTION_MOVE ) && pPickObj && !bIsPresTarget ) + { + // replace object + if (pImageMap) + pNewGrafObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(*pImageMap))); + + ::tools::Rectangle aPickObjRect(pPickObj->GetCurrentBoundRect()); + Size aPickObjSize(aPickObjRect.GetSize()); + ::tools::Rectangle aObjRect(pNewGrafObj->GetCurrentBoundRect()); + Size aObjSize(aObjRect.GetSize()); + + Fraction aScaleWidth(aPickObjSize.Width(), aObjSize.Width()); + Fraction aScaleHeight(aPickObjSize.Height(), aObjSize.Height()); + pNewGrafObj->NbcResize(aObjRect.TopLeft(), aScaleWidth, aScaleHeight); + + Point aVec = aPickObjRect.TopLeft() - aObjRect.TopLeft(); + pNewGrafObj->NbcMove(Size(aVec.X(), aVec.Y())); + + const bool bUndo = IsUndoEnabled(); + + if( bUndo ) + BegUndo(SdResId(STR_UNDO_DRAGDROP)); + pNewGrafObj->NbcSetLayer(pPickObj->GetLayer()); + SdrPage* pP = pPV->GetPage(); + pP->InsertObject(pNewGrafObj.get()); + if( bUndo ) + { + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoNewObject(*pNewGrafObj)); + AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject(*pPickObj)); + } + pP->RemoveObject(pPickObj->GetOrdNum()); + + if( bUndo ) + { + EndUndo(); + } + mnAction = DND_ACTION_COPY; + } + else + { + bool bSuccess = InsertObjectAtView(pNewGrafObj.get(), *pPV, nOptions); + if (!bSuccess) + pNewGrafObj = nullptr; + else if (pImageMap) + pNewGrafObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(*pImageMap))); + } + } + + rAction = mnAction; + + return pNewGrafObj.get(); +} + +void View::InsertMediaURL( const OUString& rMediaURL, sal_Int8& rAction, + const Point& rPos, const Size& rSize, + bool const bLink ) +{ + OUString realURL; + if (bLink) + { + realURL = rMediaURL; + } + else + { + uno::Reference<frame::XModel> const xModel( + GetDoc().GetObjectShell()->GetModel()); +#if HAVE_FEATURE_AVMEDIA + bool const bRet = ::avmedia::EmbedMedia(xModel, rMediaURL, realURL); + if (!bRet) { return; } +#else + return; +#endif + } + + InsertMediaObj(realURL, rAction, rPos, rSize); +} + +SdrMediaObj* View::InsertMediaObj( const OUString& rMediaURL, sal_Int8& rAction, + const Point& rPos, const Size& rSize ) +{ + SdrEndTextEdit(); + mnAction = rAction; + + rtl::Reference<SdrMediaObj> pNewMediaObj; + SdrPageView* pPV = GetSdrPageView(); + SdrObject* pPickObj = GetEmptyPresentationObject( PresObjKind::Media ); + + if(pPV && dynamic_cast<const ::sd::slidesorter::view::SlideSorterView* >(this) ) + { + if(!pPV->GetPageRect().Contains(rPos)) + pPV = nullptr; + } + + if( mnAction == DND_ACTION_LINK && pPV && dynamic_cast< SdrMediaObj *>( pPickObj ) ) + { + pNewMediaObj = SdrObject::Clone(static_cast<SdrMediaObj&>(*pPickObj), pPickObj->getSdrModelFromSdrObject()); + pNewMediaObj->setURL(rMediaURL, ""/*TODO?*/); + + BegUndo(SdResId(STR_UNDO_DRAGDROP)); + ReplaceObjectAtView(pPickObj, *pPV, pNewMediaObj.get()); + EndUndo(); + } + else if( pPV ) + { + ::tools::Rectangle aRect( rPos, rSize ); + SdrObjUserCall* pUserCall = nullptr; + if( pPickObj ) + { + aRect = pPickObj->GetLogicRect(); + pUserCall = pPickObj->GetUserCall(); // ReplaceObjectAtView can free pPickObj + } + + pNewMediaObj = new SdrMediaObj( + getSdrModelFromSdrView(), + aRect); + + bool bIsPres = false; + if( pPickObj ) + { + SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject()); + bIsPres = pPage && pPage->IsPresObj(pPickObj); + if( bIsPres ) + { + pPage->InsertPresObj( pNewMediaObj.get(), PresObjKind::Media ); + } + } + + if( pPickObj ) + ReplaceObjectAtView(pPickObj, *pPV, pNewMediaObj.get()); + else + { + if (!InsertObjectAtView(pNewMediaObj.get(), *pPV, SdrInsertFlags::SETDEFLAYER)) + pNewMediaObj = nullptr; + } + + OUString referer; + DrawDocShell * sh = GetDocSh(); + if (sh != nullptr && sh->HasName()) { + referer = sh->GetMedium()->GetName(); + } + + if (pNewMediaObj) + { + pNewMediaObj->setURL(rMediaURL, referer); + + if( pPickObj ) + { + pNewMediaObj->AdjustToMaxRect( aRect ); + if( bIsPres ) + pNewMediaObj->SetUserCall( pUserCall ); + } + } + } + + rAction = mnAction; + + return pNewMediaObj.get(); +} + +/** + * Timer handler for InsertFile at Drop() + */ +IMPL_LINK_NOARG(View, DropInsertFileHdl, Timer *, void) +{ + DBG_ASSERT( mpViewSh, "sd::View::DropInsertFileHdl(), I need a view shell to work!" ); + if( !mpViewSh ) + return; + + SfxErrorContext aEc( ERRCTX_ERROR, mpViewSh->GetFrameWeld(), RID_SO_ERRCTX ); + ErrCode nError = ERRCODE_NONE; + + ::std::vector< OUString >::const_iterator aIter( maDropFileVector.begin() ); + + while( (aIter != maDropFileVector.end()) && !nError ) + { + OUString aCurrentDropFile( *aIter ); + INetURLObject aURL( aCurrentDropFile ); + bool bHandled = false; + + if( aURL.GetProtocol() == INetProtocol::NotValid ) + { + OUString aURLStr; + osl::FileBase::getFileURLFromSystemPath( aCurrentDropFile, aURLStr ); + aURL = INetURLObject( aURLStr ); + } + + GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter(); + Graphic aGraphic; + + aCurrentDropFile = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ); + +#if HAVE_FEATURE_AVMEDIA + if( !::avmedia::MediaWindow::isMediaURL( aCurrentDropFile, ""/*TODO?*/ ) ) +#else +#endif + { + if( !rGraphicFilter.ImportGraphic( aGraphic, aURL ) ) + { + sal_Int8 nTempAction = ( aIter == maDropFileVector.begin() ) ? mnAction : 0; + const bool bLink = ( ( nTempAction & DND_ACTION_LINK ) != 0 ); + SdrGrafObj* pGrafObj = InsertGraphic( aGraphic, nTempAction, maDropPos, nullptr, nullptr ); + if(pGrafObj && bLink) + { + pGrafObj->SetGraphicLink( aCurrentDropFile ); + } + + // return action from first inserted graphic + if( aIter == maDropFileVector.begin() ) + mnAction = nTempAction; + + bHandled = true; + } + if (!bHandled) + { + std::shared_ptr<const SfxFilter> pFoundFilter; + SfxMedium aSfxMedium( aCurrentDropFile, StreamMode::READ | StreamMode::SHARE_DENYNONE ); + ErrCode nErr = SfxGetpApp()->GetFilterMatcher().GuessFilter( aSfxMedium, pFoundFilter ); + + if( pFoundFilter && !nErr ) + { + ::std::vector< OUString > aFilterVector; + OUString aFilterName = pFoundFilter->GetFilterName(); + OUString aLowerAsciiFileName = aCurrentDropFile.toAsciiLowerCase(); + + FuInsertFile::GetSupportedFilterVector( aFilterVector ); + + if( ( ::std::find( aFilterVector.begin(), aFilterVector.end(), pFoundFilter->GetMimeType() ) != aFilterVector.end() ) || + aFilterName.indexOf( "Text" ) != -1 || + aFilterName.indexOf( "Rich" ) != -1 || + aFilterName.indexOf( "RTF" ) != -1 || + aFilterName.indexOf( "HTML" ) != -1 || + aLowerAsciiFileName.indexOf(".sdd") != -1 || + aLowerAsciiFileName.indexOf(".sda") != -1 || + aLowerAsciiFileName.indexOf(".sxd") != -1 || + aLowerAsciiFileName.indexOf(".sxi") != -1 || + aLowerAsciiFileName.indexOf(".std") != -1 || + aLowerAsciiFileName.indexOf(".sti") != -1 ) + { + ::sd::Window* pWin = mpViewSh->GetActiveWindow(); + SfxRequest aReq(SID_INSERTFILE, ::SfxCallMode::SLOT, mrDoc.GetItemPool()); + SfxStringItem aItem1( ID_VAL_DUMMY0, aCurrentDropFile ), aItem2( ID_VAL_DUMMY1, pFoundFilter->GetFilterName() ); + + aReq.AppendItem( aItem1 ); + aReq.AppendItem( aItem2 ); + FuInsertFile::Create( mpViewSh, pWin, this, &mrDoc, aReq ); + bHandled = true; + } + } + } + } + +#if HAVE_FEATURE_AVMEDIA + if (!bHandled) + { + bool bShallowDetect = ::avmedia::MediaWindow::isMediaURL(aCurrentDropFile, ""/*TODO?*/); + if (bShallowDetect) + { + mxDropMediaSizeListener.set(new avmedia::PlayerListener( + [this, aCurrentDropFile](const css::uno::Reference<css::media::XPlayer>& rPlayer){ + SolarMutexGuard g; + + css::awt::Size aSize = rPlayer->getPreferredPlayerWindowSize(); + Size aPrefSize(aSize.Width, aSize.Height); + + if (aPrefSize.Width() && aPrefSize.Height()) + { + ::sd::Window* pWin = mpViewSh->GetActiveWindow(); + + if( pWin ) + aPrefSize = pWin->PixelToLogic(aPrefSize, MapMode(MapUnit::Map100thMM)); + else + aPrefSize = Application::GetDefaultDevice()->PixelToLogic(aPrefSize, MapMode(MapUnit::Map100thMM)); + } + else + aPrefSize = Size( 5000, 5000 ); + + InsertMediaURL(aCurrentDropFile, mnAction, maDropPos, aPrefSize, true); + + mxDropMediaSizeListener.clear(); + })); + } + bHandled = bShallowDetect && ::avmedia::MediaWindow::isMediaURL(aCurrentDropFile, ""/*TODO?*/, true, mxDropMediaSizeListener); + } +#endif + + if (!bHandled) + { + if( mnAction & DND_ACTION_LINK ) + static_cast< DrawViewShell* >( mpViewSh )->InsertURLButton( aCurrentDropFile, aCurrentDropFile, OUString(), &maDropPos ); + else + { + if( mpViewSh ) + { + try + { + //TODO/MBA: testing + OUString aName; + uno::Sequence < beans::PropertyValue > aMedium{ comphelper::makePropertyValue( + "URL", aCurrentDropFile) }; + + uno::Reference < embed::XEmbeddedObject > xObj = mpDocSh->GetEmbeddedObjectContainer(). + InsertEmbeddedObject( aMedium, aName ); + + uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY ); + if ( xPersist.is()) + { + // TODO/LEAN: VisualArea access can switch the object to running state + sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; + + xPersist->storeOwn(); + + awt::Size aSz; + try + { + aSz = xObj->getVisualAreaSize( nAspect ); + } + catch( embed::NoVisualAreaSizeException& ) + { + // the default size will be set later + } + + Size aSize( aSz.Width, aSz.Height ); + ::tools::Rectangle aRect; + + if (!aSize.Width() || !aSize.Height()) + { + aSize.setWidth( 1410 ); + aSize.setHeight( 1000 ); + } + + aRect = ::tools::Rectangle( maDropPos, aSize ); + + rtl::Reference<SdrOle2Obj> pOleObj = new SdrOle2Obj( + getSdrModelFromSdrView(), + svt::EmbeddedObjectRef(xObj, nAspect), + aName, + aRect); + SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER; + + if (mpViewSh != nullptr) + { + OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr); + SfxInPlaceClient* pIpClient = + mpViewSh->GetViewShell()->GetIPClient(); + if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive()) + nOptions |= SdrInsertFlags::DONTMARK; + } + + if (InsertObjectAtView( pOleObj.get(), *GetSdrPageView(), nOptions )) + pOleObj->SetLogicRect( aRect ); + aSz.Width = aRect.GetWidth(); + aSz.Height = aRect.GetHeight(); + xObj->setVisualAreaSize( nAspect,aSz ); + } + } + catch( uno::Exception& ) + { + nError = ERRCODE_IO_GENERAL; + // TODO/LATER: better error handling + } + } + } + } + + ++aIter; + } + + if( nError ) + ErrorHandler::HandleError( nError ); +} + +/** + * Timer handler for Errorhandling at Drop() + */ +IMPL_LINK_NOARG(View, DropErrorHdl, Timer *, void) +{ + vcl::Window* pWin = mpViewSh ? mpViewSh->GetActiveWindow() : nullptr; + std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pWin ? pWin->GetFrameWeld() : nullptr, + VclMessageType::Info, VclButtonsType::Ok, + SdResId(STR_ACTION_NOTPOSSIBLE))); + xInfoBox->run(); +} + +/** + * @returns StyleSheet from selection + */ +SfxStyleSheet* View::GetStyleSheet() const +{ + return SdrView::GetStyleSheet(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdview5.cxx b/sd/source/ui/view/sdview5.cxx new file mode 100644 index 0000000000..c3ac066bc0 --- /dev/null +++ b/sd/source/ui/view/sdview5.cxx @@ -0,0 +1,118 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <sdpage.hxx> +#include <View.hxx> +#include <pres.hxx> + +#include <svx/svdpagv.hxx> + +namespace sd { + +static bool implIsMultiPresObj( PresObjKind eKind ) +{ + switch( eKind ) + { + case PresObjKind::Outline: + case PresObjKind::Graphic: + case PresObjKind::Object: + case PresObjKind::Chart: + case PresObjKind::OrgChart: + case PresObjKind::Table: + case PresObjKind::Media: + return true; + default: + return false; + } +} + +SdPage* View::GetPage() +{ + SdPage* pPage = nullptr; + SdrPageView* pPV = GetSdrPageView(); + if( pPV ) + { + pPage = static_cast< SdPage* >( pPV->GetPage() ); + } + + return pPage; +} + +// returns selected object in case there's just one object in the selection +SdrObject* View::GetSelectedSingleObject(SdPage const * pPage) +{ + SdrObject* pRet = nullptr; + if( pPage ) + { + // first try selected shape + if ( AreObjectsMarked() ) + { + const SdrMarkList& rMarkList = GetMarkedObjectList(); + + if (rMarkList.GetMarkCount() == 1) + { + SdrMark* pMark = rMarkList.GetMark(0); + pRet = pMark->GetMarkedSdrObj(); + } + } + } + + return pRet; +} + +SdrObject* View::GetEmptyPresentationObject( PresObjKind eKind ) +{ + SdPage* pPage = GetPage(); + SdrObject* pEmptyObj = nullptr; + + if ( pPage && !pPage->IsMasterPage() ) { + SdrObject* pObj = GetSelectedSingleObject( pPage ); + + if( pObj && pObj->IsEmptyPresObj() && implIsMultiPresObj( pPage->GetPresObjKind(pObj) ) ) + pEmptyObj = pObj; + + // try to find empty pres obj of same type + if( !pEmptyObj ) + { + int nIndex = 1; + do + { + pEmptyObj = pPage->GetPresObj(eKind, nIndex++ ); + } + while( (pEmptyObj != nullptr) && (!pEmptyObj->IsEmptyPresObj()) ); + } + + // last try to find empty pres obj of multiple type + if( !pEmptyObj ) + { + const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList(); + + auto iter = std::find_if(rShapes.begin(), rShapes.end(), + [&pPage](SdrObject* pShape) { return pShape->IsEmptyPresObj() && implIsMultiPresObj(pPage->GetPresObjKind(pShape)); }); + if (iter != rShapes.end()) + pEmptyObj = (*iter); + } + } + + return pEmptyObj; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/sdwindow.cxx b/sd/source/ui/view/sdwindow.cxx new file mode 100644 index 0000000000..6d5481318e --- /dev/null +++ b/sd/source/ui/view/sdwindow.cxx @@ -0,0 +1,1058 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <Window.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/request.hxx> + +#include <sfx2/viewfrm.hxx> +#include <svx/svxids.hrc> + +#include <editeng/outliner.hxx> +#include <editeng/editview.hxx> +#include <editeng/editeng.hxx> + +#include <app.hrc> +#include <ViewShell.hxx> +#include <DrawViewShell.hxx> +#include <DrawDocShell.hxx> +#include <PresentationViewShell.hxx> +#include <View.hxx> +#include <FrameView.hxx> +#include <OutlineViewShell.hxx> +#include <OutlineView.hxx> +#include <drawdoc.hxx> +#include <WindowUpdater.hxx> +#include <ViewShellBase.hxx> +#include <uiobject.hxx> + +#include <officecfg/Office/Common.hxx> +#include <sal/log.hxx> +#include <tools/debug.hxx> +#include <vcl/commandevent.hxx> +#include <vcl/settings.hxx> +#include <comphelper/lok.hxx> +#include <sfx2/lokhelper.hxx> + +namespace sd { + +#define SCROLL_LINE_FACT 0.05 ///< factor for line scrolling +#define SCROLL_PAGE_FACT 0.5 ///< factor for page scrolling +#define SCROLL_SENSITIVE 20 ///< sensitive area in pixel +#define ZOOM_MULTIPLICATOR 10000 ///< multiplier to avoid rounding errors +#define MIN_ZOOM 5 ///< minimal zoom factor +#define MAX_ZOOM 3000 ///< maximal zoom factor + +Window::Window(vcl::Window* pParent) + : vcl::DocWindow(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)), + DropTargetHelper( this ), + maWinPos(0, 0), // precautionary; but the values should be set + maViewOrigin(0, 0), // again from the owner of the window + maViewSize(1000, 1000), + maPrevSize(-1,-1), + mnMinZoom(MIN_ZOOM), + mnMaxZoom(MAX_ZOOM), + mbMinZoomAutoCalc(false), + mbCenterAllowed(true), + mnTicks (0), + mpViewShell(nullptr), + mbUseDropScroll (true) +{ + SetDialogControlFlags( DialogControlFlags::Return | DialogControlFlags::WantFocus ); + + MapMode aMap(GetMapMode()); + aMap.SetMapUnit(MapUnit::Map100thMM); + SetMapMode(aMap); + + // with it, the vcl::WindowColor is used in the slide mode + SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) ); + + // adjust contrast mode initially + bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); + GetOutDev()->SetDrawMode( bUseContrast + ? sd::OUTPUT_DRAWMODE_CONTRAST + : sd::OUTPUT_DRAWMODE_COLOR ); + + // #i78183# Added after discussed with AF + EnableRTL(false); +} + +Window::~Window() +{ + disposeOnce(); +} + +void Window::dispose() +{ + if (mpViewShell != nullptr) + { + WindowUpdater* pWindowUpdater = mpViewShell->GetWindowUpdater(); + if (pWindowUpdater != nullptr) + pWindowUpdater->UnregisterWindow (this); + } + DropTargetHelper::dispose(); + vcl::Window::dispose(); +} + +void Window::SetViewShell (ViewShell* pViewSh) +{ + WindowUpdater* pWindowUpdater = nullptr; + // Unregister at device updater of old view shell. + if (mpViewShell != nullptr) + { + pWindowUpdater = mpViewShell->GetWindowUpdater(); + if (pWindowUpdater != nullptr) + pWindowUpdater->UnregisterWindow (this); + } + + mpViewShell = pViewSh; + + // Register at device updater of new view shell + if (mpViewShell != nullptr) + { + pWindowUpdater = mpViewShell->GetWindowUpdater(); + if (pWindowUpdater != nullptr) + pWindowUpdater->RegisterWindow (this); + } +} + +ViewShell* Window::GetViewShell() +{ + return mpViewShell; +} + +void Window::CalcMinZoom() +{ + // Are we entitled to change the minimal zoom factor? + if ( !mbMinZoomAutoCalc ) + return; + + // Get current zoom factor. + ::tools::Long nZoom = GetZoom(); + + // Get the rectangle of the output area in logical coordinates + // and calculate the scaling factors that would lead to the view + // area (also called application area) to completely fill the + // window. + Size aWinSize = PixelToLogic(GetOutputSizePixel()); + sal_uLong nX = static_cast<sal_uLong>(static_cast<double>(aWinSize.Width()) + * double(ZOOM_MULTIPLICATOR) / static_cast<double>(maViewSize.Width())); + sal_uLong nY = static_cast<sal_uLong>(static_cast<double>(aWinSize.Height()) + * double(ZOOM_MULTIPLICATOR) / static_cast<double>(maViewSize.Height())); + + // Decide whether to take the larger or the smaller factor. + sal_uLong nFact = std::min(nX, nY); + + // The factor is transformed according to the current zoom factor. + nFact = nFact * nZoom / ZOOM_MULTIPLICATOR; + mnMinZoom = std::max(sal_uInt16(MIN_ZOOM), static_cast<sal_uInt16>(nFact)); + + // If the current zoom factor is smaller than the calculated minimal + // zoom factor then set the new minimal factor as the current zoom + // factor. + if ( nZoom < static_cast<::tools::Long>(mnMinZoom) ) + SetZoomFactor(mnMinZoom); +} + +void Window::SetMinZoom (::tools::Long nMin) +{ + mnMinZoom = static_cast<sal_uInt16>(nMin); +} + +void Window::SetMaxZoom (::tools::Long nMax) +{ + mnMaxZoom = static_cast<sal_uInt16>(nMax); +} + +::tools::Long Window::GetZoom() const +{ + if( GetMapMode().GetScaleX().GetDenominator() ) + { + return ::tools::Long(GetMapMode().GetScaleX() * 100); + } + else + { + return 0; + } +} + +void Window::Resize() +{ + vcl::Window::Resize(); + CalcMinZoom(); + + if( mpViewShell && mpViewShell->GetViewFrame() ) + mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); +} + +void Window::PrePaint(vcl::RenderContext& /*rRenderContext*/) +{ + if ( mpViewShell ) + mpViewShell->PrePaint(); +} + +void Window::Paint(vcl::RenderContext& /*rRenderContext*/, const ::tools::Rectangle& rRect) +{ + if ( mpViewShell ) + mpViewShell->Paint(rRect, this); +} + +void Window::KeyInput(const KeyEvent& rKEvt) +{ + if (getenv("SD_DEBUG") && rKEvt.GetKeyCode().GetCode() == KEY_F12 && mpViewShell) + { + mpViewShell->GetDoc()->dumpAsXml(nullptr); + if (OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView()) + pOLV->GetEditView().GetEditEngine()->dumpAsXmlEditDoc(nullptr); + return; + } + + if (!(mpViewShell && mpViewShell->KeyInput(rKEvt, this))) + { + if (mpViewShell && rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE) + { + mpViewShell->GetViewShell()->Escape(); + } + else + { + vcl::Window::KeyInput(rKEvt); + } + } +} + +void Window::MouseButtonDown(const MouseEvent& rMEvt) +{ + if ( mpViewShell ) + mpViewShell->MouseButtonDown(rMEvt, this); +} + +void Window::MouseMove(const MouseEvent& rMEvt) +{ + if ( mpViewShell ) + mpViewShell->MouseMove(rMEvt, this); +} + +void Window::MouseButtonUp(const MouseEvent& rMEvt) +{ + mnTicks = 0; + + if ( mpViewShell ) + mpViewShell->MouseButtonUp(rMEvt, this); +} + +void Window::Command(const CommandEvent& rCEvt) +{ + if (mpViewShell) + mpViewShell->Command(rCEvt, this); + //pass at least alt press/release to parent impl + if (rCEvt.GetCommand() == CommandEventId::ModKeyChange) + vcl::Window::Command(rCEvt); + //show the text edit outliner view cursor + else if (mpViewShell && !HasFocus() && rCEvt.GetCommand() == CommandEventId::CursorPos) + { + // tdf#138855 Getting Focus may destroy TextEditOutlinerView so Grab if + // text editing active, but fetch the TextEditOutlinerView post-grab + if (mpViewShell->GetView()->IsTextEdit()) + { + GrabFocus(); + OutlinerView* pOLV = mpViewShell->GetView()->GetTextEditOutlinerView(); + if (pOLV && this == pOLV->GetWindow()) + pOLV->ShowCursor(); + } + } +} + +bool Window::EventNotify( NotifyEvent& rNEvt ) +{ + bool bResult = false; + if ( mpViewShell ) + { + bResult = mpViewShell->Notify(rNEvt, this); + } + if( !bResult ) + bResult = vcl::Window::EventNotify(rNEvt); + + return bResult; +} + +void Window::RequestHelp(const HelpEvent& rEvt) +{ + if (!mpViewShell || !mpViewShell->RequestHelp(rEvt)) + vcl::Window::RequestHelp( rEvt ); +} + +/** + * Set the position of the upper left corner from the visible area of the + * window. + */ +void Window::SetWinViewPos(const Point& rPnt) +{ + maWinPos = rPnt; +} + +/** + * Set origin of the representation in respect to the whole working area. + */ +void Window::SetViewOrigin(const Point& rPnt) +{ + maViewOrigin = rPnt; +} + +/** + * Set size of the whole working area which can be seen with the window. + */ +void Window::SetViewSize(const Size& rSize) +{ + maViewSize = rSize; + CalcMinZoom(); +} + +void Window::SetCenterAllowed (bool bIsAllowed) +{ + mbCenterAllowed = bIsAllowed; +} + +::tools::Long Window::SetZoomFactor(::tools::Long nZoom) +{ + // Clip the zoom factor to the valid range marked by nMinZoom as + // calculated by CalcMinZoom() and the constant MAX_ZOOM. + if ( nZoom > MAX_ZOOM ) + nZoom = MAX_ZOOM; + if ( nZoom < static_cast<::tools::Long>(mnMinZoom) ) + nZoom = mnMinZoom; + + // Set the zoom factor at the window's map mode. + if (!comphelper::LibreOfficeKit::isActive()) + { + MapMode aMap(GetMapMode()); + aMap.SetScaleX(Fraction(nZoom, 100)); + aMap.SetScaleY(Fraction(nZoom, 100)); + SetMapMode(aMap); + } + + // invalidate previous size - it was relative to the old scaling + maPrevSize = Size(-1,-1); + + // Update the map mode's origin (to what effect?). + UpdateMapOrigin(); + + // Update the view's snapping to the new zoom factor. + if ( auto pDrawViewShell = dynamic_cast< DrawViewShell *>( mpViewShell ) ) + pDrawViewShell->GetView()->RecalcLogicSnapMagnetic(*GetOutDev()); + + // Return the zoom factor just in case it has been changed above to lie + // inside the valid range. + return nZoom; +} + +void Window::SetZoomIntegral(::tools::Long nZoom) +{ + // Clip the zoom factor to the valid range marked by nMinZoom as + // previously calculated by <member>CalcMinZoom()</member> and the + // MAX_ZOOM constant. + if ( nZoom > MAX_ZOOM ) + nZoom = MAX_ZOOM; + if ( nZoom < static_cast<::tools::Long>(mnMinZoom) ) + nZoom = mnMinZoom; + + // Calculate the window's new origin. + Size aSize = PixelToLogic(GetOutputSizePixel()); + ::tools::Long nW = aSize.Width() * GetZoom() / nZoom; + ::tools::Long nH = aSize.Height() * GetZoom() / nZoom; + maWinPos.AdjustX((aSize.Width() - nW) / 2 ); + maWinPos.AdjustY((aSize.Height() - nH) / 2 ); + if ( maWinPos.X() < 0 ) maWinPos.setX( 0 ); + if ( maWinPos.Y() < 0 ) maWinPos.setY( 0 ); + + // Finally update this window's map mode to the given zoom factor that + // has been clipped to the valid range. + SetZoomFactor(nZoom); +} + +::tools::Long Window::GetZoomForRect( const ::tools::Rectangle& rZoomRect ) +{ + ::tools::Long nRetZoom = 100; + + if( (rZoomRect.GetWidth() != 0) && (rZoomRect.GetHeight() != 0)) + { + // Calculate the scale factors which will lead to the given + // rectangle being fully visible (when translated accordingly) as + // large as possible in the output area independently in both + // coordinate directions . + sal_uLong nX(0); + sal_uLong nY(0); + + const Size aWinSize( PixelToLogic(GetOutputSizePixel()) ); + if(rZoomRect.GetHeight()) + { + nX = static_cast<sal_uLong>(static_cast<double>(aWinSize.Height()) + * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetHeight())); + } + + if(rZoomRect.GetWidth()) + { + nY = static_cast<sal_uLong>(static_cast<double>(aWinSize.Width()) + * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetWidth())); + } + + // Use the smaller one of both so that the zoom rectangle will be + // fully visible with respect to both coordinate directions. + sal_uLong nFact = std::min(nX, nY); + + // Transform the current zoom factor so that it leads to the desired + // scaling. + nRetZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR; + + // Calculate the new origin. + if ( nFact == 0 ) + { + // Don't change anything if the scale factor is degenerate. + nRetZoom = GetZoom(); + } + else + { + // Clip the zoom factor to the valid range marked by nMinZoom as + // previously calculated by <member>CalcMinZoom()</member> and the + // MAX_ZOOM constant. + if ( nRetZoom > MAX_ZOOM ) + nRetZoom = MAX_ZOOM; + if ( nRetZoom < static_cast<::tools::Long>(mnMinZoom) ) + nRetZoom = mnMinZoom; + } + } + + return nRetZoom; +} + +/** Recalculate the zoom factor and translation so that the given rectangle + is displayed centered and as large as possible while still being fully + visible in the window. +*/ +::tools::Long Window::SetZoomRect (const ::tools::Rectangle& rZoomRect) +{ + ::tools::Long nNewZoom = 100; + + if (rZoomRect.GetWidth() == 0 || rZoomRect.GetHeight() == 0) + { + // The given rectangle is degenerate. Use the default zoom factor + // (above) of 100%. + SetZoomIntegral(nNewZoom); + } + else + { + Point aPos = rZoomRect.TopLeft(); + // Transform the output area from pixel coordinates into logical + // coordinates. + Size aWinSize = PixelToLogic(GetOutputSizePixel()); + // Paranoia! The degenerate case of zero width or height has been + // taken care of above. + DBG_ASSERT(rZoomRect.GetWidth(), "ZoomRect-Width = 0!"); + DBG_ASSERT(rZoomRect.GetHeight(), "ZoomRect-Height = 0!"); + + // Calculate the scale factors which will lead to the given + // rectangle being fully visible (when translated accordingly) as + // large as possible in the output area independently in both + // coordinate directions . + sal_uLong nX(0); + sal_uLong nY(0); + + if(rZoomRect.GetHeight()) + { + nX = static_cast<sal_uLong>(static_cast<double>(aWinSize.Height()) + * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetHeight())); + } + + if(rZoomRect.GetWidth()) + { + nY = static_cast<sal_uLong>(static_cast<double>(aWinSize.Width()) + * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetWidth())); + } + + // Use the smaller one of both so that the zoom rectangle will be + // fully visible with respect to both coordinate directions. + sal_uLong nFact = std::min(nX, nY); + + // Transform the current zoom factor so that it leads to the desired + // scaling. + ::tools::Long nZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR; + + // Calculate the new origin. + if ( nFact == 0 ) + { + // Don't change anything if the scale factor is degenerate. + nNewZoom = GetZoom(); + } + else + { + // Calculate the new window position that centers the given + // rectangle on the screen. + if ( nZoom > MAX_ZOOM ) + nFact = nFact * MAX_ZOOM / nZoom; + + maWinPos = maViewOrigin + aPos; + + aWinSize.setWidth( static_cast<::tools::Long>(static_cast<double>(aWinSize.Width()) * double(ZOOM_MULTIPLICATOR) / static_cast<double>(nFact)) ); + maWinPos.AdjustX((rZoomRect.GetWidth() - aWinSize.Width()) / 2 ); + aWinSize.setHeight( static_cast<::tools::Long>(static_cast<double>(aWinSize.Height()) * double(ZOOM_MULTIPLICATOR) / static_cast<double>(nFact)) ); + maWinPos.AdjustY((rZoomRect.GetHeight() - aWinSize.Height()) / 2 ); + + if ( maWinPos.X() < 0 ) maWinPos.setX( 0 ); + if ( maWinPos.Y() < 0 ) maWinPos.setY( 0 ); + + // Adapt the window's map mode to the new zoom factor. + nNewZoom = SetZoomFactor(nZoom); + } + } + + return nNewZoom; +} + +void Window::SetMinZoomAutoCalc (bool bAuto) +{ + mbMinZoomAutoCalc = bAuto; +} + +/** + * Calculate and set new MapMode origin. + * If aWinPos.X()/Y() == -1, then we center the corresponding position (e.g. for + * initialization). + */ +void Window::UpdateMapOrigin(bool bInvalidate) +{ + bool bChanged = false; + const Size aWinSize = PixelToLogic(GetOutputSizePixel()); + + if ( mbCenterAllowed ) + { + if( maPrevSize != Size(-1,-1) ) + { + // keep view centered around current pos, when window + // resizes + maWinPos.AdjustX( -((aWinSize.Width() - maPrevSize.Width()) / 2) ); + maWinPos.AdjustY( -((aWinSize.Height() - maPrevSize.Height()) / 2) ); + bChanged = true; + } + + if ( maWinPos.X() > maViewSize.Width() - aWinSize.Width() ) + { + maWinPos.setX( maViewSize.Width() - aWinSize.Width() ); + bChanged = true; + } + if ( maWinPos.Y() > maViewSize.Height() - aWinSize.Height() ) + { + maWinPos.setY( maViewSize.Height() - aWinSize.Height() ); + bChanged = true; + } + if ( aWinSize.Width() > maViewSize.Width() || maWinPos.X() < 0 ) + { + maWinPos.setX( maViewSize.Width() / 2 - aWinSize.Width() / 2 ); + bChanged = true; + } + if ( aWinSize.Height() > maViewSize.Height() || maWinPos.Y() < 0 ) + { + maWinPos.setY( maViewSize.Height() / 2 - aWinSize.Height() / 2 ); + bChanged = true; + } + } + + UpdateMapMode (); + + maPrevSize = aWinSize; + + // When tiled rendering, the above UpdateMapMode() call doesn't touch the map mode. + if (bChanged && bInvalidate && !comphelper::LibreOfficeKit::isActive()) + Invalidate(); +} + +void Window::UpdateMapMode() +{ + maWinPos -= maViewOrigin; + Size aPix(maWinPos.X(), maWinPos.Y()); + aPix = LogicToPixel(aPix); + // Size has to be a multiple of BRUSH_SIZE due to the correct depiction of + // pattern + // #i2237# + // removed old stuff here which still forced zoom to be + // %BRUSH_SIZE which is outdated now + + if (dynamic_cast< DrawViewShell *>( mpViewShell )) + { + // page should not "stick" to the window border + if (aPix.Width() == 0) + { + // #i2237# + // Since BRUSH_SIZE alignment is outdated now, i use the + // former constant here directly + aPix.AdjustWidth( -8 ); + } + if (aPix.Height() == 0) + { + // #i2237# + // Since BRUSH_SIZE alignment is outdated now, i use the + // former constant here directly + aPix.AdjustHeight( -8 ); + } + } + + aPix = PixelToLogic(aPix); + maWinPos.setX( aPix.Width() ); + maWinPos.setY( aPix.Height() ); + Point aNewOrigin (-maWinPos.X(), -maWinPos.Y()); + maWinPos += maViewOrigin; + + if (!comphelper::LibreOfficeKit::isActive()) + { + MapMode aMap(GetMapMode()); + aMap.SetOrigin(aNewOrigin); + SetMapMode(aMap); + } +} + +/** + * @returns X position of the visible area as fraction (< 1) of the whole + * working area. + */ +double Window::GetVisibleX() const +{ + return maViewSize.Width() == 0 ? 0 : (static_cast<double>(maWinPos.X()) / maViewSize.Width()); +} + +/** + * @returns Y position of the visible area as fraction (< 1) of the whole + * working area. + */ +double Window::GetVisibleY() const +{ + return maViewSize.Height() == 0 ? 0 : (static_cast<double>(maWinPos.Y()) / maViewSize.Height()); +} + +/** + * Set x and y position of the visible area as fraction (< 1) of the whole + * working area. Negative values are ignored. + */ +void Window::SetVisibleXY(double fX, double fY) +{ + ::tools::Long nOldX = maWinPos.X(); + ::tools::Long nOldY = maWinPos.Y(); + + if ( fX >= 0 ) + maWinPos.setX( static_cast<::tools::Long>(fX * maViewSize.Width()) ); + if ( fY >= 0 ) + maWinPos.setY( static_cast<::tools::Long>(fY * maViewSize.Height()) ); + UpdateMapOrigin(false); + Scroll(nOldX - maWinPos.X(), nOldY - maWinPos.Y(), ScrollFlags::Children); + PaintImmediately(); +} + +/** + * @returns width of the visible area in proportion to the width of the whole + * working area. + */ +double Window::GetVisibleWidth() const +{ + Size aWinSize = PixelToLogic(GetOutputSizePixel()); + if ( aWinSize.Width() > maViewSize.Width() ) + aWinSize.setWidth( maViewSize.Width() ); + return + maViewSize.Width() == 0 ? 0 : (static_cast<double>(aWinSize.Width()) / maViewSize.Width()); +} + +/** + * @returns height of the visible area in proportion to the height of the whole + * working area. + */ +double Window::GetVisibleHeight() const +{ + Size aWinSize = PixelToLogic(GetOutputSizePixel()); + if ( aWinSize.Height() > maViewSize.Height() ) + aWinSize.setHeight( maViewSize.Height() ); + return maViewSize.Height() == 0 + ? 0 : (static_cast<double>(aWinSize.Height()) / maViewSize.Height()); +} + +Point Window::GetVisibleCenter() +{ + Point aPos = ::tools::Rectangle(Point(), GetOutputSizePixel()).Center(); + + // For LOK + bool bMapModeWasEnabled(IsMapModeEnabled()); + EnableMapMode(/*true*/); + aPos = PixelToLogic(aPos); + EnableMapMode(bMapModeWasEnabled); + + return aPos; +} + +/** + * @returns width of a scroll column in proportion to the width of the whole + * working area. + */ +double Window::GetScrlLineWidth() const +{ + return (GetVisibleWidth() * SCROLL_LINE_FACT); +} + +/** + * @returns height of a scroll column in proportion to the height of the whole + * working area. + */ +double Window::GetScrlLineHeight() const +{ + return (GetVisibleHeight() * SCROLL_LINE_FACT); +} + +/** + * @returns width of a scroll page in proportion to the width of the whole + * working area. + */ +double Window::GetScrlPageWidth() const +{ + return (GetVisibleWidth() * SCROLL_PAGE_FACT); +} + +/** + * @returns height of a scroll page in proportion to the height of the whole + * working area. + */ +double Window::GetScrlPageHeight() const +{ + return (GetVisibleHeight() * SCROLL_PAGE_FACT); +} + +/** + * Deactivate window. + */ +void Window::LoseFocus() +{ + mnTicks = 0; + vcl::Window::LoseFocus (); +} + +/** + * Activate window. + */ +void Window::GrabFocus() +{ + mnTicks = 0; + vcl::Window::GrabFocus (); +} + +void Window::DataChanged( const DataChangedEvent& rDCEvt ) +{ + vcl::Window::DataChanged( rDCEvt ); + + /* Omit PRINTER by all documents which are not using a printer. + Omit FONTS and FONTSUBSTITUTION if no text output is available or if the + document does not allow text. */ + + if ( !((rDCEvt.GetType() == DataChangedEventType::PRINTER) || + (rDCEvt.GetType() == DataChangedEventType::DISPLAY) || + (rDCEvt.GetType() == DataChangedEventType::FONTS) || + (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) || + ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) && + (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))) ) + return; + + if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && + (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) ) + { + /* Rearrange or initiate Resize for scroll bars since the size of + the scroll bars my have changed. Within this, inside the resize- + handler, the size of the scroll bars will be asked from the + Settings. */ + Resize(); + + /* Re-set data, which are from system control or from Settings. May + have to re-set more data since the resolution may also has + changed. */ + if( mpViewShell ) + { + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + DrawModeFlags nOutputMode; + sal_uInt16 nPreviewSlot; + + if( rStyleSettings.GetHighContrastMode() ) + nOutputMode = sd::OUTPUT_DRAWMODE_CONTRAST; + else + nOutputMode = sd::OUTPUT_DRAWMODE_COLOR; + + if( rStyleSettings.GetHighContrastMode() + && officecfg::Office::Common::Accessibility::IsForPagePreviews::get() ) + nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST; + else + nPreviewSlot = SID_PREVIEW_QUALITY_COLOR; + + if( dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr ) + { + GetOutDev()->SetDrawMode( nOutputMode ); + mpViewShell->GetFrameView()->SetDrawMode( nOutputMode ); + Invalidate(); + } + + // Overwrite window color for OutlineView + if( dynamic_cast< OutlineViewShell *>( mpViewShell ) != nullptr ) + { + svtools::ColorConfig aColorConfig; + const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor ); + SetBackground( Wallpaper( aDocColor ) ); + } + + SfxRequest aReq( nPreviewSlot, SfxCallMode::SLOT, mpViewShell->GetDocSh()->GetDoc()->GetItemPool() ); + mpViewShell->ExecReq( aReq ); + mpViewShell->Invalidate(); + mpViewShell->ArrangeGUIElements(); + + // re-create handles to show new outfit + if(dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr) + { + mpViewShell->GetView()->AdjustMarkHdl(); + } + } + } + + if ( (rDCEvt.GetType() == DataChangedEventType::DISPLAY) || + ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) && + (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) ) + { + /* Virtual devices, which also depends on the resolution or the + system control, should be updated. Otherwise, we should update + the virtual devices at least at DataChangedEventType::DISPLAY since some + systems allow to change the resolution and color depth during + runtime. Or the virtual devices have to be updated when the color + palette has changed since a different color matching can be used + when outputting. */ + } + + if ( rDCEvt.GetType() == DataChangedEventType::FONTS ) + { + /* If the document provides font choose boxes, we have to update + them. I don't know how this looks like (also not really me, I + only translated the comment ;). We may can handle it global. We + have to discuss it with PB, but he is ill at the moment. + Before we handle it here, discuss it with PB and me. */ + } + + if ( (rDCEvt.GetType() == DataChangedEventType::FONTS) || + (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) ) + { + /* Do reformatting since the fonts of the document may no longer + exist, or exist now, or are replaced with others. */ + if( mpViewShell ) + { + DrawDocShell* pDocSh = mpViewShell->GetDocSh(); + if( pDocSh ) + pDocSh->SetPrinter( pDocSh->GetPrinter( true ) ); + } + } + + if ( rDCEvt.GetType() == DataChangedEventType::PRINTER ) + { + /* I don't know how the handling should look like. Maybe we delete a + printer and look what we have to do. Maybe I have to add + something to the VCL, in case the used printer is deleted. + Otherwise I may recalculate the formatting here if the current + printer is destroyed. */ + if( mpViewShell ) + { + DrawDocShell* pDocSh = mpViewShell->GetDocSh(); + if( pDocSh ) + pDocSh->SetPrinter( pDocSh->GetPrinter( true ) ); + } + } + + // Update everything + Invalidate(); +} + +sal_Int8 Window::AcceptDrop( const AcceptDropEvent& rEvt ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( mpViewShell && !mpViewShell->GetDocSh()->IsReadOnly() ) + { + nRet = mpViewShell->AcceptDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND ); + + if (mbUseDropScroll && dynamic_cast< OutlineViewShell *>( mpViewShell ) == nullptr) + DropScroll( rEvt.maPosPixel ); + } + + return nRet; +} + +sal_Int8 Window::ExecuteDrop( const ExecuteDropEvent& rEvt ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( mpViewShell ) + { + nRet = mpViewShell->ExecuteDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND ); + } + + return nRet; +} + +void Window::SetUseDropScroll (bool bUseDropScroll) +{ + mbUseDropScroll = bUseDropScroll; +} + +void Window::DropScroll(const Point& rMousePos) +{ + short nDx = 0; + short nDy = 0; + + Size aSize = GetOutputSizePixel(); + + if (aSize.Width() > SCROLL_SENSITIVE * 3) + { + if ( rMousePos.X() < SCROLL_SENSITIVE ) + { + nDx = -1; + } + + if ( rMousePos.X() >= aSize.Width() - SCROLL_SENSITIVE ) + { + nDx = 1; + } + } + + if (aSize.Height() > SCROLL_SENSITIVE * 3) + { + if ( rMousePos.Y() < SCROLL_SENSITIVE ) + { + nDy = -1; + } + + if ( rMousePos.Y() >= aSize.Height() - SCROLL_SENSITIVE ) + { + nDy = 1; + } + } + + if ( (nDx || nDy) && (rMousePos.X()!=0 || rMousePos.Y()!=0 ) ) + { + if (mnTicks > 20) + mpViewShell->ScrollLines(nDx, nDy); + else + mnTicks ++; + } +} + +css::uno::Reference<css::accessibility::XAccessible> + Window::CreateAccessible() +{ + // If current viewshell is PresentationViewShell, just return empty because the correct ShowWin will be created later. + if (dynamic_cast< PresentationViewShell *>( mpViewShell )) + { + return vcl::Window::CreateAccessible (); + } + css::uno::Reference< css::accessibility::XAccessible > xAcc = GetAccessible(false); + if (xAcc) + { + return xAcc; + } + if (mpViewShell != nullptr) + { + xAcc = mpViewShell->CreateAccessibleDocumentView (this); + SetAccessible(xAcc); + return xAcc; + } + else + { + SAL_WARN("sd", "::sd::Window::CreateAccessible: no view shell"); + return vcl::Window::CreateAccessible (); + } +} + +OutlinerView* Window::GetOutlinerView() const +{ + OutlinerView *pOLV = nullptr; + sd::View* pView = mpViewShell->GetView(); + if (mpViewShell->GetShellType() == ViewShell::ST_OUTLINE) + { + if (OutlineView* pOView = dynamic_cast<OutlineView*>(pView)) + pOLV = pOView->GetViewByWindow(this); + } + else if (pView->IsTextEdit()) + { + pOLV = pView->GetTextEditOutlinerView(); + } + return pOLV; +} + +OUString Window::GetSurroundingText() const +{ + OutlinerView *pOLV = GetOutlinerView(); + if (pOLV) + return pOLV->GetEditView().GetSurroundingText(); + return OUString(); +} + +Selection Window::GetSurroundingTextSelection() const +{ + OutlinerView *pOLV = GetOutlinerView(); + if (pOLV) + return pOLV->GetEditView().GetSurroundingTextSelection(); + return Selection( 0, 0 ); +} + +bool Window::DeleteSurroundingText(const Selection& rSelection) +{ + OutlinerView *pOLV = GetOutlinerView(); + if (pOLV) + return pOLV->GetEditView().DeleteSurroundingText(rSelection); + return false; +} + +void Window::LogicInvalidate(const ::tools::Rectangle* pRectangle) +{ + DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell); + if (!pDrawViewShell || pDrawViewShell->IsInSwitchPage()) + return; + + if (!comphelper::LibreOfficeKit::isActive()) + return; + ::tools::Rectangle aRectangle; + ::tools::Rectangle* pResultRectangle; + if (!pRectangle) + pResultRectangle = nullptr; + else + { + aRectangle = *pRectangle; + if (GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + aRectangle = o3tl::convert(aRectangle, o3tl::Length::mm100, o3tl::Length::twip); + } + pResultRectangle = &aRectangle; + } + SfxViewShell& rSfxViewShell = pDrawViewShell->GetViewShellBase(); + SfxLokHelper::notifyInvalidation(&rSfxViewShell, pResultRectangle); +} + +FactoryFunction Window::GetUITestFactory() const +{ + if (get_id() == "impress_win") + return ImpressWindowUIObject::create; + + return WindowUIObject::create; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/tabcontr.cxx b/sd/source/ui/view/tabcontr.cxx new file mode 100644 index 0000000000..b09a254e9f --- /dev/null +++ b/sd/source/ui/view/tabcontr.cxx @@ -0,0 +1,358 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <TabControl.hxx> + +#include <sfx2/viewfrm.hxx> +#include <sfx2/dispatch.hxx> +#include <vcl/commandevent.hxx> +#include <vcl/vclevent.hxx> + +#include <app.hrc> + +#include <DrawViewShell.hxx> +#include <helpids.h> +#include <View.hxx> +#include <drawdoc.hxx> +#include <DrawDocShell.hxx> + +namespace sd { + + +TabControl::TabControlTransferable::~TabControlTransferable() +{ +} + +void TabControl::TabControlTransferable::AddSupportedFormats() +{ + AddFormat( SotClipboardFormatId::STARDRAW_TABBAR ); +} + +bool TabControl::TabControlTransferable::GetData( const css::datatransfer::DataFlavor& /*rFlavor*/, const OUString& /*rDestDoc*/ ) +{ + return false; +} + +void TabControl::TabControlTransferable::DragFinished( sal_Int8 /*nDropAction*/ ) +{ + mrParent.DragFinished(); +} + +TabControl::TabControl(DrawViewShell* pViewSh, vcl::Window* pParent) : + TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL | WB_SIZEABLE | WB_DRAG) ), + DragSourceHelper( this ), + DropTargetHelper( this ), + pDrViewSh(pViewSh), + bInternalMove(false) +{ + EnableEditMode(); + SetSizePixel(Size(0, 0)); + SetMaxPageWidth( 150 ); + SetHelpId( HID_SD_TABBAR_PAGES ); +} + +TabControl::~TabControl() +{ + disposeOnce(); +} + +void TabControl::dispose() +{ + DragSourceHelper::dispose(); + DropTargetHelper::dispose(); + TabBar::dispose(); +} + +void TabControl::Select() +{ + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | + SfxCallMode::RECORD); +} + +void TabControl::MouseButtonDown(const MouseEvent& rMEvt) +{ + if (rMEvt.IsLeft() + && !rMEvt.IsMod1() + && !rMEvt.IsMod2() + && !rMEvt.IsShift()) + { + Point aPos = PixelToLogic( rMEvt.GetPosPixel() ); + sal_uInt16 aPageId = GetPageId(aPos); + + //initialize + if (aPageId == 0) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + + pDispatcher->Execute(SID_INSERTPAGE_QUICK, + SfxCallMode::SYNCHRON | SfxCallMode::RECORD); + } + } + + // A single left click with pressed control key on a tab page first + // switches to that page before the usual handling (copying with drag + // and drop) takes place. + else if (rMEvt.IsLeft() && rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift()) + { + pDrViewSh->SwitchPage (GetPageId (rMEvt.GetPosPixel()) - 1); + } + + // When only the right button is pressed then first process a + // synthesized left button click to make the page the current one + // whose tab has been clicked. When then the actual right button + // click is processed the resulting context menu relates to the + // now current page. + if (rMEvt.IsRight() && ! rMEvt.IsLeft()) + { + MouseEvent aSyntheticEvent ( + rMEvt.GetPosPixel(), + rMEvt.GetClicks(), + rMEvt.GetMode(), + MOUSE_LEFT, + rMEvt.GetModifier()); + TabBar::MouseButtonDown(aSyntheticEvent); + } + + TabBar::MouseButtonDown(rMEvt); +} + +void TabControl::DoubleClick() +{ + if (GetCurPageId() != 0) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute( SID_MODIFYPAGE, + SfxCallMode::SYNCHRON | SfxCallMode::RECORD ); + } +} + +void TabControl::StartDrag( sal_Int8, const Point& ) +{ + bInternalMove = true; + + // object is delete by reference mechanism + ( new TabControl::TabControlTransferable( *this ) )->StartDrag( this, DND_ACTION_COPYMOVE ); +} + +void TabControl::DragFinished() +{ + bInternalMove = false; +} + +sal_Int8 TabControl::AcceptDrop( const AcceptDropEvent& rEvt ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( rEvt.mbLeaving ) + EndSwitchPage(); + + if( !pDrViewSh->GetDocSh()->IsReadOnly() ) + { + SdDrawDocument* pDoc = pDrViewSh->GetDoc(); + Point aPos( rEvt.maPosPixel ); + + if( bInternalMove ) + { + if( rEvt.mbLeaving || ( pDrViewSh->GetEditMode() == EditMode::MasterPage ) ) + HideDropPos(); + else + { + ShowDropPos( aPos ); + nRet = rEvt.mnAction; + } + } + else + { + HideDropPos(); + + sal_Int32 nPageId = GetPageId( aPos ) - 1; + + if( ( nPageId >= 0 ) && pDoc->GetPage( static_cast<sal_uInt16>(nPageId) ) ) + { + nRet = pDrViewSh->AcceptDrop( rEvt, *this, nullptr, static_cast<sal_uInt16>(nPageId), SDRLAYER_NOTFOUND ); + SwitchPage( aPos ); + } + } + } + + return nRet; +} + +sal_Int8 TabControl::ExecuteDrop( const ExecuteDropEvent& rEvt ) +{ + SdDrawDocument* pDoc = pDrViewSh->GetDoc(); + Point aPos( rEvt.maPosPixel ); + sal_Int8 nRet = DND_ACTION_NONE; + + if( bInternalMove ) + { + sal_uInt16 nPageId = ShowDropPos( aPos ) - 1; + + switch (rEvt.mnAction) + { + case DND_ACTION_MOVE: + if( pDrViewSh->IsSwitchPageAllowed() && pDoc->MovePages( nPageId ) ) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + break; + + case DND_ACTION_COPY: + { + // Copying the selected page to the place that rEvt points + // takes place in three steps: + // 1. Create a copy of the selected page. This copy will + // lie directly behind the selected page. + // 2. Move the copy to the desired place. + // 3. Select the copy. + if (pDrViewSh->IsSwitchPageAllowed()) + { + // 1. Create a copy. + sal_uInt16 nPageNumOfCopy = pDoc->DuplicatePage (GetCurPageId() - 1); + // 2. Move page. For this first switch to the copy: + // MovePages operates on the currently selected page(s). + pDrViewSh->SwitchPage (nPageNumOfCopy); + // Adapt target page id when necessary, i.e. page copy + // has been inserted in front of the target page. + sal_uInt16 nPageNum = nPageId; + if ((nPageNumOfCopy <= nPageNum) && (nPageNum != sal_uInt16(-1))) + nPageNum += 1; + if (pDoc->MovePages(nPageNum)) + { + // 3. Switch to the copy that has been moved to its + // final destination. Use an asynchron slot call to + // be executed after the still pending ones. + if (nPageNumOfCopy >= nPageNum || (nPageNum == sal_uInt16(-1))) + nPageNum += 1; + SetCurPageId (GetPageId(nPageNum)); + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHPAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + } + + break; + } + } + + nRet = rEvt.mnAction; + } + else + { + sal_Int32 nPageId = GetPageId( aPos ) - 1; + + if( ( nPageId >= 0 ) && pDoc->GetPage( static_cast<sal_uInt16>(nPageId) ) ) + { + nRet = pDrViewSh->ExecuteDrop( rEvt, *this, nullptr, static_cast<sal_uInt16>(nPageId), SDRLAYER_NOTFOUND ); + } + } + + HideDropPos(); + EndSwitchPage(); + + return nRet; +} + +void TabControl::Command(const CommandEvent& rCEvt) +{ + if ( rCEvt.GetCommand() == CommandEventId::ContextMenu ) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->ExecutePopup("pagetab"); + } +} + +bool TabControl::StartRenaming() +{ + bool bOK = false; + + if (pDrViewSh->GetPageKind() == PageKind::Standard) + { + bOK = true; + + ::sd::View* pView = pDrViewSh->GetView(); + + if ( pView->IsTextEdit() ) + pView->SdrEndTextEdit(); + } + + return bOK; +} + +TabBarAllowRenamingReturnCode TabControl::AllowRenaming() +{ + bool bOK = true; + + OUString aNewName( GetEditText() ); + OUString aCompareName( GetPageText( GetEditPageId() ) ); + + if( aCompareName != aNewName ) + { + // rename page + if (pDrViewSh->GetDocSh()->CheckPageName(GetFrameWeld(), aNewName)) + { + SetEditText( aNewName ); + EndRenaming(); + } + else + { + bOK = false; + } + } + return bOK ? TABBAR_RENAMING_YES : TABBAR_RENAMING_NO; +} + +void TabControl::EndRenaming() +{ + if( !IsEditModeCanceled() ) + pDrViewSh->RenameSlide( GetEditPageId(), GetEditText() ); +} + +void TabControl::ActivatePage() +{ + if ( /*IsInSwitching && */ pDrViewSh->IsSwitchPageAllowed() ) + { + SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); + pDispatcher->Execute(SID_SWITCHPAGE, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } +} + +bool TabControl::DeactivatePage() +{ + return pDrViewSh->IsSwitchPageAllowed(); +} + +void TabControl::SendActivatePageEvent() +{ + CallEventListeners (VclEventId::TabbarPageActivated, + reinterpret_cast<void*>(GetCurPageId())); +} + +void TabControl::SendDeactivatePageEvent() +{ + CallEventListeners (VclEventId::TabbarPageDeactivated, + reinterpret_cast<void*>(GetCurPageId())); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/unmodpg.cxx b/sd/source/ui/view/unmodpg.cxx new file mode 100644 index 0000000000..4ca02f2942 --- /dev/null +++ b/sd/source/ui/view/unmodpg.cxx @@ -0,0 +1,274 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <svx/svdlayer.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/viewfrm.hxx> +#include <svx/svdviter.hxx> +#include <svx/svdview.hxx> +#include <tools/debug.hxx> + +#include <strings.hrc> +#include <strings.hxx> +#include <glob.hxx> +#include <app.hrc> + +#include <unmodpg.hxx> +#include <sdpage.hxx> +#include <sdresid.hxx> +#include <unokywds.hxx> +#include <drawdoc.hxx> +#include <utility> + +#include <ViewShell.hxx> +#include <ViewShellBase.hxx> +#include <DrawDocShell.hxx> +#include <SlideSorter.hxx> +#include <SlideSorterViewShell.hxx> +#include <view/SlideSorterView.hxx> + +ModifyPageUndoAction::ModifyPageUndoAction( + SdDrawDocument* pTheDoc, + SdPage* pThePage, + const OUString& aTheNewName, + AutoLayout eTheNewAutoLayout, + bool bTheNewBckgrndVisible, + bool bTheNewBckgrndObjsVisible) +: SdUndoAction(pTheDoc) +{ + DBG_ASSERT(pThePage, "Undo without a page???"); + + mpPage = pThePage; + maNewName = aTheNewName; + meNewAutoLayout = eTheNewAutoLayout; + mbNewBckgrndVisible = bTheNewBckgrndVisible; + mbNewBckgrndObjsVisible = bTheNewBckgrndObjsVisible; + + meOldAutoLayout = mpPage->GetAutoLayout(); + + if (!mpPage->IsMasterPage()) + { + maOldName = mpPage->GetName(); + SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin(); + SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + SdrLayerIDSet aVisibleLayers = mpPage->TRG_GetMasterPageVisibleLayers(); + + mbOldBckgrndVisible = aVisibleLayers.IsSet(aBckgrnd); + mbOldBckgrndObjsVisible = aVisibleLayers.IsSet(aBckgrndObj); + } + else + { + mbOldBckgrndVisible = false; + mbOldBckgrndObjsVisible = false; + } + + if (pTheDoc && pTheDoc->GetDocumentType() == DocumentType::Draw) + SetComment( SdResId(STR_UNDO_MODIFY_PAGE_DRAW) ); + else + SetComment( SdResId(STR_UNDO_MODIFY_PAGE) ); +} + +void ModifyPageUndoAction::Undo() +{ + // invalidate Selection, there could be objects deleted in this UNDO + // which are no longer allowed to be selected then. + SdrViewIter::ForAllViews(mpPage, + [] (SdrView* pView) + { + if(pView->AreObjectsMarked()) + pView->UnmarkAll(); + }); + + mpPage->SetAutoLayout( meOldAutoLayout ); + + if (!mpPage->IsMasterPage()) + { + if (mpPage->GetName() != maOldName) + { + mpPage->SetName(maOldName); + + if (mpPage->GetPageKind() == PageKind::Standard) + { + SdPage* pNotesPage = static_cast<SdPage*>(mpDoc->GetPage(mpPage->GetPageNum() + 1)); + pNotesPage->SetName(maOldName); + } + } + + SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin(); + SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + SdrLayerIDSet aVisibleLayers; + aVisibleLayers.Set(aBckgrnd, mbOldBckgrndVisible); + aVisibleLayers.Set(aBckgrndObj, mbOldBckgrndObjsVisible); + mpPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + + // Redisplay + SfxViewFrame* pCurrent = SfxViewFrame::Current(); + if( pCurrent ) + { + pCurrent->GetDispatcher()->Execute( + SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } +} + +void ModifyPageUndoAction::Redo() +{ + // invalidate Selection, there could be objects deleted in this UNDO + // which are no longer allowed to be selected then. + SdrViewIter::ForAllViews(mpPage, + [] (SdrView* pView) + { + if(pView->AreObjectsMarked()) + pView->UnmarkAll(); + }); + + mpPage->meAutoLayout = meNewAutoLayout; + + if (!mpPage->IsMasterPage()) + { + if (mpPage->GetName() != maNewName) + { + mpPage->SetName(maNewName); + + if (mpPage->GetPageKind() == PageKind::Standard) + { + SdPage* pNotesPage = static_cast<SdPage*>(mpDoc->GetPage(mpPage->GetPageNum() + 1)); + pNotesPage->SetName(maNewName); + } + } + + SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin(); + SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + SdrLayerIDSet aVisibleLayers; + aVisibleLayers.Set(aBckgrnd, mbNewBckgrndVisible); + aVisibleLayers.Set(aBckgrndObj, mbNewBckgrndObjsVisible); + mpPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); + } + + // Redisplay + SfxViewFrame* pCurrent = SfxViewFrame::Current(); + if( pCurrent ) + { + pCurrent->GetDispatcher()->Execute( + SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD ); + } +} + +ModifyPageUndoAction::~ModifyPageUndoAction() +{ +} + +ChangeSlideExclusionStateUndoAction::ChangeSlideExclusionStateUndoAction( + SdDrawDocument* pDocument, const sd::slidesorter::model::PageDescriptor::State eState, + const bool bOldStateValue) + : SdUndoAction(pDocument) + , meState(eState) + , mbOldStateValue(bOldStateValue) + , maComment(bOldStateValue ? SdResId(STR_UNDO_SHOW_SLIDE) : SdResId(STR_UNDO_HIDE_SLIDE)) +{ +} + +ChangeSlideExclusionStateUndoAction::ChangeSlideExclusionStateUndoAction( + SdDrawDocument* pDocument, const sd::slidesorter::model::SharedPageDescriptor& rpDescriptor, + const sd::slidesorter::model::PageDescriptor::State eState, const bool bOldStateValue) + : ChangeSlideExclusionStateUndoAction(pDocument, eState, bOldStateValue) +{ + mrpDescriptors.push_back(rpDescriptor); +} + +void ChangeSlideExclusionStateUndoAction::AddPageDescriptor( + const sd::slidesorter::model::SharedPageDescriptor& rpDescriptor) +{ + mrpDescriptors.push_back(rpDescriptor); +} + +void ChangeSlideExclusionStateUndoAction::Undo() +{ + sd::DrawDocShell* pDocShell = mpDoc ? mpDoc->GetDocSh() : nullptr; + sd::ViewShell* pViewShell = pDocShell ? pDocShell->GetViewShell() : nullptr; + if (pViewShell) + { + sd::slidesorter::SlideSorterViewShell* pSlideSorterViewShell + = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase()); + if (pSlideSorterViewShell) + { + for (const sd::slidesorter::model::SharedPageDescriptor& rpDescriptor : mrpDescriptors) + pSlideSorterViewShell->GetSlideSorter().GetView().SetState(rpDescriptor, meState, + mbOldStateValue); + } + } +} + +void ChangeSlideExclusionStateUndoAction::Redo() +{ + sd::DrawDocShell* pDocShell = mpDoc ? mpDoc->GetDocSh() : nullptr; + sd::ViewShell* pViewShell = pDocShell ? pDocShell->GetViewShell() : nullptr; + if (pViewShell) + { + sd::slidesorter::SlideSorterViewShell* pSlideSorterViewShell + = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase()); + if (pSlideSorterViewShell) + { + for (const sd::slidesorter::model::SharedPageDescriptor& rpDescriptor : mrpDescriptors) + pSlideSorterViewShell->GetSlideSorter().GetView().SetState(rpDescriptor, meState, + !mbOldStateValue); + } + } +} + +OUString ChangeSlideExclusionStateUndoAction::GetComment() const +{ + return maComment; +} + +RenameLayoutTemplateUndoAction::RenameLayoutTemplateUndoAction( + SdDrawDocument* pDocument, + OUString aOldLayoutName, + OUString aNewLayoutName) + : SdUndoAction(pDocument) + , maOldName(std::move(aOldLayoutName)) + , maNewName(std::move(aNewLayoutName)) + , maComment(SdResId(STR_TITLE_RENAMESLIDE)) +{ + sal_Int32 nPos = maOldName.indexOf(SD_LT_SEPARATOR); + if (nPos != -1) + maOldName = maOldName.copy(0, nPos); +} + +void RenameLayoutTemplateUndoAction::Undo() +{ + OUString aLayoutName(maNewName + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE); + mpDoc->RenameLayoutTemplate( aLayoutName, maOldName ); +} + +void RenameLayoutTemplateUndoAction::Redo() +{ + OUString aLayoutName(maOldName + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE); + mpDoc->RenameLayoutTemplate( aLayoutName, maNewName ); +} + +OUString RenameLayoutTemplateUndoAction::GetComment() const +{ + return maComment; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/viewoverlaymanager.cxx b/sd/source/ui/view/viewoverlaymanager.cxx new file mode 100644 index 0000000000..bd2e6be970 --- /dev/null +++ b/sd/source/ui/view/viewoverlaymanager.cxx @@ -0,0 +1,545 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <sal/config.h> + +#include <sfx2/viewfrm.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> + +#include <vcl/help.hxx> +#include <vcl/lazydelete.hxx> +#include <vcl/ptrstyle.hxx> +#include <vcl/svapp.hxx> + +#include <svx/sdrpagewindow.hxx> +#include <svx/sdrpaintwindow.hxx> +#include <svx/sdr/overlay/overlaybitmapex.hxx> +#include <svx/sdr/overlay/overlaymanager.hxx> +#include <svx/svxids.hrc> +#include <svx/svdpagv.hxx> + +#include <view/viewoverlaymanager.hxx> + + +#include <DrawDocShell.hxx> +#include <strings.hrc> +#include <bitmaps.hlst> +#include <sdresid.hxx> +#include <EventMultiplexer.hxx> +#include <View.hxx> +#include <ViewShellBase.hxx> +#include <ViewShell.hxx> +#include <sdpage.hxx> +#include <smarttag.hxx> + +using namespace ::com::sun::star::uno; + +namespace sd { + +namespace { + +class ImageButtonHdl; + +} + +const sal_uInt16 gButtonSlots[] = { SID_INSERT_TABLE, SID_INSERT_DIAGRAM, SID_INSERT_GRAPHIC, SID_INSERT_AVMEDIA }; +const TranslateId gButtonToolTips[] = { STR_INSERT_TABLE, STR_INSERT_CHART, STR_INSERT_PICTURE, STR_INSERT_MOVIE }; + +constexpr OUString aSmallPlaceHolders[] = +{ + BMP_PLACEHOLDER_TABLE_SMALL, + BMP_PLACEHOLDER_CHART_SMALL, + BMP_PLACEHOLDER_IMAGE_SMALL, + BMP_PLACEHOLDER_MOVIE_SMALL, + BMP_PLACEHOLDER_TABLE_SMALL_HOVER, + BMP_PLACEHOLDER_CHART_SMALL_HOVER, + BMP_PLACEHOLDER_IMAGE_SMALL_HOVER, + BMP_PLACEHOLDER_MOVIE_SMALL_HOVER +}; + +constexpr OUString aBigPlaceHolders[] = +{ + BMP_PLACEHOLDER_TABLE_LARGE, + BMP_PLACEHOLDER_CHART_LARGE, + BMP_PLACEHOLDER_IMAGE_LARGE, + BMP_PLACEHOLDER_MOVIE_LARGE, + BMP_PLACEHOLDER_TABLE_LARGE_HOVER, + BMP_PLACEHOLDER_CHART_LARGE_HOVER, + BMP_PLACEHOLDER_IMAGE_LARGE_HOVER, + BMP_PLACEHOLDER_MOVIE_LARGE_HOVER +}; + +static BitmapEx& getButtonImage( int index, bool large ) +{ + static vcl::DeleteOnDeinit< BitmapEx > gSmallButtonImages[SAL_N_ELEMENTS(aSmallPlaceHolders)] = { vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty }; + static vcl::DeleteOnDeinit< BitmapEx > gLargeButtonImages[SAL_N_ELEMENTS(aBigPlaceHolders)] = { vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty }; + + assert(SAL_N_ELEMENTS(aSmallPlaceHolders) == SAL_N_ELEMENTS(aBigPlaceHolders)); + + if( !gSmallButtonImages[0].get() ) + { + for (size_t i = 0; i < SAL_N_ELEMENTS(aSmallPlaceHolders); i++ ) + { + gSmallButtonImages[i].set(aSmallPlaceHolders[i]); + gLargeButtonImages[i].set(aBigPlaceHolders[i]); + } + } + + if( large ) + { + return *gLargeButtonImages[index].get(); + } + else + { + return *gSmallButtonImages[index].get(); + } +} + +const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32; + +namespace { + +class ChangePlaceholderTag : public SmartTag +{ + friend class ImageButtonHdl; +public: + ChangePlaceholderTag( ::sd::View& rView, SdrObject& rPlaceholderObj ); + + /** returns true if the SmartTag handled the event. */ + virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ) override; + + /** returns true if the SmartTag consumes this event. */ + virtual bool KeyInput( const KeyEvent& rKEvt ) override; + + BitmapEx createOverlayImage( int nHighlight ); + +protected: + virtual void addCustomHandles( SdrHdlList& rHandlerList ) override; + +private: + ::unotools::WeakReference<SdrObject> mxPlaceholderObj; +}; + +class ImageButtonHdl : public SmartHdl +{ +public: + ImageButtonHdl( const SmartTagReference& xTag, /* sal_uInt16 nSID, const Image& rImage, const Image& rImageMO, */ const Point& rPnt ); + virtual ~ImageButtonHdl() override; + virtual void CreateB2dIAObject() override; + virtual bool IsFocusHdl() const override; + virtual PointerStyle GetPointer() const override; + + virtual void onMouseEnter(const MouseEvent& rMEvt) override; + virtual void onHelpRequest() override; + virtual void onMouseLeave() override; + + int getHighlightId() const { return mnHighlightId; } + + void ShowTip(); + static void HideTip(); + +private: + rtl::Reference< ChangePlaceholderTag > mxChangePlaceholderTag; + + int mnHighlightId; + Size maImageSize; +}; + +} + +ImageButtonHdl::ImageButtonHdl( const SmartTagReference& xTag /*, sal_uInt16 nSID, const Image& rImage, const Image& rImageMO*/, const Point& rPnt ) +: SmartHdl( xTag, rPnt, SdrHdlKind::SmartTag ) +, mxChangePlaceholderTag( dynamic_cast< ChangePlaceholderTag* >( xTag.get() ) ) +, mnHighlightId( -1 ) +, maImageSize( 42, 42 ) +{ +} + +ImageButtonHdl::~ImageButtonHdl() +{ + HideTip(); +} + +void ImageButtonHdl::HideTip() +{ + Help::HideBalloonAndQuickHelp(); +} + +void ImageButtonHdl::ShowTip() +{ + if (!m_pHdlList || !m_pHdlList->GetView() || mnHighlightId == -1) + return; + + OutputDevice* pDev = m_pHdlList->GetView()->GetFirstOutputDevice(); + if( pDev == nullptr ) + pDev = Application::GetDefaultDevice(); + + OUString aHelpText(SdResId(gButtonToolTips[mnHighlightId])); + Point aHelpPos(pDev->LogicToPixel(GetPos())); + if (mnHighlightId == 1) + aHelpPos.Move(maImageSize.Width(), 0); + else if (mnHighlightId == 2) + aHelpPos.Move(0, maImageSize.Height()); + else if (mnHighlightId == 3) + aHelpPos.Move(maImageSize.Width(), maImageSize.Height()); + ::tools::Rectangle aLogicPix(aHelpPos, maImageSize); + vcl::Window* pWindow = m_pHdlList->GetView()->GetFirstOutputDevice()->GetOwnerWindow(); + ::tools::Rectangle aScreenRect(pWindow->OutputToScreenPixel(aLogicPix.TopLeft()), + pWindow->OutputToScreenPixel(aLogicPix.BottomRight())); + Help::ShowQuickHelp(pWindow, aScreenRect, aHelpText); +} + +void ImageButtonHdl::onHelpRequest() +{ + ShowTip(); +} + +void ImageButtonHdl::onMouseEnter(const MouseEvent& rMEvt) +{ + if( !(m_pHdlList && m_pHdlList->GetView())) + return; + + int nHighlightId = 0; + OutputDevice* pDev = m_pHdlList->GetView()->GetFirstOutputDevice(); + if( pDev == nullptr ) + pDev = Application::GetDefaultDevice(); + + Point aMDPos( rMEvt.GetPosPixel() ); + aMDPos -= pDev->LogicToPixel( GetPos() ); + + nHighlightId += aMDPos.X() > maImageSize.Width() ? 1 : 0; + nHighlightId += aMDPos.Y() > maImageSize.Height() ? 2 : 0; + + if( mnHighlightId != nHighlightId ) + { + HideTip(); + + mnHighlightId = nHighlightId; + + ShowTip(); + + Touch(); + } +} + +void ImageButtonHdl::onMouseLeave() +{ + mnHighlightId = -1; + HideTip(); + Touch(); +} + +void ImageButtonHdl::CreateB2dIAObject() +{ + // first throw away old one + GetRidOfIAObject(); + + const Point aTagPos( GetPos() ); + basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() ); + + BitmapEx aBitmapEx( mxChangePlaceholderTag->createOverlayImage( mnHighlightId ) ); // maImageMO.GetBitmapEx() : maImage.GetBitmapEx() ); + maImageSize = aBitmapEx.GetSizePixel(); + maImageSize.setWidth( maImageSize.Width() >> 1 ); + maImageSize.setHeight( maImageSize.Height() >> 1 ); + + if(!m_pHdlList) + return; + + SdrMarkView* pView = m_pHdlList->GetView(); + + if(!pView || pView->areMarkHandlesHidden()) + return; + + SdrPageView* pPageView = pView->GetSdrPageView(); + + if(!pPageView) + return; + + for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++) + { + const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b); + + SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow(); + const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager(); + if(rPaintWindow.OutputToWindow() && xManager.is() ) + { + std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject( + new sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 )); + + // OVERLAYMANAGER + insertNewlyCreatedOverlayObjectForSdrHdl( + std::move(pOverlayObject), + rPageWindow.GetObjectContact(), + *xManager); + } + } +} + +bool ImageButtonHdl::IsFocusHdl() const +{ + return false; +} + +PointerStyle ImageButtonHdl::GetPointer() const +{ + return PointerStyle::Arrow; +} + +ChangePlaceholderTag::ChangePlaceholderTag( ::sd::View& rView, SdrObject& rPlaceholderObj ) +: SmartTag( rView ) +, mxPlaceholderObj( &rPlaceholderObj ) +{ +} + +/** returns true if the ChangePlaceholderTag handled the event. */ +bool ChangePlaceholderTag::MouseButtonDown( const MouseEvent& /*rMEvt*/, SmartHdl& rHdl ) +{ + int nHighlightId = static_cast< ImageButtonHdl& >(rHdl).getHighlightId(); + if( nHighlightId >= 0 ) + { + sal_uInt16 nSID = gButtonSlots[nHighlightId]; + + if( auto pPlaceholder = mxPlaceholderObj.get() ) + { + // mark placeholder if it is not currently marked (or if also others are marked) + if( !mrView.IsObjMarked( pPlaceholder.get() ) || (mrView.GetMarkedObjectList().GetMarkCount() != 1) ) + { + SdrPageView* pPV = mrView.GetSdrPageView(); + mrView.UnmarkAllObj(pPV ); + mrView.MarkObj(pPlaceholder.get(), pPV); + } + } + + mrView.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( nSID, SfxCallMode::ASYNCHRON); + } + return false; +} + +/** returns true if the SmartTag consumes this event. */ +bool ChangePlaceholderTag::KeyInput( const KeyEvent& rKEvt ) +{ + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + switch( nCode ) + { + case KEY_DOWN: + case KEY_UP: + case KEY_LEFT: + case KEY_RIGHT: + case KEY_ESCAPE: + case KEY_TAB: + case KEY_RETURN: + case KEY_SPACE: + default: + return false; + } +} + +BitmapEx ChangePlaceholderTag::createOverlayImage( int nHighlight ) +{ + BitmapEx aRet; + if( auto pPlaceholder = mxPlaceholderObj.get() ) + { + SmartTagReference xThis( this ); + const ::tools::Rectangle& rSnapRect = pPlaceholder->GetSnapRect(); + + OutputDevice* pDev = mrView.GetFirstOutputDevice(); + if( pDev == nullptr ) + pDev = Application::GetDefaultDevice(); + + Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize()); + ::tools::Long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height()); + + bool bLarge = nShapeSizePix > 250; + + Size aSize( getButtonImage( 0, bLarge ).GetSizePixel() ); + + aRet.Scale(Size(aSize.Width() << 1, aSize.Height() << 1)); + + const ::tools::Rectangle aRectSrc( Point( 0, 0 ), aSize ); + + aRet = getButtonImage((nHighlight == 0) ? 4 : 0, bLarge); + aRet.Expand( aSize.Width(), aSize.Height(), true ); + + aRet.CopyPixel( ::tools::Rectangle( Point( aSize.Width(), 0 ), aSize ), aRectSrc, getButtonImage((nHighlight == 1) ? 5 : 1, bLarge) ); + aRet.CopyPixel( ::tools::Rectangle( Point( 0, aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 2) ? 6 : 2, bLarge) ); + aRet.CopyPixel( ::tools::Rectangle( Point( aSize.Width(), aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 3) ? 7 : 3, bLarge) ); + } + + return aRet; +} + +void ChangePlaceholderTag::addCustomHandles( SdrHdlList& rHandlerList ) +{ + rtl::Reference<SdrObject> pPlaceholder = mxPlaceholderObj.get(); + if( !pPlaceholder ) + return; + + SmartTagReference xThis( this ); + const ::tools::Rectangle& rSnapRect = pPlaceholder->GetSnapRect(); + const Point aPoint; + + OutputDevice* pDev = mrView.GetFirstOutputDevice(); + if( pDev == nullptr ) + pDev = Application::GetDefaultDevice(); + + Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize()); + ::tools::Long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height()); + if( 50 > nShapeSizePix ) + return; + + bool bLarge = nShapeSizePix > 250; + + Size aButtonSize( pDev->PixelToLogic( getButtonImage(0, bLarge ).GetSizePixel()) ); + + const int nColumns = 2; + const int nRows = 2; + + ::tools::Long all_width = nColumns * aButtonSize.Width(); + ::tools::Long all_height = nRows * aButtonSize.Height(); + + Point aPos( rSnapRect.Center() ); + aPos.AdjustX( -(all_width >> 1) ); + aPos.AdjustY( -(all_height >> 1) ); + + std::unique_ptr<ImageButtonHdl> pHdl(new ImageButtonHdl( xThis, aPoint )); + pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM ); + pHdl->SetPageView( mrView.GetSdrPageView() ); + + pHdl->SetPos( aPos ); + + rHandlerList.AddHdl( std::move(pHdl) ); +} + +ViewOverlayManager::ViewOverlayManager( ViewShellBase& rViewShellBase ) +: mrBase( rViewShellBase ) +, mnUpdateTagsEvent( nullptr ) +{ + Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->AddEventListener(aLink); + + StartListening( *mrBase.GetDocShell() ); +} + +ViewOverlayManager::~ViewOverlayManager() +{ + Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) ); + mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); + + if( mnUpdateTagsEvent ) + { + Application::RemoveUserEvent( mnUpdateTagsEvent ); + mnUpdateTagsEvent = nullptr; + } + + DisposeTags(); +} + +void ViewOverlayManager::Notify(SfxBroadcaster&, const SfxHint& rHint) +{ + if (rHint.GetId() == SfxHintId::DocChanged) + { + UpdateTags(); + } +} + +void ViewOverlayManager::onZoomChanged() +{ + if( !maTagVector.empty() ) + { + UpdateTags(); + } +} + +void ViewOverlayManager::UpdateTags() +{ + if( !mnUpdateTagsEvent ) + mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, ViewOverlayManager, UpdateTagsHdl ) ); +} + +IMPL_LINK_NOARG(ViewOverlayManager, UpdateTagsHdl, void*, void) +{ + mnUpdateTagsEvent = nullptr; + bool bChanges = DisposeTags(); + bChanges |= CreateTags(); + + if( bChanges && mrBase.GetDrawView() ) + static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles(); +} + +bool ViewOverlayManager::CreateTags() +{ + bool bChanges = false; + + std::shared_ptr<ViewShell> aMainShell = mrBase.GetMainViewShell(); + + SdPage* pPage = aMainShell ? aMainShell->getCurrentPage() : nullptr; + + if( pPage && !pPage->IsMasterPage() && (pPage->GetPageKind() == PageKind::Standard) ) + { + const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList(); + + for( SdrObject* pShape : rShapes ) + { + if( pShape->IsEmptyPresObj() && (pShape->GetObjIdentifier() == SdrObjKind::OutlineText) && (mrBase.GetDrawView()->GetTextEditObject() != pShape) ) + { + rtl::Reference< SmartTag > xTag( new ChangePlaceholderTag( *mrBase.GetMainViewShell()->GetView(), *pShape ) ); + maTagVector.push_back(xTag); + bChanges = true; + } + } + } + + return bChanges; +} + +bool ViewOverlayManager::DisposeTags() +{ + if( !maTagVector.empty() ) + { + ViewTagVector vec; + vec.swap( maTagVector ); + + for (auto& rxViewTag : vec) + rxViewTag->Dispose(); + return true; + } + + return false; +} + +IMPL_LINK(ViewOverlayManager,EventMultiplexerListener, + tools::EventMultiplexerEvent&, rEvent, void) +{ + switch (rEvent.meEventId) + { + case EventMultiplexerEventId::MainViewAdded: + case EventMultiplexerEventId::ViewAdded: + case EventMultiplexerEventId::BeginTextEdit: + case EventMultiplexerEventId::EndTextEdit: + case EventMultiplexerEventId::CurrentPageChanged: + UpdateTags(); + break; + default: break; + } +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/viewshe2.cxx b/sd/source/ui/view/viewshe2.cxx new file mode 100644 index 0000000000..b7ae44f2c3 --- /dev/null +++ b/sd/source/ui/view/viewshe2.cxx @@ -0,0 +1,949 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <com/sun/star/embed/EmbedVerbs.hpp> +#include <com/sun/star/embed/XEmbeddedObject.hpp> + +#include <ViewShell.hxx> +#include <ViewShellHint.hxx> + +#include <ViewShellImplementation.hxx> +#include <FactoryIds.hxx> + +#include <svx/svxids.hrc> +#include <svx/svdpagv.hxx> +#include <sfx2/dispatch.hxx> +#include <svx/ruler.hxx> +#include <editeng/outliner.hxx> +#include <svtools/ehdl.hxx> +#include <svx/svdoole2.hxx> +#include <svtools/sfxecode.hxx> +#include <unotools/moduleoptions.hxx> +#include <comphelper/classids.hxx> +#include <osl/diagnose.h> + +#include <strings.hrc> +#include <app.hrc> +#include <unokywds.hxx> + +#include <sdundogr.hxx> +#include <FrameView.hxx> +#include <sdresid.hxx> +#include <drawdoc.hxx> +#include <View.hxx> +#include <fupoor.hxx> +#include <Client.hxx> +#include <DrawDocShell.hxx> +#include <sdpage.hxx> +#include <DrawViewShell.hxx> +#include <ViewShellBase.hxx> + +#include <Window.hxx> + +#include <sfx2/viewfrm.hxx> +#include <svtools/soerr.hxx> +#include <svx/charthelper.hxx> +#include <comphelper/lok.hxx> + +using namespace com::sun::star; + +namespace sd { + +/** + * adjust Thumbpos and VisibleSize + */ +void ViewShell::UpdateScrollBars() +{ + if (mpHorizontalScrollBar) + { + ::tools::Long nW = static_cast<::tools::Long>(mpContentWindow->GetVisibleWidth() * 32000); + ::tools::Long nX = static_cast<::tools::Long>(mpContentWindow->GetVisibleX() * 32000); + mpHorizontalScrollBar->SetVisibleSize(nW); + mpHorizontalScrollBar->SetThumbPos(nX); + nW = 32000 - nW; + ::tools::Long nLine = static_cast<::tools::Long>(mpContentWindow->GetScrlLineWidth() * nW); + ::tools::Long nPage = static_cast<::tools::Long>(mpContentWindow->GetScrlPageWidth() * nW); + mpHorizontalScrollBar->SetLineSize(nLine); + mpHorizontalScrollBar->SetPageSize(nPage); + } + + if (mpVerticalScrollBar) + { + ::tools::Long nH = static_cast<::tools::Long>(mpContentWindow->GetVisibleHeight() * 32000); + ::tools::Long nY = static_cast<::tools::Long>(mpContentWindow->GetVisibleY() * 32000); + + if(IsPageFlipMode()) // ie in zoom mode where no panning + { + SdPage* pPage = static_cast<DrawViewShell*>(this)->GetActualPage(); + sal_uInt16 nCurPage = (pPage->GetPageNum() - 1) / 2; + sal_uInt16 nTotalPages = GetDoc()->GetSdPageCount(pPage->GetPageKind()); + mpVerticalScrollBar->SetRange(Range(0,256*nTotalPages)); + mpVerticalScrollBar->SetVisibleSize(256); + mpVerticalScrollBar->SetThumbPos(256*nCurPage); + mpVerticalScrollBar->SetLineSize(256); + mpVerticalScrollBar->SetPageSize(256); + } + else + { + mpVerticalScrollBar->SetRange(Range(0,32000)); + mpVerticalScrollBar->SetVisibleSize(nH); + mpVerticalScrollBar->SetThumbPos(nY); + nH = 32000 - nH; + ::tools::Long nLine = static_cast<::tools::Long>(mpContentWindow->GetScrlLineHeight() * nH); + ::tools::Long nPage = static_cast<::tools::Long>(mpContentWindow->GetScrlPageHeight() * nH); + mpVerticalScrollBar->SetLineSize(nLine); + mpVerticalScrollBar->SetPageSize(nPage); + } + } + + if (mbHasRulers) + { + UpdateHRuler(); + UpdateVRuler(); + } + +} +/** + * Handling for horizontal Scrollbars + */ +IMPL_LINK_NOARG(ViewShell, HScrollHdl, weld::Scrollbar&, void) +{ + VirtHScrollHdl(mpHorizontalScrollBar); +} + +/** + * virtual scroll handler for horizontal Scrollbars + */ +void ViewShell::VirtHScrollHdl(ScrollAdaptor* pHScroll) +{ + double fX = static_cast<double>(pHScroll->GetThumbPos()) / pHScroll->GetRange().Len(); + + // scroll all windows of the column + ::sd::View* pView = GetView(); + OutlinerView* pOLV = nullptr; + + if (pView) + pOLV = pView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->HideCursor(); + + mpContentWindow->SetVisibleXY(fX, -1); + + ::tools::Rectangle aVisArea = GetDocSh()->GetVisArea(ASPECT_CONTENT); + Point aVisAreaPos = GetActiveWindow()->PixelToLogic( Point(0,0) ); + aVisArea.SetPos(aVisAreaPos); + GetDocSh()->SetVisArea(aVisArea); + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } + + if (pOLV) + pOLV->ShowCursor(); + + if (mbHasRulers) + UpdateHRuler(); +} + +/** + * handling for vertical Scrollbars + */ +IMPL_LINK_NOARG(ViewShell, VScrollHdl, weld::Scrollbar&, void) +{ + VirtVScrollHdl(mpVerticalScrollBar); +} + +/** + * handling for vertical Scrollbars + */ +void ViewShell::VirtVScrollHdl(ScrollAdaptor* pVScroll) +{ + if(IsPageFlipMode()) + { + SdPage* pPage = static_cast<DrawViewShell*>(this)->GetActualPage(); + sal_uInt16 nCurPage = (pPage->GetPageNum() - 1) >> 1; + sal_uInt16 nNewPage = static_cast<sal_uInt16>(pVScroll->GetThumbPos())/256; + if( nCurPage != nNewPage ) + static_cast<DrawViewShell*>(this)->SwitchPage(nNewPage); + } + else //panning mode + { + double fY = static_cast<double>(pVScroll->GetThumbPos()) / pVScroll->GetRange().Len(); + + ::sd::View* pView = GetView(); + OutlinerView* pOLV = nullptr; + + if (pView) + pOLV = pView->GetTextEditOutlinerView(); + + if (pOLV) + pOLV->HideCursor(); + + mpContentWindow->SetVisibleXY(-1, fY); + + ::tools::Rectangle aVisArea = GetDocSh()->GetVisArea(ASPECT_CONTENT); + Point aVisAreaPos = GetActiveWindow()->PixelToLogic( Point(0,0) ); + aVisArea.SetPos(aVisAreaPos); + GetDocSh()->SetVisArea(aVisArea); + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } + + if (pOLV) + pOLV->ShowCursor(); + + if (mbHasRulers) + UpdateVRuler(); + + } +} + +VclPtr<SvxRuler> ViewShell::CreateHRuler(::sd::Window* ) +{ + return nullptr; +} + +VclPtr<SvxRuler> ViewShell::CreateVRuler(::sd::Window* ) +{ + return nullptr; +} + +void ViewShell::UpdateHRuler() +{ +} + +void ViewShell::UpdateVRuler() +{ +} + +/** + * Scroll a specific number of lines. Is used in the automatic scrolling + * (character/drag). + */ +void ViewShell::ScrollLines(::tools::Long nLinesX, ::tools::Long nLinesY) +{ + if ( nLinesX ) + { + nLinesX *= mpHorizontalScrollBar->GetLineSize(); + } + if ( nLinesY ) + { + nLinesY *= mpVerticalScrollBar->GetLineSize(); + } + + Scroll(nLinesX, nLinesY); +} + +void ViewShell::Scroll(::tools::Long nScrollX, ::tools::Long nScrollY) +{ + if (nScrollX) + { + ::tools::Long nNewThumb = mpHorizontalScrollBar->GetThumbPos() + nScrollX; + mpHorizontalScrollBar->SetThumbPos(nNewThumb); + } + if (nScrollY) + { + ::tools::Long nNewThumb = mpVerticalScrollBar->GetThumbPos() + nScrollY; + mpVerticalScrollBar->SetThumbPos(nNewThumb); + } + double fX = static_cast<double>(mpHorizontalScrollBar->GetThumbPos()) / + mpHorizontalScrollBar->GetRange().Len(); + double fY = static_cast<double>(mpVerticalScrollBar->GetThumbPos()) / + mpVerticalScrollBar->GetRange().Len(); + + GetActiveWindow()->SetVisibleXY(fX, fY); + + ::tools::Rectangle aVisArea = GetDocSh()->GetVisArea(ASPECT_CONTENT); + Point aVisAreaPos = GetActiveWindow()->PixelToLogic( Point(0,0) ); + aVisArea.SetPos(aVisAreaPos); + GetDocSh()->SetVisArea(aVisArea); + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + ::sd::View* pView = GetView(); + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } + + if (mbHasRulers) + { + UpdateHRuler(); + UpdateVRuler(); + } +} + +/** + * Set zoom factor for all split windows. + */ +void ViewShell::SetZoom(::tools::Long nZoom) +{ + Fraction aUIScale(nZoom, 100); + aUIScale *= GetDoc()->GetUIScale(); + + if (mpHorizontalRuler) + mpHorizontalRuler->SetZoom(aUIScale); + + if (mpVerticalRuler) + mpVerticalRuler->SetZoom(aUIScale); + + if (mpContentWindow) + { + mpContentWindow->SetZoomIntegral(nZoom); + + // #i74769# Here is a 2nd way (besides Window::Scroll) to set the visible prt + // of the window. It needs - like Scroll(ScrollFlags::Children) does - also to move + // the child windows. I am trying InvalidateFlags::Children here which makes things better, + // but does not solve the problem completely. Need to ask PL. + mpContentWindow->Invalidate(InvalidateFlags::Children); + } + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + ::sd::View* pView = GetView(); + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } + + UpdateScrollBars(); +} + +::tools::Long ViewShell::GetZoom() const +{ + if (mpContentWindow) + { + return mpContentWindow->GetZoom(); + } + + return 0; +} + +/** + * Set zoom rectangle for active window. Sets all split windows to the same zoom + * factor. + */ +void ViewShell::SetZoomRect(const ::tools::Rectangle& rZoomRect) +{ + ::tools::Long nZoom = GetActiveWindow()->SetZoomRect(rZoomRect); + Fraction aUIScale(nZoom, 100); + aUIScale *= GetDoc()->GetUIScale(); + + Point aPos = GetActiveWindow()->GetWinViewPos(); + + if (mpHorizontalRuler) + mpHorizontalRuler->SetZoom(aUIScale); + + if (mpVerticalRuler) + mpVerticalRuler->SetZoom(aUIScale); + + if (mpContentWindow) + { + Point aNewPos = mpContentWindow->GetWinViewPos(); + aNewPos.setX( aPos.X() ); + aNewPos.setY( aPos.Y() ); + mpContentWindow->SetZoomIntegral(nZoom); + mpContentWindow->SetWinViewPos(aNewPos); + mpContentWindow->UpdateMapOrigin(); + + // When tiled rendering, UpdateMapOrigin() doesn't touch the map mode. + if (!comphelper::LibreOfficeKit::isActive()) + // #i74769# see above + mpContentWindow->Invalidate(InvalidateFlags::Children); + } + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + ::sd::View* pView = GetView(); + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } + + UpdateScrollBars(); +} + +/** + * Initialize imaging parameters for all split windows. + */ +void ViewShell::InitWindows(const Point& rViewOrigin, const Size& rViewSize, + const Point& rWinPos, bool bUpdate) +{ + if (mpContentWindow) + { + mpContentWindow->SetViewOrigin(rViewOrigin); + mpContentWindow->SetViewSize(rViewSize); + mpContentWindow->SetWinViewPos(rWinPos); + + if ( bUpdate ) + { + mpContentWindow->UpdateMapOrigin(); + mpContentWindow->Invalidate(); + } + } + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + ::sd::View* pView = GetView(); + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } +} + +/** + * Invalidate all split windows below the ?provided rectangle. + */ +void ViewShell::InvalidateWindows() +{ + if (mpContentWindow) + mpContentWindow->Invalidate(); +} + +/** + * Draw a selection rectangle with the ?provided pen on all split windows. + */ +void ViewShell::DrawMarkRect(const ::tools::Rectangle& rRect) const +{ + if (mpContentWindow) + { + mpContentWindow->InvertTracking(rRect, ShowTrackFlags::Object | ShowTrackFlags::TrackWindow); + } +} + +void ViewShell::SetPageSizeAndBorder(PageKind ePageKind, const Size& rNewSize, + ::tools::Long nLeft, ::tools::Long nRight, + ::tools::Long nUpper, ::tools::Long nLower, bool bScaleAll, + Orientation eOrientation, sal_uInt16 nPaperBin, + bool bBackgroundFullSize) +{ + const sal_uInt16 nMasterPageCnt(GetDoc()->GetMasterSdPageCount(ePageKind)); + const sal_uInt16 nPageCnt(GetDoc()->GetSdPageCount(ePageKind)); + + if(0 == nPageCnt && 0 == nMasterPageCnt) + { + return; + } + + std::unique_ptr<SdUndoGroup> pUndoGroup; + SfxViewShell* pViewShell(GetViewShell()); + if (pViewShell) + { + pUndoGroup.reset(new SdUndoGroup(GetDoc())); + pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEFORMAT)); + } + Broadcast (ViewShellHint(ViewShellHint::HINT_PAGE_RESIZE_START)); + + // use Model-based method at SdDrawDocument + GetDoc()->AdaptPageSizeForAllPages( + rNewSize, + ePageKind, + pUndoGroup.get(), + nLeft, + nRight, + nUpper, + nLower, + bScaleAll, + eOrientation, + nPaperBin, + bBackgroundFullSize); + + // adjust handout page to new format of the standard page + if(0 != nPageCnt && ((ePageKind == PageKind::Standard) || (ePageKind == PageKind::Handout))) + { + GetDoc()->GetSdPage(0, PageKind::Handout)->CreateTitleAndLayout(true); + } + + // handed over undo group to undo manager + if (pViewShell) + { + pViewShell->GetViewFrame().GetObjectShell()->GetUndoManager()->AddUndoAction(std::move(pUndoGroup)); + } + + // calculate View-Sizes + SdPage* pPage(0 != nPageCnt + ? GetDoc()->GetSdPage(0, ePageKind) + : GetDoc()->GetMasterSdPage(0, ePageKind)); + const ::tools::Long nWidth(pPage->GetSize().Width()); + const ::tools::Long nHeight(pPage->GetSize().Height()); + const Point aPageOrg(nWidth, nHeight / 2); + const Size aViewSize(nWidth * 3, nHeight * 2); + Point aVisAreaPos; + ::sd::View* pView(GetView()); + const Point aNewOrigin(pPage->GetLeftBorder(), pPage->GetUpperBorder()); + + InitWindows(aPageOrg, aViewSize, Point(-1, -1), true); + + if ( GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED ) + { + aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft(); + } + + if (pView) + { + pView->SetWorkArea(::tools::Rectangle(Point() - aVisAreaPos - aPageOrg, aViewSize)); + } + + UpdateScrollBars(); + + if (pView) + { + pView->GetSdrPageView()->SetPageOrigin(aNewOrigin); + } + + if(nullptr != pViewShell) + { + pViewShell->GetViewFrame().GetBindings().Invalidate(SID_RULER_NULL_OFFSET); + // zoom onto (new) page size + pViewShell->GetViewFrame().GetDispatcher()->Execute(SID_SIZE_PAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); + } + + Broadcast(ViewShellHint(ViewShellHint::HINT_PAGE_RESIZE_END)); +} + +/** + * Set zoom factor for InPlace + */ +void ViewShell::SetZoomFactor(const Fraction& rZoomX, const Fraction&) +{ + ::tools::Long nZoom = static_cast<::tools::Long>(static_cast<double>(rZoomX) * 100); + SetZoom(nZoom); +} + +void ViewShell::SetActiveWindow (::sd::Window* pWin) +{ + SfxViewShell* pViewShell = GetViewShell(); + OSL_ASSERT (pViewShell!=nullptr); + + if (pViewShell->GetWindow() != pWin) + { + // #i31551# was wrong, it may have been a problem with the repaint at that time. + // For transparent form controls, it is necessary to have that flag set, all apps + // do set it. Enabling again. + if (pWin) + { + pWin->EnableChildTransparentMode(); + } + } + + if (mpActiveWindow.get() != pWin) + mpActiveWindow = pWin; + + // The rest of this function is not guarded anymore against calling this + // method with an already active window because the functions may still + // point to the old window when the new one has already been assigned to + // pWindow elsewhere. + ::sd::View* pView = GetView(); + if (pView) + { + pView->SetActualWin(pWin->GetOutDev()); + } + if(HasCurrentFunction()) + { + GetCurrentFunction()->SetWindow(pWin); + } +} + +bool ViewShell::RequestHelp(const HelpEvent& rHEvt) +{ + bool bReturn = false; + + if (bool(rHEvt.GetMode())) + { + if(HasCurrentFunction()) + { + bReturn = GetCurrentFunction()->RequestHelp(rHEvt); + } + } + + return bReturn; +} + +void ViewShell::SetFrameView (FrameView* pNewFrameView) +{ + mpFrameView = pNewFrameView; + ReadFrameViewData (mpFrameView); +} + +/************************************************************************* +|* +|* Read FrameViews data and set actual views data +|* +\************************************************************************/ + +void ViewShell::ReadFrameViewData(FrameView*) +{ +} + +/************************************************************************* +|* +|* Write actual views data to FrameView +|* +\************************************************************************/ + +void ViewShell::WriteFrameViewData() +{ +} + +bool ViewShell::ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb) +{ + ErrCode aErrCode = ERRCODE_NONE; + + SfxErrorContext aEC(ERRCTX_SO_DOVERB, GetFrameWeld(), RID_SO_ERRCTX); + bool bAbort = false; + GetDocSh()->SetWaitCursor( true ); + SfxViewShell* pViewShell = GetViewShell(); + OSL_ASSERT (pViewShell!=nullptr); + bool bChangeDefaultsForChart = false; + + uno::Reference < embed::XEmbeddedObject > xObj = pObj->GetObjRef(); + if ( !xObj.is() ) + { + // provide OLE object to empty OLE object + OUString aName = pObj->GetProgName(); + OUString aObjName; + SvGlobalName aClass; + + if( aName == "StarChart" || aName == "StarOrg" ) + { + if( SvtModuleOptions().IsChart() ) + { + aClass = SvGlobalName( SO3_SCH_CLASSID ); + bChangeDefaultsForChart = true; + } + } + else if( aName == "StarCalc" ) + { + if( SvtModuleOptions().IsCalc() ) + aClass = SvGlobalName( SO3_SC_CLASSID ); + } + else if( aName == "StarMath" ) + { + if( SvtModuleOptions().IsMath() ) + aClass = SvGlobalName( SO3_SM_CLASSID ); + } + + if ( aClass != SvGlobalName() ) + xObj = GetDocSh()->GetEmbeddedObjectContainer().CreateEmbeddedObject( aClass.GetByteSequence(), aObjName ); + + if( !xObj.is() ) + { + aName.clear(); + + // call dialog "insert OLE object" + GetDocSh()->SetWaitCursor( false ); + pViewShell->GetViewFrame().GetDispatcher()->Execute( + SID_INSERT_OBJECT, + SfxCallMode::SYNCHRON | SfxCallMode::RECORD); + xObj = pObj->GetObjRef(); + GetDocSh()->SetWaitCursor( true ); + + if (!xObj.is()) + { + bAbort = true; + } + } + + if ( xObj.is() ) + { + // OLE object is no longer empty + pObj->SetEmptyPresObj(false); + pObj->SetOutlinerParaObject(std::nullopt); + pObj->ClearGraphic(); + + // the empty OLE object gets a new IPObj + if (!aName.isEmpty()) + { + pObj->SetObjRef(xObj); + pObj->SetName(aObjName); + pObj->SetPersistName(aObjName); + } + else + { + // insertion was done by the dialog + pObj->SetObjRef(xObj); + } + + ::tools::Rectangle aRect = pObj->GetLogicRect(); + + if ( pObj->GetAspect() != embed::Aspects::MSOLE_ICON ) + { + awt::Size aSz; + aSz.Width = aRect.GetWidth(); + aSz.Height = aRect.GetHeight(); + xObj->setVisualAreaSize( pObj->GetAspect(), aSz ); + } + + GetViewShellBase().SetVerbs( xObj->getSupportedVerbs() ); + + nVerb = embed::EmbedVerbs::MS_OLEVERB_SHOW; + } + else + { + aErrCode = ERRCODE_SFX_OLEGENERAL; + } + } + + if( aErrCode == ERRCODE_NONE ) + { + ::sd::View* pView = GetView(); + + if (pView->IsTextEdit()) + { + pView->SdrEndTextEdit(); + } + + SfxInPlaceClient* pSdClient = + pViewShell->FindIPClient(pObj->GetObjRef(), GetActiveWindow()); + + if ( !pSdClient ) + { + pSdClient = new Client(pObj, this, GetActiveWindow()); + } + + ::tools::Rectangle aRect = pObj->GetLogicRect(); + + { + // #i118485# center on BoundRect for activation, + // OLE may be sheared/rotated now + const ::tools::Rectangle& rBoundRect = pObj->GetCurrentBoundRect(); + const Point aDelta(rBoundRect.Center() - aRect.Center()); + aRect.Move(aDelta.X(), aDelta.Y()); + } + + Size aDrawSize = aRect.GetSize(); + + MapMode aMapMode( GetDoc()->GetScaleUnit() ); + Size aObjAreaSize = pObj->GetOrigObjSize( &aMapMode ); + if( pObj->IsChart() ) //charts never should be stretched see #i84323# for example + aObjAreaSize = aDrawSize; + + Fraction aScaleWidth (aDrawSize.Width(), aObjAreaSize.Width() ); + Fraction aScaleHeight(aDrawSize.Height(), aObjAreaSize.Height() ); + aScaleWidth.ReduceInaccurate(10); // compatible to the SdrOle2Obj + aScaleHeight.ReduceInaccurate(10); + pSdClient->SetSizeScale(aScaleWidth, aScaleHeight); + + // visible section is only changed in-place! + aRect.SetSize(aObjAreaSize); + // the object area size must be set after scaling, since it triggers the resizing + pSdClient->SetObjArea(aRect); + + if( bChangeDefaultsForChart && xObj.is()) + { + ChartHelper::AdaptDefaultsForChart( xObj ); + } + + pSdClient->DoVerb(nVerb); // if necessary, ErrCode is outputted by Sfx + pViewShell->GetViewFrame().GetBindings().Invalidate( + SID_NAVIGATOR_STATE, true); + } + + GetDocSh()->SetWaitCursor( false ); + + if (aErrCode != ERRCODE_NONE && !bAbort) + { + ErrorHandler::HandleError(ErrCodeMsg(aErrCode)); + } + + return aErrCode == ERRCODE_NONE; +} + +/** + * @returns enclosing rectangle of all (split-) windows. + */ +const ::tools::Rectangle& ViewShell::GetAllWindowRect() +{ + maAllWindowRectangle.SetPos( + mpContentWindow->OutputToScreenPixel(Point(0,0))); + return maAllWindowRectangle; +} + +void ViewShell::ReadUserData() +{ + // zoom onto VisArea from FrameView + GetViewShell()->GetViewFrame().GetDispatcher()->Execute(SID_SIZE_VISAREA, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD); +} + +void ViewShell::WriteUserData() +{ + // writing of our data is always done in WriteFrameViewData() + WriteFrameViewData(); +} + +/** + * Switch ruler on/off + */ +void ViewShell::SetRuler(bool bRuler) +{ + mbHasRulers = ( bRuler && !GetDocSh()->IsPreview() ); // no rulers on preview mode + + if (mpHorizontalRuler) + { + if (mbHasRulers) + { + mpHorizontalRuler->Show(); + } + else + { + mpHorizontalRuler->Hide(); + } + } + + if (mpVerticalRuler) + { + if (mbHasRulers) + { + mpVerticalRuler->Show(); + } + else + { + mpVerticalRuler->Hide(); + } + } + + OSL_ASSERT(GetViewShell()!=nullptr); + if (IsMainViewShell()) + GetViewShell()->InvalidateBorder(); +} + +void ViewShell::SetScrollBarsVisible(bool bVisible) +{ + if (mpVerticalScrollBar) + mpVerticalScrollBar->Show( bVisible ); + + if (mpHorizontalScrollBar) + mpHorizontalScrollBar->Show( bVisible ); +} + +sal_Int8 ViewShell::AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* /*pTargetWindow*/, + sal_uInt16 /*nPage*/, + SdrLayerID nLayer) +{ + ::sd::View* pView = GetView(); + return( pView ? pView->AcceptDrop( rEvt, rTargetHelper, nLayer ) : DND_ACTION_NONE ); +} + +sal_Int8 ViewShell::ExecuteDrop ( + const ExecuteDropEvent& rEvt, + DropTargetHelper& /*rTargetHelper*/, + ::sd::Window* pTargetWindow, + sal_uInt16 nPage, + SdrLayerID nLayer) +{ + ::sd::View* pView = GetView(); + return pView ? pView->ExecuteDrop( rEvt, pTargetWindow, nPage, nLayer ) : DND_ACTION_NONE; +} + +void ViewShell::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + const sal_Int32 nIndex = rSequence.getLength(); + rSequence.realloc( nIndex + 1 ); + auto pSequence = rSequence.getArray(); + + OSL_ASSERT (GetViewShell()!=nullptr); + // Get the view id from the view shell in the center pane. This will + // usually be the called view shell, but to be on the safe side we call + // the main view shell explicitly. + SfxInterfaceId nViewID (IMPRESS_FACTORY_ID); + if (GetViewShellBase().GetMainViewShell() != nullptr) + nViewID = GetViewShellBase().GetMainViewShell()->mpImpl->GetViewId(); + pSequence[nIndex].Name = sUNO_View_ViewId; + pSequence[nIndex].Value <<= "view" + OUString::number( static_cast<sal_uInt16>(nViewID)); + + mpFrameView->WriteUserDataSequence( rSequence ); +} + +void ViewShell::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence ) +{ + mpFrameView->ReadUserDataSequence( rSequence ); +} + +void ViewShell::VisAreaChanged(const ::tools::Rectangle& /*rRect*/) +{ + OSL_ASSERT (GetViewShell()!=nullptr); + GetViewShell()->VisAreaChanged(); +} + +void ViewShell::SetWinViewPos(const Point& rWinPos) +{ + if (mpContentWindow) + { + mpContentWindow->SetWinViewPos(rWinPos); + + mpContentWindow->UpdateMapOrigin(); + mpContentWindow->Invalidate(); + } + + if (mbHasRulers) + { + UpdateHRuler(); + UpdateVRuler(); + } + + UpdateScrollBars(); + + Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel(); + ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) ); + VisAreaChanged(aVisAreaWin); + + ::sd::View* pView = GetView(); + if (pView) + { + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); + } +} + +Point const & ViewShell::GetWinViewPos() const +{ + return mpContentWindow->GetWinViewPos(); +} + +Point const & ViewShell::GetViewOrigin() const +{ + return mpContentWindow->GetViewOrigin(); +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/viewshe3.cxx b/sd/source/ui/view/viewshe3.cxx new file mode 100644 index 0000000000..cb76eaf998 --- /dev/null +++ b/sd/source/ui/view/viewshe3.cxx @@ -0,0 +1,386 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <config_features.h> + +#include <ViewShell.hxx> +#include <ViewShellBase.hxx> + +#include <sfx2/viewfrm.hxx> +#include <svtools/strings.hrc> +#include <svtools/svtresid.hxx> + +#include <app.hrc> +#include <strings.hrc> + +#include <sal/log.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/bindings.hxx> +#include <svx/svdundo.hxx> +#include <svl/intitem.hxx> +#include <svl/style.hxx> +#include <svl/stritem.hxx> +#include <stlsheet.hxx> +#include <DrawViewShell.hxx> + +#include <drawdoc.hxx> +#include <sdpage.hxx> +#include <DrawDocShell.hxx> +#include <sdresid.hxx> +#include <unokywds.hxx> + +#include <svx/svxids.hrc> +#include <sfx2/request.hxx> +#include <basic/sbstar.hxx> +#include <basic/sberrors.hxx> +#include <xmloff/autolayout.hxx> + +using namespace ::com::sun::star; + +namespace sd { + +/** + * set state (enabled/disabled) of Menu SfxSlots + */ +void ViewShell::GetMenuState( SfxItemSet &rSet ) +{ + if( SfxItemState::DEFAULT == rSet.GetItemState( SID_STYLE_FAMILY ) ) + { + SfxStyleFamily const nFamily = GetDocSh()->GetStyleFamily(); + + SdrView* pDrView = GetDrawView(); + + if( pDrView->AreObjectsMarked() ) + { + SfxStyleSheet* pStyleSheet = pDrView->GetStyleSheet(); + if( pStyleSheet ) + { + if (pStyleSheet->GetFamily() == SfxStyleFamily::Page) + pStyleSheet = static_cast<SdStyleSheet*>(pStyleSheet)->GetPseudoStyleSheet(); + + if( pStyleSheet ) + { + GetDocSh()->SetStyleFamily(pStyleSheet->GetFamily()); + } + } + } + + rSet.Put(SfxUInt16Item(SID_STYLE_FAMILY, static_cast<sal_uInt16>(nFamily))); + } + + if(SfxItemState::DEFAULT == rSet.GetItemState(SID_GETUNDOSTRINGS)) + { + ImpGetUndoStrings(rSet); + } + + if(SfxItemState::DEFAULT == rSet.GetItemState(SID_GETREDOSTRINGS)) + { + ImpGetRedoStrings(rSet); + } + + if(SfxItemState::DEFAULT == rSet.GetItemState(SID_UNDO)) + { + SfxUndoManager* pUndoManager = ImpGetUndoManager(); + if(pUndoManager) + { + if(pUndoManager->GetUndoActionCount() != 0) + { + // If another view created the first undo action, prevent redoing it from this view. + const SfxUndoAction* pAction = pUndoManager->GetUndoAction(); + if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId()) + { + rSet.Put(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + } + else + { + // Set the necessary string like in + // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1072 ff. + OUString aTmp = SvtResId(STR_UNDO) + + pUndoManager->GetUndoActionComment(); + rSet.Put(SfxStringItem(SID_UNDO, aTmp)); + } + } + else + { + rSet.DisableItem(SID_UNDO); + } + } + } + + if(SfxItemState::DEFAULT != rSet.GetItemState(SID_REDO)) + return; + + SfxUndoManager* pUndoManager = ImpGetUndoManager(); + if(!pUndoManager) + return; + + if(pUndoManager->GetRedoActionCount() != 0) + { + // If another view created the first undo action, prevent redoing it from this view. + const SfxUndoAction* pAction = pUndoManager->GetRedoAction(); + if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId()) + { + rSet.Put(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + } + else + { + // Set the necessary string like in + // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1081 ff. + OUString aTmp = SvtResId(STR_REDO) + pUndoManager->GetRedoActionComment(); + rSet.Put(SfxStringItem(SID_REDO, aTmp)); + } + } + else + { + rSet.DisableItem(SID_REDO); + } +} + +/** This method consists basically of three parts: + 1. Process the arguments of the SFX request. + 2. Use the model to create a new page or duplicate an existing one. + 3. Update the tab control and switch to the new page. +*/ +SdPage* ViewShell::CreateOrDuplicatePage ( + SfxRequest& rRequest, + PageKind ePageKind, + SdPage* pPage, + const sal_Int32 nInsertPosition) +{ + sal_uInt16 nSId = rRequest.GetSlot(); + SdDrawDocument* pDocument = GetDoc(); + SdrLayerAdmin& rLayerAdmin = pDocument->GetLayerAdmin(); + SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background); + SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects); + SdrLayerIDSet aVisibleLayers; + // Determine the page from which to copy some values, such as layers, + // size, master page, to the new page. This is usually the given page. + // When the given page is NULL then use the first page of the document. + SdPage* pTemplatePage = pPage; + if (pTemplatePage == nullptr) + pTemplatePage = pDocument->GetSdPage(0, ePageKind); + if (pTemplatePage != nullptr && pTemplatePage->TRG_HasMasterPage()) + aVisibleLayers = pTemplatePage->TRG_GetMasterPageVisibleLayers(); + else + aVisibleLayers.SetAll(); + + OUString aStandardPageName; + OUString aNotesPageName; + AutoLayout eStandardLayout (AUTOLAYOUT_NONE); + AutoLayout eNotesLayout (AUTOLAYOUT_NOTES); + bool bIsPageBack = aVisibleLayers.IsSet(aBckgrnd); + bool bIsPageObj = aVisibleLayers.IsSet(aBckgrndObj); + + // 1. Process the arguments. + const SfxItemSet* pArgs = rRequest.GetArgs(); + const SfxUInt16Item* pInsertPos = rRequest.GetArg<SfxUInt16Item>(ID_INSERT_POS); + + if (! pArgs || (pArgs->Count() == 1 && pInsertPos)) + { + // AutoLayouts must be ready + pDocument->StopWorkStartupDelay(); + + // Use the layouts of the previous page and notes page as template. + if (pTemplatePage != nullptr) + { + eStandardLayout = pTemplatePage->GetAutoLayout(); + if( eStandardLayout == AUTOLAYOUT_TITLE ) + eStandardLayout = AUTOLAYOUT_TITLE_CONTENT; + + SdPage* pNotesTemplatePage = static_cast<SdPage*>(pDocument->GetPage(pTemplatePage->GetPageNum()+1)); + if (pNotesTemplatePage != nullptr) + eNotesLayout = pNotesTemplatePage->GetAutoLayout(); + } + } + else if (pArgs->Count() == 1 || pArgs->Count() == 2) + { + pDocument->StopWorkStartupDelay(); + const SfxUInt32Item* pLayout = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYOUT); + if( pLayout ) + { + if (ePageKind == PageKind::Notes) + { + eNotesLayout = static_cast<AutoLayout>(pLayout->GetValue ()); + } + else + { + eStandardLayout = static_cast<AutoLayout>(pLayout->GetValue ()); + } + } + } + else if (pArgs->Count() == 4 || pArgs->Count() == 5) + { + // AutoLayouts must be ready + pDocument->StopWorkStartupDelay(); + + const SfxStringItem* pPageName = rRequest.GetArg<SfxStringItem>(ID_VAL_PAGENAME); + const SfxUInt32Item* pLayout = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYOUT); + const SfxBoolItem* pIsPageBack = rRequest.GetArg<SfxBoolItem>(ID_VAL_ISPAGEBACK); + const SfxBoolItem* pIsPageObj = rRequest.GetArg<SfxBoolItem>(ID_VAL_ISPAGEOBJ); + assert(pPageName && pLayout && pIsPageBack && pIsPageObj && "must be present"); + + if (CHECK_RANGE (AUTOLAYOUT_START, static_cast<AutoLayout>(pLayout->GetValue ()), AUTOLAYOUT_END)) + { + if (ePageKind == PageKind::Notes) + { + aNotesPageName = pPageName->GetValue (); + eNotesLayout = static_cast<AutoLayout>(pLayout->GetValue ()); + } + else + { + aStandardPageName = pPageName->GetValue (); + eStandardLayout = static_cast<AutoLayout>(pLayout->GetValue ()); + } + + bIsPageBack = pIsPageBack->GetValue (); + bIsPageObj = pIsPageObj->GetValue (); + } + else + { + Cancel(); + + if(HasCurrentFunction( SID_BEZIER_EDIT ) ) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE); +#endif + rRequest.Ignore (); + return nullptr; + } + } + else + { + Cancel(); + + if(HasCurrentFunction(SID_BEZIER_EDIT) ) + GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON); +#if HAVE_FEATURE_SCRIPTING + StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS); +#endif + rRequest.Ignore (); + return nullptr; + } + + // 2. Create a new page or duplicate an existing one. + View* pDrView = GetView(); + const bool bUndo = pDrView && pDrView->IsUndoEnabled(); + if( bUndo && GetDoc()->GetDocumentType() == DocumentType::Draw) + pDrView->BegUndo(SdResId(STR_INSERT_PAGE_DRAW)); + else if (bUndo) + pDrView->BegUndo(SdResId(STR_INSERTPAGE)); + + + + sal_uInt16 nNewPageIndex = 0xffff; + switch (nSId) + { + case SID_INSERTPAGE: + case SID_INSERTPAGE_QUICK: + case SID_INSERT_MASTER_PAGE: + // There are three cases. a) pPage is not NULL: we use it as a + // template and create a new slide behind it. b) pPage is NULL + // but the document is not empty: we use the first slide/notes + // page as template, create a new slide after it and move it + // then to the head of the document. c) pPage is NULL and the + // document is empty: We use CreateFirstPages to create the + // first page of the document. + if (pPage == nullptr) + if (pTemplatePage == nullptr) + { + pDocument->CreateFirstPages(); + nNewPageIndex = 0; + } + else + { + // Create a new page with the first page as template and + // insert it after the first page. + nNewPageIndex = pDocument->CreatePage ( + pTemplatePage, + ePageKind, + aStandardPageName, + aNotesPageName, + eStandardLayout, + eNotesLayout, + bIsPageBack, + bIsPageObj, + nInsertPosition); + // Select exactly the new page. + sal_uInt16 nPageCount (pDocument->GetSdPageCount(ePageKind)); + for (sal_uInt16 i=0; i<nPageCount; i++) + { + pDocument->GetSdPage(i, PageKind::Standard)->SetSelected( + i == nNewPageIndex); + pDocument->GetSdPage(i, PageKind::Notes)->SetSelected( + i == nNewPageIndex); + } + // Move the selected page to the head of the document + pDocument->MovePages (sal_uInt16(-1)); + nNewPageIndex = 0; + } + else + nNewPageIndex = pDocument->CreatePage ( + pPage, + ePageKind, + aStandardPageName, + aNotesPageName, + eStandardLayout, + eNotesLayout, + bIsPageBack, + bIsPageObj, + nInsertPosition); + break; + + case SID_DUPLICATE_PAGE: + // Duplication makes no sense when pPage is NULL. + if (pPage != nullptr) + nNewPageIndex = pDocument->DuplicatePage ( + pPage, + ePageKind, + aStandardPageName, + aNotesPageName, + bIsPageBack, + bIsPageObj, + pInsertPos ? (pInsertPos->GetValue()*2)+1 : nInsertPosition); + break; + + default: + SAL_INFO("sd", "wrong slot id given to CreateOrDuplicatePage"); + // Try to handle another slot id gracefully. + } + SdPage* pNewPage = nullptr; + if(nNewPageIndex != 0xffff) + pNewPage = pDocument->GetSdPage(nNewPageIndex, PageKind::Standard); + + if( bUndo ) + { + if( pNewPage ) + { + pDrView->AddUndo(pDocument->GetSdrUndoFactory().CreateUndoNewPage(*pNewPage)); + pDrView->AddUndo(pDocument->GetSdrUndoFactory().CreateUndoNewPage(*pDocument->GetSdPage (nNewPageIndex, PageKind::Notes))); + } + + pDrView->EndUndo(); + } + + return pNewPage; +} + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/viewshel.cxx b/sd/source/ui/view/viewshel.cxx new file mode 100644 index 0000000000..09c1f95102 --- /dev/null +++ b/sd/source/ui/view/viewshel.cxx @@ -0,0 +1,1659 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <memory> +#include <ViewShell.hxx> +#include <ViewShellImplementation.hxx> +#include <createtableobjectbar.hxx> + +#include <ViewShellBase.hxx> +#include <ShellFactory.hxx> +#include <DrawController.hxx> +#include <LayerTabBar.hxx> +#include <Outliner.hxx> + +#include <sal/log.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> +#include <vcl/commandevent.hxx> +#include <svl/eitem.hxx> +#include <svx/ruler.hxx> +#include <svx/svxids.hrc> +#include <svx/fmshell.hxx> +#include <WindowUpdater.hxx> +#include <sdxfer.hxx> + +#include <app.hrc> + +#include <OutlineView.hxx> +#include <DrawViewShell.hxx> +#include <DrawDocShell.hxx> +#include <slideshow.hxx> +#include <drawdoc.hxx> +#include <sdpage.hxx> +#include <zoomlist.hxx> +#include <FrameView.hxx> +#include <BezierObjectBar.hxx> +#include <TextObjectBar.hxx> +#include <GraphicObjectBar.hxx> +#include <MediaObjectBar.hxx> +#include <SlideSorter.hxx> +#include <SlideSorterViewShell.hxx> +#include <ViewShellManager.hxx> +#include <FormShellManager.hxx> +#include <svx/extrusionbar.hxx> +#include <svx/fontworkbar.hxx> +#include <svx/svdoutl.hxx> +#include <tools/svborder.hxx> +#include <comphelper/lok.hxx> + +#include <svl/slstitm.hxx> +#include <sfx2/request.hxx> +#include <SpellDialogChildWindow.hxx> +#include <controller/SlideSorterController.hxx> +#include <controller/SlsPageSelector.hxx> +#include <controller/SlsSelectionObserver.hxx> +#include <view/SlideSorterView.hxx> + +#include <basegfx/utils/zoomtools.hxx> + +#include <Window.hxx> +#include <fupoor.hxx> +#include <futext.hxx> + +#include <editeng/numitem.hxx> +#include <editeng/eeitem.hxx> +#include <editeng/editview.hxx> +#include <editeng/editeng.hxx> +#include <editeng/editund2.hxx> +#include <svl/itempool.hxx> +#include <svl/intitem.hxx> +#include <svl/poolitem.hxx> +#include <strings.hxx> +#include <sdmod.hxx> +#include <AccessibleDocumentViewBase.hxx> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::presentation; + +namespace { + +class ViewShellObjectBarFactory + : public ::sd::ShellFactory<SfxShell> +{ +public: + explicit ViewShellObjectBarFactory (::sd::ViewShell& rViewShell); + virtual SfxShell* CreateShell( ::sd::ShellId nId ) override; + virtual void ReleaseShell (SfxShell* pShell) override; +private: + ::sd::ViewShell& mrViewShell; +}; + +} // end of anonymous namespace + +namespace sd { + +bool ViewShell::IsPageFlipMode() const +{ + return dynamic_cast< const DrawViewShell *>( this ) != nullptr && mpContentWindow && + mpContentWindow->GetVisibleHeight() >= 1.0; +} + +SfxViewFrame* ViewShell::GetViewFrame() const +{ + const SfxViewShell* pViewShell = GetViewShell(); + if (pViewShell != nullptr) + { + return &pViewShell->GetViewFrame(); + } + else + { + OSL_ASSERT (GetViewShell()!=nullptr); + return nullptr; + } +} + +/// declare SFX-Slotmap and standard interface + +ViewShell::ViewShell( vcl::Window* pParentWindow, ViewShellBase& rViewShellBase) +: SfxShell(&rViewShellBase) +, mpParentWindow(pParentWindow) +{ + construct(); +} + +ViewShell::~ViewShell() +{ + // Keep the content window from accessing in its destructor the + // WindowUpdater. + if (mpContentWindow) + suppress_fun_call_w_exception(mpContentWindow->SetViewShell(nullptr)); + + mpZoomList.reset(); + + mpLayerTabBar.disposeAndClear(); + + if (mpImpl->mpSubShellFactory) + GetViewShellBase().GetViewShellManager()->RemoveSubShellFactory( + this,mpImpl->mpSubShellFactory); + + if (mpContentWindow) + { + SAL_INFO( + "sd.view", + "destroying mpContentWindow at " << mpContentWindow.get() + << " with parent " << mpContentWindow->GetParent()); + mpContentWindow.disposeAndClear(); + } + + mpVerticalRuler.disposeAndClear(); + mpHorizontalRuler.disposeAndClear(); + mpVerticalScrollBar.disposeAndClear(); + mpHorizontalScrollBar.disposeAndClear(); +} + +/** + * common initialization part of both constructors + */ +void ViewShell::construct() +{ + mbHasRulers = false; + mpActiveWindow = nullptr; + mpView = nullptr; + mpFrameView = nullptr; + mpZoomList = nullptr; + mfLastZoomScale = 0; + mbStartShowWithDialog = false; + mnPrintedHandoutPageNum = 1; + mnPrintedHandoutPageCount = 0; + mpWindowUpdater.reset( new ::sd::WindowUpdater() ); + mpImpl.reset(new Implementation(*this)); + meShellType = ST_NONE; + + OSL_ASSERT (GetViewShell()!=nullptr); + + if (IsMainViewShell()) + GetDocSh()->Connect (this); + + mpZoomList.reset( new ZoomList( this ) ); + + mpContentWindow.reset(VclPtr< ::sd::Window >::Create(GetParentWindow())); + SetActiveWindow (mpContentWindow.get()); + + GetParentWindow()->SetBackground(Application::GetSettings().GetStyleSettings().GetFaceColor()); + mpContentWindow->SetBackground (Wallpaper()); + mpContentWindow->SetCenterAllowed(true); + mpContentWindow->SetViewShell(this); + mpContentWindow->SetPosSizePixel( + GetParentWindow()->GetPosPixel(),GetParentWindow()->GetSizePixel()); + + if ( ! GetDocSh()->IsPreview()) + { + // Create scroll bars and the filler between the scroll bars. + mpHorizontalScrollBar.reset (VclPtr<ScrollAdaptor>::Create(GetParentWindow(), true)); + mpHorizontalScrollBar->EnableRTL (false); + mpHorizontalScrollBar->SetRange(Range(0, 32000)); + mpHorizontalScrollBar->SetScrollHdl(LINK(this, ViewShell, HScrollHdl)); + + mpVerticalScrollBar.reset (VclPtr<ScrollAdaptor>::Create(GetParentWindow(), false)); + mpVerticalScrollBar->SetRange(Range(0, 32000)); + mpVerticalScrollBar->SetScrollHdl(LINK(this, ViewShell, VScrollHdl)); + } + + SetName ("ViewShell"); + + GetDoc()->StartOnlineSpelling(false); + + mpWindowUpdater->SetDocument (GetDoc()); + + // Re-initialize the spell dialog. + ::sd::SpellDialogChildWindow* pSpellDialog = + static_cast< ::sd::SpellDialogChildWindow*> ( + GetViewFrame()->GetChildWindow ( + ::sd::SpellDialogChildWindow::GetChildWindowId())); + if (pSpellDialog != nullptr) + pSpellDialog->InvalidateSpellDialog(); + + // Register the sub shell factory. + mpImpl->mpSubShellFactory = std::make_shared<ViewShellObjectBarFactory>(*this); + GetViewShellBase().GetViewShellManager()->AddSubShellFactory(this,mpImpl->mpSubShellFactory); +} + +void ViewShell::doShow() +{ + mpContentWindow->Show(); + static_cast< vcl::Window*>(mpContentWindow.get())->Resize(); + SAL_INFO( + "sd.view", + "content window has size " << mpContentWindow->GetSizePixel().Width() + << " " << mpContentWindow->GetSizePixel().Height()); + + if ( ! GetDocSh()->IsPreview()) + { + // Show scroll bars + mpHorizontalScrollBar->Show(); + + mpVerticalScrollBar->Show(); + maScrBarWH = Size( + mpVerticalScrollBar->GetSizePixel().Width(), + mpHorizontalScrollBar->GetSizePixel().Height()); + } + + GetParentWindow()->Show(); +} + +void ViewShell::Init (bool bIsMainViewShell) +{ + mpImpl->mbIsInitialized = true; + SetIsMainViewShell(bIsMainViewShell); + if (bIsMainViewShell) + SetActiveWindow (mpContentWindow.get()); +} + +void ViewShell::Exit() +{ + sd::View* pView = GetView(); + if (pView!=nullptr && pView->IsTextEdit()) + { + pView->SdrEndTextEdit(); + pView->UnmarkAll(); + } + + Deactivate (true); + + if (IsMainViewShell()) + GetDocSh()->Disconnect(this); + + SetIsMainViewShell(false); +} + +/** + * set focus to working window + */ +void ViewShell::Activate(bool bIsMDIActivate) +{ + // Do not forward to SfxShell::Activate() + + /* According to MI, nobody is allowed to call GrabFocus, who does not + exactly know from which window the focus is grabbed. Since Activate() + is sent sometimes asynchronous, it can happen, that the wrong window + gets the focus. */ + + if (mpHorizontalRuler) + mpHorizontalRuler->SetActive(); + if (mpVerticalRuler) + mpVerticalRuler->SetActive(); + + if (bIsMDIActivate) + { + // thus, the Navigator will also get a current status + SfxBoolItem aItem( SID_NAVIGATOR_INIT, true ); + if (GetDispatcher() != nullptr) + GetDispatcher()->ExecuteList( + SID_NAVIGATOR_INIT, + SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, + { &aItem }); + + SfxViewShell* pViewShell = GetViewShell(); + OSL_ASSERT (pViewShell!=nullptr); + SfxBindings& rBindings = pViewShell->GetViewFrame().GetBindings(); + rBindings.Invalidate( SID_3D_STATE, true ); + + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if (xSlideShow.is() && xSlideShow->isRunning()) + { + bool bSuccess = xSlideShow->activate(GetViewShellBase()); + assert(bSuccess && "can only return false with a PresentationViewShell"); (void)bSuccess; + } + + if(HasCurrentFunction()) + GetCurrentFunction()->Activate(); + + if(!GetDocSh()->IsUIActive()) + UpdatePreview( GetActualPage() ); + } + + ReadFrameViewData( mpFrameView ); + + if (IsMainViewShell()) + GetDocSh()->Connect(this); +} + +void ViewShell::UIActivating( SfxInPlaceClient* ) +{ + OSL_ASSERT (GetViewShell()!=nullptr); + GetViewShellBase().GetToolBarManager()->ToolBarsDestroyed(); +} + +void ViewShell::UIDeactivated( SfxInPlaceClient* ) +{ + OSL_ASSERT (GetViewShell()!=nullptr); + GetViewShellBase().GetToolBarManager()->ToolBarsDestroyed(); + if ( GetDrawView() ) + GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this, *GetDrawView()); +} + +void ViewShell::Deactivate(bool bIsMDIActivate) +{ + // remove view from a still active drag'n'drop session + SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; + + if (IsMainViewShell()) + GetDocSh()->Disconnect(this); + + if( pDragTransferable ) + pDragTransferable->SetView( nullptr ); + + OSL_ASSERT (GetViewShell()!=nullptr); + + // remember view attributes of FrameView + WriteFrameViewData(); + + if (bIsMDIActivate) + { + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if(xSlideShow.is() && xSlideShow->isRunning() ) + xSlideShow->deactivate(); + + if(HasCurrentFunction()) + GetCurrentFunction()->Deactivate(); + } + + if (mpHorizontalRuler) + mpHorizontalRuler->SetActive(false); + if (mpVerticalRuler) + mpVerticalRuler->SetActive(false); + + SfxShell::Deactivate(bIsMDIActivate); +} + +void ViewShell::Shutdown() +{ + Exit (); +} + +bool ViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin) +{ + bool bReturn(false); + + if(pWin) + SetActiveWindow(pWin); + + // give key input first to SfxViewShell to give CTRL+Key + // (e.g. CTRL+SHIFT+'+', to front) priority. + OSL_ASSERT(GetViewShell() != nullptr); + bReturn = GetViewShell()->KeyInput(rKEvt); + + const size_t OriCount = GetView()->GetMarkedObjectList().GetMarkCount(); + if(!bReturn) + { + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if(xSlideShow.is() && xSlideShow->isRunning()) + { + bReturn = xSlideShow->keyInput(rKEvt); + } + else + { + bool bConsumed = false; + if( GetView() ) + bConsumed = GetView()->getSmartTags().KeyInput(rKEvt); + + if( !bConsumed ) + { + rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() ); + if( !xSelectionController.is() || !xSelectionController->onKeyInput( rKEvt, pWin ) ) + { + if(HasCurrentFunction()) + bReturn = GetCurrentFunction()->KeyInput(rKEvt); + } + else + { + bReturn = true; + if (HasCurrentFunction()) + { + FuText* pTextFunction = dynamic_cast<FuText*>(GetCurrentFunction().get()); + if(pTextFunction != nullptr) + pTextFunction->InvalidateBindings(); + } + } + } + } + } + const size_t EndCount = GetView()->GetMarkedObjectList().GetMarkCount(); + // Here, oriCount or endCount must have one value=0, another value > 0, then to switch focus between Document and shape objects + if(bReturn && (OriCount + EndCount > 0) && (OriCount * EndCount == 0)) + SwitchActiveViewFireFocus(); + + if(!bReturn && GetActiveWindow()) + { + vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); + + if (aKeyCode.IsMod1() && aKeyCode.IsShift() + && aKeyCode.GetCode() == KEY_R) + { + InvalidateWindows(); + bReturn = true; + } + } + + return bReturn; +} + +void ViewShell::MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin) +{ + // We have to lock tool bar updates while the mouse button is pressed in + // order to prevent the shape under the mouse to be moved (this happens + // when the number of docked tool bars changes as result of a changed + // selection; this changes the window size and thus the mouse position + // in model coordinates: with respect to model coordinates the mouse + // moves.) + OSL_ASSERT(mpImpl->mpUpdateLockForMouse.expired()); + mpImpl->mpUpdateLockForMouse = ViewShell::Implementation::ToolBarManagerLock::Create( + GetViewShellBase().GetToolBarManager()); + + if ( pWin && !pWin->HasFocus() ) + { + pWin->GrabFocus(); + SetActiveWindow(pWin); + } + + // insert MouseEvent into E3dView + if (GetView() != nullptr) + GetView()->SetMouseEvent(rMEvt); + + bool bConsumed = false; + if( GetView() ) + bConsumed = GetView()->getSmartTags().MouseButtonDown( rMEvt ); + + if( bConsumed ) + return; + + rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() ); + if( !xSelectionController.is() || !xSelectionController->onMouseButtonDown( rMEvt, pWin ) ) + { + if(HasCurrentFunction()) + GetCurrentFunction()->MouseButtonDown(rMEvt); + } + else + { + if (HasCurrentFunction()) + { + FuText* pTextFunction = dynamic_cast<FuText*>(GetCurrentFunction().get()); + if (pTextFunction != nullptr) + pTextFunction->InvalidateBindings(); + } + } +} + +void ViewShell::SetCursorMm100Position(const Point& rPosition, bool bPoint, bool bClearMark) +{ + if (SdrView* pSdrView = GetView()) + { + rtl::Reference<sdr::SelectionController> xSelectionController(GetView()->getSelectionController()); + if (!xSelectionController.is() || !xSelectionController->setCursorLogicPosition(rPosition, bPoint)) + { + if (pSdrView->GetTextEditObject()) + { + EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); + rEditView.SetCursorLogicPosition(rPosition, bPoint, bClearMark); + } + } + } +} + +uno::Reference<datatransfer::XTransferable> ViewShell::GetSelectionTransferable() const +{ + SdrView* pSdrView = GetView(); + if (!pSdrView) + return uno::Reference<datatransfer::XTransferable>(); + + if (!pSdrView->GetTextEditObject()) + return uno::Reference<datatransfer::XTransferable>(); + + EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); + return rEditView.GetEditEngine()->CreateTransferable(rEditView.GetSelection()); +} + +void ViewShell::SetGraphicMm100Position(bool bStart, const Point& rPosition) +{ + if (bStart) + { + MouseEvent aClickEvent(rPosition, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT); + MouseButtonDown(aClickEvent, mpActiveWindow); + MouseEvent aMoveEvent(Point(rPosition.getX(), rPosition.getY()), 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT); + MouseMove(aMoveEvent, mpActiveWindow); + } + else + { + MouseEvent aMoveEvent(Point(rPosition.getX(), rPosition.getY()), 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT); + MouseMove(aMoveEvent, mpActiveWindow); + MouseEvent aClickEvent(rPosition, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT); + MouseButtonUp(aClickEvent, mpActiveWindow); + } +} + +void ViewShell::MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin) +{ + if (rMEvt.IsLeaveWindow()) + { + if ( ! mpImpl->mpUpdateLockForMouse.expired()) + { + std::shared_ptr<ViewShell::Implementation::ToolBarManagerLock> pLock( + mpImpl->mpUpdateLockForMouse); + if (pLock != nullptr) + pLock->Release(); + } + } + + if ( pWin ) + { + SetActiveWindow(pWin); + } + + // insert MouseEvent into E3dView + if (GetView() != nullptr) + GetView()->SetMouseEvent(rMEvt); + + if(HasCurrentFunction()) + { + rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() ); + if( !xSelectionController.is() || !xSelectionController->onMouseMove( rMEvt, pWin ) ) + { + if(HasCurrentFunction()) + GetCurrentFunction()->MouseMove(rMEvt); + } + } +} + +void ViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) +{ + if ( pWin ) + SetActiveWindow(pWin); + + // insert MouseEvent into E3dView + if (GetView() != nullptr) + GetView()->SetMouseEvent(rMEvt); + + if( HasCurrentFunction()) + { + rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() ); + if( !xSelectionController.is() || !xSelectionController->onMouseButtonUp( rMEvt, pWin ) ) + { + if(HasCurrentFunction()) + GetCurrentFunction()->MouseButtonUp(rMEvt); + } + else + { + if (HasCurrentFunction()) + { + FuText* pTextFunction = dynamic_cast<FuText*>(GetCurrentFunction().get()); + if (pTextFunction != nullptr) + pTextFunction->InvalidateBindings(); + } + } + } + + if ( ! mpImpl->mpUpdateLockForMouse.expired()) + { + std::shared_ptr<ViewShell::Implementation::ToolBarManagerLock> pLock( + mpImpl->mpUpdateLockForMouse); + if (pLock != nullptr) + pLock->Release(); + } +} + +void ViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin) +{ + bool bDone = HandleScrollCommand (rCEvt, pWin); + + if( bDone ) + return; + + if( rCEvt.GetCommand() == CommandEventId::InputLanguageChange ) + { + //#i42732# update state of fontname if input language changes + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONT ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT ); + } + else + { + bool bConsumed = false; + if( GetView() ) + bConsumed = GetView()->getSmartTags().Command(rCEvt); + + if( !bConsumed && HasCurrentFunction()) + GetCurrentFunction()->Command(rCEvt); + } +} + +bool ViewShell::Notify(NotifyEvent const & rNEvt, ::sd::Window* pWin) +{ + // handle scroll commands when they arrived at child windows + bool bRet = false; + if( rNEvt.GetType() == NotifyEventType::COMMAND ) + { + // note: dynamic_cast is not possible as GetData() returns a void* + CommandEvent* pCmdEvent = static_cast< CommandEvent* >(rNEvt.GetData()); + bRet = HandleScrollCommand(*pCmdEvent, pWin); + } + return bRet; +} + +bool ViewShell::HandleScrollCommand(const CommandEvent& rCEvt, ::sd::Window* pWin) +{ + bool bDone = false; + + switch( rCEvt.GetCommand() ) + { + case CommandEventId::GestureSwipe: + { + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if (xSlideShow.is()) + { + const CommandGestureSwipeData* pSwipeData = rCEvt.GetGestureSwipeData(); + bDone = xSlideShow->swipe(*pSwipeData); + } + } + break; + case CommandEventId::GestureLongPress: + { + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + if (xSlideShow.is()) + { + const CommandGestureLongPressData* pLongPressData = rCEvt.GetLongPressData(); + bDone = xSlideShow->longpress(*pLongPressData); + } + } + break; + + case CommandEventId::Wheel: + { + Reference< XSlideShowController > xSlideShowController( SlideShow::GetSlideShowController(GetViewShellBase() ) ); + if( xSlideShowController.is() ) + { + // We ignore zooming with control+mouse wheel. + const CommandWheelData* pData = rCEvt.GetWheelData(); + if( pData && !pData->GetModifier() && ( pData->GetMode() == CommandWheelMode::SCROLL ) && !pData->IsHorz() ) + { + ::tools::Long nDelta = pData->GetDelta(); + if( nDelta > 0 ) + xSlideShowController->gotoPreviousSlide(); + else if( nDelta < 0 ) + xSlideShowController->gotoNextEffect(); + } + break; + } + } + [[fallthrough]]; + case CommandEventId::StartAutoScroll: + case CommandEventId::AutoScroll: + { + const CommandWheelData* pData = rCEvt.GetWheelData(); + + if (pData != nullptr) + { + if (pData->IsMod1()) + { + if( !GetDocSh()->IsUIActive() ) + { + const sal_uInt16 nOldZoom = GetActiveWindow()->GetZoom(); + sal_uInt16 nNewZoom; + Point aOldMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel()); + + if( pData->GetDelta() < 0 ) + nNewZoom = std::max<sal_uInt16>( pWin->GetMinZoom(), basegfx::zoomtools::zoomOut( nOldZoom )); + else + nNewZoom = std::min<sal_uInt16>( pWin->GetMaxZoom(), basegfx::zoomtools::zoomIn( nOldZoom )); + + SetZoom( nNewZoom ); + // Keep mouse at same doc point before zoom + Point aNewMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel()); + SetWinViewPos(GetWinViewPos() - (aNewMousePos - aOldMousePos)); + + Invalidate( SID_ATTR_ZOOM ); + Invalidate( SID_ATTR_ZOOMSLIDER ); + + bDone = true; + } + } + else + { + if( mpContentWindow.get() == pWin ) + { + double nScrollLines = pData->GetScrollLines(); + if(IsPageFlipMode()) + nScrollLines = COMMAND_WHEEL_PAGESCROLL; + CommandWheelData aWheelData( pData->GetDelta(),pData->GetNotchDelta(), + nScrollLines,pData->GetMode(),pData->GetModifier(),pData->IsHorz() ); + CommandEvent aReWrite( rCEvt.GetMousePosPixel(),rCEvt.GetCommand(), + rCEvt.IsMouseEvent(),static_cast<const void *>(&aWheelData) ); + bDone = pWin->HandleScrollCommand( aReWrite, + mpHorizontalScrollBar.get(), + mpVerticalScrollBar.get()); + } + } + } + } + break; + + case CommandEventId::GestureZoom: + { + const CommandGestureZoomData* pData = rCEvt.GetGestureZoomData(); + + Reference<XSlideShowController> xSlideShowController(SlideShow::GetSlideShowController(GetViewShellBase())); + + if (pData->meEventType == GestureEventZoomType::Begin) + { + mfLastZoomScale = pData->mfScaleDelta; + bDone = true; + break; + } + + if (pData->meEventType == GestureEventZoomType::Update) + { + double deltaBetweenEvents = (pData->mfScaleDelta - mfLastZoomScale) / mfLastZoomScale; + mfLastZoomScale = pData->mfScaleDelta; + + if (!GetDocSh()->IsUIActive() && !xSlideShowController.is()) + { + const ::tools::Long nOldZoom = GetActiveWindow()->GetZoom(); + ::tools::Long nNewZoom; + Point aOldMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel()); + + // Accumulate fractional zoom to avoid small zoom changes from being ignored + mfAccumulatedZoom += deltaBetweenEvents; + int nZoomChangePercent = mfAccumulatedZoom * 100; + mfAccumulatedZoom -= nZoomChangePercent / 100.0; + + nNewZoom = nOldZoom + nZoomChangePercent; + nNewZoom = std::max<::tools::Long>(pWin->GetMinZoom(), nNewZoom); + nNewZoom = std::min<::tools::Long>(pWin->GetMaxZoom(), nNewZoom); + + SetZoom(nNewZoom); + + // Keep mouse at same doc point before zoom + Point aNewMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel()); + SetWinViewPos(GetWinViewPos() - (aNewMousePos - aOldMousePos)); + + Invalidate(SID_ATTR_ZOOM); + Invalidate(SID_ATTR_ZOOMSLIDER); + } + } + + bDone = true; + } + break; + + default: + break; + } + + return bDone; +} + +void ViewShell::SetupRulers() +{ + if(!mbHasRulers || !mpContentWindow || SlideShow::IsRunning(GetViewShellBase())) + return; + + ::tools::Long nHRulerOfs = 0; + + if ( !mpVerticalRuler ) + { + mpVerticalRuler.reset(CreateVRuler(GetActiveWindow())); + if ( mpVerticalRuler ) + { + nHRulerOfs = mpVerticalRuler->GetSizePixel().Width(); + mpVerticalRuler->SetActive(); + mpVerticalRuler->Show(); + } + } + if ( !mpHorizontalRuler ) + { + mpHorizontalRuler.reset(CreateHRuler(GetActiveWindow())); + if ( mpHorizontalRuler ) + { + mpHorizontalRuler->SetWinPos(nHRulerOfs); + mpHorizontalRuler->SetActive(); + mpHorizontalRuler->Show(); + } + } +} + +const SvxNumBulletItem* ViewShell::GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId<SvxNumBulletItem>& nNumItemId) +{ + const SvxNumBulletItem* pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false); + if(pTmpItem) + return pTmpItem; + + nNumItemId = aNewAttr.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE); + pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false); + if(pTmpItem) + return pTmpItem; + + bool bOutliner = false; + bool bTitle = false; + + if( mpView ) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + const size_t nCount = rMarkList.GetMarkCount(); + + for(size_t nNum = 0; nNum < nCount; ++nNum) + { + SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj(); + if( pObj->GetObjInventor() == SdrInventor::Default ) + { + switch(pObj->GetObjIdentifier()) + { + case SdrObjKind::TitleText: + bTitle = true; + break; + case SdrObjKind::OutlineText: + bOutliner = true; + break; + default: + break; + } + } + } + } + + const SvxNumBulletItem *pItem = nullptr; + if(bOutliner) + { + SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool(); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( STR_LAYOUT_OUTLINE + " 1", SfxStyleFamily::Pseudo); + if( pFirstStyleSheet ) + pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false); + } + + if( pItem == nullptr ) + pItem = aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET); + + aNewAttr.Put(pItem->CloneSetWhich(EE_PARA_NUMBULLET)); + + if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET ) + { + const SvxNumBulletItem* pBulletItem = aNewAttr.GetItem(EE_PARA_NUMBULLET); + const SvxNumRule& rRule = pBulletItem->GetNumRule(); + SvxNumRule aNewRule( rRule ); + aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS ); + + SvxNumBulletItem aNewItem( std::move(aNewRule), EE_PARA_NUMBULLET ); + aNewAttr.Put(aNewItem); + } + + pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false); + + return pTmpItem; +} + +void ViewShell::Resize() +{ + SetupRulers (); + + if (mpParentWindow == nullptr) + return; + + // Make sure that the new size is not degenerate. + const Size aSize (mpParentWindow->GetSizePixel()); + if (aSize.IsEmpty()) + return; + + // Remember the new position and size. + maViewPos = Point(0,0); + maViewSize = aSize; + + // Rearrange the UI elements to take care of the new position and size. + ArrangeGUIElements (); + // end of included AdjustPosSizePixel. + + ::sd::View* pView = GetView(); + + if (pView) + pView->VisAreaChanged(GetActiveWindow()->GetOutDev()); +} + +SvBorder ViewShell::GetBorder() +{ + SvBorder aBorder; + + // Horizontal scrollbar. + if (mpHorizontalScrollBar + && mpHorizontalScrollBar->IsVisible()) + { + aBorder.Bottom() = maScrBarWH.Height(); + } + + // Vertical scrollbar. + if (mpVerticalScrollBar + && mpVerticalScrollBar->IsVisible()) + { + aBorder.Right() = maScrBarWH.Width(); + } + + // Place horizontal ruler below tab bar. + if (mbHasRulers && mpContentWindow) + { + SetupRulers(); + if (mpHorizontalRuler) + aBorder.Top() = mpHorizontalRuler->GetSizePixel().Height(); + if (mpVerticalRuler) + aBorder.Left() = mpVerticalRuler->GetSizePixel().Width(); + } + + return aBorder; +} + +void ViewShell::ArrangeGUIElements() +{ + if (mpImpl->mbArrangeActive) + return; + if (maViewSize.IsEmpty()) + return; + mpImpl->mbArrangeActive = true; + + // Calculate border for in-place editing. + ::tools::Long nLeft = maViewPos.X(); + ::tools::Long nTop = maViewPos.Y(); + ::tools::Long nRight = maViewPos.X() + maViewSize.Width(); + ::tools::Long nBottom = maViewPos.Y() + maViewSize.Height(); + + // Horizontal scrollbar. + if (mpHorizontalScrollBar + && mpHorizontalScrollBar->IsVisible()) + { + nBottom -= maScrBarWH.Height(); + if (mpLayerTabBar && mpLayerTabBar->IsVisible()) + nBottom -= mpLayerTabBar->GetSizePixel().Height(); + mpHorizontalScrollBar->SetPosSizePixel ( + Point(nLeft, nBottom), + Size(nRight - nLeft - maScrBarWH.Width(), maScrBarWH.Height())); + } + + // Vertical scrollbar. + if (mpVerticalScrollBar + && mpVerticalScrollBar->IsVisible()) + { + nRight -= maScrBarWH.Width(); + mpVerticalScrollBar->SetPosSizePixel ( + Point(nRight,nTop), + Size (maScrBarWH.Width(), nBottom-nTop)); + } + + // Place horizontal ruler below tab bar. + if (mbHasRulers && mpContentWindow) + { + if (mpHorizontalRuler) + { + Size aRulerSize = mpHorizontalRuler->GetSizePixel(); + aRulerSize.setWidth( nRight - nLeft ); + mpHorizontalRuler->SetPosSizePixel ( + Point(nLeft,nTop), aRulerSize); + if (mpVerticalRuler) + mpHorizontalRuler->SetBorderPos( + mpVerticalRuler->GetSizePixel().Width()-1); + nTop += aRulerSize.Height(); + } + if (mpVerticalRuler) + { + Size aRulerSize = mpVerticalRuler->GetSizePixel(); + aRulerSize.setHeight( nBottom - nTop ); + mpVerticalRuler->SetPosSizePixel ( + Point (nLeft,nTop), aRulerSize); + nLeft += aRulerSize.Width(); + } + } + + rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) ); + + // The size of the window of the center pane is set differently from + // that of the windows in the docking windows. + bool bSlideShowActive = (xSlideShow.is() && xSlideShow->isRunning()) && !xSlideShow->isFullScreen() && xSlideShow->getAnimationMode() == ANIMATIONMODE_SHOW; + if ( !bSlideShowActive) + { + OSL_ASSERT (GetViewShell()!=nullptr); + + if (mpContentWindow) + mpContentWindow->SetPosSizePixel( + Point(nLeft,nTop), + Size(nRight-nLeft,nBottom-nTop)); + } + + // Windows in the center and rulers at the left and top side. + maAllWindowRectangle = ::tools::Rectangle( + maViewPos, + Size(maViewSize.Width()-maScrBarWH.Width(), + maViewSize.Height()-maScrBarWH.Height())); + + if (mpContentWindow) + mpContentWindow->UpdateMapOrigin(); + + UpdateScrollBars(); + + mpImpl->mbArrangeActive = false; +} + +void ViewShell::SetUIUnit(FieldUnit eUnit) +{ + // Set unit at horizontal and vertical rulers. + if (mpHorizontalRuler) + mpHorizontalRuler->SetUnit(eUnit); + + if (mpVerticalRuler) + mpVerticalRuler->SetUnit(eUnit); +} + +/** + * set DefTab at horizontal rulers + */ +void ViewShell::SetDefTabHRuler( sal_uInt16 nDefTab ) +{ + if (mpHorizontalRuler) + mpHorizontalRuler->SetDefTabDist( nDefTab ); +} + +/** Tell the FmFormShell that the view shell is closing. Give it the + opportunity to prevent that. +*/ +bool ViewShell::PrepareClose (bool bUI) +{ + bool bResult = true; + + FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); + if (pFormShell != nullptr) + bResult = pFormShell->PrepareClose (bUI); + + return bResult; +} + +void ViewShell::UpdatePreview (SdPage*) +{ + // Do nothing. After the actual preview has been removed, + // OutlineViewShell::UpdatePreview() is the place where something + // useful is still done. +} + +SfxUndoManager* ViewShell::ImpGetUndoManager() const +{ + const ViewShell* pMainViewShell = GetViewShellBase().GetMainViewShell().get(); + + if( pMainViewShell == nullptr ) + pMainViewShell = this; + + ::sd::View* pView = pMainViewShell->GetView(); + + // check for text edit our outline view + if( pView ) + { + if( pMainViewShell->GetShellType() == ViewShell::ST_OUTLINE ) + { + OutlineView* pOlView = dynamic_cast< OutlineView* >( pView ); + if( pOlView ) + { + ::Outliner& rOutl = pOlView->GetOutliner(); + return &rOutl.GetUndoManager(); + } + } + else if( pView->IsTextEdit() ) + { + SdrOutliner* pOL = pView->GetTextEditOutliner(); + if( pOL ) + return &pOL->GetUndoManager(); + } + } + + if( GetDocSh() ) + return GetDocSh()->GetUndoManager(); + + return nullptr; +} + +void ViewShell::ImpGetUndoStrings(SfxItemSet &rSet) const +{ + SfxUndoManager* pUndoManager = ImpGetUndoManager(); + if(!pUndoManager) + return; + + sal_uInt16 nCount(pUndoManager->GetUndoActionCount()); + if(nCount) + { + // prepare list + std::vector<OUString> aStringList; + aStringList.reserve(nCount); + for (sal_uInt16 a = 0; a < nCount; ++a) + { + // generate one String in list per undo step + aStringList.push_back( pUndoManager->GetUndoActionComment(a) ); + } + + // set item + rSet.Put(SfxStringListItem(SID_GETUNDOSTRINGS, &aStringList)); + } + else + { + rSet.DisableItem(SID_GETUNDOSTRINGS); + } +} + +void ViewShell::ImpGetRedoStrings(SfxItemSet &rSet) const +{ + SfxUndoManager* pUndoManager = ImpGetUndoManager(); + if(!pUndoManager) + return; + + sal_uInt16 nCount(pUndoManager->GetRedoActionCount()); + if(nCount) + { + // prepare list + ::std::vector< OUString > aStringList; + aStringList.reserve(nCount); + for(sal_uInt16 a = 0; a < nCount; a++) + // generate one String in list per undo step + aStringList.push_back( pUndoManager->GetRedoActionComment(a) ); + + // set item + rSet.Put(SfxStringListItem(SID_GETREDOSTRINGS, &aStringList)); + } + else + { + rSet.DisableItem(SID_GETREDOSTRINGS); + } +} + +namespace { + +class KeepSlideSorterInSyncWithPageChanges +{ + sd::slidesorter::view::SlideSorterView::DrawLock m_aDrawLock; + sd::slidesorter::controller::SlideSorterController::ModelChangeLock m_aModelLock; + sd::slidesorter::controller::PageSelector::UpdateLock m_aUpdateLock; + sd::slidesorter::controller::SelectionObserver::Context m_aContext; + +public: + explicit KeepSlideSorterInSyncWithPageChanges(sd::slidesorter::SlideSorter const & rSlideSorter) + : m_aDrawLock(rSlideSorter) + , m_aModelLock(rSlideSorter.GetController()) + , m_aUpdateLock(rSlideSorter) + , m_aContext(rSlideSorter) + { + } +}; + +} + +void ViewShell::ImpSidUndo(SfxRequest& rReq) +{ + //The xWatcher keeps the SlideSorter selection in sync + //with the page insertions/deletions that Undo may introduce + std::unique_ptr<KeepSlideSorterInSyncWithPageChanges, o3tl::default_delete<KeepSlideSorterInSyncWithPageChanges>> xWatcher; + slidesorter::SlideSorterViewShell* pSlideSorterViewShell + = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase()); + if (pSlideSorterViewShell) + xWatcher.reset(new KeepSlideSorterInSyncWithPageChanges(pSlideSorterViewShell->GetSlideSorter())); + + SfxUndoManager* pUndoManager = ImpGetUndoManager(); + sal_uInt16 nNumber(1); + const SfxItemSet* pReqArgs = rReq.GetArgs(); + bool bRepair = false; + + if(pReqArgs) + { + const SfxUInt16Item* pUIntItem = static_cast<const SfxUInt16Item*>(&pReqArgs->Get(SID_UNDO)); + nNumber = pUIntItem->GetValue(); + + // Repair mode: allow undo/redo of all undo actions, even if access would + // be limited based on the view shell ID. + if (const SfxBoolItem* pRepairItem = pReqArgs->GetItemIfSet(SID_REPAIRPACKAGE, false)) + bRepair = pRepairItem->GetValue(); + } + + if(nNumber && pUndoManager) + { + sal_uInt16 nCount(pUndoManager->GetUndoActionCount()); + if(nCount >= nNumber) + { + if (comphelper::LibreOfficeKit::isActive() && !bRepair) + { + // If another view created the first undo action, prevent redoing it from this view. + const SfxUndoAction* pAction = pUndoManager->GetUndoAction(); + if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId()) + { + rReq.SetReturnValue(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + return; + } + } + + try + { + // when UndoStack is cleared by ModifyPageUndoAction + // the nCount may have changed, so test GetUndoActionCount() + while(nNumber-- && pUndoManager->GetUndoActionCount()) + pUndoManager->Undo(); + } + catch( const Exception& ) + { + // no need to handle. By definition, the UndoManager handled this by clearing the + // Undo/Redo stacks + } + } + + // refresh rulers, maybe UNDO was move of TAB marker in ruler + if (mbHasRulers) + Invalidate(SID_ATTR_TABSTOP); + } + + // This one is corresponding to the default handling + // of SID_UNDO in sfx2 + GetViewFrame()->GetBindings().InvalidateAll(false); + + rReq.Done(); +} + +void ViewShell::ImpSidRedo(SfxRequest& rReq) +{ + //The xWatcher keeps the SlideSorter selection in sync + //with the page insertions/deletions that Undo may introduce + std::unique_ptr<KeepSlideSorterInSyncWithPageChanges, o3tl::default_delete<KeepSlideSorterInSyncWithPageChanges>> xWatcher; + slidesorter::SlideSorterViewShell* pSlideSorterViewShell + = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase()); + if (pSlideSorterViewShell) + xWatcher.reset(new KeepSlideSorterInSyncWithPageChanges(pSlideSorterViewShell->GetSlideSorter())); + + SfxUndoManager* pUndoManager = ImpGetUndoManager(); + sal_uInt16 nNumber(1); + const SfxItemSet* pReqArgs = rReq.GetArgs(); + bool bRepair = false; + + if(pReqArgs) + { + const SfxUInt16Item* pUIntItem = static_cast<const SfxUInt16Item*>(&pReqArgs->Get(SID_REDO)); + nNumber = pUIntItem->GetValue(); + // Repair mode: allow undo/redo of all undo actions, even if access would + // be limited based on the view shell ID. + if (const SfxBoolItem* pRepairItem = pReqArgs->GetItemIfSet(SID_REPAIRPACKAGE, false)) + bRepair = pRepairItem->GetValue(); + } + + if(nNumber && pUndoManager) + { + sal_uInt16 nCount(pUndoManager->GetRedoActionCount()); + if(nCount >= nNumber) + { + if (comphelper::LibreOfficeKit::isActive() && !bRepair) + { + // If another view created the first undo action, prevent redoing it from this view. + const SfxUndoAction* pAction = pUndoManager->GetRedoAction(); + if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId()) + { + rReq.SetReturnValue(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + return; + } + } + + try + { + // when UndoStack is cleared by ModifyPageRedoAction + // the nCount may have changed, so test GetRedoActionCount() + while(nNumber-- && pUndoManager->GetRedoActionCount()) + pUndoManager->Redo(); + } + catch( const Exception& ) + { + // no need to handle. By definition, the UndoManager handled this by clearing the + // Undo/Redo stacks + } + } + + // refresh rulers, maybe REDO was move of TAB marker in ruler + if (mbHasRulers) + { + Invalidate(SID_ATTR_TABSTOP); + } + } + + // This one is corresponding to the default handling + // of SID_UNDO in sfx2 + GetViewFrame()->GetBindings().InvalidateAll(false); + + rReq.Done(); +} + +void ViewShell::ExecReq( SfxRequest& rReq ) +{ + sal_uInt16 nSlot = rReq.GetSlot(); + switch( nSlot ) + { + case SID_MAIL_SCROLLBODY_PAGEDOWN: + { + rtl::Reference<FuPoor> xFunc( GetCurrentFunction() ); + if( xFunc.is() ) + ScrollLines( 0, -1 ); + + rReq.Done(); + } + break; + + case SID_OUTPUT_QUALITY_COLOR: + case SID_OUTPUT_QUALITY_GRAYSCALE: + case SID_OUTPUT_QUALITY_BLACKWHITE: + case SID_OUTPUT_QUALITY_CONTRAST: + { + DrawModeFlags nMode = OUTPUT_DRAWMODE_COLOR; + + switch( nSlot ) + { + case SID_OUTPUT_QUALITY_COLOR: nMode = OUTPUT_DRAWMODE_COLOR; break; + case SID_OUTPUT_QUALITY_GRAYSCALE: nMode = OUTPUT_DRAWMODE_GRAYSCALE; break; + case SID_OUTPUT_QUALITY_BLACKWHITE: nMode = OUTPUT_DRAWMODE_BLACKWHITE; break; + case SID_OUTPUT_QUALITY_CONTRAST: nMode = OUTPUT_DRAWMODE_CONTRAST; break; + } + + GetActiveWindow()->GetOutDev()->SetDrawMode( nMode ); + mpFrameView->SetDrawMode( nMode ); + + GetActiveWindow()->Invalidate(); + + Invalidate(); + rReq.Done(); + break; + } + } +} + +/** This default implementation returns only an empty reference. See derived + classes for more interesting examples. +*/ +css::uno::Reference<css::accessibility::XAccessible> +ViewShell::CreateAccessibleDocumentView (::sd::Window* ) +{ + OSL_FAIL("ViewShell::CreateAccessibleDocumentView should not be called!, perhaps Meyers, 3rd edition, Item 9:"); + + return css::uno::Reference<css::accessibility::XAccessible> (); +} + +::sd::WindowUpdater* ViewShell::GetWindowUpdater() const +{ + return mpWindowUpdater.get(); +} + +ViewShellBase& ViewShell::GetViewShellBase() const +{ + return *static_cast<ViewShellBase*>(GetViewShell()); +} + +ViewShell::ShellType ViewShell::GetShellType() const +{ + return meShellType; +} + +DrawDocShell* ViewShell::GetDocSh() const +{ + return GetViewShellBase().GetDocShell(); +} + +SdDrawDocument* ViewShell::GetDoc() const +{ + return GetViewShellBase().GetDocument(); +} + +ErrCode ViewShell::DoVerb(sal_Int32 /*nVerb*/) +{ + return ERRCODE_NONE; +} + +void ViewShell::SetCurrentFunction( const rtl::Reference<FuPoor>& xFunction) +{ + if( mxCurrentFunction.is() && (mxOldFunction != mxCurrentFunction) ) + mxCurrentFunction->Dispose(); + rtl::Reference<FuPoor> xDisposeAfterNewOne( mxCurrentFunction ); + mxCurrentFunction = xFunction; +} + +void ViewShell::SetOldFunction(const rtl::Reference<FuPoor>& xFunction) +{ + if( mxOldFunction.is() && (xFunction != mxOldFunction) && (mxCurrentFunction != mxOldFunction) ) + mxOldFunction->Dispose(); + + rtl::Reference<FuPoor> xDisposeAfterNewOne( mxOldFunction ); + mxOldFunction = xFunction; +} + +/** this method deactivates the current function. If an old function is + saved, this will become activated and current function. +*/ +void ViewShell::Cancel() +{ + if(mxCurrentFunction.is() && (mxCurrentFunction != mxOldFunction )) + { + rtl::Reference<FuPoor> xTemp( mxCurrentFunction ); + mxCurrentFunction.clear(); + xTemp->Deactivate(); + xTemp->Dispose(); + } + + if(mxOldFunction.is()) + { + mxCurrentFunction = mxOldFunction; + mxCurrentFunction->Activate(); + } +} + +void ViewShell::DeactivateCurrentFunction( bool bPermanent /* == false */ ) +{ + if( mxCurrentFunction.is() ) + { + if(bPermanent && (mxOldFunction == mxCurrentFunction)) + mxOldFunction.clear(); + + mxCurrentFunction->Deactivate(); + if( mxCurrentFunction != mxOldFunction ) + mxCurrentFunction->Dispose(); + + rtl::Reference<FuPoor> xDisposeAfterNewOne( mxCurrentFunction ); + mxCurrentFunction.clear(); + } +} + +void ViewShell::DisposeFunctions() +{ + if(mxCurrentFunction.is()) + { + rtl::Reference<FuPoor> xTemp( mxCurrentFunction ); + mxCurrentFunction.clear(); + xTemp->Deactivate(); + xTemp->Dispose(); + } + + if(mxOldFunction.is()) + { + rtl::Reference<FuPoor> xDisposeAfterNewOne( mxOldFunction ); + mxOldFunction->Dispose(); + mxOldFunction.clear(); + } +} + +bool ViewShell::IsMainViewShell() const +{ + return mpImpl->mbIsMainViewShell; +} + +void ViewShell::SetIsMainViewShell (bool bIsMainViewShell) +{ + if (bIsMainViewShell != mpImpl->mbIsMainViewShell) + { + mpImpl->mbIsMainViewShell = bIsMainViewShell; + if (bIsMainViewShell) + GetDocSh()->Connect (this); + else + GetDocSh()->Disconnect (this); + } +} + +void ViewShell::PrePaint() +{ +} + +void ViewShell::Paint (const ::tools::Rectangle&, ::sd::Window* ) +{ +} + +void ViewShell::ShowUIControls (bool bVisible) +{ + if (mbHasRulers) + { + if (mpHorizontalRuler) + mpHorizontalRuler->Show( bVisible ); + + if (mpVerticalRuler) + mpVerticalRuler->Show( bVisible ); + } + + if (mpVerticalScrollBar) + mpVerticalScrollBar->Show( bVisible ); + + if (mpHorizontalScrollBar) + mpHorizontalScrollBar->Show( bVisible ); + + if (mpContentWindow) + mpContentWindow->Show( bVisible ); +} + +bool ViewShell::RelocateToParentWindow (vcl::Window* pParentWindow) +{ + mpParentWindow = pParentWindow; + + mpParentWindow->SetBackground (Wallpaper()); + + if (mpContentWindow) + mpContentWindow->SetParent(pParentWindow); + + if (mpHorizontalScrollBar) + mpHorizontalScrollBar->SetParent(mpParentWindow); + if (mpVerticalScrollBar) + mpVerticalScrollBar->SetParent(mpParentWindow); + + return true; +} + +void ViewShell::SwitchViewFireFocus(const css::uno::Reference< css::accessibility::XAccessible >& xAcc ) +{ + if (xAcc) + { + ::accessibility::AccessibleDocumentViewBase* pBase = static_cast< ::accessibility::AccessibleDocumentViewBase* >(xAcc.get()); + if (pBase) + pBase->SwitchViewActivated(); + } +} +void ViewShell::SwitchActiveViewFireFocus() +{ + if (mpContentWindow) + { + SwitchViewFireFocus(mpContentWindow->GetAccessible(false)); + } +} +// move these two methods from DrawViewShell. +void ViewShell::fireSwitchCurrentPage(sal_Int32 pageIndex) +{ + GetViewShellBase().GetDrawController()->fireSwitchCurrentPage(pageIndex); +} +void ViewShell::NotifyAccUpdate( ) +{ + GetViewShellBase().GetDrawController()->NotifyAccUpdate(); +} + +weld::Window* ViewShell::GetFrameWeld() const +{ + return mpActiveWindow ? mpActiveWindow->GetFrameWeld() : nullptr; +} + +sd::Window* ViewShell::GetContentWindow() const +{ + return mpContentWindow.get(); +} + +} // end of namespace sd + +//===== ViewShellObjectBarFactory ============================================= + +namespace { + +ViewShellObjectBarFactory::ViewShellObjectBarFactory ( + ::sd::ViewShell& rViewShell) + : mrViewShell (rViewShell) +{ +} + +SfxShell* ViewShellObjectBarFactory::CreateShell( ::sd::ShellId nId ) +{ + SfxShell* pShell = nullptr; + + ::sd::View* pView = mrViewShell.GetView(); + switch (nId) + { + case ToolbarId::Bezier_Toolbox_Sd: + pShell = new ::sd::BezierObjectBar(&mrViewShell, pView); + break; + + case ToolbarId::Draw_Text_Toolbox_Sd: + pShell = new ::sd::TextObjectBar( + &mrViewShell, mrViewShell.GetDoc()->GetPool(), pView); + break; + + case ToolbarId::Draw_Graf_Toolbox: + pShell = new ::sd::GraphicObjectBar(&mrViewShell, pView); + break; + + case ToolbarId::Draw_Media_Toolbox: + pShell = new ::sd::MediaObjectBar(&mrViewShell, pView); + break; + + case ToolbarId::Draw_Table_Toolbox: + pShell = ::sd::ui::table::CreateTableObjectBar( mrViewShell, pView ); + break; + + case ToolbarId::Svx_Extrusion_Bar: + pShell = new svx::ExtrusionBar( + &mrViewShell.GetViewShellBase()); + break; + + case ToolbarId::Svx_Fontwork_Bar: + pShell = new svx::FontworkBar( + &mrViewShell.GetViewShellBase()); + break; + + default: + pShell = nullptr; + break; + } + + return pShell; +} + +void ViewShellObjectBarFactory::ReleaseShell (SfxShell* pShell) +{ + delete pShell; +} + +} // end of anonymous namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/view/zoomlist.cxx b/sd/source/ui/view/zoomlist.cxx new file mode 100644 index 0000000000..86a3de63bc --- /dev/null +++ b/sd/source/ui/view/zoomlist.cxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <zoomlist.hxx> + +#include <svx/svxids.hrc> +#include <sfx2/bindings.hxx> +#include <sfx2/viewfrm.hxx> + +#include <ViewShell.hxx> + +namespace sd +{ +#define MAX_ENTRIES 10 + +ZoomList::ZoomList(ViewShell* pViewShell) + : mpViewShell(pViewShell) + , mnCurPos(0) +{ +} + +void ZoomList::InsertZoomRect(const ::tools::Rectangle& rRect) +{ + size_t nRectCount = maRectangles.size(); + + if (nRectCount >= MAX_ENTRIES) + maRectangles.erase(maRectangles.begin()); + else if (nRectCount == 0) + mnCurPos = 0; + else + mnCurPos++; + + maRectangles.insert(maRectangles.begin() + mnCurPos, rRect); + + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_ZOOM_NEXT); + rBindings.Invalidate(SID_ZOOM_PREV); +} + +::tools::Rectangle const& ZoomList::GetNextZoomRect() +{ + mnCurPos++; + size_t nRectCount = maRectangles.size(); + + if (nRectCount > 0 && mnCurPos > nRectCount - 1) + mnCurPos = nRectCount - 1; + + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_ZOOM_NEXT); + rBindings.Invalidate(SID_ZOOM_PREV); + + return maRectangles[mnCurPos]; +} + +::tools::Rectangle const& ZoomList::GetPreviousZoomRect() +{ + if (mnCurPos > 0) + mnCurPos--; + + SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); + rBindings.Invalidate(SID_ZOOM_NEXT); + rBindings.Invalidate(SID_ZOOM_PREV); + + return maRectangles[mnCurPos]; +} + +bool ZoomList::IsNextPossible() const +{ + size_t nRectCount = maRectangles.size(); + + return nRectCount > 0 && mnCurPos < nRectCount - 1; +} + +bool ZoomList::IsPreviousPossible() const { return mnCurPos > 0; } + +} // end of namespace sd + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/uiconfig/sdraw/menubar/menubar.xml b/sd/uiconfig/sdraw/menubar/menubar.xml new file mode 100644 index 0000000000..a905b05692 --- /dev/null +++ b/sd/uiconfig/sdraw/menubar/menubar.xml @@ -0,0 +1,650 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<menu:menubar xmlns:menu="http://openoffice.org/2001/menu" menu:id="menubar"> + <menu:menu menu:id=".uno:PickList"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:AddDirect"/> + <menu:menuitem menu:id=".uno:Open"/> + <menu:menuitem menu:id=".uno:OpenRemote" menu:style="text"/> + <menu:menuitem menu:id=".uno:RecentFileList"/> + <menu:menuitem menu:id=".uno:CloseDoc"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AutoPilotMenu" menu:style="text"/> + <menu:menu menu:id=".uno:TemplateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:OpenTemplate" menu:style="text"/> + <menu:menuitem menu:id=".uno:SaveAsTemplate" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NewDoc" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Reload" menu:style="text"/> + <menu:menuitem menu:id=".uno:VersionDialog" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Save"/> + <menu:menuitem menu:id=".uno:SaveAs"/> + <menu:menuitem menu:id=".uno:SaveAsRemote" menu:style="text"/> + <menu:menuitem menu:id=".uno:SaveACopy" menu:style="text"/> + <menu:menuitem menu:id=".uno:SaveAll" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CheckOut" menu:style="text"/> + <menu:menuitem menu:id=".uno:CancelCheckOut" menu:style="text"/> + <menu:menuitem menu:id=".uno:CheckIn" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ExportTo"/> + <menu:menu menu:id=".uno:ExportAsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ExportToPDF" menu:style="text"/> + <menu:menuitem menu:id=".uno:ExportDirectToPDF" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SendToMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SendMail" menu:style="text"/> + <menu:menuitem menu:id=".uno:SendMailDocAsPDF" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:WebHtml" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Print"/> + <menu:menuitem menu:id=".uno:PrinterSetup" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDocumentProperties"/> + <menu:menu menu:id=".uno:SignaturesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Signature" menu:style="text"/> + <menu:menuitem menu:id=".uno:SignPDF" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Quit"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:EditMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Undo"/> + <menu:menuitem menu:id=".uno:Redo"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menu menu:id=".uno:PasteSpecialMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:PasteUnformatted"/> + <menu:menuitem menu:id=".uno:PasteSpecial"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CopyObjects"/> + <menu:menuitem menu:id=".uno:SelectAll"/> + <menu:menuseparator/> + <menu:menuitem menu:id="vnd.sun.star.findbar:FocusToFindbar"/> + <menu:menuitem menu:id=".uno:SearchDialog" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:GlueEditMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditHyperlink" menu:style="text"/> + <menu:menuitem menu:id=".uno:ModifyField" menu:style="text"/> + <menu:menuitem menu:id=".uno:ManageLinks" menu:style="text"/> + <menu:menuitem menu:id=".uno:ObjectMenue" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditDoc" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ViewMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:PageMode" menu:style="radio"/> + <menu:menuitem menu:id=".uno:MasterPage" menu:style="radio"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToolbarModeUI"/> + <menu:menuitem menu:id=".uno:AvailableToolbars" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:StatusBarVisible" menu:style="text"/> + <menu:menuitem menu:id=".uno:LeftPaneDraw" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowRuler"/> + <menu:menu menu:id=".uno:GridMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:GridVisible"/> + <menu:menuitem menu:id=".uno:GridFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HelplinesMove"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SnapLinesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:HelplinesVisible"/> + <menu:menuitem menu:id=".uno:HelplinesFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GridUse"/> + <menu:menuitem menu:id=".uno:HelplinesUse"/> + <menu:menuitem menu:id=".uno:SnapFrame"/> + <menu:menuitem menu:id=".uno:SnapPoints"/> + <menu:menuitem menu:id=".uno:SnapBorder"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowAnnotations"/> + <menu:menu menu:id=".uno:DisplayQualityMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:OutputQualityColor" menu:style="radio"/> + <menu:menuitem menu:id=".uno:OutputQualityGrayscale" menu:style="radio"/> + <menu:menuitem menu:id=".uno:OutputQualityBlackWhite" menu:style="radio"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Sidebar"/> + <menu:menuitem menu:id=".uno:ViewSidebarStyles"/> + <menu:menuitem menu:id=".uno:Gallery"/> + <menu:menuitem menu:id=".uno:Navigator"/> + <menu:menuitem menu:id=".uno:ColorControl"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ZoomPanning"/> + <menu:menu menu:id=".uno:ZoomMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ZoomPage"/> + <menu:menuitem menu:id=".uno:ZoomPageWidth"/> + <menu:menuitem menu:id=".uno:ZoomOptimal"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Zoom50Percent"/> + <menu:menuitem menu:id=".uno:Zoom75Percent"/> + <menu:menuitem menu:id=".uno:Zoom100Percent"/> + <menu:menuitem menu:id=".uno:Zoom150Percent"/> + <menu:menuitem menu:id=".uno:Zoom200Percent"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ZoomMode"/> + <menu:menuitem menu:id=".uno:ZoomPrevious"/> + <menu:menuitem menu:id=".uno:ZoomNext"/> + <menu:menuitem menu:id=".uno:ZoomObjects"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Zoom"/> + </menu:menupopup> + </menu:menu> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:InsertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertGraphic"/> + <menu:menuitem menu:id=".uno:InsertObjectChart"/> + <menu:menuitem menu:id=".uno:InsertTable"/> + <menu:menu menu:id=".uno:GraphicMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Gallery"/> + <menu:menu menu:id=".uno:Scan"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:TwainSelect"/> + <menu:menuitem menu:id=".uno:TwainTransfer"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:InsertAVMedia"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ObjectMenu" menu:style="text"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertMath"/> + <menu:menuitem menu:id=".uno:InsertQrCode"/> + <menu:menuitem menu:id=".uno:InsertObject"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CapturePoint"/> + <menu:menuitem menu:id=".uno:InsertLayer"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Text"/> + <menu:menuitem menu:id=".uno:InsertAnnotation"/> + <menu:menuitem menu:id=".uno:FontworkGalleryFloater"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HyperlinkDialog"/> + <menu:menuitem menu:id=".uno:InsertSymbol" menu:style="text"/> + <menu:menu menu:id=".uno:FormattingMarkMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertNonBreakingSpace"/> + <menu:menuitem menu:id=".uno:InsertHardHyphen"/> + <menu:menuitem menu:id=".uno:InsertSoftHyphen"/> + <menu:menuitem menu:id=".uno:InsertNarrowNobreakSpace"/> + <menu:menuitem menu:id=".uno:InsertZWSP"/> + <menu:menuitem menu:id=".uno:InsertWJ"/> + <menu:menuitem menu:id=".uno:InsertLRM"/> + <menu:menuitem menu:id=".uno:InsertRLM"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertPageField"/> + <menu:menu menu:id=".uno:FieldMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertDateFieldFix"/> + <menu:menuitem menu:id=".uno:InsertDateFieldVar"/> + <menu:menuitem menu:id=".uno:InsertTimeFieldFix"/> + <menu:menuitem menu:id=".uno:InsertTimeFieldVar"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertAuthorField"/> + <menu:menuitem menu:id=".uno:InsertPageField"/> + <menu:menuitem menu:id=".uno:InsertPageTitleField"/> + <menu:menuitem menu:id=".uno:InsertPagesField"/> + <menu:menuitem menu:id=".uno:InsertFileField"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menu menu:id=".uno:InsertFormMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Label"/> + <menu:menuitem menu:id=".uno:Edit"/> + <menu:menuitem menu:id=".uno:CheckBox"/> + <menu:menuitem menu:id=".uno:RadioButton"/> + <menu:menuitem menu:id=".uno:ListBox"/> + <menu:menuitem menu:id=".uno:ComboBox"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Pushbutton"/> + <menu:menuitem menu:id=".uno:Imagebutton"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FormattedField"/> + <menu:menuitem menu:id=".uno:DateField"/> + <menu:menuitem menu:id=".uno:TimeField"/> + <menu:menuitem menu:id=".uno:NumericField"/> + <menu:menuitem menu:id=".uno:CurrencyField"/> + <menu:menuitem menu:id=".uno:PatternField"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GroupBox"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ImageControl"/> + <menu:menuitem menu:id=".uno:FileControl"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Grid"/> + <menu:menuitem menu:id=".uno:NavigationBar"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:InsertSignatureLine" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatMenu"> + <menu:menupopup> + <menu:menu menu:id=".uno:FormatTextMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Bold"/> + <menu:menuitem menu:id=".uno:Italic"/> + <menu:menuitem menu:id=".uno:UnderlineSingle"/> + <menu:menuitem menu:id=".uno:UnderlineDouble"/> + <menu:menuitem menu:id=".uno:Strikeout"/> + <menu:menuitem menu:id=".uno:Overline"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SuperScript"/> + <menu:menuitem menu:id=".uno:SubScript"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Shadowed"/> + <menu:menuitem menu:id=".uno:OutlineFont"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Grow"/> + <menu:menuitem menu:id=".uno:Shrink"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ChangeCaseToUpper"/> + <menu:menuitem menu:id=".uno:ChangeCaseToLower"/> + <menu:menuitem menu:id=".uno:ChangeCaseRotateCase"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ChangeCaseToSentenceCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToTitleCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToToggleCase"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SmallCaps"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ChangeCaseToHalfWidth"/> + <menu:menuitem menu:id=".uno:ChangeCaseToFullWidth"/> + <menu:menuitem menu:id=".uno:ChangeCaseToHiragana"/> + <menu:menuitem menu:id=".uno:ChangeCaseToKatakana"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatSpacingMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SpacePara1"/> + <menu:menuitem menu:id=".uno:SpacePara15"/> + <menu:menuitem menu:id=".uno:SpacePara2"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ParaspaceIncrease"/> + <menu:menuitem menu:id=".uno:ParaspaceDecrease"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:IncrementIndent"/> + <menu:menuitem menu:id=".uno:DecrementIndent"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TextAlign"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CellVertTop" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CellVertCenter" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CellVertBottom" menu:style="radio"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatBulletsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:DefaultBullet"/> + <menu:menuitem menu:id=".uno:DefaultNumbering"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OutlineRight"/> + <menu:menuitem menu:id=".uno:OutlineLeft"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OutlineDown"/> + <menu:menuitem menu:id=".uno:OutlineUp"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault" menu:style="text"/> + <menu:menu menu:id=".uno:FormatStylesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:EditStyle"/> + <menu:menuitem menu:id=".uno:StyleUpdateByExample"/> + <menu:menuitem menu:id=".uno:StyleNewByExample"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DesignerDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuitem menu:id=".uno:OutlineBullet"/> + <menu:menuitem menu:id=".uno:ThemeDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ModifyLayer"/> + <menu:menu menu:id=".uno:TableMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/> + <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/> + <menu:menuitem menu:id=".uno:DistributeRows"/> + <menu:menuitem menu:id=".uno:EntireRow"/> + <menu:menuitem menu:id=".uno:InsertRowDialog"/> + <menu:menuitem menu:id=".uno:DeleteRows"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/> + <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/> + <menu:menuitem menu:id=".uno:DistributeColumns"/> + <menu:menuitem menu:id=".uno:EntireColumn"/> + <menu:menuitem menu:id=".uno:InsertColumnDialog"/> + <menu:menuitem menu:id=".uno:DeleteColumns"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MergeCells"/> + <menu:menuitem menu:id=".uno:SplitCell"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DeleteTable"/> + <menu:menuitem menu:id=".uno:SelectTable"/> + <menu:menuitem menu:id=".uno:TableDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatImageMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Crop"/> + <menu:menuitem menu:id=".uno:OriginalSize"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ExternalEdit"/> + <menu:menuitem menu:id=".uno:ChangePicture"/> + <menu:menuitem menu:id=".uno:CompressGraphic"/> + <menu:menuitem menu:id=".uno:SaveGraphic"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:FormatImageFilterMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:GraphicFilterSepia"/> + <menu:menuitem menu:id=".uno:GraphicFilterSobel"/> + <menu:menuitem menu:id=".uno:GraphicFilterInvert"/> + <menu:menuitem menu:id=".uno:GraphicFilterMosaic"/> + <menu:menuitem menu:id=".uno:GraphicFilterPopart"/> + <menu:menuitem menu:id=".uno:GraphicFilterPoster"/> + <menu:menuitem menu:id=".uno:GraphicFilterRelief"/> + <menu:menuitem menu:id=".uno:GraphicFilterRemoveNoise"/> + <menu:menuitem menu:id=".uno:GraphicFilterSharpen"/> + <menu:menuitem menu:id=".uno:GraphicFilterSmooth"/> + <menu:menuitem menu:id=".uno:GraphicFilterSolarize"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:ColorSettings"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GrafAttrCrop"/> + <menu:menuitem menu:id=".uno:GraphicSizeCheck"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:ConnectorAttributes"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuitem menu:id=".uno:Window3D"/> + <menu:menuitem menu:id=".uno:FillShadow"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup" menu:style="text"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:PageMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertPage"/> + <menu:menuitem menu:id=".uno:DuplicatePage"/> + <menu:menuitem menu:id=".uno:ImportFromFile" menu:style="text"/> + <menu:menuitem menu:id=".uno:RenamePage" menu:style="text"/> + <menu:menuitem menu:id=".uno:DeletePage" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SaveBackground"/> + <menu:menuitem menu:id=".uno:SelectBackground"/> + <menu:menuitem menu:id=".uno:PageSetup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DrawingLayout" menu:style="text"/> + <menu:menuitem menu:id=".uno:InsertMasterPage"/> + <menu:menuitem menu:id=".uno:DeleteMasterPage"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:SlideMoveMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MovePageFirst"/> + <menu:menuitem menu:id=".uno:MovePageUp"/> + <menu:menuitem menu:id=".uno:MovePageDown"/> + <menu:menuitem menu:id=".uno:MovePageLast"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:NavigateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:FirstPage"/> + <menu:menuitem menu:id=".uno:PreviousPage"/> + <menu:menuitem menu:id=".uno:NextPage"/> + <menu:menuitem menu:id=".uno:LastPage"/> + </menu:menupopup> + </menu:menu> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ShapeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Line"/> + <menu:menuitem menu:id=".uno:BasicShapes.rectangle"/> + <menu:menuitem menu:id=".uno:BasicShapes.ellipse"/> + <menu:menu menu:id=".uno:InsertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ArrowsToolbox"/> + <menu:menuitem menu:id=".uno:LineToolbox"/> + <menu:menuitem menu:id=".uno:ConnectorToolbox"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BasicShapes"/> + <menu:menuitem menu:id=".uno:SymbolShapes"/> + <menu:menuitem menu:id=".uno:ArrowShapes"/> + <menu:menuitem menu:id=".uno:FlowChartShapes"/> + <menu:menuitem menu:id=".uno:CalloutShapes"/> + <menu:menuitem menu:id=".uno:StarShapes"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Objects3DToolbox"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DistributeSelection"/> + <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/> + <menu:menuitem menu:id=".uno:AdvancedMode"/> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:GroupMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Combine"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Merge"/> + <menu:menuitem menu:id=".uno:Substract"/> + <menu:menuitem menu:id=".uno:Intersect"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TextCombine"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CopyObjects"/> + <menu:menuitem menu:id=".uno:Morphing"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EqualizeWidth"/> + <menu:menuitem menu:id=".uno:EqualizeHeight"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Connect"/> + <menu:menuitem menu:id=".uno:Break"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ToolsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SpellDialog"/> + <menu:menuitem menu:id=".uno:SpellOnline"/> + <menu:menuitem menu:id=".uno:ThesaurusDialog" menu:style="text"/> + <menu:menu menu:id=".uno:LanguageMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SetLanguageAllTextMenu"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Hyphenation" menu:style="text"/> + <menu:menuitem menu:id=".uno:ChineseConversion"/> + <menu:menuitem menu:id=".uno:HangulHanjaConversion"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MoreDictionaries"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AutoCorrectDlg"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ImageMapDialog" menu:style="text"/> + <menu:menuitem menu:id=".uno:BmpMask"/> + <menu:menuitem menu:id=".uno:AVMediaPlayer"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ToolsFormsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SwitchControlDesignMode"/> + <menu:menuitem menu:id=".uno:UseWizards"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ControlProperties"/> + <menu:menuitem menu:id=".uno:FormProperties"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowFmExplorer"/> + <menu:menuitem menu:id=".uno:TabDialog"/> + <menu:menuitem menu:id=".uno:AddField"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OpenReadOnly"/> + <menu:menuitem menu:id=".uno:AutoControlFocus"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MacrosMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MacroRecorder"/> + <menu:menuitem menu:id=".uno:RunMacro"/> + <menu:menuitem menu:id=".uno:BasicIDEAppear"/> + <menu:menuitem menu:id=".uno:ScriptOrganizer"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MacroSignature"/> + <menu:menuitem menu:id=".uno:MacroOrganizer?TabId:short=1"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:RedactDoc"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Rect?FillTransparence:short=50&FillColor:string=COL_GRAY7&LineStyle:short=0&IsSticky:bool=true&ShapeName:string=RectangleRedactionShape"/> + <menu:menuitem menu:id=".uno:Freeline_Unfilled?Transparence:short=50&Color:string=COL_GRAY7&Width:short=500&IsSticky:bool=true&ShapeName:string=FreeformRedactionShape"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:RedactedExportWhite"/> + <menu:menuitem menu:id=".uno:RedactedExportBlack"/> + <menu:menuitem menu:id=".uno:RedactionPreviewExport"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:DevelopmentToolsDockingWindow"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OpenXMLFilterSettings"/> + <menu:menuitem menu:id="service:com.sun.star.deployment.ui.PackageManagerDialog" menu:style="text"/> + <menu:menuitem menu:id=".uno:ConfigureDialog" menu:style="text"/> + <menu:menuitem menu:id=".uno:OptionsTreeDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:WindowList"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:NewWindow"/> + <menu:menuitem menu:id=".uno:CloseWin"/> + <menu:menuseparator/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:HelpMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:HelpIndex"/> + <menu:menuitem menu:id=".uno:ExtendedHelp"/> + <menu:menuitem menu:id=".uno:Documentation"/> + <menu:menuitem menu:id=".uno:TipOfTheDay"/> + <menu:menuitem menu:id=".uno:CommandPopup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:QuestionAnswers"/> + <menu:menuitem menu:id=".uno:SendFeedback"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SafeMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GetInvolved"/> + <menu:menuitem menu:id=".uno:Donation"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowLicense"/> + <menu:menuitem menu:id=".uno:About"/> + </menu:menupopup> + </menu:menu> +</menu:menubar> diff --git a/sd/uiconfig/sdraw/popupmenu/3dobject.xml b/sd/uiconfig/sdraw/popupmenu/3dobject.xml new file mode 100644 index 0000000000..eb88db13df --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/3dobject.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Window3D"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/3dscene.xml b/sd/uiconfig/sdraw/popupmenu/3dscene.xml new file mode 100644 index 0000000000..119a806cf6 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/3dscene.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Window3D"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:EnterGroup"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/3dscene2.xml b/sd/uiconfig/sdraw/popupmenu/3dscene2.xml new file mode 100644 index 0000000000..be05eeeec3 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/3dscene2.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Window3D"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/bezier.xml b/sd/uiconfig/sdraw/popupmenu/bezier.xml new file mode 100644 index 0000000000..4136702322 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/bezier.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierMove"/> + <menu:menuitem menu:id=".uno:BezierInsert"/> + <menu:menuitem menu:id=".uno:BezierDelete"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierClose"/> + <menu:menuitem menu:id=".uno:BezierCutLine"/> + <menu:menuitem menu:id=".uno:BezierConvert"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierEdge"/> + <menu:menuitem menu:id=".uno:BezierSmooth"/> + <menu:menuitem menu:id=".uno:BezierSymmetric"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierEliminatePoints"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/connector.xml b/sd/uiconfig/sdraw/popupmenu/connector.xml new file mode 100644 index 0000000000..f8ddc04ac8 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/connector.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NewRouting"/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:ConnectorAttributes"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/curve.xml b/sd/uiconfig/sdraw/popupmenu/curve.xml new file mode 100644 index 0000000000..ee57366df1 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/curve.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:CloseObject"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuitem menu:id=".uno:Break"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/draw.xml b/sd/uiconfig/sdraw/popupmenu/draw.xml new file mode 100644 index 0000000000..3f11c0fa72 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/draw.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:AdvancedMode"/> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/drawtext.xml b/sd/uiconfig/sdraw/popupmenu/drawtext.xml new file mode 100644 index 0000000000..3cb30bc3f5 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/drawtext.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuitem menu:id=".uno:PasteUnformatted"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuitem menu:id=".uno:OutlineBullet"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OpenHyperlinkOnCursor"/> + <menu:menuitem menu:id=".uno:EditHyperlink"/> + <menu:menuitem menu:id=".uno:CopyHyperlinkLocation"/> + <menu:menuitem menu:id=".uno:RemoveHyperlink"/> + <menu:menuitem menu:id=".uno:ThesaurusFromContext"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/form.xml b/sd/uiconfig/sdraw/popupmenu/form.xml new file mode 100644 index 0000000000..8ea12e638b --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/form.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ControlProperties"/> + <menu:menuitem menu:id=".uno:FormProperties"/> + <menu:menuitem menu:id=".uno:ChangeControlType"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/formrichtext.xml b/sd/uiconfig/sdraw/popupmenu/formrichtext.xml new file mode 100644 index 0000000000..f5f8f7a0d2 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/formrichtext.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CharFontName"/> + <menu:menuitem menu:id=".uno:FontHeight"/> + <menu:menu menu:id=".uno:StyleMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Bold"/> + <menu:menuitem menu:id=".uno:Italic"/> + <menu:menuitem menu:id=".uno:Overline"/> + <menu:menuitem menu:id=".uno:Underline"/> + <menu:menuitem menu:id=".uno:Strikeout"/> + <menu:menuitem menu:id=".uno:Shadowed"/> + <menu:menuitem menu:id=".uno:OutlineFont"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SuperScript"/> + <menu:menuitem menu:id=".uno:SubScript"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TextAlign"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatSpacingMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SpacePara1"/> + <menu:menuitem menu:id=".uno:SpacePara15"/> + <menu:menuitem menu:id=".uno:SpacePara2"/> + </menu:menupopup> + </menu:menu> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/gluepoint.xml b/sd/uiconfig/sdraw/popupmenu/gluepoint.xml new file mode 100644 index 0000000000..c38a993497 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/gluepoint.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:GlueInsertPoint"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionLeft"/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionTop"/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionRight"/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionBottom"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GluePercent"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GlueHorzAlignLeft"/> + <menu:menuitem menu:id=".uno:GlueHorzAlignCenter"/> + <menu:menuitem menu:id=".uno:GlueHorzAlignRight"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GlueVertAlignTop"/> + <menu:menuitem menu:id=".uno:GlueVertAlignCenter"/> + <menu:menuitem menu:id=".uno:GlueVertAlignBottom"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/graphic.xml b/sd/uiconfig/sdraw/popupmenu/graphic.xml new file mode 100644 index 0000000000..6e7c6ef33b --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/graphic.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Crop"/> + <menu:menuitem menu:id=".uno:ExternalEdit"/> + <menu:menuitem menu:id=".uno:ChangePicture"/> + <menu:menuitem menu:id=".uno:CompressGraphic"/> + <menu:menuitem menu:id=".uno:SaveGraphic"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OriginalSize"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:RotateFlipMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Break"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditQrCode"/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/group.xml b/sd/uiconfig/sdraw/popupmenu/group.xml new file mode 100644 index 0000000000..43b99eb991 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/group.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/layertab.xml b/sd/uiconfig/sdraw/popupmenu/layertab.xml new file mode 100644 index 0000000000..9b3a23ab4d --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/layertab.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:InsertLayer"/> + <menu:menuitem menu:id=".uno:ModifyLayer"/> + <menu:menuitem menu:id=".uno:DeleteLayer"/> + <menu:menuitem menu:id=".uno:RenameLayer"/> + <menu:menuitem menu:id=".uno:ToggleLayerVisibility"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/line.xml b/sd/uiconfig/sdraw/popupmenu/line.xml new file mode 100644 index 0000000000..fc94fa4a4d --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/line.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/measure.xml b/sd/uiconfig/sdraw/popupmenu/measure.xml new file mode 100644 index 0000000000..2018233c8a --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/measure.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:MeasureAttributes"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/media.xml b/sd/uiconfig/sdraw/popupmenu/media.xml new file mode 100644 index 0000000000..bdaea5c1f9 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/media.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/multiselect.xml b/sd/uiconfig/sdraw/popupmenu/multiselect.xml new file mode 100644 index 0000000000..0b4c614a0e --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/multiselect.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DistributeSelection"/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:PolyFormen"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Combine"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuitem menu:id=".uno:Connect"/> + <menu:menuitem menu:id=".uno:Break"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Merge"/> + <menu:menuitem menu:id=".uno:Substract"/> + <menu:menuitem menu:id=".uno:Intersect"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EqualizeWidth"/> + <menu:menuitem menu:id=".uno:EqualizeHeight"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:TextCombine"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ExportTo"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/notebookbar.xml b/sd/uiconfig/sdraw/popupmenu/notebookbar.xml new file mode 100644 index 0000000000..ae78bb4ced --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/notebookbar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:AddDirect"/> + <menu:menuitem menu:id=".uno:RecentFileList"/> + <menu:menuitem menu:id=".uno:CloseDoc"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToolbarModeUI"/> + <menu:menuitem menu:id=".uno:AvailableToolbars"/> + <menu:menuitem menu:id=".uno:ConfigureDialog"/> + <menu:menuitem menu:id=".uno:OptionsTreeDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HelpIndex"/> + <menu:menuitem menu:id=".uno:Donation"/> + <menu:menuitem menu:id=".uno:About"/> + <menu:menuseparator/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/objectalign.xml b/sd/uiconfig/sdraw/popupmenu/objectalign.xml new file mode 100644 index 0000000000..4bb17386d1 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/objectalign.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:ObjectAlignLeft"/> + <menu:menuitem menu:id=".uno:AlignCenter"/> + <menu:menuitem menu:id=".uno:ObjectAlignRight"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AlignUp"/> + <menu:menuitem menu:id=".uno:AlignMiddle"/> + <menu:menuitem menu:id=".uno:AlignDown"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/oleobject.xml b/sd/uiconfig/sdraw/popupmenu/oleobject.xml new file mode 100644 index 0000000000..7dfd16192a --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/oleobject.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OriginalSize"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:RotateFlipMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/page.xml b/sd/uiconfig/sdraw/popupmenu/page.xml new file mode 100644 index 0000000000..6fcedee47d --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/page.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowRuler"/> + <menu:menu menu:id=".uno:GridMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:GridVisible"/> + <menu:menuitem menu:id=".uno:GridUse"/> + <menu:menuitem menu:id=".uno:GridFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HelplinesMove"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SnapLinesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:HelplinesVisible"/> + <menu:menuitem menu:id=".uno:HelplinesFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GridUse"/> + <menu:menuitem menu:id=".uno:HelplinesUse"/> + <menu:menuitem menu:id=".uno:SnapFrame"/> + <menu:menuitem menu:id=".uno:SnapPoints"/> + <menu:menuitem menu:id=".uno:SnapBorder"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:CapturePoint"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:PageMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertPage"/> + <menu:menuitem menu:id=".uno:DeletePage"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SelectBackground"/> + <menu:menuitem menu:id=".uno:SaveBackground"/> + <menu:menuitem menu:id=".uno:RenamePage"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:SaveBackground"/> + <menu:menuitem menu:id=".uno:DrawingLayout"/> + <menu:menuitem menu:id=".uno:PageSetup"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/pagepane.xml b/sd/uiconfig/sdraw/popupmenu/pagepane.xml new file mode 100644 index 0000000000..1a809ea4ef --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/pagepane.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertPage"/> + <menu:menuitem menu:id=".uno:DuplicatePage"/> + <menu:menuitem menu:id=".uno:DeletePage"/> + <menu:menuitem menu:id=".uno:RenamePage"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml b/sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml new file mode 100644 index 0000000000..a003a78e63 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertMasterPage"/> + <menu:menuitem menu:id=".uno:DeleteMasterPage"/> + <menu:menuitem menu:id=".uno:RenameMasterPage"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DrawingLayout"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml b/sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml new file mode 100644 index 0000000000..805710ac16 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertPage"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml b/sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml new file mode 100644 index 0000000000..919e3c59ce --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertMasterPage"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/pagetab.xml b/sd/uiconfig/sdraw/popupmenu/pagetab.xml new file mode 100644 index 0000000000..cb40a16b9d --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/pagetab.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertPage"/> + <menu:menuitem menu:id=".uno:DeletePage"/> + <menu:menuitem menu:id=".uno:RenamePage"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/table.xml b/sd/uiconfig/sdraw/popupmenu/table.xml new file mode 100644 index 0000000000..71ae6f2bd5 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/table.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MergeCells"/> + <menu:menuitem menu:id=".uno:SplitCell"/> + <menu:menu menu:id=".uno:TableInsertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertRowsBefore"/> + <menu:menuitem menu:id=".uno:InsertRowsAfter"/> + <menu:menuitem menu:id=".uno:InsertRowDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertColumnsBefore"/> + <menu:menuitem menu:id=".uno:InsertColumnsAfter"/> + <menu:menuitem menu:id=".uno:InsertColumnDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TableDeleteMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:DeleteRows"/> + <menu:menuitem menu:id=".uno:DeleteColumns"/> + <menu:menuitem menu:id=".uno:DeleteTable"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TableAutoFitMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SetRowHeight"/> + <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/> + <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/> + <menu:menuitem menu:id=".uno:DistributeRows"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetColumnWidth"/> + <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/> + <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/> + <menu:menuitem menu:id=".uno:DistributeColumns"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:TableTransformDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TableDialog"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/popupmenu/textbox.xml b/sd/uiconfig/sdraw/popupmenu/textbox.xml new file mode 100644 index 0000000000..5f9c4cd8b2 --- /dev/null +++ b/sd/uiconfig/sdraw/popupmenu/textbox.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TextAutoFitToSize"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:FontWork"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/sdraw/statusbar/statusbar.xml b/sd/uiconfig/sdraw/statusbar/statusbar.xml new file mode 100644 index 0000000000..e89d1abc1f --- /dev/null +++ b/sd/uiconfig/sdraw/statusbar/statusbar.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE statusbar:statusbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "statusbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<statusbar:statusbar xmlns:statusbar="http://openoffice.org/2001/statusbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <statusbar:statusbaritem xlink:href=".uno:PageStatus" statusbar:align="left" statusbar:width="124"/> + <statusbar:statusbaritem xlink:href=".uno:Context" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="184"/> + <statusbar:statusbaritem xlink:href=".uno:LayoutStatus" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="54"/> + <statusbar:statusbaritem xlink:href=".uno:Size" statusbar:align="center" statusbar:ownerdraw="true" statusbar:autosize="true" statusbar:width="200"/> + <statusbar:statusbaritem xlink:href=".uno:Scale" statusbar:align="left" statusbar:autosize="false" statusbar:width="30"/> + <statusbar:statusbaritem xlink:href=".uno:ModifiedStatus" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/> + <statusbar:statusbaritem xlink:href=".uno:Signature" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="16"/> + <statusbar:statusbaritem xlink:href=".uno:ZoomPage" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/> + <statusbar:statusbaritem xlink:href=".uno:ZoomSlider" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="130"/> + <statusbar:statusbaritem xlink:href=".uno:Zoom" statusbar:align="center" statusbar:width="36"/> +</statusbar:statusbar> diff --git a/sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml b/sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml new file mode 100644 index 0000000000..bc0b6f81e7 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Cube"/> + <toolbar:toolbaritem xlink:href=".uno:Sphere"/> + <toolbar:toolbaritem xlink:href=".uno:Cylinder"/> + <toolbar:toolbaritem xlink:href=".uno:Cone"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Cyramid"/> + <toolbar:toolbaritem xlink:href=".uno:Torus"/> + <toolbar:toolbaritem xlink:href=".uno:Shell3D"/> + <toolbar:toolbaritem xlink:href=".uno:HalfSphere"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/alignmentbar.xml b/sd/uiconfig/sdraw/toolbar/alignmentbar.xml new file mode 100644 index 0000000000..38d0340a3d --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/alignmentbar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft"/> + <toolbar:toolbaritem xlink:href=".uno:AlignCenter"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:AlignUp"/> + <toolbar:toolbaritem xlink:href=".uno:AlignMiddle"/> + <toolbar:toolbaritem xlink:href=".uno:AlignDown"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/arrowsbar.xml b/sd/uiconfig/sdraw/toolbar/arrowsbar.xml new file mode 100644 index 0000000000..4e947f2b36 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/arrowsbar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:LineCircleArrow"/> + <toolbar:toolbaritem xlink:href=".uno:LineSquareArrow"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrows"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowStart"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowCircle"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowSquare"/> + <toolbar:toolbaritem xlink:href=".uno:Line"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:MeasureLine"/> + <toolbar:toolbaritem xlink:href=".uno:Line_Diagonal"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/arrowshapes.xml b/sd/uiconfig/sdraw/toolbar/arrowshapes.xml new file mode 100644 index 0000000000..3f74148c7d --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/arrowshapes.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.circular-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.s-sharped-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-round-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.corner-right-arrow"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.chevron"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.pentagon-right"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.striped-right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-down-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.notched-right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow-callout"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow-callout"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/basicshapes.xml b/sd/uiconfig/sdraw/toolbar/basicshapes.xml new file mode 100644 index 0000000000..148245f666 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/basicshapes.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.quadrat"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-quadrat"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.parallelogram"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.trapezoid"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle-pie"/> + <toolbar:toolbaritem xlink:href=".uno:CircleCut"/> + <toolbar:toolbaritem xlink:href=".uno:Arc"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.block-arc"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.isosceles-triangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.right-triangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.diamond"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.pentagon"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.hexagon"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.octagon"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.can"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cube"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.paper"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cross"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.frame"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ring"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml b/sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml new file mode 100644 index 0000000000..914738e7cb --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierMove"/> + <toolbar:toolbaritem xlink:href=".uno:BezierInsert"/> + <toolbar:toolbaritem xlink:href=".uno:BezierDelete"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierConvert"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierClose"/> + <toolbar:toolbaritem xlink:href=".uno:BezierCutLine"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierEdge"/> + <toolbar:toolbaritem xlink:href=".uno:BezierSmooth"/> + <toolbar:toolbaritem xlink:href=".uno:BezierSymmetric"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierEliminatePoints"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/calloutshapes.xml b/sd/uiconfig/sdraw/toolbar/calloutshapes.xml new file mode 100644 index 0000000000..04176302cc --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/calloutshapes.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.rectangular-callout"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-rectangular-callout"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-callout"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.cloud-callout"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-1"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-2"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-3"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/choosemodebar.xml b/sd/uiconfig/sdraw/toolbar/choosemodebar.xml new file mode 100644 index 0000000000..c8bda07626 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/choosemodebar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/> + <toolbar:toolbaritem xlink:href=".uno:Mirror"/> + <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLathe"/> + <toolbar:toolbaritem xlink:href=".uno:CrookRotate"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CrookSlant"/> + <toolbar:toolbaritem xlink:href=".uno:Shear"/> + <toolbar:toolbaritem xlink:href=".uno:InteractiveTransparence"/> + <toolbar:toolbaritem xlink:href=".uno:InteractiveGradient"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/colorbar.xml b/sd/uiconfig/sdraw/toolbar/colorbar.xml new file mode 100644 index 0000000000..879b6a6476 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/colorbar.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:GrafRed"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafGreen"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafBlue"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafLuminance"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafContrast"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafGamma"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/commentsbar.xml b/sd/uiconfig/sdraw/toolbar/commentsbar.xml new file mode 100644 index 0000000000..a2f6a6eac5 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/commentsbar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertAnnotation"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:PreviousAnnotation"/> + <toolbar:toolbaritem xlink:href=".uno:NextAnnotation"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:DeleteAnnotation"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteAllAnnotation"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/connectorsbar.xml b/sd/uiconfig/sdraw/toolbar/connectorsbar.xml new file mode 100644 index 0000000000..8355775e2a --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/connectorsbar.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowEnd"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Connector"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLine"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurve"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLines"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorArrows"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrows"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrows"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrows"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowStart" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleEnd" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleStart" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCircles" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircles" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircles" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircles" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/distributebar.xml b/sd/uiconfig/sdraw/toolbar/distributebar.xml new file mode 100644 index 0000000000..308104262c --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/distributebar.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzLeft"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzCenter"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzDistance"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzRight"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertTop"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertCenter"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertDistance"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertBottom"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml b/sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml new file mode 100644 index 0000000000..5dfd2a4384 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BringToFront"/> + <toolbar:toolbaritem xlink:href=".uno:Forward"/> + <toolbar:toolbaritem xlink:href=".uno:Backward"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/> + <toolbar:toolbaritem xlink:href=".uno:BehindObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/> + <toolbar:toolbaritem xlink:href=".uno:LineWidth"/> + <toolbar:toolbaritem xlink:href=".uno:XLineColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FillShadow"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineEndStyle"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/> + <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/> + <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Window3D" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ImageMapDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:DesignerDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> +</toolbar:toolbar> + diff --git a/sd/uiconfig/sdraw/toolbar/ellipsesbar.xml b/sd/uiconfig/sdraw/toolbar/ellipsesbar.xml new file mode 100644 index 0000000000..35167b9c75 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/ellipsesbar.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Ellipse"/> + <toolbar:toolbaritem xlink:href=".uno:Circle"/> + <toolbar:toolbaritem xlink:href=".uno:Pie"/> + <toolbar:toolbaritem xlink:href=".uno:CirclePie"/> + <toolbar:toolbaritem xlink:href=".uno:EllipseCut"/> + <toolbar:toolbaritem xlink:href=".uno:CircleCut"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Ellipse_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Circle_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Pie_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:CirclePie_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:EllipseCut_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:CircleCut_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Arc"/> + <toolbar:toolbaritem xlink:href=".uno:CircleArc"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml b/sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml new file mode 100644 index 0000000000..5f5ff29168 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltDown"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltUp"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltLeft"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltRight"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionDepthFloater"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionDirectionFloater"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionLightingFloater"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionSurfaceFloater"/> + <toolbar:toolbaritem xlink:href=".uno:Extrusion3DColor"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/findbar.xml b/sd/uiconfig/sdraw/toolbar/findbar.xml new file mode 100644 index 0000000000..7c71a1ac27 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/findbar.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ExitSearch"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:FindAll"/> + <toolbar:toolbaritem xlink:href=".uno:MatchCase"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchLabel"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/flowchartshapes.xml b/sd/uiconfig/sdraw/toolbar/flowchartshapes.xml new file mode 100644 index 0000000000..c1f6768958 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/flowchartshapes.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-process"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-alternate-process"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-decision"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-data"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-predefined-process"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-internal-storage"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-document"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-multidocument"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-terminator"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-preparation"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-input"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-operation"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-connector"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-off-page-connector"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-card"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-punched-tape"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-summing-junction"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-or"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-collate"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sort"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-extract"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-merge"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-stored-data"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-delay"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sequential-access"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-magnetic-disk"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-direct-access-storage"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-display"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml b/sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml new file mode 100644 index 0000000000..948ff1e6f0 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkSameLetterHeights"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontworkAlignmentFloater"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkCharacterSpacingFloater"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml b/sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml new file mode 100644 index 0000000000..46a83209bd --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-plain-text"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-wave"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-inflate"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-stop"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-down"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-down"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-right"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-left"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-down"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-down"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-right"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-left"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-down"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-curve"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-pour"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/formcontrols.xml b/sd/uiconfig/sdraw/toolbar/formcontrols.xml new file mode 100644 index 0000000000..b79e0e0018 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/formcontrols.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbaritem xlink:href=".uno:SwitchControlDesignMode"/> + <toolbar:toolbaritem xlink:href=".uno:UseWizards"/> + <toolbar:toolbaritem xlink:href=".uno:FormDesignTools"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ControlProperties" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormProperties" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Label"/> + <toolbar:toolbaritem xlink:href=".uno:Edit"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CheckBox"/> + <toolbar:toolbaritem xlink:href=".uno:RadioButton"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ListBox"/> + <toolbar:toolbaritem xlink:href=".uno:ComboBox"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Pushbutton"/> + <toolbar:toolbaritem xlink:href=".uno:Imagebutton"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FormattedField"/> + <toolbar:toolbaritem xlink:href=".uno:DateField"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:NumericField"/> + <toolbar:toolbaritem xlink:href=".uno:GroupBox"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:TimeField"/> + <toolbar:toolbaritem xlink:href=".uno:CurrencyField"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:PatternField"/> + <toolbar:toolbaritem xlink:href=".uno:Grid"/> + <toolbar:toolbaritem xlink:href=".uno:NavigationBar"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ImageControl"/> + <toolbar:toolbaritem xlink:href=".uno:FileControl"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SpinButton"/> + <toolbar:toolbaritem xlink:href=".uno:ScrollBar"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/formdesign.xml b/sd/uiconfig/sdraw/toolbar/formdesign.xml new file mode 100644 index 0000000000..b75fab75f3 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/formdesign.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ControlProperties"/> + <toolbar:toolbaritem xlink:href=".uno:FormProperties"/> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ShowFmExplorer"/> + <toolbar:toolbaritem xlink:href=".uno:TabDialog"/> + <toolbar:toolbaritem xlink:href=".uno:AddField"/> + <toolbar:toolbaritem xlink:href=".uno:AutoControlFocus"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BringToFront" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatGroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatUngroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EnterGroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:LeaveGroup" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:OpenReadOnly"/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/formsfilterbar.xml b/sd/uiconfig/sdraw/toolbar/formsfilterbar.xml new file mode 100644 index 0000000000..096d7e73d8 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/formsfilterbar.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FormFilterExecute"/> + <toolbar:toolbaritem xlink:href=".uno:FormFilterNavigator"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormFilterExit"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml b/sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml new file mode 100644 index 0000000000..4ffa664e64 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:RecSearch"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:RecText"/> + <toolbar:toolbaritem xlink:href=".uno:AbsoluteRecord"/> + <toolbar:toolbaritem xlink:href=".uno:RecFromText"/> + <toolbar:toolbaritem xlink:href=".uno:RecTotal"/> + <toolbar:toolbaritem xlink:href=".uno:FirstRecord"/> + <toolbar:toolbaritem xlink:href=".uno:PrevRecord"/> + <toolbar:toolbaritem xlink:href=".uno:NextRecord"/> + <toolbar:toolbaritem xlink:href=".uno:LastRecord"/> + <toolbar:toolbaritem xlink:href=".uno:NewRecord"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:RecSave"/> + <toolbar:toolbaritem xlink:href=".uno:RecUndo"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteRecord"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Refresh"/> + <toolbar:toolbaritem xlink:href=".uno:RefreshFormControl"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:OrderCrit"/> + <toolbar:toolbaritem xlink:href=".uno:Sortup"/> + <toolbar:toolbaritem xlink:href=".uno:SortDown"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AutoFilter"/> + <toolbar:toolbaritem xlink:href=".uno:FormFiltered"/> + <toolbar:toolbaritem xlink:href=".uno:FormFilter"/> + <toolbar:toolbaritem xlink:href=".uno:RemoveFilterSort"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ViewFormAsGrid"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml b/sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml new file mode 100644 index 0000000000..a055cba036 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:CharFontName"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontHeight"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Bold"/> + <toolbar:toolbaritem xlink:href=".uno:Italic"/> + <toolbar:toolbaritem xlink:href=".uno:Underline"/> + <toolbar:toolbaritem xlink:href=".uno:SuperScript"/> + <toolbar:toolbaritem xlink:href=".uno:SubScript"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LeftPara"/> + <toolbar:toolbaritem xlink:href=".uno:CenterPara"/> + <toolbar:toolbaritem xlink:href=".uno:RightPara"/> + <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/> + <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SpacePara1"/> + <toolbar:toolbaritem xlink:href=".uno:SpacePara15"/> + <toolbar:toolbaritem xlink:href=".uno:SpacePara2"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontDialog"/> + <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/fullscreenbar.xml b/sd/uiconfig/sdraw/toolbar/fullscreenbar.xml new file mode 100644 index 0000000000..9b007728dc --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/fullscreenbar.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FullScreen"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml b/sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml new file mode 100644 index 0000000000..0183493e9b --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:GlueInsertPoint"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionLeft"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionTop"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionRight"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GluePercent"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignLeft"/> + <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignCenter"/> + <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignRight"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignTop"/> + <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignCenter"/> + <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignBottom"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/graffilterbar.xml b/sd/uiconfig/sdraw/toolbar/graffilterbar.xml new file mode 100644 index 0000000000..f820a8112a --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/graffilterbar.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterInvert"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSmooth"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSharpen"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRemoveNoise"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSolarize"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSepia"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPoster"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPopart"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSobel"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRelief"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterMosaic"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml b/sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml new file mode 100644 index 0000000000..95113efc9f --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BringToFront"/> + <toolbar:toolbaritem xlink:href=".uno:Forward"/> + <toolbar:toolbaritem xlink:href=".uno:Backward"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/> + <toolbar:toolbaritem xlink:href=".uno:BehindObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/> + <toolbar:toolbaritem xlink:href=".uno:LineWidth"/> + <toolbar:toolbaritem xlink:href=".uno:XLineColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FillShadow"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GrafMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Crop"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/> + <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/> + <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GrafTransparence"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ColorSettings"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/> +</toolbar:toolbar> + diff --git a/sd/uiconfig/sdraw/toolbar/insertbar.xml b/sd/uiconfig/sdraw/toolbar/insertbar.xml new file mode 100644 index 0000000000..19df34a792 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/insertbar.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertPage"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ImportFromFile" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:InsertTable"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/> + <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/> + <toolbar:toolbaritem xlink:href=".uno:InsertMath"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObject" toolbar:visible="false"/> + <toolbar:toolbarseparator/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/linesbar.xml b/sd/uiconfig/sdraw/toolbar/linesbar.xml new file mode 100644 index 0000000000..5e29f23a70 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/linesbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:BezierFill"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Bezier_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml b/sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml new file mode 100644 index 0000000000..79d269c0cc --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertMasterPage"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteMasterPage"/> + <toolbar:toolbaritem xlink:href=".uno:RenameMasterPage"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:CloseMasterView"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml b/sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml new file mode 100644 index 0000000000..6762534839 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AVMediaToolBox"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml b/sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml new file mode 100644 index 0000000000..a6cac0f1ff --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Menubar"/> + <toolbar:toolbaritem xlink:href=".uno:Open"/> + <toolbar:toolbaritem xlink:href=".uno:Save"/> + <toolbar:toolbaritem xlink:href=".uno:Undo"/> + <toolbar:toolbaritem xlink:href=".uno:Redo"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/optimizetablebar.xml b/sd/uiconfig/sdraw/toolbar/optimizetablebar.xml new file mode 100644 index 0000000000..e1bab26b2b --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/optimizetablebar.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SetMinimalRowHeight"/> + <toolbar:toolbaritem xlink:href=".uno:SetMinimalColumnWidth"/> + <toolbar:toolbaritem xlink:href=".uno:SetOptimalRowHeight"/> + <toolbar:toolbaritem xlink:href=".uno:SetOptimalColumnWidth"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeRows"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeColumns"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/optionsbar.xml b/sd/uiconfig/sdraw/toolbar/optionsbar.xml new file mode 100644 index 0000000000..b8be8a12f6 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/optionsbar.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ClickChangeRotation"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesVisible"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesUse"/> + <toolbar:toolbaritem xlink:href=".uno:SnapBorder"/> + <toolbar:toolbaritem xlink:href=".uno:SnapFrame"/> + <toolbar:toolbaritem xlink:href=".uno:SnapPoints"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:QuickEdit"/> + <toolbar:toolbaritem xlink:href=".uno:PickThrough"/> + <toolbar:toolbaritem xlink:href=".uno:DoubleClickTextEdit"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SolidCreate"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LeaveAllGroups"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/positionbar.xml b/sd/uiconfig/sdraw/toolbar/positionbar.xml new file mode 100644 index 0000000000..5f91c67e87 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/positionbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:BringToFront"/> + <toolbar:toolbaritem xlink:href=".uno:Forward"/> + <toolbar:toolbaritem xlink:href=".uno:Backward"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/> + <toolbar:toolbaritem xlink:href=".uno:BehindObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/rectanglesbar.xml b/sd/uiconfig/sdraw/toolbar/rectanglesbar.xml new file mode 100644 index 0000000000..2f03f49f1f --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/rectanglesbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Rect"/> + <toolbar:toolbaritem xlink:href=".uno:Square"/> + <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded"/> + <toolbar:toolbaritem xlink:href=".uno:Square_Rounded"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Rect_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Square_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Square_Rounded_Unfilled"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/redactedexportbar.xml b/sd/uiconfig/sdraw/toolbar/redactedexportbar.xml new file mode 100644 index 0000000000..42cc31a59d --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/redactedexportbar.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:RedactedExportWhite"/> + <toolbar:toolbaritem xlink:href=".uno:RedactedExportBlack"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/redactionbar.xml b/sd/uiconfig/sdraw/toolbar/redactionbar.xml new file mode 100644 index 0000000000..2e4734e205 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/redactionbar.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Rect?FillTransparence:short=50&FillColor:string=COL_GRAY7&LineStyle:short=0&IsSticky:bool=true&ShapeName:string=RectangleRedactionShape"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled?Transparence:short=50&Color:string=COL_GRAY7&Width:short=500&IsSticky:bool=true&ShapeName:string=FreeformRedactionShape"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:RedactedExportWhite"/> + <toolbar:toolbaritem xlink:href=".uno:RedactedExportBlack"/> + <toolbar:toolbaritem xlink:href=".uno:RedactionPreviewExport"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/standardbar.xml b/sd/uiconfig/sdraw/toolbar/standardbar.xml new file mode 100644 index 0000000000..915e201e90 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/standardbar.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:OpenUrl" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AddDirect"/> + <toolbar:toolbaritem xlink:href=".uno:NewDoc" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Open"/> + <toolbar:toolbaritem xlink:href=".uno:OpenRemote" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Save"/> + <toolbar:toolbaritem xlink:href=".uno:SaveAs" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SendMail" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExportTo"/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/> + <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Print"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Cut"/> + <toolbar:toolbaritem xlink:href=".uno:Copy"/> + <toolbar:toolbaritem xlink:href=".uno:Paste"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatPaintbrush"/> + <toolbar:toolbaritem xlink:href=".uno:SetDefault" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Undo"/> + <toolbar:toolbaritem xlink:href=".uno:Redo"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SpellDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SpellOnline" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomObjects" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertTable" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Text"/> + <toolbar:toolbaritem xlink:href=".uno:CharmapControl"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/> + <toolbar:toolbaritem xlink:href=".uno:HyperlinkDialog" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/> + <toolbar:toolbaritem xlink:href=".uno:Mirror" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeSelection"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FillShadow"/> + <toolbar:toolbaritem xlink:href=".uno:Crop"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Window3D" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEditMode"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/> + <toolbar:toolbaritem xlink:href=".uno:InsertDraw"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:HelpIndex" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ExtendedHelp" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FirstPage" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:PreviousPage" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:NextPage" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:LastPage" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MovePageFirst" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:MovePageUp" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:MovePageDown" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:MovePageLast" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/starshapes.xml b/sd/uiconfig/sdraw/toolbar/starshapes.xml new file mode 100644 index 0000000000..cbc07fc70a --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/starshapes.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star4"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star5"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star6"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star8"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star12"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star24"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.bang"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.vertical-scroll"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.horizontal-scroll"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.signet"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.doorplate"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.concave-star6"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/symbolshapes.xml b/sd/uiconfig/sdraw/toolbar/symbolshapes.xml new file mode 100644 index 0000000000..9ba9f22e0c --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/symbolshapes.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.smiley"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.heart"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.sun"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.moon"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.cloud"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.lightning"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.flower"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.forbidden"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.puzzle"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.quad-bevel"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.octagon-bevel"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.diamond-bevel"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.bracket-pair"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-bracket"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-bracket"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.brace-pair"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-brace"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-brace"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/tableobjectbar.xml b/sd/uiconfig/sdraw/toolbar/tableobjectbar.xml new file mode 100644 index 0000000000..f2f821273c --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/tableobjectbar.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertTable"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FrameLineColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SetBorderStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MergeCells"/> + <toolbar:toolbaritem xlink:href=".uno:SplitCell"/> + <toolbar:toolbaritem xlink:href=".uno:OptimizeTable"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertRowsBefore"/> + <toolbar:toolbaritem xlink:href=".uno:InsertRowsAfter"/> + <toolbar:toolbaritem xlink:href=".uno:InsertColumnsBefore"/> + <toolbar:toolbaritem xlink:href=".uno:InsertColumnsAfter"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteRows"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteColumns"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteTable"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SelectTable" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EntireColumn" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EntireRow" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:TableDialog"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/textbar.xml b/sd/uiconfig/sdraw/toolbar/textbar.xml new file mode 100644 index 0000000000..8121a4eef4 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/textbar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Text"/> + <toolbar:toolbaritem xlink:href=".uno:TextFitToSizeTool"/> + <toolbar:toolbaritem xlink:href=".uno:DrawCaption"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalTextFitToSizeTool"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalCaption"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/toolbar/textobjectbar.xml b/sd/uiconfig/sdraw/toolbar/textobjectbar.xml new file mode 100644 index 0000000000..23d269b011 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/textobjectbar.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:CharFontName"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontHeight"/> + <toolbar:toolbaritem xlink:href=".uno:Grow"/> + <toolbar:toolbaritem xlink:href=".uno:Shrink"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Bold"/> + <toolbar:toolbaritem xlink:href=".uno:Italic"/> + <toolbar:toolbaritem xlink:href=".uno:Underline"/> + <toolbar:toolbaritem xlink:href=".uno:UnderlineDouble" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Strikeout"/> + <toolbar:toolbaritem xlink:href=".uno:Overline" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SuperScript"/> + <toolbar:toolbaritem xlink:href=".uno:SubScript"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Shadowed"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineFont"/> + <toolbar:toolbaritem xlink:href=".uno:SetDefault"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToLower" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToUpper" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SmallCaps" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Color"/> + <toolbar:toolbaritem xlink:href=".uno:CharBackColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LeftPara"/> + <toolbar:toolbaritem xlink:href=".uno:CenterPara"/> + <toolbar:toolbaritem xlink:href=".uno:RightPara"/> + <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:DefaultBullet"/> + <toolbar:toolbaritem xlink:href=".uno:DefaultNumbering"/> + <toolbar:toolbaritem xlink:href=".uno:SetOutline" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:IncrementIndent"/> + <toolbar:toolbaritem xlink:href=".uno:DecrementIndent"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineSpacing"/> + <toolbar:toolbaritem xlink:href=".uno:Spacing" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ParaspaceIncrease"/> + <toolbar:toolbaritem xlink:href=".uno:ParaspaceDecrease"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:TextdirectionLeftToRight"/> + <toolbar:toolbaritem xlink:href=".uno:TextdirectionTopToBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/> + <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SelectAll" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FontDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/toolbar.xml b/sd/uiconfig/sdraw/toolbar/toolbar.xml new file mode 100644 index 0000000000..c48f722231 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/toolbar.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomObjects" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Text" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:InsertGraphic" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:InsertToolbox" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:XLineColor"/> + <toolbar:toolbaritem xlink:href=".uno:FillColor"/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Line"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Bezier_Unfilled" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ArrowsToolbox"/> + <toolbar:toolbaritem xlink:href=".uno:LineToolbox"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes"/> + <toolbar:toolbaritem xlink:href=".uno:Objects3DToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEditMode" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ChangeBezier" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ChangePolygon" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConvertInto3D" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLatheFast" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Config" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/viewerbar.xml b/sd/uiconfig/sdraw/toolbar/viewerbar.xml new file mode 100644 index 0000000000..85099a7b5f --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/viewerbar.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SaveAs"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ReadOnlyDoc" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SendMail"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToEPUB" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Print"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Copy"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Zoom"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/zoombar.xml b/sd/uiconfig/sdraw/toolbar/zoombar.xml new file mode 100644 index 0000000000..6507ec8190 --- /dev/null +++ b/sd/uiconfig/sdraw/toolbar/zoombar.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ZoomPlus"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMinus"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Zoom100Percent"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPrevious" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomNext" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPage"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPageWidth"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomOptimal"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomObjects"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPanning"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/sdraw/ui/breakdialog.ui b/sd/uiconfig/sdraw/ui/breakdialog.ui new file mode 100644 index 0000000000..e4cf55cc94 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/breakdialog.ui @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.4 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="BreakDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="breakdialog|BreakDialog">Break</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">12</property> + <property name="column_spacing">12</property> + <property name="column_homogeneous">True</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="breakdialog|label1">Processing metafile:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="breakdialog|label2">Broken down metaobjects:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="breakdialog|label3">Inserted drawing objects:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="metafiles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label"> </property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="metaobjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label"> </property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="drawingobjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label"> </property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-6">cancel</action-widget> + </action-widgets> + <child> + <placeholder/> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/bulletsandnumbering.ui b/sd/uiconfig/sdraw/ui/bulletsandnumbering.ui new file mode 100644 index 0000000000..327c45e0b3 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/bulletsandnumbering.ui @@ -0,0 +1,210 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="BulletsAndNumberingDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="bulletsandnumbering|BulletsAndNumberingDialog">Bullets and Numbering</property> + <property name="modal">True</property> + <property name="window_position">mouse</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="reset"> + <property name="label" translatable="yes" context="bulletsandnumbering|reset">Reset</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="position"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="bulletsandnumbering|position">Position</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="customize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="bulletsandnumbering|customize">Customize</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">reset</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/copydlg.ui b/sd/uiconfig/sdraw/ui/copydlg.ui new file mode 100644 index 0000000000..76b83763ec --- /dev/null +++ b/sd/uiconfig/sdraw/ui/copydlg.ui @@ -0,0 +1,581 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">1</property> + <property name="upper">999</property> + <property name="value">1</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="lower">-360</property> + <property name="upper">360</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">sd/res/pipette.png</property> + </object> + <object class="GtkDialog" id="DuplicateDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="copydlg|DuplicateDialog">Duplicate</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="default"> + <property name="label" translatable="yes" context="copydlg|default">_Default</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="default-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|default">Resets the values visible in the dialog back to the default installation values.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="ok-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|ok">Saves all changes and closes dialog.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="cancel-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|cancel">Closes dialog and discards all changes.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label4">Number of _copies:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">copies</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="copies"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">12</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment1</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="copies-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|copies">Enter the number of copies you want to make.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="viewdata"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="copydlg|viewdata|tooltip_text">Values from Selection</property> + <property name="image">image1</property> + <property name="always_show_image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="viewdata-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="copydlg|viewdata-atkobject">Values from Selection</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="row_spacing">3</property> + <property name="column_spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label5">_X axis:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">x</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label6">_Y axis:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">y</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label7">_Angle:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">angle</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="x"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="digits">2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="x-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|x">Enter the horizontal distance between the centers of the selected object and the duplicate object. Positive values shift the duplicate object to the right and negative values shift the duplicate object to the left.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="y"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="digits">2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="y-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|y">Enter the vertical distance between the centers of the selected object and the duplicate object. Positive values shift the duplicate object down and negative values shift the duplicate object up.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="angle"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment2</property> + <property name="digits">2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="angle-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|angle">Enter the angle (0 to 359 degrees) by which you want to rotate the duplicate object. Positive values rotate the duplicate object in a clockwise direction and negative values in a counterclockwise direction.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label1">Placement</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="row_spacing">3</property> + <property name="column_spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label8">_Width:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">width</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label9">_Height:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">height</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="width"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="digits">2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="width-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|width">Enter the amount by which you want to enlarge or reduce the width of the duplicate object.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="height"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="digits">2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="height-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|height">Enter the amount by which you want to enlarge or reduce the height of the duplicate object.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label2">Enlargement</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="row_spacing">3</property> + <property name="column_spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label10">_Start:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">start</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="endlabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|endlabel">_End:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">end</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="start"> + <property name="label" translatable="no"></property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <child> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="start-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|start">Choose a color for the selected object.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="end"> + <property name="label" translatable="no"></property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <child> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="end-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|end">Choose a color for the duplicate object. If you are making more than one copy, this color is applied to the last copy.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="copydlg|label3">Colors</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">default</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="DuplicateDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|DuplicateDialog">Makes one or more copies of a selected object.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroup1"> + <widgets> + <widget name="label4"/> + <widget name="label5"/> + <widget name="label6"/> + <widget name="label7"/> + <widget name="label8"/> + <widget name="label9"/> + <widget name="label10"/> + <widget name="endlabel"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/crossfadedialog.ui b/sd/uiconfig/sdraw/ui/crossfadedialog.ui new file mode 100644 index 0000000000..8d017eafc3 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/crossfadedialog.ui @@ -0,0 +1,207 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">1</property> + <property name="upper">256</property> + <property name="value">1</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkDialog" id="CrossFadeDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="crossfadedialog|CrossFadeDialog">Cross-fading</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkCheckButton" id="orientation"> + <property name="label" translatable="yes" context="crossfadedialog|orientation">Same orientation</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="orientation-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|orientation">Applies a smooth transition between the selected objects.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="attributes"> + <property name="label" translatable="yes" context="crossfadedialog|attributes">Cross-fade attributes</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="attributes-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|attributes">Applies cross-fading to the line and fill properties of the selected objects.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="crossfadedialog|label2">Increments:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">increments</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="increments"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment1</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="increments-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|increments">Enter the number of shapes you want between the two selected objects.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="crossfadedialog|label1">Settings</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="CrossFadeDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|CrossFadeDialog">Creates shapes and distributes them by uniform increments between two drawing objects.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/dlgsnap.ui b/sd/uiconfig/sdraw/ui/dlgsnap.ui new file mode 100644 index 0000000000..9753706a04 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/dlgsnap.ui @@ -0,0 +1,344 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="SnapObjectDialog"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="dlgsnap|SnapObjectDialog">New Snap Object</property> + <property name="modal">True</property> + <property name="default-width">0</property> + <property name="default-height">0</property> + <property name="type-hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can-focus">False</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="delete"> + <property name="label" translatable="yes" context="stock">_Delete</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="delete-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|delete">Deletes the selected snap point or snap line.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=2 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkSpinButton" id="x"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <property name="truncate-multiline">True</property> + <property name="digits">2</property> + <child internal-child="accessible"> + <object class="AtkObject" id="x-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|x">Enter the amount of space you want between the snap point or line and the left edge of the page.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="y"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <property name="truncate-multiline">True</property> + <property name="digits">2</property> + <child internal-child="accessible"> + <object class="AtkObject" id="y-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|y">Enter the amount of space you want between the snap point or line and the top edge of the page.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="xlabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="dlgsnap|xlabel">_X:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">x</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="ylabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="dlgsnap|ylabel">_Y:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">y</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="dlgsnap|label1">Position</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="radiogroup"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=3 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">sd/res/hlppoint.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">sd/res/hlplvert.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">sd/res/hlplhorz.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="point"> + <property name="label" translatable="yes" context="dlgsnap|point">_Point</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="point-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|point">Inserts a snap point.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="vert"> + <property name="label" translatable="yes" context="dlgsnap|vert">_Vertical</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">point</property> + <child internal-child="accessible"> + <object class="AtkObject" id="vert-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|vert">Inserts a vertical snap line.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="horz"> + <property name="label" translatable="yes" context="dlgsnap|horz">Hori_zontal</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">point</property> + <child internal-child="accessible"> + <object class="AtkObject" id="horz-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|horz">Inserts a horizontal snap line.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="dlgsnap|label2">Type</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">delete</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child internal-child="accessible"> + <object class="AtkObject" id="SnapObjectDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|SnapObjectDialog">Inserts a snap point or snap line (also known as guide) that you can use to quickly align objects.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/drawchardialog.ui b/sd/uiconfig/sdraw/ui/drawchardialog.ui new file mode 100644 index 0000000000..27138d54ee --- /dev/null +++ b/sd/uiconfig/sdraw/ui/drawchardialog.ui @@ -0,0 +1,302 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="DrawCharDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="drawchardialog|DrawCharDialog">Character</property> + <property name="modal">True</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="reset"> + <property name="label" translatable="yes" context="stock">_Reset</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_CHAR_NAME"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_CHAR_NAME">Fonts</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_CHAR_EFFECTS"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_CHAR_EFFECTS">Font Effects</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_CHAR_POSITION"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_CHAR_POSITION">Position</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_BKG"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_BKG">Highlighting</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">reset</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/drawpagedialog.ui b/sd/uiconfig/sdraw/ui/drawpagedialog.ui new file mode 100644 index 0000000000..c6895a46a8 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/drawpagedialog.ui @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="DrawPageDialog"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="drawpagedialog|DrawPageDialog">Page Properties</property> + <property name="modal">True</property> + <property name="type-hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can-focus">False</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="reset"> + <property name="label" translatable="yes" context="stock">_Reset</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable-popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_PAGE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_PAGE">Page</property> + </object> + <packing> + <property name="tab-fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_AREA"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_AREA">Background</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab-fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_TRANSPARENCE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_TRANSPARENCE">Transparency</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab-fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">reset</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/drawparadialog.ui b/sd/uiconfig/sdraw/ui/drawparadialog.ui new file mode 100644 index 0000000000..311f610a63 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/drawparadialog.ui @@ -0,0 +1,351 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="DrawParagraphPropertiesDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="drawparadialog|DrawParagraphPropertiesDialog">Paragraph</property> + <property name="modal">True</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="reset"> + <property name="label" translatable="yes" context="stock">_Reset</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="labelTP_PARA_STD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawparadialog|labelTP_PARA_STD">Indents & Spacing</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="labelTP_PARA_ASIAN"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawparadialog|labelTP_PARA_ASIAN">Asian Typography</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="labelTP_TABULATOR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawparadialog|labelTP_TABULATOR">Tabs</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="labelTP_PARA_ALIGN"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawparadialog|labelTP_PARA_ALIGN">Alignment</property> + <property name="xalign">0.5</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="labelNUMBERING"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawparadialog|labelNUMBERING">Numbering</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">reset</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/drawprinteroptions.ui b/sd/uiconfig/sdraw/ui/drawprinteroptions.ui new file mode 100644 index 0000000000..387ecb6508 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/drawprinteroptions.ui @@ -0,0 +1,299 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="contents"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkCheckButton" id="printname"> + <property name="label" translatable="yes" context="drawprinteroptions|printname">Page name</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="printname-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|printname">Specifies whether to print the page name of a document.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="printdatetime"> + <property name="label" translatable="yes" context="drawprinteroptions|printdatetime">Date and time</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="printdatetime-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|printdatetime">Specifies whether to print the current date and time.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="drawprinteroptions|label4">Contents</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="color"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkRadioButton" id="originalcolors"> + <property name="label" translatable="yes" context="drawprinteroptions|originalcolors">Original colors</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="originalcolors-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|originalcolors">Specifies to print in original colors.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="grayscale"> + <property name="label" translatable="yes" context="drawprinteroptions|grayscale">Grayscale</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalcolors</property> + <child internal-child="accessible"> + <object class="AtkObject" id="grayscale-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|grayscale">Specifies to print colors as grayscale.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="blackandwhite"> + <property name="label" translatable="yes" context="drawprinteroptions|blackandwhite">Black & white</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalcolors</property> + <child internal-child="accessible"> + <object class="AtkObject" id="blackandwhite-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|blackandwhite">Specifies to print colors as black and white.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="drawprinteroptions|label5">Color</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="pagesizes"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkRadioButton" id="originalsize"> + <property name="label" translatable="yes" context="drawprinteroptions|originalsize">Original size</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="originalsize-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|originalsize">Specifies that you do not want to further scale pages when printing.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="fittoprintable"> + <property name="label" translatable="yes" context="drawprinteroptions|fittoprintable">Fit to printable page</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalsize</property> + <child internal-child="accessible"> + <object class="AtkObject" id="fittoprintable-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|fittoprinttable">Specifies whether to scale down objects that are beyond the margins of the current printer so they fit on the paper in the printer.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="distributeonmultiple"> + <property name="label" translatable="yes" context="drawprinteroptions|distributeonmultiple">Distribute on multiple sheets of paper</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalsize</property> + <child internal-child="accessible"> + <object class="AtkObject" id="distributeonmultiple-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|distributeonmultiple">Prints a large format document, such as a poster or banner, by distributing the document page across multiple sheets of paper. The distribution option calculates how many sheets of paper are needed. You can then piece together the sheets.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="tilesheet"> + <property name="label" translatable="yes" context="drawprinteroptions|tilesheet">Tile sheet of paper with repeated pages</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalsize</property> + <child internal-child="accessible"> + <object class="AtkObject" id="tilesheet-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|tilesheet">Specifies that pages are to be printed in tiled format. If the pages are smaller than the paper, the page will be repeated multiple times on one sheet of paper.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="drawprinteroptions|label6">Size</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/drawprtldialog.ui b/sd/uiconfig/sdraw/ui/drawprtldialog.ui new file mode 100644 index 0000000000..cb76791448 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/drawprtldialog.ui @@ -0,0 +1,880 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="DrawPRTLDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="drawprtldialog|DrawPRTLDialog">Presentation Layout</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="reset"> + <property name="label" translatable="yes" context="stock">_Reset</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_LINE"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_LINE">Line</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_AREA"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_AREA">Area</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_SHADOW"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_SHADOW">Shadow</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_TRANSPARENCE"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_TRANSPARENCE">Transparency</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_CHAR_NAME"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_CHAR_NAME">Font</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">5</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_CHAR_EFFECTS"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_CHAR_EFFECTS">Font Effects</property> + </object> + <packing> + <property name="position">5</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">6</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_STD_PARAGRAPH"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_STD_PARAGRAPH">Indents & Spacing</property> + </object> + <packing> + <property name="position">6</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">7</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_TEXTATTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_TEXTATTR">Text</property> + </object> + <packing> + <property name="position">7</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">8</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_PICK_BULLET"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PICK_BULLET">Bullets</property> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">9</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_PICK_SINGLE_NUM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PICK_SINGLE_NUM">Numbering</property> + </object> + <packing> + <property name="position">9</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_PICK_BMP"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PICK_BMP">Image</property> + </object> + <packing> + <property name="position">10</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">11</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_NUM_OPTIONS"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_NUM_OPTIONS">Customize</property> + </object> + <packing> + <property name="position">11</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_ALIGN_PARAGRAPH"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_ALIGN_PARAGRAPH">Alignment</property> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_PARA_ASIAN"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PARA_ASIAN">Asian Typography</property> + </object> + <packing> + <property name="position">13</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">14</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_TABULATOR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_TABULATOR">Tabs</property> + </object> + <packing> + <property name="position">14</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="RID_SVXPAGE_BKG"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_BKG">Highlighting</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">reset</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/insertlayer.ui b/sd/uiconfig/sdraw/ui/insertlayer.ui new file mode 100644 index 0000000000..266f48ac57 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/insertlayer.ui @@ -0,0 +1,325 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="InsertLayerDialog"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="insertlayer|InsertLayerDialog">Insert Layer</property> + <property name="modal">True</property> + <property name="default-width">0</property> + <property name="default-height">0</property> + <property name="type-hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox4"> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area4"> + <property name="can-focus">False</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkFrame" id="nameframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkEntry" id="name"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="activates-default">True</property> + <property name="width-chars">54</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="name-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|name">Enter a name for the new layer.</property> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="insertlayer|label4">_Name</property> + <property name="use-underline">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="titleframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkEntry" id="title"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="activates-default">True</property> + <property name="width-chars">54</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="title-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|title">Enter the title of the layer.</property> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="insertlayer|label5">_Title</property> + <property name="use-underline">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="description"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkTextView" id="textview"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-start">12</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="textview-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|textview">Enter a description of the layer.</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="description1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="insertlayer|description">_Description</property> + <property name="use-underline">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkCheckButton" id="visible"> + <property name="label" translatable="yes" context="insertlayer|visible">_Visible</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="visible-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|visible">Show or hide the layer.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="printable"> + <property name="label" translatable="yes" context="insertlayer|printable">_Printable</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="printable-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|printable">When printing, print or ignore this particular layer.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="locked"> + <property name="label" translatable="yes" context="insertlayer|locked">_Locked</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="locked-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|locked">Prevent elements on the layer from being edited.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="insertlayer|properties">Properties</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child internal-child="accessible"> + <object class="AtkObject" id="InsertLayerDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|InsertLayerDialog">Inserts a new layer in the document. Layers are only available in Draw, not in Impress.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/insertslidesdialog.ui b/sd/uiconfig/sdraw/ui/insertslidesdialog.ui new file mode 100644 index 0000000000..ebd432fd41 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/insertslidesdialog.ui @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkDialog" id="InsertSlidesDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="insertslidesdialog|InsertSlidesDialog">Insert Slides/Objects</property> + <property name="modal">True</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <child> + <object class="GtkCheckButton" id="backgrounds"> + <property name="label" translatable="yes" context="insertslidesdialog|backgrounds">Delete unused backg_rounds</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="backgrounds-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertslidesdialog|extended_tip|backgrounds">Unused master pages are not inserted.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="links"> + <property name="label" translatable="yes" context="insertslidesdialog|links">_Link</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="links-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="insertslidesdialog|extended_tip|links">Inserts a file or some file elements as a link that is automatically updated when the source file is modified.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="tree"> + <property name="width_request">-1</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="search_column">1</property> + <property name="enable_tree_lines">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext2"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/namedesign.ui b/sd/uiconfig/sdraw/ui/namedesign.ui new file mode 100644 index 0000000000..d49eef7e0d --- /dev/null +++ b/sd/uiconfig/sdraw/ui/namedesign.ui @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.4 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="NameDesignDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="namedesign|NameDesignDialog">Name HTML Design</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="margin-end">6</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="row_spacing">12</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkEntry" id="entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="activates_default">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child> + <placeholder/> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/navigatorcontextmenu.ui b/sd/uiconfig/sdraw/ui/navigatorcontextmenu.ui new file mode 100644 index 0000000000..746734e4e8 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/navigatorcontextmenu.ui @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="navmenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkMenuItem" id="rename"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorcontextmenu|STR_RENAME">Rename...</property> + <property name="use-underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/notebookbar.ui b/sd/uiconfig/sdraw/ui/notebookbar.ui new file mode 100644 index 0000000000..32e7212d5e --- /dev/null +++ b/sd/uiconfig/sdraw/ui/notebookbar.ui @@ -0,0 +1,18847 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ --> + <object class="GtkMenu" id="Menu 3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltDown</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltRight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Window3D</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Convert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuConvert-ChangeBezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ChangePolygon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-convert_to_contour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertInto3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertInto3DLatheFast"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertIntoBitmap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertIntoMetaFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorVert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorVert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorHorz"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorHorz</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Dismantle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Substract"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Intersect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Connect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Break"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CopyObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CopyObjects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Morphing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Morphing</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangeBezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangePolygon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-convert_to_contour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldVar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldVar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuField-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertAuthorField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAuthorField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideTitleField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlidesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertFileField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFileField</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuFile-AddDirect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-RecentFileList"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CloseDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Save"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAs"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAsRemote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveACopy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveACopy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-NewGlobalDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewGlobalDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportTo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportToPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMail"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendViaBluetooth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendViaBluetooth</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-WebHtml"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrintDefault"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrinterSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Signature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SignPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Quit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuForm-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Label</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Edit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CheckBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RadioButton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ListBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ListBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ComboBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ComboBox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Imagebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormattedField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-DateField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DateField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-TimeField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TimeField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NumericField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NumericField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CurrencyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-PatternField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PatternField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ImageControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageControl</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FileControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FileControl</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grid</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Help"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHelp-HelpIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtendedHelp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Documentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Documentation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:QuestionAnswers</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SendFeedback"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendFeedback</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SafeMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SafeMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-GetInvolved"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GetInvolved</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Donation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Donation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ShowLicense"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowLicense</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-About"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHome-SelectAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageCrop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ExternalEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ChangePicture"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-CompressGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-SaveGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-OriginalSize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OriginalSize</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-AnimationEffects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-AnimationObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-TwainSelect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertQrCode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMath"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPageField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPageField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPagesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPagesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuObject-ChainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChainFrames</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-UnhainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnhainFrames</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuObject-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-FrameDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FrameDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ModifyPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SlideSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-HideSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-RenameSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SummaryPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ExpandPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Reference"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFootnoteDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-AddressBookSource"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddressBookSource</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAll</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-Repaginate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repaginate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateFields"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateFields</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllIndexes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCurIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCharts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCharts</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-CalculateSel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalculateSel</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTable-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertRowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeRows"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeColumns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-Protect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Protect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnsetCellsReadOnly</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeadingRowsRepeat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-RowSplit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RowSplit</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTextToTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTableToText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTableToText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableSort"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-MergeTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MergeTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableNumberRecognition</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHome-Shadowed1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-OutlineFont1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-Overline1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToUpper1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToLower1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseRotateCase1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToSentenceCase1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToTitleCase1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToToggleCase1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertNonBreakingSpace1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertHardHyphen1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertSoftHyphen1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertZWSP1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertWJ1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertLRM1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertRLM1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-FontDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ParagraphDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuHome-ParaLeftToRight1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuHome-ParaRightToLeft1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTools-RunMacro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroRecorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroRecorder</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroSignature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroSignature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-DevTools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DevelopmentToolsDockingWindow</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BmpMask"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BmpMask</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewDataSourceBrowser</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenXMLFilterSettings</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PageMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-MasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneImpress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneImpress</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom50Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom50Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom75Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom75Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom150Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom150Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom200Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom200Percent</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPrevious"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomNext"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomNext</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomObjects</property> + </object> + </child> + </object> + <object class="GtkImage" id="RecentFilesImg1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_recentfilelist.png</property> + </object> + <object class="GtkImage" id="changebezierImg"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_changebezier.png</property> + </object> + <object class="GtkImage" id="paragraphstylei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_insertfieldctrl.png</property> + </object> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarTabControl" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-PriorityHBox" id="File Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="File-Section-New"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkMenuToolButton" id="File-AddDirect"> + <property name="visible">True</property> + <property name="action_name">.uno:AddDirect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-New1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-NewDoc1"> + <property name="visible">True</property> + <property name="action_name">.uno:NewDoc</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SaveAsTemplate1"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAsTemplate</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Open"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Open1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="File-RecentFileList1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="action_name">.uno:RecentFileList</property> + <property name="image">RecentFilesImg1</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-OpenRemote1"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenRemote</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Save"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Save1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SaveAs1"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAs</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SaveAsRemote1"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAsRemote</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Export"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-ExportTo"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportTo</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Export1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-ExportDirectToPDF1"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SendMail"> + <property name="visible">True</property> + <property name="action_name">.uno:SendMail</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-Print"> + <property name="visible">True</property> + <property name="action_name">.uno:Print</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Print1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-PrintDefault1"> + <property name="visible">True</property> + <property name="action_name">.uno:PrintDefault</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-WebHtml"> + <property name="visible">True</property> + <property name="action_name">.uno:WebHtml</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Property"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-SetDocumentProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDocumentProperties</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Property1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-Signature1"> + <property name="visible">True</property> + <property name="action_name">.uno:Signature</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SignPDF1"> + <property name="visible">True</property> + <property name="action_name">.uno:SignPDF</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="File-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="File-CloseDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="File-HelpIndex"> + <property name="visible">True</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-end">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File"> + <property name="label" translatable="yes" context="drawnotebookbar|FileLabel">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="File-HelpButton:Menu Help"> + <property name="label" translatable="yes" context="drawnotebookbar|HelpMenuButton">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin-start">5</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="FileLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|FileLabel">~File</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Home Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Home-Section-Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkMenuToolButton" id="Home-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Cut"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Copy"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Style"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SetDefault"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Home-DesignerDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:DesignerDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawColor1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine4"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea4"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawColor2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle2"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle3"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Home-Text"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Polygon_Unfilled"> + <property name="visible">True</property> + <property name="action_name">.uno:Polygon_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Bezier_Unfilled"> + <property name="visible">True</property> + <property name="action_name">.uno:Bezier_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-DrawCaption"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkToolButton" id="Home-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkToolButton" id="Home-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkToolButton" id="Home-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkToolButton" id="Home-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CalloutShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Home-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-HelplinesVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-HelplinesMove"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-GlueInsertPoint"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueInsertPoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB24"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA24"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertGraphic"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertPage"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-InsertObjectChart"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Transform"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB35"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Home-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="PasteBox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home"> + <property name="label" translatable="yes" context="drawnotebookbar|HomeMenuButton">_Home</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Home-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Findbar"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="HomeLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|HomeLabel">~Home</property> + <property name="use_underline">True</property> + <style> + <class name="context-default"/> + <class name="context-any"/> + </style> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Insert Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Insert-Section-Slide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Slide1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DuplicatePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicatePage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-ImportFromFile"> + <property name="visible">True</property> + <property name="action_name">.uno:ImportFromFile</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InserTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObject"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-Gallery"> + <property name="visible">True</property> + <property name="action_name">.uno:Gallery</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertAVMedia"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Hyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Hyperlink1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-CapturePoint"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-FontWork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-FontWork1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DrawCaption"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB22"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertLayer"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertLayer</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field"> + <property name="label" translatable="yes" context="drawnotebookbar|FieldMenuButton">Fiel_d</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:FieldMenu</property> + <property name="image">paragraphstylei</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Symbol"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-CharmapControl"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Symbol1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertMath"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMath</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Insert-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert"> + <property name="label" translatable="yes" context="drawnotebookbar|InsertMenuButton">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Insert-InsertGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-InsertPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Insert-InsertTable1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="InsertLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|InsertLabel">~Insert</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Page Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Page-Section-Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Page-PageSetup"> + <property name="visible">True</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Slide-HeaderAndFooter"> + <property name="visible">True</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-Format1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-SelectBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-SaveBackground"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-InsertPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Page-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-InsertPage1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-DuplicatePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicatePage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-DeletePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeletePage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-ShowPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Page-RenamePage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenamePage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-ShowPage1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-HideSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:HideSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ShowSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-Navigation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-MovePageUp"> + <property name="visible">True</property> + <property name="action_name">.uno:MovePageUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-MovePageDown"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:MovePageDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-MasterSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Page-PresentationLayout"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Page-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Page-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Page-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Page-PageButton:Menu Page"> + <property name="label" translatable="yes" context="drawnotebookbar|PageMenuButton">_Layout</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Page-AssignLayout"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="PageLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|PageLabel">~Layout</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Review Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Review-Section-Language"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Review-ThesaurusDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Language1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-SpellOnline"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-Hyphenation"> + <property name="visible">True</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-InsertAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-NextAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:NextAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-PreviousAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:PreviousAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAnnotions"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteAllAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-ShowAnnotations"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowAnnotations</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-RedactDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-RedactDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-EditDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:EditDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Reference-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review"> + <property name="label" translatable="yes" context="drawnotebookbar|ReviewMenuButton">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Review-AcceptTrackedChanges"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ReviewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|ReviewLabel">~Review</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="View Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="View-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-PageMode"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-View1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-MasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator120"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPrevious"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPage"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomNext"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomNext</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPageWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPageWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-Sidebar"> + <property name="visible">True</property> + <property name="action_name">.uno:Sidebar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ShowRuler"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Menubar"> + <property name="visible">True</property> + <property name="action_name">.uno:Menubar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-LeftPaneDraw"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPaneDraw</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Gluepoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-GlueEditMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Gluepoint1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GlueInsertPoint"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueInsertPoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GluePercent"> + <property name="visible">True</property> + <property name="action_name">.uno:GluePercent</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueEscapeDirectionTop"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEscapeDirectionTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GlueEscapeDirectionLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEscapeDirectionLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueEscapeDirectionRight"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEscapeDirectionRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueEscapeDirectionBottom"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEscapeDirectionBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Gluepoint2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GlueHorzAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueHorzAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueHorzAlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueHorzAlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueHorzAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueHorzAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GlueVertAlignTop"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueVertAlignTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueVertAlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueVertAlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-GlueVertAlignBottom"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueVertAlignBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-DisplayQuality"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-OutputQualityColor"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-DisplayQuality1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutputQualityBlackWhite"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityBlackWhite</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-New"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-NewWindow"> + <property name="visible">True</property> + <property name="action_name">.uno:NewWindow</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="View-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="ViewMenu2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View"> + <property name="label" translatable="yes" context="drawnotebookbar|ViewMenuButton">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="View-Zoom"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator126"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">5</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ViewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|ViewLabel">~View</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">5</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Text Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Text-Section-PasteBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkMenuToolButton" id="Text-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA22"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Cut"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Copy"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Style"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-SetDefault"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="font"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="GtkToolButton" id="Home-CharFontName"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="fontheight"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">5</property> + <child> + <object class="GtkToolButton" id="Home-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Grow"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Shrink"> + <property name="visible">True</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Strikeout"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Shadowed"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-Spacing"> + <property name="visible">True</property> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-LeftPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CenterPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-RightPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DefaultBullet1"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-JustifyPara1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DefaultNumbering1"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-OutlineRight1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-OutlineLeft1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-LineSpacing1"> + <property name="visible">True</property> + <property name="halign">end</property> + <property name="action_name">.uno:LineSpacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaspaceIncrease1"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaspaceDecrease1"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Style1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-StyleApply"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="StyleParagraphSection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-DesignerDialog"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:DesignerDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-StandardStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply?Style:string=Text&FamilyName:string=ParagraphStyles</property> + <property name="icon_name">cmd/sc_defaultcharstyle.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Title"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply?Style:string=Title&FamilyName:string=ParagraphStyles</property> + <property name="icon_name">cmd/sc_titleparastyle.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Heading"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply?Style:string=Heading&FamilyName:string=ParagraphStyles</property> + <property name="icon_name">cmd/sc_heading1parastyle.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-EditStyle"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:EditStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-TextArrangement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Text-TextAttributes"> + <property name="visible">True</property> + <property name="action_name">.uno:TextAttributes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-TextArrangement1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-TransformDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-DrawCaption"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Text-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-TextBotton:Menu Text"> + <property name="label" translatable="yes" context="drawnotebookbar|TextMenuButton">T_ext</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Text-SearchDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-TransformDialog1"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">6</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="TextLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|ReferencesLabel">T~ext</property> + <property name="use_underline">True</property> + <style> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="position">6</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Table Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Layout1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-SetBorderStyle"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-MergeCells"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-SplitCell"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-SelectTable"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Select1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Optimize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Optimize1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertCenter"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Style"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-TableDesign"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TableDesign</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Table-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table"> + <property name="label" translatable="yes" context="drawnotebookbar|TableMenuButton">_Table</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">7</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="TableLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|TableLabel">~Table</property> + <property name="use_underline">True</property> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="position">7</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Image Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Image-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Image-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Edit1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="SecondGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-CompressGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Crop1"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-ChangePicture"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-SaveGraphic"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle1"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle4"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-ConvertButton:Menu Convert"> + <property name="label" translatable="yes" context="drawnotebookbar|ConvertMenuButton">Convert</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:ChangeBezier</property> + <property name="image">changebezierImg</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ObjectAlign2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatImageFilter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="GraphicFilterToolboxGroup"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafLuminance"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafLuminance</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafContrast"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafContrast</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafTransparence"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafGamma"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafGamma</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-GrafMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ColorSettings"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Image-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image"> + <property name="label" translatable="yes" context="drawnotebookbar|GraphicMenuButton">Ima_ge</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Image-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">8</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ImageLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|ImageLabel">Ima~ge</property> + <property name="use_underline">True</property> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Draw Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Draw-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-SetDefault"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle4"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle1"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-ConvertButton:Menu Convert"> + <property name="label" translatable="yes" context="drawnotebookbar|ConvertMenuButton">Convert</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:ChangeBezier</property> + <property name="image">changebezierImg</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignUp1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignMiddle1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignDown1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Bezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Bezier1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="BezierGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierMove"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierMove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierInsert"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierInsert</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierDelete"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierDelete</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierCutLine"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierCutLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierEdge"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierEdge</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierSmooth"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierSmooth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Bezier2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="BezierGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierConvert"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierConvert</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierClose"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierClose</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierSymmetric"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierSymmetric</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierEliminatePoints"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierEliminatePoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-GluePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-GlueEditMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-MergeCombine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Merge"> + <property name="visible">True</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Substract"> + <property name="visible">True</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Intersect"> + <property name="visible">True</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Group1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first38"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second39"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionSurfaceFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Fontwork1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkShapeType"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkShapeType</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkSameLetterHeights</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkAlignmentFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkCharacterSpacingFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Draw-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw"> + <property name="label" translatable="yes" context="drawnotebookbar|DrawMenuButton">_Draw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">9</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="DrawLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|DrawLabel">~Draw</property> + <property name="use_underline">True</property> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="position">9</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Object Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Object-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Object-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-XLineStyle5"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectLineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineEndStyle5"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-XLineColor4"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Object-ConvertButton:Menu Convert"> + <property name="label" translatable="yes" context="drawnotebookbar|ConvertMenuButton">Convert</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:ChangeBezier</property> + <property name="image">changebezierImg</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Object-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object"> + <property name="label" translatable="yes" context="drawnotebookbar|ObjectMenuButton">_Object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ObjectLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|ObjectLabel">~Object</property> + <property name="use_underline">True</property> + <style> + <class name="context-Frame"/> + <class name="context-OLE"/> + </style> + </object> + <packing> + <property name="position">10</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Media Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Media-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138"> + <property name="width_request">148</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Media-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="media:Menu Media"> + <property name="label" translatable="yes" context="drawnotebookbar|MediaMenuButton">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-TransformDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">11</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MediaLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|MediaLabel">~Media</property> + <property name="use_underline">True</property> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="position">11</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Form Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Form-SwitchControlDesignMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly1"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties2"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus2"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label1"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit1"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton2"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField2"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField2"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField2"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField1"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField1"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Form-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="Form-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form"> + <property name="label" translatable="yes" context="drawnotebookbar|FormMenuButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="FormMenu-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="FormLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="DrawNotebookbar|FormLabel">Fo~rm</property> + <property name="use_underline">True</property> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="3d Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="3dObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="3dObject-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine6"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea6"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-XLineStyle5"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectLineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineEndStyle5"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-XLineColor4"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Windows3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-Window3D1"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Window3D</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="3dObject-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="3dObject-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="3dObject-FormButton:Menu 3d"> + <property name="label" translatable="yes" context="DrawNotebookbar|FormMenuButton">3_d</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea5"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FormatLine5"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-TransformDialog1"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="3DObjectLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="DrawNotebookbar|FormLabel">3~d</property> + <property name="use_underline">True</property> + <style> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Master Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-PageMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-MasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPage-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Insert1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-ShowHide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-HideSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:HideSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-ShowSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Property"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPageMenu-PageSetup1"> + <property name="visible">True</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Background"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-SelectBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-SaveBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-CloseMasterView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPage-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="MasterPage-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="MasterPage-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master"> + <property name="label" translatable="yes" context="DrawNotebookbar|FormMenuButton">_Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="MasterPageMenu-PageSetup"> + <property name="visible">True</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">14</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MasterLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="DrawNotebookbar|MasterLabel">~Master</property> + <property name="use_underline">True</property> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Extension Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Extension"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Extension-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="Extension-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons"> + <property name="label" translatable="yes" context="drawnotebookbar|FormMenuButton">E_xtension</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ExtensionLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|ExtensionLabel">E~xtension</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Tools Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-RunMacro"> + <property name="visible">True</property> + <property name="action_name">.uno:RunMacro</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB26"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-MacroDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:MacroDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-BmpMask"> + <property name="visible">True</property> + <property name="action_name">.uno:BmpMask</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Presentation1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator141"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-UseWizards1"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-GroupBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton1"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField1"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField1"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField1"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ControlProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Tools-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="ViewMenu3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools"> + <property name="label" translatable="yes" context="drawnotebookbar|ToolsMenuButton">_Tools</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Tools-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="DevLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="drawnotebookbar|DevLabel">~Tools</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/notebookbar_compact.ui b/sd/uiconfig/sdraw/ui/notebookbar_compact.ui new file mode 100644 index 0000000000..6d45e5845b --- /dev/null +++ b/sd/uiconfig/sdraw/ui/notebookbar_compact.ui @@ -0,0 +1,20531 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ --> + <object class="GtkMenu" id="Menu 3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltDown</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltRight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Window3D</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorVert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorVert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorHorz"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorHorz</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Dismantle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Substract"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Intersect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Connect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Break"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CopyObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CopyObjects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Morphing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Morphing</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangeBezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangePolygon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-convert_to_contour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldVar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldVar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuField-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertAuthorField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAuthorField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideTitleField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlidesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertFileField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFileField</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuFile-AddDirect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Open"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Open</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-OpenRemote"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-RecentFileList"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CloseDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-AutoPilotMenu"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoPilotMenu</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-OpenTemplate"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenTemplate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAsTemplate"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsTemplate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-NewDoc"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Reload"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Reload</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-VersionDialog"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VersionDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Save"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAs"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAsRemote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveACopy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveACopy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAll"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CheckOut"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckOut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CancelCheckOut"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CancelCheckOut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CheckIn"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckIn</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportTo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportToPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportDirectToPDF"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMail"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-WebHtml"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrintDefault"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrinterSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Signature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SignPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Quit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuForm-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Label</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Edit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CheckBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RadioButton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ListBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ListBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ComboBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ComboBox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Imagebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormattedField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-DateField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DateField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-TimeField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TimeField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NumericField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NumericField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CurrencyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-PatternField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PatternField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ImageControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageControl</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FileControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FileControl</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grid</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Help"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHelp-HelpIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtendedHelp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Documentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Documentation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:QuestionAnswers</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SendFeedback"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendFeedback</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SafeMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SafeMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-GetInvolved"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GetInvolved</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Donation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Donation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ShowLicense"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowLicense</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-About"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHome-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageCrop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ExternalEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ChangePicture"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-CompressGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-SaveGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-OriginalSize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OriginalSize</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-AnimationEffects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-AnimationObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-TwainSelect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertQrCode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMath"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPageField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPageField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPagesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPagesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-RenameSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-HideSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SummaryPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ExpandPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ModifyPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SlideSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-RenameObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-EditHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-RemoveHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RemoveHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-OpenHyperlinkOnCursor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenHyperlinkOnCursor</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuObject-ChainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChainFrames</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-UnhainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnhainFrames</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuObject-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-FrameDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FrameDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Reference"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFootnoteDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-AddressBookSource"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddressBookSource</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAll</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-Repaginate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repaginate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateFields"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateFields</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllIndexes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCurIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCharts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCharts</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-CalculateSel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalculateSel</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTable-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertRowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeRows"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeColumns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-Protect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Protect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnsetCellsReadOnly</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeadingRowsRepeat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-RowSplit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RowSplit</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTextToTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTableToText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTableToText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableSort"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-MergeTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MergeTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableNumberRecognition</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuText-Shadowed"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-OutlineFont"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-Overline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToUpper"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToLower"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseRotateCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToSentenceCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToTitleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToToggleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertNonBreakingSpace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertHardHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertSoftHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertZWSP"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertWJ"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertLRM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertRLM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuText-ParaLeftToRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuText-ParaRightToLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-OutlineBullet"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineBullet</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-TextAttributes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextAttributes</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTools-RunMacro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroRecorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroRecorder</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroSignature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroSignature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BmpMask"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BmpMask</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewDataSourceBrowser</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenXMLFilterSettings</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PageMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-MasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneImpress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneImpress</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom50Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom50Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom75Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom75Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom150Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom150Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom200Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom200Percent</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPrevious"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomNext"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomNext</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomObjects</property> + </object> + </child> + </object> + <object class="GtkImage" id="paragraphstylei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_insertfieldctrl.png</property> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarTabControl" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-PriorityHBox" id="File Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="NewSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Files-New"> + <property name="visible">True</property> + <property name="action_name">.uno:AddDirect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="NewDocSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-NewDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:NewDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OpenSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Files-Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OpenRemoteSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-OpenRemote"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenRemote</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SaveSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Files-Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SaveAsSection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-SaveAs"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAs</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="ExportToSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-ExportTo"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportTo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="ExportToPDFSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-ExportDirectToPDF"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SendMailSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-SendMail"> + <property name="visible">True</property> + <property name="action_name">.uno:SendMail</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="PrintSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-WebHtml"> + <property name="visible">True</property> + <property name="action_name">.uno:WebHtml</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105b"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-Print"> + <property name="visible">True</property> + <property name="action_name">.uno:Print</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="PrintDefaultSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-PrintDefault"> + <property name="visible">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="PrinterSetupSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PrinterSetup"> + <property name="visible">False</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PrinterSetup</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SetDocumentPropertiesSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExportGroup3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-SetDocumentProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="File-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CloseDoc"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FileMenuButton">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="FileLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FileLabel">~File</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Home Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Home-Section-Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Cut"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Copy"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea5"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea6"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Default-XLineStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineEndStyle1"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine3"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-TextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Text"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Line6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom177"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-DrawCaption"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-CalloutShapes"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FlowChartShapes1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-StyleApply2"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-CapturePoint1"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Default-InsertTable2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-ZoomPrevious"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ZoomPage"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Snap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Snap2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Home-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SearchDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|HomeMenuButton">_Home</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="HomeLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|HomeLabel">~Home</property> + <property name="use_underline">True</property> + <style> + <class name="context-default"/> + <class name="context-any"/> + </style> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Insert Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Insert-Section-Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Duplicate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom151"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DuplicatePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicatePage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Insert-InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Chart"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-OLE"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObject"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom152"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-Gallery"> + <property name="visible">True</property> + <property name="action_name">.uno:Gallery</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-AVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator105"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom153"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertAVMedia"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Hyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom156"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FieldMenuButton">Fiel_d</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:FieldMenu</property> + <property name="image">paragraphstylei</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DrawText1"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-VerticalText1"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator120"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-CalloutShapes"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Symbol"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-CharmapControl"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Formula"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertMath"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMath</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Insert-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertSlide1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|InsertMenuButton">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="InsertLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|InsertLabel">~Insert</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Layout Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Layout-Section-PageLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-PageSetup"> + <property name="visible">True</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-Background"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-SelectBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-Background1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-SaveBackground1"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-DeletePage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-DeletePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeletePage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-HideSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:HideSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ShowSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-MovePage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Page-MovePageUp"> + <property name="visible">True</property> + <property name="action_name">.uno:MovePageUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-MovePage1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkToolButton" id="Page-MovePageDown1"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:MovePageDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-PresentationLayout"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-SelectGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator135"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom223"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Layout-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-SelectGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom224"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Layout-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator104"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Layout-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Layout-PageSetup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Layout-PageButton:Menu Layout"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|LayoutMenuButton">Layout</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="LayoutLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|LayoutLabel">~Layout</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Review Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Review-Section-Language"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-SpellOnline"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-ThesaurusDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom155"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-Hyphenation"> + <property name="visible">True</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-InsertAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-InsertAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-PreviousAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-PreviousAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:PreviousAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-NextAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-NextAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:NextAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-DeleteAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:DeleteAllAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-ShowAnnotations"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-ShowAnnotations"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowAnnotations</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Redact"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator136"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom225"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-RedactDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Review-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-AcceptTrackedChanges"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ReviewMenuButton">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ReviewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ReviewLabel">~Review</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="View Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="View-Sections-Views"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-PageMode"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-MasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPanning"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPanning</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPrevious"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomNext"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomNext</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Navigator"> + <property name="visible">True</property> + <property name="action_name">.uno:Navigator</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Rulers"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom199"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Bars"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator141"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Menubar"> + <property name="visible">True</property> + <property name="action_name">.uno:Menubar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Bars1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom200"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Sidebar"> + <property name="visible">True</property> + <property name="action_name">.uno:Sidebar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom201"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomOptimal1"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomOptimal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom202"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Zoom100Percent1"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom203"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-FullScreen"> + <property name="visible">True</property> + <property name="action_name">.uno:FullScreen</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-NewWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NewWindow"> + <property name="visible">True</property> + <property name="action_name">.uno:NewWindow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom198"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-EditDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:EditDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="View-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Zoom"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ViewMenuButton">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ViewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ViewLabel">~View</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Text Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Text-Section-Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom182"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-Paste1"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom183"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Cut1"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Copy1"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ResetAttributes"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillShadow2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Default-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CharFontName"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-24"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Grow"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shrink"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Strikeout"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FontDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-OutlineRight"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-OutlineLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom157"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom158"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom159"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-LineSpacing2"> + <property name="action_name">.uno:LineSpacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParagraphDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom160"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-StyleApply"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-TextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom161"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Text1"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText1"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Text-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-TransformDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-TextBotton:Menu Text"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|TextMenuButton">T_ext</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">6</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="TextLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ReferencesLabel">T~ext</property> + <property name="use_underline">True</property> + <style> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="position">6</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Table Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetDefaul"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoForma"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tabl-AutoFormat"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SetBorderStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BorderDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharFontName1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontHeight1"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Grow1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Shrink1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Bold1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Italic1"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Underline1"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Strikeout1"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed1"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Color1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing1"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-OutlineRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-OutlineLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParagraphDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tabl-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-StyleApply1"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-MergeCells1"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SplitCell1"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-AutoFormat"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:AutoFormat</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Column"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom162"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">30</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Row"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">31</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-TableDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">32</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom163"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharmapControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">33</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Table-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|TableMenuButton">T_able</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator170"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">7</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="TableLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|TableLabel">~Table</property> + <property name="use_underline">True</property> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="position">7</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Image Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkBox" id="GraphicPasteBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom186"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom187"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder1"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom164"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Crop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-SaveReplace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ChangePicture"> + <property name="visible">True</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SaveGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom165"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ColorSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom166"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ColorSettings"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom167"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-GrafTransparence"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Transformations"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator134"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom222"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphi-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Image-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ImageMenuButton">Image</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator187"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="GraphicLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ImageLabel">Ima~ge</property> + <property name="use_underline">True</property> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Draw Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkBox" id="MultiObject-Section-PasteBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom188"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom189"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-CloneTool"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ClearDirectFormatting"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom168"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom169"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom170"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Merge"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Substract"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Intersect"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Transformations1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator125"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom211"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Mirror"> + <property name="visible">True</property> + <property name="action_name">.uno:Mirror</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Transformations2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator126"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom212"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ConvertInto3DLathe"> + <property name="visible">True</property> + <property name="action_name">.uno:ConvertInto3DLathe</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CrookRotate"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookRotate</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Transformations3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator133"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom221"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-InteractiveTransparence"> + <property name="visible">True</property> + <property name="action_name">.uno:InteractiveTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-InteractiveGradient"> + <property name="visible">True</property> + <property name="action_name">.uno:InteractiveGradient</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-EditPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom210"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator121"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">30</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-3D1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">31</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-3D2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionSurfaceFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">32</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator124"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom207"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">33</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Fontwork1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom208"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkShapeType"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkShapeType</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkSameLetterHeights</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">34</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Fontwork2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom209"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkAlignmentFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkCharacterSpacingFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">35</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Draw-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|DrawMenuButton">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="Context-Draw"/> + </style> + </object> + <packing> + <property name="position">9</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ShapeLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ShapeLabel">~Draw</property> + <property name="use_underline">True</property> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="position">9</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Object Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Object-Section-Advanced"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom190"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Frame-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom191"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Frame-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Frame-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Objec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-XLineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine3"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom175"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom176"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-StyleApply"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Object-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ObjectMenuButton">Object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="Context-Frame"/> + <class name="Context-OLE"/> + </style> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="FrameLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FrameLabel">~Object</property> + <property name="use_underline">True</property> + <style> + <class name="context-Frame"/> + <class name="context-OLE"/> + </style> + </object> + <packing> + <property name="position">10</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Media Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Advanced"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom192"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom193"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom139"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom171"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom172"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder4"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom173"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="width_request">167</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom174"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-TransformDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Media-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="media:Menu Media"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|MediaButton">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="position">11</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MediaLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|MediaLabel">~Media</property> + <property name="use_underline">True</property> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="position">11</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Form Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="For-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight4"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Forward3"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-Backward3"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack3"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator106"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder5"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ControlProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Properties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-TabDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-OpenReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-AutoControlFocus"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-LabelCheckbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom213"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label1"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit1"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-LabelCheckbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom214"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton1"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Buttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom215"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Pushbutton1"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Imagebutton1"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Farmatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator107"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom216"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField1"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField1"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Farmatted1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom217"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField1"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField1"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField1"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-GroupBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator129"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom218"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-GroupBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Controls"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator130"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom219"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ImageControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-FileControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-GridNavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom220"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Grid1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-NavigationBar1"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Form-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="form:Menu Form"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FormButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="FormLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FormLabel">Fo~rm</property> + <property name="use_underline">True</property> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Master Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Master-Sections-Views"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom195"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-PageMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="View-MasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Rename"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Dialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageSetup"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PageSetup</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SelectBackground"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SaveBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SaveBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-ViewMenu"> + <property name="visible">True</property> + <property name="action_name">.uno:ViewMenu</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageMode"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PageMode</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Close"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="MasterPage-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-PageSetup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:PageSetup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|PrintPreviewButton">_Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator103"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MasterPageLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FormLabel">~Master</property> + <property name="use_underline">True</property> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="position">13</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="3d Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Window3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom194"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3D-Window3D"> + <property name="visible">True</property> + <property name="action_name">.uno:Window3D</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator110"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator117"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom180"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder3"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom181"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="3d-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FormButton">3_d</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator122"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="3DLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|FormLabel">3~d</property> + <property name="use_underline">True</property> + <style> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Extension Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Extension"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Extension-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="Extension-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ExtensionMenu-ExtensionDialog"> + <property name="visible">True</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ExtensionMenuButton">E_xtension</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ExtensionLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ExtensionLabel">E~xtension</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Tools Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RunMacro"> + <property name="visible">True</property> + <property name="action_name">.uno:RunMacro</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom204"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-MacroDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:MacroDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-BmpMask"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-BmpMask"> + <property name="visible">True</property> + <property name="action_name">.uno:BmpMask</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom196"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ImageMapDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom197"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-DesignMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Wizard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator138"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Buttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-GroupBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom149"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Controls"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator131"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom178"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-GridNavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator152"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom179"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-TabDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom205"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ShowFmExplore"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-ReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator158"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom206"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Tools-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom184"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools"> + <property name="label" translatable="yes" context="notebookbar_draw_compact|ToolsMenuButton">_Tools</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator137"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ToolLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_draw_compact|DevLabel">~Tools</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui b/sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui new file mode 100644 index 0000000000..083af53572 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui @@ -0,0 +1,14173 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <object class="GtkMenu" id="Menu 3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltDown</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltRight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Window3D</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="WrapOffD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapOff</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapOnD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapOn</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapIdealD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapIdeal</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapRight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapThroughD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapThrough</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapThroughTransparentD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapThroughTransparent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapContourD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapContour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapAnchorOnlyD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapAnchorOnly</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="TextWrapD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextWrap</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetObjectToForegroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetObjectToForeground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetObjectToBackgroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetObjectToBackground</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Calculate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="TableSortD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AutoSumD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoSum</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-Line"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Line</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-DrawCaption"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-VerticalCaption"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalCaption</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConnectorToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-SymbolShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ArrowShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CalloutShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-StarShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StarShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Objects3DToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AddTextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddTextBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-InsertGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Text_Marquee"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text_Marquee</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuEdit-Repeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repeat</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Cut"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Cut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Copy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Copy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Paste"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Paste</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PasteUnformatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PasteUnformatted</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PasteSpecial"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PasteSpecial</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-SelectAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-EditHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ModifyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-IndexEntryDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:IndexEntryDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ManageLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ManageLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ObjectMenue"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMenue</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-GlueEditMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PageSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PageSetup</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Edit Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="DrawEdit-SelectObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-CloneTool"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ClearDirectFormatting"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDefault</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FlipVertical"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FlipHorizontal"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FormatLine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatLine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FormatArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatArea</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-TextAttributes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextAttributes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FontWork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontWork</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="AddDirectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RecentFileListD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseDocD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveAsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveAsRemoteD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveACopy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveACopy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NewGlobalDocD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewGlobalDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExportToD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExportToPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMailD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMailDocAsPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendViaBluetoothD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendViaBluetooth</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-WebHtml"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrintD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrintDefaultD"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrinterSetupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SignatureD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SignPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetDocumentPropertiesD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="QuitD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuFontwork-FontworkSameLetterHeights"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkSameLetterHeights</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuForm-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Label</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Edit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CheckBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RadioButton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ListBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ListBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ComboBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ComboBox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Imagebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormattedField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-DateField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DateField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-TimeField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TimeField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NumericField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NumericField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CurrencyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-PatternField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PatternField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ImageControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageControl</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FileControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FileControl</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grid</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GrowD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShrinkD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShadowedD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OutlineFontD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OverlineD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SuperScript2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubScriptD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SubScript</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToUpperD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToLowerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseRotateCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToSentenceCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToTitleCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToToggleCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertNonBreakingSpaceD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertHardHyphenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertSoftHyphenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertZWSPD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertWJD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertLRMD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRLMD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRLMD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuGrid-Ruler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Ruler</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-VRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuGrid-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-ViewBounds"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewBounds</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-ShowGraphics"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowGraphics</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuGrid-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-HelplinesMove"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuGrid-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-HideWhitespace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideWhitespace</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GroupBoxD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GroupBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NameGroupD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectTitleDescriptionD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FormatGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FormatUngroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatUngroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EnterGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="LeaveGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezierD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CombineD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DismantleD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConnectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BreakD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MergeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubstractD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="IntersectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeWidthD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeHeightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GroupBoxD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="CropD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExternalEditD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePictureD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CompressGraphicD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveGraphicD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectMirrorVerticalD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMirrorVertical</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectMirrorHorizontalD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMirrorHorizontal</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezier1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ImageMapDialogD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NameGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectTitleDescription1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuInsert-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-SelectBackgroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-TwainSelect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertQrCode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMath"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertSymbol"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSymbol</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPageField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPageField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPagesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPagesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertPage</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Master Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="ObjectMenue"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMenue</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertCaptionDialog3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertCaptionDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezierD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator156"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CombineD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DismantleD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConnectD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BreakD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MergeD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubstractD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="IntersectD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeWidthD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeHeightD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator164"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DistributeSelection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="ParaLeftToRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="ParaRightToLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParaspaceIncreaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParaspaceDecreaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara1D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara15D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara15</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara2D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara2</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParagraphDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-RedactDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Rows Columns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowsBeforeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowsAfterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnsBeforeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnsAfterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteRowsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteColumnsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EntireRowD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EntireRow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EntireColumnD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SelectTableD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectTable</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Settings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSettings-menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|MenubarAction">Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-ToolbarModeUI"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToolbarModeUI</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-AvailableToolbars"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AvailableToolbars</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-Extensions"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-RunMacro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-ScriptOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-HelpIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-About"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PageMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-MasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-NewWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewWindow</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|MenubarView">Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneDraw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneDraw</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapBorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPageWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPageWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GraphicFilterSepiaD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSepia</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSobelD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSobel</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterInvertD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterInvert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterMosaicD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterMosaic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterPopart"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterPopart</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterPosterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterPoster</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterReliefD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterRelief</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterRemoveNoiseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterRemoveNoise</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSharpenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSharpen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSmoothD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSmooth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSolarizeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSolarize</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GrafModeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GrafMode</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlide-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Presentation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-RehearseTimings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-CustomShowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-Remote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Remote</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SummaryPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ExpandPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-HideSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SlideSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSnap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSnap-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GlueEditMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GridFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridFront</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesMove"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesFront</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-SnapFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-SnapPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-SnapBorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityHBox" id="Toolbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <property name="margin-end">5</property> + <child> + <object class="sfxlo-DropdownBox" id="File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <child> + <object class="GtkBox" id="Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="File-Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="File-Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="File-ExportToPDF"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="File-File:Menu File"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|fileb">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Edit-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Edit-Undo"> + <property name="visible">True</property> + <property name="action_name">.uno:Undo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Edit-Redo"> + <property name="visible">True</property> + <property name="action_name">.uno:Redo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Edit-Edit:Menu Edit"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|editb">_Edit</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-ContextVBox" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Default"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Default-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Insert:Menu Insert"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-DrawText"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Draw:Menu Draw"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|draw">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-BasicShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SymbolShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ArrowShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-StarShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-CalloutShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-FlowChartShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-ConnectorToolbox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-Objects3DToolbox2"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Review:Menu Review"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|reviewb">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-PageMode"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-MasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-View:Menu View"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewT">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-TextboxForm"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-FormButton:Menu Form"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|FormButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Extension"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-PackageManagerDialog"> + <property name="visible">True</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ExtensionMenuButton">E_xtension</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <style> + <class name="context-Default"/> + <class name="context-DrawPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Text"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Text-Section-Font"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">5</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Section-fontcolor1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-Font:Menu Format"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|formatt">F_ont</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-Strikeout"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Section-CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CloneTool"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-ClearDirectFormatting"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Section-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Section-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-Paragraph:Menu Paragraph"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|paragrapht">_Paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CellVertTop"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-CellVertBottom"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle1"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle4"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-PageMode"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-MasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-View:Menu View"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewT">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <style> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Table"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Font"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">5</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-Color1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Font:Menu Format"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|formatt">F_ont</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Strikeout"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Table-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Paragraph:Menu Paragraph"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|paragrapht">_Paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Paragraph1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CellVertTop"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertBottom"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SplitCell"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-MergeCells"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Table:Menu Rows Columns"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|rowscolumnst">_Table</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator124"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="opacity">0.9215686274509803</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Table2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetMinimalColumnWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:SetMinimalColumnWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOptimalColumnWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:SetOptimalColumnWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DistributeColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetMinimalRowHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:SetMinimalRowHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOptimalRowHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:SetOptimalRowHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DistributeRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-SetBorderStyle2"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-LineStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FrameLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Calc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator139"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableSort"> + <property name="visible">True</property> + <property name="action_name">.uno:TableSort</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-AutoSum"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoSum</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Calc:Menu Calculate"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|calculatet">_Calc</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-InsertGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertObjectChart1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertTable1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Insert:MenuInsert1"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Draw"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Draw-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-NameGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Edit:Menu Edit Draw"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|editdrawb">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog2"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle2"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle1"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Shape"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-DrawText"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Draw:Menu Draw"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|draw">_Shape</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Shape1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box104"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box105"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Draw-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CalloutShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Group:Menu Group"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewDrawb">Grou_p</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-MergeCombine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="GroupB102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Merge"> + <property name="visible">True</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Substract"> + <property name="visible">True</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Intersect"> + <property name="visible">True</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-FillColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FillColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|3Db">3_D</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-3d1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionSurfaceFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionLightingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionLightingFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box103"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkShapeType"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkShapeType</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkAlignmentFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkCharacterSpacingFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Fontwork:Menu Fontwork"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|GridButton">_Fontwork</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-GridUse1"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-HelplinesMove"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Grid:Menu Grid"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|GridButton">_Grid</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Image"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Image-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-NameGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Image:Menu Image"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|graphicB">_Image</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog3"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Imag-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle3"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth3"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle2"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor3"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Imag-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box106"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box107"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Color"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Color:MenuColor"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|GridB">Fi_lter</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="GroupB87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafLuminance"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafLuminance</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafTransparence"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <child> + <object class="GtkBox" id="GroupB90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafContrast"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafContrast</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafGamma"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafGamma</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Object"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="OLE-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-NameGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="OLE-Frame:Menu Object"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|graphicB">_Object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog4"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea4"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle4"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth4"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle3"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor4"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle3"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle3"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow3"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="OLE-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="OLE-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <style> + <class name="context-OLE"/> + <class name="context-Frame"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Media"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-NameGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Media-Media:Menu Media"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|graphicB">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132"> + <property name="width_request">148</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer1"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BringToFront1"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SendToBack1"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Media-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkBox" id="Section53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignLeft2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Media-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Multiobject"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Multi-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-NameGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Edit:Menu Edit Draw"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|editdrawb">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog5"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea5"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box110"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle5"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth5"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle5"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor5"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle5"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Group:Menu Group"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewDrawb">Grou_p</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <style> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Master Page"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Master-Section-Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator166"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Master:Menu Master Page"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|oleB">_Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Draw-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Draw:Menu Draw"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|draw">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-BasicShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-SymbolShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-ArrowShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-Draw-StarShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-CalloutShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-FlowChartShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-BasicShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-SymbolShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-ArrowShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-Draw-StarShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-CalloutShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-FlowChartShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-InsertTable1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Insert:Menu Insert"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Snap:MenuSnap"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SpellDialog2"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertAnnotation2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-GridVisible2"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Review:MenuReview"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|reviewb">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Section-Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-PageMode"> + <property name="visible">True</property> + <property name="action_name">.uno:PageMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-MasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-View:Menu View"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewT">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Form"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly2"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|FormButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="GroupB49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly1"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties2"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus2"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label1"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit1"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton2"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField2"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField2"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField2"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField1"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField1"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin-end">5</property> + <child> + <object class="GtkBox" id="Ext2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-SearchDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-HelpIndex"> + <property name="visible">True</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CloseDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Tools-Menu:Menu Settings"> + <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|menub">_Menu</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator122"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/notebookbar_online.ui b/sd/uiconfig/sdraw/ui/notebookbar_online.ui new file mode 100644 index 0000000000..223eedce4c --- /dev/null +++ b/sd/uiconfig/sdraw/ui/notebookbar_online.ui @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="font"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="GtkToolButton" id="Home-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="fontheight"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin_start">5</property> + <child> + <object class="GtkToolButton" id="Home-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/notebookbar_single.ui b/sd/uiconfig/sdraw/ui/notebookbar_single.ui new file mode 100644 index 0000000000..bc679e5935 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/notebookbar_single.ui @@ -0,0 +1,11625 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityHBox" id="DefaultBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-DropdownBox" id="ClipboardSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Edit-Undo"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Undo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Edit-Paste"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-ContextVBox" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DefaultContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Default-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea5"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea6"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Default-XLineStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineEndStyle1"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine3"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-TextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Text"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-DrawCaption"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-CalloutShapes"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-StyleApply2"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-CapturePoint1"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Default-InsertTable2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-ZoomPrevious"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ZoomPage"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Snap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Snap2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <style> + <class name="context-Default"/> + <class name="context-DrawPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="TableContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetDefaul"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoForma"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tabl-AutoFormat"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SetBorderStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BorderDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharFontName1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontHeight1"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-end">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Grow1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Shrink1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Bold1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Italic1"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Underline1"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Strikeout1"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed1"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Color1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing1"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-OutlineRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-OutlineLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">1</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParagraphDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tabl-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-StyleApply1"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-MergeCells1"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SplitCell1"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-AutoFormat"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:AutoFormat</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Column"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">30</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Row"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">31</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-TableDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">32</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharmapControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">33</property> + </packing> + </child> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="GraphicContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Flip"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder1"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Crop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-SaveReplace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ChangePicture"> + <property name="visible">True</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SaveGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">1</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ColorSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ColorSettings"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-GrafTransparence"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DrawContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-CloneTool"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ClearDirectFormatting"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Flip"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Merge"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Substract"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Intersect"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MediaContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer"> + <property name="width_request">122</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder4"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="width_request">167</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="ObjectContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Object-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Objec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-XLineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine3"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Flip"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectForwardOne"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectBackOne"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-StyleApply"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <style> + <class name="context-OLE"/> + <class name="context-Frame"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="FormContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="For-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ControlProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Properties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-TabDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Labels"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Label"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Edit"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-RadioButton"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ListBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ComboBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-OpenReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-AutoControlFocus"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight4"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectForwardOne3"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectBackOne3"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack3"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder5"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormattedField"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-DateField"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-TimeField"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NumericField"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-CurrencyField"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-PatternField"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-GroupBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-FormattedField1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-FormattedField2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="TextContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Text-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ResetAttributes"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillShadow2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Default-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CharFontName"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Grow"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shrink"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Strikeout"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FontDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-OutlineRight"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-OutlineLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-LineSpacing2"> + <property name="action_name">.uno:LineSpacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParagraphDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-StyleApply"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-TextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Text1"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText1"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <style> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="3DObjectContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Window3D"> + <property name="visible">True</property> + <property name="action_name">.uno:Window3D</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder3"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <style> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MasterPageContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Master-Section-DrawingLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DrawingLayout"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Rename"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Dialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageSetup"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PageSetup</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SelectBackground"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SaveBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SaveBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-ViewMenu"> + <property name="visible">True</property> + <property name="action_name">.uno:ViewMenu</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageMode"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PageMode</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Close"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/paranumberingtab.ui b/sd/uiconfig/sdraw/ui/paranumberingtab.ui new file mode 100644 index 0000000000..50a07a9d62 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/paranumberingtab.ui @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">9999</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkFrame" id="DrawParaNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkCheckButton" id="checkbuttonCB_NEW_START"> + <property name="label" translatable="yes" context="paranumberingtab|checkbuttonCB_NEW_START">R_estart at this paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="inconsistent">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spinbuttonNF_NEW_START"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">False</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="checkbuttonCB_NUMBER_NEW_START"> + <property name="label" translatable="yes" context="paranumberingtab|checkbuttonCB_NUMBER_NEW_START">S_tart with:</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="margin-start">12</property> + <property name="use_underline">True</property> + <property name="inconsistent">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="paranumberingtab|label1">Paragraph Numbering</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui b/sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui new file mode 100644 index 0000000000..99876c00b1 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMessageDialog" id="QueryUnlinkImageDialog"> + <property name="can_focus">False</property> + <property name="title" translatable="yes" context="queryunlinkimagedialog|QueryUnlinkImageDialog">Release image's link?</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="type_hint">dialog</property> + <property name="skip_taskbar_hint">True</property> + <property name="message_type">question</property> + <property name="buttons">yes-no</property> + <property name="text" translatable="yes" context="queryunlinkimagedialog|QueryUnlinkImageDialog">This image is linked to a document.</property> + <property name="secondary_text" translatable="yes" context="queryunlinkimagedialog|QueryUnlinkImageDialog">Do you want to unlink the image in order to edit it?</property> + <child internal-child="vbox"> + <object class="GtkBox" id="messagedialog-vbox4"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">24</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="messagedialog-action_area4"> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/sdraw/ui/vectorize.ui b/sd/uiconfig/sdraw/ui/vectorize.ui new file mode 100644 index 0000000000..623eaae7e0 --- /dev/null +++ b/sd/uiconfig/sdraw/ui/vectorize.ui @@ -0,0 +1,376 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">8</property> + <property name="upper">32</property> + <property name="value">8</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">32</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment3"> + <property name="lower">8</property> + <property name="upper">128</property> + <property name="value">8</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkDialog" id="VectorizeDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="vectorize|VectorizeDialog">Convert to Polygon</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="window_position">mouse</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="preview"> + <property name="label" translatable="yes" context="vectorize|preview">Preview</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="preview-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|preview">Previews the converted image without applying the changes.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="vectorize|label2">Number of colors:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">colors</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="colors"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment1</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="colors-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|colors">Enter the number of colors to be displayed in the converted image. A polygon is generated for each occurrence of a color in the image.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="vectorize|label3">Point reduction:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">points</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="points"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="points-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|points">Removes color polygons that are smaller than the pixel value you enter.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="tilesft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">12</property> + <property name="label" translatable="yes" context="vectorize|tilesft">Tile size:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">tiles</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="tiles"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment3</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="tiles-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|tiles">Enter the size of the rectangle for the background fill.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="fillholes"> + <property name="label" translatable="yes" context="vectorize|fillholes">_Fill holes</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="fillholes-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|fillholes">Fills the color gaps caused by applying a point reduction.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="vectorize|label5">Source image:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">source</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="vectorize|label6">Vectorized image:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">vectorized</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkDrawingArea" id="source"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkDrawingArea" id="vectorized"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkProgressBar" id="progressbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="VectorizeDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|VectorizeDialog">Converts the selected object to a polygon (a closed object bounded by straight lines).</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/menubar/menubar.xml b/sd/uiconfig/simpress/menubar/menubar.xml new file mode 100644 index 0000000000..6cc13819bd --- /dev/null +++ b/sd/uiconfig/simpress/menubar/menubar.xml @@ -0,0 +1,681 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<menu:menubar xmlns:menu="http://openoffice.org/2001/menu" menu:id="menubar"> + <menu:menu menu:id=".uno:PickList"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:AddDirect"/> + <menu:menuitem menu:id=".uno:Open"/> + <menu:menuitem menu:id=".uno:OpenRemote" menu:style="text"/> + <menu:menuitem menu:id=".uno:RecentFileList"/> + <menu:menuitem menu:id=".uno:CloseDoc"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AutoPilotMenu" menu:style="text"/> + <menu:menu menu:id=".uno:TemplateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:OpenTemplate" menu:style="text"/> + <menu:menuitem menu:id=".uno:SaveAsTemplate" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NewDoc" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Reload" menu:style="text"/> + <menu:menuitem menu:id=".uno:VersionDialog" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Save"/> + <menu:menuitem menu:id=".uno:SaveAs"/> + <menu:menuitem menu:id=".uno:SaveAsRemote" menu:style="text"/> + <menu:menuitem menu:id=".uno:SaveACopy" menu:style="text"/> + <menu:menuitem menu:id=".uno:SaveAll" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CheckOut" menu:style="text"/> + <menu:menuitem menu:id=".uno:CancelCheckOut" menu:style="text"/> + <menu:menuitem menu:id=".uno:CheckIn" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ExportTo"/> + <menu:menu menu:id=".uno:ExportAsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ExportToPDF" menu:style="text"/> + <menu:menuitem menu:id=".uno:ExportDirectToPDF" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SendToMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SendMail" menu:style="text"/> + <menu:menuitem menu:id=".uno:SendMailDocAsPDF" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:WebHtml" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Print"/> + <menu:menuitem menu:id=".uno:PrinterSetup" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDocumentProperties"/> + <menu:menu menu:id=".uno:SignaturesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Signature" menu:style="text"/> + <menu:menuitem menu:id=".uno:SignPDF" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Quit"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:EditMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Undo"/> + <menu:menuitem menu:id=".uno:Redo"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menu menu:id=".uno:PasteSpecialMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:PasteUnformatted"/> + <menu:menuitem menu:id=".uno:PasteSpecial"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CopyObjects"/> + <menu:menuitem menu:id=".uno:SelectAll"/> + <menu:menuseparator/> + <menu:menuitem menu:id="vnd.sun.star.findbar:FocusToFindbar"/> + <menu:menuitem menu:id=".uno:SearchDialog" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:GlueEditMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditHyperlink" menu:style="text"/> + <menu:menuitem menu:id=".uno:ModifyField" menu:style="text"/> + <menu:menuitem menu:id=".uno:ManageLinks" menu:style="text"/> + <menu:menuitem menu:id=".uno:ObjectMenue" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditDoc" menu:style="text"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ViewMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:NormalMultiPaneGUI" menu:style="radio"/> + <menu:menuitem menu:id=".uno:OutlineMode" menu:style="radio"/> + <menu:menuitem menu:id=".uno:NotesMode" menu:style="radio"/> + <menu:menuitem menu:id=".uno:DiaMode" menu:style="radio"/> + <menu:menuitem menu:id=".uno:SlideMasterPage" menu:style="radio"/> + <menu:menuitem menu:id=".uno:NotesMasterPage" menu:style="radio"/> + <menu:menuitem menu:id=".uno:HandoutMode" menu:style="radio"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToolbarModeUI"/> + <menu:menuitem menu:id=".uno:AvailableToolbars" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:StatusBarVisible" menu:style="text"/> + <menu:menuitem menu:id=".uno:LeftPaneImpress" menu:style="text"/> + <menu:menuitem menu:id=".uno:ToggleTabBarVisibility" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowRuler"/> + <menu:menu menu:id=".uno:GridMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:GridVisible"/> + <menu:menuitem menu:id=".uno:GridFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HelplinesMove"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SnapLinesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:HelplinesVisible"/> + <menu:menuitem menu:id=".uno:HelplinesFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GridUse"/> + <menu:menuitem menu:id=".uno:HelplinesUse"/> + <menu:menuitem menu:id=".uno:SnapFrame"/> + <menu:menuitem menu:id=".uno:SnapPoints"/> + <menu:menuitem menu:id=".uno:SnapBorder"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowAnnotations"/> + <menu:menu menu:id=".uno:DisplayQualityMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:OutputQualityColor" menu:style="radio"/> + <menu:menuitem menu:id=".uno:OutputQualityGrayscale" menu:style="radio"/> + <menu:menuitem menu:id=".uno:OutputQualityBlackWhite" menu:style="radio"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Sidebar"/> + <menu:menuitem menu:id=".uno:ModifyPage"/> + <menu:menuitem menu:id=".uno:SlideChangeWindow"/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:ViewSidebarStyles"/> + <menu:menuitem menu:id=".uno:Gallery"/> + <menu:menuitem menu:id=".uno:Navigator"/> + <menu:menuitem menu:id=".uno:ColorControl"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ZoomPanning"/> + <menu:menu menu:id=".uno:ZoomMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ZoomPage"/> + <menu:menuitem menu:id=".uno:ZoomPageWidth"/> + <menu:menuitem menu:id=".uno:ZoomOptimal"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Zoom50Percent"/> + <menu:menuitem menu:id=".uno:Zoom75Percent"/> + <menu:menuitem menu:id=".uno:Zoom100Percent"/> + <menu:menuitem menu:id=".uno:Zoom150Percent"/> + <menu:menuitem menu:id=".uno:Zoom200Percent"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ZoomMode"/> + <menu:menuitem menu:id=".uno:ZoomPrevious"/> + <menu:menuitem menu:id=".uno:ZoomNext"/> + <menu:menuitem menu:id=".uno:ZoomObjects"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Zoom"/> + </menu:menupopup> + </menu:menu> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:InsertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertGraphic"/> + <menu:menuitem menu:id=".uno:InsertAVMedia"/> + <menu:menuitem menu:id=".uno:InsertObjectChart"/> + <menu:menuitem menu:id=".uno:InsertTable"/> + <menu:menu menu:id=".uno:GraphicMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Gallery"/> + <menu:menuitem menu:id=".uno:PhotoAlbumDialog"/> + <menu:menu menu:id=".uno:Scan"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:TwainSelect"/> + <menu:menuitem menu:id=".uno:TwainTransfer"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:AnimationObjects"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ObjectMenu" menu:style="text"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertMath"/> + <menu:menuitem menu:id=".uno:InsertQrCode"/> + <menu:menuitem menu:id=".uno:InsertObject"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ShapesMenu"> + <menu:menupopup> + <menu:menu menu:id=".uno:ShapesLineMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Line"/> + <menu:menuitem menu:id=".uno:Freeline_Unfilled"/> + <menu:menuitem menu:id=".uno:Freeline"/> + <menu:menuitem menu:id=".uno:Bezier_Unfilled"/> + <menu:menuitem menu:id=".uno:BezierFill"/> + <menu:menuitem menu:id=".uno:Polygon_Unfilled"/> + <menu:menuitem menu:id=".uno:Polygon_Diagonal_Unfilled"/> + <menu:menuitem menu:id=".uno:Polygon_Diagonal"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:BasicShapes"/> + <menu:menuitem menu:id=".uno:SymbolShapes"/> + <menu:menuitem menu:id=".uno:ArrowShapes"/> + <menu:menuitem menu:id=".uno:FlowChartShapes"/> + <menu:menuitem menu:id=".uno:CalloutShapes"/> + <menu:menuitem menu:id=".uno:StarShapes"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CapturePoint" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Text"/> + <menu:menuitem menu:id=".uno:InsertAnnotation"/> + <menu:menuitem menu:id=".uno:FontworkGalleryFloater"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HyperlinkDialog"/> + <menu:menuitem menu:id=".uno:InsertSymbol"/> + <menu:menu menu:id=".uno:FormattingMarkMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertNonBreakingSpace"/> + <menu:menuitem menu:id=".uno:InsertHardHyphen"/> + <menu:menuitem menu:id=".uno:InsertSoftHyphen"/> + <menu:menuitem menu:id=".uno:InsertNarrowNobreakSpace"/> + <menu:menuitem menu:id=".uno:InsertZWSP"/> + <menu:menuitem menu:id=".uno:InsertWJ"/> + <menu:menuitem menu:id=".uno:InsertLRM"/> + <menu:menuitem menu:id=".uno:InsertRLM"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertSlideField"/> + <menu:menu menu:id=".uno:FieldMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertDateFieldFix"/> + <menu:menuitem menu:id=".uno:InsertDateFieldVar"/> + <menu:menuitem menu:id=".uno:InsertTimeFieldFix"/> + <menu:menuitem menu:id=".uno:InsertTimeFieldVar"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertAuthorField"/> + <menu:menuitem menu:id=".uno:InsertSlideField"/> + <menu:menuitem menu:id=".uno:InsertSlideTitleField"/> + <menu:menuitem menu:id=".uno:InsertSlidesField"/> + <menu:menuitem menu:id=".uno:InsertFileField"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:HeaderAndFooter" menu:style="text"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:InsertFormMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Label"/> + <menu:menuitem menu:id=".uno:Edit"/> + <menu:menuitem menu:id=".uno:CheckBox"/> + <menu:menuitem menu:id=".uno:RadioButton"/> + <menu:menuitem menu:id=".uno:ListBox"/> + <menu:menuitem menu:id=".uno:ComboBox"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Pushbutton"/> + <menu:menuitem menu:id=".uno:Imagebutton"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FormattedField"/> + <menu:menuitem menu:id=".uno:DateField"/> + <menu:menuitem menu:id=".uno:TimeField"/> + <menu:menuitem menu:id=".uno:NumericField"/> + <menu:menuitem menu:id=".uno:CurrencyField"/> + <menu:menuitem menu:id=".uno:PatternField"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GroupBox"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ImageControl"/> + <menu:menuitem menu:id=".uno:FileControl"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Grid"/> + <menu:menuitem menu:id=".uno:NavigationBar"/> + </menu:menupopup> + </menu:menu> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatMenu"> + <menu:menupopup> + <menu:menu menu:id=".uno:FormatTextMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Bold"/> + <menu:menuitem menu:id=".uno:Italic"/> + <menu:menuitem menu:id=".uno:UnderlineSingle"/> + <menu:menuitem menu:id=".uno:UnderlineDouble"/> + <menu:menuitem menu:id=".uno:Strikeout"/> + <menu:menuitem menu:id=".uno:Overline"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SuperScript"/> + <menu:menuitem menu:id=".uno:SubScript"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Shadowed"/> + <menu:menuitem menu:id=".uno:OutlineFont"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Grow"/> + <menu:menuitem menu:id=".uno:Shrink"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ChangeCaseToUpper"/> + <menu:menuitem menu:id=".uno:ChangeCaseToLower"/> + <menu:menuitem menu:id=".uno:ChangeCaseRotateCase"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ChangeCaseToSentenceCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToTitleCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToToggleCase"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SmallCaps"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ChangeCaseToHalfWidth"/> + <menu:menuitem menu:id=".uno:ChangeCaseToFullWidth"/> + <menu:menuitem menu:id=".uno:ChangeCaseToHiragana"/> + <menu:menuitem menu:id=".uno:ChangeCaseToKatakana"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatSpacingMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SpacePara1"/> + <menu:menuitem menu:id=".uno:SpacePara15"/> + <menu:menuitem menu:id=".uno:SpacePara2"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ParaspaceIncrease"/> + <menu:menuitem menu:id=".uno:ParaspaceDecrease"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:IncrementIndent"/> + <menu:menuitem menu:id=".uno:DecrementIndent"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TextAlign"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CellVertTop" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CellVertCenter" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CellVertBottom" menu:style="radio"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatBulletsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:DefaultBullet"/> + <menu:menuitem menu:id=".uno:DefaultNumbering"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OutlineRight"/> + <menu:menuitem menu:id=".uno:OutlineLeft"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OutlineDown"/> + <menu:menuitem menu:id=".uno:OutlineUp"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault" menu:style="text"/> + <menu:menu menu:id=".uno:FormatStylesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:EditStyle"/> + <menu:menuitem menu:id=".uno:StyleUpdateByExample"/> + <menu:menuitem menu:id=".uno:StyleNewByExample"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DesignerDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuitem menu:id=".uno:OutlineBullet"/> + <menu:menuitem menu:id=".uno:ThemeDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:TableMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/> + <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/> + <menu:menuitem menu:id=".uno:DistributeRows"/> + <menu:menuitem menu:id=".uno:EntireRow"/> + <menu:menuitem menu:id=".uno:InsertRowDialog"/> + <menu:menuitem menu:id=".uno:DeleteRows"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/> + <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/> + <menu:menuitem menu:id=".uno:DistributeColumns"/> + <menu:menuitem menu:id=".uno:EntireColumn"/> + <menu:menuitem menu:id=".uno:InsertColumnDialog"/> + <menu:menuitem menu:id=".uno:DeleteColumns"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MergeCells"/> + <menu:menuitem menu:id=".uno:SplitCell"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DeleteTable"/> + <menu:menuitem menu:id=".uno:SelectTable"/> + <menu:menuitem menu:id=".uno:TableDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatImageMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Crop"/> + <menu:menuitem menu:id=".uno:OriginalSize"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ExternalEdit"/> + <menu:menuitem menu:id=".uno:ChangePicture"/> + <menu:menuitem menu:id=".uno:CompressGraphic"/> + <menu:menuitem menu:id=".uno:SaveGraphic"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:FormatImageFilterMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:GraphicFilterSepia"/> + <menu:menuitem menu:id=".uno:GraphicFilterSobel"/> + <menu:menuitem menu:id=".uno:GraphicFilterInvert"/> + <menu:menuitem menu:id=".uno:GraphicFilterMosaic"/> + <menu:menuitem menu:id=".uno:GraphicFilterPopart"/> + <menu:menuitem menu:id=".uno:GraphicFilterPoster"/> + <menu:menuitem menu:id=".uno:GraphicFilterRelief"/> + <menu:menuitem menu:id=".uno:GraphicFilterRemoveNoise"/> + <menu:menuitem menu:id=".uno:GraphicFilterSharpen"/> + <menu:menuitem menu:id=".uno:GraphicFilterSmooth"/> + <menu:menuitem menu:id=".uno:GraphicFilterSolarize"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:ColorSettings"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GrafAttrCrop"/> + <menu:menuitem menu:id=".uno:GraphicSizeCheck"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatObjectMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FillShadow"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:NameGroup" menu:style="text"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DistributeSelection"/> + <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:GroupMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + </menu:menupopup> + </menu:menu> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SlideMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertSlide"/> + <menu:menuitem menu:id=".uno:DuplicateSlide"/> + <menu:menuitem menu:id=".uno:ImportSlideFromFile" menu:style="text"/> + <menu:menu menu:id=".uno:SlideLayoutMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=20"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=19"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=0"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=1"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=32"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=3"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=12"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=15"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=14"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=16"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=18"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=34"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=28"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=27"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=29"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=30"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:DeleteSlide"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SaveBackground"/> + <menu:menuitem menu:id=".uno:SelectBackground"/> + <menu:menuitem menu:id=".uno:SlideSetup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:PresentationLayout"/> + <menu:menuitem menu:id=".uno:InsertMasterPage"/> + <menu:menuitem menu:id=".uno:DeleteMasterPage"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DisplayMasterBackground"/> + <menu:menuitem menu:id=".uno:DisplayMasterObjects"/> + <menu:menuitem menu:id=".uno:MasterLayouts"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowSlide"/> + <menu:menuitem menu:id=".uno:HideSlide"/> + <menu:menuitem menu:id=".uno:RenameSlide"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:RestoreEditingView"/> + <menu:menu menu:id=".uno:SlideMoveMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MoveSlideFirst"/> + <menu:menuitem menu:id=".uno:MoveSlideUp"/> + <menu:menuitem menu:id=".uno:MoveSlideDown"/> + <menu:menuitem menu:id=".uno:MoveSlideLast"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:NavigateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:FirstSlide"/> + <menu:menuitem menu:id=".uno:PreviousSlide"/> + <menu:menuitem menu:id=".uno:NextSlide"/> + <menu:menuitem menu:id=".uno:LastSlide"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SummaryPage" menu:style="text"/> + <menu:menuitem menu:id=".uno:ExpandPage" menu:style="text"/> + <menu:menuitem menu:id=".uno:SlideChangeWindow"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SlideShowMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Presentation"/> + <menu:menuitem menu:id=".uno:PresentationCurrentSlide"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:RehearseTimings"/> + <menu:menuitem menu:id=".uno:CustomShowDialog"/> + <menu:menuitem menu:id=".uno:Remote"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:PresentationDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ToolsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SpellDialog"/> + <menu:menuitem menu:id=".uno:SpellOnline"/> + <menu:menuitem menu:id=".uno:ThesaurusDialog" menu:style="text"/> + <menu:menu menu:id=".uno:LanguageMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SetLanguageAllTextMenu"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Hyphenation" menu:style="text"/> + <menu:menuitem menu:id=".uno:ChineseConversion"/> + <menu:menuitem menu:id=".uno:HangulHanjaConversion"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MoreDictionaries"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AutoCorrectDlg"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:RedactDoc" menu:style="text"/> + <menu:menuitem menu:id=".uno:AutoRedactDoc" menu:style="text"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:PresentationMinimizer"/> + <menu:menuitem menu:id=".uno:ImageMapDialog"/> + <menu:menuitem menu:id=".uno:BmpMask"/> + <menu:menuitem menu:id=".uno:AVMediaPlayer"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ToolsFormsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SwitchControlDesignMode"/> + <menu:menuitem menu:id=".uno:UseWizards"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ControlProperties"/> + <menu:menuitem menu:id=".uno:FormProperties"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowFmExplorer"/> + <menu:menuitem menu:id=".uno:TabDialog"/> + <menu:menuitem menu:id=".uno:AddField"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OpenReadOnly"/> + <menu:menuitem menu:id=".uno:AutoControlFocus"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MacrosMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MacroRecorder"/> + <menu:menuitem menu:id=".uno:RunMacro"/> + <menu:menuitem menu:id=".uno:BasicIDEAppear"/> + <menu:menuitem menu:id=".uno:ScriptOrganizer"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MacroSignature"/> + <menu:menuitem menu:id=".uno:MacroOrganizer?TabId:short=1"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:DevelopmentToolsDockingWindow"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OpenXMLFilterSettings"/> + <menu:menuitem menu:id="service:com.sun.star.deployment.ui.PackageManagerDialog" menu:style="text"/> + <menu:menuitem menu:id=".uno:ConfigureDialog" menu:style="text"/> + <menu:menuitem menu:id=".uno:OptionsTreeDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:WindowList"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:NewWindow"/> + <menu:menuitem menu:id=".uno:CloseWin"/> + <menu:menuseparator/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:HelpMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:HelpIndex"/> + <menu:menuitem menu:id=".uno:ExtendedHelp"/> + <menu:menuitem menu:id=".uno:Documentation"/> + <menu:menuitem menu:id=".uno:TipOfTheDay"/> + <menu:menuitem menu:id=".uno:CommandPopup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:QuestionAnswers"/> + <menu:menuitem menu:id=".uno:SendFeedback"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SafeMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GetInvolved"/> + <menu:menuitem menu:id=".uno:Donation"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowLicense"/> + <menu:menuitem menu:id=".uno:About"/> + </menu:menupopup> + </menu:menu> +</menu:menubar> diff --git a/sd/uiconfig/simpress/popupmenu/3dobject.xml b/sd/uiconfig/simpress/popupmenu/3dobject.xml new file mode 100644 index 0000000000..e60941ae44 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/3dobject.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Window3D"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/3dscene.xml b/sd/uiconfig/simpress/popupmenu/3dscene.xml new file mode 100644 index 0000000000..0b159168db --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/3dscene.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Window3D"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/3dscene2.xml b/sd/uiconfig/simpress/popupmenu/3dscene2.xml new file mode 100644 index 0000000000..3e37842437 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/3dscene2.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Window3D"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/bezier.xml b/sd/uiconfig/simpress/popupmenu/bezier.xml new file mode 100644 index 0000000000..4136702322 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/bezier.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierMove"/> + <menu:menuitem menu:id=".uno:BezierInsert"/> + <menu:menuitem menu:id=".uno:BezierDelete"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierClose"/> + <menu:menuitem menu:id=".uno:BezierCutLine"/> + <menu:menuitem menu:id=".uno:BezierConvert"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierEdge"/> + <menu:menuitem menu:id=".uno:BezierSmooth"/> + <menu:menuitem menu:id=".uno:BezierSymmetric"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BezierEliminatePoints"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/connector.xml b/sd/uiconfig/simpress/popupmenu/connector.xml new file mode 100644 index 0000000000..886fc878cd --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/connector.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NewRouting"/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:ConnectorAttributes"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/curve.xml b/sd/uiconfig/simpress/popupmenu/curve.xml new file mode 100644 index 0000000000..3c5db45de3 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/curve.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:CloseObject"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuitem menu:id=".uno:Break"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/draw.xml b/sd/uiconfig/simpress/popupmenu/draw.xml new file mode 100644 index 0000000000..b0b3933c7b --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/draw.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:AdvancedMode"/> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/drawtext.xml b/sd/uiconfig/simpress/popupmenu/drawtext.xml new file mode 100644 index 0000000000..d0b1a95280 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/drawtext.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuitem menu:id=".uno:PasteUnformatted"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuitem menu:id=".uno:OutlineBullet"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OpenHyperlinkOnCursor"/> + <menu:menuitem menu:id=".uno:EditHyperlink"/> + <menu:menuitem menu:id=".uno:CopyHyperlinkLocation"/> + <menu:menuitem menu:id=".uno:RemoveHyperlink"/> + <menu:menuitem menu:id=".uno:ThesaurusFromContext"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault"/> + <menu:menuitem menu:id=".uno:EditStyle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertAnnotation"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/form.xml b/sd/uiconfig/simpress/popupmenu/form.xml new file mode 100644 index 0000000000..8ea12e638b --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/form.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ControlProperties"/> + <menu:menuitem menu:id=".uno:FormProperties"/> + <menu:menuitem menu:id=".uno:ChangeControlType"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/formrichtext.xml b/sd/uiconfig/simpress/popupmenu/formrichtext.xml new file mode 100644 index 0000000000..f5f8f7a0d2 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/formrichtext.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CharFontName"/> + <menu:menuitem menu:id=".uno:FontHeight"/> + <menu:menu menu:id=".uno:StyleMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Bold"/> + <menu:menuitem menu:id=".uno:Italic"/> + <menu:menuitem menu:id=".uno:Overline"/> + <menu:menuitem menu:id=".uno:Underline"/> + <menu:menuitem menu:id=".uno:Strikeout"/> + <menu:menuitem menu:id=".uno:Shadowed"/> + <menu:menuitem menu:id=".uno:OutlineFont"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SuperScript"/> + <menu:menuitem menu:id=".uno:SubScript"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TextAlign"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/> + <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:FormatSpacingMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SpacePara1"/> + <menu:menuitem menu:id=".uno:SpacePara15"/> + <menu:menuitem menu:id=".uno:SpacePara2"/> + </menu:menupopup> + </menu:menu> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/gluepoint.xml b/sd/uiconfig/simpress/popupmenu/gluepoint.xml new file mode 100644 index 0000000000..c38a993497 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/gluepoint.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:GlueInsertPoint"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionLeft"/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionTop"/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionRight"/> + <menu:menuitem menu:id=".uno:GlueEscapeDirectionBottom"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GluePercent"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GlueHorzAlignLeft"/> + <menu:menuitem menu:id=".uno:GlueHorzAlignCenter"/> + <menu:menuitem menu:id=".uno:GlueHorzAlignRight"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GlueVertAlignTop"/> + <menu:menuitem menu:id=".uno:GlueVertAlignCenter"/> + <menu:menuitem menu:id=".uno:GlueVertAlignBottom"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/graphic.xml b/sd/uiconfig/simpress/popupmenu/graphic.xml new file mode 100644 index 0000000000..3da37f0515 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/graphic.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Crop"/> + <menu:menuitem menu:id=".uno:ExternalEdit"/> + <menu:menuitem menu:id=".uno:ChangePicture"/> + <menu:menuitem menu:id=".uno:CompressGraphic"/> + <menu:menuitem menu:id=".uno:SaveGraphic"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OriginalSize"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:RotateFlipMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Break"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EditQrCode"/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/group.xml b/sd/uiconfig/simpress/popupmenu/group.xml new file mode 100644 index 0000000000..a17b6cc070 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/group.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:EnterGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/line.xml b/sd/uiconfig/simpress/popupmenu/line.xml new file mode 100644 index 0000000000..219a187a31 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/line.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/measure.xml b/sd/uiconfig/simpress/popupmenu/measure.xml new file mode 100644 index 0000000000..d1d8b30818 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/measure.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:MeasureAttributes"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuitem menu:id=".uno:EditStyle"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/media.xml b/sd/uiconfig/simpress/popupmenu/media.xml new file mode 100644 index 0000000000..69a3b61d5c --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/media.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/multiselect.xml b/sd/uiconfig/simpress/popupmenu/multiselect.xml new file mode 100644 index 0000000000..1b1e89d09e --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/multiselect.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:DistributeSelection"/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:MirrorMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:PolyFormen"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:Combine"/> + <menu:menuitem menu:id=".uno:Dismantle"/> + <menu:menuitem menu:id=".uno:Connect"/> + <menu:menuitem menu:id=".uno:Break"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:Merge"/> + <menu:menuitem menu:id=".uno:Substract"/> + <menu:menuitem menu:id=".uno:Intersect"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:EqualizeWidth"/> + <menu:menuitem menu:id=".uno:EqualizeHeight"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:FormatGroup"/> + <menu:menuitem menu:id=".uno:FormatUngroup"/> + <menu:menuitem menu:id=".uno:LeaveGroup"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ExportTo"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/notebookbar.xml b/sd/uiconfig/simpress/popupmenu/notebookbar.xml new file mode 100644 index 0000000000..ae78bb4ced --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/notebookbar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:AddDirect"/> + <menu:menuitem menu:id=".uno:RecentFileList"/> + <menu:menuitem menu:id=".uno:CloseDoc"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ToolbarModeUI"/> + <menu:menuitem menu:id=".uno:AvailableToolbars"/> + <menu:menuitem menu:id=".uno:ConfigureDialog"/> + <menu:menuitem menu:id=".uno:OptionsTreeDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HelpIndex"/> + <menu:menuitem menu:id=".uno:Donation"/> + <menu:menuitem menu:id=".uno:About"/> + <menu:menuseparator/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/objectalign.xml b/sd/uiconfig/simpress/popupmenu/objectalign.xml new file mode 100644 index 0000000000..4bb17386d1 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/objectalign.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:ObjectAlignLeft"/> + <menu:menuitem menu:id=".uno:AlignCenter"/> + <menu:menuitem menu:id=".uno:ObjectAlignRight"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AlignUp"/> + <menu:menuitem menu:id=".uno:AlignMiddle"/> + <menu:menuitem menu:id=".uno:AlignDown"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/oleobject.xml b/sd/uiconfig/simpress/popupmenu/oleobject.xml new file mode 100644 index 0000000000..d26276d367 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/oleobject.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:OriginalSize"/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:RotateFlipMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MirrorVert"/> + <menu:menuitem menu:id=".uno:MirrorHorz"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:NameGroup"/> + <menu:menuitem menu:id=".uno:ObjectTitleDescription"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/outline.xml b/sd/uiconfig/simpress/popupmenu/outline.xml new file mode 100644 index 0000000000..6ddc0b1a95 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/outline.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:OutlineBullet"/> + <menu:menu menu:id=".uno:TransliterateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeCaseToSentenceCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToLower"/> + <menu:menuitem menu:id=".uno:ChangeCaseToUpper"/> + <menu:menuitem menu:id=".uno:ChangeCaseToTitleCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToToggleCase"/> + <menu:menuitem menu:id=".uno:ChangeCaseToHalfWidth"/> + <menu:menuitem menu:id=".uno:ChangeCaseToFullWidth"/> + <menu:menuitem menu:id=".uno:ChangeCaseToHiragana"/> + <menu:menuitem menu:id=".uno:ChangeCaseToKatakana"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:ModifyPresentationObject"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/page.xml b/sd/uiconfig/simpress/popupmenu/page.xml new file mode 100644 index 0000000000..8a94daf5d7 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/page.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ShowRuler"/> + <menu:menu menu:id=".uno:GridMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:GridVisible"/> + <menu:menuitem menu:id=".uno:GridUse"/> + <menu:menuitem menu:id=".uno:GridFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:HelplinesMove"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SnapLinesMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:HelplinesVisible"/> + <menu:menuitem menu:id=".uno:HelplinesFront"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:GridUse"/> + <menu:menuitem menu:id=".uno:HelplinesUse"/> + <menu:menuitem menu:id=".uno:SnapFrame"/> + <menu:menuitem menu:id=".uno:SnapPoints"/> + <menu:menuitem menu:id=".uno:SnapBorder"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:CapturePoint"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:SlideLayoutMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=20"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=19"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=0"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=1"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=32"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=3"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=12"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=15"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=14"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=16"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=18"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=34"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=28"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=27"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=29"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=30"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:NavigateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:FirstSlide"/> + <menu:menuitem menu:id=".uno:PreviousSlide"/> + <menu:menuitem menu:id=".uno:NextSlide"/> + <menu:menuitem menu:id=".uno:LastSlide"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SlideMoveMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MoveSlideFirst"/> + <menu:menuitem menu:id=".uno:MoveSlideUp"/> + <menu:menuitem menu:id=".uno:MoveSlideDown"/> + <menu:menuitem menu:id=".uno:MoveSlideLast"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:SaveBackground"/> + <menu:menuitem menu:id=".uno:PresentationLayout"/> + <menu:menuitem menu:id=".uno:SlideChangeWindow"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SlideSetup"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/pagepane.xml b/sd/uiconfig/simpress/popupmenu/pagepane.xml new file mode 100644 index 0000000000..6f8af1640b --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/pagepane.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertSlide"/> + <menu:menuitem menu:id=".uno:DuplicateSlide"/> + <menu:menuitem menu:id=".uno:RenameSlide"/> + <menu:menuitem menu:id=".uno:HideSlide"/> + <menu:menuitem menu:id=".uno:ShowSlide"/> + <menu:menuitem menu:id=".uno:DeleteSlide"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:SlideLayoutMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=20"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=19"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=0"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=1"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=32"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=3"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=12"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=15"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=14"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=16"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=18"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=34"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=28"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=27"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=29"/> + <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=30"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:NavigateMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:FirstSlide"/> + <menu:menuitem menu:id=".uno:PreviousSlide"/> + <menu:menuitem menu:id=".uno:NextSlide"/> + <menu:menuitem menu:id=".uno:LastSlide"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:SlideMoveMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:MoveSlideFirst"/> + <menu:menuitem menu:id=".uno:MoveSlideUp"/> + <menu:menuitem menu:id=".uno:MoveSlideDown"/> + <menu:menuitem menu:id=".uno:MoveSlideLast"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SlideSetup"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/pagepanemaster.xml b/sd/uiconfig/simpress/popupmenu/pagepanemaster.xml new file mode 100644 index 0000000000..812d0ad44b --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/pagepanemaster.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertMasterPage"/> + <menu:menuitem menu:id=".uno:DeleteMasterPage"/> + <menu:menuitem menu:id=".uno:RenameMasterPage"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/pagepanenosel.xml b/sd/uiconfig/simpress/popupmenu/pagepanenosel.xml new file mode 100644 index 0000000000..62a2bcc21c --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/pagepanenosel.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertSlide"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml b/sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml new file mode 100644 index 0000000000..919e3c59ce --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertMasterPage"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/pagetab.xml b/sd/uiconfig/simpress/popupmenu/pagetab.xml new file mode 100644 index 0000000000..b5d34b3ceb --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/pagetab.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertSlide"/> + <menu:menuitem menu:id=".uno:DeleteSlide"/> + <menu:menuitem menu:id=".uno:ModifyPage"/> + <menu:menuitem menu:id=".uno:RenameSlide"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/table.xml b/sd/uiconfig/simpress/popupmenu/table.xml new file mode 100644 index 0000000000..71ae6f2bd5 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/table.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:MergeCells"/> + <menu:menuitem menu:id=".uno:SplitCell"/> + <menu:menu menu:id=".uno:TableInsertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertRowsBefore"/> + <menu:menuitem menu:id=".uno:InsertRowsAfter"/> + <menu:menuitem menu:id=".uno:InsertRowDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:InsertColumnsBefore"/> + <menu:menuitem menu:id=".uno:InsertColumnsAfter"/> + <menu:menuitem menu:id=".uno:InsertColumnDialog"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TableDeleteMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:DeleteRows"/> + <menu:menuitem menu:id=".uno:DeleteColumns"/> + <menu:menuitem menu:id=".uno:DeleteTable"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:TableAutoFitMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:SetRowHeight"/> + <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/> + <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/> + <menu:menuitem menu:id=".uno:DistributeRows"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetColumnWidth"/> + <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/> + <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/> + <menu:menuitem menu:id=".uno:DistributeColumns"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menuitem menu:id=".uno:TableTransformDialog"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TableDialog"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/popupmenu/textbox.xml b/sd/uiconfig/simpress/popupmenu/textbox.xml new file mode 100644 index 0000000000..5bc1450843 --- /dev/null +++ b/sd/uiconfig/simpress/popupmenu/textbox.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu"> + <menu:menuitem menu:id=".uno:Cut"/> + <menu:menuitem menu:id=".uno:Copy"/> + <menu:menuitem menu:id=".uno:Paste"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TextAutoFitToSize"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:TransformDialog"/> + <menu:menuitem menu:id=".uno:FormatLine"/> + <menu:menuitem menu:id=".uno:FormatArea"/> + <menu:menuitem menu:id=".uno:TextAttributes"/> + <menu:menuitem menu:id=".uno:FontWork"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:FontDialog"/> + <menu:menuitem menu:id=".uno:ParagraphDialog"/> + <menu:menuseparator/> + <menu:menu menu:id=".uno:ObjectAlign"/> + <menu:menu menu:id=".uno:ArrangeMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:BringToFront"/> + <menu:menuitem menu:id=".uno:Forward"/> + <menu:menuitem menu:id=".uno:Backward"/> + <menu:menuitem menu:id=".uno:SendToBack"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:BeforeObject"/> + <menu:menuitem menu:id=".uno:BehindObject"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:ReverseOrder"/> + </menu:menupopup> + </menu:menu> + <menu:menu menu:id=".uno:ConvertMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:ChangeBezier"/> + <menu:menuitem menu:id=".uno:ChangePolygon"/> + <menu:menuitem menu:id=".uno:convert_to_contour"/> + <menu:menuitem menu:id=".uno:ConvertInto3D"/> + <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/> + <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/> + <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/> + </menu:menupopup> + </menu:menu> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:SetDefault"/> + <menu:menuitem menu:id=".uno:EditStyle"/> + <menu:menuseparator/> + <menu:menuitem menu:id=".uno:CustomAnimation"/> + <menu:menuitem menu:id=".uno:AnimationEffects"/> + <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/> +</menu:menupopup> diff --git a/sd/uiconfig/simpress/statusbar/statusbar.xml b/sd/uiconfig/simpress/statusbar/statusbar.xml new file mode 100644 index 0000000000..c0a923e4a6 --- /dev/null +++ b/sd/uiconfig/simpress/statusbar/statusbar.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE statusbar:statusbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "statusbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<statusbar:statusbar xmlns:statusbar="http://openoffice.org/2001/statusbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <statusbar:statusbaritem xlink:href=".uno:PageStatus" statusbar:align="left" statusbar:width="124"/> + <statusbar:statusbaritem xlink:href=".uno:Context" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="184"/> + <statusbar:statusbaritem xlink:href=".uno:LayoutStatus" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="54"/> + <statusbar:statusbaritem xlink:href=".uno:Size" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="200"/> + <statusbar:statusbaritem xlink:href=".uno:ModifiedStatus" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/> + <statusbar:statusbaritem xlink:href=".uno:Signature" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="16"/> + <statusbar:statusbaritem xlink:href=".uno:LanguageStatus" statusbar:align="center" statusbar:autosize="true" statusbar:width="100"/> + <statusbar:statusbaritem xlink:href=".uno:ZoomPage" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/> + <statusbar:statusbaritem xlink:href=".uno:ZoomSlider" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="130"/> + <statusbar:statusbaritem xlink:href=".uno:Zoom" statusbar:align="center" statusbar:width="36"/> +</statusbar:statusbar> diff --git a/sd/uiconfig/simpress/toolbar/3dobjectsbar.xml b/sd/uiconfig/simpress/toolbar/3dobjectsbar.xml new file mode 100644 index 0000000000..bc0b6f81e7 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/3dobjectsbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Cube"/> + <toolbar:toolbaritem xlink:href=".uno:Sphere"/> + <toolbar:toolbaritem xlink:href=".uno:Cylinder"/> + <toolbar:toolbaritem xlink:href=".uno:Cone"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Cyramid"/> + <toolbar:toolbaritem xlink:href=".uno:Torus"/> + <toolbar:toolbaritem xlink:href=".uno:Shell3D"/> + <toolbar:toolbaritem xlink:href=".uno:HalfSphere"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/alignmentbar.xml b/sd/uiconfig/simpress/toolbar/alignmentbar.xml new file mode 100644 index 0000000000..38d0340a3d --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/alignmentbar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft"/> + <toolbar:toolbaritem xlink:href=".uno:AlignCenter"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:AlignUp"/> + <toolbar:toolbaritem xlink:href=".uno:AlignMiddle"/> + <toolbar:toolbaritem xlink:href=".uno:AlignDown"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/arrowsbar.xml b/sd/uiconfig/simpress/toolbar/arrowsbar.xml new file mode 100644 index 0000000000..4e947f2b36 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/arrowsbar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:LineCircleArrow"/> + <toolbar:toolbaritem xlink:href=".uno:LineSquareArrow"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrows"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowStart"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowCircle"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowSquare"/> + <toolbar:toolbaritem xlink:href=".uno:Line"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:MeasureLine"/> + <toolbar:toolbaritem xlink:href=".uno:Line_Diagonal"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/arrowshapes.xml b/sd/uiconfig/simpress/toolbar/arrowshapes.xml new file mode 100644 index 0000000000..3f74148c7d --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/arrowshapes.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.circular-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.s-sharped-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-round-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.corner-right-arrow"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.chevron"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.pentagon-right"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.striped-right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-down-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.notched-right-arrow"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow-callout"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow-callout"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow-callout"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/basicshapes.xml b/sd/uiconfig/simpress/toolbar/basicshapes.xml new file mode 100644 index 0000000000..148245f666 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/basicshapes.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.quadrat"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-quadrat"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.parallelogram"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.trapezoid"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle-pie"/> + <toolbar:toolbaritem xlink:href=".uno:CircleCut"/> + <toolbar:toolbaritem xlink:href=".uno:Arc"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.block-arc"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.isosceles-triangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.right-triangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.diamond"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.pentagon"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.hexagon"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.octagon"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.can"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cube"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.paper"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cross"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.frame"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ring"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/bezierobjectbar.xml b/sd/uiconfig/simpress/toolbar/bezierobjectbar.xml new file mode 100644 index 0000000000..914738e7cb --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/bezierobjectbar.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierMove"/> + <toolbar:toolbaritem xlink:href=".uno:BezierInsert"/> + <toolbar:toolbaritem xlink:href=".uno:BezierDelete"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierConvert"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierClose"/> + <toolbar:toolbaritem xlink:href=".uno:BezierCutLine"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierEdge"/> + <toolbar:toolbaritem xlink:href=".uno:BezierSmooth"/> + <toolbar:toolbaritem xlink:href=".uno:BezierSymmetric"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BezierEliminatePoints"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/calloutshapes.xml b/sd/uiconfig/simpress/toolbar/calloutshapes.xml new file mode 100644 index 0000000000..04176302cc --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/calloutshapes.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.rectangular-callout"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-rectangular-callout"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-callout"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.cloud-callout"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-1"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-2"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-3"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/choosemodebar.xml b/sd/uiconfig/simpress/toolbar/choosemodebar.xml new file mode 100644 index 0000000000..c8bda07626 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/choosemodebar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/> + <toolbar:toolbaritem xlink:href=".uno:Mirror"/> + <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLathe"/> + <toolbar:toolbaritem xlink:href=".uno:CrookRotate"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CrookSlant"/> + <toolbar:toolbaritem xlink:href=".uno:Shear"/> + <toolbar:toolbaritem xlink:href=".uno:InteractiveTransparence"/> + <toolbar:toolbaritem xlink:href=".uno:InteractiveGradient"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/classificationbar.xml b/sd/uiconfig/simpress/toolbar/classificationbar.xml new file mode 100644 index 0000000000..e81fea06ea --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/classificationbar.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ClassificationApply"/> + <toolbar:toolbaritem xlink:href=".uno:ClassificationDialog"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/colorbar.xml b/sd/uiconfig/simpress/toolbar/colorbar.xml new file mode 100644 index 0000000000..879b6a6476 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/colorbar.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:GrafRed"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafGreen"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafBlue"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafLuminance"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafContrast"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GrafGamma"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/commentsbar.xml b/sd/uiconfig/simpress/toolbar/commentsbar.xml new file mode 100644 index 0000000000..a2f6a6eac5 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/commentsbar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertAnnotation"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:PreviousAnnotation"/> + <toolbar:toolbaritem xlink:href=".uno:NextAnnotation"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:DeleteAnnotation"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteAllAnnotation"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/commontaskbar.xml b/sd/uiconfig/simpress/toolbar/commontaskbar.xml new file mode 100644 index 0000000000..9df003a0e0 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/commontaskbar.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertSlide"/> + <toolbar:toolbaritem xlink:href=".uno:DuplicateSlide"/> + <toolbar:toolbaritem xlink:href=".uno:RenameSlide" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteSlide"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AssignLayout"/> + <toolbar:toolbaritem xlink:href=".uno:PresentationLayout" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ExpandPage" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FirstSlide" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:PreviousSlide" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:NextSlide" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:LastSlide" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MoveSlideFirst" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:MoveSlideUp" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:MoveSlideDown" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:MoveSlideLast" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/connectorsbar.xml b/sd/uiconfig/simpress/toolbar/connectorsbar.xml new file mode 100644 index 0000000000..8355775e2a --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/connectorsbar.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowEnd"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowEnd"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Connector"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLine"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurve"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLines"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorArrows"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrows"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrows"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrows"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowStart" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleEnd" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleStart" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleStart" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCircles" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircles" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircles" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircles" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/distributebar.xml b/sd/uiconfig/simpress/toolbar/distributebar.xml new file mode 100644 index 0000000000..308104262c --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/distributebar.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzLeft"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzCenter"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzDistance"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeHorzRight"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertTop"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertCenter"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertDistance"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeVertBottom"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/drawingobjectbar.xml b/sd/uiconfig/simpress/toolbar/drawingobjectbar.xml new file mode 100644 index 0000000000..83203c6724 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/drawingobjectbar.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BringToFront"/> + <toolbar:toolbaritem xlink:href=".uno:Forward"/> + <toolbar:toolbaritem xlink:href=".uno:Backward"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/> + <toolbar:toolbaritem xlink:href=".uno:BehindObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/> + <toolbar:toolbaritem xlink:href=".uno:LineWidth"/> + <toolbar:toolbaritem xlink:href=".uno:XLineColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FillShadow"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineEndStyle"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/> + <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/> + <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Window3D" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ImageMapDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:CustomAnimation" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AnimationEffects"/> + <toolbar:toolbaritem xlink:href=".uno:DesignerDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> +</toolbar:toolbar> + diff --git a/sd/uiconfig/simpress/toolbar/ellipsesbar.xml b/sd/uiconfig/simpress/toolbar/ellipsesbar.xml new file mode 100644 index 0000000000..35167b9c75 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/ellipsesbar.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Ellipse"/> + <toolbar:toolbaritem xlink:href=".uno:Circle"/> + <toolbar:toolbaritem xlink:href=".uno:Pie"/> + <toolbar:toolbaritem xlink:href=".uno:CirclePie"/> + <toolbar:toolbaritem xlink:href=".uno:EllipseCut"/> + <toolbar:toolbaritem xlink:href=".uno:CircleCut"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Ellipse_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Circle_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Pie_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:CirclePie_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:EllipseCut_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:CircleCut_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Arc"/> + <toolbar:toolbaritem xlink:href=".uno:CircleArc"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml b/sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml new file mode 100644 index 0000000000..5f5ff29168 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltDown"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltUp"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltLeft"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltRight"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionDepthFloater"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionDirectionFloater"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionLightingFloater"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionSurfaceFloater"/> + <toolbar:toolbaritem xlink:href=".uno:Extrusion3DColor"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/findbar.xml b/sd/uiconfig/simpress/toolbar/findbar.xml new file mode 100644 index 0000000000..7c71a1ac27 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/findbar.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ExitSearch"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:FindAll"/> + <toolbar:toolbaritem xlink:href=".uno:MatchCase"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchLabel"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/flowchartshapes.xml b/sd/uiconfig/simpress/toolbar/flowchartshapes.xml new file mode 100644 index 0000000000..c1f6768958 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/flowchartshapes.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-process"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-alternate-process"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-decision"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-data"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-predefined-process"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-internal-storage"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-document"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-multidocument"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-terminator"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-preparation"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-input"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-operation"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-connector"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-off-page-connector"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-card"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-punched-tape"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-summing-junction"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-or"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-collate"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sort"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-extract"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-merge"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-stored-data"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-delay"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sequential-access"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-magnetic-disk"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-direct-access-storage"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-display"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml b/sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml new file mode 100644 index 0000000000..948ff1e6f0 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkSameLetterHeights"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontworkAlignmentFloater"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkCharacterSpacingFloater"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/fontworkshapetype.xml b/sd/uiconfig/simpress/toolbar/fontworkshapetype.xml new file mode 100644 index 0000000000..46a83209bd --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/fontworkshapetype.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-plain-text"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-wave"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-inflate"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-stop"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-down"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-down"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-right"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-left"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-down"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-down"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-right"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-left"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-up"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-down"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-curve"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-curve"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-pour"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-pour"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/formcontrols.xml b/sd/uiconfig/simpress/toolbar/formcontrols.xml new file mode 100644 index 0000000000..b79e0e0018 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/formcontrols.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbaritem xlink:href=".uno:SwitchControlDesignMode"/> + <toolbar:toolbaritem xlink:href=".uno:UseWizards"/> + <toolbar:toolbaritem xlink:href=".uno:FormDesignTools"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ControlProperties" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormProperties" toolbar:visible="false"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Label"/> + <toolbar:toolbaritem xlink:href=".uno:Edit"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CheckBox"/> + <toolbar:toolbaritem xlink:href=".uno:RadioButton"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ListBox"/> + <toolbar:toolbaritem xlink:href=".uno:ComboBox"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Pushbutton"/> + <toolbar:toolbaritem xlink:href=".uno:Imagebutton"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FormattedField"/> + <toolbar:toolbaritem xlink:href=".uno:DateField"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:NumericField"/> + <toolbar:toolbaritem xlink:href=".uno:GroupBox"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:TimeField"/> + <toolbar:toolbaritem xlink:href=".uno:CurrencyField"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:PatternField"/> + <toolbar:toolbaritem xlink:href=".uno:Grid"/> + <toolbar:toolbaritem xlink:href=".uno:NavigationBar"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ImageControl"/> + <toolbar:toolbaritem xlink:href=".uno:FileControl"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SpinButton"/> + <toolbar:toolbaritem xlink:href=".uno:ScrollBar"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/formdesign.xml b/sd/uiconfig/simpress/toolbar/formdesign.xml new file mode 100644 index 0000000000..b75fab75f3 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/formdesign.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ControlProperties"/> + <toolbar:toolbaritem xlink:href=".uno:FormProperties"/> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ShowFmExplorer"/> + <toolbar:toolbaritem xlink:href=".uno:TabDialog"/> + <toolbar:toolbaritem xlink:href=".uno:AddField"/> + <toolbar:toolbaritem xlink:href=".uno:AutoControlFocus"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BringToFront" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatGroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatUngroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EnterGroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:LeaveGroup" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:OpenReadOnly"/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/formsfilterbar.xml b/sd/uiconfig/simpress/toolbar/formsfilterbar.xml new file mode 100644 index 0000000000..c7c569501b --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/formsfilterbar.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FormFilterExecute"/> + <toolbar:toolbaritem xlink:href=".uno:FormFilterNavigator"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormFilterExit"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/formsnavigationbar.xml b/sd/uiconfig/simpress/toolbar/formsnavigationbar.xml new file mode 100644 index 0000000000..4ffa664e64 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/formsnavigationbar.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:RecSearch"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:RecText"/> + <toolbar:toolbaritem xlink:href=".uno:AbsoluteRecord"/> + <toolbar:toolbaritem xlink:href=".uno:RecFromText"/> + <toolbar:toolbaritem xlink:href=".uno:RecTotal"/> + <toolbar:toolbaritem xlink:href=".uno:FirstRecord"/> + <toolbar:toolbaritem xlink:href=".uno:PrevRecord"/> + <toolbar:toolbaritem xlink:href=".uno:NextRecord"/> + <toolbar:toolbaritem xlink:href=".uno:LastRecord"/> + <toolbar:toolbaritem xlink:href=".uno:NewRecord"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:RecSave"/> + <toolbar:toolbaritem xlink:href=".uno:RecUndo"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteRecord"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Refresh"/> + <toolbar:toolbaritem xlink:href=".uno:RefreshFormControl"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:OrderCrit"/> + <toolbar:toolbaritem xlink:href=".uno:Sortup"/> + <toolbar:toolbaritem xlink:href=".uno:SortDown"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AutoFilter"/> + <toolbar:toolbaritem xlink:href=".uno:FormFiltered"/> + <toolbar:toolbaritem xlink:href=".uno:FormFilter"/> + <toolbar:toolbaritem xlink:href=".uno:RemoveFilterSort"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ViewFormAsGrid"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/formtextobjectbar.xml b/sd/uiconfig/simpress/toolbar/formtextobjectbar.xml new file mode 100644 index 0000000000..a055cba036 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/formtextobjectbar.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:CharFontName"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontHeight"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Bold"/> + <toolbar:toolbaritem xlink:href=".uno:Italic"/> + <toolbar:toolbaritem xlink:href=".uno:Underline"/> + <toolbar:toolbaritem xlink:href=".uno:SuperScript"/> + <toolbar:toolbaritem xlink:href=".uno:SubScript"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LeftPara"/> + <toolbar:toolbaritem xlink:href=".uno:CenterPara"/> + <toolbar:toolbaritem xlink:href=".uno:RightPara"/> + <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/> + <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SpacePara1"/> + <toolbar:toolbaritem xlink:href=".uno:SpacePara15"/> + <toolbar:toolbaritem xlink:href=".uno:SpacePara2"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontDialog"/> + <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/fullscreenbar.xml b/sd/uiconfig/simpress/toolbar/fullscreenbar.xml new file mode 100644 index 0000000000..9b007728dc --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/fullscreenbar.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:FullScreen"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml b/sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml new file mode 100644 index 0000000000..0183493e9b --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:GlueInsertPoint"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionLeft"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionTop"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionRight"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GluePercent"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignLeft"/> + <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignCenter"/> + <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignRight"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignTop"/> + <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignCenter"/> + <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignBottom"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/graffilterbar.xml b/sd/uiconfig/simpress/toolbar/graffilterbar.xml new file mode 100644 index 0000000000..f820a8112a --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/graffilterbar.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterInvert"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSmooth"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSharpen"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRemoveNoise"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSolarize"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSepia"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPoster"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPopart"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSobel"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRelief"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterMosaic"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/graphicobjectbar.xml b/sd/uiconfig/simpress/toolbar/graphicobjectbar.xml new file mode 100644 index 0000000000..e11ce44175 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/graphicobjectbar.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BringToFront"/> + <toolbar:toolbaritem xlink:href=".uno:Forward"/> + <toolbar:toolbaritem xlink:href=".uno:Backward"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/> + <toolbar:toolbaritem xlink:href=".uno:BehindObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/> + <toolbar:toolbaritem xlink:href=".uno:LineWidth"/> + <toolbar:toolbaritem xlink:href=".uno:XLineColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FillShadow"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GrafMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Crop"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/> + <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/> + <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GrafTransparence"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ColorSettings"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:CustomAnimation" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:AnimationEffects"/> +</toolbar:toolbar> + diff --git a/sd/uiconfig/simpress/toolbar/insertbar.xml b/sd/uiconfig/simpress/toolbar/insertbar.xml new file mode 100644 index 0000000000..1a6c358ec0 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/insertbar.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertPage"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ImportFromFile" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:InsertTable"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/> + <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/> + <toolbar:toolbaritem xlink:href=".uno:InsertMath"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObject" toolbar:visible="false"/> +</toolbar:toolbar> + diff --git a/sd/uiconfig/simpress/toolbar/linesbar.xml b/sd/uiconfig/simpress/toolbar/linesbar.xml new file mode 100644 index 0000000000..5421486782 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/linesbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:BezierFill"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Bezier_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml b/sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml new file mode 100644 index 0000000000..ac5ee8f796 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertMasterPage"/> + <toolbar:toolbaritem xlink:href=".uno:RenameMasterPage" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteMasterPage"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:CloseMasterView"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/mediaobjectbar.xml b/sd/uiconfig/simpress/toolbar/mediaobjectbar.xml new file mode 100644 index 0000000000..6762534839 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/mediaobjectbar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AVMediaToolBox"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml b/sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml new file mode 100644 index 0000000000..a45e9d4e67 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Menubar"/> + <toolbar:toolbaritem xlink:href=".uno:Open"/> + <toolbar:toolbaritem xlink:href=".uno:Save"/> + <toolbar:toolbaritem xlink:href=".uno:Undo"/> + <toolbar:toolbaritem xlink:href=".uno:Redo"/> + <toolbar:toolbaritem xlink:href=".uno:Presentation"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/optimizetablebar.xml b/sd/uiconfig/simpress/toolbar/optimizetablebar.xml new file mode 100644 index 0000000000..e4653187b5 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/optimizetablebar.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SetMinimalColumnWidth"/> + <toolbar:toolbaritem xlink:href=".uno:SetMinimalRowHeight"/> + <toolbar:toolbaritem xlink:href=".uno:SetOptimalColumnWidth"/> + <toolbar:toolbaritem xlink:href=".uno:SetOptimalRowHeight"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeColumns"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeRows"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/optionsbar.xml b/sd/uiconfig/simpress/toolbar/optionsbar.xml new file mode 100644 index 0000000000..b8be8a12f6 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/optionsbar.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ClickChangeRotation"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesVisible"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesUse"/> + <toolbar:toolbaritem xlink:href=".uno:SnapBorder"/> + <toolbar:toolbaritem xlink:href=".uno:SnapFrame"/> + <toolbar:toolbaritem xlink:href=".uno:SnapPoints"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:QuickEdit"/> + <toolbar:toolbaritem xlink:href=".uno:PickThrough"/> + <toolbar:toolbaritem xlink:href=".uno:DoubleClickTextEdit"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SolidCreate"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LeaveAllGroups"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/outlinetoolbar.xml b/sd/uiconfig/simpress/toolbar/outlinetoolbar.xml new file mode 100644 index 0000000000..20b43a2e32 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/outlinetoolbar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:OutlineRight"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineLeft"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineDown"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineUp"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:OutlineFormat"/> + <toolbar:toolbaritem xlink:href=".uno:ColorView"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:OutlineCollapseAll"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineExpandAll"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineCollapse" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineExpand" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/positionbar.xml b/sd/uiconfig/simpress/toolbar/positionbar.xml new file mode 100644 index 0000000000..5f91c67e87 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/positionbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:BringToFront"/> + <toolbar:toolbaritem xlink:href=".uno:Forward"/> + <toolbar:toolbaritem xlink:href=".uno:Backward"/> + <toolbar:toolbaritem xlink:href=".uno:SendToBack"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/> + <toolbar:toolbaritem xlink:href=".uno:BehindObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/rectanglesbar.xml b/sd/uiconfig/simpress/toolbar/rectanglesbar.xml new file mode 100644 index 0000000000..2f03f49f1f --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/rectanglesbar.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Rect"/> + <toolbar:toolbaritem xlink:href=".uno:Square"/> + <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded"/> + <toolbar:toolbaritem xlink:href=".uno:Square_Rounded"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:Rect_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Square_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded_Unfilled"/> + <toolbar:toolbaritem xlink:href=".uno:Square_Rounded_Unfilled"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/singlemode.xml b/sd/uiconfig/simpress/toolbar/singlemode.xml new file mode 100644 index 0000000000..b86a414ca0 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/singlemode.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:AddDirect" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Open"/> + <toolbar:toolbaritem xlink:href=".uno:Save"/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Print"/> + <toolbar:toolbaritem xlink:href=".uno:WebHtml" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Undo"/> + <toolbar:toolbaritem xlink:href=".uno:Redo"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/> + <toolbar:toolbaritem xlink:href=".uno:FormatPaintbrush"/> + <toolbar:toolbaritem xlink:href=".uno:SpellingDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPage"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertSlide"/> + <toolbar:toolbaritem xlink:href=".uno:DuplicateSlide"/> + <toolbar:toolbaritem xlink:href=".uno:RenameSlide" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteSlide"/> + <toolbar:toolbaritem xlink:href=".uno:AssignLayout" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:DisplayMode"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Text"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/> + <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/> + <toolbar:toolbaritem xlink:href=".uno:InsertTable"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Line"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ArrowsToolbox"/> + <toolbar:toolbaritem xlink:href=".uno:LineToolbox"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes"/> + <toolbar:toolbaritem xlink:href=".uno:Objects3DToolbox" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/> + <toolbar:toolbaritem xlink:href=".uno:Mirror" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeSelection"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatGroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FormatUngroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EnterGroup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:LeaveGroup" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SelectObject" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPage" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Zoom" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Presentation"/> + <toolbar:toolbaritem xlink:href=".uno:PresentationCurrentSlide"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml b/sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml new file mode 100644 index 0000000000..15ef811a30 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:RehearseTimings"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ShowSlide"/> + <toolbar:toolbaritem xlink:href=".uno:HideSlide"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:PagesPerRow"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml b/sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml new file mode 100644 index 0000000000..f620b7b041 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Presentation"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/standardbar.xml b/sd/uiconfig/simpress/toolbar/standardbar.xml new file mode 100644 index 0000000000..8a71241da6 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/standardbar.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:OpenUrl" toolbar:visible="false" /> + <toolbar:toolbaritem xlink:href=".uno:AddDirect"/> + <toolbar:toolbaritem xlink:href=".uno:NewDoc" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Open"/> + <toolbar:toolbaritem xlink:href=".uno:OpenRemote" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Save"/> + <toolbar:toolbaritem xlink:href=".uno:SaveAs" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SendMail" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/> + <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Print"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Cut"/> + <toolbar:toolbaritem xlink:href=".uno:Copy"/> + <toolbar:toolbaritem xlink:href=".uno:Paste"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FormatPaintbrush"/> + <toolbar:toolbaritem xlink:href=".uno:SetDefault" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Undo"/> + <toolbar:toolbaritem xlink:href=".uno:Redo"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/> + <toolbar:toolbaritem xlink:href=".uno:SpellDialog"/> + <toolbar:toolbaritem xlink:href=".uno:SpellOnline" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:GridVisible"/> + <toolbar:toolbaritem xlink:href=".uno:GridUse"/> + <toolbar:toolbaritem xlink:href=".uno:HelplinesMove" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:DisplayMode"/> + <toolbar:toolbaritem xlink:href=".uno:ToggleTabBarVisibility" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SlideSetup" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SlideMasterPage"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Presentation"/> + <toolbar:toolbaritem xlink:href=".uno:PresentationCurrentSlide"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertTable"/> + <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/> + <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/> + <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Text"/> + <toolbar:toolbaritem xlink:href=".uno:CharmapControl"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/> + <toolbar:toolbaritem xlink:href=".uno:HyperlinkDialog"/> + <toolbar:toolbaritem xlink:href=".uno:InsertDraw"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:AnimationEffects" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:HelpIndex" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ExtendedHelp" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/starshapes.xml b/sd/uiconfig/simpress/toolbar/starshapes.xml new file mode 100644 index 0000000000..cbc07fc70a --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/starshapes.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star4"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star5"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star6"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star8"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star12"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star24"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.bang"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.vertical-scroll"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.horizontal-scroll"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.signet"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.doorplate"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.concave-star6"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/symbolshapes.xml b/sd/uiconfig/simpress/toolbar/symbolshapes.xml new file mode 100644 index 0000000000..9ba9f22e0c --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/symbolshapes.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.smiley"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.heart"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.sun"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.moon"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.cloud"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.lightning"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.flower"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.forbidden"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.puzzle"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.quad-bevel"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.octagon-bevel"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.diamond-bevel"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.bracket-pair"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-bracket"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-bracket"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.brace-pair"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-brace"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-brace"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/tableobjectbar.xml b/sd/uiconfig/simpress/toolbar/tableobjectbar.xml new file mode 100644 index 0000000000..f2f821273c --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/tableobjectbar.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:InsertTable"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FrameLineColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SetBorderStyle"/> + <toolbar:toolbaritem xlink:href=".uno:FillStyle"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:MergeCells"/> + <toolbar:toolbaritem xlink:href=".uno:SplitCell"/> + <toolbar:toolbaritem xlink:href=".uno:OptimizeTable"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertRowsBefore"/> + <toolbar:toolbaritem xlink:href=".uno:InsertRowsAfter"/> + <toolbar:toolbaritem xlink:href=".uno:InsertColumnsBefore"/> + <toolbar:toolbaritem xlink:href=".uno:InsertColumnsAfter"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteRows"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteColumns"/> + <toolbar:toolbaritem xlink:href=".uno:DeleteTable"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SelectTable" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EntireColumn" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:EntireRow" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:TableDialog"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/textbar.xml b/sd/uiconfig/simpress/toolbar/textbar.xml new file mode 100644 index 0000000000..8121a4eef4 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/textbar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:Text"/> + <toolbar:toolbaritem xlink:href=".uno:TextFitToSizeTool"/> + <toolbar:toolbaritem xlink:href=".uno:DrawCaption"/> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalTextFitToSizeTool"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalCaption"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/toolbar/textobjectbar.xml b/sd/uiconfig/simpress/toolbar/textobjectbar.xml new file mode 100644 index 0000000000..23d269b011 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/textobjectbar.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:CharFontName"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FontHeight"/> + <toolbar:toolbaritem xlink:href=".uno:Grow"/> + <toolbar:toolbaritem xlink:href=".uno:Shrink"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Bold"/> + <toolbar:toolbaritem xlink:href=".uno:Italic"/> + <toolbar:toolbaritem xlink:href=".uno:Underline"/> + <toolbar:toolbaritem xlink:href=".uno:UnderlineDouble" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Strikeout"/> + <toolbar:toolbaritem xlink:href=".uno:Overline" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SuperScript"/> + <toolbar:toolbaritem xlink:href=".uno:SubScript"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Shadowed"/> + <toolbar:toolbaritem xlink:href=".uno:OutlineFont"/> + <toolbar:toolbaritem xlink:href=".uno:SetDefault"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToLower" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToUpper" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SmallCaps" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Color"/> + <toolbar:toolbaritem xlink:href=".uno:CharBackColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LeftPara"/> + <toolbar:toolbaritem xlink:href=".uno:CenterPara"/> + <toolbar:toolbaritem xlink:href=".uno:RightPara"/> + <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/> + <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:DefaultBullet"/> + <toolbar:toolbaritem xlink:href=".uno:DefaultNumbering"/> + <toolbar:toolbaritem xlink:href=".uno:SetOutline" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:IncrementIndent"/> + <toolbar:toolbaritem xlink:href=".uno:DecrementIndent"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineSpacing"/> + <toolbar:toolbaritem xlink:href=".uno:Spacing" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ParaspaceIncrease"/> + <toolbar:toolbaritem xlink:href=".uno:ParaspaceDecrease"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:TextdirectionLeftToRight"/> + <toolbar:toolbaritem xlink:href=".uno:TextdirectionTopToBottom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/> + <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SelectAll" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FontDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/toolbar.xml b/sd/uiconfig/simpress/toolbar/toolbar.xml new file mode 100644 index 0000000000..bc0958c5bf --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/toolbar.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Text" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater" toolbar:visible="false"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:XLineColor"/> + <toolbar:toolbaritem xlink:href=".uno:FillColor"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Line"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowsToolbox"/> + <toolbar:toolbaritem xlink:href=".uno:LineToolbox"/> + <toolbar:toolbaritem xlink:href=".uno:ConnectorToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes"/> + <toolbar:toolbaritem xlink:href=".uno:Objects3DToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:TransformDialog" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/> + <toolbar:toolbaritem xlink:href=".uno:Mirror" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/> + <toolbar:toolbaritem xlink:href=".uno:ObjectPosition"/> + <toolbar:toolbaritem xlink:href=".uno:DistributeSelection"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:FillShadow"/> + <toolbar:toolbaritem xlink:href=".uno:Crop"/> + <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode"/> + <toolbar:toolbaritem xlink:href=".uno:GlueEditMode"/> + <toolbar:toolbaritem xlink:href=".uno:ChangeBezier" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ChangePolygon" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConvertInto3D" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLatheFast" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:InsertToolbox" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Config" toolbar:visible="false"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/viewerbar.xml b/sd/uiconfig/simpress/toolbar/viewerbar.xml new file mode 100644 index 0000000000..4fdfe1d657 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/viewerbar.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SaveAs"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ReadOnlyDoc" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:SendMail"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/> + <toolbar:toolbaritem xlink:href=".uno:ExportDirectToEPUB" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:Print"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Copy"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Zoom"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Presentation"/> +</toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/zoombar.xml b/sd/uiconfig/simpress/toolbar/zoombar.xml new file mode 100644 index 0000000000..6507ec8190 --- /dev/null +++ b/sd/uiconfig/simpress/toolbar/zoombar.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:ZoomPlus"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMinus"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Zoom100Percent"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPrevious" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomNext" toolbar:visible="false"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPage"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPageWidth"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomOptimal"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomObjects"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/> + <toolbar:toolbaritem xlink:href=".uno:ZoomPanning"/> +</toolbar:toolbar> \ No newline at end of file diff --git a/sd/uiconfig/simpress/ui/annotation.ui b/sd/uiconfig/simpress/ui/annotation.ui new file mode 100644 index 0000000000..49a8a300e3 --- /dev/null +++ b/sd/uiconfig/simpress/ui/annotation.ui @@ -0,0 +1,169 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkMenuItem" id=".uno:ReplyToAnnotation"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="annotationmenu|reply">_Reply</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id=".uno:DeleteAnnotation"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="annotationmenu|delete">_Delete Comment</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id=".uno:DeleteAllAnnotationByAuthor"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="annotationmenu|deleteby">Delete All Comments b_y %1</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id=".uno:DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="annotationmenu|deleteall">Delete _All Comments</property> + <property name="use-underline">True</property> + </object> + </child> + </object> + <object class="GtkPopover" id="Annotation"> + <property name="can-focus">False</property> + <property name="position">bottom</property> + <child> + <object class="GtkBox" id="container"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar-policy">never</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkDrawingArea" id="editview"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="meta"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label">label</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="menubutton"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="focus-on-click">False</property> + <property name="label" translatable="no"></property> + <property name="receives-default">True</property> + <property name="valign">start</property> + <property name="margin-end">10</property> + <property name="margin-top">5</property> + <property name="relief">none</property> + <property name="draw-indicator">True</property> + <property name="popup">menu</property> + <child> + <placeholder/> + </child> + <style> + <class name="small-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/annotationtagmenu.ui b/sd/uiconfig/simpress/ui/annotationtagmenu.ui new file mode 100644 index 0000000000..9996b5730e --- /dev/null +++ b/sd/uiconfig/simpress/ui/annotationtagmenu.ui @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id=".uno:ReplyToAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="annotationtagmenu|reply">_Reply</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id=".uno:DeleteAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="annotationtagmenu|delete">_Delete Comment</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id=".uno:DeleteAllAnnotationByAuthor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="annotationtagmenu|deleteby">Delete All Comments b_y %1</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id=".uno:DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="annotationtagmenu|deleteall">Delete _All Comments</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/clientboxfragment.ui b/sd/uiconfig/simpress/ui/clientboxfragment.ui new file mode 100644 index 0000000000..65af34c041 --- /dev/null +++ b/sd/uiconfig/simpress/ui/clientboxfragment.ui @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="ClientboxFragment"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <child> + <object class="GtkButton" id="button"> + <property name="label" translatable="yes" context="clientboxfragment|STR_DEAUTHORISE_CLIENT">Remove Client Authorization</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="name"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="pinlabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="clientboxfragment|STR_ENTER_PIN">Enter PIN:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">pin</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="pin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">start</property> + <property name="max_length">4</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <property name="width_chars">4</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroup1"> + <property name="mode">vertical</property> + <widgets> + <widget name="button"/> + <widget name="name"/> + <widget name="pinlabel"/> + <widget name="pin"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/currentmastermenu.ui b/sd/uiconfig/simpress/ui/currentmastermenu.ui new file mode 100644 index 0000000000..896d8f5726 --- /dev/null +++ b/sd/uiconfig/simpress/ui/currentmastermenu.ui @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkMenuItem" id="applyall"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="currentmastermenu|applyall">_Apply to All Slides</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="applyselect"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="currentmastermenu|applyselect">Apply to _Selected Slides</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="edit"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="currentmastermenu|edit">_Edit Master...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="delete"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="currentmastermenu|delete">D_elete Master</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="large"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="currentmastermenu|large">Show _Large Preview</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="small"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="currentmastermenu|small">Show S_mall Preview</property> + <property name="use-underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customanimationeffecttab.ui b/sd/uiconfig/simpress/ui/customanimationeffecttab.ui new file mode 100644 index 0000000000..2e505ef2d0 --- /dev/null +++ b/sd/uiconfig/simpress/ui/customanimationeffecttab.ui @@ -0,0 +1,439 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">10000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon-name">media-playback-start</property> + </object> + <object class="GtkBox" id="EffectTab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="settings"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="prop_label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="label" translatable="yes" context="customanimationeffecttab|prop_label1">_Direction:</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="placeholder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">18</property> + <child> + <object class="GtkCheckButton" id="smooth_start"> + <property name="label" translatable="yes" context="customanimationeffecttab|smooth_start">Accelerated start</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="smooth_start-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|smooth_start">Enable this option to assign a gradually increasing speed to the start of the effect.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="smooth_end"> + <property name="label" translatable="yes" context="customanimationeffecttab|smooth_end">Decelerated end</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="smooth_end-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|smooth_end">Enable this option to assign a gradually decreasing speed to the end of the effect.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|label3">Settings</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkLabel" id="aeffect_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|aeffect_label">A_fter animation:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">aeffect_list</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="sound_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|sound_label">_Sound:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">sound_list</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="text_animation_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|text_animation_label">_Text animation:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">text_animation_list</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="dim_color_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|dim_color_label">Di_m color:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">dim_color_list</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkComboBoxText" id="sound_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="sound_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|sound_list">Select a sound from the Gallery or select one of the special entries.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="sound_preview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="image">image1</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="sound_preview-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|sound_preview">Plays the selected sound file.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="dim_color_list"> + <property name="label" translatable="no"></property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <child> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="dim_color_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|dim_color_list">Select the dim color.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="text_delay_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|text_delay_label">Delay between characters</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">text_delay</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="text_delay"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment1</property> + <property name="digits">1</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="text_delay-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|text_delay">Specifies the percentage of delay between animations of words or letters.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="aeffect_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="customanimationeffecttab|aeffect_list">Don't dim</item> + <item translatable="yes" context="customanimationeffecttab|aeffect_list">Dim with color</item> + <item translatable="yes" context="customanimationeffecttab|aeffect_list">Hide after animation</item> + <item translatable="yes" context="customanimationeffecttab|aeffect_list">Hide on next animation</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="aeffect_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|aeffect_list">Select a color to be shown after the animation ends, or select another after-effect from the list</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="text_animation_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="customanimationeffecttab|text_animation_list">All at once</item> + <item translatable="yes" context="customanimationeffecttab|text_animation_list">Word by word</item> + <item translatable="yes" context="customanimationeffecttab|text_animation_list">Letter by letter</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="text_animation_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|text_animation_list">Select the animation mode for the text of the current shape</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationeffecttab|label4">Enhancement</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroupLabel"> + <widgets> + <widget name="prop_label1"/> + <widget name="aeffect_label"/> + <widget name="sound_label"/> + <widget name="text_animation_label"/> + <widget name="dim_color_label"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customanimationfragment.ui b/sd/uiconfig/simpress/ui/customanimationfragment.ui new file mode 100644 index 0000000000..a976e5bd72 --- /dev/null +++ b/sd/uiconfig/simpress/ui/customanimationfragment.ui @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">1000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="lower">-10000</property> + <property name="upper">10000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment3"> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment4"> + <property name="upper">1000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|25">Tiny</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|50">Smaller</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|150">Larger</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="400"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|400">Extra Large</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkMenu" id="menu1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckMenuItem" id="90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|90">Quarter Spin</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="180"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|180">Half Spin</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="360"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|360">Full Spin</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="720"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|720">Two Spins</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="clockwise"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|clockwise">Clockwise</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="counterclock"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|counterclock">Counter-clockwise</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkMenu" id="menu2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <object class="GtkMenu" id="menu3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckMenuItem" id="25scale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|25">Tiny</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="50scale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|50">Smaller</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="150scale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|150">Larger</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="400scale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|400">Extra Large</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="hori"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|hori">Horizontal</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="vert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|vert">Vertical</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="both"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|both">Both</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkMenu" id="menu4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckMenuItem" id="bold"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|bold">Bold</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="italic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|italic">Italic</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="underline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationfragment|underline">Underlined</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkBox" id="EffectFragment"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="spacing">3</property> + <child> + <object class="GtkComboBoxText" id="combo"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="color"> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="fontname"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="has_entry">True</property> + <child internal-child="entry"> + <object class="GtkEntry"> + <property name="truncate-multiline">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="fontsize"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="fontsizemenu"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="popup">menu</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="rotate"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment2</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="rotatemenu"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="popup">menu1</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="transparent"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment3</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="transparentmenu"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="popup">menu2</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="scale"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment4</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="scalemenu"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="popup">menu3</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="editable">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="entrymenu"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="popup">menu4</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customanimationproperties.ui b/sd/uiconfig/simpress/ui/customanimationproperties.ui new file mode 100644 index 0000000000..d6191125c6 --- /dev/null +++ b/sd/uiconfig/simpress/ui/customanimationproperties.ui @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="CustomAnimationProperties"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="customanimationproperties|CustomAnimationProperties">Effect Options</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="effect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationproperties|effect">Effect</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="timing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationproperties|timing">Timing</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="textanim"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationproperties|textanim">Text Animation</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customanimationspanel.ui b/sd/uiconfig/simpress/ui/customanimationspanel.ui new file mode 100644 index 0000000000..277736f132 --- /dev/null +++ b/sd/uiconfig/simpress/ui/customanimationspanel.ui @@ -0,0 +1,696 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">100000</property> + <property name="step-increment">0.5</property> + <property name="page-increment">5</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">100000</property> + <property name="step-increment">0.5</property> + <property name="page-increment">5</property> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">sfx2/res/symphony/sidebar-property-small.png</property> + </object> + <object class="GtkImage" id="image_add"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">cmd/sc_add.png</property> + </object> + <object class="GtkImage" id="image_down"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">cmd/sc_movedown.png</property> + </object> + <object class="GtkImage" id="image_play"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">sd/res/playblue_16.png</property> + </object> + <object class="GtkImage" id="image_remove"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">cmd/sc_list_remove.png</property> + </object> + <object class="GtkImage" id="image_up"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">cmd/sc_moveup.png</property> + </object> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkTreeStore" id="liststore2"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + <!-- column-name weight1 --> + <column type="gint"/> + <!-- column-name sensitive1 --> + <column type="gboolean"/> + <!-- column-name extraindent1 --> + <column type="gint"/> + <!-- column-name align1 --> + <column type="gdouble"/> + </columns> + </object> + <object class="GtkBox" id="CustomAnimationsPanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hscrollbar-policy">never</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkBox" id="bxApplied"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkScrolledWindow"> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkTreeView" id="custom_animation_list"> + <property name="width-request">260</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="no-show-all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers-visible">False</property> + <property name="reorderable">True</property> + <property name="search-column">1</property> + <child internal-child="selection"> + <object class="GtkTreeSelection"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <child> + <object class="GtkCellRendererPixbuf" id="cellrendererpixbuf1"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext2"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="custom_animation_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|custom_animation_list">The animation list displays all animations for the current slide.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="custom_animation_label_parent"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkLabel" id="custom_animation_label"> + <property name="width-request">260</property> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label" translatable="yes" context="customanimationspanel|STR_CUSTOMANIMATION_LIST_HELPTEXT">First select the slide element and then click 'Add' to add an animation effect.</property> + <property name="justify">center</property> + <property name="wrap">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hscrollbar-policy">never</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <!-- n-columns=3 n-rows=13 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="row-spacing">3</property> + <property name="column-spacing">6</property> + <child> + <object class="GtkLabel" id="lbEffect"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="customanimationspanel|lbEffect">Effects</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + <property name="width">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">3</property> + <property name="margin-bottom">6</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="add_effect"> + <property name="label" translatable="yes" context="customanimationspanel|add">_Add</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|add_effect|tooltip_text">Add Effect</property> + <property name="image">image_add</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="add_effect-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|add_effect">Adds another animation effect for the selected object on the slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="remove_effect"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|remove_effect|tooltip_text">Remove Effect</property> + <property name="image">image_remove</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="remove_effect-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|remove_effect">Removes the selected animation effects from the animation list.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="move_up"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|move_up|tooltip_text">Move Up</property> + <property name="image">image_up</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="move_up-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|move_up">Click one of the buttons to move the selected animation effect up or down in the list.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="move_down"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|move_down|tooltip_text">Move Down</property> + <property name="image">image_down</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="move_down-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|move_down">Click one of the buttons to move the selected animation effect up or down in the list.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="categorylabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="customanimationspanel|categorylabel">Category:</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="categorylb"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="popup-fixed-width">False</property> + <items> + <item translatable="yes" context="customanimationspanel|categorylb">Entrance</item> + <item translatable="yes" context="customanimationspanel|categorylb">Emphasis</item> + <item translatable="yes" context="customanimationspanel|categorylb">Exit</item> + <item translatable="yes" context="customanimationspanel|categorylb">Motion Paths</item> + <item translatable="yes" context="customanimationspanel|categorylb">Misc Effects</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="categorylb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|categorylb">Select an animation effect category.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="effectlabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="valign">start</property> + <property name="margin-top">3</property> + <property name="label" translatable="yes" context="customanimationspanel|effectlabel">Effect:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">effect_list</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="no-show-all">True</property> + <property name="margin-start">3</property> + <property name="margin-top">3</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <property name="min-content-width">1</property> + <child> + <object class="GtkTreeView" id="effect_list"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="no-show-all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="headers-visible">False</property> + <property name="search-column">0</property> + <property name="show-expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn21"> + <child> + <object class="GtkCellRendererText" id="cellrenderertext22"/> + <attributes> + <attribute name="xalign">5</attribute> + <attribute name="text">0</attribute> + <attribute name="weight">2</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="effect_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|effect_list">Select an animation effect.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="effect_label"> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="label" translatable="yes" context="customanimationspanel|effect_label">Options</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + <property name="width">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="start_effect"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="customanimationspanel|start_effect">_Start:</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="start_effect_list"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="customanimationspanel|start_effect_list">On click</item> + <item translatable="yes" context="customanimationspanel|start_effect_list">With previous</item> + <item translatable="yes" context="customanimationspanel|start_effect_list">After previous</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="start_effect_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|start_effect_list">Displays when the selected animation effect should be started.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="effect_property"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="customanimationspanel|effect_property">_Direction:</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">6</property> + </packing> + </child> + <child> + <object class="GtkButton" id="more_properties"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|more_properties|tooltip_text">Options</property> + <property name="image">image1</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="more_properties-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|more_properties">Specifies additional properties for the selected element in the Custom Animations pane.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">2</property> + <property name="top-attach">6</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="effect_duration"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="customanimationspanel|effect_duration">D_uration:</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">7</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="anim_duration"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment2</property> + <property name="digits">2</property> + <child internal-child="accessible"> + <object class="AtkObject" id="anim_duration-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|anim_duration">Specifies the duration of the selected animation effect.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="delay_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="customanimationspanel|delay_label">_Delay:</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">8</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="delay_value"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + <property name="digits">1</property> + <child internal-child="accessible"> + <object class="AtkObject" id="delay_value-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|delay_value">The animation starts delayed by this amount of time.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">8</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">9</property> + <property name="width">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="auto_preview"> + <property name="label" translatable="yes" context="customanimationspanel|auto_preview">Automatic Preview</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="auto_preview-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|auto_preview">Select to preview new or edited effects on the slide while you assign them.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">10</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="play"> + <property name="label" translatable="yes" context="customanimationspanel|play">Play</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|play|tooltip_text">Preview Effect</property> + <property name="image">image_play</property> + <property name="use-underline">True</property> + <property name="image-position">right</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="play-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|play">Plays the selected animation effect in the preview.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">2</property> + <property name="top-attach">10</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="box1_label"> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="customanimationspanel|box1_label">Animation Deck</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">11</property> + <property name="width">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="custom_animation_list_label"> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="customanimationspanel|custom_animation_list_label">Animation List</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">custom_animation_list</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">12</property> + <property name="width">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="placeholder"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="spacing">6</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">6</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="CustomAnimationsPanel-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|CustomAnimationsPanel">Assigns effects to selected objects.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customanimationtexttab.ui b/sd/uiconfig/simpress/ui/customanimationtexttab.ui new file mode 100644 index 0000000000..443b5861dc --- /dev/null +++ b/sd/uiconfig/simpress/ui/customanimationtexttab.ui @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">999.99</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkBox" id="TextAnimationTab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border_width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkLabel" id="group_text_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="customanimationtexttab|group_text_label">_Group text:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">group_text_list</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="auto_after_value"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">start</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment1</property> + <property name="digits">1</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="auto_after_value-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|auto_after_value">Enter an additional delay in seconds to animate subsequent paragraphs.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="auto_after"> + <property name="label" translatable="yes" context="customanimationtexttab|auto_after">_Automatically after:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="auto_after-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|auto_after">If "Group text - By 1st level paragraphs" is selected, the paragraphs are animated one after the other.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="group_text_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <items> + <item translatable="yes" context="customanimationtexttab|group_text_list">As one object</item> + <item translatable="yes" context="customanimationtexttab|group_text_list">All paragraphs at once</item> + <item translatable="yes" context="customanimationtexttab|group_text_list">By 1st level paragraphs</item> + <item translatable="yes" context="customanimationtexttab|group_text_list">By 2nd level paragraphs</item> + <item translatable="yes" context="customanimationtexttab|group_text_list">By 3rd level paragraphs</item> + <item translatable="yes" context="customanimationtexttab|group_text_list">By 4th level paragraphs</item> + <item translatable="yes" context="customanimationtexttab|group_text_list">By 5th level paragraphs</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="group_text_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|group_text_list">Specifies how multiple paragraphs are animated</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="animate_shape"> + <property name="label" translatable="yes" context="customanimationtexttab|animate_shape">Animate attached _shape</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="animate_shape-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|animate_shape">Deselect this box to animate only the text, not the shape.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="reverse_order"> + <property name="label" translatable="yes" context="customanimationtexttab|reverse_order">_In reverse order</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="reverse_order-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|reverse_order">Animates the paragraphs in reverse order.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customanimationtimingtab.ui b/sd/uiconfig/simpress/ui/customanimationtimingtab.ui new file mode 100644 index 0000000000..a174481802 --- /dev/null +++ b/sd/uiconfig/simpress/ui/customanimationtimingtab.ui @@ -0,0 +1,283 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">100000</property> + <property name="step_increment">0.5</property> + <property name="page_increment">5</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">100000</property> + <property name="step_increment">0.5</property> + <property name="page_increment">5</property> + </object> + <object class="GtkBox" id="TimingTab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border_width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkLabel" id="start_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationtimingtab|start_label">_Start:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">start_list</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="delay_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationtimingtab|delay_label">_Delay:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">delay_value</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="duration_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationtimingtab|duration_label">D_uration:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">anim_duration</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="repeat_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationtimingtab|repeat_label">_Repeat:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">repeat_list</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="start_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="customanimationtimingtab|start_list">On click</item> + <item translatable="yes" context="customanimationtimingtab|start_list">With previous</item> + <item translatable="yes" context="customanimationtimingtab|start_list">After previous</item> + </items> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="delay_value"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment1</property> + <property name="truncate-multiline">True</property> + <property name="digits">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="anim_duration"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes" context="customanimationtimingtab|anim_duration|tooltip_text">Select the speed of the Animation.</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment2</property> + <property name="truncate-multiline">True</property> + <property name="digits">2</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="repeat_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="rewind"> + <property name="label" translatable="yes" context="customanimationtimingtab|rewind">Rewind _when done playing</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationtimingtab|label11">Timing</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkRadioButton" id="rb_click_sequence"> + <property name="label" translatable="yes" context="customanimationtimingtab|rb_click_sequence">_Animate as part of click sequence</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkRadioButton" id="rb_interactive"> + <property name="label" translatable="yes" context="customanimationtimingtab|rb_interactive">Start _effect on click of:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="group">rb_click_sequence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="trigger_list"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="customanimationtimingtab|label11">Trigger</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/customslideshows.ui b/sd/uiconfig/simpress/ui/customslideshows.ui new file mode 100644 index 0000000000..826e03cd8a --- /dev/null +++ b/sd/uiconfig/simpress/ui/customslideshows.ui @@ -0,0 +1,268 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkDialog" id="CustomSlideShows"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="customslideshows|CustomSlideShows">Custom Slide Shows</property> + <property name="modal">True</property> + <property name="default-width">0</property> + <property name="default-height">0</property> + <property name="type-hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can-focus">False</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + <property name="secondary">True</property> + </packing> + </child> + <child> + <object class="GtkButton" id="startshow"> + <property name="label" translatable="yes" context="customslideshows|startshow">_Start</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="startshow-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|startshow">Runs the slide show. Ensure that a custom slide show is selected if you want to run a custom presentation.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="ok-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|ok">Saves all changes and closes dialog.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkTreeView" id="customshowlist"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers-visible">False</property> + <property name="headers-clickable">False</property> + <property name="search-column">0</property> + <property name="show-expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <child> + <object class="GtkCellRendererText" id="cellrenderertext1"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="customshowlist-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|customshowlist">Lists the custom slide shows that are available.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButtonBox" id="buttonboxSlidesEditing"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="layout-style">start</property> + <child> + <object class="GtkButton" id="new"> + <property name="label" translatable="yes" context="stock">_New</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="new-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|new">Add, remove or reorder slides as well as change the name of the selected custom slide show.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="edit"> + <property name="label" translatable="yes" context="stock">_Edit</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="edit-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|edit">Add, remove or reorder slides as well as change the name of the selected custom slide show.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="copy"> + <property name="label" translatable="yes" context="customslideshows|copy">Cop_y</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="copy-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|copy">Creates a copy of the selected custom slide show. You can modify the name of the show by clicking Edit.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="delete"> + <property name="label" translatable="yes" context="stock">_Delete</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="delete-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|delete">Deletes the selected element or elements without requiring confirmation.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-11">help</action-widget> + <action-widget response="101">startshow</action-widget> + <action-widget response="-5">ok</action-widget> + </action-widgets> + <child internal-child="accessible"> + <object class="AtkObject" id="CustomSlideShows-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|CustomSlideShows">Defines a custom slide show using slides within the current presentation. You can then pick slides to meet the needs of your audience. You can create as many custom slide shows as you want.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/definecustomslideshow.ui b/sd/uiconfig/simpress/ui/definecustomslideshow.ui new file mode 100644 index 0000000000..9d8023e4e4 --- /dev/null +++ b/sd/uiconfig/simpress/ui/definecustomslideshow.ui @@ -0,0 +1,358 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkListStore" id="liststore1"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkListStore" id="liststore2"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkDialog" id="DefineCustomSlideShow"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="definecustomslideshow|DefineCustomSlideShow">Define Custom Slide Show</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="definecustomslideshow|label1">_Name:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">customname</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="customname"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="customname-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|customname">Displays the name of the custom slide show. If you want, you can enter a new name.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="definecustomslideshow|label2">_Existing slides:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">pages</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="definecustomslideshow|label3">_Selected slides:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">custompages</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="pages"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <property name="search_column">0</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <child> + <object class="GtkCellRendererText" id="cellrenderertext1"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="pages-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|pages">Lists all of the slides in the order in which they appear in the current document.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="custompages"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <property name="reorderable">True</property> + <property name="search_column">0</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection2"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <child> + <object class="GtkCellRendererText" id="cellrenderertext2"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="custompages-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|custompages">Lists all of the slides in the custom slide show. If you want, you can change the order of the list by dragging the slides up or down.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="add"> + <property name="label" translatable="yes" context="definecustomslideshow|add">>></property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="add-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|add">Adds an existing slide to the bottom of the Selected slides list. You need to select a slide in the Existing slides list before you can use this button.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="remove"> + <property name="label" translatable="yes" context="definecustomslideshow|remove"><<</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="remove-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|remove">Removes a slide from the Selected slides list. You need to choose a slide in the Selected slides list before you can use this button.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="DefineCustomSlideShow-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|DefineCustomSlideShow">Creates a custom slide show.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroup1"> + <widgets> + <widget name="custompages"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/displaywindow.ui b/sd/uiconfig/simpress/ui/displaywindow.ui new file mode 100644 index 0000000000..92a47baf50 --- /dev/null +++ b/sd/uiconfig/simpress/ui/displaywindow.ui @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkPopover" id="DisplayWindow"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="border_width">4</property> + <property name="constrain-to">none</property> + <child> + <object class="GtkBox" id="container"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkFrame" id="editframe"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkScrolledWindow" id="valuesetwin1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <property name="margin-top">6</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="valueset1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="displaywindow|STR_DISPLAYMODE_EDITMODES">Edit Modes</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="masterframe"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkScrolledWindow" id="valuesetwin2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <property name="margin-top">6</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="valueset2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="displaywindow|STR_DISPLAYMODE_MASTERMODES">Master Modes</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/dlgfield.ui b/sd/uiconfig/simpress/ui/dlgfield.ui new file mode 100644 index 0000000000..ead70b3c48 --- /dev/null +++ b/sd/uiconfig/simpress/ui/dlgfield.ui @@ -0,0 +1,268 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="EditFieldsDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="dlgfield|EditFieldsDialog">Edit Field</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkRadioButton" id="fixedRB"> + <property name="label" translatable="yes" context="dlgfield|fixedRB">_Fixed</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="fixedRB-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|fixedRB">Displays the content of the field when the field was inserted.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="varRB"> + <property name="label" translatable="yes" context="dlgfield|varRB">_Variable</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="group">fixedRB</property> + <child internal-child="accessible"> + <object class="AtkObject" id="varRB-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|varRB">Displays the current value of the field.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dlgfield|label1">Field Type</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dlgfield|label2">_Language:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">languageLB</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="languageLB"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + <child internal-child="entry"> + <object class="GtkEntry"> + <property name="can_focus">True</property> + <property name="truncate-multiline">True</property> + <property name="activates_default">True</property> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="languageLB-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|languageLB">Select the language for the field.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkComboBoxText" id="formatLB"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child internal-child="accessible"> + <object class="AtkObject" id="formatLB-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|formatLB">Select a display format for the field.</property> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dlgfield|label3">F_ormat</property> + <property name="use_underline">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="EditFieldsDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|EditFieldsDialog">Edits the properties of an inserted field.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/dockinganimation.ui b/sd/uiconfig/simpress/ui/dockinganimation.ui new file mode 100644 index 0000000000..cd082b9337 --- /dev/null +++ b/sd/uiconfig/simpress/ui/dockinganimation.ui @@ -0,0 +1,657 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">1</property> + <property name="upper">999</property> + <property name="value">1</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">600</property> + <property name="step_increment">10</property> + <property name="page_increment">60</property> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">sd/res/get1obj.png</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">sd/res/getallob.png</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">sd/res/del1bmp.png</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">sd/res/delall.png</property> + </object> + <object class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon-name">go-first</property> + </object> + <object class="GtkImage" id="image6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon-name">media-skip-backward</property> + </object> + <object class="GtkImage" id="image7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon-name">media-playback-stop</property> + </object> + <object class="GtkImage" id="image8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon-name">media-skip-forward</property> + </object> + <object class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon-name">go-last</property> + </object> + <object class="GtkBox" id="DockingAnimation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">24</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">12</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkComboBoxText" id="loopcount"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|loopcount|tooltip_text">Loop Count</property> + <items> + <item>1</item> + <item>2</item> + <item>3</item> + <item>4</item> + <item>5</item> + <item>6</item> + <item>7</item> + <item>8</item> + <item>9</item> + <item>10</item> + <item>12</item> + <item>15</item> + <item>20</item> + <item>25</item> + <item>50</item> + <item>100</item> + <item>500</item> + <item>1000</item> + <item translatable="yes" context="dockinganimation|loopcount">Max.</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="loopcount-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|loopcount">Sets the number of times that the animation is played.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">3</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="duration"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|duration|tooltip_text">Duration</property> + <property name="adjustment">adjustment2</property> + <property name="digits">2</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="duration-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|duration">Enter the number of seconds to display the current image. This option is only available if you select the Bitmap object option in the Animation group field.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="numbitmap"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|numbitmap|tooltip_text">Image Number</property> + <property name="text">1</property> + <property name="adjustment">adjustment1</property> + <property name="value">1</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="numbitmap-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|numbitmap">Indicates the position of the current image in the animation sequence.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="column_spacing">6</property> + <child> + <object class="GtkButton" id="first"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|first|tooltip_text">First Image</property> + <property name="image">image5</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="first-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|first">Jumps to the first image in the animation sequence.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="prev"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|prev|tooltip_text">Backwards</property> + <property name="image">image6</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="prev-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|prev">Plays the animation backwards.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="stop"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|stop|tooltip_text">Stop</property> + <property name="image">image7</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="stop-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|stop">Stops playing the animation.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="next"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|next|tooltip_text">Play</property> + <property name="image">image8</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="next-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|next">Plays the animation.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">3</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="last"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|last|tooltip_text">Last Image</property> + <property name="image">image9</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="last-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|last">Jumps to the last image in the animation sequence.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">4</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkDrawingArea" id="preview"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkRadioButton" id="group"> + <property name="label" translatable="yes" context="dockinganimation|group">Group object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="group-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|group">Assembles images into a single object so that they can be moved as a group. You can still edit individual objects by double-clicking the group in the slide.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="bitmap"> + <property name="label" translatable="yes" context="dockinganimation|bitmap">Bitmap object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="group">group</property> + <child internal-child="accessible"> + <object class="AtkObject" id="bitmap-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|bitmap">Combines images into a single image.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkLabel" id="alignmentft"> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dockinganimation|alignmentft">Alignment</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">alignment</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="alignment"> + <property name="can_focus">False</property> + <items> + <item translatable="yes" context="dockinganimation|alignment">Top Left</item> + <item translatable="yes" context="dockinganimation|alignment">Left</item> + <item translatable="yes" context="dockinganimation|alignment">Bottom Left</item> + <item translatable="yes" context="dockinganimation|alignment">Top</item> + <item translatable="yes" context="dockinganimation|alignment">Centered</item> + <item translatable="yes" context="dockinganimation|alignment">Bottom</item> + <item translatable="yes" context="dockinganimation|alignment">Top Right</item> + <item translatable="yes" context="dockinganimation|alignment">Right</item> + <item translatable="yes" context="dockinganimation|alignment">Bottom Right</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="alignment-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|alignment">Aligns the images in your animation.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dockinganimation|label1">Animation Group</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="column_spacing">24</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="hexpand">True</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkButton" id="getone"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|getone|tooltip_text">Apply Object</property> + <property name="image">image1</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="getone-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|getone">Adds selected object(s) as a single image.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="getall"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|getall|tooltip_text">Apply Objects Individually</property> + <property name="image">image2</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="getall-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|getall">Adds an image for each selected object.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dockinganimation|label3">Number</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="count"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">67</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkButton" id="delone"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|delone|tooltip_text">Delete Current Image</property> + <property name="image">image3</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="delone-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|delone">Deletes current image from the animation sequence.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="delall"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="dockinganimation|delall|tooltip_text">Delete All Images</property> + <property name="image">image4</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="delall-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|delall">Deletes all of the images in the animation.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="dockinganimation|label2">Image</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButtonBox" id="buttonbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + <property name="secondary">True</property> + </packing> + </child> + <child> + <object class="GtkButton" id="create"> + <property name="label" translatable="yes" context="dockinganimation|create">Create</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="create-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|create">Inserts the animation into the current slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="DockingAnimation-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|DockingAnimation">Creates a custom animation on the current slide.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/effectmenu.ui b/sd/uiconfig/simpress/ui/effectmenu.ui new file mode 100644 index 0000000000..9418b18c67 --- /dev/null +++ b/sd/uiconfig/simpress/ui/effectmenu.ui @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="onclick"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="effectmenu|onclick">Start On _Click</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_as_radio">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="withprev"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="effectmenu|withprev">Start _With Previous</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">onclick</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="afterprev"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="effectmenu|afterprev">Start _After Previous</property> + <property name="use_underline">True</property> + <property name="draw_as_radio">True</property> + <property name="group">onclick</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="options"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="effectmenu|options">_Effect Options...</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="timing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="effectmenu|timing">_Timing...</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="remove"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="effectmenu|remove">_Remove</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/fieldmenu.ui b/sd/uiconfig/simpress/ui/fieldmenu.ui new file mode 100644 index 0000000000..5bb702561d --- /dev/null +++ b/sd/uiconfig/simpress/ui/fieldmenu.ui @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/fontsizemenu.ui b/sd/uiconfig/simpress/ui/fontsizemenu.ui new file mode 100644 index 0000000000..334e7c3bd0 --- /dev/null +++ b/sd/uiconfig/simpress/ui/fontsizemenu.ui @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontsizemenu|25">Tiny</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontsizemenu|50">Smaller</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontsizemenu|150">Larger</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="400"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontsizemenu|400">Extra Large</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/fontstylemenu.ui b/sd/uiconfig/simpress/ui/fontstylemenu.ui new file mode 100644 index 0000000000..918b3b4838 --- /dev/null +++ b/sd/uiconfig/simpress/ui/fontstylemenu.ui @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckMenuItem" id="bold"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontstylemenu|bold">Bold</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="italic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontstylemenu|italic">Italic</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="underline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="fontstylemenu|underline">Underlined</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/gluebox.ui b/sd/uiconfig/simpress/ui/gluebox.ui new file mode 100644 index 0000000000..cdbde79025 --- /dev/null +++ b/sd/uiconfig/simpress/ui/gluebox.ui @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="GlueBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkComboBoxText" id="gluetype"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/headerfooterdialog.ui b/sd/uiconfig/simpress/ui/headerfooterdialog.ui new file mode 100644 index 0000000000..528424c983 --- /dev/null +++ b/sd/uiconfig/simpress/ui/headerfooterdialog.ui @@ -0,0 +1,223 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="HeaderFooterDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="headerfooterdialog|HeaderFooterDialog">Header and Footer</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="apply_all"> + <property name="label" translatable="yes" context="headerfooterdialog|apply_all">Appl_y to All</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="apply_all-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfooterdialog|extended_tip|apply_all">Applies the settings to all the slides in your presentation, including the corresponding master slides.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="apply"> + <property name="label" translatable="yes" context="stock">_Apply</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="apply-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfooterdialog|extended_tip|apply">Applies the current settings to the selected slides.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="slides"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="headerfooterdialog|slides">Slides</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="notes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="headerfooterdialog|notes">Notes and Handouts</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">apply_all</action-widget> + <action-widget response="102">apply</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="HeaderFooterDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfooterdialog|extended_tip|HeaderFooterDialog">Adds or changes text in placeholders at the top and the bottom of slides and master slides.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/headerfootertab.ui b/sd/uiconfig/simpress/ui/headerfootertab.ui new file mode 100644 index 0000000000..6e378cd698 --- /dev/null +++ b/sd/uiconfig/simpress/ui/headerfootertab.ui @@ -0,0 +1,519 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="HeaderFooterTab"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkCheckButton" id="header_cb"> + <property name="label" translatable="yes" context="headerfootertab|header_cb">Heade_r</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="margin-top">6</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="header_cb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|header_cb">Adds the text that you enter in the Header text box to the top of the slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="header_box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">24</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="header_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="headerfootertab|header_label">Header _text:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">header_text</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="header_text"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="header_text-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|header_text">Adds the text that you enter to the top of the slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <accessibility> + <relation type="labelled-by" target="header_cb"/> + </accessibility> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="datetime_cb"> + <property name="label" translatable="yes" context="headerfootertab|datetime_cb">_Date and time</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="datetime_cb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|datetime_cb">Adds the date and time to the slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="datetimebox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">24</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkRadioButton" id="rb_fixed"> + <property name="label" translatable="yes" context="headerfootertab|rb_fixed">Fi_xed</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <accessibility> + <relation type="label-for" target="datetime_value"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="rb_fixed-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|rb_fixed">Displays the date and time that you enter in the text box.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="datetime_value"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <accessibility> + <relation type="labelled-by" target="rb_fixed"/> + </accessibility> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="datetime_value-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|datetime_value">Displays the date and time that you enter in the text box.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=2 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkRadioButton" id="rb_auto"> + <property name="label" translatable="yes" context="headerfootertab|rb_auto">_Variable</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">rb_fixed</property> + <accessibility> + <relation type="labelled-by" target="variablebox"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="rb_auto-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|rb_auto">Displays the date and time that the slide was created. Select a date format from the list.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=2 --> + <object class="GtkGrid" id="variablebox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkComboBoxText" id="language_list"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="language_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|language_list">Select the language for the date and time format.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="language_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="headerfootertab|language_label">_Language:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">language_list</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="datetime_format_list"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="datetime_format_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|datetime_format_list">Displays the date and time that the slide was created. Select a date format from the list.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="language_label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="headerfootertab|language_label1">_Format:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">datetime_format_list</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <accessibility> + <relation type="labelled-by" target="rb_auto"/> + </accessibility> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <accessibility> + <relation type="labelled-by" target="datetime_cb"/> + </accessibility> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkCheckButton" id="footer_cb"> + <property name="label" translatable="yes" context="headerfootertab|footer_cb">_Footer</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="footer_cb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|footer_cb">Adds the text that you enter in the Footer text box to the bottom of the slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="footer_box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">24</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="footer_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="headerfootertab|footer_label">F_ooter text:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">footer_text</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="footer_text"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="footer_text-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|footer_text">Adds the text that you enter to the bottom of the slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <accessibility> + <relation type="labelled-by" target="footer_cb"/> + </accessibility> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="slide_number"> + <property name="label" translatable="yes" context="headerfootertab|slide_number">_Slide number</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="slide_number-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|slide_number">Adds the slide number or the page number.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="include_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="headerfootertab|include_label">Include on Slide</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="not_on_title"> + <property name="label" translatable="yes" context="headerfootertab|not_on_title">Do _not show on the first slide</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="margin-start">12</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="not_on_title-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|not_on_title">Does not display your specified information on the first slide of your presentation.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="replacement_a"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label" translatable="yes" context="headerfootertab|replacement_a">_Page Number</property> + <property name="use-underline">True</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="replacement_b"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label" translatable="yes" context="headerfootertab|replacement_b">Include on page</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkDrawingArea" id="preview"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">center</property> + <property name="valign">start</property> + <property name="margin-top">24</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroupLabel"> + <widgets> + <widget name="header_label"/> + <widget name="rb_fixed"/> + <widget name="rb_auto"/> + <widget name="language_label"/> + <widget name="language_label1"/> + <widget name="footer_label"/> + </widgets> + </object> + <object class="GtkSizeGroup" id="sizegroupWidget1"> + <widgets> + <widget name="header_text"/> + <widget name="datetime_value"/> + <widget name="language_list"/> + <widget name="datetime_format_list"/> + <widget name="footer_text"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/impressprinteroptions.ui b/sd/uiconfig/simpress/ui/impressprinteroptions.ui new file mode 100644 index 0000000000..2519c4c0a3 --- /dev/null +++ b/sd/uiconfig/simpress/ui/impressprinteroptions.ui @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="document"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=3 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="impressprinteroptions|label2">Type:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">impressdocument</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="impressprinteroptions|label7">Slides per page:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">slidesperpage</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="impressprinteroptions|label1">Order:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">slidesperpageorder</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="impressdocument"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="impressdocument-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|impressdocument">Select which parts of the document should be printed.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="slidesperpage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="slidesperpage-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|slidesperpage">Select how many slides to print per page.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="slidesperpageorder"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="slidesperpageorder-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|slideperpageorder">Specify how to arrange slides on the printed page.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="impressprinteroptions|label3">Document</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="contents"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkCheckButton" id="printname"> + <property name="label" translatable="yes" context="impressprinteroptions|printname">Slide name</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="printname-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|printname">Specifies whether to print the page name of a document.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="printdatetime"> + <property name="label" translatable="yes" context="impressprinteroptions|printdatetime">Date and time</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="printdatetime-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|printdatetime">Specifies whether to print the current date and time.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="printhidden"> + <property name="label" translatable="yes" context="impressprinteroptions|printhidden">Hidden pages</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="printhidden-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|printhidden">Specifies whether to print the pages that are currently hidden.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="impressprinteroptions|label4">Contents</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="color"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkRadioButton" id="originalcolors"> + <property name="label" translatable="yes" context="impressprinteroptions|originalcolors">Original colors</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="originalcolors-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|originalcolors">Specifies to print in original colors.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="grayscale"> + <property name="label" translatable="yes" context="impressprinteroptions|grayscale">Grayscale</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalcolors</property> + <child internal-child="accessible"> + <object class="AtkObject" id="grayscale-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|grayscale">Specifies to print colors as grayscale.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="blackandwhite"> + <property name="label" translatable="yes" context="impressprinteroptions|blackandwhite">Black & white</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalcolors</property> + <child internal-child="accessible"> + <object class="AtkObject" id="blackandwhite-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|blackandwhite">Specifies to print colors as black and white.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="impressprinteroptions|label5">Color</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="pagesizes"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkRadioButton" id="originalsize"> + <property name="label" translatable="yes" context="impressprinteroptions|originalsize">Original size</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="originalsize-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|originalsize">Specifies that you do not want to further scale pages when printing.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="fittoprintable"> + <property name="label" translatable="yes" context="impressprinteroptions|fittoprintable">Fit to printable page</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalsize</property> + <child internal-child="accessible"> + <object class="AtkObject" id="fittoprintable-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|fittoprintable">Specifies whether to scale down objects that are beyond the margins of the current printer so they fit on the paper in the printer.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="distributeonmultiple"> + <property name="label" translatable="yes" context="impressprinteroptions|distributeonmultiple">Distribute on multiple sheets of paper</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalsize</property> + <child internal-child="accessible"> + <object class="AtkObject" id="distributeonmultiple-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|distributeonmultiple">Prints a large format document, such as a poster or banner, by distributing the document page across multiple sheets of paper. The distribution option calculates how many sheets of paper are needed. You can then piece together the sheets.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="tilesheet"> + <property name="label" translatable="yes" context="impressprinteroptions|tilesheet">Tile sheet of paper with repeated slides</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">originalsize</property> + <child internal-child="accessible"> + <object class="AtkObject" id="tilesheet-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|tilesheet">Specifies that slides are to be printed in tiled format. If the slides are smaller than the paper, the slide will be repeated multiple times on one sheet of paper.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="impressprinteroptions|label6">Size</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/insertslides.ui b/sd/uiconfig/simpress/ui/insertslides.ui new file mode 100644 index 0000000000..6a7b7844ec --- /dev/null +++ b/sd/uiconfig/simpress/ui/insertslides.ui @@ -0,0 +1,156 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.4 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="InsertSlidesDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="insertslides|InsertSlidesDialog">Insert Slides</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="action"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkRadioButton" id="before"> + <property name="label" translatable="yes" context="insertslides|before">_Before</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="hexpand">True</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="after"> + <property name="label" translatable="yes" context="insertslides|after">A_fter</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="hexpand">True</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="group">before</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="insertslides|label1">Position</property> + <property name="justify">center</property> + <property name="yalign">0.5</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child> + <placeholder/> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/interactiondialog.ui b/sd/uiconfig/simpress/ui/interactiondialog.ui new file mode 100644 index 0000000000..0214891c17 --- /dev/null +++ b/sd/uiconfig/simpress/ui/interactiondialog.ui @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="InteractionDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="interactiondialog|InteractionDialog">Interaction</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/interactionpage.ui b/sd/uiconfig/simpress/ui/interactionpage.ui new file mode 100644 index 0000000000..ef6fd0b656 --- /dev/null +++ b/sd/uiconfig/simpress/ui/interactionpage.ui @@ -0,0 +1,485 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkTreeStore" id="liststore2"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkTreeStore" id="liststore3"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="InteractionPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="row_spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="interactionpage|label2">Action at mouse click:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">listbox</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="listbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="listbox-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|listbox">Specifies the action that will run when you click the selected object during a slide show.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fttree"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="interactionpage|fttree">Target:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">box3</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkScrolledWindow"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="tree"> + <property name="width_request">-1</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="search_column">1</property> + <property name="enable_tree_lines">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext2"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="tree-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|tree">Lists the slides and the objects that you can target.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="treedoc"> + <property name="width_request">-1</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="headers_visible">False</property> + <property name="search_column">1</property> + <property name="enable_tree_lines">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection11"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn21"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext44"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext22"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="treedoc-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|treedoc">Opens and displays a file during a slide show. If you select an ODF file as the target document, you can also specify the page that will open.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="oleaction"> + <property name="width_request">-1</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore3</property> + <property name="headers_visible">False</property> + <property name="search_column">1</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection111"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn211"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext222"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="interactionpage|label1">Interaction</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="browse"> + <property name="label" translatable="yes" context="interactionpage|browse">_Browse...</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="browse-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|browse">Locate the file you want to open.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="find"> + <property name="label" translatable="yes" context="interactionpage|find">_Find</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="no_show_all">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="find-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|find">Searches for the specified slide or object.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkEntry" id="sound"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="sound-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="interactionpage|sound-atkobject">Path Name</property> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|sound">Enter a path to the audio file you want to open, or click Browse to locate the file.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="bookmark"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="bookmark-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|bookmark">Enter the name of the slide or the object that you want to look for.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="document"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="document-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|document">Enter a path to the file you want to open, or click Browse to locate the file.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="program"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="program-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|program">Enter a path to the program you want to start, or click Browse to locate the program.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="macro"> + <property name="can_focus">True</property> + <property name="no_show_all">True</property> + <property name="hexpand">True</property> + <property name="activates_default">True</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="macro-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|macro">Enter a path to the macro you want to run, or click Browse to locate the macro.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="InteractionPage-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|InteractionPage">Defines how the selected object behaves when you click on it during a slide show.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroup1"> + <property name="mode">both</property> + <widgets> + <widget name="tree"/> + <widget name="treedoc"/> + <widget name="oleaction"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/layoutmenu.ui b/sd/uiconfig/simpress/ui/layoutmenu.ui new file mode 100644 index 0000000000..9993ca5689 --- /dev/null +++ b/sd/uiconfig/simpress/ui/layoutmenu.ui @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="apply"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="layoutmenu|apply">Apply to _Selected Slides</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="layoutmenu|insert">_Insert Slide</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/layoutpanel.ui b/sd/uiconfig/simpress/ui/layoutpanel.ui new file mode 100644 index 0000000000..5eb7122dae --- /dev/null +++ b/sd/uiconfig/simpress/ui/layoutpanel.ui @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="LayoutPanel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkDrawingArea" id="layoutvalueset"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/layoutwindow.ui b/sd/uiconfig/simpress/ui/layoutwindow.ui new file mode 100644 index 0000000000..aeee9e046e --- /dev/null +++ b/sd/uiconfig/simpress/ui/layoutwindow.ui @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">missing-image</property> + </object> + <object class="GtkPopover" id="LayoutWindow"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="border-width">4</property> + <property name="constrain-to">none</property> + <child> + <object class="GtkBox" id="container"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkFrame" id="horiframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkScrolledWindow" id="valuesetwin1"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar-policy">never</property> + <property name="vscrollbar-policy">never</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkDrawingArea" id="valueset1"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="layoutwindow|label5">Horizontal</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="vertframe"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkScrolledWindow" id="valuesetwin2"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar-policy">never</property> + <property name="vscrollbar-policy">never</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkDrawingArea" id="valueset2"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="layoutwindow|label6">Vertical</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="more"> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="no-show-all">True</property> + <property name="image">image1</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/masterlayoutdlg.ui b/sd/uiconfig/simpress/ui/masterlayoutdlg.ui new file mode 100644 index 0000000000..12b6010137 --- /dev/null +++ b/sd/uiconfig/simpress/ui/masterlayoutdlg.ui @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="MasterLayoutDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="masterlayoutdlg|MasterLayoutDialog">Master Elements</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="PlaceholdersFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkCheckButton" id="header"> + <property name="label" translatable="yes" context="masterlayoutdlg|header">_Header</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="header-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|header">Adds a header placeholder to the master slide for notes.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="datetime"> + <property name="label" translatable="yes" context="masterlayoutdlg|datetime">_Date/time</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="datetime-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|datetime">Adds a date/time placeholder to the master slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="footer"> + <property name="label" translatable="yes" context="masterlayoutdlg|footer">_Footer</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="footer-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|footer">Adds a footer placeholder to the master slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="pagenumber"> + <property name="label" translatable="yes" context="masterlayoutdlg|pagenumber">_Page number</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="pagenumber-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|pagenumber">Adds a slide number placeholder to the master slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="slidenumber"> + <property name="label" translatable="yes" context="masterlayoutdlg|slidenumber">_Slide number</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="no_show_all">True</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="Placeholders"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="masterlayoutdlg|Placeholders">Placeholders</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="MasterLayoutDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|MasterLayoutDialog">Adds or removes header, footer, date, and slide number placeholders to the layout of the master slide.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/mastermenu.ui b/sd/uiconfig/simpress/ui/mastermenu.ui new file mode 100644 index 0000000000..61a0a10ae8 --- /dev/null +++ b/sd/uiconfig/simpress/ui/mastermenu.ui @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="applyall"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastermenu|applyall">_Apply to All Slides</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="applyselect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastermenu|applyselect">Apply to _Selected Slides</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="large"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastermenu|large">Show _Large Preview</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="small"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="mastermenu|small">Show S_mall Preview</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/masterpagemenu.ui b/sd/uiconfig/simpress/ui/masterpagemenu.ui new file mode 100644 index 0000000000..5bb702561d --- /dev/null +++ b/sd/uiconfig/simpress/ui/masterpagemenu.ui @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/masterpagepanel.ui b/sd/uiconfig/simpress/ui/masterpagepanel.ui new file mode 100644 index 0000000000..429032ed21 --- /dev/null +++ b/sd/uiconfig/simpress/ui/masterpagepanel.ui @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="MasterPagePanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkDrawingArea" id="usedvalueset"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/masterpagepanelall.ui b/sd/uiconfig/simpress/ui/masterpagepanelall.ui new file mode 100644 index 0000000000..979d06990e --- /dev/null +++ b/sd/uiconfig/simpress/ui/masterpagepanelall.ui @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="MasterPagePanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkDrawingArea" id="allvalueset"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui b/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui new file mode 100644 index 0000000000..4ec8487cfc --- /dev/null +++ b/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="MasterPagePanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkDrawingArea" id="recentvalueset"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/navigatorpanel.ui b/sd/uiconfig/simpress/ui/navigatorpanel.ui new file mode 100644 index 0000000000..329a4f7c75 --- /dev/null +++ b/sd/uiconfig/simpress/ui/navigatorpanel.ui @@ -0,0 +1,314 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="dragmodemenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanelSTR_DRAGTYPE_URL">Insert as Hyperlink</property> + <property name="draw-as-radio">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_DRAGTYPE_LINK">Insert as Link</property> + <property name="draw-as-radio">True</property> + <property name="group">1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_DRAGTYPE_EMBEDDED">Insert as Copy</property> + <property name="draw-as-radio">True</property> + <property name="group">1</property> + </object> + </child> + </object> + <object class="GtkTreeStore" id="liststore2"> + <columns> + <!-- column-name expander --> + <column type="GdkPixbuf"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NavigatorPanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <child> + <!-- n-columns=1 n-rows=3 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">3</property> + <property name="column-spacing">6</property> + <child> + <object class="GtkComboBoxText" id="documents"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|documents|tooltip_text">Document</property> + <child internal-child="accessible"> + <object class="AtkObject" id="documents-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="navigatorpanel|documents-atkobject">Active Window</property> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|documents">Lists currently open documents.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkTreeView" id="tree"> + <property name="width-request">-1</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="headers-visible">False</property> + <property name="reorderable">True</property> + <property name="search-column">1</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection11"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn21"> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext44"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText" id="cellrenderertext22"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="tree-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="navigatorpanel|STR_OBJECTS_TREE">Page Tree</property> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|tree">Lists available slides. Double-click a slide to make it the active slide.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkToolbar" id="toolbox"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="toolbar-style">icons</property> + <property name="icon_size">2</property> + <child> + <object class="GtkToolButton" id="first"> + <property name="visible">True</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|first|tooltip_text">First Slide</property> + <property name="icon-name">sd/res/nv03.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="first-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|first">Jumps to the first page.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="previous"> + <property name="visible">True</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|previous|tooltip_text">Previous Slide</property> + <property name="icon-name">sd/res/nv04.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="previous-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|previous">Moves back one page.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="next"> + <property name="visible">True</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|next|tooltip_text">Next Slide</property> + <property name="icon-name">sd/res/nv05.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="next-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|next">Move forward one page.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="last"> + <property name="visible">True</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|last|tooltip_text">Last Slide</property> + <property name="icon-name">sd/res/nv06.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="last-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|last">Jumps to the last page.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkSeparatorToolItem" id="separator"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="dragmode"> + <property name="visible">True</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|dragmode|tooltip_text">Drag Mode</property> + <property name="icon-name">sd/res/nv09.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="dragmode-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|dragmode">Drag and drop slides and named objects into the active slide.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="shapes"> + <property name="visible">True</property> + <property name="tooltip-text" translatable="yes" context="navigatorpanel|shapes|tooltip_text">Show Shapes</property> + <property name="icon-name">sd/res/graphic.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="shapes-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|shapes">In the submenu you can choose to display a list of all shapes or only the named shapes. Use drag-and-drop in the list to reorder the shapes. When you set the focus to a slide and press the Tab key, the next shape in the defined order is selected.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="NavigatorPanel-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|NavigatorPanel">Opens the Navigator, where you can quickly jump to other slides or move between open files.</property> + </object> + </child> + </object> + <object class="GtkMenu" id="shapemenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="named"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_NAVIGATOR_SHOW_NAMED_SHAPES">Named shapes</property> + <property name="use-underline">True</property> + <property name="draw-as-radio">True</property> + <property name="group">all</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="all"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_NAVIGATOR_SHOW_ALL_SHAPES">All shapes</property> + <property name="use-underline">True</property> + <property name="draw-as-radio">True</property> + <property name="group">named</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="fronttoback"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_NAVIGATOR_FRONT_TO_BACK">Front to back</property> + <property name="use-underline">True</property> + <property name="draw-as-radio">True</property> + <property name="group">backtofront</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="backtofront"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="navigatorpanel|STR_NAVIGATOR_BACK_TO_FRONT">Back to front</property> + <property name="use-underline">True</property> + <property name="draw-as-radio">True</property> + <property name="group">fronttoback</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar.ui b/sd/uiconfig/simpress/ui/notebookbar.ui new file mode 100644 index 0000000000..18530c457d --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar.ui @@ -0,0 +1,19833 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ --> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Convert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuConvert-ChangeBezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ChangePolygon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-convert_to_contour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertInto3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertInto3DLatheFast"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertIntoBitmap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuConvert-ConvertIntoMetaFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorVert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorVert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorHorz"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorHorz</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Dismantle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Substract"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Intersect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Connect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Break"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CopyObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CopyObjects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Morphing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Morphing</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangeBezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangePolygon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-convert_to_contour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldVar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldVar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuField-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertAuthorField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAuthorField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideTitleField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlidesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertFileField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFileField</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuFile-AddDirect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-RecentFileList"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CloseDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Save"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAs"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAsRemote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveACopy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveACopy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-NewGlobalDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewGlobalDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportTo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportToPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMail"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendViaBluetooth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendViaBluetooth</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-WebHtml"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrintDefault"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrinterSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Signature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SignPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Quit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuForm-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Label</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Edit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CheckBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RadioButton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ListBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ListBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ComboBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ComboBox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Imagebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormattedField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-DateField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DateField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-TimeField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TimeField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NumericField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NumericField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CurrencyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-PatternField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PatternField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ImageControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageControl</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FileControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FileControl</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grid</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Help"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHelp-HelpIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtendedHelp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Documentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Documentation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:QuestionAnswers</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SendFeedback"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendFeedback</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SafeMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SafeMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-GetInvolved"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GetInvolved</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Donation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Donation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ShowLicense"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowLicense</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-About"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHome-Shadowed"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-OutlineFont"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-Overline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToUpper"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToLower"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseRotateCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToSentenceCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToTitleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToToggleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertNonBreakingSpace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertHardHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertSoftHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertZWSP"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertWJ"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertLRM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertRLM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuHome-ParaLeftToRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuHome-ParaRightToLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-SelectAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageCrop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ExternalEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ChangePicture"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-CompressGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-SaveGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-OriginalSize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OriginalSize</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator139"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-AnimationEffects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-AnimationObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-TwainSelect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertQrCode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMath"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPageField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPagesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-AnimationEffects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuObject-ChainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChainFrames</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-UnhainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnhainFrames</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuObject-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-FrameDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FrameDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Reference"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFootnoteDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-AddressBookSource"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddressBookSource</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAll</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-Repaginate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repaginate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateFields"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateFields</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllIndexes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCurIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCharts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCharts</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-CalculateSel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalculateSel</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Slide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ModifyPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SlideSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationLayout</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-HideSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-RenameSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SummaryPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ExpandPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Slide Show"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Presentation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-RehearseTimings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-CustomShowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-Remote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Remote</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-SlideChangeWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideChangeWindow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-CustomAnimation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuSlideShow-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuSlideShow-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-PresentationDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTable-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertRowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeRows"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeColumns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-Protect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Protect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnsetCellsReadOnly</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeadingRowsRepeat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-RowSplit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RowSplit</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTextToTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTableToText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTableToText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableSort"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-MergeTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MergeTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableNumberRecognition</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroRecorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroRecorder</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-RunMacro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroSignature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroSignature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-DevTools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DevelopmentToolsDockingWindow</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BmpMask"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BmpMask</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewDataSourceBrowser</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenXMLFilterSettings</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutlineMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NotesMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NotesMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-DiaMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DiaMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-SlideMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NotesMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-HandoutMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneImpress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneImpress</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + </object> + <object class="GtkImage" id="RecentFilesImg1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_recentfilelist.png</property> + </object> + <object class="GtkImage" id="changebezierImg"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_changebezier.png</property> + </object> + <object class="GtkImage" id="paragraphstylei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_insertfieldctrl.png</property> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarTabControl" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-PriorityHBox" id="File Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="File-Section-New"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkMenuToolButton" id="File-AddDirect"> + <property name="visible">True</property> + <property name="action_name">.uno:AddDirect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-New1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-NewDoc1"> + <property name="visible">True</property> + <property name="action_name">.uno:NewDoc</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SaveAsTemplate1"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAsTemplate</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Open"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Open1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="File-RecentFileList1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="action_name">.uno:RecentFileList</property> + <property name="image">RecentFilesImg1</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-OpenRemote1"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenRemote</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Save"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Save1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SaveAs1"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAs</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SaveAsRemote1"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAsRemote</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Export"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-ExportTo"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportTo</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Export1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-ExportDirectToPDF1"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SendMail"> + <property name="visible">True</property> + <property name="action_name">.uno:SendMail</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-Print"> + <property name="visible">True</property> + <property name="action_name">.uno:Print</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Print1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-PrintDefault1"> + <property name="visible">True</property> + <property name="action_name">.uno:PrintDefault</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-WebHtml"> + <property name="visible">True</property> + <property name="action_name">.uno:WebHtml</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Property"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="File-SetDocumentProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDocumentProperties</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="File-Section-Property1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-Signature1"> + <property name="visible">True</property> + <property name="action_name">.uno:Signature</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="File-SignPDF1"> + <property name="visible">True</property> + <property name="action_name">.uno:SignPDF</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="File-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="File-CloseDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="File-HelpIndex"> + <property name="visible">True</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-end">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File"> + <property name="label" translatable="yes" context="impressnotebookbar|FileLabel">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="File-HelpButton:Menu Help"> + <property name="label" translatable="yes" context="impressnotebookbar|HelpMenuButton">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin-start">5</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="FileLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|FileLabel">~File</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Home Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Home-Section-Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkMenuToolButton" id="Home-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Cut"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Copy"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Slide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator107"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DuplicatePage"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-DeletePage"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-AssignLayout"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Style"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SetDefault"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="font"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <child> + <object class="GtkToolButton" id="Home-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="fontheight"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <child> + <object class="GtkToolButton" id="Home-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Grow"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Shrink"> + <property name="visible">True</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Strikeout"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Shadowed"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-Spacing"> + <property name="visible">True</property> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-LeftPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CenterPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-RightPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Paragraph2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-JustifyPara1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-LineSpacing1"> + <property name="visible">True</property> + <property name="halign">end</property> + <property name="action_name">.uno:LineSpacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Paragraph3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-OutlineRight"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-OutlineLeft"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ParaspaceIncrease"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaspaceDecrease"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Home-Text"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawSection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-DrawSection2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="GroupB93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FillColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FillColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Slideshow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Home-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="PasteBox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home"> + <property name="label" translatable="yes" context="impressnotebookbar|HomeMenuButton">_Home</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Home-SearchDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Findbar"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="HomeLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|HomeLabel">~Home</property> + <property name="use_underline">True</property> + <style> + <class name="context-default"/> + <class name="context-any"/> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + </style> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Insert Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Insert-Section-Slide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Slide1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB22"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DuplicatePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-ImportFromFile"> + <property name="visible">True</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InserTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObject"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-Gallery"> + <property name="visible">True</property> + <property name="action_name">.uno:Gallery</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertAVMedia1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Hyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Hyperlink1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-CapturePoint"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field"> + <property name="label" translatable="yes" context="impressnotebookbar|FieldMenuButton">Fiel_d</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:FieldMenu</property> + <property name="image">paragraphstylei</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-Text"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-Line1"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-Polygon_Unfilled1"> + <property name="visible">True</property> + <property name="action_name">.uno:Polygon_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-Bezier_Unfilled1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bezier_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-ArrowsToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-BasicShapes.rectangle1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-BasicShapes.ellipse1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-DrawCaption1"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-LineToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkToolButton" id="Insert-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Inser-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Inser-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkToolButton" id="Inser-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Inser-CalloutShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Inser-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Symbol"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-CharmapControl"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Symbol1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Insert-InsertMath"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMath</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Insert-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert"> + <property name="label" translatable="yes" context="impressnotebookbar|InsertMenuButton">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Insert-InsertGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-Text1"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-InsertPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="InsertLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|InsertLabel">~Insert</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Layout Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Slide-Section-PageFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Slide-PageSetup"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Slide-HeaderAndFooter"> + <property name="visible">True</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-PageFormat1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-SelectBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-SaveBackground"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Slide-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-InsertSlide1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-DuplicatePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-DeletePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-ShowPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Slide-RenamePage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-ShowPage1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-HideSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:HideSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-ShowSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-Navigation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-MovePageUp"> + <property name="visible">True</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-MovePageDown"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-MasterSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Slide-PresentationLayout"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-MasterSlide1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA26"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Slide-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slide-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Slide-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Layout-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Slide-SlideButton:Menu Slide"> + <property name="label" translatable="yes" context="impressnotebookbar|SlideMenuButton">_Layout</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Slide-AssignLayout"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="LayoutLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|LayoutLabel">~Layout</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Slide Show Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Slide Show"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Slideshow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="SlideShow-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Slideshow1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="SlideShow-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Slideshow2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-RehearseTimings"> + <property name="visible">True</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-CustomShowDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="SlideShow-PresentationDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Page1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-SlideChangeWindow"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideChangeWindow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-CustomAnimation"> + <property name="visible">True</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Minimize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="SlideShow-PresentationMinimizer"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Slideshow-Section-Minimize1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-OutputQualityColor"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Slideshow-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="SlideShow-SlideShowButton:Menu Slide Show"> + <property name="label" translatable="yes" context="impressnotebookbar|SlideShowMenuButton">_Slide Show</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="SlideShowMenu-Presentation"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="SlideShowLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|ReferencesLabel">~Slide Show</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Review Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Review-Section-Language"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Review-ThesaurusDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Language1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-SpellOnline"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-Hyphenation"> + <property name="visible">True</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-InsertAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-NextAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:NextAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-PreviousAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:PreviousAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAnnotions"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteAllAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Annotation3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-ShowAnnotations"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowAnnotations</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-RedactDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-RedactDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Review-EditDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:EditDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Reference-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review"> + <property name="label" translatable="yes" context="impressnotebookbar|ReviewMenuButton">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Review-AcceptTrackedChanges"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">5</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ReviewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|ReviewLabel">~Review</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">5</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="View Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="View-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-View1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-DiaMode"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-View2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMode"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineMode"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-SlideMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Master1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-HandoutMode"> + <property name="visible">True</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPrevious"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA22"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomNext"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomNext</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPageWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPageWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-Sidebar"> + <property name="visible">True</property> + <property name="action_name">.uno:Sidebar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ShowRuler"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Menubar"> + <property name="visible">True</property> + <property name="action_name">.uno:Menubar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Home-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-HelplinesVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-HelplinesMove"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB30"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA30"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-GlueInsertPoint"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueInsertPoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB31"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-DisplayQuality"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-OutputQualityColor"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-DisplayQuality1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutputQualityBlackWhite"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityBlackWhite</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-New"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-NewWindow"> + <property name="visible">True</property> + <property name="action_name">.uno:NewWindow</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="View-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="ViewMenu2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View"> + <property name="label" translatable="yes" context="impressnotebookbar|ViewMenuButton">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="View-Zoom"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator126"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">6</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ViewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|ViewLabel">~View</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">6</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Table Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-AnimationEffects"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Layout1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-SetBorderStyle"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-MergeCells"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-SplitCell"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-SelectTable"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Select1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Optimize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Optimize1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertCenter"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Style"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Table-TableDesign"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TableDesign</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Table-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table"> + <property name="label" translatable="yes" context="impressnotebookbar|TableMenuButton">_Table</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">7</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="TableLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|TableLabel">~Table</property> + <property name="use_underline">True</property> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="position">7</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Image Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Image-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Image-AnimationEffects"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Edit1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="SecondGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-CompressGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Crop1"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-ChangePicture"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-SaveGraphic"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle1"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle4"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-ConvertButton:Menu Convert"> + <property name="label" translatable="yes" context="impressnotebookbar|ConvertMenuButton">Convert</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:ChangeBezier</property> + <property name="image">changebezierImg</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ObjectAlign2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatImageFilter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="GraphicFilterToolboxGroup"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafLuminance"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafLuminance</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafContrast"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafContrast</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafTransparence"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafGamma"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafGamma</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-GrafMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB103"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ColorSettings"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Image-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image"> + <property name="label" translatable="yes" context="impressnotebookbar|GraphicMenuButton">Ima_ge</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Image-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">8</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ImageLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|ImageLabel">Ima~ge</property> + <property name="use_underline">True</property> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Draw Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Draw-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-AnimationEffects"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle2"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle1"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-ConvertButton:Menu Convert"> + <property name="label" translatable="yes" context="impressnotebookbar|ConvertMenuButton">Convert</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:ChangeBezier</property> + <property name="image">changebezierImg</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-ObjectAlign2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AlignUp1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignMiddle1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-AlignDown1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Bezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Bezier1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="BezierGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierConvert"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierConvert</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierClose"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierClose</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierSymmetric"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierSymmetric</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierEliminatePoints"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierEliminatePoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Bezier2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="BezierGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierMove"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierMove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierInsert"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierInsert</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierDelete"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierDelete</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BezierCutLine"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierCutLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierEdge"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierEdge</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-BezierSmooth"> + <property name="visible">True</property> + <property name="action_name">.uno:BezierSmooth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-GluePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-GlueEditMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-MergeCombine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Merge"> + <property name="visible">True</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Substract"> + <property name="visible">True</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Intersect"> + <property name="visible">True</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Group1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first38"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second39"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionSurfaceFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Fontwork1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkShapeType"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkShapeType</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkSameLetterHeights</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkAlignmentFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkCharacterSpacingFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Draw-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw"> + <property name="label" translatable="yes" context="impressnotebookbar|DrawMenuButton">_Draw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">9</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="DrawLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|DrawLabel">~Draw</property> + <property name="use_underline">True</property> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-3DObject"/> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="position">9</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Object Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Object-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Object-AnimationEffects"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-XLineStyle5"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectLineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineEndStyle5"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-XLineColor4"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Object-ConvertButton:Menu Convert"> + <property name="label" translatable="yes" context="impressnotebookbar|ConvertMenuButton">Convert</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:ChangeBezier</property> + <property name="image">changebezierImg</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Object-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object"> + <property name="label" translatable="yes" context="impressnotebookbar|ObjectMenuButton">_Object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ObjectLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|ObjectLabel">~Object</property> + <property name="use_underline">True</property> + <style> + <class name="context-Frame"/> + <class name="context-OLE"/> + </style> + </object> + <packing> + <property name="position">10</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Media Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Media-NameGroup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:NameGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectAlign1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138"> + <property name="width_request">148</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Media-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="media:Menu Media"> + <property name="label" translatable="yes" context="impressnotebookbar|MediaMenuButton">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-FormatLine"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-TransformDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">11</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MediaLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|MediaLabel">~Media</property> + <property name="use_underline">True</property> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="position">11</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Form Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Form-SwitchControlDesignMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly1"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties2"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus2"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label1"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit1"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton2"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField2"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField2"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField2"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField1"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField1"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Form-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="Form-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form"> + <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="FormMenu-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="FormLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="ImpressNotebookbar|FormLabel">Fo~rm</property> + <property name="use_underline">True</property> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Master Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-NormalMultiPaneGUI1"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-DiaMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-SlideMasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Master1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-HandoutMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPage-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Insert1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-MasterLayouts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPage-MasterLayouts1"> + <property name="visible">True</property> + <property name="action_name">.uno:MasterLayouts</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-ShowHide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-HideSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:HideSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-ShowSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Property"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPageMenu-PageSetup1"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-Background"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-SelectBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-SaveBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MasterPage-Section-CloseMasterView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="MasterPage-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="MasterPage-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="MasterPage-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master"> + <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">_Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="MasterPageMenu-PageSetup"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MasterLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="ImpressNotebookbar|MasterLabel">~Master</property> + <property name="use_underline">True</property> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="position">13</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Outline Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Outline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="View-Section-View3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-NormalMultiPaneGUI2"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-View4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-DiaMode2"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-View5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMode2"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineMode2"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Master2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-SlideMasterPage2"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Master3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMasterPage2"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-HandoutMode2"> + <property name="visible">True</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-OutlineFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Outline-OutlineFormat"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineFormat</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Outline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA24"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineRight"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB24"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Outline1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineUp"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineDown"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-ColorView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-ColorView"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineCollapseAll"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineCollapseAll</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineExpandAll"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineExpandAll</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineCollapse"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineCollapse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing21"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineExpand"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineExpand</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-New1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="View-NewWindow1"> + <property name="visible">True</property> + <property name="action_name">.uno:NewWindow</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Outline-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="View2-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="View2-OutlineButton:Menu View"> + <property name="label" translatable="yes" context="ImpressNotebookbar|FormMenuButton">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="OutlineMenu-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">14</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="OutlineLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="ImpressNotebookbar|View2Label">~Outline</property> + <property name="use_underline">True</property> + <style> + <class name="context-OutlineText"/> + </style> + </object> + <packing> + <property name="position">14</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="3d Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="3dObject-AnimationEffects"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatLine4"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea4"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-XLineStyle5"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectLineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineEndStyle5"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-XLineColor4"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Windows3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Big5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Draw-Window3D1"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Window3D</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="box27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="AlignGroup5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Second4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="3dObject-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="3dObject-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="3dObject-FormButton:Menu 3d"> + <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">3_d</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Draw-FormatArea5"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FormatLine5"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-TransformDialog1"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="3DObjectLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|FormLabel">3~d</property> + <property name="use_underline">True</property> + <style> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Extension Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Extension"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Extension-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="Extension-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons"> + <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">E_xtension</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">16</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ExtensionLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|ExtensionLabel">E~xtension</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">16</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Tools Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-RunMacro"> + <property name="visible">True</property> + <property name="action_name">.uno:RunMacro</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB26"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-MacroDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:MacroDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-PresentationMinimizer"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Presentation1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-BmpMask"> + <property name="visible">True</property> + <property name="action_name">.uno:BmpMask</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator141"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both</property> + <property name="show_arrow">False</property> + <property name="icon_size">3</property> + <child> + <object class="GtkToolButton" id="Tools-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="GroupB85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-UseWizards1"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-GroupBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton1"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField1"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField1"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField1"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ControlProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Tools-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="ViewMenu3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools"> + <property name="label" translatable="yes" context="impressnotebookbar|ToolsMenuButton">_Tools</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom149"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Tools-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">16</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="DevLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="impressnotebookbar|DevLabel">~Tools</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">16</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <object class="GtkSizeGroup" id="1stRow"> + <property name="mode">vertical</property> + <property name="ignore_hidden">True</property> + <widgets> + <widget name="LineA7"/> + <widget name="box76"/> + <widget name="GroupB16"/> + <widget name="GroupB95"/> + </widgets> + </object> + <object class="GtkSizeGroup" id="2ndRow"> + <property name="mode">vertical</property> + <property name="ignore_hidden">True</property> + <widgets> + <widget name="LineB8"/> + <widget name="GroupB11"/> + <widget name="GroupB15"/> + <widget name="GroupB97"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar_compact.ui b/sd/uiconfig/simpress/ui/notebookbar_compact.ui new file mode 100644 index 0000000000..63b167880c --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar_compact.ui @@ -0,0 +1,20214 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ --> + <object class="GtkMenu" id="Menu 3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltDown</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltRight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Window3D</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorVert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorVert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-MirrorHorz"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MirrorHorz</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Dismantle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Substract"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Intersect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Connect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Break"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CopyObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CopyObjects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Morphing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Morphing</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangeBezier"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ChangePolygon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-convert_to_contour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertDateFieldVar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldFix</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertTimeFieldVar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuField-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertAuthorField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAuthorField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideTitleField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertSlidesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuField-InsertFileField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFileField</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuFile-AddDirect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Open"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Open</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-OpenRemote"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-RecentFileList"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CloseDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-AutoPilotMenu"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoPilotMenu</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-OpenTemplate"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenTemplate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAsTemplate"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsTemplate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-NewDoc"> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Reload"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Reload</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-VersionDialog"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VersionDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Save"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAs"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAsRemote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveACopy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveACopy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveAll"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CheckOut"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckOut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CancelCheckOut"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CancelCheckOut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-CheckIn"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckIn</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportTo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportToPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-ExportDirectToPDF"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMail"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-WebHtml"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrintDefault"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-PrinterSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Signature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SignPDF"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuFile-Separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Quit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuForm-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Label</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Edit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CheckBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RadioButton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ListBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ListBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ComboBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ComboBox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Imagebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormattedField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-DateField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DateField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-TimeField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TimeField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NumericField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NumericField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CurrencyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-PatternField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PatternField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ImageControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageControl</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FileControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FileControl</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grid</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Help"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHelp-HelpIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtendedHelp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Documentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Documentation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:QuestionAnswers</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SendFeedback"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendFeedback</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-SafeMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SafeMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-GetInvolved"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GetInvolved</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-Donation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Donation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-ShowLicense"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowLicense</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHelp-About"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuHome-Shadowed"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-OutlineFont"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-Overline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToUpper"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToLower"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseRotateCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToSentenceCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToTitleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ChangeCaseToToggleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertNonBreakingSpace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertHardHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertSoftHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertZWSP"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertWJ"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertLRM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-InsertRLM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuHome-ParaLeftToRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuHome-ParaRightToLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-SelectAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuHome-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuHome-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageCrop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ExternalEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ChangePicture"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-CompressGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-SaveGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-OriginalSize"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OriginalSize</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuImage-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuImage-AnimationEffects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-AnimationObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-TwainSelect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertQrCode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMath"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPageField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPagesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-RenameSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationLayout</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-HideSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SummaryPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ExpandPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ModifyPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SlideSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-RenameObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-EditHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-RemoveHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RemoveHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-OpenHyperlinkOnCursor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenHyperlinkOnCursor</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuObject-ChainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChainFrames</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-UnhainFrames"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnhainFrames</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuObject-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuObject-FrameDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FrameDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Reference"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFootnoteDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-AddressBookSource"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddressBookSource</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReference-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAll</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-Repaginate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repaginate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateFields"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateFields</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllIndexes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCurIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateAllLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-UpdateCharts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UpdateCharts</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReference-CalculateSel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalculateSel</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Slide Show"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Presentation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-RehearseTimings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-CustomShowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-Remote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Remote</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-SlideChangeWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideChangeWindow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-CustomAnimation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuSlideShow-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuSlideShow-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlideShow-PresentationDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTable-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertRowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalRowHeight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeRows"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetOptimalColumnWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-DistributeColumns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-Protect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Protect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:UnsetCellsReadOnly</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeadingRowsRepeat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-RowSplit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RowSplit</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTextToTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ConvertTableToText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTableToText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableSort"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-MergeTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MergeTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableNumberRecognition</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuText-Shadowed"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-OutlineFont"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-Overline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToUpper"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToLower"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseRotateCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToSentenceCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToTitleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ChangeCaseToToggleCase"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertNonBreakingSpace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertHardHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertSoftHyphen"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertZWSP"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertWJ"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertLRM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-InsertRLM"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuText-ParaLeftToRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuText-ParaRightToLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-OutlineBullet"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineBullet</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuText-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuText-TextAttributes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextAttributes</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTools-RunMacro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroRecorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroRecorder</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-MacroSignature"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroSignature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-BmpMask"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BmpMask</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewDataSourceBrowser</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenXMLFilterSettings</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTools-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTools-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PageMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-MasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneImpress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneImpress</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-HelplinesUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom50Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom50Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom75Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom75Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom150Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom150Percent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom200Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom200Percent</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPrevious"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomNext"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomNext</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomObjects</property> + </object> + </child> + </object> + <object class="GtkImage" id="paragraphstylei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_insertfieldctrl.png</property> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarTabControl" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-PriorityHBox" id="File Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="NewSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Files-New"> + <property name="visible">True</property> + <property name="action_name">.uno:AddDirect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="NewDocSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-NewDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:NewDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OpenSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Files-Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OpenRemoteSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-OpenRemote"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenRemote</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SaveSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Files-Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SaveAsSection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-SaveAs"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveAs</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="ExportToSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-ExportTo"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportTo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="ExportToPDFSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-ExportDirectToPDF"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SendMailSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-SendMail"> + <property name="visible">True</property> + <property name="action_name">.uno:SendMail</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="PrintSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-Print"> + <property name="visible">True</property> + <property name="action_name">.uno:Print</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="PrintDefaultSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Files-PrintDefault"> + <property name="visible">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="PrinterSetupSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PrinterSetup"> + <property name="visible">False</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PrinterSetup</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SetDocumentPropertiesSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExportGroup3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Files-SetDocumentProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="File-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CloseDoc"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FileMenuButton">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="FileLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FileLabel">~File</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Home Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Home"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Home-Section-Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Cut"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Copy"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-26"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-26"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Page1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DuplicatePage"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-AssignLayout"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-25"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ResetAttributes"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-CharFontName"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-24"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Grow"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Shrink"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Strikeout"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Shadowed"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-Spacing"> + <property name="visible">True</property> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-FontDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-OutlineRight"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-OutlineLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom157"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom158"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom159"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Home-LineSpacing2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineSpacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaspaceIncrease"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-ParaspaceDecrease"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-ParagraphDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertGraphic"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-InsertAVMedia"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertObjectChart"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Slideshow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom160"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Slideshow1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <placeholder/> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Home-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-SearchDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|HomeMenuButton">_Home</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="HomeLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|HomeLabel">~Home</property> + <property name="use_underline">True</property> + <style> + <class name="context-default"/> + <class name="context-any"/> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + </style> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Insert Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Insert-Section-Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Duplicate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom151"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DuplicatePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Insert-InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Chart"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-OLE"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertObject"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom152"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-Gallery"> + <property name="visible">True</property> + <property name="action_name">.uno:Gallery</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom153"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertAVMedia"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Hyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom156"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Field"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FieldMenuButton">Fiel_d</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:FieldMenu</property> + <property name="image">paragraphstylei</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-DrawText1"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-VerticalText1"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-CalloutShapes"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Insert-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-SectionSymbol"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-CharmapControl"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Insert-Section-Formula"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertMath"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMath</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Insert-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Insert-InsertSlide1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|InsertMenuButton">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="InsertLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|InsertLabel">~Insert</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Layout Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Layout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Layout-Section-PageLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-PageSetup"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Page-HeaderAndFooter"> + <property name="visible">True</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-Background"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-SelectBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-Background1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-SaveBackground1"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-DeletePage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-DeletePage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-HideSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:HideSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ShowSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-MovePage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="Page-MovePageUp"> + <property name="visible">True</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-MovePage1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkToolButton" id="Page-MovePageDown1"> + <property name="visible">True</property> + <property name="halign">start</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-PresentationLayout"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-SelectGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator129"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom183"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Layout-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-SelectGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom195"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Layout-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Layout-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator104"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Page-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Layout-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Layout-AssignLayout"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Layout-PageButton:Menu Layout"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutMenuButton">Layout</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="LayoutLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutLabel">~Layout</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Review Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Review-Section-Language"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-SpellOnline"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-ThesaurusDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom155"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-Hyphenation"> + <property name="visible">True</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-InsertAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-InsertAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-PreviousAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-PreviousAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:PreviousAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-NextAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-NextAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:NextAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-DeleteAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-DeleteAllAnnotation"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:DeleteAllAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-ShowAnnotations"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-ShowAnnotations"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowAnnotations</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Review-Section-Redact"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator130"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom220"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-RedactDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Review-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Review-AcceptTrackedChanges"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ReviewMenuButton">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ReviewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ReviewLabel">~Review</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Slide Show Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Slide Show"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SlideShow-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-PresentationDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-PresentationDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PresentationDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-RehearseTimings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-RehearseTimings"> + <property name="visible">True</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-CustomShowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-CustomShowDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-PresentationDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-PresentationDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-SlideChangeWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-SlideChangeWindow"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideChangeWindow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-CustomAnimation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-CustomAnimation"> + <property name="visible">True</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="belowspacing4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="SlideShow-PresentationMinimizer"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-OutputQualityColor"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SlideShow-Section-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShow-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="SlideShow-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideShowMenu-Presentation"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="SlideShow-SlideShowButton:Menu Slide Show"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutMenuButton">_Slide Show</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="SlideShowLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutLabel">~Slide Show</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="View Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="View-Sections-Views"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Views1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom207"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-DiaMode"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Views2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom208"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMode"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Views3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom209"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-OutlineMode"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-SlideMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Master1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-Master2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-HandoutMode"> + <property name="visible">True</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Navigator"> + <property name="visible">True</property> + <property name="action_name">.uno:Navigator</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Rulers"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Visible2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom199"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Bars"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator141"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Menubar"> + <property name="visible">True</property> + <property name="action_name">.uno:Menubar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Bars1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom200"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Sidebar"> + <property name="visible">True</property> + <property name="action_name">.uno:Sidebar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Bars2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom201"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomOptimal1"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomOptimal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom202"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Zoom100Percent1"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom203"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-ZoomPanning"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPanning</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Sections-NewWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NewWindow"> + <property name="visible">True</property> + <property name="action_name">.uno:NewWindow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="View-Section-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom198"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-EditDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:EditDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="View-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-Zoom"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ViewMenuButton">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ViewLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ViewLabel">~View</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Table Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetDefaul"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoForma"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tabl-AutoFormat"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SetBorderStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BorderDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharFontName1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontHeight1"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Grow1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Shrink1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Bold1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Italic1"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Underline1"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Strikeout1"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed1"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Color1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing1"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-OutlineRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-OutlineLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParagraphDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tabl-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator54"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-StyleApply1"> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-MergeCells1"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SplitCell1"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-AutoFormat"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:AutoFormat</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Column"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom162"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">30</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Row"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">31</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-TableDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">32</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom163"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharmapControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">33</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Table-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|TableMenuButton">T_able</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator170"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">7</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="TableLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|TableLabel">~Table</property> + <property name="use_underline">True</property> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="position">7</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Image Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkBox" id="GraphicPasteBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom186"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom187"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder1"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom164"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-StyleApply3"> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Crop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-SaveReplace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ChangePicture"> + <property name="visible">True</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SaveGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom165"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ColorSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom166"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ColorSettings"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom167"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-GrafTransparence"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Transformations"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator134"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom222"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphi-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Image-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ImageMenuButton">Image</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator187"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="GraphicLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ImageLabel">Ima~ge</property> + <property name="use_underline">True</property> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Draw Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkBox" id="MultiObject-Section-PasteBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom188"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom189"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom168"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom169"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom170"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Merge"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Substract"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Intersect"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Transformations1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Mirror"> + <property name="visible">True</property> + <property name="action_name">.uno:Mirror</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Transformations3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator133"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom221"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Shear"> + <property name="visible">True</property> + <property name="action_name">.uno:Shear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-InteractiveTransparence"> + <property name="visible">True</property> + <property name="action_name">.uno:InteractiveTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-InteractiveGradient"> + <property name="visible">True</property> + <property name="action_name">.uno:InteractiveGradient</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Transformations2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator126"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ConvertInto3DLathe"> + <property name="visible">True</property> + <property name="action_name">.uno:ConvertInto3DLathe</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CrookRotate"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookRotate</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CrookSlant"> + <property name="visible">True</property> + <property name="action_name">.uno:CrookSlant</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-EditPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-3D1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">30</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-3D2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionSurfaceFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">31</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">32</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Fontwork1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkShapeType"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkShapeType</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkSameLetterHeights</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">33</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Fontwork2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkAlignmentFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkCharacterSpacingFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">34</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Draw-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|DrawMenuButton">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">9</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="DrawLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ShapeLabel">~Draw</property> + <property name="use_underline">True</property> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="position">9</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Object Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Object-Section-Advanced"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom190"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Frame-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom191"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Frame-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Frame-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Objec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-XLineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine3"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom175"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator94"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom176"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-StyleApply"> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Object-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ObjectMenuButton">Object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="FrameLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FrameLabel">~Object</property> + <property name="use_underline">True</property> + <style> + <class name="context-Frame"/> + <class name="context-OLE"/> + </style> + </object> + <packing> + <property name="position">10</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Media Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Advanced"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom192"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom193"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom139"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom171"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom172"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder4"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom173"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-StyleApply3"> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="width_request">167</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom174"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-TransformDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Media-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="media:Menu Media"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|MediaButton">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">11</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MediaLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|MediaLabel">~Media</property> + <property name="use_underline">True</property> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="position">11</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Form Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="For-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight4"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-Forward3"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-Backward3"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack3"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator106"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder5"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ControlProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Properties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-TabDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-OpenReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-AutoControlFocus"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-LabelCheckbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label1"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit1"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-LabelCheckbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton1"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Buttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Pushbutton1"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Imagebutton1"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Farmatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField1"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField1"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Farmatted1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField1"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField1"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField1"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-GroupBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator103"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-GroupBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Controls"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator107"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ImageControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-FileControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-GridNavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Grid1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-NavigationBar1"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Form-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="form:Menu Form"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FormButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="FormLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FormLabel">Fo~rm</property> + <property name="use_underline">True</property> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Master Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Master-Sections-Views"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NormalMultiPaneGUI1"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Sections-Master"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom161"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-SlideMasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Sections-Master1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom177"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-NotesMasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Sections-Master2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom182"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="View-HandoutMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator110"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Rename"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Dialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageSetup"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SlideSetup</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SelectBackground"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SaveBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SaveBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-ViewMenu"> + <property name="visible">True</property> + <property name="action_name">.uno:ViewMenu</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-MasterLayouts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-MasterLayouts"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:MasterLayouts</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageMode"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PageMode</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Close"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="MasterPage-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MasterPage-PageSetup"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|PrintPreviewButton">_Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator117"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="MasterPageLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FormLabel">~Master</property> + <property name="use_underline">True</property> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="position">13</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="3d Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Window3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom194"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3D-Window3D"> + <property name="visible">True</property> + <property name="action_name">.uno:Window3D</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator120"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator121"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator122"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom180"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder3"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom181"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-StyleApply3"> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="3d-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom149"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-TransformDialog"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FormButton">3_d</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator124"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="3DLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|FormLabel">3~d</property> + <property name="use_underline">True</property> + <style> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Extension Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Extension"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Extension-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkBox" id="Extension-Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ExtensionMenu-ExtensionDialog"> + <property name="visible">True</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ExtensionMenuButton">E_xtension</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator105"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ExtensionLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ExtensionLabel">E~xtension</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityHBox" id="Tools Tab"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom178"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RunMacro"> + <property name="visible">True</property> + <property name="action_name">.uno:RunMacro</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-BasicIDEAppear"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Macro1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom204"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-MacroDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:MacroDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom179"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-PresentationMinimizer"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-BmpMask"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom196"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-BmpMask"> + <property name="visible">True</property> + <property name="action_name">.uno:BmpMask</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom197"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-DesignMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator125"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom205"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Wizard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom206"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator138"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom210"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom211"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Buttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom212"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom213"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom214"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-GroupBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom215"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-Controls"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator131"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom216"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-GridNavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator152"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom217"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-TabDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom218"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ShowFmExplore"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form-ReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator158"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom219"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Tools-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom184"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools"> + <property name="label" translatable="yes" context="notebookbar_impress_compact|ToolsMenuButton">_Tools</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="ToolLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_impress_compact|DevLabel">~Tools</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="position">15</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui new file mode 100644 index 0000000000..d2f71a8cb9 --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui @@ -0,0 +1,14157 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <object class="GtkMenu" id="Menu 3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltDown</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltRight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="Menu3D-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu3D-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Window3D</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="WrapOffD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapOff</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapOnD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapOn</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapIdealD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapIdeal</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapRight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapThroughD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapThrough</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapThroughTransparentD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapThroughTransparent</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapContourD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapContour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WrapAnchorOnlyD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapAnchorOnly</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="TextWrapD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextWrap</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator132"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetObjectToForegroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetObjectToForeground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetObjectToBackgroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetObjectToBackground</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Calculate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="TableSortD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AutoSumD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoSum</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-Line"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Line</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-DrawCaption"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-VerticalCaption"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalCaption</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConnectorToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-SymbolShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ArrowShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CalloutShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-StarShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StarShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Objects3DToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AddTextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddTextBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-InsertGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Text_Marquee"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text_Marquee</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuEdit-Repeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repeat</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Cut"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Cut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Copy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Copy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Paste"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Paste</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PasteUnformatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PasteUnformatted</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PasteSpecial"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PasteSpecial</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-CopyObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CopyObjects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-SelectAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-EditHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ModifyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ManageLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ManageLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ObjectMenue"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMenue</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-GlueEditMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PageSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Edit Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="DrawEdit-SelectObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FlipVertical"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FlipHorizontal"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FormatLine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatLine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FormatArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatArea</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-TextAttributes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextAttributes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FontWork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontWork</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="AddDirectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RecentFileListD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseDocD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveAsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveAsRemoteD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-SaveACopy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveACopy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NewGlobalDocD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewGlobalDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExportToD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExportToPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMailD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMailDocAsPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendViaBluetoothD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendViaBluetooth</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-WebHtml"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrintD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrintDefaultD"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrinterSetupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SignatureD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SignPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetDocumentPropertiesD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="QuitD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuFontwork-FontworkSameLetterHeights"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkSameLetterHeights</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuForm-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Label</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Edit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CheckBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CheckBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RadioButton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ListBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ListBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ComboBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ComboBox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Imagebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormattedField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-DateField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DateField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-TimeField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TimeField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NumericField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NumericField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-CurrencyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-PatternField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PatternField</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-ImageControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageControl</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-FileControl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FileControl</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuForm-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grid</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuForm-NavigationBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Format"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GrowD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShrinkD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShadowedD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OutlineFontD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OverlineD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SuperScript2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubScriptD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SubScript</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToUpperD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToLowerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseRotateCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToSentenceCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToTitleCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToToggleCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertNonBreakingSpaceD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertHardHyphenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertSoftHyphenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertZWSPD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertWJD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertLRMD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRLMD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRLMD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuGrid-Ruler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Ruler</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-VRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuGrid-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-ViewBounds"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewBounds</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-ShowGraphics"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowGraphics</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuGrid-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-HelplinesMove"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuGrid-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuGrid-HideWhitespace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideWhitespace</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GroupBoxD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GroupBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NameGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectTitleDescriptionD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FormatGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FormatUngroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatUngroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EnterGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="LeaveGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezierD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CombineD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DismantleD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConnectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BreakD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MergeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubstractD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="IntersectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeWidthD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeHeightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GroupBoxD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="CropD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExternalEditD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePictureD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CompressGraphicD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveGraphicD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectMirrorVerticalD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMirrorVertical</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectMirrorHorizontalD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMirrorHorizontal</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezier1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ImageMapDialogD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AnimationEffectsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectTitleDescription1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuInsert-Gallery"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-TwainSelect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-AnimationObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertQrCode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMath"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPageField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertPagesField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuInsert-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuInsert-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Master Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Media"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-NameGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Object"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="ObjectMenue"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMenue</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertCaptionDialog3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertCaptionDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezierD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator156"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CombineD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DismantleD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConnectD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BreakD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MergeD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubstractD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="IntersectD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeWidthD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeHeightD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator164"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DistributeSelection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="ParaLeftToRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="ParaRightToLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParaspaceIncreaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParaspaceDecreaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara1D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara15D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara15</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara2D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara2</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParagraphDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-RedactDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Rows Columns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowsBeforeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowsAfterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnsBeforeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnsAfterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteRowsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteColumnsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EntireRowD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EntireRow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EntireColumnD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SelectTableD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectTable</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu Settings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSettings-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + <property name="label" translatable="yes" context="impress_notebookbar_groupedbar_compact|MenubarAction">Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-ToolbarModeUI"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToolbarModeUI</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-AvailableToolbars"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AvailableToolbars</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-OptionsTreeDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-Extensions"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-RunMacro"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-ScriptOrganizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSettings-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-HelpIndex"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSettings-About"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="Menu View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutlineMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NotesMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NotesMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-DiaMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DiaMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-SlideMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NotesMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-HandoutMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-NewWindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewWindow</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + <property name="label" translatable="yes" context="impress_notebookbar_groupedbar_compact|MenubarView">Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneImpress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneImpress</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapBorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPageWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPageWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GraphicFilterSepiaD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSepia</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSobelD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSobel</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterInvertD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterInvert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterMosaicD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterMosaic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterPopart"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterPopart</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterPosterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterPoster</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterReliefD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterRelief</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterRemoveNoiseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterRemoveNoise</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSharpenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSharpen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSmoothD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSmooth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSolarizeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSolarize</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GrafModeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GrafMode</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSlide-Presentation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Presentation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-RehearseTimings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-CustomShowDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-Remote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Remote</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationLayout</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-SummaryPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ExpandPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-ShowSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-HideSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSlide-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSlide-PresentationMinimizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSnap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuSnap-CapturePoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GlueInsertPoint"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GlueInsertPoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GridFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridFront</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesMove"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesFront"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesFront</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-GridUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-HelplinesUse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-SnapFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-SnapPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-SnapBorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuSnap-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuSnap-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityHBox" id="Toolbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <property name="margin-end">5</property> + <child> + <object class="sfxlo-DropdownBox" id="File"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <child> + <object class="GtkBox" id="Section"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="File-Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="File-Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="File-ExportToPDF"> + <property name="visible">True</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="File-File:Menu File"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|fileb">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Clipboard"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Edit-Paste"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Edit-Undo"> + <property name="visible">True</property> + <property name="action_name">.uno:Undo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Edit-Redo"> + <property name="visible">True</property> + <property name="action_name">.uno:Redo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Edit-Edit:Menu Edit"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|editb">_Edit</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-ContextVBox" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Default"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Default-Section-Slide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-AssignLayout"> + <property name="visible">True</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Slide:MenuSlide"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">S_lide</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-DrawText"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-Draw-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-Draw-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-Draw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Draw:Menu Draw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|draw">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-BasicShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SymbolShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ArrowShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-StarShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-CalloutShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-FlowChartShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-ConnectorToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Default-Objects3DToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB18"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Insert:Menu Insert"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertAnnotation"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Review:Menu Review"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-DiaMode"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SlideMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-View:Menu View"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewT">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Extension"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-PackageManagerDialog"> + <property name="visible">True</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ExtensionMenuButton">E_xtension</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <style> + <class name="context-Default"/> + <class name="context-DrawPage"/> + <class name="context-TextObject"/> + <class name="context-SlidesorterPage"/> + <class name="context-OutlineText"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Text"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Text-Slide-Slide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-AssignLayout"> + <property name="visible">True</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-Slide:MenuSlide"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">S_lide</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Font"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">5</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Section-fontcolor1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-Font:Menu Format"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|formatt">F_ont</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-Strikeout"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Section-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Section-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Section-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-Paragraph:Menu Paragraph"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|paragrapht">_Paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Paragraph1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-CellVertTop"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-CellVertBottom"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Section-Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-DiaMode"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Section-SlideMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Text-View:Menu View"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewT">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <style> + <class name="context-Text"/> + <class name="context-DrawText"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Table"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Font"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">5</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Font:Menu Format"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|formatt">F_ont</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Strikeout"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Paragraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Table-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Paragraph:Menu Paragraph"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|paragrapht">_Paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Paragraph1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CellVertTop"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CellVertBottom"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Table"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Section-MergeCells"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Section-SplitCell"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Section-TableDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Section-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Table:Menu Rows Columns"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|rowscolumnst">_Table</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator124"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="opacity">0.92156862745098034</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Table2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box98"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetMinimalColumnWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:SetMinimalColumnWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOptimalColumnWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:SetOptimalColumnWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DistributeColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetMinimalRowHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:SetMinimalRowHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOptimalRowHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:SetOptimalRowHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DistributeRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-SetBorderStyle2"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-LineStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FrameLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Calc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator139"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableSort"> + <property name="visible">True</property> + <property name="action_name">.uno:TableSort</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-AutoSum"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoSum</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Table-Calc:Menu Calculate"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|calculatet">_Calc</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-InsertGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertObjectChart1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertTable1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Default-Insert:MenuInsert1"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Draw"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Draw-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AnimationEffects"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Edit:Menu Edit Draw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|editdrawb">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog2"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle2"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle1"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box104"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box105"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Shape"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-DrawText"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Draw:Menu Draw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|draw">_Shape</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Shape1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BasicShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SymbolShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ArrowShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ConnectorToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Draw-StarShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-CalloutShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FlowChartShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Objects3DToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-Group:Menu Group"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewDrawb">Grou_p</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-MergeCombine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="GroupB102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-Merge"> + <property name="visible">True</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Substract"> + <property name="visible">True</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-Intersect"> + <property name="visible">True</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-3d"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-FillColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FillColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|3Db">3_D</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-3d1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionSurfaceFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionLightingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionLightingFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Fontwork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FontworkShapeType"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkShapeType</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkAlignmentFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:FontworkCharacterSpacingFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Impress-Fontwork:Menu Fontwork"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|GridButton">_Fontwork</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Draw-Section-Grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-GridUse1"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-HelplinesMove"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Impress-Grid:Menu Grid"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|GridButton">_Grid</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Image"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Image-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-AnimationEffects"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Image:Menu Image"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|graphicB">_Image</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog3"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Imag-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle3"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth3"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle2"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor3"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Imag-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box106"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box107"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Section-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Image-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-Color"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-Section-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Image-Color:MenuColor"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|GridB">Fi_lter</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="GroupB87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafLuminance"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafLuminance</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafTransparence"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Image-Section-ColorSettings2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <child> + <object class="GtkBox" id="GroupB90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafContrast"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafContrast</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Image-GrafGamma"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="action_name">.uno:GrafGamma</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Object"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="OLE-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-AnimationEffects"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="OLE-Frame:Menu Object"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|graphicB">_Object</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog4"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea4"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle4"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth4"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle3"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor4"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle3"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle3"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow3"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="OLE-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="OLE-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="OLE-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="OLE-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="OLE-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <style> + <class name="context-OLE"/> + <class name="context-Frame"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Media"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Graphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AnimationEffects"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Media-Media:Menu Media"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|graphicB">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132"> + <property name="width_request">148</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer1"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-BringToFront1"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-SendToBack1"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Media-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkBox" id="Section65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box110"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignLeft2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Media-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Multiobject"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Multi-Section-Edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-AnimationEffects"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Edit:Menu Edit Draw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|editdrawb">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-FormatLineArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog5"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatArea5"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-FormatLineArea1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Draw-XLineStyle5"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-LineWidth5"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-LineEndStyle5"> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Draw-XLineColor5"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Draw-FillStyle5"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-FormatLineArea2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-LineEndStyle4"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Image-FillShadow4"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Arrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="arrange3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-BringToFront"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Forward"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Backward"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Arrange:Menu Arrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Multi-Section-Group"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Multi-FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Multi-LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Multi-Group:Menu Group"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewDrawb">Grou_p</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <style> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Master Page"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionSlideShow5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator166"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Master:Menu Master Page"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|oleB">_Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Draw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DrawText"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Draw:Menu Draw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|draw">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-BasicShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-SymbolShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-ArrowShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-Draw-StarShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-CalloutShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-FlowChartShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="Section68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-BasicShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-SymbolShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-ArrowShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <child> + <object class="GtkToolButton" id="Master-Draw-StarShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-CalloutShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Draw-FlowChartShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Section-InsertGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-InsertObjectChart"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-DrawText"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Insert:Menu Insert"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Snap"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineB2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Snap-GridUse"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-HelplinesUse"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesUse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-SnapFrame"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-SnapPoints"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Snap-SnapBorder"> + <property name="visible">True</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Snap:MenuSnap"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="LineA2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Snap-CapturePoint"> + <property name="visible">True</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Review"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SpellDialog2"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-InsertAnnotation2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-GridVisible2"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box103"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-Review:MenuReview"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-Section-Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-DiaMode"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Master-Section-SlideMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="Master-View:Menu View"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewT">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <style> + <class name="context-MasterPage"/> + <class name="context-NotesPage"/> + <class name="context-HandoutPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="Context Form"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Form"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="baseline_position">bottom</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="Section43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">end</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly1"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form"> + <property name="label" translatable="yes" context="impress_notebookbar_groupedbar_compact|FormButton">Fo_rm</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="GroupB49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly2"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties2"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus2"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-Label1"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-Edit1"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CheckBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-RadioButton2"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ListBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-ComboBox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tools-Section-Form6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-NumericField2"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CurrencyField2"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-PatternField2"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-FormattedField1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-DateField1"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-TimeField1"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Form7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="GroupB56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="Tools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin-end">5</property> + <child> + <object class="GtkBox" id="Ext2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tools-SearchDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-HelpIndex"> + <property name="visible">True</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Tools-CloseDoc"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="Tools-Menu:Menu Settings"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|menub">_Menu</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator122"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui new file mode 100644 index 0000000000..5d4f592b85 --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui @@ -0,0 +1,12507 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <object class="GtkMenu" id="Menu3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="ExtrusionToggleD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator138"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExtrusionTiltDownD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltDown</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExtrusionTiltUpD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExtrusionTiltLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExtrusionTiltRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionTiltRight</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuArrange"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="BringToFrontD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BringToFront</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ForwardD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Forward</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BackwardD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Backward</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendToBackD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendToBack</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetObjectToForegroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetObjectToForeground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetObjectToBackgroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetObjectToBackground</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator130"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectAlignLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AlignCenterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectAlignRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AlignUpD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AlignUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AlignMiddleD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AlignDownD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AlignDown</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator128"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DistributeSelectionD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuCalculate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="TableSortD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableSort</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AutoSumD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoSum</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GraphicFilterSepiaD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSepia</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSobelD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSobel</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterInvertD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterInvert</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterMosaicD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterMosaic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterPopart"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterPopart</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterPosterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterPoster</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterReliefD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterRelief</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterRemoveNoiseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterRemoveNoise</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSharpenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSharpen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSmoothD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSmooth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GraphicFilterSolarizeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GraphicFilterSolarize</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuDraw"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuDraw-Line"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Line</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-DrawCaption"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-VerticalCaption"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalCaption</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-DrawText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-VerticalText"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:VerticalText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ArrowsToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ConnectorToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-SymbolShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ArrowShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-CalloutShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-StarShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StarShapes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Objects3DToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-AddTextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddTextBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-InsertGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-FontworkGalleryFloater"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-Text_Marquee"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text_Marquee</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ExtrusionToggle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuDrawEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="DrawEdit-SelectObject"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FlipVertical"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FlipHorizontal"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-AdvancedMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FormatLine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatLine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FormatArea"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatArea</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-TextAttributes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TextAttributes</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawEdit-FontWork"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontWork</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuEdit-Repeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Repeat</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Cut"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Cut</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Copy"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Copy</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-Paste"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Paste</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PasteUnformatted"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PasteUnformatted</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PasteSpecial"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PasteSpecial</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-CopyObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CopyObjects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-SelectAll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectAll</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-FocusToFindbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-SearchDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-RestoreEditingView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RestoreEditingView</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-EditHyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditHyperlink</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ModifyField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ManageLinks"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ManageLinks</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ImageMapDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ObjectMenue"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMenue</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-GlueEditMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GlueEditMode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-EditDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EditDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuEdit-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuEdit-PageSetup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="AddDirectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AddDirect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RecentFileListD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RecentFileList</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseDocD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Save</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveAsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAs</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveAsRemoteD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveAsRemote</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NewGlobalDocD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NewGlobalDoc</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExportToD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportTo</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExportToPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExportToPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMail"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMailD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMail</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendMailDocAsPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendMailDocAsPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendViaBluetoothD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendViaBluetooth</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="WebHtmlD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WebHtml</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuFile-Print"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Print</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrintDefaultD"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrintDefault</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PrinterSetupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PrinterSetup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SignatureD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Signature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SignPDFD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SignPDF</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SetDocumentPropertiesD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetDocumentProperties</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="QuitD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Quit</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GrowD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Grow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShrinkD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShadowedD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Shadowed</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OutlineFontD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineFont</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OverlineD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Overline</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SuperScript1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubScriptD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SubScript</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToUpperD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToUpper</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToLowerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToLower</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseRotateCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseRotateCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToSentenceCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToSentenceCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToTitleCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToTitleCase</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeCaseToToggleCaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeCaseToToggleCase</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator155"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertNonBreakingSpaceD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertNonBreakingSpace</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertHardHyphenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertHardHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertSoftHyphenD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSoftHyphen</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertZWSPD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertZWSP</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertWJD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertWJ</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertLRMD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertLRM</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRLMD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRLM</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator156"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRLMD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="CropD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Crop</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExternalEditD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExternalEdit</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePictureD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CompressGraphicD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SaveGraphicD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectMirrorVerticalD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMirrorVertical</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectMirrorHorizontalD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMirrorHorizontal</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezier1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ImageMapDialogD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImageMapDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator142"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AnimationEffectsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectTitleDescription1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GridVisibleD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GridUseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridUse</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="HelplinesMoveD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="GroupBoxD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GroupBox</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="NameGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NameGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ObjectTitleDescriptionD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectTitleDescription</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator119"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FormatGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FormatUngroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FormatUngroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EnterGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="LeaveGroupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator137"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezierD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator144"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CombineD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DismantleD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConnectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BreakD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MergeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubstractD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="IntersectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeWidthD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeHeightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DistributeSelection1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuHelp"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="HelpIndexD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExtendedHelpD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExtendedHelp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DocumentationD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Documentation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator94"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="QuestionAnswersD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:QuestionAnswers</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SendFeedbackD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SendFeedback</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DonationD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Donation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SafeModeD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SafeMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShowLicenseD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowLicense</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AboutD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuInsert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="PhotoAlbumDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PhotoAlbumDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AnimationObjectsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AnimationObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="GalleryD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Gallery</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="TwainSelectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TwainSelect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertAVMediaD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertQrCodeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertQrCode</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertObjectD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertObject</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ImportFromFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertMathD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMath</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DrawTextD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Text</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="FontworkGalleryFloaterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:FontworkGalleryFloater</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="HyperlinkDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CapturePointD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CapturePoint</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertPageFieldD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertPagesFieldD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="HeaderAndFooterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeaderAndFooter</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CloseMasterViewD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuOLE"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="ObjectMenue"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectMenue</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator154"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertCaptionDialog3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertCaptionDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator148"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangeBezierD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangeBezier</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ChangePolygonD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChangePolygon</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="convert_to_contourD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:convert_to_contour</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3D</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertInto3DLatheFastD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertInto3DLatheFast</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoBitmapD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoBitmap</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertIntoMetaFileD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertIntoMetaFile</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator149"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CombineD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Combine</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DismantleD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Dismantle</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConnectD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Connect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BreakD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Break</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MergeD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Merge</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SubstractD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Substract</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="IntersectD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeWidthD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EqualizeHeightD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EqualizeHeight</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator151"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DistributeSelection2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuParagraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="ParaLeftToRightD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="ParaRightToLeftD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParaspaceIncreaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParaspaceDecreaseD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara1D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara1</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara15D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara15</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="SpacePara2D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpacePara2</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ParagraphDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuReview"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SpellOnline"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SpellOnline</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ThesaurusDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-MoreDictionaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoreDictionaries</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SetLanguageAllTextMenu</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-ChineseConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ChineseConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HangulHanjaConversion</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-Hyphenation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Hyphenation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuReview-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuReview-RedactDoc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RedactDoc</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuRowsColumns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertRowsBeforeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowsAfterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertRowDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnsBeforeD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnsAfterD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertColumnDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertColumnDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteRowsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteColumnsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EntireRowD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EntireRow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="EntireColumnD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:EntireColumn</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SelectTableD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectTable</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="menubarD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SidebarD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator99"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ToolbarModeUI"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToolbarModeUI</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AvailableToolbarsD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AvailableToolbars</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OptionsTreeDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExtensionsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="HelpIndexD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AboutD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:About</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="InsertSlideD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DuplicateSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ModifyPageD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ModifyPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SlideSetupD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideSetup</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SelectBackgroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="InsertMasterPageD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DeleteMasterPageD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator103"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PresentationLayoutD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationLayout</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DisplayMasterBackgroundD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="DisplayMasterObjectsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator157"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="HideSlideD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HideSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ShowSlideD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowSlide</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RenameSlideD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RenameSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator153"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ImportSlideFromFileD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ImportSlideFromFile</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SummaryPageD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SummaryPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ExpandPageD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ExpandPage</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator165"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MoveSlideUpD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideUp</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MoveSlideDownD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MoveSlideDown</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuSlideShow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="PresentationD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Presentation</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PresentationCurrentSlideD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RehearseTimingsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CustomShowDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomShowDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RemoteD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Remote</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="SlideChangeWindowD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideChangeWindow</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="CustomAnimationD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator114"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="OutputQualityColorD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="OutputQualityGrayscaleD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PresentationMinimizerD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PresentationDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="AutoFormatD1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertCaptionDialog</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AutoFormatD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuTable-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuTable-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="HeadingRowsRepeatD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HeadingRowsRepeat</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RowSplitD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RowSplit</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertTextToTableD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTextToTable</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ConvertTableToTextD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ConvertTableToText</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="TableNumberRecognitionD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableNumberRecognition</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="TableBoundaries"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:TableBoundaries</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuTools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="MacroOrganizerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MacroSignatureD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroSignature</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ScriptOrganizerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ScriptOrganizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="ViewDataSourceBrowserD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ViewDataSourceBrowser</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BasicIDEAppearD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BasicIDEAppear</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="RunMacroD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:RunMacro</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MacroRecorderD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:MacroRecorder</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PresentationMinimizerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:PresentationMinimizer</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="BmpMaskD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:BmpMask</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="AVMediaPlayerD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OpenXMLFilterSettingsD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OpenXMLFilterSettings</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="PackageManagerDialogD"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="OptionsTreeDialogD2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OptionsTreeDialog</property> + </object> + </child> + </object> + <object class="GtkMenu" id="MenuView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutlineMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutlineMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NotesMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NotesMode</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-DiaMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:DiaMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-SlideMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-NotesMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:NotesMasterPage</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-HandoutMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HandoutMode</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Menubar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Menubar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Sidebar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Sidebar</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-StatusBarVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:StatusBarVisible</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-LeftPaneImpress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:LeftPaneImpress</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ToggleTabBarVisibility</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ShowRuler"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ShowRuler</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-GridVisible"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:GridVisible</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapFrame</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapPoints"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapPoints</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-SnapBorder"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:SnapBorder</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityColor</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="MenuView-OutputQualityGrayscale"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:OutputQualityGrayscale</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-ZoomPageWidth"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ZoomPageWidth</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom100Percent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom100Percent</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="MenuView-separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="MenuView-Zoom"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:Zoom</property> + </object> + </child> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityHBox" id="DefaultBox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <property name="margin-end">5</property> + <property name="baseline_position">bottom</property> + <child> + <object class="sfxlo-DropdownBox" id="SectionTools"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <child> + <object class="GtkBox" id="horizontal2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="vertical2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SearchDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:SearchDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="menub:MenuSettings"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|menub">_Menu</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="toolsb:MenuTools"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|toolsb">_Tools</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="HelpIndex1"> + <property name="visible">True</property> + <property name="action_name">.uno:HelpIndex</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="helpb:MenuHelp"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|helpb">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="SectionFile"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="vertical"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkMenuToolButton" id="Open"> + <property name="visible">True</property> + <property name="action_name">.uno:Open</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkMenuToolButton" id="Save"> + <property name="visible">True</property> + <property name="action_name">.uno:Save</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="fileb:MenuFile"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|fileb">_File</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Print"> + <property name="visible">True</property> + <property name="action_name">.uno:Print</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-DropdownBox" id="SectionEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Undo1"> + <property name="visible">True</property> + <property name="action_name">.uno:Undo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Redo"> + <property name="visible">True</property> + <property name="action_name">.uno:Redo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Paste1"> + <property name="visible">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Cut"> + <property name="visible">True</property> + <property name="action_name">.uno:Cut</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="editb:MenuEdit"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|editb">_Edit</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Copy"> + <property name="visible">True</property> + <property name="action_name">.uno:Copy</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-ContextVBox" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DefaultBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionSlideShow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PresentationCurrentSlide2"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="slideshowb:MenuSlideShow"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowb">_Slide Show</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SlideChangeWindow3"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideChangeWindow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="RehearseTimings"> + <property name="visible">True</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionSlide"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="third24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="DuplicateSlide2"> + <property name="visible">True</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AssignLayout3"> + <property name="visible">True</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="paragraphstylet:MenuSlide"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|paragraphstylet">S_lide</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ModifyPage2"> + <property name="visible">True</property> + <property name="action_name">.uno:ModifyPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionInsert3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertGraphic3"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="DrawText4"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <child> + <object class="svtlo-ManagedMenuButton" id="insertText:MenuInsert"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|insertText">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDraw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator162"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Line1"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Polygon_Unfilled1"> + <property name="visible">True</property> + <property name="action_name">.uno:Polygon_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Bezier_Unfilled1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bezier_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ArrowsToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="rectangle1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="BasicShapes.round-rectangle1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.round-rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ellipse1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LineToolbox1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator164"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="BasicShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SymbolShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ArrowShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="StarShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CalloutShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FlowChartShapes2"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="draw:MenuDraw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|draw">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3Ext4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ToggleObjectBezierMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CustomAnimation4"> + <property name="visible">True</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionReview"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SpellDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertAnnotation1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="reviewb:MenuReview"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|reviewb">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Zoom"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="NormalMultiPaneGUI"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="DiaMode"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SlideMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="viewb:MenuView"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewb">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionArrang1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Forward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward3"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Backward4"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward6"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="WrapGroup3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ObjectAlignLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="arrangedraw:MenuArrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <style> + <class name="context-default"/> + <class name="context-DrawPage"/> + <class name="context-TextObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DrawTextBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionSlideShow1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Presentation3"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PresentationCurrentSlide3"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="slideshowt:MenuSlideShow"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowt">_Slide Show</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="RehearseTimings1"> + <property name="visible">True</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CharFontName3"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FontHeight3"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Bold2"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Italic2"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Underline2"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Strikeout3"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Shadowed1"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="fontcolor3"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="format:MenuFormat"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|formatd">F_ormat</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Grow1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Shrink1"> + <property name="visible">True</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="FontDialog3"> + <property name="visible">True</property> + <property name="action_name">.uno:FontDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionParagraph"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ParaspaceIncrease1"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ParaspaceDecrease1"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LeftPara2"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CenterPara2"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="RightPara2"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="JustifyPara2"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="DefaultBullet2"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="DefaultNumbering2"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CellVertTop1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CellVertCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CellVertBottom1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="paragraph:MenuParagraph"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|paragraphTextb">_Paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ParagraphDialog3"> + <property name="visible">True</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionInsert1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator141"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertGraphic1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertPageField3"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertAuthorField3"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAuthorField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertSymbole1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertPagesField3"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertFileField3"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertFileField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="insertTextt:MenuInsert"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|insertTextt">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionView1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator139"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Zoom2"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="NormalMultiPaneGUI1"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="DiaMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SlideMasterPage1"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="viewt:MenuView"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewt">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionReview1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator161"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SpellDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:SpellDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertAnnotation2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="reviewp:MenuReview"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|reviewp">_Review</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <style> + <class name="context-DrawText"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="TableBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionSlideShow2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Presentation5"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PresentationCurrentSlide5"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="slideshowtt:MenuSlideShow"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowtt">_Slide Show</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="RehearseTimings2"> + <property name="visible">True</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionFormat1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CharFontName1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FontHeight1"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Bold1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Italic1"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Underline1"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Strikeout1"> + <property name="visible">True</property> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Shadowed2"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="fontcolor1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="CharBackColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="formatt:MenuFormat"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|formatd">F_ormat</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="Grow2"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Shrink2"> + <property name="visible">True</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="FontDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:FontDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionParagraph1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="LeftPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LeftPara5"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LeftPara6"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CenterPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="RightPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="JustifyPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="DefaultBullet1"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="DefaultNumbering1"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CellVertTop2"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CellVertCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CellVertBottom2"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="paragrapht:MenuParagraph"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|paragraphTextb">_Paragraph</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ParagraphDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:ParagraphDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionTable"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="SetBorderStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second24"> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FillStyle3"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="margin_top">2</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="tabled:MenuTable"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|tabled">T_able</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="TableDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TableDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionRowsColumns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="CellGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertColumnsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertColumnsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="DeleteColumns"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MergeCells"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="CellGroup2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertRowsBefore"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertRowsAfter"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="DeleteRows"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="SplitCell"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="rowscolumnst:MenuRowsColumns"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|rowscolumnst">R_ows</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionCalculate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="TableSort"> + <property name="visible">True</property> + <property name="action_name">.uno:TableSort</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AutoSum"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoSum</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="calculatet:MenuCalculate"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|calculatet">_Calc</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DrawBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionDraw3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator116"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Line3"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Polygon_Unfilled3"> + <property name="visible">True</property> + <property name="action_name">.uno:Polygon_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Bezier_Unfilled3"> + <property name="visible">True</property> + <property name="action_name">.uno:Bezier_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ArrowsToolbox3"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="rectangle3"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="BasicShapes.round-rectangle3"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.round-rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ellipse3"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LineToolbox3"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator123"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="BasicShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SymbolShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ArrowShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="StarShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CalloutShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FlowChartShapes1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="drawd:MenuDraw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|drawb">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3Ext2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ToggleObjectBezierMode3"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CustomAnimation1"> + <property name="visible">True</property> + <property name="action_name">.uno:CustomAnimation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDrawEdit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator117"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FormatLine1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FormatArea2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="LineEndStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="XLineStyle"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="LineWidth2"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AddTextBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AddTextBox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="editdrawb:MenuDrawEdit"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|editdrawb">_Edit</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FlipHorizontal1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator118"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="TransformDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionArrang3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator121"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Forward1"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward4"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Backward1"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward5"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator124"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="WrapGroup1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ObjectAlignLeft3"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignCenter3"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectAlignRight3"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignMiddle3"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignDown3"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="arrangedrad:MenuArrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDrawGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator126"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GridVisible1"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GridUse1"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="HelplinesMove1"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="GridDrawB:MenuGrid"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|GridDrawB">_Grid</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDrawView"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator122"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FormatGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="EnterGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:EnterGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LeaveGroup"> + <property name="visible">True</property> + <property name="action_name">.uno:LeaveGroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FormatUngroup"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatUngroup</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="viewDrawb:MenuGroup"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewDrawb">Grou_p</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Section3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator127"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ExtrusionToggle"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionToggle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="FillColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FillColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Extrusion3DColor"> + <property name="visible">True</property> + <property name="action_name">.uno:Extrusion3DColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="ExtrusionLightingFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionLightingFloater</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="3Db:Menu3D"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|3Db">3_D</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ExtrusionDepthFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDepthFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ExtrusionDirectionFloater"> + <property name="visible">True</property> + <property name="action_name">.uno:ExtrusionDirectionFloater</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="GraphicBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionGraphic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="first222"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="CompressGraphicGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="second222"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="RotateRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SaveGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third222"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="graphicB:MenuGraphic"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|graphicB">_Graphic</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3Ext1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="AnimationEffects"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="GrafModeGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="GraphicFilterToolboxGroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="BackgroundColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:BackgroundColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="svtlo-ManagedMenuButton" id="colorb:MenuColor"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|colorb">C_olor</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="GrafLuminance1"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafLuminance</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="GrafContrast1"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafContrast</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="GrafTransparence1"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="GrafGamma1"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:GrafGamma</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ColorSettings1"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionArrang4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Forward10"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward11"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Backward6"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward12"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="WrapGroup5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ObjectAlignLeft2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignUp3"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="arrangedrao:MenuArrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDrawGrid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GridVisible3"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GridUse3"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="HelplinesMove3"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="GridDrawO:MenuGrid"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|GridDrawB">_Grid</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MediaBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionFormat2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator125"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first22"> + <property name="width_request">400</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="WrapOff1"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapOff</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="WrapOn1"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapOn</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="WrapIdeal1"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapIdeal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator145"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="WrapLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="WrapThrough1"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapThrough</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="WrapRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="WrapContour"> + <property name="visible">True</property> + <property name="action_name">.uno:WrapContour</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator146"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignHorizontalCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignHorizontalCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignTop1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignVerticalCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignVerticalCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignBottom2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator147"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="OneStep1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignBottom3"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Backward2"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="BringToFront1"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SendToBack1"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="media:MenuArrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|media">_Media</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="TransformDialog1"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="AnchorMenu2"> + <property name="visible">True</property> + <property name="action_name">.uno:AnchorMenu</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="OLEBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionSlideShow3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator106"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Presentation7"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="PresentationCurrentSlide7"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="slideshowOLE:MenuSlideShow"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowOLE">_Slide Show</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="RehearseTimings3"> + <property name="visible">True</property> + <property name="action_name">.uno:RehearseTimings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDrawEdit1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator110"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FormatLine2"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="XLineStyle1"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="XLineColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="LineWidth1"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AddTextBox1"> + <property name="visible">True</property> + <property name="action_name">.uno:AddTextBox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="editdrawOLE:MenuOLE"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|editdrawb">F_rame</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="ToggleObjectRotateMode1"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="FlipVertical1"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FlipHorizontal2"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="TransformDialog2"> + <property name="visible">True</property> + <property name="action_name">.uno:TransformDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FormatLine3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionArrang5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Forward13"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward14"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Backward3"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward15"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="WrapGroup2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ObjectAlignLeft4"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignCenter4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectAlignRight4"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignUp4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignMiddle4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignDown4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="arrangedraOLE:MenuArrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDrawGrid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GridVisible2"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="GridUse2"> + <property name="visible">True</property> + <property name="action_name">.uno:GridUse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="HelplinesMove2"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesMove</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="GridDrawOLE:MenuGrid"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|GridDrawB">_Grid</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionView2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator104"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Zoom1"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="NormalMultiPaneGUI3"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="DiaMode3"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SlideMasterPage3"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="viewtOLE:MenuView"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewtOLE">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <style> + <class name="context-OLE"/> + <class name="context-Frame"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MasterPageBox"> + <property name="can_focus">False</property> + <child> + <object class="VclOptionalBox" id="SectionGraphic4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="masterm:MenuMasterPage"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|oleB">_Master Page</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionInsert2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator159"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertGraphic2"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertPageField1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlideField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertPagesField1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlidesField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertAuthorField1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertAuthorField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertSymbole3"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="InsertPageTitleField1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlideTitleField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertFileField1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertFileField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="InsertDateFieldFix1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertDateFieldFix</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="insertTextm:MenuInsert"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|insertTextm">_Insert</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionDraw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator160"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Line2"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Polygon_Unfilled2"> + <property name="visible">True</property> + <property name="action_name">.uno:Polygon_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Bezier_Unfilled2"> + <property name="visible">True</property> + <property name="action_name">.uno:Bezier_Unfilled</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ArrowsToolbox2"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapes7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="rectangle2"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="BasicShapes.round-rectangle2"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.round-rectangle</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ellipse2"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="LineToolbox2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="third22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="drawm:MenuDraw"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|drawm">D_raw</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="third3Ext6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton" id="AnimationEffects1"> + <property name="visible">True</property> + <property name="action_name">.uno:AnimationEffects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ToggleObjectBezierMode2"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionArrang2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator163"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Forward7"> + <property name="visible">True</property> + <property name="action_name">.uno:Forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward8"> + <property name="visible">True</property> + <property name="action_name">.uno:BringToFront</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="vexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Backward5"> + <property name="visible">True</property> + <property name="action_name">.uno:Backward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Forward9"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator166"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="WrapGroup4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="ObjectAlignLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="ObjectAlignRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="AlignUp1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignMiddle1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="AlignDown1"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="arrangedrawm:MenuArrange"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="thirdExt6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="SectionView4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="horizontal44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vertical44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="first4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Zoom4"> + <property name="visible">True</property> + <property name="action_name">.uno:Zoom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="second8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="NormalMultiPaneGUI2"> + <property name="visible">True</property> + <property name="action_name">.uno:NormalMultiPaneGUI</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="DiaMode2"> + <property name="visible">True</property> + <property name="action_name">.uno:DiaMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="SlideMasterPage2"> + <property name="visible">True</property> + <property name="action_name">.uno:SlideMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="svtlo-ManagedMenuButton" id="masterviewm:MenuView"> + <property name="label" translatable="yes" context="notebookbar_groupedbar_full|masterviewm">_View</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="relief">none</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar_groups.ui b/sd/uiconfig/simpress/ui/notebookbar_groups.ui new file mode 100644 index 0000000000..1c9dd71823 --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar_groups.ui @@ -0,0 +1,1900 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/galaxy/cmd/ --> + <object class="GtkImage" id="boldi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_bold.png</property> + </object> + <object class="GtkImage" id="bulletsi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_defaultbullet.png</property> + </object> + <object class="GtkImage" id="centeri"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_centerpara.png</property> + </object> + <object class="GtkImage" id="charti"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_insertobjectchart.png</property> + </object> + <object class="GtkImage" id="growi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_grow.png</property> + </object> + <object class="GtkImage" id="italicsi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_italic.png</property> + </object> + <object class="GtkImage" id="layouti"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_assignlayout.png</property> + </object> + <object class="GtkMenu" id="layoutmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="layout01"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|layout01">Blank</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="layout02"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|layout02">Title Slide</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="layout03"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|layout03">Title, Text</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="layout04"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|layout04">Title, Content</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="layout05"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|layout05">Centered Text</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkImage" id="lefti"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_leftpara.png</property> + </object> + <object class="GtkImage" id="linksi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_inserthyperlink.png</property> + </object> + <object class="GtkMenu" id="linksmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="hyperlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:HyperlinkDialog</property> + <property name="label" translatable="yes" context="notebookbar_groups|hyperlink">Hyperlink</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="footnote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertFootnote</property> + <property name="label" translatable="yes" context="notebookbar_groups|footnote">Footnote</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="endnote"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertEndnote</property> + <property name="label" translatable="yes" context="notebookbar_groups|endnote">Endnote</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="bookmark"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertBookmark</property> + <property name="label" translatable="yes" context="notebookbar_groups|bookmark">Bookmark</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="crossreference"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertReferenceField</property> + <property name="label" translatable="yes" context="notebookbar_groups|crossreference">Cross-Reference</property> + </object> + </child> + </object> + <object class="GtkImage" id="masteri"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_slidemasterpage.png</property> + </object> + <object class="GtkMenu" id="mastermenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="master01"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsBefore</property> + <property name="label" translatable="yes" context="notebookbar_groups|master01">Master 1</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="master02"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:InsertRowsAfter</property> + <property name="label" translatable="yes" context="notebookbar_groups|master02">Master 2</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkImage" id="newi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_adddirect.png</property> + <property name="pixel_size">24</property> + </object> + <object class="GtkImage" id="numberingi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_defaultnumbering.png</property> + </object> + <object class="GtkImage" id="openi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_open.png</property> + <property name="pixel_size">24</property> + </object> + <object class="GtkImage" id="paragraphstylei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_designerdialog.png</property> + </object> + <object class="GtkImage" id="pastei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/32/paste.png</property> + <property name="pixel_size">24</property> + </object> + <object class="GtkImage" id="pdfi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_exportdirecttopdf.png</property> + <property name="pixel_size">24</property> + </object> + <object class="GtkImage" id="printi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_print.png</property> + <property name="pixel_size">24</property> + </object> + <object class="GtkImage" id="redoi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_redo.png</property> + <property name="pixel_size">24</property> + </object> + <object class="GtkImage" id="righti"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_rightpara.png</property> + </object> + <object class="GtkImage" id="savei"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/32/save.png</property> + <property name="pixel_size">32</property> + <property name="icon_size">3</property> + </object> + <object class="GtkImage" id="shrinki"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/sc_shrink.png</property> + </object> + <object class="GtkImage" id="startshowi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_presentation.png</property> + </object> + <object class="GtkMenu" id="stylemenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="shapestyledefault"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|shapestyledefault">Default</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="shapestylenofill"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|shapestylenofill">No Fill</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="shapestyleshadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|shapestyleshadow">With Shadow</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="shapestylesep1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="shapestyletitle1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|shapestyletitle1">Title 1</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="shapestyletitle2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|shapestyletitle2">Title 2</property> + <property name="use_underline">True</property> + </object> + </child> + </object> + <object class="GtkImage" id="undoi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">cmd/lc_undo.png</property> + <property name="pixel_size">24</property> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">6</property> + <property name="margin-end">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkBox" id="filegroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkBox" id="filegroupbuttons"> + <property name="height_request">78</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="newb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:AddDirect</property> + <property name="image">newi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="openb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Open</property> + <property name="image">openi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="saveb"> + <property name="width_request">60</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Save</property> + <property name="image">savei</property> + <property name="relief">none</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="pdfb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:ExportDirectToPDF</property> + <property name="image">pdfi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="printb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Print</property> + <property name="image">printi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="height_request">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="filegrouplabel"> + <property name="height_request">15</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|filegrouplabel">File</property> + <attributes> + <attribute name="font-desc" value="Noto Sans 9"/> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="clipboardgroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkBox" id="clipboardgroupbuttons"> + <property name="height_request">78</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">3</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="pasteb"> + <property name="width_request">60</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="halign">start</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Paste</property> + <property name="image">pastei</property> + <property name="relief">none</property> + <property name="image_position">top</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="redob"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Redo</property> + <property name="image">redoi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="undob"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Undo</property> + <property name="image">undoi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="height_request">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="clipboardgrouplabel"> + <property name="height_request">15</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|clipboardgrouplabel">Clipboard</property> + <attributes> + <attribute name="font-desc" value="Noto Sans 9"/> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="formatgroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkBox" id="formatgroupbuttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="shapestyleb:stylemenu"> + <property name="label" translatable="yes" context="notebookbar_groups|shapestyleb">Style</property> + <property name="width_request">70</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:DesignerDialog</property> + <property name="image">paragraphstylei</property> + <property name="relief">none</property> + <property name="image_position">top</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box6"> + <property name="width_request">160</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkBox" id="box14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="font"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkToolButton" id="fontname"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="spacing">4</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="fontheight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="hexpand">True</property> + <child> + <object class="GtkToolButton" id="fontsize"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="fontadjust"> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="grow"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Grow</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="shrink"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Shrink</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="growb"> + <property name="label" translatable="yes" context="notebookbar_groups|growb"> </property> + <property name="width_request">35</property> + <property name="height_request">30</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="action_name">.uno:Grow</property> + <property name="image">growi</property> + <property name="relief">none</property> + <property name="image_position">right</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="shrinkb"> + <property name="label" translatable="yes" context="notebookbar_groups|shrinkb"> </property> + <property name="width_request">35</property> + <property name="height_request">30</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="action_name">.uno:Shrink</property> + <property name="image">shrinki</property> + <property name="relief">none</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="leftb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:LeftPara</property> + <property name="image">lefti</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="centerb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:CenterPara</property> + <property name="image">centeri</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="rightb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:RightPara</property> + <property name="image">righti</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="boldb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:Bold</property> + <property name="image">boldi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="italicsb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:Italic</property> + <property name="image">italicsi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="underlineb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:Underline</property> + <property name="relief">none</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="backgroundbox"> + <property name="height_request">26</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="backgroundcolor"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:DefaultBullet</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="highlightbox"> + <property name="height_request">26</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="highlight"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:CharBackColor</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="colorbox"> + <property name="height_request">26</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="fontcolor"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Color</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box13"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="bulletsb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:DefaultBullet</property> + <property name="image">bulletsi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="numberingb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + <property name="image">numberingi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="height_request">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="formatgrouplabel"> + <property name="height_request">15</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|formatgrouplabel">Text</property> + <attributes> + <attribute name="font-desc" value="Noto Sans 9"/> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-ContextVBox" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="slidegroup"> + <property name="can_focus">False</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkBox" id="slidegroupbuttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="startshowb"> + <property name="label" translatable="yes" context="notebookbar_groups|startshowb">Start</property> + <property name="width_request">70</property> + <property name="height_request">78</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:Presentation</property> + <property name="image">startshowi</property> + <property name="relief">none</property> + <property name="image_position">top</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="slidegrid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="masterb:mastermenu"> + <property name="label" translatable="yes" context="notebookbar_groups|masterb">Master</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="image">masteri</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="layoutb:layoutmenu"> + <property name="label" translatable="yes" context="notebookbar_groups|layoutb">Layout</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="image">layouti</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="slidegrid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="animationb:animenu"> + <property name="label" translatable="yes" context="notebookbar_groups|animationb">Animation</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="transitionb:transmenu"> + <property name="label" translatable="yes" context="notebookbar_groups|transitionb">Transition</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="height_request">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="slidegrouplabel"> + <property name="height_request">15</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|slidegrouplabel">Slide</property> + <attributes> + <attribute name="font-desc" value="Noto Sans 9"/> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="insertgroup"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkBox" id="insertgroupbuttons"> + <property name="height_request">78</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="tablebox"> + <property name="height_request">26</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="tableb"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="shapesbox"> + <property name="height_request">26</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">both-horiz</property> + <child> + <object class="GtkToolButton" id="shapesb"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:BasicShapes</property> + <property name="label" translatable="yes" context="notebookbar_groups|shapesb">Shapes</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="linksb:linksmenu"> + <property name="label" translatable="yes" context="notebookbar_groups|linksb">Links</property> + <property name="height_request">26</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="image">linksi</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="imageb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:InsertGraphic</property> + <property name="relief">none</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="chartb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:InsertObjectChart</property> + <property name="image">charti</property> + <property name="relief">none</property> + <property name="xalign">0</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="commentb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:InsertAnnotation</property> + <property name="relief">none</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="height_request">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="insertgrouplabel"> + <property name="height_request">15</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|insertgrouplabel">Insert</property> + <attributes> + <attribute name="font-desc" value="Noto Sans 9"/> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="context-Text"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="imagegroup"> + <property name="can_focus">False</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkBox" id="imagegroupbuttons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="imagestyleb"> + <property name="label" translatable="yes" context="notebookbar_groups|imagestyleb">Style</property> + <property name="height_request">78</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="image">paragraphstylei</property> + <property name="relief">none</property> + <property name="image_position">top</property> + <property name="always-show-image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="imagegrid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="cropb"> + <property name="height_request">36</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="action_name">.uno:Crop</property> + <property name="relief">none</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="resetb"> + <property name="label" translatable="yes" context="notebookbar_groups|resetb">Reset</property> + <property name="height_request">36</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="relief">none</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="imagegrid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="captionb"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="action_name">.uno:InsertCaptionDialog</property> + <property name="relief">none</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="wrapb:wrapmenu"> + <property name="label" translatable="yes" context="notebookbar_groups|wrapb">Wrap</property> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="lockb"> + <property name="label" translatable="yes" context="notebookbar_groups|lockb">Lock</property> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="height_request">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="imagegrouplabel"> + <property name="height_request">15</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="notebookbar_groups|imagegrouplabel">Image</property> + <attributes> + <attribute name="font-desc" value="Noto Sans 9"/> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <object class="GtkMenu" id="wrapmenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="wrapoff"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapOff</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapoff">None</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="wrapideal"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapIdeal</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapideal">Optimal</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="wrapon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapOn</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapon">Parallel</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="wrapleft"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapLeft</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapleft">Before</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="wrapright"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapRight</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapright">After</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="wrapthrough"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapThrough</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapthrough">Through</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="wrapcontour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:WrapContour</property> + <property name="label" translatable="yes" context="notebookbar_groups|wrapcontour">Contour</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="contourdialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">.uno:ContourDialog</property> + <property name="label" translatable="yes" context="notebookbar_groups|contourdialog">Edit Contour</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar_online.ui b/sd/uiconfig/simpress/ui/notebookbar_online.ui new file mode 100644 index 0000000000..223eedce4c --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar_online.ui @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="font"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <child> + <object class="GtkToolButton" id="Home-CharFontName"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="fontheight"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin_start">5</property> + <child> + <object class="GtkToolButton" id="Home-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/notebookbar_single.ui b/sd/uiconfig/simpress/ui/notebookbar_single.ui new file mode 100644 index 0000000000..510560896e --- /dev/null +++ b/sd/uiconfig/simpress/ui/notebookbar_single.ui @@ -0,0 +1,11343 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <requires lib="LibreOffice" version="1.0"/> + <object class="GtkMenu" id="Menu Addons"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">AddonCommand</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="AddonSection-Separator"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property> + </object> + </child> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="NotebookBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityHBox" id="DefaultBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="sfxlo-DropdownBox" id="ClipboardSection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">5</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Edit-Undo"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Undo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Edit-Paste"> + <property name="visible">True</property> + <property name="is_important">True</property> + <property name="action_name">.uno:Paste</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-ContextVBox" id="ContextContainer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DefaultContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Default-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Page"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-AssignLayout"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:AssignLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Page1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-DuplicatePage"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:DuplicateSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-DeletePage"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:DeleteSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertGraphic"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-InsertAVMedia"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertAVMedia</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Insert1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-InsertObjectChart"> + <property name="visible">True</property> + <property name="valign">center</property> + <property name="action_name">.uno:InsertObjectChart</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Home-InsertTable"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-TextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Text"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Line"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Line"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-BasicShapes.rectangle"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.rectangle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-BasicShapes.ellipse"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes.ellipse</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-DrawCaption"> + <property name="visible">True</property> + <property name="action_name">.uno:DrawCaption</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-LineToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-ArrowsToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowsToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-LineToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:LineToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ConnectorToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:ConnectorToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-BasicShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-BasicShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:BasicShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-SymbolShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:SymbolShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ArrowShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:ArrowShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-FlowChartShapes"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-StarShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:StarShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-CalloutShapes"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:CalloutShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-FlowChartShapes"> + <property name="visible">True</property> + <property name="action_name">.uno:FlowChartShapes</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Home-Objects3DToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:Objects3DToolbox</property> + </object> + <packing> + <property name="expand">True</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Zoom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-ZoomPrevious"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPrevious</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-ZoomPage"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Default-Section-Zoom2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-GridVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:GridVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-HelplinesVisible"> + <property name="visible">True</property> + <property name="action_name">.uno:HelplinesVisible</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Slideshow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom160"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-Presentation"> + <property name="visible">True</property> + <property name="action_name">.uno:Presentation</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Home-Section-Slideshow1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Home-PresentationCurrentSlide"> + <property name="visible">True</property> + <property name="action_name">.uno:PresentationCurrentSlide</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <style> + <class name="context-Default"/> + <class name="context-DrawPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="TableContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Table-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetDefaul"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea3"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoForma"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Tabl-AutoFormat"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoFormat</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-BorderDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:Line</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FrameLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:FrameLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Table-LineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:LineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Border4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SetBorderStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:SetBorderStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BorderDialog1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharFontName1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontHeight1"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-end">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Grow1"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Shrink1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-Bold1"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Italic1"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Underline1"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-Strikeout1"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed1"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Color1"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing1"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-FontDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-OutlineRight1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-OutlineLeft1"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-LeftPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-CenterPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-RightPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-JustifyPara1"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter1"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom1"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">1</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-ParagraphDialog1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Tabl-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-StyleApply1"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-MergeCells1"> + <property name="visible">True</property> + <property name="action_name">.uno:MergeCells</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-SplitCell1"> + <property name="visible">True</property> + <property name="action_name">.uno:SplitCell</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Table-OptimizeTable"> + <property name="visible">True</property> + <property name="action_name">.uno:OptimizeTable</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-AutoFormat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-AutoFormat"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:AutoFormat</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Column"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireColumn1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireColumn</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertColumnsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertColumnsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteColumns1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteColumns</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">30</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Row"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-EntireRow1"> + <property name="visible">True</property> + <property name="action_name">.uno:EntireRow</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsBefore1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsBefore</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-InsertRowsAfter1"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertRowsAfter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Table-DeleteRows1"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteRows</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">31</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-TableDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-TableDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TableDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">32</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Table-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Table-CharmapControl1"> + <property name="visible">True</property> + <property name="action_name">.uno:CharmapControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">33</property> + </packing> + </child> + <style> + <class name="context-Table"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="GraphicContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Flip"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder1"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-Crop"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-Crop"> + <property name="visible">True</property> + <property name="action_name">.uno:Crop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-SaveReplace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ChangePicture"> + <property name="visible">True</property> + <property name="action_name">.uno:ChangePicture</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-CompressGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:CompressGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Graphic-SaveGraphic"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveGraphic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">1</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox"> + <property name="visible">True</property> + <property name="action_name">.uno:GraphicFilterToolbox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">26</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-ColorSettings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-ColorSettings"> + <property name="visible">True</property> + <property name="action_name">.uno:ColorSettings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">27</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Graphic-GrafMode"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">28</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Graphic-GrafTransparence"> + <property name="visible">True</property> + <property name="action_name">.uno:GrafTransparence</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">29</property> + </packing> + </child> + <style> + <class name="context-Graphic"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="DrawContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Line5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-LineEndStyle2"> + <property name="visible">True</property> + <property name="action_name">.uno:LineEndStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Flip"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Combine"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Combine"> + <property name="visible">True</property> + <property name="action_name">.uno:Combine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Dismantle"> + <property name="visible">True</property> + <property name="action_name">.uno:Dismantle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-Merge"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-Merge"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Merge</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Substract"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Substract</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="MultiObject-Intersect"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Intersect</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-DistributeSelection"> + <property name="visible">True</property> + <property name="action_name">.uno:DistributeSelection</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <style> + <class name="context-Draw"/> + <class name="context-DrawLine"/> + <class name="context-MultiObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MediaContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Media-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FillShadow1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer"> + <property name="width_request">122</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaPlayer"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaPlayer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Media-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder4"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox"> + <property name="width_request">167</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator45"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AVMediaToolBox"> + <property name="visible">True</property> + <property name="action_name">.uno:AVMediaToolBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <style> + <class name="context-Media"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="ObjectContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Object-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Objec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatArea1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-XLineStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-LineWidth"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FormatLine3"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom74"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AdvancedMode"> + <property name="visible">True</property> + <property name="action_name">.uno:AdvancedMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ToggleObjectBezierMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectBezierMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Flip"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom75"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-FlipVertical"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipVertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-FlipHorizontal"> + <property name="visible">True</property> + <property name="action_name">.uno:FlipHorizontal</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-ObjectAlignRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-AlignUp"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignMiddle"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-AlignDown"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator89"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Object-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectForwardOne"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectBackOne"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ReverseOrder"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Object-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator92"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-StyleApply"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <style> + <class name="context-OLE"/> + <class name="context-Frame"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="FormContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Form-Section-Label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator44"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="For-SwitchControlDesignMode"> + <property name="visible">True</property> + <property name="action_name">.uno:SwitchControlDesignMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-UseWizards"> + <property name="visible">True</property> + <property name="action_name">.uno:UseWizards</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ControlProperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ControlProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:ControlProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Properties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormProperties"> + <property name="visible">True</property> + <property name="action_name">.uno:FormProperties</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ShowFmExplorer"> + <property name="visible">True</property> + <property name="action_name">.uno:ShowFmExplorer</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-TabDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-TabDialog"> + <property name="visible">True</property> + <property name="action_name">.uno:TabDialog</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Labels"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Label"> + <property name="visible">True</property> + <property name="action_name">.uno:Label</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Edit"> + <property name="visible">True</property> + <property name="action_name">.uno:Edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-CheckBox"> + <property name="visible">True</property> + <property name="action_name">.uno:CheckBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-RadioButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-RadioButton"> + <property name="visible">True</property> + <property name="action_name">.uno:RadioButton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ListBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ListBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-ComboBox"> + <property name="visible">True</property> + <property name="action_name">.uno:ComboBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Pushbutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Pushbutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Pushbutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-Imagebutton"> + <property name="visible">True</property> + <property name="action_name">.uno:Imagebutton</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-OpenReadOnly"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-OpenReadOnly"> + <property name="visible">True</property> + <property name="action_name">.uno:OpenReadOnly</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-AutoControlFocus"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-AutoControlFocus"> + <property name="visible">True</property> + <property name="action_name">.uno:AutoControlFocus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignUp4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignMiddle4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-AlignDown4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Media-AlignCenter4"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Media-ObjectAlignRight4"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator48"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Form-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectForwardOne3"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-ObjectBackOne3"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-SendToBack3"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Object-BeforeObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Object-BehindObject1"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder5"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-FormattedField"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-FormattedField"> + <property name="visible">True</property> + <property name="action_name">.uno:FormattedField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-DateField"> + <property name="visible">True</property> + <property name="action_name">.uno:DateField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-TimeField"> + <property name="visible">True</property> + <property name="action_name">.uno:TimeField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NumericField"> + <property name="visible">True</property> + <property name="action_name">.uno:NumericField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-CurrencyField"> + <property name="visible">True</property> + <property name="action_name">.uno:CurrencyField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-PatternField"> + <property name="visible">True</property> + <property name="action_name">.uno:PatternField</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-GroupBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-GroupBox"> + <property name="visible">True</property> + <property name="action_name">.uno:GroupBox</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-FormattedField1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-ImageControl"> + <property name="visible">True</property> + <property name="action_name">.uno:ImageControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-FileControl"> + <property name="visible">True</property> + <property name="action_name">.uno:FileControl</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Form-Section-FormattedField2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom39"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Form-Grid"> + <property name="visible">True</property> + <property name="action_name">.uno:Grid</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Form-NavigationBar"> + <property name="visible">True</property> + <property name="action_name">.uno:NavigationBar</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <style> + <class name="context-Form"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="TextContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Text-Section-Paintbrush"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FormatPaintbrush"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatPaintbrush</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ResetAttributes"> + <property name="visible">True</property> + <property name="action_name">.uno:SetDefault</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator65"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-10"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FillShadow2"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine1"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-XLineColor2"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom47"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Default-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom49"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-FormatLine4"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontName"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator73"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CharFontName"> + <property name="visible">True</property> + <property name="action_name">.uno:CharFontName</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-23"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontHeight"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FontHeight"> + <property name="visible">True</property> + <property name="action_name">.uno:FontHeight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-22"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-GrawShrink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Grow"> + <property name="visible">True</property> + <property name="action_name">.uno:Grow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shrink"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:Shrink</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-BoldItalic"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-Bold"> + <property name="visible">True</property> + <property name="action_name">.uno:Bold</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Italic"> + <property name="visible">True</property> + <property name="action_name">.uno:Italic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Underline"> + <property name="visible">True</property> + <property name="action_name">.uno:Underline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Strikeout"> + <property name="action_name">.uno:Strikeout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-Shadowed"> + <property name="visible">True</property> + <property name="action_name">.uno:Shadowed</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-SubSuperScript"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-SubScript"> + <property name="action_name">.uno:SubScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-SuperScript"> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SuperScript</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-21"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontColor"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator78"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="Text-Color"> + <property name="visible">True</property> + <property name="action_name">.uno:Color</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-Spacing"> + <property name="action_name">.uno:Spacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-CharBackColor"> + <property name="visible">True</property> + <property name="action_name">.uno:CharBackColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-20"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-FontDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtTop19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-FontDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FontDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-19"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-BulletNumbering"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-DefaultBullet"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultBullet</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-DefaultNumbering"> + <property name="visible">True</property> + <property name="action_name">.uno:DefaultNumbering</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-SetOutline"> + <property name="action_name">.uno:SetOutline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-18"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-IncrementDecrement"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-OutlineRight"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-OutlineLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:OutlineLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-17"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Para1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-LeftPara"> + <property name="visible">True</property> + <property name="action_name">.uno:LeftPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CenterPara"> + <property name="visible">True</property> + <property name="action_name">.uno:CenterPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-RightPara"> + <property name="visible">True</property> + <property name="action_name">.uno:RightPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-JustifyPara"> + <property name="visible">True</property> + <property name="action_name">.uno:JustifyPara</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Para2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator79"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-CellVertTop"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertTop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertCenter"> + <property name="visible">True</property> + <property name="action_name">.uno:CellVertCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-CellVertBottom"> + <property name="visible">True</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <property name="action_name">.uno:CellVertBottom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-15"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-LTR"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParaLeftToRight"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaLeftToRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ParaRightToLeft"> + <property name="visible">True</property> + <property name="action_name">.uno:ParaRightToLeft</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-14"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Spacing"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">icons</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParaspaceIncrease"> + <property name="action_name">.uno:ParaspaceIncrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Text-ParaspaceDecrease"> + <property name="action_name">.uno:ParaspaceDecrease</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkMenuToolButton" id="Text-LineSpacing2"> + <property name="action_name">.uno:LineSpacing</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-13"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-ParagraphDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-ParagraphDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:ParagraphDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">23</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator82"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Text-StyleApply"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">24</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Text-Section-TextBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator69"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Default-Text1"> + <property name="visible">True</property> + <property name="action_name">.uno:Text</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="Default-VerticalText1"> + <property name="visible">True</property> + <property name="action_name">.uno:VerticalText</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">25</property> + </packing> + </child> + <style> + <class name="context-Text"/> + <class name="context-DrawText"/> + <class name="context-TextObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="3DObjectContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Select"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-SelectObject"> + <property name="visible">True</property> + <property name="action_name">.uno:SelectObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ZoomMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ZoomMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatArea</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Area2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FillStyle"> + <property name="visible">True</property> + <property name="action_name">.uno:FillStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-12"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-FillShadow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObjec-FillShadow"> + <property name="visible">True</property> + <property name="action_name">.uno:FillShadow</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-11"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-AreaDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatArea2"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatArea</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine"> + <property name="visible">True</property> + <property name="action_name">.uno:FormatLine</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-XLineColor"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineColor</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-XLineStyle1"> + <property name="visible">True</property> + <property name="action_name">.uno:XLineStyle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Line4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin-start">5</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-LineWidth1"> + <property name="visible">True</property> + <property name="action_name">.uno:LineWidth</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-LineDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-FormatLine1"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:FormatLine</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Rotate"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom62"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode"> + <property name="visible">True</property> + <property name="action_name">.uno:ToggleObjectRotateMode</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Window3D"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="ExtBottom63"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-Window3D"> + <property name="visible">True</property> + <property name="action_name">.uno:Window3D</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-TransformDialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-TransformDialog"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:TransformDialog</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">13</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectAlign"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlign</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignCenter2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignCenter</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-ObjectAlignRight2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectAlignRight</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Align2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-AlignUp2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignUp</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignMiddle2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignMiddle</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-AlignDown2"> + <property name="visible">True</property> + <property name="action_name">.uno:AlignDown</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">16</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Align23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkMenuToolButton" id="3dObject-ObjectPosition"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectPosition</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">17</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ObjectForwardOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectForwardOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">18</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-ObjectBackOne2"> + <property name="visible">True</property> + <property name="action_name">.uno:ObjectBackOne</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-SendToBack2"> + <property name="visible">True</property> + <property name="action_name">.uno:SendToBack</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">19</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-BeforeObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BeforeObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="3dObject-BehindObject"> + <property name="visible">True</property> + <property name="action_name">.uno:BehindObject</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">20</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Arrange4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="MultiObject-ReverseOrder3"> + <property name="visible">True</property> + <property name="action_name">.uno:ReverseOrder</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">21</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="3dObject-Section-Styles"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="3dObject-StyleApply3"> + <property name="visible">True</property> + <property name="action_name">.uno:StyleApply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">22</property> + </packing> + </child> + <style> + <class name="context-3DObject"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="sfxlo-PriorityMergedHBox" id="MasterPageContainer"> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="VclOptionalBox" id="Master-Section-DrawingLayout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator71"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DrawingLayout"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:DrawingLayout</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Insert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-InsertMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:InsertMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DeleteMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:DeleteMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-9"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Rename"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Wrap19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-RenameMasterPage"> + <property name="visible">True</property> + <property name="action_name">.uno:RenameMasterPage</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-8"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Dialog"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageSetup"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SlideSetup</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SelectBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator61"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">8</property> + <property name="margin_bottom">8</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SelectBackground"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:SelectBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-7"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-SaveBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-SaveBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:SaveBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-6"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-View"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator57"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">4</property> + <property name="margin_bottom">4</property> + <property name="toolbar_style">text</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-ViewMenu"> + <property name="visible">True</property> + <property name="action_name">.uno:ViewMenu</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-5"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DisplayMasterBackground"> + <property name="visible">True</property> + <property name="action_name">.uno:DisplayMasterBackground</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="priority-4"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-DisplayMasterObjects"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:DisplayMasterObjects</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-3"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-MasterLayouts"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-MasterLayouts"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:MasterLayouts</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-2"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-PageMode"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Draw23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-PageMode"> + <property name="visible">True</property> + <property name="visible_horizontal">False</property> + <property name="action_name">.uno:PageMode</property> + <property name="icon_name">sfx2/res/symphony/open_more.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <style> + <class name="priority-1"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="VclOptionalBox" id="Master-Section-Close"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <child> + <object class="GtkSeparator" id="separator72"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="sfxlo-NotebookbarToolBox" id="Anchor6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="toolbar_style">both-horiz</property> + <property name="show_arrow">False</property> + <child> + <object class="GtkToolButton" id="Master-CloseMasterView"> + <property name="visible">True</property> + <property name="action_name">.uno:CloseMasterView</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">12</property> + </packing> + </child> + <style> + <class name="context-MasterPage"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/optimpressgeneralpage.ui b/sd/uiconfig/simpress/ui/optimpressgeneralpage.ui new file mode 100644 index 0000000000..77a97b7c67 --- /dev/null +++ b/sd/uiconfig/simpress/ui/optimpressgeneralpage.ui @@ -0,0 +1,813 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">5</property> + <property name="upper">200</property> + <property name="value">5</property> + <property name="step-increment">1</property> + <property name="page-increment">5</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">100</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment3"> + <property name="upper">100</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment4"> + <property name="upper">100</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment5"> + <property name="upper">100</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkBox" id="OptSavePage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <child> + <object class="GtkBox" id="box_left"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">24</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="newdocumentframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-bottom">12</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="startwithwizard"> + <property name="label" translatable="yes" context="optimpressgeneralpage|startwithwizard">Start with _Template Selection</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="startwithwizard-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|startwithwizard">Specifies whether to activate the Select a Template window when opening a presentation with File - New - Presentation.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockstartwithwizard"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="newdoclbl"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|newdoclbl">New Document</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-bottom">12</property> + <property name="hexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=6 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="copywhenmove"> + <property name="label" translatable="yes" context="optimpressgeneralpage|copywhenmove">Copy when moving</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="copywhenmove-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|copywhenmove">If enabled, a copy is created when you move an object while holding down the Ctrl key.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|label6">Unit of _measurement:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">units</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="units"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="units-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|units">Determines the Unit of measurement for presentations.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid8"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="tabstoplabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|tabstoplabel">Ta_b stops:</property> + <property name="use-underline">True</property> + <property name="justify">fill</property> + <property name="mnemonic-widget">metricFields</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="metricFields"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="activates-default">True</property> + <property name="text">5,00</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + <property name="digits">2</property> + <property name="value">5</property> + <child internal-child="accessible"> + <object class="AtkObject" id="metricFields-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|metricFields">Defines the spacing between tab stops.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="objalwymov"> + <property name="label" translatable="yes" context="optimpressgeneralpage|objalwymov">Objects always moveable</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="objalwymov-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|objalwymov">Specifies that you want to move an object with the Rotate tool enabled. If Objects always moveable is not marked, the Rotate tool can only be used to rotate an object.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="distortcb"> + <property name="label" translatable="yes" context="optimpressgeneralpage|distortcb">Do not distort objects in curve</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="backgroundback"> + <property name="label" translatable="yes" context="optimpressgeneralpage|backgroundback">Use background cache</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="backgroundback-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|backgroundback">Specifies whether to use the cache for displaying objects on the master slide.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockcopywhenmove"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockbackgroundback"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockobjalwymov"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockunits"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <object class="GtkImage" id="locktabstop"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockdistortcb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-bottom">3</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|label4">Settings</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="cbCompatibility"> + <property name="label" translatable="yes" context="optimpressgeneralpage|cbCompatibility">Add _spacing between paragraphs and tables</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="cbCompatibility-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|cbCompatibility">Specifies that Impress calculates the paragraph spacing exactly like Microsoft PowerPoint.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockcbCompatibility"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|label1">Compatibility</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box_right"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-bottom">12</property> + <property name="hexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=2 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="qickedit"> + <property name="label" translatable="yes" context="optimpressgeneralpage|qickedit">Allow quick editing</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="qickedit-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|qickedit">If on, you can edit text immediately after clicking a text object. If off, you must double-click to edit text.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="textselected"> + <property name="label" translatable="yes" context="optimpressgeneralpage|textselected">Only text area selectable</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="textselected-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|textselected">Specifies whether to select a text box by clicking the text.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockqickedit"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="locktextselected"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|label2">Text Objects</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="scaleframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-bottom">12</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=5 n-rows=3 --> + <object class="GtkGrid" id="grid7"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">3</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|label8">_Drawing scale:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">scaleBox</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="widthlbl"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|widthlbl">Page _width:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">metricWidthFields</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="heightlbl"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|heightlbl">Page _height:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">metricHeightFields</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">3</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="metricWidthFields"> + <property name="can-focus">True</property> + <property name="no-show-all">True</property> + <property name="activates-default">True</property> + <property name="text">0,00</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment2</property> + <property name="digits">2</property> + </object> + <packing> + <property name="left-attach">2</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="metricHeightFields"> + <property name="can-focus">True</property> + <property name="no-show-all">True</property> + <property name="activates-default">True</property> + <property name="text">0,00</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment4</property> + <property name="digits">2</property> + </object> + <packing> + <property name="left-attach">4</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="info1"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label">info1</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">metricInfo1Fields</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="metricInfo1Fields"> + <property name="can-focus">True</property> + <property name="no-show-all">True</property> + <property name="activates-default">True</property> + <property name="text">0</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment3</property> + </object> + <packing> + <property name="left-attach">2</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="info2"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label">info2</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">metricInfo2Fields</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">3</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="metricInfo2Fields"> + <property name="can-focus">True</property> + <property name="no-show-all">True</property> + <property name="activates-default">True</property> + <property name="text">0</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment5</property> + </object> + <packing> + <property name="left-attach">4</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="scaleBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="has-entry">True</property> + <child internal-child="entry"> + <object class="GtkEntry"> + <property name="can-focus">False</property> + <property name="halign">start</property> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="scaleBox-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|scaleBox">Determines the drawing scale on the status bar.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">2</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockscaleBox"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="optimpressgeneralpage|label5">Scale</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="OptSavePage-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|OptSavePage">Defines the general options for drawing or presentation documents.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroupLabel"> + <widgets> + <widget name="label6"/> + <widget name="tabstoplabel"/> + </widgets> + </object> + <object class="GtkSizeGroup" id="sizegroupWidget"> + <widgets> + <widget name="units"/> + <widget name="metricFields"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pagesfieldbox.ui b/sd/uiconfig/simpress/ui/pagesfieldbox.ui new file mode 100644 index 0000000000..2c96026fc9 --- /dev/null +++ b/sd/uiconfig/simpress/ui/pagesfieldbox.ui @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkBox" id="PagesFieldBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkSpinButton" id="pagesfield"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="adjustment">adjustment1</property> + <property name="truncate-multiline">True</property> + <property name="digits">2</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/photoalbum.ui b/sd/uiconfig/simpress/ui/photoalbum.ui new file mode 100644 index 0000000000..9ce85e5663 --- /dev/null +++ b/sd/uiconfig/simpress/ui/photoalbum.ui @@ -0,0 +1,416 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.4 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkDialog" id="PhotoAlbumCreatorDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="photoalbum|PhotoAlbumCreatorDialog">Create Photo Album</property> + <property name="modal">True</property> + <property name="window_position">center</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + <property name="secondary">True</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="photoalbum|create_btn">Insert Slides</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="images_tree"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <property name="search_column">0</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <child> + <object class="GtkCellRendererText" id="cellrenderertext1"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButtonBox" id="buttonbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <property name="layout_style">start</property> + <child> + <object class="GtkButton" id="add_btn"> + <property name="label" translatable="yes" context="stock">_Add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="rem_btn"> + <property name="label" translatable="yes" context="stock">_Remove</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="photoalbum|rem_btn|tooltip_text">Remove Image from List</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="up_btn"> + <property name="label" translatable="yes" context="photoalbum|up_btn">_Up</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="photoalbum|up_btn|tooltip_text">Move Image Up</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="down_btn"> + <property name="label" translatable="yes" context="photoalbum|down_btn">Do_wn</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes" context="photoalbum|down_btn|tooltip_text">Move Image Down</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="vexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <property name="margin-top">6</property> + <child> + <object class="GtkDrawingArea" id="preview_img"> + <property name="width_request">200</property> + <property name="height_request">150</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">start</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_bottom">6</property> + <property name="label" translatable="yes" context="photoalbum|label2">Preview</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkBox" id="box6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="photoalbum|label7">Slide layout:</property> + <property name="mnemonic_widget">opt_combo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="opt_combo"> + <property name="width_request">160</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="active">0</property> + <items> + <item translatable="yes" context="photoalbum|liststore2">1 Image</item> + <item translatable="yes" context="photoalbum|liststore2">2 Images</item> + <item translatable="yes" context="photoalbum|liststore2">4 Images</item> + </items> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="cap_check"> + <property name="label" translatable="yes" context="photoalbum|cap_check">Add caption to each slide</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="asr_check"> + <property name="label" translatable="yes" context="photoalbum|asr_check">Keep aspect ratio</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="asr_check_crop"> + <property name="label" translatable="yes" context="photoalbum|asr_check_crop">Fill Screen</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="insert_as_link_check"> + <property name="label" translatable="yes" context="photoalbum|insert_as_link_check">Link images</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-11">help</action-widget> + <action-widget response="-6">cancel</action-widget> + </action-widgets> + <child> + <placeholder/> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pmimagespage.ui b/sd/uiconfig/simpress/ui/pmimagespage.ui new file mode 100644 index 0000000000..0726c0dc32 --- /dev/null +++ b/sd/uiconfig/simpress/ui/pmimagespage.ui @@ -0,0 +1,202 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">100</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkBox" id="PMImagesPage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=6 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkCheckButton" id="STR_REMOVE_CROP_AREA"> + <property name="label" translatable="yes" context="pmimagespage|STR_REMOVE_CROP_AREA">_Delete cropped image areas</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="STR_EMBED_LINKED_GRAPHICS"> + <property name="label" translatable="yes" context="pmimagespage|STR_EMBED_LINKED_GRAPHICS">_Embed external images</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="STR_IMAGE_RESOLUTION"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmimagespage|STR_IMAGE_RESOLUTION">Reduce _image resolution</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">LB_RESOLUTION</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="LB_RESOLUTION"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="active">0</property> + <items> + <item id="0" translatable="yes" context="pmimagespage|LB_RESOLUTION"><no change></item> + <item id="96" translatable="yes" context="pmimagespage|LB_RESOLUTION">96 DPI (screen resolution)</item> + <item id="150" translatable="yes" context="pmimagespage|LB_RESOLUTION">150 DPI (projector resolution)</item> + <item id="300" translatable="yes" context="pmimagespage|LB_RESOLUTION">300 DPI (print resolution)</item> + <item id="600" translatable="yes" context="pmimagespage|LB_RESOLUTION">600 DPI (print resolution)</item> + </items> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="STR_LOSSLESS_COMPRESSION"> + <property name="label" translatable="yes" context="pmimagespage|STR_LOSSLESS_COMPRESSION">_Lossless compression</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="STR_JPEG_COMPRESSION"> + <property name="label" translatable="yes" context="pmimagespage|STR_JPEG_COMPRESSION">_JPEG compression</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">STR_LOSSLESS_COMPRESSION</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">24</property> + <property name="spacing">12</property> + <child> + <object class="GtkLabel" id="STR_QUALITY"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmimagespage|STR_IMAGE_RESOLUTION">_Quality in %</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">SB_QUALITY</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="SB_QUALITY"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="STR_GRAPHIC_OPTIMIZATION"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmimagespages|STR_GRAPHIC_OPTIMIZATION">Choose settings for optimizing images</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pminfodialog.ui b/sd/uiconfig/simpress/ui/pminfodialog.ui new file mode 100644 index 0000000000..29a4a1524a --- /dev/null +++ b/sd/uiconfig/simpress/ui/pminfodialog.ui @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMessageDialog" id="PMInfoDialog"> + <property name="can-focus">False</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="type-hint">dialog</property> + <property name="buttons">ok</property> + <child internal-child="vbox"> + <object class="GtkBox"> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox"> + <property name="can-focus">False</property> + <property name="homogeneous">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ask"> + <property name="label" translatable="yes" context="pminfodialog|ask">_Open newly created presentation</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pmintropage.ui b/sd/uiconfig/simpress/ui/pmintropage.ui new file mode 100644 index 0000000000..6361cf301c --- /dev/null +++ b/sd/uiconfig/simpress/ui/pmintropage.ui @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="PMIntroPage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkLabel" id="STR_INTRODUCTION_T"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label" translatable="yes" context="pmintropage|STR_INTRODUCTION_T">The Presentation Minimizer is used to reduce the file size of the current presentation. Images will be compressed and data, that is no longer needed, will be removed. + + At the last step of the wizard you can choose to apply the changes to the current presentation or to create an optimized new version of the presentation.</property> + <property name="wrap">True</property> + <property name="width-chars">58</property> + <property name="max-width-chars">58</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkComboBoxText" id="LB_SETTINGS"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="STR_REMOVE"> + <property name="label" translatable="yes" context="pmintropage:STR_REMOVE">_Delete</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="STR_CHOSE_SETTINGS"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="pmintropage|STR_CHOSE_SETTINGS">_Choose settings for Presentation Minimizer</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">LB_SETTINGS</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="STR_INTRODUCTION"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmintropage|STR_INTRODUCTION">Introduction</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pmobjectspage.ui b/sd/uiconfig/simpress/ui/pmobjectspage.ui new file mode 100644 index 0000000000..303432106c --- /dev/null +++ b/sd/uiconfig/simpress/ui/pmobjectspage.ui @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="PMObjectsPage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkCheckButton" id="STR_OLE_REPLACE"> + <property name="label" translatable="yes" context="pmimagespage|STR_OLE_REPLACE">Create static replacement images for OLE objects</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="STR_ALL_OLE_OBJECTS"> + <property name="label" translatable="yes" context="pmobjectspage|STR_ALL_OLE_OBJECTS">For _all OLE objects</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="margin-start">18</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="STR_ALIEN_OLE_OBJECTS_ONLY"> + <property name="label" translatable="yes" context="pmobjectspage|STR_ALIEN_OLE_OBJECTS_ONLY">_For OLE objects not based on OpenDocument format</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="margin-start">18</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">STR_ALL_OLE_OBJECTS</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="STR_OLE_OBJECTS_DESC"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> + <property name="margin-top">12</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="wrap">True</property> + <property name="width-chars">58</property> + <property name="max-width-chars">58</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="STR_OLE_OPTIMIZATION"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmobjectspages|STR_OLE_OPTIMIZATION">Choose settings for replacing OLE objects</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pmslidespage.ui b/sd/uiconfig/simpress/ui/pmslidespage.ui new file mode 100644 index 0000000000..fdc9fa5114 --- /dev/null +++ b/sd/uiconfig/simpress/ui/pmslidespage.ui @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="PMSlidesPage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=5 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkCheckButton" id="STR_DELETE_MASTER_PAGES"> + <property name="label" translatable="yes" context="pmslidespage|STR_DELETE_MASTER_PAGES">Delete unused _master slides</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="STR_DELETE_HIDDEN_SLIDES"> + <property name="label" translatable="yes" context="pmslidespage|STR_DELETE_HIDDEN_SLIDES">Delete hidden _slides</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="STR_CUSTOM_SHOW"> + <property name="label" translatable="yes" context="pmslidespage|STR_CUSTOM_SHOW">Delete slides that are not used for the _custom slide show</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <accessibility> + <relation type="label-for" target="LB_SLIDES"/> + </accessibility> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="LB_SLIDES"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <accessibility> + <relation type="labelled-by" target="STR_CUSTOM_SHOW"/> + </accessibility> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="STR_DELETE_NOTES_PAGES"> + <property name="label" translatable="yes" context="pmslidespage|STR_DELETE_NOTES_PAGES">_Clear notes</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="STR_CHOOSE_SLIDES"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmslidespages|STR_CHOOSE_SLIDES">Choose which slides to delete</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/pmsummarypage.ui b/sd/uiconfig/simpress/ui/pmsummarypage.ui new file mode 100644 index 0000000000..4d91c33241 --- /dev/null +++ b/sd/uiconfig/simpress/ui/pmsummarypage.ui @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="PMSummaryPage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=10 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkLabel" id="LABEL1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="STR_APPLY_TO_CURRENT"> + <property name="label" translatable="yes" context="pmsummarypage|STR_APPLY_TO_CURRENT">_Apply changes to current presentation</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="margin-top">12</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">STR_SAVE_AS</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="STR_SAVE_AS"> + <property name="label" translatable="yes" context="pmsummarypage|STR_SAVE_AS">_Duplicate presentation before applying changes</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="active">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkProgressBar" id="PROGRESS"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">7</property> + </packing> + </child> + <child> + <object class="GtkSeparator"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">8</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkCheckButton" id="STR_SAVE_SETTINGS"> + <property name="label" translatable="yes" context="pmsummarypage|STR_SAVE_SETTINGS">_Save settings as</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <accessibility> + <relation type="label-for" target="MY_SETTINGS"/> + </accessibility> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="MY_SETTINGS"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="has-entry">True</property> + <child internal-child="entry"> + <object class="GtkEntry"> + <property name="truncate-multiline">True</property> + <property name="can-focus">False</property> + </object> + </child> + <accessibility> + <relation type="labelled-by" target="STR_SAVE_SETTINGS"/> + </accessibility> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">9</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="LABEL2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="LABEL3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=2 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">18</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="STR_CURRENT_FILESIZE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmsummarypage|STR_CURRENT_FILESIZE">Current file size:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="STR_ESTIMATED_FILESIZE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmsummarypage|STR_ESTIMATED_FILESIZE">Estimated new file size:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="CURRENT_FILESIZE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="ESTIMATED_FILESIZE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="STR_STATUS"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">12</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">PROGRESS</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">6</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="STR_SUMMARY_TITLE"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="pmsummarypages|STR_SUMMARY_TITLE">Choose where to apply the following changes</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">100</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/presentationdialog.ui b/sd/uiconfig/simpress/ui/presentationdialog.ui new file mode 100644 index 0000000000..9a474200f3 --- /dev/null +++ b/sd/uiconfig/simpress/ui/presentationdialog.ui @@ -0,0 +1,880 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">86400000</property> + <property name="step-increment">1000</property> + <property name="page-increment">60000</property> + </object> + <object class="GtkDialog" id="PresentationDialog"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="presentationdialog|PresentationDialog">Slide Show Settings</property> + <property name="modal">True</property> + <property name="default-width">0</property> + <property name="default-height">0</property> + <property name="type-hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">12</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=3 --> + <object class="GtkGrid" id="grid5"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid6"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkRadioButton" id="from"> + <property name="label" translatable="yes" context="presentationdialog|from">_From:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">allslides</property> + <accessibility> + <relation type="label-for" target="from_cb"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="from-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|from">Enter the number of the start slide.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="from_cb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <accessibility> + <relation type="labelled-by" target="from"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="from_cb-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="presentationdialog|from_cb-atkobject">Starting slide</property> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|from_cb">Enter the number of the start slide.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="allslides"> + <property name="label" translatable="yes" context="presentationdialog|allslides">All _slides</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="allslides-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|allslides">Includes all of the slides in your slide show.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkRadioButton" id="customslideshow"> + <property name="label" translatable="yes" context="presentationdialog|customslideshow">_Custom slide show:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">allslides</property> + <accessibility> + <relation type="label-for" target="customslideshow_cb"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="customslideshow-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|customslideshow">Runs a custom slide show in the order that you defined in Slide Show - Custom Slide Show.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="customslideshow_cb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <accessibility> + <relation type="labelled-by" target="customslideshow"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="customslideshow_cb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|customslideshow_cb">Runs a custom slide show in the order that you defined in Slide Show - Custom Slide Show.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|label1">Range</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=2 --> + <object class="GtkGrid" id="grid7"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid" id="grid8"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkComboBoxText" id="presdisplay_cb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="presdisplay_cb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|presdisplay_cb">Select a display to use for full screen slide show mode.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="presdisplay_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|presdisplay_label">P_resentation display:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">presdisplay_cb</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="console_cb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="active">0</property> + <items> + <item id="0" translatable="yes" context="presentationdialog|console_cb">Full screen</item> + <item id="1" translatable="yes" context="presentationdialog|console_cb">Windowed</item> + <item id="2" translatable="yes" context="presentationdialog|console_cb">Disabled</item> + </items> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="console_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|console_label">Presenter console:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">console_cb</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="shownavigationbutton"> + <property name="label" translatable="yes" context="presentationdialog|shownavigationbutton">Show navigation bar</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="tooltip-text" translatable="yes" context="presentationdialog|shownavigationbutton|tooltip_text">Show navigation bar at the bottom of the presentation</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="navbar_btn_size_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="margin-start">24</property> + <property name="label" translatable="yes" context="presentationdialog|navbar_btn_size_label">Buttons size:</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="navigation_buttons_size_cb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="presentationdialog|navigation_buttons_size_cb">Automatic</item> + <item translatable="yes" context="presentationdialog|navigation_buttons_size_cb">Small</item> + <item translatable="yes" context="presentationdialog|navigation_buttons_size_cb">Large</item> + <item translatable="yes" context="presentationdialog|navigation_buttons_size_cb">Extra Large</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="navigation_buttons_size_cb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip | iconsize">Specifies the display size of navigation bar icons.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="grid9"> + <property name="can-focus">False</property> + <child> + <object class="GtkLabel" id="externalmonitor_str"> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|externalmonitor_str">Display %1 (external)</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="monitor_str"> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|monitor_str">Display %1</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="allmonitors_str"> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|allmonitors_str">All displays</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="external_str"> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|external_str">Auto External (Display %1)</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|label3">Display</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=5 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkRadioButton" id="default"> + <property name="label" translatable="yes" context="presentationdialog|default">F_ull screen</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="default-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|default">A full screen slide is shown.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="window"> + <property name="label" translatable="yes" context="presentationdialog|window">In a _window</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">default</property> + <child internal-child="accessible"> + <object class="AtkObject" id="window-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|window">Slide show runs in the Impress program window.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="auto"> + <property name="label" translatable="yes" context="presentationdialog|auto">_Loop and repeat after:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">default</property> + <accessibility> + <relation type="label-for" target="pauseduration"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="auto-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|auto">Restarts the slide show after the pause interval you specify. A pause slide is displayed between the final slide and the start slide. Press the Esc key to stop the show.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="showlogo"> + <property name="label" translatable="yes" context="presentationdialog|showlogo">Show _logo during pause</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="margin-start">12</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="showlogo-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|showlogo">Displays the application logo on the pause slide.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="pauseduration"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="tooltip-text" translatable="yes" context="presentationdialog|pauseduration|tooltip_text">Duration of pause</property> + <property name="margin-start">12</property> + <property name="activates-default">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + <accessibility> + <relation type="labelled-by" target="auto"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="pauseduration-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="presentationdialog|pauseduration-atkobject">Pause Duration</property> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|pauseduration">Enter the duration of the pause before the slide show is repeated. If you enter zero, the show restarts immediately without showing a pause slide.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|label2">Presentation Mode</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=6 --> + <object class="GtkGrid" id="grid4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkCheckButton" id="manualslides"> + <property name="label" translatable="yes" context="presentationdialog|manualslides">Disable auto_matic change of slides</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="manualslides-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|manualslides">Slides never change automatically when this box is selected.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="pointervisible"> + <property name="label" translatable="yes" context="presentationdialog|pointervisible">Mouse pointer _visible</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="pointervisible-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|pointervisible">Shows the mouse pointer during a slide show.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="pointeraspen"> + <property name="label" translatable="yes" context="presentationdialog|pointeraspen">Mouse pointer as _pen</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="pointeraspen-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|pointeraspen">Changes the mouse pointer to a pen which you can use to draw on slides during the presentation.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="changeslidesbyclick"> + <property name="label" translatable="yes" context="presentationdialog|changeslidesbyclick">Change slides by clic_king on background</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="changeslidesbyclick-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|changeslidesbyclick">Advances to the next slide when you click on the background of a slide.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="animationsallowed"> + <property name="label" translatable="yes" context="presentationdialog|animationsallowed">Enable _animated images</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="animationsallowed-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|animationsallowed">Displays all frames of animated GIF files during the slide show.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="alwaysontop"> + <property name="label" translatable="yes" context="presentationdialog|alwaysontop">Keep Presentation always _on top</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="alwaysontop-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|alwaysontop">The Impress window remains on top during the presentation. No other program will show its window in front of your presentation.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">5</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|label4">Presentation Options</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frameremote"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=2 --> + <object class="GtkGrid" id="grid10"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child> + <object class="GtkCheckButton" id="enableremote"> + <property name="label" translatable="yes" context="presentationdialog|enableremote">Enable remote control</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLinkButton" id="learnmore"> + <property name="label" translatable="yes" context="presentationdialog|learnmore">Download App ...</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="presentationdialog|learnmore|tooltip_text">Download LibreOffice Impress Remote to remotely control the presentation from your smartphone or smartwatch.</property> + <property name="halign">end</property> + <property name="hexpand">True</property> + <property name="relief">none</property> + <property name="uri">https://hub.libreoffice.org/impress-remote</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="enableremoteinsecure"> + <property name="label" translatable="yes" context="presentationdialog|enableremoteinsecure">Enable insecure WiFi connections</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="tooltip-text" translatable="yes" context="presentationdialog|enableremoteinsecure|tooltip_text">In addition to Bluetooth connections, enable insecure and unencrypted connections via IP on all network interfaces. Not recommended in public settings.</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="presentationdialog|label3">Remote control</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child internal-child="accessible"> + <object class="AtkObject" id="PresentationDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|PresentationDialog">Defines settings for your slide show, including which slide to start from, the way you advance the slides, the type of presentation, and pointer options.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroupLabel1"> + <widgets> + <widget name="from"/> + <widget name="allslides"/> + <widget name="customslideshow"/> + <widget name="presdisplay_label"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/prntopts.ui b/sd/uiconfig/simpress/ui/prntopts.ui new file mode 100644 index 0000000000..41d3463a48 --- /dev/null +++ b/sd/uiconfig/simpress/ui/prntopts.ui @@ -0,0 +1,671 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="prntopts"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="prntandpgoptbox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">24</property> + <child> + <object class="GtkFrame" id="frame3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="papertryfrmprntrcb"> + <property name="label" translatable="yes" context="prntopts|papertryfrmprntrcb">Paper tray from printer s_ettings</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="papertryfrmprntrcb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|papertryfrmprntrcb">Determines that the paper tray to be used is the one defined in the printer setup.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="pageoptions"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkRadioButton" id="pagedefaultrb"> + <property name="label" translatable="yes" context="prntopts|pagedefaultrb">Default</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="pagedefaultrb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|pagedefaultrb">Specifies that you do not want to further scale pages when printing.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="fittopgrb"> + <property name="label" translatable="yes" context="prntopts|fittopgrb">_Fit to page</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">pagedefaultrb</property> + <child internal-child="accessible"> + <object class="AtkObject" id="fittopgrb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|fittopgrb">Specifies whether to scale down objects that are beyond the margins of the current printer, so that they fit on the paper in the printer.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="tilepgrb"> + <property name="label" translatable="yes" context="prntopts|tilepgrb">_Tile pages</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">pagedefaultrb</property> + <child internal-child="accessible"> + <object class="AtkObject" id="tilepgrb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|tilepgrb">Specifies that pages are to be printed in tiled format. If the pages or slides are smaller than the paper, several pages or slides will be printed on one page of paper.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="brouchrb"> + <property name="label" translatable="yes" context="prntopts|brouchrb">B_rochure</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">pagedefaultrb</property> + <child internal-child="accessible"> + <object class="AtkObject" id="brouchrb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|brouchrb">Select the Brochure option to print the document in brochure format.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="frontcb"> + <property name="label" translatable="yes" context="prntopts|frontcb">Fr_ont</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="frontcb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|frontcb">Select Front to print the front of a brochure.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="backcb"> + <property name="label" translatable="yes" context="prntopts|backcb">Ba_ck</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="backcb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|backcb">Select Back to print the back of a brochure.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockpageoptions"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockfrontcb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockbackcb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockpapertryfrmprntrcb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="prntopts|label3">Page Options</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="printframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="pagenmcb"> + <property name="label" translatable="yes" context="prntopts|pagenmcb">_Page name</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="pagenmcb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|pagenmcb">Specifies whether to print the page name.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="datecb"> + <property name="label" translatable="yes" context="prntopts|datecb">D_ate</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="datecb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|datecb">Specifies whether to print the current date.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="timecb"> + <property name="label" translatable="yes" context="prntopts|timecb">Ti_me</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="timecb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|timecb">Specifies whether to print the current time.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="hiddenpgcb"> + <property name="label" translatable="yes" context="prntopts|hiddenpgcb">H_idden pages</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="hiddenpgcb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|hiddenpgcb">Specifies whether to print the pages that are hidden from the presentation.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockpagenmcb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockdatecb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="locktimecb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockhiddenpgcb"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="printlbl"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="prntopts|printlbl">Print</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">24</property> + <child> + <object class="GtkFrame" id="qualityframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=3 --> + <object class="GtkGrid" id="grid4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkRadioButton" id="defaultrb"> + <property name="label" translatable="yes" context="prntopts|defaultrb">Default</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="defaultrb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|defaultrb">Specifies that you want to print in original colors.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="grayscalerb"> + <property name="label" translatable="yes" context="prntopts|grayscalerb">Gra_yscale</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">defaultrb</property> + <child internal-child="accessible"> + <object class="AtkObject" id="grayscalerb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|grayscalerb">Specifies that you want to print colors as grayscale.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="blackwhiterb"> + <property name="label" translatable="yes" context="prntopts|blackwhiterb">Black & _white</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">defaultrb</property> + <child internal-child="accessible"> + <object class="AtkObject" id="blackwhiterb-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|blackwhiterb">Specifies that you want to print the document in black and white.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockquality"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="prntopts|label2">Quality</property> + <property name="use-underline">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="contentframe"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkCheckButton" id="drawingcb"> + <property name="label" translatable="yes" context="prntopts|drawingcb">Drawing</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="notecb"> + <property name="label" translatable="yes" context="prntopts|notecb">Notes</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="handoutcb"> + <property name="label" translatable="yes" context="prntopts|handoutcb">Handouts</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="outlinecb"> + <property name="label" translatable="yes" context="prntopts|outlinecb">Outline</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="contentlbl"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="prntopts|contentlbl">Content</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="prntopts-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|prntopts">Specifies print settings within a drawing or presentation document.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup" id="sizegroup1"> + <property name="ignore-hidden">True</property> + <widgets> + <widget name="printframe"/> + <widget name="contentframe"/> + </widgets> + </object> + <object class="GtkSizeGroup" id="sizegroup2"> + <widgets> + <widget name="frame3"/> + <widget name="qualityframe"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/remotedialog.ui b/sd/uiconfig/simpress/ui/remotedialog.ui new file mode 100644 index 0000000000..aefd7f4470 --- /dev/null +++ b/sd/uiconfig/simpress/ui/remotedialog.ui @@ -0,0 +1,167 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="RemoteDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="remotedialog|RemoteDialog">Impress Remote</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="remotedialog|ok">C_onnect</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Close</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkScrolledWindow" id="scroll"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="margin-bottom">6</property> + <property name="margin-end">12</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="tree"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-start">3</property> + <property name="margin-end">3</property> + <property name="margin_top">3</property> + <property name="margin_bottom">3</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="remotedialog|label1">Connections</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">ok</action-widget> + <action-widget response="-7">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="RemoteDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="remotedialog|extended_tip|RemoteDialog">List all Impress Remote available connections.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/rotatemenu.ui b/sd/uiconfig/simpress/ui/rotatemenu.ui new file mode 100644 index 0000000000..49464175dc --- /dev/null +++ b/sd/uiconfig/simpress/ui/rotatemenu.ui @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="90"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="rotatemenu|90">Quarter Spin</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="180"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="rotatemenu|180">Half Spin</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="360"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="rotatemenu|360">Full Spin</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="720"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="rotatemenu|720">Two Spins</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="clockwise"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="rotatemenu|clockwise">Clockwise</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="counterclock"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="rotatemenu|counterclock">Counter-clockwise</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/scalemenu.ui b/sd/uiconfig/simpress/ui/scalemenu.ui new file mode 100644 index 0000000000..152e164d29 --- /dev/null +++ b/sd/uiconfig/simpress/ui/scalemenu.ui @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|25">Tiny</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="50"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|50">Smaller</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="150"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|150">Larger</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="400"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|400">Extra Large</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="hori"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|hori">Horizontal</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="vert"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|vert">Vertical</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="both"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="scalemenu|both">Both</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/sdviewpage.ui b/sd/uiconfig/simpress/ui/sdviewpage.ui new file mode 100644 index 0000000000..608114e88f --- /dev/null +++ b/sd/uiconfig/simpress/ui/sdviewpage.ui @@ -0,0 +1,166 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkFrame" id="SdViewPage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="border-width">6</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="row-spacing">6</property> + <child> + <object class="GtkCheckButton" id="ruler"> + <property name="label" translatable="yes" context="sdviewpage|ruler">_Rulers visible</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="ruler-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|ruler">Specifies whether to display the rulers at the top and to the left of the work area.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="dragstripes"> + <property name="label" translatable="yes" context="sdviewpage|dragstripes">_Helplines while moving</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="dragstripes-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|dragstripes">Specifies whether to display guides when moving an object.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="handlesbezier"> + <property name="label" translatable="yes" context="sdviewpage|handlesbezier">_All control points in Bézier editor</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="handlesbezier-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|handlesbezier">Displays the control points of all Bézier points if you have previously selected a Bézier curve. If the All control points in Bézier editor option is not marked, only the control points of the selected Bézier points will be visible.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="moveoutline"> + <property name="label" translatable="yes" context="sdviewpage|moveoutline">_Contour of each individual object</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="moveoutline-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|moveoutline">The contour line of each individual object is displayed when moving this object.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockruler"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockdragstripes"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockhandlesbezier"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="lockmoveoutline"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="icon-name">res/lock.png</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="sdviewpage|label1">Display</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="SdViewPage-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|SdViewPage">Specifies the available display modes.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/sidebarslidebackground.ui b/sd/uiconfig/simpress/ui/sidebarslidebackground.ui new file mode 100644 index 0000000000..7ed23ec8d6 --- /dev/null +++ b/sd/uiconfig/simpress/ui/sidebarslidebackground.ui @@ -0,0 +1,367 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkListStore" id="liststore4"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + <!-- column-name image --> + <column type="GdkPixbuf"/> + <!-- column-name surface --> + <column type="CairoSurface"/> + </columns> + </object> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="SlideBackgroundPanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <!-- n-columns=2 n-rows=14 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">center</property> + <property name="margin-start">9</property> + <property name="margin-end">15</property> + <property name="hexpand">True</property> + <property name="border-width">6</property> + <property name="row-spacing">3</property> + <property name="column-spacing">6</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="sidebarslidebackground|label2">_Format:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">paperformat</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="sidebarslidebackground|label3">Background:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">fillstyle</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="orientation"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="sidebarslidebackground|orientation">Landscape</item> + <item translatable="yes" context="sidebarslidebackground|orientation">Portrait</item> + </items> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="fillstyle"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="fillattr"> + <property name="width-request">150</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="draw-indicator">True</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="displaymasterobjects"> + <property name="label" translatable="yes" context="sidebarslidebackground|displaymasterobjects">Master Objects</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="hexpand">True</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">11</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="masterslide"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">9</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="masterlabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="ellipsize">end</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">9</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button2"> + <property name="label" translatable="yes" context="sidebarslidebackground|button2">Insert Image...</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">7</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="fillattr1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="model">liststore4</property> + <property name="entry-text-column">0</property> + <property name="id-column">1</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext3"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/> + <attributes> + <attribute name="surface">3</attribute> + </attributes> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">4</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="fillattr2"> + <property name="width-request">150</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="draw-indicator">True</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">5</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="fillattr3"> + <property name="width-request">150</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="valign">center</property> + <property name="hexpand">True</property> + <property name="draw-indicator">True</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">6</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="displaymasterbackground"> + <property name="label" translatable="yes" context="sidebarslidebackground|displaymasterbackground">Master Background</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="hexpand">True</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">10</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="paperformat"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="sidebarslidebackground|label4">Orientation:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">orientation</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkButton" id="masterslidebutton"> + <property name="label" translatable="yes" context="sidebarslidebackground|masterslidebutton">Master View</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="closemasterslide"> + <property name="label" translatable="yes" context="sidebarslidebackground|closemasterslide">Close Master View</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">12</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="marginLB"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="labelmargin"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="sidebarslidebackground|labelmargin">Margin:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">marginLB</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="customlabel"> + <property name="can-focus">False</property> + <property name="no-show-all">True</property> + <property name="label" translatable="yes" context="sidebarslidebackground|customlabel">Custom</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">13</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/slidecontextmenu.ui b/sd/uiconfig/simpress/ui/slidecontextmenu.ui new file mode 100644 index 0000000000..91b5e1b59d --- /dev/null +++ b/sd/uiconfig/simpress/ui/slidecontextmenu.ui @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkMenuItem" id="goto"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|goto">_Go to Slide</property> + <property name="use-underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="gotomenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="pen"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|pen">Mouse Pointer as _Pen</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="width"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|width">_Pen Width</property> + <property name="use-underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="widthmenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkRadioMenuItem" id="4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|4">_Very Thin</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="100"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|100">_Thin</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="150"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|150">_Normal</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="200"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|200">_Thick</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkRadioMenuItem" id="400"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|400">_Very Thick</property> + <property name="use-underline">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="color"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|color">_Change Pen Color...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="erase"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|erase">_Erase All Ink on Slide</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="screen"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|screen">_Screen</property> + <property name="use-underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="screenmenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkCheckMenuItem" id="black"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|black">_Black</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="white"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|white">_White</property> + <property name="use-underline">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="edit"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|edit">E_dit Presentation</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="end"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidecontextmenu|end">_End Show</property> + <property name="use-underline">True</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/slidedesigndialog.ui b/sd/uiconfig/simpress/ui/slidedesigndialog.ui new file mode 100644 index 0000000000..9963735b3d --- /dev/null +++ b/sd/uiconfig/simpress/ui/slidedesigndialog.ui @@ -0,0 +1,216 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="SlideDesignDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="slidedesigndialog|SlideDesignDialog">Available Master Slides</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="load"> + <property name="label" translatable="yes" context="slidedesigndialog|load">_Load...</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="load-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|load">Displays the Load Master Slide dialog, where you can select additional slide designs.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid" id="grid5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <child> + <object class="GtkCheckButton" id="masterpage"> + <property name="label" translatable="yes" context="slidedesigndialog|masterpage">_Exchange background page</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="masterpage-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|masterpage">Applies the background of the selected slide design to all of the slides in your document.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="checkmasters"> + <property name="label" translatable="yes" context="slidedesigndialog|checkmasters">_Delete unused backgrounds</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="checkmasters-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|checkmasters">Deletes unreferenced background slides and presentation layouts from your document.</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="selectwin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport" id="selectwi"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="select"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="slidedesigndialog|label1">Select a Slide Design</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">load</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="SlideDesignDialog-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|SlideDesignDialog">Displays the Available Master Slides dialog, where you can select a layout scheme for the current slide. Any objects in the slide design are inserted behind objects in the current slide.</property> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/slidetransitionspanel.ui b/sd/uiconfig/simpress/ui/slidetransitionspanel.ui new file mode 100644 index 0000000000..6f0c014656 --- /dev/null +++ b/sd/uiconfig/simpress/ui/slidetransitionspanel.ui @@ -0,0 +1,468 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">1000</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">1000</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">sd/res/playblue_16.png</property> + </object> + <object class="GtkBox" id="SlideTransitionsPanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="vexpand">True</property> + <property name="border-width">6</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="vexpand">True</property> + <child> + <object class="GtkScrolledWindow" id="transitions_iconswin"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar-policy">never</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkDrawingArea" id="transitions_icons"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="transitions_icons-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|transitions_icons">Select the slide transition you want to use for the selected slides.</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">3</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="duration_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="slidetransitionspanel|duration_label">Duration:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">transition_duration</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="transition_duration"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="tooltip-text" translatable="yes" context="slidetransitionspanel|transition_duration|tooltip_text">Select the speed of Slide Transition.</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment2</property> + <property name="digits">2</property> + <child internal-child="accessible"> + <object class="AtkObject" id="transition_duration-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|transition_duration">Sets the duration of the slide transition.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="sound_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="slidetransitionspanel|sound_label">Sound:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">sound_list</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="sound_list"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <items> + <item translatable="yes" context="slidetransitionspanel|sound_list">No sound</item> + <item translatable="yes" context="slidetransitionspanel|sound_list">Stop previous sound</item> + <item translatable="yes" context="slidetransitionspanel|sound_list">Other sound...</item> + </items> + <child internal-child="accessible"> + <object class="AtkObject" id="sound_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|sound_list">Lists sounds that can played during the slide transition.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="loop_sound"> + <property name="label" translatable="yes" context="slidetransitionspanel|loop_sound">Loop until next sound</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="loop_sound-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|loop_sound">Select to play the sound repeatedly until another sound starts.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="variant_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes" context="slidetransitionspanel|variant_label">Variant:</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">variant_list</property> + <property name="xalign">1</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="variant_list"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="variant_list-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|variant_list">Select a variation of the transition.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidetransitionspanel|label1">Modify Transition</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <!-- n-columns=2 n-rows=2 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">3</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkRadioButton" id="rb_mouse_click"> + <property name="label" translatable="yes" context="slidetransitionspanel|rb_mouse_click">On mouse click</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="rb_mouse_click-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|rb_mouse_click">Select to advance to the next slide on a mouse click.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rb_auto_after"> + <property name="label" translatable="yes" context="slidetransitionspanel|rb_auto_after">After:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">rb_mouse_click</property> + <accessibility> + <relation type="label-for" target="auto_after_value"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="rb_auto_after-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|rb_auto_after">Select to advance to the next slide after a number of seconds. Enter the seconds in the numerical field next to the spin button, or click the spin button.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="auto_after_value"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="truncate-multiline">True</property> + <property name="adjustment">adjustment1</property> + <property name="digits">2</property> + <accessibility> + <relation type="labelled-by" target="rb_auto_after"/> + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="auto_after_value-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|auto_after_value">Select to advance to the next slide after a number of seconds. Enter the seconds in the numerical field next to the spin button, or click the spin button.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="slidetransitionspanel|label2">Advance Slide</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkButtonBox" id="buttonbox1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="layout-style">center</property> + <child> + <object class="GtkButton" id="apply_to_all"> + <property name="label" translatable="yes" context="slidetransitionspanel|apply_to_all">Apply Transition to All Slides</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="halign">center</property> + <child internal-child="accessible"> + <object class="AtkObject" id="apply_to_all-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|apply_to_all">Applies the selected slide transition to all slides in the current presentation document.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">18</property> + <child> + <object class="GtkCheckButton" id="auto_preview"> + <property name="label" translatable="yes" context="slidetransitionspanel|auto_preview">Automatic Preview</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="auto_preview-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|auto_preview">Select to see the slide transitions automatically in the document.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="play"> + <property name="label" translatable="yes" context="slidetransitionspanel|play">Play</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="slidetransitionspanel|play|tooltip_text">Preview Effect</property> + <property name="image">image1</property> + <property name="use-underline">True</property> + <property name="image-position">right</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="play-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|play">Shows the current slide transition as a preview.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="SlideTransitionsPanel-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|SlideTransitionsPanel">Defines the special effect that plays when you display a slide during a slide show.</property> + </object> + </child> + </object> + <object class="GtkSizeGroup"> + <widgets> + <widget name="duration_label"/> + <widget name="sound_label"/> + <widget name="variant_label"/> + <widget name="rb_auto_after"/> + </widgets> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/snapmenu.ui b/sd/uiconfig/simpress/ui/snapmenu.ui new file mode 100644 index 0000000000..5bb702561d --- /dev/null +++ b/sd/uiconfig/simpress/ui/snapmenu.ui @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/tabledesignpanel.ui b/sd/uiconfig/simpress/ui/tabledesignpanel.ui new file mode 100644 index 0000000000..c820774d1b --- /dev/null +++ b/sd/uiconfig/simpress/ui/tabledesignpanel.ui @@ -0,0 +1,263 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="TableDesignPanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="valign">start</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkCheckButton" id="UseFirstRowStyle"> + <property name="label" translatable="yes" context="tabledesignpanel|UseFirstRowStyle">_Header row</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="UseLastRowStyle"> + <property name="label" translatable="yes" context="tabledesignpanel|UseLastRowStyle">Tot_al row</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="UseBandingRowStyle"> + <property name="label" translatable="yes" context="tabledesignpanel|UseBandingRowStyle">_Banded rows</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="UseFirstColumnStyle"> + <property name="label" translatable="yes" context="tabledesignpanel|UseFirstColumnStyle">Fi_rst column</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="UseLastColumnStyle"> + <property name="label" translatable="yes" context="tabledesignpanel|UseLastColumnStyle">_Last column</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="UseBandingColumnStyle"> + <property name="label" translatable="yes" context="tabledesignpanel|UseBandingColumnStyle">Ba_nded columns</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="previewswin"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="hscrollbar-policy">never</property> + <property name="vscrollbar-policy">never</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkDrawingArea" id="previews"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + <property name="width">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkMenuItem" id="new"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menunew">New</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="clone"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menuclone">Clone</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="delete"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menudelete">Delete</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="reset"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menureset">Reset</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="format"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menuformat">Format</property> + <property name="use-underline">True</property> + <child type="submenu"> + <object class="GtkMenu"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkMenuItem" id="first-row"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menufirstrow">Header row...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="last-row"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menulastrow">Total row...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="odd-rows"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menuoddrows">Banded rows...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="first-column"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menufirstcolumn">First column...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="last-column"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menulastcolumn">Last column...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="odd-columns"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menuoddcolumns">Banded columns...</property> + <property name="use-underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="body"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="tabledesignpanel|menubody">Other cells...</property> + <property name="use-underline">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/tabviewbar.ui b/sd/uiconfig/simpress/ui/tabviewbar.ui new file mode 100644 index 0000000000..8d4f181a1a --- /dev/null +++ b/sd/uiconfig/simpress/ui/tabviewbar.ui @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkBox" id="TabViewBar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin-start">5</property> + <property name="margin_top">3</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">placeholder</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/sd/uiconfig/simpress/ui/templatedialog.ui b/sd/uiconfig/simpress/ui/templatedialog.ui new file mode 100644 index 0000000000..c2f0f738bc --- /dev/null +++ b/sd/uiconfig/simpress/ui/templatedialog.ui @@ -0,0 +1,895 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sd"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="TemplateDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="templatedialog|TemplateDialog">Graphic Styles</property> + <property name="modal">True</property> + <property name="default_width">0</property> + <property name="default_height">0</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="reset"> + <property name="label" translatable="yes" context="stock">_Reset</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="standard"> + <property name="label" translatable="yes" context="templatedialog|standard">_Standard</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label" translatable="yes" context="stock">_OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="help"> + <property name="label" translatable="yes" context="stock">_Help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + <property name="secondary">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="tabcontrol"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="scrollable">True</property> + <property name="enable_popup">True</property> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="organizer"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|organizer">Organizer</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="line"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes" context="templatedialog|line">Line</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="area"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|area">Area</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="shadowing"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes" context="templatedialog|shadowing">Shadowing</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="transparency"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|transparency">Transparency</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">5</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="font"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|font">Font</property> + </object> + <packing> + <property name="position">5</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">6</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="fonteffect"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|fonteffect">Font Effects</property> + </object> + <packing> + <property name="position">6</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">7</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="indents"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|indents">Indents & Spacing</property> + </object> + <packing> + <property name="position">7</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">8</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|text">Text</property> + </object> + <packing> + <property name="position">8</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">9</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="animation"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|animation">Text Animation</property> + </object> + <packing> + <property name="position">9</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">10</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="dimensioning"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|dimensioning">Dimensioning</property> + </object> + <packing> + <property name="position">10</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">11</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="connector"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|connector">Connector</property> + </object> + <packing> + <property name="position">11</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">12</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="alignment"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|alignment">Alignment</property> + </object> + <packing> + <property name="position">12</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">13</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="asiantypo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|asiantypo">Asian Typography</property> + </object> + <packing> + <property name="position">13</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">14</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="tabs"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|tabs">Tabs</property> + </object> + <packing> + <property name="position">14</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <!-- n-columns=1 n-rows=1 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">15</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="background"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="templatedialog|background">Highlighting</property> + </object> + <packing> + <property name="position">6</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="101">reset</action-widget> + <action-widget response="102">standard</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sd/util/sd.component b/sd/util/sd.component new file mode 100644 index 0000000000..24f54893bb --- /dev/null +++ b/sd/util/sd.component @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.comp.Draw.DrawingDocument" + constructor="sd_DrawingDocument_get_implementation"> + <service name="com.sun.star.drawing.DrawingDocument"/> + <service name="com.sun.star.drawing.DrawingDocumentFactory"/> + </implementation> + <implementation name="com.sun.star.comp.Draw.DrawingModule" + constructor="com_sun_star_comp_Draw_DrawingModule_get_implementation"> + <service name="com.sun.star.drawing.ModuleDispatcher"/> + </implementation> + <implementation name="com.sun.star.comp.Draw.PresentationDocument" + constructor="sd_PresentationDocument_get_implementation"> + <service name="com.sun.star.drawing.DrawingDocumentFactory"/> + <service name="com.sun.star.presentation.PresentationDocument"/> + </implementation> + <implementation name="com.sun.star.comp.Draw.PresenterHelper" + constructor="com_sun_star_comp_Draw_PresenterHelper_get_implementation"> + <service name="com.sun.star.drawing.PresenterHelper"/> + </implementation> + <implementation name="com.sun.star.comp.Draw.PresenterPreviewCache" + constructor="com_sun_star_comp_Draw_PresenterPreviewCache_get_implementation"> + <service name="com.sun.star.drawing.PresenterPreviewCache"/> + </implementation> + <implementation name="com.sun.star.comp.Draw.SlideRenderer" + constructor="com_sun_star_comp_Draw_SlideRenderer_get_implementation"> + <service name="com.sun.star.drawing.SlideRenderer"/> + </implementation> + <implementation name="com.sun.star.comp.Draw.framework.ResourceId" + constructor="com_sun_star_comp_Draw_framework_ResourceID_get_implementation"> + <service name="com.sun.star.drawing.framework.ResourceId"/> + </implementation> + <implementation name="org.openoffice.comp.Draw.framework.PanelFactory" + constructor="org_openoffice_comp_Draw_framework_PanelFactory_get_implementation"> + <service name="com.sun.star.drawing.framework.PanelFactory"/> + </implementation> + <implementation name="com.sun.star.comp.sd.InsertSlideController" + constructor="com_sun_star_comp_sd_InsertSlideController_get_implementation"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> + <implementation name="com.sun.star.comp.sd.SlideLayoutController" + constructor="com_sun_star_comp_sd_SlideLayoutController_get_implementation"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> + <implementation name="com.sun.star.comp.sd.DisplayModeController" + constructor="com_sun_star_comp_sd_DisplayModeController_get_implementation"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> + <implementation name="sd::RandomAnimationNode" + constructor="RandomAnimationNode_get_implementation"> + <service name="com.sun.star.comp.sd.RandomAnimationNode"/> + </implementation> + <implementation name="com.sun.star.comp.Impress.oox.PowerPointExport" + constructor="css_comp_Impress_oox_PowerPointExport"/> +</component> diff --git a/sd/util/sdd.component b/sd/util/sdd.component new file mode 100644 index 0000000000..c3e25b2f1b --- /dev/null +++ b/sd/util/sdd.component @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.comp.draw.FormatDetector" + constructor="com_sun_star_comp_draw_FormatDetector_get_implementation"> + <service name="com.sun.star.frame.ExtendedTypeDetection"/> + </implementation> +</component> diff --git a/sd/workben/custompanel/ctp_panel.cxx b/sd/workben/custompanel/ctp_panel.cxx new file mode 100644 index 0000000000..ac17493588 --- /dev/null +++ b/sd/workben/custompanel/ctp_panel.cxx @@ -0,0 +1,215 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ctp_panel.hxx" + +#include <com/sun/star/drawing/framework/XPane.hpp> +#include <com/sun/star/lang/DisposedException.hpp> +#include <com/sun/star/awt/XWindowPeer.hpp> +#include <com/sun/star/awt/WindowClass.hpp> +#include <com/sun/star/awt/WindowAttribute.hpp> +#include <com/sun/star/awt/PosSize.hpp> +#include <com/sun/star/awt/XDevice.hpp> +#include <com/sun/star/awt/XGraphics.hpp> + +#include <comphelper/diagnose_ex.hxx> + +namespace sd::colortoolpanel +{ + + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Type; + using ::com::sun::star::drawing::framework::XConfigurationController; + using ::com::sun::star::drawing::framework::XResourceId; + using ::com::sun::star::uno::XComponentContext; + using ::com::sun::star::drawing::framework::XPane; + using ::com::sun::star::awt::XWindow; + using ::com::sun::star::lang::DisposedException; + using ::com::sun::star::awt::XWindowPeer; + using ::com::sun::star::lang::XMultiComponentFactory; + using ::com::sun::star::awt::WindowDescriptor; + using ::com::sun::star::awt::WindowClass_SIMPLE; + using ::com::sun::star::awt::Rectangle; + using ::com::sun::star::awt::PaintEvent; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::awt::XDevice; + using ::com::sun::star::awt::XGraphics; + using ::com::sun::star::accessibility::XAccessible; + + namespace WindowAttribute = ::com::sun::star::awt::WindowAttribute; + namespace PosSize = ::com::sun::star::awt::PosSize; + + //= helpers + + namespace + { + Reference< XWindow > lcl_createPlainWindow_nothrow( const Reference< XComponentContext >& i_rContext, + const Reference< XWindowPeer >& i_rParentWindow ) + { + try + { + ENSURE_OR_THROW( i_rContext.is(), "illegal component context" ); + Reference< XMultiComponentFactory > xFactory( i_rContext->getServiceManager(), UNO_SET_THROW ); + Reference< XToolkit2 > xToolkit = Toolkit::create(i_rContext); + + WindowDescriptor aWindow; + aWindow.Type = WindowClass_SIMPLE; + aWindow.WindowServiceName = "window"; + aWindow.Parent = i_rParentWindow; + aWindow.WindowAttributes = WindowAttribute::BORDER; + + Reference< XWindowPeer > xWindow( xToolkit->createWindow( aWindow ), UNO_SET_THROW ); + return Reference< XWindow >( xWindow, UNO_QUERY_THROW ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + return NULL; + } + } + + //= class SingleColorPanel + + SingleColorPanel::SingleColorPanel( const Reference< XComponentContext >& i_rContext, + const Reference< XConfigurationController >& i_rConfigController, const Reference< XResourceId >& i_rResourceId ) + :SingleColorPanel_Base( m_aMutex ) + ,m_xContext( i_rContext ) + ,m_xResourceId( i_rResourceId ) + ,m_xWindow() + { + ENSURE_OR_THROW( i_rConfigController.is(), "invalid configuration controller" ); + ENSURE_OR_THROW( m_xResourceId.is(), "invalid resource id" ); + + // retrieve the parent window for our to-be-created pane window + Reference< XWindow > xParentWindow; + Reference< XWindowPeer > xParentPeer; + try + { + Reference< XResource > xAnchor( i_rConfigController->getResource( m_xResourceId->getAnchor() ), UNO_SET_THROW ); + Reference< XPane > xAnchorPane( xAnchor, UNO_QUERY_THROW ); + xParentWindow.set( xAnchorPane->getWindow(), UNO_SET_THROW ); + xParentPeer.set( xParentWindow, UNO_QUERY_THROW ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + osl_atomic_increment( &m_refCount ); + if ( xParentWindow.is() ) + { + m_xWindow = lcl_createPlainWindow_nothrow( m_xContext, xParentPeer ); + m_xWindow->addPaintListener( this ); + if ( m_xWindow.is() ) + { + const Rectangle aPanelAnchorSize( xParentWindow->getPosSize() ); + m_xWindow->setPosSize( 0, 0, aPanelAnchorSize.Width, aPanelAnchorSize.Height, PosSize::POSSIZE ); + m_xWindow->setVisible( sal_True ); + } + } + osl_atomic_decrement( &m_refCount ); + } + + SingleColorPanel::~SingleColorPanel() + { + } + + Reference< XWindow > SAL_CALL SingleColorPanel::getWindow( ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + if ( !m_xWindow.get() ) + throw DisposedException( OUString(), *this ); + return m_xWindow; + } + + Reference< XAccessible > SAL_CALL SingleColorPanel::createAccessible( const Reference< XAccessible >& i_rParentAccessible ) throw (RuntimeException) + { + (void)i_rParentAccessible; + return Reference< XAccessible >( m_xWindow, UNO_QUERY ); + // TODO: this is, strictly, not correct, as we ignore i_ParentAccessible here. If you are not doing a sample + // extension only, you'll want to do this correctly... + } + + Reference< XResourceId > SAL_CALL SingleColorPanel::getResourceId( ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + if ( !m_xWindow.is() ) + throw DisposedException( OUString(), *this ); + return m_xResourceId; + } + + sal_Bool SAL_CALL SingleColorPanel::isAnchorOnly( ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + if ( !m_xWindow.is() ) + throw DisposedException( OUString(), *this ); + return sal_False; + } + + void SAL_CALL SingleColorPanel::windowPaint( const PaintEvent& i_rEvent ) throw (RuntimeException) + { + try + { + const Reference< XDevice > xDevice( i_rEvent.Source, UNO_QUERY_THROW ); + const Reference< XGraphics > xGraphics( xDevice->createGraphics(), UNO_SET_THROW ); + xGraphics->setFillColor( 0x80 << 8 ); + xGraphics->setLineColor( 0x80 << 16 ); + + const Reference< XWindow > xWindow( i_rEvent.Source, UNO_QUERY_THROW ); + const Rectangle aWindowRect( xWindow->getPosSize() ); + xGraphics->drawRect( 0, 0, aWindowRect.Width - 1, aWindowRect.Height - 1 ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + } + + void SAL_CALL SingleColorPanel::disposing( const EventObject& i_rSource ) throw (RuntimeException) + { + (void)i_rSource; + } + + void SAL_CALL SingleColorPanel::disposing() + { + ::osl::MutexGuard aGuard( m_aMutex ); + if ( !m_xWindow.is() ) + // already disposed + return; + m_xWindow->removePaintListener( this ); + try + { + Reference< XComponent > xWindowComp( m_xWindow, UNO_QUERY_THROW ); + xWindowComp->dispose(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sd"); + } + m_xWindow.clear(); + } + +} } // namespace sd::colortoolpanel + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/workben/custompanel/ctp_panel.hxx b/sd/workben/custompanel/ctp_panel.hxx new file mode 100644 index 0000000000..a6d970693b --- /dev/null +++ b/sd/workben/custompanel/ctp_panel.hxx @@ -0,0 +1,82 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <com/sun/star/drawing/framework/XView.hpp> +#include <com/sun/star/ui/XToolPanel.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/drawing/framework/XConfigurationController.hpp> +#include <com/sun/star/drawing/framework/XResourceId.hpp> +#include <com/sun/star/awt/XPaintListener.hpp> + +#include <cppuhelper/compbase.hxx> +#include <cppuhelper/basemutex.hxx> + +#include <memory> + +namespace sd::colortoolpanel +{ + + typedef ::cppu::WeakComponentImplHelper < css::drawing::framework::XView + , css::ui::XToolPanel + , css::awt::XPaintListener + > SingleColorPanel_Base; + class SingleColorPanel :public ::cppu::BaseMutex + ,public SingleColorPanel_Base + { + public: + SingleColorPanel( + const css::uno::Reference< css::uno::XComponentContext >& i_rContext, + const css::uno::Reference< css::drawing::framework::XConfigurationController >& i_rConfigController, + const css::uno::Reference< css::drawing::framework::XResourceId >& i_rResourceId + ); + + // XToolPanel + virtual css::uno::Reference< css::awt::XWindow > SAL_CALL getWindow( ) throw (css::uno::RuntimeException); + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL createAccessible( const css::uno::Reference< css::accessibility::XAccessible >& ParentAccessible ) throw (css::uno::RuntimeException); + + // XView + // (no methods) + + // XResource + virtual css::uno::Reference< css::drawing::framework::XResourceId > SAL_CALL getResourceId( ) throw (css::uno::RuntimeException); + virtual sal_Bool SAL_CALL isAnchorOnly( ) throw (css::uno::RuntimeException); + + // XPaintListener + virtual void SAL_CALL windowPaint( const css::awt::PaintEvent& e ) throw (css::uno::RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) throw (css::uno::RuntimeException); + + // XComponent equivalents + virtual void SAL_CALL disposing(); + + protected: + ~SingleColorPanel(); + + private: + css::uno::Reference< css::uno::XComponentContext > m_xContext; + css::uno::Reference< css::drawing::framework::XResourceId > m_xResourceId; + css::uno::Reference< css::awt::XWindow > m_xWindow; + }; + +} } // namespace sd::colortoolpanel + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/workben/testdll/makefile b/sd/workben/testdll/makefile new file mode 100644 index 0000000000..5949866533 --- /dev/null +++ b/sd/workben/testdll/makefile @@ -0,0 +1,91 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +PRJ=.. + +PRJNAME=test +TARGET=tst + +# --- Settings ----------------------------------------------------- + +!INCLUDE <svpre.mak> +!INCLUDE <settings.mak> +!INCLUDE <sv.mak> + +# --- Files -------------------------------------------------------- + +CXXFILES= \ + test.cxx +SLOFILES= \ + $(SLO)\test.obj +#SRC1FILES= +#SRS1NAME= +#SRSFILES= $(SRS)\ +#SRC2FILES= +#SRS2NAME= + +#RESLIB1NAME=tst +#RESLIB1SRSFILES=\ +# $(SRS)\ +# $(SOLARRESDIR)\ + +SHL1TARGET= $(TARGET)$(DLLPOSTFIX) +#SHL1LIBS=$(SLB)\$(TARGET).lib + +!IF "$(COM)"!="WTC" +SHL1STDLIBS=tools.lib $(SVLIB) usr.lib +!ELSE +SHL1STDLIBS=tools.lib libr sv.lib libr isv.lib libr usr.lib +!ENDIF + +SHL1DEPN= $(L)tools.lib $(SVLIBDEPEND) +SHL1DEF= $(MISC)\$(SHL1TARGET).def +SHL1IMPLIB=$(TARGET) +#SHL1RES= $(RES)\$(TARGET).res +SHL1OBJS= $(SLO)\test.obj + +# --- Targets ------------------------------------------------------ +!INCLUDE <target.mak> + +!IF "$(OS)" == "WNT" + +$(MISC)\$(SHL1TARGET).def: makefile + @echo ------------------------------ + @echo Making: $@ + @echo LIBRARY $(SHL1TARGET) >$@ + @echo DESCRIPTION 'StarOne Test-DLL' >>$@ + @echo DATA READ WRITE NONSHARED >>$@ + @echo EXPORTS >>$@ + @echo CreateWindow @2 >>$@ +!ENDIF + +!IF "$(GUI)" == "WIN" + +$(MISC)\$(SHL1TARGET).def: makefile + @echo ------------------------------ + @echo Making: $@ + @echo LIBRARY $(SHL1TARGET) >$@ + @echo DESCRIPTION 'StarOne Test-DLL' >>$@ + @echo EXETYPE WINDOWS >>$@ + @echo PROTMODE >>$@ + @echo CODE LOADONCALL MOVEABLE DISCARDABLE >>$@ + @echo DATA PRELOAD MOVEABLE SINGLE >>$@ + @echo HEAPSIZE 0 >>$@ + @echo EXPORTS >>$@ + @echo _CreateWindow @2 >>$@ +!ENDIF diff --git a/sd/xml/effects.xml b/sd/xml/effects.xml new file mode 100644 index 0000000000..973cac85b6 --- /dev/null +++ b/sd/xml/effects.xml @@ -0,0 +1,2699 @@ +<?xml version="1.0"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<anim:seq xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:smil="http://www.w3.org/2001/SMIL20" xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" pres:node-type="main-sequence"> + + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-appear"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-venetian-blinds" pres:preset-sub-type="vertical"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="horizontal"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-venetian-blinds" pres:preset-sub-type="horizontal"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="vertical"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-box" pres:preset-sub-type="in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-box" pres:preset-sub-type="out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-checkerboard" pres:preset-sub-type="across"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="across"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-checkerboard" pres:preset-sub-type="downward"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="down"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-circle" pres:preset-sub-type="in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-circle" pres:preset-sub-type="out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-oval" pres:preset-sub-type="in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="vertical" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-oval" pres:preset-sub-type="out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="vertical"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diamond" pres:preset-sub-type="in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diamond" pres:preset-sub-type="out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-dissolve-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="dissolve"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-flash-once"> + <anim:set smil:begin="0" smil:dur="1" smil:attributeName="visibility" smil:to="visible"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-bottom-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-bottom-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-top-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-top-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromBottom"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromLeft"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromRight"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromTop"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-plus" pres:preset-sub-type="in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-plus" pres:preset-sub-type="out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-random-bars" pres:preset-sub-type="vertical"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="horizontal"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-random-bars" pres:preset-sub-type="horizontal"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="vertical"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-random"/> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="horizontal-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="horizontal-out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="vertical-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="vertical-out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="left-to-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="left-to-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="right-to-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="right-to-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wedge"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="fanWipe" smil:subtype="centerTop"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-clock-wipe" pres:preset-sub-type="clockwise"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="clockWipe" smil:subtype="clockwiseTwelve"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-clock-wipe" pres:preset-sub-type="counter-clockwise"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="clockWipe" smil:subtype="clockwiseTwelve" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="1"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="oneBlade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="2"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="twoBladeVertical"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="3"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="threeBlade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="4"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="fourBlade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="8"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="eightBlade"/> + </anim:par> + </anim:par> + </anim:par> + +<!-- ooo-entrance-snake-wipe --> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-top-left-horizontal"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftHorizontal"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-top-left-vertical"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftVertical"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-bottom-right-vertical"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftVertical" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-bottom-right-horizontal"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftHorizontal" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + +<!-- ooo-entrance-spiral-wipe --> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-top-left-clockwise"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topLeftClockwise"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-top-right-counter-clockwise"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topRightCounterClockwise"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-center-clockwise"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topLeftClockwise" smil:direction="reverse"/>/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-center-counter-clockwise"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topRightCounterClockwise" smil:direction="reverse"/>/> + </anim:par> + </anim:par> + </anim:par> + +<!-- ooo-entrance-wipe --> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-expand"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="width*0.70;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fade-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fade-in-and-swivel" anim:iterate-type="by-letter" anim:iterate-interval="0.2s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="width" smil:values="0;1" smil:keyTimes="0;1" anim:formula="width*sin(2.5*pi*$)"/> + <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fade-in-and-zoom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-ascend"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y+.1;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-center-revolve"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="0.4" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.4" smil:fill="hold" smil:attributeName="y" smil:values="y+0.31;y+0.31" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.4" smil:dur="0.6" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="x" smil:values="x;x+0.0242;x+0.0479;x+0.0704;x+0.0911;x+0.1096;x+0.1254;x+0.1381;x+0.1474;x+0.1531;x+0.1550;x+0.1531;x+0.1474;x+0.1381;x+0.1254;x+0.1096;x+0.0911;x+0.0704;x+0.0479;x+0.0242;x" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:animate smil:begin="0.4" smil:dur="0.6" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="y" smil:values="y+0.31;y+0.308;y+0.3024;y+0.2931;y+0.2804;y+0.2646;y+0.2461;y+0.2253;y+0.2029;y+0.1792;y+0.155;y+0.1307;y+0.1071;y+0.0846;y+0.0639;y+0.0454;y+0.0296;y+0.0169;y+0.0076;y+0.0019;y" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-colored-lettering" anim:iterate-type="by-letter" anim:iterate-interval="0.04s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.08" smil:attributeName="color" smil:values="#333399;#009999" smil:keyTimes="0;0.5" smil:calcMode="discrete"/> + <anim:animate smil:dur="0.08" smil:attributeName="fill-color" smil:values="#333399;#009999" smil:keyTimes="0;0.5" smil:calcMode="discrete"/> + <anim:set smil:dur="0.08" smil:attributeName="fill" smil:to="solid"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-compress"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="width+.3;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-descend"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y-.1;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-ease-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x-.2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="barWipe" smil:subtype="leftToRight" smil:direction="reverse"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-turn-and-grow" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="rotate" smil:values="90;0" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-rise-up"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.9" smil:fill="hold" smil:decelerate="1" smil:attributeName="y" smil:values="y+1;y-.03" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.9" smil:dur="0.1" smil:fill="hold" smil:accelerate="1" smil:attributeName="y" smil:values="y-.03;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spin-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="rotate" smil:values="360;0" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="across"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="downward"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-bottom"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y+height/2;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-top"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y-height/2;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-top-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y-height/2;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-bottom-right"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x+width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y+height/2;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-top-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y-height/2;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-bottom-left"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-width/2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y+height/2;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-unfold" anim:iterate-type="by-letter" anim:iterate-interval="0.1s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x-.1;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="in-from-screen-center"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0.5;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0.5;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="in-slightly"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="2/3*width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="2/3*height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="out"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="4*width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="4*height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="out-from-screen-center"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="(6*min(max(width*height,.3),1)-7.4)/-.7*width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="(6*min(max(width*height,.3),1)-7.4)/-.7*height;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0.5;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+(6*min(max(width*height,.3),1)-7.4)/-.7*height/2;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="out-slightly"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="4/3*width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="4/3*height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-boomerang"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="rotate" smil:values="-90;0" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="width" smil:values="width;width*.05" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:fill="hold" smil:accelerate="0.5" smil:attributeName="width" smil:values="width*.05;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="x" smil:values="x+.4;x" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="y" smil:values="y-.2;y+.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:fill="hold" smil:accelerate="0.5" smil:attributeName="y" smil:values="y+.1;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:begin="0" smil:dur="1" smil:decelerate="0.5" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-bounce"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:begin="0" smil:dur="0.58" smil:type="barWipe" smil:subtype="topToBottom"/> + <anim:animate smil:begin="0" smil:dur="1.822" smil:attributeName="x" smil:values="x-0.25;x" smil:keyTimes="0;1" smil:keySplines="0,0;0.14,0.36;0.43,0.73;0.71,0.91;1,1"/> + <anim:animate smil:begin="0" smil:dur="0.664" smil:attributeName="y" smil:values="0.5;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/3" smil:keySplines="0,0;0.25,0.07;0.5,0.2;0.75,0.467;1,1"/> + <anim:animate smil:begin="0.664" smil:dur="0.664" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/9" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/> + <anim:animate smil:begin="1.324" smil:dur="0.332" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/27" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/> + <anim:animate smil:begin="1.656" smil:dur="0.164" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/81" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/> + <anim:animateTransform smil:begin="0.65" smil:dur="0.026" smil:to="1,0.6" svg:type="scale"/> + <anim:animateTransform smil:begin="0.676" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:animateTransform smil:begin="1.312" smil:dur="0.026" smil:to="1,0.8" svg:type="scale"/> + <anim:animateTransform smil:begin="1.338" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:animateTransform smil:begin="1.642" smil:dur="0.026" smil:to="1,0.9" svg:type="scale"/> + <anim:animateTransform smil:begin="1.668" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:animateTransform smil:begin="1.808" smil:dur="0.026" smil:to="1,0.95" svg:type="scale"/> + <anim:animateTransform smil:begin="1.834" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-movie-credits"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="15" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="15" smil:fill="hold" smil:attributeName="y" smil:values="y+1;y-1" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-curve-up"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animateTransform smil:begin="0" smil:dur="1" smil:fill="hold" smil:decelerate="0.5" smil:from="2.5,2.5" smil:to="1,1" svg:type="scale"/> + <anim:animateMotion smil:begin="0" smil:dur="1" smil:fill="hold" smil:decelerate="0.5" svg:path="M -0.46736 0.92887 C -0.37517 0.88508 -0.02552 0.75279 0.0908 0.66613 C 0.20747 0.57948 0.21649 0.50394 0.23177 0.40825 C 0.24705 0.31256 0.22118 0.15964 0.18264 0.09152 C 0.1441 0.02341 0.03802 0.0 0.0 0.0"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-flip" anim:iterate-type="by-letter" anim:iterate-interval="0.1s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="width" smil:by="(-width*2)"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="x" smil:by="(width*0.50)"/> + <anim:animate smil:begin="0" smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:from="(-height/2)" smil:to="(y)"/> + <anim:animateTransform smil:begin="0" smil:dur="1" smil:fill="hold" smil:by="360" svg:type="rotate"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-float"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.8" smil:decelerate="1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="0.8" smil:fill="hold" smil:decelerate="1" smil:attributeName="rotate" smil:values="-90;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.8" smil:fill="hold" smil:decelerate="1" smil:attributeName="x" smil:values="x+0.4;x-0.05" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.8" smil:fill="hold" smil:decelerate="1" smil:attributeName="y" smil:values="y-0.4;y+0.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.8" smil:dur="0.2" smil:fill="hold" smil:accelerate="1" smil:attributeName="x" smil:values="x-0.05;x" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.8" smil:dur="0.2" smil:fill="hold" smil:accelerate="1" smil:attributeName="y" smil:values="y+0.1;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:text-only="true" smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fold"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width*2.5;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height*0.01;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="height+1;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-glide"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width*0.05;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-.2;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-breaks"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:begin="0" smil:dur="0.6" smil:fill="hold" smil:attributeName="x" smil:from="(-width/2)" smil:to="(x)"/> + <anim:animate smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="skewX" smil:from="0" smil:to="-1"/> + <anim:animateTransform smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:decelerate="1" smil:autoReverse="true" smil:from="1,1" smil:to="0.8,1" svg:type="scale"/> + <anim:animate smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:decelerate="1" smil:autoReverse="true" smil:attributeName="x" smil:by="(height/3+width*0.1)" smil:additive="sum"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-magnify"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="0.77" smil:decelerate="1" smil:type="fade" smil:subtype="crossfade"/> + <anim:animateTransform smil:dur="0.77" smil:decelerate="1" smil:from="0.1,0.1" smil:to="2,4.5" svg:type="scale"/> + <anim:animateTransform smil:begin="0.77" smil:dur="1.23" smil:fill="hold" smil:accelerate="1" smil:from="2,4.5" smil:to="1,1" svg:type="scale"/> + <anim:set smil:dur="0.77" smil:fill="hold" smil:attributeName="x" smil:to="(0.5)"/> + <anim:animate smil:begin="0.77" smil:dur="1.23" smil:fill="hold" smil:accelerate="1" smil:attributeName="x" smil:from="(0.5)" smil:to="(x)"/> + <anim:set smil:dur="0.77" smil:fill="hold" smil:attributeName="y" smil:to="(y+0.4)"/> + <anim:animate smil:begin="0.77" smil:dur="1.23" smil:fill="hold" smil:accelerate="1" smil:attributeName="y" smil:from="(y+0.4)" smil:to="(y)"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-pinwheel"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade"/> + <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="rotate" smil:values="720;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-sling"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="rotate" smil:values="90;90;90;0" smil:keyTimes="0;0.8;0.8;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="-1;0.949999988079071;x" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-in"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="0;1" smil:keyTimes="0;1" anim:formula="x+(cos(-2*pi*(1-$))*-x-sin(-2*pi*(1-$))*(1-y))*(1-$)"/> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y+(sin(-2*pi*(1-$))*-x+cos(-2*pi*(1-$))*(1-y))*(1-$)"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" smil:accelerate="0.5" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-falling-in" anim:iterate-type="by-letter" anim:iterate-interval="0.5s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:set smil:begin="0" smil:dur="0.455" smil:fill="hold" smil:attributeName="rotate" smil:to="-45"/> + <anim:animate smil:begin="0.455" smil:dur="0.455" smil:fill="hold" smil:attributeName="rotate" smil:values="-45;45;0" smil:keyTimes="0;0.699;1"/> + <anim:animate smil:begin="0" smil:dur="0.455" smil:fill="hold" smil:attributeName="y" smil:values="y-1;y-(0.354*width-0.172*height)" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.455" smil:dur="0.156" smil:fill="hold" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="y" smil:values="y-(0.354*width-0.172*height);y-(0.354*width-0.172*height)-height/2" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.864" smil:dur="0.136" smil:fill="hold" smil:attributeName="y" smil:values="y-(0.354*width-0.172*height);y" smil:keyTimes="0;1"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-swivel" pres:preset-sub-type="vertical"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="width" smil:values="0;1" smil:keyTimes="0;1" anim:formula="width*sin(2.5*pi*$)"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-swivel" pres:preset-sub-type="horizontal"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="height" smil:values="0;1" smil:keyTimes="0;1" anim:formula="height*sin(2.5*pi*$)"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-thread"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height/20;height/20;height" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width+.3;width+.3;width" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-.3;x;x" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-whip" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x+.1;x" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height/10;height+.01;height" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width/10;width+.01;width" smil:keyTimes="0;0.5;1"/> + <anim:transitionFilter smil:dur="0.5" smil:keySplines="0,0;0.5,1;1,1" smil:type="fade" smil:subtype="crossfade"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="FillColor;ColorStyle;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-fill-color" pres:preset-sub-type="2"> + <anim:animateColor smil:dur="2" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="2" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="FontStyle" pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font"> + <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-family" smil:to="Times New Roman"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="CharColor;ColorStyle;Accelerate;Decelerate;AutoReverse" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font-color" pres:preset-sub-type="2"> + <anim:animateColor smil:dur="2" smil:fill="hold" anim:sub-item="text" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="CharHeight" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font-size" pres:preset-sub-type="2"> + <anim:animate smil:dur="2" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-size" smil:to="1.5pt"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="CharDecoration" pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font-style" pres:preset-sub-type="1"> + <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-style" smil:to="normal"/> + <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-weight" smil:to="bold"/> + <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="text-underline" smil:to="none"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="LineColor;ColorStyle;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-line-color" pres:preset-sub-type="2"> + <anim:animateColor smil:dur="2" smil:fill="hold" smil:attributeName="stroke-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="2" smil:fill="hold" smil:attributeName="stroke" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Scale;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-grow-and-shrink"> + <anim:animateTransform smil:dur="2" smil:fill="hold" smil:by="1.5,1.5" svg:type="scale"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Rotate;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-spin"> + <anim:animateTransform smil:dur="2" smil:fill="hold" smil:by="360" svg:type="rotate"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Transparency" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-transparency"> + <anim:set smil:dur="indefinite" smil:attributeName="opacity" smil:to="0.5"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-bold-flash"> + <anim:animate smil:dur="2" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-weight" smil:values="normal;bold;normal;normal" smil:keyTimes="0;0.5;0.6;1" smil:calcMode="discrete"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:preset-property="Color" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-color-over-by-word" anim:iterate-type="by-letter" anim:iterate-interval="0.2s"> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:to="#333399"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-reveal-underline" anim:iterate-type="by-letter" anim:iterate-interval="0.2s"> + <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="text-underline" smil:to="solid"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-color-blend"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:preset-property="Color" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-color-over-by-letter" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:set smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="color" smil:to="#333399"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill-color" smil:to="#333399"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill" smil:to="solid"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-complementary-color"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-complementary-color-2"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(-120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(-120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(-120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-contrasting-color"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(180,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(180,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(180,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-darken"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(0,-12%,-25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(0,-12%,-25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(0,-12%,-25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-desaturate"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(0,-70%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(0,-70%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(0,-70%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-flash-bulb"> + <anim:transitionFilter smil:dur="0.5" smil:keySplines="0,0;0.2,0.5;0.8,0.5;1,0" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animateTransform smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:by="1.05,1.05" svg:type="scale"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-lighten"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(0,12%,25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(0,12%,25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(0,12%,25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="remove" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-vertical-highlight"> + <anim:animateColor smil:begin="0" smil:dur="1.5" smil:fill="hold" smil:accelerate="0.5" smil:autoReverse="true" smil:attributeName="color" smil:to="#333399" smil:keySplines="0,0;0.33333,1;1,1" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:begin="0" smil:dur="1.5" smil:fill="hold" smil:accelerate="0.5" smil:autoReverse="true" smil:attributeName="fill-color" smil:to="#333399" smil:keySplines="0,0;0.33333,1;1,1" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="3" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + <anim:animateTransform smil:begin="0" smil:dur="1.5" smil:fill="hold" smil:accelerate="0.5" smil:autoReverse="true" smil:from="1,1" smil:to="1,1.4" smil:keySplines="0,0;0.33333,1;1,1" svg:type="scale"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-flicker"> + <anim:animateColor smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="color" smil:to="#ffffff" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill-color" smil:to="#ffffff" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:preset-property="Color" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-grow-with-color" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:animateColor smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="fill" smil:to="solid"/> + <anim:animate smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-size" smil:to="1.5pt"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-shimmer" anim:iterate-type="by-letter" anim:iterate-interval="0.025s"> + <anim:animateTransform smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:to="0.8,1" svg:type="scale"/> + <anim:animate smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="x" smil:by="(width*0.10)"/> + <anim:animate smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="y" smil:by="(-width*0.10)"/> + <anim:animateTransform smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:by="-8" svg:type="rotate"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-teeter"> + <anim:animateColor smil:dur="0.1" smil:fill="hold" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:dur="0.1" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:dur="0.1" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + <anim:animateTransform smil:begin="0" smil:dur="0.1" smil:fill="hold" smil:by="2" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.2" smil:dur="0.2" smil:fill="hold" smil:by="-4" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.4" smil:dur="0.2" smil:fill="hold" smil:by="4" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:by="-4" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.8" smil:dur="0.2" smil:fill="hold" smil:by="2" svg:type="rotate"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-blast"> + <anim:animateColor smil:begin="0.1" smil:dur="1.9" smil:fill="hold" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:animateColor smil:begin="0.1" smil:dur="1.9" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/> + <anim:set smil:begin="0.1" smil:dur="1.9" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/> + <anim:animateTransform smil:begin="0" smil:dur="0.2" smil:fill="hold" smil:from="1,1" smil:to="1,0.05" svg:type="scale"/> + <anim:animateTransform smil:begin="0.2" smil:dur="0.2" smil:fill="hold" smil:from="1,0.05" smil:to="1.2,1.5" svg:type="scale"/> + <anim:animateTransform smil:begin="1.4" smil:dur="0.6" smil:fill="hold" smil:to="1.2,1.5" svg:type="scale"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-blink"> + <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="visibility" smil:values="hidden;visible" smil:keyTimes="0;0.5" smil:calcMode="discrete"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-bold-reveal" anim:iterate-type="by-letter" anim:iterate-interval="0.025s"> + <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-weight" smil:to="bold"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Color" pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-style-emphasis"> + <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="color" smil:to="#333399"/> + <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-style" smil:to="italic"/> + <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-weight" smil:to="bold"/> + <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="text-underline" smil:to="solid"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-wave" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:animateMotion smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" smil:autoReverse="true" svg:path="M 0.0 0.0 L 0.0 -0.07213"/> + <anim:animateTransform smil:begin="0" smil:dur="0.125" smil:fill="hold" smil:by="25" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.125" smil:dur="0.125" smil:fill="hold" smil:by="-25" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.25" smil:dur="0.125" smil:fill="hold" smil:by="-25" svg:type="rotate"/> + <anim:animateTransform smil:begin="0.375" smil:dur="0.125" smil:fill="hold" smil:by="25" svg:type="rotate"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-venetian-blinds" pres:preset-sub-type="vertical"> + <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="horizontal" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-venetian-blinds" pres:preset-sub-type="horizontal"> + <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="vertical" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-box" pres:preset-sub-type="in"> + <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-box" pres:preset-sub-type="out"> + <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-checkerboard" pres:preset-sub-type="across"> + <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="across" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-checkerboard" pres:preset-sub-type="downward"> + <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="down" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-circle" pres:preset-sub-type="in"> + <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-circle" pres:preset-sub-type="out"> + <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-bottom"> + <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-left"> + <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-right"> + <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-top"> + <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diamond" pres:preset-sub-type="in"> + <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diamond" pres:preset-sub-type="out"> + <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-disappear"> + <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-dissolve"> + <anim:transitionFilter smil:dur="0.5" smil:type="dissolve" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-flash-once"> + <anim:animate smil:dur="1" smil:attributeName="visibility" smil:values="hidden;visible" smil:keyTimes="0;0.5" smil:calcMode="discrete"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-bottom"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-left"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-right"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-top"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-bottom-left"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-bottom-right"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-top-left"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-top-right"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-bottom"> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromBottom" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-left"> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromLeft" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-right"> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromRight" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-top"> + <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromTop" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-plus" pres:preset-sub-type="in"> + <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-plus" pres:preset-sub-type="out"> + <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-random-bars" pres:preset-sub-type="vertical"> + <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="horizontal" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-random-bars" pres:preset-sub-type="horizontal"> + <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="vertical" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-random"/> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="horizontal-in"> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="horizontal-out"> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="vertical-in"> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="vertical-out"> + <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="left-to-bottom"> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="left-to-top"> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="right-to-bottom"> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="right-to-top"> + <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wedge"> + <anim:transitionFilter smil:dur="2" smil:type="fanWipe" smil:subtype="centerTop" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="1"> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="oneBlade" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="2"> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="twoBladeVertical" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="3"> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="threeBlade" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="4"> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="fourBlade" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="8"> + <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="eightBlade" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-bottom"> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-left"> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-right"> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight" smil:mode="out" smil:direction="reverse"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-top"> + <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-contract"> + <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;width*0.70" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fade-out"> + <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fade-out-and-swivel" anim:iterate-type="by-letter" anim:iterate-interval="0.2s"> + <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:dur="2" smil:attributeName="width" smil:values="width;0.92*width;0.71*width;0.38*width;0;-0.38*width;-0.71*width;-0.92*width;-width;-0.92*width;-0.71*width;-0.38*width;0;0.38*width;0.71*width;0.92*width;width;0.92*width;0.71*width;0.38*width;0" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:animate smil:dur="2" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fade-out-and-zoom"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-ascend"> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y-.1" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-center-revolve"> + <anim:animate smil:begin="0" smil:dur="0.6" smil:decelerate="0.5" smil:attributeName="x" smil:values="x;x+0.0242;x+0.0479;x+0.0704;x+0.0911;x+0.1096;x+0.1254;x+0.1381;x+0.1474;x+0.1531;x+0.155;x+0.1531;x+0.1474;x+0.1381;x+0.1254;x+0.1096;x+0.0911;x+0.0704;x+0.0479;x+0.0242;x" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:animate smil:begin="0.6" smil:dur="0.4" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.6" smil:decelerate="0.5" smil:attributeName="y" smil:values="y;y+0.0019;y+0.0076;y+0.0169;y+0.0296;y+0.0454;y+0.0639;y+0.0846;y+0.1071;y+0.1307;y+0.155;y+0.1792;y+0.2029;y+0.2253;y+0.2461;y+0.2646;y+0.2804;y+0.2931;y+0.3024;y+0.308;y+0.31" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:animate smil:begin="0.6" smil:dur="0.4" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:begin="0.9" smil:dur="0.1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-collapse" pres:preset-sub-type="across"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-colored-lettering" anim:iterate-type="by-letter" anim:iterate-interval="0.04s"> + <anim:animate smil:dur="0.08" smil:attributeName="color" smil:values="#009999;#333399" smil:keyTimes="0;0.5" smil:calcMode="discrete"/> + <anim:animate smil:dur="0.08" smil:attributeName="fill-color" smil:values="#009999;#333399" smil:keyTimes="0;0.5" smil:calcMode="discrete"/> + <anim:set smil:dur="0.08" smil:attributeName="fill" smil:to="solid"/> + <anim:set smil:begin="0.079" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-descend"> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y+.1" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-ease-out"> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x-.2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-turn-and-grow" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="rotate" smil:values="0;90" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-sink-down"> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.1" smil:decelerate="1" smil:attributeName="y" smil:values="y;y-.03" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.1" smil:dur="0.9" smil:accelerate="1" smil:attributeName="y" smil:values="y;y+1" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-spin-out"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="rotate" smil:values="0;360" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-stretchy"> + <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;width+.3" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-unfold" anim:iterate-type="by-letter" anim:iterate-interval="0.1s"> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x-.1" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="out"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="544"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0.5" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0.5" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="out-slightly"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;2/3*width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;2/3*height" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="in"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;4*width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;4*height" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="20"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;(6*min(max(width*height,.3),1)-7.4)/-.7*width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;(6*min(max(width*height,.3),1)-7.4)/-.7*height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+(6*min(max(width*height,.3),1)-7.4)/-.7*height/2" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="in-slightly"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;4/3*width" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;4/3*height" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-boomerang"> + <anim:transitionFilter smil:begin="0" smil:dur="1" smil:accelerate="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="y" smil:values="y;y+.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="y" smil:values="y;y-.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="x" smil:values="x;x+.4" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="width" smil:values="width;width*.05" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="width" smil:values="width;width/.05" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="rotate" smil:values="0;-90" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-boomerang"> + <anim:transitionFilter smil:begin="0" smil:dur="1" smil:accelerate="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="y" smil:values="y;y+.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="y" smil:values="y;y-.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="x" smil:values="x;x+.4" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="width" smil:values="width;width*.05" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="width" smil:values="width;width/.05" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="rotate" smil:values="0;-90" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-bounce"> + <anim:transitionFilter smil:begin="1.82" smil:dur="0.18" smil:accelerate="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:mode="out"/> + <anim:animate smil:begin="0" smil:dur="1.822" smil:attributeName="x" smil:values="x;x+0.25" smil:keyTimes="0;1" smil:keySplines="0,0;0.14,0.31;0.43,0.73;0.71,0.91;1,1"/> + <anim:animate smil:begin="1.822" smil:dur="0.178" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="0.664" smil:attributeName="y" smil:values="y;y+0.026;y+0.052;y+0.078;y+0.103;y+0.151;y+0.196;y+0.236;y+0.270;y+0.297;y+0.317;y+0.329;y+0.333" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.25,0.07;0.5,0.2;0.75,0.467;1,1"/> + <anim:animate smil:begin="0.664" smil:dur="0.664" smil:attributeName="y" smil:values="y;y-0.034;y-0.065;y-0.090;y-0.106;y-0.111;y-0.106;y-0.090;y-0.065;y-0.034;y" smil:keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/> + <anim:animate smil:begin="1.324" smil:dur="0.332" smil:attributeName="y" smil:values="y;y-0.011;y-0.022;y-0.030;y-0.035;y-0.037;y-0.035;y-0.030;y-0.022;y-0.011;y" smil:keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/> + <anim:animate smil:begin="1.656" smil:dur="0.164" smil:attributeName="y" smil:values="y;y-0.004;y-0.007;y-0.010;y-0.012;y-0.0123;y-0.012;y-0.010;y-0.007;y-0.004;y" smil:keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/> + <anim:animate smil:begin="1.82" smil:dur="0.18" smil:accelerate="0.5" smil:attributeName="y" smil:values="y;y+height" smil:keyTimes="0;1"/> + <anim:animateTransform smil:begin="0.62" smil:dur="0.026" smil:to="1,0.6" svg:type="scale"/> + <anim:animateTransform smil:begin="0.646" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:animateTransform smil:begin="1.312" smil:dur="0.026" smil:to="1,0.8" svg:type="scale"/> + <anim:animateTransform smil:begin="1.338" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:animateTransform smil:begin="1.642" smil:dur="0.026" smil:to="1,0.9" svg:type="scale"/> + <anim:animateTransform smil:begin="1.668" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:animateTransform smil:begin="1.808" smil:dur="0.026" smil:to="1,0.95" svg:type="scale"/> + <anim:animateTransform smil:begin="1.834" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-movie-credits"> + <anim:animate smil:dur="15" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="15" smil:attributeName="y" smil:values="y-1;y+1" smil:keyTimes="0;1"/> + <anim:set smil:begin="14.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-curve-down"> + <anim:animateTransform smil:begin="0" smil:dur="1" smil:accelerate="0.5" smil:from="1,1" smil:to="2.5,2.5" svg:type="scale"/> + <anim:animateMotion smil:begin="0" smil:dur="1" smil:accelerate="0.5" svg:path="M 0.0000 0.0000 C 0.03802 0.0 0.1441 0.02341 0.1826 0.0915 C 0.22118 0.15964 0.24705 0.31256 0.2318 0.4083 C 0.21649 0.50394 0.20747 0.57948 0.0908 0.6661 C -0.02552 0.75279 -0.37517 0.88508 -0.4674 0.9289"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-flip" anim:iterate-type="by-letter" anim:iterate-interval="0.1s"> + <anim:animate smil:begin="0" smil:dur="0.5" smil:autoReverse="true" smil:attributeName="width" smil:from="(width)" smil:to="(-width*2)"/> + <anim:animate smil:begin="0" smil:dur="0.5" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="x" smil:by="(width*0.50)"/> + <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="y" smil:from="(y)" smil:to="(1+height/2)"/> + <anim:animateTransform smil:begin="0" smil:dur="1" smil:by="360" svg:type="rotate"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-float"> + <anim:transitionFilter smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:attributeName="rotate" smil:values="0;-90" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.2" smil:decelerate="1" smil:attributeName="x" smil:values="x;x-0.05" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.2" smil:decelerate="1" smil:attributeName="y" smil:values="y;y+0.1" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:attributeName="x" smil:values="x;x+0.4+0.05" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:attributeName="y" smil:values="y;y-0.4-0.1" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:text-only="true" smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fold"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width*2.5" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height*0.01" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;height+1" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-glide"> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width*0.05" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x-.2" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-breaks"> + <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="x" smil:from="(x)" smil:to="(x+1)"/> + <anim:animate smil:begin="0" smil:dur="0.2" smil:accelerate="0.5" smil:attributeName="skewX" smil:from="0" smil:to="-1"/> + <anim:set smil:begin="0.2" smil:dur="0.8" smil:attributeName="skewX" smil:to="-1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-magnify"> + <anim:transitionFilter smil:begin="1.23" smil:dur="0.77" smil:accelerate="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animateTransform smil:begin="1.23" smil:dur="0.77" smil:accelerate="1" smil:from="2,4.5" smil:to="0.1,0.1" svg:type="scale"/> + <anim:animateTransform smil:dur="1.23" smil:decelerate="1" smil:from="1,1" smil:to="2,4.5" svg:type="scale"/> + <anim:animate smil:dur="1.23" smil:decelerate="1" smil:attributeName="x" smil:from="(x)" smil:to="(0.5)"/> + <anim:animate smil:begin="1.23" smil:dur="0.77" smil:attributeName="x" smil:from="(0.5)" smil:to="(0.5)"/> + <anim:animate smil:dur="1.23" smil:decelerate="1" smil:attributeName="y" smil:from="(y)" smil:to="(y+0.4)"/> + <anim:animate smil:begin="1.23" smil:dur="0.77" smil:attributeName="y" smil:from="(y)" smil:to="(y)"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-pinwheel"> + <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:animate smil:dur="2" smil:attributeName="rotate" smil:values="0;720" smil:keyTimes="0;1"/> + <anim:animate smil:dur="2" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="2" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-sling"> + <anim:animate smil:dur="1" smil:attributeName="rotate" smil:values="0;90;90;90" smil:keyTimes="0;0.2;0.2;1"/> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;0.949999988079071;-1" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-spiral-out"> + <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/> + <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x+-0.0500*(x*0.9511+(1-y)*0.3090);x+-0.1000*(x*0.8090+(1-y)*0.5878);x+-0.1500*(x*0.5878+(1-y)*0.8090);x+-0.2000*(x*0.3090+(1-y)*0.9511);x+-0.2500*(x*-0.0000+(1-y)*1.0000);x+-0.3000*(x*-0.3090+(1-y)*0.9511);x+-0.3500*(x*-0.5878+(1-y)*0.8090);x+-0.4000*(x*-0.8090+(1-y)*0.5878);x+-0.4500*(x*-0.9511+(1-y)*0.3090);x+-0.5000*(x*-1.0000+(1-y)*-0.0000);x+-0.5500*(x*-0.9511+(1-y)*-0.3090);x+-0.6000*(x*-0.8090+(1-y)*-0.5878);x+-0.6500*(x*-0.5878+(1-y)*-0.8090);x+-0.7000*(x*-0.3090+(1-y)*-0.9511);x+-0.7500*(x*0.0000+(1-y)*-1.0000);x+-0.8000*(x*0.3090+(1-y)*-0.9511);x+-0.8500*(x*0.5878+(1-y)*-0.8090);x+-0.9000*(x*0.8090+(1-y)*-0.5878);x+-0.9500*(x*0.9511+(1-y)*-0.3090);x+-1.0000*(x*1.0000+(1-y)*0.0000)" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y+-0.0500*(x*0.3090-(1-y)*0.9511);y+-0.1000*(x*0.5878-(1-y)*0.8090);y+-0.1500*(x*0.8090-(1-y)*0.5878);y+-0.2000*(x*0.9511-(1-y)*0.3090);y+-0.2500*(x*1.0000-(1-y)*-0.0000);y+-0.3000*(x*0.9511-(1-y)*-0.3090);y+-0.3500*(x*0.8090-(1-y)*-0.5878);y+-0.4000*(x*0.5878-(1-y)*-0.8090);y+-0.4500*(x*0.3090-(1-y)*-0.9511);y+-0.5000*(x*-0.0000-(1-y)*-1.0000);y+-0.5500*(x*-0.3090-(1-y)*-0.9511);y+-0.6000*(x*-0.5878-(1-y)*-0.8090);y+-0.6500*(x*-0.8090-(1-y)*-0.5878);y+-0.7000*(x*-0.9511-(1-y)*-0.3090);y+-0.7500*(x*-1.0000-(1-y)*0.0000);y+-0.8000*(x*-0.9511-(1-y)*0.3090);y+-0.8500*(x*-0.8090-(1-y)*0.5878);y+-0.9000*(x*-0.5878-(1-y)*0.8090);y+-0.9500*(x*-0.3090-(1-y)*0.9511);y+-1.0000*(x*0.0000-(1-y)*1.0000)" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" smil:accelerate="0.5" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-swish" anim:iterate-type="by-letter" anim:iterate-interval="0.5s"> + <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="rotate" smil:values="0;45" smil:keyTimes="0;1"/> + <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="y" smil:values="y;y+1" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-swivel" pres:preset-sub-type="vertical"> + <anim:animate smil:dur="5" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/> + <anim:animate smil:dur="5" smil:attributeName="width" smil:values="width;0.92*width;0.71*width;0.38*width;0;-0.38*width;-0.71*width;-0.92*width;-width;-0.92*width;-0.71*width;-0.38*width;0;0.38*width;0.71*width;0.92*width;width;0.92*width;0.71*width;0.38*width;0" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/> + <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-thread"> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height/20;height/20" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width+.3;width+.3" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x;x-.3" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-whip" anim:iterate-type="by-letter" anim:iterate-interval="0.05s"> + <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x+.1;x" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height+.01;height/10" smil:keyTimes="0;0.5;1"/> + <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width+.01;width/10" smil:keyTimes="0;0.5;1"/> + <anim:transitionFilter smil:dur="0.5" smil:keySplines="0,0;0.5,0;1,1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:iterate> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-4-point-star"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.091 -0.0453 L 0.125 -0.16655 L 0.158 -0.0453 L 0.249 0 L 0.158 0.0453 L 0.125 0.16655 L 0.091 0.0453 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-5-point-star"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.029 0.12125 L 0.125 0.12125 L 0.048 0.19586 L 0.077 0.31711 L 0 0.2425 L -0.077 0.31711 L -0.048 0.19586 L -0.125 0.12125 L -0.029 0.12125 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-6-point-star"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.036 0.08261 L 0.108 0.08261 L 0.072 0.16655 L 0.108 0.24916 L 0.036 0.24916 L 0 0.3331 L -0.036 0.24916 L -0.108 0.24916 L -0.072 0.16655 L -0.108 0.08261 L -0.036 0.08261 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-8-point-star"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.052 0 L 0.089 -0.0493 L 0.125 0 L 0.177 0 L 0.177 0.06929 L 0.213 0.11858 L 0.177 0.16655 L 0.177 0.23584 L 0.125 0.23584 L 0.089 0.2838 L 0.052 0.23584 L 0 0.23584 L 0 0.16655 L -0.037 0.11858 L 0 0.06929 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-circle"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.069 0 0.125 0.07461 0.125 0.16655 C 0.125 0.25849 0.069 0.3331 0 0.3331 C -0.069 0.3331 -0.125 0.25849 -0.125 0.16655 C -0.125 0.07461 -0.069 0 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-crescent-moon"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.014 -0.00666 -0.029 -0.01199 -0.044 -0.01199 C -0.114 -0.01199 -0.169 0.06396 -0.169 0.15589 C -0.169 0.2465 -0.114 0.32111 -0.044 0.32111 C -0.029 0.32111 -0.014 0.31711 0 0.31045 C -0.047 0.28647 -0.08 0.22651 -0.08 0.15589 C -0.08 0.08394 -0.047 0.02398 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-diamond"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 -0.11192 L 0.25 0 L 0.125 0.11192 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-equal-triangle"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0.2878 L -0.125 0.2878 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-oval"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.03 -0.05063 0.075 -0.08261 0.125 -0.08261 C 0.175 -0.08261 0.22 -0.05063 0.25 0 C 0.22 0.05063 0.175 0.08261 0.125 0.08261 C 0.075 0.08261 0.03 0.05063 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-heart"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.012 -0.02398 0.033 -0.05863 0.058 -0.05863 C 0.095 -0.05863 0.125 -0.02265 0.125 0.02265 C 0.125 0.03731 0.122 0.05063 0.116 0.06262 C 0.117 0.06262 0 0.2425 0 0.24383 C 0 0.2425 -0.117 0.06262 -0.116 0.06262 C -0.122 0.05063 -0.125 0.03731 -0.125 0.02265 C -0.125 -0.02265 -0.095 -0.05863 -0.057 -0.05863 C -0.033 -0.05863 -0.012 -0.02398 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-hexagon"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0 L 0.188 0.14523 L 0.125 0.28913 L 0 0.28913 L -0.063 0.14523 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-octagon"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.073 -0.09727 L 0.177 -0.09727 L 0.25 0 L 0.25 0.13857 L 0.177 0.23584 L 0.073 0.23584 L 0 0.13857 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-parallelogram"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.178 0 L 0.25 0.16122 L 0.072 0.16122 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-pentagon"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0.12125 L 0.077 0.31711 L -0.077 0.31711 L -0.125 0.12125 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-right-triangle"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 -0.19586 L 0.25 0 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-square"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 0 L 0.25 0.3331 L 0 0.3331 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-teardrop"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.001 0.0453 0.011 0.08661 0.028 0.11325 C 0.028 0.11459 0.055 0.15056 0.055 0.14923 C 0.07 0.16922 0.079 0.1972 0.079 0.22651 C 0.079 0.28514 0.044 0.33177 0 0.3331 C -0.044 0.33177 -0.079 0.28514 -0.079 0.22651 C -0.079 0.1972 -0.07 0.16922 -0.055 0.14923 C -0.055 0.15056 -0.028 0.11459 -0.028 0.11325 C -0.011 0.08661 -0.001 0.0453 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-trapezoid"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.167 0 L 0.21 0.22251 L -0.04 0.22251 L 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-down"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.067 0.0533 C 0.081 0.06529 0.102 0.07195 0.124 0.07195 C 0.149 0.07195 0.169 0.06529 0.183 0.0533 L 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-left"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L -0.04 0.08927 C -0.049 0.10793 -0.054 0.13591 -0.054 0.16522 C -0.054 0.19853 -0.049 0.22518 -0.04 0.24383 L 0 0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.04 0.08927 C 0.049 0.10793 0.054 0.13591 0.054 0.16522 C 0.054 0.19853 0.049 0.22518 0.04 0.24383 L 0 0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-up"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.067 -0.0533 C 0.081 -0.06529 0.102 -0.07195 0.124 -0.07195 C 0.149 -0.07195 0.169 -0.06529 0.183 -0.0533 L 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-bounce-left"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 c -0.004 -0.01066 -0.018 -0.02132 -0.023 -0.02132 c -0.031 0 -0.063 0.16655 -0.063 0.3331 c 0 -0.08394 -0.016 -0.16655 -0.031 -0.16655 c -0.016 0 -0.031 0.08394 -0.031 0.16655 c 0 -0.0413 -0.008 -0.08394 -0.016 -0.08394 c -0.008 0 -0.016 0.0413 -0.016 0.08394 c 0 -0.02132 -0.004 -0.0413 -0.008 -0.0413 c -0.004 0 -0.008 0.02132 -0.008 0.0413 c 0 -0.01066 -0.002 -0.02132 -0.004 -0.02132 c -0.001 0 -0.004 0.01066 -0.004 0.02132 c 0 -0.00533 -0.001 -0.01066 -0.002 -0.01066 c 0 -0.00133 -0.002 0.00533 -0.002 0.01066 c 0 -0.00266 0 -0.00533 -0.001 -0.00533 c 0 0.00133 -0.001 0.00266 -0.001 0.00533 c 0 -0.00133 0 -0.00266 0 -0.004 c -0.001 0 -0.001 0.00133 -0.001 0.00266 c -0.001 0 -0.001 -0.00133 -0.001 -0.00266 c -0.001 0 -0.001 0.00133 -0.001 0.00266"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-bounce-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 c 0.004 -0.01066 0.018 -0.02132 0.023 -0.02132 c 0.031 0 0.063 0.16655 0.063 0.3331 c 0 -0.08394 0.016 -0.16655 0.031 -0.16655 c 0.016 0 0.031 0.08394 0.031 0.16655 c 0 -0.0413 0.008 -0.08394 0.016 -0.08394 c 0.008 0 0.016 0.0413 0.016 0.08394 c 0 -0.02132 0.004 -0.0413 0.008 -0.0413 c 0.004 0 0.008 0.02132 0.008 0.0413 c 0 -0.01066 0.002 -0.02132 0.004 -0.02132 c 0.001 0 0.004 0.01066 0.004 0.02132 c 0 -0.00533 0.001 -0.01066 0.002 -0.01066 c 0 0.00133 0.002 0.00533 0.002 0.01066 c 0 -0.00266 0 -0.00533 0.001 -0.00533 c 0 0.00133 0.001 0.00266 0.001 0.00533 c 0 -0.00133 0 -0.00266 0 -0.004 c 0.001 0 0.001 0.00133 0.001 0.00266 c 0.001 0 0.001 -0.00133 0.001 -0.00266 c 0.001 0 0.001 0.00133 0.001 0.00266"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curvy-left"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.008 0.01066 0.017 0.02132 0.021 0.03464 C 0.025 0.0493 0.027 0.06662 0.029 0.08394 C 0.031 0.10126 0.029 0.11592 0.027 0.13191 C 0.025 0.14656 0.022 0.16255 0.015 0.17588 C 0.009 0.1892 -0.001 0.19986 -0.012 0.20786 C -0.022 0.21585 -0.034 0.22118 -0.046 0.22384 C -0.058 0.22651 -0.07 0.22651 -0.081 0.22384 C -0.093 0.22118 -0.104 0.21452 -0.113 0.20386 C -0.122 0.19453 -0.13 0.18254 -0.134 0.16788 C -0.139 0.15456 -0.141 0.13591 -0.141 0.12125 C -0.142 0.10659 -0.141 0.08927 -0.136 0.07461 C -0.131 0.06129 -0.122 0.05063 -0.11 0.0453 C -0.098 0.0413 -0.086 0.04663 -0.078 0.05596 C -0.071 0.06529 -0.066 0.07994 -0.065 0.09727 C -0.065 0.11459 -0.066 0.13058 -0.071 0.1439 C -0.076 0.15722 -0.075 0.15989 -0.095 0.17721 C -0.113 0.19586 -0.131 0.19053 -0.142 0.19187 C -0.153 0.19187 -0.162 0.18654 -0.173 0.18121 C -0.185 0.17455 -0.195 0.16255 -0.202 0.15189 C -0.209 0.14124 -0.212 0.12791 -0.216 0.10659 C -0.219 0.08527 -0.219 0.07461 -0.219 0.05863 C -0.219 0.04264 -0.219 0.02665 -0.219 0.01066"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curvy-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.008 0.01066 -0.017 0.02132 -0.021 0.03464 C -0.025 0.0493 -0.027 0.06662 -0.029 0.08394 C -0.031 0.10126 -0.029 0.11592 -0.027 0.13191 C -0.025 0.14656 -0.022 0.16255 -0.015 0.17588 C -0.009 0.1892 0.001 0.19986 0.012 0.20786 C 0.022 0.21585 0.034 0.22118 0.046 0.22384 C 0.058 0.22651 0.07 0.22651 0.081 0.22384 C 0.093 0.22118 0.104 0.21452 0.113 0.20386 C 0.122 0.19453 0.13 0.18254 0.134 0.16788 C 0.139 0.15456 0.141 0.13591 0.141 0.12125 C 0.142 0.10659 0.141 0.08927 0.136 0.07461 C 0.131 0.06129 0.122 0.05063 0.11 0.0453 C 0.098 0.0413 0.086 0.04663 0.078 0.05596 C 0.071 0.06529 0.066 0.07994 0.065 0.09727 C 0.065 0.11459 0.066 0.13058 0.071 0.1439 C 0.076 0.15722 0.075 0.15989 0.095 0.17721 C 0.113 0.19586 0.131 0.19053 0.142 0.19187 C 0.153 0.19187 0.162 0.18654 0.173 0.18121 C 0.185 0.17455 0.195 0.16255 0.202 0.15189 C 0.209 0.14124 0.212 0.12791 0.216 0.10659 C 0.219 0.08527 0.219 0.07461 0.219 0.05863 C 0.219 0.04264 0.219 0.02665 0.219 0.01066"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-decaying-wave"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.002 0.07062 0.007 0.16922 0.025 0.16788 C 0.051 0.16788 0.053 -0.16255 0.084 -0.16389 C 0.112 -0.16389 0.097 0.12525 0.124 0.12391 C 0.152 0.12391 0.137 -0.08527 0.167 -0.08527 C 0.194 -0.08527 0.179 0.05596 0.203 0.05596 C 0.226 0.05596 0.214 -0.05196 0.235 -0.05196 C 0.247 -0.05196 0.248 -0.02265 0.249 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-diagonal-down-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-diagonal-up-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 -0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-down"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-funnel"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.001 0.03331 0.06 0.06262 0.137 0.06396 C 0.198 0.06662 0.248 0.05063 0.249 0.03065 C 0.249 0.01066 0.2 -0.00799 0.138 -0.00933 C 0.107 -0.00933 0.079 -0.00666 0.059 0 C 0.03 0.00933 0.013 0.02398 0.013 0.0413 C 0.013 0.05063 0.018 0.05996 0.027 0.06795 C 0.048 0.08527 0.089 0.09727 0.136 0.0986 C 0.191 0.10126 0.236 0.08661 0.236 0.06929 C 0.237 0.05063 0.192 0.03464 0.137 0.03198 C 0.109 0.03198 0.084 0.03464 0.065 0.03997 C 0.04 0.0493 0.024 0.06396 0.024 0.07861 C 0.024 0.08661 0.029 0.0946 0.037 0.1026 C 0.056 0.11725 0.092 0.12924 0.135 0.13058 C 0.185 0.13191 0.225 0.11858 0.225 0.1026 C 0.226 0.08661 0.186 0.07195 0.136 0.07062 C 0.111 0.06929 0.088 0.07195 0.071 0.07728 C 0.048 0.08527 0.035 0.09727 0.035 0.11192 C 0.035 0.11858 0.039 0.12658 0.046 0.13324 C 0.063 0.14656 0.096 0.15722 0.134 0.15856 C 0.179 0.15856 0.215 0.1479 0.215 0.13324 C 0.215 0.11858 0.18 0.10526 0.135 0.10393 C 0.113 0.10393 0.092 0.10659 0.077 0.11059 C 0.056 0.11725 0.044 0.12924 0.043 0.14124 C 0.043 0.1479 0.048 0.15456 0.054 0.15989 C 0.069 0.17321 0.099 0.18254 0.133 0.18254 C 0.173 0.18387 0.206 0.17455 0.206 0.16122 C 0.207 0.1479 0.174 0.13591 0.134 0.13457 C 0.114 0.13457 0.095 0.13591 0.082 0.14124 C 0.063 0.14656 0.052 0.15722 0.052 0.16788 C 0.052 0.17455 0.055 0.17988 0.061 0.1852 C 0.075 0.1972 0.101 0.20519 0.132 0.20652 C 0.169 0.20652 0.198 0.19853 0.198 0.18654 C 0.199 0.17455 0.17 0.16389 0.133 0.16255 C 0.115 0.16255 0.099 0.16389 0.087 0.16788 C 0.07 0.17321 0.06 0.18254 0.06 0.1932 C 0.06 0.19853 0.063 0.20253 0.068 0.20786 C 0.08 0.21851 0.104 0.22518 0.132 0.22651 C 0.165 0.22784 0.191 0.21985 0.191 0.20786 C 0.191 0.19853 0.166 0.18787 0.133 0.18787 C 0.116 0.18654 0.101 0.1892 0.09 0.19187 C 0.075 0.1972 0.066 0.20519 0.066 0.21452 C 0.066 0.21985 0.069 0.22384 0.074 0.22784 C 0.085 0.23717 0.107 0.24383 0.131 0.24516 C 0.161 0.2465 0.185 0.2385 0.185 0.22917 C 0.185 0.21851 0.161 0.21052 0.132 0.20919 C 0.118 0.20919 0.104 0.21052 0.094 0.21452 C 0.08 0.21851 0.072 0.22518 0.072 0.2345 C 0.072 0.2385 0.075 0.2425 0.079 0.2465 C 0.089 0.25449 0.108 0.26115 0.131 0.26115 C 0.157 0.26248 0.179 0.25582 0.179 0.2465 C 0.179 0.2385 0.158 0.23051 0.131 0.23051 C 0.119 0.22917 0.106 0.23051 0.097 0.23317 C 0.085 0.2385 0.078 0.24516 0.078 0.25183 C 0.078 0.25582 0.08 0.25982 0.084 0.26248 C 0.093 0.27048 0.11 0.27581 0.131 0.27714 C 0.155 0.27714 0.174 0.27048 0.174 0.26382 C 0.174 0.25582 0.155 0.24783 0.131 0.24783 C 0.119 0.24783 0.108 0.24916 0.101 0.25183 C 0.089 0.25449 0.083 0.26115 0.083 0.26781 C 0.083 0.27048 0.085 0.27448 0.088 0.27714 C 0.096 0.28514 0.112 0.28913 0.13 0.29046 C 0.152 0.29046 0.169 0.28514 0.169 0.27847 C 0.169 0.27048 0.152 0.26515 0.131 0.26382 C 0.12 0.26382 0.11 0.26515 0.103 0.26781 C 0.093 0.27048 0.087 0.27581 0.087 0.28247 C 0.087 0.28514 0.089 0.2878 0.092 0.29046"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-heartbeat"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.017 0 C 0.025 0 0.034 -0.01865 0.042 -0.02132 C 0.048 -0.02132 0.059 -0.004 0.064 -0.004 C 0.071 -0.004 0.078 -0.00933 0.091 -0.00933 L 0.1 -0.21585 L 0.11 0.03331 L 0.122 0 L 0.132 -0.00933 L 0.156 -0.00133 C 0.167 -0.00533 0.176 -0.02265 0.187 -0.02931 C 0.191 -0.03065 0.2 -0.03198 0.206 -0.02931 C 0.212 -0.02665 0.217 -0.00799 0.219 -0.00666 C 0.222 -0.00133 0.229 -0.00666 0.233 -0.004 L 0.239 0 L 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-left"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L -0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-s-curve-1"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 -0.04663 0.028 -0.08261 0.062 -0.08261 C 0.097 -0.08261 0.125 -0.04663 0.125 0 C 0.125 0.04663 0.153 0.08261 0.188 0.08261 C 0.222 0.08261 0.25 0.04663 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-s-curve-2"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 0.04663 0.028 0.08261 0.062 0.08261 C 0.097 0.08261 0.125 0.04663 0.125 0 C 0.125 -0.04663 0.153 -0.08261 0.188 -0.08261 C 0.222 -0.08261 0.25 -0.04663 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-sine-wave"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.003 -0.02532 0.007 -0.0493 0.015 -0.0493 C 0.024 -0.0493 0.027 -0.02532 0.03 0 C 0.034 0.02798 0.037 0.05596 0.047 0.05596 C 0.056 0.05596 0.059 0.02798 0.063 0 C 0.065 -0.02532 0.069 -0.0493 0.078 -0.0493 C 0.086 -0.0493 0.09 -0.02532 0.093 0 C 0.096 0.02798 0.1 0.05596 0.109 0.05596 C 0.118 0.05596 0.125 0 0.125 0 C 0.128 -0.02532 0.131 -0.0493 0.14 -0.0493 C 0.149 -0.0493 0.152 -0.02532 0.155 0 C 0.159 0.02798 0.162 0.05596 0.172 0.05596 C 0.181 0.05596 0.184 0.02798 0.187 0 C 0.191 -0.02532 0.194 -0.0493 0.203 -0.0493 C 0.211 -0.0493 0.215 -0.02532 0.218 0 C 0.221 0.02798 0.225 0.05596 0.234 0.05596 C 0.243 0.05596 0.246 0.02798 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-spiral-left"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.004 -0.08927 -0.046 -0.16655 -0.113 -0.17188 C -0.177 -0.17854 -0.237 -0.11858 -0.241 -0.03198 C -0.246 0.04797 -0.204 0.12258 -0.144 0.12791 C -0.089 0.13191 -0.037 0.08261 -0.033 0.00799 C -0.029 -0.05996 -0.064 -0.12391 -0.115 -0.12924 C -0.162 -0.13324 -0.206 -0.09194 -0.209 -0.02931 C -0.212 0.02665 -0.184 0.08128 -0.142 0.08394 C -0.104 0.08794 -0.068 0.05596 -0.065 0.00533 C -0.063 -0.03997 -0.084 -0.08394 -0.117 -0.08661 C -0.146 -0.08927 -0.175 -0.06529 -0.177 -0.02665 C -0.179 0.00666 -0.164 0.03864 -0.14 0.0413 C -0.12 0.04397 -0.099 0.02931 -0.098 0.00266 C -0.096 -0.01865 -0.104 -0.0413 -0.119 -0.04397 C -0.131 -0.04397 -0.143 -0.03864 -0.145 -0.02398 C -0.146 -0.01466 -0.144 -0.00533 -0.138 -0.00133 C -0.135 0 -0.133 0 -0.13 -0.00133"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-spiral-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.004 -0.08927 0.046 -0.16655 0.113 -0.17188 C 0.177 -0.17854 0.237 -0.11858 0.241 -0.03198 C 0.246 0.04797 0.204 0.12258 0.144 0.12791 C 0.089 0.13191 0.037 0.08261 0.033 0.00799 C 0.029 -0.05996 0.064 -0.12391 0.115 -0.12924 C 0.162 -0.13324 0.206 -0.09194 0.209 -0.02931 C 0.212 0.02665 0.184 0.08128 0.142 0.08394 C 0.104 0.08794 0.068 0.05596 0.065 0.00533 C 0.063 -0.03997 0.084 -0.08394 0.117 -0.08661 C 0.146 -0.08927 0.175 -0.06529 0.177 -0.02665 C 0.179 0.00666 0.164 0.03864 0.14 0.0413 C 0.12 0.04397 0.099 0.02931 0.098 0.00266 C 0.096 -0.01865 0.104 -0.0413 0.119 -0.04397 C 0.131 -0.04397 0.143 -0.03864 0.145 -0.02398 C 0.146 -0.01466 0.144 -0.00533 0.138 -0.00133 C 0.135 0 0.133 0 0.13 -0.00133"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-spring"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.066 0.00799 -0.115 0.02798 -0.115 0.04397 C -0.115 0.05863 -0.067 0.06929 -0.003 0.06929 C 0.061 0.06929 0.115 0.05863 0.115 0.04397 C 0.115 0.02798 0.059 0.02398 -0.005 0.03464 C -0.068 0.04663 -0.115 0.06662 -0.115 0.08128 C -0.115 0.09593 -0.066 0.10793 -0.003 0.10793 C 0.061 0.10793 0.115 0.09593 0.115 0.08128 C 0.115 0.06662 0.059 0.06262 -0.004 0.07328 C -0.068 0.08394 -0.115 0.10393 -0.115 0.11858 C -0.115 0.13457 -0.066 0.14656 -0.002 0.14656 C 0.061 0.14656 0.115 0.13457 0.115 0.11858 C 0.115 0.10526 0.059 0.10126 -0.004 0.11059 C -0.067 0.12125 -0.115 0.14257 -0.115 0.15722 C -0.115 0.17188 -0.065 0.18387 -0.002 0.18387 C 0.063 0.18387 0.115 0.17188 0.115 0.15722 C 0.115 0.14257 0.06 0.13857 -0.003 0.14923 C -0.066 0.15989 -0.115 0.17988 -0.115 0.19453 C -0.115 0.21052 -0.065 0.22118 -0.001 0.22118 C 0.063 0.22118 0.115 0.20919 0.115 0.19453 C 0.115 0.17988 0.06 0.17588 -0.003 0.18654 C -0.066 0.1972 -0.115 0.21851 -0.115 0.23184 C -0.115 0.2465 -0.064 0.25849 -0.001 0.25849 C 0.063 0.25849 0.115 0.2465 0.115 0.23184 C 0.115 0.21851 0.061 0.21452 -0.003 0.22384 C -0.066 0.2345 -0.115 0.25582 -0.115 0.27048 C -0.115 0.2838 -0.064 0.29713 0 0.29713 C 0.064 0.29713 0.115 0.28514 0.115 0.27048 C 0.115 0.25582 0.061 0.25183 -0.002 0.26248 C -0.065 0.27314 -0.116 0.29313 -0.115 0.30779 C -0.114 0.32244 -0.064 0.3331 0 0.3331 C 0.064 0.3331 0.115 0.32111 0.115 0.30645 C 0.115 0.29313 0.063 0.28913 0 0.30112"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-stairs-down"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-down"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0 C 0.181 0 0.25 0.09194 0.25 0.16655 L 0.25 0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-down-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 0.16655 C 0 0.24117 0.069 0.3331 0.125 0.3331 L 0.25 0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-up"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0 C 0.181 0 0.25 -0.09194 0.25 -0.16655 L 0.25 -0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-up-right"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 -0.16655 C 0 -0.24117 0.069 -0.3331 0.125 -0.3331 L 0.25 -0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-up"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 -0.3331"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-wave"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.002 0.08394 0.009 0.1439 0.016 0.1439 C 0.023 0.1439 0.029 0.08394 0.031 0 C 0.034 0.08394 0.04 0.1439 0.047 0.1439 C 0.054 0.1439 0.06 0.08394 0.062 0 C 0.065 0.08394 0.071 0.1439 0.078 0.1439 C 0.085 0.1439 0.092 0.08394 0.094 0 C 0.096 0.08394 0.102 0.1439 0.11 0.1439 C 0.116 0.1439 0.123 0.08394 0.125 0 C 0.127 0.08394 0.134 0.1439 0.141 0.1439 C 0.148 0.1439 0.154 0.08394 0.156 0 C 0.159 0.08394 0.165 0.1439 0.172 0.1439 C 0.179 0.1439 0.185 0.08394 0.188 0 C 0.19 0.08394 0.196 0.1439 0.203 0.1439 C 0.21 0.1439 0.217 0.08394 0.219 0 C 0.221 0.08394 0.227 0.1439 0.235 0.1439 C 0.242 0.1439 0.248 0.08394 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-zigzag"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.016 0.13191 L 0.031 0 L 0.047 0.13191 L 0.063 0 L 0.078 0.13191 L 0.094 0 L 0.109 0.13191 L 0.125 0 L 0.141 0.13191 L 0.156 0 L 0.172 0.13191 L 0.187 0 L 0.203 0.13191 L 0.219 0 L 0.234 0.13191 L 0.25 0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-bean"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.002 -0.004 0.012 -0.0453 0.037 -0.04264 C 0.075 -0.03864 0.09 -0.00933 0.125 -0.03864 C 0.147 -0.05596 0.173 -0.09993 0.192 -0.0986 C 0.235 -0.09727 0.244 -0.05196 0.244 -0.01066 C 0.245 0.04797 0.189 0.09727 0.121 0.1026 C 0.052 0.10659 -0.005 0.04397 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-buzz-saw"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.022 -0.02265 -0.033 -0.06129 -0.027 -0.09993 C -0.024 -0.11325 -0.02 -0.12658 -0.014 -0.13724 C -0.01 -0.10659 0.004 -0.07861 0.025 -0.06129 C 0.025 -0.0986 0.041 -0.13457 0.068 -0.15056 C 0.077 -0.15722 0.087 -0.15989 0.097 -0.16122 C 0.082 -0.13857 0.074 -0.10659 0.077 -0.07328 C 0.099 -0.09727 0.13 -0.1026 0.157 -0.08527 C 0.166 -0.07994 0.175 -0.07062 0.181 -0.06129 C 0.158 -0.06396 0.134 -0.05196 0.117 -0.02798 C 0.144 -0.01999 0.167 0.00799 0.174 0.04663 C 0.176 0.05996 0.176 0.07328 0.174 0.08661 C 0.161 0.06129 0.139 0.04397 0.115 0.0413 C 0.127 0.07461 0.124 0.11592 0.106 0.14656 C 0.099 0.15722 0.091 0.16655 0.082 0.17188 C 0.089 0.14257 0.085 0.10926 0.072 0.08261 C 0.06 0.11592 0.034 0.13857 0.004 0.13857 C -0.007 0.13857 -0.017 0.13591 -0.026 0.13058 C -0.004 0.11992 0.013 0.0946 0.021 0.06396 C -0.007 0.07195 -0.036 0.05996 -0.055 0.02931 C -0.062 0.01732 -0.066 0.00533 -0.069 -0.00799 C -0.049 0.00933 -0.023 0.01199 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curved-square"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 -0.04264 0.026 -0.07728 0.058 -0.07728 L 0.192 -0.07728 C 0.224 -0.07728 0.25 -0.04264 0.25 0 L 0.25 0.17588 C 0.25 0.21851 0.224 0.25449 0.192 0.25449 L 0.058 0.25449 C 0.026 0.25449 0 0.21851 0 0.17588 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curved-x"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.006 0.00799 0.011 0.01466 0.015 0.02265 C 0.02 0.01466 0.024 0.00799 0.03 0 C 0.065 -0.04663 0.107 -0.06662 0.124 -0.0453 C 0.14 -0.02265 0.125 0.03331 0.09 0.07994 C 0.084 0.08661 0.079 0.09327 0.073 0.09993 C 0.079 0.10526 0.084 0.11192 0.09 0.11992 C 0.125 0.16655 0.14 0.22251 0.124 0.24383 C 0.107 0.26648 0.065 0.2465 0.03 0.19986 C 0.024 0.19187 0.02 0.1852 0.015 0.17721 C 0.011 0.1852 0.006 0.19187 0 0.19986 C -0.035 0.2465 -0.077 0.26648 -0.094 0.24383 C -0.11 0.22251 -0.095 0.16655 -0.06 0.11992 C -0.054 0.11192 -0.049 0.10526 -0.043 0.09993 C -0.049 0.09327 -0.054 0.08661 -0.06 0.07994 C -0.095 0.03331 -0.11 -0.02265 -0.094 -0.0453 C -0.077 -0.06662 -0.035 -0.04663 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curvy-star"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.072 0.07728 0.1 0.20253 0.077 0.31711 C -0.015 0.31045 -0.093 0.23051 -0.125 0.12125 C -0.047 0.0533 0.051 0.05729 0.125 0.12125 C 0.092 0.23717 0.011 0.31045 -0.077 0.31711 C -0.101 0.1972 -0.068 0.07461 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-figure-8-four"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.017 0 0.031 0.01865 0.031 0.0413 C 0.031 0.06529 0.017 0.08394 0 0.08394 C -0.017 0.08394 -0.031 0.1026 -0.031 0.12525 C -0.031 0.1479 -0.017 0.16655 0 0.16655 C 0.017 0.16655 0.031 0.1852 0.031 0.20786 C 0.031 0.23051 0.017 0.24916 0 0.24916 C -0.017 0.24916 -0.031 0.26781 -0.031 0.2918 C -0.031 0.31445 -0.017 0.3331 0 0.3331 C 0.017 0.3331 0.031 0.31445 0.031 0.2918 C 0.031 0.26781 0.017 0.24916 0 0.24916 C -0.017 0.24916 -0.031 0.23051 -0.031 0.20786 C -0.031 0.1852 -0.017 0.16655 0 0.16655 C 0.017 0.16655 0.031 0.1479 0.031 0.12525 C 0.031 0.1026 0.017 0.08394 0 0.08394 C -0.017 0.08394 -0.031 0.06529 -0.031 0.0413 C -0.031 0.01865 -0.017 0 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-horizontal-figure-8"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 0.04397 0.027 0.07994 0.06 0.07994 C 0.099 0.07994 0.113 0.03997 0.119 0.01599 L 0.125 -0.01599 C 0.131 -0.03997 0.146 -0.07994 0.19 -0.07994 C 0.218 -0.07994 0.25 -0.04397 0.25 0 C 0.25 0.04397 0.218 0.07994 0.19 0.07994 C 0.146 0.07994 0.131 0.03997 0.125 0.01599 L 0.119 -0.01599 C 0.113 -0.03997 0.099 -0.07994 0.06 -0.07994 C 0.027 -0.07994 0 -0.04397 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-inverted-square"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.004 -0.00533 0.01 -0.00799 0.015 -0.00799 C 0.022 -0.00799 0.029 -0.004 0.033 0.00266 C 0.05 0.02931 0.063 0.08794 0.063 0.15722 C 0.063 0.15722 0.063 0.15856 0.063 0.15856 C 0.063 0.15856 0.063 0.15989 0.063 0.15989 C 0.063 0.22917 0.05 0.28913 0.033 0.31578 C 0.029 0.32111 0.022 0.32511 0.015 0.32511 C 0.01 0.32511 0.004 0.32244 0 0.31711 C -0.004 0.31178 -0.006 0.30512 -0.006 0.29713 C -0.006 0.2878 -0.003 0.27981 0.002 0.27448 C 0.022 0.25049 0.066 0.23317 0.118 0.23317 C 0.118 0.23317 0.119 0.23317 0.119 0.23317 C 0.119 0.23317 0.12 0.23317 0.12 0.23317 C 0.172 0.23317 0.217 0.25049 0.237 0.27448 C 0.241 0.27981 0.244 0.2878 0.244 0.29713 C 0.244 0.30512 0.242 0.31178 0.238 0.31711 C 0.234 0.32244 0.229 0.32511 0.223 0.32511 C 0.216 0.32511 0.21 0.32111 0.206 0.31578 C 0.188 0.28913 0.175 0.22917 0.175 0.15989 C 0.175 0.15989 0.175 0.15856 0.175 0.15856 C 0.175 0.15856 0.175 0.15722 0.175 0.15722 C 0.175 0.08794 0.188 0.02931 0.206 0.00133 C 0.21 -0.004 0.216 -0.00799 0.223 -0.00799 C 0.229 -0.00799 0.234 -0.00533 0.238 0 C 0.242 0.00533 0.244 0.01332 0.244 0.01999 C 0.244 0.02931 0.241 0.03731 0.237 0.04397 C 0.217 0.06662 0.172 0.08394 0.12 0.08394 C 0.12 0.08394 0.12 0.08394 0.119 0.08394 C 0.119 0.08394 0.118 0.08394 0.118 0.08394 C 0.066 0.08394 0.022 0.06662 0.002 0.04397 C -0.003 0.03731 -0.006 0.02931 -0.006 0.01999 C -0.006 0.01332 -0.004 0.00533 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-inverted-triangle"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.015 0.03198 0.037 0.06529 0.055 0.07861 C 0.082 0.09993 0.108 0.10793 0.113 0.09727 C 0.117 0.08661 0.099 0.05996 0.072 0.03864 C 0.054 0.02532 0.021 0.01599 -0.008 0.01466 C -0.036 0.01599 -0.07 0.02532 -0.088 0.03864 C -0.115 0.05996 -0.133 0.08661 -0.128 0.09727 C -0.123 0.10793 -0.097 0.09993 -0.071 0.07861 C -0.053 0.06529 -0.03 0.03198 -0.016 0 C -0.001 -0.03331 0.009 -0.07728 0.009 -0.10526 C 0.009 -0.1479 0.002 -0.18121 -0.008 -0.18121 C -0.017 -0.18121 -0.025 -0.1479 -0.025 -0.10526 C -0.025 -0.07728 -0.014 -0.03331 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-loop-de-loop"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.023 0.00133 0.042 0.01199 0.052 0.02798 L 0.075 0.06529 C 0.08 0.07328 0.088 0.07728 0.098 0.07728 C 0.112 0.07728 0.124 0.06662 0.125 0.05063 C 0.124 0.03731 0.112 0.02532 0.098 0.02532 C 0.088 0.02532 0.08 0.03065 0.075 0.03731 L 0.052 0.07461 C 0.042 0.0906 0.023 0.10126 0 0.1026 C -0.023 0.10126 -0.042 0.0906 -0.052 0.07461 L -0.075 0.03731 C -0.08 0.03065 -0.088 0.02532 -0.098 0.02532 C -0.112 0.02532 -0.124 0.03731 -0.125 0.05063 C -0.124 0.06662 -0.112 0.07728 -0.098 0.07728 C -0.088 0.07728 -0.08 0.07328 -0.075 0.06529 L -0.052 0.02798 C -0.042 0.01199 -0.023 0.00133 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-neutron"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.007 -0.01332 0.014 -0.02798 0.021 -0.04663 C 0.04 -0.09993 0.045 -0.15189 0.031 -0.15989 C 0.017 -0.16922 -0.01 -0.13191 -0.029 -0.07861 C -0.039 -0.05063 -0.045 -0.02398 -0.047 -0.004 C -0.05 0.01199 -0.051 0.02798 -0.051 0.04663 C -0.051 0.10659 -0.038 0.15589 -0.023 0.15589 C -0.008 0.15589 0.005 0.10659 0.005 0.04663 C 0.005 0.01865 0.002 -0.00799 -0.003 -0.02665 C -0.005 -0.04264 -0.01 -0.05996 -0.016 -0.07728 C -0.036 -0.13191 -0.063 -0.16922 -0.077 -0.15989 C -0.091 -0.15056 -0.086 -0.09993 -0.066 -0.0453 C -0.058 -0.01999 -0.047 0.00133 -0.036 0.01599 C -0.028 0.02931 -0.019 0.0413 -0.007 0.0533 C 0.029 0.09194 0.065 0.10926 0.075 0.09327 C 0.084 0.07728 0.064 0.03331 0.028 -0.004 C 0.013 -0.01999 -0.003 -0.03198 -0.016 -0.03997 C -0.028 -0.04797 -0.043 -0.05463 -0.059 -0.05863 C -0.103 -0.07195 -0.141 -0.06795 -0.144 -0.04663 C -0.148 -0.02665 -0.115 0 -0.071 0.01332 C -0.051 0.01865 -0.032 0.02132 -0.017 0.01999 C -0.004 0.01999 0.01 0.01732 0.025 0.01332 C 0.069 0 0.102 -0.02798 0.098 -0.04797 C 0.095 -0.06795 0.057 -0.07328 0.013 -0.05996 C -0.008 -0.0533 -0.027 -0.04397 -0.04 -0.03331 C -0.051 -0.02532 -0.062 -0.01599 -0.074 -0.004 C -0.109 0.03464 -0.13 0.07728 -0.12 0.09327 C -0.111 0.10926 -0.074 0.09194 -0.039 0.05463 C -0.022 0.03598 -0.008 0.01732 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-peanut"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.038 0 0.069 0.0413 0.069 0.09194 C 0.069 0.12525 0.056 0.15456 0.037 0.17188 C 0.037 0.17188 0.036 0.17188 0.036 0.17188 C 0.029 0.17854 0.025 0.1892 0.025 0.20119 C 0.025 0.21185 0.029 0.22118 0.034 0.22784 C 0.042 0.2385 0.047 0.25449 0.047 0.27048 C 0.047 0.30512 0.026 0.3331 0 0.3331 C -0.026 0.3331 -0.047 0.30512 -0.047 0.27048 C -0.047 0.25449 -0.042 0.2385 -0.034 0.22784 C -0.029 0.22118 -0.026 0.21185 -0.026 0.20119 C -0.026 0.1892 -0.03 0.17854 -0.036 0.17188 C -0.036 0.17188 -0.037 0.17188 -0.037 0.17188 C -0.057 0.15456 -0.07 0.12525 -0.07 0.09194 C -0.07 0.0413 -0.039 0 0 0 C 0 0 0 0 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-clover"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.118 -0.15722 0.132 -0.15722 0.011 0 C 0.132 -0.15722 0.132 0.17588 0.011 0.01466 C 0.132 0.17588 -0.118 0.17588 0 0.01466 C -0.118 0.17588 -0.118 -0.15722 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-pointy-star"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.069 0 0.124 -0.07461 0.124 -0.16655 C 0.124 -0.07461 0.179 -0.00133 0.248 -0.00133 C 0.179 -0.00133 0.125 0.07461 0.125 0.16655 C 0.125 0.07461 0.069 0 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-swoosh"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 0 0.017 -0.08661 0.017 -0.08661 C 0.034 -0.15722 0.061 -0.1852 0.1 -0.1852 C 0.12 -0.1852 0.138 -0.17455 0.152 -0.15722 C 0.162 -0.14523 0.174 -0.13857 0.187 -0.13857 C 0.212 -0.13857 0.233 -0.16255 0.241 -0.1972 C 0.241 -0.1972 0.25 -0.2385 0.25 -0.2385 C 0.25 -0.2385 0.232 -0.15056 0.232 -0.15056 C 0.215 -0.08128 0.188 -0.0533 0.15 -0.0533 C 0.13 -0.0533 0.111 -0.06396 0.096 -0.08261 C 0.087 -0.09327 0.075 -0.09993 0.063 -0.09993 C 0.038 -0.09993 0.017 -0.07595 0.009 -0.0413 C 0.009 -0.0413 0 0 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-vertical-figure-8"> + <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.033 0 0.06 0.03598 0.06 0.07994 C 0.06 0.13191 0.03 0.15056 0.012 0.15856 L -0.012 0.16655 C -0.03 0.17455 -0.06 0.19453 -0.06 0.25316 C -0.06 0.29046 -0.033 0.3331 0 0.3331 C 0.033 0.3331 0.06 0.29046 0.06 0.25316 C 0.06 0.19453 0.03 0.17455 0.012 0.16655 L -0.012 0.15856 C -0.03 0.15056 -0.06 0.13191 -0.06 0.07994 C -0.06 0.03598 -0.033 0 0 0 Z"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="libo-physics-fall-fade-out"> + <anim:animatePhysics smil:dur="4" anim:bounciness="0.6" smil:fill="hold"/> + <anim:transitionFilter smil:begin="2" smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/> + <anim:set smil:begin="3.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="libo-physics-fall"> + <anim:animatePhysics smil:dur="4" smil:fill="hold"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="libo-physics-shoot-right-return"> + <anim:animatePhysics smil:dur="4" anim:bounciness="0.6" anim:velocity-x="10000" smil:fill="hold"/> + <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="x" smil:to="x"/> + <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="y" smil:to="y"/> + <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="rotate" smil:to="0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="libo-physics-shoot-left-return"> + <anim:animatePhysics smil:dur="4" anim:bounciness="0.6" anim:velocity-x="-10000" smil:fill="hold"/> + <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="x" smil:to="x"/> + <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="y" smil:to="y"/> + <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="rotate" smil:to="0"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-start"> + <anim:command smil:begin="0" smil:dur="0.001" smil:fill="hold" anim:command="play"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-stop"> + <anim:command smil:begin="0" smil:dur="0.001" smil:fill="hold" anim:command="stop"/> + </anim:par> + </anim:par> + </anim:par> + <anim:par smil:begin="indefinite" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold"> + <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-toggle-pause"> + <anim:command smil:begin="0" smil:dur="0.001" smil:fill="hold" anim:command="toggle-pause"/> + </anim:par> + </anim:par> + </anim:par> +</anim:seq> diff --git a/sd/xml/layoutlist.xml b/sd/xml/layoutlist.xml new file mode 100644 index 0000000000..4d139ace48 --- /dev/null +++ b/sd/xml/layoutlist.xml @@ -0,0 +1,86 @@ +<?xml version="1.0"?> +<!-- Configurable definitions of Impress slide layouts. + + Currently the layout type name needs to match a set of predefined strings. + Per entry, you can declare up to one Title object, and up to four + Outline objects. All values are relative to Impress' 'layout + rect', which is roughly 90% of the available slide area. +--> +<layout-list> + <layout type="AUTOLAYOUT_TITLE_CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_2CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="0.488" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="1" relative-width="0.488" relative-posX="1.05" relative-posY="0"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="1" relative-posX="0" relative-posY="1.095"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_CONTENT_2CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="0.488" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="1.095"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_4CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="1.095"/> + <presobj kind="PRESOBJ_OUTLINE4" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="1.095"/> + </layout> + <layout type="AUTOLAYOUT_ONLY_TEXT"> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="4.6354" relative-width="1" relative-posX="0" relative-posY="0"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_ONLY"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_6CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.322" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.322" relative-posX="1.05" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.322" relative-posX="2.10" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE4" relative-height="0.477" relative-width="0.322" relative-posX="0" relative-posY="1.095"/> + <presobj kind="PRESOBJ_OUTLINE5" relative-height="0.477" relative-width="0.322" relative-posX="1.05" relative-posY="1.095"/> + <presobj kind="PRESOBJ_OUTLINE6" relative-height="0.477" relative-width="0.322" relative-posX="2.10" relative-posY="1.095"/> + </layout> + <layout type="AUTOLAYOUT_START"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_2CONTENT_CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="1" relative-width="0.488" relative-posX="1.05" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="1.095"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="1" relative-posX="0" relative-posY="1.095"/> + </layout> + <layout type="AUTOLAYOUT_VTITLE_VCONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="4.6354" relative-width="0.139167" relative-posX="6.1856" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1.3347" relative-width="0.777778" relative-posX="0" relative-posY="-0.25078974"/> + </layout> + <layout type="AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="4.6354" relative-width="0.139167" relative-posX="6.1856" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.6272578" relative-width="0.777778" relative-posX="0" relative-posY="-0.53363874"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.6272578" relative-width="0.777778" relative-posX="0" relative-posY="0.5939791"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_VCONTENT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + </layout> + <layout type="AUTOLAYOUT_TITLE_2VTEXT"> + <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="0.488" relative-posX="0" relative-posY="0"/> + <presobj kind="PRESOBJ_OUTLINE2" relative-height="1" relative-width="0.488" relative-posX="1.05" relative-posY="0"/> + </layout> +</layout-list> diff --git a/sd/xml/objectlist.xml b/sd/xml/objectlist.xml new file mode 100644 index 0000000000..90cf1c1cb6 --- /dev/null +++ b/sd/xml/objectlist.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<object-list> + <object type="PRESOBJ_DATETIME"> + <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.233" relative-posX="0.05" relative-posY="0.911"/> + <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0"/> + <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0"/> + </object> + <object type="PRESOBJ_FOOTER"> + <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.317" relative-posX="0.342" relative-posY="0.911"/> + <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0.05"/> + <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0.05"/> + </object> + <object type="PRESOBJ_SLIDENUMBER"> + <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.233" relative-posX="0.717" relative-posY="0.911"/> + <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0.05"/> + <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0.05"/> + </object> + <object type="PRESOBJ_HEADER"> + <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.317" relative-posX="0.717" relative-posY="0.911"/> + <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0"/> + <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0"/> + </object> + <object type="PRESOBJ_TITLE"> + <object-prop pagekind="PageKind::Standard" relative-height="0.167" relative-width="0.9" relative-posX="0.05" relative-posY="0.0399"/> + <object-prop pagekind="PageKind::Notes" relative-height="0.375" relative-width="1" relative-posX="0" relative-posY="0.076"/> + </object> + <object type="PRESOBJ_OUTLINE"> + <object-prop pagekind="PageKind::Standard" relative-height="0.58" relative-width="0.9" relative-posX="0.05" relative-posY="0.234"/> + </object> + <object type="PRESOBJ_NOTES"> + <object-prop pagekind="PageKind::Notes" relative-height="0.45" relative-width="0.8" relative-posX="0.1" relative-posY="0.475"/> + </object> +</object-list> \ No newline at end of file diff --git a/sd/xml/styles.xml b/sd/xml/styles.xml new file mode 100644 index 0000000000..3b16d5ec7b --- /dev/null +++ b/sd/xml/styles.xml @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * +--> +<office:styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"> + <style:style style:name="default" style:family="table-cell"> + <style:table-cell-properties fo:background-color="#ffffff" fo:border="0.28pt solid #ffffff" fo:padding="0.1cm" style:vertical-align="top"/> + <style:text-properties style:use-window-font-color="true" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt" style:letter-kerning="true"/> + </style:style> + <style:style style:name="bg-none" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="transparent" fo:border="0.28pt solid #000000"/> + </style:style> + <style:style style:name="gray" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#cccccc"/> + </style:style> + <style:style style:name="dark-gray" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#999999"/> + </style:style> + <style:style style:name="black" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#000000"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="black-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#000000" fo:border="0.28pt solid #666666"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="gray-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#cccccc" fo:border="0.28pt solid #666666"/> + </style:style> + <style:style style:name="white" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#ffffff"/> + </style:style> + <style:style style:name="white-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#ffffff" fo:border="0.28pt solid #666666"/> + </style:style> + <style:style style:name="blue-title" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#5983B0"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="blue-title-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#5983B0" fo:border="0.28pt solid #666666"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="blue-banded" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#B4C7DC"/> + </style:style> + <style:style style:name="blue-normal" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#DEE6EF"/> + </style:style> + <style:style style:name="orange-title" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#FF860D"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="orange-title-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#FF860D" fo:border="0.28pt solid #666666"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="orange-banded" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#FFB66C"/> + </style:style> + <style:style style:name="orange-normal" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#FFDBB6"/> + </style:style> + <style:style style:name="teal-title" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#50938A"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="teal-title-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#50938A" fo:border="0.28pt solid #666666"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="teal-banded" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#B3CAC7"/> + </style:style> + <style:style style:name="teal-normal" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#DEE7E5"/> + </style:style> + <style:style style:name="magenta-title" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#D62E4E"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="magenta-title-with-border" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#D62E4E" fo:border="0.28pt solid #666666"/> + <style:text-properties fo:color="#ffffff"/> + </style:style> + <style:style style:name="magenta-banded" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#EC9BA4"/> + </style:style> + <style:style style:name="magenta-normal" style:family="table-cell" style:parent-style-name="default"> + <style:table-cell-properties fo:background-color="#F7D1D5"/> + </style:style> + <table:table-template table:name="default"> + <table:first-row table:style-name="bg-none"/> + <table:last-row table:style-name="bg-none"/> + <table:first-column table:style-name="bg-none"/> + <table:last-column table:style-name="bg-none"/> + <table:body table:style-name="bg-none"/> + <table:odd-rows table:style-name="bg-none"/> + <table:odd-columns table:style-name="bg-none"/> + </table:table-template> + <table:table-template table:name="black-dark"> + <table:first-row table:style-name="black"/> + <table:last-row table:style-name="black"/> + <table:first-column table:style-name="black"/> + <table:last-column table:style-name="black"/> + <table:body table:style-name="gray"/> + <table:odd-rows table:style-name="dark-gray"/> + <table:odd-columns table:style-name="dark-gray"/> + </table:table-template> + <table:table-template table:name="black-gray"> + <table:first-row table:style-name="black-with-border"/> + <table:last-row table:style-name="black-with-border"/> + <table:first-column table:style-name="black-with-border"/> + <table:last-column table:style-name="black-with-border"/> + <table:body table:style-name="white-with-border"/> + <table:odd-rows table:style-name="gray-with-border"/> + <table:odd-columns table:style-name="gray-with-border"/> + </table:table-template> + <table:table-template table:name="blue-dark"> + <table:first-row table:style-name="blue-title"/> + <table:last-row table:style-name="blue-title"/> + <table:first-column table:style-name="blue-title"/> + <table:last-column table:style-name="blue-title"/> + <table:body table:style-name="blue-normal"/> + <table:odd-rows table:style-name="blue-banded"/> + <table:odd-columns table:style-name="blue-banded"/> + </table:table-template> + <table:table-template table:name="blue-gray"> + <table:first-row table:style-name="blue-title-with-border"/> + <table:last-row table:style-name="blue-title-with-border"/> + <table:first-column table:style-name="blue-title-with-border"/> + <table:last-column table:style-name="blue-title-with-border"/> + <table:body table:style-name="white-with-border"/> + <table:odd-rows table:style-name="gray-with-border"/> + <table:odd-columns table:style-name="gray-with-border"/> + </table:table-template> + <table:table-template table:name="orange-dark"> + <table:first-row table:style-name="orange-title"/> + <table:last-row table:style-name="orange-title"/> + <table:first-column table:style-name="orange-title"/> + <table:last-column table:style-name="orange-title"/> + <table:body table:style-name="orange-normal"/> + <table:odd-rows table:style-name="orange-banded"/> + <table:odd-columns table:style-name="orange-banded"/> + </table:table-template> + <table:table-template table:name="orange-gray"> + <table:first-row table:style-name="orange-title-with-border"/> + <table:last-row table:style-name="orange-title-with-border"/> + <table:first-column table:style-name="orange-title-with-border"/> + <table:last-column table:style-name="orange-title-with-border"/> + <table:body table:style-name="white-with-border"/> + <table:odd-rows table:style-name="gray-with-border"/> + <table:odd-columns table:style-name="gray-with-border"/> + </table:table-template> + <table:table-template table:name="teal-dark"> + <table:first-row table:style-name="teal-title"/> + <table:last-row table:style-name="teal-title"/> + <table:first-column table:style-name="teal-title"/> + <table:last-column table:style-name="teal-title"/> + <table:body table:style-name="teal-normal"/> + <table:odd-rows table:style-name="teal-banded"/> + <table:odd-columns table:style-name="teal-banded"/> + </table:table-template> + <table:table-template table:name="teal-gray"> + <table:first-row table:style-name="teal-title-with-border"/> + <table:last-row table:style-name="teal-title-with-border"/> + <table:first-column table:style-name="teal-title-with-border"/> + <table:last-column table:style-name="teal-title-with-border"/> + <table:body table:style-name="white-with-border"/> + <table:odd-rows table:style-name="gray-with-border"/> + <table:odd-columns table:style-name="gray-with-border"/> + </table:table-template> + <table:table-template table:name="magenta-dark"> + <table:first-row table:style-name="magenta-title"/> + <table:last-row table:style-name="magenta-title"/> + <table:first-column table:style-name="magenta-title"/> + <table:last-column table:style-name="magenta-title"/> + <table:body table:style-name="magenta-normal"/> + <table:odd-rows table:style-name="magenta-banded"/> + <table:odd-columns table:style-name="magenta-banded"/> + </table:table-template> + <table:table-template table:name="magenta-gray"> + <table:first-row table:style-name="magenta-title-with-border"/> + <table:last-row table:style-name="magenta-title-with-border"/> + <table:first-column table:style-name="magenta-title-with-border"/> + <table:last-column table:style-name="magenta-title-with-border"/> + <table:body table:style-name="white-with-border"/> + <table:odd-rows table:style-name="gray-with-border"/> + <table:odd-columns table:style-name="gray-with-border"/> + </table:table-template> +</office:styles> diff --git a/sd/xml/transitions-ogl.xml b/sd/xml/transitions-ogl.xml new file mode 100644 index 0000000000..b145f10797 --- /dev/null +++ b/sd/xml/transitions-ogl.xml @@ -0,0 +1,77 @@ +<?xml version="1.0"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<anim:seq xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:smil="http://www.w3.org/2001/SMIL20" xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" pres:node-type="main-sequence"> + <anim:par pres:preset-id="tile-flip"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="across"/> + </anim:par> + <anim:par pres:preset-id="outside-cube"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="cornersOut"/> + </anim:par> + <anim:par pres:preset-id="revolving-circles"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="circle"/> + </anim:par> + <anim:par pres:preset-id="turning-helix"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="fanOutHorizontal"/> + </anim:par> + <anim:par pres:preset-id="inside-cube"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="cornersIn"/> + </anim:par> + <anim:par pres:preset-id="fall"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="leftToRight"/> + </anim:par> + <anim:par pres:preset-id="turn-around"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topToBottom"/> + </anim:par> + <anim:par pres:preset-id="iris"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topLeft"/> + </anim:par> + <anim:par pres:preset-id="turn-down"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topRight"/> + </anim:par> + <anim:par pres:preset-id="rochade"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomRight"/> + </anim:par> + <anim:par pres:preset-id="venetian3dv"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomLeft"/> + </anim:par> + <anim:par pres:preset-id="venetian3dh"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topCenter"/> + </anim:par> + <anim:par pres:preset-id="static"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="rightCenter"/> + </anim:par> + <anim:par pres:preset-id="finedissolve"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomCenter"/> + </anim:par> + <anim:par pres:preset-id="vortex"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="vertical"/> + </anim:par> + <anim:par pres:preset-id="ripple"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="horizontal"/> + </anim:par> + <anim:par pres:preset-id="glitter"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="diamond"/> + </anim:par> + <anim:par pres:preset-id="honeycomb"> + <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="heart"/> + </anim:par> + <anim:par pres:preset-id="zoom-rotate-in"> + <anim:transitionFilter smil:type="zoom" smil:subtype="rotateIn"/> + </anim:par> + </anim:seq> diff --git a/sd/xml/transitions.xml b/sd/xml/transitions.xml new file mode 100644 index 0000000000..78a4d213a0 --- /dev/null +++ b/sd/xml/transitions.xml @@ -0,0 +1,251 @@ +<?xml version="1.0"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<anim:seq xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:smil="http://www.w3.org/2001/SMIL20" xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" pres:node-type="main-sequence"> + <anim:par pres:preset-id="wipe-up"> + <anim:transitionFilter smil:type="barWipe" smil:subtype="topToBottom" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="wipe-right"> + <anim:transitionFilter smil:type="barWipe" smil:subtype="leftToRight"/> + </anim:par> + <anim:par pres:preset-id="wipe-left"> + <anim:transitionFilter smil:type="barWipe" smil:subtype="leftToRight" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="wipe-down"> + <anim:transitionFilter smil:type="barWipe" smil:subtype="topToBottom"/> + </anim:par> + <anim:par pres:preset-id="wheel-clockwise-1-spoke"> + <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="oneBlade"/> + </anim:par> + <anim:par pres:preset-id="wheel-clockwise-2-spokes"> + <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="twoBladeVertical"/> + </anim:par> + <anim:par pres:preset-id="wheel-clockwise-3-spokes"> + <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="threeBlade"/> + </anim:par> + <anim:par pres:preset-id="wheel-clockwise-4-spokes"> + <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="fourBlade"/> + </anim:par> + <anim:par pres:preset-id="wheel-clockwise-8-spokes"> + <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="eightBlade"/> + </anim:par> + <anim:par pres:preset-id="uncover-down"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTop" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-left"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromRight" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-right"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromLeft" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-up"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottom" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-left-down"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopRight" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-left-up"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomRight" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-right-down"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopLeft" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="uncover-right-up"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomLeft" smil:direction="reverse"/> + </anim:par> +<!-- <anim:par pres:preset-id="barn-inVertical"> --> +<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical"/> --> +<!-- </anim:par> --> +<!-- <anim:par pres:preset-id="barn-outVertical"> --> +<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical" smil:direction="reverse"/> --> +<!-- </anim:par> --> +<!-- <anim:par pres:preset-id="barn-inHorizontal"> --> +<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal"/> --> +<!-- </anim:par> --> +<!-- <anim:par pres:preset-id="barn-outHorizontal"> --> +<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal" smil:direction="reverse"/> --> +<!-- </anim:par> --> + <anim:par pres:preset-id="random-bars-vertical"> + <anim:transitionFilter smil:type="randomBarWipe" smil:subtype="vertical"/>}, + </anim:par> + <anim:par pres:preset-id="random-bars-horizontal"> + <anim:transitionFilter smil:type="randomBarWipe" smil:subtype="horizontal"/> + </anim:par> + <anim:par pres:preset-id="checkerboard-down"> + <anim:transitionFilter smil:type="checkerBoardWipe" smil:subtype="down"/>}, + </anim:par> + <anim:par pres:preset-id="checkerboard-across"> + <anim:transitionFilter smil:type="checkerBoardWipe" smil:subtype="across"/> + </anim:par> + <anim:par pres:preset-id="shape-plus"> + <anim:transitionFilter smil:type="fourBoxWipe" smil:subtype="cornersOut"/> + </anim:par> +<!-- <anim:par pres:preset-id="plus-in"> --> +<!-- <anim:transitionFilter smil:type="fourBoxWipe" smil:subtype="cornersIn"/> --> +<!-- </anim:par> --> + <anim:par pres:preset-id="shape-diamond"> + <anim:transitionFilter smil:type="irisWipe" smil:subtype="diamond"/> + </anim:par> +<!-- <anim:par pres:preset-id="diamond-in"> --> +<!-- <anim:transitionFilter smil:type="irisWipe" smil:subtype="diamond" smil:direction="reverse"/> --> +<!-- </anim:par> --> + <anim:par pres:preset-id="shape-circle"> + <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="circle"/> + </anim:par> + <anim:par pres:preset-id="shape-oval-horizontal"> + <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="horizontal"/> + </anim:par> + <anim:par pres:preset-id="shape-oval-vertical"> + <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="vertical"/> + </anim:par> +<!-- <anim:par pres:preset-id="circle-in"> --> +<!-- <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="circle" smil:direction="reverse"/> --> +<!-- </anim:par> --> + <anim:par pres:preset-id="box-out"> + <anim:transitionFilter smil:type="irisWipe" smil:subtype="rectangle"/> + </anim:par> + <anim:par pres:preset-id="box-in"> + <anim:transitionFilter smil:type="irisWipe" smil:subtype="rectangle" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="wedge"> + <anim:transitionFilter smil:type="fanWipe" smil:subtype="centerTop"/> + </anim:par> + <anim:par pres:preset-id="venetian-blinds-vertical"> + <anim:transitionFilter smil:type="blindsWipe" smil:subtype="vertical"/> + </anim:par> + <anim:par pres:preset-id="venetian-blinds-horizontal"> + <anim:transitionFilter smil:type="blindsWipe" smil:subtype="horizontal"/> + </anim:par> + <anim:par pres:preset-id="fade-through-black"> + <anim:transitionFilter smil:type="fade" smil:subtype="fadeOverColor" smil:fadeColor="#000000"/> + </anim:par> + <anim:par pres:preset-id="fade-through-white"> + <anim:transitionFilter smil:type="fade" smil:subtype="fadeOverColor" smil:fadeColor="#FFFFFF"/> + </anim:par> + <anim:par pres:preset-id="cut-through-black"> + <anim:transitionFilter smil:type="barWipe" smil:subtype="fadeOverColor" smil:fadeColor="#000000"/> + </anim:par> + <anim:par pres:preset-id="cover-down"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTop"/> + </anim:par> + <anim:par pres:preset-id="cover-left"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromRight"/> + </anim:par> + <anim:par pres:preset-id="cover-right"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromLeft"/> + </anim:par> + <anim:par pres:preset-id="cover-up"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottom"/> + </anim:par> + <anim:par pres:preset-id="cover-left-down"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopRight"/> + </anim:par> + <anim:par pres:preset-id="cover-left-up"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomRight"/> + </anim:par> + <anim:par pres:preset-id="cover-right-down"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopLeft"/> + </anim:par> + <anim:par pres:preset-id="cover-right-up"> + <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomLeft"/> + </anim:par> + <anim:par pres:preset-id="dissolve"> + <anim:transitionFilter smil:type="dissolve" smil:subtype="default"/> + </anim:par> + <anim:par pres:preset-id="random-transition"> + <anim:transitionFilter smil:type="random"/> + </anim:par> + <!--anim:par pres:preset-id="zoom-rotate-in"> + <anim:transitionFilter smil:type="zoom" smil:subtype="rotateIn"/> + </anim:par--> + <anim:par pres:preset-id="clock-wipe-twelve"> + <anim:transitionFilter smil:type="clockWipe" smil:subtype="clockwiseTwelve"/> + </anim:par> + <anim:par pres:preset-id="reverse-clock-wipe-twelve"> + <anim:transitionFilter smil:type="clockWipe" smil:subtype="clockwiseTwelve" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="spiral-wipe-top-left-clockwise"> + <anim:transitionFilter smil:type="spiralWipe" smil:subtype="topLeftClockwise"/> + </anim:par> + <anim:par pres:preset-id="spiral-wipe-top-right-counter-clockwise"> + <anim:transitionFilter smil:type="spiralWipe" smil:subtype="topRightCounterClockwise"/> + </anim:par> + <anim:par pres:preset-id="spiral-wipe-out-to-bottom-right-clockwise"> + <anim:transitionFilter smil:type="spiralWipe" smil:subtype="bottomRightCounterClockwise" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="spiral-wipe-out-to-bottom-left-counter-clockwise"> + <anim:transitionFilter smil:type="spiralWipe" smil:subtype="bottomLeftClockwise" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="snake-wipe-top-left-vertical"> + <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftVertical"/> + </anim:par> + <anim:par pres:preset-id="snake-wipe-top-left-horizontal"> + <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftHorizontal"/> + </anim:par> + <anim:par pres:preset-id="snake-wipe-bottom-right-vertical"> + <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftVertical" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="snake-wipe-bottom-right-horizontal"> + <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftHorizontal" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="comb-horizontal"> + <anim:transitionFilter smil:type="pushWipe" smil:subtype="combHorizontal"/> + </anim:par> + <anim:par pres:preset-id="comb-vertical"> + <anim:transitionFilter smil:type="pushWipe" smil:subtype="combVertical"/> + </anim:par> + <anim:par pres:preset-id="fade-smoothly"> + <anim:transitionFilter smil:type="fade" smil:subtype="crossfade"/> + </anim:par> + <anim:par pres:preset-id="push-down"> + <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromTop"/> + </anim:par> + <anim:par pres:preset-id="push-left"> + <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromRight"/> + </anim:par> + <anim:par pres:preset-id="push-right"> + <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromLeft"/> + </anim:par> + <anim:par pres:preset-id="push-up"> + <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromBottom"/> + </anim:par> + <anim:par pres:preset-id="split-horizontal-in"> + <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="split-horizontal-out"> + <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal"/> + </anim:par> + <anim:par pres:preset-id="split-vertical-in"> + <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="split-vertical-out"> + <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical"/> + </anim:par> + <anim:par pres:preset-id="diagonal-squares-left-down"> + <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalRight"/> + </anim:par> + <anim:par pres:preset-id="diagonal-squares-left-up"> + <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:direction="reverse"/> + </anim:par> + <anim:par pres:preset-id="diagonal-squares-right-down"> + <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalLeft"/> + </anim:par> + <anim:par pres:preset-id="diagonal-squares-right-up"> + <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:direction="reverse"/> + </anim:par> + </anim:seq> diff --git a/sd/xsl/effect.xsl b/sd/xsl/effect.xsl new file mode 100644 index 0000000000..dc934d6d12 --- /dev/null +++ b/sd/xsl/effect.xsl @@ -0,0 +1,580 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" + xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" + xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" + xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" + xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" + xmlns:fo="http://www.w3.org/1999/XSL/Format" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" + xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" + xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" + xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" + xmlns:math="http://www.w3.org/1998/Math/MathML" + xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" + xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script:1.0" + xmlns:ooo="http://openoffice.org/2004/office" + xmlns:ooow="http://openoffice.org/2004/writer" + xmlns:oooc="http://openoffice.org/2004/calc" + xmlns:dom="http://www.w3.org/2001/xml-events" + xmlns:smil="http://www.w3.org/2001/SMIL20" + xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" + + version="1.0"> + + <!-- fly in --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-fly-in']"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- fade in an swivel --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-fade-in-and-swivel']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- falling in --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-falling-in']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- Unfold --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-unfold']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- Unfold --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-unfold']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- turn and grow --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-turn-and-grow']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- fold --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-fold']"> + <anim:par pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- whip --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-whip']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- flip --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-flip']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- swish --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-swish']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- blinds --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-venetian-blinds']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- box --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-box']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- checkerboard --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-checkerboard']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- circle --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-circle']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- crawl in --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-fly-in-slow']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- diamond --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-diamond']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- peek in --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-peek-in']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- plus --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-plus']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- random bars --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-random-bars']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- split --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-split']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- strips --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-diagonal-squares']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- wheel --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-wheel']"> + <anim:par pres:preset-property="Spokes"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- wipe --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-wipe']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- color typewriter --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-colored-lettering']"> + <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- stretch --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-stretchy']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- zoom --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-zoom']"> + <anim:par pres:preset-property="Zoom"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- swivel --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-swivel']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + +<!-- emphasis --> + + <!-- change fill color --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-fill-color']"> + <anim:par pres:preset-property="FillColor;ColorStyle;Accelerate;Decelerate;AutoReverse"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- change font --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font']"> + <anim:par pres:preset-property="FontStyle" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- change font color --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font-color']"> + <anim:par pres:preset-property="CharColor;ColorStyle;Accelerate;Decelerate;AutoReverse" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- change font size --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font-size']"> + <anim:par pres:preset-property="CharHeight" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- change font style --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font-style']"> + <anim:par pres:preset-property="CharDecoration" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- change line color --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-line-color']"> + <anim:par pres:preset-property="LineColor;ColorStyle;Accelerate;Decelerate;AutoReverse"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- grow/shrink --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-grow-and-shrink']"> + <anim:par pres:preset-property="Scale;Accelerate;Decelerate;AutoReverse"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- spin --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-spin']"> + <anim:par pres:preset-property="Rotate;Accelerate;Decelerate;AutoReverse"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- Transparency --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-transparency']"> + <anim:par pres:preset-property="Transparency"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- brush on color --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-color-over-by-word']"> + <anim:iterate pres:preset-property="Color" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- color blend --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-color-blend']"> + <anim:par pres:preset-property="Color"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- color wave --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-color-over-by-letter']"> + <anim:iterate pres:preset-property="Color" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- bold flash --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-bold-flash']"> + <anim:par pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- reveal underline --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-reveal-underline']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- shimmer --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-shimmer']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- verticales highlight --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-vertical-highlight']"> + <anim:par pres:preset-property="Color"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- flicker --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-flicker']"> + <anim:par pres:preset-property="Color"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- grow with color --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-grow-with-color']"> + <anim:iterate pres:preset-property="Color" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- teeter --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-teeter']"> + <anim:par pres:preset-property="Color"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- blast --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-blast']"> + <anim:par pres:preset-property="Color"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- style emphasis --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-style-emphasis']"> + <anim:par pres:preset-property="Color" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- bold reveal --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-bold-reveal']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- wave --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-wave']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + +<!-- exit --> + + <!-- blinds --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-venetian-blinds']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- box --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-box']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- checkerboard --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-checkerboard']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- circle --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-circle']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- crawl out --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-crawl-out']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- diamond --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-diamond']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- fly out --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-fly-out']"> + <anim:par pres:preset-property="Direction;Accelerate;Decelerate"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- peek out --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-peek-out']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- plus --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-plus']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- random bars --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-random-bars']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- split --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-split']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- strips --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-diagonal-squares']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- wheel --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-wheel']"> + <anim:par pres:preset-property="Spokes"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- wipe --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-wipe']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- collapse --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-collapse']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- color typewriter --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-colored-lettering']"> + <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- zoom --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-zoom']"> + <anim:par pres:preset-property="Zoom"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- swivel --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-swivel']"> + <anim:par pres:preset-property="Direction"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- fade in an swivel --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-fade-out-and-swivel']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- fade in an swivel --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-turn-and-grow']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- fold --> + <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-fold']"> + <anim:par pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:par> + </xsl:template> + + <!-- whip --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-whip']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- flip --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-flip']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- swish --> + <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-swish']"> + <anim:iterate pres:text-only="true"> + <xsl:apply-templates select="*|@*|text()"/> + </anim:iterate> + </xsl:template> + + <!-- remove pres:group-id --> + <xsl:template match="@xlink:href" /> + <xsl:template match="@smil:targetElement" /> + <xsl:template match="@pres:group-id" /> + + <!-- copy --> + <xsl:template match="*|@*|text()"> + <xsl:copy> + <xsl:apply-templates select="*|@*|text()"/> + </xsl:copy> + </xsl:template> + +</xsl:stylesheet> -- cgit v1.2.3